REDROOM
PHP 8.2.31
Path:
Logout
Edit File
Size: 3.22 MB
Close
//opt/cpanel/ea-wappspector/composer.phar
Text
Base64
IyEvdXNyL2Jpbi9lbnYgcGhwCjw/cGhwCi8qCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENvbXBvc2VyLgogKgogKiAoYykgTmlscyBBZGVybWFubiA8bmFkZXJtYW5AbmFkZXJtYW4uZGU+CiAqICAgICBKb3JkaSBCb2dnaWFubyA8ai5ib2dnaWFub0BzZWxkLmJlPgogKgogKiBGb3IgdGhlIGZ1bGwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIGluZm9ybWF0aW9uLCBwbGVhc2UgdmlldwogKiB0aGUgbGljZW5zZSB0aGF0IGlzIGxvY2F0ZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIGZpbGUuCiAqLwoKLy8gQXZvaWQgQVBDIGNhdXNpbmcgcmFuZG9tIGZhdGFsIGVycm9ycyBwZXIgaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NvbXBvc2VyL2lzc3Vlcy8yNjQKaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ2FwYycpICYmIGZpbHRlcl92YXIoaW5pX2dldCgnYXBjLmVuYWJsZV9jbGknKSwgRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4pICYmIGZpbHRlcl92YXIoaW5pX2dldCgnYXBjLmNhY2hlX2J5X2RlZmF1bHQnKSwgRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4pKSB7CiAgICBpZiAodmVyc2lvbl9jb21wYXJlKHBocHZlcnNpb24oJ2FwYycpLCAnMy4wLjEyJywgJz49JykpIHsKICAgICAgICBpbmlfc2V0KCdhcGMuY2FjaGVfYnlfZGVmYXVsdCcsIDApOwogICAgfSBlbHNlIHsKICAgICAgICBmd3JpdGUoU1RERVJSLCAnV2FybmluZzogQVBDIDw9IDMuMC4xMiBtYXkgY2F1c2UgZmF0YWwgZXJyb3JzIHdoZW4gcnVubmluZyBjb21wb3NlciBjb21tYW5kcy4nLlBIUF9FT0wpOwogICAgICAgIGZ3cml0ZShTVERFUlIsICdVcGRhdGUgQVBDLCBvciBzZXQgYXBjLmVuYWJsZV9jbGkgb3IgYXBjLmNhY2hlX2J5X2RlZmF1bHQgdG8gMCBpbiB5b3VyIHBocC5pbmkuJy5QSFBfRU9MKTsKICAgIH0KfQoKaWYgKCFjbGFzc19leGlzdHMoJ1BoYXInKSkgewogICAgZWNobyAnUEhQXCdzIHBoYXIgZXh0ZW5zaW9uIGlzIG1pc3NpbmcuIENvbXBvc2VyIHJlcXVpcmVzIGl0IHRvIHJ1bi4gRW5hYmxlIHRoZSBleHRlbnNpb24gb3IgcmVjb21waWxlIHBocCB3aXRob3V0IC0tZGlzYWJsZS1waGFyIHRoZW4gdHJ5IGFnYWluLicgLiBQSFBfRU9MOwogICAgZXhpdCgxKTsKfQoKUGhhcjo6bWFwUGhhcignY29tcG9zZXIucGhhcicpOwpyZXF1aXJlICdwaGFyOi8vY29tcG9zZXIucGhhci9iaW4vY29tcG9zZXInOwoKX19IQUxUX0NPTVBJTEVSKCk7ID8+DQrC8gAA/gIAABEAAAABAA0AAABjb21wb3Nlci5waGFyAAAAACUAAABzcmMvQ29tcG9zZXIvQWR2aXNvcnkvQXVkaXRDb25maWcucGhwkwwAACYoBGqTDAAAVbw5sqQBAAAAAAAAIQAAAHNyYy9Db21wb3Nlci9BZHZpc29yeS9BdWRpdG9yLnBocKkuAAAmKARqqS4AAA425SGkAQAAAAAAADEAAABzcmMvQ29tcG9zZXIvQWR2aXNvcnkvSWdub3JlZFNlY3VyaXR5QWR2aXNvcnkucGhwUwMAACYoBGpTAwAAZzD4xaQBAAAAAAAAMQAAAHNyYy9Db21wb3Nlci9BZHZpc29yeS9QYXJ0aWFsU2VjdXJpdHlBZHZpc29yeS5waHCDBgAAJigEaoMGAACIIGOXpAEAAAAAAAAqAAAAc3JjL0NvbXBvc2VyL0Fkdmlzb3J5L1NlY3VyaXR5QWR2aXNvcnkucGhw/AQAACYoBGr8BAAAtTV0MKQBAAAAAAAAKwAAAHNyYy9Db21wb3Nlci9BdXRvbG9hZC9BdXRvbG9hZEdlbmVyYXRvci5waHCniwAAJigEaqeLAAAdkfDupAEAAAAAAAArAAAAc3JjL0NvbXBvc2VyL0F1dG9sb2FkL0NsYXNzTWFwR2VuZXJhdG9yLnBocJIGAAAmKARqkgYAAI+ofFOkAQAAAAAAABYAAABzcmMvQ29tcG9zZXIvQ2FjaGUucGhweRsAACYoBGp5GwAArUSAKaQBAAAAAAAAJQAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0Fib3V0Q29tbWFuZC5waHBXAwAAJigEalcDAADiOoYhpAEAAAAAAAAnAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvQXJjaGl2ZUNvbW1hbmQucGhwRxsAACYoBGpHGwAAM+0y4aQBAAAAAAAAJQAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0F1ZGl0Q29tbWFuZC5waHCSDwAAJigEapIPAABsPtmXpAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvQmFzZUNvbW1hbmQucGhw0i8AACYoBGrSLwAAYSrPyqQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0Jhc2VDb25maWdDb21tYW5kLnBocIMIAAAmKARqgwgAANHkzVukAQAAAAAAAC4AAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9CYXNlRGVwZW5kZW5jeUNvbW1hbmQucGhw1yMAACYoBGrXIwAAiZqK46QBAAAAAAAAJAAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0J1bXBDb21tYW5kLnBocGAdAAAmKARqYB0AANAJBamkAQAAAAAAADEAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9DaGVja1BsYXRmb3JtUmVxc0NvbW1hbmQucGhwYBYAACYoBGpgFgAAH/k8dKQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0NsZWFyQ2FjaGVDb21tYW5kLnBocHwJAAAmKARqfAkAAA3mTKCkAQAAAAAAACgAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9Db21wbGV0aW9uVHJhaXQucGhwVhYAACYoBGpWFgAAEmM39aQBAAAAAAAAJgAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0NvbmZpZ0NvbW1hbmQucGhw6nUAACYoBGrqdQAAqjHHcKQBAAAAAAAALQAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0NyZWF0ZVByb2plY3RDb21tYW5kLnBocLlLAAAmKARquUsAAJcw1fGkAQAAAAAAACcAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9EZXBlbmRzQ29tbWFuZC5waHBFBQAAJigEakUFAACBFHoSpAEAAAAAAAAoAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvRGlhZ25vc2VDb21tYW5kLnBocF5rAAAmKARqXmsAAFMt2vSkAQAAAAAAACwAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9EdW1wQXV0b2xvYWRDb21tYW5kLnBocNkWAAAmKARq2RYAADcvsiykAQAAAAAAACQAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9FeGVjQ29tbWFuZC5waHAWDAAAJigEahYMAAASBfXqpAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvRnVuZENvbW1hbmQucGhwwQ4AACYoBGrBDgAANWDIR6QBAAAAAAAAJgAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0dsb2JhbENvbW1hbmQucGhwyw8AACYoBGrLDwAA1rkZ66QBAAAAAAAAJAAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0hvbWVDb21tYW5kLnBocEcPAAAmKARqRw8AAKFnBIikAQAAAAAAACQAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9Jbml0Q29tbWFuZC5waHBHRgAAJigEakdGAADb5XuxpAEAAAAAAAAnAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvSW5zdGFsbENvbW1hbmQucGhwWxsAACYoBGpbGwAAX+nOM6QBAAAAAAAAKAAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0xpY2Vuc2VzQ29tbWFuZC5waHATEgAAJigEahMSAAATJMW2pAEAAAAAAAAoAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvT3V0ZGF0ZWRDb21tYW5kLnBocJITAAAmKARqkhMAAEBjBI2kAQAAAAAAAC4AAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9QYWNrYWdlRGlzY292ZXJ5VHJhaXQucGhwnTYAACYoBGqdNgAAnPDzuqQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9Db21tYW5kL1Byb2hpYml0c0NvbW1hbmQucGhw5QUAACYoBGrlBQAAykRy+KQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9Db21tYW5kL1JlaW5zdGFsbENvbW1hbmQucGhwfR0AACYoBGp9HQAASQfo16QBAAAAAAAAJgAAAHNyYy9Db21wb3Nlci9Db21tYW5kL1JlbW92ZUNvbW1hbmQucGhwATAAACYoBGoBMAAACy69qaQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9Db21tYW5kL1JlcG9zaXRvcnlDb21tYW5kLnBocFggAAAmKARqWCAAADZ5bwmkAQAAAAAAACcAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9SZXF1aXJlQ29tbWFuZC5waHCEWwAAJigEaoRbAAD/tQlxpAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvUnVuU2NyaXB0Q29tbWFuZC5waHAVEgAAJigEahUSAAAlXhCrpAEAAAAAAAArAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvU2NyaXB0QWxpYXNDb21tYW5kLnBocGIIAAAmKARqYggAABRxeGOkAQAAAAAAACYAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9TZWFyY2hDb21tYW5kLnBocEMPAAAmKARqQw8AAGlIqB+kAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9TZWxmVXBkYXRlQ29tbWFuZC5waHDfUAAAJigEat9QAACP/7kfpAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvU2hvd0NvbW1hbmQucGhwxL0AACYoBGrEvQAAgek8NaQBAAAAAAAAJgAAAHNyYy9Db21wb3Nlci9Db21tYW5kL1N0YXR1c0NvbW1hbmQucGhwtxYAACYoBGq3FgAA6UKYvqQBAAAAAAAAKAAAAHNyYy9Db21wb3Nlci9Db21tYW5kL1N1Z2dlc3RzQ29tbWFuZC5waHDJCwAAJigEaskLAAD5z2ZrpAEAAAAAAAAmAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvVXBkYXRlQ29tbWFuZC5waHAcRQAAJigEahxFAABbMzbopAEAAAAAAAAoAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvVmFsaWRhdGVDb21tYW5kLnBocM4aAAAmKARqzhoAAPzrQWikAQAAAAAAABkAAABzcmMvQ29tcG9zZXIvQ29tcG9zZXIucGhwnQcAACYoBGqdBwAAuj06OqQBAAAAAAAAFwAAAHNyYy9Db21wb3Nlci9Db25maWcucGhwnzwAACYoBGqfPAAA0dJTE6QBAAAAAAAALQAAAHNyYy9Db21wb3Nlci9Db25maWcvQ29uZmlnU291cmNlSW50ZXJmYWNlLnBocHEDAAAmKARqcQMAABsuTrOkAQAAAAAAACgAAABzcmMvQ29tcG9zZXIvQ29uZmlnL0pzb25Db25maWdTb3VyY2UucGhwyCcAACYoBGrIJwAACL2rjKQBAAAAAAAAJAAAAHNyYy9Db21wb3Nlci9Db25zb2xlL0FwcGxpY2F0aW9uLnBocA1iAAAmKARqDWIAACRjwVKkAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvQ29uc29sZS9HaXRodWJBY3Rpb25FcnJvci5waHAPBQAAJigEag8FAABgsYnmpAEAAAAAAAAsAAAAc3JjL0NvbXBvc2VyL0NvbnNvbGUvSHRtbE91dHB1dEZvcm1hdHRlci5waHA+BwAAJigEaj4HAADSDO9SpAEAAAAAAAAsAAAAc3JjL0NvbXBvc2VyL0NvbnNvbGUvSW5wdXQvSW5wdXRBcmd1bWVudC5waHC2BAAAJigEarYEAACqD7xLpAEAAAAAAAAqAAAAc3JjL0NvbXBvc2VyL0NvbnNvbGUvSW5wdXQvSW5wdXRPcHRpb24ucGhwZwUAACYoBGpnBQAAiDcnNKQBAAAAAAAALQAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvRGVjaXNpb25zLnBocOkRAAAmKARq6REAADskQAukAQAAAAAAADEAAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL0RlZmF1bHRQb2xpY3kucGhwIRkAACYoBGohGQAA4UQ7cKQBAAAAAAAALwAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvR2VuZXJpY1J1bGUucGhwNgQAACYoBGo2BAAApbJsfKQBAAAAAAAAOAAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvTG9jYWxSZXBvVHJhbnNhY3Rpb24ucGhwvQEAACYoBGq9AQAA35pImqQBAAAAAAAAMwAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvTG9ja1RyYW5zYWN0aW9uLnBocEEOAAAmKARqQQ4AAGaxK3GkAQAAAAAAADUAAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL011bHRpQ29uZmxpY3RSdWxlLnBocMsFAAAmKARqywUAALQ5DY2kAQAAAAAAAD4AAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL09wZXJhdGlvbi9JbnN0YWxsT3BlcmF0aW9uLnBocP8CAAAmKARq/wIAAD36p6ekAQAAAAAAAEkAAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL09wZXJhdGlvbi9NYXJrQWxpYXNJbnN0YWxsZWRPcGVyYXRpb24ucGhwFgMAACYoBGoWAwAAADFOSqQBAAAAAAAASwAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvT3BlcmF0aW9uL01hcmtBbGlhc1VuaW5zdGFsbGVkT3BlcmF0aW9uLnBocBwDAAAmKARqHAMAAHR3DQ2kAQAAAAAAAEAAAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL09wZXJhdGlvbi9PcGVyYXRpb25JbnRlcmZhY2UucGhw+AAAACYoBGr4AAAAFvdX/aQBAAAAAAAAPQAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvT3BlcmF0aW9uL1NvbHZlck9wZXJhdGlvbi5waHBIAQAAJigEakgBAAAEGhWnpAEAAAAAAABAAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9PcGVyYXRpb24vVW5pbnN0YWxsT3BlcmF0aW9uLnBocOcCAAAmKARq5wIAAHzBUhOkAQAAAAAAAD0AAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL09wZXJhdGlvbi9VcGRhdGVPcGVyYXRpb24ucGhwnwcAACYoBGqfBwAA3DfmpKQBAAAAAAAAMwAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvUG9saWN5SW50ZXJmYWNlLnBocJ4BAAAmKARqngEAAPgBzuGkAQAAAAAAACgAAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL1Bvb2wucGhwBxoAACYoBGoHGgAApaumfKQBAAAAAAAALwAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvUG9vbEJ1aWxkZXIucGhwPFAAACYoBGo8UAAA3L6i+qQBAAAAAAAAMQAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvUG9vbE9wdGltaXplci5waHBUKgAAJigEalQqAACkxUdopAEAAAAAAAArAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9Qcm9ibGVtLnBocEZmAAAmKARqRmYAAMpeWJmkAQAAAAAAACsAAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL1JlcXVlc3QucGhwlRAAACYoBGqVEAAARKYET6QBAAAAAAAAKAAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvUnVsZS5waHC1MAAAJigEarUwAADKe6BRpAEAAAAAAAAxAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9SdWxlMkxpdGVyYWxzLnBocAEFAAAmKARqAQUAAA8zdv6kAQAAAAAAACsAAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL1J1bGVTZXQucGhwxQsAACYoBGrFCwAAO6lufaQBAAAAAAAANAAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvUnVsZVNldEdlbmVyYXRvci5waHBDGwAAJigEakMbAAAvXVqepAEAAAAAAAAzAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9SdWxlU2V0SXRlcmF0b3IucGhw9QUAACYoBGr1BQAAnAx5E6QBAAAAAAAAMgAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvUnVsZVdhdGNoQ2hhaW4ucGhwewEAACYoBGp7AQAAgmjzRKQBAAAAAAAAMgAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvUnVsZVdhdGNoR3JhcGgucGhwnAkAACYoBGqcCQAAWpx7fKQBAAAAAAAAMQAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvUnVsZVdhdGNoTm9kZS5waHB2BAAAJigEanYEAABwmQi3pAEAAAAAAAA+AAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9TZWN1cml0eUFkdmlzb3J5UG9vbEZpbHRlci5waHCTDAAAJigEapMMAABId1ITpAEAAAAAAAAqAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9Tb2x2ZXIucGhwTDgAACYoBGpMOAAA0wBasqQBAAAAAAAANgAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvU29sdmVyQnVnRXhjZXB0aW9uLnBocLkBAAAmKARquQEAAHqtFj2kAQAAAAAAADsAAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL1NvbHZlclByb2JsZW1zRXhjZXB0aW9uLnBocMsQAAAmKARqyxAAABKjfz+kAQAAAAAAAC8AAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL1RyYW5zYWN0aW9uLnBocLocAAAmKARquhwAADIszvakAQAAAAAAAC0AAABzcmMvQ29tcG9zZXIvRG93bmxvYWRlci9BcmNoaXZlRG93bmxvYWRlci5waHDgEQAAJigEauARAAA6SRC6pAEAAAAAAAAxAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvQ2hhbmdlUmVwb3J0SW50ZXJmYWNlLnBocPUAAAAmKARq9QAAAK3DwkKkAQAAAAAAACsAAABzcmMvQ29tcG9zZXIvRG93bmxvYWRlci9Eb3dubG9hZE1hbmFnZXIucGhwpR8AACYoBGqlHwAAugjp/aQBAAAAAAAALwAAAHNyYy9Db21wb3Nlci9Eb3dubG9hZGVyL0Rvd25sb2FkZXJJbnRlcmZhY2UucGhw0wMAACYoBGrTAwAAYm1byKQBAAAAAAAAMwAAAHNyYy9Db21wb3Nlci9Eb3dubG9hZGVyL0R2Y3NEb3dubG9hZGVySW50ZXJmYWNlLnBocPoAAAAmKARq+gAAAOARJSekAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvRG93bmxvYWRlci9GaWxlRG93bmxvYWRlci5waHB2NAAAJigEanY0AABiAHU8pAEAAAAAAAAvAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvRmlsZXN5c3RlbUV4Y2VwdGlvbi5waHAvAQAAJigEai8BAAAhi+UmpAEAAAAAAAAsAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvRm9zc2lsRG93bmxvYWRlci5waHAxCwAAJigEajELAABUZYPEpAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvR2l0RG93bmxvYWRlci5waHAsRAAAJigEaixEAAABbjWcpAEAAAAAAAAqAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvR3ppcERvd25sb2FkZXIucGhweQUAACYoBGp5BQAAei1TbKQBAAAAAAAAKAAAAHNyYy9Db21wb3Nlci9Eb3dubG9hZGVyL0hnRG93bmxvYWRlci5waHDeCgAAJigEat4KAAAnPURvpAEAAAAAAAA4AAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvTWF4RmlsZVNpemVFeGNlZWRlZEV4Y2VwdGlvbi5waHCMAAAAJigEaowAAADauh3UpAEAAAAAAAAqAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvUGF0aERvd25sb2FkZXIucGhwQSIAACYoBGpBIgAA0uC9paQBAAAAAAAALgAAAHNyYy9Db21wb3Nlci9Eb3dubG9hZGVyL1BlcmZvcmNlRG93bmxvYWRlci5waHCLCQAAJigEaosJAACQPK2dpAEAAAAAAAAqAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvUGhhckRvd25sb2FkZXIucGhwqgEAACYoBGqqAQAAWMjIEqQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9Eb3dubG9hZGVyL1JhckRvd25sb2FkZXIucGhwQQYAACYoBGpBBgAAnEjLEqQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9Eb3dubG9hZGVyL1N2bkRvd25sb2FkZXIucGhwWxgAACYoBGpbGAAAoLj/2qQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9Eb3dubG9hZGVyL1RhckRvd25sb2FkZXIucGhwqAEAACYoBGqoAQAA13LfgqQBAAAAAAAALgAAAHNyYy9Db21wb3Nlci9Eb3dubG9hZGVyL1RyYW5zcG9ydEV4Y2VwdGlvbi5waHAEBAAAJigEagQEAAD+jevbpAEAAAAAAAA5AAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvVmNzQ2FwYWJsZURvd25sb2FkZXJJbnRlcmZhY2UucGhw/QAAACYoBGr9AAAAHeQ2pKQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9Eb3dubG9hZGVyL1Zjc0Rvd25sb2FkZXIucGhwQR0AACYoBGpBHQAAxjNetKQBAAAAAAAAKAAAAHNyYy9Db21wb3Nlci9Eb3dubG9hZGVyL1h6RG93bmxvYWRlci5waHBlAgAAJigEamUCAACVwMjqpAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvWmlwRG93bmxvYWRlci5waHCiJwAAJigEaqInAADCcKijpAEAAAAAAAAmAAAAc3JjL0NvbXBvc2VyL0V2ZW50RGlzcGF0Y2hlci9FdmVudC5waHDYAgAAJigEatgCAACF96HwpAEAAAAAAAAwAAAAc3JjL0NvbXBvc2VyL0V2ZW50RGlzcGF0Y2hlci9FdmVudERpc3BhdGNoZXIucGhwiE4AACYoBGqITgAA5OBBN6QBAAAAAAAAOQAAAHNyYy9Db21wb3Nlci9FdmVudERpc3BhdGNoZXIvRXZlbnRTdWJzY3JpYmVySW50ZXJmYWNlLnBocMIAAAAmKARqwgAAAH096QikAQAAAAAAADkAAABzcmMvQ29tcG9zZXIvRXZlbnREaXNwYXRjaGVyL1NjcmlwdEV4ZWN1dGlvbkV4Y2VwdGlvbi5waHCRAAAAJigEapEAAABYdujPpAEAAAAAAAA5AAAAc3JjL0NvbXBvc2VyL0V4Y2VwdGlvbi9JcnJlY292ZXJhYmxlRG93bmxvYWRFeGNlcHRpb24ucGhwjwAAACYoBGqPAAAAMN40DaQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9FeGNlcHRpb24vTm9Tc2xFeGNlcHRpb24ucGhwgQAAACYoBGqBAAAA2FWm0qQBAAAAAAAAGAAAAHNyYy9Db21wb3Nlci9GYWN0b3J5LnBocNVSAAAmKARq1VIAAFheJI+kAQAAAAAAAFQAAABzcmMvQ29tcG9zZXIvRmlsdGVyL1BsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIvSWdub3JlQWxsUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci5waHCuAQAAJigEaq4BAAAYWmuqpAEAAAAAAABVAAAAc3JjL0NvbXBvc2VyL0ZpbHRlci9QbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyL0lnbm9yZUxpc3RQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLnBocC4IAAAmKARqLggAACE7HhikAQAAAAAAAFgAAABzcmMvQ29tcG9zZXIvRmlsdGVyL1BsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIvSWdub3JlTm90aGluZ1BsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIucGhwVAEAACYoBGpUAQAAx+DZD6QBAAAAAAAAUgAAAHNyYy9Db21wb3Nlci9GaWx0ZXIvUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci9QbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeS5waHB+AwAAJigEan4DAADCvlcOpAEAAAAAAABUAAAAc3JjL0NvbXBvc2VyL0ZpbHRlci9QbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyL1BsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UucGhw+AAAACYoBGr4AAAAibXSZ6QBAAAAAAAAGgAAAHNyYy9Db21wb3Nlci9JTy9CYXNlSU8ucGhwLh0AACYoBGouHQAAE3xPTKQBAAAAAAAAHAAAAHNyYy9Db21wb3Nlci9JTy9CdWZmZXJJTy5waHAlCAAAJigEaiUIAAB3iOq6pAEAAAAAAAAdAAAAc3JjL0NvbXBvc2VyL0lPL0NvbnNvbGVJTy5waHCfHwAAJigEap8fAACCc8PupAEAAAAAAAAfAAAAc3JjL0NvbXBvc2VyL0lPL0lPSW50ZXJmYWNlLnBocNAHAAAmKARq0AcAAH7/aK2kAQAAAAAAABoAAABzcmMvQ29tcG9zZXIvSU8vTnVsbElPLnBocE8FAAAmKARqTwUAAGKIqHOkAQAAAAAAABoAAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyLnBocGyUAAAmKARqbJQAAN+8DOqkAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyL0JpbmFyeUluc3RhbGxlci5waHADKgAAJigEagMqAAA6CztCpAEAAAAAAAAyAAAAc3JjL0NvbXBvc2VyL0luc3RhbGxlci9CaW5hcnlQcmVzZW5jZUludGVyZmFjZS5waHDmAAAAJigEauYAAACuM5eMpAEAAAAAAAAuAAAAc3JjL0NvbXBvc2VyL0luc3RhbGxlci9JbnN0YWxsYXRpb25NYW5hZ2VyLnBocAM2AAAmKARqAzYAAOYN48ykAQAAAAAAACkAAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyL0luc3RhbGxlckV2ZW50LnBocCoEAAAmKARqKgQAAEZa5NmkAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyL0luc3RhbGxlckV2ZW50cy5waHClAAAAJigEaqUAAAA+le3HpAEAAAAAAAAtAAAAc3JjL0NvbXBvc2VyL0luc3RhbGxlci9JbnN0YWxsZXJJbnRlcmZhY2UucGhwfgQAACYoBGp+BAAAAM2U1aQBAAAAAAAAKwAAAHNyYy9Db21wb3Nlci9JbnN0YWxsZXIvTGlicmFyeUluc3RhbGxlci5waHAMHgAAJigEagweAAAov6WXpAEAAAAAAAAvAAAAc3JjL0NvbXBvc2VyL0luc3RhbGxlci9NZXRhcGFja2FnZUluc3RhbGxlci5waHDWCAAAJigEatYIAAD7CvUipAEAAAAAAAAoAAAAc3JjL0NvbXBvc2VyL0luc3RhbGxlci9Ob29wSW5zdGFsbGVyLnBocGEHAAAmKARqYQcAAOp4UW6kAQAAAAAAACcAAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyL1BhY2thZ2VFdmVudC5waHD0BAAAJigEavQEAABikVxBpAEAAAAAAAAoAAAAc3JjL0NvbXBvc2VyL0luc3RhbGxlci9QYWNrYWdlRXZlbnRzLnBocPsBAAAmKARq+wEAAPKrf0ukAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyL1BsdWdpbkluc3RhbGxlci5waHCNDQAAJigEao0NAADylD0ZpAEAAAAAAAArAAAAc3JjL0NvbXBvc2VyL0luc3RhbGxlci9Qcm9qZWN0SW5zdGFsbGVyLnBocDkJAAAmKARqOQkAAAFV0YakAQAAAAAAADQAAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyL1N1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXIucGhwsREAACYoBGqxEQAAjQJYaaQBAAAAAAAAHgAAAHNyYy9Db21wb3Nlci9Kc29uL0pzb25GaWxlLnBocMAfAAAmKARqwB8AAHJ9ElikAQAAAAAAACMAAABzcmMvQ29tcG9zZXIvSnNvbi9Kc29uRm9ybWF0dGVyLnBocIwGAAAmKARqjAYAADDb+WSkAQAAAAAAACUAAABzcmMvQ29tcG9zZXIvSnNvbi9Kc29uTWFuaXB1bGF0b3IucGhwQWUAACYoBGpBZQAAJWl2BaQBAAAAAAAALQAAAHNyYy9Db21wb3Nlci9Kc29uL0pzb25WYWxpZGF0aW9uRXhjZXB0aW9uLnBocJcBAAAmKARqlwEAAJ1eXrSkAQAAAAAAADIAAABzcmMvQ29tcG9zZXIvUEhQU3Rhbi9Db25maWdSZXR1cm5UeXBlRXh0ZW5zaW9uLnBocNgTAAAmKARq2BMAAJBzYo6kAQAAAAAAADoAAABzcmMvQ29tcG9zZXIvUEhQU3Rhbi9SdWxlUmVhc29uRGF0YVJldHVyblR5cGVFeHRlbnNpb24ucGhwfggAACYoBGp+CAAApuesSKQBAAAAAAAAJQAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0FsaWFzUGFja2FnZS5waHC4GAAAJigEargYAAAI3UIxpAEAAAAAAAA3AAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvQXJjaGl2ZXIvQXJjaGl2YWJsZUZpbGVzRmlsdGVyLnBocFMCAAAmKARqUwIAACcyNWakAQAAAAAAADcAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9BcmNoaXZlci9BcmNoaXZhYmxlRmlsZXNGaW5kZXIucGhw1QYAACYoBGrVBgAAM+ROHqQBAAAAAAAAMAAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0FyY2hpdmVyL0FyY2hpdmVNYW5hZ2VyLnBocIQUAAAmKARqhBQAALDXE4ykAQAAAAAAADMAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9BcmNoaXZlci9BcmNoaXZlckludGVyZmFjZS5waHBTAQAAJigEalMBAAD/7D/upAEAAAAAAAAzAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvQXJjaGl2ZXIvQmFzZUV4Y2x1ZGVGaWx0ZXIucGhwEAcAACYoBGoQBwAAeMY2yKQBAAAAAAAANwAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0FyY2hpdmVyL0NvbXBvc2VyRXhjbHVkZUZpbHRlci5waHA/AQAAJigEaj8BAAA/j2BepAEAAAAAAAAyAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvQXJjaGl2ZXIvR2l0RXhjbHVkZUZpbHRlci5waHAkAwAAJigEaiQDAAB0jzhOpAEAAAAAAAAuAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvQXJjaGl2ZXIvUGhhckFyY2hpdmVyLnBocOkJAAAmKARq6QkAANtoDhGkAQAAAAAAAC0AAABzcmMvQ29tcG9zZXIvUGFja2FnZS9BcmNoaXZlci9aaXBBcmNoaXZlci5waHASBwAAJigEahIHAACMcQEOpAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvQmFzZVBhY2thZ2UucGhwBBMAACYoBGoEEwAAWB66nqQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0NvbXBhcmVyL0NvbXBhcmVyLnBocNIJAAAmKARq0gkAAPvasIikAQAAAAAAAC0AAABzcmMvQ29tcG9zZXIvUGFja2FnZS9Db21wbGV0ZUFsaWFzUGFja2FnZS5waHBxCgAAJigEanEKAAD6ICO3pAEAAAAAAAAoAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvQ29tcGxldGVQYWNrYWdlLnBocAUKAAAmKARqBQoAAIagSrGkAQAAAAAAADEAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9Db21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UucGhwlwUAACYoBGqXBQAAajL/MaQBAAAAAAAAKwAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0R1bXBlci9BcnJheUR1bXBlci5waHC4DQAAJigEargNAACW2pV1pAEAAAAAAAAdAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvTGluay5waHD2BwAAJigEavYHAACgImqlpAEAAAAAAAArAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvTG9hZGVyL0FycmF5TG9hZGVyLnBocMQvAAAmKARqxC8AAFLHeqGkAQAAAAAAADcAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9Mb2FkZXIvSW52YWxpZFBhY2thZ2VFeGNlcHRpb24ucGhwhAIAACYoBGqEAgAA6E38laQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0xvYWRlci9Kc29uTG9hZGVyLnBocJoDAAAmKARqmgMAAIUuCU6kAQAAAAAAAC8AAABzcmMvQ29tcG9zZXIvUGFja2FnZS9Mb2FkZXIvTG9hZGVySW50ZXJmYWNlLnBocJ4BAAAmKARqngEAABdGQqSkAQAAAAAAADEAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9Mb2FkZXIvUm9vdFBhY2thZ2VMb2FkZXIucGhwzB0AACYoBGrMHQAAfBuzkqQBAAAAAAAANQAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0xvYWRlci9WYWxpZGF0aW5nQXJyYXlMb2FkZXIucGhwe2cAACYoBGp7ZwAA6gAREKQBAAAAAAAAHwAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0xvY2tlci5waHDvNAAAJigEau80AABlUWEIpAEAAAAAAAAgAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvUGFja2FnZS5waHAIJQAAJigEagglAADV1xr2pAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvUGFja2FnZUludGVyZmFjZS5waHD4CwAAJigEavgLAACNZrbjpAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvUm9vdEFsaWFzUGFja2FnZS5waHDnCwAAJigEaucLAABBOpZEpAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvUm9vdFBhY2thZ2UucGhwqQUAACYoBGqpBQAAHRsJuqQBAAAAAAAALQAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL1Jvb3RQYWNrYWdlSW50ZXJmYWNlLnBocD0FAAAmKARqPQUAALbZXcSkAQAAAAAAADAAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9WZXJzaW9uL1N0YWJpbGl0eUZpbHRlci5waHAUAgAAJigEahQCAAAd3WhqpAEAAAAAAAAuAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvVmVyc2lvbi9WZXJzaW9uQnVtcGVyLnBocA4MAAAmKARqDgwAAEfwg6ukAQAAAAAAAC8AAABzcmMvQ29tcG9zZXIvUGFja2FnZS9WZXJzaW9uL1ZlcnNpb25HdWVzc2VyLnBocFQrAAAmKARqVCsAAKR3OQCkAQAAAAAAAC4AAABzcmMvQ29tcG9zZXIvUGFja2FnZS9WZXJzaW9uL1ZlcnNpb25QYXJzZXIucGhw1AcAACYoBGrUBwAA2OCS5qQBAAAAAAAAMAAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL1ZlcnNpb24vVmVyc2lvblNlbGVjdG9yLnBocG0aAAAmKARqbRoAAMeHCqSkAQAAAAAAACAAAABzcmMvQ29tcG9zZXIvUGFydGlhbENvbXBvc2VyLnBocJQGAAAmKARqlAYAAKwxsMakAQAAAAAAACYAAABzcmMvQ29tcG9zZXIvUGxhdGZvcm0vSGh2bURldGVjdG9yLnBocBEFAAAmKARqEQUAAI2x8+ikAQAAAAAAACEAAABzcmMvQ29tcG9zZXIvUGxhdGZvcm0vUnVudGltZS5waHAHCAAAJigEagcIAACgdHTUpAEAAAAAAAAhAAAAc3JjL0NvbXBvc2VyL1BsYXRmb3JtL1ZlcnNpb24ucGhwqgcAACYoBGqqBwAAy12v36QBAAAAAAAALQAAAHNyYy9Db21wb3Nlci9QbHVnaW4vQ2FwYWJpbGl0eS9DYXBhYmlsaXR5LnBocHAAAAAmKARqcAAAAJojYzukAQAAAAAAADIAAABzcmMvQ29tcG9zZXIvUGx1Z2luL0NhcGFiaWxpdHkvQ29tbWFuZFByb3ZpZGVyLnBocLAAAAAmKARqsAAAAEb82aSkAQAAAAAAAB8AAABzcmMvQ29tcG9zZXIvUGx1Z2luL0NhcGFibGUucGhwmAAAACYoBGqYAAAA+7BoqqQBAAAAAAAAJAAAAHNyYy9Db21wb3Nlci9QbHVnaW4vQ29tbWFuZEV2ZW50LnBocD8DAAAmKARqPwMAAHxVYB6kAQAAAAAAAC4AAABzcmMvQ29tcG9zZXIvUGx1Z2luL1BsdWdpbkJsb2NrZWRFeGNlcHRpb24ucGhwpwAAACYoBGqnAAAAEfb5cqQBAAAAAAAAJAAAAHNyYy9Db21wb3Nlci9QbHVnaW4vUGx1Z2luRXZlbnRzLnBocKgBAAAmKARqqAEAAFxLk9akAQAAAAAAACcAAABzcmMvQ29tcG9zZXIvUGx1Z2luL1BsdWdpbkludGVyZmFjZS5waHCrAQAAJigEaqsBAACm5RUcpAEAAAAAAAAlAAAAc3JjL0NvbXBvc2VyL1BsdWdpbi9QbHVnaW5NYW5hZ2VyLnBocCtTAAAmKARqK1MAAB+9v+GkAQAAAAAAAC0AAABzcmMvQ29tcG9zZXIvUGx1Z2luL1Bvc3RGaWxlRG93bmxvYWRFdmVudC5waHC/BQAAJigEar8FAADgQD6JpAEAAAAAAAAqAAAAc3JjL0NvbXBvc2VyL1BsdWdpbi9QcmVDb21tYW5kUnVuRXZlbnQucGhwLwIAACYoBGovAgAAMwmxFKQBAAAAAAAALAAAAHNyYy9Db21wb3Nlci9QbHVnaW4vUHJlRmlsZURvd25sb2FkRXZlbnQucGhwoAUAACYoBGqgBQAAtHGKbKQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9QbHVnaW4vUHJlUG9vbENyZWF0ZUV2ZW50LnBocLEHAAAmKARqsQcAAAXzvNukAQAAAAAAADQAAABzcmMvQ29tcG9zZXIvUXVlc3Rpb24vU3RyaWN0Q29uZmlybWF0aW9uUXVlc3Rpb24ucGhwjgUAACYoBGqOBQAABw7RcqQBAAAAAAAANQAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L0Fkdmlzb3J5UHJvdmlkZXJJbnRlcmZhY2UucGhwqQEAACYoBGqpAQAAEJXQsKQBAAAAAAAAKwAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L0FycmF5UmVwb3NpdG9yeS5waHA0GgAAJigEajQaAAC6jdLVpAEAAAAAAAAuAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvQXJ0aWZhY3RSZXBvc2l0b3J5LnBocHkMAAAmKARqeQwAANQYAuGkAQAAAAAAADIAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9DYW5vbmljYWxQYWNrYWdlc1RyYWl0LnBocMQCAAAmKARqxAIAABume+ukAQAAAAAAAC4AAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9Db21wb3NlclJlcG9zaXRvcnkucGhwdLcAACYoBGp0twAAYvyeRqQBAAAAAAAALwAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L0NvbXBvc2l0ZVJlcG9zaXRvcnkucGhwhQwAACYoBGqFDAAA+6sa36QBAAAAAAAAOwAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L0NvbmZpZ3VyYWJsZVJlcG9zaXRvcnlJbnRlcmZhY2UucGhwoQAAACYoBGqhAAAAY2UqMqQBAAAAAAAAMAAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L0ZpbGVzeXN0ZW1SZXBvc2l0b3J5LnBocN4qAAAmKARq3ioAAGoo+DGkAQAAAAAAACwAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9GaWx0ZXJSZXBvc2l0b3J5LnBocGcQAAAmKARqZxAAACuvRr6kAQAAAAAAADQAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9JbnN0YWxsZWRBcnJheVJlcG9zaXRvcnkucGhwWAEAACYoBGpYAQAAvCxbf6QBAAAAAAAAOQAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L0luc3RhbGxlZEZpbGVzeXN0ZW1SZXBvc2l0b3J5LnBocEoBAAAmKARqSgEAACdrQ+ikAQAAAAAAAC8AAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9JbnN0YWxsZWRSZXBvc2l0b3J5LnBocG0YAAAmKARqbRgAAPo61BKkAQAAAAAAADgAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9JbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlLnBocOAAAAAmKARq4AAAAL6y/2ekAQAAAAAAADYAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9JbnZhbGlkUmVwb3NpdG9yeUV4Y2VwdGlvbi5waHCHAAAAJigEaocAAAANVzxfpAEAAAAAAAAvAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvTG9ja0FycmF5UmVwb3NpdG9yeS5waHDiAAAAJigEauIAAAAAXob6pAEAAAAAAAAtAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvUGFja2FnZVJlcG9zaXRvcnkucGhwqgkAACYoBGqqCQAAsyAi4KQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L1BhdGhSZXBvc2l0b3J5LnBocFATAAAmKARqUBMAAKvG2aKkAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9QZWFyUmVwb3NpdG9yeS5waHAHAQAAJigEagcBAABRdc9qpAEAAAAAAAAuAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvUGxhdGZvcm1SZXBvc2l0b3J5LnBocFlbAAAmKARqWVsAAOlEcVSkAQAAAAAAAC0AAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9SZXBvc2l0b3J5RmFjdG9yeS5waHBaFwAAJigEaloXAAASxbn5pAEAAAAAAAAvAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvUmVwb3NpdG9yeUludGVyZmFjZS5waHClAwAAJigEaqUDAAAxIu8ApAEAAAAAAAAtAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvUmVwb3NpdG9yeU1hbmFnZXIucGhwogsAACYoBGqiCwAAByx9fqQBAAAAAAAANwAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L1JlcG9zaXRvcnlTZWN1cml0eUV4Y2VwdGlvbi5waHCIAAAAJigEaogAAABxnNd0pAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvUmVwb3NpdG9yeVNldC5waHDwJQAAJigEavAlAADxJInjpAEAAAAAAAArAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvUmVwb3NpdG9yeVV0aWxzLnBocJkEAAAmKARqmQQAAClbjd2kAQAAAAAAADEAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9Sb290UGFja2FnZVJlcG9zaXRvcnkucGhwXAEAACYoBGpcAQAAvmA5/KQBAAAAAAAALQAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L1Zjcy9Gb3JnZWpvRHJpdmVyLnBocFkfAAAmKARqWR8AAG+zqMqkAQAAAAAAACwAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9WY3MvRm9zc2lsRHJpdmVyLnBocLoUAAAmKARquhQAAK6UiUKkAQAAAAAAADIAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9WY3MvR2l0Qml0YnVja2V0RHJpdmVyLnBocA4nAAAmKARqDicAAP9cyMakAQAAAAAAACkAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9WY3MvR2l0RHJpdmVyLnBocGcYAAAmKARqZxgAAJUOei6kAQAAAAAAACwAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9WY3MvR2l0SHViRHJpdmVyLnBocJQ9AAAmKARqlD0AAOcZve2kAQAAAAAAACwAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9WY3MvR2l0TGFiRHJpdmVyLnBocNEyAAAmKARq0TIAAKqP9Q+kAQAAAAAAACgAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9WY3MvSGdEcml2ZXIucGhwQRQAACYoBGpBFAAAFYJmeaQBAAAAAAAALgAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L1Zjcy9QZXJmb3JjZURyaXZlci5waHARCwAAJigEahELAADOJf/apAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvVmNzL1N2bkRyaXZlci5waHAoHwAAJigEaigfAAByk1q8pAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvVmNzL1Zjc0RyaXZlci5waHA+CwAAJigEaj4LAAC+IIaYpAEAAAAAAAAyAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvVmNzL1Zjc0RyaXZlckludGVyZmFjZS5waHCxAwAAJigEarEDAABUioT4pAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvVmNzUmVwb3NpdG9yeS5waHCtNQAAJigEaq01AAD731WTpAEAAAAAAAAxAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvVmVyc2lvbkNhY2hlSW50ZXJmYWNlLnBocLkAAAAmKARquQAAAIJoCIekAQAAAAAAADMAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9Xcml0YWJsZUFycmF5UmVwb3NpdG9yeS5waHDZAgAAJigEatkCAABsJrQjpAEAAAAAAAA3AAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvV3JpdGFibGVSZXBvc2l0b3J5SW50ZXJmYWNlLnBocHcCAAAmKARqdwIAANV+vDCkAQAAAAAAAB0AAABzcmMvQ29tcG9zZXIvU2NyaXB0L0V2ZW50LnBocOMEAAAmKARq4wQAABKsuf+kAQAAAAAAACQAAABzcmMvQ29tcG9zZXIvU2NyaXB0L1NjcmlwdEV2ZW50cy5waHBJAwAAJigEakkDAACko0Q0pAEAAAAAAAAgAAAAc3JjL0NvbXBvc2VyL1NlbGZVcGRhdGUvS2V5cy5waHDZAQAAJigEatkBAADJDKhzpAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL1NlbGZVcGRhdGUvVmVyc2lvbnMucGhwXQkAACYoBGpdCQAAB9gVjqQBAAAAAAAAIAAAAHNyYy9Db21wb3Nlci9VdGlsL0F1dGhIZWxwZXIucGhwYykAACYoBGpjKQAAv27aPaQBAAAAAAAAHwAAAHNyYy9Db21wb3Nlci9VdGlsL0JpdGJ1Y2tldC5waHBOGgAAJigEak4aAABqC2oVpAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL1V0aWwvQ29tcG9zZXJNaXJyb3IucGhwGgYAACYoBGoaBgAAI7iP5aQBAAAAAAAAJQAAAHNyYy9Db21wb3Nlci9VdGlsL0NvbmZpZ1ZhbGlkYXRvci5waHBzGAAAJigEanMYAADVSKH8pAEAAAAAAAAiAAAAc3JjL0NvbXBvc2VyL1V0aWwvRXJyb3JIYW5kbGVyLnBocIkJAAAmKARqiQkAAH09yeekAQAAAAAAACAAAABzcmMvQ29tcG9zZXIvVXRpbC9GaWxlc3lzdGVtLnBocONBAAAmKARq40EAAE7uy1KkAQAAAAAAAB0AAABzcmMvQ29tcG9zZXIvVXRpbC9Gb3JnZWpvLnBocKEKAAAmKARqoQoAAIvHAJmkAQAAAAAAACsAAABzcmMvQ29tcG9zZXIvVXRpbC9Gb3JnZWpvUmVwb3NpdG9yeURhdGEucGhwYQMAACYoBGphAwAAoIIsBaQBAAAAAAAAIAAAAHNyYy9Db21wb3Nlci9VdGlsL0Zvcmdlam9VcmwucGhwzwQAACYoBGrPBAAAPA54LKQBAAAAAAAAGQAAAHNyYy9Db21wb3Nlci9VdGlsL0dpdC5waHCERwAAJigEaoRHAACfTVpUpAEAAAAAAAAcAAAAc3JjL0NvbXBvc2VyL1V0aWwvR2l0SHViLnBocMUYAAAmKARqxRgAALXszkmkAQAAAAAAABwAAABzcmMvQ29tcG9zZXIvVXRpbC9HaXRMYWIucGhw5h0AACYoBGrmHQAA2CxwDKQBAAAAAAAAGAAAAHNyYy9Db21wb3Nlci9VdGlsL0hnLnBocIUJAAAmKARqhQkAALgXkvikAQAAAAAAACkAAABzcmMvQ29tcG9zZXIvVXRpbC9IdHRwL0N1cmxEb3dubG9hZGVyLnBocHdRAAAmKARqd1EAAGwE0nikAQAAAAAAACcAAABzcmMvQ29tcG9zZXIvVXRpbC9IdHRwL0N1cmxSZXNwb25zZS5waHCVAQAAJigEapUBAACSO6m5pAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL1V0aWwvSHR0cC9Qcm94eUl0ZW0ucGhwRQgAACYoBGpFCAAAeZ/d1aQBAAAAAAAAJwAAAHNyYy9Db21wb3Nlci9VdGlsL0h0dHAvUHJveHlNYW5hZ2VyLnBocLoJAAAmKARqugkAAKdJSS+kAQAAAAAAACcAAABzcmMvQ29tcG9zZXIvVXRpbC9IdHRwL1JlcXVlc3RQcm94eS5waHCGCAAAJigEaoYIAABZRD8dpAEAAAAAAAAjAAAAc3JjL0NvbXBvc2VyL1V0aWwvSHR0cC9SZXNwb25zZS5waHC2BQAAJigEarYFAAB6fSe9pAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL1V0aWwvSHR0cERvd25sb2FkZXIucGhw7CkAACYoBGrsKQAABsA/eqQBAAAAAAAAHwAAAHNyYy9Db21wb3Nlci9VdGlsL0luaUhlbHBlci5waHCOAgAAJigEao4CAACZba5CpAEAAAAAAAAaAAAAc3JjL0NvbXBvc2VyL1V0aWwvTG9vcC5waHDNBwAAJigEas0HAACkOzxLpAEAAAAAAAAmAAAAc3JjL0NvbXBvc2VyL1V0aWwvTWV0YWRhdGFNaW5pZmllci5waHBDAQAAJigEakMBAABkGAyYpAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL1V0aWwvTm9Qcm94eVBhdHRlcm4ucGhwKBcAACYoBGooFwAATfsNoaQBAAAAAAAAIQAAAHNyYy9Db21wb3Nlci9VdGlsL1BhY2thZ2VJbmZvLnBocOACAAAmKARq4AIAAI9SGFikAQAAAAAAACMAAABzcmMvQ29tcG9zZXIvVXRpbC9QYWNrYWdlU29ydGVyLnBocMUIAAAmKARqxQgAAPa1m56kAQAAAAAAAB4AAABzcmMvQ29tcG9zZXIvVXRpbC9QZXJmb3JjZS5waHBXNQAAJigEalc1AAAUpCMMpAEAAAAAAAAeAAAAc3JjL0NvbXBvc2VyL1V0aWwvUGxhdGZvcm0ucGhwzhUAACYoBGrOFQAABYqta6QBAAAAAAAAJQAAAHNyYy9Db21wb3Nlci9VdGlsL1Byb2Nlc3NFeGVjdXRvci5waHCIKgAAJigEaogqAAAPjsIMpAEAAAAAAAAmAAAAc3JjL0NvbXBvc2VyL1V0aWwvUmVtb3RlRmlsZXN5c3RlbS5waHADQgAAJigEagNCAAAUVkVJpAEAAAAAAAAeAAAAc3JjL0NvbXBvc2VyL1V0aWwvU2lsZW5jZXIucGhw8QIAACYoBGrxAgAAR53PRaQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9VdGlsL1N0cmVhbUNvbnRleHRGYWN0b3J5LnBocJEUAAAmKARqkRQAAHc0SmOkAQAAAAAAABkAAABzcmMvQ29tcG9zZXIvVXRpbC9Tdm4ucGhwlxQAACYoBGqXFAAAEW3eZ6QBAAAAAAAAIAAAAHNyYy9Db21wb3Nlci9VdGlsL1N5bmNIZWxwZXIucGhw/wQAACYoBGr/BAAA0HobQaQBAAAAAAAAGQAAAHNyYy9Db21wb3Nlci9VdGlsL1Rhci5waHCRBAAAJigEapEEAAANaMb0pAEAAAAAAAAfAAAAc3JjL0NvbXBvc2VyL1V0aWwvVGxzSGVscGVyLnBocK4LAAAmKARqrgsAAA3cLkqkAQAAAAAAABkAAABzcmMvQ29tcG9zZXIvVXRpbC9VcmwucGhwoQwAACYoBGqhDAAAm4+4ZKQBAAAAAAAAGQAAAHNyYy9Db21wb3Nlci9VdGlsL1ppcC5waHAPCAAAJigEag8IAACjRNmRpAEAAAAAAAARAAAAc3JjL2Jvb3RzdHJhcC5waHAKAgAAJigEagoCAADRxC3IpAEAAAAAAAAlAAAAc3JjL0NvbXBvc2VyL0F1dG9sb2FkL0NsYXNzTG9hZGVyLnBocPo/AAAmKARq+j8AADJAHHWkAQAAAAAAACIAAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVkVmVyc2lvbnMucGhw80MAACYoBGrzQwAADzxud6QBAAAAAAAAHQAAAHJlcy9jb21wb3Nlci1sb2NrLXNjaGVtYS5qc29urw0AACYoBGqvDQAAt8ZyZqQBAAAAAAAAIwAAAHJlcy9jb21wb3Nlci1yZXBvc2l0b3J5LXNjaGVtYS5qc29u+CAAACYoBGr4IAAA1+u4gqQBAAAAAAAAGAAAAHJlcy9jb21wb3Nlci1zY2hlbWEuanNvbmoWAQAmKARqahYBACf6BPOkAQAAAAAAABMAAAB2ZW5kb3IvYXV0b2xvYWQucGhwbAIAACYoBGpsAgAAy+iv86QBAAAAAAAAHwAAAHZlbmRvci9jb21wb3Nlci9DbGFzc0xvYWRlci5waHAvHAAAJigEai8cAACY1eKSpAEAAAAAAAAlAAAAdmVuZG9yL2NvbXBvc2VyL0luc3RhbGxlZFZlcnNpb25zLnBocOcYAAAmKARq5xgAAKBFzkqkAQAAAAAAACUAAAB2ZW5kb3IvY29tcG9zZXIvYXV0b2xvYWRfY2xhc3NtYXAucGhwBwcAACYoBGoHBwAA7cAZ66QBAAAAAAAAIgAAAHZlbmRvci9jb21wb3Nlci9hdXRvbG9hZF9maWxlcy5waHBuBAAAJigEam4EAAAjLz6upAEAAAAAAAAnAAAAdmVuZG9yL2NvbXBvc2VyL2F1dG9sb2FkX25hbWVzcGFjZXMucGhwWgAAACYoBGpaAAAA66bhlqQBAAAAAAAAIQAAAHZlbmRvci9jb21wb3Nlci9hdXRvbG9hZF9wc3I0LnBocDwJAAAmKARqPAkAAPXUruOkAQAAAAAAACEAAAB2ZW5kb3IvY29tcG9zZXIvYXV0b2xvYWRfcmVhbC5waHDGBAAAJigEasYEAABpSTVlpAEAAAAAAAAjAAAAdmVuZG9yL2NvbXBvc2VyL2F1dG9sb2FkX3N0YXRpYy5waHClHAAAJigEaqUcAADTpH9rpAEAAAAAAAAhAAAAdmVuZG9yL2NvbXBvc2VyL2NhLWJ1bmRsZS9MSUNFTlNFHgQAACYoBGoeBAAARwkHX6QBAAAAAAAAKAAAAHZlbmRvci9jb21wb3Nlci9jYS1idW5kbGUvcmVzL2NhY2VydC5wZW14cwMAJigEanhzAwDJZqZPpAEAAAAAAAAqAAAAdmVuZG9yL2NvbXBvc2VyL2NhLWJ1bmRsZS9zcmMvQ2FCdW5kbGUucGhwPhMAACYoBGo+EwAAkuQ8h6QBAAAAAAAAKwAAAHZlbmRvci9jb21wb3Nlci9jbGFzcy1tYXAtZ2VuZXJhdG9yL0xJQ0VOU0UeBAAAJigEah4EAAA9+b71pAEAAAAAAAA0AAAAdmVuZG9yL2NvbXBvc2VyL2NsYXNzLW1hcC1nZW5lcmF0b3Ivc3JjL0NsYXNzTWFwLnBocA0KAAAmKARqDQoAAAoTOZOkAQAAAAAAAD0AAAB2ZW5kb3IvY29tcG9zZXIvY2xhc3MtbWFwLWdlbmVyYXRvci9zcmMvQ2xhc3NNYXBHZW5lcmF0b3IucGhw2hsAACYoBGraGwAAFNF/oKQBAAAAAAAANAAAAHZlbmRvci9jb21wb3Nlci9jbGFzcy1tYXAtZ2VuZXJhdG9yL3NyYy9GaWxlTGlzdC5waHAkAQAAJigEaiQBAABo9FNxpAEAAAAAAAA6AAAAdmVuZG9yL2NvbXBvc2VyL2NsYXNzLW1hcC1nZW5lcmF0b3Ivc3JjL1BocEZpbGVDbGVhbmVyLnBocBYQAAAmKARqFhAAAHZ+U3OkAQAAAAAAADkAAAB2ZW5kb3IvY29tcG9zZXIvY2xhc3MtbWFwLWdlbmVyYXRvci9zcmMvUGhwRmlsZVBhcnNlci5waHBhDAAAJigEamEMAAD4HNHVpAEAAAAAAAAeAAAAdmVuZG9yL2NvbXBvc2VyL2luc3RhbGxlZC5qc29unD0BACYoBGqcPQEAj0+MKaQBAAAAAAAAHQAAAHZlbmRvci9jb21wb3Nlci9pbnN0YWxsZWQucGhwtiIAACYoBGq2IgAAXBF++6QBAAAAAAAAKQAAAHZlbmRvci9jb21wb3Nlci9tZXRhZGF0YS1taW5pZmllci9MSUNFTlNFHgQAACYoBGoeBAAAvaPrx6QBAAAAAAAAOgAAAHZlbmRvci9jb21wb3Nlci9tZXRhZGF0YS1taW5pZmllci9zcmMvTWV0YWRhdGFNaW5pZmllci5waHDQBAAAJigEatAEAADCMCbApAEAAAAAAAAcAAAAdmVuZG9yL2NvbXBvc2VyL3BjcmUvTElDRU5TRR4EAAAmKARqHgQAAL2j68ekAQAAAAAAACsAAAB2ZW5kb3IvY29tcG9zZXIvcGNyZS9zcmMvTWF0Y2hBbGxSZXN1bHQucGhwHQEAACYoBGodAQAACVw5/6QBAAAAAAAANwAAAHZlbmRvci9jb21wb3Nlci9wY3JlL3NyYy9NYXRjaEFsbFN0cmljdEdyb3Vwc1Jlc3VsdC5waHApAQAAJigEaikBAABoSZ+FpAEAAAAAAAA2AAAAdmVuZG9yL2NvbXBvc2VyL3BjcmUvc3JjL01hdGNoQWxsV2l0aE9mZnNldHNSZXN1bHQucGhwKgEAACYoBGoqAQAA+EEJ4KQBAAAAAAAAKAAAAHZlbmRvci9jb21wb3Nlci9wY3JlL3NyYy9NYXRjaFJlc3VsdC5waHDvAAAAJigEau8AAAA8BuTApAEAAAAAAAA0AAAAdmVuZG9yL2NvbXBvc2VyL3BjcmUvc3JjL01hdGNoU3RyaWN0R3JvdXBzUmVzdWx0LnBocPsAAAAmKARq+wAAAKfLMFGkAQAAAAAAADMAAAB2ZW5kb3IvY29tcG9zZXIvcGNyZS9zcmMvTWF0Y2hXaXRoT2Zmc2V0c1Jlc3VsdC5waHD8AAAAJigEavwAAAB7KixvpAEAAAAAAAA8AAAAdmVuZG9yL2NvbXBvc2VyL3BjcmUvc3JjL1BIUFN0YW4vSW52YWxpZFJlZ2V4UGF0dGVyblJ1bGUucGhw4gsAACYoBGriCwAA/Nju16QBAAAAAAAAMwAAAHZlbmRvci9jb21wb3Nlci9wY3JlL3NyYy9QSFBTdGFuL1ByZWdNYXRjaEZsYWdzLnBocHAHAAAmKARqcAcAAFnKGE2kAQAAAAAAAEcAAAB2ZW5kb3IvY29tcG9zZXIvcGNyZS9zcmMvUEhQU3Rhbi9QcmVnTWF0Y2hQYXJhbWV0ZXJPdXRUeXBlRXh0ZW5zaW9uLnBocDEHAAAmKARqMQcAAMJ9zNKkAQAAAAAAAEUAAAB2ZW5kb3IvY29tcG9zZXIvcGNyZS9zcmMvUEhQU3Rhbi9QcmVnTWF0Y2hUeXBlU3BlY2lmeWluZ0V4dGVuc2lvbi5waHDZCwAAJigEatkLAABDErrHpAEAAAAAAABMAAAAdmVuZG9yL2NvbXBvc2VyL3BjcmUvc3JjL1BIUFN0YW4vUHJlZ1JlcGxhY2VDYWxsYmFja0Nsb3N1cmVUeXBlRXh0ZW5zaW9uLnBocIgHAAAmKARqiAcAANgE+C+kAQAAAAAAAD8AAAB2ZW5kb3IvY29tcG9zZXIvcGNyZS9zcmMvUEhQU3Rhbi9VbnNhZmVTdHJpY3RHcm91cHNDYWxsUnVsZS5waHBrCgAAJigEamsKAAAbM0W9pAEAAAAAAAAqAAAAdmVuZG9yL2NvbXBvc2VyL3BjcmUvc3JjL1BjcmVFeGNlcHRpb24ucGhwagMAACYoBGpqAwAAKruqXKQBAAAAAAAAIQAAAHZlbmRvci9jb21wb3Nlci9wY3JlL3NyYy9QcmVnLnBocDAiAAAmKARqMCIAANG5lHukAQAAAAAAACIAAAB2ZW5kb3IvY29tcG9zZXIvcGNyZS9zcmMvUmVnZXgucGhwBA0AACYoBGoEDQAAo/nrh6QBAAAAAAAAKgAAAHZlbmRvci9jb21wb3Nlci9wY3JlL3NyYy9SZXBsYWNlUmVzdWx0LnBocBYBAAAmKARqFgEAACexyPCkAQAAAAAAADkAAAB2ZW5kb3IvY29tcG9zZXIvcGNyZS9zcmMvVW5leHBlY3RlZE51bGxNYXRjaEV4Y2VwdGlvbi5waHASAQAAJigEahIBAACg7sDypAEAAAAAAAAeAAAAdmVuZG9yL2NvbXBvc2VyL3NlbXZlci9MSUNFTlNFHgQAACYoBGoeBAAAx1NSbaQBAAAAAAAAKQAAAHZlbmRvci9jb21wb3Nlci9zZW12ZXIvc3JjL0NvbXBhcmF0b3IucGhwEAQAACYoBGoQBAAAXl9Fk6QBAAAAAAAALwAAAHZlbmRvci9jb21wb3Nlci9zZW12ZXIvc3JjL0NvbXBpbGluZ01hdGNoZXIucGhwYwYAACYoBGpjBgAAhIAPpqQBAAAAAAAALwAAAHZlbmRvci9jb21wb3Nlci9zZW12ZXIvc3JjL0NvbnN0cmFpbnQvQm91bmQucGhwdwUAACYoBGp3BQAAVzRdV6QBAAAAAAAANAAAAHZlbmRvci9jb21wb3Nlci9zZW12ZXIvc3JjL0NvbnN0cmFpbnQvQ29uc3RyYWludC5waHD4HQAAJigEavgdAACSi4i9pAEAAAAAAAA9AAAAdmVuZG9yL2NvbXBvc2VyL3NlbXZlci9zcmMvQ29uc3RyYWludC9Db25zdHJhaW50SW50ZXJmYWNlLnBocKEBAAAmKARqoQEAAI41tHmkAQAAAAAAADwAAAB2ZW5kb3IvY29tcG9zZXIvc2VtdmVyL3NyYy9Db25zdHJhaW50L01hdGNoQWxsQ29uc3RyYWludC5waHCvAgAAJigEaq8CAACyRRf6pAEAAAAAAAA9AAAAdmVuZG9yL2NvbXBvc2VyL3NlbXZlci9zcmMvQ29uc3RyYWludC9NYXRjaE5vbmVDb25zdHJhaW50LnBocMkCAAAmKARqyQIAANav2K6kAQAAAAAAADkAAAB2ZW5kb3IvY29tcG9zZXIvc2VtdmVyL3NyYy9Db25zdHJhaW50L011bHRpQ29uc3RyYWludC5waHCKEwAAJigEaooTAADN1RvEpAEAAAAAAAAnAAAAdmVuZG9yL2NvbXBvc2VyL3NlbXZlci9zcmMvSW50ZXJ2YWwucGhw5gMAACYoBGrmAwAAPVsUaaQBAAAAAAAAKAAAAHZlbmRvci9jb21wb3Nlci9zZW12ZXIvc3JjL0ludGVydmFscy5waHCkKwAAJigEaqQrAABAMbqrpAEAAAAAAAAlAAAAdmVuZG9yL2NvbXBvc2VyL3NlbXZlci9zcmMvU2VtdmVyLnBocPkGAAAmKARq+QYAAOETLWmkAQAAAAAAACwAAAB2ZW5kb3IvY29tcG9zZXIvc2VtdmVyL3NyYy9WZXJzaW9uUGFyc2VyLnBocNctAAAmKARq1y0AABgqm3CkAQAAAAAAACUAAAB2ZW5kb3IvY29tcG9zZXIvc3BkeC1saWNlbnNlcy9MSUNFTlNFHgQAACYoBGoeBAAAx1NSbaQBAAAAAAAANgAAAHZlbmRvci9jb21wb3Nlci9zcGR4LWxpY2Vuc2VzL3Jlcy9zcGR4LWV4Y2VwdGlvbnMuanNvbjsYAAAmKARqOxgAAKy/81ekAQAAAAAAADQAAAB2ZW5kb3IvY29tcG9zZXIvc3BkeC1saWNlbnNlcy9yZXMvc3BkeC1saWNlbnNlcy5qc29uMSABACYoBGoxIAEAWRB6eKQBAAAAAAAAMgAAAHZlbmRvci9jb21wb3Nlci9zcGR4LWxpY2Vuc2VzL3NyYy9TcGR4TGljZW5zZXMucGhwfBUAACYoBGp8FQAAECSEgKQBAAAAAAAAJgAAAHZlbmRvci9jb21wb3Nlci94ZGVidWctaGFuZGxlci9MSUNFTlNFKwQAACYoBGorBAAA1uNAVKQBAAAAAAAAMAAAAHZlbmRvci9jb21wb3Nlci94ZGVidWctaGFuZGxlci9zcmMvUGhwQ29uZmlnLnBocIkDAAAmKARqiQMAAGfUj3akAQAAAAAAAC4AAAB2ZW5kb3IvY29tcG9zZXIveGRlYnVnLWhhbmRsZXIvc3JjL1Byb2Nlc3MucGhw8gUAACYoBGryBQAAZp5aLqQBAAAAAAAALQAAAHZlbmRvci9jb21wb3Nlci94ZGVidWctaGFuZGxlci9zcmMvU3RhdHVzLnBocNINAAAmKARq0g0AALEBzXSkAQAAAAAAADQAAAB2ZW5kb3IvY29tcG9zZXIveGRlYnVnLWhhbmRsZXIvc3JjL1hkZWJ1Z0hhbmRsZXIucGhw0ywAACYoBGrTLAAAOkDT46QBAAAAAAAAKAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL0xJQ0VOU0UiBAAAJigEaiIEAAAMfLuZpAEAAAAAAABDAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludEVycm9yLnBocGgWAAAmKARqaBYAAG+jOQukAQAAAAAAAE4AAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9CYXNlQ29uc3RyYWludC5waHCiDAAAJigEaqIMAADSaCfxpAEAAAAAAABUAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvQ29sbGVjdGlvbkNvbnN0cmFpbnQucGhwgQoAACYoBGqBCgAA5YhI7aQBAAAAAAAATwAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0NvbnN0Q29uc3RyYWludC5waHBIAwAAJigEakgDAADeE/edpAEAAAAAAABKAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvQ29uc3RyYWludC5waHCzDgAAJigEarMOAAC1tsPVpAEAAAAAAABTAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvQ29uc3RyYWludEludGVyZmFjZS5waHAPAgAAJigEag8CAACtVvHjpAEAAAAAAABoAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDYvQWRkaXRpb25hbEl0ZW1zQ29uc3RyYWludC5waHC/BQAAJigEar8FAABKg43DpAEAAAAAAABtAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDYvQWRkaXRpb25hbFByb3BlcnRpZXNDb25zdHJhaW50LnBocCYIAAAmKARqJggAALX1OU6kAQAAAAAAAF4AAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNi9BbGxPZkNvbnN0cmFpbnQucGhwsgMAACYoBGqyAwAAWRkQXaQBAAAAAAAAXgAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L0FueU9mQ29uc3RyYWludC5waHApBAAAJigEaikEAAA3JxzrpAEAAAAAAABeAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDYvQ29uc3RDb25zdHJhaW50LnBocBYDAAAmKARqFgMAABrlVNGkAQAAAAAAAGEAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNi9Db250YWluc0NvbnN0cmFpbnQucGhw+AMAACYoBGr4AwAAn3ys/aQBAAAAAAAAZQAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L0RlcGVuZGVuY2llc0NvbnN0cmFpbnQucGhw1AUAACYoBGrUBQAAwGHpvqQBAAAAAAAAYAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L0RyYWZ0MDZDb25zdHJhaW50LnBocDAMAAAmKARqMAwAAGmKbz2kAQAAAAAAAF0AAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNi9FbnVtQ29uc3RyYWludC5waHCsAwAAJigEaqwDAACEtiV4pAEAAAAAAABpAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDYvRXhjbHVzaXZlTWF4aW11bUNvbnN0cmFpbnQucGhwVwMAACYoBGpXAwAACa1CyKQBAAAAAAAAaQAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L0V4Y2x1c2l2ZU1pbmltdW1Db25zdHJhaW50LnBocFcDAAAmKARqVwMAAGE6U9qkAQAAAAAAAFYAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNi9GYWN0b3J5LnBocBMGAAAmKARqEwYAAHToQj2kAQAAAAAAAF8AAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNi9Gb3JtYXRDb25zdHJhaW50LnBocFgWAAAmKARqWBYAANX5fhqkAQAAAAAAAF4AAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNi9JdGVtc0NvbnN0cmFpbnQucGhwPgQAACYoBGo+BAAAlKubYqQBAAAAAAAAYQAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L01heEl0ZW1zQ29uc3RyYWludC5waHA+AwAAJigEaj4DAAAC+nv2pAEAAAAAAABiAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDYvTWF4TGVuZ3RoQ29uc3RyYWludC5waHBMAwAAJigEakwDAACbVlQMpAEAAAAAAABmAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDYvTWF4UHJvcGVydGllc0NvbnN0cmFpbnQucGhwbgMAACYoBGpuAwAAmUdetKQBAAAAAAAAYAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L01heGltdW1Db25zdHJhaW50LnBocCEDAAAmKARqIQMAAAEgBH6kAQAAAAAAAGEAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNi9NaW5JdGVtc0NvbnN0cmFpbnQucGhwPgMAACYoBGo+AwAA23VWcKQBAAAAAAAAYgAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L01pbkxlbmd0aENvbnN0cmFpbnQucGhwTAMAACYoBGpMAwAAddpJXqQBAAAAAAAAZgAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L01pblByb3BlcnRpZXNDb25zdHJhaW50LnBocG4DAAAmKARqbgMAADDOU+GkAQAAAAAAAGAAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNi9NaW5pbXVtQ29uc3RyYWludC5waHAhAwAAJigEaiEDAACJs7K5pAEAAAAAAABjAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDYvTXVsdGlwbGVPZkNvbnN0cmFpbnQucGhwmwQAACYoBGqbBAAA3av7Y6QBAAAAAAAAXAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L05vdENvbnN0cmFpbnQucGhwTAMAACYoBGpMAwAAHWS1PaQBAAAAAAAAXgAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L09uZU9mQ29uc3RyYWludC5waHAdBAAAJigEah0EAAASq/LNpAEAAAAAAABgAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDYvUGF0dGVybkNvbnN0cmFpbnQucGhwDQUAACYoBGoNBQAA/nBOrKQBAAAAAAAAagAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L1BhdHRlcm5Qcm9wZXJ0aWVzQ29uc3RyYWludC5waHD5BQAAJigEavkFAABR7f4YpAEAAAAAAABjAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDYvUHJvcGVydGllc0NvbnN0cmFpbnQucGhw9wMAACYoBGr3AwAAFcEbXaQBAAAAAAAAaAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L1Byb3BlcnRpZXNOYW1lc0NvbnN0cmFpbnQucGhw+QYAACYoBGr5BgAAmxrH7aQBAAAAAAAAXAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L1JlZkNvbnN0cmFpbnQucGhwowMAACYoBGqjAwAAB6EG76QBAAAAAAAAYQAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L1JlcXVpcmVkQ29uc3RyYWludC5waHBbBAAAJigEalsEAAC6cjLnpAEAAAAAAABdAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDYvVHlwZUNvbnN0cmFpbnQucGhwXQQAACYoBGpdBAAA4ePwiqQBAAAAAAAAZAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L1VuaXF1ZUl0ZW1zQ29uc3RyYWludC5waHDGAwAAJigEasYDAAAoLbUupAEAAAAAAABoAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDcvQWRkaXRpb25hbEl0ZW1zQ29uc3RyYWludC5waHC/BQAAJigEar8FAACtuAPupAEAAAAAAABtAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDcvQWRkaXRpb25hbFByb3BlcnRpZXNDb25zdHJhaW50LnBocCYIAAAmKARqJggAAI0diOKkAQAAAAAAAF4AAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNy9BbGxPZkNvbnN0cmFpbnQucGhwsgMAACYoBGqyAwAAPmrVU6QBAAAAAAAAXgAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA3L0FueU9mQ29uc3RyYWludC5waHApBAAAJigEaikEAACsSH8HpAEAAAAAAABeAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDcvQ29uc3RDb25zdHJhaW50LnBocBYDAAAmKARqFgMAALxuwfqkAQAAAAAAAGEAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNy9Db250YWluc0NvbnN0cmFpbnQucGhw+AMAACYoBGr4AwAAidt8GqQBAAAAAAAAYAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA3L0NvbnRlbnRDb25zdHJhaW50LnBocF8FAAAmKARqXwUAAFl3q/ukAQAAAAAAAGUAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNy9EZXBlbmRlbmNpZXNDb25zdHJhaW50LnBocNQFAAAmKARq1AUAAFnLXe6kAQAAAAAAAGAAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNy9EcmFmdDA3Q29uc3RyYWludC5waHCxDAAAJigEarEMAABIU1x2pAEAAAAAAABdAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDcvRW51bUNvbnN0cmFpbnQucGhwrAMAACYoBGqsAwAARGeEBqQBAAAAAAAAaQAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA3L0V4Y2x1c2l2ZU1heGltdW1Db25zdHJhaW50LnBocFcDAAAmKARqVwMAAEoUMlakAQAAAAAAAGkAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNy9FeGNsdXNpdmVNaW5pbXVtQ29uc3RyYWludC5waHBXAwAAJigEalcDAAAigyNEpAEAAAAAAABWAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDcvRmFjdG9yeS5waHBnBgAAJigEamcGAADVguJdpAEAAAAAAABfAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDcvRm9ybWF0Q29uc3RyYWludC5waHBpHwAAJigEamkfAADjf32WpAEAAAAAAABjAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDcvSWZUaGVuRWxzZUNvbnN0cmFpbnQucGhwRgUAACYoBGpGBQAAi5yY86QBAAAAAAAAXgAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA3L0l0ZW1zQ29uc3RyYWludC5waHA+BAAAJigEaj4EAAA8ZDiLpAEAAAAAAABhAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDcvTWF4SXRlbXNDb25zdHJhaW50LnBocD4DAAAmKARqPgMAANX5MFukAQAAAAAAAGIAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNy9NYXhMZW5ndGhDb25zdHJhaW50LnBocEwDAAAmKARqTAMAAFtQMwukAQAAAAAAAGYAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNy9NYXhQcm9wZXJ0aWVzQ29uc3RyYWludC5waHBuAwAAJigEam4DAACyZp29pAEAAAAAAABgAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDcvTWF4aW11bUNvbnN0cmFpbnQucGhwIQMAACYoBGohAwAAjds3XaQBAAAAAAAAYQAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA3L01pbkl0ZW1zQ29uc3RyYWludC5waHA+AwAAJigEaj4DAAAMdh3dpAEAAAAAAABiAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDcvTWluTGVuZ3RoQ29uc3RyYWludC5waHBMAwAAJigEakwDAAC13C5ZpAEAAAAAAABmAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDcvTWluUHJvcGVydGllc0NvbnN0cmFpbnQucGhwbgMAACYoBGpuAwAAG++Q6KQBAAAAAAAAYAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA3L01pbmltdW1Db25zdHJhaW50LnBocCEDAAAmKARqIQMAAAVIgZqkAQAAAAAAAGMAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNy9NdWx0aXBsZU9mQ29uc3RyYWludC5waHCbBAAAJigEapsEAACniHIbpAEAAAAAAABcAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDcvTm90Q29uc3RyYWludC5waHBMAwAAJigEakwDAADdYtI6pAEAAAAAAABeAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDcvT25lT2ZDb25zdHJhaW50LnBocB0EAAAmKARqHQQAALcxWVSkAQAAAAAAAGAAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNy9QYXR0ZXJuQ29uc3RyYWludC5waHANBQAAJigEag0FAAC7DveapAEAAAAAAABqAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDcvUGF0dGVyblByb3BlcnRpZXNDb25zdHJhaW50LnBocPkFAAAmKARq+QUAAHT9I4ekAQAAAAAAAGMAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNy9Qcm9wZXJ0aWVzQ29uc3RyYWludC5waHD3AwAAJigEavcDAAAb0JE1pAEAAAAAAABoAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDcvUHJvcGVydGllc05hbWVzQ29uc3RyYWludC5waHD5BgAAJigEavkGAABn60XhpAEAAAAAAABcAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDcvUmVmQ29uc3RyYWludC5waHCjAwAAJigEaqMDAAA/WUPJpAEAAAAAAABhAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDcvUmVxdWlyZWRDb25zdHJhaW50LnBocFsEAAAmKARqWwQAADq7/vakAQAAAAAAAF0AAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNy9UeXBlQ29uc3RyYWludC5waHBdBAAAJigEal0EAAByEMtTpAEAAAAAAABkAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDcvVW5pcXVlSXRlbXNDb25zdHJhaW50LnBocMYDAAAmKARqxgMAAKlTVYqkAQAAAAAAAE4AAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9FbnVtQ29uc3RyYWludC5waHDTAwAAJigEatMDAABwcWeLpAEAAAAAAABHAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRmFjdG9yeS5waHBBDwAAJigEakEPAADEVkFgpAEAAAAAAABQAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRm9ybWF0Q29uc3RyYWludC5waHCTEgAAJigEapMSAACCntGYpAEAAAAAAABQAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvTnVtYmVyQ29uc3RyYWludC5waHBFCAAAJigEakUIAADPlEU8pAEAAAAAAABQAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvT2JqZWN0Q29uc3RyYWludC5waHCtEAAAJigEaq0QAADUeciYpAEAAAAAAABQAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvU2NoZW1hQ29uc3RyYWludC5waHCCCQAAJigEaoIJAAB+6o4+pAEAAAAAAABQAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvU3RyaW5nQ29uc3RyYWludC5waHAjBAAAJigEaiMEAAD87DW6pAEAAAAAAABYAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvVHlwZUNoZWNrL0xvb3NlVHlwZUNoZWNrLnBocI8EAAAmKARqjwQAANBqACakAQAAAAAAAFkAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9UeXBlQ2hlY2svU3RyaWN0VHlwZUNoZWNrLnBocLECAAAmKARqsQIAAAk5mmikAQAAAAAAAFwAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9UeXBlQ2hlY2svVHlwZUNoZWNrSW50ZXJmYWNlLnBocKMBAAAmKARqowEAALhBDRekAQAAAAAAAE4AAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9UeXBlQ29uc3RyYWludC5waHCtFQAAJigEaq0VAAASzBQPpAEAAAAAAABTAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvVW5kZWZpbmVkQ29uc3RyYWludC5waHDMJAAAJigEaswkAAAB4h8zpAEAAAAAAABEAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvRHJhZnRJZGVudGlmaWVycy5waHDOBQAAJigEas4FAABLfcLQpAEAAAAAAABDAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvRW50aXR5L0Vycm9yQmFnLnBocPwHAAAmKARq/AcAAJ13i4akAQAAAAAAAEgAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9FbnRpdHkvRXJyb3JCYWdQcm94eS5waHDtAwAAJigEau0DAABjz/+VpAEAAAAAAABGAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvRW50aXR5L0pzb25Qb2ludGVyLnBocCkHAAAmKARqKQcAAK6TCAGkAQAAAAAAADgAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9FbnVtLnBocGcAAAAmKARqZwAAAL0vygekAQAAAAAAAFAAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9FeGNlcHRpb24vRXhjZXB0aW9uSW50ZXJmYWNlLnBocGMAAAAmKARqYwAAAFdmop6kAQAAAAAAAFYAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9FeGNlcHRpb24vSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uLnBocK8AAAAmKARqrwAAAEZ0KiCkAQAAAAAAAFQAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9FeGNlcHRpb24vSW52YWxpZENvbmZpZ0V4Y2VwdGlvbi5waHCGAAAAJigEaoYAAAApKZxapAEAAAAAAABUAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvRXhjZXB0aW9uL0ludmFsaWRTY2hlbWFFeGNlcHRpb24ucGhwhgAAACYoBGqGAAAAgDonc6QBAAAAAAAAXQAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0V4Y2VwdGlvbi9JbnZhbGlkU2NoZW1hTWVkaWFUeXBlRXhjZXB0aW9uLnBocI8AAAAmKARqjwAAAHdUVDqkAQAAAAAAAFcAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9FeGNlcHRpb24vSW52YWxpZFNvdXJjZVVyaUV4Y2VwdGlvbi5waHCRAAAAJigEapEAAAD1ywt+pAEAAAAAAABTAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvRXhjZXB0aW9uL0pzb25EZWNvZGluZ0V4Y2VwdGlvbi5waHD5AgAAJigEavkCAADxUTM8pAEAAAAAAABXAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvRXhjZXB0aW9uL1Jlc291cmNlTm90Rm91bmRFeGNlcHRpb24ucGhwiQAAACYoBGqJAAAAuS8V8aQBAAAAAAAATgAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0V4Y2VwdGlvbi9SdW50aW1lRXhjZXB0aW9uLnBocJ8AAAAmKARqnwAAADdii9CkAQAAAAAAAF4AAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9FeGNlcHRpb24vVW5yZXNvbHZhYmxlSnNvblBvaW50ZXJFeGNlcHRpb24ucGhwmgAAACYoBGqaAAAAXLQqGKQBAAAAAAAAUgAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0V4Y2VwdGlvbi9VcmlSZXNvbHZlckV4Y2VwdGlvbi5waHCEAAAAJigEaoQAAABN34iHpAEAAAAAAABRAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvRXhjZXB0aW9uL1ZhbGlkYXRpb25FeGNlcHRpb24ucGhwgAAAACYoBGqAAAAAHmwW46QBAAAAAAAASwAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0l0ZXJhdG9yL09iamVjdEl0ZXJhdG9yLnBocD4GAAAmKARqPgYAAOxUmSikAQAAAAAAADsAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9SZmMzMzM5LnBocOcFAAAmKARq5wUAAHMh31OkAQAAAAAAAEEAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9TY2hlbWFTdG9yYWdlLnBocAwVAAAmKARqDBUAAB9Sr0akAQAAAAAAAEoAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9TY2hlbWFTdG9yYWdlSW50ZXJmYWNlLnBocDEBAAAmKARqMQEAAAy1ClOkAQAAAAAAAEUAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Ub29sL0RlZXBDb21wYXJlci5waHBiBAAAJigEamIEAACaRdqBpAEAAAAAAABBAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvVG9vbC9EZWVwQ29weS5waHCXAgAAJigEapcCAAB4LxczpAEAAAAAAABdAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvVG9vbC9WYWxpZGF0b3IvUmVsYXRpdmVSZWZlcmVuY2VWYWxpZGF0b3IucGhwLQMAACYoBGotAwAAsKbmAKQBAAAAAAAATwAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL1Rvb2wvVmFsaWRhdG9yL1VyaVZhbGlkYXRvci5waHBZBwAAJigEalkHAADgXd2gpAEAAAAAAABUAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvVXJpL1JldHJpZXZlcnMvQWJzdHJhY3RSZXRyaWV2ZXIucGhw/AAAACYoBGr8AAAA42CMPKQBAAAAAAAARwAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL1VyaS9SZXRyaWV2ZXJzL0N1cmwucGhw2AQAACYoBGrYBAAAA32IjaQBAAAAAAAAUgAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL1VyaS9SZXRyaWV2ZXJzL0ZpbGVHZXRDb250ZW50cy5waHBgBgAAJigEamAGAADKS4ULpAEAAAAAAABSAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvVXJpL1JldHJpZXZlcnMvUHJlZGVmaW5lZEFycmF5LnBocEYCAAAmKARqRgIAAI9y2CukAQAAAAAAAFgAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9VcmkvUmV0cmlldmVycy9VcmlSZXRyaWV2ZXJJbnRlcmZhY2UucGhwyAAAACYoBGrIAAAANQSAhaQBAAAAAAAAQwAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL1VyaS9VcmlSZXNvbHZlci5waHAADAAAJigEagAMAABsrKaBpAEAAAAAAABEAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvVXJpL1VyaVJldHJpZXZlci5waHBtFAAAJigEam0UAACw7ECEpAEAAAAAAABIAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvVXJpUmVzb2x2ZXJJbnRlcmZhY2UucGhwnQAAACYoBGqdAAAAo75D8aQBAAAAAAAASQAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL1VyaVJldHJpZXZlckludGVyZmFjZS5waHCfAAAAJigEap8AAADSoRUipAEAAAAAAAA9AAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvVmFsaWRhdG9yLnBocO8HAAAmKARq7wcAAPwSeA6kAQAAAAAAACUAAAB2ZW5kb3IvbWFyYy1tYWJlL3BocC1lbnVtL0xJQ0VOU0UudHh0+AUAACYoBGr4BQAAj5dD0aQBAAAAAAAAJgAAAHZlbmRvci9tYXJjLW1hYmUvcGhwLWVudW0vc3JjL0VudW0ucGhwYBgAACYoBGpgGAAA+cFRsKQBAAAAAAAAKQAAAHZlbmRvci9tYXJjLW1hYmUvcGhwLWVudW0vc3JjL0VudW1NYXAucGhwQxAAACYoBGpDEAAAe34ZyqQBAAAAAAAANwAAAHZlbmRvci9tYXJjLW1hYmUvcGhwLWVudW0vc3JjL0VudW1TZXJpYWxpemFibGVUcmFpdC5waHB/BQAAJigEan8FAACzO+ifpAEAAAAAAAApAAAAdmVuZG9yL21hcmMtbWFiZS9waHAtZW51bS9zcmMvRW51bVNldC5waHCmNgAAJigEaqY2AAAEnKZfpAEAAAAAAAAuAAAAdmVuZG9yL21hcmMtbWFiZS9waHAtZW51bS9zdHVicy9TdHJpbmdhYmxlLnBocGIAAAAmKARqYgAAAMPRmzykAQAAAAAAABwAAAB2ZW5kb3IvcHNyL2NvbnRhaW5lci9MSUNFTlNFewQAACYoBGp7BAAA1dMAZaQBAAAAAAAAOAAAAHZlbmRvci9wc3IvY29udGFpbmVyL3NyYy9Db250YWluZXJFeGNlcHRpb25JbnRlcmZhY2UucGhwTgAAACYoBGpOAAAA/EwYg6QBAAAAAAAALwAAAHZlbmRvci9wc3IvY29udGFpbmVyL3NyYy9Db250YWluZXJJbnRlcmZhY2UucGhwtwAAACYoBGq3AAAAiuMBvKQBAAAAAAAANwAAAHZlbmRvci9wc3IvY29udGFpbmVyL3NyYy9Ob3RGb3VuZEV4Y2VwdGlvbkludGVyZmFjZS5waHBxAAAAJigEanEAAABSf/r1pAEAAAAAAAAWAAAAdmVuZG9yL3Bzci9sb2cvTElDRU5TRT8EAAAmKARqPwQAAIT5CQikAQAAAAAAACkAAAB2ZW5kb3IvcHNyL2xvZy9Qc3IvTG9nL0Fic3RyYWN0TG9nZ2VyLnBocDsEAAAmKARqOwQAAPE+M1ukAQAAAAAAADMAAAB2ZW5kb3IvcHNyL2xvZy9Qc3IvTG9nL0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbi5waHBgAAAAJigEamAAAAAgiFgxpAEAAAAAAAAjAAAAdmVuZG9yL3Bzci9sb2cvUHNyL0xvZy9Mb2dMZXZlbC5waHD7AAAAJigEavsAAABq8PE4pAEAAAAAAAAvAAAAdmVuZG9yL3Bzci9sb2cvUHNyL0xvZy9Mb2dnZXJBd2FyZUludGVyZmFjZS5waHB8AAAAJigEanwAAAAkE6OIpAEAAAAAAAArAAAAdmVuZG9yL3Bzci9sb2cvUHNyL0xvZy9Mb2dnZXJBd2FyZVRyYWl0LnBocKcAAAAmKARqpwAAAFS9+kKkAQAAAAAAACoAAAB2ZW5kb3IvcHNyL2xvZy9Qc3IvTG9nL0xvZ2dlckludGVyZmFjZS5waHDIAgAAJigEasgCAACaH3gdpAEAAAAAAAAmAAAAdmVuZG9yL3Bzci9sb2cvUHNyL0xvZy9Mb2dnZXJUcmFpdC5waHBrBAAAJigEamsEAACjfYmSpAEAAAAAAAAlAAAAdmVuZG9yL3Bzci9sb2cvUHNyL0xvZy9OdWxsTG9nZ2VyLnBocJ8AAAAmKARqnwAAAIFY86qkAQAAAAAAACkAAAB2ZW5kb3IvcHNyL2xvZy9Qc3IvTG9nL1Rlc3QvRHVtbXlUZXN0LnBocHAAAAAmKARqcAAAABoVzgWkAQAAAAAAADMAAAB2ZW5kb3IvcHNyL2xvZy9Qc3IvTG9nL1Rlc3QvTG9nZ2VySW50ZXJmYWNlVGVzdC5waHAgDQAAJigEaiANAAAdJC/SpAEAAAAAAAAqAAAAdmVuZG9yL3Bzci9sb2cvUHNyL0xvZy9UZXN0L1Rlc3RMb2dnZXIucGhwPAgAACYoBGo8CAAA/ijlSaQBAAAAAAAAHAAAAHZlbmRvci9yZWFjdC9wcm9taXNlL0xJQ0VOU0VpBAAAJigEamkEAAAQM32LpAEAAAAAAAAlAAAAdmVuZG9yL3JlYWN0L3Byb21pc2Uvc3JjL0RlZmVycmVkLnBocFMCAAAmKARqUwIAAL3214akAQAAAAAAADkAAAB2ZW5kb3IvcmVhY3QvcHJvbWlzZS9zcmMvRXhjZXB0aW9uL0NvbXBvc2l0ZUV4Y2VwdGlvbi5waHCMAQAAJigEaowBAAAhjM/ipAEAAAAAAAA2AAAAdmVuZG9yL3JlYWN0L3Byb21pc2Uvc3JjL0V4Y2VwdGlvbi9MZW5ndGhFeGNlcHRpb24ucGhwXgAAACYoBGpeAAAABD9xBKQBAAAAAAAANwAAAHZlbmRvci9yZWFjdC9wcm9taXNlL3NyYy9JbnRlcm5hbC9DYW5jZWxsYXRpb25RdWV1ZS5waHByAwAAJigEanIDAACBeF+xpAEAAAAAAAA2AAAAdmVuZG9yL3JlYWN0L3Byb21pc2Uvc3JjL0ludGVybmFsL0Z1bGZpbGxlZFByb21pc2UucGhweAUAACYoBGp4BQAAOnN4xaQBAAAAAAAANQAAAHZlbmRvci9yZWFjdC9wcm9taXNlL3NyYy9JbnRlcm5hbC9SZWplY3RlZFByb21pc2UucGhw9QcAACYoBGr1BwAAn4cT+qQBAAAAAAAAJAAAAHZlbmRvci9yZWFjdC9wcm9taXNlL3NyYy9Qcm9taXNlLnBocJATAAAmKARqkBMAAKUVlkOkAQAAAAAAAC0AAAB2ZW5kb3IvcmVhY3QvcHJvbWlzZS9zcmMvUHJvbWlzZUludGVyZmFjZS5waHBpAgAAJigEamkCAAAmHV0opAEAAAAAAAAmAAAAdmVuZG9yL3JlYWN0L3Byb21pc2Uvc3JjL2Z1bmN0aW9ucy5waHDHFAAAJigEascUAABgpbfSpAEAAAAAAAAuAAAAdmVuZG9yL3JlYWN0L3Byb21pc2Uvc3JjL2Z1bmN0aW9uc19pbmNsdWRlLnBocF0AAAAmKARqXQAAAFHRPKGkAQAAAAAAABwAAAB2ZW5kb3Ivc2VsZC9qc29ubGludC9MSUNFTlNFJAQAACYoBGokBAAANDqHfqQBAAAAAAAAQAAAAHZlbmRvci9zZWxkL2pzb25saW50L3NyYy9TZWxkL0pzb25MaW50L0R1cGxpY2F0ZUtleUV4Y2VwdGlvbi5waHB8AQAAJigEanwBAACaygnspAEAAAAAAAA1AAAAdmVuZG9yL3NlbGQvanNvbmxpbnQvc3JjL1NlbGQvSnNvbkxpbnQvSnNvblBhcnNlci5waHBNOQAAJigEak05AAB8wRBupAEAAAAAAAAwAAAAdmVuZG9yL3NlbGQvanNvbmxpbnQvc3JjL1NlbGQvSnNvbkxpbnQvTGV4ZXIucGhwpRQAACYoBGqlFAAAyLtfpKQBAAAAAAAAOwAAAHZlbmRvci9zZWxkL2pzb25saW50L3NyYy9TZWxkL0pzb25MaW50L1BhcnNpbmdFeGNlcHRpb24ucGhwKAEAACYoBGooAQAAPtt2faQBAAAAAAAANAAAAHZlbmRvci9zZWxkL2pzb25saW50L3NyYy9TZWxkL0pzb25MaW50L1VuZGVmaW5lZC5waHA+AAAAJigEaj4AAAD/cZ+fpAEAAAAAAAAeAAAAdmVuZG9yL3NlbGQvcGhhci11dGlscy9MSUNFTlNFJAQAACYoBGokBAAAmixNp6QBAAAAAAAAJQAAAHZlbmRvci9zZWxkL3BoYXItdXRpbHMvc3JjL0xpbnRlci5waHBpBwAAJigEamkHAACgG43epAEAAAAAAAApAAAAdmVuZG9yL3NlbGQvcGhhci11dGlscy9zcmMvVGltZXN0YW1wcy5waHBeDQAAJigEal4NAACd5cNEpAEAAAAAAAAiAAAAdmVuZG9yL3NlbGQvc2lnbmFsLWhhbmRsZXIvTElDRU5TRSQEAAAmKARqJAQAAJosTaekAQAAAAAAADAAAAB2ZW5kb3Ivc2VsZC9zaWduYWwtaGFuZGxlci9zcmMvU2lnbmFsSGFuZGxlci5waHCwHQAAJigEarAdAACBABYKpAEAAAAAAAAmAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9BcHBsaWNhdGlvbi5waHAGcQAAJigEagZxAAD9bSGEpAEAAAAAAAAuAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9BdHRyaWJ1dGUvQXNDb21tYW5kLnBocNQBAAAmKARq1AEAAL0z3P6kAQAAAAAAADIAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0NJL0dpdGh1YkFjdGlvblJlcG9ydGVyLnBocPUFAAAmKARq9QUAAL7bImekAQAAAAAAACAAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0NvbG9yLnBocGgOAAAmKARqaA4AAEdi55ekAQAAAAAAACoAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0NvbW1hbmQvQ29tbWFuZC5waHBKJwAAJigEakonAAAAC9p3pAEAAAAAAAAyAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Db21tYW5kL0NvbXBsZXRlQ29tbWFuZC5waHCLFgAAJigEaosWAAC+D30bpAEAAAAAAAA4AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Db21tYW5kL0R1bXBDb21wbGV0aW9uQ29tbWFuZC5waHCQDwAAJigEapAPAAA5mwY5pAEAAAAAAAAuAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Db21tYW5kL0hlbHBDb21tYW5kLnBocBUJAAAmKARqFQkAAAh9l6WkAQAAAAAAAC4AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0NvbW1hbmQvTGF6eUNvbW1hbmQucGhwmw8AACYoBGqbDwAAB55t5aQBAAAAAAAALgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ29tbWFuZC9MaXN0Q29tbWFuZC5waHAxCQAAJigEajEJAAAkRLt8pAEAAAAAAAAwAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Db21tYW5kL0xvY2thYmxlVHJhaXQucGhwDwQAACYoBGoPBAAAcTVnaqQBAAAAAAAAPQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ29tbWFuZC9TaWduYWxhYmxlQ29tbWFuZEludGVyZmFjZS5waHDTAAAAJigEatMAAAC7QmC+pAEAAAAAAAA/AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Db21tYW5kTG9hZGVyL0NvbW1hbmRMb2FkZXJJbnRlcmZhY2UucGhwUQEAACYoBGpRAQAAmxCeSKQBAAAAAAAAPwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ29tbWFuZExvYWRlci9Db250YWluZXJDb21tYW5kTG9hZGVyLnBocFUDAAAmKARqVQMAABvLX/ykAQAAAAAAAD0AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0NvbW1hbmRMb2FkZXIvRmFjdG9yeUNvbW1hbmRMb2FkZXIucGhwrwIAACYoBGqvAgAAZLwieqQBAAAAAAAANQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ29tcGxldGlvbi9Db21wbGV0aW9uSW5wdXQucGhwFhMAACYoBGoWEwAAlCSEa6QBAAAAAAAAOwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ29tcGxldGlvbi9Db21wbGV0aW9uU3VnZ2VzdGlvbnMucGhwwgMAACYoBGrCAwAAEkGhH6QBAAAAAAAAQQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ29tcGxldGlvbi9PdXRwdXQvQmFzaENvbXBsZXRpb25PdXRwdXQucGhwZwIAACYoBGpnAgAAh+z5V6QBAAAAAAAARgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ29tcGxldGlvbi9PdXRwdXQvQ29tcGxldGlvbk91dHB1dEludGVyZmFjZS5waHBGAQAAJigEakYBAADUMm5NpAEAAAAAAAAwAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Db21wbGV0aW9uL1N1Z2dlc3Rpb24ucGhwMwEAACYoBGozAQAAzIYgHaQBAAAAAAAAKAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ29uc29sZUV2ZW50cy5waHDVAgAAJigEatUCAACBZ3ddpAEAAAAAAAAhAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9DdXJzb3IucGhwjwkAACYoBGqPCQAAxqunjqQBAAAAAAAARAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRGVwZW5kZW5jeUluamVjdGlvbi9BZGRDb25zb2xlQ29tbWFuZFBhc3MucGhwZhEAACYoBGpmEQAAI9QgJKQBAAAAAAAAPAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRGVzY3JpcHRvci9BcHBsaWNhdGlvbkRlc2NyaXB0aW9uLnBocNkJAAAmKARq2QkAAOdwQ16kAQAAAAAAADAAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0Rlc2NyaXB0b3IvRGVzY3JpcHRvci5waHB9BwAAJigEan0HAACx6jNepAEAAAAAAAA5AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9EZXNjcmlwdG9yL0Rlc2NyaXB0b3JJbnRlcmZhY2UucGhw9wAAACYoBGr3AAAAteVA4KQBAAAAAAAANAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRGVzY3JpcHRvci9Kc29uRGVzY3JpcHRvci5waHDrEAAAJigEausQAAAxJeiPpAEAAAAAAAA4AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9EZXNjcmlwdG9yL01hcmtkb3duRGVzY3JpcHRvci5waHBRFAAAJigEalEUAAB0oIh2pAEAAAAAAAA0AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9EZXNjcmlwdG9yL1RleHREZXNjcmlwdG9yLnBocOciAAAmKARq5yIAAMi4zMukAQAAAAAAADMAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0Rlc2NyaXB0b3IvWG1sRGVzY3JpcHRvci5waHAIHwAAJigEaggfAAB1SUCapAEAAAAAAAA0AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9FdmVudC9Db25zb2xlQ29tbWFuZEV2ZW50LnBocMkBAAAmKARqyQEAALDW4Q6kAQAAAAAAADIAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0V2ZW50L0NvbnNvbGVFcnJvckV2ZW50LnBocP0DAAAmKARq/QMAABjpJZikAQAAAAAAAC0AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0V2ZW50L0NvbnNvbGVFdmVudC5waHDGAgAAJigEasYCAADFb9vZpAEAAAAAAAAzAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9FdmVudC9Db25zb2xlU2lnbmFsRXZlbnQucGhwRwIAACYoBGpHAgAAjvsbC6QBAAAAAAAANgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRXZlbnQvQ29uc29sZVRlcm1pbmF0ZUV2ZW50LnBocH4CAAAmKARqfgIAAGhyvdakAQAAAAAAADYAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0V2ZW50TGlzdGVuZXIvRXJyb3JMaXN0ZW5lci5waHAnCAAAJigEaicIAADwoqGJpAEAAAAAAAA9AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9FeGNlcHRpb24vQ29tbWFuZE5vdEZvdW5kRXhjZXB0aW9uLnBocNsBAAAmKARq2wEAAEt9nhekAQAAAAAAADcAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0V4Y2VwdGlvbi9FeGNlcHRpb25JbnRlcmZhY2UucGhweQAAACYoBGp5AAAA2TlbJqQBAAAAAAAAPQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRXhjZXB0aW9uL0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbi5waHCmAAAAJigEaqYAAADWzL1apAEAAAAAAAA7AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9FeGNlcHRpb24vSW52YWxpZE9wdGlvbkV4Y2VwdGlvbi5waHCmAAAAJigEaqYAAAATy9dIpAEAAAAAAAAzAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9FeGNlcHRpb24vTG9naWNFeGNlcHRpb24ucGhwkgAAACYoBGqSAAAAzU9cZaQBAAAAAAAAOgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRXhjZXB0aW9uL01pc3NpbmdJbnB1dEV4Y2VwdGlvbi5waHCcAAAAJigEapwAAADmUwr+pAEAAAAAAAA/AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9FeGNlcHRpb24vTmFtZXNwYWNlTm90Rm91bmRFeGNlcHRpb24ucGhwiwAAACYoBGqLAAAAgvNuqaQBAAAAAAAANQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRXhjZXB0aW9uL1J1bnRpbWVFeGNlcHRpb24ucGhwlgAAACYoBGqWAAAA2e0sNqQBAAAAAAAAOAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRm9ybWF0dGVyL051bGxPdXRwdXRGb3JtYXR0ZXIucGhwjQIAACYoBGqNAgAAISYNdaQBAAAAAAAAPQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRm9ybWF0dGVyL051bGxPdXRwdXRGb3JtYXR0ZXJTdHlsZS5waHAMAgAAJigEagwCAADKMIfYpAEAAAAAAAA0AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Gb3JtYXR0ZXIvT3V0cHV0Rm9ybWF0dGVyLnBocH8VAAAmKARqfxUAANzmpRKkAQAAAAAAAD0AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0Zvcm1hdHRlci9PdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UucGhwowEAACYoBGqjAQAAWSCn36QBAAAAAAAAOQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRm9ybWF0dGVyL091dHB1dEZvcm1hdHRlclN0eWxlLnBocHoHAAAmKARqegcAAP9qYa2kAQAAAAAAAEIAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0Zvcm1hdHRlci9PdXRwdXRGb3JtYXR0ZXJTdHlsZUludGVyZmFjZS5waHCfAQAAJigEap8BAAD4gMR3pAEAAAAAAAA+AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Gb3JtYXR0ZXIvT3V0cHV0Rm9ybWF0dGVyU3R5bGVTdGFjay5waHCFBQAAJigEaoUFAABM2eGKpAEAAAAAAABGAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Gb3JtYXR0ZXIvV3JhcHBhYmxlT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlLnBocNYAAAAmKARq1gAAAKFaAbekAQAAAAAAADYAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0hlbHBlci9EZWJ1Z0Zvcm1hdHRlckhlbHBlci5waHC4CAAAJigEargIAACk8DagpAEAAAAAAAAyAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9IZWxwZXIvRGVzY3JpcHRvckhlbHBlci5waHDABQAAJigEasAFAACmZ8yEpAEAAAAAAAAoAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9IZWxwZXIvRHVtcGVyLnBocBQFAAAmKARqFAUAAJ88y9+kAQAAAAAAADEAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0hlbHBlci9Gb3JtYXR0ZXJIZWxwZXIucGhwaQUAACYoBGppBQAApLaAd6QBAAAAAAAAKAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL0hlbHBlci5waHCNDAAAJigEao0MAADBlDFUpAEAAAAAAAAxAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9IZWxwZXIvSGVscGVySW50ZXJmYWNlLnBocOYAAAAmKARq5gAAAGBSwlykAQAAAAAAACsAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0hlbHBlci9IZWxwZXJTZXQucGhwSQUAACYoBGpJBQAAPYfiRKQBAAAAAAAAMgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL0lucHV0QXdhcmVIZWxwZXIucGhwYwEAACYoBGpjAQAABsz4g6QBAAAAAAAALwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL1Byb2Nlc3NIZWxwZXIucGhwXAwAACYoBGpcDAAAEMR6QaQBAAAAAAAALQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL1Byb2dyZXNzQmFyLnBocFgvAAAmKARqWC8AADJwkuSkAQAAAAAAADMAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0hlbHBlci9Qcm9ncmVzc0luZGljYXRvci5waHDAEgAAJigEasASAACHy2X1pAEAAAAAAAAwAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9IZWxwZXIvUXVlc3Rpb25IZWxwZXIucGhwUi0AACYoBGpSLQAA5qcxaaQBAAAAAAAANwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL1N5bWZvbnlRdWVzdGlvbkhlbHBlci5waHAZCQAAJigEahkJAADgnWT/pAEAAAAAAAAnAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9IZWxwZXIvVGFibGUucGhwtEoAACYoBGq0SgAAU9fBraQBAAAAAAAAKwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL1RhYmxlQ2VsbC5waHBBBAAAJigEakEEAADo06B/pAEAAAAAAAAwAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9IZWxwZXIvVGFibGVDZWxsU3R5bGUucGhw7gUAACYoBGruBQAA0Y25X6QBAAAAAAAAKwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL1RhYmxlUm93cy5waHApAQAAJigEaikBAABXijN6pAEAAAAAAAAwAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9IZWxwZXIvVGFibGVTZXBhcmF0b3IucGhwxQAAACYoBGrFAAAAvPXL/KQBAAAAAAAALAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL1RhYmxlU3R5bGUucGhwjRQAACYoBGqNFAAAVxi6CKQBAAAAAAAAKgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSW5wdXQvQXJndklucHV0LnBocCscAAAmKARqKxwAAEaxttGkAQAAAAAAACsAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0lucHV0L0FycmF5SW5wdXQucGhwCA0AACYoBGoIDQAA8aafLqQBAAAAAAAAJgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSW5wdXQvSW5wdXQucGhwpA0AACYoBGqkDQAA2txvsaQBAAAAAAAALgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSW5wdXQvSW5wdXRBcmd1bWVudC5waHAXBgAAJigEahcGAADOoMD6pAEAAAAAAAA0AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9JbnB1dC9JbnB1dEF3YXJlSW50ZXJmYWNlLnBocJgAAAAmKARqmAAAAK0PT7CkAQAAAAAAADAAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0lucHV0L0lucHV0RGVmaW5pdGlvbi5waHAjGgAAJigEaiMaAAAJjCEzpAEAAAAAAAAvAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9JbnB1dC9JbnB1dEludGVyZmFjZS5waHD8AwAAJigEavwDAABHtvSopAEAAAAAAAAsAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9JbnB1dC9JbnB1dE9wdGlvbi5waHAdDgAAJigEah0OAABJqp4vpAEAAAAAAAA5AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9JbnB1dC9TdHJlYW1hYmxlSW5wdXRJbnRlcmZhY2UucGhwzgAAACYoBGrOAAAA1tVCm6QBAAAAAAAALAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSW5wdXQvU3RyaW5nSW5wdXQucGhwPwYAACYoBGo/BgAAsZIUy6QBAAAAAAAAHgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvTElDRU5TRS4EAAAmKARqLgQAAPe6AmukAQAAAAAAAC8AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0xvZ2dlci9Db25zb2xlTG9nZ2VyLnBocAQLAAAmKARqBAsAAMcMDlGkAQAAAAAAADAAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL091dHB1dC9CdWZmZXJlZE91dHB1dC5waHBsAQAAJigEamwBAAB5OrgQpAEAAAAAAAAvAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9PdXRwdXQvQ29uc29sZU91dHB1dC5waHCRCQAAJigEapEJAABc3e9ipAEAAAAAAAA4AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9PdXRwdXQvQ29uc29sZU91dHB1dEludGVyZmFjZS5waHASAQAAJigEahIBAACJ6ve0pAEAAAAAAAA2AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9PdXRwdXQvQ29uc29sZVNlY3Rpb25PdXRwdXQucGhwlAkAACYoBGqUCQAAwGdvQKQBAAAAAAAALAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvT3V0cHV0L051bGxPdXRwdXQucGhwQgQAACYoBGpCBAAAJSNSxqQBAAAAAAAAKAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvT3V0cHV0L091dHB1dC5waHDICQAAJigEasgJAACfyzh4pAEAAAAAAAAxAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9PdXRwdXQvT3V0cHV0SW50ZXJmYWNlLnBocO0DAAAmKARq7QMAAPCOvgWkAQAAAAAAAC4AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL091dHB1dC9TdHJlYW1PdXRwdXQucGhwogYAACYoBGqiBgAALL4i/KQBAAAAAAAANQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvT3V0cHV0L1RyaW1tZWRCdWZmZXJPdXRwdXQucGhw2wMAACYoBGrbAwAAbGuDfqQBAAAAAAAAMgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvUXVlc3Rpb24vQ2hvaWNlUXVlc3Rpb24ucGhw3QoAACYoBGrdCgAACWPkpqQBAAAAAAAAOAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvUXVlc3Rpb24vQ29uZmlybWF0aW9uUXVlc3Rpb24ucGhwAgMAACYoBGoCAwAA7nnFhKQBAAAAAAAALAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvUXVlc3Rpb24vUXVlc3Rpb24ucGhwIg0AACYoBGoiDQAAyt6526QBAAAAAAAANAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvUmVzb3VyY2VzL2Jpbi9oaWRkZW5pbnB1dC5leGUAJAAAJigEagAkAACVjaV2pAEAAAAAAAAwAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9SZXNvdXJjZXMvY29tcGxldGlvbi5iYXNozwoAACYoBGrPCgAAmxgncqQBAAAAAAAAOAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvU2lnbmFsUmVnaXN0cnkvU2lnbmFsUmVnaXN0cnkucGhwIQQAACYoBGohBAAAfi46r6QBAAAAAAAAMwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvU2luZ2xlQ29tbWFuZEFwcGxpY2F0aW9uLnBocDcEAAAmKARqNwQAAM0xvh+kAQAAAAAAACwAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL1N0eWxlL091dHB1dFN0eWxlLnBocHQHAAAmKARqdAcAAE8WO8akAQAAAAAAAC8AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL1N0eWxlL1N0eWxlSW50ZXJmYWNlLnBocBAEAAAmKARqEAQAAFwbng6kAQAAAAAAAC0AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL1N0eWxlL1N5bWZvbnlTdHlsZS5waHA1JwAAJigEajUnAAB5bPf0pAEAAAAAAAAjAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9UZXJtaW5hbC5waHBtCwAAJigEam0LAACHpVB2pAEAAAAAAAAzAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9UZXN0ZXIvQXBwbGljYXRpb25UZXN0ZXIucGhwjAQAACYoBGqMBAAAHh9J+6QBAAAAAAAAOQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvVGVzdGVyL0NvbW1hbmRDb21wbGV0aW9uVGVzdGVyLnBocNoDAAAmKARq2gMAAMqbO7CkAQAAAAAAAC8AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL1Rlc3Rlci9Db21tYW5kVGVzdGVyLnBocNkDAAAmKARq2QMAAEQItgekAQAAAAAAAEAAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL1Rlc3Rlci9Db25zdHJhaW50L0NvbW1hbmRJc1N1Y2Nlc3NmdWwucGhw1gIAACYoBGrWAgAAHsaDgqQBAAAAAAAALQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvVGVzdGVyL1Rlc3RlclRyYWl0LnBocKwNAAAmKARqrA0AADInTLKkAQAAAAAAACwAAAB2ZW5kb3Ivc3ltZm9ueS9kZXByZWNhdGlvbi1jb250cmFjdHMvTElDRU5TRS4EAAAmKARqLgQAAAfk9IikAQAAAAAAADEAAAB2ZW5kb3Ivc3ltZm9ueS9kZXByZWNhdGlvbi1jb250cmFjdHMvZnVuY3Rpb24ucGhwPQEAACYoBGo9AQAAnsG0DaQBAAAAAAAAOgAAAHZlbmRvci9zeW1mb255L2ZpbGVzeXN0ZW0vRXhjZXB0aW9uL0V4Y2VwdGlvbkludGVyZmFjZS5waHB8AAAAJigEanwAAACNBelEpAEAAAAAAAA9AAAAdmVuZG9yL3N5bWZvbnkvZmlsZXN5c3RlbS9FeGNlcHRpb24vRmlsZU5vdEZvdW5kRXhjZXB0aW9uLnBocNEBAAAmKARq0QEAAGLmfbSkAQAAAAAAADMAAAB2ZW5kb3Ivc3ltZm9ueS9maWxlc3lzdGVtL0V4Y2VwdGlvbi9JT0V4Y2VwdGlvbi5waHCbAQAAJigEapsBAAAzX8PqpAEAAAAAAAA8AAAAdmVuZG9yL3N5bWZvbnkvZmlsZXN5c3RlbS9FeGNlcHRpb24vSU9FeGNlcHRpb25JbnRlcmZhY2UucGhwpgAAACYoBGqmAAAAatl3TaQBAAAAAAAAQAAAAHZlbmRvci9zeW1mb255L2ZpbGVzeXN0ZW0vRXhjZXB0aW9uL0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbi5waHCpAAAAJigEaqkAAACNIQ7HpAEAAAAAAAA4AAAAdmVuZG9yL3N5bWZvbnkvZmlsZXN5c3RlbS9FeGNlcHRpb24vUnVudGltZUV4Y2VwdGlvbi5waHCZAAAAJigEapkAAADdVVVIpAEAAAAAAAAoAAAAdmVuZG9yL3N5bWZvbnkvZmlsZXN5c3RlbS9GaWxlc3lzdGVtLnBocCRCAAAmKARqJEIAAJLAdzukAQAAAAAAACEAAAB2ZW5kb3Ivc3ltZm9ueS9maWxlc3lzdGVtL0xJQ0VOU0UuBAAAJigEai4EAAD3ugJrpAEAAAAAAAAiAAAAdmVuZG9yL3N5bWZvbnkvZmlsZXN5c3RlbS9QYXRoLnBocGInAAAmKARqYicAAAbfoxmkAQAAAAAAAC8AAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvQ29tcGFyYXRvci9Db21wYXJhdG9yLnBocDQHAAAmKARqNAcAACLsvNWkAQAAAAAAADMAAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvQ29tcGFyYXRvci9EYXRlQ29tcGFyYXRvci5waHAFAwAAJigEagUDAADPJfplpAEAAAAAAAA1AAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0NvbXBhcmF0b3IvTnVtYmVyQ29tcGFyYXRvci5waHB6AwAAJigEanoDAAArvABopAEAAAAAAAA5AAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0V4Y2VwdGlvbi9BY2Nlc3NEZW5pZWRFeGNlcHRpb24ucGhwhAAAACYoBGqEAAAAvb5znKQBAAAAAAAAPgAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9FeGNlcHRpb24vRGlyZWN0b3J5Tm90Rm91bmRFeGNlcHRpb24ucGhwiQAAACYoBGqJAAAAYSn/G6QBAAAAAAAAIAAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9GaW5kZXIucGhw1icAACYoBGrWJwAAjgU/5KQBAAAAAAAAIwAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9HaXRpZ25vcmUucGhwswcAACYoBGqzBwAAHHMJNKQBAAAAAAAAHgAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9HbG9iLnBocMcGAAAmKARqxwYAAERih7OkAQAAAAAAADcAAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvSXRlcmF0b3IvQ3VzdG9tRmlsdGVySXRlcmF0b3IucGhwYwIAACYoBGpjAgAAEzfwmaQBAAAAAAAAOgAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9JdGVyYXRvci9EYXRlUmFuZ2VGaWx0ZXJJdGVyYXRvci5waHCPAgAAJigEao8CAABQmn9zpAEAAAAAAAA7AAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0l0ZXJhdG9yL0RlcHRoUmFuZ2VGaWx0ZXJJdGVyYXRvci5waHAXAgAAJigEahcCAACnjgMSpAEAAAAAAABBAAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0l0ZXJhdG9yL0V4Y2x1ZGVEaXJlY3RvcnlGaWx0ZXJJdGVyYXRvci5waHAwBgAAJigEajAGAAADLnd2pAEAAAAAAAA5AAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0l0ZXJhdG9yL0ZpbGVUeXBlRmlsdGVySXRlcmF0b3IucGhwiAIAACYoBGqIAgAAXrYi+6QBAAAAAAAAPAAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9JdGVyYXRvci9GaWxlY29udGVudEZpbHRlckl0ZXJhdG9yLnBocFcCAAAmKARqVwIAAMLFEtmkAQAAAAAAADkAAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvSXRlcmF0b3IvRmlsZW5hbWVGaWx0ZXJJdGVyYXRvci5waHCUAQAAJigEapQBAAA9mdz0pAEAAAAAAAAvAAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0l0ZXJhdG9yL0xhenlJdGVyYXRvci5waHBRAQAAJigEalEBAABuXb+8pAEAAAAAAAA9AAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0l0ZXJhdG9yL011bHRpcGxlUGNyZUZpbHRlckl0ZXJhdG9yLnBocI0FAAAmKARqjQUAAKKA1xekAQAAAAAAADUAAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvSXRlcmF0b3IvUGF0aEZpbHRlckl0ZXJhdG9yLnBocPIBAAAmKARq8gEAAGcUIl+kAQAAAAAAAD0AAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvSXRlcmF0b3IvUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IucGhwSwkAACYoBGpLCQAA6YZGDaQBAAAAAAAAOgAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9JdGVyYXRvci9TaXplUmFuZ2VGaWx0ZXJJdGVyYXRvci5waHB8AgAAJigEanwCAAAGM9mfpAEAAAAAAAAzAAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0l0ZXJhdG9yL1NvcnRhYmxlSXRlcmF0b3IucGhwKAoAACYoBGooCgAA0+KuD6QBAAAAAAAAOwAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9JdGVyYXRvci9WY3NJZ25vcmVkRmlsdGVySXRlcmF0b3IucGhwdwoAACYoBGp3CgAAxbUdM6QBAAAAAAAAHQAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9MSUNFTlNFLgQAACYoBGouBAAA97oCa6QBAAAAAAAAJQAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9TcGxGaWxlSW5mby5waHC9AwAAJigEar0DAAAHeQUbpAEAAAAAAAAnAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtY3R5cGUvQ3R5cGUucGhwsQoAACYoBGqxCgAAHuDcwaQBAAAAAAAAJQAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLWN0eXBlL0xJQ0VOU0UuBAAAJigEai4EAACmuKlYpAEAAAAAAAArAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtY3R5cGUvYm9vdHN0cmFwLnBocDIFAAAmKARqMgUAAMhhrTikAQAAAAAAAC0AAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1jdHlwZS9ib290c3RyYXA4MC5waHBoBQAAJigEamgFAABLv3m4pAEAAAAAAAAyAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ncmFwaGVtZS9HcmFwaGVtZS5waHAUIAAAJigEahQgAABZY+VQpAEAAAAAAAAtAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ncmFwaGVtZS9MSUNFTlNFLgQAACYoBGouBAAAyxwfa6QBAAAAAAAAMwAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLWludGwtZ3JhcGhlbWUvYm9vdHN0cmFwLnBocJMJAAAmKARqkwkAAGArvYSkAQAAAAAAADUAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLWdyYXBoZW1lL2Jvb3RzdHJhcDgwLnBocI8LAAAmKARqjwsAAH5uH8+kAQAAAAAAAC8AAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXIvTElDRU5TRS4EAAAmKARqLgQAAMscH2ukAQAAAAAAADYAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXIvTm9ybWFsaXplci5waHD2FgAAJigEavYWAADqad1lpAEAAAAAAABGAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ub3JtYWxpemVyL1Jlc291cmNlcy9zdHVicy9Ob3JtYWxpemVyLnBocC4BAAAmKARqLgEAAFFzJJekAQAAAAAAAFIAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXIvUmVzb3VyY2VzL3VuaWRhdGEvY2Fub25pY2FsQ29tcG9zaXRpb24ucGhwiT0AACYoBGqJPQAAKu9vP6QBAAAAAAAAVAAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplci9SZXNvdXJjZXMvdW5pZGF0YS9jYW5vbmljYWxEZWNvbXBvc2l0aW9uLnBocGGIAAAmKARqYYgAAOdSvX2kAQAAAAAAAEwAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXIvUmVzb3VyY2VzL3VuaWRhdGEvY29tYmluaW5nQ2xhc3MucGhwdC4AACYoBGp0LgAAC3GQ3KQBAAAAAAAAWAAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplci9SZXNvdXJjZXMvdW5pZGF0YS9jb21wYXRpYmlsaXR5RGVjb21wb3NpdGlvbi5waHCZ6AAAJigEapnoAABvlGUppAEAAAAAAAA1AAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ub3JtYWxpemVyL2Jvb3RzdHJhcC5waHDrAQAAJigEausBAABQ+qNEpAEAAAAAAAA3AAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ub3JtYWxpemVyL2Jvb3RzdHJhcDgwLnBocOkBAAAmKARq6QEAAD3lcrSkAQAAAAAAACgAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZy9MSUNFTlNFLgQAACYoBGouBAAAyxwfa6QBAAAAAAAALQAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLW1ic3RyaW5nL01ic3RyaW5nLnBocHphAAAmKARqemEAABHGLrKkAQAAAAAAAEIAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZy9SZXNvdXJjZXMvdW5pZGF0YS9jYXNlRm9sZGluZy5waHCVBwAAJigEapUHAAD0trPjpAEAAAAAAABAAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtbWJzdHJpbmcvUmVzb3VyY2VzL3VuaWRhdGEvbG93ZXJDYXNlLnBocPlUAAAmKARq+VQAAAOVsSukAQAAAAAAAEYAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZy9SZXNvdXJjZXMvdW5pZGF0YS90aXRsZUNhc2VSZWdleHAucGhw4xcAACYoBGrjFwAA9nlflaQBAAAAAAAAQAAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLW1ic3RyaW5nL1Jlc291cmNlcy91bmlkYXRhL3VwcGVyQ2FzZS5waHA4WwAAJigEajhbAAArUtgqpAEAAAAAAAAuAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtbWJzdHJpbmcvYm9vdHN0cmFwLnBocDwfAAAmKARqPB8AAASgau2kAQAAAAAAADAAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZy9ib290c3RyYXA4MC5waHCAJQAAJigEaoAlAAAVbwIgpAEAAAAAAAAlAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwNzMvTElDRU5TRS4EAAAmKARqLgQAAKa4qVikAQAAAAAAACcAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1waHA3My9QaHA3My5waHBuAQAAJigEam4BAABDc6VspAEAAAAAAAA/AAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwNzMvUmVzb3VyY2VzL3N0dWJzL0pzb25FeGNlcHRpb24ucGhwWwAAACYoBGpbAAAATRiy3KQBAAAAAAAAKwAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDczL2Jvb3RzdHJhcC5waHD5AgAAJigEavkCAABBWTjGpAEAAAAAAAAlAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvTElDRU5TRS4EAAAmKARqLgQAAAfk9IikAQAAAAAAACcAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1waHA4MC9QaHA4MC5waHCiCQAAJigEaqIJAABcQ+/ApAEAAAAAAAAqAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvUGhwVG9rZW4ucGhwFgUAACYoBGoWBQAAeILAy6QBAAAAAAAAOwAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDgwL1Jlc291cmNlcy9zdHVicy9BdHRyaWJ1dGUucGhwxwEAACYoBGrHAQAA3d7t+6QBAAAAAAAAOgAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDgwL1Jlc291cmNlcy9zdHVicy9QaHBUb2tlbi5waHCNAAAAJigEao0AAADalAXdpAEAAAAAAAA8AAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvUmVzb3VyY2VzL3N0dWJzL1N0cmluZ2FibGUucGhwawAAACYoBGprAAAAHtD9K6QBAAAAAAAARQAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDgwL1Jlc291cmNlcy9zdHVicy9VbmhhbmRsZWRNYXRjaEVycm9yLnBocF0AAAAmKARqXQAAALpnwxakAQAAAAAAADwAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1waHA4MC9SZXNvdXJjZXMvc3R1YnMvVmFsdWVFcnJvci5waHBUAAAAJigEalQAAACR1neXpAEAAAAAAAArAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvYm9vdHN0cmFwLnBocPoEAAAmKARq+gQAANfu5QKkAQAAAAAAACUAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1waHA4MS9MSUNFTlNFLgQAACYoBGouBAAAO2Opp6QBAAAAAAAAJwAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDgxL1BocDgxLnBocDsBAAAmKARqOwEAABb5q2SkAQAAAAAAAEAAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1waHA4MS9SZXNvdXJjZXMvc3R1YnMvQ1VSTFN0cmluZ0ZpbGUucGhwggMAACYoBGqCAwAA4cE/7KQBAAAAAAAARgAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDgxL1Jlc291cmNlcy9zdHVicy9SZXR1cm5UeXBlV2lsbENoYW5nZS5waHCfAAAAJigEap8AAADOwL78pAEAAAAAAAArAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODEvYm9vdHN0cmFwLnBocPQBAAAmKARq9AEAAIjT0FykAQAAAAAAACUAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1waHA4NC9MSUNFTlNFLgQAACYoBGouBAAA9/iCNaQBAAAAAAAAJwAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDg0L1BocDg0LnBocEsvAAAmKARqSy8AAJqDrHOkAQAAAAAAADYAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1waHA4NC9SZXNvdXJjZXMvRGVwcmVjYXRlZC5waHB4AQAAJigEangBAABfi1KzpAEAAAAAAAA4AAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODQvUmVzb3VyY2VzL1JvdW5kaW5nTW9kZS5waHDkAAAAJigEauQAAADnHdSppAEAAAAAAAA8AAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODQvUmVzb3VyY2VzL3N0dWJzL0RlcHJlY2F0ZWQucGhwvgEAACYoBGq+AQAAXvPmzqQBAAAAAAAAOwAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDg0L1Jlc291cmNlcy9zdHVicy9QZG8vRGJsaWIucGhwMwYAACYoBGozBgAAFqKpIKQBAAAAAAAAPgAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDg0L1Jlc291cmNlcy9zdHVicy9QZG8vRmlyZWJpcmQucGhwqAQAACYoBGqoBAAA+FCQuKQBAAAAAAAAOwAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDg0L1Jlc291cmNlcy9zdHVicy9QZG8vTXlzcWwucGhwShEAACYoBGpKEQAAdDdbW6QBAAAAAAAAOgAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDg0L1Jlc291cmNlcy9zdHVicy9QZG8vT2RiYy5waHAKBQAAJigEagoFAADT6V+QpAEAAAAAAAA7AAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODQvUmVzb3VyY2VzL3N0dWJzL1Bkby9QZ3NxbC5waHCdCQAAJigEap0JAABl6IInpAEAAAAAAAA8AAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODQvUmVzb3VyY2VzL3N0dWJzL1Bkby9TcWxpdGUucGhwaggAACYoBGpqCAAAltOxjKQBAAAAAAAARAAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDg0L1Jlc291cmNlcy9zdHVicy9SZWZsZWN0aW9uQ29uc3RhbnQucGhwdwoAACYoBGp3CgAAUrbx3aQBAAAAAAAAPgAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDg0L1Jlc291cmNlcy9zdHVicy9Sb3VuZGluZ01vZGUucGhwZgIAACYoBGpmAgAAiUGo6KQBAAAAAAAAKwAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDg0L2Jvb3RzdHJhcC5waHCdCwAAJigEap0LAAAYDYuapAEAAAAAAAAtAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODQvYm9vdHN0cmFwODAucGhwXQcAACYoBGpdBwAAJrRsz6QBAAAAAAAALQAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDg0L2Jvb3RzdHJhcDgyLnBocC0BAAAmKARqLQEAACw0n0ekAQAAAAAAADcAAAB2ZW5kb3Ivc3ltZm9ueS9wcm9jZXNzL0V4Y2VwdGlvbi9FeGNlcHRpb25JbnRlcmZhY2UucGhweQAAACYoBGp5AAAAcVZYSqQBAAAAAAAAPQAAAHZlbmRvci9zeW1mb255L3Byb2Nlc3MvRXhjZXB0aW9uL0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbi5waHCoAAAAJigEaqgAAADQwCtfpAEAAAAAAAAzAAAAdmVuZG9yL3N5bWZvbnkvcHJvY2Vzcy9FeGNlcHRpb24vTG9naWNFeGNlcHRpb24ucGhwlAAAACYoBGqUAAAAILPj8aQBAAAAAAAAOwAAAHZlbmRvci9zeW1mb255L3Byb2Nlc3MvRXhjZXB0aW9uL1Byb2Nlc3NGYWlsZWRFeGNlcHRpb24ucGhweAMAACYoBGp4AwAAqMx6eaQBAAAAAAAAPQAAAHZlbmRvci9zeW1mb255L3Byb2Nlc3MvRXhjZXB0aW9uL1Byb2Nlc3NTaWduYWxlZEV4Y2VwdGlvbi5waHARAgAAJigEahECAABZ16nipAEAAAAAAAA9AAAAdmVuZG9yL3N5bWZvbnkvcHJvY2Vzcy9FeGNlcHRpb24vUHJvY2Vzc1RpbWVkT3V0RXhjZXB0aW9uLnBocDEEAAAmKARqMQQAAIInWhWkAQAAAAAAADUAAAB2ZW5kb3Ivc3ltZm9ueS9wcm9jZXNzL0V4Y2VwdGlvbi9SdW50aW1lRXhjZXB0aW9uLnBocJgAAAAmKARqmAAAAKIb2DqkAQAAAAAAACsAAAB2ZW5kb3Ivc3ltZm9ueS9wcm9jZXNzL0V4ZWN1dGFibGVGaW5kZXIucGhw+AcAACYoBGr4BwAAAb9bqqQBAAAAAAAAJgAAAHZlbmRvci9zeW1mb255L3Byb2Nlc3MvSW5wdXRTdHJlYW0ucGhwMAQAACYoBGowBAAAjIQ+h6QBAAAAAAAAHgAAAHZlbmRvci9zeW1mb255L3Byb2Nlc3MvTElDRU5TRS4EAAAmKARqLgQAAPe6AmukAQAAAAAAAC4AAAB2ZW5kb3Ivc3ltZm9ueS9wcm9jZXNzL1BocEV4ZWN1dGFibGVGaW5kZXIucGhw/wQAACYoBGr/BAAA6q7FjKQBAAAAAAAAJQAAAHZlbmRvci9zeW1mb255L3Byb2Nlc3MvUGhwUHJvY2Vzcy5waHD4BAAAJigEavgEAABwxFgZpAEAAAAAAAAuAAAAdmVuZG9yL3N5bWZvbnkvcHJvY2Vzcy9QaXBlcy9BYnN0cmFjdFBpcGVzLnBocB4LAAAmKARqHgsAAAJrU1GkAQAAAAAAAC8AAAB2ZW5kb3Ivc3ltZm9ueS9wcm9jZXNzL1BpcGVzL1BpcGVzSW50ZXJmYWNlLnBocJkBAAAmKARqmQEAAGZR2gykAQAAAAAAACoAAAB2ZW5kb3Ivc3ltZm9ueS9wcm9jZXNzL1BpcGVzL1VuaXhQaXBlcy5waHCACAAAJigEaoAIAAC+lFZ2pAEAAAAAAAAtAAAAdmVuZG9yL3N5bWZvbnkvcHJvY2Vzcy9QaXBlcy9XaW5kb3dzUGlwZXMucGhwNA0AACYoBGo0DQAAC1bE4KQBAAAAAAAAIgAAAHZlbmRvci9zeW1mb255L3Byb2Nlc3MvUHJvY2Vzcy5waHBMaAAAJigEakxoAABzscZdpAEAAAAAAAAnAAAAdmVuZG9yL3N5bWZvbnkvcHJvY2Vzcy9Qcm9jZXNzVXRpbHMucGhwFAMAACYoBGoUAwAA0w9Y7KQBAAAAAAAANwAAAHZlbmRvci9zeW1mb255L3NlcnZpY2UtY29udHJhY3RzL0F0dHJpYnV0ZS9SZXF1aXJlZC5waHCoAAAAJigEaqgAAAB4auuEpAEAAAAAAABAAAAAdmVuZG9yL3N5bWZvbnkvc2VydmljZS1jb250cmFjdHMvQXR0cmlidXRlL1N1YnNjcmliZWRTZXJ2aWNlLnBocAoBAAAmKARqCgEAADFJrlSkAQAAAAAAACgAAAB2ZW5kb3Ivc3ltZm9ueS9zZXJ2aWNlLWNvbnRyYWN0cy9MSUNFTlNFLgQAACYoBGouBAAApripWKQBAAAAAAAAMwAAAHZlbmRvci9zeW1mb255L3NlcnZpY2UtY29udHJhY3RzL1Jlc2V0SW50ZXJmYWNlLnBocHkAAAAmKARqeQAAALC3auWkAQAAAAAAADgAAAB2ZW5kb3Ivc3ltZm9ueS9zZXJ2aWNlLWNvbnRyYWN0cy9TZXJ2aWNlTG9jYXRvclRyYWl0LnBocOMJAAAmKARq4wkAACKPNemkAQAAAAAAAD0AAAB2ZW5kb3Ivc3ltZm9ueS9zZXJ2aWNlLWNvbnRyYWN0cy9TZXJ2aWNlUHJvdmlkZXJJbnRlcmZhY2UucGhw3gAAACYoBGreAAAA+lLoa6QBAAAAAAAAPwAAAHZlbmRvci9zeW1mb255L3NlcnZpY2UtY29udHJhY3RzL1NlcnZpY2VTdWJzY3JpYmVySW50ZXJmYWNlLnBocLMAAAAmKARqswAAAJf2ZAykAQAAAAAAADsAAAB2ZW5kb3Ivc3ltZm9ueS9zZXJ2aWNlLWNvbnRyYWN0cy9TZXJ2aWNlU3Vic2NyaWJlclRyYWl0LnBocGAKAAAmKARqYAoAAMgzCHWkAQAAAAAAADwAAAB2ZW5kb3Ivc3ltZm9ueS9zZXJ2aWNlLWNvbnRyYWN0cy9UZXN0L1NlcnZpY2VMb2NhdG9yVGVzdC5waHCyAAAAJigEarIAAABt+arUpAEAAAAAAABAAAAAdmVuZG9yL3N5bWZvbnkvc2VydmljZS1jb250cmFjdHMvVGVzdC9TZXJ2aWNlTG9jYXRvclRlc3RDYXNlLnBocJwIAAAmKARqnAgAAMWajL2kAQAAAAAAACgAAAB2ZW5kb3Ivc3ltZm9ueS9zdHJpbmcvQWJzdHJhY3RTdHJpbmcucGhwKjQAACYoBGoqNAAAsEoN+6QBAAAAAAAALwAAAHZlbmRvci9zeW1mb255L3N0cmluZy9BYnN0cmFjdFVuaWNvZGVTdHJpbmcucGhwuFIAACYoBGq4UgAAAiO3B6QBAAAAAAAAJAAAAHZlbmRvci9zeW1mb255L3N0cmluZy9CeXRlU3RyaW5nLnBocP8rAAAmKARq/ysAAEur016kAQAAAAAAACkAAAB2ZW5kb3Ivc3ltZm9ueS9zdHJpbmcvQ29kZVBvaW50U3RyaW5nLnBocPUXAAAmKARq9RcAAELCjwOkAQAAAAAAADYAAAB2ZW5kb3Ivc3ltZm9ueS9zdHJpbmcvRXhjZXB0aW9uL0V4Y2VwdGlvbkludGVyZmFjZS5waHBzAAAAJigEanMAAABxSFaRpAEAAAAAAAA8AAAAdmVuZG9yL3N5bWZvbnkvc3RyaW5nL0V4Y2VwdGlvbi9JbnZhbGlkQXJndW1lbnRFeGNlcHRpb24ucGhwogAAACYoBGqiAAAAHwWlQaQBAAAAAAAANAAAAHZlbmRvci9zeW1mb255L3N0cmluZy9FeGNlcHRpb24vUnVudGltZUV4Y2VwdGlvbi5waHCSAAAAJigEapIAAAB1kRJnpAEAAAAAAAA0AAAAdmVuZG9yL3N5bWZvbnkvc3RyaW5nL0luZmxlY3Rvci9FbmdsaXNoSW5mbGVjdG9yLnBocEoaAAAmKARqShoAAAiz2DOkAQAAAAAAADMAAAB2ZW5kb3Ivc3ltZm9ueS9zdHJpbmcvSW5mbGVjdG9yL0ZyZW5jaEluZmxlY3Rvci5waHCICgAAJigEaogKAAC3ihJIpAEAAAAAAAA2AAAAdmVuZG9yL3N5bWZvbnkvc3RyaW5nL0luZmxlY3Rvci9JbmZsZWN0b3JJbnRlcmZhY2UucGhw1wAAACYoBGrXAAAAaESjF6QBAAAAAAAAHQAAAHZlbmRvci9zeW1mb255L3N0cmluZy9MSUNFTlNFLgQAACYoBGouBAAAmj/0d6QBAAAAAAAAJAAAAHZlbmRvci9zeW1mb255L3N0cmluZy9MYXp5U3RyaW5nLnBocEMMAAAmKARqQwwAAKfhrGKkAQAAAAAAADwAAAB2ZW5kb3Ivc3ltZm9ueS9zdHJpbmcvUmVzb3VyY2VzL2RhdGEvd2Nzd2lkdGhfdGFibGVfd2lkZS5waHAkFgAAJigEaiQWAAClwJZLpAEAAAAAAAA8AAAAdmVuZG9yL3N5bWZvbnkvc3RyaW5nL1Jlc291cmNlcy9kYXRhL3djc3dpZHRoX3RhYmxlX3plcm8ucGhw1BkAACYoBGrUGQAA0gP+JKQBAAAAAAAALQAAAHZlbmRvci9zeW1mb255L3N0cmluZy9SZXNvdXJjZXMvZnVuY3Rpb25zLnBocAYCAAAmKARqBgIAAGPaqiKkAQAAAAAAAC4AAAB2ZW5kb3Ivc3ltZm9ueS9zdHJpbmcvU2x1Z2dlci9Bc2NpaVNsdWdnZXIucGhw7A8AACYoBGrsDwAAfSYOyqQBAAAAAAAAMgAAAHZlbmRvci9zeW1mb255L3N0cmluZy9TbHVnZ2VyL1NsdWdnZXJJbnRlcmZhY2UucGhwBwEAACYoBGoHAQAAj2vxqKQBAAAAAAAAJwAAAHZlbmRvci9zeW1mb255L3N0cmluZy9Vbmljb2RlU3RyaW5nLnBocO0lAAAmKARq7SUAAP3BmDWkAQAAAAAAAAwAAABiaW4vY29tcG9zZXJSEAAAJigEalIQAACsnfgjpAEAAAAAAAAHAAAATElDRU5TRS4EAAAmKARqLgQAACDVCAOkAQAAAAAAADw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxBZHZpc29yeTsKCnVzZSBDb21wb3NlclxDb25maWc7CgoKCgoKY2xhc3MgQXVkaXRDb25maWcKewoKCgpwdWJsaWMgJGF1ZGl0OwoKCgoKcHVibGljICRhdWRpdEZvcm1hdDsKCgoKCnB1YmxpYyAkYXVkaXRBYmFuZG9uZWQ7CgoKCgpwdWJsaWMgJGJsb2NrSW5zZWN1cmU7CgoKCgpwdWJsaWMgJGJsb2NrQWJhbmRvbmVkOwoKCgoKcHVibGljICRpZ25vcmVVbnJlYWNoYWJsZTsKCgoKCnB1YmxpYyAkaWdub3JlTGlzdEZvckF1ZGl0OwoKCgoKcHVibGljICRpZ25vcmVMaXN0Rm9yQmxvY2tpbmc7CgoKCgpwdWJsaWMgJGlnbm9yZVNldmVyaXR5Rm9yQXVkaXQ7CgoKCgpwdWJsaWMgJGlnbm9yZVNldmVyaXR5Rm9yQmxvY2tpbmc7CgoKCgpwdWJsaWMgJGlnbm9yZUFiYW5kb25lZEZvckF1ZGl0OwoKCgoKcHVibGljICRpZ25vcmVBYmFuZG9uZWRGb3JCbG9ja2luZzsKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYm9vbCAkYXVkaXQsIHN0cmluZyAkYXVkaXRGb3JtYXQsIHN0cmluZyAkYXVkaXRBYmFuZG9uZWQsIGJvb2wgJGJsb2NrSW5zZWN1cmUsIGJvb2wgJGJsb2NrQWJhbmRvbmVkLCBib29sICRpZ25vcmVVbnJlYWNoYWJsZSwgYXJyYXkgJGlnbm9yZUxpc3RGb3JBdWRpdCwgYXJyYXkgJGlnbm9yZUxpc3RGb3JCbG9ja2luZywgYXJyYXkgJGlnbm9yZVNldmVyaXR5Rm9yQXVkaXQsIGFycmF5ICRpZ25vcmVTZXZlcml0eUZvckJsb2NraW5nLCBhcnJheSAkaWdub3JlQWJhbmRvbmVkRm9yQXVkaXQsIGFycmF5ICRpZ25vcmVBYmFuZG9uZWRGb3JCbG9ja2luZykKewokdGhpcy0+YXVkaXQgPSAkYXVkaXQ7CiR0aGlzLT5hdWRpdEZvcm1hdCA9ICRhdWRpdEZvcm1hdDsKJHRoaXMtPmF1ZGl0QWJhbmRvbmVkID0gJGF1ZGl0QWJhbmRvbmVkOwokdGhpcy0+YmxvY2tJbnNlY3VyZSA9ICRibG9ja0luc2VjdXJlOwokdGhpcy0+YmxvY2tBYmFuZG9uZWQgPSAkYmxvY2tBYmFuZG9uZWQ7CiR0aGlzLT5pZ25vcmVVbnJlYWNoYWJsZSA9ICRpZ25vcmVVbnJlYWNoYWJsZTsKJHRoaXMtPmlnbm9yZUxpc3RGb3JBdWRpdCA9ICRpZ25vcmVMaXN0Rm9yQXVkaXQ7CiR0aGlzLT5pZ25vcmVMaXN0Rm9yQmxvY2tpbmcgPSAkaWdub3JlTGlzdEZvckJsb2NraW5nOwokdGhpcy0+aWdub3JlU2V2ZXJpdHlGb3JBdWRpdCA9ICRpZ25vcmVTZXZlcml0eUZvckF1ZGl0OwokdGhpcy0+aWdub3JlU2V2ZXJpdHlGb3JCbG9ja2luZyA9ICRpZ25vcmVTZXZlcml0eUZvckJsb2NraW5nOwokdGhpcy0+aWdub3JlQWJhbmRvbmVkRm9yQXVkaXQgPSAkaWdub3JlQWJhbmRvbmVkRm9yQXVkaXQ7CiR0aGlzLT5pZ25vcmVBYmFuZG9uZWRGb3JCbG9ja2luZyA9ICRpZ25vcmVBYmFuZG9uZWRGb3JCbG9ja2luZzsKfQoKCgoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gcGFyc2VJZ25vcmVXaXRoQXBwbHkoYXJyYXkgJGNvbmZpZyk6IGFycmF5CnsKJGZvckF1ZGl0ID0gW107CiRmb3JCbG9jayA9IFtdOwoKZm9yZWFjaCAoJGNvbmZpZyBhcyAka2V5ID0+ICR2YWx1ZSkgewoKaWYgKGlzX2ludCgka2V5KSAmJiBpc19zdHJpbmcoJHZhbHVlKSkgewokaWQgPSAkdmFsdWU7CiRhcHBseSA9ICdhbGwnOwokcmVhc29uID0gbnVsbDsKfQoKZWxzZWlmIChpc19zdHJpbmcoJHZhbHVlKSkgewokaWQgPSAka2V5OwokYXBwbHkgPSAnYWxsJzsKJHJlYXNvbiA9ICR2YWx1ZTsKfQoKZWxzZWlmIChpc19hcnJheSgkdmFsdWUpKSB7CiRpZCA9ICRrZXk7CiRhcHBseSA9ICR2YWx1ZVsnYXBwbHknXSA/PyAnYWxsJzsKJHJlYXNvbiA9ICR2YWx1ZVsncmVhc29uJ10gPz8gbnVsbDsKCgppZiAoIWluX2FycmF5KCRhcHBseSwgWydhdWRpdCcsICdibG9jaycsICdhbGwnXSwgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oCiJJbnZhbGlkICdhcHBseScgdmFsdWUgZm9yICd7JGlkfSc6IHskYXBwbHl9LiBFeHBlY3RlZCAnYXVkaXQnLCAnYmxvY2snLCBvciAnYWxsJy4iCik7Cn0KfQoKZWxzZWlmICgkdmFsdWUgPT09IG51bGwpIHsKJGlkID0gJGtleTsKJGFwcGx5ID0gJ2FsbCc7CiRyZWFzb24gPSBudWxsOwp9CmVsc2Ugewpjb250aW51ZTsKfQoKCmlmICgkYXBwbHkgPT09ICdhdWRpdCcgfHwgJGFwcGx5ID09PSAnYWxsJykgewokZm9yQXVkaXRbJGlkXSA9ICRyZWFzb247Cn0KaWYgKCRhcHBseSA9PT0gJ2Jsb2NrJyB8fCAkYXBwbHkgPT09ICdhbGwnKSB7CiRmb3JCbG9ja1skaWRdID0gJHJlYXNvbjsKfQp9CgpyZXR1cm4gWwonYXVkaXQnID0+ICRmb3JBdWRpdCwKJ2Jsb2NrJyA9PiAkZm9yQmxvY2ssCl07Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnJvbUNvbmZpZyhDb25maWcgJGNvbmZpZywgYm9vbCAkYXVkaXQgPSB0cnVlLCBzdHJpbmcgJGF1ZGl0Rm9ybWF0ID0gQXVkaXRvcjo6Rk9STUFUX1NVTU1BUlkpOiBzZWxmCnsKJGF1ZGl0Q29uZmlnID0gJGNvbmZpZy0+Z2V0KCdhdWRpdCcpOwoKCiRpZ25vcmVMaXN0UGFyc2VkID0gc2VsZjo6cGFyc2VJZ25vcmVXaXRoQXBwbHkoJGF1ZGl0Q29uZmlnWydpZ25vcmUnXSA/PyBbXSk7CiRpZ25vcmVBYmFuZG9uZWRQYXJzZWQgPSBzZWxmOjpwYXJzZUlnbm9yZVdpdGhBcHBseSgkYXVkaXRDb25maWdbJ2lnbm9yZS1hYmFuZG9uZWQnXSA/PyBbXSk7CiRpZ25vcmVTZXZlcml0eVBhcnNlZCA9IHNlbGY6OnBhcnNlSWdub3JlV2l0aEFwcGx5KCRhdWRpdENvbmZpZ1snaWdub3JlLXNldmVyaXR5J10gPz8gW10pOwoKcmV0dXJuIG5ldyBzZWxmKAokYXVkaXQsCiRhdWRpdEZvcm1hdCwKJGF1ZGl0Q29uZmlnWydhYmFuZG9uZWQnXSA/PyBBdWRpdG9yOjpBQkFORE9ORURfRkFJTCwKKGJvb2wpICgkYXVkaXRDb25maWdbJ2Jsb2NrLWluc2VjdXJlJ10gPz8gdHJ1ZSksCihib29sKSAoJGF1ZGl0Q29uZmlnWydibG9jay1hYmFuZG9uZWQnXSA/PyBmYWxzZSksCihib29sKSAoJGF1ZGl0Q29uZmlnWydpZ25vcmUtdW5yZWFjaGFibGUnXSA/PyBmYWxzZSksCiRpZ25vcmVMaXN0UGFyc2VkWydhdWRpdCddLAokaWdub3JlTGlzdFBhcnNlZFsnYmxvY2snXSwKJGlnbm9yZVNldmVyaXR5UGFyc2VkWydhdWRpdCddLAokaWdub3JlU2V2ZXJpdHlQYXJzZWRbJ2Jsb2NrJ10sCiRpZ25vcmVBYmFuZG9uZWRQYXJzZWRbJ2F1ZGl0J10sCiRpZ25vcmVBYmFuZG9uZWRQYXJzZWRbJ2Jsb2NrJ10KKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxBZHZpc29yeTsKCnVzZSBDb21wb3NlclxJT1xDb25zb2xlSU87CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlTZXQ7CnVzZSBDb21wb3NlclxVdGlsXFBhY2thZ2VJbmZvOwp1c2UgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyOwoKCgoKY2xhc3MgQXVkaXRvcgp7CnB1YmxpYyBjb25zdCBGT1JNQVRfVEFCTEUgPSAndGFibGUnOwoKcHVibGljIGNvbnN0IEZPUk1BVF9QTEFJTiA9ICdwbGFpbic7CgpwdWJsaWMgY29uc3QgRk9STUFUX0pTT04gPSAnanNvbic7CgpwdWJsaWMgY29uc3QgRk9STUFUX1NVTU1BUlkgPSAnc3VtbWFyeSc7CgpwdWJsaWMgY29uc3QgRk9STUFUUyA9IFsKc2VsZjo6Rk9STUFUX1RBQkxFLApzZWxmOjpGT1JNQVRfUExBSU4sCnNlbGY6OkZPUk1BVF9KU09OLApzZWxmOjpGT1JNQVRfU1VNTUFSWSwKXTsKCnB1YmxpYyBjb25zdCBBQkFORE9ORURfSUdOT1JFID0gJ2lnbm9yZSc7CnB1YmxpYyBjb25zdCBBQkFORE9ORURfUkVQT1JUID0gJ3JlcG9ydCc7CnB1YmxpYyBjb25zdCBBQkFORE9ORURfRkFJTCA9ICdmYWlsJzsKCgpwdWJsaWMgY29uc3QgQUJBTkRPTkVEUyA9IFsKc2VsZjo6QUJBTkRPTkVEX0lHTk9SRSwKc2VsZjo6QUJBTkRPTkVEX1JFUE9SVCwKc2VsZjo6QUJBTkRPTkVEX0ZBSUwsCl07CgoKcHVibGljIGNvbnN0IFNUQVRVU19PSyA9IDA7CnB1YmxpYyBjb25zdCBTVEFUVVNfVlVMTkVSQUJMRSA9IDE7CnB1YmxpYyBjb25zdCBTVEFUVVNfQUJBTkRPTkVEID0gMjsKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhdWRpdChJT0ludGVyZmFjZSAkaW8sIFJlcG9zaXRvcnlTZXQgJHJlcG9TZXQsIGFycmF5ICRwYWNrYWdlcywgc3RyaW5nICRmb3JtYXQsIGJvb2wgJHdhcm5pbmdPbmx5ID0gdHJ1ZSwgYXJyYXkgJGlnbm9yZUxpc3QgPSBbXSwgc3RyaW5nICRhYmFuZG9uZWQgPSBzZWxmOjpBQkFORE9ORURfRkFJTCwgYXJyYXkgJGlnbm9yZWRTZXZlcml0aWVzID0gW10sIGJvb2wgJGlnbm9yZVVucmVhY2hhYmxlID0gZmFsc2UsIGFycmF5ICRpZ25vcmVBYmFuZG9uZWQgPSBbXSk6IGludAp7CiRyZXN1bHQgPSAkcmVwb1NldC0+Z2V0TWF0Y2hpbmdTZWN1cml0eUFkdmlzb3JpZXMoJHBhY2thZ2VzLCAkZm9ybWF0ID09PSBzZWxmOjpGT1JNQVRfU1VNTUFSWSwgJGlnbm9yZVVucmVhY2hhYmxlKTsKJGFsbEFkdmlzb3JpZXMgPSAkcmVzdWx0WydhZHZpc29yaWVzJ107CiR1bnJlYWNoYWJsZVJlcG9zID0gJHJlc3VsdFsndW5yZWFjaGFibGVSZXBvcyddOwoKCgppZiAoJGZvcm1hdCA9PT0gc2VsZjo6Rk9STUFUX1NVTU1BUlkgJiYgJHRoaXMtPm5lZWRzQ29tcGxldGVBZHZpc29yeUxvYWQoJGFsbEFkdmlzb3JpZXMsICRpZ25vcmVMaXN0KSkgewokcmVzdWx0ID0gJHJlcG9TZXQtPmdldE1hdGNoaW5nU2VjdXJpdHlBZHZpc29yaWVzKCRwYWNrYWdlcywgZmFsc2UsICRpZ25vcmVVbnJlYWNoYWJsZSk7CiRhbGxBZHZpc29yaWVzID0gJHJlc3VsdFsnYWR2aXNvcmllcyddOwokdW5yZWFjaGFibGVSZXBvcyA9IGFycmF5X21lcmdlKCR1bnJlYWNoYWJsZVJlcG9zLCAkcmVzdWx0Wyd1bnJlYWNoYWJsZVJlcG9zJ10pOwp9ClsnYWR2aXNvcmllcycgPT4gJGFkdmlzb3JpZXMsICdpZ25vcmVkQWR2aXNvcmllcycgPT4gJGlnbm9yZWRBZHZpc29yaWVzXSA9ICR0aGlzLT5wcm9jZXNzQWR2aXNvcmllcygkYWxsQWR2aXNvcmllcywgJGlnbm9yZUxpc3QsICRpZ25vcmVkU2V2ZXJpdGllcyk7CgokYWJhbmRvbmVkQ291bnQgPSAwOwokYWZmZWN0ZWRQYWNrYWdlc0NvdW50ID0gY291bnQoJGFkdmlzb3JpZXMpOwppZiAoJGFiYW5kb25lZCA9PT0gc2VsZjo6QUJBTkRPTkVEX0lHTk9SRSkgewokYWJhbmRvbmVkUGFja2FnZXMgPSBbXTsKfSBlbHNlIHsKJGFiYW5kb25lZFBhY2thZ2VzID0gJHRoaXMtPmZpbHRlckFiYW5kb25lZFBhY2thZ2VzKCRwYWNrYWdlcywgJGlnbm9yZUFiYW5kb25lZCk7CmlmICgkYWJhbmRvbmVkID09PSBzZWxmOjpBQkFORE9ORURfRkFJTCkgewokYWJhbmRvbmVkQ291bnQgPSBjb3VudCgkYWJhbmRvbmVkUGFja2FnZXMpOwp9Cn0KCiRhdWRpdEJpdG1hc2sgPSAkdGhpcy0+Y2FsY3VsYXRlQml0bWFzaygwIDwgJGFmZmVjdGVkUGFja2FnZXNDb3VudCwgMCA8ICRhYmFuZG9uZWRDb3VudCk7CgppZiAoc2VsZjo6Rk9STUFUX0pTT04gPT09ICRmb3JtYXQpIHsKJGpzb24gPSBbJ2Fkdmlzb3JpZXMnID0+ICRhZHZpc29yaWVzXTsKaWYgKCRpZ25vcmVkQWR2aXNvcmllcyAhPT0gW10pIHsKJGpzb25bJ2lnbm9yZWQtYWR2aXNvcmllcyddID0gJGlnbm9yZWRBZHZpc29yaWVzOwp9CmlmICgkdW5yZWFjaGFibGVSZXBvcyAhPT0gW10pIHsKJGpzb25bJ3VucmVhY2hhYmxlLXJlcG9zaXRvcmllcyddID0gJHVucmVhY2hhYmxlUmVwb3M7Cn0KJGpzb25bJ2FiYW5kb25lZCddID0gYXJyYXlfcmVkdWNlKCRhYmFuZG9uZWRQYWNrYWdlcywgc3RhdGljIGZ1bmN0aW9uIChhcnJheSAkY2FycnksIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IGFycmF5IHsKJGNhcnJ5WyRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCldID0gJHBhY2thZ2UtPmdldFJlcGxhY2VtZW50UGFja2FnZSgpOwoKcmV0dXJuICRjYXJyeTsKfSwgW10pOwoKJGlvLT53cml0ZShKc29uRmlsZTo6ZW5jb2RlKCRqc29uKSk7CgpyZXR1cm4gJGF1ZGl0Qml0bWFzazsKfQoKJGVycm9yT3JXYXJuID0gJHdhcm5pbmdPbmx5ID8gJ3dhcm5pbmcnIDogJ2Vycm9yJzsKaWYgKCRhZmZlY3RlZFBhY2thZ2VzQ291bnQgPiAwIHx8IGNvdW50KCRpZ25vcmVkQWR2aXNvcmllcykgPiAwKSB7CiRwYXNzZXMgPSBbClskaWdub3JlZEFkdmlzb3JpZXMsICI8aW5mbz5Gb3VuZCAlZCBpZ25vcmVkIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdHkgYWR2aXNvciVzIGFmZmVjdGluZyAlZCBwYWNrYWdlJXMlczwvaW5mbz4iXSwKWyRhZHZpc29yaWVzLCAiPCRlcnJvck9yV2Fybj5Gb3VuZCAlZCBzZWN1cml0eSB2dWxuZXJhYmlsaXR5IGFkdmlzb3IlcyBhZmZlY3RpbmcgJWQgcGFja2FnZSVzJXM8LyRlcnJvck9yV2Fybj4iXSwKXTsKZm9yZWFjaCAoJHBhc3NlcyBhcyBbJGFkdmlzb3JpZXNUb091dHB1dCwgJG1lc3NhZ2VdKSB7ClskcGtnQ291bnQsICR0b3RhbEFkdmlzb3J5Q291bnRdID0gJHRoaXMtPmNvdW50QWR2aXNvcmllcygkYWR2aXNvcmllc1RvT3V0cHV0KTsKaWYgKCRwa2dDb3VudCA+IDApIHsKJHBsdXJhbGl0eSA9ICR0b3RhbEFkdmlzb3J5Q291bnQgPT09IDEgPyAneScgOiAnaWVzJzsKJHBrZ1BsdXJhbGl0eSA9ICRwa2dDb3VudCA9PT0gMSA/ICcnIDogJ3MnOwokcHVuY3R1YXRpb24gPSAkZm9ybWF0ID09PSAnc3VtbWFyeScgPyAnLicgOiAnOic7CiRpby0+d3JpdGVFcnJvcihzcHJpbnRmKCRtZXNzYWdlLCAkdG90YWxBZHZpc29yeUNvdW50LCAkcGx1cmFsaXR5LCAkcGtnQ291bnQsICRwa2dQbHVyYWxpdHksICRwdW5jdHVhdGlvbikpOwokdGhpcy0+b3V0cHV0QWR2aXNvcmllcygkaW8sICRhZHZpc29yaWVzVG9PdXRwdXQsICRmb3JtYXQpOwp9Cn0KCmlmICgkZm9ybWF0ID09PSBzZWxmOjpGT1JNQVRfU1VNTUFSWSkgewokaW8tPndyaXRlRXJyb3IoJ1J1biAiY29tcG9zZXIgYXVkaXQiIGZvciBhIGZ1bGwgbGlzdCBvZiBhZHZpc29yaWVzLicpOwp9Cn0gZWxzZSB7CiRpby0+d3JpdGVFcnJvcignPGluZm8+Tm8gc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSBhZHZpc29yaWVzIGZvdW5kLjwvaW5mbz4nKTsKfQoKaWYgKGNvdW50KCR1bnJlYWNoYWJsZVJlcG9zKSA+IDApIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5UaGUgZm9sbG93aW5nIHJlcG9zaXRvcmllcyB3ZXJlIHVucmVhY2hhYmxlOjwvd2FybmluZz4nKTsKZm9yZWFjaCAoJHVucmVhY2hhYmxlUmVwb3MgYXMgJHJlcG8pIHsKJGlvLT53cml0ZUVycm9yKCcgIC0gJyAuICRyZXBvKTsKfQp9CgppZiAoY291bnQoJGFiYW5kb25lZFBhY2thZ2VzKSA+IDAgJiYgJGZvcm1hdCAhPT0gc2VsZjo6Rk9STUFUX1NVTU1BUlkpIHsKJHRoaXMtPm91dHB1dEFiYW5kb25lZFBhY2thZ2VzKCRpbywgJGFiYW5kb25lZFBhY2thZ2VzLCAkZm9ybWF0KTsKfQoKcmV0dXJuICRhdWRpdEJpdG1hc2s7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIG5lZWRzQ29tcGxldGVBZHZpc29yeUxvYWQoYXJyYXkgJGFkdmlzb3JpZXMsIGFycmF5ICRpZ25vcmVMaXN0KTogYm9vbAp7CmlmIChcY291bnQoJGFkdmlzb3JpZXMpID09PSAwKSB7CnJldHVybiBmYWxzZTsKfQoKCmlmIChhcnJheV9hbGwoJGFkdmlzb3JpZXMsIHN0YXRpYyBmdW5jdGlvbiAoYXJyYXkgJHBrZ0Fkdmlzb3JpZXMpIHsKcmV0dXJuIGFycmF5X2FsbCgkcGtnQWR2aXNvcmllcywgc3RhdGljIGZ1bmN0aW9uICgkYWR2aXNvcnkpIHsgcmV0dXJuICRhZHZpc29yeSBpbnN0YW5jZW9mIFNlY3VyaXR5QWR2aXNvcnk7IH0pOwp9KSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRpZ25vcmVkSWRzID0gYXJyYXlfa2V5cygkaWdub3JlTGlzdCk7CgpyZXR1cm4gYXJyYXlfYW55KCRpZ25vcmVkSWRzLCBzdGF0aWMgZnVuY3Rpb24gKHN0cmluZyAkaWQpIHsKcmV0dXJuICFzdHJfc3RhcnRzX3dpdGgoJGlkLCAnUEtTQS0nKTsKfSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbHRlckFiYW5kb25lZFBhY2thZ2VzKGFycmF5ICRwYWNrYWdlcywgYXJyYXkgJGlnbm9yZUFiYW5kb25lZCk6IGFycmF5CnsKJGZpbHRlciA9IG51bGw7CmlmIChcY291bnQoJGlnbm9yZUFiYW5kb25lZCkgIT09IDApIHsKJGZpbHRlciA9IEJhc2VQYWNrYWdlOjpwYWNrYWdlTmFtZXNUb1JlZ2V4cChhcnJheV9rZXlzKCRpZ25vcmVBYmFuZG9uZWQpKTsKfQoKcmV0dXJuIGFycmF5X2ZpbHRlcigkcGFja2FnZXMsIHN0YXRpYyBmdW5jdGlvbiAoUGFja2FnZUludGVyZmFjZSAkcGtnKSB1c2UgKCRmaWx0ZXIpOiBib29sIHsKcmV0dXJuICRwa2cgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJiYgJHBrZy0+aXNBYmFuZG9uZWQoKSAmJiAoJGZpbHRlciA9PT0gbnVsbCB8fCAhUHJlZzo6aXNNYXRjaCgkZmlsdGVyLCAkcGtnLT5nZXROYW1lKCkpKTsKfSk7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzQWR2aXNvcmllcyhhcnJheSAkYWxsQWR2aXNvcmllcywgYXJyYXkgJGlnbm9yZUxpc3QsIGFycmF5ICRpZ25vcmVkU2V2ZXJpdGllcyk6IGFycmF5CnsKaWYgKCRpZ25vcmVMaXN0ID09PSBbXSAmJiAkaWdub3JlZFNldmVyaXRpZXMgPT09IFtdKSB7CnJldHVybiBbJ2Fkdmlzb3JpZXMnID0+ICRhbGxBZHZpc29yaWVzLCAnaWdub3JlZEFkdmlzb3JpZXMnID0+IFtdXTsKfQoKJGFkdmlzb3JpZXMgPSBbXTsKJGlnbm9yZWQgPSBbXTsKJGlnbm9yZVJlYXNvbiA9IG51bGw7Cgpmb3JlYWNoICgkYWxsQWR2aXNvcmllcyBhcyAkcGFja2FnZSA9PiAkcGtnQWR2aXNvcmllcykgewpmb3JlYWNoICgkcGtnQWR2aXNvcmllcyBhcyAkYWR2aXNvcnkpIHsKJGlzQWN0aXZlID0gdHJ1ZTsKCmlmIChhcnJheV9rZXlfZXhpc3RzKCRwYWNrYWdlLCAkaWdub3JlTGlzdCkpIHsKJGlzQWN0aXZlID0gZmFsc2U7CiRpZ25vcmVSZWFzb24gPSAkaWdub3JlTGlzdFskcGFja2FnZV0gPz8gbnVsbDsKfQoKaWYgKGFycmF5X2tleV9leGlzdHMoJGFkdmlzb3J5LT5hZHZpc29yeUlkLCAkaWdub3JlTGlzdCkpIHsKJGlzQWN0aXZlID0gZmFsc2U7CiRpZ25vcmVSZWFzb24gPSAkaWdub3JlTGlzdFskYWR2aXNvcnktPmFkdmlzb3J5SWRdID8/IG51bGw7Cn0KCmlmICgkYWR2aXNvcnkgaW5zdGFuY2VvZiBTZWN1cml0eUFkdmlzb3J5KSB7CmlmIChpc19zdHJpbmcoJGFkdmlzb3J5LT5zZXZlcml0eSkgJiYgYXJyYXlfa2V5X2V4aXN0cygkYWR2aXNvcnktPnNldmVyaXR5LCAkaWdub3JlZFNldmVyaXRpZXMpKSB7CiRpc0FjdGl2ZSA9IGZhbHNlOwokaWdub3JlUmVhc29uID0gJGlnbm9yZWRTZXZlcml0aWVzWyRhZHZpc29yeS0+c2V2ZXJpdHldID8/ICRhZHZpc29yeS0+c2V2ZXJpdHkuJyBzZXZlcml0eSBpcyBpZ25vcmVkJzsKfQoKaWYgKGlzX3N0cmluZygkYWR2aXNvcnktPmN2ZSkgJiYgYXJyYXlfa2V5X2V4aXN0cygkYWR2aXNvcnktPmN2ZSwgJGlnbm9yZUxpc3QpKSB7CiRpc0FjdGl2ZSA9IGZhbHNlOwokaWdub3JlUmVhc29uID0gJGlnbm9yZUxpc3RbJGFkdmlzb3J5LT5jdmVdID8/IG51bGw7Cn0KCmZvcmVhY2ggKCRhZHZpc29yeS0+c291cmNlcyBhcyAkc291cmNlKSB7CmlmIChhcnJheV9rZXlfZXhpc3RzKCRzb3VyY2VbJ3JlbW90ZUlkJ10sICRpZ25vcmVMaXN0KSkgewokaXNBY3RpdmUgPSBmYWxzZTsKJGlnbm9yZVJlYXNvbiA9ICRpZ25vcmVMaXN0WyRzb3VyY2VbJ3JlbW90ZUlkJ11dID8/IG51bGw7CmJyZWFrOwp9Cn0KfQoKaWYgKCRpc0FjdGl2ZSkgewokYWR2aXNvcmllc1skcGFja2FnZV1bXSA9ICRhZHZpc29yeTsKY29udGludWU7Cn0KCgoKaWYgKCRhZHZpc29yeSBpbnN0YW5jZW9mIFNlY3VyaXR5QWR2aXNvcnkpIHsKJGFkdmlzb3J5ID0gJGFkdmlzb3J5LT50b0lnbm9yZWRBZHZpc29yeSgkaWdub3JlUmVhc29uKTsKfQoKJGlnbm9yZWRbJHBhY2thZ2VdW10gPSAkYWR2aXNvcnk7Cn0KfQoKcmV0dXJuIFsnYWR2aXNvcmllcycgPT4gJGFkdmlzb3JpZXMsICdpZ25vcmVkQWR2aXNvcmllcycgPT4gJGlnbm9yZWRdOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjb3VudEFkdmlzb3JpZXMoYXJyYXkgJGFkdmlzb3JpZXMpOiBhcnJheQp7CiRjb3VudCA9IDA7CmZvcmVhY2ggKCRhZHZpc29yaWVzIGFzICRwYWNrYWdlQWR2aXNvcmllcykgewokY291bnQgKz0gY291bnQoJHBhY2thZ2VBZHZpc29yaWVzKTsKfQoKcmV0dXJuIFtjb3VudCgkYWR2aXNvcmllcyksICRjb3VudF07Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIG91dHB1dEFkdmlzb3JpZXMoSU9JbnRlcmZhY2UgJGlvLCBhcnJheSAkYWR2aXNvcmllcywgc3RyaW5nICRmb3JtYXQpOiB2b2lkCnsKc3dpdGNoICgkZm9ybWF0KSB7CmNhc2Ugc2VsZjo6Rk9STUFUX1RBQkxFOgppZiAoISgkaW8gaW5zdGFuY2VvZiBDb25zb2xlSU8pKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0Nhbm5vdCB1c2UgdGFibGUgZm9ybWF0IHdpdGggJyAuIGdldF9jbGFzcygkaW8pKTsKfQokdGhpcy0+b3V0cHV0QWR2aXNvcmllc1RhYmxlKCRpbywgJGFkdmlzb3JpZXMpOwoKcmV0dXJuOwpjYXNlIHNlbGY6OkZPUk1BVF9QTEFJTjoKJHRoaXMtPm91dHB1dEFkdmlzb3JpZXNQbGFpbigkaW8sICRhZHZpc29yaWVzKTsKCnJldHVybjsKY2FzZSBzZWxmOjpGT1JNQVRfU1VNTUFSWToKCnJldHVybjsKZGVmYXVsdDoKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBmb3JtYXQgIicuJGZvcm1hdC4nIi4nKTsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIG91dHB1dEFkdmlzb3JpZXNUYWJsZShDb25zb2xlSU8gJGlvLCBhcnJheSAkYWR2aXNvcmllcyk6IHZvaWQKewpmb3JlYWNoICgkYWR2aXNvcmllcyBhcyAkcGFja2FnZUFkdmlzb3JpZXMpIHsKZm9yZWFjaCAoJHBhY2thZ2VBZHZpc29yaWVzIGFzICRhZHZpc29yeSkgewokaGVhZGVycyA9IFsKJ1BhY2thZ2UnLAonU2V2ZXJpdHknLAonQWR2aXNvcnkgSUQnLAonQ1ZFJywKJ1RpdGxlJywKJ1VSTCcsCidBZmZlY3RlZCB2ZXJzaW9ucycsCidSZXBvcnRlZCBhdCcsCl07CiRyb3cgPSBbCiRhZHZpc29yeS0+cGFja2FnZU5hbWUsCiR0aGlzLT5nZXRTZXZlcml0eSgkYWR2aXNvcnkpLAokdGhpcy0+Z2V0QWR2aXNvcnlJZCgkYWR2aXNvcnkpLAokdGhpcy0+Z2V0Q1ZFKCRhZHZpc29yeSksCiRhZHZpc29yeS0+dGl0bGUsCiR0aGlzLT5nZXRVUkwoJGFkdmlzb3J5KSwKJGFkdmlzb3J5LT5hZmZlY3RlZFZlcnNpb25zLT5nZXRQcmV0dHlTdHJpbmcoKSwKJGFkdmlzb3J5LT5yZXBvcnRlZEF0LT5mb3JtYXQoREFURV9BVE9NKSwKXTsKaWYgKCRhZHZpc29yeSBpbnN0YW5jZW9mIElnbm9yZWRTZWN1cml0eUFkdmlzb3J5KSB7CiRoZWFkZXJzW10gPSAnSWdub3JlIHJlYXNvbic7CiRyb3dbXSA9ICRhZHZpc29yeS0+aWdub3JlUmVhc29uID8/ICdOb25lIHNwZWNpZmllZCc7Cn0KJGlvLT5nZXRUYWJsZSgpCi0+c2V0SG9yaXpvbnRhbCgpCi0+c2V0SGVhZGVycygkaGVhZGVycykKLT5hZGRSb3coQ29uc29sZUlPOjpzYW5pdGl6ZSgkcm93KSkKLT5zZXRDb2x1bW5XaWR0aCgxLCA4MCkKLT5zZXRDb2x1bW5NYXhXaWR0aCgxLCA4MCkKLT5yZW5kZXIoKTsKfQp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gb3V0cHV0QWR2aXNvcmllc1BsYWluKElPSW50ZXJmYWNlICRpbywgYXJyYXkgJGFkdmlzb3JpZXMpOiB2b2lkCnsKJGVycm9yID0gW107CiRmaXJzdEFkdmlzb3J5ID0gdHJ1ZTsKZm9yZWFjaCAoJGFkdmlzb3JpZXMgYXMgJHBhY2thZ2VBZHZpc29yaWVzKSB7CmZvcmVhY2ggKCRwYWNrYWdlQWR2aXNvcmllcyBhcyAkYWR2aXNvcnkpIHsKaWYgKCEkZmlyc3RBZHZpc29yeSkgewokZXJyb3JbXSA9ICctLS0tLS0tLSc7Cn0KJGVycm9yW10gPSAiUGFja2FnZTogIi4kYWR2aXNvcnktPnBhY2thZ2VOYW1lOwokZXJyb3JbXSA9ICJTZXZlcml0eTogIi4kdGhpcy0+Z2V0U2V2ZXJpdHkoJGFkdmlzb3J5KTsKJGVycm9yW10gPSAiQWR2aXNvcnkgSUQ6ICIuJHRoaXMtPmdldEFkdmlzb3J5SWQoJGFkdmlzb3J5KTsKJGVycm9yW10gPSAiQ1ZFOiAiLiR0aGlzLT5nZXRDVkUoJGFkdmlzb3J5KTsKJGVycm9yW10gPSAiVGl0bGU6ICIuT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJGFkdmlzb3J5LT50aXRsZSk7CiRlcnJvcltdID0gIlVSTDogIi4kdGhpcy0+Z2V0VVJMKCRhZHZpc29yeSk7CiRlcnJvcltdID0gIkFmZmVjdGVkIHZlcnNpb25zOiAiLk91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCRhZHZpc29yeS0+YWZmZWN0ZWRWZXJzaW9ucy0+Z2V0UHJldHR5U3RyaW5nKCkpOwokZXJyb3JbXSA9ICJSZXBvcnRlZCBhdDogIi4kYWR2aXNvcnktPnJlcG9ydGVkQXQtPmZvcm1hdChEQVRFX0FUT00pOwppZiAoJGFkdmlzb3J5IGluc3RhbmNlb2YgSWdub3JlZFNlY3VyaXR5QWR2aXNvcnkpIHsKJGVycm9yW10gPSAiSWdub3JlIHJlYXNvbjogIi4oJGFkdmlzb3J5LT5pZ25vcmVSZWFzb24gPz8gJ05vbmUgc3BlY2lmaWVkJyk7Cn0KJGZpcnN0QWR2aXNvcnkgPSBmYWxzZTsKfQp9CiRpby0+d3JpdGVFcnJvcigkZXJyb3IpOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBvdXRwdXRBYmFuZG9uZWRQYWNrYWdlcyhJT0ludGVyZmFjZSAkaW8sIGFycmF5ICRwYWNrYWdlcywgc3RyaW5nICRmb3JtYXQpOiB2b2lkCnsKJGlvLT53cml0ZUVycm9yKHNwcmludGYoJzxlcnJvcj5Gb3VuZCAlZCBhYmFuZG9uZWQgcGFja2FnZSVzOjwvZXJyb3I+JywgY291bnQoJHBhY2thZ2VzKSwgY291bnQoJHBhY2thZ2VzKSA+IDEgPyAncycgOiAnJykpOwoKaWYgKCRmb3JtYXQgPT09IHNlbGY6OkZPUk1BVF9QTEFJTikgewpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBrZykgewokcmVwbGFjZW1lbnQgPSAkcGtnLT5nZXRSZXBsYWNlbWVudFBhY2thZ2UoKSAhPT0gbnVsbAo/ICdVc2UgJy4kcGtnLT5nZXRSZXBsYWNlbWVudFBhY2thZ2UoKS4nIGluc3RlYWQnCjogJ05vIHJlcGxhY2VtZW50IHdhcyBzdWdnZXN0ZWQnOwokaW8tPndyaXRlRXJyb3Ioc3ByaW50ZigKJyVzIGlzIGFiYW5kb25lZC4gJXMuJywKJHRoaXMtPmdldFBhY2thZ2VOYW1lV2l0aExpbmsoJHBrZyksCiRyZXBsYWNlbWVudAopKTsKfQoKcmV0dXJuOwp9CgppZiAoISgkaW8gaW5zdGFuY2VvZiBDb25zb2xlSU8pKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0Nhbm5vdCB1c2UgdGFibGUgZm9ybWF0IHdpdGggJyAuIGdldF9jbGFzcygkaW8pKTsKfQoKJHRhYmxlID0gJGlvLT5nZXRUYWJsZSgpCi0+c2V0SGVhZGVycyhbJ0FiYW5kb25lZCBQYWNrYWdlJywgJ1N1Z2dlc3RlZCBSZXBsYWNlbWVudCddKQotPnNldENvbHVtbldpZHRoKDEsIDgwKQotPnNldENvbHVtbk1heFdpZHRoKDEsIDgwKTsKCmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGtnKSB7CiRyZXBsYWNlbWVudCA9ICRwa2ctPmdldFJlcGxhY2VtZW50UGFja2FnZSgpICE9PSBudWxsID8gJHBrZy0+Z2V0UmVwbGFjZW1lbnRQYWNrYWdlKCkgOiAnbm9uZSc7CiR0YWJsZS0+YWRkUm93KENvbnNvbGVJTzo6c2FuaXRpemUoWyR0aGlzLT5nZXRQYWNrYWdlTmFtZVdpdGhMaW5rKCRwa2cpLCAkcmVwbGFjZW1lbnRdKSk7Cn0KCiR0YWJsZS0+cmVuZGVyKCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0UGFja2FnZU5hbWVXaXRoTGluayhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogc3RyaW5nCnsKJHBhY2thZ2VVcmwgPSBQYWNrYWdlSW5mbzo6Z2V0Vmlld1NvdXJjZU9ySG9tZXBhZ2VVcmwoJHBhY2thZ2UpOwoKcmV0dXJuICRwYWNrYWdlVXJsICE9PSBudWxsID8gJzxocmVmPScgLiBPdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkcGFja2FnZVVybCkgLiAnPicgLiAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpIC4gJzwvPicgOiAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldFNldmVyaXR5KFNlY3VyaXR5QWR2aXNvcnkgJGFkdmlzb3J5KTogc3RyaW5nCnsKaWYgKCRhZHZpc29yeS0+c2V2ZXJpdHkgPT09IG51bGwpIHsKcmV0dXJuICcnOwp9CgpyZXR1cm4gJGFkdmlzb3J5LT5zZXZlcml0eTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRBZHZpc29yeUlkKFNlY3VyaXR5QWR2aXNvcnkgJGFkdmlzb3J5KTogc3RyaW5nCnsKaWYgKHN0cl9zdGFydHNfd2l0aCgkYWR2aXNvcnktPmFkdmlzb3J5SWQsICdQS1NBLScpKSB7CnJldHVybiAnPGhyZWY9aHR0cHM6Ly9wYWNrYWdpc3Qub3JnL3NlY3VyaXR5LWFkdmlzb3JpZXMvJy4kYWR2aXNvcnktPmFkdmlzb3J5SWQuJz4nLiRhZHZpc29yeS0+YWR2aXNvcnlJZC4nPC8+JzsKfQoKcmV0dXJuICRhZHZpc29yeS0+YWR2aXNvcnlJZDsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRDVkUoU2VjdXJpdHlBZHZpc29yeSAkYWR2aXNvcnkpOiBzdHJpbmcKewppZiAoJGFkdmlzb3J5LT5jdmUgPT09IG51bGwpIHsKcmV0dXJuICdOTyBDVkUnOwp9CgpyZXR1cm4gJzxocmVmPWh0dHBzOi8vY3ZlLm1pdHJlLm9yZy9jZ2ktYmluL2N2ZW5hbWUuY2dpP25hbWU9Jy4kYWR2aXNvcnktPmN2ZS4nPicuJGFkdmlzb3J5LT5jdmUuJzwvPic7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0VVJMKFNlY3VyaXR5QWR2aXNvcnkgJGFkdmlzb3J5KTogc3RyaW5nCnsKaWYgKCRhZHZpc29yeS0+bGluayA9PT0gbnVsbCkgewpyZXR1cm4gJyc7Cn0KCnJldHVybiAnPGhyZWY9Jy5PdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkYWR2aXNvcnktPmxpbmspLic+Jy5PdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkYWR2aXNvcnktPmxpbmspLic8Lz4nOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNhbGN1bGF0ZUJpdG1hc2soYm9vbCAkaGFzVnVsbmVyYWJsZVBhY2thZ2VzLCBib29sICRoYXNBYmFuZG9uZWRQYWNrYWdlcyk6IGludAp7CiRiaXRtYXNrID0gc2VsZjo6U1RBVFVTX09LOwoKaWYgKCRoYXNWdWxuZXJhYmxlUGFja2FnZXMpIHsKJGJpdG1hc2sgfD0gc2VsZjo6U1RBVFVTX1ZVTE5FUkFCTEU7Cn0KCmlmICgkaGFzQWJhbmRvbmVkUGFja2FnZXMpIHsKJGJpdG1hc2sgfD0gc2VsZjo6U1RBVFVTX0FCQU5ET05FRDsKfQoKcmV0dXJuICRiaXRtYXNrOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEFkdmlzb3J5OwoKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBEYXRlVGltZUltbXV0YWJsZTsKCmNsYXNzIElnbm9yZWRTZWN1cml0eUFkdmlzb3J5IGV4dGVuZHMgU2VjdXJpdHlBZHZpc29yeQp7CgoKCgpwdWJsaWMgJGlnbm9yZVJlYXNvbjsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHBhY2thZ2VOYW1lLCBzdHJpbmcgJGFkdmlzb3J5SWQsIENvbnN0cmFpbnRJbnRlcmZhY2UgJGFmZmVjdGVkVmVyc2lvbnMsIHN0cmluZyAkdGl0bGUsIGFycmF5ICRzb3VyY2VzLCBEYXRlVGltZUltbXV0YWJsZSAkcmVwb3J0ZWRBdCwgP3N0cmluZyAkY3ZlID0gbnVsbCwgP3N0cmluZyAkbGluayA9IG51bGwsID9zdHJpbmcgJGlnbm9yZVJlYXNvbiA9IG51bGwsID9zdHJpbmcgJHNldmVyaXR5ID0gbnVsbCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRwYWNrYWdlTmFtZSwgJGFkdmlzb3J5SWQsICRhZmZlY3RlZFZlcnNpb25zLCAkdGl0bGUsICRzb3VyY2VzLCAkcmVwb3J0ZWRBdCwgJGN2ZSwgJGxpbmssICRzZXZlcml0eSk7CgokdGhpcy0+aWdub3JlUmVhc29uID0gJGlnbm9yZVJlYXNvbjsKfQoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBqc29uU2VyaWFsaXplKCkKewokZGF0YSA9IHBhcmVudDo6anNvblNlcmlhbGl6ZSgpOwppZiAoJHRoaXMtPmlnbm9yZVJlYXNvbiA9PT0gbnVsbCkgewp1bnNldCgkZGF0YVsnaWdub3JlUmVhc29uJ10pOwp9CgpyZXR1cm4gJGRhdGE7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQWR2aXNvcnk7Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxTZW12ZXJcVmVyc2lvblBhcnNlcjsKdXNlIEpzb25TZXJpYWxpemFibGU7CgpjbGFzcyBQYXJ0aWFsU2VjdXJpdHlBZHZpc29yeSBpbXBsZW1lbnRzIEpzb25TZXJpYWxpemFibGUKewoKCgoKcHVibGljICRhZHZpc29yeUlkOwoKCgoKCnB1YmxpYyAkcGFja2FnZU5hbWU7CgoKCgoKcHVibGljICRhZmZlY3RlZFZlcnNpb25zOwoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlKHN0cmluZyAkcGFja2FnZU5hbWUsIGFycmF5ICRkYXRhLCBWZXJzaW9uUGFyc2VyICRwYXJzZXIpOiBzZWxmCnsKdHJ5IHsKJGNvbnN0cmFpbnQgPSAkcGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCRkYXRhWydhZmZlY3RlZFZlcnNpb25zJ10pOwp9IGNhdGNoIChcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uICRlKSB7Cgp0cnkgewokYWZmZWN0ZWRWZXJzaW9uID0gUHJlZzo6cmVwbGFjZSgneyheWz49PF5+XSpbXGQuXSspLip9JywgJyQxJywgJGRhdGFbJ2FmZmVjdGVkVmVyc2lvbnMnXSk7CiRjb25zdHJhaW50ID0gJHBhcnNlci0+cGFyc2VDb25zdHJhaW50cygkYWZmZWN0ZWRWZXJzaW9uKTsKfSBjYXRjaCAoXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbiAkZSkgewokY29uc3RyYWludCA9IG5ldyBDb25zdHJhaW50KCc9PScsICcwLjAuMC1pbnZhbGlkLXZlcnNpb24nKTsKfQp9CgppZiAoaXNzZXQoJGRhdGFbJ3RpdGxlJ10sICRkYXRhWydzb3VyY2VzJ10sICRkYXRhWydyZXBvcnRlZEF0J10pKSB7CnJldHVybiBuZXcgU2VjdXJpdHlBZHZpc29yeSgkcGFja2FnZU5hbWUsICRkYXRhWydhZHZpc29yeUlkJ10sICRjb25zdHJhaW50LCAkZGF0YVsndGl0bGUnXSwgJGRhdGFbJ3NvdXJjZXMnXSwgbmV3IFxEYXRlVGltZUltbXV0YWJsZSgkZGF0YVsncmVwb3J0ZWRBdCddLCBuZXcgXERhdGVUaW1lWm9uZSgnVVRDJykpLCAkZGF0YVsnY3ZlJ10gPz8gbnVsbCwgJGRhdGFbJ2xpbmsnXSA/PyBudWxsLCAkZGF0YVsnc2V2ZXJpdHknXSA/PyBudWxsKTsKfQoKcmV0dXJuIG5ldyBzZWxmKCRwYWNrYWdlTmFtZSwgJGRhdGFbJ2Fkdmlzb3J5SWQnXSwgJGNvbnN0cmFpbnQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRwYWNrYWdlTmFtZSwgc3RyaW5nICRhZHZpc29yeUlkLCBDb25zdHJhaW50SW50ZXJmYWNlICRhZmZlY3RlZFZlcnNpb25zKQp7CiR0aGlzLT5hZHZpc29yeUlkID0gJGFkdmlzb3J5SWQ7CiR0aGlzLT5wYWNrYWdlTmFtZSA9ICRwYWNrYWdlTmFtZTsKJHRoaXMtPmFmZmVjdGVkVmVyc2lvbnMgPSAkYWZmZWN0ZWRWZXJzaW9uczsKfQoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBqc29uU2VyaWFsaXplKCkKewokZGF0YSA9IChhcnJheSkgJHRoaXM7CiRkYXRhWydhZmZlY3RlZFZlcnNpb25zJ10gPSAkZGF0YVsnYWZmZWN0ZWRWZXJzaW9ucyddLT5nZXRQcmV0dHlTdHJpbmcoKTsKCnJldHVybiAkZGF0YTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxBZHZpc29yeTsKCnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgRGF0ZVRpbWVJbW11dGFibGU7CgpjbGFzcyBTZWN1cml0eUFkdmlzb3J5IGV4dGVuZHMgUGFydGlhbFNlY3VyaXR5QWR2aXNvcnkKewoKCgoKcHVibGljICR0aXRsZTsKCgoKCgpwdWJsaWMgJGN2ZTsKCgoKCgpwdWJsaWMgJGxpbms7CgoKCgoKcHVibGljICRyZXBvcnRlZEF0OwoKCgoKCnB1YmxpYyAkc291cmNlczsKCgoKCgpwdWJsaWMgJHNldmVyaXR5OwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkcGFja2FnZU5hbWUsIHN0cmluZyAkYWR2aXNvcnlJZCwgQ29uc3RyYWludEludGVyZmFjZSAkYWZmZWN0ZWRWZXJzaW9ucywgc3RyaW5nICR0aXRsZSwgYXJyYXkgJHNvdXJjZXMsIERhdGVUaW1lSW1tdXRhYmxlICRyZXBvcnRlZEF0LCA/c3RyaW5nICRjdmUgPSBudWxsLCA/c3RyaW5nICRsaW5rID0gbnVsbCwgP3N0cmluZyAkc2V2ZXJpdHkgPSBudWxsKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJHBhY2thZ2VOYW1lLCAkYWR2aXNvcnlJZCwgJGFmZmVjdGVkVmVyc2lvbnMpOwoKJHRoaXMtPnRpdGxlID0gJHRpdGxlOwokdGhpcy0+c291cmNlcyA9ICRzb3VyY2VzOwokdGhpcy0+cmVwb3J0ZWRBdCA9ICRyZXBvcnRlZEF0OwokdGhpcy0+Y3ZlID0gJGN2ZTsKJHRoaXMtPmxpbmsgPSAkbGluazsKJHRoaXMtPnNldmVyaXR5ID0gJHNldmVyaXR5Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdG9JZ25vcmVkQWR2aXNvcnkoP3N0cmluZyAkaWdub3JlUmVhc29uKTogSWdub3JlZFNlY3VyaXR5QWR2aXNvcnkKewpyZXR1cm4gbmV3IElnbm9yZWRTZWN1cml0eUFkdmlzb3J5KAokdGhpcy0+cGFja2FnZU5hbWUsCiR0aGlzLT5hZHZpc29yeUlkLAokdGhpcy0+YWZmZWN0ZWRWZXJzaW9ucywKJHRoaXMtPnRpdGxlLAokdGhpcy0+c291cmNlcywKJHRoaXMtPnJlcG9ydGVkQXQsCiR0aGlzLT5jdmUsCiR0aGlzLT5saW5rLAokaWdub3JlUmVhc29uLAokdGhpcy0+c2V2ZXJpdHkKKTsKfQoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBqc29uU2VyaWFsaXplKCkKewokZGF0YSA9IHBhcmVudDo6anNvblNlcmlhbGl6ZSgpOwokZGF0YVsncmVwb3J0ZWRBdCddID0gJGRhdGFbJ3JlcG9ydGVkQXQnXS0+Zm9ybWF0KERBVEVfUkZDMzMzOSk7CgpyZXR1cm4gJGRhdGE7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQXV0b2xvYWQ7Cgp1c2UgQ29tcG9zZXJcQ2xhc3NNYXBHZW5lcmF0b3JcQ2xhc3NNYXA7CnVzZSBDb21wb3NlclxDbGFzc01hcEdlbmVyYXRvclxDbGFzc01hcEdlbmVyYXRvcjsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudERpc3BhdGNoZXI7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxJZ25vcmVBbGxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyXEluc3RhbGxhdGlvbk1hbmFnZXI7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXElPXE51bGxJTzsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XEJvdW5kOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFNjcmlwdFxTY3JpcHRFdmVudHM7CnVzZSBDb21wb3NlclxVdGlsXFBhY2thZ2VTb3J0ZXI7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2NrZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXI7CgoKCgoKY2xhc3MgQXV0b2xvYWRHZW5lcmF0b3IKewoKCgpwcml2YXRlICRldmVudERpc3BhdGNoZXI7CgoKCgpwcml2YXRlICRpbzsKCgoKCnByaXZhdGUgJGRldk1vZGUgPSBudWxsOwoKCgoKcHJpdmF0ZSAkY2xhc3NNYXBBdXRob3JpdGF0aXZlID0gZmFsc2U7CgoKCgpwcml2YXRlICRhcGN1ID0gZmFsc2U7CgoKCgpwcml2YXRlICRhcGN1UHJlZml4OwoKCgoKcHJpdmF0ZSAkZHJ5UnVuID0gZmFsc2U7CgoKCgpwcml2YXRlICRydW5TY3JpcHRzID0gZmFsc2U7CgoKCgpwcml2YXRlICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KEV2ZW50RGlzcGF0Y2hlciAkZXZlbnREaXNwYXRjaGVyLCA/SU9JbnRlcmZhY2UgJGlvID0gbnVsbCkKewokdGhpcy0+ZXZlbnREaXNwYXRjaGVyID0gJGV2ZW50RGlzcGF0Y2hlcjsKJHRoaXMtPmlvID0gJGlvID8/IG5ldyBOdWxsSU8oKTsKCiR0aGlzLT5wbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyID0gUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk6Omlnbm9yZU5vdGhpbmcoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERldk1vZGUoYm9vbCAkZGV2TW9kZSA9IHRydWUpCnsKJHRoaXMtPmRldk1vZGUgPSAkZGV2TW9kZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q2xhc3NNYXBBdXRob3JpdGF0aXZlKGJvb2wgJGNsYXNzTWFwQXV0aG9yaXRhdGl2ZSkKewokdGhpcy0+Y2xhc3NNYXBBdXRob3JpdGF0aXZlID0gJGNsYXNzTWFwQXV0aG9yaXRhdGl2ZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXBjdShib29sICRhcGN1LCA/c3RyaW5nICRhcGN1UHJlZml4ID0gbnVsbCkKewokdGhpcy0+YXBjdSA9ICRhcGN1OwokdGhpcy0+YXBjdVByZWZpeCA9ICRhcGN1UHJlZml4Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSdW5TY3JpcHRzKGJvb2wgJHJ1blNjcmlwdHMgPSB0cnVlKQp7CiR0aGlzLT5ydW5TY3JpcHRzID0gJHJ1blNjcmlwdHM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREcnlSdW4oYm9vbCAkZHJ5UnVuID0gdHJ1ZSk6IHZvaWQKewokdGhpcy0+ZHJ5UnVuID0gJGRyeVJ1bjsKfQoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldElnbm9yZVBsYXRmb3JtUmVxdWlyZW1lbnRzKCRpZ25vcmVQbGF0Zm9ybVJlcXMpCnsKdHJpZ2dlcl9lcnJvcignQXV0b2xvYWRHZW5lcmF0b3I6OnNldElnbm9yZVBsYXRmb3JtUmVxdWlyZW1lbnRzIGlzIGRlcHJlY2F0ZWQgc2luY2UgQ29tcG9zZXIgMi4yLCB1c2Ugc2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciBpbnN0ZWFkLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKCiR0aGlzLT5zZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5Ojpmcm9tQm9vbE9yTGlzdCgkaWdub3JlUGxhdGZvcm1SZXFzKSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpCnsKJHRoaXMtPnBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgPSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcjsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZHVtcChDb25maWcgJGNvbmZpZywgSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkbG9jYWxSZXBvLCBSb290UGFja2FnZUludGVyZmFjZSAkcm9vdFBhY2thZ2UsIEluc3RhbGxhdGlvbk1hbmFnZXIgJGluc3RhbGxhdGlvbk1hbmFnZXIsIHN0cmluZyAkdGFyZ2V0RGlyLCBib29sICRzY2FuUHNyUGFja2FnZXMgPSBmYWxzZSwgP3N0cmluZyAkc3VmZml4ID0gbnVsbCwgP0xvY2tlciAkbG9ja2VyID0gbnVsbCwgYm9vbCAkc3RyaWN0QW1iaWd1b3VzID0gZmFsc2UpCnsKaWYgKCR0aGlzLT5jbGFzc01hcEF1dGhvcml0YXRpdmUpIHsKCiRzY2FuUHNyUGFja2FnZXMgPSB0cnVlOwp9CgoKaWYgKG51bGwgPT09ICR0aGlzLT5kZXZNb2RlKSB7CgokdGhpcy0+ZGV2TW9kZSA9IGZhbHNlOwoKJGluc3RhbGxlZEpzb24gPSBuZXcgSnNvbkZpbGUoJGNvbmZpZy0+Z2V0KCd2ZW5kb3ItZGlyJykuJy9jb21wb3Nlci9pbnN0YWxsZWQuanNvbicpOwppZiAoJGluc3RhbGxlZEpzb24tPmV4aXN0cygpKSB7CiRpbnN0YWxsZWRKc29uID0gJGluc3RhbGxlZEpzb24tPnJlYWQoKTsKaWYgKGlzc2V0KCRpbnN0YWxsZWRKc29uWydkZXYnXSkpIHsKJHRoaXMtPmRldk1vZGUgPSAkaW5zdGFsbGVkSnNvblsnZGV2J107Cn0KfQp9CgppZiAoJHRoaXMtPnJ1blNjcmlwdHMpIHsKCmlmICghaXNzZXQoJF9TRVJWRVJbJ0NPTVBPU0VSX0RFVl9NT0RFJ10pKSB7ClBsYXRmb3JtOjpwdXRFbnYoJ0NPTVBPU0VSX0RFVl9NT0RFJywgJHRoaXMtPmRldk1vZGUgPyAnMScgOiAnMCcpOwp9CgokdGhpcy0+ZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaFNjcmlwdChTY3JpcHRFdmVudHM6OlBSRV9BVVRPTE9BRF9EVU1QLCAkdGhpcy0+ZGV2TW9kZSwgW10sIFsKJ29wdGltaXplJyA9PiAkc2NhblBzclBhY2thZ2VzLApdKTsKfQoKJGNsYXNzTWFwR2VuZXJhdG9yID0gbmV3IENsYXNzTWFwR2VuZXJhdG9yKFsncGhwJywgJ2luYycsICdoaCddKTsKJGNsYXNzTWFwR2VuZXJhdG9yLT5hdm9pZER1cGxpY2F0ZVNjYW5zKCk7CgokZmlsZXN5c3RlbSA9IG5ldyBGaWxlc3lzdGVtKCk7CiRmaWxlc3lzdGVtLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoJGNvbmZpZy0+Z2V0KCd2ZW5kb3ItZGlyJykpOwoKCgokYmFzZVBhdGggPSAkZmlsZXN5c3RlbS0+bm9ybWFsaXplUGF0aChyZWFscGF0aChyZWFscGF0aChQbGF0Zm9ybTo6Z2V0Q3dkKCkpKSk7CiR2ZW5kb3JQYXRoID0gJGZpbGVzeXN0ZW0tPm5vcm1hbGl6ZVBhdGgocmVhbHBhdGgocmVhbHBhdGgoJGNvbmZpZy0+Z2V0KCd2ZW5kb3ItZGlyJykpKSk7CiR1c2VHbG9iYWxJbmNsdWRlUGF0aCA9ICRjb25maWctPmdldCgndXNlLWluY2x1ZGUtcGF0aCcpOwokcHJlcGVuZEF1dG9sb2FkZXIgPSAkY29uZmlnLT5nZXQoJ3ByZXBlbmQtYXV0b2xvYWRlcicpID09PSBmYWxzZSA/ICdmYWxzZScgOiAndHJ1ZSc7CiR0YXJnZXREaXIgPSAkdmVuZG9yUGF0aC4nLycuJHRhcmdldERpcjsKJGZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkdGFyZ2V0RGlyKTsKCiR2ZW5kb3JQYXRoQ29kZSA9ICRmaWxlc3lzdGVtLT5maW5kU2hvcnRlc3RQYXRoQ29kZShyZWFscGF0aCgkdGFyZ2V0RGlyKSwgJHZlbmRvclBhdGgsIHRydWUpOwokdmVuZG9yUGF0aFRvVGFyZ2V0RGlyQ29kZSA9ICRmaWxlc3lzdGVtLT5maW5kU2hvcnRlc3RQYXRoQ29kZSgkdmVuZG9yUGF0aCwgcmVhbHBhdGgoJHRhcmdldERpciksIHRydWUpOwoKJGFwcEJhc2VEaXJDb2RlID0gJGZpbGVzeXN0ZW0tPmZpbmRTaG9ydGVzdFBhdGhDb2RlKCR2ZW5kb3JQYXRoLCAkYmFzZVBhdGgsIHRydWUpOwokYXBwQmFzZURpckNvZGUgPSBzdHJfcmVwbGFjZSgnX19ESVJfXycsICckdmVuZG9yRGlyJywgJGFwcEJhc2VEaXJDb2RlKTsKCiRuYW1lc3BhY2VzRmlsZSA9IDw8PEVPRgo8P3BocAoKLy8gYXV0b2xvYWRfbmFtZXNwYWNlcy5waHAgQGdlbmVyYXRlZCBieSBDb21wb3NlcgoKXCR2ZW5kb3JEaXIgPSAkdmVuZG9yUGF0aENvZGU7ClwkYmFzZURpciA9ICRhcHBCYXNlRGlyQ29kZTsKCnJldHVybiBhcnJheSgKCkVPRjsKCiRwc3I0RmlsZSA9IDw8PEVPRgo8P3BocAoKLy8gYXV0b2xvYWRfcHNyNC5waHAgQGdlbmVyYXRlZCBieSBDb21wb3NlcgoKXCR2ZW5kb3JEaXIgPSAkdmVuZG9yUGF0aENvZGU7ClwkYmFzZURpciA9ICRhcHBCYXNlRGlyQ29kZTsKCnJldHVybiBhcnJheSgKCkVPRjsKCgokZGV2UGFja2FnZU5hbWVzID0gJGxvY2FsUmVwby0+Z2V0RGV2UGFja2FnZU5hbWVzKCk7CiRwYWNrYWdlTWFwID0gJHRoaXMtPmJ1aWxkUGFja2FnZU1hcCgkaW5zdGFsbGF0aW9uTWFuYWdlciwgJHJvb3RQYWNrYWdlLCAkbG9jYWxSZXBvLT5nZXRDYW5vbmljYWxQYWNrYWdlcygpKTsKaWYgKCR0aGlzLT5kZXZNb2RlKSB7CgokZmlsdGVyZWREZXZQYWNrYWdlcyA9IGZhbHNlOwp9IGVsc2UgewoKJGZpbHRlcmVkRGV2UGFja2FnZXMgPSAkZGV2UGFja2FnZU5hbWVzID86IHRydWU7Cn0KJGF1dG9sb2FkcyA9ICR0aGlzLT5wYXJzZUF1dG9sb2FkcygkcGFja2FnZU1hcCwgJHJvb3RQYWNrYWdlLCAkZmlsdGVyZWREZXZQYWNrYWdlcyk7CgoKZm9yZWFjaCAoJGF1dG9sb2Fkc1sncHNyLTAnXSBhcyAkbmFtZXNwYWNlID0+ICRwYXRocykgewokZXhwb3J0ZWRQYXRocyA9IFtdOwpmb3JlYWNoICgkcGF0aHMgYXMgJHBhdGgpIHsKJGV4cG9ydGVkUGF0aHNbXSA9ICR0aGlzLT5nZXRQYXRoQ29kZSgkZmlsZXN5c3RlbSwgJGJhc2VQYXRoLCAkdmVuZG9yUGF0aCwgJHBhdGgpOwp9CiRleHBvcnRlZFByZWZpeCA9IHZhcl9leHBvcnQoJG5hbWVzcGFjZSwgdHJ1ZSk7CiRuYW1lc3BhY2VzRmlsZSAuPSAiICAgICRleHBvcnRlZFByZWZpeCA9PiAiOwokbmFtZXNwYWNlc0ZpbGUgLj0gImFycmF5KCIuaW1wbG9kZSgnLCAnLCAkZXhwb3J0ZWRQYXRocykuIiksXG4iOwp9CiRuYW1lc3BhY2VzRmlsZSAuPSAiKTtcbiI7CgoKZm9yZWFjaCAoJGF1dG9sb2Fkc1sncHNyLTQnXSBhcyAkbmFtZXNwYWNlID0+ICRwYXRocykgewokZXhwb3J0ZWRQYXRocyA9IFtdOwpmb3JlYWNoICgkcGF0aHMgYXMgJHBhdGgpIHsKJGV4cG9ydGVkUGF0aHNbXSA9ICR0aGlzLT5nZXRQYXRoQ29kZSgkZmlsZXN5c3RlbSwgJGJhc2VQYXRoLCAkdmVuZG9yUGF0aCwgJHBhdGgpOwp9CiRleHBvcnRlZFByZWZpeCA9IHZhcl9leHBvcnQoJG5hbWVzcGFjZSwgdHJ1ZSk7CiRwc3I0RmlsZSAuPSAiICAgICRleHBvcnRlZFByZWZpeCA9PiAiOwokcHNyNEZpbGUgLj0gImFycmF5KCIuaW1wbG9kZSgnLCAnLCAkZXhwb3J0ZWRQYXRocykuIiksXG4iOwp9CiRwc3I0RmlsZSAuPSAiKTtcbiI7CgoKJHRhcmdldERpckxvYWRlciA9IG51bGw7CiRtYWluQXV0b2xvYWQgPSAkcm9vdFBhY2thZ2UtPmdldEF1dG9sb2FkKCk7CmlmICgkcm9vdFBhY2thZ2UtPmdldFRhcmdldERpcigpICYmICFlbXB0eSgkbWFpbkF1dG9sb2FkWydwc3ItMCddKSkgewokbGV2ZWxzID0gc3Vic3RyX2NvdW50KCRmaWxlc3lzdGVtLT5ub3JtYWxpemVQYXRoKCRyb290UGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCkpLCAnLycpICsgMTsKJHByZWZpeGVzID0gaW1wbG9kZSgnLCAnLCBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkcHJlZml4KTogc3RyaW5nIHsKcmV0dXJuIHZhcl9leHBvcnQoJHByZWZpeCwgdHJ1ZSk7Cn0sIGFycmF5X2tleXMoJG1haW5BdXRvbG9hZFsncHNyLTAnXSkpKTsKJGJhc2VEaXJGcm9tVGFyZ2V0RGlyQ29kZSA9ICRmaWxlc3lzdGVtLT5maW5kU2hvcnRlc3RQYXRoQ29kZSgkdGFyZ2V0RGlyLCAkYmFzZVBhdGgsIHRydWUpOwoKJHRhcmdldERpckxvYWRlciA9IDw8PEVPRgoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYXV0b2xvYWQoXCRjbGFzcykKICAgIHsKICAgICAgICBcJGRpciA9ICRiYXNlRGlyRnJvbVRhcmdldERpckNvZGUgLiAnLyc7CiAgICAgICAgXCRwcmVmaXhlcyA9IGFycmF5KCRwcmVmaXhlcyk7CiAgICAgICAgZm9yZWFjaCAoXCRwcmVmaXhlcyBhcyBcJHByZWZpeCkgewogICAgICAgICAgICBpZiAoMCAhPT0gc3RycG9zKFwkY2xhc3MsIFwkcHJlZml4KSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgXCRwYXRoID0gXCRkaXIgLiBpbXBsb2RlKCcvJywgYXJyYXlfc2xpY2UoZXhwbG9kZSgnXFxcXCcsIFwkY2xhc3MpLCAkbGV2ZWxzKSkuJy5waHAnOwogICAgICAgICAgICBpZiAoIVwkcGF0aCA9IHN0cmVhbV9yZXNvbHZlX2luY2x1ZGVfcGF0aChcJHBhdGgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVxdWlyZSBcJHBhdGg7CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CgpFT0Y7Cn0KCiRleGNsdWRlZCA9IFtdOwppZiAoIWVtcHR5KCRhdXRvbG9hZHNbJ2V4Y2x1ZGUtZnJvbS1jbGFzc21hcCddKSkgewokZXhjbHVkZWQgPSAkYXV0b2xvYWRzWydleGNsdWRlLWZyb20tY2xhc3NtYXAnXTsKfQoKZm9yZWFjaCAoJGF1dG9sb2Fkc1snY2xhc3NtYXAnXSBhcyAkZGlyKSB7CiRjbGFzc01hcEdlbmVyYXRvci0+c2NhblBhdGhzKCRkaXIsICR0aGlzLT5idWlsZEV4Y2x1c2lvblJlZ2V4KCRkaXIsICRleGNsdWRlZCkpOwp9CgppZiAoJHNjYW5Qc3JQYWNrYWdlcykgewokbmFtZXNwYWNlc1RvU2NhbiA9IFtdOwoKCmZvcmVhY2ggKFsncHNyLTQnLCAncHNyLTAnXSBhcyAkcHNyVHlwZSkgewpmb3JlYWNoICgkYXV0b2xvYWRzWyRwc3JUeXBlXSBhcyAkbmFtZXNwYWNlID0+ICRwYXRocykgewokbmFtZXNwYWNlc1RvU2NhblskbmFtZXNwYWNlXVtdID0gWydwYXRocycgPT4gJHBhdGhzLCAndHlwZScgPT4gJHBzclR5cGVdOwp9Cn0KCmtyc29ydCgkbmFtZXNwYWNlc1RvU2Nhbik7Cgpmb3JlYWNoICgkbmFtZXNwYWNlc1RvU2NhbiBhcyAkbmFtZXNwYWNlID0+ICRncm91cHMpIHsKZm9yZWFjaCAoJGdyb3VwcyBhcyAkZ3JvdXApIHsKZm9yZWFjaCAoJGdyb3VwWydwYXRocyddIGFzICRkaXIpIHsKJGRpciA9ICRmaWxlc3lzdGVtLT5ub3JtYWxpemVQYXRoKCRmaWxlc3lzdGVtLT5pc0Fic29sdXRlUGF0aCgkZGlyKSA/ICRkaXIgOiAkYmFzZVBhdGguJy8nLiRkaXIpOwppZiAoIWlzX2RpcigkZGlyKSkgewpjb250aW51ZTsKfQoKCmlmIChzdHJfY29udGFpbnMoJHZlbmRvclBhdGgsICRkaXIuJy8nKSkgewokZXhjbHVzaW9uUmVnZXggPSAkdGhpcy0+YnVpbGRFeGNsdXNpb25SZWdleCgkZGlyLCBhcnJheV9tZXJnZSgkZXhjbHVkZWQsIFskdmVuZG9yUGF0aC4nLyddKSk7Cn0gZWxzZSB7CiRleGNsdXNpb25SZWdleCA9ICR0aGlzLT5idWlsZEV4Y2x1c2lvblJlZ2V4KCRkaXIsICRleGNsdWRlZCk7Cn0KCiRjbGFzc01hcEdlbmVyYXRvci0+c2NhblBhdGhzKCRkaXIsICRleGNsdXNpb25SZWdleCwgJGdyb3VwWyd0eXBlJ10sICRuYW1lc3BhY2UpOwp9Cn0KfQp9CgokY2xhc3NNYXAgPSAkY2xhc3NNYXBHZW5lcmF0b3ItPmdldENsYXNzTWFwKCk7CmlmICgkc3RyaWN0QW1iaWd1b3VzKSB7CiRhbWJpZ3VvdXNDbGFzc2VzID0gJGNsYXNzTWFwLT5nZXRBbWJpZ3VvdXNDbGFzc2VzKGZhbHNlKTsKfSBlbHNlIHsKJGFtYmlndW91c0NsYXNzZXMgPSAkY2xhc3NNYXAtPmdldEFtYmlndW91c0NsYXNzZXMoKTsKfQpmb3JlYWNoICgkYW1iaWd1b3VzQ2xhc3NlcyBhcyAkY2xhc3NOYW1lID0+ICRhbWJpZ3VvdXNQYXRocykgewppZiAoY291bnQoJGFtYmlndW91c1BhdGhzKSA+IDEpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKAonPHdhcm5pbmc+V2FybmluZzogQW1iaWd1b3VzIGNsYXNzIHJlc29sdXRpb24sICInLiRjbGFzc05hbWUuJyInLgonIHdhcyBmb3VuZCAnLiAoY291bnQoJGFtYmlndW91c1BhdGhzKSArIDEpIC4neDogaW4gIicuJGNsYXNzTWFwLT5nZXRDbGFzc1BhdGgoJGNsYXNzTmFtZSkuJyIgYW5kICInLiBpbXBsb2RlKCciLCAiJywgJGFtYmlndW91c1BhdGhzKSAuJyIsIHRoZSBmaXJzdCB3aWxsIGJlIHVzZWQuPC93YXJuaW5nPicKKTsKfSBlbHNlIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKAonPHdhcm5pbmc+V2FybmluZzogQW1iaWd1b3VzIGNsYXNzIHJlc29sdXRpb24sICInLiRjbGFzc05hbWUuJyInLgonIHdhcyBmb3VuZCBpbiBib3RoICInLiRjbGFzc01hcC0+Z2V0Q2xhc3NQYXRoKCRjbGFzc05hbWUpLiciIGFuZCAiJy4gaW1wbG9kZSgnIiwgIicsICRhbWJpZ3VvdXNQYXRocykgLiciLCB0aGUgZmlyc3Qgd2lsbCBiZSB1c2VkLjwvd2FybmluZz4nCik7Cn0KfQppZiAoXGNvdW50KCRhbWJpZ3VvdXNDbGFzc2VzKSA+IDApIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8aW5mbz5UbyByZXNvbHZlIGFtYmlndWl0eSBpbiBjbGFzc2VzIG5vdCB1bmRlciB5b3VyIGNvbnRyb2wgeW91IGNhbiBpZ25vcmUgdGhlbSBieSBwYXRoIHVzaW5nIDxocmVmPScuT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJ2h0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wNC1zY2hlbWEubWQjZXhjbHVkZS1maWxlcy1mcm9tLWNsYXNzbWFwcycpLic+ZXhjbHVkZS1mcm9tLWNsYXNzbWFwPC8+Jyk7Cn0KCgokY2xhc3NNYXAtPmNsZWFyUHNyVmlvbGF0aW9uc0J5UGF0aCgkdmVuZG9yUGF0aCk7CmZvcmVhY2ggKCRjbGFzc01hcC0+Z2V0UHNyVmlvbGF0aW9ucygpIGFzICRtc2cpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCI8d2FybmluZz4kbXNnPC93YXJuaW5nPiIpOwp9CgokY2xhc3NNYXAtPmFkZENsYXNzKCdDb21wb3NlclxJbnN0YWxsZWRWZXJzaW9ucycsICR2ZW5kb3JQYXRoIC4gJy9jb21wb3Nlci9JbnN0YWxsZWRWZXJzaW9ucy5waHAnKTsKJGNsYXNzTWFwLT5zb3J0KCk7CgokY2xhc3NtYXBGaWxlID0gPDw8RU9GCjw/cGhwCgovLyBhdXRvbG9hZF9jbGFzc21hcC5waHAgQGdlbmVyYXRlZCBieSBDb21wb3NlcgoKXCR2ZW5kb3JEaXIgPSAkdmVuZG9yUGF0aENvZGU7ClwkYmFzZURpciA9ICRhcHBCYXNlRGlyQ29kZTsKCnJldHVybiBhcnJheSgKCkVPRjsKZm9yZWFjaCAoJGNsYXNzTWFwLT5nZXRNYXAoKSBhcyAkY2xhc3NOYW1lID0+ICRwYXRoKSB7CiRwYXRoQ29kZSA9ICR0aGlzLT5nZXRQYXRoQ29kZSgkZmlsZXN5c3RlbSwgJGJhc2VQYXRoLCAkdmVuZG9yUGF0aCwgJHBhdGgpLiIsXG4iOwokY2xhc3NtYXBGaWxlIC49ICcgICAgJy52YXJfZXhwb3J0KCRjbGFzc05hbWUsIHRydWUpLicgPT4gJy4kcGF0aENvZGU7Cn0KJGNsYXNzbWFwRmlsZSAuPSAiKTtcbiI7CgppZiAoJycgPT09ICRzdWZmaXgpIHsKJHN1ZmZpeCA9IG51bGw7Cn0KaWYgKG51bGwgPT09ICRzdWZmaXgpIHsKJHN1ZmZpeCA9ICRjb25maWctPmdldCgnYXV0b2xvYWRlci1zdWZmaXgnKTsKCgppZiAobnVsbCA9PT0gJHN1ZmZpeCAmJiBGaWxlc3lzdGVtOjppc1JlYWRhYmxlKCR2ZW5kb3JQYXRoLicvYXV0b2xvYWQucGhwJykpIHsKJGNvbnRlbnQgPSAoc3RyaW5nKSBmaWxlX2dldF9jb250ZW50cygkdmVuZG9yUGF0aC4nL2F1dG9sb2FkLnBocCcpOwppZiAoUHJlZzo6aXNNYXRjaCgne0NvbXBvc2VyQXV0b2xvYWRlckluaXQoW146XHNdKyk6On0nLCAkY29udGVudCwgJG1hdGNoKSkgewokc3VmZml4ID0gJG1hdGNoWzFdOwp9Cn0KCmlmIChudWxsID09PSAkc3VmZml4KSB7CiRzdWZmaXggPSAkbG9ja2VyICE9PSBudWxsICYmICRsb2NrZXItPmlzTG9ja2VkKCkgPyAkbG9ja2VyLT5nZXRMb2NrRGF0YSgpWydjb250ZW50LWhhc2gnXSA6IGJpbjJoZXgocmFuZG9tX2J5dGVzKDE2KSk7Cn0KfQoKaWYgKCR0aGlzLT5kcnlSdW4pIHsKcmV0dXJuICRjbGFzc01hcDsKfQoKJGZpbGVzeXN0ZW0tPmZpbGVQdXRDb250ZW50c0lmTW9kaWZpZWQoJHRhcmdldERpci4nL2F1dG9sb2FkX25hbWVzcGFjZXMucGhwJywgJG5hbWVzcGFjZXNGaWxlKTsKJGZpbGVzeXN0ZW0tPmZpbGVQdXRDb250ZW50c0lmTW9kaWZpZWQoJHRhcmdldERpci4nL2F1dG9sb2FkX3BzcjQucGhwJywgJHBzcjRGaWxlKTsKJGZpbGVzeXN0ZW0tPmZpbGVQdXRDb250ZW50c0lmTW9kaWZpZWQoJHRhcmdldERpci4nL2F1dG9sb2FkX2NsYXNzbWFwLnBocCcsICRjbGFzc21hcEZpbGUpOwokaW5jbHVkZVBhdGhGaWxlUGF0aCA9ICR0YXJnZXREaXIuJy9pbmNsdWRlX3BhdGhzLnBocCc7CmlmICgkaW5jbHVkZVBhdGhGaWxlQ29udGVudHMgPSAkdGhpcy0+Z2V0SW5jbHVkZVBhdGhzRmlsZSgkcGFja2FnZU1hcCwgJGZpbGVzeXN0ZW0sICRiYXNlUGF0aCwgJHZlbmRvclBhdGgsICR2ZW5kb3JQYXRoQ29kZSwgJGFwcEJhc2VEaXJDb2RlKSkgewokZmlsZXN5c3RlbS0+ZmlsZVB1dENvbnRlbnRzSWZNb2RpZmllZCgkaW5jbHVkZVBhdGhGaWxlUGF0aCwgJGluY2x1ZGVQYXRoRmlsZUNvbnRlbnRzKTsKfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCRpbmNsdWRlUGF0aEZpbGVQYXRoKSkgewp1bmxpbmsoJGluY2x1ZGVQYXRoRmlsZVBhdGgpOwp9CiRpbmNsdWRlRmlsZXNGaWxlUGF0aCA9ICR0YXJnZXREaXIuJy9hdXRvbG9hZF9maWxlcy5waHAnOwppZiAoJGluY2x1ZGVGaWxlc0ZpbGVDb250ZW50cyA9ICR0aGlzLT5nZXRJbmNsdWRlRmlsZXNGaWxlKCRhdXRvbG9hZHNbJ2ZpbGVzJ10sICRmaWxlc3lzdGVtLCAkYmFzZVBhdGgsICR2ZW5kb3JQYXRoLCAkdmVuZG9yUGF0aENvZGUsICRhcHBCYXNlRGlyQ29kZSkpIHsKJGZpbGVzeXN0ZW0tPmZpbGVQdXRDb250ZW50c0lmTW9kaWZpZWQoJGluY2x1ZGVGaWxlc0ZpbGVQYXRoLCAkaW5jbHVkZUZpbGVzRmlsZUNvbnRlbnRzKTsKfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCRpbmNsdWRlRmlsZXNGaWxlUGF0aCkpIHsKdW5saW5rKCRpbmNsdWRlRmlsZXNGaWxlUGF0aCk7Cn0KJGZpbGVzeXN0ZW0tPmZpbGVQdXRDb250ZW50c0lmTW9kaWZpZWQoJHRhcmdldERpci4nL2F1dG9sb2FkX3N0YXRpYy5waHAnLCAkdGhpcy0+Z2V0U3RhdGljRmlsZSgkc3VmZml4LCAkdGFyZ2V0RGlyLCAkdmVuZG9yUGF0aCwgJGJhc2VQYXRoKSk7CiRjaGVja1BsYXRmb3JtID0gJGNvbmZpZy0+Z2V0KCdwbGF0Zm9ybS1jaGVjaycpICE9PSBmYWxzZSAmJiAhKCR0aGlzLT5wbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGluc3RhbmNlb2YgSWdub3JlQWxsUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik7CiRwbGF0Zm9ybUNoZWNrQ29udGVudCA9IG51bGw7CmlmICgkY2hlY2tQbGF0Zm9ybSkgewokcGxhdGZvcm1DaGVja0NvbnRlbnQgPSAkdGhpcy0+Z2V0UGxhdGZvcm1DaGVjaygkcGFja2FnZU1hcCwgJGNvbmZpZy0+Z2V0KCdwbGF0Zm9ybS1jaGVjaycpLCAkZGV2UGFja2FnZU5hbWVzKTsKaWYgKG51bGwgPT09ICRwbGF0Zm9ybUNoZWNrQ29udGVudCkgewokY2hlY2tQbGF0Zm9ybSA9IGZhbHNlOwp9Cn0KaWYgKCRjaGVja1BsYXRmb3JtKSB7CiRmaWxlc3lzdGVtLT5maWxlUHV0Q29udGVudHNJZk1vZGlmaWVkKCR0YXJnZXREaXIuJy9wbGF0Zm9ybV9jaGVjay5waHAnLCAkcGxhdGZvcm1DaGVja0NvbnRlbnQpOwp9IGVsc2VpZiAoZmlsZV9leGlzdHMoJHRhcmdldERpci4nL3BsYXRmb3JtX2NoZWNrLnBocCcpKSB7CnVubGluaygkdGFyZ2V0RGlyLicvcGxhdGZvcm1fY2hlY2sucGhwJyk7Cn0KJGZpbGVzeXN0ZW0tPmZpbGVQdXRDb250ZW50c0lmTW9kaWZpZWQoJHZlbmRvclBhdGguJy9hdXRvbG9hZC5waHAnLCAkdGhpcy0+Z2V0QXV0b2xvYWRGaWxlKCR2ZW5kb3JQYXRoVG9UYXJnZXREaXJDb2RlLCAkc3VmZml4KSk7CiRmaWxlc3lzdGVtLT5maWxlUHV0Q29udGVudHNJZk1vZGlmaWVkKCR0YXJnZXREaXIuJy9hdXRvbG9hZF9yZWFsLnBocCcsICR0aGlzLT5nZXRBdXRvbG9hZFJlYWxGaWxlKHRydWUsIChib29sKSAkaW5jbHVkZVBhdGhGaWxlQ29udGVudHMsICR0YXJnZXREaXJMb2FkZXIsIChib29sKSAkaW5jbHVkZUZpbGVzRmlsZUNvbnRlbnRzLCAkdmVuZG9yUGF0aENvZGUsICRhcHBCYXNlRGlyQ29kZSwgJHN1ZmZpeCwgJHVzZUdsb2JhbEluY2x1ZGVQYXRoLCAkcHJlcGVuZEF1dG9sb2FkZXIsICRjaGVja1BsYXRmb3JtKSk7CgokZmlsZXN5c3RlbS0+c2FmZUNvcHkoX19ESVJfXy4nL0NsYXNzTG9hZGVyLnBocCcsICR0YXJnZXREaXIuJy9DbGFzc0xvYWRlci5waHAnKTsKJGZpbGVzeXN0ZW0tPnNhZmVDb3B5KF9fRElSX18uJy8uLi8uLi8uLi9MSUNFTlNFJywgJHRhcmdldERpci4nL0xJQ0VOU0UnKTsKCmlmICgkdGhpcy0+cnVuU2NyaXB0cykgewokdGhpcy0+ZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaFNjcmlwdChTY3JpcHRFdmVudHM6OlBPU1RfQVVUT0xPQURfRFVNUCwgJHRoaXMtPmRldk1vZGUsIFtdLCBbCidvcHRpbWl6ZScgPT4gJHNjYW5Qc3JQYWNrYWdlcywKXSk7Cn0KCnJldHVybiAkY2xhc3NNYXA7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGJ1aWxkRXhjbHVzaW9uUmVnZXgoc3RyaW5nICRkaXIsIGFycmF5ICRleGNsdWRlZCk6ID9zdHJpbmcKewppZiAoW10gPT09ICRleGNsdWRlZCkgewpyZXR1cm4gbnVsbDsKfQoKCgoKaWYgKGZpbGVfZXhpc3RzKCRkaXIpKSB7CgokZGlyTWF0Y2ggPSBwcmVnX3F1b3RlKHN0cnRyKHJlYWxwYXRoKCRkaXIpLCAnXFwnLCAnLycpKTsKCiRmcyA9IG5ldyBGaWxlc3lzdGVtKCk7CiRhYnNEaXIgPSAkZnMtPmlzQWJzb2x1dGVQYXRoKCRkaXIpID8gJGRpciA6IHJlYWxwYXRoKFBsYXRmb3JtOjpnZXRDd2QoKSkuJy8nLiRkaXI7CiRkaXJNYXRjaE5vcm1hbGl6ZWQgPSBwcmVnX3F1b3RlKHN0cnRyKCRmcy0+bm9ybWFsaXplUGF0aCgkYWJzRGlyKSwgJ1xcJywgJy8nKSk7CiRpc1N5bWxpbmsgPSAkZGlyTWF0Y2ggIT09ICRkaXJNYXRjaE5vcm1hbGl6ZWQ7Cgpmb3JlYWNoICgkZXhjbHVkZWQgYXMgJGluZGV4ID0+ICRwYXR0ZXJuKSB7CgokcGF0dGVybiA9IFByZWc6OnJlcGxhY2UoJ3teKChbXi4rKj9cW15cXSQoKXt9PSE8Pnw6XFxcXCMtXSt8XFxcXFsuKyo/XFteXF0kKCl7fT0hPD58OiMtXSkqKS4qfScsICckMScsICRwYXR0ZXJuKTsKCmlmICgKKCFzdHJfc3RhcnRzX3dpdGgoJHBhdHRlcm4sICRkaXJNYXRjaCkgJiYgIXN0cl9zdGFydHNfd2l0aCgkZGlyTWF0Y2gsICRwYXR0ZXJuKSkKJiYgKAoKISRpc1N5bWxpbmsKfHwgKCFzdHJfc3RhcnRzX3dpdGgoJHBhdHRlcm4sICRkaXJNYXRjaE5vcm1hbGl6ZWQpICYmICFzdHJfc3RhcnRzX3dpdGgoJGRpck1hdGNoTm9ybWFsaXplZCwgJHBhdHRlcm4pKQopCikgewp1bnNldCgkZXhjbHVkZWRbJGluZGV4XSk7Cn0KfQp9CgpyZXR1cm4gXGNvdW50KCRleGNsdWRlZCkgPiAwID8gJ3soJyAuIGltcGxvZGUoJ3wnLCAkZXhjbHVkZWQpIC4gJyl9JyA6IG51bGw7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gYnVpbGRQYWNrYWdlTWFwKEluc3RhbGxhdGlvbk1hbmFnZXIgJGluc3RhbGxhdGlvbk1hbmFnZXIsIFBhY2thZ2VJbnRlcmZhY2UgJHJvb3RQYWNrYWdlLCBhcnJheSAkcGFja2FnZXMpCnsKCiRwYWNrYWdlTWFwID0gW1skcm9vdFBhY2thZ2UsICcnXV07Cgpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CmNvbnRpbnVlOwp9CiR0aGlzLT52YWxpZGF0ZVBhY2thZ2UoJHBhY2thZ2UpOwokcGFja2FnZU1hcFtdID0gWwokcGFja2FnZSwKJGluc3RhbGxhdGlvbk1hbmFnZXItPmdldEluc3RhbGxQYXRoKCRwYWNrYWdlKSwKXTsKfQoKcmV0dXJuICRwYWNrYWdlTWFwOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CiRhdXRvbG9hZCA9ICRwYWNrYWdlLT5nZXRBdXRvbG9hZCgpOwppZiAoIWVtcHR5KCRhdXRvbG9hZFsncHNyLTQnXSkgJiYgbnVsbCAhPT0gJHBhY2thZ2UtPmdldFRhcmdldERpcigpKSB7CiRuYW1lID0gJHBhY2thZ2UtPmdldE5hbWUoKTsKJHBhY2thZ2UtPmdldFRhcmdldERpcigpOwp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiUFNSLTQgYXV0b2xvYWRpbmcgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIHRhcmdldC1kaXIgcHJvcGVydHksIHJlbW92ZSB0aGUgdGFyZ2V0LWRpciBpbiBwYWNrYWdlICckbmFtZScuIik7Cn0KaWYgKCFlbXB0eSgkYXV0b2xvYWRbJ3Bzci00J10pKSB7CmZvcmVhY2ggKCRhdXRvbG9hZFsncHNyLTQnXSBhcyAkbmFtZXNwYWNlID0+ICRkaXJzKSB7CmlmICgkbmFtZXNwYWNlICE9PSAnJyAmJiAnXFwnICE9PSBzdWJzdHIoJG5hbWVzcGFjZSwgLTEpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJwc3ItNCBuYW1lc3BhY2VzIG11c3QgZW5kIHdpdGggYSBuYW1lc3BhY2Ugc2VwYXJhdG9yLCAnJG5hbWVzcGFjZScgZG9lcyBub3QsIHVzZSAnJG5hbWVzcGFjZVxcJy4iKTsKfQp9Cn0KfQoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHBhcnNlQXV0b2xvYWRzKGFycmF5ICRwYWNrYWdlTWFwLCBQYWNrYWdlSW50ZXJmYWNlICRyb290UGFja2FnZSwgJGZpbHRlcmVkRGV2UGFja2FnZXMgPSBmYWxzZSkKewokcm9vdFBhY2thZ2VNYXAgPSBhcnJheV9zaGlmdCgkcGFja2FnZU1hcCk7CmlmIChpc19hcnJheSgkZmlsdGVyZWREZXZQYWNrYWdlcykpIHsKJHBhY2thZ2VNYXAgPSBhcnJheV9maWx0ZXIoJHBhY2thZ2VNYXAsIHN0YXRpYyBmdW5jdGlvbiAoJGl0ZW0pIHVzZSAoJGZpbHRlcmVkRGV2UGFja2FnZXMpOiBib29sIHsKcmV0dXJuICFpbl9hcnJheSgkaXRlbVswXS0+Z2V0TmFtZSgpLCAkZmlsdGVyZWREZXZQYWNrYWdlcywgdHJ1ZSk7Cn0pOwp9IGVsc2VpZiAoJGZpbHRlcmVkRGV2UGFja2FnZXMpIHsKJHBhY2thZ2VNYXAgPSAkdGhpcy0+ZmlsdGVyUGFja2FnZU1hcCgkcGFja2FnZU1hcCwgJHJvb3RQYWNrYWdlKTsKfQokc29ydGVkUGFja2FnZU1hcCA9ICR0aGlzLT5zb3J0UGFja2FnZU1hcCgkcGFja2FnZU1hcCk7CiRzb3J0ZWRQYWNrYWdlTWFwW10gPSAkcm9vdFBhY2thZ2VNYXA7CiRyZXZlcnNlU29ydGVkTWFwID0gYXJyYXlfcmV2ZXJzZSgkc29ydGVkUGFja2FnZU1hcCk7CgoKCiRwc3IwID0gJHRoaXMtPnBhcnNlQXV0b2xvYWRzVHlwZSgkcmV2ZXJzZVNvcnRlZE1hcCwgJ3Bzci0wJywgJHJvb3RQYWNrYWdlKTsKJHBzcjQgPSAkdGhpcy0+cGFyc2VBdXRvbG9hZHNUeXBlKCRyZXZlcnNlU29ydGVkTWFwLCAncHNyLTQnLCAkcm9vdFBhY2thZ2UpOwokY2xhc3NtYXAgPSAkdGhpcy0+cGFyc2VBdXRvbG9hZHNUeXBlKCRyZXZlcnNlU29ydGVkTWFwLCAnY2xhc3NtYXAnLCAkcm9vdFBhY2thZ2UpOwoKCiRmaWxlcyA9ICR0aGlzLT5wYXJzZUF1dG9sb2Fkc1R5cGUoJHNvcnRlZFBhY2thZ2VNYXAsICdmaWxlcycsICRyb290UGFja2FnZSk7CgokZXhjbHVkZSA9ICR0aGlzLT5wYXJzZUF1dG9sb2Fkc1R5cGUoJHNvcnRlZFBhY2thZ2VNYXAsICdleGNsdWRlLWZyb20tY2xhc3NtYXAnLCAkcm9vdFBhY2thZ2UpOwoKa3Jzb3J0KCRwc3IwKTsKa3Jzb3J0KCRwc3I0KTsKCnJldHVybiBbCidwc3ItMCcgPT4gJHBzcjAsCidwc3ItNCcgPT4gJHBzcjQsCidjbGFzc21hcCcgPT4gJGNsYXNzbWFwLAonZmlsZXMnID0+ICRmaWxlcywKJ2V4Y2x1ZGUtZnJvbS1jbGFzc21hcCcgPT4gJGV4Y2x1ZGUsCl07Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjcmVhdGVMb2FkZXIoYXJyYXkgJGF1dG9sb2FkcywgP3N0cmluZyAkdmVuZG9yRGlyID0gbnVsbCkKewokbG9hZGVyID0gbmV3IENsYXNzTG9hZGVyKCR2ZW5kb3JEaXIpOwoKaWYgKGlzc2V0KCRhdXRvbG9hZHNbJ3Bzci0wJ10pKSB7CmZvcmVhY2ggKCRhdXRvbG9hZHNbJ3Bzci0wJ10gYXMgJG5hbWVzcGFjZSA9PiAkcGF0aCkgewokbG9hZGVyLT5hZGQoJG5hbWVzcGFjZSwgJHBhdGgpOwp9Cn0KCmlmIChpc3NldCgkYXV0b2xvYWRzWydwc3ItNCddKSkgewpmb3JlYWNoICgkYXV0b2xvYWRzWydwc3ItNCddIGFzICRuYW1lc3BhY2UgPT4gJHBhdGgpIHsKJGxvYWRlci0+YWRkUHNyNCgkbmFtZXNwYWNlLCAkcGF0aCk7Cn0KfQoKaWYgKGlzc2V0KCRhdXRvbG9hZHNbJ2NsYXNzbWFwJ10pKSB7CiRleGNsdWRlZCA9IFtdOwppZiAoIWVtcHR5KCRhdXRvbG9hZHNbJ2V4Y2x1ZGUtZnJvbS1jbGFzc21hcCddKSkgewokZXhjbHVkZWQgPSAkYXV0b2xvYWRzWydleGNsdWRlLWZyb20tY2xhc3NtYXAnXTsKfQoKJGNsYXNzTWFwR2VuZXJhdG9yID0gbmV3IENsYXNzTWFwR2VuZXJhdG9yKFsncGhwJywgJ2luYycsICdoaCddKTsKJGNsYXNzTWFwR2VuZXJhdG9yLT5hdm9pZER1cGxpY2F0ZVNjYW5zKCk7Cgpmb3JlYWNoICgkYXV0b2xvYWRzWydjbGFzc21hcCddIGFzICRkaXIpIHsKdHJ5IHsKJGNsYXNzTWFwR2VuZXJhdG9yLT5zY2FuUGF0aHMoJGRpciwgJHRoaXMtPmJ1aWxkRXhjbHVzaW9uUmVnZXgoJGRpciwgJGV4Y2x1ZGVkKSk7Cn0gY2F0Y2ggKFxSdW50aW1lRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Jy4kZS0+Z2V0TWVzc2FnZSgpLic8L3dhcm5pbmc+Jyk7Cn0KfQoKJGxvYWRlci0+YWRkQ2xhc3NNYXAoJGNsYXNzTWFwR2VuZXJhdG9yLT5nZXRDbGFzc01hcCgpLT5nZXRNYXAoKSk7Cn0KCnJldHVybiAkbG9hZGVyOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEluY2x1ZGVQYXRoc0ZpbGUoYXJyYXkgJHBhY2thZ2VNYXAsIEZpbGVzeXN0ZW0gJGZpbGVzeXN0ZW0sIHN0cmluZyAkYmFzZVBhdGgsIHN0cmluZyAkdmVuZG9yUGF0aCwgc3RyaW5nICR2ZW5kb3JQYXRoQ29kZSwgc3RyaW5nICRhcHBCYXNlRGlyQ29kZSkKewokaW5jbHVkZVBhdGhzID0gW107Cgpmb3JlYWNoICgkcGFja2FnZU1hcCBhcyAkaXRlbSkgewpbJHBhY2thZ2UsICRpbnN0YWxsUGF0aF0gPSAkaXRlbTsKCgppZiAobnVsbCA9PT0gJGluc3RhbGxQYXRoKSB7CmNvbnRpbnVlOwp9CgppZiAobnVsbCAhPT0gJHBhY2thZ2UtPmdldFRhcmdldERpcigpICYmIHN0cmxlbigkcGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCkpID4gMCkgewokaW5zdGFsbFBhdGggPSBzdWJzdHIoJGluc3RhbGxQYXRoLCAwLCAtc3RybGVuKCcvJy4kcGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCkpKTsKfQoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldEluY2x1ZGVQYXRocygpIGFzICRpbmNsdWRlUGF0aCkgewokaW5jbHVkZVBhdGggPSB0cmltKCRpbmNsdWRlUGF0aCwgJy8nKTsKJGluY2x1ZGVQYXRoc1tdID0gJGluc3RhbGxQYXRoID09PSAnJyA/ICRpbmNsdWRlUGF0aCA6ICRpbnN0YWxsUGF0aC4nLycuJGluY2x1ZGVQYXRoOwp9Cn0KCmlmIChcY291bnQoJGluY2x1ZGVQYXRocykgPT09IDApIHsKcmV0dXJuIG51bGw7Cn0KCiRpbmNsdWRlUGF0aHNDb2RlID0gJyc7CmZvcmVhY2ggKCRpbmNsdWRlUGF0aHMgYXMgJHBhdGgpIHsKJGluY2x1ZGVQYXRoc0NvZGUgLj0gIiAgICAiIC4gJHRoaXMtPmdldFBhdGhDb2RlKCRmaWxlc3lzdGVtLCAkYmFzZVBhdGgsICR2ZW5kb3JQYXRoLCAkcGF0aCkgLiAiLFxuIjsKfQoKcmV0dXJuIDw8PEVPRgo8P3BocAoKLy8gaW5jbHVkZV9wYXRocy5waHAgQGdlbmVyYXRlZCBieSBDb21wb3NlcgoKXCR2ZW5kb3JEaXIgPSAkdmVuZG9yUGF0aENvZGU7ClwkYmFzZURpciA9ICRhcHBCYXNlRGlyQ29kZTsKCnJldHVybiBhcnJheSgKJGluY2x1ZGVQYXRoc0NvZGUpOwoKRU9GOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEluY2x1ZGVGaWxlc0ZpbGUoYXJyYXkgJGZpbGVzLCBGaWxlc3lzdGVtICRmaWxlc3lzdGVtLCBzdHJpbmcgJGJhc2VQYXRoLCBzdHJpbmcgJHZlbmRvclBhdGgsIHN0cmluZyAkdmVuZG9yUGF0aENvZGUsIHN0cmluZyAkYXBwQmFzZURpckNvZGUpCnsKCiRmaWxlcyA9IGFycmF5X21hcCgKZnVuY3Rpb24gKHN0cmluZyAkZnVuY3Rpb25GaWxlKSB1c2UgKCRmaWxlc3lzdGVtLCAkYmFzZVBhdGgsICR2ZW5kb3JQYXRoKTogc3RyaW5nIHsKcmV0dXJuICR0aGlzLT5nZXRQYXRoQ29kZSgkZmlsZXN5c3RlbSwgJGJhc2VQYXRoLCAkdmVuZG9yUGF0aCwgJGZ1bmN0aW9uRmlsZSk7Cn0sCiRmaWxlcwopOwokdW5pcXVlRmlsZXMgPSBhcnJheV91bmlxdWUoJGZpbGVzKTsKaWYgKGNvdW50KCR1bmlxdWVGaWxlcykgPCBjb3VudCgkZmlsZXMpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+VGhlIGZvbGxvd2luZyAiZmlsZXMiIGF1dG9sb2FkIHJ1bGVzIGFyZSBpbmNsdWRlZCBtdWx0aXBsZSB0aW1lcywgdGhpcyBtYXkgY2F1c2UgaXNzdWVzIGFuZCBzaG91bGQgYmUgcmVzb2x2ZWQ6PC93YXJuaW5nPicpOwpmb3JlYWNoIChhcnJheV91bmlxdWUoYXJyYXlfZGlmZl9hc3NvYygkZmlsZXMsICR1bmlxdWVGaWxlcykpIGFzICRkdXBsaWNhdGVGaWxlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+IC0gJy4kZHVwbGljYXRlRmlsZS4nPC93YXJuaW5nPicpOwp9Cn0KdW5zZXQoJHVuaXF1ZUZpbGVzKTsKCiRmaWxlc0NvZGUgPSAnJzsKCmZvcmVhY2ggKCRmaWxlcyBhcyAkZmlsZUlkZW50aWZpZXIgPT4gJGZ1bmN0aW9uRmlsZSkgewokZmlsZXNDb2RlIC49ICcgICAgJyAuIHZhcl9leHBvcnQoJGZpbGVJZGVudGlmaWVyLCB0cnVlKSAuICcgPT4gJyAuICRmdW5jdGlvbkZpbGUgLiAiLFxuIjsKfQoKaWYgKCEkZmlsZXNDb2RlKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gPDw8RU9GCjw/cGhwCgovLyBhdXRvbG9hZF9maWxlcy5waHAgQGdlbmVyYXRlZCBieSBDb21wb3NlcgoKXCR2ZW5kb3JEaXIgPSAkdmVuZG9yUGF0aENvZGU7ClwkYmFzZURpciA9ICRhcHBCYXNlRGlyQ29kZTsKCnJldHVybiBhcnJheSgKJGZpbGVzQ29kZSk7CgpFT0Y7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRQYXRoQ29kZShGaWxlc3lzdGVtICRmaWxlc3lzdGVtLCBzdHJpbmcgJGJhc2VQYXRoLCBzdHJpbmcgJHZlbmRvclBhdGgsIHN0cmluZyAkcGF0aCkKewppZiAoISRmaWxlc3lzdGVtLT5pc0Fic29sdXRlUGF0aCgkcGF0aCkpIHsKJHBhdGggPSAkYmFzZVBhdGggLiAnLycgLiAkcGF0aDsKfQokcGF0aCA9ICRmaWxlc3lzdGVtLT5ub3JtYWxpemVQYXRoKCRwYXRoKTsKCiRiYXNlRGlyID0gJyc7CmlmIChzdHJwb3MoJHBhdGguJy8nLCAkdmVuZG9yUGF0aC4nLycpID09PSAwKSB7CiRwYXRoID0gKHN0cmluZykgc3Vic3RyKCRwYXRoLCBzdHJsZW4oJHZlbmRvclBhdGgpKTsKJGJhc2VEaXIgPSAnJHZlbmRvckRpciAuICc7Cn0gZWxzZSB7CiRwYXRoID0gJGZpbGVzeXN0ZW0tPm5vcm1hbGl6ZVBhdGgoJGZpbGVzeXN0ZW0tPmZpbmRTaG9ydGVzdFBhdGgoJGJhc2VQYXRoLCAkcGF0aCwgdHJ1ZSkpOwppZiAoISRmaWxlc3lzdGVtLT5pc0Fic29sdXRlUGF0aCgkcGF0aCkpIHsKJGJhc2VEaXIgPSAnJGJhc2VEaXIgLiAnOwokcGF0aCA9ICcvJyAuICRwYXRoOwp9Cn0KCmlmIChQcmVnOjppc01hdGNoKCd7XC5waGFyKFtcXFxcL118JCl9JywgJHBhdGgpKSB7CiRiYXNlRGlyID0gIidwaGFyOi8vJyAuICIgLiAkYmFzZURpcjsKfQoKcmV0dXJuICRiYXNlRGlyIC4gdmFyX2V4cG9ydCgkcGF0aCwgdHJ1ZSk7Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRQbGF0Zm9ybUNoZWNrKGFycmF5ICRwYWNrYWdlTWFwLCAkY2hlY2tQbGF0Zm9ybSwgYXJyYXkgJGRldlBhY2thZ2VOYW1lcykKewokbG93ZXN0UGhwVmVyc2lvbiA9IEJvdW5kOjp6ZXJvKCk7CiRyZXF1aXJlZFBocDY0Yml0ID0gZmFsc2U7CiRyZXF1aXJlZEV4dGVuc2lvbnMgPSBbXTsKJGV4dGVuc2lvblByb3ZpZGVycyA9IFtdOwoKZm9yZWFjaCAoJHBhY2thZ2VNYXAgYXMgJGl0ZW0pIHsKJHBhY2thZ2UgPSAkaXRlbVswXTsKZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJHBhY2thZ2UtPmdldFJlcGxhY2VzKCksICRwYWNrYWdlLT5nZXRQcm92aWRlcygpKSBhcyAkbGluaykgewppZiAoUHJlZzo6aXNNYXRjaCgne15leHQtKC4rKSR9aUQnLCAkbGluay0+Z2V0VGFyZ2V0KCksICRtYXRjaCkpIHsKJGV4dGVuc2lvblByb3ZpZGVyc1skbWF0Y2hbMV1dW10gPSAkbGluay0+Z2V0Q29uc3RyYWludCgpOwp9Cn0KfQoKZm9yZWFjaCAoJHBhY2thZ2VNYXAgYXMgJGl0ZW0pIHsKJHBhY2thZ2UgPSAkaXRlbVswXTsKCmlmIChpbl9hcnJheSgkcGFja2FnZS0+Z2V0TmFtZSgpLCAkZGV2UGFja2FnZU5hbWVzLCB0cnVlKSkgewpjb250aW51ZTsKfQoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcXVpcmVzKCkgYXMgJGxpbmspIHsKaWYgKCR0aGlzLT5wbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLT5pc0lnbm9yZWQoJGxpbmstPmdldFRhcmdldCgpKSkgewpjb250aW51ZTsKfQoKaWYgKGluX2FycmF5KCRsaW5rLT5nZXRUYXJnZXQoKSwgWydwaHAnLCAncGhwLTY0Yml0J10sIHRydWUpKSB7CiRjb25zdHJhaW50ID0gJGxpbmstPmdldENvbnN0cmFpbnQoKTsKaWYgKCRjb25zdHJhaW50LT5nZXRMb3dlckJvdW5kKCktPmNvbXBhcmVUbygkbG93ZXN0UGhwVmVyc2lvbiwgJz4nKSkgewokbG93ZXN0UGhwVmVyc2lvbiA9ICRjb25zdHJhaW50LT5nZXRMb3dlckJvdW5kKCk7Cn0KfQoKaWYgKCdwaHAtNjRiaXQnID09PSAkbGluay0+Z2V0VGFyZ2V0KCkpIHsKJHJlcXVpcmVkUGhwNjRiaXQgPSB0cnVlOwp9CgppZiAoJGNoZWNrUGxhdGZvcm0gPT09IHRydWUgJiYgUHJlZzo6aXNNYXRjaCgne15leHQtKC4rKSR9aUQnLCAkbGluay0+Z2V0VGFyZ2V0KCksICRtYXRjaCkpIHsKCmlmIChpc3NldCgkZXh0ZW5zaW9uUHJvdmlkZXJzWyRtYXRjaFsxXV0pKSB7CmZvcmVhY2ggKCRleHRlbnNpb25Qcm92aWRlcnNbJG1hdGNoWzFdXSBhcyAkcHJvdmlkZWQpIHsKaWYgKCRwcm92aWRlZC0+bWF0Y2hlcygkbGluay0+Z2V0Q29uc3RyYWludCgpKSkgewpjb250aW51ZSAyOwp9Cn0KfQoKaWYgKCRtYXRjaFsxXSA9PT0gJ3plbmQtb3BjYWNoZScpIHsKJG1hdGNoWzFdID0gJ3plbmQgb3BjYWNoZSc7Cn0KCiRleHRlbnNpb24gPSB2YXJfZXhwb3J0KCRtYXRjaFsxXSwgdHJ1ZSk7CmlmICgkbWF0Y2hbMV0gPT09ICdwY250bCcgfHwgJG1hdGNoWzFdID09PSAncmVhZGxpbmUnKSB7CiRyZXF1aXJlZEV4dGVuc2lvbnNbJGV4dGVuc2lvbl0gPSAiUEhQX1NBUEkgIT09ICdjbGknIHx8IGV4dGVuc2lvbl9sb2FkZWQoJGV4dGVuc2lvbikgfHwgXCRtaXNzaW5nRXh0ZW5zaW9uc1tdID0gJGV4dGVuc2lvbjtcbiI7Cn0gZWxzZSB7CiRyZXF1aXJlZEV4dGVuc2lvbnNbJGV4dGVuc2lvbl0gPSAiZXh0ZW5zaW9uX2xvYWRlZCgkZXh0ZW5zaW9uKSB8fCBcJG1pc3NpbmdFeHRlbnNpb25zW10gPSAkZXh0ZW5zaW9uO1xuIjsKfQp9Cn0KfQoKa3NvcnQoJHJlcXVpcmVkRXh0ZW5zaW9ucyk7CgokZm9ybWF0VG9QaHBWZXJzaW9uSWQgPSBzdGF0aWMgZnVuY3Rpb24gKEJvdW5kICRib3VuZCk6IGludCB7CmlmICgkYm91bmQtPmlzWmVybygpKSB7CnJldHVybiAwOwp9CgppZiAoJGJvdW5kLT5pc1Bvc2l0aXZlSW5maW5pdHkoKSkgewpyZXR1cm4gOTk5OTk7Cn0KCiR2ZXJzaW9uID0gc3RyX3JlcGxhY2UoJy0nLCAnLicsICRib3VuZC0+Z2V0VmVyc2lvbigpKTsKJGNodW5rcyA9IGFycmF5X21hcCgnaW50dmFsJywgZXhwbG9kZSgnLicsICR2ZXJzaW9uKSk7CgpyZXR1cm4gJGNodW5rc1swXSAqIDEwMDAwICsgJGNodW5rc1sxXSAqIDEwMCArICRjaHVua3NbMl07Cn07CgokZm9ybWF0VG9IdW1hblJlYWRhYmxlID0gc3RhdGljIGZ1bmN0aW9uIChCb3VuZCAkYm91bmQpIHsKaWYgKCRib3VuZC0+aXNaZXJvKCkpIHsKcmV0dXJuIDA7Cn0KCmlmICgkYm91bmQtPmlzUG9zaXRpdmVJbmZpbml0eSgpKSB7CnJldHVybiA5OTk5OTsKfQoKJHZlcnNpb24gPSBzdHJfcmVwbGFjZSgnLScsICcuJywgJGJvdW5kLT5nZXRWZXJzaW9uKCkpOwokY2h1bmtzID0gZXhwbG9kZSgnLicsICR2ZXJzaW9uKTsKJGNodW5rcyA9IGFycmF5X3NsaWNlKCRjaHVua3MsIDAsIDMpOwoKcmV0dXJuIGltcGxvZGUoJy4nLCAkY2h1bmtzKTsKfTsKCiRyZXF1aXJlZFBocCA9ICcnOwokcmVxdWlyZWRQaHBFcnJvciA9ICcnOwppZiAoISRsb3dlc3RQaHBWZXJzaW9uLT5pc1plcm8oKSkgewokb3BlcmF0b3IgPSAkbG93ZXN0UGhwVmVyc2lvbi0+aXNJbmNsdXNpdmUoKSA/ICc+PScgOiAnPic7CiRyZXF1aXJlZFBocCA9ICdQSFBfVkVSU0lPTl9JRCAnLiRvcGVyYXRvci4nICcuJGZvcm1hdFRvUGhwVmVyc2lvbklkKCRsb3dlc3RQaHBWZXJzaW9uKTsKJHJlcXVpcmVkUGhwRXJyb3IgPSAnIicuJG9wZXJhdG9yLicgJy4kZm9ybWF0VG9IdW1hblJlYWRhYmxlKCRsb3dlc3RQaHBWZXJzaW9uKS4nIic7Cn0KCmlmICgkcmVxdWlyZWRQaHApIHsKJHJlcXVpcmVkUGhwID0gPDw8UEhQX0NIRUNLCgppZiAoISgkcmVxdWlyZWRQaHApKSB7CiAgICBcJGlzc3Vlc1tdID0gJ1lvdXIgQ29tcG9zZXIgZGVwZW5kZW5jaWVzIHJlcXVpcmUgYSBQSFAgdmVyc2lvbiAkcmVxdWlyZWRQaHBFcnJvci4gWW91IGFyZSBydW5uaW5nICcgLiBQSFBfVkVSU0lPTiAuICcuJzsKfQoKUEhQX0NIRUNLOwp9CgppZiAoJHJlcXVpcmVkUGhwNjRiaXQpIHsKJHJlcXVpcmVkUGhwIC49IDw8PFBIUF9DSEVDSwoKaWYgKFBIUF9JTlRfU0laRSAhPT0gOCkgewogICAgXCRpc3N1ZXNbXSA9ICdZb3VyIENvbXBvc2VyIGRlcGVuZGVuY2llcyByZXF1aXJlIGEgNjQtYml0IGJ1aWxkIG9mIFBIUC4nOwp9CgpQSFBfQ0hFQ0s7Cn0KCiRyZXF1aXJlZEV4dGVuc2lvbnMgPSBpbXBsb2RlKCcnLCAkcmVxdWlyZWRFeHRlbnNpb25zKTsKaWYgKCcnICE9PSAkcmVxdWlyZWRFeHRlbnNpb25zKSB7CiRyZXF1aXJlZEV4dGVuc2lvbnMgPSA8PDxFWFRfQ0hFQ0tTCgpcJG1pc3NpbmdFeHRlbnNpb25zID0gYXJyYXkoKTsKJHJlcXVpcmVkRXh0ZW5zaW9ucwppZiAoXCRtaXNzaW5nRXh0ZW5zaW9ucykgewogICAgXCRpc3N1ZXNbXSA9ICdZb3VyIENvbXBvc2VyIGRlcGVuZGVuY2llcyByZXF1aXJlIHRoZSBmb2xsb3dpbmcgUEhQIGV4dGVuc2lvbnMgdG8gYmUgaW5zdGFsbGVkOiAnIC4gaW1wbG9kZSgnLCAnLCBcJG1pc3NpbmdFeHRlbnNpb25zKSAuICcuJzsKfQoKRVhUX0NIRUNLUzsKfQoKaWYgKCEkcmVxdWlyZWRQaHAgJiYgISRyZXF1aXJlZEV4dGVuc2lvbnMpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiA8PDxQTEFURk9STV9DSEVDSwo8P3BocAoKLy8gcGxhdGZvcm1fY2hlY2sucGhwIEBnZW5lcmF0ZWQgYnkgQ29tcG9zZXIKClwkaXNzdWVzID0gYXJyYXkoKTsKeyRyZXF1aXJlZFBocH17JHJlcXVpcmVkRXh0ZW5zaW9uc30KaWYgKFwkaXNzdWVzKSB7CiAgICBpZiAoIWhlYWRlcnNfc2VudCgpKSB7CiAgICAgICAgaGVhZGVyKCdIVFRQLzEuMSA1MDAgSW50ZXJuYWwgU2VydmVyIEVycm9yJyk7CiAgICB9CiAgICBpZiAoIWluaV9nZXQoJ2Rpc3BsYXlfZXJyb3JzJykpIHsKICAgICAgICBpZiAoUEhQX1NBUEkgPT09ICdjbGknIHx8IFBIUF9TQVBJID09PSAncGhwZGJnJykgewogICAgICAgICAgICBmd3JpdGUoU1RERVJSLCAnQ29tcG9zZXIgZGV0ZWN0ZWQgaXNzdWVzIGluIHlvdXIgcGxhdGZvcm06JyAuIFBIUF9FT0wuUEhQX0VPTCAuIGltcGxvZGUoUEhQX0VPTCwgXCRpc3N1ZXMpIC4gUEhQX0VPTC5QSFBfRU9MKTsKICAgICAgICB9IGVsc2VpZiAoIWhlYWRlcnNfc2VudCgpKSB7CiAgICAgICAgICAgIGVjaG8gJ0NvbXBvc2VyIGRldGVjdGVkIGlzc3VlcyBpbiB5b3VyIHBsYXRmb3JtOicgLiBQSFBfRU9MLlBIUF9FT0wgLiBzdHJfcmVwbGFjZSgnWW91IGFyZSBydW5uaW5nICcuUEhQX1ZFUlNJT04uJy4nLCAnJywgaW1wbG9kZShQSFBfRU9MLCBcJGlzc3VlcykpIC4gUEhQX0VPTC5QSFBfRU9MOwogICAgICAgIH0KICAgIH0KICAgIHRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigKICAgICAgICAnQ29tcG9zZXIgZGV0ZWN0ZWQgaXNzdWVzIGluIHlvdXIgcGxhdGZvcm06ICcgLiBpbXBsb2RlKCcgJywgXCRpc3N1ZXMpCiAgICApOwp9CgpQTEFURk9STV9DSEVDSzsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEF1dG9sb2FkRmlsZShzdHJpbmcgJHZlbmRvclBhdGhUb1RhcmdldERpckNvZGUsIHN0cmluZyAkc3VmZml4KQp7CiRsYXN0Q2hhciA9ICR2ZW5kb3JQYXRoVG9UYXJnZXREaXJDb2RlW3N0cmxlbigkdmVuZG9yUGF0aFRvVGFyZ2V0RGlyQ29kZSkgLSAxXTsKaWYgKCInIiA9PT0gJGxhc3RDaGFyIHx8ICciJyA9PT0gJGxhc3RDaGFyKSB7CiR2ZW5kb3JQYXRoVG9UYXJnZXREaXJDb2RlID0gc3Vic3RyKCR2ZW5kb3JQYXRoVG9UYXJnZXREaXJDb2RlLCAwLCAtMSkuJy9hdXRvbG9hZF9yZWFsLnBocCcuJGxhc3RDaGFyOwp9IGVsc2UgewokdmVuZG9yUGF0aFRvVGFyZ2V0RGlyQ29kZSAuPSAiIC4gJy9hdXRvbG9hZF9yZWFsLnBocCciOwp9CgpyZXR1cm4gPDw8QVVUT0xPQUQKPD9waHAKCi8vIGF1dG9sb2FkLnBocCBAZ2VuZXJhdGVkIGJ5IENvbXBvc2VyCgppZiAoUEhQX1ZFUlNJT05fSUQgPCA1MDYwMCkgewogICAgaWYgKCFoZWFkZXJzX3NlbnQoKSkgewogICAgICAgIGhlYWRlcignSFRUUC8xLjEgNTAwIEludGVybmFsIFNlcnZlciBFcnJvcicpOwogICAgfQogICAgXCRlcnIgPSAnQ29tcG9zZXIgMi4zLjAgZHJvcHBlZCBzdXBwb3J0IGZvciBhdXRvbG9hZGluZyBvbiBQSFAgPDUuNiBhbmQgeW91IGFyZSBydW5uaW5nICcuUEhQX1ZFUlNJT04uJywgcGxlYXNlIHVwZ3JhZGUgUEhQIG9yIHVzZSBDb21wb3NlciAyLjIgTFRTIHZpYSAiY29tcG9zZXIgc2VsZi11cGRhdGUgLS0yLjIiLiBBYm9ydGluZy4nLlBIUF9FT0w7CiAgICBpZiAoIWluaV9nZXQoJ2Rpc3BsYXlfZXJyb3JzJykpIHsKICAgICAgICBpZiAoUEhQX1NBUEkgPT09ICdjbGknIHx8IFBIUF9TQVBJID09PSAncGhwZGJnJykgewogICAgICAgICAgICBmd3JpdGUoU1RERVJSLCBcJGVycik7CiAgICAgICAgfSBlbHNlaWYgKCFoZWFkZXJzX3NlbnQoKSkgewogICAgICAgICAgICBlY2hvIFwkZXJyOwogICAgICAgIH0KICAgIH0KICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFwkZXJyKTsKfQoKcmVxdWlyZV9vbmNlICR2ZW5kb3JQYXRoVG9UYXJnZXREaXJDb2RlOwoKcmV0dXJuIENvbXBvc2VyQXV0b2xvYWRlckluaXQkc3VmZml4OjpnZXRMb2FkZXIoKTsKCkFVVE9MT0FEOwp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0QXV0b2xvYWRSZWFsRmlsZShib29sICR1c2VDbGFzc01hcCwgYm9vbCAkdXNlSW5jbHVkZVBhdGgsID9zdHJpbmcgJHRhcmdldERpckxvYWRlciwgYm9vbCAkdXNlSW5jbHVkZUZpbGVzLCBzdHJpbmcgJHZlbmRvclBhdGhDb2RlLCBzdHJpbmcgJGFwcEJhc2VEaXJDb2RlLCBzdHJpbmcgJHN1ZmZpeCwgYm9vbCAkdXNlR2xvYmFsSW5jbHVkZVBhdGgsIHN0cmluZyAkcHJlcGVuZEF1dG9sb2FkZXIsIGJvb2wgJGNoZWNrUGxhdGZvcm0pCnsKJGZpbGUgPSA8PDxIRUFERVIKPD9waHAKCi8vIGF1dG9sb2FkX3JlYWwucGhwIEBnZW5lcmF0ZWQgYnkgQ29tcG9zZXIKCmNsYXNzIENvbXBvc2VyQXV0b2xvYWRlckluaXQkc3VmZml4CnsKICAgIHByaXZhdGUgc3RhdGljIFwkbG9hZGVyOwoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbG9hZENsYXNzTG9hZGVyKFwkY2xhc3MpCiAgICB7CiAgICAgICAgaWYgKCdDb21wb3NlclxcQXV0b2xvYWRcXENsYXNzTG9hZGVyJyA9PT0gXCRjbGFzcykgewogICAgICAgICAgICByZXF1aXJlIF9fRElSX18gLiAnL0NsYXNzTG9hZGVyLnBocCc7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRMb2FkZXIoKQogICAgewogICAgICAgIGlmIChudWxsICE9PSBzZWxmOjpcJGxvYWRlcikgewogICAgICAgICAgICByZXR1cm4gc2VsZjo6XCRsb2FkZXI7CiAgICAgICAgfQoKCkhFQURFUjsKCmlmICgkY2hlY2tQbGF0Zm9ybSkgewokZmlsZSAuPSA8PDwnUExBVEZPUk1fQ0hFQ0snCiAgICAgICAgcmVxdWlyZSBfX0RJUl9fIC4gJy9wbGF0Zm9ybV9jaGVjay5waHAnOwoKClBMQVRGT1JNX0NIRUNLOwp9CgokZmlsZSAuPSA8PDxDTEFTU0xPQURFUl9JTklUCiAgICAgICAgc3BsX2F1dG9sb2FkX3JlZ2lzdGVyKGFycmF5KCdDb21wb3NlckF1dG9sb2FkZXJJbml0JHN1ZmZpeCcsICdsb2FkQ2xhc3NMb2FkZXInKSwgdHJ1ZSwgJHByZXBlbmRBdXRvbG9hZGVyKTsKICAgICAgICBzZWxmOjpcJGxvYWRlciA9IFwkbG9hZGVyID0gbmV3IFxcQ29tcG9zZXJcXEF1dG9sb2FkXFxDbGFzc0xvYWRlcihcXGRpcm5hbWUoX19ESVJfXykpOwogICAgICAgIHNwbF9hdXRvbG9hZF91bnJlZ2lzdGVyKGFycmF5KCdDb21wb3NlckF1dG9sb2FkZXJJbml0JHN1ZmZpeCcsICdsb2FkQ2xhc3NMb2FkZXInKSk7CgoKQ0xBU1NMT0FERVJfSU5JVDsKCmlmICgkdXNlSW5jbHVkZVBhdGgpIHsKJGZpbGUgLj0gPDw8J0lOQ0xVREVfUEFUSCcKICAgICAgICAkaW5jbHVkZVBhdGhzID0gcmVxdWlyZSBfX0RJUl9fIC4gJy9pbmNsdWRlX3BhdGhzLnBocCc7CiAgICAgICAgJGluY2x1ZGVQYXRoc1tdID0gZ2V0X2luY2x1ZGVfcGF0aCgpOwogICAgICAgIHNldF9pbmNsdWRlX3BhdGgoaW1wbG9kZShQQVRIX1NFUEFSQVRPUiwgJGluY2x1ZGVQYXRocykpOwoKCklOQ0xVREVfUEFUSDsKfQoKCiRmaWxlIC49IDw8PFNUQVRJQ19JTklUCiAgICAgICAgcmVxdWlyZSBfX0RJUl9fIC4gJy9hdXRvbG9hZF9zdGF0aWMucGhwJzsKICAgICAgICBjYWxsX3VzZXJfZnVuYyhcQ29tcG9zZXJcQXV0b2xvYWRcQ29tcG9zZXJTdGF0aWNJbml0JHN1ZmZpeDo6Z2V0SW5pdGlhbGl6ZXIoXCRsb2FkZXIpKTsKCgpTVEFUSUNfSU5JVDsKCmlmICgkdGhpcy0+Y2xhc3NNYXBBdXRob3JpdGF0aXZlKSB7CiRmaWxlIC49IDw8PCdDTEFTU01BUEFVVEhPUklUQVRJVkUnCiAgICAgICAgJGxvYWRlci0+c2V0Q2xhc3NNYXBBdXRob3JpdGF0aXZlKHRydWUpOwoKQ0xBU1NNQVBBVVRIT1JJVEFUSVZFOwp9CgppZiAoJHRoaXMtPmFwY3UpIHsKJGFwY3VQcmVmaXggPSB2YXJfZXhwb3J0KCgkdGhpcy0+YXBjdVByZWZpeCAhPT0gbnVsbCA/ICR0aGlzLT5hcGN1UHJlZml4IDogYmluMmhleChyYW5kb21fYnl0ZXMoMTApKSksIHRydWUpOwokZmlsZSAuPSA8PDxBUENVCiAgICAgICAgXCRsb2FkZXItPnNldEFwY3VQcmVmaXgoJGFwY3VQcmVmaXgpOwoKQVBDVTsKfQoKaWYgKCR1c2VHbG9iYWxJbmNsdWRlUGF0aCkgewokZmlsZSAuPSA8PDwnSU5DTFVERVBBVEgnCiAgICAgICAgJGxvYWRlci0+c2V0VXNlSW5jbHVkZVBhdGgodHJ1ZSk7CgpJTkNMVURFUEFUSDsKfQoKaWYgKCR0YXJnZXREaXJMb2FkZXIpIHsKJGZpbGUgLj0gPDw8UkVHSVNURVJfVEFSR0VUX0RJUl9BVVRPTE9BRAogICAgICAgIHNwbF9hdXRvbG9hZF9yZWdpc3RlcihhcnJheSgnQ29tcG9zZXJBdXRvbG9hZGVySW5pdCRzdWZmaXgnLCAnYXV0b2xvYWQnKSwgdHJ1ZSwgdHJ1ZSk7CgoKUkVHSVNURVJfVEFSR0VUX0RJUl9BVVRPTE9BRDsKfQoKJGZpbGUgLj0gPDw8UkVHSVNURVJfTE9BREVSCiAgICAgICAgXCRsb2FkZXItPnJlZ2lzdGVyKCRwcmVwZW5kQXV0b2xvYWRlcik7CgoKUkVHSVNURVJfTE9BREVSOwoKaWYgKCR1c2VJbmNsdWRlRmlsZXMpIHsKJGZpbGUgLj0gPDw8SU5DTFVERV9GSUxFUwogICAgICAgIFwkZmlsZXNUb0xvYWQgPSBcQ29tcG9zZXJcQXV0b2xvYWRcQ29tcG9zZXJTdGF0aWNJbml0JHN1ZmZpeDo6XCRmaWxlczsKICAgICAgICBcJHJlcXVpcmVGaWxlID0gXENsb3N1cmU6OmJpbmQoc3RhdGljIGZ1bmN0aW9uIChcJGZpbGVJZGVudGlmaWVyLCBcJGZpbGUpIHsKICAgICAgICAgICAgaWYgKGVtcHR5KFwkR0xPQkFMU1snX19jb21wb3Nlcl9hdXRvbG9hZF9maWxlcyddW1wkZmlsZUlkZW50aWZpZXJdKSkgewogICAgICAgICAgICAgICAgXCRHTE9CQUxTWydfX2NvbXBvc2VyX2F1dG9sb2FkX2ZpbGVzJ11bXCRmaWxlSWRlbnRpZmllcl0gPSB0cnVlOwoKICAgICAgICAgICAgICAgIHJlcXVpcmUgXCRmaWxlOwogICAgICAgICAgICB9CiAgICAgICAgfSwgbnVsbCwgbnVsbCk7CiAgICAgICAgZm9yZWFjaCAoXCRmaWxlc1RvTG9hZCBhcyBcJGZpbGVJZGVudGlmaWVyID0+IFwkZmlsZSkgewogICAgICAgICAgICBcJHJlcXVpcmVGaWxlKFwkZmlsZUlkZW50aWZpZXIsIFwkZmlsZSk7CiAgICAgICAgfQoKCklOQ0xVREVfRklMRVM7Cn0KCiRmaWxlIC49IDw8PE1FVEhPRF9GT09URVIKICAgICAgICByZXR1cm4gXCRsb2FkZXI7CiAgICB9CgpNRVRIT0RfRk9PVEVSOwoKJGZpbGUgLj0gJHRhcmdldERpckxvYWRlcjsKCnJldHVybiAkZmlsZSAuIDw8PEZPT1RFUgp9CgpGT09URVI7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFN0YXRpY0ZpbGUoc3RyaW5nICRzdWZmaXgsIHN0cmluZyAkdGFyZ2V0RGlyLCBzdHJpbmcgJHZlbmRvclBhdGgsIHN0cmluZyAkYmFzZVBhdGgpCnsKJGZpbGUgPSA8PDxIRUFERVIKPD9waHAKCi8vIGF1dG9sb2FkX3N0YXRpYy5waHAgQGdlbmVyYXRlZCBieSBDb21wb3NlcgoKbmFtZXNwYWNlIENvbXBvc2VyXEF1dG9sb2FkOwoKY2xhc3MgQ29tcG9zZXJTdGF0aWNJbml0JHN1ZmZpeAp7CgpIRUFERVI7CgokbG9hZGVyID0gbmV3IENsYXNzTG9hZGVyKCk7CgokbWFwID0gcmVxdWlyZSAkdGFyZ2V0RGlyIC4gJy9hdXRvbG9hZF9uYW1lc3BhY2VzLnBocCc7CmZvcmVhY2ggKCRtYXAgYXMgJG5hbWVzcGFjZSA9PiAkcGF0aCkgewokbG9hZGVyLT5zZXQoJG5hbWVzcGFjZSwgJHBhdGgpOwp9CgokbWFwID0gcmVxdWlyZSAkdGFyZ2V0RGlyIC4gJy9hdXRvbG9hZF9wc3I0LnBocCc7CmZvcmVhY2ggKCRtYXAgYXMgJG5hbWVzcGFjZSA9PiAkcGF0aCkgewokbG9hZGVyLT5zZXRQc3I0KCRuYW1lc3BhY2UsICRwYXRoKTsKfQoKCgoKCiRjbGFzc01hcCA9IHJlcXVpcmUgJHRhcmdldERpciAuICcvYXV0b2xvYWRfY2xhc3NtYXAucGhwJzsKaWYgKCRjbGFzc01hcCkgewokbG9hZGVyLT5hZGRDbGFzc01hcCgkY2xhc3NNYXApOwp9CgokZmlsZXN5c3RlbSA9IG5ldyBGaWxlc3lzdGVtKCk7CgokdmVuZG9yUGF0aENvZGUgPSAnID0+ICcgLiAkZmlsZXN5c3RlbS0+ZmluZFNob3J0ZXN0UGF0aENvZGUocmVhbHBhdGgoJHRhcmdldERpciksICR2ZW5kb3JQYXRoLCB0cnVlLCB0cnVlKSAuICIgLiAnLyI7CiR2ZW5kb3JQaGFyUGF0aENvZGUgPSAnID0+IFwncGhhcjovL1wnIC4gJyAuICRmaWxlc3lzdGVtLT5maW5kU2hvcnRlc3RQYXRoQ29kZShyZWFscGF0aCgkdGFyZ2V0RGlyKSwgJHZlbmRvclBhdGgsIHRydWUsIHRydWUpIC4gIiAuICcvIjsKJGFwcEJhc2VEaXJDb2RlID0gJyA9PiAnIC4gJGZpbGVzeXN0ZW0tPmZpbmRTaG9ydGVzdFBhdGhDb2RlKHJlYWxwYXRoKCR0YXJnZXREaXIpLCAkYmFzZVBhdGgsIHRydWUsIHRydWUpIC4gIiAuICcvIjsKJGFwcEJhc2VEaXJQaGFyQ29kZSA9ICcgPT4gXCdwaGFyOi8vXCcgLiAnIC4gJGZpbGVzeXN0ZW0tPmZpbmRTaG9ydGVzdFBhdGhDb2RlKHJlYWxwYXRoKCR0YXJnZXREaXIpLCAkYmFzZVBhdGgsIHRydWUsIHRydWUpIC4gIiAuICcvIjsKCiRhYnNvbHV0ZVZlbmRvclBhdGhDb2RlID0gJyA9PiAnIC4gc3Vic3RyKHZhcl9leHBvcnQocnRyaW0oJHZlbmRvckRpciwgJ1xcLycpIC4gJy8nLCB0cnVlKSwgMCwgLTEpOwokYWJzb2x1dGVWZW5kb3JQaGFyUGF0aENvZGUgPSAnID0+ICcgLiBzdWJzdHIodmFyX2V4cG9ydChydHJpbSgncGhhcjovLycgLiAkdmVuZG9yRGlyLCAnXFwvJykgLiAnLycsIHRydWUpLCAwLCAtMSk7CiRhYnNvbHV0ZUFwcEJhc2VEaXJDb2RlID0gJyA9PiAnIC4gc3Vic3RyKHZhcl9leHBvcnQocnRyaW0oJGJhc2VEaXIsICdcXC8nKSAuICcvJywgdHJ1ZSksIDAsIC0xKTsKJGFic29sdXRlQXBwQmFzZURpclBoYXJDb2RlID0gJyA9PiAnIC4gc3Vic3RyKHZhcl9leHBvcnQocnRyaW0oJ3BoYXI6Ly8nIC4gJGJhc2VEaXIsICdcXC8nKSAuICcvJywgdHJ1ZSksIDAsIC0xKTsKCiRpbml0aWFsaXplciA9ICcnOwokcHJlZml4ID0gIlwwQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXJcMCI7CiRwcmVmaXhMZW4gPSBzdHJsZW4oJHByZWZpeCk7CmlmIChmaWxlX2V4aXN0cygkdGFyZ2V0RGlyIC4gJy9hdXRvbG9hZF9maWxlcy5waHAnKSkgewokbWFwcyA9IFsnZmlsZXMnID0+IHJlcXVpcmUgJHRhcmdldERpciAuICcvYXV0b2xvYWRfZmlsZXMucGhwJ107Cn0gZWxzZSB7CiRtYXBzID0gW107Cn0KCmZvcmVhY2ggKChhcnJheSkgJGxvYWRlciBhcyAkcHJvcCA9PiAkdmFsdWUpIHsKaWYgKCFpc19hcnJheSgkdmFsdWUpIHx8IFxjb3VudCgkdmFsdWUpID09PSAwIHx8ICFzdHJfc3RhcnRzX3dpdGgoJHByb3AsICRwcmVmaXgpKSB7CmNvbnRpbnVlOwp9CiRtYXBzW3N1YnN0cigkcHJvcCwgJHByZWZpeExlbildID0gJHZhbHVlOwp9Cgpmb3JlYWNoICgkbWFwcyBhcyAkcHJvcCA9PiAkdmFsdWUpIHsKJHZhbHVlID0gc3RydHIoCnZhcl9leHBvcnQoJHZhbHVlLCB0cnVlKSwKWwokYWJzb2x1dGVWZW5kb3JQYXRoQ29kZSA9PiAkdmVuZG9yUGF0aENvZGUsCiRhYnNvbHV0ZVZlbmRvclBoYXJQYXRoQ29kZSA9PiAkdmVuZG9yUGhhclBhdGhDb2RlLAokYWJzb2x1dGVBcHBCYXNlRGlyQ29kZSA9PiAkYXBwQmFzZURpckNvZGUsCiRhYnNvbHV0ZUFwcEJhc2VEaXJQaGFyQ29kZSA9PiAkYXBwQmFzZURpclBoYXJDb2RlLApdCik7CiR2YWx1ZSA9IGx0cmltKFByZWc6OnJlcGxhY2UoJy9eICovbScsICcgICAgJDAkMCcsICR2YWx1ZSkpOwokdmFsdWUgPSBQcmVnOjpyZXBsYWNlKCcvICskL20nLCAnJywgJHZhbHVlKTsKCiRmaWxlIC49IHNwcmludGYoIiAgICBwdWJsaWMgc3RhdGljICQlcyA9ICVzO1xuXG4iLCAkcHJvcCwgJHZhbHVlKTsKaWYgKCdmaWxlcycgIT09ICRwcm9wKSB7CiRpbml0aWFsaXplciAuPSAiICAgICAgICAgICAgXCRsb2FkZXItPiRwcm9wID0gQ29tcG9zZXJTdGF0aWNJbml0JHN1ZmZpeDo6XCQkcHJvcDtcbiI7Cn0KfQoKcmV0dXJuICRmaWxlIC4gPDw8SU5JVElBTElaRVIKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0SW5pdGlhbGl6ZXIoQ2xhc3NMb2FkZXIgXCRsb2FkZXIpCiAgICB7CiAgICAgICAgcmV0dXJuIFxDbG9zdXJlOjpiaW5kKGZ1bmN0aW9uICgpIHVzZSAoXCRsb2FkZXIpIHsKJGluaXRpYWxpemVyCiAgICAgICAgfSwgbnVsbCwgQ2xhc3NMb2FkZXI6OmNsYXNzKTsKICAgIH0KfQoKSU5JVElBTElaRVI7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHBhcnNlQXV0b2xvYWRzVHlwZShhcnJheSAkcGFja2FnZU1hcCwgc3RyaW5nICR0eXBlLCBSb290UGFja2FnZUludGVyZmFjZSAkcm9vdFBhY2thZ2UpCnsKJGF1dG9sb2FkcyA9IFtdOwoKZm9yZWFjaCAoJHBhY2thZ2VNYXAgYXMgJGl0ZW0pIHsKWyRwYWNrYWdlLCAkaW5zdGFsbFBhdGhdID0gJGl0ZW07CgoKaWYgKG51bGwgPT09ICRpbnN0YWxsUGF0aCkgewpjb250aW51ZTsKfQoKJGF1dG9sb2FkID0gJHBhY2thZ2UtPmdldEF1dG9sb2FkKCk7CmlmICgkdGhpcy0+ZGV2TW9kZSAmJiAkcGFja2FnZSA9PT0gJHJvb3RQYWNrYWdlKSB7CiRhdXRvbG9hZCA9IGFycmF5X21lcmdlX3JlY3Vyc2l2ZSgkYXV0b2xvYWQsICRwYWNrYWdlLT5nZXREZXZBdXRvbG9hZCgpKTsKfQoKCmlmICghaXNzZXQoJGF1dG9sb2FkWyR0eXBlXSkgfHwgIWlzX2FycmF5KCRhdXRvbG9hZFskdHlwZV0pKSB7CmNvbnRpbnVlOwp9CmlmIChudWxsICE9PSAkcGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCkgJiYgJHBhY2thZ2UgIT09ICRyb290UGFja2FnZSkgewokaW5zdGFsbFBhdGggPSBzdWJzdHIoJGluc3RhbGxQYXRoLCAwLCAtc3RybGVuKCcvJy4kcGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCkpKTsKfQoKZm9yZWFjaCAoJGF1dG9sb2FkWyR0eXBlXSBhcyAkbmFtZXNwYWNlID0+ICRwYXRocykgewppZiAoaW5fYXJyYXkoJHR5cGUsIFsncHNyLTQnLCAncHNyLTAnXSwgdHJ1ZSkpIHsKCiRuYW1lc3BhY2UgPSBsdHJpbSgkbmFtZXNwYWNlLCAnXFwnKTsKfQpmb3JlYWNoICgoYXJyYXkpICRwYXRocyBhcyAkcGF0aCkgewppZiAoKCR0eXBlID09PSAnZmlsZXMnIHx8ICR0eXBlID09PSAnY2xhc3NtYXAnIHx8ICR0eXBlID09PSAnZXhjbHVkZS1mcm9tLWNsYXNzbWFwJykgJiYgJHBhY2thZ2UtPmdldFRhcmdldERpcigpICYmICFGaWxlc3lzdGVtOjppc1JlYWRhYmxlKCRpbnN0YWxsUGF0aC4nLycuJHBhdGgpKSB7CgppZiAoJHBhY2thZ2UgPT09ICRyb290UGFja2FnZSkgewokdGFyZ2V0RGlyID0gc3RyX3JlcGxhY2UoJ1xcPGRpcnNlcFxcPicsICdbXFxcXC9dJywgcHJlZ19xdW90ZShzdHJfcmVwbGFjZShbJy8nLCAnXFwnXSwgJzxkaXJzZXA+JywgJHBhY2thZ2UtPmdldFRhcmdldERpcigpKSkpOwokcGF0aCA9IGx0cmltKFByZWc6OnJlcGxhY2UoJ3teJy4kdGFyZ2V0RGlyLid9JywgJycsIGx0cmltKCRwYXRoLCAnXFwvJykpLCAnXFwvJyk7Cn0gZWxzZSB7CgokcGF0aCA9ICRwYWNrYWdlLT5nZXRUYXJnZXREaXIoKSAuICcvJyAuICRwYXRoOwp9Cn0KCmlmICgkdHlwZSA9PT0gJ2V4Y2x1ZGUtZnJvbS1jbGFzc21hcCcpIHsKCiRwYXRoID0gUHJlZzo6cmVwbGFjZSgney8rfScsICcvJywgcHJlZ19xdW90ZSh0cmltKHN0cnRyKCRwYXRoLCAnXFwnLCAnLycpLCAnLycpKSk7CgoKJHBhdGggPSBzdHJ0cigkcGF0aCwgWydcXCpcXConID0+ICcuKz8nLCAnXFwqJyA9PiAnW14vXSs/J10pOwoKCiR1cGRpciA9IG51bGw7CiRwYXRoID0gUHJlZzo6cmVwbGFjZUNhbGxiYWNrKAone14oKD86KD86XFxcXFxcLil7MSwyfSsvKSspfScsCnN0YXRpYyBmdW5jdGlvbiAoJG1hdGNoZXMpIHVzZSAoJiR1cGRpcik6IHN0cmluZyB7CgokdXBkaXIgPSBzdHJfcmVwbGFjZSgnXFwuJywgJy4nLCAkbWF0Y2hlc1sxXSk7CgpyZXR1cm4gJyc7Cn0sCiRwYXRoCik7CmlmIChlbXB0eSgkaW5zdGFsbFBhdGgpKSB7CiRpbnN0YWxsUGF0aCA9IHN0cnRyKFBsYXRmb3JtOjpnZXRDd2QoKSwgJ1xcJywgJy8nKTsKfQoKJHJlc29sdmVkUGF0aCA9IHJlYWxwYXRoKCRpbnN0YWxsUGF0aCAuICcvJyAuICR1cGRpcik7CmlmIChmYWxzZSA9PT0gJHJlc29sdmVkUGF0aCkgewpjb250aW51ZTsKfQokYXV0b2xvYWRzW10gPSBwcmVnX3F1b3RlKHN0cnRyKCRyZXNvbHZlZFBhdGgsICdcXCcsICcvJykpIC4gJy8nIC4gJHBhdGggLiAnKCR8LyknOwpjb250aW51ZTsKfQoKJHJlbGF0aXZlUGF0aCA9IGVtcHR5KCRpbnN0YWxsUGF0aCkgPyAoZW1wdHkoJHBhdGgpID8gJy4nIDogJHBhdGgpIDogJGluc3RhbGxQYXRoLicvJy4kcGF0aDsKCmlmICgkdHlwZSA9PT0gJ2ZpbGVzJykgewokYXV0b2xvYWRzWyR0aGlzLT5nZXRGaWxlSWRlbnRpZmllcigkcGFja2FnZSwgJHBhdGgpXSA9ICRyZWxhdGl2ZVBhdGg7CmNvbnRpbnVlOwp9CmlmICgkdHlwZSA9PT0gJ2NsYXNzbWFwJykgewokYXV0b2xvYWRzW10gPSAkcmVsYXRpdmVQYXRoOwpjb250aW51ZTsKfQoKJGF1dG9sb2Fkc1skbmFtZXNwYWNlXVtdID0gJHJlbGF0aXZlUGF0aDsKfQp9Cn0KCnJldHVybiAkYXV0b2xvYWRzOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0RmlsZUlkZW50aWZpZXIoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKQp7CgpyZXR1cm4gaGFzaCgnbWQ1JywgJHBhY2thZ2UtPmdldE5hbWUoKSAuICc6JyAuICRwYXRoKTsKfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGZpbHRlclBhY2thZ2VNYXAoYXJyYXkgJHBhY2thZ2VNYXAsIFJvb3RQYWNrYWdlSW50ZXJmYWNlICRyb290UGFja2FnZSkKewokcGFja2FnZXMgPSBbXTsKJGluY2x1ZGUgPSBbXTsKJHJlcGxhY2VkQnkgPSBbXTsKCmZvcmVhY2ggKCRwYWNrYWdlTWFwIGFzICRpdGVtKSB7CiRwYWNrYWdlID0gJGl0ZW1bMF07CiRuYW1lID0gJHBhY2thZ2UtPmdldE5hbWUoKTsKJHBhY2thZ2VzWyRuYW1lXSA9ICRwYWNrYWdlOwpmb3JlYWNoICgkcGFja2FnZS0+Z2V0UmVwbGFjZXMoKSBhcyAkcmVwbGFjZSkgewokcmVwbGFjZWRCeVskcmVwbGFjZS0+Z2V0VGFyZ2V0KCldID0gJG5hbWU7Cn0KfQoKJGFkZCA9IHN0YXRpYyBmdW5jdGlvbiAoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkgdXNlICgmJGFkZCwgJHBhY2thZ2VzLCAmJGluY2x1ZGUsICRyZXBsYWNlZEJ5KTogdm9pZCB7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXF1aXJlcygpIGFzICRsaW5rKSB7CiR0YXJnZXQgPSAkbGluay0+Z2V0VGFyZ2V0KCk7CmlmIChpc3NldCgkcmVwbGFjZWRCeVskdGFyZ2V0XSkpIHsKJHRhcmdldCA9ICRyZXBsYWNlZEJ5WyR0YXJnZXRdOwp9CmlmICghaXNzZXQoJGluY2x1ZGVbJHRhcmdldF0pKSB7CiRpbmNsdWRlWyR0YXJnZXRdID0gdHJ1ZTsKaWYgKGlzc2V0KCRwYWNrYWdlc1skdGFyZ2V0XSkpIHsKJGFkZCgkcGFja2FnZXNbJHRhcmdldF0pOwp9Cn0KfQp9OwokYWRkKCRyb290UGFja2FnZSk7CgpyZXR1cm4gYXJyYXlfZmlsdGVyKAokcGFja2FnZU1hcCwKc3RhdGljIGZ1bmN0aW9uICgkaXRlbSkgdXNlICgkaW5jbHVkZSk6IGJvb2wgewokcGFja2FnZSA9ICRpdGVtWzBdOwpmb3JlYWNoICgkcGFja2FnZS0+Z2V0TmFtZXMoKSBhcyAkbmFtZSkgewppZiAoaXNzZXQoJGluY2x1ZGVbJG5hbWVdKSkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KKTsKfQoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gc29ydFBhY2thZ2VNYXAoYXJyYXkgJHBhY2thZ2VNYXApCnsKJHBhY2thZ2VzID0gW107CiRwYXRocyA9IFtdOwoKZm9yZWFjaCAoJHBhY2thZ2VNYXAgYXMgJGl0ZW0pIHsKWyRwYWNrYWdlLCAkcGF0aF0gPSAkaXRlbTsKJG5hbWUgPSAkcGFja2FnZS0+Z2V0TmFtZSgpOwokcGFja2FnZXNbJG5hbWVdID0gJHBhY2thZ2U7CiRwYXRoc1skbmFtZV0gPSAkcGF0aDsKfQoKJHNvcnRlZFBhY2thZ2VzID0gUGFja2FnZVNvcnRlcjo6c29ydFBhY2thZ2VzKCRwYWNrYWdlcyk7Cgokc29ydGVkUGFja2FnZU1hcCA9IFtdOwoKZm9yZWFjaCAoJHNvcnRlZFBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRuYW1lID0gJHBhY2thZ2UtPmdldE5hbWUoKTsKJHNvcnRlZFBhY2thZ2VNYXBbXSA9IFskcGFja2FnZXNbJG5hbWVdLCAkcGF0aHNbJG5hbWVdXTsKfQoKcmV0dXJuICRzb3J0ZWRQYWNrYWdlTWFwOwp9Cn0KCmZ1bmN0aW9uIGNvbXBvc2VyUmVxdWlyZShzdHJpbmcgJGZpbGVJZGVudGlmaWVyLCBzdHJpbmcgJGZpbGUpOiB2b2lkCnsKaWYgKGVtcHR5KCRHTE9CQUxTWydfX2NvbXBvc2VyX2F1dG9sb2FkX2ZpbGVzJ11bJGZpbGVJZGVudGlmaWVyXSkpIHsKJEdMT0JBTFNbJ19fY29tcG9zZXJfYXV0b2xvYWRfZmlsZXMnXVskZmlsZUlkZW50aWZpZXJdID0gdHJ1ZTsKCnJlcXVpcmUgJGZpbGU7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQXV0b2xvYWQ7Cgp1c2UgQ29tcG9zZXJcQ2xhc3NNYXBHZW5lcmF0b3JcRmlsZUxpc3Q7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKCgoKCgoKCgoKY2xhc3MgQ2xhc3NNYXBHZW5lcmF0b3IKewoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGR1bXAoaXRlcmFibGUgJGRpcnMsIHN0cmluZyAkZmlsZSk6IHZvaWQKewokbWFwcyA9IFtdOwoKZm9yZWFjaCAoJGRpcnMgYXMgJGRpcikgewokbWFwcyA9IGFycmF5X21lcmdlKCRtYXBzLCBzdGF0aWM6OmNyZWF0ZU1hcCgkZGlyKSk7Cn0KCmZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlLCBzcHJpbnRmKCc8P3BocCByZXR1cm4gJXM7JywgdmFyX2V4cG9ydCgkbWFwcywgdHJ1ZSkpKTsKfQoKCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVNYXAoJHBhdGgsID9zdHJpbmcgJGV4Y2x1ZGVkID0gbnVsbCwgP0lPSW50ZXJmYWNlICRpbyA9IG51bGwsID9zdHJpbmcgJG5hbWVzcGFjZSA9IG51bGwsID9zdHJpbmcgJGF1dG9sb2FkVHlwZSA9IG51bGwsIGFycmF5ICYkc2Nhbm5lZEZpbGVzID0gW10pOiBhcnJheQp7CiRnZW5lcmF0b3IgPSBuZXcgXENvbXBvc2VyXENsYXNzTWFwR2VuZXJhdG9yXENsYXNzTWFwR2VuZXJhdG9yKFsncGhwJywgJ2luYycsICdoaCddKTsKJGZpbGVMaXN0ID0gbmV3IEZpbGVMaXN0KCk7CiRmaWxlTGlzdC0+ZmlsZXMgPSAkc2Nhbm5lZEZpbGVzOwokZ2VuZXJhdG9yLT5hdm9pZER1cGxpY2F0ZVNjYW5zKCRmaWxlTGlzdCk7CgokZ2VuZXJhdG9yLT5zY2FuUGF0aHMoJHBhdGgsICRleGNsdWRlZCwgJGF1dG9sb2FkVHlwZSA/PyAnY2xhc3NtYXAnLCAkbmFtZXNwYWNlKTsKCiRjbGFzc01hcCA9ICRnZW5lcmF0b3ItPmdldENsYXNzTWFwKCk7Cgokc2Nhbm5lZEZpbGVzID0gJGZpbGVMaXN0LT5maWxlczsKCmlmICgkaW8gIT09IG51bGwpIHsKZm9yZWFjaCAoJGNsYXNzTWFwLT5nZXRQc3JWaW9sYXRpb25zKCkgYXMgJG1zZykgewokaW8tPndyaXRlRXJyb3IoIjx3YXJuaW5nPiRtc2c8L3dhcm5pbmc+Iik7Cn0KCmZvcmVhY2ggKCRjbGFzc01hcC0+Z2V0QW1iaWd1b3VzQ2xhc3NlcygpIGFzICRjbGFzcyA9PiAkcGF0aHMpIHsKaWYgKGNvdW50KCRwYXRocykgPiAxKSB7CiRpby0+d3JpdGVFcnJvcigKJzx3YXJuaW5nPldhcm5pbmc6IEFtYmlndW91cyBjbGFzcyByZXNvbHV0aW9uLCAiJy4kY2xhc3MuJyInLgonIHdhcyBmb3VuZCAnLiAoY291bnQoJHBhdGhzKSArIDEpIC4neDogaW4gIicuJGNsYXNzTWFwLT5nZXRDbGFzc1BhdGgoJGNsYXNzKS4nIiBhbmQgIicuIGltcGxvZGUoJyIsICInLCAkcGF0aHMpIC4nIiwgdGhlIGZpcnN0IHdpbGwgYmUgdXNlZC48L3dhcm5pbmc+JwopOwp9IGVsc2UgewokaW8tPndyaXRlRXJyb3IoCic8d2FybmluZz5XYXJuaW5nOiBBbWJpZ3VvdXMgY2xhc3MgcmVzb2x1dGlvbiwgIicuJGNsYXNzLiciJy4KJyB3YXMgZm91bmQgaW4gYm90aCAiJy4kY2xhc3NNYXAtPmdldENsYXNzUGF0aCgkY2xhc3MpLiciIGFuZCAiJy4gaW1wbG9kZSgnIiwgIicsICRwYXRocykgLiciLCB0aGUgZmlyc3Qgd2lsbCBiZSB1c2VkLjwvd2FybmluZz4nCik7Cn0KfQp9CgpyZXR1cm4gJGNsYXNzTWFwLT5nZXRNYXAoKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlcjsKCnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFNpbGVuY2VyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEZpbmRlcjsKCgoKCgoKY2xhc3MgQ2FjaGUKewoKcHJpdmF0ZSBzdGF0aWMgJGNhY2hlQ29sbGVjdGVkID0gbnVsbDsKCnByaXZhdGUgJGlvOwoKcHJpdmF0ZSAkcm9vdDsKCnByaXZhdGUgJGVuYWJsZWQgPSBudWxsOwoKcHJpdmF0ZSAkYWxsb3dsaXN0OwoKcHJpdmF0ZSAkZmlsZXN5c3RlbTsKCnByaXZhdGUgJHJlYWRPbmx5OwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgc3RyaW5nICRjYWNoZURpciwgc3RyaW5nICRhbGxvd2xpc3QgPSAnYS16MC05Ll8nLCA/RmlsZXN5c3RlbSAkZmlsZXN5c3RlbSA9IG51bGwsIGJvb2wgJHJlYWRPbmx5ID0gZmFsc2UpCnsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+cm9vdCA9IHJ0cmltKCRjYWNoZURpciwgJy9cXCcpIC4gJy8nOwokdGhpcy0+YWxsb3dsaXN0ID0gJGFsbG93bGlzdDsKJHRoaXMtPmZpbGVzeXN0ZW0gPSAkZmlsZXN5c3RlbSA/OiBuZXcgRmlsZXN5c3RlbSgpOwokdGhpcy0+cmVhZE9ubHkgPSAkcmVhZE9ubHk7CgppZiAoIXNlbGY6OmlzVXNhYmxlKCRjYWNoZURpcikpIHsKJHRoaXMtPmVuYWJsZWQgPSBmYWxzZTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVhZE9ubHkoYm9vbCAkcmVhZE9ubHkpCnsKJHRoaXMtPnJlYWRPbmx5ID0gJHJlYWRPbmx5Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNSZWFkT25seSgpCnsKcmV0dXJuICR0aGlzLT5yZWFkT25seTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1VzYWJsZShzdHJpbmcgJHBhdGgpCnsKcmV0dXJuICFQcmVnOjppc01hdGNoKCd7KF58W1xcXFwvXSkoXCRudWxsfG51bHxOVUx8L2Rldi9udWxsKShbXFxcXC9dfCQpfScsICRwYXRoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRW5hYmxlZCgpCnsKaWYgKCR0aGlzLT5lbmFibGVkID09PSBudWxsKSB7CiR0aGlzLT5lbmFibGVkID0gdHJ1ZTsKCmlmICgKISR0aGlzLT5yZWFkT25seQomJiAoCighaXNfZGlyKCR0aGlzLT5yb290KSAmJiAhU2lsZW5jZXI6OmNhbGwoJ21rZGlyJywgJHRoaXMtPnJvb3QsIDA3NzcsIHRydWUpKQp8fCAhaXNfd3JpdGFibGUoJHRoaXMtPnJvb3QpCikKKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Q2Fubm90IGNyZWF0ZSBjYWNoZSBkaXJlY3RvcnkgJyAuICR0aGlzLT5yb290IC4gJywgb3IgZGlyZWN0b3J5IGlzIG5vdCB3cml0YWJsZS4gUHJvY2VlZGluZyB3aXRob3V0IGNhY2hlLiBTZWUgYWxzbyBjYWNoZS1yZWFkLW9ubHkgY29uZmlnIGlmIHlvdXIgZmlsZXN5c3RlbSBpcyByZWFkLW9ubHkuPC93YXJuaW5nPicpOwokdGhpcy0+ZW5hYmxlZCA9IGZhbHNlOwp9Cn0KCnJldHVybiAkdGhpcy0+ZW5hYmxlZDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJvb3QoKQp7CnJldHVybiAkdGhpcy0+cm9vdDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlYWQoc3RyaW5nICRmaWxlKQp7CmlmICgkdGhpcy0+aXNFbmFibGVkKCkpIHsKJGZpbGUgPSBQcmVnOjpyZXBsYWNlKCd7W14nLiR0aGlzLT5hbGxvd2xpc3QuJ119aScsICctJywgJGZpbGUpOwppZiAoZmlsZV9leGlzdHMoJHRoaXMtPnJvb3QgLiAkZmlsZSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdSZWFkaW5nICcuJHRoaXMtPnJvb3QgLiAkZmlsZS4nIGZyb20gY2FjaGUnLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwoKcmV0dXJuIGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5yb290IC4gJGZpbGUpOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlKHN0cmluZyAkZmlsZSwgc3RyaW5nICRjb250ZW50cykKewokd2FzRW5hYmxlZCA9ICR0aGlzLT5lbmFibGVkID09PSB0cnVlOwoKaWYgKCR0aGlzLT5pc0VuYWJsZWQoKSAmJiAhJHRoaXMtPnJlYWRPbmx5KSB7CiRmaWxlID0gUHJlZzo6cmVwbGFjZSgne1teJy4kdGhpcy0+YWxsb3dsaXN0LiddfWknLCAnLScsICRmaWxlKTsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcignV3JpdGluZyAnLiR0aGlzLT5yb290IC4gJGZpbGUuJyBpbnRvIGNhY2hlJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKCiR0ZW1wRmlsZU5hbWUgPSAkdGhpcy0+cm9vdCAuICRmaWxlIC4gYmluMmhleChyYW5kb21fYnl0ZXMoNSkpIC4gJy50bXAnOwp0cnkgewpyZXR1cm4gZmlsZV9wdXRfY29udGVudHMoJHRlbXBGaWxlTmFtZSwgJGNvbnRlbnRzKSAhPT0gZmFsc2UgJiYgcmVuYW1lKCR0ZW1wRmlsZU5hbWUsICR0aGlzLT5yb290IC4gJGZpbGUpOwp9IGNhdGNoIChcRXJyb3JFeGNlcHRpb24gJGUpIHsKCgppZiAoJHdhc0VuYWJsZWQpIHsKY2xlYXJzdGF0Y2FjaGUoKTsKJHRoaXMtPmVuYWJsZWQgPSBudWxsOwoKcmV0dXJuICR0aGlzLT53cml0ZSgkZmlsZSwgJGNvbnRlbnRzKTsKfQoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5GYWlsZWQgdG8gd3JpdGUgaW50byBjYWNoZTogJy4kZS0+Z2V0TWVzc2FnZSgpLic8L3dhcm5pbmc+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKaWYgKFByZWc6OmlzTWF0Y2goJ3teZmlsZV9wdXRfY29udGVudHNcKFwpOiBPbmx5IChbMC05XSspIG9mIChbMC05XSspIGJ5dGVzIHdyaXR0ZW59JywgJGUtPmdldE1lc3NhZ2UoKSwgJG0pKSB7Cgp1bmxpbmsoJHRlbXBGaWxlTmFtZSk7CgokbWVzc2FnZSA9IHNwcmludGYoCic8d2FybmluZz5Xcml0aW5nICUxJHMgaW50byBjYWNoZSBmYWlsZWQgYWZ0ZXIgJTIkdSBvZiAlMyR1IGJ5dGVzIHdyaXR0ZW4sIG9ubHkgJTQkcyBieXRlcyBvZiBmcmVlIHNwYWNlIGF2YWlsYWJsZTwvd2FybmluZz4nLAokdGVtcEZpbGVOYW1lLAokbVsxXSwKJG1bMl0sCmZ1bmN0aW9uX2V4aXN0cygnZGlza19mcmVlX3NwYWNlJykgPyBAZGlza19mcmVlX3NwYWNlKGRpcm5hbWUoJHRlbXBGaWxlTmFtZSkpIDogJ3Vua25vd24nCik7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJG1lc3NhZ2UpOwoKcmV0dXJuIGZhbHNlOwp9Cgp0aHJvdyAkZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvcHlGcm9tKHN0cmluZyAkZmlsZSwgc3RyaW5nICRzb3VyY2UpCnsKaWYgKCR0aGlzLT5pc0VuYWJsZWQoKSAmJiAhJHRoaXMtPnJlYWRPbmx5KSB7CiRmaWxlID0gUHJlZzo6cmVwbGFjZSgne1teJy4kdGhpcy0+YWxsb3dsaXN0LiddfWknLCAnLScsICRmaWxlKTsKJHRoaXMtPmZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cyhkaXJuYW1lKCR0aGlzLT5yb290IC4gJGZpbGUpKTsKCmlmICghZmlsZV9leGlzdHMoJHNvdXJjZSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Jy4kc291cmNlLicgZG9lcyBub3QgZXhpc3QsIGNhbiBub3Qgd3JpdGUgaW50byBjYWNoZTwvZXJyb3I+Jyk7Cn0gZWxzZWlmICgkdGhpcy0+aW8tPmlzRGVidWcoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1dyaXRpbmcgJy4kdGhpcy0+cm9vdCAuICRmaWxlLicgaW50byBjYWNoZSBmcm9tICcuJHNvdXJjZSk7Cn0KCnJldHVybiAkdGhpcy0+ZmlsZXN5c3RlbS0+Y29weSgkc291cmNlLCAkdGhpcy0+cm9vdCAuICRmaWxlKTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb3B5VG8oc3RyaW5nICRmaWxlLCBzdHJpbmcgJHRhcmdldCkKewppZiAoJHRoaXMtPmlzRW5hYmxlZCgpKSB7CiRmaWxlID0gUHJlZzo6cmVwbGFjZSgne1teJy4kdGhpcy0+YWxsb3dsaXN0LiddfWknLCAnLScsICRmaWxlKTsKaWYgKGZpbGVfZXhpc3RzKCR0aGlzLT5yb290IC4gJGZpbGUpKSB7CnRyeSB7CnRvdWNoKCR0aGlzLT5yb290IC4gJGZpbGUsIChpbnQpIGZpbGVtdGltZSgkdGhpcy0+cm9vdCAuICRmaWxlKSwgdGltZSgpKTsKfSBjYXRjaCAoXEVycm9yRXhjZXB0aW9uICRlKSB7CgoKU2lsZW5jZXI6OmNhbGwoJ3RvdWNoJywgJHRoaXMtPnJvb3QgLiAkZmlsZSk7Cn0KCiR0aGlzLT5pby0+d3JpdGVFcnJvcignUmVhZGluZyAnLiR0aGlzLT5yb290IC4gJGZpbGUuJyBmcm9tIGNhY2hlJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKCnJldHVybiAkdGhpcy0+ZmlsZXN5c3RlbS0+Y29weSgkdGhpcy0+cm9vdCAuICRmaWxlLCAkdGFyZ2V0KTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnY0lzTmVjZXNzYXJ5KCkKewppZiAoc2VsZjo6JGNhY2hlQ29sbGVjdGVkKSB7CnJldHVybiBmYWxzZTsKfQoKc2VsZjo6JGNhY2hlQ29sbGVjdGVkID0gdHJ1ZTsKaWYgKFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX1RFU1RfU1VJVEUnKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmIChQbGF0Zm9ybTo6aXNJbnB1dENvbXBsZXRpb25Qcm9jZXNzKCkpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gIXJhbmRvbV9pbnQoMCwgNTApOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlKHN0cmluZyAkZmlsZSkKewppZiAoJHRoaXMtPmlzRW5hYmxlZCgpICYmICEkdGhpcy0+cmVhZE9ubHkpIHsKJGZpbGUgPSBQcmVnOjpyZXBsYWNlKCd7W14nLiR0aGlzLT5hbGxvd2xpc3QuJ119aScsICctJywgJGZpbGUpOwppZiAoZmlsZV9leGlzdHMoJHRoaXMtPnJvb3QgLiAkZmlsZSkpIHsKcmV0dXJuICR0aGlzLT5maWxlc3lzdGVtLT51bmxpbmsoJHRoaXMtPnJvb3QgLiAkZmlsZSk7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYXIoKQp7CmlmICgkdGhpcy0+aXNFbmFibGVkKCkgJiYgISR0aGlzLT5yZWFkT25seSkgewokdGhpcy0+ZmlsZXN5c3RlbS0+ZW1wdHlEaXJlY3RvcnkoJHRoaXMtPnJvb3QpOwoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBZ2Uoc3RyaW5nICRmaWxlKQp7CmlmICgkdGhpcy0+aXNFbmFibGVkKCkpIHsKJGZpbGUgPSBQcmVnOjpyZXBsYWNlKCd7W14nLiR0aGlzLT5hbGxvd2xpc3QuJ119aScsICctJywgJGZpbGUpOwppZiAoZmlsZV9leGlzdHMoJHRoaXMtPnJvb3QgLiAkZmlsZSkgJiYgKCRtdGltZSA9IGZpbGVtdGltZSgkdGhpcy0+cm9vdCAuICRmaWxlKSkgIT09IGZhbHNlKSB7CnJldHVybiBhYnModGltZSgpIC0gJG10aW1lKTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnYyhpbnQgJHR0bCwgaW50ICRtYXhTaXplKQp7CmlmICgkdGhpcy0+aXNFbmFibGVkKCkgJiYgISR0aGlzLT5yZWFkT25seSkgewokZXhwaXJlID0gbmV3IFxEYXRlVGltZSgpOwokZXhwaXJlLT5tb2RpZnkoJy0nLiR0dGwuJyBzZWNvbmRzJyk7CgokZmluZGVyID0gJHRoaXMtPmdldEZpbmRlcigpLT5kYXRlKCd1bnRpbCAnLiRleHBpcmUtPmZvcm1hdCgnWS1tLWQgSDppOnMnKSk7CmZvcmVhY2ggKCRmaW5kZXIgYXMgJGZpbGUpIHsKJHRoaXMtPmZpbGVzeXN0ZW0tPnVubGluaygkZmlsZS0+Z2V0UGF0aG5hbWUoKSk7Cn0KCiR0b3RhbFNpemUgPSAkdGhpcy0+ZmlsZXN5c3RlbS0+c2l6ZSgkdGhpcy0+cm9vdCk7CmlmICgkdG90YWxTaXplID4gJG1heFNpemUpIHsKJGl0ZXJhdG9yID0gJHRoaXMtPmdldEZpbmRlcigpLT5zb3J0QnlBY2Nlc3NlZFRpbWUoKS0+Z2V0SXRlcmF0b3IoKTsKd2hpbGUgKCR0b3RhbFNpemUgPiAkbWF4U2l6ZSAmJiAkaXRlcmF0b3ItPnZhbGlkKCkpIHsKJGZpbGVwYXRoID0gJGl0ZXJhdG9yLT5jdXJyZW50KCktPmdldFBhdGhuYW1lKCk7CiR0b3RhbFNpemUgLT0gJHRoaXMtPmZpbGVzeXN0ZW0tPnNpemUoJGZpbGVwYXRoKTsKJHRoaXMtPmZpbGVzeXN0ZW0tPnVubGluaygkZmlsZXBhdGgpOwokaXRlcmF0b3ItPm5leHQoKTsKfQp9CgpzZWxmOjokY2FjaGVDb2xsZWN0ZWQgPSB0cnVlOwoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKcHVibGljIGZ1bmN0aW9uIGdjVmNzQ2FjaGUoaW50ICR0dGwpOiBib29sCnsKaWYgKCR0aGlzLT5pc0VuYWJsZWQoKSkgewokZXhwaXJlID0gbmV3IFxEYXRlVGltZSgpOwokZXhwaXJlLT5tb2RpZnkoJy0nLiR0dGwuJyBzZWNvbmRzJyk7CgokZmluZGVyID0gRmluZGVyOjpjcmVhdGUoKS0+aW4oJHRoaXMtPnJvb3QpLT5kaXJlY3RvcmllcygpLT5kZXB0aCgwKS0+ZGF0ZSgndW50aWwgJy4kZXhwaXJlLT5mb3JtYXQoJ1ktbS1kIEg6aTpzJykpOwpmb3JlYWNoICgkZmluZGVyIGFzICRmaWxlKSB7CiR0aGlzLT5maWxlc3lzdGVtLT5yZW1vdmVEaXJlY3RvcnkoJGZpbGUtPmdldFBhdGhuYW1lKCkpOwp9CgpzZWxmOjokY2FjaGVDb2xsZWN0ZWQgPSB0cnVlOwoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNoYTEoc3RyaW5nICRmaWxlKQp7CmlmICgkdGhpcy0+aXNFbmFibGVkKCkpIHsKJGZpbGUgPSBQcmVnOjpyZXBsYWNlKCd7W14nLiR0aGlzLT5hbGxvd2xpc3QuJ119aScsICctJywgJGZpbGUpOwppZiAoZmlsZV9leGlzdHMoJHRoaXMtPnJvb3QgLiAkZmlsZSkpIHsKcmV0dXJuIGhhc2hfZmlsZSgnc2hhMScsICR0aGlzLT5yb290IC4gJGZpbGUpOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNoYTI1NihzdHJpbmcgJGZpbGUpCnsKaWYgKCR0aGlzLT5pc0VuYWJsZWQoKSkgewokZmlsZSA9IFByZWc6OnJlcGxhY2UoJ3tbXicuJHRoaXMtPmFsbG93bGlzdC4nXX1pJywgJy0nLCAkZmlsZSk7CmlmIChmaWxlX2V4aXN0cygkdGhpcy0+cm9vdCAuICRmaWxlKSkgewpyZXR1cm4gaGFzaF9maWxlKCdzaGEyNTYnLCAkdGhpcy0+cm9vdCAuICRmaWxlKTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRGaW5kZXIoKQp7CnJldHVybiBGaW5kZXI6OmNyZWF0ZSgpLT5pbigkdGhpcy0+cm9vdCktPmZpbGVzKCk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxDb21wb3NlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgpjbGFzcyBBYm91dENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgnYWJvdXQnKQotPnNldERlc2NyaXB0aW9uKCdTaG93cyBhIHNob3J0IGluZm9ybWF0aW9uIGFib3V0IENvbXBvc2VyJykKLT5zZXRIZWxwKAo8PDxFT1QKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgYWJvdXQ8L2luZm8+CkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRjb21wb3NlclZlcnNpb24gPSBDb21wb3Nlcjo6Z2V0VmVyc2lvbigpOwoKJHRoaXMtPmdldElPKCktPndyaXRlKAo8PDxFT1QKPGluZm8+Q29tcG9zZXIgLSBEZXBlbmRlbmN5IE1hbmFnZXIgZm9yIFBIUCAtIHZlcnNpb24gJGNvbXBvc2VyVmVyc2lvbjwvaW5mbz4KPGNvbW1lbnQ+Q29tcG9zZXIgaXMgYSBkZXBlbmRlbmN5IG1hbmFnZXIgdHJhY2tpbmcgbG9jYWwgZGVwZW5kZW5jaWVzIG9mIHlvdXIgcHJvamVjdHMgYW5kIGxpYnJhcmllcy4KU2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L2NvbW1lbnQ+CkVPVAopOwoKcmV0dXJuIDA7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxGYWN0b3J5Owp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxDb21wb3NlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25TZWxlY3RvcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcQ29tcG9zaXRlUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUZhY3Rvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlTZXQ7CnVzZSBDb21wb3NlclxTY3JpcHRcU2NyaXB0RXZlbnRzOwp1c2UgQ29tcG9zZXJcUGx1Z2luXENvbW1hbmRFdmVudDsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5FdmVudHM7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXExvb3A7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKY2xhc3MgQXJjaGl2ZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnVzZSBDb21wbGV0aW9uVHJhaXQ7Cgpwcml2YXRlIGNvbnN0IEZPUk1BVFMgPSBbJ3RhcicsICd0YXIuZ3onLCAndGFyLmJ6MicsICd6aXAnXTsKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgnYXJjaGl2ZScpCi0+c2V0RGVzY3JpcHRpb24oJ0NyZWF0ZXMgYW4gYXJjaGl2ZSBvZiB0aGlzIGNvbXBvc2VyIHBhY2thZ2UnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRBcmd1bWVudCgncGFja2FnZScsIElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnVGhlIHBhY2thZ2UgdG8gYXJjaGl2ZSBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHByb2plY3QnLCBudWxsLCAkdGhpcy0+c3VnZ2VzdEF2YWlsYWJsZVBhY2thZ2UoKSksCm5ldyBJbnB1dEFyZ3VtZW50KCd2ZXJzaW9uJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdBIHZlcnNpb24gY29uc3RyYWludCB0byBmaW5kIHRoZSBwYWNrYWdlIHRvIGFyY2hpdmUnKSwKbmV3IElucHV0T3B0aW9uKCdmb3JtYXQnLCAnZicsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0Zvcm1hdCBvZiB0aGUgcmVzdWx0aW5nIGFyY2hpdmU6IHRhciwgdGFyLmd6LCB0YXIuYnoyIG9yIHppcCAoZGVmYXVsdCB0YXIpJywgbnVsbCwgc2VsZjo6Rk9STUFUUyksCm5ldyBJbnB1dE9wdGlvbignZGlyJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnV3JpdGUgdGhlIGFyY2hpdmUgdG8gdGhpcyBkaXJlY3RvcnknKSwKbmV3IElucHV0T3B0aW9uKCdmaWxlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnV3JpdGUgdGhlIGFyY2hpdmUgd2l0aCB0aGUgZ2l2ZW4gZmlsZSBuYW1lLicKLicgTm90ZSB0aGF0IHRoZSBmb3JtYXQgd2lsbCBiZSBhcHBlbmRlZC4nKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtZmlsdGVycycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnSWdub3JlIGZpbHRlcnMgd2hlbiBzYXZpbmcgcGFja2FnZScpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgPGluZm8+YXJjaGl2ZTwvaW5mbz4gY29tbWFuZCBjcmVhdGVzIGFuIGFyY2hpdmUgb2YgdGhlIHNwZWNpZmllZCBmb3JtYXQKY29udGFpbmluZyB0aGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIG9mIHRoZSBDb21wb3NlciBwcm9qZWN0IG9yIHRoZSBzcGVjaWZpZWQKcGFja2FnZSBpbiB0aGUgc3BlY2lmaWVkIHZlcnNpb24gYW5kIHdyaXRlcyBpdCB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4KCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIGFyY2hpdmUgWy0tZm9ybWF0PXppcF0gWy0tZGlyPS9mb29dIFstLWZpbGU9ZmlsZW5hbWVdIFtwYWNrYWdlIFt2ZXJzaW9uXV08L2luZm8+CgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNhcmNoaXZlCkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRjb21wb3NlciA9ICR0aGlzLT50cnlDb21wb3NlcigpOwokY29uZmlnID0gbnVsbDsKCmlmICgkY29tcG9zZXIpIHsKJGNvbmZpZyA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCk7CiRjb21tYW5kRXZlbnQgPSBuZXcgQ29tbWFuZEV2ZW50KFBsdWdpbkV2ZW50czo6Q09NTUFORCwgJ2FyY2hpdmUnLCAkaW5wdXQsICRvdXRwdXQpOwokZXZlbnREaXNwYXRjaGVyID0gJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKTsKJGV2ZW50RGlzcGF0Y2hlci0+ZGlzcGF0Y2goJGNvbW1hbmRFdmVudC0+Z2V0TmFtZSgpLCAkY29tbWFuZEV2ZW50KTsKJGV2ZW50RGlzcGF0Y2hlci0+ZGlzcGF0Y2hTY3JpcHQoU2NyaXB0RXZlbnRzOjpQUkVfQVJDSElWRV9DTUQpOwp9CgppZiAoISRjb25maWcpIHsKJGNvbmZpZyA9IEZhY3Rvcnk6OmNyZWF0ZUNvbmZpZygpOwp9CgokZm9ybWF0ID0gJGlucHV0LT5nZXRPcHRpb24oJ2Zvcm1hdCcpID8/ICRjb25maWctPmdldCgnYXJjaGl2ZS1mb3JtYXQnKTsKJGRpciA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdkaXInKSA/PyAkY29uZmlnLT5nZXQoJ2FyY2hpdmUtZGlyJyk7CgokcmV0dXJuQ29kZSA9ICR0aGlzLT5hcmNoaXZlKAokdGhpcy0+Z2V0SU8oKSwKJGNvbmZpZywKJGlucHV0LT5nZXRBcmd1bWVudCgncGFja2FnZScpLAokaW5wdXQtPmdldEFyZ3VtZW50KCd2ZXJzaW9uJyksCiRmb3JtYXQsCiRkaXIsCiRpbnB1dC0+Z2V0T3B0aW9uKCdmaWxlJyksCiRpbnB1dC0+Z2V0T3B0aW9uKCdpZ25vcmUtZmlsdGVycycpLAokY29tcG9zZXIKKTsKCmlmICgwID09PSAkcmV0dXJuQ29kZSAmJiAkY29tcG9zZXIpIHsKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2hTY3JpcHQoU2NyaXB0RXZlbnRzOjpQT1NUX0FSQ0hJVkVfQ01EKTsKfQoKcmV0dXJuICRyZXR1cm5Db2RlOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gYXJjaGl2ZShJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCA/c3RyaW5nICRwYWNrYWdlTmFtZSwgP3N0cmluZyAkdmVyc2lvbiwgc3RyaW5nICRmb3JtYXQsIHN0cmluZyAkZGVzdCwgP3N0cmluZyAkZmlsZU5hbWUsIGJvb2wgJGlnbm9yZUZpbHRlcnMsID9Db21wb3NlciAkY29tcG9zZXIpOiBpbnQKewppZiAoJGNvbXBvc2VyKSB7CiRhcmNoaXZlTWFuYWdlciA9ICRjb21wb3Nlci0+Z2V0QXJjaGl2ZU1hbmFnZXIoKTsKfSBlbHNlIHsKJGZhY3RvcnkgPSBuZXcgRmFjdG9yeTsKJHByb2Nlc3MgPSBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCk7CiRodHRwRG93bmxvYWRlciA9IEZhY3Rvcnk6OmNyZWF0ZUh0dHBEb3dubG9hZGVyKCRpbywgJGNvbmZpZyk7CiRkb3dubG9hZE1hbmFnZXIgPSAkZmFjdG9yeS0+Y3JlYXRlRG93bmxvYWRNYW5hZ2VyKCRpbywgJGNvbmZpZywgJGh0dHBEb3dubG9hZGVyLCAkcHJvY2Vzcyk7CiRhcmNoaXZlTWFuYWdlciA9ICRmYWN0b3J5LT5jcmVhdGVBcmNoaXZlTWFuYWdlcigkY29uZmlnLCAkZG93bmxvYWRNYW5hZ2VyLCBuZXcgTG9vcCgkaHR0cERvd25sb2FkZXIsICRwcm9jZXNzKSk7Cn0KCmlmICgkcGFja2FnZU5hbWUpIHsKJHBhY2thZ2UgPSAkdGhpcy0+c2VsZWN0UGFja2FnZSgkaW8sICRwYWNrYWdlTmFtZSwgJHZlcnNpb24pOwoKaWYgKCEkcGFja2FnZSkgewpyZXR1cm4gMTsKfQp9IGVsc2UgewokcGFja2FnZSA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKS0+Z2V0UGFja2FnZSgpOwp9CgokaW8tPndyaXRlRXJyb3IoJzxpbmZvPkNyZWF0aW5nIHRoZSBhcmNoaXZlIGludG8gIicuJGRlc3QuJyIuPC9pbmZvPicpOwokcGFja2FnZVBhdGggPSAkYXJjaGl2ZU1hbmFnZXItPmFyY2hpdmUoJHBhY2thZ2UsICRmb3JtYXQsICRkZXN0LCAkZmlsZU5hbWUsICRpZ25vcmVGaWx0ZXJzKTsKJGZzID0gbmV3IEZpbGVzeXN0ZW07CiRzaG9ydFBhdGggPSAkZnMtPmZpbmRTaG9ydGVzdFBhdGgoUGxhdGZvcm06OmdldEN3ZCgpLCAkcGFja2FnZVBhdGgsIHRydWUpOwoKJGlvLT53cml0ZUVycm9yKCdDcmVhdGVkOiAnLCBmYWxzZSk7CiRpby0+d3JpdGUoc3RybGVuKCRzaG9ydFBhdGgpIDwgc3RybGVuKCRwYWNrYWdlUGF0aCkgPyAkc2hvcnRQYXRoIDogJHBhY2thZ2VQYXRoKTsKCnJldHVybiAwOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gc2VsZWN0UGFja2FnZShJT0ludGVyZmFjZSAkaW8sIHN0cmluZyAkcGFja2FnZU5hbWUsID9zdHJpbmcgJHZlcnNpb24gPSBudWxsKQp7CiRpby0+d3JpdGVFcnJvcignPGluZm8+U2VhcmNoaW5nIGZvciB0aGUgc3BlY2lmaWVkIHBhY2thZ2UuPC9pbmZvPicpOwoKaWYgKCRjb21wb3NlciA9ICR0aGlzLT50cnlDb21wb3NlcigpKSB7CiRsb2NhbFJlcG8gPSAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpOwokcmVwbyA9IG5ldyBDb21wb3NpdGVSZXBvc2l0b3J5KGFycmF5X21lcmdlKFskbG9jYWxSZXBvXSwgJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRSZXBvc2l0b3JpZXMoKSkpOwokbWluU3RhYmlsaXR5ID0gJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldE1pbmltdW1TdGFiaWxpdHkoKTsKfSBlbHNlIHsKJGRlZmF1bHRSZXBvcyA9IFJlcG9zaXRvcnlGYWN0b3J5OjpkZWZhdWx0UmVwb3NXaXRoRGVmYXVsdE1hbmFnZXIoJGlvKTsKJGlvLT53cml0ZUVycm9yKCdObyBjb21wb3Nlci5qc29uIGZvdW5kIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgc2VhcmNoaW5nIHBhY2thZ2VzIGZyb20gJyAuIGltcGxvZGUoJywgJywgYXJyYXlfa2V5cygkZGVmYXVsdFJlcG9zKSkpOwokcmVwbyA9IG5ldyBDb21wb3NpdGVSZXBvc2l0b3J5KCRkZWZhdWx0UmVwb3MpOwokbWluU3RhYmlsaXR5ID0gJ3N0YWJsZSc7Cn0KCmlmICgkdmVyc2lvbiAhPT0gbnVsbCAmJiBQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7QChzdGFibGV8UkN8YmV0YXxhbHBoYXxkZXYpJH1pJywgJHZlcnNpb24sICRtYXRjaCkpIHsKJG1pblN0YWJpbGl0eSA9IFZlcnNpb25QYXJzZXI6Om5vcm1hbGl6ZVN0YWJpbGl0eSgkbWF0Y2hbMV0pOwokdmVyc2lvbiA9IChzdHJpbmcpIHN1YnN0cigkdmVyc2lvbiwgMCwgLXN0cmxlbigkbWF0Y2hbMF0pKTsKfQoKJHJlcG9TZXQgPSBuZXcgUmVwb3NpdG9yeVNldCgkbWluU3RhYmlsaXR5KTsKJHJlcG9TZXQtPmFkZFJlcG9zaXRvcnkoJHJlcG8pOwokcGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKJGNvbnN0cmFpbnQgPSAkdmVyc2lvbiAhPT0gbnVsbCA/ICRwYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJHZlcnNpb24pIDogbnVsbDsKJHBhY2thZ2VzID0gJHJlcG9TZXQtPmZpbmRQYWNrYWdlcyhzdHJ0b2xvd2VyKCRwYWNrYWdlTmFtZSksICRjb25zdHJhaW50KTsKCmlmIChjb3VudCgkcGFja2FnZXMpID4gMSkgewokdmVyc2lvblNlbGVjdG9yID0gbmV3IFZlcnNpb25TZWxlY3RvcigkcmVwb1NldCk7CiRwYWNrYWdlID0gJHZlcnNpb25TZWxlY3Rvci0+ZmluZEJlc3RDYW5kaWRhdGUoc3RydG9sb3dlcigkcGFja2FnZU5hbWUpLCAkdmVyc2lvbiwgJG1pblN0YWJpbGl0eSk7CmlmICgkcGFja2FnZSA9PT0gZmFsc2UpIHsKJHBhY2thZ2UgPSByZXNldCgkcGFja2FnZXMpOwp9CgokaW8tPndyaXRlRXJyb3IoJzxpbmZvPkZvdW5kIG11bHRpcGxlIG1hdGNoZXMsIHNlbGVjdGVkICcuJHBhY2thZ2UtPmdldFByZXR0eVN0cmluZygpLicuPC9pbmZvPicpOwokaW8tPndyaXRlRXJyb3IoJ0FsdGVybmF0aXZlcyB3ZXJlICcuaW1wbG9kZSgnLCAnLCBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkcCk6IHN0cmluZyB7CnJldHVybiAkcC0+Z2V0UHJldHR5U3RyaW5nKCk7Cn0sICRwYWNrYWdlcykpLicuJyk7CiRpby0+d3JpdGVFcnJvcignPGNvbW1lbnQ+UGxlYXNlIHVzZSBhIG1vcmUgc3BlY2lmaWMgY29uc3RyYWludCB0byBwaWNrIGEgZGlmZmVyZW50IHBhY2thZ2UuPC9jb21tZW50PicpOwp9IGVsc2VpZiAoY291bnQoJHBhY2thZ2VzKSA9PT0gMSkgewokcGFja2FnZSA9IHJlc2V0KCRwYWNrYWdlcyk7CiRpby0+d3JpdGVFcnJvcignPGluZm8+Rm91bmQgYW4gZXhhY3QgbWF0Y2ggJy4kcGFja2FnZS0+Z2V0UHJldHR5U3RyaW5nKCkuJy48L2luZm8+Jyk7Cn0gZWxzZSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPkNvdWxkIG5vdCBmaW5kIGEgcGFja2FnZSBtYXRjaGluZyAnLiRwYWNrYWdlTmFtZS4nLjwvZXJyb3I+Jyk7CgpyZXR1cm4gZmFsc2U7Cn0KCmlmICghJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignRXhwZWN0ZWQgYSBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgaW5zdGFuY2UgYnV0IGZvdW5kICcuZ2V0X2NsYXNzKCRwYWNrYWdlKSk7Cn0KaWYgKCEkcGFja2FnZSBpbnN0YW5jZW9mIEJhc2VQYWNrYWdlKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0V4cGVjdGVkIGEgQmFzZVBhY2thZ2UgaW5zdGFuY2UgYnV0IGZvdW5kICcuZ2V0X2NsYXNzKCRwYWNrYWdlKSk7Cn0KCnJldHVybiAkcGFja2FnZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXEFkdmlzb3J5XEF1ZGl0Q29uZmlnOwp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlTZXQ7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlVdGlsczsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEluc3RhbGxlZFJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxBZHZpc29yeVxBdWRpdG9yOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKCmNsYXNzIEF1ZGl0Q29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdhdWRpdCcpCi0+c2V0RGVzY3JpcHRpb24oJ0NoZWNrcyBmb3Igc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSBhZHZpc29yaWVzIGZvciBpbnN0YWxsZWQgcGFja2FnZXMnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRPcHRpb24oJ25vLWRldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRGlzYWJsZXMgYXVkaXRpbmcgb2YgcmVxdWlyZS1kZXYgcGFja2FnZXMuJyksCm5ldyBJbnB1dE9wdGlvbignZm9ybWF0JywgJ2YnLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdPdXRwdXQgZm9ybWF0LiBNdXN0IGJlICJ0YWJsZSIsICJwbGFpbiIsICJqc29uIiwgb3IgInN1bW1hcnkiLicsIEF1ZGl0b3I6OkZPUk1BVF9UQUJMRSwgQXVkaXRvcjo6Rk9STUFUUyksCm5ldyBJbnB1dE9wdGlvbignbG9ja2VkJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdBdWRpdCBiYXNlZCBvbiB0aGUgbG9jayBmaWxlIGluc3RlYWQgb2YgdGhlIGluc3RhbGxlZCBwYWNrYWdlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdhYmFuZG9uZWQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdCZWhhdmlvciBvbiBhYmFuZG9uZWQgcGFja2FnZXMuIE11c3QgYmUgImlnbm9yZSIsICJyZXBvcnQiLCBvciAiZmFpbCIuJywgbnVsbCwgQXVkaXRvcjo6QUJBTkRPTkVEUyksCm5ldyBJbnB1dE9wdGlvbignaWdub3JlLXNldmVyaXR5JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZIHwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnSWdub3JlIGFkdmlzb3JpZXMgb2YgYSBjZXJ0YWluIHNldmVyaXR5IGxldmVsLicsIFtdLCBbJ2xvdycsICdtZWRpdW0nLCAnaGlnaCcsICdjcml0aWNhbCddKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtdW5yZWFjaGFibGUnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0lnbm9yZSByZXBvc2l0b3JpZXMgdGhhdCBhcmUgdW5yZWFjaGFibGUgb3IgcmV0dXJuIGEgbm9uLTIwMCBzdGF0dXMgY29kZS4nKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIDxpbmZvPmF1ZGl0PC9pbmZvPiBjb21tYW5kIGNoZWNrcyBmb3Igc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSBhZHZpc29yaWVzIGZvciBpbnN0YWxsZWQgcGFja2FnZXMuCgpJZiB5b3UgZG8gbm90IHdhbnQgdG8gaW5jbHVkZSBkZXYgZGVwZW5kZW5jaWVzIGluIHRoZSBhdWRpdCB5b3UgY2FuIG9taXQgdGhlbSB3aXRoIC0tbm8tZGV2CgpJZiB5b3Ugd2FudCB0byBpZ25vcmUgcmVwb3NpdG9yaWVzIHRoYXQgYXJlIHVucmVhY2hhYmxlIG9yIHJldHVybiBhIG5vbi0yMDAgc3RhdHVzIGNvZGUsIHVzZSAtLWlnbm9yZS11bnJlYWNoYWJsZQoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjYXVkaXQKRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwokcGFja2FnZXMgPSAkdGhpcy0+Z2V0UGFja2FnZXMoJGNvbXBvc2VyLCAkaW5wdXQpOwoKaWYgKGNvdW50KCRwYWNrYWdlcykgPT09IDApIHsKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJ05vIHBhY2thZ2VzIC0gc2tpcHBpbmcgYXVkaXQuJyk7CgpyZXR1cm4gMDsKfQoKJGF1ZGl0b3IgPSBuZXcgQXVkaXRvcigpOwokcmVwb1NldCA9IG5ldyBSZXBvc2l0b3J5U2V0KCk7CmZvcmVhY2ggKCRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0UmVwb3NpdG9yaWVzKCkgYXMgJHJlcG8pIHsKJHJlcG9TZXQtPmFkZFJlcG9zaXRvcnkoJHJlcG8pOwp9CgokYXVkaXRDb25maWcgPSBBdWRpdENvbmZpZzo6ZnJvbUNvbmZpZygkY29tcG9zZXItPmdldENvbmZpZygpKTsKCiRhYmFuZG9uZWQgPSAkaW5wdXQtPmdldE9wdGlvbignYWJhbmRvbmVkJyk7CmlmICgkYWJhbmRvbmVkICE9PSBudWxsICYmICFpbl9hcnJheSgkYWJhbmRvbmVkLCBBdWRpdG9yOjpBQkFORE9ORURTLCB0cnVlKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignLS1hYmFuZG9uZWQgbXVzdCBiZSBvbmUgb2YgJy5pbXBsb2RlKCcsICcsIEF1ZGl0b3I6OkFCQU5ET05FRFMpLicuJyk7Cn0KCiRhYmFuZG9uZWQgPSAkYWJhbmRvbmVkID8/ICRhdWRpdENvbmZpZy0+YXVkaXRBYmFuZG9uZWQ7CgokaWdub3JlU2V2ZXJpdGllcyA9IGFycmF5X21lcmdlKGFycmF5X2ZpbGxfa2V5cygkaW5wdXQtPmdldE9wdGlvbignaWdub3JlLXNldmVyaXR5JyksIG51bGwpLCAkYXVkaXRDb25maWctPmlnbm9yZVNldmVyaXR5Rm9yQXVkaXQpOwokaWdub3JlVW5yZWFjaGFibGUgPSAkaW5wdXQtPmdldE9wdGlvbignaWdub3JlLXVucmVhY2hhYmxlJykgfHwgJGF1ZGl0Q29uZmlnLT5pZ25vcmVVbnJlYWNoYWJsZTsKCnJldHVybiBtaW4oMjU1LCAkYXVkaXRvci0+YXVkaXQoCiR0aGlzLT5nZXRJTygpLAokcmVwb1NldCwKJHBhY2thZ2VzLAokdGhpcy0+Z2V0QXVkaXRGb3JtYXQoJGlucHV0LCAnZm9ybWF0JyksCmZhbHNlLAokYXVkaXRDb25maWctPmlnbm9yZUxpc3RGb3JBdWRpdCwKJGFiYW5kb25lZCwKJGlnbm9yZVNldmVyaXRpZXMsCiRpZ25vcmVVbnJlYWNoYWJsZSwKJGF1ZGl0Q29uZmlnLT5pZ25vcmVBYmFuZG9uZWRGb3JBdWRpdAopKTsKCn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0UGFja2FnZXMoQ29tcG9zZXIgJGNvbXBvc2VyLCBJbnB1dEludGVyZmFjZSAkaW5wdXQpOiBhcnJheQp7CmlmICgkaW5wdXQtPmdldE9wdGlvbignbG9ja2VkJykpIHsKaWYgKCEkY29tcG9zZXItPmdldExvY2tlcigpLT5pc0xvY2tlZCgpKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdWYWxpZCBjb21wb3Nlci5qc29uIGFuZCBjb21wb3Nlci5sb2NrIGZpbGVzIGFyZSByZXF1aXJlZCB0byBydW4gdGhpcyBjb21tYW5kIHdpdGggLS1sb2NrZWQnKTsKfQokbG9ja2VyID0gJGNvbXBvc2VyLT5nZXRMb2NrZXIoKTsKCnJldHVybiAkbG9ja2VyLT5nZXRMb2NrZWRSZXBvc2l0b3J5KCEkaW5wdXQtPmdldE9wdGlvbignbm8tZGV2JykpLT5nZXRQYWNrYWdlcygpOwp9Cgokcm9vdFBrZyA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpOwokaW5zdGFsbGVkUmVwbyA9IG5ldyBJbnN0YWxsZWRSZXBvc2l0b3J5KFskY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpXSk7CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpKSB7CnJldHVybiBSZXBvc2l0b3J5VXRpbHM6OmZpbHRlclJlcXVpcmVkUGFja2FnZXMoJGluc3RhbGxlZFJlcG8tPmdldFBhY2thZ2VzKCksICRyb290UGtnKTsKfQoKcmV0dXJuICRpbnN0YWxsZWRSZXBvLT5nZXRQYWNrYWdlcygpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxDb25zb2xlXEFwcGxpY2F0aW9uOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIENvbXBvc2VyXEZhY3Rvcnk7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXElPXE51bGxJTzsKdXNlIENvbXBvc2VyXFBsdWdpblxQcmVDb21tYW5kUnVuRXZlbnQ7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5FdmVudHM7CnVzZSBDb21wb3NlclxBZHZpc29yeVxBdWRpdG9yOwp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcQXVkaXRDb25maWc7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25JbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uU3VnZ2VzdGlvbnM7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxUYWJsZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFRhYmxlU2VwYXJhdG9yOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxUZXJtaW5hbDsKCgoKCgoKCmFic3RyYWN0IGNsYXNzIEJhc2VDb21tYW5kIGV4dGVuZHMgQ29tbWFuZAp7CgoKCnByaXZhdGUgJGNvbXBvc2VyOwoKCgoKcHJpdmF0ZSAkaW87CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXBwbGljYXRpb24oKTogQXBwbGljYXRpb24KewokYXBwbGljYXRpb24gPSBwYXJlbnQ6OmdldEFwcGxpY2F0aW9uKCk7CmlmICghJGFwcGxpY2F0aW9uIGluc3RhbmNlb2YgQXBwbGljYXRpb24pIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb21wb3NlciBjb21tYW5kcyBjYW4gb25seSB3b3JrIHdpdGggYW4gJy5BcHBsaWNhdGlvbjo6Y2xhc3MuJyBpbnN0YW5jZSBzZXQnKTsKfQoKcmV0dXJuICRhcHBsaWNhdGlvbjsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tcG9zZXIoYm9vbCAkcmVxdWlyZWQgPSB0cnVlLCA/Ym9vbCAkZGlzYWJsZVBsdWdpbnMgPSBudWxsLCA/Ym9vbCAkZGlzYWJsZVNjcmlwdHMgPSBudWxsKQp7CmlmICgkcmVxdWlyZWQpIHsKcmV0dXJuICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoJGRpc2FibGVQbHVnaW5zLCAkZGlzYWJsZVNjcmlwdHMpOwp9CgpyZXR1cm4gJHRoaXMtPnRyeUNvbXBvc2VyKCRkaXNhYmxlUGx1Z2lucywgJGRpc2FibGVTY3JpcHRzKTsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlcXVpcmVDb21wb3Nlcig/Ym9vbCAkZGlzYWJsZVBsdWdpbnMgPSBudWxsLCA/Ym9vbCAkZGlzYWJsZVNjcmlwdHMgPSBudWxsKTogQ29tcG9zZXIKewppZiAobnVsbCA9PT0gJHRoaXMtPmNvbXBvc2VyKSB7CiRhcHBsaWNhdGlvbiA9IHBhcmVudDo6Z2V0QXBwbGljYXRpb24oKTsKaWYgKCRhcHBsaWNhdGlvbiBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uKSB7CiR0aGlzLT5jb21wb3NlciA9ICRhcHBsaWNhdGlvbi0+Z2V0Q29tcG9zZXIodHJ1ZSwgJGRpc2FibGVQbHVnaW5zLCAkZGlzYWJsZVNjcmlwdHMpOwphc3NlcnQoJHRoaXMtPmNvbXBvc2VyIGluc3RhbmNlb2YgQ29tcG9zZXIpOwp9IGVsc2Ugewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCidDb3VsZCBub3QgY3JlYXRlIGEgQ29tcG9zZXJcQ29tcG9zZXIgaW5zdGFuY2UsIHlvdSBtdXN0IGluamVjdCAnLgonb25lIGlmIHRoaXMgY29tbWFuZCBpcyBub3QgdXNlZCB3aXRoIGEgQ29tcG9zZXJcQ29uc29sZVxBcHBsaWNhdGlvbiBpbnN0YW5jZScKKTsKfQp9CgpyZXR1cm4gJHRoaXMtPmNvbXBvc2VyOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB0cnlDb21wb3Nlcig/Ym9vbCAkZGlzYWJsZVBsdWdpbnMgPSBudWxsLCA/Ym9vbCAkZGlzYWJsZVNjcmlwdHMgPSBudWxsKTogP0NvbXBvc2VyCnsKaWYgKG51bGwgPT09ICR0aGlzLT5jb21wb3NlcikgewokYXBwbGljYXRpb24gPSBwYXJlbnQ6OmdldEFwcGxpY2F0aW9uKCk7CmlmICgkYXBwbGljYXRpb24gaW5zdGFuY2VvZiBBcHBsaWNhdGlvbikgewokdGhpcy0+Y29tcG9zZXIgPSAkYXBwbGljYXRpb24tPmdldENvbXBvc2VyKGZhbHNlLCAkZGlzYWJsZVBsdWdpbnMsICRkaXNhYmxlU2NyaXB0cyk7Cn0KfQoKcmV0dXJuICR0aGlzLT5jb21wb3NlcjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldENvbXBvc2VyKENvbXBvc2VyICRjb21wb3NlcikKewokdGhpcy0+Y29tcG9zZXIgPSAkY29tcG9zZXI7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlc2V0Q29tcG9zZXIoKQp7CiR0aGlzLT5jb21wb3NlciA9IG51bGw7CiR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5yZXNldENvbXBvc2VyKCk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNQcm94eUNvbW1hbmQoKQp7CnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldElPKCkKewppZiAobnVsbCA9PT0gJHRoaXMtPmlvKSB7CiRhcHBsaWNhdGlvbiA9IHBhcmVudDo6Z2V0QXBwbGljYXRpb24oKTsKaWYgKCRhcHBsaWNhdGlvbiBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uKSB7CiR0aGlzLT5pbyA9ICRhcHBsaWNhdGlvbi0+Z2V0SU8oKTsKfSBlbHNlIHsKJHRoaXMtPmlvID0gbmV3IE51bGxJTygpOwp9Cn0KCnJldHVybiAkdGhpcy0+aW87Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRJTyhJT0ludGVyZmFjZSAkaW8pCnsKJHRoaXMtPmlvID0gJGlvOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbXBsZXRlKENvbXBsZXRpb25JbnB1dCAkaW5wdXQsIENvbXBsZXRpb25TdWdnZXN0aW9ucyAkc3VnZ2VzdGlvbnMpOiB2b2lkCnsKJGRlZmluaXRpb24gPSAkdGhpcy0+Z2V0RGVmaW5pdGlvbigpOwokbmFtZSA9IChzdHJpbmcpICRpbnB1dC0+Z2V0Q29tcGxldGlvbk5hbWUoKTsKaWYgKENvbXBsZXRpb25JbnB1dDo6VFlQRV9PUFRJT05fVkFMVUUgPT09ICRpbnB1dC0+Z2V0Q29tcGxldGlvblR5cGUoKQomJiAkZGVmaW5pdGlvbi0+aGFzT3B0aW9uKCRuYW1lKQomJiAoJG9wdGlvbiA9ICRkZWZpbml0aW9uLT5nZXRPcHRpb24oJG5hbWUpKSBpbnN0YW5jZW9mIElucHV0T3B0aW9uCikgewokb3B0aW9uLT5jb21wbGV0ZSgkaW5wdXQsICRzdWdnZXN0aW9ucyk7Cn0gZWxzZWlmIChDb21wbGV0aW9uSW5wdXQ6OlRZUEVfQVJHVU1FTlRfVkFMVUUgPT09ICRpbnB1dC0+Z2V0Q29tcGxldGlvblR5cGUoKQomJiAkZGVmaW5pdGlvbi0+aGFzQXJndW1lbnQoJG5hbWUpCiYmICgkYXJndW1lbnQgPSAkZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnQoJG5hbWUpKSBpbnN0YW5jZW9mIElucHV0QXJndW1lbnQKKSB7CiRhcmd1bWVudC0+Y29tcGxldGUoJGlucHV0LCAkc3VnZ2VzdGlvbnMpOwp9IGVsc2UgewpwYXJlbnQ6OmNvbXBsZXRlKCRpbnB1dCwgJHN1Z2dlc3Rpb25zKTsKfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdGlhbGl6ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogdm9pZAp7CgokZGlzYWJsZVBsdWdpbnMgPSAkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbignLS1uby1wbHVnaW5zJyk7CiRkaXNhYmxlU2NyaXB0cyA9ICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKCctLW5vLXNjcmlwdHMnKTsKCiRhcHBsaWNhdGlvbiA9IHBhcmVudDo6Z2V0QXBwbGljYXRpb24oKTsKaWYgKCRhcHBsaWNhdGlvbiBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uICYmICRhcHBsaWNhdGlvbi0+Z2V0RGlzYWJsZVBsdWdpbnNCeURlZmF1bHQoKSkgewokZGlzYWJsZVBsdWdpbnMgPSB0cnVlOwp9CmlmICgkYXBwbGljYXRpb24gaW5zdGFuY2VvZiBBcHBsaWNhdGlvbiAmJiAkYXBwbGljYXRpb24tPmdldERpc2FibGVTY3JpcHRzQnlEZWZhdWx0KCkpIHsKJGRpc2FibGVTY3JpcHRzID0gdHJ1ZTsKfQoKaWYgKCR0aGlzIGluc3RhbmNlb2YgU2VsZlVwZGF0ZUNvbW1hbmQpIHsKJGRpc2FibGVQbHVnaW5zID0gdHJ1ZTsKJGRpc2FibGVTY3JpcHRzID0gdHJ1ZTsKfQoKJGNvbXBvc2VyID0gJHRoaXMtPnRyeUNvbXBvc2VyKCRkaXNhYmxlUGx1Z2lucywgJGRpc2FibGVTY3JpcHRzKTsKJGlvID0gJHRoaXMtPmdldElPKCk7CgppZiAobnVsbCA9PT0gJGNvbXBvc2VyKSB7CiRjb21wb3NlciA9IEZhY3Rvcnk6OmNyZWF0ZUdsb2JhbCgkdGhpcy0+Z2V0SU8oKSwgJGRpc2FibGVQbHVnaW5zLCAkZGlzYWJsZVNjcmlwdHMpOwp9CmlmICgkY29tcG9zZXIpIHsKJHByZUNvbW1hbmRSdW5FdmVudCA9IG5ldyBQcmVDb21tYW5kUnVuRXZlbnQoUGx1Z2luRXZlbnRzOjpQUkVfQ09NTUFORF9SVU4sICRpbnB1dCwgJHRoaXMtPmdldE5hbWUoKSk7CiRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmRpc3BhdGNoKCRwcmVDb21tYW5kUnVuRXZlbnQtPmdldE5hbWUoKSwgJHByZUNvbW1hbmRSdW5FdmVudCk7Cn0KCmlmICh0cnVlID09PSAkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbihbJy0tbm8tYW5zaSddKSAmJiAkaW5wdXQtPmhhc09wdGlvbignbm8tcHJvZ3Jlc3MnKSkgewokaW5wdXQtPnNldE9wdGlvbignbm8tcHJvZ3Jlc3MnLCB0cnVlKTsKfQoKJGVudk9wdGlvbnMgPSBbCidDT01QT1NFUl9OT19BVURJVCcgPT4gWyduby1hdWRpdCddLAonQ09NUE9TRVJfTk9fREVWJyA9PiBbJ25vLWRldicsICd1cGRhdGUtbm8tZGV2J10sCidDT01QT1NFUl9QUkVGRVJfU1RBQkxFJyA9PiBbJ3ByZWZlci1zdGFibGUnXSwKJ0NPTVBPU0VSX1BSRUZFUl9MT1dFU1QnID0+IFsncHJlZmVyLWxvd2VzdCddLAonQ09NUE9TRVJfTUlOSU1BTF9DSEFOR0VTJyA9PiBbJ21pbmltYWwtY2hhbmdlcyddLAonQ09NUE9TRVJfV0lUSF9ERVBFTkRFTkNJRVMnID0+IFsnd2l0aC1kZXBlbmRlbmNpZXMnXSwKJ0NPTVBPU0VSX1dJVEhfQUxMX0RFUEVOREVOQ0lFUycgPT4gWyd3aXRoLWFsbC1kZXBlbmRlbmNpZXMnXSwKJ0NPTVBPU0VSX05PX1NFQ1VSSVRZX0JMT0NLSU5HJyA9PiBbJ25vLXNlY3VyaXR5LWJsb2NraW5nJ10sCl07CmZvcmVhY2ggKCRlbnZPcHRpb25zIGFzICRlbnZOYW1lID0+ICRvcHRpb25OYW1lcykgewpmb3JlYWNoICgkb3B0aW9uTmFtZXMgYXMgJG9wdGlvbk5hbWUpIHsKaWYgKHRydWUgPT09ICRpbnB1dC0+aGFzT3B0aW9uKCRvcHRpb25OYW1lKSkgewppZiAoZmFsc2UgPT09ICRpbnB1dC0+Z2V0T3B0aW9uKCRvcHRpb25OYW1lKSAmJiAoYm9vbCkgUGxhdGZvcm06OmdldEVudigkZW52TmFtZSkpIHsKJGlucHV0LT5zZXRPcHRpb24oJG9wdGlvbk5hbWUsIHRydWUpOwp9Cn0KfQp9CgppZiAodHJ1ZSA9PT0gJGlucHV0LT5oYXNPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXFzJykpIHsKaWYgKCEkaW5wdXQtPmdldE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcXMnKSAmJiAoYm9vbCkgUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfSUdOT1JFX1BMQVRGT1JNX1JFUVMnKSkgewokaW5wdXQtPnNldE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcXMnLCB0cnVlKTsKCiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Q09NUE9TRVJfSUdOT1JFX1BMQVRGT1JNX1JFUVMgaXMgc2V0LiBZb3UgbWF5IGV4cGVyaWVuY2UgdW5leHBlY3RlZCBlcnJvcnMuPC93YXJuaW5nPicpOwp9Cn0KCmlmICh0cnVlID09PSAkaW5wdXQtPmhhc09wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcScpICYmICghJGlucHV0LT5oYXNPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXFzJykgfHwgISRpbnB1dC0+Z2V0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxcycpKSkgewokaWdub3JlUGxhdGZvcm1SZXFFbnYgPSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9JR05PUkVfUExBVEZPUk1fUkVRJyk7CmlmICgwID09PSBjb3VudCgkaW5wdXQtPmdldE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcScpKSAmJiBpc19zdHJpbmcoJGlnbm9yZVBsYXRmb3JtUmVxRW52KSAmJiAnJyAhPT0gJGlnbm9yZVBsYXRmb3JtUmVxRW52KSB7CiRpbnB1dC0+c2V0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxJywgZXhwbG9kZSgnLCcsICRpZ25vcmVQbGF0Zm9ybVJlcUVudikpOwoKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5DT01QT1NFUl9JR05PUkVfUExBVEZPUk1fUkVRIGlzIHNldCB0byBpZ25vcmUgJy4kaWdub3JlUGxhdGZvcm1SZXFFbnYuJy4gWW91IG1heSBleHBlcmllbmNlIHVuZXhwZWN0ZWQgZXJyb3JzLjwvd2FybmluZz4nKTsKfQp9CgpwYXJlbnQ6OmluaXRpYWxpemUoJGlucHV0LCAkb3V0cHV0KTsKfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNyZWF0ZUNvbXBvc2VySW5zdGFuY2UoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBJT0ludGVyZmFjZSAkaW8sICRjb25maWcgPSBudWxsLCA/Ym9vbCAkZGlzYWJsZVBsdWdpbnMgPSBudWxsLCA/Ym9vbCAkZGlzYWJsZVNjcmlwdHMgPSBudWxsKTogQ29tcG9zZXIKewokZGlzYWJsZVBsdWdpbnMgPSAkZGlzYWJsZVBsdWdpbnMgPT09IHRydWUgfHwgJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oJy0tbm8tcGx1Z2lucycpOwokZGlzYWJsZVNjcmlwdHMgPSAkZGlzYWJsZVNjcmlwdHMgPT09IHRydWUgfHwgJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oJy0tbm8tc2NyaXB0cycpOwoKJGFwcGxpY2F0aW9uID0gcGFyZW50OjpnZXRBcHBsaWNhdGlvbigpOwppZiAoJGFwcGxpY2F0aW9uIGluc3RhbmNlb2YgQXBwbGljYXRpb24gJiYgJGFwcGxpY2F0aW9uLT5nZXREaXNhYmxlUGx1Z2luc0J5RGVmYXVsdCgpKSB7CiRkaXNhYmxlUGx1Z2lucyA9IHRydWU7Cn0KaWYgKCRhcHBsaWNhdGlvbiBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uICYmICRhcHBsaWNhdGlvbi0+Z2V0RGlzYWJsZVNjcmlwdHNCeURlZmF1bHQoKSkgewokZGlzYWJsZVNjcmlwdHMgPSB0cnVlOwp9CgpyZXR1cm4gRmFjdG9yeTo6Y3JlYXRlKCRpbywgJGNvbmZpZywgJGRpc2FibGVQbHVnaW5zLCAkZGlzYWJsZVNjcmlwdHMpOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRQcmVmZXJyZWRJbnN0YWxsT3B0aW9ucyhDb25maWcgJGNvbmZpZywgSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBib29sICRrZWVwVmNzUmVxdWlyZXNQcmVmZXJTb3VyY2UgPSBmYWxzZSkKewokcHJlZmVyU291cmNlID0gZmFsc2U7CiRwcmVmZXJEaXN0ID0gZmFsc2U7Cgpzd2l0Y2ggKCRjb25maWctPmdldCgncHJlZmVycmVkLWluc3RhbGwnKSkgewpjYXNlICdzb3VyY2UnOgokcHJlZmVyU291cmNlID0gdHJ1ZTsKYnJlYWs7CmNhc2UgJ2Rpc3QnOgokcHJlZmVyRGlzdCA9IHRydWU7CmJyZWFrOwpjYXNlICdhdXRvJzoKZGVmYXVsdDoKCmJyZWFrOwp9CgppZiAoISRpbnB1dC0+aGFzT3B0aW9uKCdwcmVmZXItZGlzdCcpIHx8ICEkaW5wdXQtPmhhc09wdGlvbigncHJlZmVyLXNvdXJjZScpKSB7CnJldHVybiBbJHByZWZlclNvdXJjZSwgJHByZWZlckRpc3RdOwp9CgppZiAoJGlucHV0LT5oYXNPcHRpb24oJ3ByZWZlci1pbnN0YWxsJykgJiYgaXNfc3RyaW5nKCRpbnB1dC0+Z2V0T3B0aW9uKCdwcmVmZXItaW5zdGFsbCcpKSkgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3ByZWZlci1zb3VyY2UnKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignLS1wcmVmZXItc291cmNlIGNhbiBub3QgYmUgdXNlZCB0b2dldGhlciB3aXRoIC0tcHJlZmVyLWluc3RhbGwnKTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3ByZWZlci1kaXN0JykpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJy0tcHJlZmVyLWRpc3QgY2FuIG5vdCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggLS1wcmVmZXItaW5zdGFsbCcpOwp9CnN3aXRjaCAoJGlucHV0LT5nZXRPcHRpb24oJ3ByZWZlci1pbnN0YWxsJykpIHsKY2FzZSAnZGlzdCc6CiRpbnB1dC0+c2V0T3B0aW9uKCdwcmVmZXItZGlzdCcsIHRydWUpOwpicmVhazsKY2FzZSAnc291cmNlJzoKJGlucHV0LT5zZXRPcHRpb24oJ3ByZWZlci1zb3VyY2UnLCB0cnVlKTsKYnJlYWs7CmNhc2UgJ2F1dG8nOgokcHJlZmVyRGlzdCA9IGZhbHNlOwokcHJlZmVyU291cmNlID0gZmFsc2U7CmJyZWFrOwpkZWZhdWx0Ogp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignLS1wcmVmZXItaW5zdGFsbCBhY2NlcHRzIG9uZSBvZiAiZGlzdCIsICJzb3VyY2UiIG9yICJhdXRvIiwgZ290ICcuJGlucHV0LT5nZXRPcHRpb24oJ3ByZWZlci1pbnN0YWxsJykpOwp9Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbigncHJlZmVyLXNvdXJjZScpIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCdwcmVmZXItZGlzdCcpIHx8ICgka2VlcFZjc1JlcXVpcmVzUHJlZmVyU291cmNlICYmICRpbnB1dC0+aGFzT3B0aW9uKCdrZWVwLXZjcycpICYmICRpbnB1dC0+Z2V0T3B0aW9uKCdrZWVwLXZjcycpKSkgewokcHJlZmVyU291cmNlID0gJGlucHV0LT5nZXRPcHRpb24oJ3ByZWZlci1zb3VyY2UnKSB8fCAoJGtlZXBWY3NSZXF1aXJlc1ByZWZlclNvdXJjZSAmJiAkaW5wdXQtPmhhc09wdGlvbigna2VlcC12Y3MnKSAmJiAkaW5wdXQtPmdldE9wdGlvbigna2VlcC12Y3MnKSk7CiRwcmVmZXJEaXN0ID0gJGlucHV0LT5nZXRPcHRpb24oJ3ByZWZlci1kaXN0Jyk7Cn0KCnJldHVybiBbJHByZWZlclNvdXJjZSwgJHByZWZlckRpc3RdOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcihJbnB1dEludGVyZmFjZSAkaW5wdXQpOiBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlCnsKaWYgKCEkaW5wdXQtPmhhc09wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcXMnKSB8fCAhJGlucHV0LT5oYXNPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXEnKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdDYWxsaW5nIGdldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgZnJvbSBhIGNvbW1hbmQgd2hpY2ggZG9lcyBub3QgZGVmaW5lIHRoZSAtLWlnbm9yZS1wbGF0Zm9ybS1yZXFbc10gZmxhZ3MgaXMgbm90IHBlcm1pdHRlZC4nKTsKfQoKaWYgKHRydWUgPT09ICRpbnB1dC0+Z2V0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxcycpKSB7CnJldHVybiBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTo6aWdub3JlQWxsKCk7Cn0KCiRpZ25vcmVzID0gJGlucHV0LT5nZXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXEnKTsKaWYgKGNvdW50KCRpZ25vcmVzKSA+IDApIHsKcmV0dXJuIFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5Ojpmcm9tQm9vbE9yTGlzdCgkaWdub3Jlcyk7Cn0KCnJldHVybiBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTo6aWdub3JlTm90aGluZygpOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBmb3JtYXRSZXF1aXJlbWVudHMoYXJyYXkgJHJlcXVpcmVtZW50cykKewokcmVxdWlyZXMgPSBbXTsKJHJlcXVpcmVtZW50cyA9ICR0aGlzLT5ub3JtYWxpemVSZXF1aXJlbWVudHMoJHJlcXVpcmVtZW50cyk7CmZvcmVhY2ggKCRyZXF1aXJlbWVudHMgYXMgJHJlcXVpcmVtZW50KSB7CmlmICghaXNzZXQoJHJlcXVpcmVtZW50Wyd2ZXJzaW9uJ10pKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdPcHRpb24gJy4kcmVxdWlyZW1lbnRbJ25hbWUnXSAuJyBpcyBtaXNzaW5nIGEgdmVyc2lvbiBjb25zdHJhaW50LCB1c2UgZS5nLiAnLiRyZXF1aXJlbWVudFsnbmFtZSddLic6XjEuMCcpOwp9CiRyZXF1aXJlc1skcmVxdWlyZW1lbnRbJ25hbWUnXV0gPSAkcmVxdWlyZW1lbnRbJ3ZlcnNpb24nXTsKfQoKcmV0dXJuICRyZXF1aXJlczsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gbm9ybWFsaXplUmVxdWlyZW1lbnRzKGFycmF5ICRyZXF1aXJlbWVudHMpCnsKJHBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyKCk7CgpyZXR1cm4gJHBhcnNlci0+cGFyc2VOYW1lVmVyc2lvblBhaXJzKCRyZXF1aXJlbWVudHMpOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiByZW5kZXJUYWJsZShhcnJheSAkdGFibGUsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KQp7CiRyZW5kZXJlciA9IG5ldyBUYWJsZSgkb3V0cHV0KTsKJHJlbmRlcmVyLT5zZXRTdHlsZSgnY29tcGFjdCcpOwokcmVuZGVyZXItPnNldFJvd3MoJHRhYmxlKS0+cmVuZGVyKCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRUZXJtaW5hbFdpZHRoKCkKewokdGVybWluYWwgPSBuZXcgVGVybWluYWwoKTsKJHdpZHRoID0gJHRlcm1pbmFsLT5nZXRXaWR0aCgpOwoKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewokd2lkdGgtLTsKfSBlbHNlIHsKJHdpZHRoID0gbWF4KDgwLCAkd2lkdGgpOwp9CgpyZXR1cm4gJHdpZHRoOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRBdWRpdEZvcm1hdChJbnB1dEludGVyZmFjZSAkaW5wdXQsIHN0cmluZyAkb3B0TmFtZSA9ICdhdWRpdC1mb3JtYXQnKTogc3RyaW5nCnsKaWYgKCEkaW5wdXQtPmhhc09wdGlvbigkb3B0TmFtZSkpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiBhIENvbW1hbmQgd2hpY2ggaGFzIG5vICcuJG9wdE5hbWUuJyBvcHRpb24gZGVmaW5lZC4nKTsKfQoKJHZhbCA9ICRpbnB1dC0+Z2V0T3B0aW9uKCRvcHROYW1lKTsKaWYgKCFpbl9hcnJheSgkdmFsLCBBdWRpdG9yOjpGT1JNQVRTLCB0cnVlKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignLS0nLiRvcHROYW1lLicgbXVzdCBiZSBvbmUgb2YgJy5pbXBsb2RlKCcsICcsIEF1ZGl0b3I6OkZPUk1BVFMpLicuJyk7Cn0KCnJldHVybiAkdmFsOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjcmVhdGVBdWRpdENvbmZpZyhDb25maWcgJGNvbmZpZywgSW5wdXRJbnRlcmZhY2UgJGlucHV0KTogQXVkaXRDb25maWcKewoKaWYgKCRpbnB1dC0+aGFzT3B0aW9uKCdhdWRpdCcpKSB7CiRhdWRpdCA9IChib29sKSAkaW5wdXQtPmdldE9wdGlvbignYXVkaXQnKTsKfSBlbHNlIHsKJGF1ZGl0ID0gISgkaW5wdXQtPmhhc09wdGlvbignbm8tYXVkaXQnKSAmJiAkaW5wdXQtPmdldE9wdGlvbignbm8tYXVkaXQnKSk7Cn0KJGF1ZGl0Rm9ybWF0ID0gJGlucHV0LT5oYXNPcHRpb24oJ2F1ZGl0LWZvcm1hdCcpID8gJHRoaXMtPmdldEF1ZGl0Rm9ybWF0KCRpbnB1dCkgOiBBdWRpdG9yOjpGT1JNQVRfU1VNTUFSWTsKCiRhdWRpdENvbmZpZyA9IEF1ZGl0Q29uZmlnOjpmcm9tQ29uZmlnKCRjb25maWcsICRhdWRpdCwgJGF1ZGl0Rm9ybWF0KTsKCmlmICgoYm9vbCkgUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfTk9fU0VDVVJJVFlfQkxPQ0tJTkcnKSB8fCAoJGlucHV0LT5oYXNPcHRpb24oJ25vLXNlY3VyaXR5LWJsb2NraW5nJykgJiYgJGlucHV0LT5nZXRPcHRpb24oJ25vLXNlY3VyaXR5LWJsb2NraW5nJykpKSB7CiRhdWRpdENvbmZpZyA9IG5ldyBBdWRpdENvbmZpZygKJGF1ZGl0Q29uZmlnLT5hdWRpdCwKJGF1ZGl0Q29uZmlnLT5hdWRpdEZvcm1hdCwKJGF1ZGl0Q29uZmlnLT5hdWRpdEFiYW5kb25lZCwKZmFsc2UsIAokYXVkaXRDb25maWctPmJsb2NrQWJhbmRvbmVkLAokYXVkaXRDb25maWctPmlnbm9yZVVucmVhY2hhYmxlLAokYXVkaXRDb25maWctPmlnbm9yZUxpc3RGb3JBdWRpdCwKJGF1ZGl0Q29uZmlnLT5pZ25vcmVMaXN0Rm9yQmxvY2tpbmcsCiRhdWRpdENvbmZpZy0+aWdub3JlU2V2ZXJpdHlGb3JBdWRpdCwKJGF1ZGl0Q29uZmlnLT5pZ25vcmVTZXZlcml0eUZvckJsb2NraW5nLAokYXVkaXRDb25maWctPmlnbm9yZUFiYW5kb25lZEZvckF1ZGl0LAokYXVkaXRDb25maWctPmlnbm9yZUFiYW5kb25lZEZvckJsb2NraW5nCik7Cn0KCnJldHVybiAkYXVkaXRDb25maWc7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxDb25maWdcSnNvbkNvbmZpZ1NvdXJjZTsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxGYWN0b3J5Owp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFV0aWxcU2lsZW5jZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKYWJzdHJhY3QgY2xhc3MgQmFzZUNvbmZpZ0NvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CgoKCnByb3RlY3RlZCAkY29uZmlnOwoKCgoKcHJvdGVjdGVkICRjb25maWdGaWxlOwoKCgoKcHJvdGVjdGVkICRjb25maWdTb3VyY2U7Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdGlhbGl6ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogdm9pZAp7CnBhcmVudDo6aW5pdGlhbGl6ZSgkaW5wdXQsICRvdXRwdXQpOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdnbG9iYWwnKSAmJiBudWxsICE9PSAkaW5wdXQtPmdldE9wdGlvbignZmlsZScpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignLS1maWxlIGFuZCAtLWdsb2JhbCBjYW4gbm90IGJlIGNvbWJpbmVkJyk7Cn0KCiRpbyA9ICR0aGlzLT5nZXRJTygpOwokdGhpcy0+Y29uZmlnID0gRmFjdG9yeTo6Y3JlYXRlQ29uZmlnKCRpbyk7CgoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdnbG9iYWwnKSkgewokdGhpcy0+Y29uZmlnLT5zZXRCYXNlRGlyKCR0aGlzLT5jb25maWctPmdldCgnaG9tZScpKTsKfQoKJGNvbmZpZ0ZpbGUgPSAkdGhpcy0+Z2V0Q29tcG9zZXJDb25maWdGaWxlKCRpbnB1dCwgJHRoaXMtPmNvbmZpZyk7CgoKaWYgKAooJGNvbmZpZ0ZpbGUgPT09ICdjb21wb3Nlci5qc29uJyB8fCAkY29uZmlnRmlsZSA9PT0gJy4vY29tcG9zZXIuanNvbicpCiYmICFmaWxlX2V4aXN0cygkY29uZmlnRmlsZSkKJiYgcmVhbHBhdGgoUGxhdGZvcm06OmdldEN3ZCgpKSA9PT0gcmVhbHBhdGgoJHRoaXMtPmNvbmZpZy0+Z2V0KCdob21lJykpCikgewpmaWxlX3B1dF9jb250ZW50cygkY29uZmlnRmlsZSwgIntcbn1cbiIpOwp9CgokdGhpcy0+Y29uZmlnRmlsZSA9IG5ldyBKc29uRmlsZSgkY29uZmlnRmlsZSwgbnVsbCwgJGlvKTsKJHRoaXMtPmNvbmZpZ1NvdXJjZSA9IG5ldyBKc29uQ29uZmlnU291cmNlKCR0aGlzLT5jb25maWdGaWxlKTsKCgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2dsb2JhbCcpICYmICEkdGhpcy0+Y29uZmlnRmlsZS0+ZXhpc3RzKCkpIHsKdG91Y2goJHRoaXMtPmNvbmZpZ0ZpbGUtPmdldFBhdGgoKSk7CiR0aGlzLT5jb25maWdGaWxlLT53cml0ZShbJ2NvbmZpZycgPT4gbmV3IFxBcnJheU9iamVjdF0pOwpTaWxlbmNlcjo6Y2FsbCgnY2htb2QnLCAkdGhpcy0+Y29uZmlnRmlsZS0+Z2V0UGF0aCgpLCAwNjAwKTsKfQoKaWYgKCEkdGhpcy0+Y29uZmlnRmlsZS0+ZXhpc3RzKCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJ0ZpbGUgIiVzIiBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5JywgJGNvbmZpZ0ZpbGUpKTsKfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Q29tcG9zZXJDb25maWdGaWxlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgQ29uZmlnICRjb25maWcpOiBzdHJpbmcKewpyZXR1cm4gJGlucHV0LT5nZXRPcHRpb24oJ2dsb2JhbCcpCj8gKCRjb25maWctPmdldCgnaG9tZScpIC4gJy9jb25maWcuanNvbicpCjogKCRpbnB1dC0+Z2V0T3B0aW9uKCdmaWxlJykgPz8gRmFjdG9yeTo6Z2V0Q29tcG9zZXJGaWxlKCkpCjsKfQoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRBdXRoQ29uZmlnRmlsZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIENvbmZpZyAkY29uZmlnKTogc3RyaW5nCnsKcmV0dXJuICRpbnB1dC0+Z2V0T3B0aW9uKCdnbG9iYWwnKQo/ICgkY29uZmlnLT5nZXQoJ2hvbWUnKSAuICcvYXV0aC5qc29uJykKOiBkaXJuYW1lKCR0aGlzLT5nZXRDb21wb3NlckNvbmZpZ0ZpbGUoJGlucHV0LCAkY29uZmlnKSkgLiAnL2F1dGguanNvbicKOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxMaW5rOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRBcnJheVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XENvbXBvc2l0ZVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJvb3RQYWNrYWdlUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5RmFjdG9yeTsKdXNlIENvbXBvc2VyXFBsdWdpblxDb21tYW5kRXZlbnQ7CnVzZSBDb21wb3NlclxQbHVnaW5cUGx1Z2luRXZlbnRzOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQm91bmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXJTdHlsZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXFV0aWxcUGFja2FnZUluZm87CgoKCgoKCmFic3RyYWN0IGNsYXNzIEJhc2VEZXBlbmRlbmN5Q29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKcHJvdGVjdGVkIGNvbnN0IEFSR1VNRU5UX1BBQ0tBR0UgPSAncGFja2FnZSc7CnByb3RlY3RlZCBjb25zdCBBUkdVTUVOVF9DT05TVFJBSU5UID0gJ3ZlcnNpb24nOwpwcm90ZWN0ZWQgY29uc3QgT1BUSU9OX1JFQ1VSU0lWRSA9ICdyZWN1cnNpdmUnOwpwcm90ZWN0ZWQgY29uc3QgT1BUSU9OX1RSRUUgPSAndHJlZSc7CgoKcHJvdGVjdGVkICRjb2xvcnM7CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9FeGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIGJvb2wgJGludmVydGVkID0gZmFsc2UpOiBpbnQKewoKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwokY29tbWFuZEV2ZW50ID0gbmV3IENvbW1hbmRFdmVudChQbHVnaW5FdmVudHM6OkNPTU1BTkQsICR0aGlzLT5nZXROYW1lKCksICRpbnB1dCwgJG91dHB1dCk7CiRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmRpc3BhdGNoKCRjb21tYW5kRXZlbnQtPmdldE5hbWUoKSwgJGNvbW1hbmRFdmVudCk7CgokcmVwb3MgPSBbXTsKCiRyZXBvc1tdID0gbmV3IFJvb3RQYWNrYWdlUmVwb3NpdG9yeShjbG9uZSAkY29tcG9zZXItPmdldFBhY2thZ2UoKSk7CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2xvY2tlZCcpKSB7CiRsb2NrZXIgPSAkY29tcG9zZXItPmdldExvY2tlcigpOwoKaWYgKCEkbG9ja2VyLT5pc0xvY2tlZCgpKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdBIHZhbGlkIGNvbXBvc2VyLmxvY2sgZmlsZSBpcyByZXF1aXJlZCB0byBydW4gdGhpcyBjb21tYW5kIHdpdGggLS1sb2NrZWQnKTsKfQoKJHJlcG9zW10gPSAkbG9ja2VyLT5nZXRMb2NrZWRSZXBvc2l0b3J5KHRydWUpOwokcmVwb3NbXSA9IG5ldyBQbGF0Zm9ybVJlcG9zaXRvcnkoW10sICRsb2NrZXItPmdldFBsYXRmb3JtT3ZlcnJpZGVzKCkpOwp9IGVsc2UgewokbG9jYWxSZXBvID0gJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKJHJvb3RQa2cgPSAkY29tcG9zZXItPmdldFBhY2thZ2UoKTsKCmlmIChjb3VudCgkbG9jYWxSZXBvLT5nZXRQYWNrYWdlcygpKSA9PT0gMCAmJiAoY291bnQoJHJvb3RQa2ctPmdldFJlcXVpcmVzKCkpID4gMCB8fCBjb3VudCgkcm9vdFBrZy0+Z2V0RGV2UmVxdWlyZXMoKSkgPiAwKSkgewokb3V0cHV0LT53cml0ZWxuKCc8d2FybmluZz5ObyBkZXBlbmRlbmNpZXMgaW5zdGFsbGVkLiBUcnkgcnVubmluZyBjb21wb3NlciBpbnN0YWxsIG9yIHVwZGF0ZSwgb3IgdXNlIC0tbG9ja2VkLjwvd2FybmluZz4nKTsKCnJldHVybiAxOwp9CgokcmVwb3NbXSA9ICRsb2NhbFJlcG87CgokcGxhdGZvcm1PdmVycmlkZXMgPSAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ3BsYXRmb3JtJykgPzogW107CiRyZXBvc1tdID0gbmV3IFBsYXRmb3JtUmVwb3NpdG9yeShbXSwgJHBsYXRmb3JtT3ZlcnJpZGVzKTsKfQoKJGluc3RhbGxlZFJlcG8gPSBuZXcgSW5zdGFsbGVkUmVwb3NpdG9yeSgkcmVwb3MpOwoKCiRuZWVkbGUgPSAkaW5wdXQtPmdldEFyZ3VtZW50KHNlbGY6OkFSR1VNRU5UX1BBQ0tBR0UpOwokdGV4dENvbnN0cmFpbnQgPSAkaW5wdXQtPmhhc0FyZ3VtZW50KHNlbGY6OkFSR1VNRU5UX0NPTlNUUkFJTlQpID8gJGlucHV0LT5nZXRBcmd1bWVudChzZWxmOjpBUkdVTUVOVF9DT05TVFJBSU5UKSA6ICcqJzsKCgokcGFja2FnZXMgPSAkaW5zdGFsbGVkUmVwby0+ZmluZFBhY2thZ2VzV2l0aFJlcGxhY2Vyc0FuZFByb3ZpZGVycygkbmVlZGxlKTsKaWYgKGVtcHR5KCRwYWNrYWdlcykpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignQ291bGQgbm90IGZpbmQgcGFja2FnZSAiJXMiIGluIHlvdXIgcHJvamVjdCcsICRuZWVkbGUpKTsKfQoKCgokbWF0Y2hlZFBhY2thZ2UgPSAkaW5zdGFsbGVkUmVwby0+ZmluZFBhY2thZ2UoJG5lZWRsZSwgJHRleHRDb25zdHJhaW50KTsKaWYgKCEkbWF0Y2hlZFBhY2thZ2UpIHsKJGRlZmF1bHRSZXBvcyA9IG5ldyBDb21wb3NpdGVSZXBvc2l0b3J5KFJlcG9zaXRvcnlGYWN0b3J5OjpkZWZhdWx0UmVwb3MoJHRoaXMtPmdldElPKCksICRjb21wb3Nlci0+Z2V0Q29uZmlnKCksICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKSkpOwppZiAoJG1hdGNoID0gJGRlZmF1bHRSZXBvcy0+ZmluZFBhY2thZ2UoJG5lZWRsZSwgJHRleHRDb25zdHJhaW50KSkgewokaW5zdGFsbGVkUmVwby0+YWRkUmVwb3NpdG9yeShuZXcgSW5zdGFsbGVkQXJyYXlSZXBvc2l0b3J5KFtjbG9uZSAkbWF0Y2hdKSk7Cn0gZWxzZWlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRuZWVkbGUpKSB7CiRwYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwokY29uc3RyYWludCA9ICRwYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJHRleHRDb25zdHJhaW50KTsKaWYgKCRjb25zdHJhaW50LT5nZXRMb3dlckJvdW5kKCkgIT09IEJvdW5kOjp6ZXJvKCkpIHsKJHRlbXBQbGF0Zm9ybVBrZyA9IG5ldyBQYWNrYWdlKCRuZWVkbGUsICRjb25zdHJhaW50LT5nZXRMb3dlckJvdW5kKCktPmdldFZlcnNpb24oKSwgJGNvbnN0cmFpbnQtPmdldExvd2VyQm91bmQoKS0+Z2V0VmVyc2lvbigpKTsKJGluc3RhbGxlZFJlcG8tPmFkZFJlcG9zaXRvcnkobmV3IEluc3RhbGxlZEFycmF5UmVwb3NpdG9yeShbJHRlbXBQbGF0Zm9ybVBrZ10pKTsKfQp9IGVsc2UgewokdGhpcy0+Z2V0SU8oKS0+d3JpdGVFcnJvcignPGVycm9yPlBhY2thZ2UgIicuJG5lZWRsZS4nIiBjb3VsZCBub3QgYmUgZm91bmQgd2l0aCBjb25zdHJhaW50ICInLiR0ZXh0Q29uc3RyYWludC4nIiwgcmVzdWx0cyBiZWxvdyB3aWxsIG1vc3QgbGlrZWx5IGJlIGluY29tcGxldGUuPC9lcnJvcj4nKTsKfQp9IGVsc2VpZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkbmVlZGxlKSkgewokZXh0cmFOb3RpY2UgPSAnJzsKaWYgKCgkbWF0Y2hlZFBhY2thZ2UtPmdldEV4dHJhKClbJ2NvbmZpZy5wbGF0Zm9ybSddID8/IGZhbHNlKSA9PT0gdHJ1ZSkgewokZXh0cmFOb3RpY2UgPSAnICh2ZXJzaW9uIHByb3ZpZGVkIGJ5IGNvbmZpZy5wbGF0Zm9ybSknOwp9CiR0aGlzLT5nZXRJTygpLT53cml0ZUVycm9yKCc8aW5mbz5QYWNrYWdlICInLiRuZWVkbGUuJyAnLiR0ZXh0Q29uc3RyYWludC4nIiBmb3VuZCBpbiB2ZXJzaW9uICInLiRtYXRjaGVkUGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpLiciJy4kZXh0cmFOb3RpY2UuJy48L2luZm8+Jyk7Cn0gZWxzZWlmICgkaW52ZXJ0ZWQpIHsKJHRoaXMtPmdldElPKCktPndyaXRlKCc8Y29tbWVudD5QYWNrYWdlICInLiRuZWVkbGUuJyIgJy4kbWF0Y2hlZFBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKS4nIGlzIGFscmVhZHkgaW5zdGFsbGVkISBUbyBmaW5kIG91dCB3aHksIHJ1biBgY29tcG9zZXIgd2h5ICcuJG5lZWRsZS4nYDwvY29tbWVudD4nKTsKCnJldHVybiAwOwp9CgoKJG5lZWRsZXMgPSBbJG5lZWRsZV07CmlmICgkaW52ZXJ0ZWQpIHsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRuZWVkbGVzID0gYXJyYXlfbWVyZ2UoJG5lZWRsZXMsIGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKExpbmsgJGxpbmspOiBzdHJpbmcgewpyZXR1cm4gJGxpbmstPmdldFRhcmdldCgpOwp9LCAkcGFja2FnZS0+Z2V0UmVwbGFjZXMoKSkpOwp9Cn0KCgppZiAoJyonICE9PSAkdGV4dENvbnN0cmFpbnQpIHsKJHZlcnNpb25QYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwokY29uc3RyYWludCA9ICR2ZXJzaW9uUGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCR0ZXh0Q29uc3RyYWludCk7Cn0gZWxzZSB7CiRjb25zdHJhaW50ID0gbnVsbDsKfQoKCiRyZW5kZXJUcmVlID0gJGlucHV0LT5nZXRPcHRpb24oc2VsZjo6T1BUSU9OX1RSRUUpOwokcmVjdXJzaXZlID0gJHJlbmRlclRyZWUgfHwgJGlucHV0LT5nZXRPcHRpb24oc2VsZjo6T1BUSU9OX1JFQ1VSU0lWRSk7CgokcmV0dXJuID0gJGludmVydGVkID8gMSA6IDA7CgoKJHJlc3VsdHMgPSAkaW5zdGFsbGVkUmVwby0+Z2V0RGVwZW5kZW50cygkbmVlZGxlcywgJGNvbnN0cmFpbnQsICRpbnZlcnRlZCwgJHJlY3Vyc2l2ZSk7CmlmIChlbXB0eSgkcmVzdWx0cykpIHsKJGV4dHJhID0gKG51bGwgIT09ICRjb25zdHJhaW50KSA/IHNwcmludGYoJyBpbiB2ZXJzaW9ucyAlc21hdGNoaW5nICVzJywgJGludmVydGVkID8gJ25vdCAnIDogJycsICR0ZXh0Q29uc3RyYWludCkgOiAnJzsKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3Ioc3ByaW50ZigKJzxpbmZvPlRoZXJlIGlzIG5vIGluc3RhbGxlZCBwYWNrYWdlIGRlcGVuZGluZyBvbiAiJXMiJXM8L2luZm8+JywKJG5lZWRsZSwKJGV4dHJhCikpOwokcmV0dXJuID0gJGludmVydGVkID8gMCA6IDE7Cn0gZWxzZWlmICgkcmVuZGVyVHJlZSkgewokdGhpcy0+aW5pdFN0eWxlcygkb3V0cHV0KTsKJHJvb3QgPSAkcGFja2FnZXNbMF07CiR0aGlzLT5nZXRJTygpLT53cml0ZShzcHJpbnRmKCc8aW5mbz4lczwvaW5mbz4gJXMgJXMnLCAkcm9vdC0+Z2V0UHJldHR5TmFtZSgpLCAkcm9vdC0+Z2V0UHJldHR5VmVyc2lvbigpLCAkcm9vdCBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSA/ICRyb290LT5nZXREZXNjcmlwdGlvbigpIDogJycpKTsKJHRoaXMtPnByaW50VHJlZSgkcmVzdWx0cyk7Cn0gZWxzZSB7CiR0aGlzLT5wcmludFRhYmxlKCRvdXRwdXQsICRyZXN1bHRzKTsKfQoKaWYgKCRpbnZlcnRlZCAmJiAkaW5wdXQtPmhhc0FyZ3VtZW50KHNlbGY6OkFSR1VNRU5UX0NPTlNUUkFJTlQpICYmICFQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRuZWVkbGUpKSB7CiRjb21wb3NlckNvbW1hbmQgPSAndXBkYXRlJzsKCmZvcmVhY2ggKCRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRSZXF1aXJlcygpIGFzICRyb290UmVxdWlyZW1lbnQpIHsKaWYgKCRyb290UmVxdWlyZW1lbnQtPmdldFRhcmdldCgpID09PSAkbmVlZGxlKSB7CiRjb21wb3NlckNvbW1hbmQgPSAncmVxdWlyZSc7CmJyZWFrOwp9Cn0KCmZvcmVhY2ggKCRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXREZXZSZXF1aXJlcygpIGFzICRyb290UmVxdWlyZW1lbnQpIHsKaWYgKCRyb290UmVxdWlyZW1lbnQtPmdldFRhcmdldCgpID09PSAkbmVlZGxlKSB7CiRjb21wb3NlckNvbW1hbmQgPSAncmVxdWlyZSAtLWRldic7CmJyZWFrOwp9Cn0KCiR0aGlzLT5nZXRJTygpLT53cml0ZUVycm9yKCdOb3QgZmluZGluZyB3aGF0IHlvdSB3ZXJlIGxvb2tpbmcgZm9yPyBUcnkgY2FsbGluZyBgY29tcG9zZXIgJy4kY29tcG9zZXJDb21tYW5kLicgIicuJG5lZWRsZS4nOicuJHRleHRDb25zdHJhaW50LiciIC0tZHJ5LXJ1bmAgdG8gZ2V0IGFub3RoZXIgdmlldyBvbiB0aGUgcHJvYmxlbS4nKTsKfQoKcmV0dXJuICRyZXR1cm47Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHByaW50VGFibGUoT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIGFycmF5ICRyZXN1bHRzKTogdm9pZAp7CiR0YWJsZSA9IFtdOwokZG91YmxlcyA9IFtdOwpkbyB7CiRxdWV1ZSA9IFtdOwokcm93cyA9IFtdOwpmb3JlYWNoICgkcmVzdWx0cyBhcyAkcmVzdWx0KSB7CgoKCgpbJHBhY2thZ2UsICRsaW5rLCAkY2hpbGRyZW5dID0gJHJlc3VsdDsKJHVuaXF1ZSA9IChzdHJpbmcpICRsaW5rOwppZiAoaXNzZXQoJGRvdWJsZXNbJHVuaXF1ZV0pKSB7CmNvbnRpbnVlOwp9CiRkb3VibGVzWyR1bmlxdWVdID0gdHJ1ZTsKJHZlcnNpb24gPSAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpID09PSBSb290UGFja2FnZTo6REVGQVVMVF9QUkVUVFlfVkVSU0lPTiA/ICctJyA6ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCk7CiRwYWNrYWdlVXJsID0gUGFja2FnZUluZm86OmdldFZpZXdTb3VyY2VPckhvbWVwYWdlVXJsKCRwYWNrYWdlKTsKJG5hbWVXaXRoTGluayA9ICRwYWNrYWdlVXJsICE9PSBudWxsID8gJzxocmVmPScgLiBPdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkcGFja2FnZVVybCkgLiAnPicgLiAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpIC4gJzwvPicgOiAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpOwokcm93c1tdID0gWyRuYW1lV2l0aExpbmssICR2ZXJzaW9uLCAkbGluay0+Z2V0RGVzY3JpcHRpb24oKSwgc3ByaW50ZignJXMgKCVzKScsICRsaW5rLT5nZXRUYXJnZXQoKSwgJGxpbmstPmdldFByZXR0eUNvbnN0cmFpbnQoKSldOwppZiAoaXNfYXJyYXkoJGNoaWxkcmVuKSkgewokcXVldWUgPSBhcnJheV9tZXJnZSgkcXVldWUsICRjaGlsZHJlbik7Cn0KfQokcmVzdWx0cyA9ICRxdWV1ZTsKJHRhYmxlID0gYXJyYXlfbWVyZ2UoJHJvd3MsICR0YWJsZSk7Cn0gd2hpbGUgKFxjb3VudCgkcmVzdWx0cykgPiAwKTsKCiR0aGlzLT5yZW5kZXJUYWJsZSgkdGFibGUsICRvdXRwdXQpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdFN0eWxlcyhPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IHZvaWQKewokdGhpcy0+Y29sb3JzID0gWwonZ3JlZW4nLAoneWVsbG93JywKJ2N5YW4nLAonbWFnZW50YScsCidibHVlJywKXTsKCmZvcmVhY2ggKCR0aGlzLT5jb2xvcnMgYXMgJGNvbG9yKSB7CiRzdHlsZSA9IG5ldyBPdXRwdXRGb3JtYXR0ZXJTdHlsZSgkY29sb3IpOwokb3V0cHV0LT5nZXRGb3JtYXR0ZXIoKS0+c2V0U3R5bGUoJGNvbG9yLCAkc3R5bGUpOwp9Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJpbnRUcmVlKGFycmF5ICRyZXN1bHRzLCBzdHJpbmcgJHByZWZpeCA9ICcnLCBpbnQgJGxldmVsID0gMSk6IHZvaWQKewokY291bnQgPSBjb3VudCgkcmVzdWx0cyk7CiRpZHggPSAwOwpmb3JlYWNoICgkcmVzdWx0cyBhcyAkcmVzdWx0KSB7ClskcGFja2FnZSwgJGxpbmssICRjaGlsZHJlbl0gPSAkcmVzdWx0OwoKJGNvbG9yID0gJHRoaXMtPmNvbG9yc1skbGV2ZWwgJSBjb3VudCgkdGhpcy0+Y29sb3JzKV07CiRwcmV2Q29sb3IgPSAkdGhpcy0+Y29sb3JzWygkbGV2ZWwgLSAxKSAlIGNvdW50KCR0aGlzLT5jb2xvcnMpXTsKJGlzTGFzdCA9ICgrKyRpZHggPT09ICRjb3VudCk7CiR2ZXJzaW9uVGV4dCA9ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkgPT09IFJvb3RQYWNrYWdlOjpERUZBVUxUX1BSRVRUWV9WRVJTSU9OID8gJycgOiAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwokcGFja2FnZVVybCA9IFBhY2thZ2VJbmZvOjpnZXRWaWV3U291cmNlT3JIb21lcGFnZVVybCgkcGFja2FnZSk7CiRuYW1lV2l0aExpbmsgPSAkcGFja2FnZVVybCAhPT0gbnVsbCA/ICc8aHJlZj0nIC4gT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJHBhY2thZ2VVcmwpIC4gJz4nIC4gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKSAuICc8Lz4nIDogJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKTsKJHBhY2thZ2VUZXh0ID0gcnRyaW0oc3ByaW50ZignPCVzPiVzPC8lMSRzPiAlcycsICRjb2xvciwgJG5hbWVXaXRoTGluaywgJHZlcnNpb25UZXh0KSk7CiRsaW5rVGV4dCA9IHNwcmludGYoJyVzIDwlcz4lczwvJTIkcz4gJXMnLCAkbGluay0+Z2V0RGVzY3JpcHRpb24oKSwgJHByZXZDb2xvciwgJGxpbmstPmdldFRhcmdldCgpLCAkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpKTsKJGNpcmN1bGFyV2FybiA9ICRjaGlsZHJlbiA9PT0gZmFsc2UgPyAnKGNpcmN1bGFyIGRlcGVuZGVuY3kgYWJvcnRlZCBoZXJlKScgOiAnJzsKJHRoaXMtPndyaXRlVHJlZUxpbmUocnRyaW0oc3ByaW50ZigiJXMlcyVzICglcykgJXMiLCAkcHJlZml4LCAkaXNMYXN0ID8gJ+KUlOKUgOKUgCcgOiAn4pSc4pSA4pSAJywgJHBhY2thZ2VUZXh0LCAkbGlua1RleHQsICRjaXJjdWxhcldhcm4pKSk7CmlmIChpc19hcnJheSgkY2hpbGRyZW4pKSB7CiR0aGlzLT5wcmludFRyZWUoJGNoaWxkcmVuLCAkcHJlZml4IC4gKCRpc0xhc3QgPyAnICAgJyA6ICfilIIgICcpLCAkbGV2ZWwgKyAxKTsKfQp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gd3JpdGVUcmVlTGluZShzdHJpbmcgJGxpbmUpOiB2b2lkCnsKJGlvID0gJHRoaXMtPmdldElPKCk7CmlmICghJGlvLT5pc0RlY29yYXRlZCgpKSB7CiRsaW5lID0gc3RyX3JlcGxhY2UoWyfilJQnLCAn4pScJywgJ+KUgOKUgCcsICfilIInXSwgWydgLScsICd8LScsICctJywgJ3wnXSwgJGxpbmUpOwp9CgokaW8tPndyaXRlKCRsaW5lKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25CdW1wZXI7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXEZhY3Rvcnk7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uTWFuaXB1bGF0b3I7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFV0aWxcU2lsZW5jZXI7CgoKCgpmaW5hbCBjbGFzcyBCdW1wQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKcHJpdmF0ZSBjb25zdCBFUlJPUl9HRU5FUklDID0gMTsKcHJpdmF0ZSBjb25zdCBFUlJPUl9MT0NLX09VVERBVEVEID0gMjsKCnVzZSBDb21wbGV0aW9uVHJhaXQ7Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ2J1bXAnKQotPnNldERlc2NyaXB0aW9uKCdJbmNyZWFzZXMgdGhlIGxvd2VyIGxpbWl0IG9mIHlvdXIgY29tcG9zZXIuanNvbiByZXF1aXJlbWVudHMgdG8gdGhlIGN1cnJlbnRseSBpbnN0YWxsZWQgdmVyc2lvbnMnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRBcmd1bWVudCgncGFja2FnZXMnLCBJbnB1dEFyZ3VtZW50OjpJU19BUlJBWSB8IElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnT3B0aW9uYWwgcGFja2FnZSBuYW1lKHMpIHRvIHJlc3RyaWN0IHdoaWNoIHBhY2thZ2VzIGFyZSBidW1wZWQuJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RSb290UmVxdWlyZW1lbnQoKSksCm5ldyBJbnB1dE9wdGlvbignZGV2LW9ubHknLCAnRCcsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT25seSBidW1wIHJlcXVpcmVtZW50cyBpbiAicmVxdWlyZS1kZXYiLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLWRldi1vbmx5JywgJ1InLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ09ubHkgYnVtcCByZXF1aXJlbWVudHMgaW4gInJlcXVpcmUiLicpLApuZXcgSW5wdXRPcHRpb24oJ2RyeS1ydW4nLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ091dHB1dHMgdGhlIHBhY2thZ2VzIHRvIGJ1bXAsIGJ1dCB3aWxsIG5vdCBleGVjdXRlIGFueXRoaW5nLicpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgPGluZm8+YnVtcDwvaW5mbz4gY29tbWFuZCBpbmNyZWFzZXMgdGhlIGxvd2VyIGxpbWl0IG9mIHlvdXIgY29tcG9zZXIuanNvbiByZXF1aXJlbWVudHMKdG8gdGhlIGN1cnJlbnRseSBpbnN0YWxsZWQgdmVyc2lvbnMuIFRoaXMgaGVscHMgdG8gZW5zdXJlIHlvdXIgZGVwZW5kZW5jaWVzIGRvIG5vdAphY2NpZGVudGFsbHkgZ2V0IGRvd25ncmFkZWQgZHVlIHRvIHNvbWUgb3RoZXIgY29uZmxpY3QsIGFuZCBjYW4gc2xpZ2h0bHkgaW1wcm92ZQpkZXBlbmRlbmN5IHJlc29sdXRpb24gcGVyZm9ybWFuY2UgYXMgaXQgbGltaXRzIHRoZSBhbW91bnQgb2YgcGFja2FnZSB2ZXJzaW9ucwpDb21wb3NlciBoYXMgdG8gbG9vayBhdC4KClJ1bm5pbmcgdGhpcyBibGluZGx5IG9uIGxpYnJhcmllcyBpcyAqKk5PVCoqIHJlY29tbWVuZGVkIGFzIGl0IHdpbGwgbmFycm93IGRvd24KeW91ciBhbGxvd2VkIGRlcGVuZGVuY2llcywgd2hpY2ggbWF5IGNhdXNlIGRlcGVuZGVuY3kgaGVsbCBmb3IgeW91ciB1c2Vycy4KUnVubmluZyBpdCB3aXRoIDxpbmZvPi0tZGV2LW9ubHk8L2luZm8+IG9uIGxpYnJhcmllcyBtYXkgYmUgZmluZSBob3dldmVyIGFzIGRldiByZXF1aXJlbWVudHMKYXJlIGxvY2FsIHRvIHRoZSBsaWJyYXJ5IGFuZCBkbyBub3QgYWZmZWN0IGNvbnN1bWVycyBvZiB0aGUgcGFja2FnZS4KCkVPVAopCjsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CnJldHVybiAkdGhpcy0+ZG9CdW1wKAokdGhpcy0+Z2V0SU8oKSwKJGlucHV0LT5nZXRPcHRpb24oJ2Rldi1vbmx5JyksCiRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYtb25seScpLAokaW5wdXQtPmdldE9wdGlvbignZHJ5LXJ1bicpLAokaW5wdXQtPmdldEFyZ3VtZW50KCdwYWNrYWdlcycpCik7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRvQnVtcCgKSU9JbnRlcmZhY2UgJGlvLApib29sICRkZXZPbmx5LApib29sICRub0Rldk9ubHksCmJvb2wgJGRyeVJ1biwKYXJyYXkgJHBhY2thZ2VzRmlsdGVyLApzdHJpbmcgJGRldk9ubHlGbGFnSGludCA9ICctLWRldi1vbmx5JwopOiBpbnQgewoKJGNvbXBvc2VySnNvblBhdGggPSBGYWN0b3J5OjpnZXRDb21wb3NlckZpbGUoKTsKCmlmICghRmlsZXN5c3RlbTo6aXNSZWFkYWJsZSgkY29tcG9zZXJKc29uUGF0aCkpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Jy4kY29tcG9zZXJKc29uUGF0aC4nIGlzIG5vdCByZWFkYWJsZS48L2Vycm9yPicpOwoKcmV0dXJuIHNlbGY6OkVSUk9SX0dFTkVSSUM7Cn0KCiRjb21wb3Nlckpzb24gPSBuZXcgSnNvbkZpbGUoJGNvbXBvc2VySnNvblBhdGgpOwokY29udGVudHMgPSBmaWxlX2dldF9jb250ZW50cygkY29tcG9zZXJKc29uLT5nZXRQYXRoKCkpOwppZiAoZmFsc2UgPT09ICRjb250ZW50cykgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj4nLiRjb21wb3Nlckpzb25QYXRoLicgaXMgbm90IHJlYWRhYmxlLjwvZXJyb3I+Jyk7CgpyZXR1cm4gc2VsZjo6RVJST1JfR0VORVJJQzsKfQoKCgppZiAoIWlzX3dyaXRhYmxlKCRjb21wb3Nlckpzb25QYXRoKSAmJiBmYWxzZSA9PT0gU2lsZW5jZXI6OmNhbGwoJ2ZpbGVfcHV0X2NvbnRlbnRzJywgJGNvbXBvc2VySnNvblBhdGgsICRjb250ZW50cykpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Jy4kY29tcG9zZXJKc29uUGF0aC4nIGlzIG5vdCB3cml0YWJsZS48L2Vycm9yPicpOwoKcmV0dXJuIHNlbGY6OkVSUk9SX0dFTkVSSUM7Cn0KdW5zZXQoJGNvbnRlbnRzKTsKCiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKJGhhc0xvY2tmaWxlRGlzYWJsZWQgPSAhJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+aGFzKCdsb2NrJykgfHwgJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdsb2NrJyk7CmlmICghJGhhc0xvY2tmaWxlRGlzYWJsZWQpIHsKJHJlcG8gPSAkY29tcG9zZXItPmdldExvY2tlcigpLT5nZXRMb2NrZWRSZXBvc2l0b3J5KHRydWUpOwp9IGVsc2VpZiAoJGNvbXBvc2VyLT5nZXRMb2NrZXIoKS0+aXNMb2NrZWQoKSkgewppZiAoISRjb21wb3Nlci0+Z2V0TG9ja2VyKCktPmlzRnJlc2goKSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5UaGUgbG9jayBmaWxlIGlzIG5vdCB1cCB0byBkYXRlIHdpdGggdGhlIGxhdGVzdCBjaGFuZ2VzIGluIGNvbXBvc2VyLmpzb24uIFJ1biB0aGUgYXBwcm9wcmlhdGUgYHVwZGF0ZWAgdG8gZml4IHRoYXQgYmVmb3JlIHlvdSB1c2UgdGhlIGBidW1wYCBjb21tYW5kLjwvZXJyb3I+Jyk7CgpyZXR1cm4gc2VsZjo6RVJST1JfTE9DS19PVVREQVRFRDsKfQoKJHJlcG8gPSAkY29tcG9zZXItPmdldExvY2tlcigpLT5nZXRMb2NrZWRSZXBvc2l0b3J5KHRydWUpOwp9IGVsc2UgewokcmVwbyA9ICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7Cn0KCmlmICgkY29tcG9zZXItPmdldFBhY2thZ2UoKS0+Z2V0VHlwZSgpICE9PSAncHJvamVjdCcgJiYgISRkZXZPbmx5KSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+V2FybmluZzogQnVtcGluZyBkZXBlbmRlbmN5IGNvbnN0cmFpbnRzIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgbGlicmFyaWVzIGFzIGl0IHdpbGwgbmFycm93IGRvd24geW91ciBkZXBlbmRlbmNpZXMgYW5kIG1heSBjYXVzZSBwcm9ibGVtcyBmb3IgeW91ciB1c2Vycy48L3dhcm5pbmc+Jyk7CgokY29udGVudHMgPSAkY29tcG9zZXJKc29uLT5yZWFkKCk7CmlmICghaXNzZXQoJGNvbnRlbnRzWyd0eXBlJ10pKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+SWYgeW91ciBwYWNrYWdlIGlzIG5vdCBhIGxpYnJhcnksIHlvdSBjYW4gZXhwbGljaXRseSBzcGVjaWZ5IHRoZSAidHlwZSIgYnkgdXNpbmcgImNvbXBvc2VyIGNvbmZpZyB0eXBlIHByb2plY3QiLjwvd2FybmluZz4nKTsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5BbHRlcm5hdGl2ZWx5IHlvdSBjYW4gdXNlICcuJGRldk9ubHlGbGFnSGludC4nIHRvIG9ubHkgYnVtcCBkZXBlbmRlbmNpZXMgd2l0aGluICJyZXF1aXJlLWRldiIuPC93YXJuaW5nPicpOwp9CnVuc2V0KCRjb250ZW50cyk7Cn0KCiRidW1wZXIgPSBuZXcgVmVyc2lvbkJ1bXBlcigpOwokdGFza3MgPSBbXTsKaWYgKCEkZGV2T25seSkgewokdGFza3NbJ3JlcXVpcmUnXSA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRSZXF1aXJlcygpOwp9CmlmICghJG5vRGV2T25seSkgewokdGFza3NbJ3JlcXVpcmUtZGV2J10gPSAkY29tcG9zZXItPmdldFBhY2thZ2UoKS0+Z2V0RGV2UmVxdWlyZXMoKTsKfQoKaWYgKGNvdW50KCRwYWNrYWdlc0ZpbHRlcikgPiAwKSB7CgokcGFja2FnZXNGaWx0ZXIgPSBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkY29uc3RyYWludCkgewpyZXR1cm4gUHJlZzo6cmVwbGFjZSgne1s6PSBdLit9JywgJycsICRjb25zdHJhaW50KTsKfSwgJHBhY2thZ2VzRmlsdGVyKTsKJHBhdHRlcm4gPSBCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVzVG9SZWdleHAoYXJyYXlfdW5pcXVlKGFycmF5X21hcCgnc3RydG9sb3dlcicsICRwYWNrYWdlc0ZpbHRlcikpKTsKZm9yZWFjaCAoJHRhc2tzIGFzICRrZXkgPT4gJHJlcXMpIHsKZm9yZWFjaCAoJHJlcXMgYXMgJHBrZ05hbWUgPT4gJGxpbmspIHsKaWYgKCFQcmVnOjppc01hdGNoKCRwYXR0ZXJuLCAkcGtnTmFtZSkpIHsKdW5zZXQoJHRhc2tzWyRrZXldWyRwa2dOYW1lXSk7Cn0KfQp9Cn0KCiR1cGRhdGVzID0gW107CmZvcmVhY2ggKCR0YXNrcyBhcyAka2V5ID0+ICRyZXFzKSB7CmZvcmVhY2ggKCRyZXFzIGFzICRwa2dOYW1lID0+ICRsaW5rKSB7CmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRwa2dOYW1lKSkgewpjb250aW51ZTsKfQokY3VycmVudENvbnN0cmFpbnQgPSAkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpOwoKJHBhY2thZ2UgPSAkcmVwby0+ZmluZFBhY2thZ2UoJHBrZ05hbWUsICcqJyk7CgppZiAobnVsbCA9PT0gJHBhY2thZ2UpIHsKY29udGludWU7Cn0Kd2hpbGUgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiRwYWNrYWdlID0gJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKfQoKJGJ1bXBlZCA9ICRidW1wZXItPmJ1bXBSZXF1aXJlbWVudCgkbGluay0+Z2V0Q29uc3RyYWludCgpLCAkcGFja2FnZSk7CgppZiAoJGJ1bXBlZCA9PT0gJGN1cnJlbnRDb25zdHJhaW50KSB7CmNvbnRpbnVlOwp9CgokdXBkYXRlc1ska2V5XVskcGtnTmFtZV0gPSAkYnVtcGVkOwp9Cn0KCmlmICghJGRyeVJ1biAmJiAhJHRoaXMtPnVwZGF0ZUZpbGVDbGVhbmx5KCRjb21wb3Nlckpzb24sICR1cGRhdGVzKSkgewokY29tcG9zZXJEZWZpbml0aW9uID0gJGNvbXBvc2VySnNvbi0+cmVhZCgpOwpmb3JlYWNoICgkdXBkYXRlcyBhcyAka2V5ID0+ICRwYWNrYWdlcykgewpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UgPT4gJHZlcnNpb24pIHsKJGNvbXBvc2VyRGVmaW5pdGlvblska2V5XVskcGFja2FnZV0gPSAkdmVyc2lvbjsKfQp9CiRjb21wb3Nlckpzb24tPndyaXRlKCRjb21wb3NlckRlZmluaXRpb24pOwp9CgokY2hhbmdlQ291bnQgPSBhcnJheV9zdW0oYXJyYXlfbWFwKCdjb3VudCcsICR1cGRhdGVzKSk7CmlmICgkY2hhbmdlQ291bnQgPiAwKSB7CmlmICgkZHJ5UnVuKSB7CiRpby0+d3JpdGUoJzxpbmZvPicgLiAkY29tcG9zZXJKc29uUGF0aCAuICcgd291bGQgYmUgdXBkYXRlZCB3aXRoOjwvaW5mbz4nKTsKZm9yZWFjaCAoJHVwZGF0ZXMgYXMgJHJlcXVpcmVUeXBlID0+ICRwYWNrYWdlcykgewpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UgPT4gJHZlcnNpb24pIHsKJGlvLT53cml0ZShzcHJpbnRmKCc8aW5mbz4gLSAlcy4lczogJXM8L2luZm8+JywgJHJlcXVpcmVUeXBlLCAkcGFja2FnZSwgJHZlcnNpb24pKTsKfQp9Cn0gZWxzZSB7CiRpby0+d3JpdGUoJzxpbmZvPicgLiAkY29tcG9zZXJKc29uUGF0aCAuICcgaGFzIGJlZW4gdXBkYXRlZCAoJyAuICRjaGFuZ2VDb3VudCAuICcgY2hhbmdlcykuPC9pbmZvPicpOwp9Cn0gZWxzZSB7CiRpby0+d3JpdGUoJzxpbmZvPk5vIHJlcXVpcmVtZW50cyB0byB1cGRhdGUgaW4gJy4kY29tcG9zZXJKc29uUGF0aC4nLjwvaW5mbz4nKTsKfQoKaWYgKCEkZHJ5UnVuICYmICRjb21wb3Nlci0+Z2V0TG9ja2VyKCktPmlzTG9ja2VkKCkgJiYgJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdsb2NrJykgJiYgJGNoYW5nZUNvdW50ID4gMCkgewokY29tcG9zZXItPmdldExvY2tlcigpLT51cGRhdGVIYXNoKCRjb21wb3Nlckpzb24pOwp9CgppZiAoJGRyeVJ1biAmJiAkY2hhbmdlQ291bnQgPiAwKSB7CnJldHVybiBzZWxmOjpFUlJPUl9HRU5FUklDOwp9CgpyZXR1cm4gMDsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB1cGRhdGVGaWxlQ2xlYW5seShKc29uRmlsZSAkanNvbiwgYXJyYXkgJHVwZGF0ZXMpOiBib29sCnsKJGNvbnRlbnRzID0gZmlsZV9nZXRfY29udGVudHMoJGpzb24tPmdldFBhdGgoKSk7CmlmIChmYWxzZSA9PT0gJGNvbnRlbnRzKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVW5hYmxlIHRvIHJlYWQgJy4kanNvbi0+Z2V0UGF0aCgpLicgY29udGVudHMuJyk7Cn0KCiRtYW5pcHVsYXRvciA9IG5ldyBKc29uTWFuaXB1bGF0b3IoJGNvbnRlbnRzKTsKCmZvcmVhY2ggKCR1cGRhdGVzIGFzICRrZXkgPT4gJHBhY2thZ2VzKSB7CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSA9PiAkdmVyc2lvbikgewppZiAoISRtYW5pcHVsYXRvci0+YWRkTGluaygka2V5LCAkcGFja2FnZSwgJHZlcnNpb24pKSB7CnJldHVybiBmYWxzZTsKfQp9Cn0KCmlmIChmYWxzZSA9PT0gZmlsZV9wdXRfY29udGVudHMoJGpzb24tPmdldFBhdGgoKSwgJG1hbmlwdWxhdG9yLT5nZXRDb250ZW50cygpKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1VuYWJsZSB0byB3cml0ZSBuZXcgJy4kanNvbi0+Z2V0UGF0aCgpLicgY29udGVudHMuJyk7Cn0KCnJldHVybiB0cnVlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxMaW5rOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJvb3RQYWNrYWdlUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CgpjbGFzcyBDaGVja1BsYXRmb3JtUmVxc0NvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzLT5zZXROYW1lKCdjaGVjay1wbGF0Zm9ybS1yZXFzJykKLT5zZXREZXNjcmlwdGlvbignQ2hlY2sgdGhhdCBwbGF0Zm9ybSByZXF1aXJlbWVudHMgYXJlIHNhdGlzZmllZCcpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dE9wdGlvbignbm8tZGV2JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNhYmxlcyBjaGVja2luZyBvZiByZXF1aXJlLWRldiBwYWNrYWdlcyByZXF1aXJlbWVudHMuJyksCm5ldyBJbnB1dE9wdGlvbignbG9jaycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQ2hlY2tzIHJlcXVpcmVtZW50cyBvbmx5IGZyb20gdGhlIGxvY2sgZmlsZSwgbm90IGZyb20gaW5zdGFsbGVkIHBhY2thZ2VzLicpLApuZXcgSW5wdXRPcHRpb24oJ2Zvcm1hdCcsICdmJywgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnRm9ybWF0IG9mIHRoZSBvdXRwdXQ6IHRleHQgb3IganNvbicsICd0ZXh0JywgWydqc29uJywgJ3RleHQnXSksCl0pCi0+c2V0SGVscCgKPDw8RU9UCkNoZWNrcyB0aGF0IHlvdXIgUEhQIGFuZCBleHRlbnNpb25zIHZlcnNpb25zIG1hdGNoIHRoZSBwbGF0Zm9ybSByZXF1aXJlbWVudHMgb2YgdGhlIGluc3RhbGxlZCBwYWNrYWdlcy4KClVubGlrZSB1cGRhdGUvaW5zdGFsbCwgdGhpcyBjb21tYW5kIHdpbGwgaWdub3JlIGNvbmZpZy5wbGF0Zm9ybSBzZXR0aW5ncyBhbmQgY2hlY2sgdGhlIHJlYWwgcGxhdGZvcm0gcGFja2FnZXMgc28geW91IGNhbiBiZSBjZXJ0YWluIHlvdSBoYXZlIHRoZSByZXF1aXJlZCBwbGF0Zm9ybSBkZXBlbmRlbmNpZXMuCgo8aW5mbz5waHAgY29tcG9zZXIucGhhciBjaGVjay1wbGF0Zm9ybS1yZXFzPC9pbmZvPgoKRU9UCik7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CgokcmVxdWlyZXMgPSBbXTsKJHJlbW92ZVBhY2thZ2VzID0gW107CmlmICgkaW5wdXQtPmdldE9wdGlvbignbG9jaycpKSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZUVycm9yKCc8aW5mbz5DaGVja2luZyAnLigkaW5wdXQtPmdldE9wdGlvbignbm8tZGV2JykgPyAnbm9uLWRldiAnIDogJycpLidwbGF0Zm9ybSByZXF1aXJlbWVudHMgdXNpbmcgdGhlIGxvY2sgZmlsZTwvaW5mbz4nKTsKJGluc3RhbGxlZFJlcG8gPSAkY29tcG9zZXItPmdldExvY2tlcigpLT5nZXRMb2NrZWRSZXBvc2l0b3J5KCEkaW5wdXQtPmdldE9wdGlvbignbm8tZGV2JykpOwp9IGVsc2UgewokaW5zdGFsbGVkUmVwbyA9ICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7CgppZiAoISRpbnN0YWxsZWRSZXBvLT5nZXRQYWNrYWdlcygpKSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZUVycm9yKCc8d2FybmluZz5ObyB2ZW5kb3IgZGlyIHByZXNlbnQsIGNoZWNraW5nICcuKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSA/ICdub24tZGV2ICcgOiAnJykuJ3BsYXRmb3JtIHJlcXVpcmVtZW50cyBmcm9tIHRoZSBsb2NrIGZpbGU8L3dhcm5pbmc+Jyk7CiRpbnN0YWxsZWRSZXBvID0gJGNvbXBvc2VyLT5nZXRMb2NrZXIoKS0+Z2V0TG9ja2VkUmVwb3NpdG9yeSghJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpKTsKfSBlbHNlIHsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSkgewokcmVtb3ZlUGFja2FnZXMgPSAkaW5zdGFsbGVkUmVwby0+Z2V0RGV2UGFja2FnZU5hbWVzKCk7Cn0KCiR0aGlzLT5nZXRJTygpLT53cml0ZUVycm9yKCc8aW5mbz5DaGVja2luZyAnLigkaW5wdXQtPmdldE9wdGlvbignbm8tZGV2JykgPyAnbm9uLWRldiAnIDogJycpLidwbGF0Zm9ybSByZXF1aXJlbWVudHMgZm9yIHBhY2thZ2VzIGluIHRoZSB2ZW5kb3IgZGlyPC9pbmZvPicpOwp9Cn0KaWYgKCEkaW5wdXQtPmdldE9wdGlvbignbm8tZGV2JykpIHsKZm9yZWFjaCAoJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldERldlJlcXVpcmVzKCkgYXMgJHJlcXVpcmUgPT4gJGxpbmspIHsKJHJlcXVpcmVzWyRyZXF1aXJlXSA9IFskbGlua107Cn0KfQoKJGluc3RhbGxlZFJlcG8gPSBuZXcgSW5zdGFsbGVkUmVwb3NpdG9yeShbJGluc3RhbGxlZFJlcG8sIG5ldyBSb290UGFja2FnZVJlcG9zaXRvcnkoY2xvbmUgJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCkpXSk7CmZvcmVhY2ggKCRpbnN0YWxsZWRSZXBvLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CmlmIChpbl9hcnJheSgkcGFja2FnZS0+Z2V0TmFtZSgpLCAkcmVtb3ZlUGFja2FnZXMsIHRydWUpKSB7CmNvbnRpbnVlOwp9CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXF1aXJlcygpIGFzICRyZXF1aXJlID0+ICRsaW5rKSB7CiRyZXF1aXJlc1skcmVxdWlyZV1bXSA9ICRsaW5rOwp9Cn0KCmtzb3J0KCRyZXF1aXJlcyk7CgokaW5zdGFsbGVkUmVwby0+YWRkUmVwb3NpdG9yeShuZXcgUGxhdGZvcm1SZXBvc2l0b3J5KFtdLCBbXSkpOwoKJHJlc3VsdHMgPSBbXTsKJGV4aXRDb2RlID0gMDsKCgoKCmZvcmVhY2ggKCRyZXF1aXJlcyBhcyAkcmVxdWlyZSA9PiAkbGlua3MpIHsKaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJHJlcXVpcmUpKSB7CiRjYW5kaWRhdGVzID0gJGluc3RhbGxlZFJlcG8tPmZpbmRQYWNrYWdlc1dpdGhSZXBsYWNlcnNBbmRQcm92aWRlcnMoJHJlcXVpcmUpOwppZiAoJGNhbmRpZGF0ZXMpIHsKJHJlcVJlc3VsdHMgPSBbXTsKZm9yZWFjaCAoJGNhbmRpZGF0ZXMgYXMgJGNhbmRpZGF0ZSkgewokY2FuZGlkYXRlQ29uc3RyYWludCA9IG51bGw7CmlmICgkY2FuZGlkYXRlLT5nZXROYW1lKCkgPT09ICRyZXF1aXJlKSB7CiRjYW5kaWRhdGVDb25zdHJhaW50ID0gbmV3IENvbnN0cmFpbnQoJz0nLCAkY2FuZGlkYXRlLT5nZXRWZXJzaW9uKCkpOwokY2FuZGlkYXRlQ29uc3RyYWludC0+c2V0UHJldHR5U3RyaW5nKCRjYW5kaWRhdGUtPmdldFByZXR0eVZlcnNpb24oKSk7Cn0gZWxzZSB7CmZvcmVhY2ggKGFycmF5X21lcmdlKCRjYW5kaWRhdGUtPmdldFByb3ZpZGVzKCksICRjYW5kaWRhdGUtPmdldFJlcGxhY2VzKCkpIGFzICRsaW5rKSB7CmlmICgkbGluay0+Z2V0VGFyZ2V0KCkgPT09ICRyZXF1aXJlKSB7CiRjYW5kaWRhdGVDb25zdHJhaW50ID0gJGxpbmstPmdldENvbnN0cmFpbnQoKTsKYnJlYWs7Cn0KfQp9CgoKaWYgKCEkY2FuZGlkYXRlQ29uc3RyYWludCkgewpjb250aW51ZTsKfQoKZm9yZWFjaCAoJGxpbmtzIGFzICRsaW5rKSB7CmlmICghJGxpbmstPmdldENvbnN0cmFpbnQoKS0+bWF0Y2hlcygkY2FuZGlkYXRlQ29uc3RyYWludCkpIHsKJHJlcVJlc3VsdHNbXSA9IFsKJGNhbmRpZGF0ZS0+Z2V0TmFtZSgpID09PSAkcmVxdWlyZSA/ICRjYW5kaWRhdGUtPmdldFByZXR0eU5hbWUoKSA6ICRyZXF1aXJlLAokY2FuZGlkYXRlQ29uc3RyYWludC0+Z2V0UHJldHR5U3RyaW5nKCksCiRsaW5rLAonPGVycm9yPmZhaWxlZDwvZXJyb3I+JywKJGNhbmRpZGF0ZS0+Z2V0TmFtZSgpID09PSAkcmVxdWlyZSA/ICcnIDogJzxjb21tZW50PnByb3ZpZGVkIGJ5ICcuJGNhbmRpZGF0ZS0+Z2V0UHJldHR5TmFtZSgpLic8L2NvbW1lbnQ+JywKXTsKCgpjb250aW51ZSAyOwp9Cn0KCiRyZXN1bHRzW10gPSBbCiRjYW5kaWRhdGUtPmdldE5hbWUoKSA9PT0gJHJlcXVpcmUgPyAkY2FuZGlkYXRlLT5nZXRQcmV0dHlOYW1lKCkgOiAkcmVxdWlyZSwKJGNhbmRpZGF0ZUNvbnN0cmFpbnQtPmdldFByZXR0eVN0cmluZygpLApudWxsLAonPGluZm8+c3VjY2VzczwvaW5mbz4nLAokY2FuZGlkYXRlLT5nZXROYW1lKCkgPT09ICRyZXF1aXJlID8gJycgOiAnPGNvbW1lbnQ+cHJvdmlkZWQgYnkgJy4kY2FuZGlkYXRlLT5nZXRQcmV0dHlOYW1lKCkuJzwvY29tbWVudD4nLApdOwoKCmNvbnRpbnVlIDI7Cn0KCgokcmVzdWx0cyA9IGFycmF5X21lcmdlKCRyZXN1bHRzLCAkcmVxUmVzdWx0cyk7CiRleGl0Q29kZSA9IG1heCgkZXhpdENvZGUsIDEpOwoKY29udGludWU7Cn0KCiRyZXN1bHRzW10gPSBbCiRyZXF1aXJlLAonbi9hJywKJGxpbmtzWzBdLAonPGVycm9yPm1pc3Npbmc8L2Vycm9yPicsCicnLApdOwoKJGV4aXRDb2RlID0gbWF4KCRleGl0Q29kZSwgMik7Cn0KfQoKJHRoaXMtPnByaW50VGFibGUoJG91dHB1dCwgJHJlc3VsdHMsICRpbnB1dC0+Z2V0T3B0aW9uKCdmb3JtYXQnKSk7CgpyZXR1cm4gJGV4aXRDb2RlOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJpbnRUYWJsZShPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgYXJyYXkgJHJlc3VsdHMsIHN0cmluZyAkZm9ybWF0KTogdm9pZAp7CiRyb3dzID0gW107CmZvcmVhY2ggKCRyZXN1bHRzIGFzICRyZXN1bHQpIHsKCgoKWyRwbGF0Zm9ybVBhY2thZ2UsICR2ZXJzaW9uLCAkbGluaywgJHN0YXR1cywgJHByb3ZpZGVyXSA9ICRyZXN1bHQ7CgppZiAoJ2pzb24nID09PSAkZm9ybWF0KSB7CiRyb3dzW10gPSBbCiJuYW1lIiA9PiAkcGxhdGZvcm1QYWNrYWdlLAoidmVyc2lvbiIgPT4gJHZlcnNpb24sCiJzdGF0dXMiID0+IHN0cmlwX3RhZ3MoJHN0YXR1cyksCiJmYWlsZWRfcmVxdWlyZW1lbnQiID0+ICRsaW5rIGluc3RhbmNlb2YgTGluayA/IFsKJ3NvdXJjZScgPT4gJGxpbmstPmdldFNvdXJjZSgpLAondHlwZScgPT4gJGxpbmstPmdldERlc2NyaXB0aW9uKCksCid0YXJnZXQnID0+ICRsaW5rLT5nZXRUYXJnZXQoKSwKJ2NvbnN0cmFpbnQnID0+ICRsaW5rLT5nZXRQcmV0dHlDb25zdHJhaW50KCksCl0gOiBudWxsLAoicHJvdmlkZXIiID0+ICRwcm92aWRlciA9PT0gJycgPyBudWxsIDogc3RyaXBfdGFncygkcHJvdmlkZXIpLApdOwp9IGVsc2Ugewokcm93c1tdID0gWwokcGxhdGZvcm1QYWNrYWdlLAokdmVyc2lvbiwKJGxpbmssCiRsaW5rID8gc3ByaW50ZignJXMgJXMgJXMgKCVzKScsICRsaW5rLT5nZXRTb3VyY2UoKSwgJGxpbmstPmdldERlc2NyaXB0aW9uKCksICRsaW5rLT5nZXRUYXJnZXQoKSwgJGxpbmstPmdldFByZXR0eUNvbnN0cmFpbnQoKSkgOiAnJywKcnRyaW0oJHN0YXR1cy4nICcuJHByb3ZpZGVyKSwKXTsKfQp9CgppZiAoJ2pzb24nID09PSAkZm9ybWF0KSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZShKc29uRmlsZTo6ZW5jb2RlKCRyb3dzKSk7Cn0gZWxzZSB7CiR0aGlzLT5yZW5kZXJUYWJsZSgkcm93cywgJG91dHB1dCk7Cn0KfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXENhY2hlOwp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKY2xhc3MgQ2xlYXJDYWNoZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgnY2xlYXItY2FjaGUnKQotPnNldEFsaWFzZXMoWydjbGVhcmNhY2hlJywgJ2NjJ10pCi0+c2V0RGVzY3JpcHRpb24oJ0NsZWFycyBjb21wb3NlclwncyBpbnRlcm5hbCBwYWNrYWdlIGNhY2hlJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0T3B0aW9uKCdnYycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT25seSBydW4gZ2FyYmFnZSBjb2xsZWN0aW9uLCBub3QgYSBmdWxsIGNhY2hlIGNsZWFyJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSA8aW5mbz5jbGVhci1jYWNoZTwvaW5mbz4gZGVsZXRlcyBhbGwgY2FjaGVkIHBhY2thZ2VzIGZyb20gY29tcG9zZXIncwpjYWNoZSBkaXJlY3RvcnkuCgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNjbGVhci1jYWNoZS1jbGVhcmNhY2hlLWNjCkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRjb21wb3NlciA9ICR0aGlzLT50cnlDb21wb3NlcigpOwppZiAoJGNvbXBvc2VyICE9PSBudWxsKSB7CiRjb25maWcgPSAkY29tcG9zZXItPmdldENvbmZpZygpOwp9IGVsc2UgewokY29uZmlnID0gRmFjdG9yeTo6Y3JlYXRlQ29uZmlnKCk7Cn0KCiRpbyA9ICR0aGlzLT5nZXRJTygpOwoKJGNhY2hlUGF0aHMgPSBbCidjYWNoZS12Y3MtZGlyJyA9PiAkY29uZmlnLT5nZXQoJ2NhY2hlLXZjcy1kaXInKSwKJ2NhY2hlLXJlcG8tZGlyJyA9PiAkY29uZmlnLT5nZXQoJ2NhY2hlLXJlcG8tZGlyJyksCidjYWNoZS1maWxlcy1kaXInID0+ICRjb25maWctPmdldCgnY2FjaGUtZmlsZXMtZGlyJyksCidjYWNoZS1kaXInID0+ICRjb25maWctPmdldCgnY2FjaGUtZGlyJyksCl07Cgpmb3JlYWNoICgkY2FjaGVQYXRocyBhcyAka2V5ID0+ICRjYWNoZVBhdGgpIHsKCmlmICgka2V5ID09PSAnY2FjaGUtZGlyJyAmJiAkaW5wdXQtPmdldE9wdGlvbignZ2MnKSkgewpjb250aW51ZTsKfQoKJGNhY2hlUGF0aCA9IHJlYWxwYXRoKCRjYWNoZVBhdGgpOwppZiAoISRjYWNoZVBhdGgpIHsKJGlvLT53cml0ZUVycm9yKCI8aW5mbz5DYWNoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgKCRrZXkpOiAkY2FjaGVQYXRoPC9pbmZvPiIpOwoKY29udGludWU7Cn0KJGNhY2hlID0gbmV3IENhY2hlKCRpbywgJGNhY2hlUGF0aCk7CiRjYWNoZS0+c2V0UmVhZE9ubHkoJGNvbmZpZy0+Z2V0KCdjYWNoZS1yZWFkLW9ubHknKSk7CmlmICghJGNhY2hlLT5pc0VuYWJsZWQoKSkgewokaW8tPndyaXRlRXJyb3IoIjxpbmZvPkNhY2hlIGlzIG5vdCBlbmFibGVkICgka2V5KTogJGNhY2hlUGF0aDwvaW5mbz4iKTsKCmNvbnRpbnVlOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2djJykpIHsKJGlvLT53cml0ZUVycm9yKCI8aW5mbz5HYXJiYWdlLWNvbGxlY3RpbmcgY2FjaGUgKCRrZXkpOiAkY2FjaGVQYXRoPC9pbmZvPiIpOwppZiAoJGtleSA9PT0gJ2NhY2hlLWZpbGVzLWRpcicpIHsKJGNhY2hlLT5nYygkY29uZmlnLT5nZXQoJ2NhY2hlLWZpbGVzLXR0bCcpLCAkY29uZmlnLT5nZXQoJ2NhY2hlLWZpbGVzLW1heHNpemUnKSk7Cn0gZWxzZWlmICgka2V5ID09PSAnY2FjaGUtcmVwby1kaXInKSB7CiRjYWNoZS0+Z2MoJGNvbmZpZy0+Z2V0KCdjYWNoZS10dGwnKSwgMTAyNCAqIDEwMjQgKiAxMDI0ICk7Cn0gZWxzZWlmICgka2V5ID09PSAnY2FjaGUtdmNzLWRpcicpIHsKJGNhY2hlLT5nY1Zjc0NhY2hlKCRjb25maWctPmdldCgnY2FjaGUtdHRsJykpOwp9Cn0gZWxzZSB7CiRpby0+d3JpdGVFcnJvcigiPGluZm8+Q2xlYXJpbmcgY2FjaGUgKCRrZXkpOiAkY2FjaGVQYXRoPC9pbmZvPiIpOwokY2FjaGUtPmNsZWFyKCk7Cn0KfQoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdnYycpKSB7CiRpby0+d3JpdGVFcnJvcignPGluZm8+QWxsIGNhY2hlcyBnYXJiYWdlLWNvbGxlY3RlZC48L2luZm8+Jyk7Cn0gZWxzZSB7CiRpby0+d3JpdGVFcnJvcignPGluZm8+QWxsIGNhY2hlcyBjbGVhcmVkLjwvaW5mbz4nKTsKfQoKcmV0dXJuIDA7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxDb21wb3NlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XENvbXBvc2l0ZVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEluc3RhbGxlZFJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUm9vdFBhY2thZ2VSZXBvc2l0b3J5Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25JbnB1dDsKCgoKCgoKdHJhaXQgQ29tcGxldGlvblRyYWl0CnsKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlcXVpcmVDb21wb3Nlcig/Ym9vbCAkZGlzYWJsZVBsdWdpbnMgPSBudWxsLCA/Ym9vbCAkZGlzYWJsZVNjcmlwdHMgPSBudWxsKTogQ29tcG9zZXI7CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gc3VnZ2VzdFByZWZlckluc3RhbGwoKTogYXJyYXkKewpyZXR1cm4gWydkaXN0JywgJ3NvdXJjZScsICdhdXRvJ107Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gc3VnZ2VzdFJvb3RSZXF1aXJlbWVudCgpOiBcQ2xvc3VyZQp7CnJldHVybiBmdW5jdGlvbiAoQ29tcGxldGlvbklucHV0ICRpbnB1dCk6IGFycmF5IHsKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwoKcmV0dXJuIGFycmF5X21lcmdlKGFycmF5X2tleXMoJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldFJlcXVpcmVzKCkpLCBhcnJheV9rZXlzKCRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXREZXZSZXF1aXJlcygpKSk7Cn07Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gc3VnZ2VzdEluc3RhbGxlZFBhY2thZ2UoYm9vbCAkaW5jbHVkZVJvb3RQYWNrYWdlID0gdHJ1ZSwgYm9vbCAkaW5jbHVkZVBsYXRmb3JtUGFja2FnZXMgPSBmYWxzZSk6IFxDbG9zdXJlCnsKcmV0dXJuIGZ1bmN0aW9uIChDb21wbGV0aW9uSW5wdXQgJGlucHV0KSB1c2UgKCRpbmNsdWRlUm9vdFBhY2thZ2UsICRpbmNsdWRlUGxhdGZvcm1QYWNrYWdlcyk6IGFycmF5IHsKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwokaW5zdGFsbGVkUmVwb3MgPSBbXTsKCmlmICgkaW5jbHVkZVJvb3RQYWNrYWdlKSB7CiRpbnN0YWxsZWRSZXBvc1tdID0gbmV3IFJvb3RQYWNrYWdlUmVwb3NpdG9yeShjbG9uZSAkY29tcG9zZXItPmdldFBhY2thZ2UoKSk7Cn0KCiRsb2NrZXIgPSAkY29tcG9zZXItPmdldExvY2tlcigpOwppZiAoJGxvY2tlci0+aXNMb2NrZWQoKSkgewokaW5zdGFsbGVkUmVwb3NbXSA9ICRsb2NrZXItPmdldExvY2tlZFJlcG9zaXRvcnkodHJ1ZSk7Cn0gZWxzZSB7CiRpbnN0YWxsZWRSZXBvc1tdID0gJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKfQoKJHBsYXRmb3JtSGludCA9IFtdOwppZiAoJGluY2x1ZGVQbGF0Zm9ybVBhY2thZ2VzKSB7CmlmICgkbG9ja2VyLT5pc0xvY2tlZCgpKSB7CiRwbGF0Zm9ybVJlcG8gPSBuZXcgUGxhdGZvcm1SZXBvc2l0b3J5KFtdLCAkbG9ja2VyLT5nZXRQbGF0Zm9ybU92ZXJyaWRlcygpKTsKfSBlbHNlIHsKJHBsYXRmb3JtUmVwbyA9IG5ldyBQbGF0Zm9ybVJlcG9zaXRvcnkoW10sICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgncGxhdGZvcm0nKSk7Cn0KaWYgKCRpbnB1dC0+Z2V0Q29tcGxldGlvblZhbHVlKCkgPT09ICcnKSB7CgokaGludHNUb0ZpbmQgPSBbJ2V4dC0nID0+IDAsICdsaWItJyA9PiAwLCAncGhwJyA9PiA5OSwgJ2NvbXBvc2VyJyA9PiA5OV07CmZvcmVhY2ggKCRwbGF0Zm9ybVJlcG8tPmdldFBhY2thZ2VzKCkgYXMgJHBrZykgewpmb3JlYWNoICgkaGludHNUb0ZpbmQgYXMgJGhpbnRQcmVmaXggPT4gJGhpbnRDb3VudCkgewppZiAoc3RyX3N0YXJ0c193aXRoKCRwa2ctPmdldE5hbWUoKSwgJGhpbnRQcmVmaXgpKSB7CmlmICgkaGludENvdW50ID09PSAwIHx8ICRoaW50Q291bnQgPj0gOTkpIHsKJHBsYXRmb3JtSGludFtdID0gJHBrZy0+Z2V0TmFtZSgpOwokaGludHNUb0ZpbmRbJGhpbnRQcmVmaXhdKys7Cn0gZWxzZWlmICgkaGludENvdW50ID09PSAxKSB7CnVuc2V0KCRoaW50c1RvRmluZFskaGludFByZWZpeF0pOwokcGxhdGZvcm1IaW50W10gPSBzdWJzdHIoJHBrZy0+Z2V0TmFtZSgpLCAwLCBtYXgoc3RybGVuKCRwa2ctPmdldE5hbWUoKSkgLSAzLCBzdHJsZW4oJGhpbnRQcmVmaXgpICsgMSkpLicuLi4nOwp9CmNvbnRpbnVlIDI7Cn0KfQp9Cn0gZWxzZSB7CiRpbnN0YWxsZWRSZXBvc1tdID0gJHBsYXRmb3JtUmVwbzsKfQp9CgokaW5zdGFsbGVkUmVwbyA9IG5ldyBJbnN0YWxsZWRSZXBvc2l0b3J5KCRpbnN0YWxsZWRSZXBvcyk7CgpyZXR1cm4gYXJyYXlfbWVyZ2UoCmFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpIHsKcmV0dXJuICRwYWNrYWdlLT5nZXROYW1lKCk7Cn0sICRpbnN0YWxsZWRSZXBvLT5nZXRQYWNrYWdlcygpKSwKJHBsYXRmb3JtSGludAopOwp9Owp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHN1Z2dlc3RJbnN0YWxsZWRQYWNrYWdlVHlwZXMoYm9vbCAkaW5jbHVkZVJvb3RQYWNrYWdlID0gdHJ1ZSk6IFxDbG9zdXJlCnsKcmV0dXJuIGZ1bmN0aW9uIChDb21wbGV0aW9uSW5wdXQgJGlucHV0KSB1c2UgKCRpbmNsdWRlUm9vdFBhY2thZ2UpOiBhcnJheSB7CiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKJGluc3RhbGxlZFJlcG9zID0gW107CgppZiAoJGluY2x1ZGVSb290UGFja2FnZSkgewokaW5zdGFsbGVkUmVwb3NbXSA9IG5ldyBSb290UGFja2FnZVJlcG9zaXRvcnkoY2xvbmUgJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCkpOwp9CgokbG9ja2VyID0gJGNvbXBvc2VyLT5nZXRMb2NrZXIoKTsKaWYgKCRsb2NrZXItPmlzTG9ja2VkKCkpIHsKJGluc3RhbGxlZFJlcG9zW10gPSAkbG9ja2VyLT5nZXRMb2NrZWRSZXBvc2l0b3J5KHRydWUpOwp9IGVsc2UgewokaW5zdGFsbGVkUmVwb3NbXSA9ICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7Cn0KCiRpbnN0YWxsZWRSZXBvID0gbmV3IEluc3RhbGxlZFJlcG9zaXRvcnkoJGluc3RhbGxlZFJlcG9zKTsKCnJldHVybiBhcnJheV92YWx1ZXMoYXJyYXlfdW5pcXVlKAphcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uIChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKSB7CnJldHVybiAkcGFja2FnZS0+Z2V0VHlwZSgpOwp9LCAkaW5zdGFsbGVkUmVwby0+Z2V0UGFja2FnZXMoKSkKKSk7Cn07Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gc3VnZ2VzdEF2YWlsYWJsZVBhY2thZ2UoaW50ICRtYXggPSA5OSk6IFxDbG9zdXJlCnsKcmV0dXJuIGZ1bmN0aW9uIChDb21wbGV0aW9uSW5wdXQgJGlucHV0KSB1c2UgKCRtYXgpOiBhcnJheSB7CmlmICgkbWF4IDwgMSkgewpyZXR1cm4gW107Cn0KCiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKJHJlcG9zID0gbmV3IENvbXBvc2l0ZVJlcG9zaXRvcnkoJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRSZXBvc2l0b3JpZXMoKSk7CgokcmVzdWx0cyA9IFtdOwokc2hvd1ZlbmRvcnMgPSBmYWxzZTsKaWYgKCFzdHJfY29udGFpbnMoJGlucHV0LT5nZXRDb21wbGV0aW9uVmFsdWUoKSwgJy8nKSkgewokcmVzdWx0cyA9ICRyZXBvcy0+c2VhcmNoKCdeJyAuIHByZWdfcXVvdGUoJGlucHV0LT5nZXRDb21wbGV0aW9uVmFsdWUoKSksIFJlcG9zaXRvcnlJbnRlcmZhY2U6OlNFQVJDSF9WRU5ET1IpOwokc2hvd1ZlbmRvcnMgPSB0cnVlOwp9CgoKaWYgKFxjb3VudCgkcmVzdWx0cykgPD0gMSkgewokcmVzdWx0cyA9ICRyZXBvcy0+c2VhcmNoKCdeJy5wcmVnX3F1b3RlKCRpbnB1dC0+Z2V0Q29tcGxldGlvblZhbHVlKCkpLCBSZXBvc2l0b3J5SW50ZXJmYWNlOjpTRUFSQ0hfTkFNRSk7CiRzaG93VmVuZG9ycyA9IGZhbHNlOwp9CgokcmVzdWx0cyA9IGFycmF5X2NvbHVtbigkcmVzdWx0cywgJ25hbWUnKTsKCmlmICgkc2hvd1ZlbmRvcnMpIHsKJHJlc3VsdHMgPSBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uIChzdHJpbmcgJG5hbWUpOiBzdHJpbmcgewpyZXR1cm4gJG5hbWUuJy8nOwp9LCAkcmVzdWx0cyk7CgoKdXNvcnQoJHJlc3VsdHMsIHN0YXRpYyBmdW5jdGlvbiAoc3RyaW5nICRhLCBzdHJpbmcgJGIpIHsKJGxlbkEgPSBcc3RybGVuKCRhKTsKJGxlbkIgPSBcc3RybGVuKCRiKTsKaWYgKCRsZW5BID09PSAkbGVuQikgewpyZXR1cm4gJGEgPD0+ICRiOwp9CgpyZXR1cm4gJGxlbkEgLSAkbGVuQjsKfSk7CgokcGlubmVkID0gW107CgoKJGNvbXBsZXRpb25JbnB1dCA9ICRpbnB1dC0+Z2V0Q29tcGxldGlvblZhbHVlKCkuJy8nOwppZiAoZmFsc2UgIT09ICgkZXhhY3RJbmRleCA9IGFycmF5X3NlYXJjaCgkY29tcGxldGlvbklucHV0LCAkcmVzdWx0cywgdHJ1ZSkpKSB7CiRwaW5uZWRbXSA9ICRjb21wbGV0aW9uSW5wdXQ7CmFycmF5X3NwbGljZSgkcmVzdWx0cywgJGV4YWN0SW5kZXgsIDEpOwp9CgpyZXR1cm4gYXJyYXlfbWVyZ2UoJHBpbm5lZCwgYXJyYXlfc2xpY2UoJHJlc3VsdHMsIDAsICRtYXggLSBcY291bnQoJHBpbm5lZCkpKTsKfQoKcmV0dXJuIGFycmF5X3NsaWNlKCRyZXN1bHRzLCAwLCAkbWF4KTsKfTsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gc3VnZ2VzdEF2YWlsYWJsZVBhY2thZ2VJbmNsUGxhdGZvcm0oKTogXENsb3N1cmUKewpyZXR1cm4gZnVuY3Rpb24gKENvbXBsZXRpb25JbnB1dCAkaW5wdXQpOiBhcnJheSB7CmlmIChQcmVnOjppc01hdGNoKCd7XihleHR8bGlifHBocCkoLXwkKXxeY29tfScsICRpbnB1dC0+Z2V0Q29tcGxldGlvblZhbHVlKCkpKSB7CiRtYXRjaGVzID0gJHRoaXMtPnN1Z2dlc3RQbGF0Zm9ybVBhY2thZ2UoKSgkaW5wdXQpOwp9IGVsc2UgewokbWF0Y2hlcyA9IFtdOwp9CgpyZXR1cm4gYXJyYXlfbWVyZ2UoJG1hdGNoZXMsICR0aGlzLT5zdWdnZXN0QXZhaWxhYmxlUGFja2FnZSg5OSAtIFxjb3VudCgkbWF0Y2hlcykpKCRpbnB1dCkpOwp9Owp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHN1Z2dlc3RQbGF0Zm9ybVBhY2thZ2UoKTogXENsb3N1cmUKewpyZXR1cm4gZnVuY3Rpb24gKENvbXBsZXRpb25JbnB1dCAkaW5wdXQpOiBhcnJheSB7CiRyZXBvcyA9IG5ldyBQbGF0Zm9ybVJlcG9zaXRvcnkoW10sICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKS0+Z2V0Q29uZmlnKCktPmdldCgncGxhdGZvcm0nKSk7CgokcGF0dGVybiA9IEJhc2VQYWNrYWdlOjpwYWNrYWdlTmFtZVRvUmVnZXhwKCRpbnB1dC0+Z2V0Q29tcGxldGlvblZhbHVlKCkuJyonKTsKCnJldHVybiBhcnJheV9maWx0ZXIoYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkgewpyZXR1cm4gJHBhY2thZ2UtPmdldE5hbWUoKTsKfSwgJHJlcG9zLT5nZXRQYWNrYWdlcygpKSwgc3RhdGljIGZ1bmN0aW9uIChzdHJpbmcgJG5hbWUpIHVzZSAoJHBhdHRlcm4pOiBib29sIHsKcmV0dXJuIFByZWc6OmlzTWF0Y2goJHBhdHRlcm4sICRuYW1lKTsKfSk7Cn07Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxBZHZpc29yeVxBdWRpdG9yOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFV0aWxcU2lsZW5jZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25JbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxDb25maWdcSnNvbkNvbmZpZ1NvdXJjZTsKdXNlIENvbXBvc2VyXEZhY3Rvcnk7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxTZW12ZXJcVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CgoKCgoKY2xhc3MgQ29uZmlnQ29tbWFuZCBleHRlbmRzIEJhc2VDb25maWdDb21tYW5kCnsKCgoKCgpwcm90ZWN0ZWQgY29uc3QgQ09ORklHVVJBQkxFX1BBQ0tBR0VfUFJPUEVSVElFUyA9IFsKJ25hbWUnLAondHlwZScsCidkZXNjcmlwdGlvbicsCidob21lcGFnZScsCid2ZXJzaW9uJywKJ21pbmltdW0tc3RhYmlsaXR5JywKJ3ByZWZlci1zdGFibGUnLAona2V5d29yZHMnLAonbGljZW5zZScsCidyZXBvc2l0b3JpZXMnLAonc3VnZ2VzdCcsCidleHRyYScsCl07CgoKCgpwcm90ZWN0ZWQgJGF1dGhDb25maWdGaWxlOwoKCgoKcHJvdGVjdGVkICRhdXRoQ29uZmlnU291cmNlOwoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdjb25maWcnKQotPnNldERlc2NyaXB0aW9uKCdTZXRzIGNvbmZpZyBvcHRpb25zJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0T3B0aW9uKCdnbG9iYWwnLCAnZycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQXBwbHkgY29tbWFuZCB0byB0aGUgZ2xvYmFsIGNvbmZpZyBmaWxlJyksCm5ldyBJbnB1dE9wdGlvbignZWRpdG9yJywgJ2UnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ09wZW4gZWRpdG9yJyksCm5ldyBJbnB1dE9wdGlvbignYXV0aCcsICdhJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdBZmZlY3QgYXV0aCBjb25maWcgZmlsZSAob25seSB1c2VkIGZvciAtLWVkaXRvciknKSwKbmV3IElucHV0T3B0aW9uKCd1bnNldCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnVW5zZXQgdGhlIGdpdmVuIHNldHRpbmcta2V5JyksCm5ldyBJbnB1dE9wdGlvbignbGlzdCcsICdsJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdMaXN0IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MnKSwKbmV3IElucHV0T3B0aW9uKCdmaWxlJywgJ2YnLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdJZiB5b3Ugd2FudCB0byBjaG9vc2UgYSBkaWZmZXJlbnQgY29tcG9zZXIuanNvbiBvciBjb25maWcuanNvbicpLApuZXcgSW5wdXRPcHRpb24oJ2Fic29sdXRlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSZXR1cm5zIGFic29sdXRlIHBhdGhzIHdoZW4gZmV0Y2hpbmcgKi1kaXIgY29uZmlnIHZhbHVlcyBpbnN0ZWFkIG9mIHJlbGF0aXZlJyksCm5ldyBJbnB1dE9wdGlvbignanNvbicsICdqJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdKU09OIGRlY29kZSB0aGUgc2V0dGluZyB2YWx1ZSwgdG8gYmUgdXNlZCB3aXRoIGV4dHJhLioga2V5cycpLApuZXcgSW5wdXRPcHRpb24oJ21lcmdlJywgJ20nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ01lcmdlIHRoZSBzZXR0aW5nIHZhbHVlIHdpdGggdGhlIGN1cnJlbnQgdmFsdWUsIHRvIGJlIHVzZWQgd2l0aCBleHRyYS4qIG9yIGF1ZGl0Lmlnbm9yZVstYWJhbmRvbmVkXSBrZXlzIGluIGNvbWJpbmF0aW9uIHdpdGggLS1qc29uJyksCm5ldyBJbnB1dE9wdGlvbignYXBwZW5kJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdXaGVuIGFkZGluZyBhIHJlcG9zaXRvcnksIGFwcGVuZCBpdCAobG93ZXN0IHByaW9yaXR5KSB0byB0aGUgZXhpc3Rpbmcgb25lcyBpbnN0ZWFkIG9mIHByZXBlbmRpbmcgaXQgKGhpZ2hlc3QgcHJpb3JpdHkpJyksCm5ldyBJbnB1dE9wdGlvbignc291cmNlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNwbGF5IHdoZXJlIHRoZSBjb25maWcgdmFsdWUgaXMgbG9hZGVkIGZyb20nKSwKbmV3IElucHV0QXJndW1lbnQoJ3NldHRpbmcta2V5JywgbnVsbCwgJ1NldHRpbmcga2V5JywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RTZXR0aW5nS2V5cygpKSwKbmV3IElucHV0QXJndW1lbnQoJ3NldHRpbmctdmFsdWUnLCBJbnB1dEFyZ3VtZW50OjpJU19BUlJBWSwgJ1NldHRpbmcgdmFsdWUnKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVGhpcyBjb21tYW5kIGFsbG93cyB5b3UgdG8gZWRpdCBjb21wb3NlciBjb25maWcgc2V0dGluZ3MgYW5kIHJlcG9zaXRvcmllcwppbiBlaXRoZXIgdGhlIGxvY2FsIGNvbXBvc2VyLmpzb24gZmlsZSBvciB0aGUgZ2xvYmFsIGNvbmZpZy5qc29uIGZpbGUuCgpBZGRpdGlvbmFsbHkgaXQgbGV0cyB5b3UgZWRpdCBtb3N0IHByb3BlcnRpZXMgaW4gdGhlIGxvY2FsIGNvbXBvc2VyLmpzb24uCgpUbyBzZXQgYSBjb25maWcgc2V0dGluZzoKCiAgICA8Y29tbWVudD4lY29tbWFuZC5mdWxsX25hbWUlIGJpbi1kaXIgYmluLzwvY29tbWVudD4KClRvIHJlYWQgYSBjb25maWcgc2V0dGluZzoKCiAgICA8Y29tbWVudD4lY29tbWFuZC5mdWxsX25hbWUlIGJpbi1kaXI8L2NvbW1lbnQ+CiAgICBPdXRwdXRzOiA8aW5mbz5iaW48L2luZm8+CgpUbyBlZGl0IHRoZSBnbG9iYWwgY29uZmlnLmpzb24gZmlsZToKCiAgICA8Y29tbWVudD4lY29tbWFuZC5mdWxsX25hbWUlIC0tZ2xvYmFsPC9jb21tZW50PgoKVG8gYWRkIGEgcmVwb3NpdG9yeToKCiAgICA8Y29tbWVudD4lY29tbWFuZC5mdWxsX25hbWUlIHJlcG9zaXRvcmllcy5mb28gdmNzIGh0dHBzOi8vYmFyLmNvbTwvY29tbWVudD4KClRvIHJlbW92ZSBhIHJlcG9zaXRvcnkgKHJlcG8gaXMgYSBzaG9ydCBhbGlhcyBmb3IgcmVwb3NpdG9yaWVzKToKCiAgICA8Y29tbWVudD4lY29tbWFuZC5mdWxsX25hbWUlIC0tdW5zZXQgcmVwby5mb288L2NvbW1lbnQ+CgpUbyBkaXNhYmxlIHBhY2thZ2lzdC5vcmc6CgogICAgPGNvbW1lbnQ+JWNvbW1hbmQuZnVsbF9uYW1lJSByZXBvLnBhY2thZ2lzdC5vcmcgZmFsc2U8L2NvbW1lbnQ+CgpZb3UgY2FuIGFsdGVyIHJlcG9zaXRvcmllcyBpbiB0aGUgZ2xvYmFsIGNvbmZpZy5qc29uIGZpbGUgYnkgcGFzc2luZyBpbiB0aGUKPGluZm8+LS1nbG9iYWw8L2luZm8+IG9wdGlvbi4KClRvIGFkZCBvciBlZGl0IHN1Z2dlc3RlZCBwYWNrYWdlcyB5b3UgY2FuIHVzZToKCiAgICA8Y29tbWVudD4lY29tbWFuZC5mdWxsX25hbWUlIHN1Z2dlc3QucGFja2FnZSByZWFzb24gZm9yIHRoZSBzdWdnZXN0aW9uPC9jb21tZW50PgoKVG8gYWRkIG9yIGVkaXQgZXh0cmEgcHJvcGVydGllcyB5b3UgY2FuIHVzZToKCiAgICA8Y29tbWVudD4lY29tbWFuZC5mdWxsX25hbWUlIGV4dHJhLnByb3BlcnR5IHZhbHVlPC9jb21tZW50PgoKT3IgdG8gYWRkIGEgY29tcGxleCB2YWx1ZSB5b3UgY2FuIHVzZSBqc29uIHdpdGg6CgogICAgPGNvbW1lbnQ+JWNvbW1hbmQuZnVsbF9uYW1lJSBleHRyYS5wcm9wZXJ0eSAtLWpzb24gJ3siZm9vIjp0cnVlLCAiYmFyIjogW119JzwvY29tbWVudD4KClRvIGVkaXQgdGhlIGZpbGUgaW4gYW4gZXh0ZXJuYWwgZWRpdG9yOgoKICAgIDxjb21tZW50PiVjb21tYW5kLmZ1bGxfbmFtZSUgLS1lZGl0b3I8L2NvbW1lbnQ+CgpUbyBjaG9vc2UgeW91ciBlZGl0b3IgeW91IGNhbiBzZXQgdGhlICJFRElUT1IiIGVudiB2YXJpYWJsZS4KClRvIGdldCBhIGxpc3Qgb2YgY29uZmlndXJhdGlvbiB2YWx1ZXMgaW4gdGhlIGZpbGU6CgogICAgPGNvbW1lbnQ+JWNvbW1hbmQuZnVsbF9uYW1lJSAtLWxpc3Q8L2NvbW1lbnQ+CgpZb3UgY2FuIGFsd2F5cyBwYXNzIG1vcmUgdGhhbiBvbmUgb3B0aW9uLiBBcyBhbiBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBlZGl0IHRoZQpnbG9iYWwgY29uZmlnLmpzb24gZmlsZS4KCiAgICA8Y29tbWVudD4lY29tbWFuZC5mdWxsX25hbWUlIC0tZWRpdG9yIC0tZ2xvYmFsPC9jb21tZW50PgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjY29uZmlnCkVPVAopCjsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluaXRpYWxpemUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IHZvaWQKewpwYXJlbnQ6OmluaXRpYWxpemUoJGlucHV0LCAkb3V0cHV0KTsKCiRhdXRoQ29uZmlnRmlsZSA9ICR0aGlzLT5nZXRBdXRoQ29uZmlnRmlsZSgkaW5wdXQsICR0aGlzLT5jb25maWcpOwoKJHRoaXMtPmF1dGhDb25maWdGaWxlID0gbmV3IEpzb25GaWxlKCRhdXRoQ29uZmlnRmlsZSwgbnVsbCwgJHRoaXMtPmdldElPKCkpOwokdGhpcy0+YXV0aENvbmZpZ1NvdXJjZSA9IG5ldyBKc29uQ29uZmlnU291cmNlKCR0aGlzLT5hdXRoQ29uZmlnRmlsZSwgdHJ1ZSk7CgoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdnbG9iYWwnKSAmJiAhJHRoaXMtPmF1dGhDb25maWdGaWxlLT5leGlzdHMoKSkgewp0b3VjaCgkdGhpcy0+YXV0aENvbmZpZ0ZpbGUtPmdldFBhdGgoKSk7CiR0aGlzLT5hdXRoQ29uZmlnRmlsZS0+d3JpdGUoWydiaXRidWNrZXQtb2F1dGgnID0+IG5ldyBcQXJyYXlPYmplY3QsICdnaXRodWItb2F1dGgnID0+IG5ldyBcQXJyYXlPYmplY3QsICdnaXRsYWItb2F1dGgnID0+IG5ldyBcQXJyYXlPYmplY3QsICdnaXRsYWItdG9rZW4nID0+IG5ldyBcQXJyYXlPYmplY3QsICdodHRwLWJhc2ljJyA9PiBuZXcgXEFycmF5T2JqZWN0LCAnYmVhcmVyJyA9PiBuZXcgXEFycmF5T2JqZWN0LCAnZm9yZ2Vqby10b2tlbicgPT4gbmV3IFxBcnJheU9iamVjdCgpXSk7ClNpbGVuY2VyOjpjYWxsKCdjaG1vZCcsICR0aGlzLT5hdXRoQ29uZmlnRmlsZS0+Z2V0UGF0aCgpLCAwNjAwKTsKfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKCmlmICh0cnVlID09PSAkaW5wdXQtPmdldE9wdGlvbignZWRpdG9yJykpIHsKJGVkaXRvciA9IFBsYXRmb3JtOjpnZXRFbnYoJ0VESVRPUicpOwppZiAoZmFsc2UgPT09ICRlZGl0b3IgfHwgJycgPT09ICRlZGl0b3IpIHsKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewokZWRpdG9yID0gJ25vdGVwYWQnOwp9IGVsc2Ugewpmb3JlYWNoIChbJ2VkaXRvcicsICd2aW0nLCAndmknLCAnbmFubycsICdwaWNvJywgJ2VkJ10gYXMgJGNhbmRpZGF0ZSkgewppZiAoZXhlYygnd2hpY2ggJy4kY2FuZGlkYXRlKSkgewokZWRpdG9yID0gJGNhbmRpZGF0ZTsKYnJlYWs7Cn0KfQp9Cn0gZWxzZSB7CiRlZGl0b3IgPSBlc2NhcGVzaGVsbGNtZCgkZWRpdG9yKTsKfQoKJGZpbGUgPSAkaW5wdXQtPmdldE9wdGlvbignYXV0aCcpID8gJHRoaXMtPmF1dGhDb25maWdGaWxlLT5nZXRQYXRoKCkgOiAkdGhpcy0+Y29uZmlnRmlsZS0+Z2V0UGF0aCgpOwpzeXN0ZW0oJGVkaXRvciAuICcgJyAuICRmaWxlIC4gKFBsYXRmb3JtOjppc1dpbmRvd3MoKSA/ICcnIDogJyA+IGB0dHlgJykpOwoKcmV0dXJuIDA7Cn0KCmlmIChmYWxzZSA9PT0gJGlucHV0LT5nZXRPcHRpb24oJ2dsb2JhbCcpKSB7CiR0aGlzLT5jb25maWctPm1lcmdlKCR0aGlzLT5jb25maWdGaWxlLT5yZWFkKCksICR0aGlzLT5jb25maWdGaWxlLT5nZXRQYXRoKCkpOwokdGhpcy0+Y29uZmlnLT5tZXJnZShbJ2NvbmZpZycgPT4gJHRoaXMtPmF1dGhDb25maWdGaWxlLT5leGlzdHMoKSA/ICR0aGlzLT5hdXRoQ29uZmlnRmlsZS0+cmVhZCgpIDogW11dLCAkdGhpcy0+YXV0aENvbmZpZ0ZpbGUtPmdldFBhdGgoKSk7Cn0KCiR0aGlzLT5nZXRJTygpLT5sb2FkQ29uZmlndXJhdGlvbigkdGhpcy0+Y29uZmlnKTsKCgppZiAodHJ1ZSA9PT0gJGlucHV0LT5nZXRPcHRpb24oJ2xpc3QnKSkgewokdGhpcy0+bGlzdENvbmZpZ3VyYXRpb24oJHRoaXMtPmNvbmZpZy0+YWxsKCksICR0aGlzLT5jb25maWctPnJhdygpLCAkb3V0cHV0LCBudWxsLCAkaW5wdXQtPmdldE9wdGlvbignc291cmNlJykpOwoKcmV0dXJuIDA7Cn0KCiRzZXR0aW5nS2V5ID0gJGlucHV0LT5nZXRBcmd1bWVudCgnc2V0dGluZy1rZXknKTsKaWYgKCFpc19zdHJpbmcoJHNldHRpbmdLZXkpKSB7CnJldHVybiAwOwp9CgoKaWYgKFtdICE9PSAkaW5wdXQtPmdldEFyZ3VtZW50KCdzZXR0aW5nLXZhbHVlJykgJiYgJGlucHV0LT5nZXRPcHRpb24oJ3Vuc2V0JykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdZb3UgY2FuIG5vdCBjb21iaW5lIGEgc2V0dGluZyB2YWx1ZSB3aXRoIC0tdW5zZXQnKTsKfQoKCmlmIChbXSA9PT0gJGlucHV0LT5nZXRBcmd1bWVudCgnc2V0dGluZy12YWx1ZScpICYmICEkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSkgewokcHJvcGVydGllcyA9IHNlbGY6OkNPTkZJR1VSQUJMRV9QQUNLQUdFX1BST1BFUlRJRVM7CiRwcm9wZXJ0aWVzRGVmYXVsdHMgPSBbCid0eXBlJyA9PiAnbGlicmFyeScsCidkZXNjcmlwdGlvbicgPT4gJycsCidob21lcGFnZScgPT4gJycsCidtaW5pbXVtLXN0YWJpbGl0eScgPT4gJ3N0YWJsZScsCidwcmVmZXItc3RhYmxlJyA9PiBmYWxzZSwKJ2tleXdvcmRzJyA9PiBbXSwKJ2xpY2Vuc2UnID0+IFtdLAonc3VnZ2VzdCcgPT4gW10sCidleHRyYScgPT4gW10sCl07CiRyYXdEYXRhID0gJHRoaXMtPmNvbmZpZ0ZpbGUtPnJlYWQoKTsKJGRhdGEgPSAkdGhpcy0+Y29uZmlnLT5hbGwoKTsKJHNvdXJjZSA9ICR0aGlzLT5jb25maWctPmdldFNvdXJjZU9mVmFsdWUoJHNldHRpbmdLZXkpOwoKaWYgKFByZWc6OmlzTWF0Y2goJy9ecmVwb3M/KD86aXRvcmllcyk/KD86XC4oLispKT8vJywgJHNldHRpbmdLZXksICRtYXRjaGVzKSkgewppZiAoIWlzc2V0KCRtYXRjaGVzWzFdKSkgewokdmFsdWUgPSAkZGF0YVsncmVwb3NpdG9yaWVzJ10gPz8gW107Cn0gZWxzZSB7CmlmICghaXNzZXQoJGRhdGFbJ3JlcG9zaXRvcmllcyddWyRtYXRjaGVzWzFdXSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZXJlIGlzIG5vICcuJG1hdGNoZXNbMV0uJyByZXBvc2l0b3J5IGRlZmluZWQnKTsKfQoKJHZhbHVlID0gJGRhdGFbJ3JlcG9zaXRvcmllcyddWyRtYXRjaGVzWzFdXTsKfQp9IGVsc2VpZiAoc3RycG9zKCRzZXR0aW5nS2V5LCAnLicpKSB7CiRiaXRzID0gZXhwbG9kZSgnLicsICRzZXR0aW5nS2V5KTsKaWYgKCRiaXRzWzBdID09PSAnZXh0cmEnIHx8ICRiaXRzWzBdID09PSAnc3VnZ2VzdCcpIHsKJGRhdGEgPSAkcmF3RGF0YTsKfSBlbHNlIHsKJGRhdGEgPSAkZGF0YVsnY29uZmlnJ107Cn0KJG1hdGNoID0gZmFsc2U7CmZvcmVhY2ggKCRiaXRzIGFzICRiaXQpIHsKJGtleSA9IGlzc2V0KCRrZXkpID8gJGtleS4nLicuJGJpdCA6ICRiaXQ7CiRtYXRjaCA9IGZhbHNlOwppZiAoaXNzZXQoJGRhdGFbJGtleV0pKSB7CiRtYXRjaCA9IHRydWU7CiRkYXRhID0gJGRhdGFbJGtleV07CnVuc2V0KCRrZXkpOwp9Cn0KCmlmICghJG1hdGNoKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigkc2V0dGluZ0tleS4nIGlzIG5vdCBkZWZpbmVkLicpOwp9CgokdmFsdWUgPSAkZGF0YTsKfSBlbHNlaWYgKGlzc2V0KCRkYXRhWydjb25maWcnXVskc2V0dGluZ0tleV0pKSB7CiR2YWx1ZSA9ICR0aGlzLT5jb25maWctPmdldCgkc2V0dGluZ0tleSwgJGlucHV0LT5nZXRPcHRpb24oJ2Fic29sdXRlJykgPyAwIDogQ29uZmlnOjpSRUxBVElWRV9QQVRIUyk7CgppZiAoJHZhbHVlID09PSBbXSkgewokc2NoZW1hID0gSnNvbkZpbGU6OnBhcnNlSnNvbigoc3RyaW5nKSBmaWxlX2dldF9jb250ZW50cyhKc29uRmlsZTo6Q09NUE9TRVJfU0NIRU1BX1BBVEgpKTsKaWYgKAppc3NldCgkc2NoZW1hWydwcm9wZXJ0aWVzJ11bJ2NvbmZpZyddWydwcm9wZXJ0aWVzJ11bJHNldHRpbmdLZXldWyd0eXBlJ10pCiYmIGluX2FycmF5KCdvYmplY3QnLCAoYXJyYXkpICRzY2hlbWFbJ3Byb3BlcnRpZXMnXVsnY29uZmlnJ11bJ3Byb3BlcnRpZXMnXVskc2V0dGluZ0tleV1bJ3R5cGUnXSwgdHJ1ZSkKKSB7CiR2YWx1ZSA9IG5ldyBcc3RkQ2xhc3M7Cn0KfQp9IGVsc2VpZiAoaXNzZXQoJHJhd0RhdGFbJHNldHRpbmdLZXldKSAmJiBpbl9hcnJheSgkc2V0dGluZ0tleSwgJHByb3BlcnRpZXMsIHRydWUpKSB7CiR2YWx1ZSA9ICRyYXdEYXRhWyRzZXR0aW5nS2V5XTsKJHNvdXJjZSA9ICR0aGlzLT5jb25maWdGaWxlLT5nZXRQYXRoKCk7Cn0gZWxzZWlmIChpc3NldCgkcHJvcGVydGllc0RlZmF1bHRzWyRzZXR0aW5nS2V5XSkpIHsKJHZhbHVlID0gJHByb3BlcnRpZXNEZWZhdWx0c1skc2V0dGluZ0tleV07CiRzb3VyY2UgPSAnZGVmYXVsdHMnOwp9IGVsc2Ugewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJHNldHRpbmdLZXkuJyBpcyBub3QgZGVmaW5lZCcpOwp9CgppZiAoaXNfYXJyYXkoJHZhbHVlKSB8fCBpc19vYmplY3QoJHZhbHVlKSB8fCBpc19ib29sKCR2YWx1ZSkpIHsKJHZhbHVlID0gSnNvbkZpbGU6OmVuY29kZSgkdmFsdWUsIEpTT05fVU5FU0NBUEVEX1NMQVNIRVMgfCBKU09OX1VORVNDQVBFRF9VTklDT0RFKTsKfQoKJHNvdXJjZU9mQ29uZmlnVmFsdWUgPSAnJzsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdzb3VyY2UnKSkgewokc291cmNlT2ZDb25maWdWYWx1ZSA9ICcgKCcgLiAkc291cmNlIC4gJyknOwp9CgokdGhpcy0+Z2V0SU8oKS0+d3JpdGUoJHZhbHVlIC4gJHNvdXJjZU9mQ29uZmlnVmFsdWUsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7CgpyZXR1cm4gMDsKfQoKJHZhbHVlcyA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3NldHRpbmctdmFsdWUnKTsgCgokYm9vbGVhblZhbGlkYXRvciA9IHN0YXRpYyBmdW5jdGlvbiAoJHZhbCk6IGJvb2wgewpyZXR1cm4gaW5fYXJyYXkoJHZhbCwgWyd0cnVlJywgJ2ZhbHNlJywgJzEnLCAnMCddLCB0cnVlKTsKfTsKJGJvb2xlYW5Ob3JtYWxpemVyID0gc3RhdGljIGZ1bmN0aW9uICgkdmFsKTogYm9vbCB7CnJldHVybiAkdmFsICE9PSAnZmFsc2UnICYmIChib29sKSAkdmFsOwp9OwoKCiR1bmlxdWVDb25maWdWYWx1ZXMgPSBbCidwcm9jZXNzLXRpbWVvdXQnID0+IFsnaXNfbnVtZXJpYycsICdpbnR2YWwnXSwKJ3VzZS1pbmNsdWRlLXBhdGgnID0+IFskYm9vbGVhblZhbGlkYXRvciwgJGJvb2xlYW5Ob3JtYWxpemVyXSwKJ3VzZS1naXRodWItYXBpJyA9PiBbJGJvb2xlYW5WYWxpZGF0b3IsICRib29sZWFuTm9ybWFsaXplcl0sCidwcmVmZXJyZWQtaW5zdGFsbCcgPT4gWwpzdGF0aWMgZnVuY3Rpb24gKCR2YWwpOiBib29sIHsKcmV0dXJuIGluX2FycmF5KCR2YWwsIFsnYXV0bycsICdzb3VyY2UnLCAnZGlzdCddLCB0cnVlKTsKfSwKc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsOwp9LApdLAonZ2l0bGFiLXByb3RvY29sJyA9PiBbCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCk6IGJvb2wgewpyZXR1cm4gaW5fYXJyYXkoJHZhbCwgWydnaXQnLCAnaHR0cCcsICdodHRwcyddLCB0cnVlKTsKfSwKc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsOwp9LApdLAonc3RvcmUtYXV0aHMnID0+IFsKc3RhdGljIGZ1bmN0aW9uICgkdmFsKTogYm9vbCB7CnJldHVybiBpbl9hcnJheSgkdmFsLCBbJ3RydWUnLCAnZmFsc2UnLCAncHJvbXB0J10sIHRydWUpOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKaWYgKCdwcm9tcHQnID09PSAkdmFsKSB7CnJldHVybiAncHJvbXB0JzsKfQoKcmV0dXJuICR2YWwgIT09ICdmYWxzZScgJiYgKGJvb2wpICR2YWw7Cn0sCl0sCidub3RpZnktb24taW5zdGFsbCcgPT4gWyRib29sZWFuVmFsaWRhdG9yLCAkYm9vbGVhbk5vcm1hbGl6ZXJdLAondmVuZG9yLWRpcicgPT4gWydpc19zdHJpbmcnLCBzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWw7Cn1dLAonYmluLWRpcicgPT4gWydpc19zdHJpbmcnLCBzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWw7Cn1dLAonYXJjaGl2ZS1kaXInID0+IFsnaXNfc3RyaW5nJywgc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsOwp9XSwKJ2FyY2hpdmUtZm9ybWF0JyA9PiBbJ2lzX3N0cmluZycsIHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbDsKfV0sCidkYXRhLWRpcicgPT4gWydpc19zdHJpbmcnLCBzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWw7Cn1dLAonY2FjaGUtZGlyJyA9PiBbJ2lzX3N0cmluZycsIHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbDsKfV0sCidjYWNoZS1maWxlcy1kaXInID0+IFsnaXNfc3RyaW5nJywgc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsOwp9XSwKJ2NhY2hlLXJlcG8tZGlyJyA9PiBbJ2lzX3N0cmluZycsIHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbDsKfV0sCidjYWNoZS12Y3MtZGlyJyA9PiBbJ2lzX3N0cmluZycsIHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbDsKfV0sCidjYWNoZS10dGwnID0+IFsnaXNfbnVtZXJpYycsICdpbnR2YWwnXSwKJ2NhY2hlLWZpbGVzLXR0bCcgPT4gWydpc19udW1lcmljJywgJ2ludHZhbCddLAonY2FjaGUtZmlsZXMtbWF4c2l6ZScgPT4gWwpzdGF0aWMgZnVuY3Rpb24gKCR2YWwpOiBib29sIHsKcmV0dXJuIFByZWc6OmlzTWF0Y2goJy9eXHMqKFswLTkuXSspXHMqKD86KFtrbWddKSg/Omk/Yik/KT9ccyokL2knLCAkdmFsKTsKfSwKc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsOwp9LApdLAonYmluLWNvbXBhdCcgPT4gWwpzdGF0aWMgZnVuY3Rpb24gKCR2YWwpOiBib29sIHsKcmV0dXJuIGluX2FycmF5KCR2YWwsIFsnYXV0bycsICdmdWxsJywgJ3Byb3h5JywgJ3N5bWxpbmsnXSk7Cn0sCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbDsKfSwKXSwKJ2Rpc2NhcmQtY2hhbmdlcycgPT4gWwpzdGF0aWMgZnVuY3Rpb24gKCR2YWwpOiBib29sIHsKcmV0dXJuIGluX2FycmF5KCR2YWwsIFsnc3Rhc2gnLCAndHJ1ZScsICdmYWxzZScsICcxJywgJzAnXSwgdHJ1ZSk7Cn0sCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewppZiAoJ3N0YXNoJyA9PT0gJHZhbCkgewpyZXR1cm4gJ3N0YXNoJzsKfQoKcmV0dXJuICR2YWwgIT09ICdmYWxzZScgJiYgKGJvb2wpICR2YWw7Cn0sCl0sCidhdXRvbG9hZGVyLXN1ZmZpeCcgPT4gWydpc19zdHJpbmcnLCBzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWwgPT09ICdudWxsJyA/IG51bGwgOiAkdmFsOwp9XSwKJ3NvcnQtcGFja2FnZXMnID0+IFskYm9vbGVhblZhbGlkYXRvciwgJGJvb2xlYW5Ob3JtYWxpemVyXSwKJ29wdGltaXplLWF1dG9sb2FkZXInID0+IFskYm9vbGVhblZhbGlkYXRvciwgJGJvb2xlYW5Ob3JtYWxpemVyXSwKJ2NsYXNzbWFwLWF1dGhvcml0YXRpdmUnID0+IFskYm9vbGVhblZhbGlkYXRvciwgJGJvb2xlYW5Ob3JtYWxpemVyXSwKJ2FwY3UtYXV0b2xvYWRlcicgPT4gWyRib29sZWFuVmFsaWRhdG9yLCAkYm9vbGVhbk5vcm1hbGl6ZXJdLAoncHJlcGVuZC1hdXRvbG9hZGVyJyA9PiBbJGJvb2xlYW5WYWxpZGF0b3IsICRib29sZWFuTm9ybWFsaXplcl0sCid1cGRhdGUtd2l0aC1taW5pbWFsLWNoYW5nZXMnID0+IFskYm9vbGVhblZhbGlkYXRvciwgJGJvb2xlYW5Ob3JtYWxpemVyXSwKJ2Rpc2FibGUtdGxzJyA9PiBbJGJvb2xlYW5WYWxpZGF0b3IsICRib29sZWFuTm9ybWFsaXplcl0sCidzZWN1cmUtaHR0cCcgPT4gWyRib29sZWFuVmFsaWRhdG9yLCAkYm9vbGVhbk5vcm1hbGl6ZXJdLAonYnVtcC1hZnRlci11cGRhdGUnID0+IFsKc3RhdGljIGZ1bmN0aW9uICgkdmFsKTogYm9vbCB7CnJldHVybiBpbl9hcnJheSgkdmFsLCBbJ2RldicsICduby1kZXYnLCAndHJ1ZScsICdmYWxzZScsICcxJywgJzAnXSwgdHJ1ZSk7Cn0sCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewppZiAoJ2RldicgPT09ICR2YWwgfHwgJ25vLWRldicgPT09ICR2YWwpIHsKcmV0dXJuICR2YWw7Cn0KCnJldHVybiAkdmFsICE9PSAnZmFsc2UnICYmIChib29sKSAkdmFsOwp9LApdLAonY2FmaWxlJyA9PiBbCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCk6IGJvb2wgewpyZXR1cm4gZmlsZV9leGlzdHMoJHZhbCkgJiYgRmlsZXN5c3RlbTo6aXNSZWFkYWJsZSgkdmFsKTsKfSwKc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsID09PSAnbnVsbCcgPyBudWxsIDogJHZhbDsKfSwKXSwKJ2NhcGF0aCcgPT4gWwpzdGF0aWMgZnVuY3Rpb24gKCR2YWwpOiBib29sIHsKcmV0dXJuIGlzX2RpcigkdmFsKSAmJiBGaWxlc3lzdGVtOjppc1JlYWRhYmxlKCR2YWwpOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWwgPT09ICdudWxsJyA/IG51bGwgOiAkdmFsOwp9LApdLAonZ2l0aHViLWV4cG9zZS1ob3N0bmFtZScgPT4gWyRib29sZWFuVmFsaWRhdG9yLCAkYm9vbGVhbk5vcm1hbGl6ZXJdLAonaHRhY2Nlc3MtcHJvdGVjdCcgPT4gWyRib29sZWFuVmFsaWRhdG9yLCAkYm9vbGVhbk5vcm1hbGl6ZXJdLAonbG9jaycgPT4gWyRib29sZWFuVmFsaWRhdG9yLCAkYm9vbGVhbk5vcm1hbGl6ZXJdLAonYWxsb3ctcGx1Z2lucycgPT4gWyRib29sZWFuVmFsaWRhdG9yLCAkYm9vbGVhbk5vcm1hbGl6ZXJdLAoncGxhdGZvcm0tY2hlY2snID0+IFsKc3RhdGljIGZ1bmN0aW9uICgkdmFsKTogYm9vbCB7CnJldHVybiBpbl9hcnJheSgkdmFsLCBbJ3BocC1vbmx5JywgJ3RydWUnLCAnZmFsc2UnLCAnMScsICcwJ10sIHRydWUpOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKaWYgKCdwaHAtb25seScgPT09ICR2YWwpIHsKcmV0dXJuICdwaHAtb25seSc7Cn0KCnJldHVybiAkdmFsICE9PSAnZmFsc2UnICYmIChib29sKSAkdmFsOwp9LApdLAondXNlLXBhcmVudC1kaXInID0+IFsKc3RhdGljIGZ1bmN0aW9uICgkdmFsKTogYm9vbCB7CnJldHVybiBpbl9hcnJheSgkdmFsLCBbJ3RydWUnLCAnZmFsc2UnLCAncHJvbXB0J10sIHRydWUpOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKaWYgKCdwcm9tcHQnID09PSAkdmFsKSB7CnJldHVybiAncHJvbXB0JzsKfQoKcmV0dXJuICR2YWwgIT09ICdmYWxzZScgJiYgKGJvb2wpICR2YWw7Cn0sCl0sCidhdWRpdC5hYmFuZG9uZWQnID0+IFsKc3RhdGljIGZ1bmN0aW9uICgkdmFsKTogYm9vbCB7CnJldHVybiBpbl9hcnJheSgkdmFsLCBbQXVkaXRvcjo6QUJBTkRPTkVEX0lHTk9SRSwgQXVkaXRvcjo6QUJBTkRPTkVEX1JFUE9SVCwgQXVkaXRvcjo6QUJBTkRPTkVEX0ZBSUxdLCB0cnVlKTsKfSwKc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsOwp9LApdLAonYXVkaXQuaWdub3JlLXVucmVhY2hhYmxlJyA9PiBbJGJvb2xlYW5WYWxpZGF0b3IsICRib29sZWFuTm9ybWFsaXplcl0sCidhdWRpdC5ibG9jay1pbnNlY3VyZScgPT4gWyRib29sZWFuVmFsaWRhdG9yLCAkYm9vbGVhbk5vcm1hbGl6ZXJdLAonYXVkaXQuYmxvY2stYWJhbmRvbmVkJyA9PiBbJGJvb2xlYW5WYWxpZGF0b3IsICRib29sZWFuTm9ybWFsaXplcl0sCl07CiRtdWx0aUNvbmZpZ1ZhbHVlcyA9IFsKJ2dpdGh1Yi1wcm90b2NvbHMnID0+IFsKc3RhdGljIGZ1bmN0aW9uICgkdmFscykgewppZiAoIWlzX2FycmF5KCR2YWxzKSkgewpyZXR1cm4gJ2FycmF5IGV4cGVjdGVkJzsKfQoKZm9yZWFjaCAoJHZhbHMgYXMgJHZhbCkgewppZiAoIWluX2FycmF5KCR2YWwsIFsnZ2l0JywgJ2h0dHBzJywgJ3NzaCddKSkgewpyZXR1cm4gJ3ZhbGlkIHByb3RvY29scyBpbmNsdWRlOiBnaXQsIGh0dHBzLCBzc2gnOwp9Cn0KCnJldHVybiB0cnVlOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWxzKSB7CnJldHVybiAkdmFsczsKfSwKXSwKJ2dpdGh1Yi1kb21haW5zJyA9PiBbCnN0YXRpYyBmdW5jdGlvbiAoJHZhbHMpIHsKaWYgKCFpc19hcnJheSgkdmFscykpIHsKcmV0dXJuICdhcnJheSBleHBlY3RlZCc7Cn0KCnJldHVybiB0cnVlOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWxzKSB7CnJldHVybiAkdmFsczsKfSwKXSwKJ2dpdGxhYi1kb21haW5zJyA9PiBbCnN0YXRpYyBmdW5jdGlvbiAoJHZhbHMpIHsKaWYgKCFpc19hcnJheSgkdmFscykpIHsKcmV0dXJuICdhcnJheSBleHBlY3RlZCc7Cn0KCnJldHVybiB0cnVlOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWxzKSB7CnJldHVybiAkdmFsczsKfSwKXSwKJ2F1ZGl0Lmlnbm9yZS1zZXZlcml0eScgPT4gWwpzdGF0aWMgZnVuY3Rpb24gKCR2YWxzKSB7CmlmICghaXNfYXJyYXkoJHZhbHMpKSB7CnJldHVybiAnYXJyYXkgZXhwZWN0ZWQnOwp9Cgpmb3JlYWNoICgkdmFscyBhcyAkdmFsKSB7CmlmICghaW5fYXJyYXkoJHZhbCwgWydsb3cnLCAnbWVkaXVtJywgJ2hpZ2gnLCAnY3JpdGljYWwnXSwgdHJ1ZSkpIHsKcmV0dXJuICd2YWxpZCBzZXZlcml0aWVzIGluY2x1ZGU6IGxvdywgbWVkaXVtLCBoaWdoLCBjcml0aWNhbCc7Cn0KfQoKcmV0dXJuIHRydWU7Cn0sCnN0YXRpYyBmdW5jdGlvbiAoJHZhbHMpIHsKcmV0dXJuICR2YWxzOwp9LApdLApdOwoKCmlmICgkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSAmJiAkc2V0dGluZ0tleSA9PT0gJ2F1ZGl0JykgewokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVDb25maWdTZXR0aW5nKCRzZXR0aW5nS2V5KTsKCnJldHVybiAwOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3Vuc2V0JykgJiYgKGlzc2V0KCR1bmlxdWVDb25maWdWYWx1ZXNbJHNldHRpbmdLZXldKSB8fCBpc3NldCgkbXVsdGlDb25maWdWYWx1ZXNbJHNldHRpbmdLZXldKSkpIHsKaWYgKCRzZXR0aW5nS2V5ID09PSAnZGlzYWJsZS10bHMnICYmICR0aGlzLT5jb25maWctPmdldCgnZGlzYWJsZS10bHMnKSkgewokdGhpcy0+Z2V0SU8oKS0+d3JpdGVFcnJvcignPGluZm8+WW91IGFyZSBub3cgcnVubmluZyBDb21wb3NlciB3aXRoIFNTTC9UTFMgcHJvdGVjdGlvbiBlbmFibGVkLjwvaW5mbz4nKTsKfQoKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlQ29uZmlnU2V0dGluZygkc2V0dGluZ0tleSk7CgpyZXR1cm4gMDsKfQppZiAoaXNzZXQoJHVuaXF1ZUNvbmZpZ1ZhbHVlc1skc2V0dGluZ0tleV0pKSB7CiR0aGlzLT5oYW5kbGVTaW5nbGVWYWx1ZSgkc2V0dGluZ0tleSwgJHVuaXF1ZUNvbmZpZ1ZhbHVlc1skc2V0dGluZ0tleV0sICR2YWx1ZXMsICdhZGRDb25maWdTZXR0aW5nJyk7CgpyZXR1cm4gMDsKfQppZiAoaXNzZXQoJG11bHRpQ29uZmlnVmFsdWVzWyRzZXR0aW5nS2V5XSkpIHsKJHRoaXMtPmhhbmRsZU11bHRpVmFsdWUoJHNldHRpbmdLZXksICRtdWx0aUNvbmZpZ1ZhbHVlc1skc2V0dGluZ0tleV0sICR2YWx1ZXMsICdhZGRDb25maWdTZXR0aW5nJyk7CgpyZXR1cm4gMDsKfQoKaWYgKFByZWc6OmlzTWF0Y2goJy9ecHJlZmVycmVkLWluc3RhbGxcLiguKykvJywgJHNldHRpbmdLZXksICRtYXRjaGVzKSkgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3Vuc2V0JykpIHsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlQ29uZmlnU2V0dGluZygkc2V0dGluZ0tleSk7CgpyZXR1cm4gMDsKfQoKWyR2YWxpZGF0b3JdID0gJHVuaXF1ZUNvbmZpZ1ZhbHVlc1sncHJlZmVycmVkLWluc3RhbGwnXTsKaWYgKCEkdmFsaWRhdG9yKCR2YWx1ZXNbMF0pKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignSW52YWxpZCB2YWx1ZSBmb3IgJy4kc2V0dGluZ0tleS4nLiBTaG91bGQgYmUgb25lIG9mOiBhdXRvLCBzb3VyY2UsIG9yIGRpc3QnKTsKfQoKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+YWRkQ29uZmlnU2V0dGluZygkc2V0dGluZ0tleSwgJHZhbHVlc1swXSk7CgpyZXR1cm4gMDsKfQoKCmlmIChQcmVnOjppc01hdGNoKCd7XmFsbG93LXBsdWdpbnNcLihbYS16QS1aMC05LyotXSspfScsICRzZXR0aW5nS2V5LCAkbWF0Y2hlcykpIHsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd1bnNldCcpKSB7CiR0aGlzLT5jb25maWdTb3VyY2UtPnJlbW92ZUNvbmZpZ1NldHRpbmcoJHNldHRpbmdLZXkpOwoKcmV0dXJuIDA7Cn0KCmlmICh0cnVlICE9PSAkYm9vbGVhblZhbGlkYXRvcigkdmFsdWVzWzBdKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZigKJyIlcyIgaXMgYW4gaW52YWxpZCB2YWx1ZScsCiR2YWx1ZXNbMF0KKSk7Cn0KCiRub3JtYWxpemVkVmFsdWUgPSAkYm9vbGVhbk5vcm1hbGl6ZXIoJHZhbHVlc1swXSk7CgokdGhpcy0+Y29uZmlnU291cmNlLT5hZGRDb25maWdTZXR0aW5nKCRzZXR0aW5nS2V5LCAkbm9ybWFsaXplZFZhbHVlKTsKCnJldHVybiAwOwp9CgoKJHVuaXF1ZVByb3BzID0gWwonbmFtZScgPT4gWydpc19zdHJpbmcnLCBzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWw7Cn1dLAondHlwZScgPT4gWydpc19zdHJpbmcnLCBzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWw7Cn1dLAonZGVzY3JpcHRpb24nID0+IFsnaXNfc3RyaW5nJywgc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsOwp9XSwKJ2hvbWVwYWdlJyA9PiBbJ2lzX3N0cmluZycsIHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbDsKfV0sCid2ZXJzaW9uJyA9PiBbJ2lzX3N0cmluZycsIHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbDsKfV0sCidtaW5pbXVtLXN0YWJpbGl0eScgPT4gWwpzdGF0aWMgZnVuY3Rpb24gKCR2YWwpOiBib29sIHsKcmV0dXJuIGlzc2V0KEJhc2VQYWNrYWdlOjpTVEFCSUxJVElFU1tWZXJzaW9uUGFyc2VyOjpub3JtYWxpemVTdGFiaWxpdHkoJHZhbCldKTsKfSwKc3RhdGljIGZ1bmN0aW9uICgkdmFsKTogc3RyaW5nIHsKcmV0dXJuIFZlcnNpb25QYXJzZXI6Om5vcm1hbGl6ZVN0YWJpbGl0eSgkdmFsKTsKfSwKXSwKJ3ByZWZlci1zdGFibGUnID0+IFskYm9vbGVhblZhbGlkYXRvciwgJGJvb2xlYW5Ob3JtYWxpemVyXSwKXTsKJG11bHRpUHJvcHMgPSBbCidrZXl3b3JkcycgPT4gWwpzdGF0aWMgZnVuY3Rpb24gKCR2YWxzKSB7CmlmICghaXNfYXJyYXkoJHZhbHMpKSB7CnJldHVybiAnYXJyYXkgZXhwZWN0ZWQnOwp9CgpyZXR1cm4gdHJ1ZTsKfSwKc3RhdGljIGZ1bmN0aW9uICgkdmFscykgewpyZXR1cm4gJHZhbHM7Cn0sCl0sCidsaWNlbnNlJyA9PiBbCnN0YXRpYyBmdW5jdGlvbiAoJHZhbHMpIHsKaWYgKCFpc19hcnJheSgkdmFscykpIHsKcmV0dXJuICdhcnJheSBleHBlY3RlZCc7Cn0KCnJldHVybiB0cnVlOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWxzKSB7CnJldHVybiAkdmFsczsKfSwKXSwKXTsKCmlmICgkaW5wdXQtPmdldE9wdGlvbignZ2xvYmFsJykgJiYgKGlzc2V0KCR1bmlxdWVQcm9wc1skc2V0dGluZ0tleV0pIHx8IGlzc2V0KCRtdWx0aVByb3BzWyRzZXR0aW5nS2V5XSkgfHwgc3RycG9zKCRzZXR0aW5nS2V5LCAnZXh0cmEuJykgPT09IDApKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdUaGUgJyAuICRzZXR0aW5nS2V5IC4gJyBwcm9wZXJ0eSBjYW4gbm90IGJlIHNldCBpbiB0aGUgZ2xvYmFsIGNvbmZpZy5qc29uIGZpbGUuIFVzZSBgY29tcG9zZXIgZ2xvYmFsIGNvbmZpZ2AgdG8gYXBwbHkgY2hhbmdlcyB0byB0aGUgZ2xvYmFsIGNvbXBvc2VyLmpzb24nKTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3Vuc2V0JykgJiYgKGlzc2V0KCR1bmlxdWVQcm9wc1skc2V0dGluZ0tleV0pIHx8IGlzc2V0KCRtdWx0aVByb3BzWyRzZXR0aW5nS2V5XSkpKSB7CiR0aGlzLT5jb25maWdTb3VyY2UtPnJlbW92ZVByb3BlcnR5KCRzZXR0aW5nS2V5KTsKCnJldHVybiAwOwp9CmlmIChpc3NldCgkdW5pcXVlUHJvcHNbJHNldHRpbmdLZXldKSkgewokdGhpcy0+aGFuZGxlU2luZ2xlVmFsdWUoJHNldHRpbmdLZXksICR1bmlxdWVQcm9wc1skc2V0dGluZ0tleV0sICR2YWx1ZXMsICdhZGRQcm9wZXJ0eScpOwoKcmV0dXJuIDA7Cn0KaWYgKGlzc2V0KCRtdWx0aVByb3BzWyRzZXR0aW5nS2V5XSkpIHsKJHRoaXMtPmhhbmRsZU11bHRpVmFsdWUoJHNldHRpbmdLZXksICRtdWx0aVByb3BzWyRzZXR0aW5nS2V5XSwgJHZhbHVlcywgJ2FkZFByb3BlcnR5Jyk7CgpyZXR1cm4gMDsKfQoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcvXnJlcG9zPyg/Oml0b3JpZXMpP1wuKC4rKS8nLCAkc2V0dGluZ0tleSwgJG1hdGNoZXMpKSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSkgewokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVSZXBvc2l0b3J5KCRtYXRjaGVzWzFdKTsKCnJldHVybiAwOwp9CgppZiAoMiA9PT0gY291bnQoJHZhbHVlcykpIHsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+YWRkUmVwb3NpdG9yeSgkbWF0Y2hlc1sxXSwgWwondHlwZScgPT4gJHZhbHVlc1swXSwKJ3VybCcgPT4gJHZhbHVlc1sxXSwKXSwgJGlucHV0LT5nZXRPcHRpb24oJ2FwcGVuZCcpKTsKCnJldHVybiAwOwp9CgppZiAoMSA9PT0gY291bnQoJHZhbHVlcykpIHsKJHZhbHVlID0gc3RydG9sb3dlcigkdmFsdWVzWzBdKTsKaWYgKHRydWUgPT09ICRib29sZWFuVmFsaWRhdG9yKCR2YWx1ZSkpIHsKaWYgKGZhbHNlID09PSAkYm9vbGVhbk5vcm1hbGl6ZXIoJHZhbHVlKSkgewokdGhpcy0+Y29uZmlnU291cmNlLT5hZGRSZXBvc2l0b3J5KCRtYXRjaGVzWzFdLCBmYWxzZSwgJGlucHV0LT5nZXRPcHRpb24oJ2FwcGVuZCcpKTsKCnJldHVybiAwOwp9Cn0gZWxzZSB7CiR2YWx1ZSA9IEpzb25GaWxlOjpwYXJzZUpzb24oJHZhbHVlc1swXSk7CiR0aGlzLT5jb25maWdTb3VyY2UtPmFkZFJlcG9zaXRvcnkoJG1hdGNoZXNbMV0sICR2YWx1ZSwgJGlucHV0LT5nZXRPcHRpb24oJ2FwcGVuZCcpKTsKCnJldHVybiAwOwp9Cn0KCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignWW91IG11c3QgcGFzcyB0aGUgdHlwZSBhbmQgYSB1cmwuIEV4YW1wbGU6IHBocCBjb21wb3Nlci5waGFyIGNvbmZpZyByZXBvc2l0b3JpZXMuZm9vIHZjcyBodHRwczovL2Jhci5jb20nKTsKfQoKCmlmIChQcmVnOjppc01hdGNoKCcvXmV4dHJhXC4oLispLycsICRzZXR0aW5nS2V5LCAkbWF0Y2hlcykpIHsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd1bnNldCcpKSB7CiR0aGlzLT5jb25maWdTb3VyY2UtPnJlbW92ZVByb3BlcnR5KCRzZXR0aW5nS2V5KTsKCnJldHVybiAwOwp9CgokdmFsdWUgPSAkdmFsdWVzWzBdOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2pzb24nKSkgewokdmFsdWUgPSBKc29uRmlsZTo6cGFyc2VKc29uKCR2YWx1ZSk7CmlmICgkaW5wdXQtPmdldE9wdGlvbignbWVyZ2UnKSkgewokY3VycmVudFZhbHVlID0gJHRoaXMtPmNvbmZpZ0ZpbGUtPnJlYWQoKTsKJGJpdHMgPSBleHBsb2RlKCcuJywgJHNldHRpbmdLZXkpOwpmb3JlYWNoICgkYml0cyBhcyAkYml0KSB7CiRjdXJyZW50VmFsdWUgPSAkY3VycmVudFZhbHVlWyRiaXRdID8/IG51bGw7Cn0KaWYgKGlzX2FycmF5KCRjdXJyZW50VmFsdWUpICYmIGlzX2FycmF5KCR2YWx1ZSkpIHsKaWYgKGFycmF5X2lzX2xpc3QoJGN1cnJlbnRWYWx1ZSkgJiYgYXJyYXlfaXNfbGlzdCgkdmFsdWUpKSB7CiR2YWx1ZSA9IGFycmF5X21lcmdlKCRjdXJyZW50VmFsdWUsICR2YWx1ZSk7Cn0gZWxzZSB7CiR2YWx1ZSA9ICR2YWx1ZSArICRjdXJyZW50VmFsdWU7Cn0KfQp9Cn0KJHRoaXMtPmNvbmZpZ1NvdXJjZS0+YWRkUHJvcGVydHkoJHNldHRpbmdLZXksICR2YWx1ZSk7CgpyZXR1cm4gMDsKfQoKCmlmIChQcmVnOjppc01hdGNoKCcvXnN1Z2dlc3RcLiguKykvJywgJHNldHRpbmdLZXksICRtYXRjaGVzKSkgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3Vuc2V0JykpIHsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlUHJvcGVydHkoJHNldHRpbmdLZXkpOwoKcmV0dXJuIDA7Cn0KCiR0aGlzLT5jb25maWdTb3VyY2UtPmFkZFByb3BlcnR5KCRzZXR0aW5nS2V5LCBpbXBsb2RlKCcgJywgJHZhbHVlcykpOwoKcmV0dXJuIDA7Cn0KCgppZiAoaW5fYXJyYXkoJHNldHRpbmdLZXksIFsnc3VnZ2VzdCcsICdleHRyYSddLCB0cnVlKSAmJiAkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSkgewokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVQcm9wZXJ0eSgkc2V0dGluZ0tleSk7CgpyZXR1cm4gMDsKfQoKCmlmIChQcmVnOjppc01hdGNoKCcvXnBsYXRmb3JtXC4oLispLycsICRzZXR0aW5nS2V5LCAkbWF0Y2hlcykpIHsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd1bnNldCcpKSB7CiR0aGlzLT5jb25maWdTb3VyY2UtPnJlbW92ZUNvbmZpZ1NldHRpbmcoJHNldHRpbmdLZXkpOwoKcmV0dXJuIDA7Cn0KCiR0aGlzLT5jb25maWdTb3VyY2UtPmFkZENvbmZpZ1NldHRpbmcoJHNldHRpbmdLZXksICR2YWx1ZXNbMF0gPT09ICdmYWxzZScgPyBmYWxzZSA6ICR2YWx1ZXNbMF0pOwoKcmV0dXJuIDA7Cn0KCgppZiAoJHNldHRpbmdLZXkgPT09ICdwbGF0Zm9ybScgJiYgJGlucHV0LT5nZXRPcHRpb24oJ3Vuc2V0JykpIHsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlQ29uZmlnU2V0dGluZygkc2V0dGluZ0tleSk7CgpyZXR1cm4gMDsKfQoKCmlmIChpbl9hcnJheSgkc2V0dGluZ0tleSwgWydhdWRpdC5pZ25vcmUnLCAnYXVkaXQuaWdub3JlLWFiYW5kb25lZCddLCB0cnVlKSkgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3Vuc2V0JykpIHsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlQ29uZmlnU2V0dGluZygkc2V0dGluZ0tleSk7CgpyZXR1cm4gMDsKfQoKJHZhbHVlID0gJHZhbHVlczsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdqc29uJykpIHsKJHZhbHVlID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkdmFsdWVzWzBdKTsKaWYgKCFpc19hcnJheSgkdmFsdWUpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRXhwZWN0ZWQgYW4gYXJyYXkgb3Igb2JqZWN0IGZvciAnLiRzZXR0aW5nS2V5KTsKfQp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ21lcmdlJykpIHsKJGN1cnJlbnRDb25maWcgPSAkdGhpcy0+Y29uZmlnRmlsZS0+cmVhZCgpOwokY3VycmVudFZhbHVlID0gJGN1cnJlbnRDb25maWdbJ2NvbmZpZyddWydhdWRpdCddW3N0cl9yZXBsYWNlKCdhdWRpdC4nLCAnJywgJHNldHRpbmdLZXkpXSA/PyBudWxsOwoKaWYgKCRjdXJyZW50VmFsdWUgIT09IG51bGwgJiYgaXNfYXJyYXkoJGN1cnJlbnRWYWx1ZSkgJiYgaXNfYXJyYXkoJHZhbHVlKSkgewppZiAoYXJyYXlfaXNfbGlzdCgkY3VycmVudFZhbHVlKSAmJiBhcnJheV9pc19saXN0KCR2YWx1ZSkpIHsKCiR2YWx1ZSA9IGFycmF5X21lcmdlKCRjdXJyZW50VmFsdWUsICR2YWx1ZSk7Cn0gZWxzZWlmICghYXJyYXlfaXNfbGlzdCgkY3VycmVudFZhbHVlKSAmJiAhYXJyYXlfaXNfbGlzdCgkdmFsdWUpKSB7CgokdmFsdWUgPSAkdmFsdWUgKyAkY3VycmVudFZhbHVlOwp9IGVsc2Ugewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0Nhbm5vdCBtZXJnZSBhcnJheSBhbmQgb2JqZWN0IGZvciAnLiRzZXR0aW5nS2V5KTsKfQp9Cn0KCiR0aGlzLT5jb25maWdTb3VyY2UtPmFkZENvbmZpZ1NldHRpbmcoJHNldHRpbmdLZXksICR2YWx1ZSk7CgpyZXR1cm4gMDsKfQoKCmlmIChQcmVnOjppc01hdGNoKCcvXihiaXRidWNrZXQtb2F1dGh8Z2l0aHViLW9hdXRofGdpdGxhYi1vYXV0aHxnaXRsYWItdG9rZW58aHR0cC1iYXNpY3xjdXN0b20taGVhZGVyc3xiZWFyZXJ8Zm9yZ2Vqby10b2tlbilcLiguKykvJywgJHNldHRpbmdLZXksICRtYXRjaGVzKSkgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3Vuc2V0JykpIHsKJHRoaXMtPmF1dGhDb25maWdTb3VyY2UtPnJlbW92ZUNvbmZpZ1NldHRpbmcoJG1hdGNoZXNbMV0uJy4nLiRtYXRjaGVzWzJdKTsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlQ29uZmlnU2V0dGluZygkbWF0Y2hlc1sxXS4nLicuJG1hdGNoZXNbMl0pOwoKcmV0dXJuIDA7Cn0KCmlmICgkbWF0Y2hlc1sxXSA9PT0gJ2JpdGJ1Y2tldC1vYXV0aCcpIHsKaWYgKDIgIT09IGNvdW50KCR2YWx1ZXMpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRXhwZWN0ZWQgdHdvIGFyZ3VtZW50cyAoY29uc3VtZXIta2V5LCBjb25zdW1lci1zZWNyZXQpLCBnb3QgJy5jb3VudCgkdmFsdWVzKSk7Cn0KJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlQ29uZmlnU2V0dGluZygkbWF0Y2hlc1sxXS4nLicuJG1hdGNoZXNbMl0pOwokdGhpcy0+YXV0aENvbmZpZ1NvdXJjZS0+YWRkQ29uZmlnU2V0dGluZygkbWF0Y2hlc1sxXS4nLicuJG1hdGNoZXNbMl0sIFsnY29uc3VtZXIta2V5JyA9PiAkdmFsdWVzWzBdLCAnY29uc3VtZXItc2VjcmV0JyA9PiAkdmFsdWVzWzFdXSk7Cn0gZWxzZWlmICgkbWF0Y2hlc1sxXSA9PT0gJ2dpdGxhYi10b2tlbicgJiYgMiA9PT0gY291bnQoJHZhbHVlcykpIHsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlQ29uZmlnU2V0dGluZygkbWF0Y2hlc1sxXS4nLicuJG1hdGNoZXNbMl0pOwokdGhpcy0+YXV0aENvbmZpZ1NvdXJjZS0+YWRkQ29uZmlnU2V0dGluZygkbWF0Y2hlc1sxXS4nLicuJG1hdGNoZXNbMl0sIFsndXNlcm5hbWUnID0+ICR2YWx1ZXNbMF0sICd0b2tlbicgPT4gJHZhbHVlc1sxXV0pOwp9IGVsc2VpZiAoaW5fYXJyYXkoJG1hdGNoZXNbMV0sIFsnZ2l0aHViLW9hdXRoJywgJ2dpdGxhYi1vYXV0aCcsICdnaXRsYWItdG9rZW4nLCAnYmVhcmVyJ10sIHRydWUpKSB7CmlmICgxICE9PSBjb3VudCgkdmFsdWVzKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RvbyBtYW55IGFyZ3VtZW50cywgZXhwZWN0ZWQgb25seSBvbmUgdG9rZW4nKTsKfQokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVDb25maWdTZXR0aW5nKCRtYXRjaGVzWzFdLicuJy4kbWF0Y2hlc1syXSk7CiR0aGlzLT5hdXRoQ29uZmlnU291cmNlLT5hZGRDb25maWdTZXR0aW5nKCRtYXRjaGVzWzFdLicuJy4kbWF0Y2hlc1syXSwgJHZhbHVlc1swXSk7Cn0gZWxzZWlmICgkbWF0Y2hlc1sxXSA9PT0gJ2h0dHAtYmFzaWMnKSB7CmlmICgyICE9PSBjb3VudCgkdmFsdWVzKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0V4cGVjdGVkIHR3byBhcmd1bWVudHMgKHVzZXJuYW1lLCBwYXNzd29yZCksIGdvdCAnLmNvdW50KCR2YWx1ZXMpKTsKfQokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVDb25maWdTZXR0aW5nKCRtYXRjaGVzWzFdLicuJy4kbWF0Y2hlc1syXSk7CiR0aGlzLT5hdXRoQ29uZmlnU291cmNlLT5hZGRDb25maWdTZXR0aW5nKCRtYXRjaGVzWzFdLicuJy4kbWF0Y2hlc1syXSwgWyd1c2VybmFtZScgPT4gJHZhbHVlc1swXSwgJ3Bhc3N3b3JkJyA9PiAkdmFsdWVzWzFdXSk7Cn0gZWxzZWlmICgkbWF0Y2hlc1sxXSA9PT0gJ2N1c3RvbS1oZWFkZXJzJykgewppZiAoY291bnQoJHZhbHVlcykgPT09IDApIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdFeHBlY3RlZCBhdCBsZWFzdCBvbmUgYXJndW1lbnQgKGhlYWRlciksIGdvdCBub25lJyk7Cn0KCgokZm9ybWF0dGVkSGVhZGVycyA9IFtdOwpmb3JlYWNoICgkdmFsdWVzIGFzICRoZWFkZXIpIHsKaWYgKCFpc19zdHJpbmcoJGhlYWRlcikpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdIZWFkZXJzIG11c3QgYmUgc3RyaW5ncyBpbiAiSGVhZGVyLU5hbWU6IEhlYWRlci1WYWx1ZSIgZm9ybWF0Jyk7Cn0KCgppZiAoIVByZWc6OmlzTWF0Y2goJy9eW146XSs6XHMqLiskLycsICRoZWFkZXIsICRoZWFkZXJQYXJ0cykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdIZWFkZXIgIicgLiAkaGVhZGVyIC4gJyIgaXMgbm90IGluICJIZWFkZXItTmFtZTogSGVhZGVyLVZhbHVlIiBmb3JtYXQnKTsKfQoKJGZvcm1hdHRlZEhlYWRlcnNbXSA9ICRoZWFkZXI7Cn0KCiR0aGlzLT5jb25maWdTb3VyY2UtPnJlbW92ZUNvbmZpZ1NldHRpbmcoJG1hdGNoZXNbMV0uJy4nLiRtYXRjaGVzWzJdKTsKJHRoaXMtPmF1dGhDb25maWdTb3VyY2UtPmFkZENvbmZpZ1NldHRpbmcoJG1hdGNoZXNbMV0uJy4nLiRtYXRjaGVzWzJdLCAkZm9ybWF0dGVkSGVhZGVycyk7Cn0gZWxzZWlmICgkbWF0Y2hlc1sxXSA9PT0gJ2Zvcmdlam8tdG9rZW4nKSB7CmlmICgyICE9PSBjb3VudCgkdmFsdWVzKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0V4cGVjdGVkIHR3byBhcmd1bWVudHMgKHVzZXJuYW1lLCBhY2Nlc3MgdG9rZW4pLCBnb3QgJy5jb3VudCgkdmFsdWVzKSk7Cn0KJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlQ29uZmlnU2V0dGluZygkbWF0Y2hlc1sxXS4nLicuJG1hdGNoZXNbMl0pOwokdGhpcy0+YXV0aENvbmZpZ1NvdXJjZS0+YWRkQ29uZmlnU2V0dGluZygkbWF0Y2hlc1sxXS4nLicuJG1hdGNoZXNbMl0sIFsndXNlcm5hbWUnID0+ICR2YWx1ZXNbMF0sICd0b2tlbicgPT4gJHZhbHVlc1sxXV0pOwp9CgpyZXR1cm4gMDsKfQoKCmlmIChQcmVnOjppc01hdGNoKCcvXnNjcmlwdHNcLiguKykvJywgJHNldHRpbmdLZXksICRtYXRjaGVzKSkgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3Vuc2V0JykpIHsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlUHJvcGVydHkoJHNldHRpbmdLZXkpOwoKcmV0dXJuIDA7Cn0KCiR0aGlzLT5jb25maWdTb3VyY2UtPmFkZFByb3BlcnR5KCRzZXR0aW5nS2V5LCBjb3VudCgkdmFsdWVzKSA+IDEgPyAkdmFsdWVzIDogJHZhbHVlc1swXSk7CgpyZXR1cm4gMDsKfQoKCmlmICgkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSkgewokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVQcm9wZXJ0eSgkc2V0dGluZ0tleSk7CgpyZXR1cm4gMDsKfQoKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1NldHRpbmcgJy4kc2V0dGluZ0tleS4nIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBjb21tYW5kJyk7Cn0KCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaGFuZGxlU2luZ2xlVmFsdWUoc3RyaW5nICRrZXksIGFycmF5ICRjYWxsYmFja3MsIGFycmF5ICR2YWx1ZXMsIHN0cmluZyAkbWV0aG9kKTogdm9pZAp7ClskdmFsaWRhdG9yLCAkbm9ybWFsaXplcl0gPSAkY2FsbGJhY2tzOwppZiAoMSAhPT0gY291bnQoJHZhbHVlcykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdZb3UgY2FuIG9ubHkgcGFzcyBvbmUgdmFsdWUuIEV4YW1wbGU6IHBocCBjb21wb3Nlci5waGFyIGNvbmZpZyBwcm9jZXNzLXRpbWVvdXQgMzAwJyk7Cn0KCmlmICh0cnVlICE9PSAkdmFsaWRhdGlvbiA9ICR2YWxpZGF0b3IoJHZhbHVlc1swXSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoCiciJXMiIGlzIGFuIGludmFsaWQgdmFsdWUnLigkdmFsaWRhdGlvbiA/ICcgKCcuJHZhbGlkYXRpb24uJyknIDogJycpLAokdmFsdWVzWzBdCikpOwp9Cgokbm9ybWFsaXplZFZhbHVlID0gJG5vcm1hbGl6ZXIoJHZhbHVlc1swXSk7CgppZiAoJGtleSA9PT0gJ2Rpc2FibGUtdGxzJykgewppZiAoISRub3JtYWxpemVkVmFsdWUgJiYgJHRoaXMtPmNvbmZpZy0+Z2V0KCdkaXNhYmxlLXRscycpKSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZUVycm9yKCc8aW5mbz5Zb3UgYXJlIG5vdyBydW5uaW5nIENvbXBvc2VyIHdpdGggU1NML1RMUyBwcm90ZWN0aW9uIGVuYWJsZWQuPC9pbmZvPicpOwp9IGVsc2VpZiAoJG5vcm1hbGl6ZWRWYWx1ZSAmJiAhJHRoaXMtPmNvbmZpZy0+Z2V0KCdkaXNhYmxlLXRscycpKSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZUVycm9yKCc8d2FybmluZz5Zb3UgYXJlIG5vdyBydW5uaW5nIENvbXBvc2VyIHdpdGggU1NML1RMUyBwcm90ZWN0aW9uIGRpc2FibGVkLjwvd2FybmluZz4nKTsKfQp9CgpjYWxsX3VzZXJfZnVuYyhbJHRoaXMtPmNvbmZpZ1NvdXJjZSwgJG1ldGhvZF0sICRrZXksICRub3JtYWxpemVkVmFsdWUpOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGhhbmRsZU11bHRpVmFsdWUoc3RyaW5nICRrZXksIGFycmF5ICRjYWxsYmFja3MsIGFycmF5ICR2YWx1ZXMsIHN0cmluZyAkbWV0aG9kKTogdm9pZAp7ClskdmFsaWRhdG9yLCAkbm9ybWFsaXplcl0gPSAkY2FsbGJhY2tzOwppZiAodHJ1ZSAhPT0gJHZhbGlkYXRpb24gPSAkdmFsaWRhdG9yKCR2YWx1ZXMpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKAonJXMgaXMgYW4gaW52YWxpZCB2YWx1ZScuKCR2YWxpZGF0aW9uID8gJyAoJy4kdmFsaWRhdGlvbi4nKScgOiAnJyksCmpzb25fZW5jb2RlKCR2YWx1ZXMpCikpOwp9CgpjYWxsX3VzZXJfZnVuYyhbJHRoaXMtPmNvbmZpZ1NvdXJjZSwgJG1ldGhvZF0sICRrZXksICRub3JtYWxpemVyKCR2YWx1ZXMpKTsKfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGxpc3RDb25maWd1cmF0aW9uKGFycmF5ICRjb250ZW50cywgYXJyYXkgJHJhd0NvbnRlbnRzLCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgP3N0cmluZyAkayA9IG51bGwsIGJvb2wgJHNob3dTb3VyY2UgPSBmYWxzZSk6IHZvaWQKewokb3JpZ0sgPSAkazsKJGlvID0gJHRoaXMtPmdldElPKCk7CmZvcmVhY2ggKCRjb250ZW50cyBhcyAka2V5ID0+ICR2YWx1ZSkgewppZiAoJGsgPT09IG51bGwgJiYgIWluX2FycmF5KCRrZXksIFsnY29uZmlnJywgJ3JlcG9zaXRvcmllcyddKSkgewpjb250aW51ZTsKfQoKJHJhd1ZhbCA9ICRyYXdDb250ZW50c1ska2V5XSA/PyBudWxsOwoKaWYgKGlzX2FycmF5KCR2YWx1ZSkgJiYgKCFpc19udW1lcmljKGtleSgkdmFsdWUpKSB8fCAoJGtleSA9PT0gJ3JlcG9zaXRvcmllcycgJiYgbnVsbCA9PT0gJGspKSkgewokayAuPSBQcmVnOjpyZXBsYWNlKCd7XmNvbmZpZ1wufScsICcnLCAka2V5IC4gJy4nKTsKJHRoaXMtPmxpc3RDb25maWd1cmF0aW9uKCR2YWx1ZSwgJHJhd1ZhbCwgJG91dHB1dCwgJGssICRzaG93U291cmNlKTsKJGsgPSAkb3JpZ0s7Cgpjb250aW51ZTsKfQoKaWYgKGlzX2FycmF5KCR2YWx1ZSkpIHsKJHZhbHVlID0gYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gaXNfYXJyYXkoJHZhbCkgPyBqc29uX2VuY29kZSgkdmFsKSA6ICR2YWw7Cn0sICR2YWx1ZSk7CgokdmFsdWUgPSAnWycuaW1wbG9kZSgnLCAnLCAkdmFsdWUpLiddJzsKfQoKaWYgKGlzX2Jvb2woJHZhbHVlKSkgewokdmFsdWUgPSB2YXJfZXhwb3J0KCR2YWx1ZSwgdHJ1ZSk7Cn0KCiRzb3VyY2UgPSAnJzsKaWYgKCRzaG93U291cmNlKSB7CiRzb3VyY2UgPSAnICgnIC4gJHRoaXMtPmNvbmZpZy0+Z2V0U291cmNlT2ZWYWx1ZSgkayAuICRrZXkpIC4gJyknOwp9CgppZiAobnVsbCAhPT0gJGsgJiYgMCA9PT0gc3RycG9zKCRrLCAncmVwb3NpdG9yaWVzJykpIHsKJGxpbmsgPSAnaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzA1LXJlcG9zaXRvcmllcy5tZCc7Cn0gZWxzZSB7CiRpZCA9IFByZWc6OnJlcGxhY2UoJ3tcLi4qJH0nLCAnJywgJGsgPT09ICcnIHx8ICRrID09PSBudWxsID8gKHN0cmluZykgJGtleSA6ICRrKTsKJGlkID0gUHJlZzo6cmVwbGFjZSgne1teYS16MC05XX1pJywgJy0nLCBzdHJ0b2xvd2VyKHRyaW0oJGlkKSkpOwokaWQgPSBQcmVnOjpyZXBsYWNlKCd7LSt9JywgJy0nLCAkaWQpOwokbGluayA9ICdodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDYtY29uZmlnLm1kIycgLiAkaWQ7Cn0KaWYgKGlzX3N0cmluZygkcmF3VmFsKSAmJiAkcmF3VmFsICE9PSAkdmFsdWUpIHsKJGlvLT53cml0ZSgnWzxmZz15ZWxsb3c7aHJlZj0nIC4gJGxpbmsgLic+JyAuICRrIC4gJGtleSAuICc8Lz5dIDxpbmZvPicgLiAkcmF3VmFsIC4gJyAoJyAuICR2YWx1ZSAuICcpPC9pbmZvPicgLiAkc291cmNlLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwp9IGVsc2UgewokaW8tPndyaXRlKCdbPGZnPXllbGxvdztocmVmPScgLiAkbGluayAuJz4nIC4gJGsgLiAka2V5IC4gJzwvPl0gPGluZm8+JyAuICR2YWx1ZSAuICc8L2luZm8+JyAuICRzb3VyY2UsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7Cn0KfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHN1Z2dlc3RTZXR0aW5nS2V5cygpOiBcQ2xvc3VyZQp7CnJldHVybiBmdW5jdGlvbiAoQ29tcGxldGlvbklucHV0ICRpbnB1dCk6IGFycmF5IHsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdsaXN0JykgfHwgJGlucHV0LT5nZXRPcHRpb24oJ2VkaXRvcicpIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCdhdXRoJykpIHsKcmV0dXJuIFtdOwp9CgoKJGNvbmZpZyA9IEZhY3Rvcnk6OmNyZWF0ZUNvbmZpZygpOwoKCiRjb25maWdGaWxlID0gbmV3IEpzb25GaWxlKCR0aGlzLT5nZXRDb21wb3NlckNvbmZpZ0ZpbGUoJGlucHV0LCAkY29uZmlnKSk7CmlmICgkY29uZmlnRmlsZS0+ZXhpc3RzKCkpIHsKJGNvbmZpZy0+bWVyZ2UoJGNvbmZpZ0ZpbGUtPnJlYWQoKSwgJGNvbmZpZ0ZpbGUtPmdldFBhdGgoKSk7Cn0KCgokYXV0aENvbmZpZ0ZpbGUgPSBuZXcgSnNvbkZpbGUoJHRoaXMtPmdldEF1dGhDb25maWdGaWxlKCRpbnB1dCwgJGNvbmZpZykpOwppZiAoJGF1dGhDb25maWdGaWxlLT5leGlzdHMoKSkgewokY29uZmlnLT5tZXJnZShbJ2NvbmZpZycgPT4gJGF1dGhDb25maWdGaWxlLT5yZWFkKCldLCAkYXV0aENvbmZpZ0ZpbGUtPmdldFBhdGgoKSk7Cn0KCgokcmF3Q29uZmlnID0gJGNvbmZpZy0+cmF3KCk7CiRrZXlzID0gYXJyYXlfbWVyZ2UoCiR0aGlzLT5mbGF0dGVuU2V0dGluZ0tleXMoJHJhd0NvbmZpZ1snY29uZmlnJ10pLAokdGhpcy0+ZmxhdHRlblNldHRpbmdLZXlzKCRyYXdDb25maWdbJ3JlcG9zaXRvcmllcyddLCAncmVwb3NpdG9yaWVzLicpCik7CgoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd1bnNldCcpKSB7Cgokc291cmNlcyA9IFskY29uZmlnRmlsZS0+Z2V0UGF0aCgpLCAkYXV0aENvbmZpZ0ZpbGUtPmdldFBhdGgoKV07CiRrZXlzID0gYXJyYXlfZmlsdGVyKAoka2V5cywKc3RhdGljIGZ1bmN0aW9uIChzdHJpbmcgJGtleSkgdXNlICgkY29uZmlnLCAkc291cmNlcyk6IGJvb2wgewpyZXR1cm4gaW5fYXJyYXkoJGNvbmZpZy0+Z2V0U291cmNlT2ZWYWx1ZSgka2V5KSwgJHNvdXJjZXMsIHRydWUpOwp9Cik7CgoKfSBlbHNlIHsKCiRrZXlzID0gYXJyYXlfbWVyZ2UoJGtleXMsIHNlbGY6OkNPTkZJR1VSQUJMRV9QQUNLQUdFX1BST1BFUlRJRVMpOwoKCgoKCn0KCgppZiAoJGNvbmZpZ0ZpbGUtPmV4aXN0cygpKSB7CiRwcm9wZXJ0aWVzID0gYXJyYXlfZmlsdGVyKAokY29uZmlnRmlsZS0+cmVhZCgpLApzdGF0aWMgZnVuY3Rpb24gKHN0cmluZyAka2V5KTogYm9vbCB7CnJldHVybiBpbl9hcnJheSgka2V5LCBzZWxmOjpDT05GSUdVUkFCTEVfUEFDS0FHRV9QUk9QRVJUSUVTLCB0cnVlKTsKfSwKQVJSQVlfRklMVEVSX1VTRV9LRVkKKTsKCiRrZXlzID0gYXJyYXlfbWVyZ2UoCiRrZXlzLAokdGhpcy0+ZmxhdHRlblNldHRpbmdLZXlzKCRwcm9wZXJ0aWVzKQopOwp9CgoKJGNvbXBsZXRpb25WYWx1ZSA9ICRpbnB1dC0+Z2V0Q29tcGxldGlvblZhbHVlKCk7CgppZiAoJGNvbXBsZXRpb25WYWx1ZSAhPT0gJycpIHsKJGtleXMgPSBhcnJheV9maWx0ZXIoCiRrZXlzLApzdGF0aWMgZnVuY3Rpb24gKHN0cmluZyAka2V5KSB1c2UgKCRjb21wbGV0aW9uVmFsdWUpOiBib29sIHsKcmV0dXJuIHN0cl9zdGFydHNfd2l0aCgka2V5LCAkY29tcGxldGlvblZhbHVlKTsKfQopOwp9Cgpzb3J0KCRrZXlzKTsKCnJldHVybiBhcnJheV91bmlxdWUoJGtleXMpOwp9Owp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGZsYXR0ZW5TZXR0aW5nS2V5cyhhcnJheSAkY29uZmlnLCBzdHJpbmcgJHByZWZpeCA9ICcnKTogYXJyYXkKewoka2V5cyA9IFtdOwpmb3JlYWNoICgkY29uZmlnIGFzICRrZXkgPT4gJHZhbHVlKSB7CiRrZXlzW10gPSBbJHByZWZpeCAuICRrZXldOwoKCmlmIChpc19hcnJheSgkdmFsdWUpICYmICFhcnJheV9pc19saXN0KCR2YWx1ZSkgJiYgJHByZWZpeCAhPT0gJ3JlcG9zaXRvcmllcy4nKSB7CiRrZXlzW10gPSAkdGhpcy0+ZmxhdHRlblNldHRpbmdLZXlzKCR2YWx1ZSwgJHByZWZpeCAuICRrZXkgLiAnLicpOwp9Cn0KCnJldHVybiBhcnJheV9tZXJnZSguLi4ka2V5cyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxGYWN0b3J5Owp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcSWdub3JlQWxsUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcjsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5Owp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZTsKdXNlIENvbXBvc2VyXEluc3RhbGxlcjsKdXNlIENvbXBvc2VyXEluc3RhbGxlclxQcm9qZWN0SW5zdGFsbGVyOwp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyXFN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXI7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXEluc3RhbGxPcGVyYXRpb247CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblNlbGVjdG9yOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxQbHVnaW5cUGx1Z2luQmxvY2tlZEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUZhY3Rvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XENvbXBvc2l0ZVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkQXJyYXlSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5U2V0Owp1c2UgQ29tcG9zZXJcU2NyaXB0XFNjcmlwdEV2ZW50czsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFNlbGRcU2lnbmFsXFNpZ25hbEhhbmRsZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxGaW5kZXI7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcQ29uZmlnXEpzb25Db25maWdTb3VyY2U7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXEFkdmlzb3J5XEF1ZGl0b3I7CgoKCgoKCgoKCmNsYXNzIENyZWF0ZVByb2plY3RDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewp1c2UgQ29tcGxldGlvblRyYWl0OwoKCgoKcHJvdGVjdGVkICRzdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyOwoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdjcmVhdGUtcHJvamVjdCcpCi0+c2V0RGVzY3JpcHRpb24oJ0NyZWF0ZXMgbmV3IHByb2plY3QgZnJvbSBhIHBhY2thZ2UgaW50byBnaXZlbiBkaXJlY3RvcnknKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRBcmd1bWVudCgncGFja2FnZScsIElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnUGFja2FnZSBuYW1lIHRvIGJlIGluc3RhbGxlZCcsIG51bGwsICR0aGlzLT5zdWdnZXN0QXZhaWxhYmxlUGFja2FnZSgpKSwKbmV3IElucHV0QXJndW1lbnQoJ2RpcmVjdG9yeScsIElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnRGlyZWN0b3J5IHdoZXJlIHRoZSBmaWxlcyBzaG91bGQgYmUgY3JlYXRlZCcpLApuZXcgSW5wdXRBcmd1bWVudCgndmVyc2lvbicsIElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnVmVyc2lvbiwgd2lsbCBkZWZhdWx0IHRvIGxhdGVzdCcpLApuZXcgSW5wdXRPcHRpb24oJ3N0YWJpbGl0eScsICdzJywgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnTWluaW11bS1zdGFiaWxpdHkgYWxsb3dlZCAodW5sZXNzIGEgdmVyc2lvbiBpcyBzcGVjaWZpZWQpLicpLApuZXcgSW5wdXRPcHRpb24oJ3ByZWZlci1zb3VyY2UnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0ZvcmNlcyBpbnN0YWxsYXRpb24gZnJvbSBwYWNrYWdlIHNvdXJjZXMgd2hlbiBwb3NzaWJsZSwgaW5jbHVkaW5nIFZDUyBpbmZvcm1hdGlvbi4nKSwKbmV3IElucHV0T3B0aW9uKCdwcmVmZXItZGlzdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRm9yY2VzIGluc3RhbGxhdGlvbiBmcm9tIHBhY2thZ2UgZGlzdCAoZGVmYXVsdCBiZWhhdmlvcikuJyksCm5ldyBJbnB1dE9wdGlvbigncHJlZmVyLWluc3RhbGwnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdGb3JjZXMgaW5zdGFsbGF0aW9uIGZyb20gcGFja2FnZSBkaXN0fHNvdXJjZXxhdXRvIChhdXRvIGNob29zZXMgc291cmNlIGZvciBkZXYgdmVyc2lvbnMsIGRpc3QgZm9yIHRoZSByZXN0KS4nLCBudWxsLCAkdGhpcy0+c3VnZ2VzdFByZWZlckluc3RhbGwoKSksCm5ldyBJbnB1dE9wdGlvbigncmVwb3NpdG9yeScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCB8IElucHV0T3B0aW9uOjpWQUxVRV9JU19BUlJBWSwgJ0FkZCBjdXN0b20gcmVwb3NpdG9yaWVzIHRvIGxvb2sgdGhlIHBhY2thZ2UgdXAsIGVpdGhlciBieSBVUkwgb3IgdXNpbmcgSlNPTiBhcnJheXMnKSwKbmV3IElucHV0T3B0aW9uKCdyZXBvc2l0b3J5LXVybCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0RFUFJFQ0FURUQ6IFVzZSAtLXJlcG9zaXRvcnkgaW5zdGVhZC4nKSwKbmV3IElucHV0T3B0aW9uKCdhZGQtcmVwb3NpdG9yeScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQWRkIHRoZSBjdXN0b20gcmVwb3NpdG9yeSBpbiB0aGUgY29tcG9zZXIuanNvbi4gSWYgYSBsb2NrIGZpbGUgaXMgcHJlc2VudCBpdCB3aWxsIGJlIGRlbGV0ZWQgYW5kIGFuIHVwZGF0ZSB3aWxsIGJlIHJ1biBpbnN0ZWFkIG9mIGluc3RhbGwuJyksCm5ldyBJbnB1dE9wdGlvbignZGV2JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdFbmFibGVzIGluc3RhbGxhdGlvbiBvZiByZXF1aXJlLWRldiBwYWNrYWdlcyAoZW5hYmxlZCBieSBkZWZhdWx0LCBvbmx5IHByZXNlbnQgZm9yIEJDKS4nKSwKbmV3IElucHV0T3B0aW9uKCduby1kZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc2FibGVzIGluc3RhbGxhdGlvbiBvZiByZXF1aXJlLWRldiBwYWNrYWdlcy4nKSwKbmV3IElucHV0T3B0aW9uKCduby1jdXN0b20taW5zdGFsbGVycycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnREVQUkVDQVRFRDogVXNlIG5vLXBsdWdpbnMgaW5zdGVhZC4nKSwKbmV3IElucHV0T3B0aW9uKCduby1zY3JpcHRzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdXaGV0aGVyIHRvIHByZXZlbnQgZXhlY3V0aW9uIG9mIGFsbCBkZWZpbmVkIHNjcmlwdHMgaW4gdGhlIHJvb3QgcGFja2FnZS4nKSwKbmV3IElucHV0T3B0aW9uKCduby1wcm9ncmVzcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRG8gbm90IG91dHB1dCBkb3dubG9hZCBwcm9ncmVzcy4nKSwKbmV3IElucHV0T3B0aW9uKCduby1zZWN1cmUtaHR0cCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRGlzYWJsZSB0aGUgc2VjdXJlLWh0dHAgY29uZmlnIG9wdGlvbiB0ZW1wb3JhcmlseSB3aGlsZSBpbnN0YWxsaW5nIHRoZSByb290IHBhY2thZ2UuIFVzZSBhdCB5b3VyIG93biByaXNrLiBVc2luZyB0aGlzIGZsYWcgaXMgYSBiYWQgaWRlYS4nKSwKbmV3IElucHV0T3B0aW9uKCdrZWVwLXZjcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnV2hldGhlciB0byBwcmV2ZW50IGRlbGV0aW5nIHRoZSB2Y3MgZm9sZGVyLicpLApuZXcgSW5wdXRPcHRpb24oJ3JlbW92ZS12Y3MnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1doZXRoZXIgdG8gZm9yY2UgZGVsZXRpb24gb2YgdGhlIHZjcyBmb2xkZXIgd2l0aG91dCBwcm9tcHRpbmcuJyksCm5ldyBJbnB1dE9wdGlvbignbm8taW5zdGFsbCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnV2hldGhlciB0byBza2lwIGluc3RhbGxhdGlvbiBvZiB0aGUgcGFja2FnZSBkZXBlbmRlbmNpZXMuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tYXVkaXQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1doZXRoZXIgdG8gc2tpcCBhdWRpdGluZyBvZiB0aGUgaW5zdGFsbGVkIHBhY2thZ2UgZGVwZW5kZW5jaWVzIChjYW4gYWxzbyBiZSBzZXQgdmlhIHRoZSBDT01QT1NFUl9OT19BVURJVD0xIGVudiB2YXIpLicpLApuZXcgSW5wdXRPcHRpb24oJ2F1ZGl0LWZvcm1hdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0F1ZGl0IG91dHB1dCBmb3JtYXQuIE11c3QgYmUgInRhYmxlIiwgInBsYWluIiwgImpzb24iIG9yICJzdW1tYXJ5Ii4nLCBBdWRpdG9yOjpGT1JNQVRfU1VNTUFSWSwgQXVkaXRvcjo6Rk9STUFUUyksCm5ldyBJbnB1dE9wdGlvbignbm8tc2VjdXJpdHktYmxvY2tpbmcnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0FsbG93cyBpbnN0YWxsaW5nIHBhY2thZ2VzIHdpdGggc2VjdXJpdHkgYWR2aXNvcmllcyBvciB0aGF0IGFyZSBhYmFuZG9uZWQgKGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIENPTVBPU0VSX05PX1NFQ1VSSVRZX0JMT0NLSU5HPTEgZW52IHZhcikuJyksCm5ldyBJbnB1dE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCB8IElucHV0T3B0aW9uOjpWQUxVRV9JU19BUlJBWSwgJ0lnbm9yZSBhIHNwZWNpZmljIHBsYXRmb3JtIHJlcXVpcmVtZW50IChwaHAgJiBleHQtIHBhY2thZ2VzKS4nKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnSWdub3JlIGFsbCBwbGF0Zm9ybSByZXF1aXJlbWVudHMgKHBocCAmIGV4dC0gcGFja2FnZXMpLicpLApuZXcgSW5wdXRPcHRpb24oJ2FzaycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnV2hldGhlciB0byBhc2sgZm9yIHByb2plY3QgZGlyZWN0b3J5LicpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgPGluZm8+Y3JlYXRlLXByb2plY3Q8L2luZm8+IGNvbW1hbmQgY3JlYXRlcyBhIG5ldyBwcm9qZWN0IGZyb20gYSBnaXZlbgpwYWNrYWdlIGludG8gYSBuZXcgZGlyZWN0b3J5LiBJZiBleGVjdXRlZCB3aXRob3V0IHBhcmFtcyBhbmQgaW4gYSBkaXJlY3RvcnkKd2l0aCBhIGNvbXBvc2VyLmpzb24gZmlsZSBpdCBpbnN0YWxscyB0aGUgcGFja2FnZXMgZm9yIHRoZSBjdXJyZW50IHByb2plY3QuCgpZb3UgY2FuIHVzZSB0aGlzIGNvbW1hbmQgdG8gYm9vdHN0cmFwIG5ldyBwcm9qZWN0cyBvciBzZXR1cCBhIGNsZWFuCnZlcnNpb24tY29udHJvbGxlZCBpbnN0YWxsYXRpb24gZm9yIGRldmVsb3BlcnMgb2YgeW91ciBwcm9qZWN0LgoKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgY3JlYXRlLXByb2plY3QgdmVuZG9yL3Byb2plY3QgdGFyZ2V0LWRpcmVjdG9yeSBbdmVyc2lvbl08L2luZm8+CgpZb3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgdmVyc2lvbiB3aXRoIHRoZSBwYWNrYWdlIG5hbWUgdXNpbmcgPSBvciA6IGFzIHNlcGFyYXRvci4KCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIGNyZWF0ZS1wcm9qZWN0IHZlbmRvci9wcm9qZWN0OnZlcnNpb24gdGFyZ2V0LWRpcmVjdG9yeTwvaW5mbz4KClRvIGluc3RhbGwgdW5zdGFibGUgcGFja2FnZXMsIGVpdGhlciBzcGVjaWZ5IHRoZSB2ZXJzaW9uIHlvdSB3YW50LCBvciB1c2UgdGhlCi0tc3RhYmlsaXR5PWRldiAod2hlcmUgZGV2IGNhbiBiZSBvbmUgb2YgUkMsIGJldGEsIGFscGhhIG9yIGRldikuCgpUbyBzZXR1cCBhIGRldmVsb3BlciB3b3JrYWJsZSB2ZXJzaW9uIHlvdSBzaG91bGQgY3JlYXRlIHRoZSBwcm9qZWN0IHVzaW5nIHRoZSBzb3VyY2UKY29udHJvbGxlZCBjb2RlIGJ5IGFwcGVuZGluZyB0aGUgPGluZm8+Jy0tcHJlZmVyLXNvdXJjZSc8L2luZm8+IGZsYWcuCgpUbyBpbnN0YWxsIGEgcGFja2FnZSBmcm9tIGFub3RoZXIgcmVwb3NpdG9yeSB0aGFuIHRoZSBkZWZhdWx0IG9uZSB5b3UKY2FuIHBhc3MgdGhlIDxpbmZvPictLXJlcG9zaXRvcnk9aHR0cHM6Ly9teXJlcG9zaXRvcnkub3JnJzwvaW5mbz4gZmxhZy4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI2NyZWF0ZS1wcm9qZWN0CkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRjb25maWcgPSBGYWN0b3J5OjpjcmVhdGVDb25maWcoKTsKJGlvID0gJHRoaXMtPmdldElPKCk7CgpbJHByZWZlclNvdXJjZSwgJHByZWZlckRpc3RdID0gJHRoaXMtPmdldFByZWZlcnJlZEluc3RhbGxPcHRpb25zKCRjb25maWcsICRpbnB1dCwgdHJ1ZSk7CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2RldicpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+WW91IGFyZSB1c2luZyB0aGUgZGVwcmVjYXRlZCBvcHRpb24gImRldiIuIERldiBwYWNrYWdlcyBhcmUgaW5zdGFsbGVkIGJ5IGRlZmF1bHQgbm93Ljwvd2FybmluZz4nKTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLWN1c3RvbS1pbnN0YWxsZXJzJykpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Zb3UgYXJlIHVzaW5nIHRoZSBkZXByZWNhdGVkIG9wdGlvbiAibm8tY3VzdG9tLWluc3RhbGxlcnMiLiBVc2UgIm5vLXBsdWdpbnMiIGluc3RlYWQuPC93YXJuaW5nPicpOwokaW5wdXQtPnNldE9wdGlvbignbm8tcGx1Z2lucycsIHRydWUpOwp9CgppZiAoJGlucHV0LT5pc0ludGVyYWN0aXZlKCkgJiYgJGlucHV0LT5nZXRPcHRpb24oJ2FzaycpKSB7CiRwYWNrYWdlID0gJGlucHV0LT5nZXRBcmd1bWVudCgncGFja2FnZScpOwppZiAobnVsbCA9PT0gJHBhY2thZ2UpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdOb3QgZW5vdWdoIGFyZ3VtZW50cyAobWlzc2luZzogInBhY2thZ2UiKS4nKTsKfQokcGFydHMgPSBleHBsb2RlKCIvIiwgc3RydG9sb3dlcigkcGFja2FnZSksIDIpOwokaW5wdXQtPnNldEFyZ3VtZW50KCdkaXJlY3RvcnknLCAkaW8tPmFzaygnTmV3IHByb2plY3QgZGlyZWN0b3J5IFs8Y29tbWVudD4nLmFycmF5X3BvcCgkcGFydHMpLic8L2NvbW1lbnQ+XTogJykpOwp9CgpyZXR1cm4gJHRoaXMtPmluc3RhbGxQcm9qZWN0KAokaW8sCiRjb25maWcsCiRpbnB1dCwKJGlucHV0LT5nZXRBcmd1bWVudCgncGFja2FnZScpLAokaW5wdXQtPmdldEFyZ3VtZW50KCdkaXJlY3RvcnknKSwKJGlucHV0LT5nZXRBcmd1bWVudCgndmVyc2lvbicpLAokaW5wdXQtPmdldE9wdGlvbignc3RhYmlsaXR5JyksCiRwcmVmZXJTb3VyY2UsCiRwcmVmZXJEaXN0LAohJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpLApcY291bnQoJGlucHV0LT5nZXRPcHRpb24oJ3JlcG9zaXRvcnknKSkgPiAwID8gJGlucHV0LT5nZXRPcHRpb24oJ3JlcG9zaXRvcnknKSA6ICRpbnB1dC0+Z2V0T3B0aW9uKCdyZXBvc2l0b3J5LXVybCcpLAokaW5wdXQtPmdldE9wdGlvbignbm8tcGx1Z2lucycpLAokaW5wdXQtPmdldE9wdGlvbignbm8tc2NyaXB0cycpLAokaW5wdXQtPmdldE9wdGlvbignbm8tcHJvZ3Jlc3MnKSwKJGlucHV0LT5nZXRPcHRpb24oJ25vLWluc3RhbGwnKSwKJHRoaXMtPmdldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoJGlucHV0KSwKISRpbnB1dC0+Z2V0T3B0aW9uKCduby1zZWN1cmUtaHR0cCcpLAokaW5wdXQtPmdldE9wdGlvbignYWRkLXJlcG9zaXRvcnknKQopOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbnN0YWxsUHJvamVjdChJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBJbnB1dEludGVyZmFjZSAkaW5wdXQsID9zdHJpbmcgJHBhY2thZ2VOYW1lID0gbnVsbCwgP3N0cmluZyAkZGlyZWN0b3J5ID0gbnVsbCwgP3N0cmluZyAkcGFja2FnZVZlcnNpb24gPSBudWxsLCA/c3RyaW5nICRzdGFiaWxpdHkgPSAnc3RhYmxlJywgYm9vbCAkcHJlZmVyU291cmNlID0gZmFsc2UsIGJvb2wgJHByZWZlckRpc3QgPSBmYWxzZSwgYm9vbCAkaW5zdGFsbERldlBhY2thZ2VzID0gZmFsc2UsICRyZXBvc2l0b3JpZXMgPSBudWxsLCBib29sICRkaXNhYmxlUGx1Z2lucyA9IGZhbHNlLCBib29sICRkaXNhYmxlU2NyaXB0cyA9IGZhbHNlLCBib29sICRub1Byb2dyZXNzID0gZmFsc2UsIGJvb2wgJG5vSW5zdGFsbCA9IGZhbHNlLCA/UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciA9IG51bGwsIGJvb2wgJHNlY3VyZUh0dHAgPSB0cnVlLCBib29sICRhZGRSZXBvc2l0b3J5ID0gZmFsc2UpOiBpbnQKewokb2xkQ3dkID0gUGxhdGZvcm06OmdldEN3ZCgpOwoKaWYgKCRyZXBvc2l0b3JpZXMgIT09IG51bGwgJiYgIWlzX2FycmF5KCRyZXBvc2l0b3JpZXMpKSB7CiRyZXBvc2l0b3JpZXMgPSAoYXJyYXkpICRyZXBvc2l0b3JpZXM7Cn0KCiRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyID0gJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgPz8gUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk6Omlnbm9yZU5vdGhpbmcoKTsKCgokaW8tPmxvYWRDb25maWd1cmF0aW9uKCRjb25maWcpOwoKJHRoaXMtPnN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXIgPSBuZXcgU3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlcigkaW8pOwoKaWYgKCRwYWNrYWdlTmFtZSAhPT0gbnVsbCkgewokaW5zdGFsbGVkRnJvbVZjcyA9ICR0aGlzLT5pbnN0YWxsUm9vdFBhY2thZ2UoJGlucHV0LCAkaW8sICRjb25maWcsICRwYWNrYWdlTmFtZSwgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIsICRkaXJlY3RvcnksICRwYWNrYWdlVmVyc2lvbiwgJHN0YWJpbGl0eSwgJHByZWZlclNvdXJjZSwgJHByZWZlckRpc3QsICRpbnN0YWxsRGV2UGFja2FnZXMsICRyZXBvc2l0b3JpZXMsICRkaXNhYmxlUGx1Z2lucywgJGRpc2FibGVTY3JpcHRzLCAkbm9Qcm9ncmVzcywgJHNlY3VyZUh0dHApOwp9IGVsc2UgewokaW5zdGFsbGVkRnJvbVZjcyA9IGZhbHNlOwp9CgppZiAoJHJlcG9zaXRvcmllcyAhPT0gbnVsbCAmJiAkYWRkUmVwb3NpdG9yeSAmJiBpc19maWxlKCdjb21wb3Nlci5sb2NrJykpIHsKdW5saW5rKCdjb21wb3Nlci5sb2NrJyk7Cn0KCiRjb21wb3NlciA9ICR0aGlzLT5jcmVhdGVDb21wb3Nlckluc3RhbmNlKCRpbnB1dCwgJGlvLCBudWxsLCAkZGlzYWJsZVBsdWdpbnMsICRkaXNhYmxlU2NyaXB0cyk7CgoKaWYgKCRyZXBvc2l0b3JpZXMgIT09IG51bGwgJiYgJGFkZFJlcG9zaXRvcnkpIHsKZm9yZWFjaCAoJHJlcG9zaXRvcmllcyBhcyAkaW5kZXggPT4gJHJlcG8pIHsKJHJlcG9Db25maWcgPSBSZXBvc2l0b3J5RmFjdG9yeTo6Y29uZmlnRnJvbVN0cmluZygkaW8sICRjb21wb3Nlci0+Z2V0Q29uZmlnKCksICRyZXBvLCB0cnVlKTsKJGNvbXBvc2VySnNvblJlcG9zaXRvcmllc0NvbmZpZyA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldFJlcG9zaXRvcmllcygpOwokbmFtZSA9IFJlcG9zaXRvcnlGYWN0b3J5OjpnZW5lcmF0ZVJlcG9zaXRvcnlOYW1lKCRpbmRleCwgJHJlcG9Db25maWcsICRjb21wb3Nlckpzb25SZXBvc2l0b3JpZXNDb25maWcpOwokY29uZmlnU291cmNlID0gbmV3IEpzb25Db25maWdTb3VyY2UobmV3IEpzb25GaWxlKCdjb21wb3Nlci5qc29uJykpOwoKaWYgKAooaXNzZXQoJHJlcG9Db25maWdbJ3BhY2thZ2lzdCddKSAmJiAkcmVwb0NvbmZpZyA9PT0gWydwYWNrYWdpc3QnID0+IGZhbHNlXSkKfHwgKGlzc2V0KCRyZXBvQ29uZmlnWydwYWNrYWdpc3Qub3JnJ10pICYmICRyZXBvQ29uZmlnID09PSBbJ3BhY2thZ2lzdC5vcmcnID0+IGZhbHNlXSkKKSB7CiRjb25maWdTb3VyY2UtPmFkZFJlcG9zaXRvcnkoJ3BhY2thZ2lzdC5vcmcnLCBmYWxzZSk7Cn0gZWxzZSB7CiRjb25maWdTb3VyY2UtPmFkZFJlcG9zaXRvcnkoJG5hbWUsICRyZXBvQ29uZmlnLCBmYWxzZSk7Cn0KCiRjb21wb3NlciA9ICR0aGlzLT5jcmVhdGVDb21wb3Nlckluc3RhbmNlKCRpbnB1dCwgJGlvLCBudWxsLCAkZGlzYWJsZVBsdWdpbnMpOwp9Cn0KCiRwcm9jZXNzID0gJGNvbXBvc2VyLT5nZXRMb29wKCktPmdldFByb2Nlc3NFeGVjdXRvcigpOwokZnMgPSBuZXcgRmlsZXN5c3RlbSgkcHJvY2Vzcyk7CgoKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2hTY3JpcHQoU2NyaXB0RXZlbnRzOjpQT1NUX1JPT1RfUEFDS0FHRV9JTlNUQUxMLCAkaW5zdGFsbERldlBhY2thZ2VzKTsKCgokY29uZmlnID0gJGNvbXBvc2VyLT5nZXRDb25maWcoKTsKWyRwcmVmZXJTb3VyY2UsICRwcmVmZXJEaXN0XSA9ICR0aGlzLT5nZXRQcmVmZXJyZWRJbnN0YWxsT3B0aW9ucygkY29uZmlnLCAkaW5wdXQpOwoKCmlmICgkbm9JbnN0YWxsID09PSBmYWxzZSkgewokY29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKS0+c2V0T3V0cHV0UHJvZ3Jlc3MoISRub1Byb2dyZXNzKTsKCiRpbnN0YWxsZXIgPSBJbnN0YWxsZXI6OmNyZWF0ZSgkaW8sICRjb21wb3Nlcik7CiRpbnN0YWxsZXItPnNldFByZWZlclNvdXJjZSgkcHJlZmVyU291cmNlKQotPnNldFByZWZlckRpc3QoJHByZWZlckRpc3QpCi0+c2V0RGV2TW9kZSgkaW5zdGFsbERldlBhY2thZ2VzKQotPnNldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpCi0+c2V0U3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlcigkdGhpcy0+c3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlcikKLT5zZXRPcHRpbWl6ZUF1dG9sb2FkZXIoJGNvbmZpZy0+Z2V0KCdvcHRpbWl6ZS1hdXRvbG9hZGVyJykpCi0+c2V0Q2xhc3NNYXBBdXRob3JpdGF0aXZlKCRjb25maWctPmdldCgnY2xhc3NtYXAtYXV0aG9yaXRhdGl2ZScpKQotPnNldEFwY3VBdXRvbG9hZGVyKCRjb25maWctPmdldCgnYXBjdS1hdXRvbG9hZGVyJykpCi0+c2V0QXVkaXRDb25maWcoJHRoaXMtPmNyZWF0ZUF1ZGl0Q29uZmlnKCRjb25maWcsICRpbnB1dCkpOwoKaWYgKCEkY29tcG9zZXItPmdldExvY2tlcigpLT5pc0xvY2tlZCgpKSB7CiRpbnN0YWxsZXItPnNldFVwZGF0ZSh0cnVlKTsKfQoKaWYgKCRkaXNhYmxlUGx1Z2lucykgewokaW5zdGFsbGVyLT5kaXNhYmxlUGx1Z2lucygpOwp9Cgp0cnkgewokc3RhdHVzID0gJGluc3RhbGxlci0+cnVuKCk7CmlmICgwICE9PSAkc3RhdHVzKSB7CnJldHVybiAkc3RhdHVzOwp9Cn0gY2F0Y2ggKFBsdWdpbkJsb2NrZWRFeGNlcHRpb24gJGUpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+SGludDogVG8gYWxsb3cgcnVubmluZyB0aGUgY29uZmlnIGNvbW1hbmQgcmVjb21tZW5kZWQgYmVsb3cgYmVmb3JlIGRlcGVuZGVuY2llcyBhcmUgaW5zdGFsbGVkLCBydW4gY3JlYXRlLXByb2plY3Qgd2l0aCAtLW5vLWluc3RhbGwuPC9lcnJvcj4nKTsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+WW91IGNhbiB0aGVuIGNkIGludG8gJy5nZXRjd2QoKS4nLCBjb25maWd1cmUgYWxsb3ctcGx1Z2lucywgYW5kIGZpbmFsbHkgcnVuIGEgY29tcG9zZXIgaW5zdGFsbCB0byBjb21wbGV0ZSB0aGUgcHJvY2Vzcy48L2Vycm9yPicpOwp0aHJvdyAkZTsKfQp9CgokaGFzVmNzID0gJGluc3RhbGxlZEZyb21WY3M7CmlmICgKISRpbnB1dC0+Z2V0T3B0aW9uKCdrZWVwLXZjcycpCiYmICRpbnN0YWxsZWRGcm9tVmNzCiYmICgKJGlucHV0LT5nZXRPcHRpb24oJ3JlbW92ZS12Y3MnKQp8fCAhJGlvLT5pc0ludGVyYWN0aXZlKCkKfHwgJGlvLT5hc2tDb25maXJtYXRpb24oJzxpbmZvPkRvIHlvdSB3YW50IHRvIHJlbW92ZSB0aGUgZXhpc3RpbmcgVkNTICguZ2l0LCAuc3ZuLi4pIGhpc3Rvcnk/PC9pbmZvPiBbPGNvbW1lbnQ+eSxuPC9jb21tZW50Pl0/ICcpCikKKSB7CiRmaW5kZXIgPSBuZXcgRmluZGVyKCk7CiRmaW5kZXItPmRlcHRoKDApLT5kaXJlY3RvcmllcygpLT5pbihQbGF0Zm9ybTo6Z2V0Q3dkKCkpLT5pZ25vcmVWQ1MoZmFsc2UpLT5pZ25vcmVEb3RGaWxlcyhmYWxzZSk7CmZvcmVhY2ggKFsnLnN2bicsICdfc3ZuJywgJ0NWUycsICdfZGFyY3MnLCAnLmFyY2gtcGFyYW1zJywgJy5tb25vdG9uZScsICcuYnpyJywgJy5naXQnLCAnLmhnJywgJy5mc2xja291dCcsICdfRk9TU0lMXyddIGFzICR2Y3NOYW1lKSB7CiRmaW5kZXItPm5hbWUoJHZjc05hbWUpOwp9Cgp0cnkgewokZGlycyA9IGl0ZXJhdG9yX3RvX2FycmF5KCRmaW5kZXIpOwp1bnNldCgkZmluZGVyKTsKZm9yZWFjaCAoJGRpcnMgYXMgJGRpcikgewppZiAoISRmcy0+cmVtb3ZlRGlyZWN0b3J5KChzdHJpbmcpICRkaXIpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IHJlbW92ZSAnLiRkaXIpOwp9Cn0KfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5BbiBlcnJvciBvY2N1cnJlZCB3aGlsZSByZW1vdmluZyB0aGUgVkNTIG1ldGFkYXRhOiAnLiRlLT5nZXRNZXNzYWdlKCkuJzwvZXJyb3I+Jyk7Cn0KCiRoYXNWY3MgPSBmYWxzZTsKfQoKCmlmICghJGhhc1ZjcykgewokcGFja2FnZSA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpOwokY29uZmlnU291cmNlID0gbmV3IEpzb25Db25maWdTb3VyY2UobmV3IEpzb25GaWxlKCdjb21wb3Nlci5qc29uJykpOwpmb3JlYWNoIChCYXNlUGFja2FnZTo6JHN1cHBvcnRlZExpbmtUeXBlcyBhcyAkdHlwZSA9PiAkbWV0YSkgewpmb3JlYWNoICgkcGFja2FnZS0+eydnZXQnLiRtZXRhWydtZXRob2QnXX0oKSBhcyAkbGluaykgewppZiAoJGxpbmstPmdldFByZXR0eUNvbnN0cmFpbnQoKSA9PT0gJ3NlbGYudmVyc2lvbicpIHsKJGNvbmZpZ1NvdXJjZS0+YWRkTGluaygkdHlwZSwgJGxpbmstPmdldFRhcmdldCgpLCAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpKTsKfQp9Cn0KfQoKCiRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmRpc3BhdGNoU2NyaXB0KFNjcmlwdEV2ZW50czo6UE9TVF9DUkVBVEVfUFJPSkVDVF9DTUQsICRpbnN0YWxsRGV2UGFja2FnZXMpOwoKY2hkaXIoJG9sZEN3ZCk7CgpyZXR1cm4gMDsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5zdGFsbFJvb3RQYWNrYWdlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgc3RyaW5nICRwYWNrYWdlTmFtZSwgUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciwgP3N0cmluZyAkZGlyZWN0b3J5ID0gbnVsbCwgP3N0cmluZyAkcGFja2FnZVZlcnNpb24gPSBudWxsLCA/c3RyaW5nICRzdGFiaWxpdHkgPSAnc3RhYmxlJywgYm9vbCAkcHJlZmVyU291cmNlID0gZmFsc2UsIGJvb2wgJHByZWZlckRpc3QgPSBmYWxzZSwgYm9vbCAkaW5zdGFsbERldlBhY2thZ2VzID0gZmFsc2UsID9hcnJheSAkcmVwb3NpdG9yaWVzID0gbnVsbCwgYm9vbCAkZGlzYWJsZVBsdWdpbnMgPSBmYWxzZSwgYm9vbCAkZGlzYWJsZVNjcmlwdHMgPSBmYWxzZSwgYm9vbCAkbm9Qcm9ncmVzcyA9IGZhbHNlLCBib29sICRzZWN1cmVIdHRwID0gdHJ1ZSk6IGJvb2wKewokcGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKJHJlcXVpcmVtZW50cyA9ICRwYXJzZXItPnBhcnNlTmFtZVZlcnNpb25QYWlycyhbJHBhY2thZ2VOYW1lXSk7CiRuYW1lID0gc3RydG9sb3dlcigkcmVxdWlyZW1lbnRzWzBdWyduYW1lJ10pOwppZiAoISRwYWNrYWdlVmVyc2lvbiAmJiBpc3NldCgkcmVxdWlyZW1lbnRzWzBdWyd2ZXJzaW9uJ10pKSB7CiRwYWNrYWdlVmVyc2lvbiA9ICRyZXF1aXJlbWVudHNbMF1bJ3ZlcnNpb24nXTsKfQoKCmlmIChudWxsID09PSAkZGlyZWN0b3J5KSB7CiRwYXJ0cyA9IGV4cGxvZGUoIi8iLCAkbmFtZSwgMik7CiRkaXJlY3RvcnkgPSBQbGF0Zm9ybTo6Z2V0Q3dkKCkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gYXJyYXlfcG9wKCRwYXJ0cyk7Cn0KJGRpcmVjdG9yeSA9IHJ0cmltKCRkaXJlY3RvcnksICcvXFwnKTsKCiRwcm9jZXNzID0gbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwokZnMgPSBuZXcgRmlsZXN5c3RlbSgkcHJvY2Vzcyk7CmlmICghJGZzLT5pc0Fic29sdXRlUGF0aCgkZGlyZWN0b3J5KSkgewokZGlyZWN0b3J5ID0gUGxhdGZvcm06OmdldEN3ZCgpIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRkaXJlY3Rvcnk7Cn0KaWYgKCcnID09PSAkZGlyZWN0b3J5KSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdHb3QgYW4gZW1wdHkgdGFyZ2V0IGRpcmVjdG9yeSwgc29tZXRoaW5nIHdlbnQgd3JvbmcnKTsKfQoKCiRjb25maWctPnNldEJhc2VEaXIoJGRpcmVjdG9yeSk7CmlmICghJHNlY3VyZUh0dHApIHsKJGNvbmZpZy0+bWVyZ2UoWydjb25maWcnID0+IFsnc2VjdXJlLWh0dHAnID0+IGZhbHNlXV0sIENvbmZpZzo6U09VUkNFX0NPTU1BTkQpOwp9CgokaW8tPndyaXRlRXJyb3IoJzxpbmZvPkNyZWF0aW5nIGEgIicgLiAkcGFja2FnZU5hbWUgLiAnIiBwcm9qZWN0IGF0ICInIC4gJGZzLT5maW5kU2hvcnRlc3RQYXRoKFBsYXRmb3JtOjpnZXRDd2QoKSwgJGRpcmVjdG9yeSwgdHJ1ZSkgLiAnIjwvaW5mbz4nKTsKCmlmIChmaWxlX2V4aXN0cygkZGlyZWN0b3J5KSkgewppZiAoIWlzX2RpcigkZGlyZWN0b3J5KSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignQ2Fubm90IGNyZWF0ZSBwcm9qZWN0IGRpcmVjdG9yeSBhdCAiJy4kZGlyZWN0b3J5LiciLCBpdCBleGlzdHMgYXMgYSBmaWxlLicpOwp9CmlmICghJGZzLT5pc0RpckVtcHR5KCRkaXJlY3RvcnkpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQcm9qZWN0IGRpcmVjdG9yeSAiJy4kZGlyZWN0b3J5LiciIGlzIG5vdCBlbXB0eS4nKTsKfQp9CgppZiAobnVsbCA9PT0gJHN0YWJpbGl0eSkgewppZiAobnVsbCA9PT0gJHBhY2thZ2VWZXJzaW9uKSB7CiRzdGFiaWxpdHkgPSAnc3RhYmxlJzsKfSBlbHNlaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teW14sXHNdKj9AKCcuaW1wbG9kZSgnfCcsIGFycmF5X2tleXMoQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTKSkuJykkfWknLCAkcGFja2FnZVZlcnNpb24sICRtYXRjaCkpIHsKJHN0YWJpbGl0eSA9ICRtYXRjaFsxXTsKfSBlbHNlIHsKJHN0YWJpbGl0eSA9IFZlcnNpb25QYXJzZXI6OnBhcnNlU3RhYmlsaXR5KCRwYWNrYWdlVmVyc2lvbik7Cn0KfQoKJHN0YWJpbGl0eSA9IFZlcnNpb25QYXJzZXI6Om5vcm1hbGl6ZVN0YWJpbGl0eSgkc3RhYmlsaXR5KTsKCmlmICghaXNzZXQoQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTWyRzdGFiaWxpdHldKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBzdGFiaWxpdHkgcHJvdmlkZWQgKCcuJHN0YWJpbGl0eS4nKSwgbXVzdCBiZSBvbmUgb2Y6ICcuaW1wbG9kZSgnLCAnLCBhcnJheV9rZXlzKEJhc2VQYWNrYWdlOjpTVEFCSUxJVElFUykpKTsKfQoKJGNvbXBvc2VyID0gJHRoaXMtPmNyZWF0ZUNvbXBvc2VySW5zdGFuY2UoJGlucHV0LCAkaW8sICRjb25maWctPmFsbCgpLCAkZGlzYWJsZVBsdWdpbnMsICRkaXNhYmxlU2NyaXB0cyk7CiRjb25maWcgPSAkY29tcG9zZXItPmdldENvbmZpZygpOwoKJGNvbmZpZy0+c2V0QmFzZURpcigkZGlyZWN0b3J5KTsKJHJtID0gJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpOwoKJHJlcG9zaXRvcnlTZXQgPSBuZXcgUmVwb3NpdG9yeVNldCgkc3RhYmlsaXR5KTsKaWYgKG51bGwgPT09ICRyZXBvc2l0b3JpZXMpIHsKJHJlcG9zaXRvcnlTZXQtPmFkZFJlcG9zaXRvcnkobmV3IENvbXBvc2l0ZVJlcG9zaXRvcnkoUmVwb3NpdG9yeUZhY3Rvcnk6OmRlZmF1bHRSZXBvcygkaW8sICRjb25maWcsICRybSkpKTsKfSBlbHNlIHsKZm9yZWFjaCAoJHJlcG9zaXRvcmllcyBhcyAkcmVwbykgewokcmVwb0NvbmZpZyA9IFJlcG9zaXRvcnlGYWN0b3J5Ojpjb25maWdGcm9tU3RyaW5nKCRpbywgJGNvbmZpZywgJHJlcG8sIHRydWUpOwppZiAoCihpc3NldCgkcmVwb0NvbmZpZ1sncGFja2FnaXN0J10pICYmICRyZXBvQ29uZmlnID09PSBbJ3BhY2thZ2lzdCcgPT4gZmFsc2VdKQp8fCAoaXNzZXQoJHJlcG9Db25maWdbJ3BhY2thZ2lzdC5vcmcnXSkgJiYgJHJlcG9Db25maWcgPT09IFsncGFja2FnaXN0Lm9yZycgPT4gZmFsc2VdKQopIHsKY29udGludWU7Cn0KCgppZiAoKCRyZXBvQ29uZmlnWyd0eXBlJ10gPz8gbnVsbCkgPT09ICdwYXRoJyAmJiAhaXNzZXQoJHJlcG9Db25maWdbJ29wdGlvbnMnXVsnc3ltbGluayddKSkgewokcmVwb0NvbmZpZ1snb3B0aW9ucyddWydzeW1saW5rJ10gPSBmYWxzZTsKfQoKJHJlcG9zaXRvcnlTZXQtPmFkZFJlcG9zaXRvcnkoUmVwb3NpdG9yeUZhY3Rvcnk6OmNyZWF0ZVJlcG8oJGlvLCAkY29uZmlnLCAkcmVwb0NvbmZpZywgJHJtKSk7Cn0KfQoKJHBsYXRmb3JtT3ZlcnJpZGVzID0gJGNvbmZpZy0+Z2V0KCdwbGF0Zm9ybScpOwokcGxhdGZvcm1SZXBvID0gbmV3IFBsYXRmb3JtUmVwb3NpdG9yeShbXSwgJHBsYXRmb3JtT3ZlcnJpZGVzKTsKCgokdmVyc2lvblNlbGVjdG9yID0gbmV3IFZlcnNpb25TZWxlY3RvcigkcmVwb3NpdG9yeVNldCwgJHBsYXRmb3JtUmVwbyk7CiRwYWNrYWdlID0gJHZlcnNpb25TZWxlY3Rvci0+ZmluZEJlc3RDYW5kaWRhdGUoJG5hbWUsICRwYWNrYWdlVmVyc2lvbiwgJHN0YWJpbGl0eSwgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIsIDAsICRpbyk7CgppZiAoISRwYWNrYWdlKSB7CiRlcnJvck1lc3NhZ2UgPSAiQ291bGQgbm90IGZpbmQgcGFja2FnZSAkbmFtZSB3aXRoICIgLiAoJHBhY2thZ2VWZXJzaW9uID8gInZlcnNpb24gJHBhY2thZ2VWZXJzaW9uIiA6ICJzdGFiaWxpdHkgJHN0YWJpbGl0eSIpOwppZiAoISgkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciBpbnN0YW5jZW9mIElnbm9yZUFsbFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpICYmICR2ZXJzaW9uU2VsZWN0b3ItPmZpbmRCZXN0Q2FuZGlkYXRlKCRuYW1lLCAkcGFja2FnZVZlcnNpb24sICRzdGFiaWxpdHksIFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5OjppZ25vcmVBbGwoKSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJGVycm9yTWVzc2FnZSAuJyBpbiBhIHZlcnNpb24gaW5zdGFsbGFibGUgdXNpbmcgeW91ciBQSFAgdmVyc2lvbiwgUEhQIGV4dGVuc2lvbnMgYW5kIENvbXBvc2VyIHZlcnNpb24uJyk7Cn0KCnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCRlcnJvck1lc3NhZ2UgLicuJyk7Cn0KCgpAbWtkaXIoJGRpcmVjdG9yeSwgMDc3NywgdHJ1ZSk7CmlmIChmYWxzZSAhPT0gKCRyZWFsRGlyID0gcmVhbHBhdGgoJGRpcmVjdG9yeSkpKSB7CiRzaWduYWxIYW5kbGVyID0gU2lnbmFsSGFuZGxlcjo6Y3JlYXRlKFtTaWduYWxIYW5kbGVyOjpTSUdJTlQsIFNpZ25hbEhhbmRsZXI6OlNJR1RFUk0sIFNpZ25hbEhhbmRsZXI6OlNJR0hVUF0sIGZ1bmN0aW9uIChzdHJpbmcgJHNpZ25hbCwgU2lnbmFsSGFuZGxlciAkaGFuZGxlcikgdXNlICgkcmVhbERpcikgewokdGhpcy0+Z2V0SU8oKS0+d3JpdGVFcnJvcignUmVjZWl2ZWQgJy4kc2lnbmFsLicsIGFib3J0aW5nJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKJGZzID0gbmV3IEZpbGVzeXN0ZW0oKTsKJGZzLT5yZW1vdmVEaXJlY3RvcnkoJHJlYWxEaXIpOwokaGFuZGxlci0+ZXhpdFdpdGhMYXN0U2lnbmFsKCk7Cn0pOwp9CgoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICYmICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkgPT09IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTKSB7CiRwYWNrYWdlID0gJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKfQoKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5JbnN0YWxsaW5nICcgLiAkcGFja2FnZS0+Z2V0TmFtZSgpIC4gJyAoJyAuICRwYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbihmYWxzZSkgLiAnKTwvaW5mbz4nKTsKCmlmICgkZGlzYWJsZVBsdWdpbnMpIHsKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5QbHVnaW5zIGhhdmUgYmVlbiBkaXNhYmxlZC48L2luZm8+Jyk7Cn0KCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokcGFja2FnZSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7Cn0KCiRkbSA9ICRjb21wb3Nlci0+Z2V0RG93bmxvYWRNYW5hZ2VyKCk7CiRkbS0+c2V0UHJlZmVyU291cmNlKCRwcmVmZXJTb3VyY2UpCi0+c2V0UHJlZmVyRGlzdCgkcHJlZmVyRGlzdCk7CgokcHJvamVjdEluc3RhbGxlciA9IG5ldyBQcm9qZWN0SW5zdGFsbGVyKCRkaXJlY3RvcnksICRkbSwgJGZzKTsKJGltID0gJGNvbXBvc2VyLT5nZXRJbnN0YWxsYXRpb25NYW5hZ2VyKCk7CiRpbS0+c2V0T3V0cHV0UHJvZ3Jlc3MoISRub1Byb2dyZXNzKTsKJGltLT5hZGRJbnN0YWxsZXIoJHByb2plY3RJbnN0YWxsZXIpOwokaW0tPmV4ZWN1dGUobmV3IEluc3RhbGxlZEFycmF5UmVwb3NpdG9yeSgpLCBbbmV3IEluc3RhbGxPcGVyYXRpb24oJHBhY2thZ2UpXSk7CiRpbS0+bm90aWZ5SW5zdGFsbHMoJGlvKTsKCgokdGhpcy0+c3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlci0+YWRkU3VnZ2VzdGlvbnNGcm9tUGFja2FnZSgkcGFja2FnZSk7CgokaW5zdGFsbGVkRnJvbVZjcyA9ICdzb3VyY2UnID09PSAkcGFja2FnZS0+Z2V0SW5zdGFsbGF0aW9uU291cmNlKCk7CgokaW8tPndyaXRlRXJyb3IoJzxpbmZvPkNyZWF0ZWQgcHJvamVjdCBpbiAnIC4gJGRpcmVjdG9yeSAuICc8L2luZm8+Jyk7CmNoZGlyKCRkaXJlY3RvcnkpOwoKCgoKaWYgKGZpbGVfZXhpc3RzKCRkaXJlY3RvcnkuJy9jb21wb3Nlci5qc29uJykgJiYgUGxhdGZvcm06OmdldEVudignQ09NUE9TRVInKSAhPT0gZmFsc2UpIHsKUGxhdGZvcm06OmNsZWFyRW52KCdDT01QT1NFUicpOwp9CgpQbGF0Zm9ybTo6cHV0RW52KCdDT01QT1NFUl9ST09UX1ZFUlNJT04nLCAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpKTsKCgppZiAoaXNzZXQoJHNpZ25hbEhhbmRsZXIpKSB7CiRzaWduYWxIYW5kbGVyLT51bnJlZ2lzdGVyKCk7Cn0KCnJldHVybiAkaW5zdGFsbGVkRnJvbVZjczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwoKCgoKY2xhc3MgRGVwZW5kc0NvbW1hbmQgZXh0ZW5kcyBCYXNlRGVwZW5kZW5jeUNvbW1hbmQKewp1c2UgQ29tcGxldGlvblRyYWl0OwoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdkZXBlbmRzJykKLT5zZXRBbGlhc2VzKFsnd2h5J10pCi0+c2V0RGVzY3JpcHRpb24oJ1Nob3dzIHdoaWNoIHBhY2thZ2VzIGNhdXNlIHRoZSBnaXZlbiBwYWNrYWdlIHRvIGJlIGluc3RhbGxlZCcpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dEFyZ3VtZW50KHNlbGY6OkFSR1VNRU5UX1BBQ0tBR0UsIElucHV0QXJndW1lbnQ6OlJFUVVJUkVELCAnUGFja2FnZSB0byBpbnNwZWN0JywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RJbnN0YWxsZWRQYWNrYWdlKHRydWUsIHRydWUpKSwKbmV3IElucHV0T3B0aW9uKHNlbGY6Ok9QVElPTl9SRUNVUlNJVkUsICdyJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSZWN1cnNpdmVseSByZXNvbHZlcyB1cCB0byB0aGUgcm9vdCBwYWNrYWdlJyksCm5ldyBJbnB1dE9wdGlvbihzZWxmOjpPUFRJT05fVFJFRSwgJ3QnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1ByaW50cyB0aGUgcmVzdWx0cyBhcyBhIG5lc3RlZCB0cmVlJyksCm5ldyBJbnB1dE9wdGlvbignbG9ja2VkJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSZWFkIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gZnJvbSBjb21wb3Nlci5sb2NrJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UCkRpc3BsYXlzIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHdoZXJlIGEgcGFja2FnZSBpcyByZWZlcmVuY2VkLgoKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgZGVwZW5kcyBjb21wb3Nlci9jb21wb3NlcjwvaW5mbz4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI2RlcGVuZHMtd2h5CkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CnJldHVybiBwYXJlbnQ6OmRvRXhlY3V0ZSgkaW5wdXQsICRvdXRwdXQpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcQXVkaXRvcjsKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcSU9cQnVmZmVySU87CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uVmFsaWRhdGlvbkV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9ja2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxDb21wb3NlclJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEZpbGVzeXN0ZW1SZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxQbHVnaW5cQ29tbWFuZEV2ZW50Owp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVNldDsKdXNlIENvbXBvc2VyXFV0aWxcQ29uZmlnVmFsaWRhdG9yOwp1c2UgQ29tcG9zZXJcVXRpbFxHaXQ7CnVzZSBDb21wb3NlclxVdGlsXEluaUhlbHBlcjsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwRG93bmxvYWRlcjsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxTZWxmVXBkYXRlXEtleXM7CnVzZSBDb21wb3NlclxTZWxmVXBkYXRlXFZlcnNpb25zOwp1c2UgQ29tcG9zZXJcSU9cTnVsbElPOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxYZGVidWdIYW5kbGVyXFhkZWJ1Z0hhbmRsZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGVjdXRhYmxlRmluZGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwXFByb3h5TWFuYWdlcjsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cFxSZXF1ZXN0UHJveHk7CgoKCgpjbGFzcyBEaWFnbm9zZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7Cgpwcm90ZWN0ZWQgJGh0dHBEb3dubG9hZGVyOwoKCnByb3RlY3RlZCAkcHJvY2VzczsKCgpwcm90ZWN0ZWQgJGV4aXRDb2RlID0gMDsKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgnZGlhZ25vc2UnKQotPnNldERlc2NyaXB0aW9uKCdEaWFnbm9zZXMgdGhlIHN5c3RlbSB0byBpZGVudGlmeSBjb21tb24gZXJyb3JzJykKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIDxpbmZvPmRpYWdub3NlPC9pbmZvPiBjb21tYW5kIGNoZWNrcyBjb21tb24gZXJyb3JzIHRvIGhlbHAgZGVidWdnaW5nIHByb2JsZW1zLgoKVGhlIHByb2Nlc3MgZXhpdCBjb2RlIHdpbGwgYmUgMSBpbiBjYXNlIG9mIHdhcm5pbmdzIGFuZCAyIGZvciBlcnJvcnMuCgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNkaWFnbm9zZQpFT1QKKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokY29tcG9zZXIgPSAkdGhpcy0+dHJ5Q29tcG9zZXIoKTsKJGlvID0gJHRoaXMtPmdldElPKCk7CgppZiAoJGNvbXBvc2VyKSB7CiRjb25maWcgPSAkY29tcG9zZXItPmdldENvbmZpZygpOwoKJGNvbW1hbmRFdmVudCA9IG5ldyBDb21tYW5kRXZlbnQoUGx1Z2luRXZlbnRzOjpDT01NQU5ELCAnZGlhZ25vc2UnLCAkaW5wdXQsICRvdXRwdXQpOwokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaCgkY29tbWFuZEV2ZW50LT5nZXROYW1lKCksICRjb21tYW5kRXZlbnQpOwokdGhpcy0+cHJvY2VzcyA9ICRjb21wb3Nlci0+Z2V0TG9vcCgpLT5nZXRQcm9jZXNzRXhlY3V0b3IoKSA/PyBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7Cn0gZWxzZSB7CiRjb25maWcgPSBGYWN0b3J5OjpjcmVhdGVDb25maWcoKTsKCiR0aGlzLT5wcm9jZXNzID0gbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwp9CgokY29uZmlnLT5tZXJnZShbJ2NvbmZpZycgPT4gWydzZWN1cmUtaHR0cCcgPT4gZmFsc2VdXSwgQ29uZmlnOjpTT1VSQ0VfQ09NTUFORCk7CiRjb25maWctPnByb2hpYml0VXJsQnlDb25maWcoJ2h0dHA6Ly9yZXBvLnBhY2thZ2lzdC5vcmcnLCBuZXcgTnVsbElPKTsKCiR0aGlzLT5odHRwRG93bmxvYWRlciA9IEZhY3Rvcnk6OmNyZWF0ZUh0dHBEb3dubG9hZGVyKCRpbywgJGNvbmZpZyk7CgppZiAoc3RycG9zKF9fRklMRV9fLCAncGhhcjonKSA9PT0gMCkgewokaW8tPndyaXRlKCdDaGVja2luZyBwdWJrZXlzOiAnLCBmYWxzZSk7CiR0aGlzLT5vdXRwdXRSZXN1bHQoJHRoaXMtPmNoZWNrUHViS2V5cygkY29uZmlnKSk7CgokaW8tPndyaXRlKCdDaGVja2luZyBDb21wb3NlciB2ZXJzaW9uOiAnLCBmYWxzZSk7CiR0aGlzLT5vdXRwdXRSZXN1bHQoJHRoaXMtPmNoZWNrVmVyc2lvbigkY29uZmlnKSk7Cn0KCiRpby0+d3JpdGUoc3ByaW50ZignQ29tcG9zZXIgdmVyc2lvbjogPGNvbW1lbnQ+JXM8L2NvbW1lbnQ+JywgQ29tcG9zZXI6OmdldFZlcnNpb24oKSkpOwoKJGlvLT53cml0ZSgnQ2hlY2tpbmcgQ29tcG9zZXIgYW5kIGl0cyBkZXBlbmRlbmNpZXMgZm9yIHZ1bG5lcmFiaWxpdGllczogJywgZmFsc2UpOwokdGhpcy0+b3V0cHV0UmVzdWx0KCR0aGlzLT5jaGVja0NvbXBvc2VyQXVkaXQoJGNvbmZpZykpOwoKJHBsYXRmb3JtT3ZlcnJpZGVzID0gJGNvbmZpZy0+Z2V0KCdwbGF0Zm9ybScpID86IFtdOwokcGxhdGZvcm1SZXBvID0gbmV3IFBsYXRmb3JtUmVwb3NpdG9yeShbXSwgJHBsYXRmb3JtT3ZlcnJpZGVzKTsKJHBocFBrZyA9ICRwbGF0Zm9ybVJlcG8tPmZpbmRQYWNrYWdlKCdwaHAnLCAnKicpOwokcGhwVmVyc2lvbiA9ICRwaHBQa2ctPmdldFByZXR0eVZlcnNpb24oKTsKaWYgKCRwaHBQa2cgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJiYgc3RyX2NvbnRhaW5zKChzdHJpbmcpICRwaHBQa2ctPmdldERlc2NyaXB0aW9uKCksICdvdmVycmlkZGVuJykpIHsKJHBocFZlcnNpb24gLj0gJyAtICcgLiAkcGhwUGtnLT5nZXREZXNjcmlwdGlvbigpOwp9CgokaW8tPndyaXRlKHNwcmludGYoJ1BIUCB2ZXJzaW9uOiA8Y29tbWVudD4lczwvY29tbWVudD4nLCAkcGhwVmVyc2lvbikpOwoKaWYgKGRlZmluZWQoJ1BIUF9CSU5BUlknKSkgewokaW8tPndyaXRlKHNwcmludGYoJ1BIUCBiaW5hcnkgcGF0aDogPGNvbW1lbnQ+JXM8L2NvbW1lbnQ+JywgUEhQX0JJTkFSWSkpOwp9CgokaW8tPndyaXRlKCdPcGVuU1NMIHZlcnNpb246ICcgLiAoZGVmaW5lZCgnT1BFTlNTTF9WRVJTSU9OX1RFWFQnKSA/ICc8Y29tbWVudD4nLk9QRU5TU0xfVkVSU0lPTl9URVhULic8L2NvbW1lbnQ+JyA6ICc8ZXJyb3I+bWlzc2luZzwvZXJyb3I+JykpOwokaW8tPndyaXRlKCdjdXJsIHZlcnNpb246ICcgLiAkdGhpcy0+Z2V0Q3VybFZlcnNpb24oKSk7CgokZmluZGVyID0gbmV3IEV4ZWN1dGFibGVGaW5kZXI7CiRoYXNTeXN0ZW1VbnppcCA9IChib29sKSAkZmluZGVyLT5maW5kKCd1bnppcCcpOwokYmluN3ppcCA9ICcnOwppZiAoJGhhc1N5c3RlbTd6aXAgPSAoYm9vbCkgJGZpbmRlci0+ZmluZCgnN3onLCBudWxsLCBbJ0M6XFByb2dyYW0gRmlsZXNcNy1aaXAnXSkpIHsKJGJpbjd6aXAgPSAnN3onOwp9IGVsc2VpZiAoIVBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiAkaGFzU3lzdGVtN3ppcCA9IChib29sKSAkZmluZGVyLT5maW5kKCc3enonKSkgewokYmluN3ppcCA9ICc3enonOwp9IGVsc2VpZiAoIVBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiAkaGFzU3lzdGVtN3ppcCA9IChib29sKSAkZmluZGVyLT5maW5kKCc3emEnKSkgewokYmluN3ppcCA9ICc3emEnOwp9CgokaW8tPndyaXRlKAonemlwOiAnIC4gKGV4dGVuc2lvbl9sb2FkZWQoJ3ppcCcpID8gJzxjb21tZW50PmV4dGVuc2lvbiBwcmVzZW50PC9jb21tZW50PicgOiAnPGNvbW1lbnQ+ZXh0ZW5zaW9uIG5vdCBsb2FkZWQ8L2NvbW1lbnQ+JykKLiAnLCAnIC4gKCRoYXNTeXN0ZW1VbnppcCA/ICc8Y29tbWVudD51bnppcCBwcmVzZW50PC9jb21tZW50PicgOiAnPGNvbW1lbnQ+dW56aXAgbm90IGF2YWlsYWJsZTwvY29tbWVudD4nKQouICcsICcgLiAoJGhhc1N5c3RlbTd6aXAgPyAnPGNvbW1lbnQ+Ny1aaXAgcHJlc2VudCAoJy4kYmluN3ppcC4nKTwvY29tbWVudD4nIDogJzxjb21tZW50PjctWmlwIG5vdCBhdmFpbGFibGU8L2NvbW1lbnQ+JykKLiAoKCRoYXNTeXN0ZW03emlwIHx8ICRoYXNTeXN0ZW1VbnppcCkgJiYgIWZ1bmN0aW9uX2V4aXN0cygncHJvY19vcGVuJykgPyAnLCA8d2FybmluZz5wcm9jX29wZW4gaXMgZGlzYWJsZWQgb3Igbm90IHByZXNlbnQsIHVuemlwLzcteiB3aWxsIG5vdCBiZSB1c2FibGU8L3dhcm5pbmc+JyA6ICcnKQopOwoKaWYgKCRjb21wb3NlcikgewokaW8tPndyaXRlKCdBY3RpdmUgcGx1Z2luczogJy5pbXBsb2RlKCcsICcsICRjb21wb3Nlci0+Z2V0UGx1Z2luTWFuYWdlcigpLT5nZXRSZWdpc3RlcmVkUGx1Z2lucygpKSk7CgokaW8tPndyaXRlKCdDaGVja2luZyBjb21wb3Nlci5qc29uOiAnLCBmYWxzZSk7CiR0aGlzLT5vdXRwdXRSZXN1bHQoJHRoaXMtPmNoZWNrQ29tcG9zZXJTY2hlbWEoKSk7CgppZiAoJGNvbXBvc2VyLT5nZXRMb2NrZXIoKS0+aXNMb2NrZWQoKSkgewokaW8tPndyaXRlKCdDaGVja2luZyBjb21wb3Nlci5sb2NrOiAnLCBmYWxzZSk7CiR0aGlzLT5vdXRwdXRSZXN1bHQoJHRoaXMtPmNoZWNrQ29tcG9zZXJMb2NrU2NoZW1hKCRjb21wb3Nlci0+Z2V0TG9ja2VyKCkpKTsKfQp9CgokaW8tPndyaXRlKCdDaGVja2luZyBwbGF0Zm9ybSBzZXR0aW5nczogJywgZmFsc2UpOwokdGhpcy0+b3V0cHV0UmVzdWx0KCR0aGlzLT5jaGVja1BsYXRmb3JtKCkpOwoKJGlvLT53cml0ZSgnQ2hlY2tpbmcgZ2l0IHNldHRpbmdzOiAnLCBmYWxzZSk7CiR0aGlzLT5vdXRwdXRSZXN1bHQoJHRoaXMtPmNoZWNrR2l0KCkpOwoKJGlvLT53cml0ZSgnQ2hlY2tpbmcgaHR0cCBjb25uZWN0aXZpdHkgdG8gcGFja2FnaXN0OiAnLCBmYWxzZSk7CiR0aGlzLT5vdXRwdXRSZXN1bHQoJHRoaXMtPmNoZWNrSHR0cCgnaHR0cCcsICRjb25maWcpKTsKCiRpby0+d3JpdGUoJ0NoZWNraW5nIGh0dHBzIGNvbm5lY3Rpdml0eSB0byBwYWNrYWdpc3Q6ICcsIGZhbHNlKTsKJHRoaXMtPm91dHB1dFJlc3VsdCgkdGhpcy0+Y2hlY2tIdHRwKCdodHRwcycsICRjb25maWcpKTsKCmZvcmVhY2ggKCRjb25maWctPmdldFJlcG9zaXRvcmllcygpIGFzICRyZXBvKSB7CmlmICgoJHJlcG9bJ3R5cGUnXSA/PyBudWxsKSA9PT0gJ2NvbXBvc2VyJyAmJiBpc3NldCgkcmVwb1sndXJsJ10pKSB7CiRjb21wb3NlclJlcG8gPSBuZXcgQ29tcG9zZXJSZXBvc2l0b3J5KCRyZXBvLCAkdGhpcy0+Z2V0SU8oKSwgJGNvbmZpZywgJHRoaXMtPmh0dHBEb3dubG9hZGVyKTsKJHJlZmxNZXRob2QgPSBuZXcgXFJlZmxlY3Rpb25NZXRob2QoJGNvbXBvc2VyUmVwbywgJ2dldFBhY2thZ2VzSnNvblVybCcpOwppZiAoUEhQX1ZFUlNJT05fSUQgPCA4MDEwMCkgewokcmVmbE1ldGhvZC0+c2V0QWNjZXNzaWJsZSh0cnVlKTsKfQokdXJsID0gJHJlZmxNZXRob2QtPmludm9rZSgkY29tcG9zZXJSZXBvKTsKaWYgKCFzdHJfc3RhcnRzX3dpdGgoJHVybCwgJ2h0dHAnKSkgewpjb250aW51ZTsKfQppZiAoc3RyX3N0YXJ0c193aXRoKCR1cmwsICdodHRwczovL3JlcG8ucGFja2FnaXN0Lm9yZycpKSB7CmNvbnRpbnVlOwp9CiRpby0+d3JpdGUoJ0NoZWNraW5nIGNvbm5lY3Rpdml0eSB0byAnIC4gJHJlcG9bJ3VybCddLic6ICcsIGZhbHNlKTsKJHRoaXMtPm91dHB1dFJlc3VsdCgkdGhpcy0+Y2hlY2tDb21wb3NlclJlcG8oJHVybCwgJGNvbmZpZykpOwp9Cn0KCiRwcm94eU1hbmFnZXIgPSBQcm94eU1hbmFnZXI6OmdldEluc3RhbmNlKCk7CiRwcm90b3MgPSAkY29uZmlnLT5nZXQoJ2Rpc2FibGUtdGxzJykgPT09IHRydWUgPyBbJ2h0dHAnXSA6IFsnaHR0cCcsICdodHRwcyddOwp0cnkgewpmb3JlYWNoICgkcHJvdG9zIGFzICRwcm90bykgewokcHJveHkgPSAkcHJveHlNYW5hZ2VyLT5nZXRQcm94eUZvclJlcXVlc3QoJHByb3RvLic6Ly9yZXBvLnBhY2thZ2lzdC5vcmcnKTsKaWYgKCRwcm94eS0+Z2V0U3RhdHVzKCkgIT09ICcnKSB7CiR0eXBlID0gJHByb3h5LT5pc1NlY3VyZSgpID8gJ0hUVFBTJyA6ICdIVFRQJzsKJGlvLT53cml0ZSgnQ2hlY2tpbmcgJy4kdHlwZS4nIHByb3h5IHdpdGggJy4kcHJvdG8uJzogJywgZmFsc2UpOwokdGhpcy0+b3V0cHV0UmVzdWx0KCR0aGlzLT5jaGVja0h0dHBQcm94eSgkcHJveHksICRwcm90bykpOwp9Cn0KfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CiRpby0+d3JpdGUoJ0NoZWNraW5nIEhUVFAgcHJveHk6ICcsIGZhbHNlKTsKJHN0YXR1cyA9ICR0aGlzLT5jaGVja0Nvbm5lY3Rpdml0eUFuZENvbXBvc2VyTmV0d29ya0h0dHBFbmFibGVtZW50KCk7CiR0aGlzLT5vdXRwdXRSZXN1bHQoaXNfc3RyaW5nKCRzdGF0dXMpID8gJHN0YXR1cyA6ICRlKTsKfQoKaWYgKGNvdW50KCRvYXV0aCA9ICRjb25maWctPmdldCgnZ2l0aHViLW9hdXRoJykpID4gMCkgewpmb3JlYWNoICgkb2F1dGggYXMgJGRvbWFpbiA9PiAkdG9rZW4pIHsKJGlvLT53cml0ZSgnQ2hlY2tpbmcgJy4kZG9tYWluLicgb2F1dGggYWNjZXNzOiAnLCBmYWxzZSk7CiR0aGlzLT5vdXRwdXRSZXN1bHQoJHRoaXMtPmNoZWNrR2l0aHViT2F1dGgoJGRvbWFpbiwgJHRva2VuKSk7Cn0KfSBlbHNlIHsKJGlvLT53cml0ZSgnQ2hlY2tpbmcgZ2l0aHViLmNvbSByYXRlIGxpbWl0OiAnLCBmYWxzZSk7CnRyeSB7CiRyYXRlID0gJHRoaXMtPmdldEdpdGh1YlJhdGVMaW1pdCgnZ2l0aHViLmNvbScpOwppZiAoIWlzX2FycmF5KCRyYXRlKSkgewokdGhpcy0+b3V0cHV0UmVzdWx0KCRyYXRlKTsKfSBlbHNlaWYgKDEwID4gJHJhdGVbJ3JlbWFpbmluZyddKSB7CiRpby0+d3JpdGUoJzx3YXJuaW5nPldBUk5JTkc8L3dhcm5pbmc+Jyk7CiRpby0+d3JpdGUoc3ByaW50ZigKJzxjb21tZW50PkdpdEh1YiBoYXMgYSByYXRlIGxpbWl0IG9uIHRoZWlyIEFQSS4gJwouICdZb3UgY3VycmVudGx5IGhhdmUgPG9wdGlvbnM9Ym9sZD4ldTwvb3B0aW9ucz1ib2xkPiAnCi4gJ291dCBvZiA8b3B0aW9ucz1ib2xkPiV1PC9vcHRpb25zPWJvbGQ+IHJlcXVlc3RzIGxlZnQuJyAuIFBIUF9FT0wKLiAnU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvI3JhdGUtbGltaXRpbmcgYW5kIGFsc28nIC4gUEhQX0VPTAouICcgICAgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jL2FydGljbGVzL3Ryb3VibGVzaG9vdGluZy5tZCNhcGktcmF0ZS1saW1pdC1hbmQtb2F1dGgtdG9rZW5zPC9jb21tZW50PicsCiRyYXRlWydyZW1haW5pbmcnXSwKJHJhdGVbJ2xpbWl0J10KKSk7Cn0gZWxzZSB7CiR0aGlzLT5vdXRwdXRSZXN1bHQodHJ1ZSk7Cn0KfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewppZiAoJGUgaW5zdGFuY2VvZiBUcmFuc3BvcnRFeGNlcHRpb24gJiYgJGUtPmdldENvZGUoKSA9PT0gNDAxKSB7CiR0aGlzLT5vdXRwdXRSZXN1bHQoJzxjb21tZW50PlRoZSBvYXV0aCB0b2tlbiBmb3IgZ2l0aHViLmNvbSBzZWVtcyBpbnZhbGlkLCBydW4gImNvbXBvc2VyIGNvbmZpZyAtLWdsb2JhbCAtLXVuc2V0IGdpdGh1Yi1vYXV0aC5naXRodWIuY29tIiB0byByZW1vdmUgaXQ8L2NvbW1lbnQ+Jyk7Cn0gZWxzZSB7CiR0aGlzLT5vdXRwdXRSZXN1bHQoJGUpOwp9Cn0KfQoKJGlvLT53cml0ZSgnQ2hlY2tpbmcgZGlzayBmcmVlIHNwYWNlOiAnLCBmYWxzZSk7CiR0aGlzLT5vdXRwdXRSZXN1bHQoJHRoaXMtPmNoZWNrRGlza1NwYWNlKCRjb25maWcpKTsKCnJldHVybiAkdGhpcy0+ZXhpdENvZGU7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY2hlY2tDb21wb3NlclNjaGVtYSgpCnsKJHZhbGlkYXRvciA9IG5ldyBDb25maWdWYWxpZGF0b3IoJHRoaXMtPmdldElPKCkpOwpbJGVycm9ycywgLCAkd2FybmluZ3NdID0gJHZhbGlkYXRvci0+dmFsaWRhdGUoRmFjdG9yeTo6Z2V0Q29tcG9zZXJGaWxlKCkpOwoKaWYgKCRlcnJvcnMgfHwgJHdhcm5pbmdzKSB7CiRtZXNzYWdlcyA9IFsKJ2Vycm9yJyA9PiAkZXJyb3JzLAond2FybmluZycgPT4gJHdhcm5pbmdzLApdOwoKJG91dHB1dCA9ICcnOwpmb3JlYWNoICgkbWVzc2FnZXMgYXMgJHN0eWxlID0+ICRtc2dzKSB7CmZvcmVhY2ggKCRtc2dzIGFzICRtc2cpIHsKJG91dHB1dCAuPSAnPCcgLiAkc3R5bGUgLiAnPicgLiAkbXNnIC4gJzwvJyAuICRzdHlsZSAuICc+JyAuIFBIUF9FT0w7Cn0KfQoKcmV0dXJuIHJ0cmltKCRvdXRwdXQpOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja0NvbXBvc2VyTG9ja1NjaGVtYShMb2NrZXIgJGxvY2tlcikKewokanNvbiA9ICRsb2NrZXItPmdldEpzb25GaWxlKCk7Cgp0cnkgewokanNvbi0+dmFsaWRhdGVTY2hlbWEoSnNvbkZpbGU6OkxPQ0tfU0NIRU1BKTsKfSBjYXRjaCAoSnNvblZhbGlkYXRpb25FeGNlcHRpb24gJGUpIHsKJG91dHB1dCA9ICcnOwpmb3JlYWNoICgkZS0+Z2V0RXJyb3JzKCkgYXMgJGVycm9yKSB7CiRvdXRwdXQgLj0gJzxlcnJvcj4nLiRlcnJvci4nPC9lcnJvcj4nLlBIUF9FT0w7Cn0KCnJldHVybiB0cmltKCRvdXRwdXQpOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja0dpdCgpOiBzdHJpbmcKewppZiAoIWZ1bmN0aW9uX2V4aXN0cygncHJvY19vcGVuJykpIHsKcmV0dXJuICc8Y29tbWVudD5wcm9jX29wZW4gaXMgbm90IGF2YWlsYWJsZSwgZ2l0IGNhbm5vdCBiZSB1c2VkPC9jb21tZW50Pic7Cn0KCiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ2NvbmZpZycsICdjb2xvci51aSddLCAkb3V0cHV0KTsKaWYgKHN0cnRvbG93ZXIodHJpbSgkb3V0cHV0KSkgPT09ICdhbHdheXMnKSB7CnJldHVybiAnPGNvbW1lbnQ+WW91ciBnaXQgY29sb3IudWkgc2V0dGluZyBpcyBzZXQgdG8gYWx3YXlzLCB0aGlzIGlzIGtub3duIHRvIGNyZWF0ZSBpc3N1ZXMuIFVzZSAiZ2l0IGNvbmZpZyAtLWdsb2JhbCBjb2xvci51aSB0cnVlIiB0byBzZXQgaXQgY29ycmVjdGx5LjwvY29tbWVudD4nOwp9CgokZ2l0VmVyc2lvbiA9IEdpdDo6Z2V0VmVyc2lvbigkdGhpcy0+cHJvY2Vzcyk7CmlmIChudWxsID09PSAkZ2l0VmVyc2lvbikgewpyZXR1cm4gJzxjb21tZW50Pk5vIGdpdCBwcm9jZXNzIGZvdW5kPC8+JzsKfQoKaWYgKHZlcnNpb25fY29tcGFyZSgnMi4yNC4wJywgJGdpdFZlcnNpb24sICc+JykpIHsKcmV0dXJuICc8d2FybmluZz5Zb3VyIGdpdCB2ZXJzaW9uICgnLiRnaXRWZXJzaW9uLicpIGlzIHRvbyBvbGQgYW5kIHBvc3NpYmx5IHdpbGwgY2F1c2UgaXNzdWVzLiBQbGVhc2UgdXBncmFkZSB0byBnaXQgMi4yNCBvciBhYm92ZTwvPic7Cn0KCnJldHVybiAnPGluZm8+T0s8Lz4gPGNvbW1lbnQ+Z2l0IHZlcnNpb24gJy4kZ2l0VmVyc2lvbi4nPC8+JzsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja0h0dHAoc3RyaW5nICRwcm90bywgQ29uZmlnICRjb25maWcpCnsKJHJlc3VsdCA9ICR0aGlzLT5jaGVja0Nvbm5lY3Rpdml0eUFuZENvbXBvc2VyTmV0d29ya0h0dHBFbmFibGVtZW50KCk7CmlmICgkcmVzdWx0ICE9PSB0cnVlKSB7CnJldHVybiAkcmVzdWx0Owp9CgokcmVzdWx0ID0gW107CmlmICgkcHJvdG8gPT09ICdodHRwcycgJiYgJGNvbmZpZy0+Z2V0KCdkaXNhYmxlLXRscycpID09PSB0cnVlKSB7CiR0bHNXYXJuaW5nID0gJzx3YXJuaW5nPkNvbXBvc2VyIGlzIGNvbmZpZ3VyZWQgdG8gZGlzYWJsZSBTU0wvVExTIHByb3RlY3Rpb24uIFRoaXMgd2lsbCBsZWF2ZSByZW1vdGUgSFRUUFMgcmVxdWVzdHMgdnVsbmVyYWJsZSB0byBNYW4tSW4tVGhlLU1pZGRsZSBhdHRhY2tzLjwvd2FybmluZz4nOwp9Cgp0cnkgewokdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkcHJvdG8gLiAnOi8vcmVwby5wYWNrYWdpc3Qub3JnL3BhY2thZ2VzLmpzb24nKTsKfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CiRoaW50cyA9IEh0dHBEb3dubG9hZGVyOjpnZXRFeGNlcHRpb25IaW50cygkZSk7CmlmIChudWxsICE9PSAkaGludHMgJiYgY291bnQoJGhpbnRzKSA+IDApIHsKZm9yZWFjaCAoJGhpbnRzIGFzICRoaW50KSB7CiRyZXN1bHRbXSA9ICRoaW50Owp9Cn0KCiRyZXN1bHRbXSA9ICc8ZXJyb3I+WycgLiBnZXRfY2xhc3MoJGUpIC4gJ10gJyAuICRlLT5nZXRNZXNzYWdlKCkgLiAnPC9lcnJvcj4nOwp9CgppZiAoaXNzZXQoJHRsc1dhcm5pbmcpKSB7CiRyZXN1bHRbXSA9ICR0bHNXYXJuaW5nOwp9CgppZiAoY291bnQoJHJlc3VsdCkgPiAwKSB7CnJldHVybiAkcmVzdWx0Owp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja0NvbXBvc2VyUmVwbyhzdHJpbmcgJHVybCwgQ29uZmlnICRjb25maWcpCnsKJHJlc3VsdCA9ICR0aGlzLT5jaGVja0Nvbm5lY3Rpdml0eUFuZENvbXBvc2VyTmV0d29ya0h0dHBFbmFibGVtZW50KCk7CmlmICgkcmVzdWx0ICE9PSB0cnVlKSB7CnJldHVybiAkcmVzdWx0Owp9CgokcmVzdWx0ID0gW107CmlmIChzdHJfc3RhcnRzX3dpdGgoJHVybCwgJ2h0dHBzOi8vJykgJiYgJGNvbmZpZy0+Z2V0KCdkaXNhYmxlLXRscycpID09PSB0cnVlKSB7CiR0bHNXYXJuaW5nID0gJzx3YXJuaW5nPkNvbXBvc2VyIGlzIGNvbmZpZ3VyZWQgdG8gZGlzYWJsZSBTU0wvVExTIHByb3RlY3Rpb24uIFRoaXMgd2lsbCBsZWF2ZSByZW1vdGUgSFRUUFMgcmVxdWVzdHMgdnVsbmVyYWJsZSB0byBNYW4tSW4tVGhlLU1pZGRsZSBhdHRhY2tzLjwvd2FybmluZz4nOwp9Cgp0cnkgewokdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkdXJsKTsKfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CiRoaW50cyA9IEh0dHBEb3dubG9hZGVyOjpnZXRFeGNlcHRpb25IaW50cygkZSk7CmlmIChudWxsICE9PSAkaGludHMgJiYgY291bnQoJGhpbnRzKSA+IDApIHsKZm9yZWFjaCAoJGhpbnRzIGFzICRoaW50KSB7CiRyZXN1bHRbXSA9ICRoaW50Owp9Cn0KCiRyZXN1bHRbXSA9ICc8ZXJyb3I+WycgLiBnZXRfY2xhc3MoJGUpIC4gJ10gJyAuICRlLT5nZXRNZXNzYWdlKCkgLiAnPC9lcnJvcj4nOwp9CgppZiAoaXNzZXQoJHRsc1dhcm5pbmcpKSB7CiRyZXN1bHRbXSA9ICR0bHNXYXJuaW5nOwp9CgppZiAoY291bnQoJHJlc3VsdCkgPiAwKSB7CnJldHVybiAkcmVzdWx0Owp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja0h0dHBQcm94eShSZXF1ZXN0UHJveHkgJHByb3h5LCBzdHJpbmcgJHByb3RvY29sKQp7CiRyZXN1bHQgPSAkdGhpcy0+Y2hlY2tDb25uZWN0aXZpdHlBbmRDb21wb3Nlck5ldHdvcmtIdHRwRW5hYmxlbWVudCgpOwppZiAoJHJlc3VsdCAhPT0gdHJ1ZSkgewpyZXR1cm4gJHJlc3VsdDsKfQoKdHJ5IHsKJHByb3h5U3RhdHVzID0gJHByb3h5LT5nZXRTdGF0dXMoKTsKCmlmICgkcHJveHktPmlzRXhjbHVkZWRCeU5vUHJveHkoKSkgewpyZXR1cm4gJzxpbmZvPlNLSVA8Lz4gPGNvbW1lbnQ+QmVjYXVzZSByZXBvLnBhY2thZ2lzdC5vcmcgaXMgJy4kcHJveHlTdGF0dXMuJzwvPic7Cn0KCiRqc29uID0gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoJHByb3RvY29sLic6Ly9yZXBvLnBhY2thZ2lzdC5vcmcvcGFja2FnZXMuanNvbicpLT5kZWNvZGVKc29uKCk7CmlmIChpc3NldCgkanNvblsncHJvdmlkZXItaW5jbHVkZXMnXSkpIHsKJGhhc2ggPSByZXNldCgkanNvblsncHJvdmlkZXItaW5jbHVkZXMnXSk7CiRoYXNoID0gJGhhc2hbJ3NoYTI1NiddOwokcGF0aCA9IHN0cl9yZXBsYWNlKCclaGFzaCUnLCAkaGFzaCwga2V5KCRqc29uWydwcm92aWRlci1pbmNsdWRlcyddKSk7CiRwcm92aWRlciA9ICR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KCRwcm90b2NvbC4nOi8vcmVwby5wYWNrYWdpc3Qub3JnLycuJHBhdGgpLT5nZXRCb2R5KCk7CgppZiAoaGFzaCgnc2hhMjU2JywgJHByb3ZpZGVyKSAhPT0gJGhhc2gpIHsKcmV0dXJuICc8d2FybmluZz5JdCBzZWVtcyB0aGF0IHlvdXIgcHJveHkgKCcuJHByb3h5U3RhdHVzLicpIGlzIG1vZGlmeWluZyAnLiRwcm90b2NvbC4nIHRyYWZmaWMgb24gdGhlIGZseTwvPic7Cn0KfQoKcmV0dXJuICc8aW5mbz5PSzwvPiA8Y29tbWVudD4nLiRwcm94eVN0YXR1cy4nPC8+JzsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewpyZXR1cm4gJGU7Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja0dpdGh1Yk9hdXRoKHN0cmluZyAkZG9tYWluLCBzdHJpbmcgJHRva2VuKQp7CiRyZXN1bHQgPSAkdGhpcy0+Y2hlY2tDb25uZWN0aXZpdHlBbmRDb21wb3Nlck5ldHdvcmtIdHRwRW5hYmxlbWVudCgpOwppZiAoJHJlc3VsdCAhPT0gdHJ1ZSkgewpyZXR1cm4gJHJlc3VsdDsKfQoKJHRoaXMtPmdldElPKCktPnNldEF1dGhlbnRpY2F0aW9uKCRkb21haW4sICR0b2tlbiwgJ3gtb2F1dGgtYmFzaWMnKTsKdHJ5IHsKJHVybCA9ICRkb21haW4gPT09ICdnaXRodWIuY29tJyA/ICdodHRwczovL2FwaS4nLiRkb21haW4uJy8nIDogJ2h0dHBzOi8vJy4kZG9tYWluLicvYXBpL3YzLyc7CgokcmVzcG9uc2UgPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkdXJsLCBbCidyZXRyeS1hdXRoLWZhaWx1cmUnID0+IGZhbHNlLApdKTsKCiRleHBpcmF0aW9uID0gJHJlc3BvbnNlLT5nZXRIZWFkZXIoJ2dpdGh1Yi1hdXRoZW50aWNhdGlvbi10b2tlbi1leHBpcmF0aW9uJyk7CgppZiAoJGV4cGlyYXRpb24gPT09IG51bGwpIHsKcmV0dXJuICc8aW5mbz5PSzwvPiA8Y29tbWVudD5kb2VzIG5vdCBleHBpcmU8Lz4nOwp9CgpyZXR1cm4gJzxpbmZvPk9LPC8+IDxjb21tZW50PmV4cGlyZXMgb24gJy4gJGV4cGlyYXRpb24gLic8Lz4nOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmlmICgkZSBpbnN0YW5jZW9mIFRyYW5zcG9ydEV4Y2VwdGlvbiAmJiAkZS0+Z2V0Q29kZSgpID09PSA0MDEpIHsKcmV0dXJuICc8Y29tbWVudD5UaGUgb2F1dGggdG9rZW4gZm9yICcuJGRvbWFpbi4nIHNlZW1zIGludmFsaWQsIHJ1biAiY29tcG9zZXIgY29uZmlnIC0tZ2xvYmFsIC0tdW5zZXQgZ2l0aHViLW9hdXRoLicuJGRvbWFpbi4nIiB0byByZW1vdmUgaXQ8L2NvbW1lbnQ+JzsKfQoKcmV0dXJuICRlOwp9Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldEdpdGh1YlJhdGVMaW1pdChzdHJpbmcgJGRvbWFpbiwgP3N0cmluZyAkdG9rZW4gPSBudWxsKQp7CiRyZXN1bHQgPSAkdGhpcy0+Y2hlY2tDb25uZWN0aXZpdHlBbmRDb21wb3Nlck5ldHdvcmtIdHRwRW5hYmxlbWVudCgpOwppZiAoJHJlc3VsdCAhPT0gdHJ1ZSkgewpyZXR1cm4gJHJlc3VsdDsKfQoKaWYgKCR0b2tlbikgewokdGhpcy0+Z2V0SU8oKS0+c2V0QXV0aGVudGljYXRpb24oJGRvbWFpbiwgJHRva2VuLCAneC1vYXV0aC1iYXNpYycpOwp9CgokdXJsID0gJGRvbWFpbiA9PT0gJ2dpdGh1Yi5jb20nID8gJ2h0dHBzOi8vYXBpLicuJGRvbWFpbi4nL3JhdGVfbGltaXQnIDogJ2h0dHBzOi8vJy4kZG9tYWluLicvYXBpL3JhdGVfbGltaXQnOwokZGF0YSA9ICR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KCR1cmwsIFsncmV0cnktYXV0aC1mYWlsdXJlJyA9PiBmYWxzZV0pLT5kZWNvZGVKc29uKCk7CgpyZXR1cm4gJGRhdGFbJ3Jlc291cmNlcyddWydjb3JlJ107Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY2hlY2tEaXNrU3BhY2UoQ29uZmlnICRjb25maWcpCnsKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2Rpc2tfZnJlZV9zcGFjZScpKSB7CnJldHVybiB0cnVlOwp9CgokbWluU3BhY2VGcmVlID0gMTAyNCAqIDEwMjQ7CmlmICgoKCRkZiA9IEBkaXNrX2ZyZWVfc3BhY2UoJGRpciA9ICRjb25maWctPmdldCgnaG9tZScpKSkgIT09IGZhbHNlICYmICRkZiA8ICRtaW5TcGFjZUZyZWUpCnx8ICgoJGRmID0gQGRpc2tfZnJlZV9zcGFjZSgkZGlyID0gJGNvbmZpZy0+Z2V0KCd2ZW5kb3ItZGlyJykpKSAhPT0gZmFsc2UgJiYgJGRmIDwgJG1pblNwYWNlRnJlZSkKKSB7CnJldHVybiAnPGVycm9yPlRoZSBkaXNrIGhvc3RpbmcgJy4kZGlyLicgaXMgZnVsbDwvZXJyb3I+JzsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY2hlY2tQdWJLZXlzKENvbmZpZyAkY29uZmlnKQp7CiRob21lID0gJGNvbmZpZy0+Z2V0KCdob21lJyk7CiRlcnJvcnMgPSBbXTsKJGlvID0gJHRoaXMtPmdldElPKCk7CgppZiAoZmlsZV9leGlzdHMoJGhvbWUuJy9rZXlzLnRhZ3MucHViJykgJiYgZmlsZV9leGlzdHMoJGhvbWUuJy9rZXlzLmRldi5wdWInKSkgewokaW8tPndyaXRlKCcnKTsKfQoKaWYgKGZpbGVfZXhpc3RzKCRob21lLicva2V5cy50YWdzLnB1YicpKSB7CiRpby0+d3JpdGUoJ1RhZ3MgUHVibGljIEtleSBGaW5nZXJwcmludDogJyAuIEtleXM6OmZpbmdlcnByaW50KCRob21lLicva2V5cy50YWdzLnB1YicpKTsKfSBlbHNlIHsKJGVycm9yc1tdID0gJzxlcnJvcj5NaXNzaW5nIHB1YmtleSBmb3IgdGFncyB2ZXJpZmljYXRpb248L2Vycm9yPic7Cn0KCmlmIChmaWxlX2V4aXN0cygkaG9tZS4nL2tleXMuZGV2LnB1YicpKSB7CiRpby0+d3JpdGUoJ0RldiBQdWJsaWMgS2V5IEZpbmdlcnByaW50OiAnIC4gS2V5czo6ZmluZ2VycHJpbnQoJGhvbWUuJy9rZXlzLmRldi5wdWInKSk7Cn0gZWxzZSB7CiRlcnJvcnNbXSA9ICc8ZXJyb3I+TWlzc2luZyBwdWJrZXkgZm9yIGRldiB2ZXJpZmljYXRpb248L2Vycm9yPic7Cn0KCmlmICgkZXJyb3JzKSB7CiRlcnJvcnNbXSA9ICc8ZXJyb3I+UnVuIGNvbXBvc2VyIHNlbGYtdXBkYXRlIC0tdXBkYXRlLWtleXMgdG8gc2V0IHRoZW0gdXA8L2Vycm9yPic7Cn0KCnJldHVybiAkZXJyb3JzID86IHRydWU7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY2hlY2tWZXJzaW9uKENvbmZpZyAkY29uZmlnKQp7CiRyZXN1bHQgPSAkdGhpcy0+Y2hlY2tDb25uZWN0aXZpdHlBbmRDb21wb3Nlck5ldHdvcmtIdHRwRW5hYmxlbWVudCgpOwppZiAoJHJlc3VsdCAhPT0gdHJ1ZSkgewpyZXR1cm4gJHJlc3VsdDsKfQoKJHZlcnNpb25zVXRpbCA9IG5ldyBWZXJzaW9ucygkY29uZmlnLCAkdGhpcy0+aHR0cERvd25sb2FkZXIpOwp0cnkgewokbGF0ZXN0ID0gJHZlcnNpb25zVXRpbC0+Z2V0TGF0ZXN0KCk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKcmV0dXJuICRlOwp9CgppZiAoQ29tcG9zZXI6OlZFUlNJT04gIT09ICRsYXRlc3RbJ3ZlcnNpb24nXSAmJiBDb21wb3Nlcjo6VkVSU0lPTiAhPT0gJ0BwYWNrYWdlX3ZlcnNpb25AJykgewpyZXR1cm4gJzxjb21tZW50PllvdSBhcmUgbm90IHJ1bm5pbmcgdGhlIGxhdGVzdCAnLiR2ZXJzaW9uc1V0aWwtPmdldENoYW5uZWwoKS4nIHZlcnNpb24sIHJ1biBgY29tcG9zZXIgc2VsZi11cGRhdGVgIHRvIHVwZGF0ZSAoJy5Db21wb3Nlcjo6VkVSU0lPTi4nID0+ICcuJGxhdGVzdFsndmVyc2lvbiddLicpPC9jb21tZW50Pic7Cn0KCnJldHVybiB0cnVlOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNoZWNrQ29tcG9zZXJBdWRpdChDb25maWcgJGNvbmZpZykKewokcmVzdWx0ID0gJHRoaXMtPmNoZWNrQ29ubmVjdGl2aXR5QW5kQ29tcG9zZXJOZXR3b3JrSHR0cEVuYWJsZW1lbnQoKTsKaWYgKCRyZXN1bHQgIT09IHRydWUpIHsKcmV0dXJuICRyZXN1bHQ7Cn0KCiRhdWRpdG9yID0gbmV3IEF1ZGl0b3IoKTsKJHJlcG9TZXQgPSBuZXcgUmVwb3NpdG9yeVNldCgpOwokaW5zdGFsbGVkSnNvbiA9IG5ldyBKc29uRmlsZShfX0RJUl9fIC4gJy8uLi8uLi8uLi92ZW5kb3IvY29tcG9zZXIvaW5zdGFsbGVkLmpzb24nKTsKaWYgKCEkaW5zdGFsbGVkSnNvbi0+ZXhpc3RzKCkpIHsKcmV0dXJuICc8d2FybmluZz5Db3VsZCBub3QgZmluZCBDb21wb3NlclwncyBpbnN0YWxsZWQuanNvbiwgdGhpcyBtdXN0IGJlIGEgbm9uLXN0YW5kYXJkIENvbXBvc2VyIGluc3RhbGxhdGlvbi48Lz4nOwp9CgokbG9jYWxSZXBvID0gbmV3IEZpbGVzeXN0ZW1SZXBvc2l0b3J5KCRpbnN0YWxsZWRKc29uKTsKJHZlcnNpb24gPSBDb21wb3Nlcjo6Z2V0VmVyc2lvbigpOwokcGFja2FnZXMgPSAkbG9jYWxSZXBvLT5nZXRDYW5vbmljYWxQYWNrYWdlcygpOwppZiAoJHZlcnNpb24gIT09ICdAcGFja2FnZV92ZXJzaW9uQCcpIHsKJHZlcnNpb25QYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwokbm9ybWFsaXplZFZlcnNpb24gPSAkdmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCR2ZXJzaW9uKTsKJHJvb3RQa2cgPSBuZXcgUm9vdFBhY2thZ2UoJ2NvbXBvc2VyL2NvbXBvc2VyJywgJG5vcm1hbGl6ZWRWZXJzaW9uLCAkdmVyc2lvbik7CiRwYWNrYWdlc1tdID0gJHJvb3RQa2c7Cn0KJHJlcG9TZXQtPmFkZFJlcG9zaXRvcnkobmV3IENvbXBvc2VyUmVwb3NpdG9yeShbJ3R5cGUnID0+ICdjb21wb3NlcicsICd1cmwnID0+ICdodHRwczovL3BhY2thZ2lzdC5vcmcnXSwgbmV3IE51bGxJTygpLCAkY29uZmlnLCAkdGhpcy0+aHR0cERvd25sb2FkZXIpKTsKCnRyeSB7CiRpbyA9IG5ldyBCdWZmZXJJTygpOwokcmVzdWx0ID0gJGF1ZGl0b3ItPmF1ZGl0KCRpbywgJHJlcG9TZXQsICRwYWNrYWdlcywgQXVkaXRvcjo6Rk9STUFUX1RBQkxFLCB0cnVlLCBbXSwgQXVkaXRvcjo6QUJBTkRPTkVEX0lHTk9SRSk7Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGUpIHsKcmV0dXJuICc8aGlnaGxpZ2h0PkZhaWxlZCBwZXJmb3JtaW5nIGF1ZGl0OiAnLiRlLT5nZXRNZXNzYWdlKCkuJzwvPic7Cn0KCmlmICgkcmVzdWx0ID4gMCkgewpyZXR1cm4gJzxoaWdobGlnaHQ+QXVkaXQgZm91bmQgc29tZSBpc3N1ZXM6PC8+JyAuIFBIUF9FT0wgLiAkaW8tPmdldE91dHB1dCgpOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRDdXJsVmVyc2lvbigpOiBzdHJpbmcKewppZiAoZXh0ZW5zaW9uX2xvYWRlZCgnY3VybCcpKSB7CmlmICghSHR0cERvd25sb2FkZXI6OmlzQ3VybEVuYWJsZWQoKSkgewpyZXR1cm4gJzxlcnJvcj5kaXNhYmxlZCB2aWEgZGlzYWJsZV9mdW5jdGlvbnMsIHVzaW5nIHBocCBzdHJlYW1zIGZhbGxiYWNrLCB3aGljaCByZWR1Y2VzIHBlcmZvcm1hbmNlPC9lcnJvcj4nOwp9CgokdmVyc2lvbiA9IGN1cmxfdmVyc2lvbigpOwokbGlielZlcnNpb24gPSBpc3NldCgkdmVyc2lvblsnbGliel92ZXJzaW9uJ10pICYmICR2ZXJzaW9uWydsaWJ6X3ZlcnNpb24nXSAhPT0gJycgPyAkdmVyc2lvblsnbGliel92ZXJzaW9uJ10gOiAnbWlzc2luZyc7CiRicm90bGlWZXJzaW9uID0gaXNzZXQoJHZlcnNpb25bJ2Jyb3RsaV92ZXJzaW9uJ10pICYmICR2ZXJzaW9uWydicm90bGlfdmVyc2lvbiddICE9PSAnJyA/ICR2ZXJzaW9uWydicm90bGlfdmVyc2lvbiddIDogJ21pc3NpbmcnOwokc3NsVmVyc2lvbiA9IGlzc2V0KCR2ZXJzaW9uWydzc2xfdmVyc2lvbiddKSAmJiAkdmVyc2lvblsnc3NsX3ZlcnNpb24nXSAhPT0gJycgPyAkdmVyc2lvblsnc3NsX3ZlcnNpb24nXSA6ICdtaXNzaW5nJzsKJGhhc1pzdGQgPSBpc3NldCgkdmVyc2lvblsnZmVhdHVyZXMnXSkgJiYgZGVmaW5lZCgnQ1VSTF9WRVJTSU9OX1pTVEQnKSAmJiAwICE9PSAoJHZlcnNpb25bJ2ZlYXR1cmVzJ10gJiBDVVJMX1ZFUlNJT05fWlNURCk7CiRodHRwVmVyc2lvbnMgPSAnMS4wLCAxLjEnOwppZiAoaXNzZXQoJHZlcnNpb25bJ2ZlYXR1cmVzJ10pICYmIFxkZWZpbmVkKCdDVVJMX1ZFUlNJT05fSFRUUDInKSAmJiBcZGVmaW5lZCgnQ1VSTF9IVFRQX1ZFUlNJT05fMl8wJykgJiYgKENVUkxfVkVSU0lPTl9IVFRQMiAmICR2ZXJzaW9uWydmZWF0dXJlcyddKSAhPT0gMCkgewokaHR0cFZlcnNpb25zIC49ICcsIDInOwp9CmlmIChpc3NldCgkdmVyc2lvblsnZmVhdHVyZXMnXSkgJiYgXGRlZmluZWQoJ0NVUkxfVkVSU0lPTl9IVFRQMycpICYmICgkdmVyc2lvblsnZmVhdHVyZXMnXSAmIENVUkxfVkVSU0lPTl9IVFRQMykgIT09IDApIHsKJGh0dHBWZXJzaW9ucyAuPSAnLCAzJzsKfQoKcmV0dXJuICc8Y29tbWVudD4nLiR2ZXJzaW9uWyd2ZXJzaW9uJ10uJzwvY29tbWVudD4gJy4KJ2xpYnogPGNvbW1lbnQ+Jy4kbGlielZlcnNpb24uJzwvY29tbWVudD4gJy4KJ2Jyb3RsaSA8Y29tbWVudD4nLiRicm90bGlWZXJzaW9uLic8L2NvbW1lbnQ+ICcuCid6c3RkIDxjb21tZW50PicuKCRoYXNac3RkID8gJ3N1cHBvcnRlZCcgOiAnbWlzc2luZycpLic8L2NvbW1lbnQ+ICcuCidzc2wgPGNvbW1lbnQ+Jy4kc3NsVmVyc2lvbi4nPC9jb21tZW50PiAnLgonSFRUUCA8Y29tbWVudD4nLiRodHRwVmVyc2lvbnMuJzwvY29tbWVudD4nOwp9CgpyZXR1cm4gJzxlcnJvcj5taXNzaW5nLCB1c2luZyBwaHAgc3RyZWFtcyBmYWxsYmFjaywgd2hpY2ggcmVkdWNlcyBwZXJmb3JtYW5jZTwvZXJyb3I+JzsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBvdXRwdXRSZXN1bHQoJHJlc3VsdCk6IHZvaWQKewokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKaWYgKHRydWUgPT09ICRyZXN1bHQpIHsKJGlvLT53cml0ZSgnPGluZm8+T0s8L2luZm8+Jyk7CgpyZXR1cm47Cn0KCiRoYWRFcnJvciA9IGZhbHNlOwokaGFkV2FybmluZyA9IGZhbHNlOwppZiAoJHJlc3VsdCBpbnN0YW5jZW9mIFxFeGNlcHRpb24pIHsKJHJlc3VsdCA9ICc8ZXJyb3I+WycuZ2V0X2NsYXNzKCRyZXN1bHQpLiddICcuJHJlc3VsdC0+Z2V0TWVzc2FnZSgpLic8L2Vycm9yPic7Cn0KCmlmICghJHJlc3VsdCkgewoKJGhhZEVycm9yID0gdHJ1ZTsKfSBlbHNlIHsKaWYgKCFpc19hcnJheSgkcmVzdWx0KSkgewokcmVzdWx0ID0gWyRyZXN1bHRdOwp9CmZvcmVhY2ggKCRyZXN1bHQgYXMgJG1lc3NhZ2UpIHsKaWYgKGZhbHNlICE9PSBzdHJwb3MoJG1lc3NhZ2UsICc8ZXJyb3I+JykpIHsKJGhhZEVycm9yID0gdHJ1ZTsKfSBlbHNlaWYgKGZhbHNlICE9PSBzdHJwb3MoJG1lc3NhZ2UsICc8d2FybmluZz4nKSkgewokaGFkV2FybmluZyA9IHRydWU7Cn0KfQp9CgppZiAoJGhhZEVycm9yKSB7CiRpby0+d3JpdGUoJzxlcnJvcj5GQUlMPC9lcnJvcj4nKTsKJHRoaXMtPmV4aXRDb2RlID0gbWF4KCR0aGlzLT5leGl0Q29kZSwgMik7Cn0gZWxzZWlmICgkaGFkV2FybmluZykgewokaW8tPndyaXRlKCc8d2FybmluZz5XQVJOSU5HPC93YXJuaW5nPicpOwokdGhpcy0+ZXhpdENvZGUgPSBtYXgoJHRoaXMtPmV4aXRDb2RlLCAxKTsKfQoKaWYgKCRyZXN1bHQpIHsKZm9yZWFjaCAoJHJlc3VsdCBhcyAkbWVzc2FnZSkgewokaW8tPndyaXRlKHRyaW0oJG1lc3NhZ2UpKTsKfQp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY2hlY2tQbGF0Zm9ybSgpCnsKJG91dHB1dCA9ICcnOwokb3V0ID0gc3RhdGljIGZ1bmN0aW9uICgkbXNnLCAkc3R5bGUpIHVzZSAoJiRvdXRwdXQpOiB2b2lkIHsKJG91dHB1dCAuPSAnPCcuJHN0eWxlLic+Jy4kbXNnLic8LycuJHN0eWxlLic+Jy5QSFBfRU9MOwp9OwoKCiRlcnJvcnMgPSBbXTsKJHdhcm5pbmdzID0gW107CiRkaXNwbGF5SW5pTWVzc2FnZSA9IGZhbHNlOwoKJGluaU1lc3NhZ2UgPSBQSFBfRU9MLlBIUF9FT0wuSW5pSGVscGVyOjpnZXRNZXNzYWdlKCk7CiRpbmlNZXNzYWdlIC49IFBIUF9FT0wuJ0lmIHlvdSBjYW4gbm90IG1vZGlmeSB0aGUgaW5pIGZpbGUsIHlvdSBjYW4gYWxzbyBydW4gYHBocCAtZCBvcHRpb249dmFsdWVgIHRvIG1vZGlmeSBpbmkgdmFsdWVzIG9uIHRoZSBmbHkuIFlvdSBjYW4gdXNlIC1kIG11bHRpcGxlIHRpbWVzLic7CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnanNvbl9kZWNvZGUnKSkgewokZXJyb3JzWydqc29uJ10gPSB0cnVlOwp9CgppZiAoIWV4dGVuc2lvbl9sb2FkZWQoJ1BoYXInKSkgewokZXJyb3JzWydwaGFyJ10gPSB0cnVlOwp9CgppZiAoIWV4dGVuc2lvbl9sb2FkZWQoJ2ZpbHRlcicpKSB7CiRlcnJvcnNbJ2ZpbHRlciddID0gdHJ1ZTsKfQoKaWYgKCFleHRlbnNpb25fbG9hZGVkKCdoYXNoJykpIHsKJGVycm9yc1snaGFzaCddID0gdHJ1ZTsKfQoKaWYgKCFleHRlbnNpb25fbG9hZGVkKCdpY29udicpICYmICFleHRlbnNpb25fbG9hZGVkKCdtYnN0cmluZycpKSB7CiRlcnJvcnNbJ2ljb252X21ic3RyaW5nJ10gPSB0cnVlOwp9CgppZiAoIWZpbHRlcl92YXIoaW5pX2dldCgnYWxsb3dfdXJsX2ZvcGVuJyksIEZJTFRFUl9WQUxJREFURV9CT09MRUFOKSkgewokZXJyb3JzWydhbGxvd191cmxfZm9wZW4nXSA9IHRydWU7Cn0KCmlmIChleHRlbnNpb25fbG9hZGVkKCdpb25DdWJlIExvYWRlcicpICYmIGlvbmN1YmVfbG9hZGVyX2l2ZXJzaW9uKCkgPCA0MDAwOSkgewokZXJyb3JzWydpb25jdWJlJ10gPSBpb25jdWJlX2xvYWRlcl92ZXJzaW9uKCk7Cn0KCmlmIChcUEhQX1ZFUlNJT05fSUQgPCA3MDIwNSkgewokZXJyb3JzWydwaHAnXSA9IFBIUF9WRVJTSU9OOwp9CgppZiAoIWV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSkgewokZXJyb3JzWydvcGVuc3NsJ10gPSB0cnVlOwp9CgppZiAoZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpICYmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCAweDEwMDAxMDBmKSB7CiR3YXJuaW5nc1snb3BlbnNzbF92ZXJzaW9uJ10gPSB0cnVlOwp9CgppZiAoIWRlZmluZWQoJ0hIVk1fVkVSU0lPTicpICYmICFleHRlbnNpb25fbG9hZGVkKCdhcGN1JykgJiYgZmlsdGVyX3ZhcihpbmlfZ2V0KCdhcGMuZW5hYmxlX2NsaScpLCBGSUxURVJfVkFMSURBVEVfQk9PTEVBTikpIHsKJHdhcm5pbmdzWydhcGNfY2xpJ10gPSB0cnVlOwp9CgppZiAoIWV4dGVuc2lvbl9sb2FkZWQoJ3psaWInKSkgewokd2FybmluZ3NbJ3psaWInXSA9IHRydWU7Cn0KCm9iX3N0YXJ0KCk7CnBocGluZm8oSU5GT19HRU5FUkFMKTsKJHBocGluZm8gPSBvYl9nZXRfY2xlYW4oKTsKaWYgKGlzX3N0cmluZygkcGhwaW5mbykgJiYgUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne0NvbmZpZ3VyZSBDb21tYW5kKD86ICo8L3RkPjx0ZCBjbGFzcz0idiI+fCAqPT4gKikoLio/KSg/OjwvdGQ+fCQpfW0nLCAkcGhwaW5mbywgJG1hdGNoKSkgewokY29uZmlndXJlID0gJG1hdGNoWzFdOwoKaWYgKHN0cl9jb250YWlucygkY29uZmlndXJlLCAnLS1lbmFibGUtc2lnY2hpbGQnKSkgewokd2FybmluZ3NbJ3NpZ2NoaWxkJ10gPSB0cnVlOwp9CgppZiAoc3RyX2NvbnRhaW5zKCRjb25maWd1cmUsICctLXdpdGgtY3VybHdyYXBwZXJzJykpIHsKJHdhcm5pbmdzWydjdXJsd3JhcHBlcnMnXSA9IHRydWU7Cn0KfQoKaWYgKGZpbHRlcl92YXIoaW5pX2dldCgneGRlYnVnLnByb2ZpbGVyX2VuYWJsZWQnKSwgRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4pKSB7CiR3YXJuaW5nc1sneGRlYnVnX3Byb2ZpbGUnXSA9IHRydWU7Cn0gZWxzZWlmIChYZGVidWdIYW5kbGVyOjppc1hkZWJ1Z0FjdGl2ZSgpKSB7CiR3YXJuaW5nc1sneGRlYnVnX2xvYWRlZCddID0gdHJ1ZTsKfQoKaWYgKGRlZmluZWQoJ1BIUF9XSU5ET1dTX1ZFUlNJT05fQlVJTEQnKQomJiAodmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAnNy4yLjIzJywgJzwnKQp8fCAodmVyc2lvbl9jb21wYXJlKFBIUF9WRVJTSU9OLCAnNy4zLjAnLCAnPj0nKQomJiB2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc3LjMuMTAnLCAnPCcpKSkpIHsKJHdhcm5pbmdzWydvbmVkcml2ZSddID0gUEhQX1ZFUlNJT047Cn0KCmlmIChleHRlbnNpb25fbG9hZGVkKCd1b3B6JykKJiYgIShmaWx0ZXJfdmFyKGluaV9nZXQoJ3VvcHouZGlzYWJsZScpLCBGSUxURVJfVkFMSURBVEVfQk9PTEVBTikKfHwgZmlsdGVyX3ZhcihpbmlfZ2V0KCd1b3B6LmV4aXQnKSwgRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4pKSkgewokd2FybmluZ3NbJ3VvcHonXSA9IHRydWU7Cn0KCmlmICghZW1wdHkoJGVycm9ycykpIHsKZm9yZWFjaCAoJGVycm9ycyBhcyAkZXJyb3IgPT4gJGN1cnJlbnQpIHsKc3dpdGNoICgkZXJyb3IpIHsKY2FzZSAnanNvbic6CiR0ZXh0ID0gUEhQX0VPTC4iVGhlIGpzb24gZXh0ZW5zaW9uIGlzIG1pc3NpbmcuIi5QSFBfRU9MOwokdGV4dCAuPSAiSW5zdGFsbCBpdCBvciByZWNvbXBpbGUgcGhwIHdpdGhvdXQgLS1kaXNhYmxlLWpzb24iOwpicmVhazsKCmNhc2UgJ3BoYXInOgokdGV4dCA9IFBIUF9FT0wuIlRoZSBwaGFyIGV4dGVuc2lvbiBpcyBtaXNzaW5nLiIuUEhQX0VPTDsKJHRleHQgLj0gIkluc3RhbGwgaXQgb3IgcmVjb21waWxlIHBocCB3aXRob3V0IC0tZGlzYWJsZS1waGFyIjsKYnJlYWs7CgpjYXNlICdmaWx0ZXInOgokdGV4dCA9IFBIUF9FT0wuIlRoZSBmaWx0ZXIgZXh0ZW5zaW9uIGlzIG1pc3NpbmcuIi5QSFBfRU9MOwokdGV4dCAuPSAiSW5zdGFsbCBpdCBvciByZWNvbXBpbGUgcGhwIHdpdGhvdXQgLS1kaXNhYmxlLWZpbHRlciI7CmJyZWFrOwoKY2FzZSAnaGFzaCc6CiR0ZXh0ID0gUEhQX0VPTC4iVGhlIGhhc2ggZXh0ZW5zaW9uIGlzIG1pc3NpbmcuIi5QSFBfRU9MOwokdGV4dCAuPSAiSW5zdGFsbCBpdCBvciByZWNvbXBpbGUgcGhwIHdpdGhvdXQgLS1kaXNhYmxlLWhhc2giOwpicmVhazsKCmNhc2UgJ2ljb252X21ic3RyaW5nJzoKJHRleHQgPSBQSFBfRU9MLiJUaGUgaWNvbnYgT1IgbWJzdHJpbmcgZXh0ZW5zaW9uIGlzIHJlcXVpcmVkIGFuZCBib3RoIGFyZSBtaXNzaW5nLiIuUEhQX0VPTDsKJHRleHQgLj0gIkluc3RhbGwgZWl0aGVyIG9mIHRoZW0gb3IgcmVjb21waWxlIHBocCB3aXRob3V0IC0tZGlzYWJsZS1pY29udiI7CmJyZWFrOwoKY2FzZSAncGhwJzoKJHRleHQgPSBQSFBfRU9MLiJZb3VyIFBIUCAoeyRjdXJyZW50fSkgaXMgdG9vIG9sZCwgeW91IG11c3QgdXBncmFkZSB0byBQSFAgNy4yLjUgb3IgaGlnaGVyLiI7CmJyZWFrOwoKY2FzZSAnYWxsb3dfdXJsX2ZvcGVuJzoKJHRleHQgPSBQSFBfRU9MLiJUaGUgYWxsb3dfdXJsX2ZvcGVuIHNldHRpbmcgaXMgaW5jb3JyZWN0LiIuUEhQX0VPTDsKJHRleHQgLj0gIkFkZCB0aGUgZm9sbG93aW5nIHRvIHRoZSBlbmQgb2YgeW91ciBgcGhwLmluaWA6Ii5QSFBfRU9MOwokdGV4dCAuPSAiICAgIGFsbG93X3VybF9mb3BlbiA9IE9uIjsKJGRpc3BsYXlJbmlNZXNzYWdlID0gdHJ1ZTsKYnJlYWs7CgpjYXNlICdpb25jdWJlJzoKJHRleHQgPSBQSFBfRU9MLiJZb3VyIGlvbkN1YmUgTG9hZGVyIGV4dGVuc2lvbiAoJGN1cnJlbnQpIGlzIGluY29tcGF0aWJsZSB3aXRoIFBoYXIgZmlsZXMuIi5QSFBfRU9MOwokdGV4dCAuPSAiVXBncmFkZSB0byBpb25DdWJlIDQuMC45IG9yIGhpZ2hlciBvciByZW1vdmUgdGhpcyBsaW5lIChwYXRoIG1heSBiZSBkaWZmZXJlbnQpIGZyb20geW91ciBgcGhwLmluaWAgdG8gZGlzYWJsZSBpdDoiLlBIUF9FT0w7CiR0ZXh0IC49ICIgICAgemVuZF9leHRlbnNpb24gPSAvdXNyL2xpYi9waHA1LzIwMDkwNjI2K2xmcy9pb25jdWJlX2xvYWRlcl9saW5fNS4zLnNvIjsKJGRpc3BsYXlJbmlNZXNzYWdlID0gdHJ1ZTsKYnJlYWs7CgpjYXNlICdvcGVuc3NsJzoKJHRleHQgPSBQSFBfRU9MLiJUaGUgb3BlbnNzbCBleHRlbnNpb24gaXMgbWlzc2luZywgd2hpY2ggbWVhbnMgdGhhdCBzZWN1cmUgSFRUUFMgdHJhbnNmZXJzIGFyZSBpbXBvc3NpYmxlLiIuUEhQX0VPTDsKJHRleHQgLj0gIklmIHBvc3NpYmxlIHlvdSBzaG91bGQgZW5hYmxlIGl0IG9yIHJlY29tcGlsZSBwaHAgd2l0aCAtLXdpdGgtb3BlbnNzbCI7CmJyZWFrOwoKZGVmYXVsdDoKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZigiRGlhZ25vc2VDb21tYW5kOiBVbmtub3duIGVycm9yIHR5cGUgXCIlc1wiLiBQbGVhc2UgcmVwb3J0IGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9jb21wb3Nlci9pc3N1ZXMvbmV3LiIsICRlcnJvcikpOwp9CiRvdXQoJHRleHQsICdlcnJvcicpOwp9Cgokb3V0cHV0IC49IFBIUF9FT0w7Cn0KCmlmICghZW1wdHkoJHdhcm5pbmdzKSkgewpmb3JlYWNoICgkd2FybmluZ3MgYXMgJHdhcm5pbmcgPT4gJGN1cnJlbnQpIHsKc3dpdGNoICgkd2FybmluZykgewpjYXNlICdhcGNfY2xpJzoKJHRleHQgPSAiVGhlIGFwYy5lbmFibGVfY2xpIHNldHRpbmcgaXMgaW5jb3JyZWN0LiIuUEhQX0VPTDsKJHRleHQgLj0gIkFkZCB0aGUgZm9sbG93aW5nIHRvIHRoZSBlbmQgb2YgeW91ciBgcGhwLmluaWA6Ii5QSFBfRU9MOwokdGV4dCAuPSAiICBhcGMuZW5hYmxlX2NsaSA9IE9mZiI7CiRkaXNwbGF5SW5pTWVzc2FnZSA9IHRydWU7CmJyZWFrOwoKY2FzZSAnemxpYic6CiR0ZXh0ID0gJ1RoZSB6bGliIGV4dGVuc2lvbiBpcyBub3QgbG9hZGVkLCB0aGlzIGNhbiBzbG93IGRvd24gQ29tcG9zZXIgYSBsb3QuJy5QSFBfRU9MOwokdGV4dCAuPSAnSWYgcG9zc2libGUsIGVuYWJsZSBpdCBvciByZWNvbXBpbGUgcGhwIHdpdGggLS13aXRoLXpsaWInLlBIUF9FT0w7CiRkaXNwbGF5SW5pTWVzc2FnZSA9IHRydWU7CmJyZWFrOwoKY2FzZSAnc2lnY2hpbGQnOgokdGV4dCA9ICJQSFAgd2FzIGNvbXBpbGVkIHdpdGggLS1lbmFibGUtc2lnY2hpbGQgd2hpY2ggY2FuIGNhdXNlIGlzc3VlcyBvbiBzb21lIHBsYXRmb3Jtcy4iLlBIUF9FT0w7CiR0ZXh0IC49ICJSZWNvbXBpbGUgaXQgd2l0aG91dCB0aGlzIGZsYWcgaWYgcG9zc2libGUsIHNlZSBhbHNvOiIuUEhQX0VPTDsKJHRleHQgLj0gIiAgaHR0cHM6Ly9idWdzLnBocC5uZXQvYnVnLnBocD9pZD0yMjk5OSI7CmJyZWFrOwoKY2FzZSAnY3VybHdyYXBwZXJzJzoKJHRleHQgPSAiUEhQIHdhcyBjb21waWxlZCB3aXRoIC0td2l0aC1jdXJsd3JhcHBlcnMgd2hpY2ggd2lsbCBjYXVzZSBpc3N1ZXMgd2l0aCBIVFRQIGF1dGhlbnRpY2F0aW9uIGFuZCBHaXRIdWIuIi5QSFBfRU9MOwokdGV4dCAuPSAiIFJlY29tcGlsZSBpdCB3aXRob3V0IHRoaXMgZmxhZyBpZiBwb3NzaWJsZSI7CmJyZWFrOwoKY2FzZSAnb3BlbnNzbF92ZXJzaW9uJzoKCiRvcGVuc3NsVmVyc2lvbiA9IHN0cnN0cih0cmltKHN0cnN0cihPUEVOU1NMX1ZFUlNJT05fVEVYVCwgJyAnKSksICcgJywgdHJ1ZSk7CiRvcGVuc3NsVmVyc2lvbiA9ICRvcGVuc3NsVmVyc2lvbiA/OiBPUEVOU1NMX1ZFUlNJT05fVEVYVDsKCiR0ZXh0ID0gIlRoZSBPcGVuU1NMIGxpYnJhcnkgKHskb3BlbnNzbFZlcnNpb259KSB1c2VkIGJ5IFBIUCBkb2VzIG5vdCBzdXBwb3J0IFRMU3YxLjIgb3IgVExTdjEuMS4iLlBIUF9FT0w7CiR0ZXh0IC49ICJJZiBwb3NzaWJsZSB5b3Ugc2hvdWxkIHVwZ3JhZGUgT3BlblNTTCB0byB2ZXJzaW9uIDEuMC4xIG9yIGFib3ZlLiI7CmJyZWFrOwoKY2FzZSAneGRlYnVnX2xvYWRlZCc6CiR0ZXh0ID0gIlRoZSB4ZGVidWcgZXh0ZW5zaW9uIGlzIGxvYWRlZCwgdGhpcyBjYW4gc2xvdyBkb3duIENvbXBvc2VyIGEgbGl0dGxlLiIuUEhQX0VPTDsKJHRleHQgLj0gIiBEaXNhYmxpbmcgaXQgd2hlbiB1c2luZyBDb21wb3NlciBpcyByZWNvbW1lbmRlZC4iOwpicmVhazsKCmNhc2UgJ3hkZWJ1Z19wcm9maWxlJzoKJHRleHQgPSAiVGhlIHhkZWJ1Zy5wcm9maWxlcl9lbmFibGVkIHNldHRpbmcgaXMgZW5hYmxlZCwgdGhpcyBjYW4gc2xvdyBkb3duIENvbXBvc2VyIGEgbG90LiIuUEhQX0VPTDsKJHRleHQgLj0gIkFkZCB0aGUgZm9sbG93aW5nIHRvIHRoZSBlbmQgb2YgeW91ciBgcGhwLmluaWAgdG8gZGlzYWJsZSBpdDoiLlBIUF9FT0w7CiR0ZXh0IC49ICIgIHhkZWJ1Zy5wcm9maWxlcl9lbmFibGVkID0gMCI7CiRkaXNwbGF5SW5pTWVzc2FnZSA9IHRydWU7CmJyZWFrOwoKY2FzZSAnb25lZHJpdmUnOgokdGV4dCA9ICJUaGUgV2luZG93cyBPbmVEcml2ZSBmb2xkZXIgaXMgbm90IHN1cHBvcnRlZCBvbiBQSFAgdmVyc2lvbnMgYmVsb3cgNy4yLjIzIGFuZCA3LjMuMTAuIi5QSFBfRU9MOwokdGV4dCAuPSAiVXBncmFkZSB5b3VyIFBIUCAoeyRjdXJyZW50fSkgdG8gdXNlIHRoaXMgbG9jYXRpb24gd2l0aCBDb21wb3Nlci4iLlBIUF9FT0w7CmJyZWFrOwoKY2FzZSAndW9weic6CiR0ZXh0ID0gIlRoZSB1b3B6IGV4dGVuc2lvbiBpZ25vcmVzIGV4aXQgY2FsbHMgYW5kIG1heSBub3Qgd29yayB3aXRoIGFsbCBDb21wb3NlciBjb21tYW5kcy4iLlBIUF9FT0w7CiR0ZXh0IC49ICJEaXNhYmxpbmcgaXQgd2hlbiB1c2luZyBDb21wb3NlciBpcyByZWNvbW1lbmRlZC4iOwpicmVhazsKCmRlZmF1bHQ6CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoIkRpYWdub3NlQ29tbWFuZDogVW5rbm93biB3YXJuaW5nIHR5cGUgXCIlc1wiLiBQbGVhc2UgcmVwb3J0IGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9jb21wb3Nlci9pc3N1ZXMvbmV3LiIsICR3YXJuaW5nKSk7Cn0KJG91dCgkdGV4dCwgJ2NvbW1lbnQnKTsKfQp9CgppZiAoJGRpc3BsYXlJbmlNZXNzYWdlKSB7CiRvdXQoJGluaU1lc3NhZ2UsICdjb21tZW50Jyk7Cn0KCmlmIChpbl9hcnJheShQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9JUFJFU09MVkUnKSwgWyc0JywgJzYnXSwgdHJ1ZSkpIHsKJHdhcm5pbmdzWydpcHJlc29sdmUnXSA9IHRydWU7CiRvdXQoJ1RoZSBDT01QT1NFUl9JUFJFU09MVkUgZW52IHZhciBpcyBzZXQgdG8gJyAuIFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0lQUkVTT0xWRScpIC4nIHdoaWNoIG1heSByZXN1bHQgaW4gbmV0d29yayBmYWlsdXJlcyBiZWxvdy4nLCAnY29tbWVudCcpOwp9CgpyZXR1cm4gY291bnQoJHdhcm5pbmdzKSA9PT0gMCAmJiBjb3VudCgkZXJyb3JzKSA9PT0gMCA/IHRydWUgOiAkb3V0cHV0Owp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gY2hlY2tDb25uZWN0aXZpdHkoKQp7CmlmICghaW5pX2dldCgnYWxsb3dfdXJsX2ZvcGVuJykpIHsKcmV0dXJuICc8aW5mbz5TS0lQPC8+IDxjb21tZW50PkJlY2F1c2UgYWxsb3dfdXJsX2ZvcGVuIGlzIG1pc3NpbmcuPC8+JzsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY2hlY2tDb25uZWN0aXZpdHlBbmRDb21wb3Nlck5ldHdvcmtIdHRwRW5hYmxlbWVudCgpCnsKJHJlc3VsdCA9ICR0aGlzLT5jaGVja0Nvbm5lY3Rpdml0eSgpOwppZiAoJHJlc3VsdCAhPT0gdHJ1ZSkgewpyZXR1cm4gJHJlc3VsdDsKfQoKJHJlc3VsdCA9ICR0aGlzLT5jaGVja0NvbXBvc2VyTmV0d29ya0h0dHBFbmFibGVtZW50KCk7CmlmICgkcmVzdWx0ICE9PSB0cnVlKSB7CnJldHVybiAkcmVzdWx0Owp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNoZWNrQ29tcG9zZXJOZXR3b3JrSHR0cEVuYWJsZW1lbnQoKQp7CmlmICgoYm9vbCkgUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfRElTQUJMRV9ORVRXT1JLJykpIHsKcmV0dXJuICc8aW5mbz5TS0lQPC8+IDxjb21tZW50Pk5ldHdvcmsgaXMgZGlzYWJsZWQgYnkgQ09NUE9TRVJfRElTQUJMRV9ORVRXT1JLLjwvPic7Cn0KCnJldHVybiB0cnVlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcUGx1Z2luXENvbW1hbmRFdmVudDsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5FdmVudHM7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCmNsYXNzIER1bXBBdXRvbG9hZENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgnZHVtcC1hdXRvbG9hZCcpCi0+c2V0QWxpYXNlcyhbJ2R1bXBhdXRvbG9hZCddKQotPnNldERlc2NyaXB0aW9uKCdEdW1wcyB0aGUgYXV0b2xvYWRlcicpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dE9wdGlvbignb3B0aW1pemUnLCAnbycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT3B0aW1pemVzIFBTUjAgYW5kIFBTUjQgcGFja2FnZXMgdG8gYmUgbG9hZGVkIHdpdGggY2xhc3NtYXBzIHRvbywgZ29vZCBmb3IgcHJvZHVjdGlvbi4nKSwKbmV3IElucHV0T3B0aW9uKCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJywgJ2EnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0F1dG9sb2FkIGNsYXNzZXMgZnJvbSB0aGUgY2xhc3NtYXAgb25seS4gSW1wbGljaXRseSBlbmFibGVzIGAtLW9wdGltaXplYC4nKSwKbmV3IElucHV0T3B0aW9uKCdhcGN1JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdVc2UgQVBDdSB0byBjYWNoZSBmb3VuZC9ub3QtZm91bmQgY2xhc3Nlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdhcGN1LXByZWZpeCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1VzZSBhIGN1c3RvbSBwcmVmaXggZm9yIHRoZSBBUEN1IGF1dG9sb2FkZXIgY2FjaGUuIEltcGxpY2l0bHkgZW5hYmxlcyAtLWFwY3UnKSwKbmV3IElucHV0T3B0aW9uKCdkcnktcnVuJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPdXRwdXRzIHRoZSBvcGVyYXRpb25zIGJ1dCB3aWxsIG5vdCBleGVjdXRlIGFueXRoaW5nLicpLApuZXcgSW5wdXRPcHRpb24oJ2RldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRW5hYmxlcyBhdXRvbG9hZC1kZXYgcnVsZXMuIENvbXBvc2VyIHdpbGwgYnkgZGVmYXVsdCBpbmZlciB0aGlzIGF1dG9tYXRpY2FsbHkgYWNjb3JkaW5nIHRvIHRoZSBsYXN0IGluc3RhbGwgb3IgdXBkYXRlIC0tbm8tZGV2IHN0YXRlLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLWRldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRGlzYWJsZXMgYXV0b2xvYWQtZGV2IHJ1bGVzLiBDb21wb3NlciB3aWxsIGJ5IGRlZmF1bHQgaW5mZXIgdGhpcyBhdXRvbWF0aWNhbGx5IGFjY29yZGluZyB0byB0aGUgbGFzdCBpbnN0YWxsIG9yIHVwZGF0ZSAtLW5vLWRldiBzdGF0ZS4nKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVEIHwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZLCAnSWdub3JlIGEgc3BlY2lmaWMgcGxhdGZvcm0gcmVxdWlyZW1lbnQgKHBocCAmIGV4dC0gcGFja2FnZXMpLicpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXFzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdJZ25vcmUgYWxsIHBsYXRmb3JtIHJlcXVpcmVtZW50cyAocGhwICYgZXh0LSBwYWNrYWdlcykuJyksCm5ldyBJbnB1dE9wdGlvbignc3RyaWN0LXBzcicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUmV0dXJuIGEgZmFpbGVkIHN0YXR1cyBjb2RlICgxKSBpZiBQU1ItNCBvciBQU1ItMCBtYXBwaW5nIGVycm9ycyBhcmUgcHJlc2VudC4gUmVxdWlyZXMgLS1vcHRpbWl6ZSB0byB3b3JrLicpLApuZXcgSW5wdXRPcHRpb24oJ3N0cmljdC1hbWJpZ3VvdXMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1JldHVybiBhIGZhaWxlZCBzdGF0dXMgY29kZSAoMikgaWYgdGhlIHNhbWUgY2xhc3MgaXMgZm91bmQgaW4gbXVsdGlwbGUgZmlsZXMuIFJlcXVpcmVzIC0tb3B0aW1pemUgdG8gd29yay4nKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgZHVtcC1hdXRvbG9hZDwvaW5mbz4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI2R1bXAtYXV0b2xvYWQtZHVtcGF1dG9sb2FkCkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKCiRjb21tYW5kRXZlbnQgPSBuZXcgQ29tbWFuZEV2ZW50KFBsdWdpbkV2ZW50czo6Q09NTUFORCwgJ2R1bXAtYXV0b2xvYWQnLCAkaW5wdXQsICRvdXRwdXQpOwokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaCgkY29tbWFuZEV2ZW50LT5nZXROYW1lKCksICRjb21tYW5kRXZlbnQpOwoKJGluc3RhbGxhdGlvbk1hbmFnZXIgPSAkY29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKTsKJGxvY2FsUmVwbyA9ICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7CiRwYWNrYWdlID0gJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCk7CiRjb25maWcgPSAkY29tcG9zZXItPmdldENvbmZpZygpOwoKJG1pc3NpbmdEZXBlbmRlbmNpZXMgPSBmYWxzZTsKZm9yZWFjaCAoJGxvY2FsUmVwby0+Z2V0Q2Fub25pY2FsUGFja2FnZXMoKSBhcyAkbG9jYWxQa2cpIHsKJGluc3RhbGxQYXRoID0gJGluc3RhbGxhdGlvbk1hbmFnZXItPmdldEluc3RhbGxQYXRoKCRsb2NhbFBrZyk7CmlmICgkaW5zdGFsbFBhdGggIT09IG51bGwgJiYgZmlsZV9leGlzdHMoJGluc3RhbGxQYXRoKSA9PT0gZmFsc2UpIHsKJG1pc3NpbmdEZXBlbmRlbmNpZXMgPSB0cnVlOwokdGhpcy0+Z2V0SU8oKS0+d3JpdGUoJzx3YXJuaW5nPk5vdCBhbGwgZGVwZW5kZW5jaWVzIGFyZSBpbnN0YWxsZWQuIE1ha2Ugc3VyZSB0byBydW4gYSAiY29tcG9zZXIgaW5zdGFsbCIgdG8gaW5zdGFsbCBtaXNzaW5nIGRlcGVuZGVuY2llczwvd2FybmluZz4nKTsKCmJyZWFrOwp9Cn0KCiRvcHRpbWl6ZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdvcHRpbWl6ZScpIHx8ICRjb25maWctPmdldCgnb3B0aW1pemUtYXV0b2xvYWRlcicpOwokYXV0aG9yaXRhdGl2ZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJykgfHwgJGNvbmZpZy0+Z2V0KCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJyk7CiRhcGN1UHJlZml4ID0gJGlucHV0LT5nZXRPcHRpb24oJ2FwY3UtcHJlZml4Jyk7CiRhcGN1ID0gJGFwY3VQcmVmaXggIT09IG51bGwgfHwgJGlucHV0LT5nZXRPcHRpb24oJ2FwY3UnKSB8fCAkY29uZmlnLT5nZXQoJ2FwY3UtYXV0b2xvYWRlcicpOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdzdHJpY3QtcHNyJykgJiYgISRvcHRpbWl6ZSAmJiAhJGF1dGhvcml0YXRpdmUpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJy0tc3RyaWN0LXBzciBtb2RlIG9ubHkgd29ya3Mgd2l0aCBvcHRpbWl6ZWQgYXV0b2xvYWRlciwgdXNlIC0tb3B0aW1pemUgb3IgLS1jbGFzc21hcC1hdXRob3JpdGF0aXZlIGlmIHlvdSB3YW50IGEgc3RyaWN0IHJldHVybiB2YWx1ZS4nKTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3N0cmljdC1hbWJpZ3VvdXMnKSAmJiAhJG9wdGltaXplICYmICEkYXV0aG9yaXRhdGl2ZSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignLS1zdHJpY3QtYW1iaWd1b3VzIG1vZGUgb25seSB3b3JrcyB3aXRoIG9wdGltaXplZCBhdXRvbG9hZGVyLCB1c2UgLS1vcHRpbWl6ZSBvciAtLWNsYXNzbWFwLWF1dGhvcml0YXRpdmUgaWYgeW91IHdhbnQgYSBzdHJpY3QgcmV0dXJuIHZhbHVlLicpOwp9CgppZiAoJGF1dGhvcml0YXRpdmUpIHsKJHRoaXMtPmdldElPKCktPndyaXRlKCc8aW5mbz5HZW5lcmF0aW5nIG9wdGltaXplZCBhdXRvbG9hZCBmaWxlcyAoYXV0aG9yaXRhdGl2ZSk8L2luZm8+Jyk7Cn0gZWxzZWlmICgkb3B0aW1pemUpIHsKJHRoaXMtPmdldElPKCktPndyaXRlKCc8aW5mbz5HZW5lcmF0aW5nIG9wdGltaXplZCBhdXRvbG9hZCBmaWxlczwvaW5mbz4nKTsKfSBlbHNlIHsKJHRoaXMtPmdldElPKCktPndyaXRlKCc8aW5mbz5HZW5lcmF0aW5nIGF1dG9sb2FkIGZpbGVzPC9pbmZvPicpOwp9CgokZ2VuZXJhdG9yID0gJGNvbXBvc2VyLT5nZXRBdXRvbG9hZEdlbmVyYXRvcigpOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2RyeS1ydW4nKSkgewokZ2VuZXJhdG9yLT5zZXREcnlSdW4odHJ1ZSk7Cn0KaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSkgewokZ2VuZXJhdG9yLT5zZXREZXZNb2RlKGZhbHNlKTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2RldicpKSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbignbm8tZGV2JykpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1lvdSBjYW4gbm90IHVzZSBib3RoIC0tbm8tZGV2IGFuZCAtLWRldiBhcyB0aGV5IGNvbmZsaWN0IHdpdGggZWFjaCBvdGhlci4nKTsKfQokZ2VuZXJhdG9yLT5zZXREZXZNb2RlKHRydWUpOwp9CiRnZW5lcmF0b3ItPnNldENsYXNzTWFwQXV0aG9yaXRhdGl2ZSgkYXV0aG9yaXRhdGl2ZSk7CiRnZW5lcmF0b3ItPnNldFJ1blNjcmlwdHModHJ1ZSk7CiRnZW5lcmF0b3ItPnNldEFwY3UoJGFwY3UsICRhcGN1UHJlZml4KTsKJGdlbmVyYXRvci0+c2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkdGhpcy0+Z2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkaW5wdXQpKTsKJGNsYXNzTWFwID0gJGdlbmVyYXRvci0+ZHVtcCgKJGNvbmZpZywKJGxvY2FsUmVwbywKJHBhY2thZ2UsCiRpbnN0YWxsYXRpb25NYW5hZ2VyLAonY29tcG9zZXInLAokb3B0aW1pemUsCm51bGwsCiRjb21wb3Nlci0+Z2V0TG9ja2VyKCksCiRpbnB1dC0+Z2V0T3B0aW9uKCdzdHJpY3QtYW1iaWd1b3VzJykKKTsKJG51bWJlck9mQ2xhc3NlcyA9IGNvdW50KCRjbGFzc01hcCk7CgppZiAoJGF1dGhvcml0YXRpdmUpIHsKJHRoaXMtPmdldElPKCktPndyaXRlKCc8aW5mbz5HZW5lcmF0ZWQgb3B0aW1pemVkIGF1dG9sb2FkIGZpbGVzIChhdXRob3JpdGF0aXZlKSBjb250YWluaW5nICcuICRudW1iZXJPZkNsYXNzZXMgLicgY2xhc3NlczwvaW5mbz4nKTsKfSBlbHNlaWYgKCRvcHRpbWl6ZSkgewokdGhpcy0+Z2V0SU8oKS0+d3JpdGUoJzxpbmZvPkdlbmVyYXRlZCBvcHRpbWl6ZWQgYXV0b2xvYWQgZmlsZXMgY29udGFpbmluZyAnLiAkbnVtYmVyT2ZDbGFzc2VzIC4nIGNsYXNzZXM8L2luZm8+Jyk7Cn0gZWxzZSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZSgnPGluZm8+R2VuZXJhdGVkIGF1dG9sb2FkIGZpbGVzPC9pbmZvPicpOwp9CgppZiAoJG1pc3NpbmdEZXBlbmRlbmNpZXMgfHwgKCRpbnB1dC0+Z2V0T3B0aW9uKCdzdHJpY3QtcHNyJykgJiYgY291bnQoJGNsYXNzTWFwLT5nZXRQc3JWaW9sYXRpb25zKCkpID4gMCkpIHsKcmV0dXJuIDE7Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbignc3RyaWN0LWFtYmlndW91cycpICYmIGNvdW50KCRjbGFzc01hcC0+Z2V0QW1iaWd1b3VzQ2xhc3NlcyhmYWxzZSkpID4gMCkgewpyZXR1cm4gMjsKfQoKcmV0dXJuIDA7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKCgoKCmNsYXNzIEV4ZWNDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ2V4ZWMnKQotPnNldERlc2NyaXB0aW9uKCdFeGVjdXRlcyBhIHZlbmRvcmVkIGJpbmFyeS9zY3JpcHQnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRPcHRpb24oJ2xpc3QnLCAnbCcsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FKSwKbmV3IElucHV0QXJndW1lbnQoJ2JpbmFyeScsIElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnVGhlIGJpbmFyeSB0byBydW4sIGUuZy4gcGhwdW5pdCcsIG51bGwsIGZ1bmN0aW9uICgpIHsKcmV0dXJuICR0aGlzLT5nZXRCaW5hcmllcyhmYWxzZSk7Cn0pLApuZXcgSW5wdXRBcmd1bWVudCgKJ2FyZ3MnLApJbnB1dEFyZ3VtZW50OjpJU19BUlJBWSB8IElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLAonQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGJpbmFyeS4gVXNlIDxpbmZvPi0tPC9pbmZvPiB0byBzZXBhcmF0ZSBmcm9tIGNvbXBvc2VyIGFyZ3VtZW50cycKKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKRXhlY3V0ZXMgYSB2ZW5kb3JlZCBiaW5hcnkvc2NyaXB0LgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjZXhlYwpFT1QKKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBpbnRlcmFjdChJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogdm9pZAp7CiRiaW5hcmllcyA9ICR0aGlzLT5nZXRCaW5hcmllcyhmYWxzZSk7CmlmIChjb3VudCgkYmluYXJpZXMpID09PSAwKSB7CnJldHVybjsKfQoKaWYgKCRpbnB1dC0+Z2V0QXJndW1lbnQoJ2JpbmFyeScpICE9PSBudWxsIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCdsaXN0JykpIHsKcmV0dXJuOwp9CgokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCiRiaW5hcnkgPSAkaW8tPnNlbGVjdCgKJ0JpbmFyeSB0byBydW46ICcsCiRiaW5hcmllcywKJycsCjEsCidJbnZhbGlkIGJpbmFyeSBuYW1lICIlcyInCik7CgokaW5wdXQtPnNldEFyZ3VtZW50KCdiaW5hcnknLCAkYmluYXJpZXNbJGJpbmFyeV0pOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2xpc3QnKSB8fCBudWxsID09PSAkaW5wdXQtPmdldEFyZ3VtZW50KCdiaW5hcnknKSkgewokYmlucyA9ICR0aGlzLT5nZXRCaW5hcmllcyh0cnVlKTsKaWYgKFtdID09PSAkYmlucykgewokYmluRGlyID0gJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdiaW4tZGlyJyk7Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIk5vIGJpbmFyaWVzIGZvdW5kIGluIGNvbXBvc2VyLmpzb24gb3IgaW4gYmluLWRpciAoJGJpbkRpcikiKTsKfQoKJHRoaXMtPmdldElPKCktPndyaXRlKAo8PDxFT1QKPGNvbW1lbnQ+QXZhaWxhYmxlIGJpbmFyaWVzOjwvY29tbWVudD4KRU9UCik7Cgpmb3JlYWNoICgkYmlucyBhcyAkYmluKSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZSgKPDw8RU9UCjxpbmZvPi0gJGJpbjwvaW5mbz4KRU9UCik7Cn0KCnJldHVybiAwOwp9CgokYmluYXJ5ID0gJGlucHV0LT5nZXRBcmd1bWVudCgnYmluYXJ5Jyk7CgokZGlzcGF0Y2hlciA9ICRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCk7CiRkaXNwYXRjaGVyLT5hZGRMaXN0ZW5lcignX19leGVjX2NvbW1hbmQnLCAkYmluYXJ5KTsKCgoKCmlmIChnZXRjd2QoKSAhPT0gJHRoaXMtPmdldEFwcGxpY2F0aW9uKCktPmdldEluaXRpYWxXb3JraW5nRGlyZWN0b3J5KCkgJiYgJHRoaXMtPmdldEFwcGxpY2F0aW9uKCktPmdldEluaXRpYWxXb3JraW5nRGlyZWN0b3J5KCkgIT09IGZhbHNlKSB7CnRyeSB7CmNoZGlyKCR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5nZXRJbml0aWFsV29ya2luZ0RpcmVjdG9yeSgpKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBzd2l0Y2ggYmFjayB0byB3b3JraW5nIGRpcmVjdG9yeSAiJy4kdGhpcy0+Z2V0QXBwbGljYXRpb24oKS0+Z2V0SW5pdGlhbFdvcmtpbmdEaXJlY3RvcnkoKS4nIicsIDAsICRlKTsKfQp9CgpyZXR1cm4gJGRpc3BhdGNoZXItPmRpc3BhdGNoU2NyaXB0KCdfX2V4ZWNfY29tbWFuZCcsIHRydWUsICRpbnB1dC0+Z2V0QXJndW1lbnQoJ2FyZ3MnKSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0QmluYXJpZXMoYm9vbCAkZm9yRGlzcGxheSk6IGFycmF5CnsKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwokYmluRGlyID0gJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdiaW4tZGlyJyk7CiRiaW5zID0gZ2xvYigkYmluRGlyIC4gJy8qJyk7CiRsb2NhbEJpbnMgPSAkY29tcG9zZXItPmdldFBhY2thZ2UoKS0+Z2V0QmluYXJpZXMoKTsKaWYgKCRmb3JEaXNwbGF5KSB7CiRsb2NhbEJpbnMgPSBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkZSkgewpyZXR1cm4gIiRlIChsb2NhbCkiOwp9LCAkbG9jYWxCaW5zKTsKfQoKJGJpbmFyaWVzID0gW107CmZvcmVhY2ggKGFycmF5X21lcmdlKCRiaW5zLCAkbG9jYWxCaW5zKSBhcyAkYmluKSB7CgppZiAoaXNzZXQoJHByZXZpb3VzQmluKSAmJiAkYmluID09PSAkcHJldmlvdXNCaW4uJy5iYXQnKSB7CmNvbnRpbnVlOwp9CgokcHJldmlvdXNCaW4gPSAkYmluOwokYmluYXJpZXNbXSA9IGJhc2VuYW1lKCRiaW4pOwp9CgpyZXR1cm4gJGJpbmFyaWVzOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxDb21wb3NpdGVSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcTWF0Y2hBbGxDb25zdHJhaW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKY2xhc3MgRnVuZENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzLT5zZXROYW1lKCdmdW5kJykKLT5zZXREZXNjcmlwdGlvbignRGlzY292ZXIgaG93IHRvIGhlbHAgZnVuZCB0aGUgbWFpbnRlbmFuY2Ugb2YgeW91ciBkZXBlbmRlbmNpZXMnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRPcHRpb24oJ2Zvcm1hdCcsICdmJywgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnRm9ybWF0IG9mIHRoZSBvdXRwdXQ6IHRleHQgb3IganNvbicsICd0ZXh0JywgWyd0ZXh0JywgJ2pzb24nXSksCl0pCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKCiRyZXBvID0gJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKJHJlbW90ZVJlcG9zID0gbmV3IENvbXBvc2l0ZVJlcG9zaXRvcnkoJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRSZXBvc2l0b3JpZXMoKSk7CiRmdW5kaW5ncyA9IFtdOwoKJHBhY2thZ2VzVG9Mb2FkID0gW107CmZvcmVhY2ggKCRyZXBvLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewpjb250aW51ZTsKfQokcGFja2FnZXNUb0xvYWRbJHBhY2thZ2UtPmdldE5hbWUoKV0gPSBuZXcgTWF0Y2hBbGxDb25zdHJhaW50KCk7Cn0KCgokcmVzdWx0ID0gJHJlbW90ZVJlcG9zLT5sb2FkUGFja2FnZXMoJHBhY2thZ2VzVG9Mb2FkLCBbJ2RldicgPT4gQmFzZVBhY2thZ2U6OlNUQUJJTElUWV9ERVZdLCBbXSk7CgoKZm9yZWFjaCAoJHJlc3VsdFsncGFja2FnZXMnXSBhcyAkcGFja2FnZSkgewppZiAoCiEkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZQomJiAkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZQomJiAkcGFja2FnZS0+aXNEZWZhdWx0QnJhbmNoKCkKJiYgJHBhY2thZ2UtPmdldEZ1bmRpbmcoKQomJiBpc3NldCgkcGFja2FnZXNUb0xvYWRbJHBhY2thZ2UtPmdldE5hbWUoKV0pCikgewokZnVuZGluZ3MgPSAkdGhpcy0+aW5zZXJ0RnVuZGluZ0RhdGEoJGZ1bmRpbmdzLCAkcGFja2FnZSk7CnVuc2V0KCRwYWNrYWdlc1RvTG9hZFskcGFja2FnZS0+Z2V0TmFtZSgpXSk7Cn0KfQoKCmZvcmVhY2ggKCRyZXBvLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSB8fCAhaXNzZXQoJHBhY2thZ2VzVG9Mb2FkWyRwYWNrYWdlLT5nZXROYW1lKCldKSkgewpjb250aW51ZTsKfQoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICYmICRwYWNrYWdlLT5nZXRGdW5kaW5nKCkpIHsKJGZ1bmRpbmdzID0gJHRoaXMtPmluc2VydEZ1bmRpbmdEYXRhKCRmdW5kaW5ncywgJHBhY2thZ2UpOwp9Cn0KCmtzb3J0KCRmdW5kaW5ncyk7CgokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCiRmb3JtYXQgPSAkaW5wdXQtPmdldE9wdGlvbignZm9ybWF0Jyk7CmlmICghaW5fYXJyYXkoJGZvcm1hdCwgWyd0ZXh0JywgJ2pzb24nXSkpIHsKJGlvLT53cml0ZUVycm9yKHNwcmludGYoJ1Vuc3VwcG9ydGVkIGZvcm1hdCAiJXMiLiBTZWUgaGVscCBmb3Igc3VwcG9ydGVkIGZvcm1hdHMuJywgJGZvcm1hdCkpOwoKcmV0dXJuIDE7Cn0KCmlmICgkZnVuZGluZ3MgJiYgJGZvcm1hdCA9PT0gJ3RleHQnKSB7CiRwcmV2ID0gbnVsbDsKCiRpby0+d3JpdGUoJ1RoZSBmb2xsb3dpbmcgcGFja2FnZXMgd2VyZSBmb3VuZCBpbiB5b3VyIGRlcGVuZGVuY2llcyB3aGljaCBwdWJsaXNoIGZ1bmRpbmcgaW5mb3JtYXRpb246Jyk7Cgpmb3JlYWNoICgkZnVuZGluZ3MgYXMgJHZlbmRvciA9PiAkbGlua3MpIHsKJGlvLT53cml0ZSgnJyk7CiRpby0+d3JpdGUoc3ByaW50ZigiPGNvbW1lbnQ+JXM8L2NvbW1lbnQ+IiwgJHZlbmRvcikpOwpmb3JlYWNoICgkbGlua3MgYXMgJHVybCA9PiAkcGFja2FnZXMpIHsKJGxpbmUgPSBzcHJpbnRmKCcgIDxpbmZvPiVzPC9pbmZvPicsIGltcGxvZGUoJywgJywgJHBhY2thZ2VzKSk7CgppZiAoJHByZXYgIT09ICRsaW5lKSB7CiRpby0+d3JpdGUoJGxpbmUpOwokcHJldiA9ICRsaW5lOwp9CgokaW8tPndyaXRlKHNwcmludGYoJyAgICA8aHJlZj0lcz4lczwvPicsIE91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCR1cmwpLCAkdXJsKSk7Cn0KfQoKJGlvLT53cml0ZSgiIik7CiRpby0+d3JpdGUoIlBsZWFzZSBjb25zaWRlciBmb2xsb3dpbmcgdGhlc2UgbGlua3MgYW5kIHNwb25zb3JpbmcgdGhlIHdvcmsgb2YgcGFja2FnZSBhdXRob3JzISIpOwokaW8tPndyaXRlKCJUaGFuayB5b3UhIik7Cn0gZWxzZWlmICgkZm9ybWF0ID09PSAnanNvbicpIHsKJGlvLT53cml0ZShKc29uRmlsZTo6ZW5jb2RlKCRmdW5kaW5ncykpOwp9IGVsc2UgewokaW8tPndyaXRlKCJObyBmdW5kaW5nIGxpbmtzIHdlcmUgZm91bmQgaW4geW91ciBwYWNrYWdlIGRlcGVuZGVuY2llcy4gVGhpcyBkb2Vzbid0IG1lYW4gdGhleSBkb24ndCBuZWVkIHlvdXIgc3VwcG9ydCEiKTsKfQoKcmV0dXJuIDA7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGluc2VydEZ1bmRpbmdEYXRhKGFycmF5ICRmdW5kaW5ncywgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogYXJyYXkKewpmb3JlYWNoICgkcGFja2FnZS0+Z2V0RnVuZGluZygpIGFzICRmdW5kaW5nT3B0aW9uKSB7ClskdmVuZG9yLCAkcGFja2FnZU5hbWVdID0gZXhwbG9kZSgnLycsICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkpOwoKaWYgKGVtcHR5KCRmdW5kaW5nT3B0aW9uWyd1cmwnXSkpIHsKY29udGludWU7Cn0KJHVybCA9ICRmdW5kaW5nT3B0aW9uWyd1cmwnXTsKaWYgKCFlbXB0eSgkZnVuZGluZ09wdGlvblsndHlwZSddKSAmJiAkZnVuZGluZ09wdGlvblsndHlwZSddID09PSAnZ2l0aHViJyAmJiBQcmVnOjppc01hdGNoKCd7Xmh0dHBzOi8vZ2l0aHViLmNvbS8oW14vXSspJH0nLCAkdXJsLCAkbWF0Y2gpKSB7CiR1cmwgPSAnaHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3JzLycuJG1hdGNoWzFdOwp9CiRmdW5kaW5nc1skdmVuZG9yXVskdXJsXVtdID0gJHBhY2thZ2VOYW1lOwp9CgpyZXR1cm4gJGZ1bmRpbmdzOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uSW5wdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvblN1Z2dlc3Rpb25zOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcU3RyaW5nSW5wdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgpjbGFzcyBHbG9iYWxDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewpwdWJsaWMgZnVuY3Rpb24gY29tcGxldGUoQ29tcGxldGlvbklucHV0ICRpbnB1dCwgQ29tcGxldGlvblN1Z2dlc3Rpb25zICRzdWdnZXN0aW9ucyk6IHZvaWQKewokYXBwbGljYXRpb24gPSAkdGhpcy0+Z2V0QXBwbGljYXRpb24oKTsKaWYgKCRpbnB1dC0+bXVzdFN1Z2dlc3RBcmd1bWVudFZhbHVlc0ZvcignY29tbWFuZC1uYW1lJykpIHsKJHN1Z2dlc3Rpb25zLT5zdWdnZXN0VmFsdWVzKGFycmF5X3ZhbHVlcyhhcnJheV9maWx0ZXIoCmFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKENvbW1hbmQgJGNvbW1hbmQpIHsKcmV0dXJuICRjb21tYW5kLT5pc0hpZGRlbigpID8gbnVsbCA6ICRjb21tYW5kLT5nZXROYW1lKCk7Cn0sICRhcHBsaWNhdGlvbi0+YWxsKCkpLApzdGF0aWMgZnVuY3Rpb24gKD9zdHJpbmcgJGNtZCkgewpyZXR1cm4gJGNtZCAhPT0gbnVsbDsKfQopKSk7CgpyZXR1cm47Cn0KCmlmICgkYXBwbGljYXRpb24tPmhhcygkY29tbWFuZE5hbWUgPSAkaW5wdXQtPmdldEFyZ3VtZW50KCdjb21tYW5kLW5hbWUnKSkpIHsKJGlucHV0ID0gJHRoaXMtPnByZXBhcmVTdWJjb21tYW5kSW5wdXQoJGlucHV0LCB0cnVlKTsKJGlucHV0ID0gQ29tcGxldGlvbklucHV0Ojpmcm9tU3RyaW5nKCRpbnB1dC0+X190b1N0cmluZygpLCAyKTsKJGNvbW1hbmQgPSAkYXBwbGljYXRpb24tPmZpbmQoJGNvbW1hbmROYW1lKTsKJGNvbW1hbmQtPm1lcmdlQXBwbGljYXRpb25EZWZpbml0aW9uKCk7CgokaW5wdXQtPmJpbmQoJGNvbW1hbmQtPmdldERlZmluaXRpb24oKSk7CiRjb21tYW5kLT5jb21wbGV0ZSgkaW5wdXQsICRzdWdnZXN0aW9ucyk7Cn0KfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdnbG9iYWwnKQotPnNldERlc2NyaXB0aW9uKCdBbGxvd3MgcnVubmluZyBjb21tYW5kcyBpbiB0aGUgZ2xvYmFsIGNvbXBvc2VyIGRpciAoJENPTVBPU0VSX0hPTUUpJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0QXJndW1lbnQoJ2NvbW1hbmQtbmFtZScsIElucHV0QXJndW1lbnQ6OlJFUVVJUkVELCAnJyksCm5ldyBJbnB1dEFyZ3VtZW50KCdhcmdzJywgSW5wdXRBcmd1bWVudDo6SVNfQVJSQVkgfCBJbnB1dEFyZ3VtZW50OjpPUFRJT05BTCwgJycpLApdKQotPnNldEhlbHAoCjw8PEVPVApVc2UgdGhpcyBjb21tYW5kIGFzIGEgd3JhcHBlciB0byBydW4gb3RoZXIgQ29tcG9zZXIgY29tbWFuZHMKd2l0aGluIHRoZSBnbG9iYWwgY29udGV4dCBvZiBDT01QT1NFUl9IT01FLgoKWW91IGNhbiB1c2UgdGhpcyB0byBpbnN0YWxsIENMSSB1dGlsaXRpZXMgZ2xvYmFsbHksIGFsbCB5b3UgbmVlZAppcyB0byBhZGQgdGhlIENPTVBPU0VSX0hPTUUvdmVuZG9yL2JpbiBkaXIgdG8geW91ciBQQVRIIGVudiB2YXIuCgpDT01QT1NFUl9IT01FIGlzIGM6XFVzZXJzXDx1c2VyPlxBcHBEYXRhXFJvYW1pbmdcQ29tcG9zZXIgb24gV2luZG93cwphbmQgL2hvbWUvPHVzZXI+Ly5jb21wb3NlciBvbiB1bml4IHN5c3RlbXMuCgpJZiB5b3VyIHN5c3RlbSB1c2VzIGZyZWVkZXNrdG9wLm9yZyBzdGFuZGFyZHMsIHRoZW4gaXQgd2lsbCBmaXJzdCBjaGVjawpYREdfQ09ORklHX0hPTUUgb3IgZGVmYXVsdCB0byAvaG9tZS88dXNlcj4vLmNvbmZpZy9jb21wb3NlcgoKTm90ZTogVGhpcyBwYXRoIG1heSB2YXJ5IGRlcGVuZGluZyBvbiBjdXN0b21pemF0aW9ucyB0byBiaW4tZGlyIGluCmNvbXBvc2VyLmpzb24gb3IgdGhlIGVudmlyb25tZW50YWwgdmFyaWFibGUgQ09NUE9TRVJfQklOX0RJUi4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI2dsb2JhbApFT1QKKQo7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBydW4oSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CgppZiAoIW1ldGhvZF9leGlzdHMoJGlucHV0LCAnX190b1N0cmluZycpKSB7IAp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdFeHBlY3RlZCBhbiBJbnB1dCBpbnN0YW5jZSB0aGF0IGlzIHN0cmluZ2FibGUsIGdvdCAnLmdldF9jbGFzcygkaW5wdXQpKTsKfQoKCiR0b2tlbnMgPSBQcmVnOjpzcGxpdCgne1xzK30nLCAkaW5wdXQtPl9fdG9TdHJpbmcoKSk7CiRhcmdzID0gW107CmZvcmVhY2ggKCR0b2tlbnMgYXMgJHRva2VuKSB7CmlmICgkdG9rZW4gJiYgJHRva2VuWzBdICE9PSAnLScpIHsKJGFyZ3NbXSA9ICR0b2tlbjsKaWYgKGNvdW50KCRhcmdzKSA+PSAyKSB7CmJyZWFrOwp9Cn0KfQoKCmlmIChjb3VudCgkYXJncykgPCAyKSB7CnJldHVybiBwYXJlbnQ6OnJ1bigkaW5wdXQsICRvdXRwdXQpOwp9CgokaW5wdXQgPSAkdGhpcy0+cHJlcGFyZVN1YmNvbW1hbmRJbnB1dCgkaW5wdXQpOwoKcmV0dXJuICR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5ydW4oJGlucHV0LCAkb3V0cHV0KTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBwcmVwYXJlU3ViY29tbWFuZElucHV0KElucHV0SW50ZXJmYWNlICRpbnB1dCwgYm9vbCAkcXVpZXQgPSBmYWxzZSk6IFN0cmluZ0lucHV0CnsKCmlmICghbWV0aG9kX2V4aXN0cygkaW5wdXQsICdfX3RvU3RyaW5nJykpIHsgCnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0V4cGVjdGVkIGFuIElucHV0IGluc3RhbmNlIHRoYXQgaXMgc3RyaW5nYWJsZSwgZ290ICcuZ2V0X2NsYXNzKCRpbnB1dCkpOwp9CgoKaWYgKFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSJykpIHsKUGxhdGZvcm06OmNsZWFyRW52KCdDT01QT1NFUicpOwp9CgoKJGNvbmZpZyA9IEZhY3Rvcnk6OmNyZWF0ZUNvbmZpZygpOwokaG9tZSA9ICRjb25maWctPmdldCgnaG9tZScpOwoKaWYgKCFpc19kaXIoJGhvbWUpKSB7CiRmcyA9IG5ldyBGaWxlc3lzdGVtKCk7CiRmcy0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKCRob21lKTsKaWYgKCFpc19kaXIoJGhvbWUpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IGNyZWF0ZSBob21lIGRpcmVjdG9yeScpOwp9Cn0KCnRyeSB7CmNoZGlyKCRob21lKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBzd2l0Y2ggdG8gaG9tZSBkaXJlY3RvcnkgIicuJGhvbWUuJyInLCAwLCAkZSk7Cn0KaWYgKCEkcXVpZXQpIHsKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJzxpbmZvPkNoYW5nZWQgY3VycmVudCBkaXJlY3RvcnkgdG8gJy4kaG9tZS4nPC9pbmZvPicpOwp9CgoKJGlucHV0ID0gbmV3IFN0cmluZ0lucHV0KFByZWc6OnJlcGxhY2UoJ3tcYmcoPzpsKD86byg/OmIoPzphKD86bCk/KT8pPyk/KT9cYn0nLCAnJywgJGlucHV0LT5fX3RvU3RyaW5nKCksIDEpKTsKJHRoaXMtPmdldEFwcGxpY2F0aW9uKCktPnJlc2V0Q29tcG9zZXIoKTsKCnJldHVybiAkaW5wdXQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1Byb3h5Q29tbWFuZCgpOiBib29sCnsKcmV0dXJuIHRydWU7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUm9vdFBhY2thZ2VSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5RmFjdG9yeTsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKY2xhc3MgSG9tZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnVzZSBDb21wbGV0aW9uVHJhaXQ7CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ2Jyb3dzZScpCi0+c2V0QWxpYXNlcyhbJ2hvbWUnXSkKLT5zZXREZXNjcmlwdGlvbignT3BlbnMgdGhlIHBhY2thZ2VcJ3MgcmVwb3NpdG9yeSBVUkwgb3IgaG9tZXBhZ2UgaW4geW91ciBicm93c2VyJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0QXJndW1lbnQoJ3BhY2thZ2VzJywgSW5wdXRBcmd1bWVudDo6SVNfQVJSQVksICdQYWNrYWdlKHMpIHRvIGJyb3dzZSB0by4nLCBudWxsLCAkdGhpcy0+c3VnZ2VzdEluc3RhbGxlZFBhY2thZ2UoKSksCm5ldyBJbnB1dE9wdGlvbignaG9tZXBhZ2UnLCAnSCcsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT3BlbiB0aGUgaG9tZXBhZ2UgaW5zdGVhZCBvZiB0aGUgcmVwb3NpdG9yeSBVUkwuJyksCm5ldyBJbnB1dE9wdGlvbignc2hvdycsICdzJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPbmx5IHNob3cgdGhlIGhvbWVwYWdlIG9yIHJlcG9zaXRvcnkgVVJMLicpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgaG9tZSBjb21tYW5kIG9wZW5zIG9yIHNob3dzIGEgcGFja2FnZSdzIHJlcG9zaXRvcnkgVVJMIG9yCmhvbWVwYWdlIGluIHlvdXIgZGVmYXVsdCBicm93c2VyLgoKVG8gb3BlbiB0aGUgaG9tZXBhZ2UgYnkgZGVmYXVsdCwgdXNlIC1IIG9yIC0taG9tZXBhZ2UuClRvIHNob3cgaW5zdGVhZCBvZiBvcGVuIHRoZSByZXBvc2l0b3J5IG9yIGhvbWVwYWdlIFVSTCwgdXNlIC1zIG9yIC0tc2hvdy4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI2Jyb3dzZS1ob21lCkVPVAopOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJHJlcG9zID0gJHRoaXMtPmluaXRpYWxpemVSZXBvcygpOwokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKJHJldHVybiA9IDA7CgokcGFja2FnZXMgPSAkaW5wdXQtPmdldEFyZ3VtZW50KCdwYWNrYWdlcycpOwppZiAoY291bnQoJHBhY2thZ2VzKSA9PT0gMCkgewokaW8tPndyaXRlRXJyb3IoJ05vIHBhY2thZ2Ugc3BlY2lmaWVkLCBvcGVuaW5nIGhvbWVwYWdlIGZvciB0aGUgcm9vdCBwYWNrYWdlJyk7CiRwYWNrYWdlcyA9IFskdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCktPmdldFBhY2thZ2UoKS0+Z2V0TmFtZSgpXTsKfQoKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlTmFtZSkgewokaGFuZGxlZCA9IGZhbHNlOwokcGFja2FnZUV4aXN0cyA9IGZhbHNlOwpmb3JlYWNoICgkcmVwb3MgYXMgJHJlcG8pIHsKZm9yZWFjaCAoJHJlcG8tPmZpbmRQYWNrYWdlcygkcGFja2FnZU5hbWUpIGFzICRwYWNrYWdlKSB7CiRwYWNrYWdlRXhpc3RzID0gdHJ1ZTsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICYmICR0aGlzLT5oYW5kbGVQYWNrYWdlKCRwYWNrYWdlLCAkaW5wdXQtPmdldE9wdGlvbignaG9tZXBhZ2UnKSwgJGlucHV0LT5nZXRPcHRpb24oJ3Nob3cnKSkpIHsKJGhhbmRsZWQgPSB0cnVlOwpicmVhayAyOwp9Cn0KfQoKaWYgKCEkcGFja2FnZUV4aXN0cykgewokcmV0dXJuID0gMTsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5QYWNrYWdlICcuJHBhY2thZ2VOYW1lLicgbm90IGZvdW5kPC93YXJuaW5nPicpOwp9CgppZiAoISRoYW5kbGVkKSB7CiRyZXR1cm4gPSAxOwokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPicuKCRpbnB1dC0+Z2V0T3B0aW9uKCdob21lcGFnZScpID8gJ0ludmFsaWQgb3IgbWlzc2luZyBob21lcGFnZScgOiAnSW52YWxpZCBvciBtaXNzaW5nIHJlcG9zaXRvcnkgVVJMJykuJyBmb3IgJy4kcGFja2FnZU5hbWUuJzwvd2FybmluZz4nKTsKfQp9CgpyZXR1cm4gJHJldHVybjsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBoYW5kbGVQYWNrYWdlKENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgYm9vbCAkc2hvd0hvbWVwYWdlLCBib29sICRzaG93T25seSk6IGJvb2wKewokc3VwcG9ydCA9ICRwYWNrYWdlLT5nZXRTdXBwb3J0KCk7CiR1cmwgPSAkc3VwcG9ydFsnc291cmNlJ10gPz8gJHBhY2thZ2UtPmdldFNvdXJjZVVybCgpOwppZiAoISR1cmwgfHwgJHNob3dIb21lcGFnZSkgewokdXJsID0gJHBhY2thZ2UtPmdldEhvbWVwYWdlKCk7Cn0KCmlmICghJHVybCB8fCAhZmlsdGVyX3ZhcigkdXJsLCBGSUxURVJfVkFMSURBVEVfVVJMKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICgkc2hvd09ubHkpIHsKJHRoaXMtPmdldElPKCktPndyaXRlKHNwcmludGYoJzxpbmZvPiVzPC9pbmZvPicsICR1cmwpKTsKfSBlbHNlIHsKJHRoaXMtPm9wZW5Ccm93c2VyKCR1cmwpOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBvcGVuQnJvd3NlcihzdHJpbmcgJHVybCk6IHZvaWQKewokcHJvY2VzcyA9IG5ldyBQcm9jZXNzRXhlY3V0b3IoJHRoaXMtPmdldElPKCkpOwppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CiRwcm9jZXNzLT5leGVjdXRlKFsnc3RhcnQnLCAnIndlYiInLCAnZXhwbG9yZXInLCAkdXJsXSwgJG91dHB1dCk7CgpyZXR1cm47Cn0KCiRsaW51eCA9ICRwcm9jZXNzLT5leGVjdXRlKFsnd2hpY2gnLCAneGRnLW9wZW4nXSwgJG91dHB1dCk7CiRvc3ggPSAkcHJvY2Vzcy0+ZXhlY3V0ZShbJ3doaWNoJywgJ29wZW4nXSwgJG91dHB1dCk7CgppZiAoMCA9PT0gJGxpbnV4KSB7CiRwcm9jZXNzLT5leGVjdXRlKFsneGRnLW9wZW4nLCAkdXJsXSwgJG91dHB1dCk7Cn0gZWxzZWlmICgwID09PSAkb3N4KSB7CiRwcm9jZXNzLT5leGVjdXRlKFsnb3BlbicsICR1cmxdLCAkb3V0cHV0KTsKfSBlbHNlIHsKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJ05vIHN1aXRhYmxlIGJyb3dzZXIgb3BlbmluZyBjb21tYW5kIGZvdW5kLCBvcGVuIHlvdXJzZWxmOiAnIC4gJHVybCk7Cn0KfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gaW5pdGlhbGl6ZVJlcG9zKCk6IGFycmF5CnsKJGNvbXBvc2VyID0gJHRoaXMtPnRyeUNvbXBvc2VyKCk7CgppZiAoJGNvbXBvc2VyKSB7CnJldHVybiBhcnJheV9tZXJnZSgKW25ldyBSb290UGFja2FnZVJlcG9zaXRvcnkoY2xvbmUgJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCkpXSwgClskY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpXSwgCiRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0UmVwb3NpdG9yaWVzKCkgCik7Cn0KCnJldHVybiBSZXBvc2l0b3J5RmFjdG9yeTo6ZGVmYXVsdFJlcG9zV2l0aERlZmF1bHRNYW5hZ2VyKCR0aGlzLT5nZXRJTygpKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXEZhY3Rvcnk7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uVmFsaWRhdGlvbkV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XENvbXBvc2l0ZVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUZhY3Rvcnk7CnVzZSBDb21wb3NlclxTcGR4XFNwZHhMaWNlbnNlczsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcU2lsZW5jZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XEFycmF5SW5wdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcRm9ybWF0dGVySGVscGVyOwoKCgoKCmNsYXNzIEluaXRDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewp1c2UgQ29tcGxldGlvblRyYWl0Owp1c2UgUGFja2FnZURpc2NvdmVyeVRyYWl0OwoKCnByaXZhdGUgJGdpdENvbmZpZzsKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgnaW5pdCcpCi0+c2V0RGVzY3JpcHRpb24oJ0NyZWF0ZXMgYSBiYXNpYyBjb21wb3Nlci5qc29uIGZpbGUgaW4gY3VycmVudCBkaXJlY3RvcnknKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRPcHRpb24oJ25hbWUnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdOYW1lIG9mIHRoZSBwYWNrYWdlJyksCm5ldyBJbnB1dE9wdGlvbignZGVzY3JpcHRpb24nLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdEZXNjcmlwdGlvbiBvZiBwYWNrYWdlJyksCm5ldyBJbnB1dE9wdGlvbignYXV0aG9yJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnQXV0aG9yIG5hbWUgb2YgcGFja2FnZScpLApuZXcgSW5wdXRPcHRpb24oJ3R5cGUnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdUeXBlIG9mIHBhY2thZ2UgKGUuZy4gbGlicmFyeSwgcHJvamVjdCwgbWV0YXBhY2thZ2UsIGNvbXBvc2VyLXBsdWdpbiknKSwKbmV3IElucHV0T3B0aW9uKCdob21lcGFnZScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0hvbWVwYWdlIG9mIHBhY2thZ2UnKSwKbmV3IElucHV0T3B0aW9uKCdyZXF1aXJlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZIHwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnUGFja2FnZSB0byByZXF1aXJlIHdpdGggYSB2ZXJzaW9uIGNvbnN0cmFpbnQsIGUuZy4gZm9vL2JhcjoxLjAuMCBvciBmb28vYmFyPTEuMC4wIG9yICJmb28vYmFyIDEuMC4wIicsIG51bGwsICR0aGlzLT5zdWdnZXN0QXZhaWxhYmxlUGFja2FnZUluY2xQbGF0Zm9ybSgpKSwKbmV3IElucHV0T3B0aW9uKCdyZXF1aXJlLWRldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9JU19BUlJBWSB8IElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1BhY2thZ2UgdG8gcmVxdWlyZSBmb3IgZGV2ZWxvcG1lbnQgd2l0aCBhIHZlcnNpb24gY29uc3RyYWludCwgZS5nLiBmb28vYmFyOjEuMC4wIG9yIGZvby9iYXI9MS4wLjAgb3IgImZvby9iYXIgMS4wLjAiJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RBdmFpbGFibGVQYWNrYWdlSW5jbFBsYXRmb3JtKCkpLApuZXcgSW5wdXRPcHRpb24oJ3N0YWJpbGl0eScsICdzJywgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnTWluaW11bSBzdGFiaWxpdHkgKGVtcHR5IG9yIG9uZSBvZjogJy5pbXBsb2RlKCcsICcsIGFycmF5X2tleXMoQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTKSkuJyknKSwKbmV3IElucHV0T3B0aW9uKCdsaWNlbnNlJywgJ2wnLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdMaWNlbnNlIG9mIHBhY2thZ2UnKSwKbmV3IElucHV0T3B0aW9uKCdyZXBvc2l0b3J5JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVEIHwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZLCAnQWRkIGN1c3RvbSByZXBvc2l0b3JpZXMsIGVpdGhlciBieSBVUkwgb3IgdXNpbmcgSlNPTiBhcnJheXMnKSwKbmV3IElucHV0T3B0aW9uKCdhdXRvbG9hZCcsICdhJywgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnQWRkIFBTUi00IGF1dG9sb2FkIG1hcHBpbmcuIE1hcHMgeW91ciBwYWNrYWdlXCdzIG5hbWVzcGFjZSB0byB0aGUgcHJvdmlkZWQgZGlyZWN0b3J5LiAoRXhwZWN0cyBhIHJlbGF0aXZlIHBhdGgsIGUuZy4gc3JjLyknKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIDxpbmZvPmluaXQ8L2luZm8+IGNvbW1hbmQgY3JlYXRlcyBhIGJhc2ljIGNvbXBvc2VyLmpzb24gZmlsZQppbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCgo8aW5mbz5waHAgY29tcG9zZXIucGhhciBpbml0PC9pbmZvPgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjaW5pdApFT1QKKQo7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCiRhbGxvd2xpc3QgPSBbJ25hbWUnLCAnZGVzY3JpcHRpb24nLCAnYXV0aG9yJywgJ3R5cGUnLCAnaG9tZXBhZ2UnLCAncmVxdWlyZScsICdyZXF1aXJlLWRldicsICdzdGFiaWxpdHknLCAnbGljZW5zZScsICdhdXRvbG9hZCddOwokb3B0aW9ucyA9IGFycmF5X2ZpbHRlcihhcnJheV9pbnRlcnNlY3Rfa2V5KCRpbnB1dC0+Z2V0T3B0aW9ucygpLCBhcnJheV9mbGlwKCRhbGxvd2xpc3QpKSwgc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7IHJldHVybiAkdmFsICE9PSBudWxsICYmICR2YWwgIT09IFtdOyB9KTsKCmlmIChpc3NldCgkb3B0aW9uc1snbmFtZSddKSAmJiAhUHJlZzo6aXNNYXRjaCgne15bYS16MC05XShbXy4tXT9bYS16MC05XSspKlwvW2EtejAtOV0oKFtfLl18LXsxLDJ9KT9bYS16MC05XSspKiR9RCcsICRvcHRpb25zWyduYW1lJ10pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKAonVGhlIHBhY2thZ2UgbmFtZSAnLiRvcHRpb25zWyduYW1lJ10uJyBpcyBpbnZhbGlkLCBpdCBzaG91bGQgYmUgbG93ZXJjYXNlIGFuZCBoYXZlIGEgdmVuZG9yIG5hbWUsIGEgZm9yd2FyZCBzbGFzaCwgYW5kIGEgcGFja2FnZSBuYW1lLCBtYXRjaGluZzogW2EtejAtOV8uLV0rL1thLXowLTlfLi1dKycKKTsKfQoKaWYgKGlzc2V0KCRvcHRpb25zWydhdXRob3InXSkpIHsKJG9wdGlvbnNbJ2F1dGhvcnMnXSA9ICR0aGlzLT5mb3JtYXRBdXRob3JzKCRvcHRpb25zWydhdXRob3InXSk7CnVuc2V0KCRvcHRpb25zWydhdXRob3InXSk7Cn0KCiRyZXBvc2l0b3JpZXMgPSAkaW5wdXQtPmdldE9wdGlvbigncmVwb3NpdG9yeScpOwppZiAoY291bnQoJHJlcG9zaXRvcmllcykgPiAwKSB7CiRjb25maWcgPSBGYWN0b3J5OjpjcmVhdGVDb25maWcoJGlvKTsKZm9yZWFjaCAoJHJlcG9zaXRvcmllcyBhcyAkcmVwbykgewokb3B0aW9uc1sncmVwb3NpdG9yaWVzJ11bXSA9IFJlcG9zaXRvcnlGYWN0b3J5Ojpjb25maWdGcm9tU3RyaW5nKCRpbywgJGNvbmZpZywgJHJlcG8sIHRydWUpOwp9Cn0KCmlmIChpc3NldCgkb3B0aW9uc1snc3RhYmlsaXR5J10pKSB7CiRvcHRpb25zWydtaW5pbXVtLXN0YWJpbGl0eSddID0gJG9wdGlvbnNbJ3N0YWJpbGl0eSddOwp1bnNldCgkb3B0aW9uc1snc3RhYmlsaXR5J10pOwp9Cgokb3B0aW9uc1sncmVxdWlyZSddID0gaXNzZXQoJG9wdGlvbnNbJ3JlcXVpcmUnXSkgPyAkdGhpcy0+Zm9ybWF0UmVxdWlyZW1lbnRzKCRvcHRpb25zWydyZXF1aXJlJ10pIDogbmV3IFxzdGRDbGFzczsKaWYgKFtdID09PSAkb3B0aW9uc1sncmVxdWlyZSddKSB7CiRvcHRpb25zWydyZXF1aXJlJ10gPSBuZXcgXHN0ZENsYXNzOwp9CgppZiAoaXNzZXQoJG9wdGlvbnNbJ3JlcXVpcmUtZGV2J10pKSB7CiRvcHRpb25zWydyZXF1aXJlLWRldiddID0gJHRoaXMtPmZvcm1hdFJlcXVpcmVtZW50cygkb3B0aW9uc1sncmVxdWlyZS1kZXYnXSk7CmlmIChbXSA9PT0gJG9wdGlvbnNbJ3JlcXVpcmUtZGV2J10pIHsKJG9wdGlvbnNbJ3JlcXVpcmUtZGV2J10gPSBuZXcgXHN0ZENsYXNzOwp9Cn0KCgokYXV0b2xvYWRQYXRoID0gbnVsbDsKaWYgKGlzc2V0KCRvcHRpb25zWydhdXRvbG9hZCddKSkgewokYXV0b2xvYWRQYXRoID0gJG9wdGlvbnNbJ2F1dG9sb2FkJ107CiRuYW1lc3BhY2UgPSAkdGhpcy0+bmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKChzdHJpbmcpICRpbnB1dC0+Z2V0T3B0aW9uKCduYW1lJykpOwokb3B0aW9uc1snYXV0b2xvYWQnXSA9IChvYmplY3QpIFsKJ3Bzci00JyA9PiBbCiRuYW1lc3BhY2UgLiAnXFwnID0+ICRhdXRvbG9hZFBhdGgsCl0sCl07Cn0KCiRmaWxlID0gbmV3IEpzb25GaWxlKEZhY3Rvcnk6OmdldENvbXBvc2VyRmlsZSgpKTsKJGpzb24gPSBKc29uRmlsZTo6ZW5jb2RlKCRvcHRpb25zKTsKCmlmICgkaW5wdXQtPmlzSW50ZXJhY3RpdmUoKSkgewokaW8tPndyaXRlRXJyb3IoWycnLCAkanNvbiwgJyddKTsKaWYgKCEkaW8tPmFza0NvbmZpcm1hdGlvbignRG8geW91IGNvbmZpcm0gZ2VuZXJhdGlvbiBbPGNvbW1lbnQ+eWVzPC9jb21tZW50Pl0/ICcpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPkNvbW1hbmQgYWJvcnRlZDwvZXJyb3I+Jyk7CgpyZXR1cm4gMTsKfQp9IGVsc2UgewokaW8tPndyaXRlRXJyb3IoJ1dyaXRpbmcgJy4kZmlsZS0+Z2V0UGF0aCgpKTsKfQoKJGZpbGUtPndyaXRlKCRvcHRpb25zKTsKdHJ5IHsKJGZpbGUtPnZhbGlkYXRlU2NoZW1hKEpzb25GaWxlOjpMQVhfU0NIRU1BKTsKfSBjYXRjaCAoSnNvblZhbGlkYXRpb25FeGNlcHRpb24gJGUpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+U2NoZW1hIHZhbGlkYXRpb24gZXJyb3IsIGFib3J0aW5nPC9lcnJvcj4nKTsKJGVycm9ycyA9ICcgLSAnIC4gaW1wbG9kZShQSFBfRU9MIC4gJyAtICcsICRlLT5nZXRFcnJvcnMoKSk7CiRpby0+d3JpdGVFcnJvcigkZS0+Z2V0TWVzc2FnZSgpIC4gJzonIC4gUEhQX0VPTCAuICRlcnJvcnMpOwpTaWxlbmNlcjo6Y2FsbCgndW5saW5rJywgJGZpbGUtPmdldFBhdGgoKSk7CgpyZXR1cm4gMTsKfQoKCmlmICgkYXV0b2xvYWRQYXRoKSB7CiRmaWxlc3lzdGVtID0gbmV3IEZpbGVzeXN0ZW0oKTsKJGZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkYXV0b2xvYWRQYXRoKTsKCgppZiAoISR0aGlzLT5oYXNEZXBlbmRlbmNpZXMoJG9wdGlvbnMpKSB7CiR0aGlzLT5ydW5EdW1wQXV0b2xvYWRDb21tYW5kKCRvdXRwdXQpOwp9Cn0KCmlmICgkaW5wdXQtPmlzSW50ZXJhY3RpdmUoKSAmJiBpc19kaXIoJy5naXQnKSkgewokaWdub3JlRmlsZSA9IHJlYWxwYXRoKCcuZ2l0aWdub3JlJyk7CgppZiAoZmFsc2UgPT09ICRpZ25vcmVGaWxlKSB7CiRpZ25vcmVGaWxlID0gcmVhbHBhdGgoJy4nKSAuICcvLmdpdGlnbm9yZSc7Cn0KCmlmICghJHRoaXMtPmhhc1ZlbmRvcklnbm9yZSgkaWdub3JlRmlsZSkpIHsKJHF1ZXN0aW9uID0gJ1dvdWxkIHlvdSBsaWtlIHRoZSA8aW5mbz52ZW5kb3I8L2luZm8+IGRpcmVjdG9yeSBhZGRlZCB0byB5b3VyIDxpbmZvPi5naXRpZ25vcmU8L2luZm8+IFs8Y29tbWVudD55ZXM8L2NvbW1lbnQ+XT8gJzsKCmlmICgkaW8tPmFza0NvbmZpcm1hdGlvbigkcXVlc3Rpb24pKSB7CiR0aGlzLT5hZGRWZW5kb3JJZ25vcmUoJGlnbm9yZUZpbGUpOwp9Cn0KfQoKJHF1ZXN0aW9uID0gJ1dvdWxkIHlvdSBsaWtlIHRvIGluc3RhbGwgZGVwZW5kZW5jaWVzIG5vdyBbPGNvbW1lbnQ+eWVzPC9jb21tZW50Pl0/ICc7CmlmICgkaW5wdXQtPmlzSW50ZXJhY3RpdmUoKSAmJiAkdGhpcy0+aGFzRGVwZW5kZW5jaWVzKCRvcHRpb25zKSAmJiAkaW8tPmFza0NvbmZpcm1hdGlvbigkcXVlc3Rpb24pKSB7CiR0aGlzLT51cGRhdGVEZXBlbmRlbmNpZXMoJG91dHB1dCk7Cn0KCgppZiAoJGF1dG9sb2FkUGF0aCkgewokbmFtZXNwYWNlID0gJHRoaXMtPm5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZSgoc3RyaW5nKSAkaW5wdXQtPmdldE9wdGlvbignbmFtZScpKTsKCiRpby0+d3JpdGVFcnJvcignUFNSLTQgYXV0b2xvYWRpbmcgY29uZmlndXJlZC4gVXNlICI8Y29tbWVudD5uYW1lc3BhY2UgJy4kbmFtZXNwYWNlLic7PC9jb21tZW50PiIgaW4gJy4kYXV0b2xvYWRQYXRoKTsKJGlvLT53cml0ZUVycm9yKCdJbmNsdWRlIHRoZSBDb21wb3NlciBhdXRvbG9hZGVyIHdpdGg6IDxjb21tZW50PnJlcXVpcmUgXCd2ZW5kb3IvYXV0b2xvYWQucGhwXCc7PC9jb21tZW50PicpOwp9CgpyZXR1cm4gMDsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluaXRpYWxpemUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IHZvaWQKewpwYXJlbnQ6OmluaXRpYWxpemUoJGlucHV0LCAkb3V0cHV0KTsKCmlmICghJGlucHV0LT5pc0ludGVyYWN0aXZlKCkpIHsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduYW1lJykgPT09IG51bGwpIHsKJGlucHV0LT5zZXRPcHRpb24oJ25hbWUnLCAkdGhpcy0+Z2V0RGVmYXVsdFBhY2thZ2VOYW1lKCkpOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2F1dGhvcicpID09PSBudWxsKSB7CiRpbnB1dC0+c2V0T3B0aW9uKCdhdXRob3InLCAkdGhpcy0+Z2V0RGVmYXVsdEF1dGhvcigpKTsKfQp9Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpbnRlcmFjdChJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogdm9pZAp7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwoKJGZvcm1hdHRlciA9ICR0aGlzLT5nZXRIZWxwZXJTZXQoKS0+Z2V0KCdmb3JtYXR0ZXInKTsKCgokcmVwb3NpdG9yaWVzID0gJGlucHV0LT5nZXRPcHRpb24oJ3JlcG9zaXRvcnknKTsKaWYgKGNvdW50KCRyZXBvc2l0b3JpZXMpID4gMCkgewokY29uZmlnID0gRmFjdG9yeTo6Y3JlYXRlQ29uZmlnKCRpbyk7CiRpby0+bG9hZENvbmZpZ3VyYXRpb24oJGNvbmZpZyk7CiRyZXBvTWFuYWdlciA9IFJlcG9zaXRvcnlGYWN0b3J5OjptYW5hZ2VyKCRpbywgJGNvbmZpZyk7CgokcmVwb3MgPSBbbmV3IFBsYXRmb3JtUmVwb3NpdG9yeV07CiRjcmVhdGVEZWZhdWx0UGFja2FnaXN0UmVwbyA9IHRydWU7CmZvcmVhY2ggKCRyZXBvc2l0b3JpZXMgYXMgJHJlcG8pIHsKJHJlcG9Db25maWcgPSBSZXBvc2l0b3J5RmFjdG9yeTo6Y29uZmlnRnJvbVN0cmluZygkaW8sICRjb25maWcsICRyZXBvLCB0cnVlKTsKaWYgKAooaXNzZXQoJHJlcG9Db25maWdbJ3BhY2thZ2lzdCddKSAmJiAkcmVwb0NvbmZpZyA9PT0gWydwYWNrYWdpc3QnID0+IGZhbHNlXSkKfHwgKGlzc2V0KCRyZXBvQ29uZmlnWydwYWNrYWdpc3Qub3JnJ10pICYmICRyZXBvQ29uZmlnID09PSBbJ3BhY2thZ2lzdC5vcmcnID0+IGZhbHNlXSkKKSB7CiRjcmVhdGVEZWZhdWx0UGFja2FnaXN0UmVwbyA9IGZhbHNlOwpjb250aW51ZTsKfQokcmVwb3NbXSA9IFJlcG9zaXRvcnlGYWN0b3J5OjpjcmVhdGVSZXBvKCRpbywgJGNvbmZpZywgJHJlcG9Db25maWcsICRyZXBvTWFuYWdlcik7Cn0KCmlmICgkY3JlYXRlRGVmYXVsdFBhY2thZ2lzdFJlcG8pIHsKJHJlcG9zW10gPSBSZXBvc2l0b3J5RmFjdG9yeTo6Y3JlYXRlUmVwbygkaW8sICRjb25maWcsIFsKJ3R5cGUnID0+ICdjb21wb3NlcicsCid1cmwnID0+ICdodHRwczovL3JlcG8ucGFja2FnaXN0Lm9yZycsCl0sICRyZXBvTWFuYWdlcik7Cn0KCiR0aGlzLT5yZXBvcyA9IG5ldyBDb21wb3NpdGVSZXBvc2l0b3J5KCRyZXBvcyk7CnVuc2V0KCRyZXBvcywgJGNvbmZpZywgJHJlcG9zaXRvcmllcyk7Cn0KCiRpby0+d3JpdGVFcnJvcihbCicnLAokZm9ybWF0dGVyLT5mb3JtYXRCbG9jaygnV2VsY29tZSB0byB0aGUgQ29tcG9zZXIgY29uZmlnIGdlbmVyYXRvcicsICdiZz1ibHVlO2ZnPXdoaXRlJywgdHJ1ZSksCicnLApdKTsKCgokaW8tPndyaXRlRXJyb3IoWwonJywKJ1RoaXMgY29tbWFuZCB3aWxsIGd1aWRlIHlvdSB0aHJvdWdoIGNyZWF0aW5nIHlvdXIgY29tcG9zZXIuanNvbiBjb25maWcuJywKJycsCl0pOwoKJG5hbWUgPSAkaW5wdXQtPmdldE9wdGlvbignbmFtZScpID8/ICR0aGlzLT5nZXREZWZhdWx0UGFja2FnZU5hbWUoKTsKCiRuYW1lID0gJGlvLT5hc2tBbmRWYWxpZGF0ZSgKJ1BhY2thZ2UgbmFtZSAoPHZlbmRvcj4vPG5hbWU+KSBbPGNvbW1lbnQ+Jy4kbmFtZS4nPC9jb21tZW50Pl06ICcsCnN0YXRpYyBmdW5jdGlvbiAoJHZhbHVlKSB1c2UgKCRuYW1lKSB7CmlmIChudWxsID09PSAkdmFsdWUpIHsKcmV0dXJuICRuYW1lOwp9CgppZiAoIVByZWc6OmlzTWF0Y2goJ3teW2EtejAtOV0oW18uLV0/W2EtejAtOV0rKSpcL1thLXowLTldKChbXy5dfC17MSwyfSk/W2EtejAtOV0rKSokfUQnLCAkdmFsdWUpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKAonVGhlIHBhY2thZ2UgbmFtZSAnLiR2YWx1ZS4nIGlzIGludmFsaWQsIGl0IHNob3VsZCBiZSBsb3dlcmNhc2UgYW5kIGhhdmUgYSB2ZW5kb3IgbmFtZSwgYSBmb3J3YXJkIHNsYXNoLCBhbmQgYSBwYWNrYWdlIG5hbWUsIG1hdGNoaW5nOiBbYS16MC05Xy4tXSsvW2EtejAtOV8uLV0rJwopOwp9CgpyZXR1cm4gJHZhbHVlOwp9LApudWxsLAokbmFtZQopOwokaW5wdXQtPnNldE9wdGlvbignbmFtZScsICRuYW1lKTsKCiRkZXNjcmlwdGlvbiA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdkZXNjcmlwdGlvbicpID86IG51bGw7CiRkZXNjcmlwdGlvbiA9ICRpby0+YXNrKAonRGVzY3JpcHRpb24gWzxjb21tZW50PicuJGRlc2NyaXB0aW9uLic8L2NvbW1lbnQ+XTogJywKJGRlc2NyaXB0aW9uCik7CiRpbnB1dC0+c2V0T3B0aW9uKCdkZXNjcmlwdGlvbicsICRkZXNjcmlwdGlvbik7CgokYXV0aG9yID0gJGlucHV0LT5nZXRPcHRpb24oJ2F1dGhvcicpID8/ICR0aGlzLT5nZXREZWZhdWx0QXV0aG9yKCk7CgokYXV0aG9yID0gJGlvLT5hc2tBbmRWYWxpZGF0ZSgKJ0F1dGhvciBbJy4oaXNfc3RyaW5nKCRhdXRob3IpID8gJzxjb21tZW50PicuJGF1dGhvci4nPC9jb21tZW50PiwgJyA6ICcnKSAuICduIHRvIHNraXBdOiAnLApmdW5jdGlvbiAoJHZhbHVlKSB1c2UgKCRhdXRob3IpIHsKaWYgKCR2YWx1ZSA9PT0gJ24nIHx8ICR2YWx1ZSA9PT0gJ25vJykgewpyZXR1cm47Cn0KJHZhbHVlID0gJHZhbHVlID86ICRhdXRob3I7CiRhdXRob3IgPSAkdGhpcy0+cGFyc2VBdXRob3JTdHJpbmcoJHZhbHVlID8/ICcnKTsKCmlmICgkYXV0aG9yWydlbWFpbCddID09PSBudWxsKSB7CnJldHVybiAkYXV0aG9yWyduYW1lJ107Cn0KCnJldHVybiBzcHJpbnRmKCclcyA8JXM+JywgJGF1dGhvclsnbmFtZSddLCAkYXV0aG9yWydlbWFpbCddKTsKfSwKbnVsbCwKJGF1dGhvcgopOwokaW5wdXQtPnNldE9wdGlvbignYXV0aG9yJywgJGF1dGhvcik7CgokbWluaW11bVN0YWJpbGl0eSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdzdGFiaWxpdHknKSA/OiBudWxsOwokbWluaW11bVN0YWJpbGl0eSA9ICRpby0+YXNrQW5kVmFsaWRhdGUoCidNaW5pbXVtIFN0YWJpbGl0eSBbPGNvbW1lbnQ+Jy4kbWluaW11bVN0YWJpbGl0eS4nPC9jb21tZW50Pl06ICcsCnN0YXRpYyBmdW5jdGlvbiAoJHZhbHVlKSB1c2UgKCRtaW5pbXVtU3RhYmlsaXR5KSB7CmlmIChudWxsID09PSAkdmFsdWUpIHsKcmV0dXJuICRtaW5pbXVtU3RhYmlsaXR5Owp9CgppZiAoIWlzc2V0KEJhc2VQYWNrYWdlOjpTVEFCSUxJVElFU1skdmFsdWVdKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigKJ0ludmFsaWQgbWluaW11bSBzdGFiaWxpdHkgIicuJHZhbHVlLiciLiBNdXN0IGJlIGVtcHR5IG9yIG9uZSBvZjogJy4KaW1wbG9kZSgnLCAnLCBhcnJheV9rZXlzKEJhc2VQYWNrYWdlOjpTVEFCSUxJVElFUykpCik7Cn0KCnJldHVybiAkdmFsdWU7Cn0sCm51bGwsCiRtaW5pbXVtU3RhYmlsaXR5Cik7CiRpbnB1dC0+c2V0T3B0aW9uKCdzdGFiaWxpdHknLCAkbWluaW11bVN0YWJpbGl0eSk7CgokdHlwZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCd0eXBlJyk7CiR0eXBlID0gJGlvLT5hc2soCidQYWNrYWdlIFR5cGUgKGUuZy4gbGlicmFyeSwgcHJvamVjdCwgbWV0YXBhY2thZ2UsIGNvbXBvc2VyLXBsdWdpbikgWzxjb21tZW50PicuJHR5cGUuJzwvY29tbWVudD5dOiAnLAokdHlwZQopOwppZiAoJHR5cGUgPT09ICcnIHx8ICR0eXBlID09PSBmYWxzZSkgewokdHlwZSA9IG51bGw7Cn0KJGlucHV0LT5zZXRPcHRpb24oJ3R5cGUnLCAkdHlwZSk7CgppZiAobnVsbCA9PT0gJGxpY2Vuc2UgPSAkaW5wdXQtPmdldE9wdGlvbignbGljZW5zZScpKSB7CmlmICghZW1wdHkoJF9TRVJWRVJbJ0NPTVBPU0VSX0RFRkFVTFRfTElDRU5TRSddKSkgewokbGljZW5zZSA9ICRfU0VSVkVSWydDT01QT1NFUl9ERUZBVUxUX0xJQ0VOU0UnXTsKfQp9CgokbGljZW5zZSA9ICRpby0+YXNrKAonTGljZW5zZSBbPGNvbW1lbnQ+Jy4kbGljZW5zZS4nPC9jb21tZW50Pl06ICcsCiRsaWNlbnNlCik7CiRzcGR4ID0gbmV3IFNwZHhMaWNlbnNlcygpOwppZiAobnVsbCAhPT0gJGxpY2Vuc2UgJiYgISRzcGR4LT52YWxpZGF0ZSgkbGljZW5zZSkgJiYgJGxpY2Vuc2UgIT09ICdwcm9wcmlldGFyeScpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgbGljZW5zZSBwcm92aWRlZDogJy4kbGljZW5zZS4nLiBPbmx5IFNQRFggbGljZW5zZSBpZGVudGlmaWVycyAoaHR0cHM6Ly9zcGR4Lm9yZy9saWNlbnNlcy8pIG9yICJwcm9wcmlldGFyeSIgYXJlIGFjY2VwdGVkLicpOwp9CiRpbnB1dC0+c2V0T3B0aW9uKCdsaWNlbnNlJywgJGxpY2Vuc2UpOwoKJGlvLT53cml0ZUVycm9yKFsnJywgJ0RlZmluZSB5b3VyIGRlcGVuZGVuY2llcy4nLCAnJ10pOwoKCiRyZXBvcyA9ICR0aGlzLT5nZXRSZXBvcygpOwokcHJlZmVycmVkU3RhYmlsaXR5ID0gJG1pbmltdW1TdGFiaWxpdHkgPzogJ3N0YWJsZSc7CiRwbGF0Zm9ybVJlcG8gPSBudWxsOwppZiAoJHJlcG9zIGluc3RhbmNlb2YgQ29tcG9zaXRlUmVwb3NpdG9yeSkgewpmb3JlYWNoICgkcmVwb3MtPmdldFJlcG9zaXRvcmllcygpIGFzICRjYW5kaWRhdGVSZXBvKSB7CmlmICgkY2FuZGlkYXRlUmVwbyBpbnN0YW5jZW9mIFBsYXRmb3JtUmVwb3NpdG9yeSkgewokcGxhdGZvcm1SZXBvID0gJGNhbmRpZGF0ZVJlcG87CmJyZWFrOwp9Cn0KfQoKJHF1ZXN0aW9uID0gJ1dvdWxkIHlvdSBsaWtlIHRvIGRlZmluZSB5b3VyIGRlcGVuZGVuY2llcyAocmVxdWlyZSkgaW50ZXJhY3RpdmVseSBbPGNvbW1lbnQ+eWVzPC9jb21tZW50Pl0/ICc7CiRyZXF1aXJlID0gJGlucHV0LT5nZXRPcHRpb24oJ3JlcXVpcmUnKTsKJHJlcXVpcmVtZW50cyA9IFtdOwppZiAoY291bnQoJHJlcXVpcmUpID4gMCB8fCAkaW8tPmFza0NvbmZpcm1hdGlvbigkcXVlc3Rpb24pKSB7CiRyZXF1aXJlbWVudHMgPSAkdGhpcy0+ZGV0ZXJtaW5lUmVxdWlyZW1lbnRzKCRpbnB1dCwgJG91dHB1dCwgJHJlcXVpcmUsICRwbGF0Zm9ybVJlcG8sICRwcmVmZXJyZWRTdGFiaWxpdHkpOwp9CiRpbnB1dC0+c2V0T3B0aW9uKCdyZXF1aXJlJywgJHJlcXVpcmVtZW50cyk7CgokcXVlc3Rpb24gPSAnV291bGQgeW91IGxpa2UgdG8gZGVmaW5lIHlvdXIgZGV2IGRlcGVuZGVuY2llcyAocmVxdWlyZS1kZXYpIGludGVyYWN0aXZlbHkgWzxjb21tZW50PnllczwvY29tbWVudD5dPyAnOwokcmVxdWlyZURldiA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdyZXF1aXJlLWRldicpOwokZGV2UmVxdWlyZW1lbnRzID0gW107CmlmIChjb3VudCgkcmVxdWlyZURldikgPiAwIHx8ICRpby0+YXNrQ29uZmlybWF0aW9uKCRxdWVzdGlvbikpIHsKJGRldlJlcXVpcmVtZW50cyA9ICR0aGlzLT5kZXRlcm1pbmVSZXF1aXJlbWVudHMoJGlucHV0LCAkb3V0cHV0LCAkcmVxdWlyZURldiwgJHBsYXRmb3JtUmVwbywgJHByZWZlcnJlZFN0YWJpbGl0eSk7Cn0KJGlucHV0LT5zZXRPcHRpb24oJ3JlcXVpcmUtZGV2JywgJGRldlJlcXVpcmVtZW50cyk7CgoKJGF1dG9sb2FkID0gJGlucHV0LT5nZXRPcHRpb24oJ2F1dG9sb2FkJykgPzogJ3NyYy8nOwokbmFtZXNwYWNlID0gJHRoaXMtPm5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZSgoc3RyaW5nKSAkaW5wdXQtPmdldE9wdGlvbignbmFtZScpKTsKJGF1dG9sb2FkID0gJGlvLT5hc2tBbmRWYWxpZGF0ZSgKJ0FkZCBQU1ItNCBhdXRvbG9hZCBtYXBwaW5nPyBNYXBzIG5hbWVzcGFjZSAiJy4kbmFtZXNwYWNlLiciIHRvIHRoZSBlbnRlcmVkIHJlbGF0aXZlIHBhdGguIFs8Y29tbWVudD4nLiRhdXRvbG9hZC4nPC9jb21tZW50PiwgbiB0byBza2lwXTogJywKc3RhdGljIGZ1bmN0aW9uICgkdmFsdWUpIHVzZSAoJGF1dG9sb2FkKSB7CmlmIChudWxsID09PSAkdmFsdWUpIHsKcmV0dXJuICRhdXRvbG9hZDsKfQoKaWYgKCR2YWx1ZSA9PT0gJ24nIHx8ICR2YWx1ZSA9PT0gJ25vJykgewpyZXR1cm47Cn0KCiR2YWx1ZSA9ICR2YWx1ZSA/OiAkYXV0b2xvYWQ7CgppZiAoIVByZWc6OmlzTWF0Y2goJ3teW14vXVtBLVphLXowLTlcLV8vXSsvJH0nLCAkdmFsdWUpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoCidUaGUgc3JjIGZvbGRlciBuYW1lICIlcyIgaXMgaW52YWxpZC4gUGxlYXNlIGFkZCBhIHJlbGF0aXZlIHBhdGggd2l0aCB0YWlsaW5nIGZvcndhcmQgc2xhc2guIFtBLVphLXowLTlfLS9dKy8nLAokdmFsdWUKKSk7Cn0KCnJldHVybiAkdmFsdWU7Cn0sCm51bGwsCiRhdXRvbG9hZAopOwokaW5wdXQtPnNldE9wdGlvbignYXV0b2xvYWQnLCAkYXV0b2xvYWQpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHBhcnNlQXV0aG9yU3RyaW5nKHN0cmluZyAkYXV0aG9yKTogYXJyYXkKewppZiAoUHJlZzo6aXNNYXRjaCgnL14oP1A8bmFtZT5bLSAuLFxwe0x9XHB7Tn1ccHtNbn1cJ+KAmSIoKV0rKSg/OlxzKzwoP1A8ZW1haWw+Lis/KT4pPyQvdScsICRhdXRob3IsICRtYXRjaCkpIHsKaWYgKG51bGwgIT09ICRtYXRjaFsnZW1haWwnXSAmJiAhJHRoaXMtPmlzVmFsaWRFbWFpbCgkbWF0Y2hbJ2VtYWlsJ10pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIGVtYWlsICInLiRtYXRjaFsnZW1haWwnXS4nIicpOwp9CgpyZXR1cm4gWwonbmFtZScgPT4gdHJpbSgkbWF0Y2hbJ25hbWUnXSksCidlbWFpbCcgPT4gJG1hdGNoWydlbWFpbCddLApdOwp9Cgp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigKJ0ludmFsaWQgYXV0aG9yIHN0cmluZy4gIE11c3QgYmUgaW4gdGhlIGZvcm1hdHM6ICcuCidKYW5lIERvZSBvciBKb2huIFNtaXRoIDxqb2huQGV4YW1wbGUuY29tPicKKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGZvcm1hdEF1dGhvcnMoc3RyaW5nICRhdXRob3IpOiBhcnJheQp7CiRhdXRob3IgPSAkdGhpcy0+cGFyc2VBdXRob3JTdHJpbmcoJGF1dGhvcik7CmlmIChudWxsID09PSAkYXV0aG9yWydlbWFpbCddKSB7CnVuc2V0KCRhdXRob3JbJ2VtYWlsJ10pOwp9CgpyZXR1cm4gWyRhdXRob3JdOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBuYW1lc3BhY2VGcm9tUGFja2FnZU5hbWUoc3RyaW5nICRwYWNrYWdlTmFtZSk6ID9zdHJpbmcKewppZiAoISRwYWNrYWdlTmFtZSB8fCBzdHJwb3MoJHBhY2thZ2VOYW1lLCAnLycpID09PSBmYWxzZSkgewpyZXR1cm4gbnVsbDsKfQoKJG5hbWVzcGFjZSA9IGFycmF5X21hcCgKc3RhdGljIGZ1bmN0aW9uICgkcGFydCk6IHN0cmluZyB7CiRwYXJ0ID0gUHJlZzo6cmVwbGFjZSgnL1teYS16MC05XS9pJywgJyAnLCAkcGFydCk7CiRwYXJ0ID0gdWN3b3JkcygkcGFydCk7CgpyZXR1cm4gc3RyX3JlcGxhY2UoJyAnLCAnJywgJHBhcnQpOwp9LApleHBsb2RlKCcvJywgJHBhY2thZ2VOYW1lKQopOwoKcmV0dXJuIGltcGxvZGUoJ1xcJywgJG5hbWVzcGFjZSk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRHaXRDb25maWcoKTogYXJyYXkKewppZiAobnVsbCAhPT0gJHRoaXMtPmdpdENvbmZpZykgewpyZXR1cm4gJHRoaXMtPmdpdENvbmZpZzsKfQoKJHByb2Nlc3MgPSBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCR0aGlzLT5nZXRJTygpKTsKCmlmICgwID09PSAkcHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdjb25maWcnLCAnLWwnXSwgJG91dHB1dCkpIHsKJHRoaXMtPmdpdENvbmZpZyA9IFtdOwpQcmVnOjptYXRjaEFsbFN0cmljdEdyb3Vwcygne14oW149XSspPSguKikkfW0nLCAkb3V0cHV0LCAkbWF0Y2hlcyk7CmZvcmVhY2ggKCRtYXRjaGVzWzFdIGFzICRrZXkgPT4gJG1hdGNoKSB7CiR0aGlzLT5naXRDb25maWdbJG1hdGNoXSA9ICRtYXRjaGVzWzJdWyRrZXldOwp9CgpyZXR1cm4gJHRoaXMtPmdpdENvbmZpZzsKfQoKcmV0dXJuICR0aGlzLT5naXRDb25maWcgPSBbXTsKfQoKCgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaGFzVmVuZG9ySWdub3JlKHN0cmluZyAkaWdub3JlRmlsZSwgc3RyaW5nICR2ZW5kb3IgPSAndmVuZG9yJyk6IGJvb2wKewppZiAoIWZpbGVfZXhpc3RzKCRpZ25vcmVGaWxlKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRwYXR0ZXJuID0gc3ByaW50Zigne14vPyVzKC9cKj8pPyR9JywgcHJlZ19xdW90ZSgkdmVuZG9yKSk7CgokbGluZXMgPSBmaWxlKCRpZ25vcmVGaWxlLCBGSUxFX0lHTk9SRV9ORVdfTElORVMpOwpmb3JlYWNoICgkbGluZXMgYXMgJGxpbmUpIHsKaWYgKFByZWc6OmlzTWF0Y2goJHBhdHRlcm4sICRsaW5lKSkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBhZGRWZW5kb3JJZ25vcmUoc3RyaW5nICRpZ25vcmVGaWxlLCBzdHJpbmcgJHZlbmRvciA9ICcvdmVuZG9yLycpOiB2b2lkCnsKJGNvbnRlbnRzID0gIiI7CmlmIChmaWxlX2V4aXN0cygkaWdub3JlRmlsZSkpIHsKJGNvbnRlbnRzID0gZmlsZV9nZXRfY29udGVudHMoJGlnbm9yZUZpbGUpOwoKaWYgKHN0cnBvcygkY29udGVudHMsICJcbiIpICE9PSAwKSB7CiRjb250ZW50cyAuPSAiXG4iOwp9Cn0KCmZpbGVfcHV0X2NvbnRlbnRzKCRpZ25vcmVGaWxlLCAkY29udGVudHMgLiAkdmVuZG9yLiAiXG4iKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGlzVmFsaWRFbWFpbChzdHJpbmcgJGVtYWlsKTogYm9vbAp7CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZmlsdGVyX3ZhcicpKSB7CnJldHVybiB0cnVlOwp9CgpyZXR1cm4gZmFsc2UgIT09IGZpbHRlcl92YXIoJGVtYWlsLCBGSUxURVJfVkFMSURBVEVfRU1BSUwpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHVwZGF0ZURlcGVuZGVuY2llcyhPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IHZvaWQKewp0cnkgewokdXBkYXRlQ29tbWFuZCA9ICR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5maW5kKCd1cGRhdGUnKTsKJHRoaXMtPmdldEFwcGxpY2F0aW9uKCktPnJlc2V0Q29tcG9zZXIoKTsKJHVwZGF0ZUNvbW1hbmQtPnJ1bihuZXcgQXJyYXlJbnB1dChbXSksICRvdXRwdXQpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZUVycm9yKCdDb3VsZCBub3QgdXBkYXRlIGRlcGVuZGVuY2llcy4gUnVuIGBjb21wb3NlciB1cGRhdGVgIHRvIHNlZSBtb3JlIGluZm9ybWF0aW9uLicpOwp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gcnVuRHVtcEF1dG9sb2FkQ29tbWFuZChPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IHZvaWQKewp0cnkgewokY29tbWFuZCA9ICR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5maW5kKCdkdW1wLWF1dG9sb2FkJyk7CiR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5yZXNldENvbXBvc2VyKCk7CiRjb21tYW5kLT5ydW4obmV3IEFycmF5SW5wdXQoW10pLCAkb3V0cHV0KTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewokdGhpcy0+Z2V0SU8oKS0+d3JpdGVFcnJvcignQ291bGQgbm90IHJ1biBkdW1wLWF1dG9sb2FkLicpOwp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gaGFzRGVwZW5kZW5jaWVzKGFycmF5ICRvcHRpb25zKTogYm9vbAp7CiRyZXF1aXJlcyA9IChhcnJheSkgJG9wdGlvbnNbJ3JlcXVpcmUnXTsKJGRldlJlcXVpcmVzID0gaXNzZXQoJG9wdGlvbnNbJ3JlcXVpcmUtZGV2J10pID8gKGFycmF5KSAkb3B0aW9uc1sncmVxdWlyZS1kZXYnXSA6IFtdOwoKcmV0dXJuICFlbXB0eSgkcmVxdWlyZXMpIHx8ICFlbXB0eSgkZGV2UmVxdWlyZXMpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHNhbml0aXplUGFja2FnZU5hbWVDb21wb25lbnQoc3RyaW5nICRuYW1lKTogc3RyaW5nCnsKJG5hbWUgPSBQcmVnOjpyZXBsYWNlKCd7KD86KFthLXpdKShbQS1aXSl8KFtBLVpdKShbQS1aXVthLXpdKSl9JywgJ1xcMVxcMy1cXDJcXDQnLCAkbmFtZSk7CiRuYW1lID0gc3RydG9sb3dlcigkbmFtZSk7CiRuYW1lID0gUHJlZzo6cmVwbGFjZSgne15bXy4tXSt8W18uLV0rJHxbXmEtejAtOV8uLV19dScsICcnLCAkbmFtZSk7CiRuYW1lID0gUHJlZzo6cmVwbGFjZSgneyhbXy4tXSl7Mix9fXUnLCAnJDEnLCAkbmFtZSk7CgpyZXR1cm4gJG5hbWU7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0RGVmYXVsdFBhY2thZ2VOYW1lKCk6IHN0cmluZwp7CiRnaXQgPSAkdGhpcy0+Z2V0R2l0Q29uZmlnKCk7CiRjd2QgPSByZWFscGF0aCgiLiIpOwokbmFtZSA9IGJhc2VuYW1lKCRjd2QpOwokbmFtZSA9ICR0aGlzLT5zYW5pdGl6ZVBhY2thZ2VOYW1lQ29tcG9uZW50KCRuYW1lKTsKCiR2ZW5kb3IgPSAkbmFtZTsKaWYgKCFlbXB0eSgkX1NFUlZFUlsnQ09NUE9TRVJfREVGQVVMVF9WRU5ET1InXSkpIHsKJHZlbmRvciA9ICRfU0VSVkVSWydDT01QT1NFUl9ERUZBVUxUX1ZFTkRPUiddOwp9IGVsc2VpZiAoaXNzZXQoJGdpdFsnZ2l0aHViLnVzZXInXSkpIHsKJHZlbmRvciA9ICRnaXRbJ2dpdGh1Yi51c2VyJ107Cn0gZWxzZWlmICghZW1wdHkoJF9TRVJWRVJbJ1VTRVJOQU1FJ10pKSB7CiR2ZW5kb3IgPSAkX1NFUlZFUlsnVVNFUk5BTUUnXTsKfSBlbHNlaWYgKCFlbXB0eSgkX1NFUlZFUlsnVVNFUiddKSkgewokdmVuZG9yID0gJF9TRVJWRVJbJ1VTRVInXTsKfSBlbHNlaWYgKGdldF9jdXJyZW50X3VzZXIoKSkgewokdmVuZG9yID0gZ2V0X2N1cnJlbnRfdXNlcigpOwp9CgokdmVuZG9yID0gJHRoaXMtPnNhbml0aXplUGFja2FnZU5hbWVDb21wb25lbnQoJHZlbmRvcik7CgpyZXR1cm4gJHZlbmRvciAuICcvJyAuICRuYW1lOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldERlZmF1bHRBdXRob3IoKTogP3N0cmluZwp7CiRnaXQgPSAkdGhpcy0+Z2V0R2l0Q29uZmlnKCk7CgppZiAoIWVtcHR5KCRfU0VSVkVSWydDT01QT1NFUl9ERUZBVUxUX0FVVEhPUiddKSkgewokYXV0aG9yX25hbWUgPSAkX1NFUlZFUlsnQ09NUE9TRVJfREVGQVVMVF9BVVRIT1InXTsKfSBlbHNlaWYgKGlzc2V0KCRnaXRbJ3VzZXIubmFtZSddKSkgewokYXV0aG9yX25hbWUgPSAkZ2l0Wyd1c2VyLm5hbWUnXTsKfQoKaWYgKCFlbXB0eSgkX1NFUlZFUlsnQ09NUE9TRVJfREVGQVVMVF9FTUFJTCddKSkgewokYXV0aG9yX2VtYWlsID0gJF9TRVJWRVJbJ0NPTVBPU0VSX0RFRkFVTFRfRU1BSUwnXTsKfSBlbHNlaWYgKGlzc2V0KCRnaXRbJ3VzZXIuZW1haWwnXSkpIHsKJGF1dGhvcl9lbWFpbCA9ICRnaXRbJ3VzZXIuZW1haWwnXTsKfQoKaWYgKGlzc2V0KCRhdXRob3JfbmFtZSwgJGF1dGhvcl9lbWFpbCkpIHsKcmV0dXJuIHNwcmludGYoJyVzIDwlcz4nLCAkYXV0aG9yX25hbWUsICRhdXRob3JfZW1haWwpOwp9CgpyZXR1cm4gbnVsbDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXEluc3RhbGxlcjsKdXNlIENvbXBvc2VyXFBsdWdpblxDb21tYW5kRXZlbnQ7CnVzZSBDb21wb3NlclxQbHVnaW5cUGx1Z2luRXZlbnRzOwp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcQXVkaXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKCmNsYXNzIEluc3RhbGxDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewp1c2UgQ29tcGxldGlvblRyYWl0OwoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdpbnN0YWxsJykKLT5zZXRBbGlhc2VzKFsnaSddKQotPnNldERlc2NyaXB0aW9uKCdJbnN0YWxscyB0aGUgcHJvamVjdCBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgY29tcG9zZXIubG9jayBmaWxlIGlmIHByZXNlbnQsIG9yIGZhbGxzIGJhY2sgb24gdGhlIGNvbXBvc2VyLmpzb24nKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRPcHRpb24oJ3ByZWZlci1zb3VyY2UnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0ZvcmNlcyBpbnN0YWxsYXRpb24gZnJvbSBwYWNrYWdlIHNvdXJjZXMgd2hlbiBwb3NzaWJsZSwgaW5jbHVkaW5nIFZDUyBpbmZvcm1hdGlvbi4nKSwKbmV3IElucHV0T3B0aW9uKCdwcmVmZXItZGlzdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRm9yY2VzIGluc3RhbGxhdGlvbiBmcm9tIHBhY2thZ2UgZGlzdCAoZGVmYXVsdCBiZWhhdmlvcikuJyksCm5ldyBJbnB1dE9wdGlvbigncHJlZmVyLWluc3RhbGwnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdGb3JjZXMgaW5zdGFsbGF0aW9uIGZyb20gcGFja2FnZSBkaXN0fHNvdXJjZXxhdXRvIChhdXRvIGNob29zZXMgc291cmNlIGZvciBkZXYgdmVyc2lvbnMsIGRpc3QgZm9yIHRoZSByZXN0KS4nLCBudWxsLCAkdGhpcy0+c3VnZ2VzdFByZWZlckluc3RhbGwoKSksCm5ldyBJbnB1dE9wdGlvbignZHJ5LXJ1bicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT3V0cHV0cyB0aGUgb3BlcmF0aW9ucyBidXQgd2lsbCBub3QgZXhlY3V0ZSBhbnl0aGluZyAoaW1wbGljaXRseSBlbmFibGVzIC0tdmVyYm9zZSkuJyksCm5ldyBJbnB1dE9wdGlvbignZG93bmxvYWQtb25seScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRG93bmxvYWQgb25seSwgZG8gbm90IGluc3RhbGwgcGFja2FnZXMuJyksCm5ldyBJbnB1dE9wdGlvbignZGV2JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdERVBSRUNBVEVEOiBFbmFibGVzIGluc3RhbGxhdGlvbiBvZiByZXF1aXJlLWRldiBwYWNrYWdlcyAoZW5hYmxlZCBieSBkZWZhdWx0LCBvbmx5IHByZXNlbnQgZm9yIEJDKS4nKSwKbmV3IElucHV0T3B0aW9uKCduby1zdWdnZXN0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdERVBSRUNBVEVEOiBUaGlzIGZsYWcgZG9lcyBub3QgZXhpc3QgYW55bW9yZS4nKSwKbmV3IElucHV0T3B0aW9uKCduby1kZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc2FibGVzIGluc3RhbGxhdGlvbiBvZiByZXF1aXJlLWRldiBwYWNrYWdlcy4nKSwKbmV3IElucHV0T3B0aW9uKCduby1zZWN1cml0eS1ibG9ja2luZycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQWxsb3dzIGluc3RhbGxpbmcgcGFja2FnZXMgd2l0aCBzZWN1cml0eSBhZHZpc29yaWVzIG9yIHRoYXQgYXJlIGFiYW5kb25lZCAoY2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgQ09NUE9TRVJfTk9fU0VDVVJJVFlfQkxPQ0tJTkc9MSBlbnYgdmFyKS4gT25seSBhcHBsaWVzIHdoZW4gbm8gbG9jayBmaWxlIGlzIHByZXNlbnQuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tYXV0b2xvYWRlcicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2tpcHMgYXV0b2xvYWRlciBnZW5lcmF0aW9uJyksCm5ldyBJbnB1dE9wdGlvbignbm8tcHJvZ3Jlc3MnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RvIG5vdCBvdXRwdXQgZG93bmxvYWQgcHJvZ3Jlc3MuJyksCm5ldyBJbnB1dE9wdGlvbignbm8taW5zdGFsbCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRG8gbm90IHVzZSwgb25seSBkZWZpbmVkIGhlcmUgdG8gY2F0Y2ggbWlzdXNlIG9mIHRoZSBpbnN0YWxsIGNvbW1hbmQuJyksCm5ldyBJbnB1dE9wdGlvbignYXVkaXQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1J1biBhbiBhdWRpdCBhZnRlciBpbnN0YWxsYXRpb24gaXMgY29tcGxldGUuJyksCm5ldyBJbnB1dE9wdGlvbignYXVkaXQtZm9ybWF0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnQXVkaXQgb3V0cHV0IGZvcm1hdC4gTXVzdCBiZSAidGFibGUiLCAicGxhaW4iLCAianNvbiIsIG9yICJzdW1tYXJ5Ii4nLCBBdWRpdG9yOjpGT1JNQVRfU1VNTUFSWSwgQXVkaXRvcjo6Rk9STUFUUyksCm5ldyBJbnB1dE9wdGlvbigndmVyYm9zZScsICd2fHZ2fHZ2dicsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvd3MgbW9yZSBkZXRhaWxzIGluY2x1ZGluZyBuZXcgY29tbWl0cyBwdWxsZWQgaW4gd2hlbiB1cGRhdGluZyBwYWNrYWdlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdvcHRpbWl6ZS1hdXRvbG9hZGVyJywgJ28nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ09wdGltaXplIGF1dG9sb2FkZXIgZHVyaW5nIGF1dG9sb2FkZXIgZHVtcCcpLApuZXcgSW5wdXRPcHRpb24oJ2NsYXNzbWFwLWF1dGhvcml0YXRpdmUnLCAnYScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQXV0b2xvYWQgY2xhc3NlcyBmcm9tIHRoZSBjbGFzc21hcCBvbmx5LiBJbXBsaWNpdGx5IGVuYWJsZXMgYC0tb3B0aW1pemUtYXV0b2xvYWRlcmAuJyksCm5ldyBJbnB1dE9wdGlvbignYXBjdS1hdXRvbG9hZGVyJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdVc2UgQVBDdSB0byBjYWNoZSBmb3VuZC9ub3QtZm91bmQgY2xhc3Nlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdhcGN1LWF1dG9sb2FkZXItcHJlZml4JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnVXNlIGEgY3VzdG9tIHByZWZpeCBmb3IgdGhlIEFQQ3UgYXV0b2xvYWRlciBjYWNoZS4gSW1wbGljaXRseSBlbmFibGVzIC0tYXBjdS1hdXRvbG9hZGVyJyksCm5ldyBJbnB1dE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCB8IElucHV0T3B0aW9uOjpWQUxVRV9JU19BUlJBWSwgJ0lnbm9yZSBhIHNwZWNpZmljIHBsYXRmb3JtIHJlcXVpcmVtZW50IChwaHAgJiBleHQtIHBhY2thZ2VzKS4nKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnSWdub3JlIGFsbCBwbGF0Zm9ybSByZXF1aXJlbWVudHMgKHBocCAmIGV4dC0gcGFja2FnZXMpLicpLApuZXcgSW5wdXRBcmd1bWVudCgncGFja2FnZXMnLCBJbnB1dEFyZ3VtZW50OjpJU19BUlJBWSB8IElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnU2hvdWxkIG5vdCBiZSBwcm92aWRlZCwgdXNlIGNvbXBvc2VyIHJlcXVpcmUgaW5zdGVhZCB0byBhZGQgYSBnaXZlbiBwYWNrYWdlIHRvIGNvbXBvc2VyLmpzb24uJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSA8aW5mbz5pbnN0YWxsPC9pbmZvPiBjb21tYW5kIHJlYWRzIHRoZSBjb21wb3Nlci5sb2NrIGZpbGUgZnJvbQp0aGUgY3VycmVudCBkaXJlY3RvcnksIHByb2Nlc3NlcyBpdCwgYW5kIGRvd25sb2FkcyBhbmQgaW5zdGFsbHMgYWxsIHRoZQpsaWJyYXJpZXMgYW5kIGRlcGVuZGVuY2llcyBvdXRsaW5lZCBpbiB0aGF0IGZpbGUuIElmIHRoZSBmaWxlIGRvZXMgbm90CmV4aXN0IGl0IHdpbGwgbG9vayBmb3IgY29tcG9zZXIuanNvbiBhbmQgZG8gdGhlIHNhbWUuCgo8aW5mbz5waHAgY29tcG9zZXIucGhhciBpbnN0YWxsPC9pbmZvPgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjaW5zdGFsbC1pCkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2RldicpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+WW91IGFyZSB1c2luZyB0aGUgZGVwcmVjYXRlZCBvcHRpb24gIi0tZGV2Ii4gSXQgaGFzIG5vIGVmZmVjdCBhbmQgd2lsbCBicmVhayBpbiBDb21wb3NlciAzLjwvd2FybmluZz4nKTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLXN1Z2dlc3QnKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPllvdSBhcmUgdXNpbmcgdGhlIGRlcHJlY2F0ZWQgb3B0aW9uICItLW5vLXN1Z2dlc3QiLiBJdCBoYXMgbm8gZWZmZWN0IGFuZCB3aWxsIGJyZWFrIGluIENvbXBvc2VyIDMuPC93YXJuaW5nPicpOwp9CgokYXJncyA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2VzJyk7CmlmIChjb3VudCgkYXJncykgPiAwKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPkludmFsaWQgYXJndW1lbnQgJy5pbXBsb2RlKCcgJywgJGFyZ3MpLicuIFVzZSAiY29tcG9zZXIgcmVxdWlyZSAnLmltcGxvZGUoJyAnLCAkYXJncykuJyIgaW5zdGVhZCB0byBhZGQgcGFja2FnZXMgdG8geW91ciBjb21wb3Nlci5qc29uLjwvZXJyb3I+Jyk7CgpyZXR1cm4gMTsKfQoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1pbnN0YWxsJykpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+SW52YWxpZCBvcHRpb24gIi0tbm8taW5zdGFsbCIuIFVzZSAiY29tcG9zZXIgdXBkYXRlIC0tbm8taW5zdGFsbCIgaW5zdGVhZCBpZiB5b3UgYXJlIHRyeWluZyB0byB1cGRhdGUgdGhlIGNvbXBvc2VyLmxvY2sgZmlsZS48L2Vycm9yPicpOwoKcmV0dXJuIDE7Cn0KCiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKCmlmICghJGNvbXBvc2VyLT5nZXRMb2NrZXIoKS0+aXNMb2NrZWQoKSAmJiAhSHR0cERvd25sb2FkZXI6OmlzQ3VybEVuYWJsZWQoKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkNvbXBvc2VyIGlzIG9wZXJhdGluZyBzaWduaWZpY2FudGx5IHNsb3dlciB0aGFuIG5vcm1hbCBiZWNhdXNlIHlvdSBkbyBub3QgaGF2ZSB0aGUgUEhQIGN1cmwgZXh0ZW5zaW9uIGVuYWJsZWQuPC93YXJuaW5nPicpOwp9CgokY29tbWFuZEV2ZW50ID0gbmV3IENvbW1hbmRFdmVudChQbHVnaW5FdmVudHM6OkNPTU1BTkQsICdpbnN0YWxsJywgJGlucHV0LCAkb3V0cHV0KTsKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2goJGNvbW1hbmRFdmVudC0+Z2V0TmFtZSgpLCAkY29tbWFuZEV2ZW50KTsKCiRpbnN0YWxsID0gSW5zdGFsbGVyOjpjcmVhdGUoJGlvLCAkY29tcG9zZXIpOwoKJGNvbmZpZyA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCk7ClskcHJlZmVyU291cmNlLCAkcHJlZmVyRGlzdF0gPSAkdGhpcy0+Z2V0UHJlZmVycmVkSW5zdGFsbE9wdGlvbnMoJGNvbmZpZywgJGlucHV0KTsKCiRvcHRpbWl6ZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdvcHRpbWl6ZS1hdXRvbG9hZGVyJykgfHwgJGNvbmZpZy0+Z2V0KCdvcHRpbWl6ZS1hdXRvbG9hZGVyJyk7CiRhdXRob3JpdGF0aXZlID0gJGlucHV0LT5nZXRPcHRpb24oJ2NsYXNzbWFwLWF1dGhvcml0YXRpdmUnKSB8fCAkY29uZmlnLT5nZXQoJ2NsYXNzbWFwLWF1dGhvcml0YXRpdmUnKTsKJGFwY3VQcmVmaXggPSAkaW5wdXQtPmdldE9wdGlvbignYXBjdS1hdXRvbG9hZGVyLXByZWZpeCcpOwokYXBjdSA9ICRhcGN1UHJlZml4ICE9PSBudWxsIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCdhcGN1LWF1dG9sb2FkZXInKSB8fCAkY29uZmlnLT5nZXQoJ2FwY3UtYXV0b2xvYWRlcicpOwoKJGNvbXBvc2VyLT5nZXRJbnN0YWxsYXRpb25NYW5hZ2VyKCktPnNldE91dHB1dFByb2dyZXNzKCEkaW5wdXQtPmdldE9wdGlvbignbm8tcHJvZ3Jlc3MnKSk7CgokaW5zdGFsbAotPnNldERyeVJ1bigkaW5wdXQtPmdldE9wdGlvbignZHJ5LXJ1bicpKQotPnNldERvd25sb2FkT25seSgkaW5wdXQtPmdldE9wdGlvbignZG93bmxvYWQtb25seScpKQotPnNldFZlcmJvc2UoJGlucHV0LT5nZXRPcHRpb24oJ3ZlcmJvc2UnKSkKLT5zZXRQcmVmZXJTb3VyY2UoJHByZWZlclNvdXJjZSkKLT5zZXRQcmVmZXJEaXN0KCRwcmVmZXJEaXN0KQotPnNldERldk1vZGUoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSkKLT5zZXREdW1wQXV0b2xvYWRlcighJGlucHV0LT5nZXRPcHRpb24oJ25vLWF1dG9sb2FkZXInKSkKLT5zZXRPcHRpbWl6ZUF1dG9sb2FkZXIoJG9wdGltaXplKQotPnNldENsYXNzTWFwQXV0aG9yaXRhdGl2ZSgkYXV0aG9yaXRhdGl2ZSkKLT5zZXRBcGN1QXV0b2xvYWRlcigkYXBjdSwgJGFwY3VQcmVmaXgpCi0+c2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkdGhpcy0+Z2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkaW5wdXQpKQotPnNldEF1ZGl0Q29uZmlnKCR0aGlzLT5jcmVhdGVBdWRpdENvbmZpZygkY29tcG9zZXItPmdldENvbmZpZygpLCAkaW5wdXQpKQotPnNldEVycm9yT25BdWRpdCgkaW5wdXQtPmdldE9wdGlvbignYXVkaXQnKSkKOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1wbHVnaW5zJykpIHsKJGluc3RhbGwtPmRpc2FibGVQbHVnaW5zKCk7Cn0KCnJldHVybiAkaW5zdGFsbC0+cnVuKCk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGx1Z2luXENvbW1hbmRFdmVudDsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5FdmVudHM7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlVdGlsczsKdXNlIENvbXBvc2VyXFV0aWxcUGFja2FnZUluZm87CnVzZSBDb21wb3NlclxVdGlsXFBhY2thZ2VTb3J0ZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxUYWJsZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFN0eWxlXFN5bWZvbnlTdHlsZTsKCgoKCmNsYXNzIExpY2Vuc2VzQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdsaWNlbnNlcycpCi0+c2V0RGVzY3JpcHRpb24oJ1Nob3dzIGluZm9ybWF0aW9uIGFib3V0IGxpY2Vuc2VzIG9mIGRlcGVuZGVuY2llcycpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dE9wdGlvbignZm9ybWF0JywgJ2YnLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdGb3JtYXQgb2YgdGhlIG91dHB1dDogdGV4dCwganNvbiBvciBzdW1tYXJ5JywgJ3RleHQnLCBbJ3RleHQnLCAnanNvbicsICdzdW1tYXJ5J10pLApuZXcgSW5wdXRPcHRpb24oJ25vLWRldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRGlzYWJsZXMgc2VhcmNoIGluIHJlcXVpcmUtZGV2IHBhY2thZ2VzLicpLApuZXcgSW5wdXRPcHRpb24oJ2xvY2tlZCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvd3MgbGljZW5zZXMgZnJvbSB0aGUgbG9jayBmaWxlIGluc3RlYWQgb2YgaW5zdGFsbGVkIHBhY2thZ2VzLicpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgbGljZW5zZSBjb21tYW5kIGRpc3BsYXlzIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsaWNlbnNlcyBvZgp0aGUgaW5zdGFsbGVkIGRlcGVuZGVuY2llcy4KClVzZSAtLWxvY2tlZCB0byBzaG93IGxpY2Vuc2VzIGZyb20gY29tcG9zZXIubG9jayBpbnN0ZWFkIG9mIHdoYXQncyBjdXJyZW50bHkKaW5zdGFsbGVkIGluIHRoZSB2ZW5kb3IgZGlyZWN0b3J5LgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjbGljZW5zZXMKRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwoKJGNvbW1hbmRFdmVudCA9IG5ldyBDb21tYW5kRXZlbnQoUGx1Z2luRXZlbnRzOjpDT01NQU5ELCAnbGljZW5zZXMnLCAkaW5wdXQsICRvdXRwdXQpOwokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaCgkY29tbWFuZEV2ZW50LT5nZXROYW1lKCksICRjb21tYW5kRXZlbnQpOwoKJHJvb3QgPSAkY29tcG9zZXItPmdldFBhY2thZ2UoKTsKCmlmICgkaW5wdXQtPmdldE9wdGlvbignbG9ja2VkJykpIHsKaWYgKCEkY29tcG9zZXItPmdldExvY2tlcigpLT5pc0xvY2tlZCgpKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdWYWxpZCBjb21wb3Nlci5qc29uIGFuZCBjb21wb3Nlci5sb2NrIGZpbGVzIGFyZSByZXF1aXJlZCB0byBydW4gdGhpcyBjb21tYW5kIHdpdGggLS1sb2NrZWQnKTsKfQokbG9ja2VyID0gJGNvbXBvc2VyLT5nZXRMb2NrZXIoKTsKJHJlcG8gPSAkbG9ja2VyLT5nZXRMb2NrZWRSZXBvc2l0b3J5KCEkaW5wdXQtPmdldE9wdGlvbignbm8tZGV2JykpOwokcGFja2FnZXMgPSAkcmVwby0+Z2V0UGFja2FnZXMoKTsKfSBlbHNlIHsKJHJlcG8gPSAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSkgewokcGFja2FnZXMgPSBSZXBvc2l0b3J5VXRpbHM6OmZpbHRlclJlcXVpcmVkUGFja2FnZXMoJHJlcG8tPmdldFBhY2thZ2VzKCksICRyb290KTsKfSBlbHNlIHsKJHBhY2thZ2VzID0gJHJlcG8tPmdldFBhY2thZ2VzKCk7Cn0KfQoKJHBhY2thZ2VzID0gUGFja2FnZVNvcnRlcjo6c29ydFBhY2thZ2VzQWxwaGFiZXRpY2FsbHkoJHBhY2thZ2VzKTsKJGlvID0gJHRoaXMtPmdldElPKCk7Cgpzd2l0Y2ggKCRmb3JtYXQgPSAkaW5wdXQtPmdldE9wdGlvbignZm9ybWF0JykpIHsKY2FzZSAndGV4dCc6CiRpby0+d3JpdGUoJ05hbWU6IDxjb21tZW50PicuJHJvb3QtPmdldFByZXR0eU5hbWUoKS4nPC9jb21tZW50PicpOwokaW8tPndyaXRlKCdWZXJzaW9uOiA8Y29tbWVudD4nLiRyb290LT5nZXRGdWxsUHJldHR5VmVyc2lvbigpLic8L2NvbW1lbnQ+Jyk7CiRpby0+d3JpdGUoJ0xpY2Vuc2VzOiA8Y29tbWVudD4nLihpbXBsb2RlKCcsICcsICRyb290LT5nZXRMaWNlbnNlKCkpID86ICdub25lJykuJzwvY29tbWVudD4nKTsKJGlvLT53cml0ZSgnRGVwZW5kZW5jaWVzOicpOwokaW8tPndyaXRlKCcnKTsKCiR0YWJsZSA9IG5ldyBUYWJsZSgkb3V0cHV0KTsKJHRhYmxlLT5zZXRTdHlsZSgnY29tcGFjdCcpOwokdGFibGUtPnNldEhlYWRlcnMoWydOYW1lJywgJ1ZlcnNpb24nLCAnTGljZW5zZXMnXSk7CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewokbGluayA9IFBhY2thZ2VJbmZvOjpnZXRWaWV3U291cmNlT3JIb21lcGFnZVVybCgkcGFja2FnZSk7CmlmICgkbGluayAhPT0gbnVsbCkgewokbmFtZSA9ICc8aHJlZj0nLk91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCRsaW5rKS4nPicuJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nPC8+JzsKfSBlbHNlIHsKJG5hbWUgPSAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpOwp9CgokdGFibGUtPmFkZFJvdyhbCiRuYW1lLAokcGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKSwKaW1wbG9kZSgnLCAnLCAkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSA/ICRwYWNrYWdlLT5nZXRMaWNlbnNlKCkgOiBbXSkgPzogJ25vbmUnLApdKTsKfQokdGFibGUtPnJlbmRlcigpOwpicmVhazsKCmNhc2UgJ2pzb24nOgokZGVwZW5kZW5jaWVzID0gW107CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewokZGVwZW5kZW5jaWVzWyRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCldID0gWwondmVyc2lvbicgPT4gJHBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCksCidsaWNlbnNlJyA9PiAkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSA/ICRwYWNrYWdlLT5nZXRMaWNlbnNlKCkgOiBbXSwKXTsKfQoKJGlvLT53cml0ZShKc29uRmlsZTo6ZW5jb2RlKFsKJ25hbWUnID0+ICRyb290LT5nZXRQcmV0dHlOYW1lKCksCid2ZXJzaW9uJyA9PiAkcm9vdC0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKSwKJ2xpY2Vuc2UnID0+ICRyb290LT5nZXRMaWNlbnNlKCksCidkZXBlbmRlbmNpZXMnID0+ICRkZXBlbmRlbmNpZXMsCl0pKTsKYnJlYWs7CgpjYXNlICdzdW1tYXJ5JzoKJHVzZWRMaWNlbnNlcyA9IFtdOwpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJGxpY2Vuc2VzID0gJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgPyAkcGFja2FnZS0+Z2V0TGljZW5zZSgpIDogW107CmlmIChjb3VudCgkbGljZW5zZXMpID09PSAwKSB7CiRsaWNlbnNlc1tdID0gJ25vbmUnOwp9CmZvcmVhY2ggKCRsaWNlbnNlcyBhcyAkbGljZW5zZU5hbWUpIHsKaWYgKCFpc3NldCgkdXNlZExpY2Vuc2VzWyRsaWNlbnNlTmFtZV0pKSB7CiR1c2VkTGljZW5zZXNbJGxpY2Vuc2VOYW1lXSA9IDA7Cn0KJHVzZWRMaWNlbnNlc1skbGljZW5zZU5hbWVdKys7Cn0KfQoKCmFyc29ydCgkdXNlZExpY2Vuc2VzLCBTT1JUX05VTUVSSUMpOwoKJHJvd3MgPSBbXTsKZm9yZWFjaCAoJHVzZWRMaWNlbnNlcyBhcyAkdXNlZExpY2Vuc2UgPT4gJG51bWJlck9mRGVwZW5kZW5jaWVzKSB7CiRyb3dzW10gPSBbJHVzZWRMaWNlbnNlLCAkbnVtYmVyT2ZEZXBlbmRlbmNpZXNdOwp9Cgokc3ltZm9ueUlvID0gbmV3IFN5bWZvbnlTdHlsZSgkaW5wdXQsICRvdXRwdXQpOwokc3ltZm9ueUlvLT50YWJsZSgKWydMaWNlbnNlJywgJ051bWJlciBvZiBkZXBlbmRlbmNpZXMnXSwKJHJvd3MKKTsKYnJlYWs7CmRlZmF1bHQ6CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdVbnN1cHBvcnRlZCBmb3JtYXQgIiVzIi4gIFNlZSBoZWxwIGZvciBzdXBwb3J0ZWQgZm9ybWF0cy4nLCAkZm9ybWF0KSk7Cn0KCnJldHVybiAwOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcQXJyYXlJbnB1dDsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgpjbGFzcyBPdXRkYXRlZENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnVzZSBDb21wbGV0aW9uVHJhaXQ7Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ291dGRhdGVkJykKLT5zZXREZXNjcmlwdGlvbignU2hvd3MgYSBsaXN0IG9mIGluc3RhbGxlZCBwYWNrYWdlcyB0aGF0IGhhdmUgdXBkYXRlcyBhdmFpbGFibGUsIGluY2x1ZGluZyB0aGVpciBsYXRlc3QgdmVyc2lvbicpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dEFyZ3VtZW50KCdwYWNrYWdlJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdQYWNrYWdlIHRvIGluc3BlY3QuIE9yIGEgbmFtZSBpbmNsdWRpbmcgYSB3aWxkY2FyZCAoKikgdG8gZmlsdGVyIGxpc3RzIG9mIHBhY2thZ2VzIGluc3RlYWQuJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RJbnN0YWxsZWRQYWNrYWdlKGZhbHNlKSksCm5ldyBJbnB1dE9wdGlvbignb3V0ZGF0ZWQnLCAnbycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvdyBvbmx5IHBhY2thZ2VzIHRoYXQgYXJlIG91dGRhdGVkICh0aGlzIGlzIHRoZSBkZWZhdWx0LCBidXQgcHJlc2VudCBoZXJlIGZvciBjb21wYXQgd2l0aCBgc2hvd2AnKSwKbmV3IElucHV0T3B0aW9uKCdhbGwnLCAnYScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvdyBhbGwgaW5zdGFsbGVkIHBhY2thZ2VzIHdpdGggdGhlaXIgbGF0ZXN0IHZlcnNpb25zJyksCm5ldyBJbnB1dE9wdGlvbignbG9ja2VkJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTaG93cyB1cGRhdGVzIGZvciBwYWNrYWdlcyBmcm9tIHRoZSBsb2NrIGZpbGUsIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBpcyBjdXJyZW50bHkgaW4gdmVuZG9yIGRpcicpLApuZXcgSW5wdXRPcHRpb24oJ2RpcmVjdCcsICdEJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTaG93cyBvbmx5IHBhY2thZ2VzIHRoYXQgYXJlIGRpcmVjdGx5IHJlcXVpcmVkIGJ5IHRoZSByb290IHBhY2thZ2UnKSwKbmV3IElucHV0T3B0aW9uKCdzdHJpY3QnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1JldHVybiBhIG5vbi16ZXJvIGV4aXQgY29kZSB3aGVuIHRoZXJlIGFyZSBvdXRkYXRlZCBwYWNrYWdlcycpLApuZXcgSW5wdXRPcHRpb24oJ21ham9yLW9ubHknLCAnTScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvdyBvbmx5IHBhY2thZ2VzIHRoYXQgaGF2ZSBtYWpvciBTZW1WZXItY29tcGF0aWJsZSB1cGRhdGVzLicpLApuZXcgSW5wdXRPcHRpb24oJ21pbm9yLW9ubHknLCAnbScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvdyBvbmx5IHBhY2thZ2VzIHRoYXQgaGF2ZSBtaW5vciBTZW1WZXItY29tcGF0aWJsZSB1cGRhdGVzLicpLApuZXcgSW5wdXRPcHRpb24oJ3BhdGNoLW9ubHknLCAncCcsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvdyBvbmx5IHBhY2thZ2VzIHRoYXQgaGF2ZSBwYXRjaCBTZW1WZXItY29tcGF0aWJsZSB1cGRhdGVzLicpLApuZXcgSW5wdXRPcHRpb24oJ3NvcnQtYnktYWdlJywgJ0EnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc3BsYXlzIHRoZSBpbnN0YWxsZWQgdmVyc2lvblwncyBhZ2UsIGFuZCBzb3J0cyBwYWNrYWdlcyBvbGRlc3QgZmlyc3QuJyksCm5ldyBJbnB1dE9wdGlvbignZm9ybWF0JywgJ2YnLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdGb3JtYXQgb2YgdGhlIG91dHB1dDogdGV4dCBvciBqc29uJywgJ3RleHQnLCBbJ2pzb24nLCAndGV4dCddKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQgfCBJbnB1dE9wdGlvbjo6VkFMVUVfSVNfQVJSQVksICdJZ25vcmUgc3BlY2lmaWVkIHBhY2thZ2UocykuIENhbiBjb250YWluIHdpbGRjYXJkcyAoKikuIFVzZSBpdCBpZiB5b3UgZG9uXCd0IHdhbnQgdG8gYmUgaW5mb3JtZWQgYWJvdXQgbmV3IHZlcnNpb25zIG9mIHNvbWUgcGFja2FnZXMuJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RJbnN0YWxsZWRQYWNrYWdlKGZhbHNlKSksCm5ldyBJbnB1dE9wdGlvbignbm8tZGV2JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNhYmxlcyBzZWFyY2ggaW4gcmVxdWlyZS1kZXYgcGFja2FnZXMuJyksCm5ldyBJbnB1dE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCB8IElucHV0T3B0aW9uOjpWQUxVRV9JU19BUlJBWSwgJ0lnbm9yZSBhIHNwZWNpZmljIHBsYXRmb3JtIHJlcXVpcmVtZW50IChwaHAgJiBleHQtIHBhY2thZ2VzKS4gVXNlIHdpdGggdGhlIC0tb3V0ZGF0ZWQgb3B0aW9uJyksCm5ldyBJbnB1dE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcXMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0lnbm9yZSBhbGwgcGxhdGZvcm0gcmVxdWlyZW1lbnRzIChwaHAgJiBleHQtIHBhY2thZ2VzKS4gVXNlIHdpdGggdGhlIC0tb3V0ZGF0ZWQgb3B0aW9uJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSBvdXRkYXRlZCBjb21tYW5kIGlzIGp1c3QgYSBwcm94eSBmb3IgYGNvbXBvc2VyIHNob3cgLWxgCgpUaGUgY29sb3IgY29kaW5nIChvciBzaWduYWdlIGlmIHlvdSBoYXZlIEFOU0kgY29sb3JzIGRpc2FibGVkKSBmb3IgZGVwZW5kZW5jeSB2ZXJzaW9ucyBpcyBhcyBzdWNoOgoKLSA8aW5mbz5ncmVlbjwvaW5mbz4gKD0pOiBEZXBlbmRlbmN5IGlzIGluIHRoZSBsYXRlc3QgdmVyc2lvbiBhbmQgaXMgdXAgdG8gZGF0ZS4KLSA8Y29tbWVudD55ZWxsb3c8L2NvbW1lbnQ+ICh+KTogRGVwZW5kZW5jeSBoYXMgYSBuZXcgdmVyc2lvbiBhdmFpbGFibGUgdGhhdCBpbmNsdWRlcyBiYWNrd2FyZHMKICBjb21wYXRpYmlsaXR5IGJyZWFrcyBhY2NvcmRpbmcgdG8gc2VtdmVyLCBzbyB1cGdyYWRlIHdoZW4geW91IGNhbiBidXQgaXQKICBtYXkgaW52b2x2ZSB3b3JrLgotIDxoaWdobGlnaHQ+cmVkPC9oaWdobGlnaHQ+ICghKTogRGVwZW5kZW5jeSBoYXMgYSBuZXcgdmVyc2lvbiB0aGF0IGlzIHNlbXZlci1jb21wYXRpYmxlIGFuZCB5b3Ugc2hvdWxkIHVwZ3JhZGUgaXQuCgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNvdXRkYXRlZApFT1QKKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokYXJncyA9IFsKJ2NvbW1hbmQnID0+ICdzaG93JywKJy0tbGF0ZXN0JyA9PiB0cnVlLApdOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLWludGVyYWN0aW9uJykpIHsKJGFyZ3NbJy0tbm8taW50ZXJhY3Rpb24nXSA9IHRydWU7Cn0KaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1wbHVnaW5zJykpIHsKJGFyZ3NbJy0tbm8tcGx1Z2lucyddID0gdHJ1ZTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLXNjcmlwdHMnKSkgewokYXJnc1snLS1uby1zY3JpcHRzJ10gPSB0cnVlOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbignbm8tY2FjaGUnKSkgewokYXJnc1snLS1uby1jYWNoZSddID0gdHJ1ZTsKfQppZiAoISRpbnB1dC0+Z2V0T3B0aW9uKCdhbGwnKSkgewokYXJnc1snLS1vdXRkYXRlZCddID0gdHJ1ZTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2RpcmVjdCcpKSB7CiRhcmdzWyctLWRpcmVjdCddID0gdHJ1ZTsKfQppZiAobnVsbCAhPT0gJGlucHV0LT5nZXRBcmd1bWVudCgncGFja2FnZScpKSB7CiRhcmdzWydwYWNrYWdlJ10gPSAkaW5wdXQtPmdldEFyZ3VtZW50KCdwYWNrYWdlJyk7Cn0KaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdzdHJpY3QnKSkgewokYXJnc1snLS1zdHJpY3QnXSA9IHRydWU7Cn0KaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdtYWpvci1vbmx5JykpIHsKJGFyZ3NbJy0tbWFqb3Itb25seSddID0gdHJ1ZTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ21pbm9yLW9ubHknKSkgewokYXJnc1snLS1taW5vci1vbmx5J10gPSB0cnVlOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbigncGF0Y2gtb25seScpKSB7CiRhcmdzWyctLXBhdGNoLW9ubHknXSA9IHRydWU7Cn0KaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdsb2NrZWQnKSkgewokYXJnc1snLS1sb2NrZWQnXSA9IHRydWU7Cn0KaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSkgewokYXJnc1snLS1uby1kZXYnXSA9IHRydWU7Cn0KaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdzb3J0LWJ5LWFnZScpKSB7CiRhcmdzWyctLXNvcnQtYnktYWdlJ10gPSB0cnVlOwp9CiRhcmdzWyctLWlnbm9yZS1wbGF0Zm9ybS1yZXEnXSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxJyk7CmlmICgkaW5wdXQtPmdldE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcXMnKSkgewokYXJnc1snLS1pZ25vcmUtcGxhdGZvcm0tcmVxcyddID0gdHJ1ZTsKfQokYXJnc1snLS1mb3JtYXQnXSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdmb3JtYXQnKTsKJGFyZ3NbJy0taWdub3JlJ10gPSAkaW5wdXQtPmdldE9wdGlvbignaWdub3JlJyk7CgokaW5wdXQgPSBuZXcgQXJyYXlJbnB1dCgkYXJncyk7CgpyZXR1cm4gJHRoaXMtPmdldEFwcGxpY2F0aW9uKCktPnJ1bigkaW5wdXQsICRvdXRwdXQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNQcm94eUNvbW1hbmQoKTogYm9vbAp7CnJldHVybiB0cnVlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXElnbm9yZUFsbFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXI7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblNlbGVjdG9yOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxDb21wb3NpdGVSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlGYWN0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5U2V0Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgp0cmFpdCBQYWNrYWdlRGlzY292ZXJ5VHJhaXQKewoKcHJpdmF0ZSAkcmVwb3M7Cgpwcml2YXRlICRyZXBvc2l0b3J5U2V0czsKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRSZXBvcygpOiBDb21wb3NpdGVSZXBvc2l0b3J5CnsKaWYgKG51bGwgPT09ICR0aGlzLT5yZXBvcykgewokdGhpcy0+cmVwb3MgPSBuZXcgQ29tcG9zaXRlUmVwb3NpdG9yeShhcnJheV9tZXJnZSgKW25ldyBQbGF0Zm9ybVJlcG9zaXRvcnldLApSZXBvc2l0b3J5RmFjdG9yeTo6ZGVmYXVsdFJlcG9zV2l0aERlZmF1bHRNYW5hZ2VyKCR0aGlzLT5nZXRJTygpKQopKTsKfQoKcmV0dXJuICR0aGlzLT5yZXBvczsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRSZXBvc2l0b3J5U2V0KElucHV0SW50ZXJmYWNlICRpbnB1dCwgP3N0cmluZyAkbWluaW11bVN0YWJpbGl0eSA9IG51bGwpOiBSZXBvc2l0b3J5U2V0CnsKJGtleSA9ICRtaW5pbXVtU3RhYmlsaXR5ID8/ICdkZWZhdWx0JzsKCmlmICghaXNzZXQoJHRoaXMtPnJlcG9zaXRvcnlTZXRzWyRrZXldKSkgewokdGhpcy0+cmVwb3NpdG9yeVNldHNbJGtleV0gPSAkcmVwb3NpdG9yeVNldCA9IG5ldyBSZXBvc2l0b3J5U2V0KCRtaW5pbXVtU3RhYmlsaXR5ID8/ICR0aGlzLT5nZXRNaW5pbXVtU3RhYmlsaXR5KCRpbnB1dCkpOwokcmVwb3NpdG9yeVNldC0+YWRkUmVwb3NpdG9yeSgkdGhpcy0+Z2V0UmVwb3MoKSk7Cn0KCnJldHVybiAkdGhpcy0+cmVwb3NpdG9yeVNldHNbJGtleV07Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0TWluaW11bVN0YWJpbGl0eShJbnB1dEludGVyZmFjZSAkaW5wdXQpOiBzdHJpbmcKewppZiAoJGlucHV0LT5oYXNPcHRpb24oJ3N0YWJpbGl0eScpKSB7IApyZXR1cm4gVmVyc2lvblBhcnNlcjo6bm9ybWFsaXplU3RhYmlsaXR5KCRpbnB1dC0+Z2V0T3B0aW9uKCdzdGFiaWxpdHknKSA/PyAnc3RhYmxlJyk7Cn0KCgokZmlsZSA9IEZhY3Rvcnk6OmdldENvbXBvc2VyRmlsZSgpOwppZiAoaXNfZmlsZSgkZmlsZSkgJiYgRmlsZXN5c3RlbTo6aXNSZWFkYWJsZSgkZmlsZSkgJiYgaXNfYXJyYXkoJGNvbXBvc2VyID0ganNvbl9kZWNvZGUoKHN0cmluZykgZmlsZV9nZXRfY29udGVudHMoJGZpbGUpLCB0cnVlKSkpIHsKaWYgKGlzc2V0KCRjb21wb3NlclsnbWluaW11bS1zdGFiaWxpdHknXSkpIHsKcmV0dXJuIFZlcnNpb25QYXJzZXI6Om5vcm1hbGl6ZVN0YWJpbGl0eSgkY29tcG9zZXJbJ21pbmltdW0tc3RhYmlsaXR5J10pOwp9Cn0KCnJldHVybiAnc3RhYmxlJzsKfQoKCgoKCgoKZmluYWwgcHJvdGVjdGVkIGZ1bmN0aW9uIGRldGVybWluZVJlcXVpcmVtZW50cyhJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBhcnJheSAkcmVxdWlyZXMgPSBbXSwgP1BsYXRmb3JtUmVwb3NpdG9yeSAkcGxhdGZvcm1SZXBvID0gbnVsbCwgc3RyaW5nICRwcmVmZXJyZWRTdGFiaWxpdHkgPSAnc3RhYmxlJywgYm9vbCAkdXNlQmVzdFZlcnNpb25Db25zdHJhaW50ID0gdHJ1ZSwgYm9vbCAkZml4ZWQgPSBmYWxzZSk6IGFycmF5CnsKaWYgKGNvdW50KCRyZXF1aXJlcykgPiAwKSB7CiRyZXF1aXJlcyA9ICR0aGlzLT5ub3JtYWxpemVSZXF1aXJlbWVudHMoJHJlcXVpcmVzKTsKJHJlc3VsdCA9IFtdOwokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCmZvcmVhY2ggKCRyZXF1aXJlcyBhcyAkcmVxdWlyZW1lbnQpIHsKaWYgKGlzc2V0KCRyZXF1aXJlbWVudFsndmVyc2lvbiddKSAmJiBQcmVnOjppc01hdGNoKCd7XlxkKyhcLlxkKyk/JH0nLCAkcmVxdWlyZW1lbnRbJ3ZlcnNpb24nXSkpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5UaGUgIicuJHJlcXVpcmVtZW50Wyd2ZXJzaW9uJ10uJyIgY29uc3RyYWludCBmb3IgIicuJHJlcXVpcmVtZW50WyduYW1lJ10uJyIgYXBwZWFycyB0b28gc3RyaWN0IGFuZCB3aWxsIGxpa2VseSBub3QgbWF0Y2ggd2hhdCB5b3Ugd2FudC4gU2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2NvbnN0cmFpbnRzPC93YXJuaW5nPicpOwp9CgppZiAoIWlzc2V0KCRyZXF1aXJlbWVudFsndmVyc2lvbiddKSkgewoKWyRuYW1lLCAkdmVyc2lvbl0gPSAkdGhpcy0+ZmluZEJlc3RWZXJzaW9uQW5kTmFtZUZvclBhY2thZ2UoJHRoaXMtPmdldElPKCksICRpbnB1dCwgJHJlcXVpcmVtZW50WyduYW1lJ10sICRwbGF0Zm9ybVJlcG8sICRwcmVmZXJyZWRTdGFiaWxpdHksICRmaXhlZCk7CgoKJHJlcXVpcmVtZW50WyduYW1lJ10gPSAkbmFtZTsKCmlmICgkdXNlQmVzdFZlcnNpb25Db25zdHJhaW50KSB7CiRyZXF1aXJlbWVudFsndmVyc2lvbiddID0gJHZlcnNpb247CiRpby0+d3JpdGVFcnJvcihzcHJpbnRmKAonVXNpbmcgdmVyc2lvbiA8aW5mbz4lczwvaW5mbz4gZm9yIDxpbmZvPiVzPC9pbmZvPicsCiRyZXF1aXJlbWVudFsndmVyc2lvbiddLAokcmVxdWlyZW1lbnRbJ25hbWUnXQopKTsKfSBlbHNlIHsKJHJlcXVpcmVtZW50Wyd2ZXJzaW9uJ10gPSAnZ3Vlc3MnOwp9Cn0KCiRyZXN1bHRbXSA9ICRyZXF1aXJlbWVudFsnbmFtZSddIC4gJyAnIC4gJHJlcXVpcmVtZW50Wyd2ZXJzaW9uJ107Cn0KCnJldHVybiAkcmVzdWx0Owp9CgokdmVyc2lvblBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyKCk7CgoKJGNvbXBvc2VyID0gJHRoaXMtPnRyeUNvbXBvc2VyKCk7CiRpbnN0YWxsZWRSZXBvID0gbnVsbDsKaWYgKG51bGwgIT09ICRjb21wb3NlcikgewokaW5zdGFsbGVkUmVwbyA9ICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7Cn0KJGV4aXN0aW5nUGFja2FnZXMgPSBbXTsKaWYgKG51bGwgIT09ICRpbnN0YWxsZWRSZXBvKSB7CmZvcmVhY2ggKCRpbnN0YWxsZWRSZXBvLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiRleGlzdGluZ1BhY2thZ2VzW10gPSAkcGFja2FnZS0+Z2V0TmFtZSgpOwp9Cn0KdW5zZXQoJGNvbXBvc2VyLCAkaW5zdGFsbGVkUmVwbyk7CgokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKd2hpbGUgKG51bGwgIT09ICRwYWNrYWdlID0gJGlvLT5hc2soJ1NlYXJjaCBmb3IgYSBwYWNrYWdlOiAnKSkgewokbWF0Y2hlcyA9ICR0aGlzLT5nZXRSZXBvcygpLT5zZWFyY2goJHBhY2thZ2UpOwoKaWYgKGNvdW50KCRtYXRjaGVzKSA+IDApIHsKCmZvcmVhY2ggKCRtYXRjaGVzIGFzICRwb3NpdGlvbiA9PiAkZm91bmRQYWNrYWdlKSB7CmlmIChpbl9hcnJheSgkZm91bmRQYWNrYWdlWyduYW1lJ10sICRleGlzdGluZ1BhY2thZ2VzLCB0cnVlKSkgewp1bnNldCgkbWF0Y2hlc1skcG9zaXRpb25dKTsKfQp9CiRtYXRjaGVzID0gYXJyYXlfdmFsdWVzKCRtYXRjaGVzKTsKCiRleGFjdE1hdGNoID0gZmFsc2U7CmZvcmVhY2ggKCRtYXRjaGVzIGFzICRtYXRjaCkgewppZiAoJG1hdGNoWyduYW1lJ10gPT09ICRwYWNrYWdlKSB7CiRleGFjdE1hdGNoID0gdHJ1ZTsKYnJlYWs7Cn0KfQoKCmlmICghJGV4YWN0TWF0Y2gpIHsKJHByb3ZpZGVycyA9ICR0aGlzLT5nZXRSZXBvcygpLT5nZXRQcm92aWRlcnMoJHBhY2thZ2UpOwppZiAoY291bnQoJHByb3ZpZGVycykgPiAwKSB7CmFycmF5X3Vuc2hpZnQoJG1hdGNoZXMsIFsnbmFtZScgPT4gJHBhY2thZ2UsICdkZXNjcmlwdGlvbicgPT4gJyddKTsKfQoKJGNob2ljZXMgPSBbXTsKZm9yZWFjaCAoJG1hdGNoZXMgYXMgJHBvc2l0aW9uID0+ICRmb3VuZFBhY2thZ2UpIHsKJGFiYW5kb25lZCA9ICcnOwppZiAoaXNzZXQoJGZvdW5kUGFja2FnZVsnYWJhbmRvbmVkJ10pKSB7CmlmIChpc19zdHJpbmcoJGZvdW5kUGFja2FnZVsnYWJhbmRvbmVkJ10pKSB7CiRyZXBsYWNlbWVudCA9IHNwcmludGYoJ1VzZSAlcyBpbnN0ZWFkJywgJGZvdW5kUGFja2FnZVsnYWJhbmRvbmVkJ10pOwp9IGVsc2UgewokcmVwbGFjZW1lbnQgPSAnTm8gcmVwbGFjZW1lbnQgd2FzIHN1Z2dlc3RlZCc7Cn0KJGFiYW5kb25lZCA9IHNwcmludGYoJzx3YXJuaW5nPkFiYW5kb25lZC4gJXMuPC93YXJuaW5nPicsICRyZXBsYWNlbWVudCk7Cn0KCiRjaG9pY2VzW10gPSBzcHJpbnRmKCcgPGluZm8+JTVzPC9pbmZvPiAlcyAlcycsICJbJHBvc2l0aW9uXSIsICRmb3VuZFBhY2thZ2VbJ25hbWUnXSwgJGFiYW5kb25lZCk7Cn0KCiRpby0+d3JpdGVFcnJvcihbCicnLApzcHJpbnRmKCdGb3VuZCA8aW5mbz4lczwvaW5mbz4gcGFja2FnZXMgbWF0Y2hpbmcgPGluZm8+JXM8L2luZm8+JywgY291bnQoJG1hdGNoZXMpLCAkcGFja2FnZSksCicnLApdKTsKCiRpby0+d3JpdGVFcnJvcigkY2hvaWNlcyk7CiRpby0+d3JpdGVFcnJvcignJyk7CgokdmFsaWRhdG9yID0gc3RhdGljIGZ1bmN0aW9uIChzdHJpbmcgJHNlbGVjdGlvbikgdXNlICgkbWF0Y2hlcywgJHZlcnNpb25QYXJzZXIpIHsKaWYgKCcnID09PSAkc2VsZWN0aW9uKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKGlzX251bWVyaWMoJHNlbGVjdGlvbikgJiYgaXNzZXQoJG1hdGNoZXNbKGludCkgJHNlbGVjdGlvbl0pKSB7CiRwYWNrYWdlID0gJG1hdGNoZXNbKGludCkgJHNlbGVjdGlvbl07CgpyZXR1cm4gJHBhY2thZ2VbJ25hbWUnXTsKfQoKaWYgKFByZWc6OmlzTWF0Y2goJ3teXHMqKD9QPG5hbWU+W1xTL10rKSg/OlxzKyg/UDx2ZXJzaW9uPlxTKykpP1xzKiR9JywgJHNlbGVjdGlvbiwgJHBhY2thZ2VNYXRjaGVzKSkgewppZiAoaXNzZXQoJHBhY2thZ2VNYXRjaGVzWyd2ZXJzaW9uJ10pKSB7CgoKCiR2ZXJzaW9uUGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCRwYWNrYWdlTWF0Y2hlc1sndmVyc2lvbiddKTsKCnJldHVybiAkcGFja2FnZU1hdGNoZXNbJ25hbWUnXS4nICcuJHBhY2thZ2VNYXRjaGVzWyd2ZXJzaW9uJ107Cn0KCgpyZXR1cm4gJHBhY2thZ2VNYXRjaGVzWyduYW1lJ107Cn0KCnRocm93IG5ldyBcRXhjZXB0aW9uKCdOb3QgYSB2YWxpZCBzZWxlY3Rpb24nKTsKfTsKCiRwYWNrYWdlID0gJGlvLT5hc2tBbmRWYWxpZGF0ZSgKJ0VudGVyIHBhY2thZ2UgIyB0byBhZGQsIG9yIHRoZSBjb21wbGV0ZSBwYWNrYWdlIG5hbWUgaWYgaXQgaXMgbm90IGxpc3RlZDogJywKJHZhbGlkYXRvciwKMywKJycKKTsKfQoKCmlmIChmYWxzZSAhPT0gJHBhY2thZ2UgJiYgZmFsc2UgPT09IHN0cnBvcygkcGFja2FnZSwgJyAnKSkgewokdmFsaWRhdG9yID0gc3RhdGljIGZ1bmN0aW9uIChzdHJpbmcgJGlucHV0KSB7CiRpbnB1dCA9IHRyaW0oJGlucHV0KTsKCnJldHVybiBzdHJsZW4oJGlucHV0KSA+IDAgPyAkaW5wdXQgOiBmYWxzZTsKfTsKCiRjb25zdHJhaW50ID0gJGlvLT5hc2tBbmRWYWxpZGF0ZSgKJ0VudGVyIHRoZSB2ZXJzaW9uIGNvbnN0cmFpbnQgdG8gcmVxdWlyZSAob3IgbGVhdmUgYmxhbmsgdG8gdXNlIHRoZSBsYXRlc3QgdmVyc2lvbik6ICcsCiR2YWxpZGF0b3IsCjMsCicnCik7CgppZiAoZmFsc2UgPT09ICRjb25zdHJhaW50KSB7ClssICRjb25zdHJhaW50XSA9ICR0aGlzLT5maW5kQmVzdFZlcnNpb25BbmROYW1lRm9yUGFja2FnZSgkdGhpcy0+Z2V0SU8oKSwgJGlucHV0LCAkcGFja2FnZSwgJHBsYXRmb3JtUmVwbywgJHByZWZlcnJlZFN0YWJpbGl0eSk7CgokaW8tPndyaXRlRXJyb3Ioc3ByaW50ZigKJ1VzaW5nIHZlcnNpb24gPGluZm8+JXM8L2luZm8+IGZvciA8aW5mbz4lczwvaW5mbz4nLAokY29uc3RyYWludCwKJHBhY2thZ2UKKSk7Cn0KCiRwYWNrYWdlIC49ICcgJy4kY29uc3RyYWludDsKfQoKaWYgKGZhbHNlICE9PSAkcGFja2FnZSkgewokcmVxdWlyZXNbXSA9ICRwYWNrYWdlOwokZXhpc3RpbmdQYWNrYWdlc1tdID0gZXhwbG9kZSgnICcsICRwYWNrYWdlKVswXTsKfQp9Cn0KCnJldHVybiAkcmVxdWlyZXM7Cn0KCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBmaW5kQmVzdFZlcnNpb25BbmROYW1lRm9yUGFja2FnZShJT0ludGVyZmFjZSAkaW8sIElucHV0SW50ZXJmYWNlICRpbnB1dCwgc3RyaW5nICRuYW1lLCA/UGxhdGZvcm1SZXBvc2l0b3J5ICRwbGF0Zm9ybVJlcG8gPSBudWxsLCBzdHJpbmcgJHByZWZlcnJlZFN0YWJpbGl0eSA9ICdzdGFibGUnLCBib29sICRmaXhlZCA9IGZhbHNlKTogYXJyYXkKewoKaWYgKCRpbnB1dC0+aGFzT3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxcycpICYmICRpbnB1dC0+aGFzT3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxJykpIHsKJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgPSAkdGhpcy0+Z2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkaW5wdXQpOwp9IGVsc2UgewokcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciA9IFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5OjppZ25vcmVOb3RoaW5nKCk7Cn0KCgokcmVwb1NldCA9ICR0aGlzLT5nZXRSZXBvc2l0b3J5U2V0KCRpbnB1dCk7CiR2ZXJzaW9uU2VsZWN0b3IgPSBuZXcgVmVyc2lvblNlbGVjdG9yKCRyZXBvU2V0LCAkcGxhdGZvcm1SZXBvKTsKJGVmZmVjdGl2ZU1pbmltdW1TdGFiaWxpdHkgPSAkdGhpcy0+Z2V0TWluaW11bVN0YWJpbGl0eSgkaW5wdXQpOwoKJHBhY2thZ2UgPSAkdmVyc2lvblNlbGVjdG9yLT5maW5kQmVzdENhbmRpZGF0ZSgkbmFtZSwgbnVsbCwgJHByZWZlcnJlZFN0YWJpbGl0eSwgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIsIDAsICR0aGlzLT5nZXRJTygpKTsKCmlmIChmYWxzZSA9PT0gJHBhY2thZ2UpIHsKCgppZiAoJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXItPmlzSWdub3JlZCgkbmFtZSkpIHsKcmV0dXJuIFskbmFtZSwgJyonXTsKfQoKCiRwcm92aWRlcnMgPSAkcmVwb1NldC0+Z2V0UHJvdmlkZXJzKCRuYW1lKTsKaWYgKGNvdW50KCRwcm92aWRlcnMpID4gMCkgewokY29uc3RyYWludCA9ICcqJzsKaWYgKCRpbnB1dC0+aXNJbnRlcmFjdGl2ZSgpKSB7CiRjb25zdHJhaW50ID0gJHRoaXMtPmdldElPKCktPmFza0FuZFZhbGlkYXRlKCdQYWNrYWdlICI8aW5mbz4nLiRuYW1lLic8L2luZm8+IiBkb2VzIG5vdCBleGlzdCBidXQgaXMgcHJvdmlkZWQgYnkgJy5jb3VudCgkcHJvdmlkZXJzKS4nIHBhY2thZ2VzLiBXaGljaCB2ZXJzaW9uIGNvbnN0cmFpbnQgd291bGQgeW91IGxpa2UgdG8gdXNlPyBbPGluZm8+KjwvaW5mbz5dICcsIHN0YXRpYyBmdW5jdGlvbiAoJHZhbHVlKSB7CiRwYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwokcGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCR2YWx1ZSk7CgpyZXR1cm4gJHZhbHVlOwp9LCAzLCAnKicpOwp9CgpyZXR1cm4gWyRuYW1lLCAkY29uc3RyYWludF07Cn0KCgppZiAoISgkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciBpbnN0YW5jZW9mIElnbm9yZUFsbFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpICYmIGZhbHNlICE9PSAoJGNhbmRpZGF0ZSA9ICR2ZXJzaW9uU2VsZWN0b3ItPmZpbmRCZXN0Q2FuZGlkYXRlKCRuYW1lLCBudWxsLCAkcHJlZmVycmVkU3RhYmlsaXR5LCBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTo6aWdub3JlQWxsKCkpKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKAonUGFja2FnZSAlcyBoYXMgcmVxdWlyZW1lbnRzIGluY29tcGF0aWJsZSB3aXRoIHlvdXIgUEhQIHZlcnNpb24sIFBIUCBleHRlbnNpb25zIGFuZCBDb21wb3NlciB2ZXJzaW9uJyAuICR0aGlzLT5nZXRQbGF0Zm9ybUV4Y2VwdGlvbkRldGFpbHMoJGNhbmRpZGF0ZSwgJHBsYXRmb3JtUmVwbyksCiRuYW1lCikpOwp9CgppZiAoZmFsc2UgIT09ICgkcGFja2FnZSA9ICR2ZXJzaW9uU2VsZWN0b3ItPmZpbmRCZXN0Q2FuZGlkYXRlKCRuYW1lLCBudWxsLCAkcHJlZmVycmVkU3RhYmlsaXR5LCAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciwgUmVwb3NpdG9yeVNldDo6QUxMT1dfVU5BQ0NFUFRBQkxFX1NUQUJJTElUSUVTKSkpIHsKCmlmIChmYWxzZSAhPT0gKCRhbGxSZXBvc1BhY2thZ2UgPSAkdmVyc2lvblNlbGVjdG9yLT5maW5kQmVzdENhbmRpZGF0ZSgkbmFtZSwgbnVsbCwgJHByZWZlcnJlZFN0YWJpbGl0eSwgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIsIFJlcG9zaXRvcnlTZXQ6OkFMTE9XX1NIQURPV0VEX1JFUE9TSVRPUklFUykpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKAonUGFja2FnZSAnLiRuYW1lLicgZXhpc3RzIGluICcuJGFsbFJlcG9zUGFja2FnZS0+Z2V0UmVwb3NpdG9yeSgpLT5nZXRSZXBvTmFtZSgpLicgYW5kICcuJHBhY2thZ2UtPmdldFJlcG9zaXRvcnkoKS0+Z2V0UmVwb05hbWUoKS4nIHdoaWNoIGhhcyBhIGhpZ2hlciByZXBvc2l0b3J5IHByaW9yaXR5LiBUaGUgcGFja2FnZXMgZnJvbSB0aGUgaGlnaGVyIHByaW9yaXR5IHJlcG9zaXRvcnkgZG8gbm90IG1hdGNoIHlvdXIgbWluaW11bS1zdGFiaWxpdHkgYW5kIGFyZSB0aGVyZWZvcmUgbm90IGluc3RhbGxhYmxlLiBUaGF0IHJlcG9zaXRvcnkgaXMgY2Fub25pY2FsIHNvIHRoZSBsb3dlciBwcmlvcml0eSByZXBvXCdzIHBhY2thZ2VzIGFyZSBub3QgaW5zdGFsbGFibGUuIFNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9yZXBvcHJpbyBmb3IgZGV0YWlscyBhbmQgYXNzaXN0YW5jZS4nCik7Cn0KCnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoCidDb3VsZCBub3QgZmluZCBhIHZlcnNpb24gb2YgcGFja2FnZSAlcyBtYXRjaGluZyB5b3VyIG1pbmltdW0tc3RhYmlsaXR5ICglcykuIFJlcXVpcmUgaXQgd2l0aCBhbiBleHBsaWNpdCB2ZXJzaW9uIGNvbnN0cmFpbnQgYWxsb3dpbmcgaXRzIGRlc2lyZWQgc3RhYmlsaXR5LicsCiRuYW1lLAokZWZmZWN0aXZlTWluaW11bVN0YWJpbGl0eQopKTsKfQoKaWYgKCEkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciBpbnN0YW5jZW9mIElnbm9yZUFsbFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgJiYgZmFsc2UgIT09ICgkY2FuZGlkYXRlID0gJHZlcnNpb25TZWxlY3Rvci0+ZmluZEJlc3RDYW5kaWRhdGUoJG5hbWUsIG51bGwsICRwcmVmZXJyZWRTdGFiaWxpdHksIFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5OjppZ25vcmVBbGwoKSwgUmVwb3NpdG9yeVNldDo6QUxMT1dfVU5BQ0NFUFRBQkxFX1NUQUJJTElUSUVTKSkpIHsKJGFkZGl0aW9uYWwgPSAnJzsKaWYgKGZhbHNlID09PSAkdmVyc2lvblNlbGVjdG9yLT5maW5kQmVzdENhbmRpZGF0ZSgkbmFtZSwgbnVsbCwgJHByZWZlcnJlZFN0YWJpbGl0eSwgUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk6Omlnbm9yZUFsbCgpKSkgewokYWRkaXRpb25hbCA9IFBIUF9FT0wuUEhQX0VPTC4nQWRkaXRpb25hbGx5LCB0aGUgcGFja2FnZSB3YXMgb25seSBmb3VuZCB3aXRoIGEgc3RhYmlsaXR5IG9mICInLiRjYW5kaWRhdGUtPmdldFN0YWJpbGl0eSgpLiciIHdoaWxlIHlvdXIgbWluaW11bSBzdGFiaWxpdHkgaXMgIicuJGVmZmVjdGl2ZU1pbmltdW1TdGFiaWxpdHkuJyIuJzsKfQoKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZigKJ0NvdWxkIG5vdCBmaW5kIHBhY2thZ2UgJXMgaW4gYW55IHZlcnNpb24gbWF0Y2hpbmcgeW91ciBQSFAgdmVyc2lvbiwgUEhQIGV4dGVuc2lvbnMgYW5kIENvbXBvc2VyIHZlcnNpb24nIC4gJHRoaXMtPmdldFBsYXRmb3JtRXhjZXB0aW9uRGV0YWlscygkY2FuZGlkYXRlLCAkcGxhdGZvcm1SZXBvKSAuICclcycsCiRuYW1lLAokYWRkaXRpb25hbAopKTsKfQoKCiRzaW1pbGFyID0gJHRoaXMtPmZpbmRTaW1pbGFyKCRuYW1lKTsKaWYgKGNvdW50KCRzaW1pbGFyKSA+IDApIHsKaWYgKGluX2FycmF5KCRuYW1lLCAkc2ltaWxhciwgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZigKIkNvdWxkIG5vdCBmaW5kIHBhY2thZ2UgJXMuIEl0IHdhcyBob3dldmVyIGZvdW5kIHZpYSByZXBvc2l0b3J5IHNlYXJjaCwgd2hpY2ggaW5kaWNhdGVzIGEgY29uc2lzdGVuY3kgaXNzdWUgd2l0aCB0aGUgcmVwb3NpdG9yeS4iLAokbmFtZQopKTsKfQoKaWYgKCRpbnB1dC0+aXNJbnRlcmFjdGl2ZSgpKSB7CiRyZXN1bHQgPSAkaW8tPnNlbGVjdCgiPGVycm9yPkNvdWxkIG5vdCBmaW5kIHBhY2thZ2UgJG5hbWUuPC9lcnJvcj5cblBpY2sgb25lIG9mIHRoZXNlIG9yIGxlYXZlIGVtcHR5IHRvIGFib3J0OiIsICRzaW1pbGFyLCBmYWxzZSwgMSk7CmlmICgkcmVzdWx0ICE9PSBmYWxzZSkgewpyZXR1cm4gJHRoaXMtPmZpbmRCZXN0VmVyc2lvbkFuZE5hbWVGb3JQYWNrYWdlKCRpbywgJGlucHV0LCAkc2ltaWxhclskcmVzdWx0XSwgJHBsYXRmb3JtUmVwbywgJHByZWZlcnJlZFN0YWJpbGl0eSwgJGZpeGVkKTsKfQp9Cgp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKAoiQ291bGQgbm90IGZpbmQgcGFja2FnZSAlcy5cblxuRGlkIHlvdSBtZWFuICIgLiAoY291bnQoJHNpbWlsYXIpID4gMSA/ICdvbmUgb2YgdGhlc2UnIDogJ3RoaXMnKSAuICI/XG4gICAgJXMiLAokbmFtZSwKaW1wbG9kZSgiXG4gICAgIiwgJHNpbWlsYXIpCikpOwp9Cgp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKAonQ291bGQgbm90IGZpbmQgYSBtYXRjaGluZyB2ZXJzaW9uIG9mIHBhY2thZ2UgJXMuIENoZWNrIHRoZSBwYWNrYWdlIHNwZWxsaW5nLCB5b3VyIHZlcnNpb24gY29uc3RyYWludCBhbmQgdGhhdCB0aGUgcGFja2FnZSBpcyBhdmFpbGFibGUgaW4gYSBzdGFiaWxpdHkgd2hpY2ggbWF0Y2hlcyB5b3VyIG1pbmltdW0tc3RhYmlsaXR5ICglcykuJywKJG5hbWUsCiRlZmZlY3RpdmVNaW5pbXVtU3RhYmlsaXR5CikpOwp9CgpyZXR1cm4gWwokcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLAokZml4ZWQgPyAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpIDogJHZlcnNpb25TZWxlY3Rvci0+ZmluZFJlY29tbWVuZGVkUmVxdWlyZVZlcnNpb24oJHBhY2thZ2UpLApdOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGZpbmRTaW1pbGFyKHN0cmluZyAkcGFja2FnZSk6IGFycmF5CnsKdHJ5IHsKaWYgKG51bGwgPT09ICR0aGlzLT5yZXBvcykgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdmaW5kU2ltaWxhciB3YXMgY2FsbGVkIGJlZm9yZSAkdGhpcy0+cmVwb3Mgd2FzIGluaXRpYWxpemVkJyk7Cn0KJHJlc3VsdHMgPSAkdGhpcy0+cmVwb3MtPnNlYXJjaCgkcGFja2FnZSk7Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGUpIHsKaWYgKCRlIGluc3RhbmNlb2YgXExvZ2ljRXhjZXB0aW9uKSB7CnRocm93ICRlOwp9CgoKcmV0dXJuIFtdOwp9CiRzaW1pbGFyUGFja2FnZXMgPSBbXTsKCiRpbnN0YWxsZWRSZXBvID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKCmZvcmVhY2ggKCRyZXN1bHRzIGFzICRyZXN1bHQpIHsKaWYgKG51bGwgIT09ICRpbnN0YWxsZWRSZXBvLT5maW5kUGFja2FnZSgkcmVzdWx0WyduYW1lJ10sICcqJykpIHsKCmNvbnRpbnVlOwp9CiRzaW1pbGFyUGFja2FnZXNbJHJlc3VsdFsnbmFtZSddXSA9IGxldmVuc2h0ZWluKCRwYWNrYWdlLCAkcmVzdWx0WyduYW1lJ10pOwp9CmFzb3J0KCRzaW1pbGFyUGFja2FnZXMpOwoKcmV0dXJuIGFycmF5X2tleXMoYXJyYXlfc2xpY2UoJHNpbWlsYXJQYWNrYWdlcywgMCwgNSkpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldFBsYXRmb3JtRXhjZXB0aW9uRGV0YWlscyhQYWNrYWdlSW50ZXJmYWNlICRjYW5kaWRhdGUsID9QbGF0Zm9ybVJlcG9zaXRvcnkgJHBsYXRmb3JtUmVwbyA9IG51bGwpOiBzdHJpbmcKewokZGV0YWlscyA9IFtdOwppZiAobnVsbCA9PT0gJHBsYXRmb3JtUmVwbykgewpyZXR1cm4gJyc7Cn0KCmZvcmVhY2ggKCRjYW5kaWRhdGUtPmdldFJlcXVpcmVzKCkgYXMgJGxpbmspIHsKaWYgKCFQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRsaW5rLT5nZXRUYXJnZXQoKSkpIHsKY29udGludWU7Cn0KJHBsYXRmb3JtUGtnID0gJHBsYXRmb3JtUmVwby0+ZmluZFBhY2thZ2UoJGxpbmstPmdldFRhcmdldCgpLCAnKicpOwppZiAobnVsbCA9PT0gJHBsYXRmb3JtUGtnKSB7CmlmICgkcGxhdGZvcm1SZXBvLT5pc1BsYXRmb3JtUGFja2FnZURpc2FibGVkKCRsaW5rLT5nZXRUYXJnZXQoKSkpIHsKJGRldGFpbHNbXSA9ICRjYW5kaWRhdGUtPmdldFByZXR0eU5hbWUoKS4nICcuJGNhbmRpZGF0ZS0+Z2V0UHJldHR5VmVyc2lvbigpLicgcmVxdWlyZXMgJy4kbGluay0+Z2V0VGFyZ2V0KCkuJyAnLiRsaW5rLT5nZXRQcmV0dHlDb25zdHJhaW50KCkuJyBidXQgaXQgaXMgZGlzYWJsZWQgYnkgeW91ciBwbGF0Zm9ybSBjb25maWcuIEVuYWJsZSBpdCBhZ2FpbiB3aXRoICJjb21wb3NlciBjb25maWcgcGxhdGZvcm0uJy4kbGluay0+Z2V0VGFyZ2V0KCkuJyAtLXVuc2V0Ii4nOwp9IGVsc2UgewokZGV0YWlsc1tdID0gJGNhbmRpZGF0ZS0+Z2V0UHJldHR5TmFtZSgpLicgJy4kY2FuZGlkYXRlLT5nZXRQcmV0dHlWZXJzaW9uKCkuJyByZXF1aXJlcyAnLiRsaW5rLT5nZXRUYXJnZXQoKS4nICcuJGxpbmstPmdldFByZXR0eUNvbnN0cmFpbnQoKS4nIGJ1dCBpdCBpcyBub3QgcHJlc2VudC4nOwp9CmNvbnRpbnVlOwp9CmlmICghJGxpbmstPmdldENvbnN0cmFpbnQoKS0+bWF0Y2hlcyhuZXcgQ29uc3RyYWludCgnPT0nLCAkcGxhdGZvcm1Qa2ctPmdldFZlcnNpb24oKSkpKSB7CiRwbGF0Zm9ybVBrZ1ZlcnNpb24gPSAkcGxhdGZvcm1Qa2ctPmdldFByZXR0eVZlcnNpb24oKTsKJHBsYXRmb3JtRXh0cmEgPSAkcGxhdGZvcm1Qa2ctPmdldEV4dHJhKCk7CmlmIChpc3NldCgkcGxhdGZvcm1FeHRyYVsnY29uZmlnLnBsYXRmb3JtJ10pICYmICRwbGF0Zm9ybVBrZyBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSkgewokcGxhdGZvcm1Qa2dWZXJzaW9uIC49ICcgKCcuJHBsYXRmb3JtUGtnLT5nZXREZXNjcmlwdGlvbigpLicpJzsKfQokZGV0YWlsc1tdID0gJGNhbmRpZGF0ZS0+Z2V0UHJldHR5TmFtZSgpLicgJy4kY2FuZGlkYXRlLT5nZXRQcmV0dHlWZXJzaW9uKCkuJyByZXF1aXJlcyAnLiRsaW5rLT5nZXRUYXJnZXQoKS4nICcuJGxpbmstPmdldFByZXR0eUNvbnN0cmFpbnQoKS4nIHdoaWNoIGRvZXMgbm90IG1hdGNoIHlvdXIgaW5zdGFsbGVkIHZlcnNpb24gJy4kcGxhdGZvcm1Qa2dWZXJzaW9uLicuJzsKfQp9CgppZiAoY291bnQoJGRldGFpbHMpID09PSAwKSB7CnJldHVybiAnJzsKfQoKcmV0dXJuICc6Jy5QSFBfRU9MLicgIC0gJyAuIGltcGxvZGUoUEhQX0VPTC4nICAtICcsICRkZXRhaWxzKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwoKCgoKY2xhc3MgUHJvaGliaXRzQ29tbWFuZCBleHRlbmRzIEJhc2VEZXBlbmRlbmN5Q29tbWFuZAp7CnVzZSBDb21wbGV0aW9uVHJhaXQ7CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ3Byb2hpYml0cycpCi0+c2V0QWxpYXNlcyhbJ3doeS1ub3QnXSkKLT5zZXREZXNjcmlwdGlvbignU2hvd3Mgd2hpY2ggcGFja2FnZXMgcHJldmVudCB0aGUgZ2l2ZW4gcGFja2FnZSBmcm9tIGJlaW5nIGluc3RhbGxlZCcpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dEFyZ3VtZW50KHNlbGY6OkFSR1VNRU5UX1BBQ0tBR0UsIElucHV0QXJndW1lbnQ6OlJFUVVJUkVELCAnUGFja2FnZSB0byBpbnNwZWN0JywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RBdmFpbGFibGVQYWNrYWdlKCkpLApuZXcgSW5wdXRBcmd1bWVudChzZWxmOjpBUkdVTUVOVF9DT05TVFJBSU5ULCBJbnB1dEFyZ3VtZW50OjpSRVFVSVJFRCwgJ1ZlcnNpb24gY29uc3RyYWludCwgd2hpY2ggdmVyc2lvbiB5b3UgZXhwZWN0ZWQgdG8gYmUgaW5zdGFsbGVkJyksCm5ldyBJbnB1dE9wdGlvbihzZWxmOjpPUFRJT05fUkVDVVJTSVZFLCAncicsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUmVjdXJzaXZlbHkgcmVzb2x2ZXMgdXAgdG8gdGhlIHJvb3QgcGFja2FnZScpLApuZXcgSW5wdXRPcHRpb24oc2VsZjo6T1BUSU9OX1RSRUUsICd0JywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdQcmludHMgdGhlIHJlc3VsdHMgYXMgYSBuZXN0ZWQgdHJlZScpLApuZXcgSW5wdXRPcHRpb24oJ2xvY2tlZCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUmVhZCBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGZyb20gY29tcG9zZXIubG9jaycpLApdKQotPnNldEhlbHAoCjw8PEVPVApEaXNwbGF5cyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB3aHkgYSBwYWNrYWdlIGNhbm5vdCBiZSBpbnN0YWxsZWQuCgo8aW5mbz5waHAgY29tcG9zZXIucGhhciBwcm9oaWJpdHMgY29tcG9zZXIvY29tcG9zZXI8L2luZm8+CgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNwcm9oaWJpdHMtd2h5LW5vdApFT1QKKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewpyZXR1cm4gcGFyZW50Ojpkb0V4ZWN1dGUoJGlucHV0LCAkb3V0cHV0LCB0cnVlKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cSW5zdGFsbE9wZXJhdGlvbjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cVW5pbnN0YWxsT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFRyYW5zYWN0aW9uOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUGx1Z2luXENvbW1hbmRFdmVudDsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5FdmVudHM7CnVzZSBDb21wb3NlclxTY3JpcHRcU2NyaXB0RXZlbnRzOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKY2xhc3MgUmVpbnN0YWxsQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKdXNlIENvbXBsZXRpb25UcmFpdDsKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgncmVpbnN0YWxsJykKLT5zZXREZXNjcmlwdGlvbignVW5pbnN0YWxscyBhbmQgcmVpbnN0YWxscyB0aGUgZ2l2ZW4gcGFja2FnZSBuYW1lcycpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dE9wdGlvbigncHJlZmVyLXNvdXJjZScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRm9yY2VzIGluc3RhbGxhdGlvbiBmcm9tIHBhY2thZ2Ugc291cmNlcyB3aGVuIHBvc3NpYmxlLCBpbmNsdWRpbmcgVkNTIGluZm9ybWF0aW9uLicpLApuZXcgSW5wdXRPcHRpb24oJ3ByZWZlci1kaXN0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdGb3JjZXMgaW5zdGFsbGF0aW9uIGZyb20gcGFja2FnZSBkaXN0IChkZWZhdWx0IGJlaGF2aW9yKS4nKSwKbmV3IElucHV0T3B0aW9uKCdwcmVmZXItaW5zdGFsbCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0ZvcmNlcyBpbnN0YWxsYXRpb24gZnJvbSBwYWNrYWdlIGRpc3R8c291cmNlfGF1dG8gKGF1dG8gY2hvb3NlcyBzb3VyY2UgZm9yIGRldiB2ZXJzaW9ucywgZGlzdCBmb3IgdGhlIHJlc3QpLicsIG51bGwsICR0aGlzLT5zdWdnZXN0UHJlZmVySW5zdGFsbCgpKSwKbmV3IElucHV0T3B0aW9uKCduby1hdXRvbG9hZGVyJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTa2lwcyBhdXRvbG9hZGVyIGdlbmVyYXRpb24nKSwKbmV3IElucHV0T3B0aW9uKCduby1wcm9ncmVzcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRG8gbm90IG91dHB1dCBkb3dubG9hZCBwcm9ncmVzcy4nKSwKbmV3IElucHV0T3B0aW9uKCdvcHRpbWl6ZS1hdXRvbG9hZGVyJywgJ28nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ09wdGltaXplIGF1dG9sb2FkZXIgZHVyaW5nIGF1dG9sb2FkZXIgZHVtcCcpLApuZXcgSW5wdXRPcHRpb24oJ2NsYXNzbWFwLWF1dGhvcml0YXRpdmUnLCAnYScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQXV0b2xvYWQgY2xhc3NlcyBmcm9tIHRoZSBjbGFzc21hcCBvbmx5LiBJbXBsaWNpdGx5IGVuYWJsZXMgYC0tb3B0aW1pemUtYXV0b2xvYWRlcmAuJyksCm5ldyBJbnB1dE9wdGlvbignYXBjdS1hdXRvbG9hZGVyJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdVc2UgQVBDdSB0byBjYWNoZSBmb3VuZC9ub3QtZm91bmQgY2xhc3Nlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdhcGN1LWF1dG9sb2FkZXItcHJlZml4JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnVXNlIGEgY3VzdG9tIHByZWZpeCBmb3IgdGhlIEFQQ3UgYXV0b2xvYWRlciBjYWNoZS4gSW1wbGljaXRseSBlbmFibGVzIC0tYXBjdS1hdXRvbG9hZGVyJyksCm5ldyBJbnB1dE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCB8IElucHV0T3B0aW9uOjpWQUxVRV9JU19BUlJBWSwgJ0lnbm9yZSBhIHNwZWNpZmljIHBsYXRmb3JtIHJlcXVpcmVtZW50IChwaHAgJiBleHQtIHBhY2thZ2VzKS4nKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnSWdub3JlIGFsbCBwbGF0Zm9ybSByZXF1aXJlbWVudHMgKHBocCAmIGV4dC0gcGFja2FnZXMpLicpLApuZXcgSW5wdXRPcHRpb24oJ3R5cGUnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQgfCBJbnB1dE9wdGlvbjo6VkFMVUVfSVNfQVJSQVksICdGaWx0ZXIgcGFja2FnZXMgdG8gcmVpbnN0YWxsIGJ5IHR5cGUocyknLCBudWxsLCAkdGhpcy0+c3VnZ2VzdEluc3RhbGxlZFBhY2thZ2VUeXBlcyhmYWxzZSkpLApuZXcgSW5wdXRBcmd1bWVudCgncGFja2FnZXMnLCBJbnB1dEFyZ3VtZW50OjpJU19BUlJBWSwgJ0xpc3Qgb2YgcGFja2FnZSBuYW1lcyB0byByZWluc3RhbGwsIGNhbiBpbmNsdWRlIGEgd2lsZGNhcmQgKCopIHRvIG1hdGNoIGFueSBzdWJzdHJpbmcuJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RJbnN0YWxsZWRQYWNrYWdlKGZhbHNlKSksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSA8aW5mbz5yZWluc3RhbGw8L2luZm8+IGNvbW1hbmQgbG9va3MgdXAgaW5zdGFsbGVkIHBhY2thZ2VzIGJ5IG5hbWUsCnVuaW5zdGFsbHMgdGhlbSBhbmQgcmVpbnN0YWxscyB0aGVtLiBUaGlzIGxldHMgeW91IGRvIGEgY2xlYW4gaW5zdGFsbApvZiBhIHBhY2thZ2UgaWYgeW91IG1lc3NlZCB3aXRoIGl0cyBmaWxlcywgb3IgaWYgeW91IHdpc2ggdG8gY2hhbmdlCnRoZSBpbnN0YWxsYXRpb24gdHlwZSB1c2luZyAtLXByZWZlci1pbnN0YWxsLgoKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgcmVpbnN0YWxsIGFjbWUvZm9vICJhY21lL2Jhci0qIjwvaW5mbz4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI3JlaW5zdGFsbApFT1QKKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKCiRsb2NhbFJlcG8gPSAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpOwokcGFja2FnZXNUb1JlaW5zdGFsbCA9IFtdOwokcGFja2FnZU5hbWVzVG9SZWluc3RhbGwgPSBbXTsKaWYgKFxjb3VudCgkaW5wdXQtPmdldE9wdGlvbigndHlwZScpKSA+IDApIHsKaWYgKFxjb3VudCgkaW5wdXQtPmdldEFyZ3VtZW50KCdwYWNrYWdlcycpKSA+IDApIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1lvdSBjYW5ub3Qgc3BlY2lmeSBwYWNrYWdlIG5hbWVzIGFuZCBmaWx0ZXIgYnkgdHlwZSBhdCB0aGUgc2FtZSB0aW1lLicpOwp9CmZvcmVhY2ggKCRsb2NhbFJlcG8tPmdldENhbm9uaWNhbFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKGluX2FycmF5KCRwYWNrYWdlLT5nZXRUeXBlKCksICRpbnB1dC0+Z2V0T3B0aW9uKCd0eXBlJyksIHRydWUpKSB7CiRwYWNrYWdlc1RvUmVpbnN0YWxsW10gPSAkcGFja2FnZTsKJHBhY2thZ2VOYW1lc1RvUmVpbnN0YWxsW10gPSAkcGFja2FnZS0+Z2V0TmFtZSgpOwp9Cn0KfSBlbHNlIHsKaWYgKFxjb3VudCgkaW5wdXQtPmdldEFyZ3VtZW50KCdwYWNrYWdlcycpKSA9PT0gMCkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignWW91IG11c3QgcGFzcyBvbmUgb3IgbW9yZSBwYWNrYWdlIG5hbWVzIHRvIGJlIHJlaW5zdGFsbGVkLicpOwp9CmZvcmVhY2ggKCRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2VzJykgYXMgJHBhdHRlcm4pIHsKJHBhdHRlcm5SZWdleHAgPSBCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVUb1JlZ2V4cCgkcGF0dGVybik7CiRtYXRjaGVkID0gZmFsc2U7CmZvcmVhY2ggKCRsb2NhbFJlcG8tPmdldENhbm9uaWNhbFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKFByZWc6OmlzTWF0Y2goJHBhdHRlcm5SZWdleHAsICRwYWNrYWdlLT5nZXROYW1lKCkpKSB7CiRtYXRjaGVkID0gdHJ1ZTsKJHBhY2thZ2VzVG9SZWluc3RhbGxbXSA9ICRwYWNrYWdlOwokcGFja2FnZU5hbWVzVG9SZWluc3RhbGxbXSA9ICRwYWNrYWdlLT5nZXROYW1lKCk7Cn0KfQoKaWYgKCEkbWF0Y2hlZCkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlBhdHRlcm4gIicgLiAkcGF0dGVybiAuICciIGRvZXMgbm90IG1hdGNoIGFueSBjdXJyZW50bHkgaW5zdGFsbGVkIHBhY2thZ2VzLjwvd2FybmluZz4nKTsKfQp9Cn0KCmlmICgwID09PSBcY291bnQoJHBhY2thZ2VzVG9SZWluc3RhbGwpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Rm91bmQgbm8gcGFja2FnZXMgdG8gcmVpbnN0YWxsLCBhYm9ydGluZy48L3dhcm5pbmc+Jyk7CgpyZXR1cm4gMTsKfQoKJHVuaW5zdGFsbE9wZXJhdGlvbnMgPSBbXTsKZm9yZWFjaCAoJHBhY2thZ2VzVG9SZWluc3RhbGwgYXMgJHBhY2thZ2UpIHsKJHVuaW5zdGFsbE9wZXJhdGlvbnNbXSA9IG5ldyBVbmluc3RhbGxPcGVyYXRpb24oJHBhY2thZ2UpOwp9CgoKJHByZXNlbnRQYWNrYWdlcyA9ICRsb2NhbFJlcG8tPmdldFBhY2thZ2VzKCk7CiRyZXN1bHRQYWNrYWdlcyA9ICRwcmVzZW50UGFja2FnZXM7CmZvcmVhY2ggKCRwcmVzZW50UGFja2FnZXMgYXMgJGluZGV4ID0+ICRwYWNrYWdlKSB7CmlmIChpbl9hcnJheSgkcGFja2FnZS0+Z2V0TmFtZSgpLCAkcGFja2FnZU5hbWVzVG9SZWluc3RhbGwsIHRydWUpKSB7CnVuc2V0KCRwcmVzZW50UGFja2FnZXNbJGluZGV4XSk7Cn0KfQokdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oJHByZXNlbnRQYWNrYWdlcywgJHJlc3VsdFBhY2thZ2VzKTsKJGluc3RhbGxPcGVyYXRpb25zID0gJHRyYW5zYWN0aW9uLT5nZXRPcGVyYXRpb25zKCk7CgoKJGluc3RhbGxPcmRlciA9IFtdOwpmb3JlYWNoICgkaW5zdGFsbE9wZXJhdGlvbnMgYXMgJGluZGV4ID0+ICRvcCkgewppZiAoJG9wIGluc3RhbmNlb2YgSW5zdGFsbE9wZXJhdGlvbiAmJiAhJG9wLT5nZXRQYWNrYWdlKCkgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJGluc3RhbGxPcmRlclskb3AtPmdldFBhY2thZ2UoKS0+Z2V0TmFtZSgpXSA9ICRpbmRleDsKfQp9CnVzb3J0KCR1bmluc3RhbGxPcGVyYXRpb25zLCBzdGF0aWMgZnVuY3Rpb24gKCRhLCAkYikgdXNlICgkaW5zdGFsbE9yZGVyKTogaW50IHsKcmV0dXJuICRpbnN0YWxsT3JkZXJbJGItPmdldFBhY2thZ2UoKS0+Z2V0TmFtZSgpXSAtICRpbnN0YWxsT3JkZXJbJGEtPmdldFBhY2thZ2UoKS0+Z2V0TmFtZSgpXTsKfSk7CgokY29tbWFuZEV2ZW50ID0gbmV3IENvbW1hbmRFdmVudChQbHVnaW5FdmVudHM6OkNPTU1BTkQsICdyZWluc3RhbGwnLCAkaW5wdXQsICRvdXRwdXQpOwokZXZlbnREaXNwYXRjaGVyID0gJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKTsKJGV2ZW50RGlzcGF0Y2hlci0+ZGlzcGF0Y2goJGNvbW1hbmRFdmVudC0+Z2V0TmFtZSgpLCAkY29tbWFuZEV2ZW50KTsKCiRjb25maWcgPSAkY29tcG9zZXItPmdldENvbmZpZygpOwpbJHByZWZlclNvdXJjZSwgJHByZWZlckRpc3RdID0gJHRoaXMtPmdldFByZWZlcnJlZEluc3RhbGxPcHRpb25zKCRjb25maWcsICRpbnB1dCk7CgokaW5zdGFsbGF0aW9uTWFuYWdlciA9ICRjb21wb3Nlci0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpOwokZG93bmxvYWRNYW5hZ2VyID0gJGNvbXBvc2VyLT5nZXREb3dubG9hZE1hbmFnZXIoKTsKJHBhY2thZ2UgPSAkY29tcG9zZXItPmdldFBhY2thZ2UoKTsKCiRpbnN0YWxsYXRpb25NYW5hZ2VyLT5zZXRPdXRwdXRQcm9ncmVzcyghJGlucHV0LT5nZXRPcHRpb24oJ25vLXByb2dyZXNzJykpOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLXBsdWdpbnMnKSkgewokaW5zdGFsbGF0aW9uTWFuYWdlci0+ZGlzYWJsZVBsdWdpbnMoKTsKfQoKJGRvd25sb2FkTWFuYWdlci0+c2V0UHJlZmVyU291cmNlKCRwcmVmZXJTb3VyY2UpOwokZG93bmxvYWRNYW5hZ2VyLT5zZXRQcmVmZXJEaXN0KCRwcmVmZXJEaXN0KTsKCiRkZXZNb2RlID0gJGxvY2FsUmVwby0+Z2V0RGV2TW9kZSgpICE9PSBudWxsID8gJGxvY2FsUmVwby0+Z2V0RGV2TW9kZSgpIDogdHJ1ZTsKClBsYXRmb3JtOjpwdXRFbnYoJ0NPTVBPU0VSX0RFVl9NT0RFJywgJGRldk1vZGUgPyAnMScgOiAnMCcpOwokZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaFNjcmlwdChTY3JpcHRFdmVudHM6OlBSRV9JTlNUQUxMX0NNRCwgJGRldk1vZGUpOwoKJGluc3RhbGxhdGlvbk1hbmFnZXItPmV4ZWN1dGUoJGxvY2FsUmVwbywgJHVuaW5zdGFsbE9wZXJhdGlvbnMsICRkZXZNb2RlKTsKJGluc3RhbGxhdGlvbk1hbmFnZXItPmV4ZWN1dGUoJGxvY2FsUmVwbywgJGluc3RhbGxPcGVyYXRpb25zLCAkZGV2TW9kZSk7CgppZiAoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1hdXRvbG9hZGVyJykpIHsKJG9wdGltaXplID0gJGlucHV0LT5nZXRPcHRpb24oJ29wdGltaXplLWF1dG9sb2FkZXInKSB8fCAkY29uZmlnLT5nZXQoJ29wdGltaXplLWF1dG9sb2FkZXInKTsKJGF1dGhvcml0YXRpdmUgPSAkaW5wdXQtPmdldE9wdGlvbignY2xhc3NtYXAtYXV0aG9yaXRhdGl2ZScpIHx8ICRjb25maWctPmdldCgnY2xhc3NtYXAtYXV0aG9yaXRhdGl2ZScpOwokYXBjdVByZWZpeCA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdhcGN1LWF1dG9sb2FkZXItcHJlZml4Jyk7CiRhcGN1ID0gJGFwY3VQcmVmaXggIT09IG51bGwgfHwgJGlucHV0LT5nZXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlcicpIHx8ICRjb25maWctPmdldCgnYXBjdS1hdXRvbG9hZGVyJyk7CgokZ2VuZXJhdG9yID0gJGNvbXBvc2VyLT5nZXRBdXRvbG9hZEdlbmVyYXRvcigpOwokZ2VuZXJhdG9yLT5zZXRDbGFzc01hcEF1dGhvcml0YXRpdmUoJGF1dGhvcml0YXRpdmUpOwokZ2VuZXJhdG9yLT5zZXRBcGN1KCRhcGN1LCAkYXBjdVByZWZpeCk7CiRnZW5lcmF0b3ItPnNldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoJHRoaXMtPmdldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoJGlucHV0KSk7CiRnZW5lcmF0b3ItPmR1bXAoCiRjb25maWcsCiRsb2NhbFJlcG8sCiRwYWNrYWdlLAokaW5zdGFsbGF0aW9uTWFuYWdlciwKJ2NvbXBvc2VyJywKJG9wdGltaXplLApudWxsLAokY29tcG9zZXItPmdldExvY2tlcigpCik7Cn0KCiRldmVudERpc3BhdGNoZXItPmRpc3BhdGNoU2NyaXB0KFNjcmlwdEV2ZW50czo6UE9TVF9JTlNUQUxMX0NNRCwgJGRldk1vZGUpOwoKcmV0dXJuIDA7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxDb25maWdcSnNvbkNvbmZpZ1NvdXJjZTsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxSZXF1ZXN0Owp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUGx1Z2luXENvbW1hbmRFdmVudDsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5FdmVudHM7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXEFkdmlzb3J5XEF1ZGl0b3I7CgoKCgoKY2xhc3MgUmVtb3ZlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKdXNlIENvbXBsZXRpb25UcmFpdDsKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgncmVtb3ZlJykKLT5zZXRBbGlhc2VzKFsncm0nLCAndW5pbnN0YWxsJ10pCi0+c2V0RGVzY3JpcHRpb24oJ1JlbW92ZXMgYSBwYWNrYWdlIGZyb20gdGhlIHJlcXVpcmUgb3IgcmVxdWlyZS1kZXYnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRBcmd1bWVudCgncGFja2FnZXMnLCBJbnB1dEFyZ3VtZW50OjpJU19BUlJBWSwgJ1BhY2thZ2VzIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWQuJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RSb290UmVxdWlyZW1lbnQoKSksCm5ldyBJbnB1dE9wdGlvbignZGV2JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSZW1vdmVzIGEgcGFja2FnZSBmcm9tIHRoZSByZXF1aXJlLWRldiBzZWN0aW9uLicpLApuZXcgSW5wdXRPcHRpb24oJ2RyeS1ydW4nLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ091dHB1dHMgdGhlIG9wZXJhdGlvbnMgYnV0IHdpbGwgbm90IGV4ZWN1dGUgYW55dGhpbmcgKGltcGxpY2l0bHkgZW5hYmxlcyAtLXZlcmJvc2UpLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLXByb2dyZXNzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEbyBub3Qgb3V0cHV0IGRvd25sb2FkIHByb2dyZXNzLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLXVwZGF0ZScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRGlzYWJsZXMgdGhlIGF1dG9tYXRpYyB1cGRhdGUgb2YgdGhlIGRlcGVuZGVuY2llcyAoaW1wbGllcyAtLW5vLWluc3RhbGwpLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLWluc3RhbGwnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1NraXAgdGhlIGluc3RhbGwgc3RlcCBhZnRlciB1cGRhdGluZyB0aGUgY29tcG9zZXIubG9jayBmaWxlLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLWF1ZGl0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTa2lwIHRoZSBhdWRpdCBzdGVwIGFmdGVyIHVwZGF0aW5nIHRoZSBjb21wb3Nlci5sb2NrIGZpbGUgKGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIENPTVBPU0VSX05PX0FVRElUPTEgZW52IHZhcikuJyksCm5ldyBJbnB1dE9wdGlvbignYXVkaXQtZm9ybWF0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnQXVkaXQgb3V0cHV0IGZvcm1hdC4gTXVzdCBiZSAidGFibGUiLCAicGxhaW4iLCAianNvbiIsIG9yICJzdW1tYXJ5Ii4nLCBBdWRpdG9yOjpGT1JNQVRfU1VNTUFSWSwgQXVkaXRvcjo6Rk9STUFUUyksCm5ldyBJbnB1dE9wdGlvbignbm8tc2VjdXJpdHktYmxvY2tpbmcnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0FsbG93cyBpbnN0YWxsaW5nIHBhY2thZ2VzIHdpdGggc2VjdXJpdHkgYWR2aXNvcmllcyBvciB0aGF0IGFyZSBhYmFuZG9uZWQgKGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIENPTVBPU0VSX05PX1NFQ1VSSVRZX0JMT0NLSU5HPTEgZW52IHZhcikuJyksCm5ldyBJbnB1dE9wdGlvbigndXBkYXRlLW5vLWRldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUnVuIHRoZSBkZXBlbmRlbmN5IHVwZGF0ZSB3aXRoIHRoZSAtLW5vLWRldiBvcHRpb24uJyksCm5ldyBJbnB1dE9wdGlvbigndXBkYXRlLXdpdGgtZGVwZW5kZW5jaWVzJywgJ3cnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0FsbG93cyBpbmhlcml0ZWQgZGVwZW5kZW5jaWVzIHRvIGJlIHVwZGF0ZWQgd2l0aCBleHBsaWNpdCBkZXBlbmRlbmNpZXMgKGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIENPTVBPU0VSX1dJVEhfREVQRU5ERU5DSUVTPTEgZW52IHZhcikuIChEZXByZWNhdGVkLCBpcyBub3cgZGVmYXVsdCBiZWhhdmlvciknKSwKbmV3IElucHV0T3B0aW9uKCd1cGRhdGUtd2l0aC1hbGwtZGVwZW5kZW5jaWVzJywgJ1cnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0FsbG93cyBhbGwgaW5oZXJpdGVkIGRlcGVuZGVuY2llcyB0byBiZSB1cGRhdGVkLCBpbmNsdWRpbmcgdGhvc2UgdGhhdCBhcmUgcm9vdCByZXF1aXJlbWVudHMgKGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIENPTVBPU0VSX1dJVEhfQUxMX0RFUEVOREVOQ0lFUz0xIGVudiB2YXIpLicpLApuZXcgSW5wdXRPcHRpb24oJ3dpdGgtYWxsLWRlcGVuZGVuY2llcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQWxpYXMgZm9yIC0tdXBkYXRlLXdpdGgtYWxsLWRlcGVuZGVuY2llcycpLApuZXcgSW5wdXRPcHRpb24oJ25vLXVwZGF0ZS13aXRoLWRlcGVuZGVuY2llcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRG9lcyBub3QgYWxsb3cgaW5oZXJpdGVkIGRlcGVuZGVuY2llcyB0byBiZSB1cGRhdGVkIHdpdGggZXhwbGljaXQgZGVwZW5kZW5jaWVzLicpLApuZXcgSW5wdXRPcHRpb24oJ21pbmltYWwtY2hhbmdlcycsICdtJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEdXJpbmcgYW4gdXBkYXRlIHdpdGggLXcvLVcsIG9ubHkgcGVyZm9ybSBhYnNvbHV0ZWx5IG5lY2Vzc2FyeSBjaGFuZ2VzIHRvIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIChjYW4gYWxzbyBiZSBzZXQgdmlhIHRoZSBDT01QT1NFUl9NSU5JTUFMX0NIQU5HRVM9MSBlbnYgdmFyKS4nKSwKbmV3IElucHV0T3B0aW9uKCd1bnVzZWQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1JlbW92ZSBhbGwgcGFja2FnZXMgd2hpY2ggYXJlIGxvY2tlZCBidXQgbm90IHJlcXVpcmVkIGJ5IGFueSBvdGhlciBwYWNrYWdlLicpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXEnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQgfCBJbnB1dE9wdGlvbjo6VkFMVUVfSVNfQVJSQVksICdJZ25vcmUgYSBzcGVjaWZpYyBwbGF0Zm9ybSByZXF1aXJlbWVudCAocGhwICYgZXh0LSBwYWNrYWdlcykuJyksCm5ldyBJbnB1dE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcXMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0lnbm9yZSBhbGwgcGxhdGZvcm0gcmVxdWlyZW1lbnRzIChwaHAgJiBleHQtIHBhY2thZ2VzKS4nKSwKbmV3IElucHV0T3B0aW9uKCdvcHRpbWl6ZS1hdXRvbG9hZGVyJywgJ28nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ09wdGltaXplIGF1dG9sb2FkZXIgZHVyaW5nIGF1dG9sb2FkZXIgZHVtcCcpLApuZXcgSW5wdXRPcHRpb24oJ2NsYXNzbWFwLWF1dGhvcml0YXRpdmUnLCAnYScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQXV0b2xvYWQgY2xhc3NlcyBmcm9tIHRoZSBjbGFzc21hcCBvbmx5LiBJbXBsaWNpdGx5IGVuYWJsZXMgYC0tb3B0aW1pemUtYXV0b2xvYWRlcmAuJyksCm5ldyBJbnB1dE9wdGlvbignYXBjdS1hdXRvbG9hZGVyJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdVc2UgQVBDdSB0byBjYWNoZSBmb3VuZC9ub3QtZm91bmQgY2xhc3Nlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdhcGN1LWF1dG9sb2FkZXItcHJlZml4JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnVXNlIGEgY3VzdG9tIHByZWZpeCBmb3IgdGhlIEFQQ3UgYXV0b2xvYWRlciBjYWNoZS4gSW1wbGljaXRseSBlbmFibGVzIC0tYXBjdS1hdXRvbG9hZGVyJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSA8aW5mbz5yZW1vdmU8L2luZm8+IGNvbW1hbmQgcmVtb3ZlcyBhIHBhY2thZ2UgZnJvbSB0aGUgY3VycmVudApsaXN0IG9mIGluc3RhbGxlZCBwYWNrYWdlcwoKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgcmVtb3ZlPC9pbmZvPgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjcmVtb3ZlLXJtCkVPVAopCjsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CmlmICgkaW5wdXQtPmdldEFyZ3VtZW50KCdwYWNrYWdlcycpID09PSBbXSAmJiAhJGlucHV0LT5nZXRPcHRpb24oJ3VudXNlZCcpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ05vdCBlbm91Z2ggYXJndW1lbnRzIChtaXNzaW5nOiAicGFja2FnZXMiKS4nKTsKfQoKJHBhY2thZ2VzID0gJGlucHV0LT5nZXRBcmd1bWVudCgncGFja2FnZXMnKTsKJHBhY2thZ2VzID0gYXJyYXlfbWFwKCdzdHJ0b2xvd2VyJywgJHBhY2thZ2VzKTsKCmlmICgkaW5wdXQtPmdldE9wdGlvbigndW51c2VkJykpIHsKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwokbG9ja2VyID0gJGNvbXBvc2VyLT5nZXRMb2NrZXIoKTsKaWYgKCEkbG9ja2VyLT5pc0xvY2tlZCgpKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdBIHZhbGlkIGNvbXBvc2VyLmxvY2sgZmlsZSBpcyByZXF1aXJlZCB0byBydW4gdGhpcyBjb21tYW5kIHdpdGggLS11bnVzZWQnKTsKfQoKJGxvY2tlZFBhY2thZ2VzID0gJGxvY2tlci0+Z2V0TG9ja2VkUmVwb3NpdG9yeSgpLT5nZXRQYWNrYWdlcygpOwoKJHJlcXVpcmVkID0gW107CmZvcmVhY2ggKGFycmF5X21lcmdlKCRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRSZXF1aXJlcygpLCAkY29tcG9zZXItPmdldFBhY2thZ2UoKS0+Z2V0RGV2UmVxdWlyZXMoKSkgYXMgJGxpbmspIHsKJHJlcXVpcmVkWyRsaW5rLT5nZXRUYXJnZXQoKV0gPSB0cnVlOwp9CgpkbyB7CiRmb3VuZCA9IGZhbHNlOwpmb3JlYWNoICgkbG9ja2VkUGFja2FnZXMgYXMgJGluZGV4ID0+ICRwYWNrYWdlKSB7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXROYW1lcygpIGFzICRuYW1lKSB7CmlmIChpc3NldCgkcmVxdWlyZWRbJG5hbWVdKSkgewpmb3JlYWNoICgkcGFja2FnZS0+Z2V0UmVxdWlyZXMoKSBhcyAkbGluaykgewokcmVxdWlyZWRbJGxpbmstPmdldFRhcmdldCgpXSA9IHRydWU7Cn0KJGZvdW5kID0gdHJ1ZTsKdW5zZXQoJGxvY2tlZFBhY2thZ2VzWyRpbmRleF0pOwpicmVhazsKfQp9Cn0KfSB3aGlsZSAoJGZvdW5kKTsKCiR1bnVzZWQgPSBbXTsKZm9yZWFjaCAoJGxvY2tlZFBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiR1bnVzZWRbXSA9ICRwYWNrYWdlLT5nZXROYW1lKCk7Cn0KJHBhY2thZ2VzID0gYXJyYXlfbWVyZ2UoJHBhY2thZ2VzLCAkdW51c2VkKTsKCmlmIChjb3VudCgkcGFja2FnZXMpID09PSAwKSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZUVycm9yKCc8aW5mbz5ObyB1bnVzZWQgcGFja2FnZXMgdG8gcmVtb3ZlPC9pbmZvPicpOwoKcmV0dXJuIDA7Cn0KfQoKJGZpbGUgPSBGYWN0b3J5OjpnZXRDb21wb3NlckZpbGUoKTsKCiRqc29uRmlsZSA9IG5ldyBKc29uRmlsZSgkZmlsZSk7CgokY29tcG9zZXIgPSAkanNvbkZpbGUtPnJlYWQoKTsKJGNvbXBvc2VyQmFja3VwID0gZmlsZV9nZXRfY29udGVudHMoJGpzb25GaWxlLT5nZXRQYXRoKCkpOwoKJGpzb24gPSBuZXcgSnNvbkNvbmZpZ1NvdXJjZSgkanNvbkZpbGUpOwoKJHR5cGUgPSAkaW5wdXQtPmdldE9wdGlvbignZGV2JykgPyAncmVxdWlyZS1kZXYnIDogJ3JlcXVpcmUnOwokYWx0VHlwZSA9ICEkaW5wdXQtPmdldE9wdGlvbignZGV2JykgPyAncmVxdWlyZS1kZXYnIDogJ3JlcXVpcmUnOwokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCmlmICgkaW5wdXQtPmdldE9wdGlvbigndXBkYXRlLXdpdGgtZGVwZW5kZW5jaWVzJykpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Zb3UgYXJlIHVzaW5nIHRoZSBkZXByZWNhdGVkIG9wdGlvbiAidXBkYXRlLXdpdGgtZGVwZW5kZW5jaWVzIi4gVGhpcyBpcyBub3cgZGVmYXVsdCBiZWhhdmlvdXIuIFRoZSAtLW5vLXVwZGF0ZS13aXRoLWRlcGVuZGVuY2llcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gcmVtb3ZlIGEgcGFja2FnZSB3aXRob3V0IGl0cyBkZXBlbmRlbmNpZXMuPC93YXJuaW5nPicpOwp9CgoKZm9yZWFjaCAoWydyZXF1aXJlJywgJ3JlcXVpcmUtZGV2J10gYXMgJGxpbmtUeXBlKSB7CmlmIChpc3NldCgkY29tcG9zZXJbJGxpbmtUeXBlXSkpIHsKZm9yZWFjaCAoJGNvbXBvc2VyWyRsaW5rVHlwZV0gYXMgJG5hbWUgPT4gJHZlcnNpb24pIHsKJGNvbXBvc2VyWyRsaW5rVHlwZV1bc3RydG9sb3dlcigkbmFtZSldID0gJG5hbWU7Cn0KfQp9CgokZHJ5UnVuID0gJGlucHV0LT5nZXRPcHRpb24oJ2RyeS1ydW4nKTsKJHRvUmVtb3ZlID0gW107CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewppZiAoaXNzZXQoJGNvbXBvc2VyWyR0eXBlXVskcGFja2FnZV0pKSB7CmlmICgkZHJ5UnVuKSB7CiR0b1JlbW92ZVskdHlwZV1bXSA9ICRjb21wb3NlclskdHlwZV1bJHBhY2thZ2VdOwp9IGVsc2UgewokanNvbi0+cmVtb3ZlTGluaygkdHlwZSwgJGNvbXBvc2VyWyR0eXBlXVskcGFja2FnZV0pOwp9Cn0gZWxzZWlmIChpc3NldCgkY29tcG9zZXJbJGFsdFR5cGVdWyRwYWNrYWdlXSkpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz4nIC4gJGNvbXBvc2VyWyRhbHRUeXBlXVskcGFja2FnZV0gLiAnIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiAnIC4gJHR5cGUgLiAnIGJ1dCBpdCBpcyBwcmVzZW50IGluICcgLiAkYWx0VHlwZSAuICc8L3dhcm5pbmc+Jyk7CmlmICgkaW8tPmlzSW50ZXJhY3RpdmUoKSkgewppZiAoJGlvLT5hc2tDb25maXJtYXRpb24oJ0RvIHlvdSB3YW50IHRvIHJlbW92ZSBpdCBmcm9tICcgLiAkYWx0VHlwZSAuICcgWzxjb21tZW50PnllczwvY29tbWVudD5dPyAnKSkgewppZiAoJGRyeVJ1bikgewokdG9SZW1vdmVbJGFsdFR5cGVdW10gPSAkY29tcG9zZXJbJGFsdFR5cGVdWyRwYWNrYWdlXTsKfSBlbHNlIHsKJGpzb24tPnJlbW92ZUxpbmsoJGFsdFR5cGUsICRjb21wb3NlclskYWx0VHlwZV1bJHBhY2thZ2VdKTsKfQp9Cn0KfSBlbHNlaWYgKGlzc2V0KCRjb21wb3NlclskdHlwZV0pICYmIGNvdW50KCRtYXRjaGVzID0gUHJlZzo6Z3JlcChCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVUb1JlZ2V4cCgkcGFja2FnZSksIGFycmF5X2tleXMoJGNvbXBvc2VyWyR0eXBlXSkpKSA+IDApIHsKZm9yZWFjaCAoJG1hdGNoZXMgYXMgJG1hdGNoZWRQYWNrYWdlKSB7CmlmICgkZHJ5UnVuKSB7CiR0b1JlbW92ZVskdHlwZV1bXSA9ICRtYXRjaGVkUGFja2FnZTsKfSBlbHNlIHsKJGpzb24tPnJlbW92ZUxpbmsoJHR5cGUsICRtYXRjaGVkUGFja2FnZSk7Cn0KfQp9IGVsc2VpZiAoaXNzZXQoJGNvbXBvc2VyWyRhbHRUeXBlXSkgJiYgY291bnQoJG1hdGNoZXMgPSBQcmVnOjpncmVwKEJhc2VQYWNrYWdlOjpwYWNrYWdlTmFtZVRvUmVnZXhwKCRwYWNrYWdlKSwgYXJyYXlfa2V5cygkY29tcG9zZXJbJGFsdFR5cGVdKSkpID4gMCkgewpmb3JlYWNoICgkbWF0Y2hlcyBhcyAkbWF0Y2hlZFBhY2thZ2UpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz4nIC4gJG1hdGNoZWRQYWNrYWdlIC4gJyBjb3VsZCBub3QgYmUgZm91bmQgaW4gJyAuICR0eXBlIC4gJyBidXQgaXQgaXMgcHJlc2VudCBpbiAnIC4gJGFsdFR5cGUgLiAnPC93YXJuaW5nPicpOwppZiAoJGlvLT5pc0ludGVyYWN0aXZlKCkpIHsKaWYgKCRpby0+YXNrQ29uZmlybWF0aW9uKCdEbyB5b3Ugd2FudCB0byByZW1vdmUgaXQgZnJvbSAnIC4gJGFsdFR5cGUgLiAnIFs8Y29tbWVudD55ZXM8L2NvbW1lbnQ+XT8gJykpIHsKaWYgKCRkcnlSdW4pIHsKJHRvUmVtb3ZlWyRhbHRUeXBlXVtdID0gJG1hdGNoZWRQYWNrYWdlOwp9IGVsc2UgewokanNvbi0+cmVtb3ZlTGluaygkYWx0VHlwZSwgJG1hdGNoZWRQYWNrYWdlKTsKfQp9Cn0KfQp9IGVsc2UgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPicuJHBhY2thZ2UuJyBpcyBub3QgcmVxdWlyZWQgaW4geW91ciBjb21wb3Nlci5qc29uIGFuZCBoYXMgbm90IGJlZW4gcmVtb3ZlZDwvd2FybmluZz4nKTsKfQp9CgokaW8tPndyaXRlRXJyb3IoJzxpbmZvPicuJGZpbGUuJyBoYXMgYmVlbiB1cGRhdGVkPC9pbmZvPicpOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduby11cGRhdGUnKSkgewpyZXR1cm4gMDsKfQoKaWYgKCRjb21wb3NlciA9ICR0aGlzLT50cnlDb21wb3NlcigpKSB7CiRjb21wb3Nlci0+Z2V0UGx1Z2luTWFuYWdlcigpLT5kZWFjdGl2YXRlSW5zdGFsbGVkUGx1Z2lucygpOwp9CgoKJHRoaXMtPnJlc2V0Q29tcG9zZXIoKTsKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwoKaWYgKCRkcnlSdW4pIHsKJHJvb3RQYWNrYWdlID0gJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCk7CiRsaW5rcyA9IFsKJ3JlcXVpcmUnID0+ICRyb290UGFja2FnZS0+Z2V0UmVxdWlyZXMoKSwKJ3JlcXVpcmUtZGV2JyA9PiAkcm9vdFBhY2thZ2UtPmdldERldlJlcXVpcmVzKCksCl07CmZvcmVhY2ggKCR0b1JlbW92ZSBhcyAkdHlwZSA9PiAkbmFtZXMpIHsKZm9yZWFjaCAoJG5hbWVzIGFzICRuYW1lKSB7CnVuc2V0KCRsaW5rc1skdHlwZV1bJG5hbWVdKTsKfQp9CiRyb290UGFja2FnZS0+c2V0UmVxdWlyZXMoJGxpbmtzWydyZXF1aXJlJ10pOwokcm9vdFBhY2thZ2UtPnNldERldlJlcXVpcmVzKCRsaW5rc1sncmVxdWlyZS1kZXYnXSk7Cn0KCiRjb21tYW5kRXZlbnQgPSBuZXcgQ29tbWFuZEV2ZW50KFBsdWdpbkV2ZW50czo6Q09NTUFORCwgJ3JlbW92ZScsICRpbnB1dCwgJG91dHB1dCk7CiRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmRpc3BhdGNoKCRjb21tYW5kRXZlbnQtPmdldE5hbWUoKSwgJGNvbW1hbmRFdmVudCk7CgokYWxsb3dQbHVnaW5zID0gJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdhbGxvdy1wbHVnaW5zJyk7CiRyZW1vdmVkUGx1Z2lucyA9IGlzX2FycmF5KCRhbGxvd1BsdWdpbnMpID8gYXJyYXlfaW50ZXJzZWN0KGFycmF5X2tleXMoJGFsbG93UGx1Z2lucyksICRwYWNrYWdlcykgOiBbXTsKaWYgKCEkZHJ5UnVuICYmIGlzX2FycmF5KCRhbGxvd1BsdWdpbnMpICYmIGNvdW50KCRyZW1vdmVkUGx1Z2lucykgPiAwKSB7CmlmIChjb3VudCgkYWxsb3dQbHVnaW5zKSA9PT0gY291bnQoJHJlbW92ZWRQbHVnaW5zKSkgewokanNvbi0+cmVtb3ZlQ29uZmlnU2V0dGluZygnYWxsb3ctcGx1Z2lucycpOwp9IGVsc2Ugewpmb3JlYWNoICgkcmVtb3ZlZFBsdWdpbnMgYXMgJHBsdWdpbikgewokanNvbi0+cmVtb3ZlQ29uZmlnU2V0dGluZygnYWxsb3ctcGx1Z2lucy4nLiRwbHVnaW4pOwp9Cn0KfQoKJGNvbXBvc2VyLT5nZXRJbnN0YWxsYXRpb25NYW5hZ2VyKCktPnNldE91dHB1dFByb2dyZXNzKCEkaW5wdXQtPmdldE9wdGlvbignbm8tcHJvZ3Jlc3MnKSk7CgokaW5zdGFsbCA9IEluc3RhbGxlcjo6Y3JlYXRlKCRpbywgJGNvbXBvc2VyKTsKCiR1cGRhdGVEZXZNb2RlID0gISRpbnB1dC0+Z2V0T3B0aW9uKCd1cGRhdGUtbm8tZGV2Jyk7CiRvcHRpbWl6ZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdvcHRpbWl6ZS1hdXRvbG9hZGVyJykgfHwgJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdvcHRpbWl6ZS1hdXRvbG9hZGVyJyk7CiRhdXRob3JpdGF0aXZlID0gJGlucHV0LT5nZXRPcHRpb24oJ2NsYXNzbWFwLWF1dGhvcml0YXRpdmUnKSB8fCAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ2NsYXNzbWFwLWF1dGhvcml0YXRpdmUnKTsKJGFwY3VQcmVmaXggPSAkaW5wdXQtPmdldE9wdGlvbignYXBjdS1hdXRvbG9hZGVyLXByZWZpeCcpOwokYXBjdSA9ICRhcGN1UHJlZml4ICE9PSBudWxsIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCdhcGN1LWF1dG9sb2FkZXInKSB8fCAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ2FwY3UtYXV0b2xvYWRlcicpOwokbWluaW1hbENoYW5nZXMgPSAkaW5wdXQtPmdldE9wdGlvbignbWluaW1hbC1jaGFuZ2VzJykgfHwgJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCd1cGRhdGUtd2l0aC1taW5pbWFsLWNoYW5nZXMnKTsKCiR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMgPSBSZXF1ZXN0OjpVUERBVEVfTElTVEVEX1dJVEhfVFJBTlNJVElWRV9ERVBTX05PX1JPT1RfUkVRVUlSRTsKJGZsYWdzID0gJyc7CmlmICgkaW5wdXQtPmdldE9wdGlvbigndXBkYXRlLXdpdGgtYWxsLWRlcGVuZGVuY2llcycpIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCd3aXRoLWFsbC1kZXBlbmRlbmNpZXMnKSkgewokdXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzID0gUmVxdWVzdDo6VVBEQVRFX0xJU1RFRF9XSVRIX1RSQU5TSVRJVkVfREVQUzsKJGZsYWdzIC49ICcgLS13aXRoLWFsbC1kZXBlbmRlbmNpZXMnOwp9IGVsc2VpZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLXVwZGF0ZS13aXRoLWRlcGVuZGVuY2llcycpKSB7CiR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMgPSBSZXF1ZXN0OjpVUERBVEVfT05MWV9MSVNURUQ7CiRmbGFncyAuPSAnIC0td2l0aC1kZXBlbmRlbmNpZXMnOwp9CgokaW8tPndyaXRlRXJyb3IoJzxpbmZvPlJ1bm5pbmcgY29tcG9zZXIgdXBkYXRlICcuaW1wbG9kZSgnICcsICRwYWNrYWdlcykuJGZsYWdzLic8L2luZm8+Jyk7CgokaW5zdGFsbAotPnNldFZlcmJvc2UoJGlucHV0LT5nZXRPcHRpb24oJ3ZlcmJvc2UnKSkKLT5zZXREZXZNb2RlKCR1cGRhdGVEZXZNb2RlKQotPnNldE9wdGltaXplQXV0b2xvYWRlcigkb3B0aW1pemUpCi0+c2V0Q2xhc3NNYXBBdXRob3JpdGF0aXZlKCRhdXRob3JpdGF0aXZlKQotPnNldEFwY3VBdXRvbG9hZGVyKCRhcGN1LCAkYXBjdVByZWZpeCkKLT5zZXRVcGRhdGUodHJ1ZSkKLT5zZXRJbnN0YWxsKCEkaW5wdXQtPmdldE9wdGlvbignbm8taW5zdGFsbCcpKQotPnNldFVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcygkdXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKQotPnNldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoJHRoaXMtPmdldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoJGlucHV0KSkKLT5zZXREcnlSdW4oJGRyeVJ1bikKLT5zZXRBdWRpdENvbmZpZygkdGhpcy0+Y3JlYXRlQXVkaXRDb25maWcoJGNvbXBvc2VyLT5nZXRDb25maWcoKSwgJGlucHV0KSkKLT5zZXRNaW5pbWFsVXBkYXRlKCRtaW5pbWFsQ2hhbmdlcykKOwoKCgppZiAoJGNvbXBvc2VyLT5nZXRMb2NrZXIoKS0+aXNMb2NrZWQoKSkgewokaW5zdGFsbC0+c2V0VXBkYXRlQWxsb3dMaXN0KCRwYWNrYWdlcyk7Cn0KCiRzdGF0dXMgPSAkaW5zdGFsbC0+cnVuKCk7CmlmICgkc3RhdHVzICE9PSAwKSB7CiRpby0+d3JpdGVFcnJvcigiXG4iLic8ZXJyb3I+UmVtb3ZhbCBmYWlsZWQsIHJldmVydGluZyAnLiRmaWxlLicgdG8gaXRzIG9yaWdpbmFsIGNvbnRlbnQuPC9lcnJvcj4nKTsKZmlsZV9wdXRfY29udGVudHMoJGpzb25GaWxlLT5nZXRQYXRoKCksICRjb21wb3NlckJhY2t1cCk7Cn0KCmlmICghJGRyeVJ1bikgewpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKaWYgKCRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCktPmZpbmRQYWNrYWdlcygkcGFja2FnZSkpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+UmVtb3ZhbCBmYWlsZWQsICcuJHBhY2thZ2UuJyBpcyBzdGlsbCBwcmVzZW50LCBpdCBtYXkgYmUgcmVxdWlyZWQgYnkgYW5vdGhlciBwYWNrYWdlLiBTZWUgYGNvbXBvc2VyIHdoeSAnLiRwYWNrYWdlLidgLjwvZXJyb3I+Jyk7CgpyZXR1cm4gMjsKfQp9Cn0KCnJldHVybiAkc3RhdHVzOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvbklucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCgoKCgoKCgpjbGFzcyBSZXBvc2l0b3J5Q29tbWFuZCBleHRlbmRzIEJhc2VDb25maWdDb21tYW5kCnsKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdyZXBvc2l0b3J5JykKLT5zZXRBbGlhc2VzKFsncmVwbyddKQotPnNldERlc2NyaXB0aW9uKCdNYW5hZ2VzIHJlcG9zaXRvcmllcycpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dE9wdGlvbignZ2xvYmFsJywgJ2cnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0FwcGx5IGNvbW1hbmQgdG8gdGhlIGdsb2JhbCBjb25maWcgZmlsZScpLApuZXcgSW5wdXRPcHRpb24oJ2ZpbGUnLCAnZicsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0lmIHlvdSB3YW50IHRvIGNob29zZSBhIGRpZmZlcmVudCBjb21wb3Nlci5qc29uIG9yIGNvbmZpZy5qc29uJyksCm5ldyBJbnB1dE9wdGlvbignYXBwZW5kJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdXaGVuIGFkZGluZyBhIHJlcG9zaXRvcnksIGFwcGVuZCBpdCAobG93ZXIgcHJpb3JpdHkpIGluc3RlYWQgb2YgcHJlcGVuZGluZyBpdCcpLApuZXcgSW5wdXRPcHRpb24oJ2JlZm9yZScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1doZW4gYWRkaW5nIGEgcmVwb3NpdG9yeSwgaW5zZXJ0IGl0IGJlZm9yZSB0aGUgZ2l2ZW4gcmVwb3NpdG9yeSBuYW1lJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RSZXBvTmFtZXMoKSksCm5ldyBJbnB1dE9wdGlvbignYWZ0ZXInLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdXaGVuIGFkZGluZyBhIHJlcG9zaXRvcnksIGluc2VydCBpdCBhZnRlciB0aGUgZ2l2ZW4gcmVwb3NpdG9yeSBuYW1lJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RSZXBvTmFtZXMoKSksCm5ldyBJbnB1dEFyZ3VtZW50KCdhY3Rpb24nLCBJbnB1dEFyZ3VtZW50OjpPUFRJT05BTCwgJ0FjdGlvbiB0byBwZXJmb3JtOiBsaXN0LCBhZGQsIHJlbW92ZSwgc2V0LXVybCwgZ2V0LXVybCwgZW5hYmxlLCBkaXNhYmxlJywgJ2xpc3QnLCBbJ2xpc3QnLCAnYWRkJywgJ3JlbW92ZScsICdzZXQtdXJsJywgJ2dldC11cmwnLCAnZW5hYmxlJywgJ2Rpc2FibGUnXSksCm5ldyBJbnB1dEFyZ3VtZW50KCduYW1lJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdSZXBvc2l0b3J5IG5hbWUgKG9yIHNwZWNpYWwgbmFtZSBwYWNrYWdpc3Qub3JnIGZvciBlbmFibGUvZGlzYWJsZSknLCBudWxsLCAkdGhpcy0+c3VnZ2VzdFJlcG9OYW1lcygpKSwKbmV3IElucHV0QXJndW1lbnQoJ2FyZzEnLCBJbnB1dEFyZ3VtZW50OjpPUFRJT05BTCwgJ1R5cGUgZm9yIGFkZCwgb3IgbmV3IFVSTCBmb3Igc2V0LXVybCwgb3IgSlNPTiBjb25maWcgZm9yIGFkZCcsIG51bGwsICR0aGlzLT5zdWdnZXN0VHlwZUZvckFkZCgpKSwKbmV3IElucHV0QXJndW1lbnQoJ2FyZzInLCBJbnB1dEFyZ3VtZW50OjpPUFRJT05BTCwgJ1VSTCBmb3IgYWRkIChpZiBub3QgdXNpbmcgSlNPTiknKSwKXSkKLT5zZXRIZWxwKDw8PEVPVApUaGlzIGNvbW1hbmQgbGV0cyB5b3UgbWFuYWdlIHJlcG9zaXRvcmllcyBpbiB5b3VyIGNvbXBvc2VyLmpzb24uCgpFeGFtcGxlczoKICBjb21wb3NlciByZXBvIGxpc3QKICBjb21wb3NlciByZXBvIGFkZCBmb28gdmNzIGh0dHBzOi8vZ2l0aHViLmNvbS9hY21lL2ZvbwogIGNvbXBvc2VyIHJlcG8gYWRkIGJhciBjb21wb3NlciBodHRwczovL3JlcG8ucGFja2FnaXN0LmNvbS9iYXIKICBjb21wb3NlciByZXBvIGFkZCB6aXBzICd7InR5cGUiOiJhcnRpZmFjdCIsInVybCI6Ii9wYXRoL3RvL2Rpci93aXRoL3ppcHMifScKICBjb21wb3NlciByZXBvIGFkZCBiYXogdmNzIGh0dHBzOi8vZXhhbXBsZS5vcmcgLS1iZWZvcmUgZm9vCiAgY29tcG9zZXIgcmVwbyBhZGQgcXV4IHZjcyBodHRwczovL2V4YW1wbGUub3JnIC0tYWZ0ZXIgYmFyCiAgY29tcG9zZXIgcmVwbyByZW1vdmUgZm9vCiAgY29tcG9zZXIgcmVwbyBzZXQtdXJsIGZvbyBodHRwczovL2dpdC5leGFtcGxlLm9yZy9hY21lL2ZvbwogIGNvbXBvc2VyIHJlcG8gZ2V0LXVybCBmb28KICBjb21wb3NlciByZXBvIGRpc2FibGUgcGFja2FnaXN0Lm9yZwogIGNvbXBvc2VyIHJlcG8gZW5hYmxlIHBhY2thZ2lzdC5vcmcKClVzZSAtLWdsb2JhbC8tZyB0byBhbHRlciB0aGUgZ2xvYmFsIGNvbmZpZy5qc29uIGluc3RlYWQuClVzZSAtLWZpbGUgdG8gYWx0ZXIgYSBzcGVjaWZpYyBmaWxlLgpFT1QKKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRhY3Rpb24gPSBzdHJ0b2xvd2VyKChzdHJpbmcpICRpbnB1dC0+Z2V0QXJndW1lbnQoJ2FjdGlvbicpKTsKJG5hbWUgPSAkaW5wdXQtPmdldEFyZ3VtZW50KCduYW1lJyk7CiRhcmcxID0gJGlucHV0LT5nZXRBcmd1bWVudCgnYXJnMScpOwokYXJnMiA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ2FyZzInKTsKCiR0aGlzLT5jb25maWctPm1lcmdlKCR0aGlzLT5jb25maWdGaWxlLT5yZWFkKCksICR0aGlzLT5jb25maWdGaWxlLT5nZXRQYXRoKCkpOwokcmVwb3MgPSAkdGhpcy0+Y29uZmlnLT5nZXRSZXBvc2l0b3JpZXMoKTsKCnN3aXRjaCAoJGFjdGlvbikgewpjYXNlICdsaXN0JzoKY2FzZSAnbHMnOgpjYXNlICdzaG93JzoKJHRoaXMtPmxpc3RSZXBvc2l0b3JpZXMoJHJlcG9zKTsKCnJldHVybiAwOwoKY2FzZSAnYWRkJzoKaWYgKCRuYW1lID09PSBudWxsKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignWW91IG11c3QgcGFzcyBhIHJlcG9zaXRvcnkgbmFtZS4gRXhhbXBsZTogY29tcG9zZXIgcmVwbyBhZGQgZm9vIHZjcyBodHRwczovL2V4YW1wbGUub3JnJyk7Cn0KaWYgKCRhcmcxID09PSBudWxsKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignWW91IG11c3QgcGFzcyB0aGUgdHlwZSBhbmQgYSB1cmwsIG9yIGEgSlNPTiBzdHJpbmcuJyk7Cn0KaWYgKGlzX3N0cmluZygkYXJnMSkgJiYgUHJlZzo6aXNNYXRjaCgne15ccypce30nLCAkYXJnMSkpIHsKCiRyZXBvQ29uZmlnID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkYXJnMSk7Cn0gZWxzZSB7CmlmICgkYXJnMiA9PT0gbnVsbCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1lvdSBtdXN0IHBhc3MgdGhlIHR5cGUgYW5kIGEgdXJsLiBFeGFtcGxlOiBjb21wb3NlciByZXBvIGFkZCBmb28gdmNzIGh0dHBzOi8vZXhhbXBsZS5vcmcnKTsKfQokcmVwb0NvbmZpZyA9IFsndHlwZScgPT4gKHN0cmluZykgJGFyZzEsICd1cmwnID0+IChzdHJpbmcpICRhcmcyXTsKfQoKCiRiZWZvcmUgPSAkaW5wdXQtPmdldE9wdGlvbignYmVmb3JlJyk7CiRhZnRlciA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdhZnRlcicpOwppZiAoJGJlZm9yZSAhPT0gbnVsbCAmJiAkYWZ0ZXIgIT09IG51bGwpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdZb3UgY2FuIG5vdCBjb21iaW5lIC0tYmVmb3JlIGFuZCAtLWFmdGVyJyk7Cn0KCmlmICgkYmVmb3JlICE9PSBudWxsIHx8ICRhZnRlciAhPT0gbnVsbCkgewppZiAoJHJlcG9Db25maWcgPT09IGZhbHNlKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ2Fubm90IHVzZSAtLWJlZm9yZS8tLWFmdGVyIHdpdGggYm9vbGVhbiByZXBvc2l0b3J5IHZhbHVlcycpOwp9CgokdGhpcy0+Y29uZmlnU291cmNlLT5pbnNlcnRSZXBvc2l0b3J5KChzdHJpbmcpICRuYW1lLCAkcmVwb0NvbmZpZywgJGJlZm9yZSA/PyAkYWZ0ZXIsICRhZnRlciAhPT0gbnVsbCA/IDEgOiAwKTsKCnJldHVybiAwOwp9CgokdGhpcy0+Y29uZmlnU291cmNlLT5hZGRSZXBvc2l0b3J5KChzdHJpbmcpICRuYW1lLCAkcmVwb0NvbmZpZywgKGJvb2wpICRpbnB1dC0+Z2V0T3B0aW9uKCdhcHBlbmQnKSk7CgpyZXR1cm4gMDsKCmNhc2UgJ3JlbW92ZSc6CmNhc2UgJ3JtJzoKY2FzZSAnZGVsZXRlJzoKaWYgKCRuYW1lID09PSBudWxsKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignWW91IG11c3QgcGFzcyB0aGUgcmVwb3NpdG9yeSBuYW1lIHRvIHJlbW92ZS4nKTsKfQokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVSZXBvc2l0b3J5KChzdHJpbmcpICRuYW1lKTsKaWYgKGluX2FycmF5KCRuYW1lLCBbJ3BhY2thZ2lzdCcsICdwYWNrYWdpc3Qub3JnJ10sIHRydWUpKSB7CiR0aGlzLT5jb25maWdTb3VyY2UtPmFkZFJlcG9zaXRvcnkoJ3BhY2thZ2lzdC5vcmcnLCBmYWxzZSk7Cn0KCnJldHVybiAwOwoKY2FzZSAnc2V0LXVybCc6CmNhc2UgJ3NldHVybCc6CmlmICgkbmFtZSA9PT0gbnVsbCB8fCAkYXJnMSA9PT0gbnVsbCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1VzYWdlOiBjb21wb3NlciByZXBvIHNldC11cmwgPG5hbWU+IDxuZXctdXJsPicpOwp9CgokdGhpcy0+Y29uZmlnU291cmNlLT5zZXRSZXBvc2l0b3J5VXJsKCRuYW1lLCAkYXJnMSk7CgpyZXR1cm4gMDsKCmNhc2UgJ2dldC11cmwnOgpjYXNlICdnZXR1cmwnOgppZiAoJG5hbWUgPT09IG51bGwpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdVc2FnZTogY29tcG9zZXIgcmVwbyBnZXQtdXJsIDxuYW1lPicpOwp9CmlmIChpc3NldCgkcmVwb3NbJG5hbWVdKSAmJiBpc19hcnJheSgkcmVwb3NbJG5hbWVdKSkgewokdXJsID0gJHJlcG9zWyRuYW1lXVsndXJsJ10gPz8gbnVsbDsKaWYgKCFpc19zdHJpbmcoJHVybCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSAnLiRuYW1lLicgcmVwb3NpdG9yeSBkb2VzIG5vdCBoYXZlIGEgVVJMJyk7Cn0KJHRoaXMtPmdldElPKCktPndyaXRlKCR1cmwpOwoKcmV0dXJuIDA7Cn0KCmlmIChpc19hcnJheSgkcmVwb3MpKSB7CmZvcmVhY2ggKCRyZXBvcyBhcyAkdmFsKSB7CmlmIChpc19hcnJheSgkdmFsKSAmJiBpc3NldCgkdmFsWyduYW1lJ10pICYmICR2YWxbJ25hbWUnXSA9PT0gJG5hbWUpIHsKJHVybCA9ICR2YWxbJ3VybCddID8/IG51bGw7CmlmICghaXNfc3RyaW5nKCR1cmwpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdUaGUgJy4kbmFtZS4nIHJlcG9zaXRvcnkgZG9lcyBub3QgaGF2ZSBhIFVSTCcpOwp9CiR0aGlzLT5nZXRJTygpLT53cml0ZSgkdXJsKTsKCnJldHVybiAwOwp9Cn0KfQoKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZXJlIGlzIG5vICcuJG5hbWUuJyByZXBvc2l0b3J5IGRlZmluZWQnKTsKCmNhc2UgJ2Rpc2FibGUnOgppZiAoJG5hbWUgPT09IG51bGwpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdVc2FnZTogY29tcG9zZXIgcmVwbyBkaXNhYmxlIHBhY2thZ2lzdC5vcmcnKTsKfQppZiAoaW5fYXJyYXkoJG5hbWUsIFsncGFja2FnaXN0JywgJ3BhY2thZ2lzdC5vcmcnXSwgdHJ1ZSkpIHsKCiR0aGlzLT5jb25maWdTb3VyY2UtPmFkZFJlcG9zaXRvcnkoJ3BhY2thZ2lzdC5vcmcnLCBmYWxzZSwgKGJvb2wpICRpbnB1dC0+Z2V0T3B0aW9uKCdhcHBlbmQnKSk7CgpyZXR1cm4gMDsKfQp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ09ubHkgcGFja2FnaXN0Lm9yZyBjYW4gYmUgZW5hYmxlZC9kaXNhYmxlZCB1c2luZyB0aGlzIGNvbW1hbmQuIFVzZSBhZGQvcmVtb3ZlIGZvciBvdGhlciByZXBvc2l0b3JpZXMuJyk7CgpjYXNlICdlbmFibGUnOgppZiAoJG5hbWUgPT09IG51bGwpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdVc2FnZTogY29tcG9zZXIgcmVwbyBlbmFibGUgcGFja2FnaXN0Lm9yZycpOwp9CmlmIChpbl9hcnJheSgkbmFtZSwgWydwYWNrYWdpc3QnLCAncGFja2FnaXN0Lm9yZyddLCB0cnVlKSkgewoKCiR0aGlzLT5jb25maWdTb3VyY2UtPnJlbW92ZVJlcG9zaXRvcnkoJ3BhY2thZ2lzdC5vcmcnKTsKCnJldHVybiAwOwp9CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignT25seSBwYWNrYWdpc3Qub3JnIGNhbiBiZSBlbmFibGVkL2Rpc2FibGVkIHVzaW5nIHRoaXMgY29tbWFuZC4nKTsKCmRlZmF1bHQ6CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdVbmtub3duIGFjdGlvbiAiJy4kYWN0aW9uLiciLiBVc2UgbGlzdCwgYWRkLCByZW1vdmUsIHNldC11cmwsIGdldC11cmwsIGVuYWJsZSwgZGlzYWJsZScpOwp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gbGlzdFJlcG9zaXRvcmllcyhhcnJheSAkcmVwb3MpOiB2b2lkCnsKJGlvID0gJHRoaXMtPmdldElPKCk7CgokcGFja2FnaXN0UHJlc2VudCA9IGZhbHNlOwpmb3JlYWNoICgkcmVwb3MgYXMgJGtleSA9PiAkcmVwbykgewppZiAoaXNzZXQoJHJlcG9bJ3R5cGUnXSwgJHJlcG9bJ3VybCddKSAmJiAkcmVwb1sndHlwZSddID09PSAnY29tcG9zZXInICYmIHN0cl9lbmRzX3dpdGgoKHN0cmluZykgcGFyc2VfdXJsKCRyZXBvWyd1cmwnXSwgUEhQX1VSTF9IT1NUKSwgJ3BhY2thZ2lzdC5vcmcnKSkgewokcGFja2FnaXN0UHJlc2VudCA9IHRydWU7CmJyZWFrOwp9Cn0KaWYgKCEkcGFja2FnaXN0UHJlc2VudCkgewokcmVwb3NbXSA9IFsncGFja2FnaXN0Lm9yZycgPT4gZmFsc2VdOwp9CgppZiAoJHJlcG9zID09PSBbXSkgewokaW8tPndyaXRlKCdObyByZXBvc2l0b3JpZXMgY29uZmlndXJlZCcpOwoKcmV0dXJuOwp9Cgpmb3JlYWNoICgkcmVwb3MgYXMgJGtleSA9PiAkcmVwbykgewppZiAoJHJlcG8gPT09IGZhbHNlKSB7CiRpby0+d3JpdGUoJ1snLiRrZXkuJ10gPGluZm8+ZGlzYWJsZWQ8L2luZm8+Jyk7CmNvbnRpbnVlOwp9CgppZiAoaXNfYXJyYXkoJHJlcG8pKSB7CmlmICgxID09PSBcY291bnQoJHJlcG8pICYmIGZhbHNlID09PSBjdXJyZW50KCRyZXBvKSkgewokaW8tPndyaXRlKCdbJy5hcnJheV9rZXlfZmlyc3QoJHJlcG8pLiddIDxpbmZvPmRpc2FibGVkPC9pbmZvPicpOwpjb250aW51ZTsKfQoKJG5hbWUgPSAkcmVwb1snbmFtZSddID8/ICRrZXk7CiR0eXBlID0gJHJlcG9bJ3R5cGUnXSA/PyAndW5rbm93bic7CiR1cmwgPSAkcmVwb1sndXJsJ10gPz8gSnNvbkZpbGU6OmVuY29kZSgkcmVwbyk7CiRpby0+d3JpdGUoJ1snLiRuYW1lLiddIDxpbmZvPicuJHR5cGUuJzwvaW5mbz4gJy4kdXJsKTsKfQp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gc3VnZ2VzdFR5cGVGb3JBZGQoKTogXENsb3N1cmUKewpyZXR1cm4gc3RhdGljIGZ1bmN0aW9uIChDb21wbGV0aW9uSW5wdXQgJGlucHV0KTogYXJyYXkgewppZiAoJGlucHV0LT5nZXRBcmd1bWVudCgnYWN0aW9uJykgPT09ICdhZGQnKSB7CnJldHVybiBbJ2NvbXBvc2VyJywgJ3ZjcycsICdhcnRpZmFjdCcsICdwYXRoJ107Cn0KCnJldHVybiBbXTsKfTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBzdWdnZXN0UmVwb05hbWVzKCk6IFxDbG9zdXJlCnsKcmV0dXJuIGZ1bmN0aW9uIChDb21wbGV0aW9uSW5wdXQgJGlucHV0KTogYXJyYXkgewppZiAoaW5fYXJyYXkoJGlucHV0LT5nZXRBcmd1bWVudCgnYWN0aW9uJyksIFsnZW5hYmxlJywgJ2Rpc2FibGUnXSwgdHJ1ZSkpIHsKcmV0dXJuIFsncGFja2FnaXN0Lm9yZyddOwp9CgppZiAoIWluX2FycmF5KCRpbnB1dC0+Z2V0QXJndW1lbnQoJ2FjdGlvbicpLCBbJ3JlbW92ZScsICdzZXQtdXJsJywgJ2dldC11cmwnXSwgdHJ1ZSkpIHsKcmV0dXJuIFtdOwp9CgokY29uZmlnID0gRmFjdG9yeTo6Y3JlYXRlQ29uZmlnKCk7CiRjb25maWdGaWxlID0gbmV3IEpzb25GaWxlKCR0aGlzLT5nZXRDb21wb3NlckNvbmZpZ0ZpbGUoJGlucHV0LCAkY29uZmlnKSk7CgokZGF0YSA9ICRjb25maWdGaWxlLT5yZWFkKCk7CiRyZXBvcyA9IFtdOwoKZm9yZWFjaCAoKCRkYXRhWydyZXBvc2l0b3JpZXMnXSA/PyBbXSkgYXMgJHJlcG8pIHsKaWYgKGlzc2V0KCRyZXBvWyduYW1lJ10pKSB7CiRyZXBvc1tdID0gJHJlcG9bJ25hbWUnXTsKfQp9Cgpzb3J0KCRyZXBvcyk7CgpyZXR1cm4gJHJlcG9zOwp9Owp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFJlcXVlc3Q7CnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcUm9vdFBhY2thZ2VMb2FkZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblNlbGVjdG9yOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5U2V0Owp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxQYWNrYWdlU29ydGVyOwp1c2UgU2VsZFxTaWduYWxcU2lnbmFsSGFuZGxlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXEluc3RhbGxlcjsKdXNlIENvbXBvc2VyXEluc3RhbGxlclxJbnN0YWxsZXJFdmVudHM7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uTWFuaXB1bGF0b3I7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXEFycmF5TG9hZGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBsdWdpblxDb21tYW5kRXZlbnQ7CnVzZSBDb21wb3NlclxQbHVnaW5cUGx1Z2luRXZlbnRzOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxDb21wb3NpdGVSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXEFkdmlzb3J5XEF1ZGl0b3I7CnVzZSBDb21wb3NlclxVdGlsXFNpbGVuY2VyOwoKCgoKCmNsYXNzIFJlcXVpcmVDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewp1c2UgQ29tcGxldGlvblRyYWl0Owp1c2UgUGFja2FnZURpc2NvdmVyeVRyYWl0OwoKCnByaXZhdGUgJG5ld2x5Q3JlYXRlZDsKCnByaXZhdGUgJGZpcnN0UmVxdWlyZTsKCnByaXZhdGUgJGpzb247Cgpwcml2YXRlICRmaWxlOwoKcHJpdmF0ZSAkY29tcG9zZXJCYWNrdXA7Cgpwcml2YXRlICRsb2NrOwoKcHJpdmF0ZSAkbG9ja0JhY2t1cDsKCnByaXZhdGUgJGRlcGVuZGVuY3lSZXNvbHV0aW9uQ29tcGxldGVkID0gZmFsc2U7Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ3JlcXVpcmUnKQotPnNldEFsaWFzZXMoWydyJ10pCi0+c2V0RGVzY3JpcHRpb24oJ0FkZHMgcmVxdWlyZWQgcGFja2FnZXMgdG8geW91ciBjb21wb3Nlci5qc29uIGFuZCBpbnN0YWxscyB0aGVtJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0QXJndW1lbnQoJ3BhY2thZ2VzJywgSW5wdXRBcmd1bWVudDo6SVNfQVJSQVkgfCBJbnB1dEFyZ3VtZW50OjpPUFRJT05BTCwgJ09wdGlvbmFsIHBhY2thZ2UgbmFtZSBjYW4gYWxzbyBpbmNsdWRlIGEgdmVyc2lvbiBjb25zdHJhaW50LCBlLmcuIGZvby9iYXIgb3IgZm9vL2JhcjoxLjAuMCBvciBmb28vYmFyPTEuMC4wIG9yICJmb28vYmFyIDEuMC4wIicsIG51bGwsICR0aGlzLT5zdWdnZXN0QXZhaWxhYmxlUGFja2FnZUluY2xQbGF0Zm9ybSgpKSwKbmV3IElucHV0T3B0aW9uKCdkZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0FkZCByZXF1aXJlbWVudCB0byByZXF1aXJlLWRldi4nKSwKbmV3IElucHV0T3B0aW9uKCdkcnktcnVuJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPdXRwdXRzIHRoZSBvcGVyYXRpb25zIGJ1dCB3aWxsIG5vdCBleGVjdXRlIGFueXRoaW5nIChpbXBsaWNpdGx5IGVuYWJsZXMgLS12ZXJib3NlKS4nKSwKbmV3IElucHV0T3B0aW9uKCdwcmVmZXItc291cmNlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdGb3JjZXMgaW5zdGFsbGF0aW9uIGZyb20gcGFja2FnZSBzb3VyY2VzIHdoZW4gcG9zc2libGUsIGluY2x1ZGluZyBWQ1MgaW5mb3JtYXRpb24uJyksCm5ldyBJbnB1dE9wdGlvbigncHJlZmVyLWRpc3QnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0ZvcmNlcyBpbnN0YWxsYXRpb24gZnJvbSBwYWNrYWdlIGRpc3QgKGRlZmF1bHQgYmVoYXZpb3IpLicpLApuZXcgSW5wdXRPcHRpb24oJ3ByZWZlci1pbnN0YWxsJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnRm9yY2VzIGluc3RhbGxhdGlvbiBmcm9tIHBhY2thZ2UgZGlzdHxzb3VyY2V8YXV0byAoYXV0byBjaG9vc2VzIHNvdXJjZSBmb3IgZGV2IHZlcnNpb25zLCBkaXN0IGZvciB0aGUgcmVzdCkuJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RQcmVmZXJJbnN0YWxsKCkpLApuZXcgSW5wdXRPcHRpb24oJ2ZpeGVkJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdXcml0ZSBmaXhlZCB2ZXJzaW9uIHRvIHRoZSBjb21wb3Nlci5qc29uLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLXN1Z2dlc3QnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RFUFJFQ0FURUQ6IFRoaXMgZmxhZyBkb2VzIG5vdCBleGlzdCBhbnltb3JlLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLXByb2dyZXNzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEbyBub3Qgb3V0cHV0IGRvd25sb2FkIHByb2dyZXNzLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLXVwZGF0ZScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRGlzYWJsZXMgdGhlIGF1dG9tYXRpYyB1cGRhdGUgb2YgdGhlIGRlcGVuZGVuY2llcyAoaW1wbGllcyAtLW5vLWluc3RhbGwpLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLWluc3RhbGwnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1NraXAgdGhlIGluc3RhbGwgc3RlcCBhZnRlciB1cGRhdGluZyB0aGUgY29tcG9zZXIubG9jayBmaWxlLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLWF1ZGl0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTa2lwIHRoZSBhdWRpdCBzdGVwIGFmdGVyIHVwZGF0aW5nIHRoZSBjb21wb3Nlci5sb2NrIGZpbGUgKGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIENPTVBPU0VSX05PX0FVRElUPTEgZW52IHZhcikuJyksCm5ldyBJbnB1dE9wdGlvbignYXVkaXQtZm9ybWF0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnQXVkaXQgb3V0cHV0IGZvcm1hdC4gTXVzdCBiZSAidGFibGUiLCAicGxhaW4iLCAianNvbiIsIG9yICJzdW1tYXJ5Ii4nLCBBdWRpdG9yOjpGT1JNQVRfU1VNTUFSWSwgQXVkaXRvcjo6Rk9STUFUUyksCm5ldyBJbnB1dE9wdGlvbignbm8tc2VjdXJpdHktYmxvY2tpbmcnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0FsbG93cyBpbnN0YWxsaW5nIHBhY2thZ2VzIHdpdGggc2VjdXJpdHkgYWR2aXNvcmllcyBvciB0aGF0IGFyZSBhYmFuZG9uZWQgKGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIENPTVBPU0VSX05PX1NFQ1VSSVRZX0JMT0NLSU5HPTEgZW52IHZhcikuJyksCm5ldyBJbnB1dE9wdGlvbigndXBkYXRlLW5vLWRldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUnVuIHRoZSBkZXBlbmRlbmN5IHVwZGF0ZSB3aXRoIHRoZSAtLW5vLWRldiBvcHRpb24uJyksCm5ldyBJbnB1dE9wdGlvbigndXBkYXRlLXdpdGgtZGVwZW5kZW5jaWVzJywgJ3cnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0FsbG93cyBpbmhlcml0ZWQgZGVwZW5kZW5jaWVzIHRvIGJlIHVwZGF0ZWQsIGV4Y2VwdCB0aG9zZSB0aGF0IGFyZSByb290IHJlcXVpcmVtZW50cyAoY2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgQ09NUE9TRVJfV0lUSF9ERVBFTkRFTkNJRVM9MSBlbnYgdmFyKS4nKSwKbmV3IElucHV0T3B0aW9uKCd1cGRhdGUtd2l0aC1hbGwtZGVwZW5kZW5jaWVzJywgJ1cnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0FsbG93cyBhbGwgaW5oZXJpdGVkIGRlcGVuZGVuY2llcyB0byBiZSB1cGRhdGVkLCBpbmNsdWRpbmcgdGhvc2UgdGhhdCBhcmUgcm9vdCByZXF1aXJlbWVudHMgKGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIENPTVBPU0VSX1dJVEhfQUxMX0RFUEVOREVOQ0lFUz0xIGVudiB2YXIpLicpLApuZXcgSW5wdXRPcHRpb24oJ3dpdGgtZGVwZW5kZW5jaWVzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdBbGlhcyBmb3IgLS11cGRhdGUtd2l0aC1kZXBlbmRlbmNpZXMnKSwKbmV3IElucHV0T3B0aW9uKCd3aXRoLWFsbC1kZXBlbmRlbmNpZXMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0FsaWFzIGZvciAtLXVwZGF0ZS13aXRoLWFsbC1kZXBlbmRlbmNpZXMnKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVEIHwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZLCAnSWdub3JlIGEgc3BlY2lmaWMgcGxhdGZvcm0gcmVxdWlyZW1lbnQgKHBocCAmIGV4dC0gcGFja2FnZXMpLicpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXFzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdJZ25vcmUgYWxsIHBsYXRmb3JtIHJlcXVpcmVtZW50cyAocGhwICYgZXh0LSBwYWNrYWdlcykuJyksCm5ldyBJbnB1dE9wdGlvbigncHJlZmVyLXN0YWJsZScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUHJlZmVyIHN0YWJsZSB2ZXJzaW9ucyBvZiBkZXBlbmRlbmNpZXMgKGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIENPTVBPU0VSX1BSRUZFUl9TVEFCTEU9MSBlbnYgdmFyKS4nKSwKbmV3IElucHV0T3B0aW9uKCdwcmVmZXItbG93ZXN0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdQcmVmZXIgbG93ZXN0IHZlcnNpb25zIG9mIGRlcGVuZGVuY2llcyAoY2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgQ09NUE9TRVJfUFJFRkVSX0xPV0VTVD0xIGVudiB2YXIpLicpLApuZXcgSW5wdXRPcHRpb24oJ21pbmltYWwtY2hhbmdlcycsICdtJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEdXJpbmcgYW4gdXBkYXRlIHdpdGggLXcvLVcsIG9ubHkgcGVyZm9ybSBhYnNvbHV0ZWx5IG5lY2Vzc2FyeSBjaGFuZ2VzIHRvIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIChjYW4gYWxzbyBiZSBzZXQgdmlhIHRoZSBDT01QT1NFUl9NSU5JTUFMX0NIQU5HRVM9MSBlbnYgdmFyKS4nKSwKbmV3IElucHV0T3B0aW9uKCdzb3J0LXBhY2thZ2VzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTb3J0cyBwYWNrYWdlcyB3aGVuIGFkZGluZy91cGRhdGluZyBhIG5ldyBkZXBlbmRlbmN5JyksCm5ldyBJbnB1dE9wdGlvbignb3B0aW1pemUtYXV0b2xvYWRlcicsICdvJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPcHRpbWl6ZSBhdXRvbG9hZGVyIGR1cmluZyBhdXRvbG9hZGVyIGR1bXAnKSwKbmV3IElucHV0T3B0aW9uKCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJywgJ2EnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0F1dG9sb2FkIGNsYXNzZXMgZnJvbSB0aGUgY2xhc3NtYXAgb25seS4gSW1wbGljaXRseSBlbmFibGVzIGAtLW9wdGltaXplLWF1dG9sb2FkZXJgLicpLApuZXcgSW5wdXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlcicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnVXNlIEFQQ3UgdG8gY2FjaGUgZm91bmQvbm90LWZvdW5kIGNsYXNzZXMuJyksCm5ldyBJbnB1dE9wdGlvbignYXBjdS1hdXRvbG9hZGVyLXByZWZpeCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1VzZSBhIGN1c3RvbSBwcmVmaXggZm9yIHRoZSBBUEN1IGF1dG9sb2FkZXIgY2FjaGUuIEltcGxpY2l0bHkgZW5hYmxlcyAtLWFwY3UtYXV0b2xvYWRlcicpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgcmVxdWlyZSBjb21tYW5kIGFkZHMgcmVxdWlyZWQgcGFja2FnZXMgdG8geW91ciBjb21wb3Nlci5qc29uIGFuZCBpbnN0YWxscyB0aGVtLgoKSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgcGFja2FnZSwgY29tcG9zZXIgd2lsbCBwcm9tcHQgeW91IHRvIHNlYXJjaCBmb3IgYSBwYWNrYWdlLCBhbmQgZ2l2ZW4gcmVzdWx0cywgcHJvdmlkZSBhIGxpc3Qgb2YKbWF0Y2hlcyB0byByZXF1aXJlLgoKSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBjb25zdHJhaW50LCBjb21wb3NlciB3aWxsIGNob29zZSBhIHN1aXRhYmxlIG9uZSBiYXNlZCBvbiB0aGUgYXZhaWxhYmxlIHBhY2thZ2UgdmVyc2lvbnMuCgpJZiB5b3UgZG8gbm90IHdhbnQgdG8gaW5zdGFsbCB0aGUgbmV3IGRlcGVuZGVuY2llcyBpbW1lZGlhdGVseSB5b3UgY2FuIGNhbGwgaXQgd2l0aCAtLW5vLXVwZGF0ZQoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjcmVxdWlyZS1yCkVPVAopCjsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiR0aGlzLT5maWxlID0gRmFjdG9yeTo6Z2V0Q29tcG9zZXJGaWxlKCk7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1zdWdnZXN0JykpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Zb3UgYXJlIHVzaW5nIHRoZSBkZXByZWNhdGVkIG9wdGlvbiAiLS1uby1zdWdnZXN0Ii4gSXQgaGFzIG5vIGVmZmVjdCBhbmQgd2lsbCBicmVhayBpbiBDb21wb3NlciAzLjwvd2FybmluZz4nKTsKfQoKJHRoaXMtPm5ld2x5Q3JlYXRlZCA9ICFmaWxlX2V4aXN0cygkdGhpcy0+ZmlsZSk7CmlmICgkdGhpcy0+bmV3bHlDcmVhdGVkICYmICFmaWxlX3B1dF9jb250ZW50cygkdGhpcy0+ZmlsZSwgIntcbn1cbiIpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPicuJHRoaXMtPmZpbGUuJyBjb3VsZCBub3QgYmUgY3JlYXRlZC48L2Vycm9yPicpOwoKcmV0dXJuIDE7Cn0KaWYgKCFGaWxlc3lzdGVtOjppc1JlYWRhYmxlKCR0aGlzLT5maWxlKSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj4nLiR0aGlzLT5maWxlLicgaXMgbm90IHJlYWRhYmxlLjwvZXJyb3I+Jyk7CgpyZXR1cm4gMTsKfQoKaWYgKGZpbGVzaXplKCR0aGlzLT5maWxlKSA9PT0gMCkgewpmaWxlX3B1dF9jb250ZW50cygkdGhpcy0+ZmlsZSwgIntcbn1cbiIpOwp9CgokdGhpcy0+anNvbiA9IG5ldyBKc29uRmlsZSgkdGhpcy0+ZmlsZSk7CiR0aGlzLT5sb2NrID0gRmFjdG9yeTo6Z2V0TG9ja0ZpbGUoJHRoaXMtPmZpbGUpOwokdGhpcy0+Y29tcG9zZXJCYWNrdXAgPSBmaWxlX2dldF9jb250ZW50cygkdGhpcy0+anNvbi0+Z2V0UGF0aCgpKTsKJHRoaXMtPmxvY2tCYWNrdXAgPSBmaWxlX2V4aXN0cygkdGhpcy0+bG9jaykgPyBmaWxlX2dldF9jb250ZW50cygkdGhpcy0+bG9jaykgOiBudWxsOwoKJHNpZ25hbEhhbmRsZXIgPSBTaWduYWxIYW5kbGVyOjpjcmVhdGUoW1NpZ25hbEhhbmRsZXI6OlNJR0lOVCwgU2lnbmFsSGFuZGxlcjo6U0lHVEVSTSwgU2lnbmFsSGFuZGxlcjo6U0lHSFVQXSwgZnVuY3Rpb24gKHN0cmluZyAkc2lnbmFsLCBTaWduYWxIYW5kbGVyICRoYW5kbGVyKSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZUVycm9yKCdSZWNlaXZlZCAnLiRzaWduYWwuJywgYWJvcnRpbmcnLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwokdGhpcy0+cmV2ZXJ0Q29tcG9zZXJGaWxlKCk7CiRoYW5kbGVyLT5leGl0V2l0aExhc3RTaWduYWwoKTsKfSk7CgoKCmlmICghaXNfd3JpdGFibGUoJHRoaXMtPmZpbGUpICYmIGZhbHNlID09PSBTaWxlbmNlcjo6Y2FsbCgnZmlsZV9wdXRfY29udGVudHMnLCAkdGhpcy0+ZmlsZSwgJHRoaXMtPmNvbXBvc2VyQmFja3VwKSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj4nLiR0aGlzLT5maWxlLicgaXMgbm90IHdyaXRhYmxlLjwvZXJyb3I+Jyk7CgpyZXR1cm4gMTsKfQoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdmaXhlZCcpID09PSB0cnVlKSB7CiRjb25maWcgPSAkdGhpcy0+anNvbi0+cmVhZCgpOwoKJHBhY2thZ2VUeXBlID0gZW1wdHkoJGNvbmZpZ1sndHlwZSddKSA/ICdsaWJyYXJ5JyA6ICRjb25maWdbJ3R5cGUnXTsKCgoKCmlmICgkcGFja2FnZVR5cGUgIT09ICdwcm9qZWN0JyAmJiAhJGlucHV0LT5nZXRPcHRpb24oJ2RldicpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPlRoZSAiLS1maXhlZCIgb3B0aW9uIGlzIG9ubHkgYWxsb3dlZCBmb3IgcGFja2FnZXMgd2l0aCBhICJwcm9qZWN0IiB0eXBlIG9yIGZvciBkZXYgZGVwZW5kZW5jaWVzIHRvIHByZXZlbnQgcG9zc2libGUgbWlzdXNlcy48L2Vycm9yPicpOwoKaWYgKCFpc3NldCgkY29uZmlnWyd0eXBlJ10pKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPklmIHlvdXIgcGFja2FnZSBpcyBub3QgYSBsaWJyYXJ5LCB5b3UgY2FuIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgInR5cGUiIGJ5IHVzaW5nICJjb21wb3NlciBjb25maWcgdHlwZSBwcm9qZWN0Ii48L2Vycm9yPicpOwp9CgpyZXR1cm4gMTsKfQp9CgokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CiRyZXBvcyA9ICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0UmVwb3NpdG9yaWVzKCk7CgokcGxhdGZvcm1PdmVycmlkZXMgPSAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ3BsYXRmb3JtJyk7CgokdGhpcy0+cmVwb3MgPSBuZXcgQ29tcG9zaXRlUmVwb3NpdG9yeShhcnJheV9tZXJnZSgKWyRwbGF0Zm9ybVJlcG8gPSBuZXcgUGxhdGZvcm1SZXBvc2l0b3J5KFtdLCAkcGxhdGZvcm1PdmVycmlkZXMpXSwKJHJlcG9zCikpOwoKaWYgKCRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRQcmVmZXJTdGFibGUoKSkgewokcHJlZmVycmVkU3RhYmlsaXR5ID0gJ3N0YWJsZSc7Cn0gZWxzZSB7CiRwcmVmZXJyZWRTdGFiaWxpdHkgPSAkY29tcG9zZXItPmdldFBhY2thZ2UoKS0+Z2V0TWluaW11bVN0YWJpbGl0eSgpOwp9Cgp0cnkgewokcmVxdWlyZW1lbnRzID0gJHRoaXMtPmRldGVybWluZVJlcXVpcmVtZW50cygKJGlucHV0LAokb3V0cHV0LAokaW5wdXQtPmdldEFyZ3VtZW50KCdwYWNrYWdlcycpLAokcGxhdGZvcm1SZXBvLAokcHJlZmVycmVkU3RhYmlsaXR5LAokaW5wdXQtPmdldE9wdGlvbignbm8tdXBkYXRlJyksIAokaW5wdXQtPmdldE9wdGlvbignZml4ZWQnKQopOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmlmICgkdGhpcy0+bmV3bHlDcmVhdGVkKSB7CiR0aGlzLT5yZXZlcnRDb21wb3NlckZpbGUoKTsKCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignTm8gY29tcG9zZXIuanNvbiBwcmVzZW50IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSAoJy4kdGhpcy0+ZmlsZS4nKSwgdGhpcyBtYXkgYmUgdGhlIGNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uLicsIDAsICRlKTsKfQoKdGhyb3cgJGU7Cn0KCiRyZXF1aXJlbWVudHMgPSAkdGhpcy0+Zm9ybWF0UmVxdWlyZW1lbnRzKCRyZXF1aXJlbWVudHMpOwoKaWYgKCEkaW5wdXQtPmdldE9wdGlvbignZGV2JykgJiYgJGlvLT5pc0ludGVyYWN0aXZlKCkgJiYgISRjb21wb3Nlci0+aXNHbG9iYWwoKSkgewokZGV2UGFja2FnZXMgPSBbXTsKJGRldlRhZ3MgPSBbJ2RldicsICd0ZXN0aW5nJywgJ3N0YXRpYyBhbmFseXNpcyddOwokY3VycmVudFJlcXVpcmVzQnlLZXkgPSAkdGhpcy0+Z2V0UGFja2FnZXNCeVJlcXVpcmVLZXkoKTsKZm9yZWFjaCAoJHJlcXVpcmVtZW50cyBhcyAkbmFtZSA9PiAkdmVyc2lvbikgewoKaWYgKGlzc2V0KCRjdXJyZW50UmVxdWlyZXNCeUtleVskbmFtZV0pKSB7CmNvbnRpbnVlOwp9CgokcGtnID0gUGFja2FnZVNvcnRlcjo6Z2V0TW9zdEN1cnJlbnRWZXJzaW9uKCR0aGlzLT5nZXRSZXBvcygpLT5maW5kUGFja2FnZXMoJG5hbWUpKTsKaWYgKCRwa2cgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UpIHsKJHBrZ0RldlRhZ3MgPSBhcnJheV9pbnRlcnNlY3QoJGRldlRhZ3MsIGFycmF5X21hcCgnc3RydG9sb3dlcicsICRwa2ctPmdldEtleXdvcmRzKCkpKTsKaWYgKGNvdW50KCRwa2dEZXZUYWdzKSA+IDApIHsKJGRldlBhY2thZ2VzW10gPSAkcGtnRGV2VGFnczsKfQp9Cn0KCmlmIChjb3VudCgkZGV2UGFja2FnZXMpID09PSBjb3VudCgkcmVxdWlyZW1lbnRzKSkgewokcGx1cmFsID0gY291bnQoJHJlcXVpcmVtZW50cykgPiAxID8gJ3MnIDogJyc7CiRwbHVyYWwyID0gY291bnQoJHJlcXVpcmVtZW50cykgPiAxID8gJ2FyZScgOiAnaXMnOwokcGx1cmFsMyA9IGNvdW50KCRyZXF1aXJlbWVudHMpID4gMSA/ICd0aGV5IGFyZScgOiAnaXQgaXMnOwokcGtnRGV2VGFncyA9IGFycmF5X3VuaXF1ZShhcnJheV9tZXJnZSguLi4kZGV2UGFja2FnZXMpKTsKJGlvLT53YXJuaW5nKCdUaGUgcGFja2FnZScuJHBsdXJhbC4nIHlvdSByZXF1aXJlZCAnLiRwbHVyYWwyLicgcmVjb21tZW5kZWQgdG8gYmUgcGxhY2VkIGluIHJlcXVpcmUtZGV2IChiZWNhdXNlICcuJHBsdXJhbDMuJyB0YWdnZWQgYXMgIicuaW1wbG9kZSgnIiwgIicsICRwa2dEZXZUYWdzKS4nIikgYnV0IHlvdSBkaWQgbm90IHVzZSAtLWRldi4nKTsKaWYgKCRpby0+YXNrQ29uZmlybWF0aW9uKCc8aW5mbz5EbyB5b3Ugd2FudCB0byByZS1ydW4gdGhlIGNvbW1hbmQgd2l0aCAtLWRldj88Lz4gWzxjb21tZW50PnllczwvPl0/ICcpKSB7CiRpbnB1dC0+c2V0T3B0aW9uKCdkZXYnLCB0cnVlKTsKfQp9Cgp1bnNldCgkZGV2UGFja2FnZXMsICRwa2dEZXZUYWdzKTsKfQoKJHJlcXVpcmVLZXkgPSAkaW5wdXQtPmdldE9wdGlvbignZGV2JykgPyAncmVxdWlyZS1kZXYnIDogJ3JlcXVpcmUnOwokcmVtb3ZlS2V5ID0gJGlucHV0LT5nZXRPcHRpb24oJ2RldicpID8gJ3JlcXVpcmUnIDogJ3JlcXVpcmUtZGV2JzsKCgokcmVxdWlyZW1lbnRzVG9HdWVzcyA9IFtdOwpmb3JlYWNoICgkcmVxdWlyZW1lbnRzIGFzICRwYWNrYWdlID0+ICRjb25zdHJhaW50KSB7CmlmICgkY29uc3RyYWludCA9PT0gJ2d1ZXNzJykgewokcmVxdWlyZW1lbnRzWyRwYWNrYWdlXSA9ICcqJzsKJHJlcXVpcmVtZW50c1RvR3Vlc3NbXSA9ICRwYWNrYWdlOwp9Cn0KCgokdmVyc2lvblBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyKCk7CmZvcmVhY2ggKCRyZXF1aXJlbWVudHMgYXMgJHBhY2thZ2UgPT4gJGNvbnN0cmFpbnQpIHsKaWYgKHN0cnRvbG93ZXIoJHBhY2thZ2UpID09PSAkY29tcG9zZXItPmdldFBhY2thZ2UoKS0+Z2V0TmFtZSgpKSB7CiRpby0+d3JpdGVFcnJvcihzcHJpbnRmKCc8ZXJyb3I+Um9vdCBwYWNrYWdlIFwnJXNcJyBjYW5ub3QgcmVxdWlyZSBpdHNlbGYgaW4gaXRzIGNvbXBvc2VyLmpzb248L2Vycm9yPicsICRwYWNrYWdlKSk7CgpyZXR1cm4gMTsKfQppZiAoJGNvbnN0cmFpbnQgPT09ICdzZWxmLnZlcnNpb24nKSB7CmNvbnRpbnVlOwp9CiR2ZXJzaW9uUGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCRjb25zdHJhaW50KTsKfQoKJGluY29uc2lzdGVudFJlcXVpcmVLZXlzID0gJHRoaXMtPmdldEluY29uc2lzdGVudFJlcXVpcmVLZXlzKCRyZXF1aXJlbWVudHMsICRyZXF1aXJlS2V5KTsKaWYgKGNvdW50KCRpbmNvbnNpc3RlbnRSZXF1aXJlS2V5cykgPiAwKSB7CmZvcmVhY2ggKCRpbmNvbnNpc3RlbnRSZXF1aXJlS2V5cyBhcyAkcGFja2FnZSkgewokaW8tPndhcm5pbmcoc3ByaW50ZigKJyVzIGlzIGN1cnJlbnRseSBwcmVzZW50IGluIHRoZSAlcyBrZXkgYW5kIHlvdSByYW4gdGhlIGNvbW1hbmQgJXMgdGhlIC0tZGV2IGZsYWcsIHdoaWNoIHdpbGwgbW92ZSBpdCB0byB0aGUgJXMga2V5LicsCiRwYWNrYWdlLAokcmVtb3ZlS2V5LAokaW5wdXQtPmdldE9wdGlvbignZGV2JykgPyAnd2l0aCcgOiAnd2l0aG91dCcsCiRyZXF1aXJlS2V5CikpOwp9CgppZiAoJGlvLT5pc0ludGVyYWN0aXZlKCkpIHsKaWYgKCEkaW8tPmFza0NvbmZpcm1hdGlvbihzcHJpbnRmKCc8aW5mbz5EbyB5b3Ugd2FudCB0byBtb3ZlICVzPzwvaW5mbz4gWzxjb21tZW50Pm5vPC9jb21tZW50Pl0/ICcsIGNvdW50KCRpbmNvbnNpc3RlbnRSZXF1aXJlS2V5cykgPiAxID8gJ3RoZXNlIHJlcXVpcmVtZW50cycgOiAndGhpcyByZXF1aXJlbWVudCcpLCBmYWxzZSkpIHsKaWYgKCEkaW8tPmFza0NvbmZpcm1hdGlvbihzcHJpbnRmKCc8aW5mbz5EbyB5b3Ugd2FudCB0byByZS1ydW4gdGhlIGNvbW1hbmQgJXMgLS1kZXY/PC9pbmZvPiBbPGNvbW1lbnQ+eWVzPC9jb21tZW50Pl0/ICcsICRpbnB1dC0+Z2V0T3B0aW9uKCdkZXYnKSA/ICd3aXRob3V0JyA6ICd3aXRoJyksIHRydWUpKSB7CnJldHVybiAwOwp9CgokaW5wdXQtPnNldE9wdGlvbignZGV2JywgdHJ1ZSk7ClskcmVxdWlyZUtleSwgJHJlbW92ZUtleV0gPSBbJHJlbW92ZUtleSwgJHJlcXVpcmVLZXldOwp9Cn0KfQoKJHNvcnRQYWNrYWdlcyA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdzb3J0LXBhY2thZ2VzJykgfHwgJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdzb3J0LXBhY2thZ2VzJyk7CgokdGhpcy0+Zmlyc3RSZXF1aXJlID0gJHRoaXMtPm5ld2x5Q3JlYXRlZDsKaWYgKCEkdGhpcy0+Zmlyc3RSZXF1aXJlKSB7CiRjb21wb3NlckRlZmluaXRpb24gPSAkdGhpcy0+anNvbi0+cmVhZCgpOwppZiAoY291bnQoJGNvbXBvc2VyRGVmaW5pdGlvblsncmVxdWlyZSddID8/IFtdKSA9PT0gMCAmJiBjb3VudCgkY29tcG9zZXJEZWZpbml0aW9uWydyZXF1aXJlLWRldiddID8/IFtdKSA9PT0gMCkgewokdGhpcy0+Zmlyc3RSZXF1aXJlID0gdHJ1ZTsKfQp9CgppZiAoISRpbnB1dC0+Z2V0T3B0aW9uKCdkcnktcnVuJykpIHsKJHRoaXMtPnVwZGF0ZUZpbGUoJHRoaXMtPmpzb24sICRyZXF1aXJlbWVudHMsICRyZXF1aXJlS2V5LCAkcmVtb3ZlS2V5LCAkc29ydFBhY2thZ2VzKTsKfQoKJGlvLT53cml0ZUVycm9yKCc8aW5mbz4nLiR0aGlzLT5maWxlLicgaGFzIGJlZW4gJy4oJHRoaXMtPm5ld2x5Q3JlYXRlZCA/ICdjcmVhdGVkJyA6ICd1cGRhdGVkJykuJzwvaW5mbz4nKTsKCmlmICgkaW5wdXQtPmdldE9wdGlvbignbm8tdXBkYXRlJykpIHsKcmV0dXJuIDA7Cn0KCiRjb21wb3Nlci0+Z2V0UGx1Z2luTWFuYWdlcigpLT5kZWFjdGl2YXRlSW5zdGFsbGVkUGx1Z2lucygpOwoKdHJ5IHsKJHJlc3VsdCA9ICR0aGlzLT5kb1VwZGF0ZSgkaW5wdXQsICRvdXRwdXQsICRpbywgJHJlcXVpcmVtZW50cywgJHJlcXVpcmVLZXksICRyZW1vdmVLZXkpOwppZiAoJHJlc3VsdCA9PT0gMCAmJiBjb3VudCgkcmVxdWlyZW1lbnRzVG9HdWVzcykgPiAwKSB7CiRyZXN1bHQgPSAkdGhpcy0+dXBkYXRlUmVxdWlyZW1lbnRzQWZ0ZXJSZXNvbHV0aW9uKCRyZXF1aXJlbWVudHNUb0d1ZXNzLCAkcmVxdWlyZUtleSwgJHJlbW92ZUtleSwgJHNvcnRQYWNrYWdlcywgJGlucHV0LT5nZXRPcHRpb24oJ2RyeS1ydW4nKSwgJGlucHV0LT5nZXRPcHRpb24oJ2ZpeGVkJykpOwp9CgpyZXR1cm4gJHJlc3VsdDsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewppZiAoISR0aGlzLT5kZXBlbmRlbmN5UmVzb2x1dGlvbkNvbXBsZXRlZCkgewokdGhpcy0+cmV2ZXJ0Q29tcG9zZXJGaWxlKCk7Cn0KdGhyb3cgJGU7Cn0gZmluYWxseSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbignZHJ5LXJ1bicpICYmICR0aGlzLT5uZXdseUNyZWF0ZWQpIHsKQHVubGluaygkdGhpcy0+anNvbi0+Z2V0UGF0aCgpKTsKfQoKJHNpZ25hbEhhbmRsZXItPnVucmVnaXN0ZXIoKTsKfQp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRJbmNvbnNpc3RlbnRSZXF1aXJlS2V5cyhhcnJheSAkbmV3UmVxdWlyZW1lbnRzLCBzdHJpbmcgJHJlcXVpcmVLZXkpOiBhcnJheQp7CiRyZXF1aXJlS2V5cyA9ICR0aGlzLT5nZXRQYWNrYWdlc0J5UmVxdWlyZUtleSgpOwokaW5jb25zaXN0ZW50UmVxdWlyZW1lbnRzID0gW107CmZvcmVhY2ggKCRyZXF1aXJlS2V5cyBhcyAkcGFja2FnZSA9PiAkcGFja2FnZVJlcXVpcmVLZXkpIHsKaWYgKCFpc3NldCgkbmV3UmVxdWlyZW1lbnRzWyRwYWNrYWdlXSkpIHsKY29udGludWU7Cn0KaWYgKCRyZXF1aXJlS2V5ICE9PSAkcGFja2FnZVJlcXVpcmVLZXkpIHsKJGluY29uc2lzdGVudFJlcXVpcmVtZW50c1tdID0gJHBhY2thZ2U7Cn0KfQoKcmV0dXJuICRpbmNvbnNpc3RlbnRSZXF1aXJlbWVudHM7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0UGFja2FnZXNCeVJlcXVpcmVLZXkoKTogYXJyYXkKewokY29tcG9zZXJEZWZpbml0aW9uID0gJHRoaXMtPmpzb24tPnJlYWQoKTsKJHJlcXVpcmUgPSBbXTsKJHJlcXVpcmVEZXYgPSBbXTsKCmlmIChpc3NldCgkY29tcG9zZXJEZWZpbml0aW9uWydyZXF1aXJlJ10pKSB7CiRyZXF1aXJlID0gJGNvbXBvc2VyRGVmaW5pdGlvblsncmVxdWlyZSddOwp9CgppZiAoaXNzZXQoJGNvbXBvc2VyRGVmaW5pdGlvblsncmVxdWlyZS1kZXYnXSkpIHsKJHJlcXVpcmVEZXYgPSAkY29tcG9zZXJEZWZpbml0aW9uWydyZXF1aXJlLWRldiddOwp9CgpyZXR1cm4gYXJyYXlfbWVyZ2UoCmFycmF5X2ZpbGxfa2V5cyhhcnJheV9rZXlzKCRyZXF1aXJlKSwgJ3JlcXVpcmUnKSwKYXJyYXlfZmlsbF9rZXlzKGFycmF5X2tleXMoJHJlcXVpcmVEZXYpLCAncmVxdWlyZS1kZXYnKQopOwp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRvVXBkYXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIElPSW50ZXJmYWNlICRpbywgYXJyYXkgJHJlcXVpcmVtZW50cywgc3RyaW5nICRyZXF1aXJlS2V5LCBzdHJpbmcgJHJlbW92ZUtleSk6IGludAp7CgokdGhpcy0+cmVzZXRDb21wb3NlcigpOwokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CgokdGhpcy0+ZGVwZW5kZW5jeVJlc29sdXRpb25Db21wbGV0ZWQgPSBmYWxzZTsKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+YWRkTGlzdGVuZXIoSW5zdGFsbGVyRXZlbnRzOjpQUkVfT1BFUkFUSU9OU19FWEVDLCBmdW5jdGlvbiAoKTogdm9pZCB7CiR0aGlzLT5kZXBlbmRlbmN5UmVzb2x1dGlvbkNvbXBsZXRlZCA9IHRydWU7Cn0sIDEwMDAwKTsKCmlmICgkaW5wdXQtPmdldE9wdGlvbignZHJ5LXJ1bicpKSB7CiRyb290UGFja2FnZSA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpOwokbGlua3MgPSBbCidyZXF1aXJlJyA9PiAkcm9vdFBhY2thZ2UtPmdldFJlcXVpcmVzKCksCidyZXF1aXJlLWRldicgPT4gJHJvb3RQYWNrYWdlLT5nZXREZXZSZXF1aXJlcygpLApdOwokbG9hZGVyID0gbmV3IEFycmF5TG9hZGVyKCk7CiRuZXdMaW5rcyA9ICRsb2FkZXItPnBhcnNlTGlua3MoJHJvb3RQYWNrYWdlLT5nZXROYW1lKCksICRyb290UGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpLCBCYXNlUGFja2FnZTo6JHN1cHBvcnRlZExpbmtUeXBlc1skcmVxdWlyZUtleV1bJ21ldGhvZCddLCAkcmVxdWlyZW1lbnRzKTsKJGxpbmtzWyRyZXF1aXJlS2V5XSA9IGFycmF5X21lcmdlKCRsaW5rc1skcmVxdWlyZUtleV0sICRuZXdMaW5rcyk7CmZvcmVhY2ggKCRyZXF1aXJlbWVudHMgYXMgJHBhY2thZ2UgPT4gJGNvbnN0cmFpbnQpIHsKdW5zZXQoJGxpbmtzWyRyZW1vdmVLZXldWyRwYWNrYWdlXSk7Cn0KJHJvb3RQYWNrYWdlLT5zZXRSZXF1aXJlcygkbGlua3NbJ3JlcXVpcmUnXSk7CiRyb290UGFja2FnZS0+c2V0RGV2UmVxdWlyZXMoJGxpbmtzWydyZXF1aXJlLWRldiddKTsKCgokcmVmZXJlbmNlcyA9ICRyb290UGFja2FnZS0+Z2V0UmVmZXJlbmNlcygpOwokcmVmZXJlbmNlcyA9IFJvb3RQYWNrYWdlTG9hZGVyOjpleHRyYWN0UmVmZXJlbmNlcygkcmVxdWlyZW1lbnRzLCAkcmVmZXJlbmNlcyk7CiRyb290UGFja2FnZS0+c2V0UmVmZXJlbmNlcygkcmVmZXJlbmNlcyk7CiRzdGFiaWxpdHlGbGFncyA9ICRyb290UGFja2FnZS0+Z2V0U3RhYmlsaXR5RmxhZ3MoKTsKJHN0YWJpbGl0eUZsYWdzID0gUm9vdFBhY2thZ2VMb2FkZXI6OmV4dHJhY3RTdGFiaWxpdHlGbGFncygkcmVxdWlyZW1lbnRzLCAkcm9vdFBhY2thZ2UtPmdldE1pbmltdW1TdGFiaWxpdHkoKSwgJHN0YWJpbGl0eUZsYWdzKTsKJHJvb3RQYWNrYWdlLT5zZXRTdGFiaWxpdHlGbGFncygkc3RhYmlsaXR5RmxhZ3MpOwp1bnNldCgkc3RhYmlsaXR5RmxhZ3MsICRyZWZlcmVuY2VzKTsKfQoKJHVwZGF0ZURldk1vZGUgPSAhJGlucHV0LT5nZXRPcHRpb24oJ3VwZGF0ZS1uby1kZXYnKTsKJG9wdGltaXplID0gJGlucHV0LT5nZXRPcHRpb24oJ29wdGltaXplLWF1dG9sb2FkZXInKSB8fCAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ29wdGltaXplLWF1dG9sb2FkZXInKTsKJGF1dGhvcml0YXRpdmUgPSAkaW5wdXQtPmdldE9wdGlvbignY2xhc3NtYXAtYXV0aG9yaXRhdGl2ZScpIHx8ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgnY2xhc3NtYXAtYXV0aG9yaXRhdGl2ZScpOwokYXBjdVByZWZpeCA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdhcGN1LWF1dG9sb2FkZXItcHJlZml4Jyk7CiRhcGN1ID0gJGFwY3VQcmVmaXggIT09IG51bGwgfHwgJGlucHV0LT5nZXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlcicpIHx8ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgnYXBjdS1hdXRvbG9hZGVyJyk7CiRtaW5pbWFsQ2hhbmdlcyA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdtaW5pbWFsLWNoYW5nZXMnKSB8fCAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ3VwZGF0ZS13aXRoLW1pbmltYWwtY2hhbmdlcycpOwoKJHVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyA9IFJlcXVlc3Q6OlVQREFURV9PTkxZX0xJU1RFRDsKJGZsYWdzID0gJyc7CmlmICgkaW5wdXQtPmdldE9wdGlvbigndXBkYXRlLXdpdGgtYWxsLWRlcGVuZGVuY2llcycpIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCd3aXRoLWFsbC1kZXBlbmRlbmNpZXMnKSkgewokdXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzID0gUmVxdWVzdDo6VVBEQVRFX0xJU1RFRF9XSVRIX1RSQU5TSVRJVkVfREVQUzsKJGZsYWdzIC49ICcgLS13aXRoLWFsbC1kZXBlbmRlbmNpZXMnOwp9IGVsc2VpZiAoJGlucHV0LT5nZXRPcHRpb24oJ3VwZGF0ZS13aXRoLWRlcGVuZGVuY2llcycpIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCd3aXRoLWRlcGVuZGVuY2llcycpKSB7CiR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMgPSBSZXF1ZXN0OjpVUERBVEVfTElTVEVEX1dJVEhfVFJBTlNJVElWRV9ERVBTX05PX1JPT1RfUkVRVUlSRTsKJGZsYWdzIC49ICcgLS13aXRoLWRlcGVuZGVuY2llcyc7Cn0KCiRpby0+d3JpdGVFcnJvcignPGluZm8+UnVubmluZyBjb21wb3NlciB1cGRhdGUgJy5pbXBsb2RlKCcgJywgYXJyYXlfa2V5cygkcmVxdWlyZW1lbnRzKSkuJGZsYWdzLic8L2luZm8+Jyk7CgokY29tbWFuZEV2ZW50ID0gbmV3IENvbW1hbmRFdmVudChQbHVnaW5FdmVudHM6OkNPTU1BTkQsICdyZXF1aXJlJywgJGlucHV0LCAkb3V0cHV0KTsKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2goJGNvbW1hbmRFdmVudC0+Z2V0TmFtZSgpLCAkY29tbWFuZEV2ZW50KTsKCiRjb21wb3Nlci0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpLT5zZXRPdXRwdXRQcm9ncmVzcyghJGlucHV0LT5nZXRPcHRpb24oJ25vLXByb2dyZXNzJykpOwoKJGluc3RhbGwgPSBJbnN0YWxsZXI6OmNyZWF0ZSgkaW8sICRjb21wb3Nlcik7CgpbJHByZWZlclNvdXJjZSwgJHByZWZlckRpc3RdID0gJHRoaXMtPmdldFByZWZlcnJlZEluc3RhbGxPcHRpb25zKCRjb21wb3Nlci0+Z2V0Q29uZmlnKCksICRpbnB1dCk7CgokaW5zdGFsbAotPnNldERyeVJ1bigkaW5wdXQtPmdldE9wdGlvbignZHJ5LXJ1bicpKQotPnNldFZlcmJvc2UoJGlucHV0LT5nZXRPcHRpb24oJ3ZlcmJvc2UnKSkKLT5zZXRQcmVmZXJTb3VyY2UoJHByZWZlclNvdXJjZSkKLT5zZXRQcmVmZXJEaXN0KCRwcmVmZXJEaXN0KQotPnNldERldk1vZGUoJHVwZGF0ZURldk1vZGUpCi0+c2V0T3B0aW1pemVBdXRvbG9hZGVyKCRvcHRpbWl6ZSkKLT5zZXRDbGFzc01hcEF1dGhvcml0YXRpdmUoJGF1dGhvcml0YXRpdmUpCi0+c2V0QXBjdUF1dG9sb2FkZXIoJGFwY3UsICRhcGN1UHJlZml4KQotPnNldFVwZGF0ZSh0cnVlKQotPnNldEluc3RhbGwoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1pbnN0YWxsJykpCi0+c2V0VXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKCR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMpCi0+c2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkdGhpcy0+Z2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkaW5wdXQpKQotPnNldFByZWZlclN0YWJsZSgkaW5wdXQtPmdldE9wdGlvbigncHJlZmVyLXN0YWJsZScpKQotPnNldFByZWZlckxvd2VzdCgkaW5wdXQtPmdldE9wdGlvbigncHJlZmVyLWxvd2VzdCcpKQotPnNldEF1ZGl0Q29uZmlnKCR0aGlzLT5jcmVhdGVBdWRpdENvbmZpZygkY29tcG9zZXItPmdldENvbmZpZygpLCAkaW5wdXQpKQotPnNldE1pbmltYWxVcGRhdGUoJG1pbmltYWxDaGFuZ2VzKQo7CgoKCmlmICghJHRoaXMtPmZpcnN0UmVxdWlyZSAmJiAkY29tcG9zZXItPmdldExvY2tlcigpLT5pc0xvY2tlZCgpKSB7CiRpbnN0YWxsLT5zZXRVcGRhdGVBbGxvd0xpc3QoYXJyYXlfa2V5cygkcmVxdWlyZW1lbnRzKSk7Cn0KCiRzdGF0dXMgPSAkaW5zdGFsbC0+cnVuKCk7CmlmICgkc3RhdHVzICE9PSAwICYmICRzdGF0dXMgIT09IEluc3RhbGxlcjo6RVJST1JfQVVESVRfRkFJTEVEKSB7CmlmICgkc3RhdHVzID09PSBJbnN0YWxsZXI6OkVSUk9SX0RFUEVOREVOQ1lfUkVTT0xVVElPTl9GQUlMRUQpIHsKZm9yZWFjaCAoJHRoaXMtPm5vcm1hbGl6ZVJlcXVpcmVtZW50cygkaW5wdXQtPmdldEFyZ3VtZW50KCdwYWNrYWdlcycpKSBhcyAkcmVxKSB7CmlmICghaXNzZXQoJHJlcVsndmVyc2lvbiddKSkgewokaW8tPndyaXRlRXJyb3IoJ1lvdSBjYW4gYWxzbyB0cnkgcmUtcnVubmluZyBjb21wb3NlciByZXF1aXJlIHdpdGggYW4gZXhwbGljaXQgdmVyc2lvbiBjb25zdHJhaW50LCBlLmcuICJjb21wb3NlciByZXF1aXJlICcuJHJlcVsnbmFtZSddLic6KiIgdG8gZmlndXJlIG91dCBpZiBhbnkgdmVyc2lvbiBpcyBpbnN0YWxsYWJsZSwgb3IgImNvbXBvc2VyIHJlcXVpcmUgJy4kcmVxWyduYW1lJ10uJzpeMi4xIiBpZiB5b3Uga25vdyB3aGljaCB5b3UgbmVlZC4nKTsKYnJlYWs7Cn0KfQp9CiR0aGlzLT5yZXZlcnRDb21wb3NlckZpbGUoKTsKfQoKcmV0dXJuICRzdGF0dXM7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gdXBkYXRlUmVxdWlyZW1lbnRzQWZ0ZXJSZXNvbHV0aW9uKGFycmF5ICRyZXF1aXJlbWVudHNUb1VwZGF0ZSwgc3RyaW5nICRyZXF1aXJlS2V5LCBzdHJpbmcgJHJlbW92ZUtleSwgYm9vbCAkc29ydFBhY2thZ2VzLCBib29sICRkcnlSdW4sIGJvb2wgJGZpeGVkKTogaW50CnsKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwokbG9ja2VyID0gJGNvbXBvc2VyLT5nZXRMb2NrZXIoKTsKJHJlcXVpcmVtZW50cyA9IFtdOwokdmVyc2lvblNlbGVjdG9yID0gbmV3IFZlcnNpb25TZWxlY3RvcihuZXcgUmVwb3NpdG9yeVNldCgpKTsKJHJlcG8gPSAkbG9ja2VyLT5pc0xvY2tlZCgpID8gJGNvbXBvc2VyLT5nZXRMb2NrZXIoKS0+Z2V0TG9ja2VkUmVwb3NpdG9yeSh0cnVlKSA6ICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7CmZvcmVhY2ggKCRyZXF1aXJlbWVudHNUb1VwZGF0ZSBhcyAkcGFja2FnZU5hbWUpIHsKJHBhY2thZ2UgPSAkcmVwby0+ZmluZFBhY2thZ2UoJHBhY2thZ2VOYW1lLCAnKicpOwp3aGlsZSAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJHBhY2thZ2UgPSAkcGFja2FnZS0+Z2V0QWxpYXNPZigpOwp9CgppZiAoISRwYWNrYWdlIGluc3RhbmNlb2YgUGFja2FnZUludGVyZmFjZSkgewpjb250aW51ZTsKfQoKaWYgKCRmaXhlZCkgewokcmVxdWlyZW1lbnRzWyRwYWNrYWdlTmFtZV0gPSAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwp9IGVsc2UgewokcmVxdWlyZW1lbnRzWyRwYWNrYWdlTmFtZV0gPSAkdmVyc2lvblNlbGVjdG9yLT5maW5kUmVjb21tZW5kZWRSZXF1aXJlVmVyc2lvbigkcGFja2FnZSk7Cn0KJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3Ioc3ByaW50ZigKJ1VzaW5nIHZlcnNpb24gPGluZm8+JXM8L2luZm8+IGZvciA8aW5mbz4lczwvaW5mbz4nLAokcmVxdWlyZW1lbnRzWyRwYWNrYWdlTmFtZV0sCiRwYWNrYWdlTmFtZQopKTsKCmlmIChQcmVnOjppc01hdGNoKCd7XmRldi0oPyFtYWluJHxtYXN0ZXIkfHRydW5rJHxsYXRlc3QkKX0nLCAkcmVxdWlyZW1lbnRzWyRwYWNrYWdlTmFtZV0pKSB7CiR0aGlzLT5nZXRJTygpLT53YXJuaW5nKCdWZXJzaW9uICcuJHJlcXVpcmVtZW50c1skcGFja2FnZU5hbWVdLicgbG9va3MgbGlrZSBpdCBtYXkgYmUgYSBmZWF0dXJlIGJyYW5jaCB3aGljaCBpcyB1bmxpa2VseSB0byBrZWVwIHdvcmtpbmcgaW4gdGhlIGxvbmcgcnVuIGFuZCBtYXkgYmUgaW4gYW4gdW5zdGFibGUgc3RhdGUnKTsKaWYgKCR0aGlzLT5nZXRJTygpLT5pc0ludGVyYWN0aXZlKCkgJiYgISR0aGlzLT5nZXRJTygpLT5hc2tDb25maXJtYXRpb24oJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byB1c2UgdGhpcyBjb25zdHJhaW50ICg8Y29tbWVudD55PC9jb21tZW50Pikgb3Igd291bGQgeW91IHJhdGhlciBhYm9ydCAoPGNvbW1lbnQ+bjwvY29tbWVudD4pIHRoZSB3aG9sZSBvcGVyYXRpb24gWzxjb21tZW50PnksbjwvY29tbWVudD5dPyAnKSkgewokdGhpcy0+cmV2ZXJ0Q29tcG9zZXJGaWxlKCk7CgpyZXR1cm4gMTsKfQp9Cn0KCmlmICghJGRyeVJ1bikgewokdGhpcy0+dXBkYXRlRmlsZSgkdGhpcy0+anNvbiwgJHJlcXVpcmVtZW50cywgJHJlcXVpcmVLZXksICRyZW1vdmVLZXksICRzb3J0UGFja2FnZXMpOwppZiAoJGxvY2tlci0+aXNMb2NrZWQoKSAmJiAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ2xvY2snKSkgewokc3RhYmlsaXR5RmxhZ3MgPSBSb290UGFja2FnZUxvYWRlcjo6ZXh0cmFjdFN0YWJpbGl0eUZsYWdzKCRyZXF1aXJlbWVudHMsICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRNaW5pbXVtU3RhYmlsaXR5KCksIFtdKTsKJGxvY2tlci0+dXBkYXRlSGFzaCgkdGhpcy0+anNvbiwgc3RhdGljIGZ1bmN0aW9uIChhcnJheSAkbG9ja0RhdGEpIHVzZSAoJHN0YWJpbGl0eUZsYWdzKSB7CmZvcmVhY2ggKCRzdGFiaWxpdHlGbGFncyBhcyAkcGFja2FnZU5hbWUgPT4gJGZsYWcpIHsKJGxvY2tEYXRhWydzdGFiaWxpdHktZmxhZ3MnXVskcGFja2FnZU5hbWVdID0gJGZsYWc7Cn0KCnJldHVybiAkbG9ja0RhdGE7Cn0pOwp9Cn0KCnJldHVybiAwOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHVwZGF0ZUZpbGUoSnNvbkZpbGUgJGpzb24sIGFycmF5ICRuZXcsIHN0cmluZyAkcmVxdWlyZUtleSwgc3RyaW5nICRyZW1vdmVLZXksIGJvb2wgJHNvcnRQYWNrYWdlcyk6IHZvaWQKewppZiAoJHRoaXMtPnVwZGF0ZUZpbGVDbGVhbmx5KCRqc29uLCAkbmV3LCAkcmVxdWlyZUtleSwgJHJlbW92ZUtleSwgJHNvcnRQYWNrYWdlcykpIHsKcmV0dXJuOwp9CgokY29tcG9zZXJEZWZpbml0aW9uID0gJHRoaXMtPmpzb24tPnJlYWQoKTsKZm9yZWFjaCAoJG5ldyBhcyAkcGFja2FnZSA9PiAkdmVyc2lvbikgewokY29tcG9zZXJEZWZpbml0aW9uWyRyZXF1aXJlS2V5XVskcGFja2FnZV0gPSAkdmVyc2lvbjsKdW5zZXQoJGNvbXBvc2VyRGVmaW5pdGlvblskcmVtb3ZlS2V5XVskcGFja2FnZV0pOwppZiAoaXNzZXQoJGNvbXBvc2VyRGVmaW5pdGlvblskcmVtb3ZlS2V5XSkgJiYgY291bnQoJGNvbXBvc2VyRGVmaW5pdGlvblskcmVtb3ZlS2V5XSkgPT09IDApIHsKdW5zZXQoJGNvbXBvc2VyRGVmaW5pdGlvblskcmVtb3ZlS2V5XSk7Cn0KfQokdGhpcy0+anNvbi0+d3JpdGUoJGNvbXBvc2VyRGVmaW5pdGlvbik7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gdXBkYXRlRmlsZUNsZWFubHkoSnNvbkZpbGUgJGpzb24sIGFycmF5ICRuZXcsIHN0cmluZyAkcmVxdWlyZUtleSwgc3RyaW5nICRyZW1vdmVLZXksIGJvb2wgJHNvcnRQYWNrYWdlcyk6IGJvb2wKewokY29udGVudHMgPSBmaWxlX2dldF9jb250ZW50cygkanNvbi0+Z2V0UGF0aCgpKTsKCiRtYW5pcHVsYXRvciA9IG5ldyBKc29uTWFuaXB1bGF0b3IoJGNvbnRlbnRzKTsKCmZvcmVhY2ggKCRuZXcgYXMgJHBhY2thZ2UgPT4gJGNvbnN0cmFpbnQpIHsKaWYgKCEkbWFuaXB1bGF0b3ItPmFkZExpbmsoJHJlcXVpcmVLZXksICRwYWNrYWdlLCAkY29uc3RyYWludCwgJHNvcnRQYWNrYWdlcykpIHsKcmV0dXJuIGZhbHNlOwp9CmlmICghJG1hbmlwdWxhdG9yLT5yZW1vdmVTdWJOb2RlKCRyZW1vdmVLZXksICRwYWNrYWdlKSkgewpyZXR1cm4gZmFsc2U7Cn0KfQoKJG1hbmlwdWxhdG9yLT5yZW1vdmVNYWluS2V5SWZFbXB0eSgkcmVtb3ZlS2V5KTsKCmZpbGVfcHV0X2NvbnRlbnRzKCRqc29uLT5nZXRQYXRoKCksICRtYW5pcHVsYXRvci0+Z2V0Q29udGVudHMoKSk7CgpyZXR1cm4gdHJ1ZTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGludGVyYWN0KElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiB2b2lkCnsKfQoKcHJpdmF0ZSBmdW5jdGlvbiByZXZlcnRDb21wb3NlckZpbGUoKTogdm9pZAp7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwoKaWYgKCR0aGlzLT5uZXdseUNyZWF0ZWQpIHsKJGlvLT53cml0ZUVycm9yKCJcbiIuJzxlcnJvcj5JbnN0YWxsYXRpb24gZmFpbGVkLCBkZWxldGluZyAnLiR0aGlzLT5maWxlLicuPC9lcnJvcj4nKTsKdW5saW5rKCR0aGlzLT5qc29uLT5nZXRQYXRoKCkpOwppZiAoZmlsZV9leGlzdHMoJHRoaXMtPmxvY2spKSB7CnVubGluaygkdGhpcy0+bG9jayk7Cn0KfSBlbHNlIHsKJG1zZyA9ICcgdG8gaXRzICc7CmlmICgkdGhpcy0+bG9ja0JhY2t1cCkgewokbXNnID0gJyBhbmQgJy4kdGhpcy0+bG9jay4nIHRvIHRoZWlyICc7Cn0KJGlvLT53cml0ZUVycm9yKCJcbiIuJzxlcnJvcj5JbnN0YWxsYXRpb24gZmFpbGVkLCByZXZlcnRpbmcgJy4kdGhpcy0+ZmlsZS4kbXNnLidvcmlnaW5hbCBjb250ZW50LjwvZXJyb3I+Jyk7CmZpbGVfcHV0X2NvbnRlbnRzKCR0aGlzLT5qc29uLT5nZXRQYXRoKCksICR0aGlzLT5jb21wb3NlckJhY2t1cCk7CmlmICgkdGhpcy0+bG9ja0JhY2t1cCkgewpmaWxlX3B1dF9jb250ZW50cygkdGhpcy0+bG9jaywgJHRoaXMtPmxvY2tCYWNrdXApOwp9Cn0KfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXFNjcmlwdFxFdmVudCBhcyBTY3JpcHRFdmVudDsKdXNlIENvbXBvc2VyXFNjcmlwdFxTY3JpcHRFdmVudHM7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKY2xhc3MgUnVuU2NyaXB0Q29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKCgoKcHJvdGVjdGVkICRzY3JpcHRFdmVudHMgPSBbClNjcmlwdEV2ZW50czo6UFJFX0lOU1RBTExfQ01ELApTY3JpcHRFdmVudHM6OlBPU1RfSU5TVEFMTF9DTUQsClNjcmlwdEV2ZW50czo6UFJFX1VQREFURV9DTUQsClNjcmlwdEV2ZW50czo6UE9TVF9VUERBVEVfQ01ELApTY3JpcHRFdmVudHM6OlBSRV9TVEFUVVNfQ01ELApTY3JpcHRFdmVudHM6OlBPU1RfU1RBVFVTX0NNRCwKU2NyaXB0RXZlbnRzOjpQT1NUX1JPT1RfUEFDS0FHRV9JTlNUQUxMLApTY3JpcHRFdmVudHM6OlBPU1RfQ1JFQVRFX1BST0pFQ1RfQ01ELApTY3JpcHRFdmVudHM6OlBSRV9BUkNISVZFX0NNRCwKU2NyaXB0RXZlbnRzOjpQT1NUX0FSQ0hJVkVfQ01ELApTY3JpcHRFdmVudHM6OlBSRV9BVVRPTE9BRF9EVU1QLApTY3JpcHRFdmVudHM6OlBPU1RfQVVUT0xPQURfRFVNUCwKXTsKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgncnVuLXNjcmlwdCcpCi0+c2V0QWxpYXNlcyhbJ3J1biddKQotPnNldERlc2NyaXB0aW9uKCdSdW5zIHRoZSBzY3JpcHRzIGRlZmluZWQgaW4gY29tcG9zZXIuanNvbicpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dEFyZ3VtZW50KCdzY3JpcHQnLCBJbnB1dEFyZ3VtZW50OjpPUFRJT05BTCwgJ1NjcmlwdCBuYW1lIHRvIHJ1bi4nLCBudWxsLCBmdW5jdGlvbiAoKSB7CnJldHVybiBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkc2NyaXB0KSB7IHJldHVybiAkc2NyaXB0WyduYW1lJ107IH0sICR0aGlzLT5nZXRTY3JpcHRzKCkpOwp9KSwKbmV3IElucHV0QXJndW1lbnQoJ2FyZ3MnLCBJbnB1dEFyZ3VtZW50OjpJU19BUlJBWSB8IElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnJyksCm5ldyBJbnB1dE9wdGlvbigndGltZW91dCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1NldHMgc2NyaXB0IHRpbWVvdXQgaW4gc2Vjb25kcywgb3IgMCBmb3IgbmV2ZXIuJyksCm5ldyBJbnB1dE9wdGlvbignZGV2JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTZXRzIHRoZSBkZXYgbW9kZS4nKSwKbmV3IElucHV0T3B0aW9uKCduby1kZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc2FibGVzIHRoZSBkZXYgbW9kZS4nKSwKbmV3IElucHV0T3B0aW9uKCdsaXN0JywgJ2wnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0xpc3Qgc2NyaXB0cy4nKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIDxpbmZvPnJ1bi1zY3JpcHQ8L2luZm8+IGNvbW1hbmQgcnVucyBzY3JpcHRzIGRlZmluZWQgaW4gY29tcG9zZXIuanNvbjoKCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIHJ1bi1zY3JpcHQgcG9zdC11cGRhdGUtY21kPC9pbmZvPgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjcnVuLXNjcmlwdC1ydW4KRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW50ZXJhY3QoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IHZvaWQKewokc2NyaXB0cyA9ICR0aGlzLT5nZXRTY3JpcHRzKCk7CmlmIChjb3VudCgkc2NyaXB0cykgPT09IDApIHsKcmV0dXJuOwp9CgppZiAoJGlucHV0LT5nZXRBcmd1bWVudCgnc2NyaXB0JykgIT09IG51bGwgfHwgJGlucHV0LT5nZXRPcHRpb24oJ2xpc3QnKSkgewpyZXR1cm47Cn0KCiRvcHRpb25zID0gW107CmZvcmVhY2ggKCRzY3JpcHRzIGFzICRzY3JpcHQpIHsKJG9wdGlvbnNbJHNjcmlwdFsnbmFtZSddXSA9ICRzY3JpcHRbJ2Rlc2NyaXB0aW9uJ107Cn0KJGlvID0gJHRoaXMtPmdldElPKCk7CiRzY3JpcHQgPSAkaW8tPnNlbGVjdCgKJ1NjcmlwdCB0byBydW46ICcsCiRvcHRpb25zLAonJywKMSwKJ0ludmFsaWQgc2NyaXB0IG5hbWUgIiVzIicKKTsKCiRpbnB1dC0+c2V0QXJndW1lbnQoJ3NjcmlwdCcsICRzY3JpcHQpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdsaXN0JykpIHsKcmV0dXJuICR0aGlzLT5saXN0U2NyaXB0cygkb3V0cHV0KTsKfQoKJHNjcmlwdCA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3NjcmlwdCcpOwppZiAoJHNjcmlwdCA9PT0gbnVsbCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnQgInNjcmlwdCInKTsKfQoKaWYgKCFpbl9hcnJheSgkc2NyaXB0LCAkdGhpcy0+c2NyaXB0RXZlbnRzKSkgewppZiAoZGVmaW5lZCgnQ29tcG9zZXJcU2NyaXB0XFNjcmlwdEV2ZW50czo6Jy5zdHJfcmVwbGFjZSgnLScsICdfJywgc3RydG91cHBlcigkc2NyaXB0KSkpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1NjcmlwdCAiJXMiIGNhbm5vdCBiZSBydW4gd2l0aCB0aGlzIGNvbW1hbmQnLCAkc2NyaXB0KSk7Cn0KfQoKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwokZGV2TW9kZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdkZXYnKSB8fCAhJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpOwokZXZlbnQgPSBuZXcgU2NyaXB0RXZlbnQoJHNjcmlwdCwgJGNvbXBvc2VyLCAkdGhpcy0+Z2V0SU8oKSwgJGRldk1vZGUpOwokaGFzTGlzdGVuZXJzID0gJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+aGFzRXZlbnRMaXN0ZW5lcnMoJGV2ZW50KTsKaWYgKCEkaGFzTGlzdGVuZXJzKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1NjcmlwdCAiJXMiIGlzIG5vdCBkZWZpbmVkIGluIHRoaXMgcGFja2FnZScsICRzY3JpcHQpKTsKfQoKJGFyZ3MgPSAkaW5wdXQtPmdldEFyZ3VtZW50KCdhcmdzJyk7CgppZiAobnVsbCAhPT0gJHRpbWVvdXQgPSAkaW5wdXQtPmdldE9wdGlvbigndGltZW91dCcpKSB7CmlmICghY3R5cGVfZGlnaXQoJHRpbWVvdXQpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGltZW91dCB2YWx1ZSBtdXN0IGJlIG51bWVyaWMgYW5kIHBvc2l0aXZlIGlmIGRlZmluZWQsIG9yIDAgZm9yIGZvcmV2ZXInKTsKfQoKUHJvY2Vzc0V4ZWN1dG9yOjpzZXRUaW1lb3V0KChpbnQpICR0aW1lb3V0KTsKfQoKUGxhdGZvcm06OnB1dEVudignQ09NUE9TRVJfREVWX01PREUnLCAkZGV2TW9kZSA/ICcxJyA6ICcwJyk7CgpyZXR1cm4gJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2hTY3JpcHQoJHNjcmlwdCwgJGRldk1vZGUsICRhcmdzKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGxpc3RTY3JpcHRzKE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJHNjcmlwdHMgPSAkdGhpcy0+Z2V0U2NyaXB0cygpOwppZiAoY291bnQoJHNjcmlwdHMpID09PSAwKSB7CnJldHVybiAwOwp9CgokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5zY3JpcHRzOjwvaW5mbz4nKTsKJHRhYmxlID0gW107CmZvcmVhY2ggKCRzY3JpcHRzIGFzICRzY3JpcHQpIHsKJHRhYmxlW10gPSBbJyAgJy4kc2NyaXB0WyduYW1lJ10sICRzY3JpcHRbJ2Rlc2NyaXB0aW9uJ11dOwp9CgokdGhpcy0+cmVuZGVyVGFibGUoJHRhYmxlLCAkb3V0cHV0KTsKCnJldHVybiAwOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFNjcmlwdHMoKTogYXJyYXkKewokc2NyaXB0cyA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKS0+Z2V0UGFja2FnZSgpLT5nZXRTY3JpcHRzKCk7CmlmIChjb3VudCgkc2NyaXB0cykgPT09IDApIHsKcmV0dXJuIFtdOwp9CgokcmVzdWx0ID0gW107CmZvcmVhY2ggKCRzY3JpcHRzIGFzICRuYW1lID0+ICRzY3JpcHQpIHsKJGRlc2NyaXB0aW9uID0gJyc7CnRyeSB7CiRjbWQgPSAkdGhpcy0+Z2V0QXBwbGljYXRpb24oKS0+ZmluZCgkbmFtZSk7CiRkZXNjcmlwdGlvbiA9ICRjbWQtPmdldERlc2NyaXB0aW9uKCk7Cn0gY2F0Y2ggKFxTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxDb21tYW5kTm90Rm91bmRFeGNlcHRpb24gJGUpIHsKCn0KJHJlc3VsdFtdID0gWyduYW1lJyA9PiAkbmFtZSwgJ2Rlc2NyaXB0aW9uJyA9PiAkZGVzY3JpcHRpb25dOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCmNsYXNzIFNjcmlwdEFsaWFzQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKCnByaXZhdGUgJHNjcmlwdDsKCnByaXZhdGUgJGRlc2NyaXB0aW9uOwoKcHJpdmF0ZSAkYWxpYXNlczsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHNjcmlwdCwgP3N0cmluZyAkZGVzY3JpcHRpb24sIGFycmF5ICRhbGlhc2VzID0gW10pCnsKJHRoaXMtPnNjcmlwdCA9ICRzY3JpcHQ7CiR0aGlzLT5kZXNjcmlwdGlvbiA9ICRkZXNjcmlwdGlvbiA/PyAnUnVucyB0aGUgJy4kc2NyaXB0Licgc2NyaXB0IGFzIGRlZmluZWQgaW4gY29tcG9zZXIuanNvbic7CiR0aGlzLT5hbGlhc2VzID0gJGFsaWFzZXM7Cgpmb3JlYWNoICgkdGhpcy0+YWxpYXNlcyBhcyAkYWxpYXMpIHsKaWYgKCFpc19zdHJpbmcoJGFsaWFzKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignInNjcmlwdHMtYWxpYXNlcyIgZWxlbWVudCBhcnJheSB2YWx1ZXMgc2hvdWxkIGNvbnRhaW4gb25seSBzdHJpbmdzJyk7Cn0KfQoKJHRoaXMtPmlnbm9yZVZhbGlkYXRpb25FcnJvcnMoKTsKCnBhcmVudDo6X19jb25zdHJ1Y3QoKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCR0aGlzLT5zY3JpcHQpCi0+c2V0RGVzY3JpcHRpb24oJHRoaXMtPmRlc2NyaXB0aW9uKQotPnNldEFsaWFzZXMoJHRoaXMtPmFsaWFzZXMpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dE9wdGlvbignZGV2JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTZXRzIHRoZSBkZXYgbW9kZS4nKSwKbmV3IElucHV0T3B0aW9uKCduby1kZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc2FibGVzIHRoZSBkZXYgbW9kZS4nKSwKbmV3IElucHV0QXJndW1lbnQoJ2FyZ3MnLCBJbnB1dEFyZ3VtZW50OjpJU19BUlJBWSB8IElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSA8aW5mbz5ydW4tc2NyaXB0PC9pbmZvPiBjb21tYW5kIHJ1bnMgc2NyaXB0cyBkZWZpbmVkIGluIGNvbXBvc2VyLmpzb246Cgo8aW5mbz5waHAgY29tcG9zZXIucGhhciBydW4tc2NyaXB0IHBvc3QtdXBkYXRlLWNtZDwvaW5mbz4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI3J1bi1zY3JpcHQtcnVuCkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKCiRhcmdzID0gJGlucHV0LT5nZXRBcmd1bWVudHMoKTsKCgppZiAoIW1ldGhvZF9leGlzdHMoJGlucHV0LCAnX190b1N0cmluZycpKSB7IAp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdFeHBlY3RlZCBhbiBJbnB1dCBpbnN0YW5jZSB0aGF0IGlzIHN0cmluZ2FibGUsIGdvdCAnLmdldF9jbGFzcygkaW5wdXQpKTsKfQoKJGRldk1vZGUgPSAkaW5wdXQtPmdldE9wdGlvbignZGV2JykgfHwgISRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKTsKClBsYXRmb3JtOjpwdXRFbnYoJ0NPTVBPU0VSX0RFVl9NT0RFJywgJGRldk1vZGUgPyAnMScgOiAnMCcpOwoKcmV0dXJuICRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmRpc3BhdGNoU2NyaXB0KCR0aGlzLT5zY3JpcHQsICRkZXZNb2RlLCAkYXJnc1snYXJncyddLCBbJ3NjcmlwdC1hbGlhcy1pbnB1dCcgPT4gUHJlZzo6cmVwbGFjZSgne15cUysgP30nLCAnJywgJGlucHV0LT5fX3RvU3RyaW5nKCksIDEpXSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XENvbXBvc2l0ZVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBsdWdpblxDb21tYW5kRXZlbnQ7CnVzZSBDb21wb3NlclxQbHVnaW5cUGx1Z2luRXZlbnRzOwoKCgoKY2xhc3MgU2VhcmNoQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdzZWFyY2gnKQotPnNldERlc2NyaXB0aW9uKCdTZWFyY2hlcyBmb3IgcGFja2FnZXMnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRPcHRpb24oJ29ubHktbmFtZScsICdOJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTZWFyY2ggb25seSBpbiBwYWNrYWdlIG5hbWVzJyksCm5ldyBJbnB1dE9wdGlvbignb25seS12ZW5kb3InLCAnTycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2VhcmNoIG9ubHkgZm9yIHZlbmRvciAvIG9yZ2FuaXphdGlvbiBuYW1lcywgcmV0dXJucyBvbmx5ICJ2ZW5kb3IiIGFzIHJlc3VsdCcpLApuZXcgSW5wdXRPcHRpb24oJ3R5cGUnLCAndCcsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1NlYXJjaCBmb3IgYSBzcGVjaWZpYyBwYWNrYWdlIHR5cGUnKSwKbmV3IElucHV0T3B0aW9uKCdmb3JtYXQnLCAnZicsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0Zvcm1hdCBvZiB0aGUgb3V0cHV0OiB0ZXh0IG9yIGpzb24nLCAndGV4dCcsIFsnanNvbicsICd0ZXh0J10pLApuZXcgSW5wdXRBcmd1bWVudCgndG9rZW5zJywgSW5wdXRBcmd1bWVudDo6SVNfQVJSQVkgfCBJbnB1dEFyZ3VtZW50OjpSRVFVSVJFRCwgJ3Rva2VucyB0byBzZWFyY2ggZm9yJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSBzZWFyY2ggY29tbWFuZCBzZWFyY2hlcyBmb3IgcGFja2FnZXMgYnkgaXRzIG5hbWUKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgc2VhcmNoIHN5bWZvbnkgY29tcG9zZXI8L2luZm8+CgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNzZWFyY2gKRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKCiRwbGF0Zm9ybVJlcG8gPSBuZXcgUGxhdGZvcm1SZXBvc2l0b3J5OwokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCiRmb3JtYXQgPSAkaW5wdXQtPmdldE9wdGlvbignZm9ybWF0Jyk7CmlmICghaW5fYXJyYXkoJGZvcm1hdCwgWyd0ZXh0JywgJ2pzb24nXSkpIHsKJGlvLT53cml0ZUVycm9yKHNwcmludGYoJ1Vuc3VwcG9ydGVkIGZvcm1hdCAiJXMiLiBTZWUgaGVscCBmb3Igc3VwcG9ydGVkIGZvcm1hdHMuJywgJGZvcm1hdCkpOwoKcmV0dXJuIDE7Cn0KCmlmICghKCRjb21wb3NlciA9ICR0aGlzLT50cnlDb21wb3NlcigpKSkgewokY29tcG9zZXIgPSAkdGhpcy0+Y3JlYXRlQ29tcG9zZXJJbnN0YW5jZSgkaW5wdXQsICR0aGlzLT5nZXRJTygpLCBbXSk7Cn0KJGxvY2FsUmVwbyA9ICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7CiRpbnN0YWxsZWRSZXBvID0gbmV3IENvbXBvc2l0ZVJlcG9zaXRvcnkoWyRsb2NhbFJlcG8sICRwbGF0Zm9ybVJlcG9dKTsKJHJlcG9zID0gbmV3IENvbXBvc2l0ZVJlcG9zaXRvcnkoYXJyYXlfbWVyZ2UoWyRpbnN0YWxsZWRSZXBvXSwgJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRSZXBvc2l0b3JpZXMoKSkpOwoKJGNvbW1hbmRFdmVudCA9IG5ldyBDb21tYW5kRXZlbnQoUGx1Z2luRXZlbnRzOjpDT01NQU5ELCAnc2VhcmNoJywgJGlucHV0LCAkb3V0cHV0KTsKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2goJGNvbW1hbmRFdmVudC0+Z2V0TmFtZSgpLCAkY29tbWFuZEV2ZW50KTsKCiRtb2RlID0gUmVwb3NpdG9yeUludGVyZmFjZTo6U0VBUkNIX0ZVTExURVhUOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ29ubHktbmFtZScpID09PSB0cnVlKSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbignb25seS12ZW5kb3InKSA9PT0gdHJ1ZSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignLS1vbmx5LW5hbWUgYW5kIC0tb25seS12ZW5kb3IgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXInKTsKfQokbW9kZSA9IFJlcG9zaXRvcnlJbnRlcmZhY2U6OlNFQVJDSF9OQU1FOwp9IGVsc2VpZiAoJGlucHV0LT5nZXRPcHRpb24oJ29ubHktdmVuZG9yJykgPT09IHRydWUpIHsKJG1vZGUgPSBSZXBvc2l0b3J5SW50ZXJmYWNlOjpTRUFSQ0hfVkVORE9SOwp9CgokdHlwZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCd0eXBlJyk7CgokcXVlcnkgPSBpbXBsb2RlKCcgJywgJGlucHV0LT5nZXRBcmd1bWVudCgndG9rZW5zJykpOwppZiAoJG1vZGUgIT09IFJlcG9zaXRvcnlJbnRlcmZhY2U6OlNFQVJDSF9GVUxMVEVYVCkgewokcXVlcnkgPSBwcmVnX3F1b3RlKCRxdWVyeSk7Cn0KCiRyZXN1bHRzID0gJHJlcG9zLT5zZWFyY2goJHF1ZXJ5LCAkbW9kZSwgJHR5cGUpOwoKaWYgKFxjb3VudCgkcmVzdWx0cykgPiAwICYmICRmb3JtYXQgPT09ICd0ZXh0Jykgewokd2lkdGggPSAkdGhpcy0+Z2V0VGVybWluYWxXaWR0aCgpOwoKJG5hbWVMZW5ndGggPSAwOwpmb3JlYWNoICgkcmVzdWx0cyBhcyAkcmVzdWx0KSB7CiRuYW1lTGVuZ3RoID0gbWF4KHN0cmxlbigkcmVzdWx0WyduYW1lJ10pLCAkbmFtZUxlbmd0aCk7Cn0KJG5hbWVMZW5ndGggKz0gMTsKZm9yZWFjaCAoJHJlc3VsdHMgYXMgJHJlc3VsdCkgewokZGVzY3JpcHRpb24gPSAkcmVzdWx0WydkZXNjcmlwdGlvbiddID8/ICcnOwokd2FybmluZyA9ICFlbXB0eSgkcmVzdWx0WydhYmFuZG9uZWQnXSkgPyAnPHdhcm5pbmc+ISBBYmFuZG9uZWQgITwvd2FybmluZz4gJyA6ICcnOwokcmVtYWluaW5nID0gJHdpZHRoIC0gJG5hbWVMZW5ndGggLSBzdHJsZW4oJHdhcm5pbmcpIC0gMjsKaWYgKHN0cmxlbigkZGVzY3JpcHRpb24pID4gJHJlbWFpbmluZykgewokZGVzY3JpcHRpb24gPSBzdWJzdHIoJGRlc2NyaXB0aW9uLCAwLCAkcmVtYWluaW5nIC0gMykgLiAnLi4uJzsKfQoKJGxpbmsgPSAkcmVzdWx0Wyd1cmwnXSA/PyBudWxsOwppZiAoJGxpbmsgIT09IG51bGwpIHsKJGlvLT53cml0ZSgnPGhyZWY9Jy5PdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkbGluaykuJz4nLiRyZXN1bHRbJ25hbWUnXS4nPC8+Jy4gc3RyX3JlcGVhdCgnICcsICRuYW1lTGVuZ3RoIC0gc3RybGVuKCRyZXN1bHRbJ25hbWUnXSkpIC4gJHdhcm5pbmcgLiAkZGVzY3JpcHRpb24pOwp9IGVsc2UgewokaW8tPndyaXRlKHN0cl9wYWQoJHJlc3VsdFsnbmFtZSddLCAkbmFtZUxlbmd0aCwgJyAnKSAuICR3YXJuaW5nIC4gJGRlc2NyaXB0aW9uKTsKfQp9Cn0gZWxzZWlmICgkZm9ybWF0ID09PSAnanNvbicpIHsKJGlvLT53cml0ZShKc29uRmlsZTo6ZW5jb2RlKCRyZXN1bHRzKSk7Cn0KCnJldHVybiAwOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxGYWN0b3J5Owp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFNlbGZVcGRhdGVcS2V5czsKdXNlIENvbXBvc2VyXFNlbGZVcGRhdGVcVmVyc2lvbnM7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcRmlsZXN5c3RlbUV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgUGhhcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEZpbmRlcjsKCgoKCgoKY2xhc3MgU2VsZlVwZGF0ZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnByaXZhdGUgY29uc3QgSE9NRVBBR0UgPSAnZ2V0Y29tcG9zZXIub3JnJzsKcHJpdmF0ZSBjb25zdCBPTERfSU5TVEFMTF9FWFQgPSAnLW9sZC5waGFyJzsKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgnc2VsZi11cGRhdGUnKQotPnNldEFsaWFzZXMoWydzZWxmdXBkYXRlJ10pCi0+c2V0RGVzY3JpcHRpb24oJ1VwZGF0ZXMgY29tcG9zZXIucGhhciB0byB0aGUgbGF0ZXN0IHZlcnNpb24nKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRPcHRpb24oJ3JvbGxiYWNrJywgJ3InLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1JldmVydCB0byBhbiBvbGRlciBpbnN0YWxsYXRpb24gb2YgY29tcG9zZXInKSwKbmV3IElucHV0T3B0aW9uKCdjbGVhbi1iYWNrdXBzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEZWxldGUgb2xkIGJhY2t1cHMgZHVyaW5nIGFuIHVwZGF0ZS4gVGhpcyBtYWtlcyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIGNvbXBvc2VyIHRoZSBvbmx5IGJhY2t1cCBhdmFpbGFibGUgYWZ0ZXIgdGhlIHVwZGF0ZScpLApuZXcgSW5wdXRBcmd1bWVudCgndmVyc2lvbicsIElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnVGhlIHZlcnNpb24gdG8gdXBkYXRlIHRvJyksCm5ldyBJbnB1dE9wdGlvbignbm8tcHJvZ3Jlc3MnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RvIG5vdCBvdXRwdXQgZG93bmxvYWQgcHJvZ3Jlc3MuJyksCm5ldyBJbnB1dE9wdGlvbigndXBkYXRlLWtleXMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Byb21wdCB1c2VyIGZvciBhIGtleSB1cGRhdGUnKSwKbmV3IElucHV0T3B0aW9uKCdzdGFibGUnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0ZvcmNlIGFuIHVwZGF0ZSB0byB0aGUgc3RhYmxlIGNoYW5uZWwnKSwKbmV3IElucHV0T3B0aW9uKCdwcmV2aWV3JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdGb3JjZSBhbiB1cGRhdGUgdG8gdGhlIHByZXZpZXcgY2hhbm5lbCcpLApuZXcgSW5wdXRPcHRpb24oJ3NuYXBzaG90JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdGb3JjZSBhbiB1cGRhdGUgdG8gdGhlIHNuYXBzaG90IGNoYW5uZWwnKSwKbmV3IElucHV0T3B0aW9uKCcxJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdGb3JjZSBhbiB1cGRhdGUgdG8gdGhlIHN0YWJsZSBjaGFubmVsLCBidXQgb25seSB1c2UgMS54IHZlcnNpb25zJyksCm5ldyBJbnB1dE9wdGlvbignMicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRm9yY2UgYW4gdXBkYXRlIHRvIHRoZSBzdGFibGUgY2hhbm5lbCwgYnV0IG9ubHkgdXNlIDIueCB2ZXJzaW9ucycpLApuZXcgSW5wdXRPcHRpb24oJzIuMicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRm9yY2UgYW4gdXBkYXRlIHRvIHRoZSBzdGFibGUgY2hhbm5lbCwgYnV0IG9ubHkgdXNlIDIuMi54IExUUyB2ZXJzaW9ucycpLApuZXcgSW5wdXRPcHRpb24oJ3NldC1jaGFubmVsLW9ubHknLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ09ubHkgc3RvcmUgdGhlIGNoYW5uZWwgYXMgdGhlIGRlZmF1bHQgb25lIGFuZCB0aGVuIGV4aXQnKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIDxpbmZvPnNlbGYtdXBkYXRlPC9pbmZvPiBjb21tYW5kIGNoZWNrcyBnZXRjb21wb3Nlci5vcmcgZm9yIG5ld2VyCnZlcnNpb25zIG9mIGNvbXBvc2VyIGFuZCBpZiBmb3VuZCwgaW5zdGFsbHMgdGhlIGxhdGVzdC4KCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIHNlbGYtdXBkYXRlPC9pbmZvPgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjc2VsZi11cGRhdGUtc2VsZnVwZGF0ZQpFT1QKKQo7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewppZiAoc3RycG9zKF9fRklMRV9fLCAncGhhcjonKSAhPT0gMCkgewppZiAoc3RyX2NvbnRhaW5zKHN0cnRyKF9fRElSX18sICdcXCcsICcvJyksICd2ZW5kb3IvY29tcG9zZXIvY29tcG9zZXInKSkgewokcHJvakRpciA9IGRpcm5hbWUoX19ESVJfXywgNik7CiRvdXRwdXQtPndyaXRlbG4oJzxlcnJvcj5UaGlzIGluc3RhbmNlIG9mIENvbXBvc2VyIGRvZXMgbm90IGhhdmUgdGhlIHNlbGYtdXBkYXRlIGNvbW1hbmQuPC9lcnJvcj4nKTsKJG91dHB1dC0+d3JpdGVsbignPGNvbW1lbnQ+WW91IGFyZSBydW5uaW5nIENvbXBvc2VyIGluc3RhbGxlZCBhcyBhIHBhY2thZ2UgaW4geW91ciBjdXJyZW50IHByb2plY3QgKCInLiRwcm9qRGlyLiciKS48L2NvbW1lbnQ+Jyk7CiRvdXRwdXQtPndyaXRlbG4oJzxjb21tZW50PlRvIHVwZGF0ZSBDb21wb3NlciwgZG93bmxvYWQgYSBjb21wb3Nlci5waGFyIGZyb20gaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcgYW5kIHRoZW4gcnVuIGBjb21wb3Nlci5waGFyIHVwZGF0ZSBjb21wb3Nlci9jb21wb3NlcmAgaW4geW91ciBwcm9qZWN0LjwvY29tbWVudD4nKTsKfSBlbHNlIHsKJG91dHB1dC0+d3JpdGVsbignPGVycm9yPlRoaXMgaW5zdGFuY2Ugb2YgQ29tcG9zZXIgZG9lcyBub3QgaGF2ZSB0aGUgc2VsZi11cGRhdGUgY29tbWFuZC48L2Vycm9yPicpOwokb3V0cHV0LT53cml0ZWxuKCc8Y29tbWVudD5UaGlzIGNvdWxkIGJlIGR1ZSB0byBhIG51bWJlciBvZiByZWFzb25zLCBzdWNoIGFzIENvbXBvc2VyIGJlaW5nIGluc3RhbGxlZCBhcyBhIHN5c3RlbSBwYWNrYWdlIG9uIHlvdXIgT1MsIG9yIENvbXBvc2VyIGJlaW5nIGluc3RhbGxlZCBhcyBhIHBhY2thZ2UgaW4gdGhlIGN1cnJlbnQgcHJvamVjdC48L2NvbW1lbnQ+Jyk7Cn0KCnJldHVybiAxOwp9CgppZiAoJF9TRVJWRVJbJ2FyZ3YnXVswXSA9PT0gJ1N0YW5kYXJkIGlucHV0IGNvZGUnKSB7CnJldHVybiAxOwp9CgoKCmNsYXNzX2V4aXN0cygnQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybScpOwpjbGFzc19leGlzdHMoJ0NvbXBvc2VyXERvd25sb2FkZXJcRmlsZXN5c3RlbUV4Y2VwdGlvbicpOwoKJGNvbmZpZyA9IEZhY3Rvcnk6OmNyZWF0ZUNvbmZpZygpOwoKaWYgKCRjb25maWctPmdldCgnZGlzYWJsZS10bHMnKSA9PT0gdHJ1ZSkgewokYmFzZVVybCA9ICdodHRwOi8vJyAuIHNlbGY6OkhPTUVQQUdFOwp9IGVsc2UgewokYmFzZVVybCA9ICdodHRwczovLycgLiBzZWxmOjpIT01FUEFHRTsKfQoKJGlvID0gJHRoaXMtPmdldElPKCk7CiRodHRwRG93bmxvYWRlciA9IEZhY3Rvcnk6OmNyZWF0ZUh0dHBEb3dubG9hZGVyKCRpbywgJGNvbmZpZyk7CgokdmVyc2lvbnNVdGlsID0gbmV3IFZlcnNpb25zKCRjb25maWcsICRodHRwRG93bmxvYWRlcik7CgoKJHJlcXVlc3RlZENoYW5uZWwgPSBudWxsOwpmb3JlYWNoIChWZXJzaW9uczo6Q0hBTk5FTFMgYXMgJGNoYW5uZWwpIHsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCRjaGFubmVsKSkgewokcmVxdWVzdGVkQ2hhbm5lbCA9ICRjaGFubmVsOwokdmVyc2lvbnNVdGlsLT5zZXRDaGFubmVsKCRjaGFubmVsLCAkaW8pOwpicmVhazsKfQp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3NldC1jaGFubmVsLW9ubHknKSkgewpyZXR1cm4gMDsKfQoKJGNhY2hlRGlyID0gJGNvbmZpZy0+Z2V0KCdjYWNoZS1kaXInKTsKJHJvbGxiYWNrRGlyID0gJGNvbmZpZy0+Z2V0KCdkYXRhLWRpcicpOwokaG9tZSA9ICRjb25maWctPmdldCgnaG9tZScpOwokbG9jYWxGaWxlbmFtZSA9IFBoYXI6OnJ1bm5pbmcoZmFsc2UpOwppZiAoJycgPT09ICRsb2NhbEZpbGVuYW1lKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IGRldGVybWluZSB0aGUgbG9jYXRpb24gb2YgdGhlIGNvbXBvc2VyLnBoYXIgZmlsZSBhcyBpdCBhcHBlYXJzIHlvdSBhcmUgbm90IHJ1bm5pbmcgdGhpcyBjb2RlIGZyb20gYSBwaGFyIGFyY2hpdmUuJyk7Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbigndXBkYXRlLWtleXMnKSkgewokdGhpcy0+ZmV0Y2hLZXlzKCRpbywgJGNvbmZpZyk7CgpyZXR1cm4gMDsKfQoKCmlmICghZmlsZV9leGlzdHMoJGxvY2FsRmlsZW5hbWUpKSB7CnRocm93IG5ldyBGaWxlc3lzdGVtRXhjZXB0aW9uKCdDb21wb3NlciB1cGRhdGUgZmFpbGVkOiB0aGUgIicuJGxvY2FsRmlsZW5hbWUuJyIgaXMgbm90IGFjY2Vzc2libGUnKTsKfQoKCiR0bXBEaXIgPSBpc193cml0YWJsZShkaXJuYW1lKCRsb2NhbEZpbGVuYW1lKSkgPyBkaXJuYW1lKCRsb2NhbEZpbGVuYW1lKSA6ICRjYWNoZURpcjsKCgppZiAoIWlzX3dyaXRhYmxlKCR0bXBEaXIpKSB7CnRocm93IG5ldyBGaWxlc3lzdGVtRXhjZXB0aW9uKCdDb21wb3NlciB1cGRhdGUgZmFpbGVkOiB0aGUgIicuJHRtcERpci4nIiBkaXJlY3RvcnkgdXNlZCB0byBkb3dubG9hZCB0aGUgdGVtcCBmaWxlIGNvdWxkIG5vdCBiZSB3cml0dGVuJyk7Cn0KCgppZiAoZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRwd3VpZCcpICYmIGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0ZXVpZCcpKSB7CiRjb21wb3NlclVzZXIgPSBwb3NpeF9nZXRwd3VpZChwb3NpeF9nZXRldWlkKCkpOwokaG9tZURpck93bmVySWQgPSBmaWxlb3duZXIoJGhvbWUpOwppZiAoaXNfYXJyYXkoJGNvbXBvc2VyVXNlcikgJiYgJGhvbWVEaXJPd25lcklkICE9PSBmYWxzZSkgewokaG9tZU93bmVyID0gcG9zaXhfZ2V0cHd1aWQoJGhvbWVEaXJPd25lcklkKTsKaWYgKGlzX2FycmF5KCRob21lT3duZXIpICYmICRjb21wb3NlclVzZXJbJ25hbWUnXSAhPT0gJGhvbWVPd25lclsnbmFtZSddKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+WW91IGFyZSBydW5uaW5nIENvbXBvc2VyIGFzICInLiRjb21wb3NlclVzZXJbJ25hbWUnXS4nIiwgd2hpbGUgIicuJGhvbWUuJyIgaXMgb3duZWQgYnkgIicuJGhvbWVPd25lclsnbmFtZSddLiciPC93YXJuaW5nPicpOwp9Cn0KfQoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdyb2xsYmFjaycpKSB7CnJldHVybiAkdGhpcy0+cm9sbGJhY2soJG91dHB1dCwgJHJvbGxiYWNrRGlyLCAkbG9jYWxGaWxlbmFtZSk7Cn0KCmlmICgkaW5wdXQtPmdldEFyZ3VtZW50KCdjb21tYW5kJykgPT09ICdzZWxmJyAmJiAkaW5wdXQtPmdldEFyZ3VtZW50KCd2ZXJzaW9uJykgPT09ICd1cGRhdGUnKSB7CiRpbnB1dC0+c2V0QXJndW1lbnQoJ3ZlcnNpb24nLCBudWxsKTsKfQoKJGxhdGVzdCA9ICR2ZXJzaW9uc1V0aWwtPmdldExhdGVzdCgpOwokbGF0ZXN0U3RhYmxlID0gJHZlcnNpb25zVXRpbC0+Z2V0TGF0ZXN0KCdzdGFibGUnKTsKdHJ5IHsKJGxhdGVzdFByZXZpZXcgPSAkdmVyc2lvbnNVdGlsLT5nZXRMYXRlc3QoJ3ByZXZpZXcnKTsKfSBjYXRjaCAoXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbiAkZSkgewokbGF0ZXN0UHJldmlldyA9ICRsYXRlc3RTdGFibGU7Cn0KJGxhdGVzdFZlcnNpb24gPSAkbGF0ZXN0Wyd2ZXJzaW9uJ107CiR1cGRhdGVWZXJzaW9uID0gJGlucHV0LT5nZXRBcmd1bWVudCgndmVyc2lvbicpID8/ICRsYXRlc3RWZXJzaW9uOwokY3VycmVudE1ham9yVmVyc2lvbiA9IFByZWc6OnJlcGxhY2UoJ3teKFxkKykuKn0nLCAnJDEnLCBDb21wb3Nlcjo6Z2V0VmVyc2lvbigpKTsKJHVwZGF0ZU1ham9yVmVyc2lvbiA9IFByZWc6OnJlcGxhY2UoJ3teKFxkKykuKn0nLCAnJDEnLCAkdXBkYXRlVmVyc2lvbik7CiRwcmV2aWV3TWFqb3JWZXJzaW9uID0gUHJlZzo6cmVwbGFjZSgne14oXGQrKS4qfScsICckMScsICRsYXRlc3RQcmV2aWV3Wyd2ZXJzaW9uJ10pOwoKaWYgKCR2ZXJzaW9uc1V0aWwtPmdldENoYW5uZWwoKSA9PT0gJ3N0YWJsZScgJiYgbnVsbCA9PT0gJGlucHV0LT5nZXRBcmd1bWVudCgndmVyc2lvbicpKSB7CgoKaWYgKCRjdXJyZW50TWFqb3JWZXJzaW9uIDwgJHVwZGF0ZU1ham9yVmVyc2lvbikgewokc2tpcHBlZFZlcnNpb24gPSAkdXBkYXRlVmVyc2lvbjsKCiR2ZXJzaW9uc1V0aWwtPnNldENoYW5uZWwoJGN1cnJlbnRNYWpvclZlcnNpb24pOwoKJGxhdGVzdCA9ICR2ZXJzaW9uc1V0aWwtPmdldExhdGVzdCgpOwokbGF0ZXN0U3RhYmxlID0gJHZlcnNpb25zVXRpbC0+Z2V0TGF0ZXN0KCdzdGFibGUnKTsKJGxhdGVzdFZlcnNpb24gPSAkbGF0ZXN0Wyd2ZXJzaW9uJ107CiR1cGRhdGVWZXJzaW9uID0gJGxhdGVzdFZlcnNpb247CgokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkEgbmV3IHN0YWJsZSBtYWpvciB2ZXJzaW9uIG9mIENvbXBvc2VyIGlzIGF2YWlsYWJsZSAoJy4kc2tpcHBlZFZlcnNpb24uJyksIHJ1biAiY29tcG9zZXIgc2VsZi11cGRhdGUgLS0nLiR1cGRhdGVNYWpvclZlcnNpb24uJyIgdG8gdXBkYXRlIHRvIGl0LiBTZWUgYWxzbyBodHRwczovL2dldGNvbXBvc2VyLm9yZy8nLiR1cGRhdGVNYWpvclZlcnNpb24uJzwvd2FybmluZz4nKTsKfSBlbHNlaWYgKCRjdXJyZW50TWFqb3JWZXJzaW9uIDwgJHByZXZpZXdNYWpvclZlcnNpb24pIHsKCiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+QSBwcmV2aWV3IHJlbGVhc2Ugb2YgdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBDb21wb3NlciBpcyBhdmFpbGFibGUgKCcuJGxhdGVzdFByZXZpZXdbJ3ZlcnNpb24nXS4nKSwgcnVuICJjb21wb3NlciBzZWxmLXVwZGF0ZSAtLXByZXZpZXciIHRvIGdpdmUgaXQgYSB0cnkuIFNlZSBhbHNvIGh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9jb21wb3Nlci9yZWxlYXNlcyBmb3IgY2hhbmdlbG9ncy48L3dhcm5pbmc+Jyk7Cn0KfQoKJGVmZmVjdGl2ZUNoYW5uZWwgPSAkcmVxdWVzdGVkQ2hhbm5lbCA9PT0gbnVsbCA/ICR2ZXJzaW9uc1V0aWwtPmdldENoYW5uZWwoKSA6ICRyZXF1ZXN0ZWRDaGFubmVsOwppZiAoaXNfbnVtZXJpYygkZWZmZWN0aXZlQ2hhbm5lbCkgJiYgc3RycG9zKCRsYXRlc3RTdGFibGVbJ3ZlcnNpb24nXSwgJGVmZmVjdGl2ZUNoYW5uZWwpICE9PSAwKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+V2FybmluZzogWW91IGZvcmNlZCB0aGUgaW5zdGFsbCBvZiAnLiRsYXRlc3RWZXJzaW9uLicgdmlhIC0tJy4kZWZmZWN0aXZlQ2hhbm5lbC4nLCBidXQgJy4kbGF0ZXN0U3RhYmxlWyd2ZXJzaW9uJ10uJyBpcyB0aGUgbGF0ZXN0IHN0YWJsZSB2ZXJzaW9uLiBVcGRhdGluZyB0byBpdCB2aWEgY29tcG9zZXIgc2VsZi11cGRhdGUgLS1zdGFibGUgaXMgcmVjb21tZW5kZWQuPC93YXJuaW5nPicpOwp9CmlmIChpc3NldCgkbGF0ZXN0Wydlb2wnXSkpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5XYXJuaW5nOiBWZXJzaW9uICcuJGxhdGVzdFZlcnNpb24uJyBpcyBFT0wgLyBFbmQgb2YgTGlmZS4gJy4kbGF0ZXN0U3RhYmxlWyd2ZXJzaW9uJ10uJyBpcyB0aGUgbGF0ZXN0IHN0YWJsZSB2ZXJzaW9uLiBVcGRhdGluZyB0byBpdCB2aWEgY29tcG9zZXIgc2VsZi11cGRhdGUgLS1zdGFibGUgaXMgcmVjb21tZW5kZWQuPC93YXJuaW5nPicpOwp9CgppZiAoUHJlZzo6aXNNYXRjaCgne15bMC05YS1mXXs0MH0kfScsICR1cGRhdGVWZXJzaW9uKSAmJiAkdXBkYXRlVmVyc2lvbiAhPT0gJGxhdGVzdFZlcnNpb24pIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+WW91IGNhbiBub3QgdXBkYXRlIHRvIGEgc3BlY2lmaWMgU0hBLTEgYXMgdGhvc2UgcGhhcnMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIGRvd25sb2FkPC9lcnJvcj4nKTsKCnJldHVybiAxOwp9CgokY2hhbm5lbFN0cmluZyA9ICR2ZXJzaW9uc1V0aWwtPmdldENoYW5uZWwoKTsKaWYgKGlzX251bWVyaWMoJGNoYW5uZWxTdHJpbmcpKSB7CiRjaGFubmVsU3RyaW5nIC49ICcueCc7Cn0KCmlmIChDb21wb3Nlcjo6VkVSU0lPTiA9PT0gJHVwZGF0ZVZlcnNpb24pIHsKJGlvLT53cml0ZUVycm9yKApzcHJpbnRmKAonPGluZm8+WW91IGFyZSBhbHJlYWR5IHVzaW5nIHRoZSBsYXRlc3QgYXZhaWxhYmxlIENvbXBvc2VyIHZlcnNpb24gJXMgKCVzIGNoYW5uZWwpLjwvaW5mbz4nLAokdXBkYXRlVmVyc2lvbiwKJGNoYW5uZWxTdHJpbmcKKQopOwoKCmlmICgkaW5wdXQtPmdldE9wdGlvbignY2xlYW4tYmFja3VwcycpKSB7CiR0aGlzLT5jbGVhbkJhY2t1cHMoJHJvbGxiYWNrRGlyLCAkdGhpcy0+Z2V0TGFzdEJhY2t1cFZlcnNpb24oJHJvbGxiYWNrRGlyKSk7Cn0KCnJldHVybiAwOwp9CgokdGVtcEZpbGVuYW1lID0gJHRtcERpciAuICcvJyAuIGJhc2VuYW1lKCRsb2NhbEZpbGVuYW1lLCAnLnBoYXInKS4nLXRlbXAnLnJhbmRvbV9pbnQoMCwgMTAwMDAwMDApLicucGhhcic7CiRiYWNrdXBGaWxlID0gc3ByaW50ZigKJyVzLyVzLSVzJXMnLAokcm9sbGJhY2tEaXIsCnN0cnRyKENvbXBvc2VyOjpSRUxFQVNFX0RBVEUsICcgOicsICdfLScpLApQcmVnOjpyZXBsYWNlKCd7XihbMC05YS1mXXs3fSlbMC05YS1mXXszM30kfScsICckMScsIENvbXBvc2VyOjpWRVJTSU9OKSwKc2VsZjo6T0xEX0lOU1RBTExfRVhUCik7CgokdXBkYXRpbmdUb1RhZyA9ICFQcmVnOjppc01hdGNoKCd7XlswLTlhLWZdezQwfSR9JywgJHVwZGF0ZVZlcnNpb24pOwoKJGlvLT53cml0ZShzcHJpbnRmKCJVcGdyYWRpbmcgdG8gdmVyc2lvbiA8aW5mbz4lczwvaW5mbz4gKCVzIGNoYW5uZWwpLiIsICR1cGRhdGVWZXJzaW9uLCAkY2hhbm5lbFN0cmluZykpOwokcmVtb3RlRmlsZW5hbWUgPSAkYmFzZVVybCAuICgkdXBkYXRpbmdUb1RhZyA/ICIvZG93bmxvYWQveyR1cGRhdGVWZXJzaW9ufS9jb21wb3Nlci5waGFyIiA6ICcvY29tcG9zZXIucGhhcicpOwp0cnkgewokc2lnbmF0dXJlID0gJGh0dHBEb3dubG9hZGVyLT5nZXQoJHJlbW90ZUZpbGVuYW1lLicuc2lnJyktPmdldEJvZHkoKTsKfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CmlmICgkZS0+Z2V0U3RhdHVzQ29kZSgpID09PSA0MDQpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1ZlcnNpb24gIicuJHVwZGF0ZVZlcnNpb24uJyIgY291bGQgbm90IGJlIGZvdW5kLicsIDAsICRlKTsKfQp0aHJvdyAkZTsKfQokaW8tPndyaXRlRXJyb3IoJyAgICcsIGZhbHNlKTsKJGh0dHBEb3dubG9hZGVyLT5jb3B5KCRyZW1vdGVGaWxlbmFtZSwgJHRlbXBGaWxlbmFtZSk7CiRpby0+d3JpdGVFcnJvcignJyk7CgppZiAoIWZpbGVfZXhpc3RzKCR0ZW1wRmlsZW5hbWUpIHx8IG51bGwgPT09ICRzaWduYXR1cmUgfHwgJycgPT09ICRzaWduYXR1cmUpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+VGhlIGRvd25sb2FkIG9mIHRoZSBuZXcgY29tcG9zZXIgdmVyc2lvbiBmYWlsZWQgZm9yIGFuIHVuZXhwZWN0ZWQgcmVhc29uPC9lcnJvcj4nKTsKCnJldHVybiAxOwp9CgoKaWYgKCFleHRlbnNpb25fbG9hZGVkKCdvcGVuc3NsJykgJiYgJGNvbmZpZy0+Z2V0KCdkaXNhYmxlLXRscycpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+U2tpcHBpbmcgcGhhciBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGFzIHlvdSBoYXZlIGRpc2FibGVkIE9wZW5TU0wgdmlhIGNvbmZpZy5kaXNhYmxlLXRsczwvd2FybmluZz4nKTsKfSBlbHNlIHsKaWYgKCFleHRlbnNpb25fbG9hZGVkKCdvcGVuc3NsJykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgb3BlbnNzbCBleHRlbnNpb24gaXMgcmVxdWlyZWQgZm9yIHBoYXIgc2lnbmF0dXJlcyB0byBiZSB2ZXJpZmllZCBidXQgaXQgaXMgbm90IGF2YWlsYWJsZS4gJwouICdJZiB5b3UgY2FuIG5vdCBlbmFibGUgdGhlIG9wZW5zc2wgZXh0ZW5zaW9uLCB5b3UgY2FuIGRpc2FibGUgdGhpcyBlcnJvciwgYXQgeW91ciBvd24gcmlzaywgYnkgc2V0dGluZyB0aGUgXCdkaXNhYmxlLXRsc1wnIG9wdGlvbiB0byB0cnVlLicpOwp9Cgokc2lnRmlsZSA9ICdmaWxlOi8vJy4kaG9tZS4nLycgLiAoJHVwZGF0aW5nVG9UYWcgPyAna2V5cy50YWdzLnB1YicgOiAna2V5cy5kZXYucHViJyk7CmlmICghZmlsZV9leGlzdHMoJHNpZ0ZpbGUpKSB7CmZpbGVfcHV0X2NvbnRlbnRzKAokaG9tZS4nL2tleXMuZGV2LnB1YicsCjw8PERFVlBVQktFWQotLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLQpNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQW5CREhqWlM2ZTBaTW9LM3hURDdmCkZOQ3psWGpYL0FpZTJkaXQ4UVhBMDNwU3JPVGJhTW54T04zaFVMNDdMejNnMVNDNllKRU1WSHIwellxNGVsV2kKaTNlY0ZFZ3pMY2orcFpNNVg2cVd1Mk96ejR2V3gzSllvMS9hL0hZZE91VzllM2x3UzhWdFMwQVZKQStVOFgwQQpoWm5CbUdwbHRIaE84aFBLSGdrSnRrVFV4Q2hlVGNicW40d0dIbDhaMlNlZGlEY1BUTHdxZXpXS1Vmcll6dTFmCm8vajNXRndGczZHdEs0d2RZdGlYcit5c3BCWkhPM3kxdWRmOGVGRkdjYjJWM0VhTE9ydGZ1cjZYUVZpempPdWsKOGx3NXp6c2UxUXAva2xIcWJEUnNqU3pKNmlMNkY0YXluQmM2RXVxdC84Y2NOQUl6MHJMakxoT3JhZXlqNGVObgo4aW9rd01LaVhwY3JRTFRLSCtSSDFKQ3VPVnhRNDM2Ykp3YlNzcDFWd2lxZnRQUWllTit0enF5K0VpSEpKbUdmClRCQWJXY25jaWNDazlxMm1kK0FtaE5idkhPNFBXYmJ6OVR6QzdISmI0NjBqeVdldU1FdnczZ05JcEVvMmpZYTkKcE1WNmNWcW5TYSt3T2MwRDdwQzlhNmJuZTBidkxjbTNTK3c2STVpREIzbFpzYjNBOVV0UmlTUDdhR1NvN0Q3Mgo4dEM4K2NJZ1pjSTdrOXZqdk9xSCtkN3NkT1UyeVBDblJZNndGaDYyL2c4YkRuVXByNTZuWk4xRzg5R3dNNGQ0CnIvVFU3QlFRSXpzWmdBaXFPR1h2VmtsSWdBTWlWMGl1Y2dmM3JOQkxqamVORXdOU1RURzlGMEN0USs3Skx3YUUKd1NFdUF1Um0rcFJxaThCUm5RL0dLVWNDQXdFQUFRPT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCkRFVlBVQktFWQopOwoKZmlsZV9wdXRfY29udGVudHMoCiRob21lLicva2V5cy50YWdzLnB1YicsCjw8PFRBR1NQVUJLRVkKLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUEwVmkvMks2YXBDVmo3Nm5DbkNsMgpNUVVQZEsrQTllcWtZQmFjWG8yd1FCWW15VmxYbTIvbi9ac1g2cENMWVBRVEh5cjVqWGJrUXpCdzhTS3FQZGxoCnZBN05wYk1lTkN6N3dQL0FvYnZVWE04eFF1WEtiTURUWTJ1WjRPN3NNK1BmR2JwdEtQQkdMZThaOGQyc1VuVE8KYlh0WDZMcmoxM3drUnRvN3N0L3cvWXAzM1JIZTlTbHFraWlTNE1zSDFqQmtjSWtFSHNSYXZlWnplZFVheFkwTQptYmEwdVBoR1VJbnBQekVId3JZcUJCRXRXdlA5N3QydnRmeDhJNXF2MjhraDBZNnQram5qTDFVcmlkMml1UVpmCm5vQ01GSU91NHZrc0s1SHhKeHhyTjBHT21HbXdWUWpPT3R4a3dpa05pb3RaR1BSNEtzVmo4Tm5CckxYN29HdU0KblF2R2NpaXUrS29DMnIzSERCcnBEZUJWZE9XeER6VDVSNGlJMEtvTHpGaDJwS3F3Ylkrb2JOUFMyYmorMmRnSgpyVjNWNUpqcnk0MlFPQ0JOM2M4OHdVMVBLZnRPTGoyRUNwZXdZNnZuRTQ3OElpcGlFdTdFQWRLOFp3ajJMbVRyClJLUVVTYTlrN2dnQmtZWldBZU8vMkFnMGV5M2cyYmc3ZXFrK3NIRXE1eW5JWGQ1bGh2NnRDNVBCZEhsV2lwREsKdGwySXhpRW5lam5PbUF6R1ZpdkUxWUdkdVlCak4rbWp4RFZ5OEtHQnJqbnoxSlBnQXZnZHdKMmRZdzRSc2MvZQpUekNGV0drL0hNNmE0ZjBJekJXYko1b3QwUElpNGFtazA3SW90QlhEV3dxRGlRVHd5dUdDeW01RXFXUTJCRDk1ClJHdjg5QlBEKzJETG5KeXNuZ3N2VmFVQ0F3RUFBUT09Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQpUQUdTUFVCS0VZCik7Cn0KCiRwdWJrZXlpZCA9IG9wZW5zc2xfcGtleV9nZXRfcHVibGljKCRzaWdGaWxlKTsKaWYgKGZhbHNlID09PSAkcHVia2V5aWQpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgbG9hZGluZyB0aGUgcHVibGljIGtleSBmcm9tICcuJHNpZ0ZpbGUpOwp9CiRhbGdvID0gZGVmaW5lZCgnT1BFTlNTTF9BTEdPX1NIQTM4NCcpID8gT1BFTlNTTF9BTEdPX1NIQTM4NCA6ICdTSEEzODQnOwppZiAoIWluX2FycmF5KCdzaGEzODQnLCBhcnJheV9tYXAoJ3N0cnRvbG93ZXInLCBvcGVuc3NsX2dldF9tZF9tZXRob2RzKCkpLCB0cnVlKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1NIQTM4NCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHlvdXIgb3BlbnNzbCBleHRlbnNpb24sIGNvdWxkIG5vdCB2ZXJpZnkgdGhlIHBoYXIgZmlsZSBpbnRlZ3JpdHknKTsKfQokc2lnbmF0dXJlRGF0YSA9IGpzb25fZGVjb2RlKCRzaWduYXR1cmUsIHRydWUpOwokc2lnbmF0dXJlU2hhMzg0ID0gYmFzZTY0X2RlY29kZSgkc2lnbmF0dXJlRGF0YVsnc2hhMzg0J10sIHRydWUpOwppZiAoZmFsc2UgPT09ICRzaWduYXR1cmVTaGEzODQpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgbG9hZGluZyB0aGUgcGhhciBzaWduYXR1cmUgZnJvbSAnLiRyZW1vdGVGaWxlbmFtZS4nLnNpZywgZ290ICcuJHNpZ25hdHVyZSk7Cn0KJHZlcmlmaWVkID0gMSA9PT0gb3BlbnNzbF92ZXJpZnkoKHN0cmluZykgZmlsZV9nZXRfY29udGVudHMoJHRlbXBGaWxlbmFtZSksICRzaWduYXR1cmVTaGEzODQsICRwdWJrZXlpZCwgJGFsZ28pOwoKCmlmIChcUEhQX1ZFUlNJT05fSUQgPCA4MDAwMCkgewoKb3BlbnNzbF9mcmVlX2tleSgkcHVia2V5aWQpOwp9CgppZiAoISR2ZXJpZmllZCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSBwaGFyIHNpZ25hdHVyZSBkaWQgbm90IG1hdGNoIHRoZSBmaWxlIHlvdSBkb3dubG9hZGVkLCB0aGlzIG1lYW5zIHlvdXIgcHVibGljIGtleXMgYXJlIG91dGRhdGVkIG9yIHRoYXQgdGhlIHBoYXIgZmlsZSBpcyBjb3JydXB0L2hhcyBiZWVuIG1vZGlmaWVkJyk7Cn0KfQoKCmlmICgkaW5wdXQtPmdldE9wdGlvbignY2xlYW4tYmFja3VwcycpKSB7CiR0aGlzLT5jbGVhbkJhY2t1cHMoJHJvbGxiYWNrRGlyKTsKfQoKaWYgKCEkdGhpcy0+c2V0TG9jYWxQaGFyKCRsb2NhbEZpbGVuYW1lLCAkdGVtcEZpbGVuYW1lLCAkYmFja3VwRmlsZSkpIHsKQHVubGluaygkdGVtcEZpbGVuYW1lKTsKCnJldHVybiAxOwp9CgppZiAoZmlsZV9leGlzdHMoJGJhY2t1cEZpbGUpKSB7CiRpby0+d3JpdGVFcnJvcihzcHJpbnRmKAonVXNlIDxpbmZvPmNvbXBvc2VyIHNlbGYtdXBkYXRlIC0tcm9sbGJhY2s8L2luZm8+IHRvIHJldHVybiB0byB2ZXJzaW9uIDxjb21tZW50PiVzPC9jb21tZW50PicsCkNvbXBvc2VyOjpWRVJTSU9OCikpOwp9IGVsc2UgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkEgYmFja3VwIG9mIHRoZSBjdXJyZW50IHZlcnNpb24gY291bGQgbm90IGJlIHdyaXR0ZW4gdG8gJy4kYmFja3VwRmlsZS4nLCBubyByb2xsYmFjayBwb3NzaWJsZTwvd2FybmluZz4nKTsKfQoKcmV0dXJuIDA7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBmZXRjaEtleXMoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZyk6IHZvaWQKewppZiAoISRpby0+aXNJbnRlcmFjdGl2ZSgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignUHVibGljIGtleXMgY2FuIG5vdCBiZSBmZXRjaGVkIGluIG5vbi1pbnRlcmFjdGl2ZSBtb2RlLCBwbGVhc2UgcnVuIENvbXBvc2VyIGludGVyYWN0aXZlbHknKTsKfQoKJGlvLT53cml0ZSgnT3BlbiA8aW5mbz5odHRwczovL2NvbXBvc2VyLmdpdGh1Yi5pby9wdWJrZXlzLmh0bWw8L2luZm8+IHRvIGZpbmQgdGhlIGxhdGVzdCBrZXlzJyk7CgokdmFsaWRhdG9yID0gc3RhdGljIGZ1bmN0aW9uICgkdmFsdWUpOiBzdHJpbmcgewokdmFsdWUgPSAoc3RyaW5nKSAkdmFsdWU7CmlmICghUHJlZzo6aXNNYXRjaCgne14tLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLSR9JywgdHJpbSgkdmFsdWUpKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignSW52YWxpZCBpbnB1dCcpOwp9CgpyZXR1cm4gdHJpbSgkdmFsdWUpLiJcbiI7Cn07CgokZGV2S2V5ID0gJyc7CndoaWxlICghUHJlZzo6aXNNYXRjaCgneygtLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLS4rPy0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLSl9cycsICRkZXZLZXksICRtYXRjaCkpIHsKJGRldktleSA9ICRpby0+YXNrQW5kVmFsaWRhdGUoJ0VudGVyIERldiAvIFNuYXBzaG90IFB1YmxpYyBLZXkgKGluY2x1ZGluZyBsaW5lcyB3aXRoIC0tLS0tKTogJywgJHZhbGlkYXRvcik7CndoaWxlICgkbGluZSA9ICRpby0+YXNrKCcnLCAnJykpIHsKJGRldktleSAuPSB0cmltKCRsaW5lKS4iXG4iOwppZiAodHJpbSgkbGluZSkgPT09ICctLS0tLUVORCBQVUJMSUMgS0VZLS0tLS0nKSB7CmJyZWFrOwp9Cn0KfQpmaWxlX3B1dF9jb250ZW50cygka2V5UGF0aCA9ICRjb25maWctPmdldCgnaG9tZScpLicva2V5cy5kZXYucHViJywgJG1hdGNoWzBdKTsKJGlvLT53cml0ZSgnU3RvcmVkIGtleSB3aXRoIGZpbmdlcnByaW50OiAnIC4gS2V5czo6ZmluZ2VycHJpbnQoJGtleVBhdGgpKTsKCiR0YWdzS2V5ID0gJyc7CndoaWxlICghUHJlZzo6aXNNYXRjaCgneygtLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLS4rPy0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLSl9cycsICR0YWdzS2V5LCAkbWF0Y2gpKSB7CiR0YWdzS2V5ID0gJGlvLT5hc2tBbmRWYWxpZGF0ZSgnRW50ZXIgVGFncyBQdWJsaWMgS2V5IChpbmNsdWRpbmcgbGluZXMgd2l0aCAtLS0tLSk6ICcsICR2YWxpZGF0b3IpOwp3aGlsZSAoJGxpbmUgPSAkaW8tPmFzaygnJywgJycpKSB7CiR0YWdzS2V5IC49IHRyaW0oJGxpbmUpLiJcbiI7CmlmICh0cmltKCRsaW5lKSA9PT0gJy0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLScpIHsKYnJlYWs7Cn0KfQp9CmZpbGVfcHV0X2NvbnRlbnRzKCRrZXlQYXRoID0gJGNvbmZpZy0+Z2V0KCdob21lJykuJy9rZXlzLnRhZ3MucHViJywgJG1hdGNoWzBdKTsKJGlvLT53cml0ZSgnU3RvcmVkIGtleSB3aXRoIGZpbmdlcnByaW50OiAnIC4gS2V5czo6ZmluZ2VycHJpbnQoJGtleVBhdGgpKTsKCiRpby0+d3JpdGUoJ1B1YmxpYyBrZXlzIHN0b3JlZCBpbiAnLiRjb25maWctPmdldCgnaG9tZScpKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHJvbGxiYWNrKE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBzdHJpbmcgJHJvbGxiYWNrRGlyLCBzdHJpbmcgJGxvY2FsRmlsZW5hbWUpOiBpbnQKewokcm9sbGJhY2tWZXJzaW9uID0gJHRoaXMtPmdldExhc3RCYWNrdXBWZXJzaW9uKCRyb2xsYmFja0Rpcik7CmlmIChudWxsID09PSAkcm9sbGJhY2tWZXJzaW9uKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdDb21wb3NlciByb2xsYmFjayBmYWlsZWQ6IG5vIGluc3RhbGxhdGlvbiB0byByb2xsIGJhY2sgdG8gaW4gIicuJHJvbGxiYWNrRGlyLiciJyk7Cn0KCiRvbGRGaWxlID0gJHJvbGxiYWNrRGlyIC4gJy8nIC4gJHJvbGxiYWNrVmVyc2lvbiAuIHNlbGY6Ok9MRF9JTlNUQUxMX0VYVDsKCmlmICghaXNfZmlsZSgkb2xkRmlsZSkpIHsKdGhyb3cgbmV3IEZpbGVzeXN0ZW1FeGNlcHRpb24oJ0NvbXBvc2VyIHJvbGxiYWNrIGZhaWxlZDogIicuJG9sZEZpbGUuJyIgY291bGQgbm90IGJlIGZvdW5kJyk7Cn0KaWYgKCFGaWxlc3lzdGVtOjppc1JlYWRhYmxlKCRvbGRGaWxlKSkgewp0aHJvdyBuZXcgRmlsZXN5c3RlbUV4Y2VwdGlvbignQ29tcG9zZXIgcm9sbGJhY2sgZmFpbGVkOiAiJy4kb2xkRmlsZS4nIiBjb3VsZCBub3QgYmUgcmVhZCcpOwp9CgokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKJGlvLT53cml0ZUVycm9yKHNwcmludGYoIlJvbGxpbmcgYmFjayB0byB2ZXJzaW9uIDxpbmZvPiVzPC9pbmZvPi4iLCAkcm9sbGJhY2tWZXJzaW9uKSk7CmlmICghJHRoaXMtPnNldExvY2FsUGhhcigkbG9jYWxGaWxlbmFtZSwgJG9sZEZpbGUpKSB7CnJldHVybiAxOwp9CgpyZXR1cm4gMDsKfQoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHNldExvY2FsUGhhcihzdHJpbmcgJGxvY2FsRmlsZW5hbWUsIHN0cmluZyAkbmV3RmlsZW5hbWUsID9zdHJpbmcgJGJhY2t1cFRhcmdldCA9IG51bGwpOiBib29sCnsKJGlvID0gJHRoaXMtPmdldElPKCk7CiRwZXJtcyA9IEBmaWxlcGVybXMoJGxvY2FsRmlsZW5hbWUpOwppZiAoJHBlcm1zICE9PSBmYWxzZSkgewpAY2htb2QoJG5ld0ZpbGVuYW1lLCAkcGVybXMpOwp9CgoKaWYgKCEkdGhpcy0+dmFsaWRhdGVQaGFyKCRuZXdGaWxlbmFtZSwgJGVycm9yKSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5UaGUgJy4oJGJhY2t1cFRhcmdldCAhPT0gbnVsbCA/ICd1cGRhdGUnIDogJ2JhY2t1cCcpLicgZmlsZSBpcyBjb3JydXB0ZWQgKCcuJGVycm9yLicpPC9lcnJvcj4nKTsKCmlmICgkYmFja3VwVGFyZ2V0ICE9PSBudWxsKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPlBsZWFzZSByZS1ydW4gdGhlIHNlbGYtdXBkYXRlIGNvbW1hbmQgdG8gdHJ5IGFnYWluLjwvZXJyb3I+Jyk7Cn0KCnJldHVybiBmYWxzZTsKfQoKCmlmICgkYmFja3VwVGFyZ2V0ICE9PSBudWxsKSB7CkBjb3B5KCRsb2NhbEZpbGVuYW1lLCAkYmFja3VwVGFyZ2V0KTsKfQoKdHJ5IHsKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewoKCmNvcHkoJG5ld0ZpbGVuYW1lLCAkbG9jYWxGaWxlbmFtZSk7CkB1bmxpbmsoJG5ld0ZpbGVuYW1lKTsKfSBlbHNlIHsKcmVuYW1lKCRuZXdGaWxlbmFtZSwgJGxvY2FsRmlsZW5hbWUpOwp9CgpyZXR1cm4gdHJ1ZTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewoKaWYgKCFpc193cml0YWJsZShkaXJuYW1lKCRsb2NhbEZpbGVuYW1lKSkKJiYgJGlvLT5pc0ludGVyYWN0aXZlKCkKJiYgJHRoaXMtPmlzV2luZG93c05vbkFkbWluVXNlcigpKSB7CnJldHVybiAkdGhpcy0+dHJ5QXNXaW5kb3dzQWRtaW4oJGxvY2FsRmlsZW5hbWUsICRuZXdGaWxlbmFtZSk7Cn0KCkB1bmxpbmsoJG5ld0ZpbGVuYW1lKTsKJGFjdGlvbiA9ICdDb21wb3NlciAnLigkYmFja3VwVGFyZ2V0ICE9PSBudWxsID8gJ3VwZGF0ZScgOiAncm9sbGJhY2snKTsKdGhyb3cgbmV3IEZpbGVzeXN0ZW1FeGNlcHRpb24oJGFjdGlvbi4nIGZhaWxlZDogIicuJGxvY2FsRmlsZW5hbWUuJyIgY291bGQgbm90IGJlIHdyaXR0ZW4uJy5QSFBfRU9MLiRlLT5nZXRNZXNzYWdlKCkpOwp9Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBjbGVhbkJhY2t1cHMoc3RyaW5nICRyb2xsYmFja0RpciwgP3N0cmluZyAkZXhjZXB0ID0gbnVsbCk6IHZvaWQKewokZmluZGVyID0gJHRoaXMtPmdldE9sZEluc3RhbGxhdGlvbkZpbmRlcigkcm9sbGJhY2tEaXIpOwokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKJGZzID0gbmV3IEZpbGVzeXN0ZW07Cgpmb3JlYWNoICgkZmluZGVyIGFzICRmaWxlKSB7CmlmICgkZmlsZS0+Z2V0QmFzZW5hbWUoc2VsZjo6T0xEX0lOU1RBTExfRVhUKSA9PT0gJGV4Y2VwdCkgewpjb250aW51ZTsKfQokZmlsZSA9IChzdHJpbmcpICRmaWxlOwokaW8tPndyaXRlRXJyb3IoJzxpbmZvPlJlbW92aW5nOiAnLiRmaWxlLic8L2luZm8+Jyk7CiRmcy0+cmVtb3ZlKCRmaWxlKTsKfQp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0TGFzdEJhY2t1cFZlcnNpb24oc3RyaW5nICRyb2xsYmFja0Rpcik6ID9zdHJpbmcKewokZmluZGVyID0gJHRoaXMtPmdldE9sZEluc3RhbGxhdGlvbkZpbmRlcigkcm9sbGJhY2tEaXIpOwokZmluZGVyLT5zb3J0QnlOYW1lKCk7CiRmaWxlcyA9IGl0ZXJhdG9yX3RvX2FycmF5KCRmaW5kZXIpOwoKaWYgKGNvdW50KCRmaWxlcykgPiAwKSB7CnJldHVybiBlbmQoJGZpbGVzKS0+Z2V0QmFzZW5hbWUoc2VsZjo6T0xEX0lOU1RBTExfRVhUKTsKfQoKcmV0dXJuIG51bGw7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRPbGRJbnN0YWxsYXRpb25GaW5kZXIoc3RyaW5nICRyb2xsYmFja0Rpcik6IEZpbmRlcgp7CnJldHVybiBGaW5kZXI6OmNyZWF0ZSgpCi0+ZGVwdGgoMCkKLT5maWxlcygpCi0+bmFtZSgnKicgLiBzZWxmOjpPTERfSU5TVEFMTF9FWFQpCi0+aW4oJHJvbGxiYWNrRGlyKTsKfQoKCgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlUGhhcihzdHJpbmcgJHBoYXJGaWxlLCA/c3RyaW5nICYkZXJyb3IpOiBib29sCnsKaWYgKChib29sKSBpbmlfZ2V0KCdwaGFyLnJlYWRvbmx5JykpIHsKcmV0dXJuIHRydWU7Cn0KCnRyeSB7CgokcGhhciA9IG5ldyBQaGFyKCRwaGFyRmlsZSk7Cgp1bnNldCgkcGhhcik7CiRyZXN1bHQgPSB0cnVlOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmlmICghJGUgaW5zdGFuY2VvZiBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uICYmICEkZSBpbnN0YW5jZW9mIFxQaGFyRXhjZXB0aW9uKSB7CnRocm93ICRlOwp9CiRlcnJvciA9ICRlLT5nZXRNZXNzYWdlKCk7CiRyZXN1bHQgPSBmYWxzZTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpc1dpbmRvd3NOb25BZG1pblVzZXIoKTogYm9vbAp7CmlmICghUGxhdGZvcm06OmlzV2luZG93cygpKSB7CnJldHVybiBmYWxzZTsKfQoKCmV4ZWMoJ2ZsdG1jLmV4ZSBmaWx0ZXJzJywgJG91dHB1dCwgJGV4aXRDb2RlKTsKCnJldHVybiAkZXhpdENvZGUgIT09IDA7Cn0KCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB0cnlBc1dpbmRvd3NBZG1pbihzdHJpbmcgJGxvY2FsRmlsZW5hbWUsIHN0cmluZyAkbmV3RmlsZW5hbWUpOiBib29sCnsKJGlvID0gJHRoaXMtPmdldElPKCk7CgokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5VbmFibGUgdG8gd3JpdGUgIicuJGxvY2FsRmlsZW5hbWUuJyIuIEFjY2VzcyBpcyBkZW5pZWQuPC9lcnJvcj4nKTsKJGhlbHBNZXNzYWdlID0gJ1BsZWFzZSBydW4gdGhlIHNlbGYtdXBkYXRlIGNvbW1hbmQgYXMgYW4gQWRtaW5pc3RyYXRvci4nOwokcXVlc3Rpb24gPSAnQ29tcGxldGUgdGhpcyBvcGVyYXRpb24gd2l0aCBBZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMgWzxjb21tZW50PlksbjwvY29tbWVudD5dPyAnOwoKaWYgKCEkaW8tPmFza0NvbmZpcm1hdGlvbigkcXVlc3Rpb24sIHRydWUpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+T3BlcmF0aW9uIGNhbmNlbGxlZC4gJy4kaGVscE1lc3NhZ2UuJzwvd2FybmluZz4nKTsKCnJldHVybiBmYWxzZTsKfQoKJHRtcEZpbGUgPSB0ZW1wbmFtKHN5c19nZXRfdGVtcF9kaXIoKSwgJycpOwppZiAoZmFsc2UgPT09ICR0bXBGaWxlKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPk9wZXJhdGlvbiBmYWlsZWQuICcuJGhlbHBNZXNzYWdlLic8L2Vycm9yPicpOwoKcmV0dXJuIGZhbHNlOwp9CgpleGVjKCdzdWRvIGNvbmZpZyAyPiBOVUwnLCAkb3V0cHV0LCAkZXhpdENvZGUpOwokdXNpbmdTdWRvID0gJGV4aXRDb2RlID09PSAwOwoKJHNjcmlwdCA9ICR1c2luZ1N1ZG8gPyAkdG1wRmlsZS4nLmJhdCcgOiAkdG1wRmlsZS4nLnZicyc7CnJlbmFtZSgkdG1wRmlsZSwgJHNjcmlwdCk7CgokY2hlY2tzdW0gPSBoYXNoX2ZpbGUoJ3NoYTI1NicsICRuZXdGaWxlbmFtZSk7CgoKJHNvdXJjZSA9IHN0cl9yZXBsYWNlKCcvJywgJ1xcJywgJG5ld0ZpbGVuYW1lKTsKJGRlc3RpbmF0aW9uID0gc3RyX3JlcGxhY2UoJy8nLCAnXFwnLCAkbG9jYWxGaWxlbmFtZSk7CgppZiAoJHVzaW5nU3VkbykgewokY29kZSA9IHNwcmludGYoJ21vdmUgIiVzIiAiJXMiJywgJHNvdXJjZSwgJGRlc3RpbmF0aW9uKTsKfSBlbHNlIHsKJGNvZGUgPSA8PDxFT1QKU2V0IFVBQyA9IENyZWF0ZU9iamVjdCgiU2hlbGwuQXBwbGljYXRpb24iKQpVQUMuU2hlbGxFeGVjdXRlICJjbWQuZXhlIiwgIi9jIG1vdmUgL3kgIiIkc291cmNlIiIgIiIkZGVzdGluYXRpb24iIiIsICIiLCAicnVuYXMiLCAwCkVPVDsKfQoKZmlsZV9wdXRfY29udGVudHMoJHNjcmlwdCwgJGNvZGUpOwokY29tbWFuZCA9ICR1c2luZ1N1ZG8gPyBzcHJpbnRmKCdzdWRvICIlcyInLCAkc2NyaXB0KSA6IHNwcmludGYoJyIlcyInLCAkc2NyaXB0KTsKZXhlYygkY29tbWFuZCk7CgoKdXNsZWVwKDMwMDAwMCk7CkB1bmxpbmsoJHNjcmlwdCk7CgoKaWYgKCRyZXN1bHQgPSBGaWxlc3lzdGVtOjppc1JlYWRhYmxlKCRsb2NhbEZpbGVuYW1lKSAmJiAoaGFzaF9maWxlKCdzaGEyNTYnLCAkbG9jYWxGaWxlbmFtZSkgPT09ICRjaGVja3N1bSkpIHsKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5PcGVyYXRpb24gc3VjY2VlZGVkLjwvaW5mbz4nKTsKfSBlbHNlIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+T3BlcmF0aW9uIGZhaWxlZC4gJy4kaGVscE1lc3NhZ2UuJzwvZXJyb3I+Jyk7Cn0KCnJldHVybiAkcmVzdWx0Owp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcRGVmYXVsdFBvbGljeTsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXExpbms7CnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25TZWxlY3RvcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFBsdWdpblxDb21tYW5kRXZlbnQ7CnVzZSBDb21wb3NlclxQbHVnaW5cUGx1Z2luRXZlbnRzOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRBcnJheVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XENvbXBvc2VyUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcQ29tcG9zaXRlUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcRmlsdGVyUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5RmFjdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVNldDsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVV0aWxzOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSb290UGFja2FnZVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcU2VtdmVyXFNlbXZlcjsKdXNlIENvbXBvc2VyXFNwZHhcU3BkeExpY2Vuc2VzOwp1c2UgQ29tcG9zZXJcVXRpbFxQYWNrYWdlSW5mbzsKdXNlIERhdGVUaW1lSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25JbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlclN0eWxlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCgoKCgpjbGFzcyBTaG93Q29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKdXNlIENvbXBsZXRpb25UcmFpdDsKCgpwcm90ZWN0ZWQgJHZlcnNpb25QYXJzZXI7Cgpwcm90ZWN0ZWQgJGNvbG9yczsKCgpwcml2YXRlICRyZXBvc2l0b3J5U2V0OwoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdzaG93JykKLT5zZXRBbGlhc2VzKFsnaW5mbyddKQotPnNldERlc2NyaXB0aW9uKCdTaG93cyBpbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdlcycpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dEFyZ3VtZW50KCdwYWNrYWdlJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdQYWNrYWdlIHRvIGluc3BlY3QuIE9yIGEgbmFtZSBpbmNsdWRpbmcgYSB3aWxkY2FyZCAoKikgdG8gZmlsdGVyIGxpc3RzIG9mIHBhY2thZ2VzIGluc3RlYWQuJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RQYWNrYWdlQmFzZWRPbk1vZGUoKSksCm5ldyBJbnB1dEFyZ3VtZW50KCd2ZXJzaW9uJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdWZXJzaW9uIG9yIHZlcnNpb24gY29uc3RyYWludCB0byBpbnNwZWN0JyksCm5ldyBJbnB1dE9wdGlvbignYWxsJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdMaXN0IGFsbCBwYWNrYWdlcycpLApuZXcgSW5wdXRPcHRpb24oJ2xvY2tlZCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnTGlzdCBhbGwgbG9ja2VkIHBhY2thZ2VzJyksCm5ldyBJbnB1dE9wdGlvbignaW5zdGFsbGVkJywgJ2knLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0xpc3QgaW5zdGFsbGVkIHBhY2thZ2VzIG9ubHkgKGVuYWJsZWQgYnkgZGVmYXVsdCwgb25seSBwcmVzZW50IGZvciBCQykuJyksCm5ldyBJbnB1dE9wdGlvbigncGxhdGZvcm0nLCAncCcsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnTGlzdCBwbGF0Zm9ybSBwYWNrYWdlcyBvbmx5JyksCm5ldyBJbnB1dE9wdGlvbignYXZhaWxhYmxlJywgJ2EnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0xpc3QgYXZhaWxhYmxlIHBhY2thZ2VzIG9ubHknKSwKbmV3IElucHV0T3B0aW9uKCdzZWxmJywgJ3MnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3cgdGhlIHJvb3QgcGFja2FnZSBpbmZvcm1hdGlvbicpLApuZXcgSW5wdXRPcHRpb24oJ25hbWUtb25seScsICdOJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdMaXN0IHBhY2thZ2UgbmFtZXMgb25seScpLApuZXcgSW5wdXRPcHRpb24oJ3BhdGgnLCAnUCcsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvdyBwYWNrYWdlIHBhdGhzJyksCm5ldyBJbnB1dE9wdGlvbigndHJlZScsICd0JywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdMaXN0IHRoZSBkZXBlbmRlbmNpZXMgYXMgYSB0cmVlJyksCm5ldyBJbnB1dE9wdGlvbignbGF0ZXN0JywgJ2wnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3cgdGhlIGxhdGVzdCB2ZXJzaW9uJyksCm5ldyBJbnB1dE9wdGlvbignb3V0ZGF0ZWQnLCAnbycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvdyB0aGUgbGF0ZXN0IHZlcnNpb24gYnV0IG9ubHkgZm9yIHBhY2thZ2VzIHRoYXQgYXJlIG91dGRhdGVkJyksCm5ldyBJbnB1dE9wdGlvbignaWdub3JlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVEIHwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZLCAnSWdub3JlIHNwZWNpZmllZCBwYWNrYWdlKHMpLiBDYW4gY29udGFpbiB3aWxkY2FyZHMgKCopLiBVc2UgaXQgd2l0aCB0aGUgLS1vdXRkYXRlZCBvcHRpb24gaWYgeW91IGRvblwndCB3YW50IHRvIGJlIGluZm9ybWVkIGFib3V0IG5ldyB2ZXJzaW9ucyBvZiBzb21lIHBhY2thZ2VzLicsIG51bGwsICR0aGlzLT5zdWdnZXN0SW5zdGFsbGVkUGFja2FnZShmYWxzZSkpLApuZXcgSW5wdXRPcHRpb24oJ21ham9yLW9ubHknLCAnTScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvdyBvbmx5IHBhY2thZ2VzIHRoYXQgaGF2ZSBtYWpvciBTZW1WZXItY29tcGF0aWJsZSB1cGRhdGVzLiBVc2Ugd2l0aCB0aGUgLS1sYXRlc3Qgb3IgLS1vdXRkYXRlZCBvcHRpb24uJyksCm5ldyBJbnB1dE9wdGlvbignbWlub3Itb25seScsICdtJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTaG93IG9ubHkgcGFja2FnZXMgdGhhdCBoYXZlIG1pbm9yIFNlbVZlci1jb21wYXRpYmxlIHVwZGF0ZXMuIFVzZSB3aXRoIHRoZSAtLWxhdGVzdCBvciAtLW91dGRhdGVkIG9wdGlvbi4nKSwKbmV3IElucHV0T3B0aW9uKCdwYXRjaC1vbmx5JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTaG93IG9ubHkgcGFja2FnZXMgdGhhdCBoYXZlIHBhdGNoIFNlbVZlci1jb21wYXRpYmxlIHVwZGF0ZXMuIFVzZSB3aXRoIHRoZSAtLWxhdGVzdCBvciAtLW91dGRhdGVkIG9wdGlvbi4nKSwKbmV3IElucHV0T3B0aW9uKCdzb3J0LWJ5LWFnZScsICdBJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNwbGF5cyB0aGUgaW5zdGFsbGVkIHZlcnNpb25cJ3MgYWdlLCBhbmQgc29ydHMgcGFja2FnZXMgb2xkZXN0IGZpcnN0LiBVc2Ugd2l0aCB0aGUgLS1sYXRlc3Qgb3IgLS1vdXRkYXRlZCBvcHRpb24uJyksCm5ldyBJbnB1dE9wdGlvbignZGlyZWN0JywgJ0QnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3dzIG9ubHkgcGFja2FnZXMgdGhhdCBhcmUgZGlyZWN0bHkgcmVxdWlyZWQgYnkgdGhlIHJvb3QgcGFja2FnZScpLApuZXcgSW5wdXRPcHRpb24oJ3N0cmljdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUmV0dXJuIGEgbm9uLXplcm8gZXhpdCBjb2RlIHdoZW4gdGhlcmUgYXJlIG91dGRhdGVkIHBhY2thZ2VzJyksCm5ldyBJbnB1dE9wdGlvbignZm9ybWF0JywgJ2YnLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdGb3JtYXQgb2YgdGhlIG91dHB1dDogdGV4dCBvciBqc29uJywgJ3RleHQnLCBbJ2pzb24nLCAndGV4dCddKSwKbmV3IElucHV0T3B0aW9uKCduby1kZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc2FibGVzIHNlYXJjaCBpbiByZXF1aXJlLWRldiBwYWNrYWdlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVEIHwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZLCAnSWdub3JlIGEgc3BlY2lmaWMgcGxhdGZvcm0gcmVxdWlyZW1lbnQgKHBocCAmIGV4dC0gcGFja2FnZXMpLiBVc2Ugd2l0aCB0aGUgLS1vdXRkYXRlZCBvcHRpb24nKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnSWdub3JlIGFsbCBwbGF0Zm9ybSByZXF1aXJlbWVudHMgKHBocCAmIGV4dC0gcGFja2FnZXMpLiBVc2Ugd2l0aCB0aGUgLS1vdXRkYXRlZCBvcHRpb24nKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIHNob3cgY29tbWFuZCBkaXNwbGF5cyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBhIHBhY2thZ2UsIG9yCmxpc3RzIGFsbCBwYWNrYWdlcyBhdmFpbGFibGUuCgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNzaG93LWluZm8KRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gc3VnZ2VzdFBhY2thZ2VCYXNlZE9uTW9kZSgpOiBcQ2xvc3VyZQp7CnJldHVybiBmdW5jdGlvbiAoQ29tcGxldGlvbklucHV0ICRpbnB1dCkgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2F2YWlsYWJsZScpIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCdhbGwnKSkgewpyZXR1cm4gJHRoaXMtPnN1Z2dlc3RBdmFpbGFibGVQYWNrYWdlSW5jbFBsYXRmb3JtKCkoJGlucHV0KTsKfQoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdwbGF0Zm9ybScpKSB7CnJldHVybiAkdGhpcy0+c3VnZ2VzdFBsYXRmb3JtUGFja2FnZSgpKCRpbnB1dCk7Cn0KCnJldHVybiAkdGhpcy0+c3VnZ2VzdEluc3RhbGxlZFBhY2thZ2UoZmFsc2UpKCRpbnB1dCk7Cn07Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokdGhpcy0+dmVyc2lvblBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3RyZWUnKSkgewokdGhpcy0+aW5pdFN0eWxlcygkb3V0cHV0KTsKfQoKJGNvbXBvc2VyID0gJHRoaXMtPnRyeUNvbXBvc2VyKCk7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdpbnN0YWxsZWQnKSAmJiAhJGlucHV0LT5nZXRPcHRpb24oJ3NlbGYnKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPllvdSBhcmUgdXNpbmcgdGhlIGRlcHJlY2F0ZWQgb3B0aW9uICJpbnN0YWxsZWQiLiBPbmx5IGluc3RhbGxlZCBwYWNrYWdlcyBhcmUgc2hvd24gYnkgZGVmYXVsdCBub3cuIFRoZSAtLWFsbCBvcHRpb24gY2FuIGJlIHVzZWQgdG8gc2hvdyBhbGwgcGFja2FnZXMuPC93YXJuaW5nPicpOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ291dGRhdGVkJykpIHsKJGlucHV0LT5zZXRPcHRpb24oJ2xhdGVzdCcsIHRydWUpOwp9IGVsc2VpZiAoY291bnQoJGlucHV0LT5nZXRPcHRpb24oJ2lnbm9yZScpKSA+IDApIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Zb3UgYXJlIHVzaW5nIHRoZSBvcHRpb24gImlnbm9yZSIgZm9yIGFjdGlvbiBvdGhlciB0aGFuICJvdXRkYXRlZCIsIGl0IHdpbGwgYmUgaWdub3JlZC48L3dhcm5pbmc+Jyk7Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbignZGlyZWN0JykgJiYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdhbGwnKSB8fCAkaW5wdXQtPmdldE9wdGlvbignYXZhaWxhYmxlJykgfHwgJGlucHV0LT5nZXRPcHRpb24oJ3BsYXRmb3JtJykpKSB7CiRpby0+d3JpdGVFcnJvcignVGhlIC0tZGlyZWN0ICgtRCkgb3B0aW9uIGlzIG5vdCB1c2FibGUgaW4gY29tYmluYXRpb24gd2l0aCAtLWFsbCwgLS1wbGF0Zm9ybSAoLXApIG9yIC0tYXZhaWxhYmxlICgtYSknKTsKCnJldHVybiAxOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3RyZWUnKSAmJiAoJGlucHV0LT5nZXRPcHRpb24oJ2FsbCcpIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCdhdmFpbGFibGUnKSkpIHsKJGlvLT53cml0ZUVycm9yKCdUaGUgLS10cmVlICgtdCkgb3B0aW9uIGlzIG5vdCB1c2FibGUgaW4gY29tYmluYXRpb24gd2l0aCAtLWFsbCBvciAtLWF2YWlsYWJsZSAoLWEpJyk7CgpyZXR1cm4gMTsKfQoKaWYgKGNvdW50KGFycmF5X2ZpbHRlcihbJGlucHV0LT5nZXRPcHRpb24oJ3BhdGNoLW9ubHknKSwgJGlucHV0LT5nZXRPcHRpb24oJ21pbm9yLW9ubHknKSwgJGlucHV0LT5nZXRPcHRpb24oJ21ham9yLW9ubHknKV0pKSA+IDEpIHsKJGlvLT53cml0ZUVycm9yKCdPbmx5IG9uZSBvZiAtLW1ham9yLW9ubHksIC0tbWlub3Itb25seSBvciAtLXBhdGNoLW9ubHkgY2FuIGJlIHVzZWQgYXQgb25jZScpOwoKcmV0dXJuIDE7Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbigndHJlZScpICYmICRpbnB1dC0+Z2V0T3B0aW9uKCdsYXRlc3QnKSkgewokaW8tPndyaXRlRXJyb3IoJ1RoZSAtLXRyZWUgKC10KSBvcHRpb24gaXMgbm90IHVzYWJsZSBpbiBjb21iaW5hdGlvbiB3aXRoIC0tbGF0ZXN0ICgtbCknKTsKCnJldHVybiAxOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3RyZWUnKSAmJiAkaW5wdXQtPmdldE9wdGlvbigncGF0aCcpKSB7CiRpby0+d3JpdGVFcnJvcignVGhlIC0tdHJlZSAoLXQpIG9wdGlvbiBpcyBub3QgdXNhYmxlIGluIGNvbWJpbmF0aW9uIHdpdGggLS1wYXRoICgtUCknKTsKCnJldHVybiAxOwp9CgokZm9ybWF0ID0gJGlucHV0LT5nZXRPcHRpb24oJ2Zvcm1hdCcpOwppZiAoIWluX2FycmF5KCRmb3JtYXQsIFsndGV4dCcsICdqc29uJ10pKSB7CiRpby0+d3JpdGVFcnJvcihzcHJpbnRmKCdVbnN1cHBvcnRlZCBmb3JtYXQgIiVzIi4gU2VlIGhlbHAgZm9yIHN1cHBvcnRlZCBmb3JtYXRzLicsICRmb3JtYXQpKTsKCnJldHVybiAxOwp9CgokcGxhdGZvcm1SZXFGaWx0ZXIgPSAkdGhpcy0+Z2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkaW5wdXQpOwoKCiRwbGF0Zm9ybU92ZXJyaWRlcyA9IFtdOwppZiAoJGNvbXBvc2VyKSB7CiRwbGF0Zm9ybU92ZXJyaWRlcyA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgncGxhdGZvcm0nKTsKfQokcGxhdGZvcm1SZXBvID0gbmV3IFBsYXRmb3JtUmVwb3NpdG9yeShbXSwgJHBsYXRmb3JtT3ZlcnJpZGVzKTsKJGxvY2tlZFJlcG8gPSBudWxsOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdzZWxmJykgJiYgISRpbnB1dC0+Z2V0T3B0aW9uKCdpbnN0YWxsZWQnKSAmJiAhJGlucHV0LT5nZXRPcHRpb24oJ2xvY2tlZCcpKSB7CiRwYWNrYWdlID0gY2xvbmUgJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpLT5nZXRQYWNrYWdlKCk7CmlmICgkaW5wdXQtPmdldE9wdGlvbignbmFtZS1vbmx5JykpIHsKJGlvLT53cml0ZSgkcGFja2FnZS0+Z2V0TmFtZSgpKTsKCnJldHVybiAwOwp9CmlmICgkaW5wdXQtPmdldEFyZ3VtZW50KCdwYWNrYWdlJykpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1lvdSBjYW5ub3QgdXNlIC0tc2VsZiB0b2dldGhlciB3aXRoIGEgcGFja2FnZSBuYW1lJyk7Cn0KJHJlcG9zID0gJGluc3RhbGxlZFJlcG8gPSBuZXcgSW5zdGFsbGVkUmVwb3NpdG9yeShbbmV3IFJvb3RQYWNrYWdlUmVwb3NpdG9yeSgkcGFja2FnZSldKTsKfSBlbHNlaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdwbGF0Zm9ybScpKSB7CiRyZXBvcyA9ICRpbnN0YWxsZWRSZXBvID0gbmV3IEluc3RhbGxlZFJlcG9zaXRvcnkoWyRwbGF0Zm9ybVJlcG9dKTsKfSBlbHNlaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdhdmFpbGFibGUnKSkgewokaW5zdGFsbGVkUmVwbyA9IG5ldyBJbnN0YWxsZWRSZXBvc2l0b3J5KFskcGxhdGZvcm1SZXBvXSk7CmlmICgkY29tcG9zZXIpIHsKJHJlcG9zID0gbmV3IENvbXBvc2l0ZVJlcG9zaXRvcnkoJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRSZXBvc2l0b3JpZXMoKSk7CiRpbnN0YWxsZWRSZXBvLT5hZGRSZXBvc2l0b3J5KCRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCkpOwp9IGVsc2UgewokZGVmYXVsdFJlcG9zID0gUmVwb3NpdG9yeUZhY3Rvcnk6OmRlZmF1bHRSZXBvc1dpdGhEZWZhdWx0TWFuYWdlcigkaW8pOwokcmVwb3MgPSBuZXcgQ29tcG9zaXRlUmVwb3NpdG9yeSgkZGVmYXVsdFJlcG9zKTsKJGlvLT53cml0ZUVycm9yKCdObyBjb21wb3Nlci5qc29uIGZvdW5kIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgc2hvd2luZyBhdmFpbGFibGUgcGFja2FnZXMgZnJvbSAnIC4gaW1wbG9kZSgnLCAnLCBhcnJheV9rZXlzKCRkZWZhdWx0UmVwb3MpKSk7Cn0KfSBlbHNlaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdhbGwnKSAmJiAkY29tcG9zZXIpIHsKJGxvY2FsUmVwbyA9ICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7CiRsb2NrZXIgPSAkY29tcG9zZXItPmdldExvY2tlcigpOwppZiAoJGxvY2tlci0+aXNMb2NrZWQoKSkgewokbG9ja2VkUmVwbyA9ICRsb2NrZXItPmdldExvY2tlZFJlcG9zaXRvcnkodHJ1ZSk7CiRpbnN0YWxsZWRSZXBvID0gbmV3IEluc3RhbGxlZFJlcG9zaXRvcnkoWyRsb2NrZWRSZXBvLCAkbG9jYWxSZXBvLCAkcGxhdGZvcm1SZXBvXSk7Cn0gZWxzZSB7CiRpbnN0YWxsZWRSZXBvID0gbmV3IEluc3RhbGxlZFJlcG9zaXRvcnkoWyRsb2NhbFJlcG8sICRwbGF0Zm9ybVJlcG9dKTsKfQokcmVwb3MgPSBuZXcgQ29tcG9zaXRlUmVwb3NpdG9yeShhcnJheV9tZXJnZShbbmV3IEZpbHRlclJlcG9zaXRvcnkoJGluc3RhbGxlZFJlcG8sIFsnY2Fub25pY2FsJyA9PiBmYWxzZV0pXSwgJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRSZXBvc2l0b3JpZXMoKSkpOwp9IGVsc2VpZiAoJGlucHV0LT5nZXRPcHRpb24oJ2FsbCcpKSB7CiRkZWZhdWx0UmVwb3MgPSBSZXBvc2l0b3J5RmFjdG9yeTo6ZGVmYXVsdFJlcG9zV2l0aERlZmF1bHRNYW5hZ2VyKCRpbyk7CiRpby0+d3JpdGVFcnJvcignTm8gY29tcG9zZXIuanNvbiBmb3VuZCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIHNob3dpbmcgYXZhaWxhYmxlIHBhY2thZ2VzIGZyb20gJyAuIGltcGxvZGUoJywgJywgYXJyYXlfa2V5cygkZGVmYXVsdFJlcG9zKSkpOwokaW5zdGFsbGVkUmVwbyA9IG5ldyBJbnN0YWxsZWRSZXBvc2l0b3J5KFskcGxhdGZvcm1SZXBvXSk7CiRyZXBvcyA9IG5ldyBDb21wb3NpdGVSZXBvc2l0b3J5KGFycmF5X21lcmdlKFskaW5zdGFsbGVkUmVwb10sICRkZWZhdWx0UmVwb3MpKTsKfSBlbHNlaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdsb2NrZWQnKSkgewppZiAoISRjb21wb3NlciB8fCAhJGNvbXBvc2VyLT5nZXRMb2NrZXIoKS0+aXNMb2NrZWQoKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignQSB2YWxpZCBjb21wb3Nlci5qc29uIGFuZCBjb21wb3Nlci5sb2NrIGZpbGVzIGlzIHJlcXVpcmVkIHRvIHJ1biB0aGlzIGNvbW1hbmQgd2l0aCAtLWxvY2tlZCcpOwp9CiRsb2NrZXIgPSAkY29tcG9zZXItPmdldExvY2tlcigpOwokbG9ja2VkUmVwbyA9ICRsb2NrZXItPmdldExvY2tlZFJlcG9zaXRvcnkoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSk7CmlmICgkaW5wdXQtPmdldE9wdGlvbignc2VsZicpKSB7CiRsb2NrZWRSZXBvLT5hZGRQYWNrYWdlKGNsb25lICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpKTsKfQokcmVwb3MgPSAkaW5zdGFsbGVkUmVwbyA9IG5ldyBJbnN0YWxsZWRSZXBvc2l0b3J5KFskbG9ja2VkUmVwb10pOwp9IGVsc2UgewoKaWYgKCEkY29tcG9zZXIpIHsKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwp9CiRyb290UGtnID0gJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCk7Cgokcm9vdFJlcG8gPSBuZXcgSW5zdGFsbGVkQXJyYXlSZXBvc2l0b3J5KCk7CmlmICgkaW5wdXQtPmdldE9wdGlvbignc2VsZicpKSB7CiRyb290UmVwbyA9IG5ldyBSb290UGFja2FnZVJlcG9zaXRvcnkoY2xvbmUgJHJvb3RQa2cpOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbignbm8tZGV2JykpIHsKJHBhY2thZ2VzID0gUmVwb3NpdG9yeVV0aWxzOjpmaWx0ZXJSZXF1aXJlZFBhY2thZ2VzKCRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCktPmdldFBhY2thZ2VzKCksICRyb290UGtnKTsKJHJlcG9zID0gJGluc3RhbGxlZFJlcG8gPSBuZXcgSW5zdGFsbGVkUmVwb3NpdG9yeShbJHJvb3RSZXBvLCBuZXcgSW5zdGFsbGVkQXJyYXlSZXBvc2l0b3J5KGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRwa2cpOiBQYWNrYWdlSW50ZXJmYWNlIHsKcmV0dXJuIGNsb25lICRwa2c7Cn0sICRwYWNrYWdlcykpXSk7Cn0gZWxzZSB7CiRyZXBvcyA9ICRpbnN0YWxsZWRSZXBvID0gbmV3IEluc3RhbGxlZFJlcG9zaXRvcnkoWyRyb290UmVwbywgJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKV0pOwp9CgppZiAoISRpbnN0YWxsZWRSZXBvLT5nZXRQYWNrYWdlcygpKSB7CiRoYXNOb25QbGF0Zm9ybVJlcXMgPSBzdGF0aWMgZnVuY3Rpb24gKGFycmF5ICRyZXFzKTogYm9vbCB7CnJldHVybiAoYm9vbCkgYXJyYXlfZmlsdGVyKGFycmF5X2tleXMoJHJlcXMpLCBzdGF0aWMgZnVuY3Rpb24gKHN0cmluZyAkbmFtZSkgewpyZXR1cm4gIVBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJG5hbWUpOwp9KTsKfTsKCmlmICgkaGFzTm9uUGxhdGZvcm1SZXFzKCRyb290UGtnLT5nZXRSZXF1aXJlcygpKSB8fCAkaGFzTm9uUGxhdGZvcm1SZXFzKCRyb290UGtnLT5nZXREZXZSZXF1aXJlcygpKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPk5vIGRlcGVuZGVuY2llcyBpbnN0YWxsZWQuIFRyeSBydW5uaW5nIGNvbXBvc2VyIGluc3RhbGwgb3IgdXBkYXRlLjwvd2FybmluZz4nKTsKfQp9Cn0KCmlmICgkY29tcG9zZXIpIHsKJGNvbW1hbmRFdmVudCA9IG5ldyBDb21tYW5kRXZlbnQoUGx1Z2luRXZlbnRzOjpDT01NQU5ELCAnc2hvdycsICRpbnB1dCwgJG91dHB1dCk7CiRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmRpc3BhdGNoKCRjb21tYW5kRXZlbnQtPmdldE5hbWUoKSwgJGNvbW1hbmRFdmVudCk7Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbignbGF0ZXN0JykgJiYgbnVsbCA9PT0gJGNvbXBvc2VyKSB7CiRpby0+d3JpdGVFcnJvcignTm8gY29tcG9zZXIuanNvbiBmb3VuZCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIGRpc2FibGluZyAibGF0ZXN0IiBvcHRpb24nKTsKJGlucHV0LT5zZXRPcHRpb24oJ2xhdGVzdCcsIGZhbHNlKTsKfQoKJHBhY2thZ2VGaWx0ZXIgPSAkaW5wdXQtPmdldEFyZ3VtZW50KCdwYWNrYWdlJyk7CgoKaWYgKGlzc2V0KCRwYWNrYWdlKSkgewokdmVyc2lvbnMgPSBbJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKSA9PiAkcGFja2FnZS0+Z2V0VmVyc2lvbigpXTsKfSBlbHNlaWYgKG51bGwgIT09ICRwYWNrYWdlRmlsdGVyICYmICFzdHJfY29udGFpbnMoJHBhY2thZ2VGaWx0ZXIsICcqJykpIHsKWyRwYWNrYWdlLCAkdmVyc2lvbnNdID0gJHRoaXMtPmdldFBhY2thZ2UoJGluc3RhbGxlZFJlcG8sICRyZXBvcywgJHBhY2thZ2VGaWx0ZXIsICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3ZlcnNpb24nKSk7CgppZiAoaXNzZXQoJHBhY2thZ2UpICYmICRpbnB1dC0+Z2V0T3B0aW9uKCdkaXJlY3QnKSkgewppZiAoIWluX2FycmF5KCRwYWNrYWdlLT5nZXROYW1lKCksICR0aGlzLT5nZXRSb290UmVxdWlyZXMoKSwgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1BhY2thZ2UgIicgLiAkcGFja2FnZS0+Z2V0TmFtZSgpIC4gJyIgaXMgaW5zdGFsbGVkIGJ1dCBub3QgYSBkaXJlY3QgZGVwZW5kZW50IG9mIHRoZSByb290IHBhY2thZ2UuJyk7Cn0KfQoKaWYgKCFpc3NldCgkcGFja2FnZSkpIHsKJG9wdGlvbnMgPSAkaW5wdXQtPmdldE9wdGlvbnMoKTsKJGhpbnQgPSAnJzsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdsb2NrZWQnKSkgewokaGludCAuPSAnIGluIGxvY2sgZmlsZSc7Cn0KaWYgKGlzc2V0KCRvcHRpb25zWyd3b3JraW5nLWRpciddKSkgewokaGludCAuPSAnIGluICcgLiAkb3B0aW9uc1snd29ya2luZy1kaXInXSAuICcvY29tcG9zZXIuanNvbic7Cn0KaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJHBhY2thZ2VGaWx0ZXIpICYmICEkaW5wdXQtPmdldE9wdGlvbigncGxhdGZvcm0nKSkgewokaGludCAuPSAnLCB0cnkgdXNpbmcgLS1wbGF0Zm9ybSAoLXApIHRvIHNob3cgcGxhdGZvcm0gcGFja2FnZXMnOwp9CmlmICghJGlucHV0LT5nZXRPcHRpb24oJ2FsbCcpICYmICEkaW5wdXQtPmdldE9wdGlvbignYXZhaWxhYmxlJykpIHsKJGhpbnQgLj0gJywgdHJ5IHVzaW5nIC0tYXZhaWxhYmxlICgtYSkgdG8gc2hvdyBhbGwgYXZhaWxhYmxlIHBhY2thZ2VzJzsKfQoKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1BhY2thZ2UgIicgLiAkcGFja2FnZUZpbHRlciAuICciIG5vdCBmb3VuZCcuJGhpbnQuJy4nKTsKfQp9CgppZiAoaXNzZXQoJHBhY2thZ2UpKSB7CmFzc2VydChpc3NldCgkdmVyc2lvbnMpKTsKCiRleGl0Q29kZSA9IDA7CmlmICgkaW5wdXQtPmdldE9wdGlvbigndHJlZScpKSB7CiRhcnJheVRyZWUgPSAkdGhpcy0+Z2VuZXJhdGVQYWNrYWdlVHJlZSgkcGFja2FnZSwgJGluc3RhbGxlZFJlcG8sICRyZXBvcyk7CgppZiAoJ2pzb24nID09PSAkZm9ybWF0KSB7CiRpby0+d3JpdGUoSnNvbkZpbGU6OmVuY29kZShbJ2luc3RhbGxlZCcgPT4gWyRhcnJheVRyZWVdXSkpOwp9IGVsc2UgewokdGhpcy0+ZGlzcGxheVBhY2thZ2VUcmVlKFskYXJyYXlUcmVlXSk7Cn0KCnJldHVybiAkZXhpdENvZGU7Cn0KCiRsYXRlc3RQYWNrYWdlID0gbnVsbDsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdsYXRlc3QnKSkgewokbGF0ZXN0UGFja2FnZSA9ICR0aGlzLT5maW5kTGF0ZXN0UGFja2FnZSgkcGFja2FnZSwgJGNvbXBvc2VyLCAkcGxhdGZvcm1SZXBvLCAkaW5wdXQtPmdldE9wdGlvbignbWFqb3Itb25seScpLCAkaW5wdXQtPmdldE9wdGlvbignbWlub3Itb25seScpLCAkaW5wdXQtPmdldE9wdGlvbigncGF0Y2gtb25seScpLCAkcGxhdGZvcm1SZXFGaWx0ZXIpOwp9CmlmICgKJGlucHV0LT5nZXRPcHRpb24oJ291dGRhdGVkJykKJiYgJGlucHV0LT5nZXRPcHRpb24oJ3N0cmljdCcpCiYmIG51bGwgIT09ICRsYXRlc3RQYWNrYWdlCiYmICRsYXRlc3RQYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpICE9PSAkcGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKQomJiAoISRsYXRlc3RQYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlIHx8ICEkbGF0ZXN0UGFja2FnZS0+aXNBYmFuZG9uZWQoKSkKKSB7CiRleGl0Q29kZSA9IDE7Cn0KaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdwYXRoJykpIHsKJGlvLT53cml0ZSgkcGFja2FnZS0+Z2V0TmFtZSgpLCBmYWxzZSk7CiRwYXRoID0gJGNvbXBvc2VyLT5nZXRJbnN0YWxsYXRpb25NYW5hZ2VyKCktPmdldEluc3RhbGxQYXRoKCRwYWNrYWdlKTsKaWYgKGlzX3N0cmluZygkcGF0aCkpIHsKJGlvLT53cml0ZSgnICcgLiBzdHJ0b2socmVhbHBhdGgoJHBhdGgpLCAiXHJcbiIpKTsKfSBlbHNlIHsKJGlvLT53cml0ZSgnIG51bGwnKTsKfQoKcmV0dXJuICRleGl0Q29kZTsKfQoKaWYgKCdqc29uJyA9PT0gJGZvcm1hdCkgewokdGhpcy0+cHJpbnRQYWNrYWdlSW5mb0FzSnNvbigkcGFja2FnZSwgJHZlcnNpb25zLCAkaW5zdGFsbGVkUmVwbywgJGxhdGVzdFBhY2thZ2UgPzogbnVsbCk7Cn0gZWxzZSB7CiR0aGlzLT5wcmludFBhY2thZ2VJbmZvKCRwYWNrYWdlLCAkdmVyc2lvbnMsICRpbnN0YWxsZWRSZXBvLCAkbGF0ZXN0UGFja2FnZSA/OiBudWxsKTsKfQoKcmV0dXJuICRleGl0Q29kZTsKfQoKCmlmICgkaW5wdXQtPmdldE9wdGlvbigndHJlZScpKSB7CiRyb290UmVxdWlyZXMgPSAkdGhpcy0+Z2V0Um9vdFJlcXVpcmVzKCk7CiRwYWNrYWdlcyA9ICRpbnN0YWxsZWRSZXBvLT5nZXRQYWNrYWdlcygpOwp1c29ydCgkcGFja2FnZXMsIHN0YXRpYyBmdW5jdGlvbiAoQmFzZVBhY2thZ2UgJGEsIEJhc2VQYWNrYWdlICRiKTogaW50IHsKcmV0dXJuIHN0cmNtcCgoc3RyaW5nKSAkYSwgKHN0cmluZykgJGIpOwp9KTsKJGFycmF5VHJlZSA9IFtdOwpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKaWYgKGluX2FycmF5KCRwYWNrYWdlLT5nZXROYW1lKCksICRyb290UmVxdWlyZXMsIHRydWUpKSB7CiRhcnJheVRyZWVbXSA9ICR0aGlzLT5nZW5lcmF0ZVBhY2thZ2VUcmVlKCRwYWNrYWdlLCAkaW5zdGFsbGVkUmVwbywgJHJlcG9zKTsKfQp9CgppZiAoJ2pzb24nID09PSAkZm9ybWF0KSB7CiRpby0+d3JpdGUoSnNvbkZpbGU6OmVuY29kZShbJ2luc3RhbGxlZCcgPT4gJGFycmF5VHJlZV0pKTsKfSBlbHNlIHsKJHRoaXMtPmRpc3BsYXlQYWNrYWdlVHJlZSgkYXJyYXlUcmVlKTsKfQoKcmV0dXJuIDA7Cn0KCgoKJHBhY2thZ2VzID0gW107CiRwYWNrYWdlRmlsdGVyUmVnZXggPSBudWxsOwppZiAobnVsbCAhPT0gJHBhY2thZ2VGaWx0ZXIpIHsKJHBhY2thZ2VGaWx0ZXJSZWdleCA9ICd7Xicuc3RyX3JlcGxhY2UoJ1xcKicsICcuKj8nLCBwcmVnX3F1b3RlKCRwYWNrYWdlRmlsdGVyKSkuJyR9aSc7Cn0KCiRwYWNrYWdlTGlzdEZpbHRlciA9IG51bGw7CmlmICgkaW5wdXQtPmdldE9wdGlvbignZGlyZWN0JykpIHsKJHBhY2thZ2VMaXN0RmlsdGVyID0gJHRoaXMtPmdldFJvb3RSZXF1aXJlcygpOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3BhdGgnKSAmJiBudWxsID09PSAkY29tcG9zZXIpIHsKJGlvLT53cml0ZUVycm9yKCdObyBjb21wb3Nlci5qc29uIGZvdW5kIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgZGlzYWJsaW5nICJwYXRoIiBvcHRpb24nKTsKJGlucHV0LT5zZXRPcHRpb24oJ3BhdGgnLCBmYWxzZSk7Cn0KCmZvcmVhY2ggKFJlcG9zaXRvcnlVdGlsczo6ZmxhdHRlblJlcG9zaXRvcmllcygkcmVwb3MpIGFzICRyZXBvKSB7CmlmICgkcmVwbyA9PT0gJHBsYXRmb3JtUmVwbykgewokdHlwZSA9ICdwbGF0Zm9ybSc7Cn0gZWxzZWlmICgkbG9ja2VkUmVwbyAhPT0gbnVsbCAmJiAkcmVwbyA9PT0gJGxvY2tlZFJlcG8pIHsKJHR5cGUgPSAnbG9ja2VkJzsKfSBlbHNlaWYgKCRyZXBvID09PSAkaW5zdGFsbGVkUmVwbyB8fCBpbl9hcnJheSgkcmVwbywgJGluc3RhbGxlZFJlcG8tPmdldFJlcG9zaXRvcmllcygpLCB0cnVlKSkgewokdHlwZSA9ICdpbnN0YWxsZWQnOwp9IGVsc2UgewokdHlwZSA9ICdhdmFpbGFibGUnOwp9CmlmICgkcmVwbyBpbnN0YW5jZW9mIENvbXBvc2VyUmVwb3NpdG9yeSkgewpmb3JlYWNoICgkcmVwby0+Z2V0UGFja2FnZU5hbWVzKCRwYWNrYWdlRmlsdGVyKSBhcyAkbmFtZSkgewokcGFja2FnZXNbJHR5cGVdWyRuYW1lXSA9ICRuYW1lOwp9Cn0gZWxzZSB7CmZvcmVhY2ggKCRyZXBvLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CmlmICghaXNzZXQoJHBhY2thZ2VzWyR0eXBlXVskcGFja2FnZS0+Z2V0TmFtZSgpXSkKfHwgIWlzX29iamVjdCgkcGFja2FnZXNbJHR5cGVdWyRwYWNrYWdlLT5nZXROYW1lKCldKQp8fCB2ZXJzaW9uX2NvbXBhcmUoJHBhY2thZ2VzWyR0eXBlXVskcGFja2FnZS0+Z2V0TmFtZSgpXS0+Z2V0VmVyc2lvbigpLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpLCAnPCcpCikgewp3aGlsZSAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJHBhY2thZ2UgPSAkcGFja2FnZS0+Z2V0QWxpYXNPZigpOwp9CmlmICghJHBhY2thZ2VGaWx0ZXJSZWdleCB8fCBQcmVnOjppc01hdGNoKCRwYWNrYWdlRmlsdGVyUmVnZXgsICRwYWNrYWdlLT5nZXROYW1lKCkpKSB7CmlmIChudWxsID09PSAkcGFja2FnZUxpc3RGaWx0ZXIgfHwgaW5fYXJyYXkoJHBhY2thZ2UtPmdldE5hbWUoKSwgJHBhY2thZ2VMaXN0RmlsdGVyLCB0cnVlKSkgewokcGFja2FnZXNbJHR5cGVdWyRwYWNrYWdlLT5nZXROYW1lKCldID0gJHBhY2thZ2U7Cn0KfQp9Cn0KaWYgKCRyZXBvID09PSAkcGxhdGZvcm1SZXBvKSB7CmZvcmVhY2ggKCRwbGF0Zm9ybVJlcG8tPmdldERpc2FibGVkUGFja2FnZXMoKSBhcyAkbmFtZSA9PiAkcGFja2FnZSkgewokcGFja2FnZXNbJHR5cGVdWyRuYW1lXSA9ICRwYWNrYWdlOwp9Cn0KfQp9Cgokc2hvd0FsbFR5cGVzID0gJGlucHV0LT5nZXRPcHRpb24oJ2FsbCcpOwokc2hvd0xhdGVzdCA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdsYXRlc3QnKTsKJHNob3dNYWpvck9ubHkgPSAkaW5wdXQtPmdldE9wdGlvbignbWFqb3Itb25seScpOwokc2hvd01pbm9yT25seSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdtaW5vci1vbmx5Jyk7CiRzaG93UGF0Y2hPbmx5ID0gJGlucHV0LT5nZXRPcHRpb24oJ3BhdGNoLW9ubHknKTsKJGlnbm9yZWRQYWNrYWdlc1JlZ2V4ID0gQmFzZVBhY2thZ2U6OnBhY2thZ2VOYW1lc1RvUmVnZXhwKGFycmF5X21hcCgnc3RydG9sb3dlcicsICRpbnB1dC0+Z2V0T3B0aW9uKCdpZ25vcmUnKSkpOwokaW5kZW50ID0gJHNob3dBbGxUeXBlcyA/ICcgICcgOiAnJzsKCiRsYXRlc3RQYWNrYWdlcyA9IFtdOwokZXhpdENvZGUgPSAwOwokdmlld0RhdGEgPSBbXTsKJHZpZXdNZXRhRGF0YSA9IFtdOwoKJHdyaXRlVmVyc2lvbiA9IGZhbHNlOwokd3JpdGVEZXNjcmlwdGlvbiA9IGZhbHNlOwoKZm9yZWFjaCAoWydwbGF0Zm9ybScgPT4gdHJ1ZSwgJ2xvY2tlZCcgPT4gdHJ1ZSwgJ2F2YWlsYWJsZScgPT4gZmFsc2UsICdpbnN0YWxsZWQnID0+IHRydWVdIGFzICR0eXBlID0+ICRzaG93VmVyc2lvbikgewppZiAoaXNzZXQoJHBhY2thZ2VzWyR0eXBlXSkpIHsKa3NvcnQoJHBhY2thZ2VzWyR0eXBlXSk7CgokbmFtZUxlbmd0aCA9ICR2ZXJzaW9uTGVuZ3RoID0gJGxhdGVzdExlbmd0aCA9ICRyZWxlYXNlRGF0ZUxlbmd0aCA9IDA7CgppZiAoJHNob3dMYXRlc3QgJiYgJHNob3dWZXJzaW9uKSB7CmZvcmVhY2ggKCRwYWNrYWdlc1skdHlwZV0gYXMgJHBhY2thZ2UpIHsKaWYgKGlzX29iamVjdCgkcGFja2FnZSkgJiYgIVByZWc6OmlzTWF0Y2goJGlnbm9yZWRQYWNrYWdlc1JlZ2V4LCAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpKSkgewokbGF0ZXN0UGFja2FnZSA9ICR0aGlzLT5maW5kTGF0ZXN0UGFja2FnZSgkcGFja2FnZSwgJGNvbXBvc2VyLCAkcGxhdGZvcm1SZXBvLCAkc2hvd01ham9yT25seSwgJHNob3dNaW5vck9ubHksICRzaG93UGF0Y2hPbmx5LCAkcGxhdGZvcm1SZXFGaWx0ZXIpOwppZiAoJGxhdGVzdFBhY2thZ2UgPT09IG51bGwpIHsKY29udGludWU7Cn0KCiRsYXRlc3RQYWNrYWdlc1skcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpXSA9ICRsYXRlc3RQYWNrYWdlOwp9Cn0KfQoKJHdyaXRlUGF0aCA9ICEkaW5wdXQtPmdldE9wdGlvbignbmFtZS1vbmx5JykgJiYgJGlucHV0LT5nZXRPcHRpb24oJ3BhdGgnKTsKJHdyaXRlVmVyc2lvbiA9ICEkaW5wdXQtPmdldE9wdGlvbignbmFtZS1vbmx5JykgJiYgISRpbnB1dC0+Z2V0T3B0aW9uKCdwYXRoJykgJiYgJHNob3dWZXJzaW9uOwokd3JpdGVMYXRlc3QgPSAkd3JpdGVWZXJzaW9uICYmICRzaG93TGF0ZXN0Owokd3JpdGVEZXNjcmlwdGlvbiA9ICEkaW5wdXQtPmdldE9wdGlvbignbmFtZS1vbmx5JykgJiYgISRpbnB1dC0+Z2V0T3B0aW9uKCdwYXRoJyk7CiR3cml0ZVJlbGVhc2VEYXRlID0gJHdyaXRlTGF0ZXN0ICYmICgkaW5wdXQtPmdldE9wdGlvbignc29ydC1ieS1hZ2UnKSB8fCAkZm9ybWF0ID09PSAnanNvbicpOwoKJGhhc091dGRhdGVkUGFja2FnZXMgPSBmYWxzZTsKCmlmICgkaW5wdXQtPmdldE9wdGlvbignc29ydC1ieS1hZ2UnKSkgewp1c29ydCgkcGFja2FnZXNbJHR5cGVdLCBzdGF0aWMgZnVuY3Rpb24gKCRhLCAkYikgewppZiAoaXNfb2JqZWN0KCRhKSAmJiBpc19vYmplY3QoJGIpKSB7CnJldHVybiAkYS0+Z2V0UmVsZWFzZURhdGUoKSA8PT4gJGItPmdldFJlbGVhc2VEYXRlKCk7Cn0KCnJldHVybiAwOwp9KTsKfQoKJHZpZXdEYXRhWyR0eXBlXSA9IFtdOwpmb3JlYWNoICgkcGFja2FnZXNbJHR5cGVdIGFzICRwYWNrYWdlKSB7CiRwYWNrYWdlVmlld0RhdGEgPSBbXTsKaWYgKGlzX29iamVjdCgkcGFja2FnZSkpIHsKJGxhdGVzdFBhY2thZ2UgPSBudWxsOwppZiAoJHNob3dMYXRlc3QgJiYgaXNzZXQoJGxhdGVzdFBhY2thZ2VzWyRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCldKSkgewokbGF0ZXN0UGFja2FnZSA9ICRsYXRlc3RQYWNrYWdlc1skcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpXTsKfQoKCiRwYWNrYWdlSXNVcFRvRGF0ZSA9ICRsYXRlc3RQYWNrYWdlICYmICRsYXRlc3RQYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpID09PSAkcGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKSAmJiAoISRsYXRlc3RQYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlIHx8ICEkbGF0ZXN0UGFja2FnZS0+aXNBYmFuZG9uZWQoKSk7CgokcGFja2FnZUlzVXBUb0RhdGUgPSAkcGFja2FnZUlzVXBUb0RhdGUgfHwgKCRsYXRlc3RQYWNrYWdlID09PSBudWxsICYmICRzaG93TWFqb3JPbmx5KTsKJHBhY2thZ2VJc0lnbm9yZWQgPSBQcmVnOjppc01hdGNoKCRpZ25vcmVkUGFja2FnZXNSZWdleCwgJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKSk7CmlmICgkaW5wdXQtPmdldE9wdGlvbignb3V0ZGF0ZWQnKSAmJiAoJHBhY2thZ2VJc1VwVG9EYXRlIHx8ICRwYWNrYWdlSXNJZ25vcmVkKSkgewpjb250aW51ZTsKfQoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdvdXRkYXRlZCcpIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCdzdHJpY3QnKSkgewokaGFzT3V0ZGF0ZWRQYWNrYWdlcyA9IHRydWU7Cn0KCiRwYWNrYWdlVmlld0RhdGFbJ25hbWUnXSA9ICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCk7CiRwYWNrYWdlVmlld0RhdGFbJ2RpcmVjdC1kZXBlbmRlbmN5J10gPSBpbl9hcnJheSgkcGFja2FnZS0+Z2V0TmFtZSgpLCAkdGhpcy0+Z2V0Um9vdFJlcXVpcmVzKCksIHRydWUpOwppZiAoJGZvcm1hdCAhPT0gJ2pzb24nIHx8IHRydWUgIT09ICRpbnB1dC0+Z2V0T3B0aW9uKCduYW1lLW9ubHknKSkgewokcGFja2FnZVZpZXdEYXRhWydob21lcGFnZSddID0gJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgPyAkcGFja2FnZS0+Z2V0SG9tZXBhZ2UoKSA6IG51bGw7CiRwYWNrYWdlVmlld0RhdGFbJ3NvdXJjZSddID0gUGFja2FnZUluZm86OmdldFZpZXdTb3VyY2VVcmwoJHBhY2thZ2UpOwp9CiRuYW1lTGVuZ3RoID0gbWF4KCRuYW1lTGVuZ3RoLCBzdHJsZW4oJHBhY2thZ2VWaWV3RGF0YVsnbmFtZSddKSk7CmlmICgkd3JpdGVWZXJzaW9uKSB7CiRwYWNrYWdlVmlld0RhdGFbJ3ZlcnNpb24nXSA9ICRwYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpOwppZiAoJGZvcm1hdCA9PT0gJ3RleHQnKSB7CiRwYWNrYWdlVmlld0RhdGFbJ3ZlcnNpb24nXSA9IGx0cmltKCRwYWNrYWdlVmlld0RhdGFbJ3ZlcnNpb24nXSwgJ3YnKTsKfQokdmVyc2lvbkxlbmd0aCA9IG1heCgkdmVyc2lvbkxlbmd0aCwgc3RybGVuKCRwYWNrYWdlVmlld0RhdGFbJ3ZlcnNpb24nXSkpOwp9CmlmICgkd3JpdGVSZWxlYXNlRGF0ZSkgewppZiAoJHBhY2thZ2UtPmdldFJlbGVhc2VEYXRlKCkgIT09IG51bGwpIHsKJHBhY2thZ2VWaWV3RGF0YVsncmVsZWFzZS1hZ2UnXSA9IHN0cl9yZXBsYWNlKCcgYWdvJywgJyBvbGQnLCAkdGhpcy0+Z2V0UmVsYXRpdmVUaW1lKCRwYWNrYWdlLT5nZXRSZWxlYXNlRGF0ZSgpKSk7CmlmICghc3RyX2NvbnRhaW5zKCRwYWNrYWdlVmlld0RhdGFbJ3JlbGVhc2UtYWdlJ10sICcgb2xkJykpIHsKJHBhY2thZ2VWaWV3RGF0YVsncmVsZWFzZS1hZ2UnXSA9ICdmcm9tICcuJHBhY2thZ2VWaWV3RGF0YVsncmVsZWFzZS1hZ2UnXTsKfQokcmVsZWFzZURhdGVMZW5ndGggPSBtYXgoJHJlbGVhc2VEYXRlTGVuZ3RoLCBzdHJsZW4oJHBhY2thZ2VWaWV3RGF0YVsncmVsZWFzZS1hZ2UnXSkpOwokcGFja2FnZVZpZXdEYXRhWydyZWxlYXNlLWRhdGUnXSA9ICRwYWNrYWdlLT5nZXRSZWxlYXNlRGF0ZSgpLT5mb3JtYXQoRGF0ZVRpbWVJbnRlcmZhY2U6OkFUT00pOwp9IGVsc2UgewokcGFja2FnZVZpZXdEYXRhWydyZWxlYXNlLWFnZSddID0gJyc7CiRwYWNrYWdlVmlld0RhdGFbJ3JlbGVhc2UtZGF0ZSddID0gJyc7Cn0KfQppZiAoJHdyaXRlTGF0ZXN0ICYmICRsYXRlc3RQYWNrYWdlKSB7CiRwYWNrYWdlVmlld0RhdGFbJ2xhdGVzdCddID0gJGxhdGVzdFBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCk7CmlmICgkZm9ybWF0ID09PSAndGV4dCcpIHsKJHBhY2thZ2VWaWV3RGF0YVsnbGF0ZXN0J10gPSBsdHJpbSgkcGFja2FnZVZpZXdEYXRhWydsYXRlc3QnXSwgJ3YnKTsKfQokcGFja2FnZVZpZXdEYXRhWydsYXRlc3Qtc3RhdHVzJ10gPSAkdGhpcy0+Z2V0VXBkYXRlU3RhdHVzKCRsYXRlc3RQYWNrYWdlLCAkcGFja2FnZSk7CiRsYXRlc3RMZW5ndGggPSBtYXgoJGxhdGVzdExlbmd0aCwgc3RybGVuKCRwYWNrYWdlVmlld0RhdGFbJ2xhdGVzdCddKSk7CgppZiAoJGxhdGVzdFBhY2thZ2UtPmdldFJlbGVhc2VEYXRlKCkgIT09IG51bGwpIHsKJHBhY2thZ2VWaWV3RGF0YVsnbGF0ZXN0LXJlbGVhc2UtZGF0ZSddID0gJGxhdGVzdFBhY2thZ2UtPmdldFJlbGVhc2VEYXRlKCktPmZvcm1hdChEYXRlVGltZUludGVyZmFjZTo6QVRPTSk7Cn0gZWxzZSB7CiRwYWNrYWdlVmlld0RhdGFbJ2xhdGVzdC1yZWxlYXNlLWRhdGUnXSA9ICcnOwp9Cn0gZWxzZWlmICgkd3JpdGVMYXRlc3QpIHsKJHBhY2thZ2VWaWV3RGF0YVsnbGF0ZXN0J10gPSAnW25vbmUgbWF0Y2hlZF0nOwokcGFja2FnZVZpZXdEYXRhWydsYXRlc3Qtc3RhdHVzJ10gPSAndXAtdG8tZGF0ZSc7CiRsYXRlc3RMZW5ndGggPSBtYXgoJGxhdGVzdExlbmd0aCwgc3RybGVuKCRwYWNrYWdlVmlld0RhdGFbJ2xhdGVzdCddKSk7Cn0KaWYgKCR3cml0ZURlc2NyaXB0aW9uICYmICRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlKSB7CiRwYWNrYWdlVmlld0RhdGFbJ2Rlc2NyaXB0aW9uJ10gPSAkcGFja2FnZS0+Z2V0RGVzY3JpcHRpb24oKTsKfQppZiAoJHdyaXRlUGF0aCkgewokcGF0aCA9ICRjb21wb3Nlci0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CmlmIChpc19zdHJpbmcoJHBhdGgpKSB7CiRwYWNrYWdlVmlld0RhdGFbJ3BhdGgnXSA9IHN0cnRvayhyZWFscGF0aCgkcGF0aCksICJcclxuIik7Cn0gZWxzZSB7CiRwYWNrYWdlVmlld0RhdGFbJ3BhdGgnXSA9IG51bGw7Cn0KfQoKJHBhY2thZ2VJc0FiYW5kb25lZCA9IGZhbHNlOwppZiAoJGxhdGVzdFBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJiYgJGxhdGVzdFBhY2thZ2UtPmlzQWJhbmRvbmVkKCkpIHsKJHJlcGxhY2VtZW50UGFja2FnZU5hbWUgPSAkbGF0ZXN0UGFja2FnZS0+Z2V0UmVwbGFjZW1lbnRQYWNrYWdlKCk7CiRyZXBsYWNlbWVudCA9ICRyZXBsYWNlbWVudFBhY2thZ2VOYW1lICE9PSBudWxsCj8gJ1VzZSAnIC4gJGxhdGVzdFBhY2thZ2UtPmdldFJlcGxhY2VtZW50UGFja2FnZSgpIC4gJyBpbnN0ZWFkJwo6ICdObyByZXBsYWNlbWVudCB3YXMgc3VnZ2VzdGVkJzsKJHBhY2thZ2VXYXJuaW5nID0gc3ByaW50ZigKJ1BhY2thZ2UgJXMgaXMgYWJhbmRvbmVkLCB5b3Ugc2hvdWxkIGF2b2lkIHVzaW5nIGl0LiAlcy4nLAokcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLAokcmVwbGFjZW1lbnQKKTsKJHBhY2thZ2VWaWV3RGF0YVsnd2FybmluZyddID0gJHBhY2thZ2VXYXJuaW5nOwokcGFja2FnZUlzQWJhbmRvbmVkID0gJHJlcGxhY2VtZW50UGFja2FnZU5hbWUgPz8gdHJ1ZTsKfQoKJHBhY2thZ2VWaWV3RGF0YVsnYWJhbmRvbmVkJ10gPSAkcGFja2FnZUlzQWJhbmRvbmVkOwp9IGVsc2UgewokcGFja2FnZVZpZXdEYXRhWyduYW1lJ10gPSAkcGFja2FnZTsKJG5hbWVMZW5ndGggPSBtYXgoJG5hbWVMZW5ndGgsIHN0cmxlbigkcGFja2FnZSkpOwp9CiR2aWV3RGF0YVskdHlwZV1bXSA9ICRwYWNrYWdlVmlld0RhdGE7Cn0KJHZpZXdNZXRhRGF0YVskdHlwZV0gPSBbCiduYW1lTGVuZ3RoJyA9PiAkbmFtZUxlbmd0aCwKJ3ZlcnNpb25MZW5ndGgnID0+ICR2ZXJzaW9uTGVuZ3RoLAonbGF0ZXN0TGVuZ3RoJyA9PiAkbGF0ZXN0TGVuZ3RoLAoncmVsZWFzZURhdGVMZW5ndGgnID0+ICRyZWxlYXNlRGF0ZUxlbmd0aCwKJ3dyaXRlTGF0ZXN0JyA9PiAkd3JpdGVMYXRlc3QsCid3cml0ZVJlbGVhc2VEYXRlJyA9PiAkd3JpdGVSZWxlYXNlRGF0ZSwKXTsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdzdHJpY3QnKSAmJiAkaGFzT3V0ZGF0ZWRQYWNrYWdlcykgewokZXhpdENvZGUgPSAxOwpicmVhazsKfQp9Cn0KCmlmICgnanNvbicgPT09ICRmb3JtYXQpIHsKJGlvLT53cml0ZShKc29uRmlsZTo6ZW5jb2RlKCR2aWV3RGF0YSkpOwp9IGVsc2UgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2xhdGVzdCcpICYmIGFycmF5X2ZpbHRlcigkdmlld0RhdGEpKSB7CmlmICghJGlvLT5pc0RlY29yYXRlZCgpKSB7CiRpby0+d3JpdGVFcnJvcignTGVnZW5kOicpOwokaW8tPndyaXRlRXJyb3IoJyEgcGF0Y2ggb3IgbWlub3IgcmVsZWFzZSBhdmFpbGFibGUgLSB1cGRhdGUgcmVjb21tZW5kZWQnKTsKJGlvLT53cml0ZUVycm9yKCd+IG1ham9yIHJlbGVhc2UgYXZhaWxhYmxlIC0gdXBkYXRlIHBvc3NpYmxlJyk7CmlmICghJGlucHV0LT5nZXRPcHRpb24oJ291dGRhdGVkJykpIHsKJGlvLT53cml0ZUVycm9yKCc9IHVwIHRvIGRhdGUgdmVyc2lvbicpOwp9Cn0gZWxzZSB7CiRpby0+d3JpdGVFcnJvcignPGluZm8+Q29sb3IgbGVnZW5kOjwvaW5mbz4nKTsKJGlvLT53cml0ZUVycm9yKCctIDxoaWdobGlnaHQ+cGF0Y2ggb3IgbWlub3I8L2hpZ2hsaWdodD4gcmVsZWFzZSBhdmFpbGFibGUgLSB1cGRhdGUgcmVjb21tZW5kZWQnKTsKJGlvLT53cml0ZUVycm9yKCctIDxjb21tZW50Pm1ham9yPC9jb21tZW50PiByZWxlYXNlIGF2YWlsYWJsZSAtIHVwZGF0ZSBwb3NzaWJsZScpOwppZiAoISRpbnB1dC0+Z2V0T3B0aW9uKCdvdXRkYXRlZCcpKSB7CiRpby0+d3JpdGVFcnJvcignLSA8aW5mbz51cCB0byBkYXRlPC9pbmZvPiB2ZXJzaW9uJyk7Cn0KfQp9Cgokd2lkdGggPSAkdGhpcy0+Z2V0VGVybWluYWxXaWR0aCgpOwoKZm9yZWFjaCAoJHZpZXdEYXRhIGFzICR0eXBlID0+ICRwYWNrYWdlcykgewokbmFtZUxlbmd0aCA9ICR2aWV3TWV0YURhdGFbJHR5cGVdWyduYW1lTGVuZ3RoJ107CiR2ZXJzaW9uTGVuZ3RoID0gJHZpZXdNZXRhRGF0YVskdHlwZV1bJ3ZlcnNpb25MZW5ndGgnXTsKJGxhdGVzdExlbmd0aCA9ICR2aWV3TWV0YURhdGFbJHR5cGVdWydsYXRlc3RMZW5ndGgnXTsKJHJlbGVhc2VEYXRlTGVuZ3RoID0gJHZpZXdNZXRhRGF0YVskdHlwZV1bJ3JlbGVhc2VEYXRlTGVuZ3RoJ107CiR3cml0ZUxhdGVzdCA9ICR2aWV3TWV0YURhdGFbJHR5cGVdWyd3cml0ZUxhdGVzdCddOwokd3JpdGVSZWxlYXNlRGF0ZSA9ICR2aWV3TWV0YURhdGFbJHR5cGVdWyd3cml0ZVJlbGVhc2VEYXRlJ107CgokdmVyc2lvbkZpdHMgPSAkbmFtZUxlbmd0aCArICR2ZXJzaW9uTGVuZ3RoICsgMyA8PSAkd2lkdGg7CiRsYXRlc3RGaXRzID0gJG5hbWVMZW5ndGggKyAkdmVyc2lvbkxlbmd0aCArICRsYXRlc3RMZW5ndGggKyAzIDw9ICR3aWR0aDsKJHJlbGVhc2VEYXRlRml0cyA9ICRuYW1lTGVuZ3RoICsgJHZlcnNpb25MZW5ndGggKyAkbGF0ZXN0TGVuZ3RoICsgJHJlbGVhc2VEYXRlTGVuZ3RoICsgMyA8PSAkd2lkdGg7CiRkZXNjcmlwdGlvbkZpdHMgPSAkbmFtZUxlbmd0aCArICR2ZXJzaW9uTGVuZ3RoICsgJGxhdGVzdExlbmd0aCArICRyZWxlYXNlRGF0ZUxlbmd0aCArIDI0IDw9ICR3aWR0aDsKCmlmICgkbGF0ZXN0Rml0cyAmJiAhJGlvLT5pc0RlY29yYXRlZCgpKSB7CiRsYXRlc3RMZW5ndGggKz0gMjsKfQoKaWYgKCRzaG93QWxsVHlwZXMpIHsKaWYgKCdhdmFpbGFibGUnID09PSAkdHlwZSkgewokaW8tPndyaXRlKCc8Y29tbWVudD4nIC4gJHR5cGUgLiAnPC9jb21tZW50PjonKTsKfSBlbHNlIHsKJGlvLT53cml0ZSgnPGluZm8+JyAuICR0eXBlIC4gJzwvaW5mbz46Jyk7Cn0KfQoKaWYgKCR3cml0ZUxhdGVzdCAmJiAhJGlucHV0LT5nZXRPcHRpb24oJ2RpcmVjdCcpKSB7CiRkaXJlY3REZXBzID0gW107CiR0cmFuc2l0aXZlRGVwcyA9IFtdOwpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBrZykgewppZiAoJHBrZ1snZGlyZWN0LWRlcGVuZGVuY3knXSA/PyBmYWxzZSkgewokZGlyZWN0RGVwc1tdID0gJHBrZzsKfSBlbHNlIHsKJHRyYW5zaXRpdmVEZXBzW10gPSAkcGtnOwp9Cn0KCiRpby0+d3JpdGVFcnJvcignJyk7CiRpby0+d3JpdGVFcnJvcignPGluZm8+RGlyZWN0IGRlcGVuZGVuY2llcyByZXF1aXJlZCBpbiBjb21wb3Nlci5qc29uOjwvPicpOwppZiAoXGNvdW50KCRkaXJlY3REZXBzKSA+IDApIHsKJHRoaXMtPnByaW50UGFja2FnZXMoJGlvLCAkZGlyZWN0RGVwcywgJGluZGVudCwgJHdyaXRlVmVyc2lvbiAmJiAkdmVyc2lvbkZpdHMsICRsYXRlc3RGaXRzLCAkd3JpdGVEZXNjcmlwdGlvbiAmJiAkZGVzY3JpcHRpb25GaXRzLCAkd2lkdGgsICR2ZXJzaW9uTGVuZ3RoLCAkbmFtZUxlbmd0aCwgJGxhdGVzdExlbmd0aCwgJHdyaXRlUmVsZWFzZURhdGUgJiYgJHJlbGVhc2VEYXRlRml0cywgJHJlbGVhc2VEYXRlTGVuZ3RoKTsKfSBlbHNlIHsKJGlvLT53cml0ZUVycm9yKCdFdmVyeXRoaW5nIHVwIHRvIGRhdGUnKTsKfQokaW8tPndyaXRlRXJyb3IoJycpOwokaW8tPndyaXRlRXJyb3IoJzxpbmZvPlRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIG5vdCByZXF1aXJlZCBpbiBjb21wb3Nlci5qc29uOjwvPicpOwppZiAoXGNvdW50KCR0cmFuc2l0aXZlRGVwcykgPiAwKSB7CiR0aGlzLT5wcmludFBhY2thZ2VzKCRpbywgJHRyYW5zaXRpdmVEZXBzLCAkaW5kZW50LCAkd3JpdGVWZXJzaW9uICYmICR2ZXJzaW9uRml0cywgJGxhdGVzdEZpdHMsICR3cml0ZURlc2NyaXB0aW9uICYmICRkZXNjcmlwdGlvbkZpdHMsICR3aWR0aCwgJHZlcnNpb25MZW5ndGgsICRuYW1lTGVuZ3RoLCAkbGF0ZXN0TGVuZ3RoLCAkd3JpdGVSZWxlYXNlRGF0ZSAmJiAkcmVsZWFzZURhdGVGaXRzLCAkcmVsZWFzZURhdGVMZW5ndGgpOwp9IGVsc2UgewokaW8tPndyaXRlRXJyb3IoJ0V2ZXJ5dGhpbmcgdXAgdG8gZGF0ZScpOwp9Cn0gZWxzZSB7CmlmICgkd3JpdGVMYXRlc3QgJiYgXGNvdW50KCRwYWNrYWdlcykgPT09IDApIHsKJGlvLT53cml0ZUVycm9yKCdBbGwgeW91ciBkaXJlY3QgZGVwZW5kZW5jaWVzIGFyZSB1cCB0byBkYXRlJyk7Cn0gZWxzZSB7CiR0aGlzLT5wcmludFBhY2thZ2VzKCRpbywgJHBhY2thZ2VzLCAkaW5kZW50LCAkd3JpdGVWZXJzaW9uICYmICR2ZXJzaW9uRml0cywgJHdyaXRlTGF0ZXN0ICYmICRsYXRlc3RGaXRzLCAkd3JpdGVEZXNjcmlwdGlvbiAmJiAkZGVzY3JpcHRpb25GaXRzLCAkd2lkdGgsICR2ZXJzaW9uTGVuZ3RoLCAkbmFtZUxlbmd0aCwgJGxhdGVzdExlbmd0aCwgJHdyaXRlUmVsZWFzZURhdGUgJiYgJHJlbGVhc2VEYXRlRml0cywgJHJlbGVhc2VEYXRlTGVuZ3RoKTsKfQp9CgppZiAoJHNob3dBbGxUeXBlcykgewokaW8tPndyaXRlKCcnKTsKfQp9Cn0KCnJldHVybiAkZXhpdENvZGU7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcHJpbnRQYWNrYWdlcyhJT0ludGVyZmFjZSAkaW8sIGFycmF5ICRwYWNrYWdlcywgc3RyaW5nICRpbmRlbnQsIGJvb2wgJHdyaXRlVmVyc2lvbiwgYm9vbCAkd3JpdGVMYXRlc3QsIGJvb2wgJHdyaXRlRGVzY3JpcHRpb24sIGludCAkd2lkdGgsIGludCAkdmVyc2lvbkxlbmd0aCwgaW50ICRuYW1lTGVuZ3RoLCBpbnQgJGxhdGVzdExlbmd0aCwgYm9vbCAkd3JpdGVSZWxlYXNlRGF0ZSwgaW50ICRyZWxlYXNlRGF0ZUxlbmd0aCk6IHZvaWQKewokcGFkTmFtZSA9ICR3cml0ZVZlcnNpb24gfHwgJHdyaXRlTGF0ZXN0IHx8ICR3cml0ZVJlbGVhc2VEYXRlIHx8ICR3cml0ZURlc2NyaXB0aW9uOwokcGFkVmVyc2lvbiA9ICR3cml0ZUxhdGVzdCB8fCAkd3JpdGVSZWxlYXNlRGF0ZSB8fCAkd3JpdGVEZXNjcmlwdGlvbjsKJHBhZExhdGVzdCA9ICR3cml0ZURlc2NyaXB0aW9uIHx8ICR3cml0ZVJlbGVhc2VEYXRlOwokcGFkUmVsZWFzZURhdGUgPSAkd3JpdGVEZXNjcmlwdGlvbjsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRsaW5rID0gJHBhY2thZ2VbJ3NvdXJjZSddID8/ICRwYWNrYWdlWydob21lcGFnZSddID8/ICcnOwppZiAoJGxpbmsgIT09ICcnKSB7CiRpby0+d3JpdGUoJGluZGVudCAuICc8aHJlZj0nLk91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCRsaW5rKS4nPicuJHBhY2thZ2VbJ25hbWUnXS4nPC8+Jy4gc3RyX3JlcGVhdCgnICcsICgkcGFkTmFtZSA/ICRuYW1lTGVuZ3RoIC0gc3RybGVuKCRwYWNrYWdlWyduYW1lJ10pIDogMCkpLCBmYWxzZSk7Cn0gZWxzZSB7CiRpby0+d3JpdGUoJGluZGVudCAuIHN0cl9wYWQoJHBhY2thZ2VbJ25hbWUnXSwgKCRwYWROYW1lID8gJG5hbWVMZW5ndGggOiAwKSwgJyAnKSwgZmFsc2UpOwp9CmlmIChpc3NldCgkcGFja2FnZVsndmVyc2lvbiddKSAmJiAkd3JpdGVWZXJzaW9uKSB7CiRpby0+d3JpdGUoJyAnIC4gc3RyX3BhZCgkcGFja2FnZVsndmVyc2lvbiddLCAoJHBhZFZlcnNpb24gPyAkdmVyc2lvbkxlbmd0aCA6IDApLCAnICcpLCBmYWxzZSk7Cn0KaWYgKGlzc2V0KCRwYWNrYWdlWydsYXRlc3QnXSkgJiYgaXNzZXQoJHBhY2thZ2VbJ2xhdGVzdC1zdGF0dXMnXSkgJiYgJHdyaXRlTGF0ZXN0KSB7CiRsYXRlc3RWZXJzaW9uID0gJHBhY2thZ2VbJ2xhdGVzdCddOwokdXBkYXRlU3RhdHVzID0gJHBhY2thZ2VbJ2xhdGVzdC1zdGF0dXMnXTsKJHN0eWxlID0gJHRoaXMtPnVwZGF0ZVN0YXR1c1RvVmVyc2lvblN0eWxlKCR1cGRhdGVTdGF0dXMpOwppZiAoISRpby0+aXNEZWNvcmF0ZWQoKSkgewokbGF0ZXN0VmVyc2lvbiA9IHN0cl9yZXBsYWNlKFsndXAtdG8tZGF0ZScsICdzZW12ZXItc2FmZS11cGRhdGUnLCAndXBkYXRlLXBvc3NpYmxlJ10sIFsnPScsICchJywgJ34nXSwgJHVwZGF0ZVN0YXR1cykgLiAnICcgLiAkbGF0ZXN0VmVyc2lvbjsKfQokaW8tPndyaXRlKCcgPCcgLiAkc3R5bGUgLiAnPicgLiBzdHJfcGFkKCRsYXRlc3RWZXJzaW9uLCAoJHBhZExhdGVzdCA/ICRsYXRlc3RMZW5ndGggOiAwKSwgJyAnKSAuICc8LycgLiAkc3R5bGUgLiAnPicsIGZhbHNlKTsKaWYgKCR3cml0ZVJlbGVhc2VEYXRlICYmIGlzc2V0KCRwYWNrYWdlWydyZWxlYXNlLWFnZSddKSkgewokaW8tPndyaXRlKCcgJy5zdHJfcGFkKCRwYWNrYWdlWydyZWxlYXNlLWFnZSddLCAoJHBhZFJlbGVhc2VEYXRlID8gJHJlbGVhc2VEYXRlTGVuZ3RoIDogMCksICcgJyksIGZhbHNlKTsKfQp9CmlmIChpc3NldCgkcGFja2FnZVsnZGVzY3JpcHRpb24nXSkgJiYgJHdyaXRlRGVzY3JpcHRpb24pIHsKJGRlc2NyaXB0aW9uID0gKHN0cmluZykgc3RydG9rKCRwYWNrYWdlWydkZXNjcmlwdGlvbiddLCAiXHJcbiIpOwoKCiRyZW1haW5pbmcgPSAkd2lkdGggLSAkbmFtZUxlbmd0aCAtICR2ZXJzaW9uTGVuZ3RoIC0gJHJlbGVhc2VEYXRlTGVuZ3RoIC0gNDsKaWYgKCR3cml0ZUxhdGVzdCkgewokcmVtYWluaW5nIC09ICRsYXRlc3RMZW5ndGg7Cn0KCgppZiAoJHJlbWFpbmluZyA8PSAwKSB7CiRkZXNjcmlwdGlvbiA9ICcnOwp9IGVsc2VpZiAoZXh0ZW5zaW9uX2xvYWRlZCgnbWJzdHJpbmcnKSkgewoKCgppZiAobWJfc3Ryd2lkdGgoJGRlc2NyaXB0aW9uLCAnVVRGLTgnKSA+ICRyZW1haW5pbmcpIHsKJGRlc2NyaXB0aW9uID0gbWJfc3RyaW13aWR0aCgkZGVzY3JpcHRpb24sIDAsICRyZW1haW5pbmcsICcuLi4nLCAnVVRGLTgnKTsKfQp9IGVsc2UgewoKCiRjdXQgPSBtYXgoMCwgJHJlbWFpbmluZyAtIDMpOwppZiAoc3RybGVuKCRkZXNjcmlwdGlvbikgPiAkY3V0KSB7CiRkZXNjcmlwdGlvbiA9IHN1YnN0cigkZGVzY3JpcHRpb24sIDAsICRjdXQpIC4gJy4uLic7Cn0KfQoKJGlvLT53cml0ZSgnICcgLiAkZGVzY3JpcHRpb24sIGZhbHNlKTsKfQppZiAoYXJyYXlfa2V5X2V4aXN0cygncGF0aCcsICRwYWNrYWdlKSkgewokaW8tPndyaXRlKCcgJy4oaXNfc3RyaW5nKCRwYWNrYWdlWydwYXRoJ10pID8gJHBhY2thZ2VbJ3BhdGgnXSA6ICdudWxsJyksIGZhbHNlKTsKfQokaW8tPndyaXRlKCcnKTsKaWYgKGlzc2V0KCRwYWNrYWdlWyd3YXJuaW5nJ10pKSB7CiRpby0+d3JpdGUoJzx3YXJuaW5nPicgLiAkcGFja2FnZVsnd2FybmluZyddIC4gJzwvd2FybmluZz4nKTsKfQp9Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRSb290UmVxdWlyZXMoKTogYXJyYXkKewokY29tcG9zZXIgPSAkdGhpcy0+dHJ5Q29tcG9zZXIoKTsKaWYgKCRjb21wb3NlciA9PT0gbnVsbCkgewpyZXR1cm4gW107Cn0KCiRyb290UGFja2FnZSA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpOwoKcmV0dXJuIGFycmF5X21hcCgKJ3N0cnRvbG93ZXInLAphcnJheV9rZXlzKGFycmF5X21lcmdlKCRyb290UGFja2FnZS0+Z2V0UmVxdWlyZXMoKSwgJHJvb3RQYWNrYWdlLT5nZXREZXZSZXF1aXJlcygpKSkKKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFZlcnNpb25TdHlsZShQYWNrYWdlSW50ZXJmYWNlICRsYXRlc3RQYWNrYWdlLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CnJldHVybiAkdGhpcy0+dXBkYXRlU3RhdHVzVG9WZXJzaW9uU3R5bGUoJHRoaXMtPmdldFVwZGF0ZVN0YXR1cygkbGF0ZXN0UGFja2FnZSwgJHBhY2thZ2UpKTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRQYWNrYWdlKEluc3RhbGxlZFJlcG9zaXRvcnkgJGluc3RhbGxlZFJlcG8sIFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG9zLCBzdHJpbmcgJG5hbWUsICR2ZXJzaW9uID0gbnVsbCk6IGFycmF5CnsKJG5hbWUgPSBzdHJ0b2xvd2VyKCRuYW1lKTsKJGNvbnN0cmFpbnQgPSBpc19zdHJpbmcoJHZlcnNpb24pID8gJHRoaXMtPnZlcnNpb25QYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJHZlcnNpb24pIDogJHZlcnNpb247CgokcG9saWN5ID0gbmV3IERlZmF1bHRQb2xpY3koKTsKJHJlcG9zaXRvcnlTZXQgPSBuZXcgUmVwb3NpdG9yeVNldCgnZGV2Jyk7CiRyZXBvc2l0b3J5U2V0LT5hbGxvd0luc3RhbGxlZFJlcG9zaXRvcmllcygpOwokcmVwb3NpdG9yeVNldC0+YWRkUmVwb3NpdG9yeSgkcmVwb3MpOwoKJG1hdGNoZWRQYWNrYWdlID0gbnVsbDsKJHZlcnNpb25zID0gW107CmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRuYW1lKSkgewokcG9vbCA9ICRyZXBvc2l0b3J5U2V0LT5jcmVhdGVQb29sV2l0aEFsbFBhY2thZ2VzKCk7Cn0gZWxzZSB7CiRwb29sID0gJHJlcG9zaXRvcnlTZXQtPmNyZWF0ZVBvb2xGb3JQYWNrYWdlKCRuYW1lKTsKfQokbWF0Y2hlcyA9ICRwb29sLT53aGF0UHJvdmlkZXMoJG5hbWUsICRjb25zdHJhaW50KTsKJGxpdGVyYWxzID0gW107CmZvcmVhY2ggKCRtYXRjaGVzIGFzICRwYWNrYWdlKSB7CgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UgJiYgJHBhY2thZ2UtPmdldFZlcnNpb24oKSA9PT0gVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVMpIHsKJHBhY2thZ2UgPSAkcGFja2FnZS0+Z2V0QWxpYXNPZigpOwp9CgoKaWYgKG51bGwgPT09ICR2ZXJzaW9uICYmICRpbnN0YWxsZWRSZXBvLT5oYXNQYWNrYWdlKCRwYWNrYWdlKSkgewokbWF0Y2hlZFBhY2thZ2UgPSAkcGFja2FnZTsKfQoKJHZlcnNpb25zWyRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCldID0gJHBhY2thZ2UtPmdldFZlcnNpb24oKTsKJGxpdGVyYWxzW10gPSAkcGFja2FnZS0+Z2V0SWQoKTsKfQoKCmlmIChudWxsID09PSAkbWF0Y2hlZFBhY2thZ2UgJiYgXGNvdW50KCRsaXRlcmFscykgPiAwKSB7CiRwcmVmZXJyZWQgPSAkcG9saWN5LT5zZWxlY3RQcmVmZXJyZWRQYWNrYWdlcygkcG9vbCwgJGxpdGVyYWxzKTsKJG1hdGNoZWRQYWNrYWdlID0gJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJHByZWZlcnJlZFswXSk7Cn0KCmlmICgkbWF0Y2hlZFBhY2thZ2UgIT09IG51bGwgJiYgISRtYXRjaGVkUGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdTaG93Q29tbWFuZDo6Z2V0UGFja2FnZSBjYW4gb25seSB3b3JrIHdpdGggQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlLCBidXQgZ290ICcuZ2V0X2NsYXNzKCRtYXRjaGVkUGFja2FnZSkpOwp9CgpyZXR1cm4gWyRtYXRjaGVkUGFja2FnZSwgJHZlcnNpb25zXTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJpbnRQYWNrYWdlSW5mbyhDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIGFycmF5ICR2ZXJzaW9ucywgSW5zdGFsbGVkUmVwb3NpdG9yeSAkaW5zdGFsbGVkUmVwbywgP1BhY2thZ2VJbnRlcmZhY2UgJGxhdGVzdFBhY2thZ2UgPSBudWxsKTogdm9pZAp7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwoKJHRoaXMtPnByaW50TWV0YSgkcGFja2FnZSwgJHZlcnNpb25zLCAkaW5zdGFsbGVkUmVwbywgJGxhdGVzdFBhY2thZ2UgPzogbnVsbCk7CiR0aGlzLT5wcmludExpbmtzKCRwYWNrYWdlLCBMaW5rOjpUWVBFX1JFUVVJUkUpOwokdGhpcy0+cHJpbnRMaW5rcygkcGFja2FnZSwgTGluazo6VFlQRV9ERVZfUkVRVUlSRSwgJ3JlcXVpcmVzIChkZXYpJyk7CgppZiAoJHBhY2thZ2UtPmdldFN1Z2dlc3RzKCkpIHsKJGlvLT53cml0ZSgiXG48aW5mbz5zdWdnZXN0czwvaW5mbz4iKTsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFN1Z2dlc3RzKCkgYXMgJHN1Z2dlc3RlZCA9PiAkcmVhc29uKSB7CiRpby0+d3JpdGUoJHN1Z2dlc3RlZCAuICcgPGNvbW1lbnQ+JyAuICRyZWFzb24gLiAnPC9jb21tZW50PicpOwp9Cn0KCiR0aGlzLT5wcmludExpbmtzKCRwYWNrYWdlLCBMaW5rOjpUWVBFX1BST1ZJREUpOwokdGhpcy0+cHJpbnRMaW5rcygkcGFja2FnZSwgTGluazo6VFlQRV9DT05GTElDVCk7CiR0aGlzLT5wcmludExpbmtzKCRwYWNrYWdlLCBMaW5rOjpUWVBFX1JFUExBQ0UpOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwcmludE1ldGEoQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBhcnJheSAkdmVyc2lvbnMsIEluc3RhbGxlZFJlcG9zaXRvcnkgJGluc3RhbGxlZFJlcG8sID9QYWNrYWdlSW50ZXJmYWNlICRsYXRlc3RQYWNrYWdlID0gbnVsbCk6IHZvaWQKewokaXNJbnN0YWxsZWRQYWNrYWdlID0gIVBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJHBhY2thZ2UtPmdldE5hbWUoKSkgJiYgJGluc3RhbGxlZFJlcG8tPmhhc1BhY2thZ2UoJHBhY2thZ2UpOwoKJGlvID0gJHRoaXMtPmdldElPKCk7CiRpby0+d3JpdGUoJzxpbmZvPm5hbWU8L2luZm8+ICAgICA6ICcgLiAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpKTsKJGlvLT53cml0ZSgnPGluZm8+ZGVzY3JpcC48L2luZm8+IDogJyAuICRwYWNrYWdlLT5nZXREZXNjcmlwdGlvbigpKTsKJGlvLT53cml0ZSgnPGluZm8+a2V5d29yZHM8L2luZm8+IDogJyAuIGltcGxvZGUoJywgJywgJHBhY2thZ2UtPmdldEtleXdvcmRzKCkgPzogW10pKTsKJHRoaXMtPnByaW50VmVyc2lvbnMoJHBhY2thZ2UsICR2ZXJzaW9ucywgJGluc3RhbGxlZFJlcG8pOwppZiAoJGlzSW5zdGFsbGVkUGFja2FnZSAmJiAkcGFja2FnZS0+Z2V0UmVsZWFzZURhdGUoKSAhPT0gbnVsbCkgewokaW8tPndyaXRlKCc8aW5mbz5yZWxlYXNlZDwvaW5mbz4gOiAnIC4gJHBhY2thZ2UtPmdldFJlbGVhc2VEYXRlKCktPmZvcm1hdCgnWS1tLWQnKSAuICcsICcgLiAkdGhpcy0+Z2V0UmVsYXRpdmVUaW1lKCRwYWNrYWdlLT5nZXRSZWxlYXNlRGF0ZSgpKSk7Cn0KaWYgKCRsYXRlc3RQYWNrYWdlKSB7CiRzdHlsZSA9ICR0aGlzLT5nZXRWZXJzaW9uU3R5bGUoJGxhdGVzdFBhY2thZ2UsICRwYWNrYWdlKTsKJHJlbGVhc2VkVGltZSA9ICRsYXRlc3RQYWNrYWdlLT5nZXRSZWxlYXNlRGF0ZSgpID09PSBudWxsID8gJycgOiAnIHJlbGVhc2VkICcgLiAkbGF0ZXN0UGFja2FnZS0+Z2V0UmVsZWFzZURhdGUoKS0+Zm9ybWF0KCdZLW0tZCcpIC4gJywgJyAuICR0aGlzLT5nZXRSZWxhdGl2ZVRpbWUoJGxhdGVzdFBhY2thZ2UtPmdldFJlbGVhc2VEYXRlKCkpOwokaW8tPndyaXRlKCc8aW5mbz5sYXRlc3Q8L2luZm8+ICAgOiA8Jy4kc3R5bGUuJz4nIC4gJGxhdGVzdFBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKSAuICc8LycuJHN0eWxlLic+JyAuICRyZWxlYXNlZFRpbWUpOwp9IGVsc2UgewokbGF0ZXN0UGFja2FnZSA9ICRwYWNrYWdlOwp9CiRpby0+d3JpdGUoJzxpbmZvPnR5cGU8L2luZm8+ICAgICA6ICcgLiAkcGFja2FnZS0+Z2V0VHlwZSgpKTsKJHRoaXMtPnByaW50TGljZW5zZXMoJHBhY2thZ2UpOwokaW8tPndyaXRlKCc8aW5mbz5ob21lcGFnZTwvaW5mbz4gOiAnIC4gJHBhY2thZ2UtPmdldEhvbWVwYWdlKCkpOwokaW8tPndyaXRlKCc8aW5mbz5zb3VyY2U8L2luZm8+ICAgOiAnIC4gc3ByaW50ZignWyVzXSA8Y29tbWVudD4lczwvY29tbWVudD4gJXMnLCAkcGFja2FnZS0+Z2V0U291cmNlVHlwZSgpLCAkcGFja2FnZS0+Z2V0U291cmNlVXJsKCksICRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKSkpOwokaW8tPndyaXRlKCc8aW5mbz5kaXN0PC9pbmZvPiAgICAgOiAnIC4gc3ByaW50ZignWyVzXSA8Y29tbWVudD4lczwvY29tbWVudD4gJXMnLCAkcGFja2FnZS0+Z2V0RGlzdFR5cGUoKSwgJHBhY2thZ2UtPmdldERpc3RVcmwoKSwgJHBhY2thZ2UtPmdldERpc3RSZWZlcmVuY2UoKSkpOwppZiAoJGlzSW5zdGFsbGVkUGFja2FnZSkgewokcGF0aCA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKS0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CmlmIChpc19zdHJpbmcoJHBhdGgpKSB7CiRpby0+d3JpdGUoJzxpbmZvPnBhdGg8L2luZm8+ICAgICA6ICcgLiByZWFscGF0aCgkcGF0aCkpOwp9IGVsc2UgewokaW8tPndyaXRlKCc8aW5mbz5wYXRoPC9pbmZvPiAgICAgOiBudWxsJyk7Cn0KfQokaW8tPndyaXRlKCc8aW5mbz5uYW1lczwvaW5mbz4gICAgOiAnIC4gaW1wbG9kZSgnLCAnLCAkcGFja2FnZS0+Z2V0TmFtZXMoKSkpOwoKaWYgKCRsYXRlc3RQYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICYmICRsYXRlc3RQYWNrYWdlLT5pc0FiYW5kb25lZCgpKSB7CiRyZXBsYWNlbWVudCA9ICgkbGF0ZXN0UGFja2FnZS0+Z2V0UmVwbGFjZW1lbnRQYWNrYWdlKCkgIT09IG51bGwpCj8gJyBUaGUgYXV0aG9yIHN1Z2dlc3RzIHVzaW5nIHRoZSAnIC4gJGxhdGVzdFBhY2thZ2UtPmdldFJlcGxhY2VtZW50UGFja2FnZSgpLiAnIHBhY2thZ2UgaW5zdGVhZC4nCjogbnVsbDsKCiRpby0+d3JpdGVFcnJvcigKc3ByaW50ZignPHdhcm5pbmc+QXR0ZW50aW9uOiBUaGlzIHBhY2thZ2UgaXMgYWJhbmRvbmVkIGFuZCBubyBsb25nZXIgbWFpbnRhaW5lZC4lczwvd2FybmluZz4nLCAkcmVwbGFjZW1lbnQpCik7Cn0KCmlmICgkcGFja2FnZS0+Z2V0U3VwcG9ydCgpKSB7CiRpby0+d3JpdGUoIlxuPGluZm8+c3VwcG9ydDwvaW5mbz4iKTsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFN1cHBvcnQoKSBhcyAkdHlwZSA9PiAkdmFsdWUpIHsKJGlvLT53cml0ZSgnPGNvbW1lbnQ+JyAuICR0eXBlIC4gJzwvY29tbWVudD4gOiAnLiR2YWx1ZSk7Cn0KfQoKaWYgKFxjb3VudCgkcGFja2FnZS0+Z2V0QXV0b2xvYWQoKSkgPiAwKSB7CiRpby0+d3JpdGUoIlxuPGluZm8+YXV0b2xvYWQ8L2luZm8+Iik7CiRhdXRvbG9hZENvbmZpZyA9ICRwYWNrYWdlLT5nZXRBdXRvbG9hZCgpOwpmb3JlYWNoICgkYXV0b2xvYWRDb25maWcgYXMgJHR5cGUgPT4gJGF1dG9sb2FkcykgewokaW8tPndyaXRlKCc8Y29tbWVudD4nIC4gJHR5cGUgLiAnPC9jb21tZW50PicpOwoKaWYgKCR0eXBlID09PSAncHNyLTAnIHx8ICR0eXBlID09PSAncHNyLTQnKSB7CmZvcmVhY2ggKCRhdXRvbG9hZHMgYXMgJG5hbWUgPT4gJHBhdGgpIHsKJGlvLT53cml0ZSgoJG5hbWUgPzogJyonKSAuICcgPT4gJyAuIChpc19hcnJheSgkcGF0aCkgPyBpbXBsb2RlKCcsICcsICRwYXRoKSA6ICgkcGF0aCA/OiAnLicpKSk7Cn0KfSBlbHNlaWYgKCR0eXBlID09PSAnY2xhc3NtYXAnKSB7CiRpby0+d3JpdGUoaW1wbG9kZSgnLCAnLCAkYXV0b2xvYWRDb25maWdbJHR5cGVdKSk7Cn0KfQppZiAoJHBhY2thZ2UtPmdldEluY2x1ZGVQYXRocygpKSB7CiRpby0+d3JpdGUoJzxjb21tZW50PmluY2x1ZGUtcGF0aDwvY29tbWVudD4nKTsKJGlvLT53cml0ZShpbXBsb2RlKCcsICcsICRwYWNrYWdlLT5nZXRJbmNsdWRlUGF0aHMoKSkpOwp9Cn0KfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJpbnRWZXJzaW9ucyhDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIGFycmF5ICR2ZXJzaW9ucywgSW5zdGFsbGVkUmVwb3NpdG9yeSAkaW5zdGFsbGVkUmVwbyk6IHZvaWQKewokdmVyc2lvbnMgPSBhcnJheV9rZXlzKCR2ZXJzaW9ucyk7CiR2ZXJzaW9ucyA9IFNlbXZlcjo6cnNvcnQoJHZlcnNpb25zKTsKCgppZiAoJGluc3RhbGxlZFBhY2thZ2VzID0gJGluc3RhbGxlZFJlcG8tPmZpbmRQYWNrYWdlcygkcGFja2FnZS0+Z2V0TmFtZSgpKSkgewpmb3JlYWNoICgkaW5zdGFsbGVkUGFja2FnZXMgYXMgJGluc3RhbGxlZFBhY2thZ2UpIHsKJGluc3RhbGxlZFZlcnNpb24gPSAkaW5zdGFsbGVkUGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwoka2V5ID0gYXJyYXlfc2VhcmNoKCRpbnN0YWxsZWRWZXJzaW9uLCAkdmVyc2lvbnMpOwppZiAoZmFsc2UgIT09ICRrZXkpIHsKJHZlcnNpb25zWyRrZXldID0gJzxpbmZvPiogJyAuICRpbnN0YWxsZWRWZXJzaW9uIC4gJzwvaW5mbz4nOwp9Cn0KfQoKJHZlcnNpb25zID0gaW1wbG9kZSgnLCAnLCAkdmVyc2lvbnMpOwoKJHRoaXMtPmdldElPKCktPndyaXRlKCc8aW5mbz52ZXJzaW9uczwvaW5mbz4gOiAnIC4gJHZlcnNpb25zKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHByaW50TGlua3MoQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJGxpbmtUeXBlLCA/c3RyaW5nICR0aXRsZSA9IG51bGwpOiB2b2lkCnsKJHRpdGxlID0gJHRpdGxlID86ICRsaW5rVHlwZTsKJGlvID0gJHRoaXMtPmdldElPKCk7CmlmICgkbGlua3MgPSAkcGFja2FnZS0+eydnZXQnLnVjZmlyc3QoJGxpbmtUeXBlKX0oKSkgewokaW8tPndyaXRlKCJcbjxpbmZvPiIgLiAkdGl0bGUgLiAiPC9pbmZvPiIpOwoKZm9yZWFjaCAoJGxpbmtzIGFzICRsaW5rKSB7CiRpby0+d3JpdGUoJGxpbmstPmdldFRhcmdldCgpIC4gJyA8Y29tbWVudD4nIC4gJGxpbmstPmdldFByZXR0eUNvbnN0cmFpbnQoKSAuICc8L2NvbW1lbnQ+Jyk7Cn0KfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJpbnRMaWNlbnNlcyhDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiB2b2lkCnsKJHNwZHhMaWNlbnNlcyA9IG5ldyBTcGR4TGljZW5zZXMoKTsKCiRsaWNlbnNlcyA9ICRwYWNrYWdlLT5nZXRMaWNlbnNlKCk7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwoKZm9yZWFjaCAoJGxpY2Vuc2VzIGFzICRsaWNlbnNlSWQpIHsKJGxpY2Vuc2UgPSAkc3BkeExpY2Vuc2VzLT5nZXRMaWNlbnNlQnlJZGVudGlmaWVyKCRsaWNlbnNlSWQpOyAKCmlmICghJGxpY2Vuc2UpIHsKJG91dCA9ICRsaWNlbnNlSWQ7Cn0gZWxzZSB7CgppZiAoJGxpY2Vuc2VbMV0gPT09IHRydWUpIHsKJG91dCA9IHNwcmludGYoJyVzICglcykgKE9TSSBhcHByb3ZlZCkgJXMnLCAkbGljZW5zZVswXSwgJGxpY2Vuc2VJZCwgJGxpY2Vuc2VbMl0pOwp9IGVsc2Ugewokb3V0ID0gc3ByaW50ZignJXMgKCVzKSAlcycsICRsaWNlbnNlWzBdLCAkbGljZW5zZUlkLCAkbGljZW5zZVsyXSk7Cn0KfQoKJGlvLT53cml0ZSgnPGluZm8+bGljZW5zZTwvaW5mbz4gIDogJyAuICRvdXQpOwp9Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHByaW50UGFja2FnZUluZm9Bc0pzb24oQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBhcnJheSAkdmVyc2lvbnMsIEluc3RhbGxlZFJlcG9zaXRvcnkgJGluc3RhbGxlZFJlcG8sID9QYWNrYWdlSW50ZXJmYWNlICRsYXRlc3RQYWNrYWdlID0gbnVsbCk6IHZvaWQKewokanNvbiA9IFsKJ25hbWUnID0+ICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCksCidkZXNjcmlwdGlvbicgPT4gJHBhY2thZ2UtPmdldERlc2NyaXB0aW9uKCksCidrZXl3b3JkcycgPT4gJHBhY2thZ2UtPmdldEtleXdvcmRzKCkgPzogW10sCid0eXBlJyA9PiAkcGFja2FnZS0+Z2V0VHlwZSgpLAonaG9tZXBhZ2UnID0+ICRwYWNrYWdlLT5nZXRIb21lcGFnZSgpLAonbmFtZXMnID0+ICRwYWNrYWdlLT5nZXROYW1lcygpLApdOwoKJGpzb24gPSAkdGhpcy0+YXBwZW5kVmVyc2lvbnMoJGpzb24sICR2ZXJzaW9ucyk7CiRqc29uID0gJHRoaXMtPmFwcGVuZExpY2Vuc2VzKCRqc29uLCAkcGFja2FnZSk7CgppZiAoJGxhdGVzdFBhY2thZ2UpIHsKJGpzb25bJ2xhdGVzdCddID0gJGxhdGVzdFBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKfSBlbHNlIHsKJGxhdGVzdFBhY2thZ2UgPSAkcGFja2FnZTsKfQoKaWYgKG51bGwgIT09ICRwYWNrYWdlLT5nZXRTb3VyY2VUeXBlKCkpIHsKJGpzb25bJ3NvdXJjZSddID0gWwondHlwZScgPT4gJHBhY2thZ2UtPmdldFNvdXJjZVR5cGUoKSwKJ3VybCcgPT4gJHBhY2thZ2UtPmdldFNvdXJjZVVybCgpLAoncmVmZXJlbmNlJyA9PiAkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCksCl07Cn0KCmlmIChudWxsICE9PSAkcGFja2FnZS0+Z2V0RGlzdFR5cGUoKSkgewokanNvblsnZGlzdCddID0gWwondHlwZScgPT4gJHBhY2thZ2UtPmdldERpc3RUeXBlKCksCid1cmwnID0+ICRwYWNrYWdlLT5nZXREaXN0VXJsKCksCidyZWZlcmVuY2UnID0+ICRwYWNrYWdlLT5nZXREaXN0UmVmZXJlbmNlKCksCl07Cn0KCmlmICghUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcGFja2FnZS0+Z2V0TmFtZSgpKSAmJiAkaW5zdGFsbGVkUmVwby0+aGFzUGFja2FnZSgkcGFja2FnZSkpIHsKJHBhdGggPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCktPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKS0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwppZiAoaXNfc3RyaW5nKCRwYXRoKSkgewokcGF0aCA9IHJlYWxwYXRoKCRwYXRoKTsKaWYgKCRwYXRoICE9PSBmYWxzZSkgewokanNvblsncGF0aCddID0gJHBhdGg7Cn0KfSBlbHNlIHsKJGpzb25bJ3BhdGgnXSA9IG51bGw7Cn0KCmlmICgkcGFja2FnZS0+Z2V0UmVsZWFzZURhdGUoKSAhPT0gbnVsbCkgewokanNvblsncmVsZWFzZWQnXSA9ICRwYWNrYWdlLT5nZXRSZWxlYXNlRGF0ZSgpLT5mb3JtYXQoREFURV9BVE9NKTsKfQp9CgppZiAoJGxhdGVzdFBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJiYgJGxhdGVzdFBhY2thZ2UtPmlzQWJhbmRvbmVkKCkpIHsKJGpzb25bJ3JlcGxhY2VtZW50J10gPSAkbGF0ZXN0UGFja2FnZS0+Z2V0UmVwbGFjZW1lbnRQYWNrYWdlKCk7Cn0KCmlmICgkcGFja2FnZS0+Z2V0U3VnZ2VzdHMoKSkgewokanNvblsnc3VnZ2VzdHMnXSA9ICRwYWNrYWdlLT5nZXRTdWdnZXN0cygpOwp9CgppZiAoJHBhY2thZ2UtPmdldFN1cHBvcnQoKSkgewokanNvblsnc3VwcG9ydCddID0gJHBhY2thZ2UtPmdldFN1cHBvcnQoKTsKfQoKJGpzb24gPSAkdGhpcy0+YXBwZW5kQXV0b2xvYWQoJGpzb24sICRwYWNrYWdlKTsKCmlmICgkcGFja2FnZS0+Z2V0SW5jbHVkZVBhdGhzKCkpIHsKJGpzb25bJ2luY2x1ZGVfcGF0aCddID0gJHBhY2thZ2UtPmdldEluY2x1ZGVQYXRocygpOwp9CgokanNvbiA9ICR0aGlzLT5hcHBlbmRMaW5rcygkanNvbiwgJHBhY2thZ2UpOwoKJHRoaXMtPmdldElPKCktPndyaXRlKEpzb25GaWxlOjplbmNvZGUoJGpzb24pKTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFwcGVuZFZlcnNpb25zKGFycmF5ICRqc29uLCBhcnJheSAkdmVyc2lvbnMpOiBhcnJheQp7CnVhc29ydCgkdmVyc2lvbnMsICd2ZXJzaW9uX2NvbXBhcmUnKTsKJHZlcnNpb25zID0gYXJyYXlfa2V5cyhhcnJheV9yZXZlcnNlKCR2ZXJzaW9ucykpOwokanNvblsndmVyc2lvbnMnXSA9ICR2ZXJzaW9uczsKCnJldHVybiAkanNvbjsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gYXBwZW5kTGljZW5zZXMoYXJyYXkgJGpzb24sIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IGFycmF5CnsKaWYgKCRsaWNlbnNlcyA9ICRwYWNrYWdlLT5nZXRMaWNlbnNlKCkpIHsKJHNwZHhMaWNlbnNlcyA9IG5ldyBTcGR4TGljZW5zZXMoKTsKCiRqc29uWydsaWNlbnNlcyddID0gYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGxpY2Vuc2VJZCkgdXNlICgkc3BkeExpY2Vuc2VzKSB7CiRsaWNlbnNlID0gJHNwZHhMaWNlbnNlcy0+Z2V0TGljZW5zZUJ5SWRlbnRpZmllcigkbGljZW5zZUlkKTsgCgppZiAoISRsaWNlbnNlKSB7CnJldHVybiAkbGljZW5zZUlkOwp9CgpyZXR1cm4gWwonbmFtZScgPT4gJGxpY2Vuc2VbMF0sCidvc2knID0+ICRsaWNlbnNlSWQsCid1cmwnID0+ICRsaWNlbnNlWzJdLApdOwp9LCAkbGljZW5zZXMpOwp9CgpyZXR1cm4gJGpzb247Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFwcGVuZEF1dG9sb2FkKGFycmF5ICRqc29uLCBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBhcnJheQp7CmlmIChcY291bnQoJHBhY2thZ2UtPmdldEF1dG9sb2FkKCkpID4gMCkgewokYXV0b2xvYWQgPSBbXTsKCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRBdXRvbG9hZCgpIGFzICR0eXBlID0+ICRhdXRvbG9hZHMpIHsKaWYgKCR0eXBlID09PSAncHNyLTAnIHx8ICR0eXBlID09PSAncHNyLTQnKSB7CiRwc3IgPSBbXTsKCmZvcmVhY2ggKCRhdXRvbG9hZHMgYXMgJG5hbWUgPT4gJHBhdGgpIHsKaWYgKCEkcGF0aCkgewokcGF0aCA9ICcuJzsKfQoKJHBzclskbmFtZSA/OiAnKiddID0gJHBhdGg7Cn0KCiRhdXRvbG9hZFskdHlwZV0gPSAkcHNyOwp9IGVsc2VpZiAoJHR5cGUgPT09ICdjbGFzc21hcCcpIHsKJGF1dG9sb2FkWydjbGFzc21hcCddID0gJGF1dG9sb2FkczsKfQp9CgokanNvblsnYXV0b2xvYWQnXSA9ICRhdXRvbG9hZDsKfQoKcmV0dXJuICRqc29uOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBhcHBlbmRMaW5rcyhhcnJheSAkanNvbiwgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogYXJyYXkKewpmb3JlYWNoIChMaW5rOjokVFlQRVMgYXMgJGxpbmtUeXBlKSB7CiRqc29uID0gJHRoaXMtPmFwcGVuZExpbmsoJGpzb24sICRwYWNrYWdlLCAkbGlua1R5cGUpOwp9CgpyZXR1cm4gJGpzb247Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFwcGVuZExpbmsoYXJyYXkgJGpzb24sIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRsaW5rVHlwZSk6IGFycmF5CnsKJGxpbmtzID0gJHBhY2thZ2UtPnsnZ2V0JyAuIHVjZmlyc3QoJGxpbmtUeXBlKX0oKTsKCmlmICgkbGlua3MpIHsKJGpzb25bJGxpbmtUeXBlXSA9IFtdOwoKZm9yZWFjaCAoJGxpbmtzIGFzICRsaW5rKSB7CiRqc29uWyRsaW5rVHlwZV1bJGxpbmstPmdldFRhcmdldCgpXSA9ICRsaW5rLT5nZXRQcmV0dHlDb25zdHJhaW50KCk7Cn0KfQoKcmV0dXJuICRqc29uOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdFN0eWxlcyhPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IHZvaWQKewokdGhpcy0+Y29sb3JzID0gWwonZ3JlZW4nLAoneWVsbG93JywKJ2N5YW4nLAonbWFnZW50YScsCidibHVlJywKXTsKCmZvcmVhY2ggKCR0aGlzLT5jb2xvcnMgYXMgJGNvbG9yKSB7CiRzdHlsZSA9IG5ldyBPdXRwdXRGb3JtYXR0ZXJTdHlsZSgkY29sb3IpOwokb3V0cHV0LT5nZXRGb3JtYXR0ZXIoKS0+c2V0U3R5bGUoJGNvbG9yLCAkc3R5bGUpOwp9Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRpc3BsYXlQYWNrYWdlVHJlZShhcnJheSAkYXJyYXlUcmVlKTogdm9pZAp7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwpmb3JlYWNoICgkYXJyYXlUcmVlIGFzICRwYWNrYWdlKSB7CiRpby0+d3JpdGUoc3ByaW50ZignPGluZm8+JXM8L2luZm8+JywgJHBhY2thZ2VbJ25hbWUnXSksIGZhbHNlKTsKJGlvLT53cml0ZSgnICcgLiAkcGFja2FnZVsndmVyc2lvbiddLCBmYWxzZSk7CmlmIChpc3NldCgkcGFja2FnZVsnZGVzY3JpcHRpb24nXSkpIHsKJGlvLT53cml0ZSgnICcgLiBzdHJ0b2soJHBhY2thZ2VbJ2Rlc2NyaXB0aW9uJ10sICJcclxuIikpOwp9IGVsc2UgewoKJGlvLT53cml0ZSgnJyk7Cn0KCmlmIChpc3NldCgkcGFja2FnZVsncmVxdWlyZXMnXSkpIHsKJHJlcXVpcmVzID0gJHBhY2thZ2VbJ3JlcXVpcmVzJ107CiR0cmVlQmFyID0gJ+KUnCc7CiRqID0gMDsKJHRvdGFsID0gY291bnQoJHJlcXVpcmVzKTsKZm9yZWFjaCAoJHJlcXVpcmVzIGFzICRyZXF1aXJlKSB7CiRyZXF1aXJlTmFtZSA9ICRyZXF1aXJlWyduYW1lJ107CiRqKys7CmlmICgkaiA9PT0gJHRvdGFsKSB7CiR0cmVlQmFyID0gJ+KUlCc7Cn0KJGxldmVsID0gMTsKJGNvbG9yID0gJHRoaXMtPmNvbG9yc1skbGV2ZWxdOwokaW5mbyA9IHNwcmludGYoCiclc+KUgOKUgDwlcz4lczwvJXM+ICVzJywKJHRyZWVCYXIsCiRjb2xvciwKJHJlcXVpcmVOYW1lLAokY29sb3IsCiRyZXF1aXJlWyd2ZXJzaW9uJ10KKTsKJHRoaXMtPndyaXRlVHJlZUxpbmUoJGluZm8pOwoKJHRyZWVCYXIgPSBzdHJfcmVwbGFjZSgn4pSUJywgJyAnLCAkdHJlZUJhcik7CiRwYWNrYWdlc0luVHJlZSA9IFskcGFja2FnZVsnbmFtZSddLCAkcmVxdWlyZU5hbWVdOwoKJHRoaXMtPmRpc3BsYXlUcmVlKCRyZXF1aXJlLCAkcGFja2FnZXNJblRyZWUsICR0cmVlQmFyLCAkbGV2ZWwgKyAxKTsKfQp9Cn0KfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2VuZXJhdGVQYWNrYWdlVHJlZSgKUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwKSW5zdGFsbGVkUmVwb3NpdG9yeSAkaW5zdGFsbGVkUmVwbywKUmVwb3NpdG9yeUludGVyZmFjZSAkcmVtb3RlUmVwb3MKKTogYXJyYXkgewokcmVxdWlyZXMgPSAkcGFja2FnZS0+Z2V0UmVxdWlyZXMoKTsKa3NvcnQoJHJlcXVpcmVzKTsKJGNoaWxkcmVuID0gW107CmZvcmVhY2ggKCRyZXF1aXJlcyBhcyAkcmVxdWlyZU5hbWUgPT4gJHJlcXVpcmUpIHsKJHBhY2thZ2VzSW5UcmVlID0gWyRwYWNrYWdlLT5nZXROYW1lKCksICRyZXF1aXJlTmFtZV07CgokdHJlZUNoaWxkRGVzYyA9IFsKJ25hbWUnID0+ICRyZXF1aXJlTmFtZSwKJ3ZlcnNpb24nID0+ICRyZXF1aXJlLT5nZXRQcmV0dHlDb25zdHJhaW50KCksCl07CgokZGVlcENoaWxkcmVuID0gJHRoaXMtPmFkZFRyZWUoJHJlcXVpcmVOYW1lLCAkcmVxdWlyZSwgJGluc3RhbGxlZFJlcG8sICRyZW1vdGVSZXBvcywgJHBhY2thZ2VzSW5UcmVlKTsKCmlmICgkZGVlcENoaWxkcmVuKSB7CiR0cmVlQ2hpbGREZXNjWydyZXF1aXJlcyddID0gJGRlZXBDaGlsZHJlbjsKfQoKJGNoaWxkcmVuW10gPSAkdHJlZUNoaWxkRGVzYzsKfQokdHJlZSA9IFsKJ25hbWUnID0+ICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCksCid2ZXJzaW9uJyA9PiAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpLAonZGVzY3JpcHRpb24nID0+ICRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlID8gJHBhY2thZ2UtPmdldERlc2NyaXB0aW9uKCkgOiAnJywKXTsKCmlmICgkY2hpbGRyZW4pIHsKJHRyZWVbJ3JlcXVpcmVzJ10gPSAkY2hpbGRyZW47Cn0KCnJldHVybiAkdHJlZTsKfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRpc3BsYXlUcmVlKAokcGFja2FnZSwKYXJyYXkgJHBhY2thZ2VzSW5UcmVlLApzdHJpbmcgJHByZXZpb3VzVHJlZUJhciA9ICfilJwnLAppbnQgJGxldmVsID0gMQopOiB2b2lkIHsKJHByZXZpb3VzVHJlZUJhciA9IHN0cl9yZXBsYWNlKCfilJwnLCAn4pSCJywgJHByZXZpb3VzVHJlZUJhcik7CmlmIChpc19hcnJheSgkcGFja2FnZSkgJiYgaXNzZXQoJHBhY2thZ2VbJ3JlcXVpcmVzJ10pKSB7CiRyZXF1aXJlcyA9ICRwYWNrYWdlWydyZXF1aXJlcyddOwokdHJlZUJhciA9ICRwcmV2aW91c1RyZWVCYXIgLiAnICDilJwnOwokaSA9IDA7CiR0b3RhbCA9IGNvdW50KCRyZXF1aXJlcyk7CmZvcmVhY2ggKCRyZXF1aXJlcyBhcyAkcmVxdWlyZSkgewokY3VycmVudFRyZWUgPSAkcGFja2FnZXNJblRyZWU7CiRpKys7CmlmICgkaSA9PT0gJHRvdGFsKSB7CiR0cmVlQmFyID0gJHByZXZpb3VzVHJlZUJhciAuICcgIOKUlCc7Cn0KJGNvbG9ySWRlbnQgPSAkbGV2ZWwgJSBjb3VudCgkdGhpcy0+Y29sb3JzKTsKJGNvbG9yID0gJHRoaXMtPmNvbG9yc1skY29sb3JJZGVudF07Cgphc3NlcnQoaXNfc3RyaW5nKCRyZXF1aXJlWyduYW1lJ10pKTsKYXNzZXJ0KGlzX3N0cmluZygkcmVxdWlyZVsndmVyc2lvbiddKSk7CgokY2lyY3VsYXJXYXJuID0gaW5fYXJyYXkoCiRyZXF1aXJlWyduYW1lJ10sCiRjdXJyZW50VHJlZSwKdHJ1ZQopID8gJyhjaXJjdWxhciBkZXBlbmRlbmN5IGFib3J0ZWQgaGVyZSknIDogJyc7CiRpbmZvID0gcnRyaW0oc3ByaW50ZigKJyVz4pSA4pSAPCVzPiVzPC8lcz4gJXMgJXMnLAokdHJlZUJhciwKJGNvbG9yLAokcmVxdWlyZVsnbmFtZSddLAokY29sb3IsCiRyZXF1aXJlWyd2ZXJzaW9uJ10sCiRjaXJjdWxhcldhcm4KKSk7CiR0aGlzLT53cml0ZVRyZWVMaW5lKCRpbmZvKTsKCiR0cmVlQmFyID0gc3RyX3JlcGxhY2UoJ+KUlCcsICcgJywgJHRyZWVCYXIpOwoKJGN1cnJlbnRUcmVlW10gPSAkcmVxdWlyZVsnbmFtZSddOwokdGhpcy0+ZGlzcGxheVRyZWUoJHJlcXVpcmUsICRjdXJyZW50VHJlZSwgJHRyZWVCYXIsICRsZXZlbCArIDEpOwp9Cn0KfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZFRyZWUoCnN0cmluZyAkbmFtZSwKTGluayAkbGluaywKSW5zdGFsbGVkUmVwb3NpdG9yeSAkaW5zdGFsbGVkUmVwbywKUmVwb3NpdG9yeUludGVyZmFjZSAkcmVtb3RlUmVwb3MsCmFycmF5ICRwYWNrYWdlc0luVHJlZQopOiBhcnJheSB7CiRjaGlsZHJlbiA9IFtdOwpbJHBhY2thZ2VdID0gJHRoaXMtPmdldFBhY2thZ2UoCiRpbnN0YWxsZWRSZXBvLAokcmVtb3RlUmVwb3MsCiRuYW1lLAokbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpID09PSAnc2VsZi52ZXJzaW9uJyA/ICRsaW5rLT5nZXRDb25zdHJhaW50KCkgOiAkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpCik7CmlmIChpc19vYmplY3QoJHBhY2thZ2UpKSB7CiRyZXF1aXJlcyA9ICRwYWNrYWdlLT5nZXRSZXF1aXJlcygpOwprc29ydCgkcmVxdWlyZXMpOwpmb3JlYWNoICgkcmVxdWlyZXMgYXMgJHJlcXVpcmVOYW1lID0+ICRyZXF1aXJlKSB7CiRjdXJyZW50VHJlZSA9ICRwYWNrYWdlc0luVHJlZTsKCiR0cmVlQ2hpbGREZXNjID0gWwonbmFtZScgPT4gJHJlcXVpcmVOYW1lLAondmVyc2lvbicgPT4gJHJlcXVpcmUtPmdldFByZXR0eUNvbnN0cmFpbnQoKSwKXTsKCmlmICghaW5fYXJyYXkoJHJlcXVpcmVOYW1lLCAkY3VycmVudFRyZWUsIHRydWUpKSB7CiRjdXJyZW50VHJlZVtdID0gJHJlcXVpcmVOYW1lOwokZGVlcENoaWxkcmVuID0gJHRoaXMtPmFkZFRyZWUoJHJlcXVpcmVOYW1lLCAkcmVxdWlyZSwgJGluc3RhbGxlZFJlcG8sICRyZW1vdGVSZXBvcywgJGN1cnJlbnRUcmVlKTsKaWYgKCRkZWVwQ2hpbGRyZW4pIHsKJHRyZWVDaGlsZERlc2NbJ3JlcXVpcmVzJ10gPSAkZGVlcENoaWxkcmVuOwp9Cn0KCiRjaGlsZHJlbltdID0gJHRyZWVDaGlsZERlc2M7Cn0KfQoKcmV0dXJuICRjaGlsZHJlbjsKfQoKcHJpdmF0ZSBmdW5jdGlvbiB1cGRhdGVTdGF0dXNUb1ZlcnNpb25TdHlsZShzdHJpbmcgJHVwZGF0ZVN0YXR1cyk6IHN0cmluZwp7CgoKCnJldHVybiBzdHJfcmVwbGFjZShbJ3VwLXRvLWRhdGUnLCAnc2VtdmVyLXNhZmUtdXBkYXRlJywgJ3VwZGF0ZS1wb3NzaWJsZSddLCBbJ2luZm8nLCAnaGlnaGxpZ2h0JywgJ2NvbW1lbnQnXSwgJHVwZGF0ZVN0YXR1cyk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0VXBkYXRlU3RhdHVzKFBhY2thZ2VJbnRlcmZhY2UgJGxhdGVzdFBhY2thZ2UsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBzdHJpbmcKewppZiAoJGxhdGVzdFBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkgPT09ICRwYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpKSB7CnJldHVybiAndXAtdG8tZGF0ZSc7Cn0KCiRjb25zdHJhaW50ID0gJHBhY2thZ2UtPmdldFZlcnNpb24oKTsKaWYgKDAgIT09IHN0cnBvcygkY29uc3RyYWludCwgJ2Rldi0nKSkgewokY29uc3RyYWludCA9ICdeJy4kY29uc3RyYWludDsKfQppZiAoJGxhdGVzdFBhY2thZ2UtPmdldFZlcnNpb24oKSAmJiBTZW12ZXI6OnNhdGlzZmllcygkbGF0ZXN0UGFja2FnZS0+Z2V0VmVyc2lvbigpLCAkY29uc3RyYWludCkpIHsKCnJldHVybiAnc2VtdmVyLXNhZmUtdXBkYXRlJzsKfQoKCnJldHVybiAndXBkYXRlLXBvc3NpYmxlJzsKfQoKcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZVRyZWVMaW5lKHN0cmluZyAkbGluZSk6IHZvaWQKewokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKaWYgKCEkaW8tPmlzRGVjb3JhdGVkKCkpIHsKJGxpbmUgPSBzdHJfcmVwbGFjZShbJ+KUlCcsICfilJwnLCAn4pSA4pSAJywgJ+KUgiddLCBbJ2AtJywgJ3wtJywgJy0nLCAnfCddLCAkbGluZSk7Cn0KCiRpby0+d3JpdGUoJGxpbmUpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGZpbmRMYXRlc3RQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIENvbXBvc2VyICRjb21wb3NlciwgUGxhdGZvcm1SZXBvc2l0b3J5ICRwbGF0Zm9ybVJlcG8sIGJvb2wgJG1ham9yT25seSwgYm9vbCAkbWlub3JPbmx5LCBib29sICRwYXRjaE9ubHksIFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UgJHBsYXRmb3JtUmVxRmlsdGVyKTogP1BhY2thZ2VJbnRlcmZhY2UKewoKJG5hbWUgPSAkcGFja2FnZS0+Z2V0TmFtZSgpOwokdmVyc2lvblNlbGVjdG9yID0gbmV3IFZlcnNpb25TZWxlY3RvcigkdGhpcy0+Z2V0UmVwb3NpdG9yeVNldCgkY29tcG9zZXIpLCAkcGxhdGZvcm1SZXBvKTsKJHN0YWJpbGl0eSA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRNaW5pbXVtU3RhYmlsaXR5KCk7CiRmbGFncyA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRTdGFiaWxpdHlGbGFncygpOwppZiAoaXNzZXQoJGZsYWdzWyRuYW1lXSkpIHsKJHN0YWJpbGl0eSA9IGFycmF5X3NlYXJjaCgkZmxhZ3NbJG5hbWVdLCBCYXNlUGFja2FnZTo6U1RBQklMSVRJRVMsIHRydWUpOwp9CgokYmVzdFN0YWJpbGl0eSA9ICRzdGFiaWxpdHk7CmlmICgkY29tcG9zZXItPmdldFBhY2thZ2UoKS0+Z2V0UHJlZmVyU3RhYmxlKCkpIHsKJGJlc3RTdGFiaWxpdHkgPSAkcGFja2FnZS0+Z2V0U3RhYmlsaXR5KCk7Cn0KCiR0YXJnZXRWZXJzaW9uID0gbnVsbDsKaWYgKDAgPT09IHN0cnBvcygkcGFja2FnZS0+Z2V0VmVyc2lvbigpLCAnZGV2LScpKSB7CiR0YXJnZXRWZXJzaW9uID0gJHBhY2thZ2UtPmdldFZlcnNpb24oKTsKCgppZiAoJG1ham9yT25seSkgewpyZXR1cm4gbnVsbDsKfQp9CgppZiAoJHRhcmdldFZlcnNpb24gPT09IG51bGwpIHsKaWYgKCRtYWpvck9ubHkgJiYgUHJlZzo6aXNNYXRjaCgne14oP1A8emVyb19tYWpvcj4oPzowXC4pKyk/KD9QPGZpcnN0X21lYW5pbmdmdWw+XGQrKVwufScsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCksICRtYXRjaCkpIHsKJHRhcmdldFZlcnNpb24gPSAnPj0nLiRtYXRjaFsnemVyb19tYWpvciddLigoKGludCkgJG1hdGNoWydmaXJzdF9tZWFuaW5nZnVsJ10pICsgMSkuJyw8OTk5OTk5OS1kZXYnOwp9CgppZiAoJG1pbm9yT25seSkgewokdGFyZ2V0VmVyc2lvbiA9ICdeJy4kcGFja2FnZS0+Z2V0VmVyc2lvbigpOwp9CgppZiAoJHBhdGNoT25seSkgewokdHJpbW1lZFZlcnNpb24gPSBQcmVnOjpyZXBsYWNlKCd7KFwuMCkrJH1EJywgJycsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkpOwokcGFydHNOZWVkZWQgPSBzdWJzdHIoJHRyaW1tZWRWZXJzaW9uLCAwLCAxKSA9PT0gJzAnID8gNCA6IDM7CndoaWxlIChzdWJzdHJfY291bnQoJHRyaW1tZWRWZXJzaW9uLCAnLicpICsgMSA8ICRwYXJ0c05lZWRlZCkgewokdHJpbW1lZFZlcnNpb24gLj0gJy4wJzsKfQokdGFyZ2V0VmVyc2lvbiA9ICd+Jy4kdHJpbW1lZFZlcnNpb247Cn0KfQoKaWYgKCR0aGlzLT5nZXRJTygpLT5pc1ZlcmJvc2UoKSkgewokc2hvd1dhcm5pbmdzID0gdHJ1ZTsKfSBlbHNlIHsKJHNob3dXYXJuaW5ncyA9IHN0YXRpYyBmdW5jdGlvbiAoUGFja2FnZUludGVyZmFjZSAkY2FuZGlkYXRlKSB1c2UgKCRwYWNrYWdlKTogYm9vbCB7CmlmIChzdHJfc3RhcnRzX3dpdGgoJGNhbmRpZGF0ZS0+Z2V0VmVyc2lvbigpLCAnZGV2LScpIHx8IHN0cl9zdGFydHNfd2l0aCgkcGFja2FnZS0+Z2V0VmVyc2lvbigpLCAnZGV2LScpKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHZlcnNpb25fY29tcGFyZSgkY2FuZGlkYXRlLT5nZXRWZXJzaW9uKCksICRwYWNrYWdlLT5nZXRWZXJzaW9uKCksICc8PScpOwp9Owp9CiRjYW5kaWRhdGUgPSAkdmVyc2lvblNlbGVjdG9yLT5maW5kQmVzdENhbmRpZGF0ZSgkbmFtZSwgJHRhcmdldFZlcnNpb24sICRiZXN0U3RhYmlsaXR5LCAkcGxhdGZvcm1SZXFGaWx0ZXIsIDAsICR0aGlzLT5nZXRJTygpLCAkc2hvd1dhcm5pbmdzKTsKd2hpbGUgKCRjYW5kaWRhdGUgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJGNhbmRpZGF0ZSA9ICRjYW5kaWRhdGUtPmdldEFsaWFzT2YoKTsKfQoKcmV0dXJuICRjYW5kaWRhdGUgIT09IGZhbHNlID8gJGNhbmRpZGF0ZSA6IG51bGw7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0UmVwb3NpdG9yeVNldChDb21wb3NlciAkY29tcG9zZXIpOiBSZXBvc2l0b3J5U2V0CnsKaWYgKCEkdGhpcy0+cmVwb3NpdG9yeVNldCkgewokdGhpcy0+cmVwb3NpdG9yeVNldCA9IG5ldyBSZXBvc2l0b3J5U2V0KCRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRNaW5pbXVtU3RhYmlsaXR5KCksICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRTdGFiaWxpdHlGbGFncygpKTsKJHRoaXMtPnJlcG9zaXRvcnlTZXQtPmFkZFJlcG9zaXRvcnkobmV3IENvbXBvc2l0ZVJlcG9zaXRvcnkoJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRSZXBvc2l0b3JpZXMoKSkpOwp9CgpyZXR1cm4gJHRoaXMtPnJlcG9zaXRvcnlTZXQ7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0UmVsYXRpdmVUaW1lKERhdGVUaW1lSW50ZXJmYWNlICRyZWxlYXNlRGF0ZSk6IHN0cmluZwp7CmlmICgkcmVsZWFzZURhdGUtPmZvcm1hdCgnWW1kJykgPT09IGRhdGUoJ1ltZCcpKSB7CnJldHVybiAndG9kYXknOwp9CgokZGlmZiA9ICRyZWxlYXNlRGF0ZS0+ZGlmZihuZXcgXERhdGVUaW1lSW1tdXRhYmxlKCkpOwppZiAoJGRpZmYtPmRheXMgPCA3KSB7CnJldHVybiAndGhpcyB3ZWVrJzsKfQoKaWYgKCRkaWZmLT5kYXlzIDwgMTQpIHsKcmV0dXJuICdsYXN0IHdlZWsnOwp9CgppZiAoJGRpZmYtPm0gPCAxICYmICRkaWZmLT5kYXlzIDwgMzEpIHsKcmV0dXJuIGZsb29yKCRkaWZmLT5kYXlzIC8gNykgLiAnIHdlZWtzIGFnbyc7Cn0KCmlmICgkZGlmZi0+eSA8IDEpIHsKcmV0dXJuICRkaWZmLT5tIC4gJyBtb250aCcgLiAoJGRpZmYtPm0gPiAxID8gJ3MnIDogJycpIC4gJyBhZ28nOwp9CgpyZXR1cm4gJGRpZmYtPnkgLiAnIHllYXInIC4gKCRkaWZmLT55ID4gMSA/ICdzJyA6ICcnKSAuICcgYWdvJzsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxDaGFuZ2VSZXBvcnRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXER2Y3NEb3dubG9hZGVySW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxWY3NDYXBhYmxlRG93bmxvYWRlckludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcRHVtcGVyXEFycmF5RHVtcGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25HdWVzc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxQbHVnaW5cQ29tbWFuZEV2ZW50Owp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXFNjcmlwdFxTY3JpcHRFdmVudHM7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKCgoKCgpjbGFzcyBTdGF0dXNDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewpwcml2YXRlIGNvbnN0IEVYSVRfQ09ERV9FUlJPUlMgPSAxOwpwcml2YXRlIGNvbnN0IEVYSVRfQ09ERV9VTlBVU0hFRF9DSEFOR0VTID0gMjsKcHJpdmF0ZSBjb25zdCBFWElUX0NPREVfVkVSU0lPTl9DSEFOR0VTID0gNDsKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgnc3RhdHVzJykKLT5zZXREZXNjcmlwdGlvbignU2hvd3MgYSBsaXN0IG9mIGxvY2FsbHkgbW9kaWZpZWQgcGFja2FnZXMnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRPcHRpb24oJ3ZlcmJvc2UnLCAndnx2dnx2dnYnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3cgbW9kaWZpZWQgZmlsZXMgZm9yIGVhY2ggZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgY2hhbmdlcy4nKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIHN0YXR1cyBjb21tYW5kIGRpc3BsYXlzIGEgbGlzdCBvZiBkZXBlbmRlbmNpZXMgdGhhdCBoYXZlCmJlZW4gbW9kaWZpZWQgbG9jYWxseS4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI3N0YXR1cwpFT1QKKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CgokY29tbWFuZEV2ZW50ID0gbmV3IENvbW1hbmRFdmVudChQbHVnaW5FdmVudHM6OkNPTU1BTkQsICdzdGF0dXMnLCAkaW5wdXQsICRvdXRwdXQpOwokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaCgkY29tbWFuZEV2ZW50LT5nZXROYW1lKCksICRjb21tYW5kRXZlbnQpOwoKCiRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmRpc3BhdGNoU2NyaXB0KFNjcmlwdEV2ZW50czo6UFJFX1NUQVRVU19DTUQsIHRydWUpOwoKJGV4aXRDb2RlID0gJHRoaXMtPmRvRXhlY3V0ZSgkaW5wdXQpOwoKCiRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmRpc3BhdGNoU2NyaXB0KFNjcmlwdEV2ZW50czo6UE9TVF9TVEFUVVNfQ01ELCB0cnVlKTsKCnJldHVybiAkZXhpdENvZGU7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZG9FeGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCk6IGludAp7CgokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CgokaW5zdGFsbGVkUmVwbyA9ICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7CgokZG0gPSAkY29tcG9zZXItPmdldERvd25sb2FkTWFuYWdlcigpOwokaW0gPSAkY29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKTsKCiRlcnJvcnMgPSBbXTsKJGlvID0gJHRoaXMtPmdldElPKCk7CiR1bnB1c2hlZENoYW5nZXMgPSBbXTsKJHZjc1ZlcnNpb25DaGFuZ2VzID0gW107CgokcGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXI7CiRndWVzc2VyID0gbmV3IFZlcnNpb25HdWVzc2VyKCRjb21wb3Nlci0+Z2V0Q29uZmlnKCksICRjb21wb3Nlci0+Z2V0TG9vcCgpLT5nZXRQcm9jZXNzRXhlY3V0b3IoKSA/PyBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyksICRwYXJzZXIsICRpbyk7CiRkdW1wZXIgPSBuZXcgQXJyYXlEdW1wZXI7CgoKZm9yZWFjaCAoJGluc3RhbGxlZFJlcG8tPmdldENhbm9uaWNhbFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKJGRvd25sb2FkZXIgPSAkZG0tPmdldERvd25sb2FkZXJGb3JQYWNrYWdlKCRwYWNrYWdlKTsKJHRhcmdldERpciA9ICRpbS0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwppZiAoJHRhcmdldERpciA9PT0gbnVsbCkgewpjb250aW51ZTsKfQoKaWYgKCRkb3dubG9hZGVyIGluc3RhbmNlb2YgQ2hhbmdlUmVwb3J0SW50ZXJmYWNlKSB7CmlmIChpc19saW5rKCR0YXJnZXREaXIpKSB7CiRlcnJvcnNbJHRhcmdldERpcl0gPSAkdGFyZ2V0RGlyIC4gJyBpcyBhIHN5bWJvbGljIGxpbmsuJzsKfQoKaWYgKG51bGwgIT09ICgkY2hhbmdlcyA9ICRkb3dubG9hZGVyLT5nZXRMb2NhbENoYW5nZXMoJHBhY2thZ2UsICR0YXJnZXREaXIpKSkgewokZXJyb3JzWyR0YXJnZXREaXJdID0gJGNoYW5nZXM7Cn0KfQoKaWYgKCRkb3dubG9hZGVyIGluc3RhbmNlb2YgVmNzQ2FwYWJsZURvd25sb2FkZXJJbnRlcmZhY2UpIHsKaWYgKCRkb3dubG9hZGVyLT5nZXRWY3NSZWZlcmVuY2UoJHBhY2thZ2UsICR0YXJnZXREaXIpKSB7CnN3aXRjaCAoJHBhY2thZ2UtPmdldEluc3RhbGxhdGlvblNvdXJjZSgpKSB7CmNhc2UgJ3NvdXJjZSc6CiRwcmV2aW91c1JlZiA9ICRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKTsKYnJlYWs7CmNhc2UgJ2Rpc3QnOgokcHJldmlvdXNSZWYgPSAkcGFja2FnZS0+Z2V0RGlzdFJlZmVyZW5jZSgpOwpicmVhazsKZGVmYXVsdDoKJHByZXZpb3VzUmVmID0gbnVsbDsKfQoKJGN1cnJlbnRWZXJzaW9uID0gJGd1ZXNzZXItPmd1ZXNzVmVyc2lvbigkZHVtcGVyLT5kdW1wKCRwYWNrYWdlKSwgJHRhcmdldERpcik7CgppZiAoJHByZXZpb3VzUmVmICYmICRjdXJyZW50VmVyc2lvbiAmJiAkY3VycmVudFZlcnNpb25bJ2NvbW1pdCddICE9PSAkcHJldmlvdXNSZWYgJiYgJGN1cnJlbnRWZXJzaW9uWydwcmV0dHlfdmVyc2lvbiddICE9PSAkcHJldmlvdXNSZWYpIHsKJHZjc1ZlcnNpb25DaGFuZ2VzWyR0YXJnZXREaXJdID0gWwoncHJldmlvdXMnID0+IFsKJ3ZlcnNpb24nID0+ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCksCidyZWYnID0+ICRwcmV2aW91c1JlZiwKXSwKJ2N1cnJlbnQnID0+IFsKJ3ZlcnNpb24nID0+ICRjdXJyZW50VmVyc2lvblsncHJldHR5X3ZlcnNpb24nXSwKJ3JlZicgPT4gJGN1cnJlbnRWZXJzaW9uWydjb21taXQnXSwKXSwKXTsKfQp9Cn0KCmlmICgkZG93bmxvYWRlciBpbnN0YW5jZW9mIER2Y3NEb3dubG9hZGVySW50ZXJmYWNlKSB7CmlmICgkdW5wdXNoZWQgPSAkZG93bmxvYWRlci0+Z2V0VW5wdXNoZWRDaGFuZ2VzKCRwYWNrYWdlLCAkdGFyZ2V0RGlyKSkgewokdW5wdXNoZWRDaGFuZ2VzWyR0YXJnZXREaXJdID0gJHVucHVzaGVkOwp9Cn0KfQoKCmlmICghJGVycm9ycyAmJiAhJHVucHVzaGVkQ2hhbmdlcyAmJiAhJHZjc1ZlcnNpb25DaGFuZ2VzKSB7CiRpby0+d3JpdGVFcnJvcignPGluZm8+Tm8gbG9jYWwgY2hhbmdlczwvaW5mbz4nKTsKCnJldHVybiAwOwp9CgppZiAoJGVycm9ycykgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5Zb3UgaGF2ZSBjaGFuZ2VzIGluIHRoZSBmb2xsb3dpbmcgZGVwZW5kZW5jaWVzOjwvZXJyb3I+Jyk7Cgpmb3JlYWNoICgkZXJyb3JzIGFzICRwYXRoID0+ICRjaGFuZ2VzKSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbigndmVyYm9zZScpKSB7CiRpbmRlbnRlZENoYW5nZXMgPSBpbXBsb2RlKCJcbiIsIGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRsaW5lKTogc3RyaW5nIHsKcmV0dXJuICcgICAgJyAuIGx0cmltKCRsaW5lKTsKfSwgZXhwbG9kZSgiXG4iLCAkY2hhbmdlcykpKTsKJGlvLT53cml0ZSgnPGluZm8+Jy4kcGF0aC4nPC9pbmZvPjonKTsKJGlvLT53cml0ZSgkaW5kZW50ZWRDaGFuZ2VzKTsKfSBlbHNlIHsKJGlvLT53cml0ZSgkcGF0aCk7Cn0KfQp9CgppZiAoJHVucHVzaGVkQ2hhbmdlcykgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPllvdSBoYXZlIHVucHVzaGVkIGNoYW5nZXMgb24gdGhlIGN1cnJlbnQgYnJhbmNoIGluIHRoZSBmb2xsb3dpbmcgZGVwZW5kZW5jaWVzOjwvd2FybmluZz4nKTsKCmZvcmVhY2ggKCR1bnB1c2hlZENoYW5nZXMgYXMgJHBhdGggPT4gJGNoYW5nZXMpIHsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd2ZXJib3NlJykpIHsKJGluZGVudGVkQ2hhbmdlcyA9IGltcGxvZGUoIlxuIiwgYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGxpbmUpOiBzdHJpbmcgewpyZXR1cm4gJyAgICAnIC4gbHRyaW0oJGxpbmUpOwp9LCBleHBsb2RlKCJcbiIsICRjaGFuZ2VzKSkpOwokaW8tPndyaXRlKCc8aW5mbz4nLiRwYXRoLic8L2luZm8+OicpOwokaW8tPndyaXRlKCRpbmRlbnRlZENoYW5nZXMpOwp9IGVsc2UgewokaW8tPndyaXRlKCRwYXRoKTsKfQp9Cn0KCmlmICgkdmNzVmVyc2lvbkNoYW5nZXMpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Zb3UgaGF2ZSB2ZXJzaW9uIHZhcmlhdGlvbnMgaW4gdGhlIGZvbGxvd2luZyBkZXBlbmRlbmNpZXM6PC93YXJuaW5nPicpOwoKZm9yZWFjaCAoJHZjc1ZlcnNpb25DaGFuZ2VzIGFzICRwYXRoID0+ICRjaGFuZ2VzKSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbigndmVyYm9zZScpKSB7CgokY3VycmVudFZlcnNpb24gPSAkY2hhbmdlc1snY3VycmVudCddWyd2ZXJzaW9uJ10gPzogJGNoYW5nZXNbJ2N1cnJlbnQnXVsncmVmJ107CiRwcmV2aW91c1ZlcnNpb24gPSAkY2hhbmdlc1sncHJldmlvdXMnXVsndmVyc2lvbiddID86ICRjaGFuZ2VzWydwcmV2aW91cyddWydyZWYnXTsKCmlmICgkaW8tPmlzVmVyeVZlcmJvc2UoKSkgewoKJGN1cnJlbnRWZXJzaW9uIC49IHNwcmludGYoJyAoJXMpJywgJGNoYW5nZXNbJ2N1cnJlbnQnXVsncmVmJ10pOwokcHJldmlvdXNWZXJzaW9uIC49IHNwcmludGYoJyAoJXMpJywgJGNoYW5nZXNbJ3ByZXZpb3VzJ11bJ3JlZiddKTsKfQoKJGlvLT53cml0ZSgnPGluZm8+Jy4kcGF0aC4nPC9pbmZvPjonKTsKJGlvLT53cml0ZShzcHJpbnRmKCcgICAgRnJvbSA8Y29tbWVudD4lczwvY29tbWVudD4gdG8gPGNvbW1lbnQ+JXM8L2NvbW1lbnQ+JywgJHByZXZpb3VzVmVyc2lvbiwgJGN1cnJlbnRWZXJzaW9uKSk7Cn0gZWxzZSB7CiRpby0+d3JpdGUoJHBhdGgpOwp9Cn0KfQoKaWYgKCgkZXJyb3JzIHx8ICR1bnB1c2hlZENoYW5nZXMgfHwgJHZjc1ZlcnNpb25DaGFuZ2VzKSAmJiAhJGlucHV0LT5nZXRPcHRpb24oJ3ZlcmJvc2UnKSkgewokaW8tPndyaXRlRXJyb3IoJ1VzZSAtLXZlcmJvc2UgKC12KSB0byBzZWUgYSBsaXN0IG9mIGZpbGVzJyk7Cn0KCnJldHVybiAoJGVycm9ycyA/IHNlbGY6OkVYSVRfQ09ERV9FUlJPUlMgOiAwKSArICgkdW5wdXNoZWRDaGFuZ2VzID8gc2VsZjo6RVhJVF9DT0RFX1VOUFVTSEVEX0NIQU5HRVMgOiAwKSArICgkdmNzVmVyc2lvbkNoYW5nZXMgPyBzZWxmOjpFWElUX0NPREVfVkVSU0lPTl9DSEFOR0VTIDogMCk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUm9vdFBhY2thZ2VSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyXFN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXI7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCmNsYXNzIFN1Z2dlc3RzQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKdXNlIENvbXBsZXRpb25UcmFpdDsKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgnc3VnZ2VzdHMnKQotPnNldERlc2NyaXB0aW9uKCdTaG93cyBwYWNrYWdlIHN1Z2dlc3Rpb25zJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0T3B0aW9uKCdieS1wYWNrYWdlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdHcm91cHMgb3V0cHV0IGJ5IHN1Z2dlc3RpbmcgcGFja2FnZSAoZGVmYXVsdCknKSwKbmV3IElucHV0T3B0aW9uKCdieS1zdWdnZXN0aW9uJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdHcm91cHMgb3V0cHV0IGJ5IHN1Z2dlc3RlZCBwYWNrYWdlJyksCm5ldyBJbnB1dE9wdGlvbignYWxsJywgJ2EnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3cgc3VnZ2VzdGlvbnMgZnJvbSBhbGwgZGVwZW5kZW5jaWVzLCBpbmNsdWRpbmcgdHJhbnNpdGl2ZSBvbmVzJyksCm5ldyBJbnB1dE9wdGlvbignbGlzdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvdyBvbmx5IGxpc3Qgb2Ygc3VnZ2VzdGVkIHBhY2thZ2UgbmFtZXMnKSwKbmV3IElucHV0T3B0aW9uKCduby1kZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0V4Y2x1ZGUgc3VnZ2VzdGlvbnMgZnJvbSByZXF1aXJlLWRldiBwYWNrYWdlcycpLApuZXcgSW5wdXRBcmd1bWVudCgncGFja2FnZXMnLCBJbnB1dEFyZ3VtZW50OjpJU19BUlJBWSB8IElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnUGFja2FnZXMgdGhhdCB5b3Ugd2FudCB0byBsaXN0IHN1Z2dlc3Rpb25zIGZyb20uJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RJbnN0YWxsZWRQYWNrYWdlKCkpLApdKQotPnNldEhlbHAoCjw8PEVPVAoKVGhlIDxpbmZvPiVjb21tYW5kLm5hbWUlPC9pbmZvPiBjb21tYW5kIHNob3dzIGEgc29ydGVkIGxpc3Qgb2Ygc3VnZ2VzdGVkIHBhY2thZ2VzLgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjc3VnZ2VzdHMKRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwoKJGluc3RhbGxlZFJlcG9zID0gWwpuZXcgUm9vdFBhY2thZ2VSZXBvc2l0b3J5KGNsb25lICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpKSwKXTsKCiRsb2NrZXIgPSAkY29tcG9zZXItPmdldExvY2tlcigpOwppZiAoJGxvY2tlci0+aXNMb2NrZWQoKSkgewokaW5zdGFsbGVkUmVwb3NbXSA9IG5ldyBQbGF0Zm9ybVJlcG9zaXRvcnkoW10sICRsb2NrZXItPmdldFBsYXRmb3JtT3ZlcnJpZGVzKCkpOwokaW5zdGFsbGVkUmVwb3NbXSA9ICRsb2NrZXItPmdldExvY2tlZFJlcG9zaXRvcnkoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSk7Cn0gZWxzZSB7CiRpbnN0YWxsZWRSZXBvc1tdID0gbmV3IFBsYXRmb3JtUmVwb3NpdG9yeShbXSwgJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdwbGF0Zm9ybScpKTsKJGluc3RhbGxlZFJlcG9zW10gPSAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpOwp9CgokaW5zdGFsbGVkUmVwbyA9IG5ldyBJbnN0YWxsZWRSZXBvc2l0b3J5KCRpbnN0YWxsZWRSZXBvcyk7CiRyZXBvcnRlciA9IG5ldyBTdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyKCR0aGlzLT5nZXRJTygpKTsKCiRmaWx0ZXIgPSAkaW5wdXQtPmdldEFyZ3VtZW50KCdwYWNrYWdlcycpOwokcGFja2FnZXMgPSAkaW5zdGFsbGVkUmVwby0+Z2V0UGFja2FnZXMoKTsKJHBhY2thZ2VzW10gPSAkY29tcG9zZXItPmdldFBhY2thZ2UoKTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CmlmICghZW1wdHkoJGZpbHRlcikgJiYgIWluX2FycmF5KCRwYWNrYWdlLT5nZXROYW1lKCksICRmaWx0ZXIpKSB7CmNvbnRpbnVlOwp9CgokcmVwb3J0ZXItPmFkZFN1Z2dlc3Rpb25zRnJvbVBhY2thZ2UoJHBhY2thZ2UpOwp9CgoKJG1vZGUgPSBTdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyOjpNT0RFX0JZX1BBQ0tBR0U7CgoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdieS1zdWdnZXN0aW9uJykpIHsKJG1vZGUgPSBTdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyOjpNT0RFX0JZX1NVR0dFU1RJT047Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbignYnktcGFja2FnZScpKSB7CiRtb2RlIHw9IFN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXI6Ok1PREVfQllfUEFDS0FHRTsKfQoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdsaXN0JykpIHsKJG1vZGUgPSBTdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyOjpNT0RFX0xJU1Q7Cn0KCiRyZXBvcnRlci0+b3V0cHV0KCRtb2RlLCAkaW5zdGFsbGVkUmVwbywgZW1wdHkoJGZpbHRlcikgJiYgISRpbnB1dC0+Z2V0T3B0aW9uKCdhbGwnKSA/ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpIDogbnVsbCk7CgpyZXR1cm4gMDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFJlcXVlc3Q7CnVzZSBDb21wb3NlclxJbnN0YWxsZXI7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxSb290UGFja2FnZUxvYWRlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uU2VsZWN0b3I7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxQbHVnaW5cQ29tbWFuZEV2ZW50Owp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxDb21wb3NpdGVSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlTZXQ7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxNdWx0aUNvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxTZW12ZXJcSW50ZXJ2YWxzOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwRG93bmxvYWRlcjsKdXNlIENvbXBvc2VyXEFkdmlzb3J5XEF1ZGl0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxUYWJsZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKCmNsYXNzIFVwZGF0ZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnVzZSBDb21wbGV0aW9uVHJhaXQ7Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ3VwZGF0ZScpCi0+c2V0QWxpYXNlcyhbJ3UnLCAndXBncmFkZSddKQotPnNldERlc2NyaXB0aW9uKCdVcGRhdGVzIHlvdXIgZGVwZW5kZW5jaWVzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBhY2NvcmRpbmcgdG8gY29tcG9zZXIuanNvbiwgYW5kIHVwZGF0ZXMgdGhlIGNvbXBvc2VyLmxvY2sgZmlsZScpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dEFyZ3VtZW50KCdwYWNrYWdlcycsIElucHV0QXJndW1lbnQ6OklTX0FSUkFZIHwgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdQYWNrYWdlcyB0aGF0IHNob3VsZCBiZSB1cGRhdGVkLCBpZiBub3QgcHJvdmlkZWQgYWxsIHBhY2thZ2VzIGFyZS4nLCBudWxsLCAkdGhpcy0+c3VnZ2VzdEluc3RhbGxlZFBhY2thZ2UoZmFsc2UpKSwKbmV3IElucHV0T3B0aW9uKCd3aXRoJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZIHwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnVGVtcG9yYXJ5IHZlcnNpb24gY29uc3RyYWludCB0byBhZGQsIGUuZy4gZm9vL2JhcjoxLjAuMCBvciBmb28vYmFyPTEuMC4wJyksCm5ldyBJbnB1dE9wdGlvbigncHJlZmVyLXNvdXJjZScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRm9yY2VzIGluc3RhbGxhdGlvbiBmcm9tIHBhY2thZ2Ugc291cmNlcyB3aGVuIHBvc3NpYmxlLCBpbmNsdWRpbmcgVkNTIGluZm9ybWF0aW9uLicpLApuZXcgSW5wdXRPcHRpb24oJ3ByZWZlci1kaXN0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdGb3JjZXMgaW5zdGFsbGF0aW9uIGZyb20gcGFja2FnZSBkaXN0IChkZWZhdWx0IGJlaGF2aW9yKS4nKSwKbmV3IElucHV0T3B0aW9uKCdwcmVmZXItaW5zdGFsbCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0ZvcmNlcyBpbnN0YWxsYXRpb24gZnJvbSBwYWNrYWdlIGRpc3R8c291cmNlfGF1dG8gKGF1dG8gY2hvb3NlcyBzb3VyY2UgZm9yIGRldiB2ZXJzaW9ucywgZGlzdCBmb3IgdGhlIHJlc3QpLicsIG51bGwsICR0aGlzLT5zdWdnZXN0UHJlZmVySW5zdGFsbCgpKSwKbmV3IElucHV0T3B0aW9uKCdkcnktcnVuJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPdXRwdXRzIHRoZSBvcGVyYXRpb25zIGJ1dCB3aWxsIG5vdCBleGVjdXRlIGFueXRoaW5nIChpbXBsaWNpdGx5IGVuYWJsZXMgLS12ZXJib3NlKS4nKSwKbmV3IElucHV0T3B0aW9uKCdkZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RFUFJFQ0FURUQ6IEVuYWJsZXMgaW5zdGFsbGF0aW9uIG9mIHJlcXVpcmUtZGV2IHBhY2thZ2VzIChlbmFibGVkIGJ5IGRlZmF1bHQsIG9ubHkgcHJlc2VudCBmb3IgQkMpLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLWRldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRGlzYWJsZXMgaW5zdGFsbGF0aW9uIG9mIHJlcXVpcmUtZGV2IHBhY2thZ2VzLicpLApuZXcgSW5wdXRPcHRpb24oJ2xvY2snLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ092ZXJ3cml0ZXMgdGhlIGxvY2sgZmlsZSBoYXNoIHRvIHN1cHByZXNzIHdhcm5pbmcgYWJvdXQgdGhlIGxvY2sgZmlsZSBiZWluZyBvdXQgb2YgZGF0ZSB3aXRob3V0IHVwZGF0aW5nIHBhY2thZ2UgdmVyc2lvbnMuIFBhY2thZ2UgbWV0YWRhdGEgbGlrZSBtaXJyb3JzIGFuZCBVUkxzIGFyZSB1cGRhdGVkIGlmIHRoZXkgY2hhbmdlZC4nKSwKbmV3IElucHV0T3B0aW9uKCduby1pbnN0YWxsJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTa2lwIHRoZSBpbnN0YWxsIHN0ZXAgYWZ0ZXIgdXBkYXRpbmcgdGhlIGNvbXBvc2VyLmxvY2sgZmlsZS4nKSwKbmV3IElucHV0T3B0aW9uKCduby1hdWRpdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2tpcCB0aGUgYXVkaXQgc3RlcCBhZnRlciB1cGRhdGluZyB0aGUgY29tcG9zZXIubG9jayBmaWxlIChjYW4gYWxzbyBiZSBzZXQgdmlhIHRoZSBDT01QT1NFUl9OT19BVURJVD0xIGVudiB2YXIpLicpLApuZXcgSW5wdXRPcHRpb24oJ2F1ZGl0LWZvcm1hdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0F1ZGl0IG91dHB1dCBmb3JtYXQuIE11c3QgYmUgInRhYmxlIiwgInBsYWluIiwgImpzb24iLCBvciAic3VtbWFyeSIuJywgQXVkaXRvcjo6Rk9STUFUX1NVTU1BUlksIEF1ZGl0b3I6OkZPUk1BVFMpLApuZXcgSW5wdXRPcHRpb24oJ25vLXNlY3VyaXR5LWJsb2NraW5nJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdBbGxvd3MgaW5zdGFsbGluZyBwYWNrYWdlcyB3aXRoIHNlY3VyaXR5IGFkdmlzb3JpZXMgb3IgdGhhdCBhcmUgYWJhbmRvbmVkIChjYW4gYWxzbyBiZSBzZXQgdmlhIHRoZSBDT01QT1NFUl9OT19TRUNVUklUWV9CTE9DS0lORz0xIGVudiB2YXIpLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLWF1dG9sb2FkZXInLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1NraXBzIGF1dG9sb2FkZXIgZ2VuZXJhdGlvbicpLApuZXcgSW5wdXRPcHRpb24oJ25vLXN1Z2dlc3QnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RFUFJFQ0FURUQ6IFRoaXMgZmxhZyBkb2VzIG5vdCBleGlzdCBhbnltb3JlLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLXByb2dyZXNzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEbyBub3Qgb3V0cHV0IGRvd25sb2FkIHByb2dyZXNzLicpLApuZXcgSW5wdXRPcHRpb24oJ3dpdGgtZGVwZW5kZW5jaWVzJywgJ3cnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1VwZGF0ZSBhbHNvIGRlcGVuZGVuY2llcyBvZiBwYWNrYWdlcyBpbiB0aGUgYXJndW1lbnQgbGlzdCwgZXhjZXB0IHRob3NlIHdoaWNoIGFyZSByb290IHJlcXVpcmVtZW50cyAoY2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgQ09NUE9TRVJfV0lUSF9ERVBFTkRFTkNJRVM9MSBlbnYgdmFyKS4nKSwKbmV3IElucHV0T3B0aW9uKCd3aXRoLWFsbC1kZXBlbmRlbmNpZXMnLCAnVycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnVXBkYXRlIGFsc28gZGVwZW5kZW5jaWVzIG9mIHBhY2thZ2VzIGluIHRoZSBhcmd1bWVudCBsaXN0LCBpbmNsdWRpbmcgdGhvc2Ugd2hpY2ggYXJlIHJvb3QgcmVxdWlyZW1lbnRzIChjYW4gYWxzbyBiZSBzZXQgdmlhIHRoZSBDT01QT1NFUl9XSVRIX0FMTF9ERVBFTkRFTkNJRVM9MSBlbnYgdmFyKS4nKSwKbmV3IElucHV0T3B0aW9uKCd2ZXJib3NlJywgJ3Z8dnZ8dnZ2JywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTaG93cyBtb3JlIGRldGFpbHMgaW5jbHVkaW5nIG5ldyBjb21taXRzIHB1bGxlZCBpbiB3aGVuIHVwZGF0aW5nIHBhY2thZ2VzLicpLApuZXcgSW5wdXRPcHRpb24oJ29wdGltaXplLWF1dG9sb2FkZXInLCAnbycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT3B0aW1pemUgYXV0b2xvYWRlciBkdXJpbmcgYXV0b2xvYWRlciBkdW1wLicpLApuZXcgSW5wdXRPcHRpb24oJ2NsYXNzbWFwLWF1dGhvcml0YXRpdmUnLCAnYScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQXV0b2xvYWQgY2xhc3NlcyBmcm9tIHRoZSBjbGFzc21hcCBvbmx5LiBJbXBsaWNpdGx5IGVuYWJsZXMgYC0tb3B0aW1pemUtYXV0b2xvYWRlcmAuJyksCm5ldyBJbnB1dE9wdGlvbignYXBjdS1hdXRvbG9hZGVyJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdVc2UgQVBDdSB0byBjYWNoZSBmb3VuZC9ub3QtZm91bmQgY2xhc3Nlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdhcGN1LWF1dG9sb2FkZXItcHJlZml4JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnVXNlIGEgY3VzdG9tIHByZWZpeCBmb3IgdGhlIEFQQ3UgYXV0b2xvYWRlciBjYWNoZS4gSW1wbGljaXRseSBlbmFibGVzIC0tYXBjdS1hdXRvbG9hZGVyJyksCm5ldyBJbnB1dE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCB8IElucHV0T3B0aW9uOjpWQUxVRV9JU19BUlJBWSwgJ0lnbm9yZSBhIHNwZWNpZmljIHBsYXRmb3JtIHJlcXVpcmVtZW50IChwaHAgJiBleHQtIHBhY2thZ2VzKS4nKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnSWdub3JlIGFsbCBwbGF0Zm9ybSByZXF1aXJlbWVudHMgKHBocCAmIGV4dC0gcGFja2FnZXMpLicpLApuZXcgSW5wdXRPcHRpb24oJ3ByZWZlci1zdGFibGUnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1ByZWZlciBzdGFibGUgdmVyc2lvbnMgb2YgZGVwZW5kZW5jaWVzIChjYW4gYWxzbyBiZSBzZXQgdmlhIHRoZSBDT01QT1NFUl9QUkVGRVJfU1RBQkxFPTEgZW52IHZhcikuJyksCm5ldyBJbnB1dE9wdGlvbigncHJlZmVyLWxvd2VzdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUHJlZmVyIGxvd2VzdCB2ZXJzaW9ucyBvZiBkZXBlbmRlbmNpZXMgKGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIENPTVBPU0VSX1BSRUZFUl9MT1dFU1Q9MSBlbnYgdmFyKS4nKSwKbmV3IElucHV0T3B0aW9uKCdtaW5pbWFsLWNoYW5nZXMnLCAnbScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT25seSBwZXJmb3JtIGFic29sdXRlbHkgbmVjZXNzYXJ5IGNoYW5nZXMgdG8gZGVwZW5kZW5jaWVzLiBJZiBwYWNrYWdlcyBjYW5ub3QgYmUga2VwdCBhdCB0aGVpciBjdXJyZW50bHkgbG9ja2VkIHZlcnNpb24gdGhleSBhcmUgdXBkYXRlZC4gRm9yIHBhcnRpYWwgdXBkYXRlcyB0aGUgYWxsb3ctbGlzdGVkIHBhY2thZ2VzIGFyZSBhbHdheXMgdXBkYXRlZCBmdWxseS4gKGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIENPTVBPU0VSX01JTklNQUxfQ0hBTkdFUz0xIGVudiB2YXIpLicpLApuZXcgSW5wdXRPcHRpb24oJ3BhdGNoLW9ubHknLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ09ubHkgYWxsb3cgcGF0Y2ggdmVyc2lvbiB1cGRhdGVzIGZvciBjdXJyZW50bHkgaW5zdGFsbGVkIGRlcGVuZGVuY2llcy4nKSwKbmV3IElucHV0T3B0aW9uKCdpbnRlcmFjdGl2ZScsICdpJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdJbnRlcmFjdGl2ZSBpbnRlcmZhY2Ugd2l0aCBhdXRvY29tcGxldGlvbiB0byBzZWxlY3QgdGhlIHBhY2thZ2VzIHRvIHVwZGF0ZS4nKSwKbmV3IElucHV0T3B0aW9uKCdyb290LXJlcXMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Jlc3RyaWN0cyB0aGUgdXBkYXRlIHRvIHlvdXIgZmlyc3QgZGVncmVlIGRlcGVuZGVuY2llcy4nKSwKbmV3IElucHV0T3B0aW9uKCdidW1wLWFmdGVyLXVwZGF0ZScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9PUFRJT05BTCwgJ1J1bnMgYnVtcCBhZnRlciBwZXJmb3JtaW5nIHRoZSB1cGRhdGUuJywgZmFsc2UsIFsnZGV2JywgJ25vLWRldicsICdhbGwnXSksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSA8aW5mbz51cGRhdGU8L2luZm8+IGNvbW1hbmQgcmVhZHMgdGhlIGNvbXBvc2VyLmpzb24gZmlsZSBmcm9tIHRoZQpjdXJyZW50IGRpcmVjdG9yeSwgcHJvY2Vzc2VzIGl0LCBhbmQgdXBkYXRlcywgcmVtb3ZlcyBvciBpbnN0YWxscyBhbGwgdGhlCmRlcGVuZGVuY2llcy4KCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIHVwZGF0ZTwvaW5mbz4KClRvIGxpbWl0IHRoZSB1cGRhdGUgb3BlcmF0aW9uIHRvIGEgZmV3IHBhY2thZ2VzLCB5b3UgY2FuIGxpc3QgdGhlIHBhY2thZ2UocykKeW91IHdhbnQgdG8gdXBkYXRlIGFzIHN1Y2g6Cgo8aW5mbz5waHAgY29tcG9zZXIucGhhciB1cGRhdGUgdmVuZG9yL3BhY2thZ2UxIGZvby9teXBhY2thZ2UgWy4uLl08L2luZm8+CgpZb3UgbWF5IGFsc28gdXNlIGFuIGFzdGVyaXNrICgqKSBwYXR0ZXJuIHRvIGxpbWl0IHRoZSB1cGRhdGUgb3BlcmF0aW9uIHRvIHBhY2thZ2UocykKZnJvbSBhIHNwZWNpZmljIHZlbmRvcjoKCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIHVwZGF0ZSB2ZW5kb3IvcGFja2FnZTEgZm9vLyogWy4uLl08L2luZm8+CgpUbyBydW4gYW4gdXBkYXRlIHdpdGggbW9yZSByZXN0cmljdGl2ZSBjb25zdHJhaW50cyB5b3UgY2FuIHVzZToKCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIHVwZGF0ZSAtLXdpdGggdmVuZG9yL3BhY2thZ2U6MS4wLio8L2luZm8+CgpUbyBydW4gYSBwYXJ0aWFsIHVwZGF0ZSB3aXRoIG1vcmUgcmVzdHJpY3RpdmUgY29uc3RyYWludHMgeW91IGNhbiB1c2UgdGhlIHNob3J0aGFuZDoKCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIHVwZGF0ZSB2ZW5kb3IvcGFja2FnZToxLjAuKjwvaW5mbz4KClRvIHNlbGVjdCBwYWNrYWdlcyBuYW1lcyBpbnRlcmFjdGl2ZWx5IHdpdGggYXV0by1jb21wbGV0aW9uIHVzZSA8aW5mbz4taTwvaW5mbz4uCgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCN1cGRhdGUtdS11cGdyYWRlCkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2RldicpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+WW91IGFyZSB1c2luZyB0aGUgZGVwcmVjYXRlZCBvcHRpb24gIi0tZGV2Ii4gSXQgaGFzIG5vIGVmZmVjdCBhbmQgd2lsbCBicmVhayBpbiBDb21wb3NlciAzLjwvd2FybmluZz4nKTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLXN1Z2dlc3QnKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPllvdSBhcmUgdXNpbmcgdGhlIGRlcHJlY2F0ZWQgb3B0aW9uICItLW5vLXN1Z2dlc3QiLiBJdCBoYXMgbm8gZWZmZWN0IGFuZCB3aWxsIGJyZWFrIGluIENvbXBvc2VyIDMuPC93YXJuaW5nPicpOwp9CgokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CgppZiAoIUh0dHBEb3dubG9hZGVyOjppc0N1cmxFbmFibGVkKCkpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Db21wb3NlciBpcyBvcGVyYXRpbmcgc2lnbmlmaWNhbnRseSBzbG93ZXIgdGhhbiBub3JtYWwgYmVjYXVzZSB5b3UgZG8gbm90IGhhdmUgdGhlIFBIUCBjdXJsIGV4dGVuc2lvbiBlbmFibGVkLjwvd2FybmluZz4nKTsKfQoKJHBhY2thZ2VzID0gJGlucHV0LT5nZXRBcmd1bWVudCgncGFja2FnZXMnKTsKJHJlcXMgPSAkdGhpcy0+Zm9ybWF0UmVxdWlyZW1lbnRzKCRpbnB1dC0+Z2V0T3B0aW9uKCd3aXRoJykpOwoKCmlmIChjb3VudCgkcGFja2FnZXMpID4gMCkgewokYWxsb3dsaXN0UGFja2FnZXNXaXRoUmVxdWlyZW1lbnRzID0gYXJyYXlfZmlsdGVyKCRwYWNrYWdlcywgc3RhdGljIGZ1bmN0aW9uICgkcGtnKTogYm9vbCB7CnJldHVybiBQcmVnOjppc01hdGNoKCd7XFMrWyA9Ol1cUyt9JywgJHBrZyk7Cn0pOwpmb3JlYWNoICgkdGhpcy0+Zm9ybWF0UmVxdWlyZW1lbnRzKCRhbGxvd2xpc3RQYWNrYWdlc1dpdGhSZXF1aXJlbWVudHMpIGFzICRwYWNrYWdlID0+ICRjb25zdHJhaW50KSB7CiRyZXFzWyRwYWNrYWdlXSA9ICRjb25zdHJhaW50Owp9CgoKZm9yZWFjaCAoJGFsbG93bGlzdFBhY2thZ2VzV2l0aFJlcXVpcmVtZW50cyBhcyAkcGFja2FnZSkgewokcGFja2FnZU5hbWUgPSBQcmVnOjpyZXBsYWNlKCd7XihbXiA9Ol0rKVsgPTpdLiokfScsICckMScsICRwYWNrYWdlKTsKJGluZGV4ID0gYXJyYXlfc2VhcmNoKCRwYWNrYWdlLCAkcGFja2FnZXMpOwokcGFja2FnZXNbJGluZGV4XSA9ICRwYWNrYWdlTmFtZTsKfQp9Cgokcm9vdFBhY2thZ2UgPSAkY29tcG9zZXItPmdldFBhY2thZ2UoKTsKJHJvb3RQYWNrYWdlLT5zZXRSZWZlcmVuY2VzKFJvb3RQYWNrYWdlTG9hZGVyOjpleHRyYWN0UmVmZXJlbmNlcygkcmVxcywgJHJvb3RQYWNrYWdlLT5nZXRSZWZlcmVuY2VzKCkpKTsKJHJvb3RQYWNrYWdlLT5zZXRTdGFiaWxpdHlGbGFncyhSb290UGFja2FnZUxvYWRlcjo6ZXh0cmFjdFN0YWJpbGl0eUZsYWdzKCRyZXFzLCAkcm9vdFBhY2thZ2UtPmdldE1pbmltdW1TdGFiaWxpdHkoKSwgJHJvb3RQYWNrYWdlLT5nZXRTdGFiaWxpdHlGbGFncygpKSk7CgokcGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXI7CiR0ZW1wb3JhcnlDb25zdHJhaW50cyA9IFtdOwokcm9vdFJlcXVpcmVtZW50cyA9IGFycmF5X21lcmdlKCRyb290UGFja2FnZS0+Z2V0UmVxdWlyZXMoKSwgJHJvb3RQYWNrYWdlLT5nZXREZXZSZXF1aXJlcygpKTsKZm9yZWFjaCAoJHJlcXMgYXMgJHBhY2thZ2UgPT4gJGNvbnN0cmFpbnQpIHsKJHBhY2thZ2UgPSBzdHJ0b2xvd2VyKCRwYWNrYWdlKTsKJHBhcnNlZENvbnN0cmFpbnQgPSAkcGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCRjb25zdHJhaW50KTsKJHRlbXBvcmFyeUNvbnN0cmFpbnRzWyRwYWNrYWdlXSA9ICRwYXJzZWRDb25zdHJhaW50OwppZiAoaXNzZXQoJHJvb3RSZXF1aXJlbWVudHNbJHBhY2thZ2VdKSAmJiAhSW50ZXJ2YWxzOjpoYXZlSW50ZXJzZWN0aW9ucygkcGFyc2VkQ29uc3RyYWludCwgJHJvb3RSZXF1aXJlbWVudHNbJHBhY2thZ2VdLT5nZXRDb25zdHJhaW50KCkpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPlRoZSB0ZW1wb3JhcnkgY29uc3RyYWludCAiJy4kY29uc3RyYWludC4nIiBmb3IgIicuJHBhY2thZ2UuJyIgbXVzdCBiZSBhIHN1YnNldCBvZiB0aGUgY29uc3RyYWludCBpbiB5b3VyIGNvbXBvc2VyLmpzb24gKCcuJHJvb3RSZXF1aXJlbWVudHNbJHBhY2thZ2VdLT5nZXRQcmV0dHlDb25zdHJhaW50KCkuJyk8L2Vycm9yPicpOwokaW8tPndyaXRlKCc8aW5mbz5SdW4gYGNvbXBvc2VyIHJlcXVpcmUgJy4kcGFja2FnZS4nYCBvciBgY29tcG9zZXIgcmVxdWlyZSAnLiRwYWNrYWdlLic6Jy4kY29uc3RyYWludC4nYCBpbnN0ZWFkIHRvIHJlcGxhY2UgdGhlIGNvbnN0cmFpbnQ8L2luZm8+Jyk7CgpyZXR1cm4gc2VsZjo6RkFJTFVSRTsKfQp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3BhdGNoLW9ubHknKSkgewppZiAoISRjb21wb3Nlci0+Z2V0TG9ja2VyKCktPmlzTG9ja2VkKCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ3BhdGNoLW9ubHkgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGEgbG9jayBmaWxlIHByZXNlbnQnKTsKfQpmb3JlYWNoICgkY29tcG9zZXItPmdldExvY2tlcigpLT5nZXRMb2NrZWRSZXBvc2l0b3J5KHRydWUpLT5nZXRDYW5vbmljYWxQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CmlmICgkcGFja2FnZS0+aXNEZXYoKSkgewpjb250aW51ZTsKfQppZiAoIVByZWc6OmlzTWF0Y2goJ3teKFxkK1wuXGQrXC5cZCspfScsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCksICRtYXRjaCkpIHsKY29udGludWU7Cn0KJGNvbnN0cmFpbnQgPSAkcGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCd+Jy4kbWF0Y2hbMV0pOwppZiAoaXNzZXQoJHRlbXBvcmFyeUNvbnN0cmFpbnRzWyRwYWNrYWdlLT5nZXROYW1lKCldKSkgewokdGVtcG9yYXJ5Q29uc3RyYWludHNbJHBhY2thZ2UtPmdldE5hbWUoKV0gPSBNdWx0aUNvbnN0cmFpbnQ6OmNyZWF0ZShbJHRlbXBvcmFyeUNvbnN0cmFpbnRzWyRwYWNrYWdlLT5nZXROYW1lKCldLCAkY29uc3RyYWludF0sIHRydWUpOwp9IGVsc2UgewokdGVtcG9yYXJ5Q29uc3RyYWludHNbJHBhY2thZ2UtPmdldE5hbWUoKV0gPSAkY29uc3RyYWludDsKfQp9Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbignaW50ZXJhY3RpdmUnKSkgewokcGFja2FnZXMgPSAkdGhpcy0+Z2V0UGFja2FnZXNJbnRlcmFjdGl2ZWx5KCRpbywgJGlucHV0LCAkb3V0cHV0LCAkY29tcG9zZXIsICRwYWNrYWdlcyk7Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbigncm9vdC1yZXFzJykpIHsKJHJlcXVpcmVzID0gYXJyYXlfa2V5cygkcm9vdFBhY2thZ2UtPmdldFJlcXVpcmVzKCkpOwppZiAoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSkgewokcmVxdWlyZXMgPSBhcnJheV9tZXJnZSgkcmVxdWlyZXMsIGFycmF5X2tleXMoJHJvb3RQYWNrYWdlLT5nZXREZXZSZXF1aXJlcygpKSk7Cn0KCmlmICghZW1wdHkoJHBhY2thZ2VzKSkgewokcGFja2FnZXMgPSBhcnJheV9pbnRlcnNlY3QoJHBhY2thZ2VzLCAkcmVxdWlyZXMpOwp9IGVsc2UgewokcGFja2FnZXMgPSAkcmVxdWlyZXM7Cn0KfQoKCgokZmlsdGVyZWRQYWNrYWdlcyA9IGFycmF5X2ZpbHRlcigkcGFja2FnZXMsIHN0YXRpYyBmdW5jdGlvbiAoJHBhY2thZ2UpOiBib29sIHsKcmV0dXJuICFpbl9hcnJheSgkcGFja2FnZSwgWydsb2NrJywgJ25vdGhpbmcnLCAnbWlycm9ycyddLCB0cnVlKTsKfSk7CiR1cGRhdGVNaXJyb3JzID0gJGlucHV0LT5nZXRPcHRpb24oJ2xvY2snKSB8fCBjb3VudCgkZmlsdGVyZWRQYWNrYWdlcykgIT09IGNvdW50KCRwYWNrYWdlcyk7CiRwYWNrYWdlcyA9ICRmaWx0ZXJlZFBhY2thZ2VzOwoKaWYgKCR1cGRhdGVNaXJyb3JzICYmICFlbXB0eSgkcGFja2FnZXMpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPllvdSBjYW5ub3Qgc2ltdWx0YW5lb3VzbHkgdXBkYXRlIG9ubHkgYSBzZWxlY3Rpb24gb2YgcGFja2FnZXMgYW5kIHJlZ2VuZXJhdGUgdGhlIGxvY2sgZmlsZSBtZXRhZGF0YS48L2Vycm9yPicpOwoKcmV0dXJuIC0xOwp9CgokY29tbWFuZEV2ZW50ID0gbmV3IENvbW1hbmRFdmVudChQbHVnaW5FdmVudHM6OkNPTU1BTkQsICd1cGRhdGUnLCAkaW5wdXQsICRvdXRwdXQpOwokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaCgkY29tbWFuZEV2ZW50LT5nZXROYW1lKCksICRjb21tYW5kRXZlbnQpOwoKJGNvbXBvc2VyLT5nZXRJbnN0YWxsYXRpb25NYW5hZ2VyKCktPnNldE91dHB1dFByb2dyZXNzKCEkaW5wdXQtPmdldE9wdGlvbignbm8tcHJvZ3Jlc3MnKSk7CgokaW5zdGFsbCA9IEluc3RhbGxlcjo6Y3JlYXRlKCRpbywgJGNvbXBvc2VyKTsKCiRjb25maWcgPSAkY29tcG9zZXItPmdldENvbmZpZygpOwpbJHByZWZlclNvdXJjZSwgJHByZWZlckRpc3RdID0gJHRoaXMtPmdldFByZWZlcnJlZEluc3RhbGxPcHRpb25zKCRjb25maWcsICRpbnB1dCk7Cgokb3B0aW1pemUgPSAkaW5wdXQtPmdldE9wdGlvbignb3B0aW1pemUtYXV0b2xvYWRlcicpIHx8ICRjb25maWctPmdldCgnb3B0aW1pemUtYXV0b2xvYWRlcicpOwokYXV0aG9yaXRhdGl2ZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJykgfHwgJGNvbmZpZy0+Z2V0KCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJyk7CiRhcGN1UHJlZml4ID0gJGlucHV0LT5nZXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlci1wcmVmaXgnKTsKJGFwY3UgPSAkYXBjdVByZWZpeCAhPT0gbnVsbCB8fCAkaW5wdXQtPmdldE9wdGlvbignYXBjdS1hdXRvbG9hZGVyJykgfHwgJGNvbmZpZy0+Z2V0KCdhcGN1LWF1dG9sb2FkZXInKTsKJG1pbmltYWxDaGFuZ2VzID0gJGlucHV0LT5nZXRPcHRpb24oJ21pbmltYWwtY2hhbmdlcycpIHx8ICRjb25maWctPmdldCgndXBkYXRlLXdpdGgtbWluaW1hbC1jaGFuZ2VzJyk7CgokdXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzID0gUmVxdWVzdDo6VVBEQVRFX09OTFlfTElTVEVEOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3dpdGgtYWxsLWRlcGVuZGVuY2llcycpKSB7CiR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMgPSBSZXF1ZXN0OjpVUERBVEVfTElTVEVEX1dJVEhfVFJBTlNJVElWRV9ERVBTOwp9IGVsc2VpZiAoJGlucHV0LT5nZXRPcHRpb24oJ3dpdGgtZGVwZW5kZW5jaWVzJykpIHsKJHVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyA9IFJlcXVlc3Q6OlVQREFURV9MSVNURURfV0lUSF9UUkFOU0lUSVZFX0RFUFNfTk9fUk9PVF9SRVFVSVJFOwp9CgokaW5zdGFsbAotPnNldERyeVJ1bigkaW5wdXQtPmdldE9wdGlvbignZHJ5LXJ1bicpKQotPnNldFZlcmJvc2UoJGlucHV0LT5nZXRPcHRpb24oJ3ZlcmJvc2UnKSkKLT5zZXRQcmVmZXJTb3VyY2UoJHByZWZlclNvdXJjZSkKLT5zZXRQcmVmZXJEaXN0KCRwcmVmZXJEaXN0KQotPnNldERldk1vZGUoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSkKLT5zZXREdW1wQXV0b2xvYWRlcighJGlucHV0LT5nZXRPcHRpb24oJ25vLWF1dG9sb2FkZXInKSkKLT5zZXRPcHRpbWl6ZUF1dG9sb2FkZXIoJG9wdGltaXplKQotPnNldENsYXNzTWFwQXV0aG9yaXRhdGl2ZSgkYXV0aG9yaXRhdGl2ZSkKLT5zZXRBcGN1QXV0b2xvYWRlcigkYXBjdSwgJGFwY3VQcmVmaXgpCi0+c2V0VXBkYXRlKHRydWUpCi0+c2V0SW5zdGFsbCghJGlucHV0LT5nZXRPcHRpb24oJ25vLWluc3RhbGwnKSkKLT5zZXRVcGRhdGVNaXJyb3JzKCR1cGRhdGVNaXJyb3JzKQotPnNldFVwZGF0ZUFsbG93TGlzdCgkcGFja2FnZXMpCi0+c2V0VXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKCR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMpCi0+c2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkdGhpcy0+Z2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkaW5wdXQpKQotPnNldFByZWZlclN0YWJsZSgkaW5wdXQtPmdldE9wdGlvbigncHJlZmVyLXN0YWJsZScpKQotPnNldFByZWZlckxvd2VzdCgkaW5wdXQtPmdldE9wdGlvbigncHJlZmVyLWxvd2VzdCcpKQotPnNldFRlbXBvcmFyeUNvbnN0cmFpbnRzKCR0ZW1wb3JhcnlDb25zdHJhaW50cykKLT5zZXRBdWRpdENvbmZpZygkdGhpcy0+Y3JlYXRlQXVkaXRDb25maWcoJGNvbXBvc2VyLT5nZXRDb25maWcoKSwgJGlucHV0KSkKLT5zZXRNaW5pbWFsVXBkYXRlKCRtaW5pbWFsQ2hhbmdlcykKOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1wbHVnaW5zJykpIHsKJGluc3RhbGwtPmRpc2FibGVQbHVnaW5zKCk7Cn0KCiRyZXN1bHQgPSAkaW5zdGFsbC0+cnVuKCk7CgppZiAoJHJlc3VsdCA9PT0gMCAmJiAhJGlucHV0LT5nZXRPcHRpb24oJ2xvY2snKSkgewokYnVtcEFmdGVyVXBkYXRlID0gJGlucHV0LT5nZXRPcHRpb24oJ2J1bXAtYWZ0ZXItdXBkYXRlJyk7CmlmIChmYWxzZSA9PT0gJGJ1bXBBZnRlclVwZGF0ZSkgewokYnVtcEFmdGVyVXBkYXRlID0gJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdidW1wLWFmdGVyLXVwZGF0ZScpOwp9CgppZiAoZmFsc2UgIT09ICRidW1wQWZ0ZXJVcGRhdGUpIHsKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5CdW1waW5nIGRlcGVuZGVuY2llczwvaW5mbz4nKTsKJGJ1bXBDb21tYW5kID0gbmV3IEJ1bXBDb21tYW5kKCk7CiRidW1wQ29tbWFuZC0+c2V0Q29tcG9zZXIoJGNvbXBvc2VyKTsKJHJlc3VsdCA9ICRidW1wQ29tbWFuZC0+ZG9CdW1wKAokaW8sCiRidW1wQWZ0ZXJVcGRhdGUgPT09ICdkZXYnLAokYnVtcEFmdGVyVXBkYXRlID09PSAnbm8tZGV2JywKJGlucHV0LT5nZXRPcHRpb24oJ2RyeS1ydW4nKSwKJGlucHV0LT5nZXRBcmd1bWVudCgncGFja2FnZXMnKSwKJy0tYnVtcC1hZnRlci11cGRhdGU9ZGV2JwopOwp9Cn0KCnJldHVybiAkcmVzdWx0Owp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRQYWNrYWdlc0ludGVyYWN0aXZlbHkoSU9JbnRlcmZhY2UgJGlvLCBJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBDb21wb3NlciAkY29tcG9zZXIsIGFycmF5ICRwYWNrYWdlcyk6IGFycmF5CnsKaWYgKCEkaW5wdXQtPmlzSW50ZXJhY3RpdmUoKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignLS1pbnRlcmFjdGl2ZSBjYW5ub3QgYmUgdXNlZCBpbiBub24taW50ZXJhY3RpdmUgdGVybWluYWxzLicpOwp9CgokcGxhdGZvcm1SZXFGaWx0ZXIgPSAkdGhpcy0+Z2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkaW5wdXQpOwokc3RhYmlsaXR5RmxhZ3MgPSAkY29tcG9zZXItPmdldFBhY2thZ2UoKS0+Z2V0U3RhYmlsaXR5RmxhZ3MoKTsKJHJlcXVpcmVzID0gYXJyYXlfbWVyZ2UoCiRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRSZXF1aXJlcygpLAokY29tcG9zZXItPmdldFBhY2thZ2UoKS0+Z2V0RGV2UmVxdWlyZXMoKQopOwoKJGZpbHRlciA9IFxjb3VudCgkcGFja2FnZXMpID4gMCA/IEJhc2VQYWNrYWdlOjpwYWNrYWdlTmFtZXNUb1JlZ2V4cCgkcGFja2FnZXMpIDogbnVsbDsKCiRpby0+d3JpdGVFcnJvcignPGluZm8+TG9hZGluZyBwYWNrYWdlcyB0aGF0IGNhbiBiZSB1cGRhdGVkLi4uPC9pbmZvPicpOwokYXV0b2NvbXBsZXRlclZhbHVlcyA9IFtdOwokaW5zdGFsbGVkUGFja2FnZXMgPSAkY29tcG9zZXItPmdldExvY2tlcigpLT5pc0xvY2tlZCgpID8gJGNvbXBvc2VyLT5nZXRMb2NrZXIoKS0+Z2V0TG9ja2VkUmVwb3NpdG9yeSh0cnVlKS0+Z2V0UGFja2FnZXMoKSA6ICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCktPmdldFBhY2thZ2VzKCk7CiR2ZXJzaW9uU2VsZWN0b3IgPSAkdGhpcy0+Y3JlYXRlVmVyc2lvblNlbGVjdG9yKCRjb21wb3Nlcik7CmZvcmVhY2ggKCRpbnN0YWxsZWRQYWNrYWdlcyBhcyAkcGFja2FnZSkgewppZiAoJGZpbHRlciAhPT0gbnVsbCAmJiAhUHJlZzo6aXNNYXRjaCgkZmlsdGVyLCAkcGFja2FnZS0+Z2V0TmFtZSgpKSkgewpjb250aW51ZTsKfQokY3VycmVudFZlcnNpb24gPSAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwokY29uc3RyYWludCA9IGlzc2V0KCRyZXF1aXJlc1skcGFja2FnZS0+Z2V0TmFtZSgpXSkgPyAkcmVxdWlyZXNbJHBhY2thZ2UtPmdldE5hbWUoKV0tPmdldFByZXR0eUNvbnN0cmFpbnQoKSA6IG51bGw7CiRzdGFiaWxpdHkgPSBpc3NldCgkc3RhYmlsaXR5RmxhZ3NbJHBhY2thZ2UtPmdldE5hbWUoKV0pID8gKHN0cmluZykgYXJyYXlfc2VhcmNoKCRzdGFiaWxpdHlGbGFnc1skcGFja2FnZS0+Z2V0TmFtZSgpXSwgQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTLCB0cnVlKSA6ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRNaW5pbXVtU3RhYmlsaXR5KCk7CiRsYXRlc3RWZXJzaW9uID0gJHZlcnNpb25TZWxlY3Rvci0+ZmluZEJlc3RDYW5kaWRhdGUoJHBhY2thZ2UtPmdldE5hbWUoKSwgJGNvbnN0cmFpbnQsICRzdGFiaWxpdHksICRwbGF0Zm9ybVJlcUZpbHRlcik7CmlmICgkbGF0ZXN0VmVyc2lvbiAhPT0gZmFsc2UgJiYgKCRwYWNrYWdlLT5nZXRWZXJzaW9uKCkgIT09ICRsYXRlc3RWZXJzaW9uLT5nZXRWZXJzaW9uKCkgfHwgJGxhdGVzdFZlcnNpb24tPmlzRGV2KCkpKSB7CiRhdXRvY29tcGxldGVyVmFsdWVzWyRwYWNrYWdlLT5nZXROYW1lKCldID0gJzxjb21tZW50PicgLiAkY3VycmVudFZlcnNpb24gLiAnPC9jb21tZW50PiA9PiA8Y29tbWVudD4nIC4gJGxhdGVzdFZlcnNpb24tPmdldFByZXR0eVZlcnNpb24oKSAuICc8L2NvbW1lbnQ+JzsKfQp9CmlmICgwID09PSBcY291bnQoJGluc3RhbGxlZFBhY2thZ2VzKSkgewpmb3JlYWNoICgkcmVxdWlyZXMgYXMgJHJlcSA9PiAkY29uc3RyYWludCkgewppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcmVxKSkgewpjb250aW51ZTsKfQokYXV0b2NvbXBsZXRlclZhbHVlc1skcmVxXSA9ICcnOwp9Cn0KCmlmICgwID09PSBcY291bnQoJGF1dG9jb21wbGV0ZXJWYWx1ZXMpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IGZpbmQgYW55IHBhY2thZ2Ugd2l0aCBuZXcgdmVyc2lvbnMgYXZhaWxhYmxlJyk7Cn0KCiRwYWNrYWdlcyA9ICRpby0+c2VsZWN0KAonU2VsZWN0IHBhY2thZ2VzOiAoU2VsZWN0IG1vcmUgdGhhbiBvbmUgdmFsdWUgc2VwYXJhdGVkIGJ5IGNvbW1hKSAnLAokYXV0b2NvbXBsZXRlclZhbHVlcywKZmFsc2UsCjEsCidObyBwYWNrYWdlIG5hbWVkICIlcyIgaXMgaW5zdGFsbGVkLicsCnRydWUKKTsKCiR0YWJsZSA9IG5ldyBUYWJsZSgkb3V0cHV0KTsKJHRhYmxlLT5zZXRIZWFkZXJzKFsnU2VsZWN0ZWQgcGFja2FnZXMnXSk7CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewokdGFibGUtPmFkZFJvdyhbJHBhY2thZ2VdKTsKfQokdGFibGUtPnJlbmRlcigpOwoKaWYgKCRpby0+YXNrQ29uZmlybWF0aW9uKHNwcmludGYoCidXb3VsZCB5b3UgbGlrZSB0byBjb250aW51ZSBhbmQgdXBkYXRlIHRoZSBhYm92ZSBwYWNrYWdlJXMgWzxjb21tZW50PnllczwvY29tbWVudD5dPyAnLAoxID09PSBjb3VudCgkcGFja2FnZXMpID8gJycgOiAncycKKSkpIHsKcmV0dXJuICRwYWNrYWdlczsKfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdJbnN0YWxsYXRpb24gYWJvcnRlZC4nKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVWZXJzaW9uU2VsZWN0b3IoQ29tcG9zZXIgJGNvbXBvc2VyKTogVmVyc2lvblNlbGVjdG9yCnsKJHJlcG9zaXRvcnlTZXQgPSBuZXcgUmVwb3NpdG9yeVNldCgpOwokcmVwb3NpdG9yeVNldC0+YWRkUmVwb3NpdG9yeShuZXcgQ29tcG9zaXRlUmVwb3NpdG9yeShhcnJheV9maWx0ZXIoJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRSZXBvc2l0b3JpZXMoKSwgc3RhdGljIGZ1bmN0aW9uIChSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvc2l0b3J5KSB7CnJldHVybiAhJHJlcG9zaXRvcnkgaW5zdGFuY2VvZiBQbGF0Zm9ybVJlcG9zaXRvcnk7Cn0pKSk7CgpyZXR1cm4gbmV3IFZlcnNpb25TZWxlY3RvcigkcmVwb3NpdG9yeVNldCk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxGYWN0b3J5Owp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxWYWxpZGF0aW5nQXJyYXlMb2FkZXI7CnVzZSBDb21wb3NlclxQbHVnaW5cQ29tbWFuZEV2ZW50Owp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXFV0aWxcQ29uZmlnVmFsaWRhdG9yOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCgpjbGFzcyBWYWxpZGF0ZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgndmFsaWRhdGUnKQotPnNldERlc2NyaXB0aW9uKCdWYWxpZGF0ZXMgYSBjb21wb3Nlci5qc29uIGFuZCBjb21wb3Nlci5sb2NrJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0T3B0aW9uKCduby1jaGVjay1hbGwnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RvIG5vdCB2YWxpZGF0ZSByZXF1aXJlcyBmb3Igb3Zlcmx5IHN0cmljdC9sb29zZSBjb25zdHJhaW50cycpLApuZXcgSW5wdXRPcHRpb24oJ2NoZWNrLWxvY2snLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0NoZWNrIGlmIGxvY2sgZmlsZSBpcyB1cCB0byBkYXRlIChldmVuIHdoZW4gY29uZmlnLmxvY2sgaXMgZmFsc2UpJyksCm5ldyBJbnB1dE9wdGlvbignbm8tY2hlY2stbG9jaycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRG8gbm90IGNoZWNrIGlmIGxvY2sgZmlsZSBpcyB1cCB0byBkYXRlJyksCm5ldyBJbnB1dE9wdGlvbignbm8tY2hlY2stcHVibGlzaCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRG8gbm90IGNoZWNrIGZvciBwdWJsaXNoIGVycm9ycycpLApuZXcgSW5wdXRPcHRpb24oJ25vLWNoZWNrLXZlcnNpb24nLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RvIG5vdCByZXBvcnQgYSB3YXJuaW5nIGlmIHRoZSB2ZXJzaW9uIGZpZWxkIGlzIHByZXNlbnQnKSwKbmV3IElucHV0T3B0aW9uKCd3aXRoLWRlcGVuZGVuY2llcycsICdBJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdBbHNvIHZhbGlkYXRlIHRoZSBjb21wb3Nlci5qc29uIG9mIGFsbCBpbnN0YWxsZWQgZGVwZW5kZW5jaWVzJyksCm5ldyBJbnB1dE9wdGlvbignc3RyaWN0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSZXR1cm4gYSBub24temVybyBleGl0IGNvZGUgZm9yIHdhcm5pbmdzIGFzIHdlbGwgYXMgZXJyb3JzJyksCm5ldyBJbnB1dEFyZ3VtZW50KCdmaWxlJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdwYXRoIHRvIGNvbXBvc2VyLmpzb24gZmlsZScpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgdmFsaWRhdGUgY29tbWFuZCB2YWxpZGF0ZXMgYSBnaXZlbiBjb21wb3Nlci5qc29uIGFuZCBjb21wb3Nlci5sb2NrCgpFeGl0IGNvZGVzIGluIGNhc2Ugb2YgZXJyb3JzIGFyZToKMSB2YWxpZGF0aW9uIHdhcm5pbmcocyksIG9ubHkgd2hlbiAtLXN0cmljdCBpcyBnaXZlbgoyIHZhbGlkYXRpb24gZXJyb3IocykKMyBmaWxlIHVucmVhZGFibGUgb3IgbWlzc2luZwoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjdmFsaWRhdGUKRU9UCik7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokZmlsZSA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ2ZpbGUnKSA/PyBGYWN0b3J5OjpnZXRDb21wb3NlckZpbGUoKTsKJGlvID0gJHRoaXMtPmdldElPKCk7CgppZiAoIWZpbGVfZXhpc3RzKCRmaWxlKSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj4nIC4gJGZpbGUgLiAnIG5vdCBmb3VuZC48L2Vycm9yPicpOwoKcmV0dXJuIDM7Cn0KaWYgKCFGaWxlc3lzdGVtOjppc1JlYWRhYmxlKCRmaWxlKSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj4nIC4gJGZpbGUgLiAnIGlzIG5vdCByZWFkYWJsZS48L2Vycm9yPicpOwoKcmV0dXJuIDM7Cn0KCiR2YWxpZGF0b3IgPSBuZXcgQ29uZmlnVmFsaWRhdG9yKCRpbyk7CiRjaGVja0FsbCA9ICRpbnB1dC0+Z2V0T3B0aW9uKCduby1jaGVjay1hbGwnKSA/IDAgOiBWYWxpZGF0aW5nQXJyYXlMb2FkZXI6OkNIRUNLX0FMTDsKJGNoZWNrUHVibGlzaCA9ICEkaW5wdXQtPmdldE9wdGlvbignbm8tY2hlY2stcHVibGlzaCcpOwokY2hlY2tMb2NrID0gISRpbnB1dC0+Z2V0T3B0aW9uKCduby1jaGVjay1sb2NrJyk7CiRjaGVja1ZlcnNpb24gPSAkaW5wdXQtPmdldE9wdGlvbignbm8tY2hlY2stdmVyc2lvbicpID8gMCA6IENvbmZpZ1ZhbGlkYXRvcjo6Q0hFQ0tfVkVSU0lPTjsKJGlzU3RyaWN0ID0gJGlucHV0LT5nZXRPcHRpb24oJ3N0cmljdCcpOwpbJGVycm9ycywgJHB1Ymxpc2hFcnJvcnMsICR3YXJuaW5nc10gPSAkdmFsaWRhdG9yLT52YWxpZGF0ZSgkZmlsZSwgJGNoZWNrQWxsLCAkY2hlY2tWZXJzaW9uKTsKCiRsb2NrRXJyb3JzID0gW107CiRjb21wb3NlciA9ICR0aGlzLT5jcmVhdGVDb21wb3Nlckluc3RhbmNlKCRpbnB1dCwgJGlvLCAkZmlsZSk7CgokY2hlY2tMb2NrID0gKCRjaGVja0xvY2sgJiYgJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdsb2NrJykpIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCdjaGVjay1sb2NrJyk7CiRsb2NrZXIgPSAkY29tcG9zZXItPmdldExvY2tlcigpOwppZiAoJGxvY2tlci0+aXNMb2NrZWQoKSAmJiAhJGxvY2tlci0+aXNGcmVzaCgpKSB7CiRsb2NrRXJyb3JzW10gPSAnLSBUaGUgbG9jayBmaWxlIGlzIG5vdCB1cCB0byBkYXRlIHdpdGggdGhlIGxhdGVzdCBjaGFuZ2VzIGluIGNvbXBvc2VyLmpzb24sIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IHJ1biBgY29tcG9zZXIgdXBkYXRlYCBvciBgY29tcG9zZXIgdXBkYXRlIDxwYWNrYWdlIG5hbWU+YC4nOwp9CgppZiAoJGxvY2tlci0+aXNMb2NrZWQoKSkgewokbG9ja0Vycm9ycyA9IGFycmF5X21lcmdlKCRsb2NrRXJyb3JzLCAkbG9ja2VyLT5nZXRNaXNzaW5nUmVxdWlyZW1lbnRJbmZvKCRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLCB0cnVlKSk7Cn0KCiR0aGlzLT5vdXRwdXRSZXN1bHQoJGlvLCAkZmlsZSwgJGVycm9ycywgJHdhcm5pbmdzLCAkY2hlY2tQdWJsaXNoLCAkcHVibGlzaEVycm9ycywgJGNoZWNrTG9jaywgJGxvY2tFcnJvcnMsIHRydWUpOwoKCiRleGl0Q29kZSA9IGNvdW50KCRlcnJvcnMpID4gMCA/IDIgOiAoKCRpc1N0cmljdCAmJiBjb3VudCgkd2FybmluZ3MpID4gMCkgPyAxIDogMCk7CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3dpdGgtZGVwZW5kZW5jaWVzJykpIHsKJGxvY2FsUmVwbyA9ICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7CmZvcmVhY2ggKCRsb2NhbFJlcG8tPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKJHBhdGggPSAkY29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKS0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwppZiAobnVsbCA9PT0gJHBhdGgpIHsKY29udGludWU7Cn0KJGZpbGUgPSAkcGF0aCAuICcvY29tcG9zZXIuanNvbic7CmlmIChpc19kaXIoJHBhdGgpICYmIGZpbGVfZXhpc3RzKCRmaWxlKSkgewpbJGVycm9ycywgJHB1Ymxpc2hFcnJvcnMsICR3YXJuaW5nc10gPSAkdmFsaWRhdG9yLT52YWxpZGF0ZSgkZmlsZSwgJGNoZWNrQWxsLCAkY2hlY2tWZXJzaW9uKTsKCiR0aGlzLT5vdXRwdXRSZXN1bHQoJGlvLCAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLCAkZXJyb3JzLCAkd2FybmluZ3MsICRjaGVja1B1Ymxpc2gsICRwdWJsaXNoRXJyb3JzKTsKCgokZGVwQ29kZSA9IGNvdW50KCRlcnJvcnMpID4gMCA/IDIgOiAoKCRpc1N0cmljdCAmJiBjb3VudCgkd2FybmluZ3MpID4gMCkgPyAxIDogMCk7CiRleGl0Q29kZSA9IG1heCgkZGVwQ29kZSwgJGV4aXRDb2RlKTsKfQp9Cn0KCiRjb21tYW5kRXZlbnQgPSBuZXcgQ29tbWFuZEV2ZW50KFBsdWdpbkV2ZW50czo6Q09NTUFORCwgJ3ZhbGlkYXRlJywgJGlucHV0LCAkb3V0cHV0KTsKJGV2ZW50Q29kZSA9ICRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmRpc3BhdGNoKCRjb21tYW5kRXZlbnQtPmdldE5hbWUoKSwgJGNvbW1hbmRFdmVudCk7CgpyZXR1cm4gbWF4KCRldmVudENvZGUsICRleGl0Q29kZSk7Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gb3V0cHV0UmVzdWx0KElPSW50ZXJmYWNlICRpbywgc3RyaW5nICRuYW1lLCBhcnJheSAmJGVycm9ycywgYXJyYXkgJiR3YXJuaW5ncywgYm9vbCAkY2hlY2tQdWJsaXNoID0gZmFsc2UsIGFycmF5ICRwdWJsaXNoRXJyb3JzID0gW10sIGJvb2wgJGNoZWNrTG9jayA9IGZhbHNlLCBhcnJheSAkbG9ja0Vycm9ycyA9IFtdLCBib29sICRwcmludFNjaGVtYVVybCA9IGZhbHNlKTogdm9pZAp7CiRkb1ByaW50U2NoZW1hVXJsID0gZmFsc2U7CgppZiAoXGNvdW50KCRlcnJvcnMpID4gMCkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj4nIC4gJG5hbWUgLiAnIGlzIGludmFsaWQsIHRoZSBmb2xsb3dpbmcgZXJyb3JzL3dhcm5pbmdzIHdlcmUgZm91bmQ6PC9lcnJvcj4nKTsKfSBlbHNlaWYgKFxjb3VudCgkcHVibGlzaEVycm9ycykgPiAwICYmICRjaGVja1B1Ymxpc2gpIHsKJGlvLT53cml0ZUVycm9yKCc8aW5mbz4nIC4gJG5hbWUgLiAnIGlzIHZhbGlkIGZvciBzaW1wbGUgdXNhZ2Ugd2l0aCBDb21wb3NlciBidXQgaGFzPC9pbmZvPicpOwokaW8tPndyaXRlRXJyb3IoJzxpbmZvPnN0cmljdCBlcnJvcnMgdGhhdCBtYWtlIGl0IHVuYWJsZSB0byBiZSBwdWJsaXNoZWQgYXMgYSBwYWNrYWdlPC9pbmZvPicpOwokZG9QcmludFNjaGVtYVVybCA9ICRwcmludFNjaGVtYVVybDsKfSBlbHNlaWYgKFxjb3VudCgkd2FybmluZ3MpID4gMCkgewokaW8tPndyaXRlRXJyb3IoJzxpbmZvPicgLiAkbmFtZSAuICcgaXMgdmFsaWQsIGJ1dCB3aXRoIGEgZmV3IHdhcm5pbmdzPC9pbmZvPicpOwokZG9QcmludFNjaGVtYVVybCA9ICRwcmludFNjaGVtYVVybDsKfSBlbHNlaWYgKFxjb3VudCgkbG9ja0Vycm9ycykgPiAwKSB7CiRpby0+d3JpdGUoJzxpbmZvPicgLiAkbmFtZSAuICcgaXMgdmFsaWQgYnV0IHlvdXIgY29tcG9zZXIubG9jayBoYXMgc29tZSAnLigkY2hlY2tMb2NrID8gJ2Vycm9ycycgOiAnd2FybmluZ3MnKS4nPC9pbmZvPicpOwp9IGVsc2UgewokaW8tPndyaXRlKCc8aW5mbz4nIC4gJG5hbWUgLiAnIGlzIHZhbGlkPC9pbmZvPicpOwp9CgppZiAoJGRvUHJpbnRTY2hlbWFVcmwpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5TZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzA0LXNjaGVtYS5tZCBmb3IgZGV0YWlscyBvbiB0aGUgc2NoZW1hPC93YXJuaW5nPicpOwp9CgppZiAoXGNvdW50KCRlcnJvcnMpID4gMCkgewokZXJyb3JzID0gYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGVycik6IHN0cmluZyB7CnJldHVybiAnLSAnIC4gJGVycjsKfSwgJGVycm9ycyk7CmFycmF5X3Vuc2hpZnQoJGVycm9ycywgJyMgR2VuZXJhbCBlcnJvcnMnKTsKfQppZiAoXGNvdW50KCR3YXJuaW5ncykgPiAwKSB7CiR3YXJuaW5ncyA9IGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRlcnIpOiBzdHJpbmcgewpyZXR1cm4gJy0gJyAuICRlcnI7Cn0sICR3YXJuaW5ncyk7CmFycmF5X3Vuc2hpZnQoJHdhcm5pbmdzLCAnIyBHZW5lcmFsIHdhcm5pbmdzJyk7Cn0KCgokZXh0cmFXYXJuaW5ncyA9IFtdOwoKCmlmIChcY291bnQoJHB1Ymxpc2hFcnJvcnMpID4gMCAmJiAkY2hlY2tQdWJsaXNoKSB7CiRwdWJsaXNoRXJyb3JzID0gYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGVycik6IHN0cmluZyB7CnJldHVybiAnLSAnIC4gJGVycjsKfSwgJHB1Ymxpc2hFcnJvcnMpOwoKYXJyYXlfdW5zaGlmdCgkcHVibGlzaEVycm9ycywgJyMgUHVibGlzaCBlcnJvcnMnKTsKJGVycm9ycyA9IGFycmF5X21lcmdlKCRlcnJvcnMsICRwdWJsaXNoRXJyb3JzKTsKfQoKCmlmIChcY291bnQoJGxvY2tFcnJvcnMpID4gMCkgewppZiAoJGNoZWNrTG9jaykgewphcnJheV91bnNoaWZ0KCRsb2NrRXJyb3JzLCAnIyBMb2NrIGZpbGUgZXJyb3JzJyk7CiRlcnJvcnMgPSBhcnJheV9tZXJnZSgkZXJyb3JzLCAkbG9ja0Vycm9ycyk7Cn0gZWxzZSB7CmFycmF5X3Vuc2hpZnQoJGxvY2tFcnJvcnMsICcjIExvY2sgZmlsZSB3YXJuaW5ncycpOwokZXh0cmFXYXJuaW5ncyA9IGFycmF5X21lcmdlKCRleHRyYVdhcm5pbmdzLCAkbG9ja0Vycm9ycyk7Cn0KfQoKJG1lc3NhZ2VzID0gWwonZXJyb3InID0+ICRlcnJvcnMsCid3YXJuaW5nJyA9PiBhcnJheV9tZXJnZSgkd2FybmluZ3MsICRleHRyYVdhcm5pbmdzKSwKXTsKCmZvcmVhY2ggKCRtZXNzYWdlcyBhcyAkc3R5bGUgPT4gJG1zZ3MpIHsKZm9yZWFjaCAoJG1zZ3MgYXMgJG1zZykgewppZiAoc3RycG9zKCRtc2csICcjJykgPT09IDApIHsKJGlvLT53cml0ZUVycm9yKCc8JyAuICRzdHlsZSAuICc+JyAuICRtc2cgLiAnPC8nIC4gJHN0eWxlIC4gJz4nKTsKfSBlbHNlIHsKJGlvLT53cml0ZUVycm9yKCRtc2cpOwp9Cn0KfQp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9ja2VyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbk1hbmFnZXI7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXERvd25sb2FkTWFuYWdlcjsKdXNlIENvbXBvc2VyXEF1dG9sb2FkXEF1dG9sb2FkR2VuZXJhdG9yOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxBcmNoaXZlclxBcmNoaXZlTWFuYWdlcjsKCgoKCgoKY2xhc3MgQ29tcG9zZXIgZXh0ZW5kcyBQYXJ0aWFsQ29tcG9zZXIKewoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGNvbnN0IFZFUlNJT04gPSAnMi45LjgnOwpwdWJsaWMgY29uc3QgQlJBTkNIX0FMSUFTX1ZFUlNJT04gPSAnJzsKcHVibGljIGNvbnN0IFJFTEVBU0VfREFURSA9ICcyMDI2LTA1LTEzIDA5OjI4OjM4JzsKcHVibGljIGNvbnN0IFNPVVJDRV9WRVJTSU9OID0gJyc7CgoKCgoKCgoKCgpwdWJsaWMgY29uc3QgUlVOVElNRV9BUElfVkVSU0lPTiA9ICcyLjIuMic7CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nCnsKCmlmIChzZWxmOjpWRVJTSU9OID09PSAnQHBhY2thZ2VfdmVyc2lvbicuJ0AnKSB7CnJldHVybiBzZWxmOjpTT1VSQ0VfVkVSU0lPTjsKfQoKCmlmIChzZWxmOjpCUkFOQ0hfQUxJQVNfVkVSU0lPTiAhPT0gJycgJiYgUHJlZzo6aXNNYXRjaCgne15bYS1mMC05XXs0MH0kfScsIHNlbGY6OlZFUlNJT04pKSB7CnJldHVybiBzZWxmOjpCUkFOQ0hfQUxJQVNfVkVSU0lPTi4nKycuc2VsZjo6VkVSU0lPTjsKfQoKcmV0dXJuIHNlbGY6OlZFUlNJT047Cn0KCgoKCnByaXZhdGUgJGxvY2tlcjsKCgoKCnByaXZhdGUgJGRvd25sb2FkTWFuYWdlcjsKCgoKCnByaXZhdGUgJHBsdWdpbk1hbmFnZXI7CgoKCgpwcml2YXRlICRhdXRvbG9hZEdlbmVyYXRvcjsKCgoKCnByaXZhdGUgJGFyY2hpdmVNYW5hZ2VyOwoKcHVibGljIGZ1bmN0aW9uIHNldExvY2tlcihMb2NrZXIgJGxvY2tlcik6IHZvaWQKewokdGhpcy0+bG9ja2VyID0gJGxvY2tlcjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldExvY2tlcigpOiBMb2NrZXIKewpyZXR1cm4gJHRoaXMtPmxvY2tlcjsKfQoKcHVibGljIGZ1bmN0aW9uIHNldERvd25sb2FkTWFuYWdlcihEb3dubG9hZE1hbmFnZXIgJG1hbmFnZXIpOiB2b2lkCnsKJHRoaXMtPmRvd25sb2FkTWFuYWdlciA9ICRtYW5hZ2VyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RG93bmxvYWRNYW5hZ2VyKCk6IERvd25sb2FkTWFuYWdlcgp7CnJldHVybiAkdGhpcy0+ZG93bmxvYWRNYW5hZ2VyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0QXJjaGl2ZU1hbmFnZXIoQXJjaGl2ZU1hbmFnZXIgJG1hbmFnZXIpOiB2b2lkCnsKJHRoaXMtPmFyY2hpdmVNYW5hZ2VyID0gJG1hbmFnZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRBcmNoaXZlTWFuYWdlcigpOiBBcmNoaXZlTWFuYWdlcgp7CnJldHVybiAkdGhpcy0+YXJjaGl2ZU1hbmFnZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRQbHVnaW5NYW5hZ2VyKFBsdWdpbk1hbmFnZXIgJG1hbmFnZXIpOiB2b2lkCnsKJHRoaXMtPnBsdWdpbk1hbmFnZXIgPSAkbWFuYWdlcjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFBsdWdpbk1hbmFnZXIoKTogUGx1Z2luTWFuYWdlcgp7CnJldHVybiAkdGhpcy0+cGx1Z2luTWFuYWdlcjsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEF1dG9sb2FkR2VuZXJhdG9yKEF1dG9sb2FkR2VuZXJhdG9yICRhdXRvbG9hZEdlbmVyYXRvcik6IHZvaWQKewokdGhpcy0+YXV0b2xvYWRHZW5lcmF0b3IgPSAkYXV0b2xvYWRHZW5lcmF0b3I7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRBdXRvbG9hZEdlbmVyYXRvcigpOiBBdXRvbG9hZEdlbmVyYXRvcgp7CnJldHVybiAkdGhpcy0+YXV0b2xvYWRHZW5lcmF0b3I7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXI7Cgp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcQXVkaXRvcjsKdXNlIENvbXBvc2VyXENvbmZpZ1xDb25maWdTb3VyY2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwoKCgoKY2xhc3MgQ29uZmlnCnsKcHVibGljIGNvbnN0IFNPVVJDRV9ERUZBVUxUID0gJ2RlZmF1bHQnOwpwdWJsaWMgY29uc3QgU09VUkNFX0NPTU1BTkQgPSAnY29tbWFuZCc7CnB1YmxpYyBjb25zdCBTT1VSQ0VfVU5LTk9XTiA9ICd1bmtub3duJzsKCnB1YmxpYyBjb25zdCBSRUxBVElWRV9QQVRIUyA9IDE7CgoKcHVibGljIHN0YXRpYyAkZGVmYXVsdENvbmZpZyA9IFsKJ3Byb2Nlc3MtdGltZW91dCcgPT4gMzAwLAondXNlLWluY2x1ZGUtcGF0aCcgPT4gZmFsc2UsCidhbGxvdy1wbHVnaW5zJyA9PiBbXSwKJ3VzZS1wYXJlbnQtZGlyJyA9PiAncHJvbXB0JywKJ3ByZWZlcnJlZC1pbnN0YWxsJyA9PiAnZGlzdCcsCidhdWRpdCcgPT4gWydpZ25vcmUnID0+IFtdLCAnYWJhbmRvbmVkJyA9PiBBdWRpdG9yOjpBQkFORE9ORURfRkFJTF0sCidub3RpZnktb24taW5zdGFsbCcgPT4gdHJ1ZSwKJ2dpdGh1Yi1wcm90b2NvbHMnID0+IFsnaHR0cHMnLCAnc3NoJywgJ2dpdCddLAonZ2l0bGFiLXByb3RvY29sJyA9PiBudWxsLAondmVuZG9yLWRpcicgPT4gJ3ZlbmRvcicsCidiaW4tZGlyJyA9PiAneyR2ZW5kb3ItZGlyfS9iaW4nLAonY2FjaGUtZGlyJyA9PiAneyRob21lfS9jYWNoZScsCidkYXRhLWRpcicgPT4gJ3skaG9tZX0nLAonY2FjaGUtZmlsZXMtZGlyJyA9PiAneyRjYWNoZS1kaXJ9L2ZpbGVzJywKJ2NhY2hlLXJlcG8tZGlyJyA9PiAneyRjYWNoZS1kaXJ9L3JlcG8nLAonY2FjaGUtdmNzLWRpcicgPT4gJ3skY2FjaGUtZGlyfS92Y3MnLAonY2FjaGUtdHRsJyA9PiAxNTU1MjAwMCwgCidjYWNoZS1maWxlcy10dGwnID0+IG51bGwsIAonY2FjaGUtZmlsZXMtbWF4c2l6ZScgPT4gJzMwME1pQicsCidjYWNoZS1yZWFkLW9ubHknID0+IGZhbHNlLAonYmluLWNvbXBhdCcgPT4gJ2F1dG8nLAonZGlzY2FyZC1jaGFuZ2VzJyA9PiBmYWxzZSwKJ2F1dG9sb2FkZXItc3VmZml4JyA9PiBudWxsLAonc29ydC1wYWNrYWdlcycgPT4gZmFsc2UsCidvcHRpbWl6ZS1hdXRvbG9hZGVyJyA9PiBmYWxzZSwKJ2NsYXNzbWFwLWF1dGhvcml0YXRpdmUnID0+IGZhbHNlLAonYXBjdS1hdXRvbG9hZGVyJyA9PiBmYWxzZSwKJ3ByZXBlbmQtYXV0b2xvYWRlcicgPT4gdHJ1ZSwKJ3VwZGF0ZS13aXRoLW1pbmltYWwtY2hhbmdlcycgPT4gZmFsc2UsCidnaXRodWItZG9tYWlucycgPT4gWydnaXRodWIuY29tJ10sCidiaXRidWNrZXQtZXhwb3NlLWhvc3RuYW1lJyA9PiB0cnVlLAonZGlzYWJsZS10bHMnID0+IGZhbHNlLAonc2VjdXJlLWh0dHAnID0+IHRydWUsCidzZWN1cmUtc3ZuLWRvbWFpbnMnID0+IFtdLAonY2FmaWxlJyA9PiBudWxsLAonY2FwYXRoJyA9PiBudWxsLAonZ2l0aHViLWV4cG9zZS1ob3N0bmFtZScgPT4gdHJ1ZSwKJ2dpdGxhYi1kb21haW5zJyA9PiBbJ2dpdGxhYi5jb20nXSwKJ3N0b3JlLWF1dGhzJyA9PiAncHJvbXB0JywKJ3BsYXRmb3JtJyA9PiBbXSwKJ2FyY2hpdmUtZm9ybWF0JyA9PiAndGFyJywKJ2FyY2hpdmUtZGlyJyA9PiAnLicsCidodGFjY2Vzcy1wcm90ZWN0JyA9PiB0cnVlLAondXNlLWdpdGh1Yi1hcGknID0+IHRydWUsCidsb2NrJyA9PiB0cnVlLAoncGxhdGZvcm0tY2hlY2snID0+ICdwaHAtb25seScsCidiaXRidWNrZXQtb2F1dGgnID0+IFtdLAonZ2l0aHViLW9hdXRoJyA9PiBbXSwKJ2dpdGxhYi1vYXV0aCcgPT4gW10sCidnaXRsYWItdG9rZW4nID0+IFtdLAonaHR0cC1iYXNpYycgPT4gW10sCidiZWFyZXInID0+IFtdLAonY3VzdG9tLWhlYWRlcnMnID0+IFtdLAonYnVtcC1hZnRlci11cGRhdGUnID0+IGZhbHNlLAonYWxsb3ctbWlzc2luZy1yZXF1aXJlbWVudHMnID0+IGZhbHNlLAonY2xpZW50LWNlcnRpZmljYXRlJyA9PiBbXSwKJ2Zvcmdlam8tZG9tYWlucycgPT4gWydjb2RlYmVyZy5vcmcnXSwKJ2Zvcmdlam8tdG9rZW4nID0+IFtdLApdOwoKCnB1YmxpYyBzdGF0aWMgJGRlZmF1bHRSZXBvc2l0b3JpZXMgPSBbCidwYWNrYWdpc3Qub3JnJyA9PiBbCid0eXBlJyA9PiAnY29tcG9zZXInLAondXJsJyA9PiAnaHR0cHM6Ly9yZXBvLnBhY2thZ2lzdC5vcmcnLApdLApdOwoKCnByaXZhdGUgJGNvbmZpZzsKCnByaXZhdGUgJGJhc2VEaXI7Cgpwcml2YXRlICRyZXBvc2l0b3JpZXM7Cgpwcml2YXRlICRjb25maWdTb3VyY2U7Cgpwcml2YXRlICRhdXRoQ29uZmlnU291cmNlOwoKcHJpdmF0ZSAkbG9jYWxBdXRoQ29uZmlnU291cmNlID0gbnVsbDsKCnByaXZhdGUgJHVzZUVudmlyb25tZW50OwoKcHJpdmF0ZSAkd2FybmVkSG9zdHMgPSBbXTsKCnByaXZhdGUgJHNzbFZlcmlmeVdhcm5lZEhvc3RzID0gW107Cgpwcml2YXRlICRzb3VyY2VPZkNvbmZpZ1ZhbHVlID0gW107CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGJvb2wgJHVzZUVudmlyb25tZW50ID0gdHJ1ZSwgP3N0cmluZyAkYmFzZURpciA9IG51bGwpCnsKCiR0aGlzLT5jb25maWcgPSBzdGF0aWM6OiRkZWZhdWx0Q29uZmlnOwoKJHRoaXMtPnJlcG9zaXRvcmllcyA9IHN0YXRpYzo6JGRlZmF1bHRSZXBvc2l0b3JpZXM7CiR0aGlzLT51c2VFbnZpcm9ubWVudCA9ICR1c2VFbnZpcm9ubWVudDsKJHRoaXMtPmJhc2VEaXIgPSBpc19zdHJpbmcoJGJhc2VEaXIpICYmICcnICE9PSAkYmFzZURpciA/ICRiYXNlRGlyIDogbnVsbDsKCmZvcmVhY2ggKCR0aGlzLT5jb25maWcgYXMgJGNvbmZpZ0tleSA9PiAkY29uZmlnVmFsdWUpIHsKJHRoaXMtPnNldFNvdXJjZU9mQ29uZmlnVmFsdWUoJGNvbmZpZ1ZhbHVlLCAkY29uZmlnS2V5LCBzZWxmOjpTT1VSQ0VfREVGQVVMVCk7Cn0KCmZvcmVhY2ggKCR0aGlzLT5yZXBvc2l0b3JpZXMgYXMgJGNvbmZpZ0tleSA9PiAkY29uZmlnVmFsdWUpIHsKJHRoaXMtPnNldFNvdXJjZU9mQ29uZmlnVmFsdWUoJGNvbmZpZ1ZhbHVlLCAncmVwb3NpdG9yaWVzLicgLiAkY29uZmlnS2V5LCBzZWxmOjpTT1VSQ0VfREVGQVVMVCk7Cn0KfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRCYXNlRGlyKD9zdHJpbmcgJGJhc2VEaXIpOiB2b2lkCnsKJHRoaXMtPmJhc2VEaXIgPSAkYmFzZURpcjsKfQoKcHVibGljIGZ1bmN0aW9uIHNldENvbmZpZ1NvdXJjZShDb25maWdTb3VyY2VJbnRlcmZhY2UgJHNvdXJjZSk6IHZvaWQKewokdGhpcy0+Y29uZmlnU291cmNlID0gJHNvdXJjZTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldENvbmZpZ1NvdXJjZSgpOiBDb25maWdTb3VyY2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmNvbmZpZ1NvdXJjZTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEF1dGhDb25maWdTb3VyY2UoQ29uZmlnU291cmNlSW50ZXJmYWNlICRzb3VyY2UpOiB2b2lkCnsKJHRoaXMtPmF1dGhDb25maWdTb3VyY2UgPSAkc291cmNlOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXV0aENvbmZpZ1NvdXJjZSgpOiBDb25maWdTb3VyY2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmF1dGhDb25maWdTb3VyY2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRMb2NhbEF1dGhDb25maWdTb3VyY2UoQ29uZmlnU291cmNlSW50ZXJmYWNlICRzb3VyY2UpOiB2b2lkCnsKJHRoaXMtPmxvY2FsQXV0aENvbmZpZ1NvdXJjZSA9ICRzb3VyY2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRMb2NhbEF1dGhDb25maWdTb3VyY2UoKTogP0NvbmZpZ1NvdXJjZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+bG9jYWxBdXRoQ29uZmlnU291cmNlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBtZXJnZShhcnJheSAkY29uZmlnLCBzdHJpbmcgJHNvdXJjZSA9IHNlbGY6OlNPVVJDRV9VTktOT1dOKTogdm9pZAp7CgppZiAoIWVtcHR5KCRjb25maWdbJ2NvbmZpZyddKSAmJiBpc19hcnJheSgkY29uZmlnWydjb25maWcnXSkpIHsKZm9yZWFjaCAoJGNvbmZpZ1snY29uZmlnJ10gYXMgJGtleSA9PiAkdmFsKSB7CmlmIChpbl9hcnJheSgka2V5LCBbJ2JpdGJ1Y2tldC1vYXV0aCcsICdnaXRodWItb2F1dGgnLCAnZ2l0bGFiLW9hdXRoJywgJ2dpdGxhYi10b2tlbicsICdodHRwLWJhc2ljJywgJ2JlYXJlcicsICdjbGllbnQtY2VydGlmaWNhdGUnLCAnZm9yZ2Vqby10b2tlbiddLCB0cnVlKSAmJiBpc3NldCgkdGhpcy0+Y29uZmlnWyRrZXldKSkgewokdGhpcy0+Y29uZmlnWyRrZXldID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmNvbmZpZ1ska2V5XSwgJHZhbCk7CiR0aGlzLT5zZXRTb3VyY2VPZkNvbmZpZ1ZhbHVlKCR2YWwsICRrZXksICRzb3VyY2UpOwp9IGVsc2VpZiAoaW5fYXJyYXkoJGtleSwgWydhbGxvdy1wbHVnaW5zJ10sIHRydWUpICYmIGlzc2V0KCR0aGlzLT5jb25maWdbJGtleV0pICYmIGlzX2FycmF5KCR0aGlzLT5jb25maWdbJGtleV0pICYmIGlzX2FycmF5KCR2YWwpKSB7CgoKJHRoaXMtPmNvbmZpZ1ska2V5XSA9IGFycmF5X21lcmdlKCR2YWwsICR0aGlzLT5jb25maWdbJGtleV0sICR2YWwpOwokdGhpcy0+c2V0U291cmNlT2ZDb25maWdWYWx1ZSgkdmFsLCAka2V5LCAkc291cmNlKTsKfSBlbHNlaWYgKGluX2FycmF5KCRrZXksIFsnZ2l0bGFiLWRvbWFpbnMnLCAnZ2l0aHViLWRvbWFpbnMnXSwgdHJ1ZSkgJiYgaXNzZXQoJHRoaXMtPmNvbmZpZ1ska2V5XSkpIHsKJHRoaXMtPmNvbmZpZ1ska2V5XSA9IGFycmF5X3VuaXF1ZShhcnJheV9tZXJnZSgkdGhpcy0+Y29uZmlnWyRrZXldLCAkdmFsKSk7CiR0aGlzLT5zZXRTb3VyY2VPZkNvbmZpZ1ZhbHVlKCR2YWwsICRrZXksICRzb3VyY2UpOwp9IGVsc2VpZiAoJ3ByZWZlcnJlZC1pbnN0YWxsJyA9PT0gJGtleSAmJiBpc3NldCgkdGhpcy0+Y29uZmlnWyRrZXldKSkgewppZiAoaXNfYXJyYXkoJHZhbCkgfHwgaXNfYXJyYXkoJHRoaXMtPmNvbmZpZ1ska2V5XSkpIHsKaWYgKGlzX3N0cmluZygkdmFsKSkgewokdmFsID0gWycqJyA9PiAkdmFsXTsKfQppZiAoaXNfc3RyaW5nKCR0aGlzLT5jb25maWdbJGtleV0pKSB7CiR0aGlzLT5jb25maWdbJGtleV0gPSBbJyonID0+ICR0aGlzLT5jb25maWdbJGtleV1dOwokdGhpcy0+c291cmNlT2ZDb25maWdWYWx1ZVska2V5IC4gJyonXSA9ICRzb3VyY2U7Cn0KJHRoaXMtPmNvbmZpZ1ska2V5XSA9IGFycmF5X21lcmdlKCR0aGlzLT5jb25maWdbJGtleV0sICR2YWwpOwokdGhpcy0+c2V0U291cmNlT2ZDb25maWdWYWx1ZSgkdmFsLCAka2V5LCAkc291cmNlKTsKCmlmIChpc3NldCgkdGhpcy0+Y29uZmlnWyRrZXldWycqJ10pKSB7CiR3aWxkY2FyZCA9ICR0aGlzLT5jb25maWdbJGtleV1bJyonXTsKdW5zZXQoJHRoaXMtPmNvbmZpZ1ska2V5XVsnKiddKTsKJHRoaXMtPmNvbmZpZ1ska2V5XVsnKiddID0gJHdpbGRjYXJkOwp9Cn0gZWxzZSB7CiR0aGlzLT5jb25maWdbJGtleV0gPSAkdmFsOwokdGhpcy0+c2V0U291cmNlT2ZDb25maWdWYWx1ZSgkdmFsLCAka2V5LCAkc291cmNlKTsKfQp9IGVsc2VpZiAoJ2F1ZGl0JyA9PT0gJGtleSkgewokY3VycmVudElnbm9yZXMgPSAkdGhpcy0+Y29uZmlnWydhdWRpdCddWydpZ25vcmUnXTsKJHRoaXMtPmNvbmZpZ1ska2V5XSA9IGFycmF5X21lcmdlKCR0aGlzLT5jb25maWdbJ2F1ZGl0J10sICR2YWwpOwokdGhpcy0+c2V0U291cmNlT2ZDb25maWdWYWx1ZSgkdmFsLCAka2V5LCAkc291cmNlKTsKJHRoaXMtPmNvbmZpZ1snYXVkaXQnXVsnaWdub3JlJ10gPSBhcnJheV9tZXJnZSgkY3VycmVudElnbm9yZXMsICR2YWxbJ2lnbm9yZSddID8/IFtdKTsKfSBlbHNlIHsKJHRoaXMtPmNvbmZpZ1ska2V5XSA9ICR2YWw7CiR0aGlzLT5zZXRTb3VyY2VPZkNvbmZpZ1ZhbHVlKCR2YWwsICRrZXksICRzb3VyY2UpOwp9Cn0KfQoKaWYgKCFlbXB0eSgkY29uZmlnWydyZXBvc2l0b3JpZXMnXSkgJiYgaXNfYXJyYXkoJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ10pKSB7CiR0aGlzLT5yZXBvc2l0b3JpZXMgPSBhcnJheV9yZXZlcnNlKCR0aGlzLT5yZXBvc2l0b3JpZXMsIHRydWUpOwokbmV3UmVwb3MgPSBhcnJheV9yZXZlcnNlKCRjb25maWdbJ3JlcG9zaXRvcmllcyddLCB0cnVlKTsKZm9yZWFjaCAoJG5ld1JlcG9zIGFzICRuYW1lID0+ICRyZXBvc2l0b3J5KSB7CgoKaWYgKGZhbHNlID09PSAkcmVwb3NpdG9yeSkgewokdGhpcy0+ZGlzYWJsZVJlcG9CeU5hbWUoKHN0cmluZykgJG5hbWUpOwpjb250aW51ZTsKfQoKCmlmIChpc19hcnJheSgkcmVwb3NpdG9yeSkgJiYgMSA9PT0gY291bnQoJHJlcG9zaXRvcnkpICYmIGZhbHNlID09PSBjdXJyZW50KCRyZXBvc2l0b3J5KSkgewokdGhpcy0+ZGlzYWJsZVJlcG9CeU5hbWUoKHN0cmluZykga2V5KCRyZXBvc2l0b3J5KSk7CmNvbnRpbnVlOwp9CgoKaWYgKGlzc2V0KCRyZXBvc2l0b3J5Wyd0eXBlJ10sICRyZXBvc2l0b3J5Wyd1cmwnXSkgJiYgJHJlcG9zaXRvcnlbJ3R5cGUnXSA9PT0gJ2NvbXBvc2VyJyAmJiBQcmVnOjppc01hdGNoKCd7Xmh0dHBzPzovLyg/OlthLXowLTktLl0rXC4pP3BhY2thZ2lzdC5vcmcoL3wkKX0nLCAkcmVwb3NpdG9yeVsndXJsJ10pKSB7CiR0aGlzLT5kaXNhYmxlUmVwb0J5TmFtZSgncGFja2FnaXN0Lm9yZycpOwp9CgoKaWYgKGlzX2ludCgkbmFtZSkpIHsKaWYgKCFpc3NldCgkdGhpcy0+cmVwb3NpdG9yaWVzWyRuYW1lXSkpIHsKJHRoaXMtPnJlcG9zaXRvcmllc1skbmFtZV0gPSAkcmVwb3NpdG9yeTsKfSBlbHNlIHsKJHRoaXMtPnJlcG9zaXRvcmllc1tdID0gJHJlcG9zaXRvcnk7Cn0KJHRoaXMtPnNldFNvdXJjZU9mQ29uZmlnVmFsdWUoJHJlcG9zaXRvcnksICdyZXBvc2l0b3JpZXMuJyAuIGFycmF5X3NlYXJjaCgkcmVwb3NpdG9yeSwgJHRoaXMtPnJlcG9zaXRvcmllcywgdHJ1ZSksICRzb3VyY2UpOwp9IGVsc2UgewppZiAoJG5hbWUgPT09ICdwYWNrYWdpc3QnKSB7IAokdGhpcy0+cmVwb3NpdG9yaWVzWyRuYW1lIC4gJy5vcmcnXSA9ICRyZXBvc2l0b3J5OwokdGhpcy0+c2V0U291cmNlT2ZDb25maWdWYWx1ZSgkcmVwb3NpdG9yeSwgJ3JlcG9zaXRvcmllcy4nIC4gJG5hbWUgLiAnLm9yZycsICRzb3VyY2UpOwp9IGVsc2UgewokdGhpcy0+cmVwb3NpdG9yaWVzWyRuYW1lXSA9ICRyZXBvc2l0b3J5OwokdGhpcy0+c2V0U291cmNlT2ZDb25maWdWYWx1ZSgkcmVwb3NpdG9yeSwgJ3JlcG9zaXRvcmllcy4nIC4gJG5hbWUsICRzb3VyY2UpOwp9Cn0KfQokdGhpcy0+cmVwb3NpdG9yaWVzID0gYXJyYXlfcmV2ZXJzZSgkdGhpcy0+cmVwb3NpdG9yaWVzLCB0cnVlKTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb3NpdG9yaWVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yZXBvc2l0b3JpZXM7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldChzdHJpbmcgJGtleSwgaW50ICRmbGFncyA9IDApCnsKc3dpdGNoICgka2V5KSB7CgpjYXNlICd2ZW5kb3ItZGlyJzoKY2FzZSAnYmluLWRpcic6CmNhc2UgJ3Byb2Nlc3MtdGltZW91dCc6CmNhc2UgJ2RhdGEtZGlyJzoKY2FzZSAnY2FjaGUtZGlyJzoKY2FzZSAnY2FjaGUtZmlsZXMtZGlyJzoKY2FzZSAnY2FjaGUtcmVwby1kaXInOgpjYXNlICdjYWNoZS12Y3MtZGlyJzoKY2FzZSAnY2FmaWxlJzoKY2FzZSAnY2FwYXRoJzoKCiRlbnYgPSAnQ09NUE9TRVJfJyAuIHN0cnRvdXBwZXIoc3RydHIoJGtleSwgJy0nLCAnXycpKTsKCiR2YWwgPSAkdGhpcy0+Z2V0Q29tcG9zZXJFbnYoJGVudik7CmlmICgkdmFsICE9PSBmYWxzZSkgewokdGhpcy0+c2V0U291cmNlT2ZDb25maWdWYWx1ZSgkdmFsLCAka2V5LCAkZW52KTsKfQoKaWYgKCRrZXkgPT09ICdwcm9jZXNzLXRpbWVvdXQnKSB7CnJldHVybiBtYXgoMCwgZmFsc2UgIT09ICR2YWwgPyAoaW50KSAkdmFsIDogJHRoaXMtPmNvbmZpZ1ska2V5XSk7Cn0KCiR2YWwgPSBydHJpbSgoc3RyaW5nKSAkdGhpcy0+cHJvY2VzcyhmYWxzZSAhPT0gJHZhbCA/ICR2YWwgOiAkdGhpcy0+Y29uZmlnWyRrZXldLCAkZmxhZ3MpLCAnL1xcJyk7CiR2YWwgPSBQbGF0Zm9ybTo6ZXhwYW5kUGF0aCgkdmFsKTsKCmlmIChzdWJzdHIoJGtleSwgLTQpICE9PSAnLWRpcicpIHsKcmV0dXJuICR2YWw7Cn0KCnJldHVybiAoKCRmbGFncyAmIHNlbGY6OlJFTEFUSVZFX1BBVEhTKSA9PT0gc2VsZjo6UkVMQVRJVkVfUEFUSFMpID8gJHZhbCA6ICR0aGlzLT5yZWFscGF0aCgkdmFsKTsKCgpjYXNlICdjYWNoZS1yZWFkLW9ubHknOgpjYXNlICdodGFjY2Vzcy1wcm90ZWN0JzoKCiRlbnYgPSAnQ09NUE9TRVJfJyAuIHN0cnRvdXBwZXIoc3RydHIoJGtleSwgJy0nLCAnXycpKTsKCiR2YWwgPSAkdGhpcy0+Z2V0Q29tcG9zZXJFbnYoJGVudik7CmlmIChmYWxzZSA9PT0gJHZhbCkgewokdmFsID0gJHRoaXMtPmNvbmZpZ1ska2V5XTsKfSBlbHNlIHsKJHRoaXMtPnNldFNvdXJjZU9mQ29uZmlnVmFsdWUoJHZhbCwgJGtleSwgJGVudik7Cn0KCnJldHVybiAkdmFsICE9PSAnZmFsc2UnICYmIChib29sKSAkdmFsOwoKCmNhc2UgJ2Rpc2FibGUtdGxzJzoKY2FzZSAnc2VjdXJlLWh0dHAnOgpjYXNlICd1c2UtZ2l0aHViLWFwaSc6CmNhc2UgJ2xvY2snOgoKaWYgKCRrZXkgPT09ICdzZWN1cmUtaHR0cCcgJiYgJHRoaXMtPmdldCgnZGlzYWJsZS10bHMnKSA9PT0gdHJ1ZSkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiAkdGhpcy0+Y29uZmlnWyRrZXldICE9PSAnZmFsc2UnICYmIChib29sKSAkdGhpcy0+Y29uZmlnWyRrZXldOwoKCmNhc2UgJ2NhY2hlLXR0bCc6CnJldHVybiBtYXgoMCwgKGludCkgJHRoaXMtPmNvbmZpZ1ska2V5XSk7CgoKY2FzZSAnY2FjaGUtZmlsZXMtbWF4c2l6ZSc6CmlmICghUHJlZzo6aXNNYXRjaCgnL15ccyooWzAtOS5dKylccyooPzooW2ttZ10pKD86aT9iKT8pP1xzKiQvaScsIChzdHJpbmcpICR0aGlzLT5jb25maWdbJGtleV0sICRtYXRjaGVzKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCiJDb3VsZCBub3QgcGFyc2UgdGhlIHZhbHVlIG9mICcka2V5JzogeyR0aGlzLT5jb25maWdbJGtleV19IgopOwp9CiRzaXplID0gKGZsb2F0KSAkbWF0Y2hlc1sxXTsKaWYgKGlzc2V0KCRtYXRjaGVzWzJdKSkgewpzd2l0Y2ggKHN0cnRvbG93ZXIoJG1hdGNoZXNbMl0pKSB7CmNhc2UgJ2cnOgokc2l6ZSAqPSAxMDI0OwoKCmNhc2UgJ20nOgokc2l6ZSAqPSAxMDI0OwoKCmNhc2UgJ2snOgokc2l6ZSAqPSAxMDI0OwpicmVhazsKfQp9CgpyZXR1cm4gbWF4KDAsIChpbnQpICRzaXplKTsKCgpjYXNlICdjYWNoZS1maWxlcy10dGwnOgppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1ska2V5XSkpIHsKcmV0dXJuIG1heCgwLCAoaW50KSAkdGhpcy0+Y29uZmlnWyRrZXldKTsKfQoKcmV0dXJuICR0aGlzLT5nZXQoJ2NhY2hlLXR0bCcpOwoKY2FzZSAnaG9tZSc6CnJldHVybiBydHJpbSgkdGhpcy0+cHJvY2VzcyhQbGF0Zm9ybTo6ZXhwYW5kUGF0aCgkdGhpcy0+Y29uZmlnWyRrZXldKSwgJGZsYWdzKSwgJy9cXCcpOwoKY2FzZSAnYmluLWNvbXBhdCc6CiR2YWx1ZSA9ICR0aGlzLT5nZXRDb21wb3NlckVudignQ09NUE9TRVJfQklOX0NPTVBBVCcpID86ICR0aGlzLT5jb25maWdbJGtleV07CgppZiAoIWluX2FycmF5KCR2YWx1ZSwgWydhdXRvJywgJ2Z1bGwnLCAncHJveHknLCAnc3ltbGluayddKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCiJJbnZhbGlkIHZhbHVlIGZvciAnYmluLWNvbXBhdCc6IHskdmFsdWV9LiBFeHBlY3RlZCBhdXRvLCBmdWxsIG9yIHByb3h5IgopOwp9CgppZiAoJHZhbHVlID09PSAnc3ltbGluaycpIHsKdHJpZ2dlcl9lcnJvcignY29uZmlnLmJpbi1jb21wYXQgInN5bWxpbmsiIGlzIGRlcHJlY2F0ZWQgc2luY2UgQ29tcG9zZXIgMi4yLCB1c2UgYXV0bywgZnVsbCAoZm9yIFdpbmRvd3MgY29tcGF0aWJpbGl0eSkgb3IgcHJveHkgaW5zdGVhZC4nLCBFX1VTRVJfREVQUkVDQVRFRCk7Cn0KCnJldHVybiAkdmFsdWU7CgpjYXNlICdkaXNjYXJkLWNoYW5nZXMnOgokZW52ID0gJHRoaXMtPmdldENvbXBvc2VyRW52KCdDT01QT1NFUl9ESVNDQVJEX0NIQU5HRVMnKTsKaWYgKCRlbnYgIT09IGZhbHNlKSB7CmlmICghaW5fYXJyYXkoJGVudiwgWydzdGFzaCcsICd0cnVlJywgJ2ZhbHNlJywgJzEnLCAnMCddLCB0cnVlKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCiJJbnZhbGlkIHZhbHVlIGZvciBDT01QT1NFUl9ESVNDQVJEX0NIQU5HRVM6IHskZW52fS4gRXhwZWN0ZWQgMSwgMCwgdHJ1ZSwgZmFsc2Ugb3Igc3Rhc2giCik7Cn0KaWYgKCdzdGFzaCcgPT09ICRlbnYpIHsKcmV0dXJuICdzdGFzaCc7Cn0KCgpyZXR1cm4gJGVudiAhPT0gJ2ZhbHNlJyAmJiAoYm9vbCkgJGVudjsKfQoKaWYgKCFpbl9hcnJheSgkdGhpcy0+Y29uZmlnWyRrZXldLCBbdHJ1ZSwgZmFsc2UsICdzdGFzaCddLCB0cnVlKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCiJJbnZhbGlkIHZhbHVlIGZvciAnZGlzY2FyZC1jaGFuZ2VzJzogeyR0aGlzLT5jb25maWdbJGtleV19LiBFeHBlY3RlZCB0cnVlLCBmYWxzZSBvciBzdGFzaCIKKTsKfQoKcmV0dXJuICR0aGlzLT5jb25maWdbJGtleV07CgpjYXNlICdnaXRodWItcHJvdG9jb2xzJzoKJHByb3RvcyA9ICR0aGlzLT5jb25maWdbJ2dpdGh1Yi1wcm90b2NvbHMnXTsKaWYgKCR0aGlzLT5jb25maWdbJ3NlY3VyZS1odHRwJ10gJiYgZmFsc2UgIT09ICgkaW5kZXggPSBhcnJheV9zZWFyY2goJ2dpdCcsICRwcm90b3MpKSkgewp1bnNldCgkcHJvdG9zWyRpbmRleF0pOwp9CmlmIChyZXNldCgkcHJvdG9zKSA9PT0gJ2h0dHAnKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIGh0dHAgcHJvdG9jb2wgZm9yIGdpdGh1YiBpcyBub3QgYXZhaWxhYmxlIGFueW1vcmUsIHVwZGF0ZSB5b3VyIGNvbmZpZ1wncyBnaXRodWItcHJvdG9jb2xzIHRvIHVzZSAiaHR0cHMiLCAiZ2l0IiBvciAic3NoIicpOwp9CgpyZXR1cm4gJHByb3RvczsKCmNhc2UgJ2F1dG9sb2FkZXItc3VmZml4JzoKaWYgKCR0aGlzLT5jb25maWdbJGtleV0gPT09ICcnKSB7IApyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICR0aGlzLT5wcm9jZXNzKCR0aGlzLT5jb25maWdbJGtleV0sICRmbGFncyk7CgpjYXNlICdhdWRpdCc6CiRyZXN1bHQgPSAkdGhpcy0+Y29uZmlnWyRrZXldOwokYWJhbmRvbmVkRW52ID0gJHRoaXMtPmdldENvbXBvc2VyRW52KCdDT01QT1NFUl9BVURJVF9BQkFORE9ORUQnKTsKaWYgKGZhbHNlICE9PSAkYWJhbmRvbmVkRW52KSB7CmlmICghaW5fYXJyYXkoJGFiYW5kb25lZEVudiwgJHZhbGlkQ2hvaWNlcyA9IEF1ZGl0b3I6OkFCQU5ET05FRFMsIHRydWUpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigKIkludmFsaWQgdmFsdWUgZm9yIENPTVBPU0VSX0FVRElUX0FCQU5ET05FRDogeyRhYmFuZG9uZWRFbnZ9LiBFeHBlY3RlZCBvbmUgb2YgIi5pbXBsb2RlKCcsICcsIEF1ZGl0b3I6OkFCQU5ET05FRFMpLiIuIgopOwp9CiRyZXN1bHRbJ2FiYW5kb25lZCddID0gJGFiYW5kb25lZEVudjsKfQoKJGJsb2NrQWJhbmRvbmVkRW52ID0gJHRoaXMtPmdldENvbXBvc2VyRW52KCdDT01QT1NFUl9TRUNVUklUWV9CTE9DS0lOR19BQkFORE9ORUQnKTsKaWYgKGZhbHNlICE9PSAkYmxvY2tBYmFuZG9uZWRFbnYpIHsKaWYgKCFpbl9hcnJheSgkYmxvY2tBYmFuZG9uZWRFbnYsIFsnMCcsICcxJ10sIHRydWUpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigKIkludmFsaWQgdmFsdWUgZm9yIENPTVBPU0VSX1NFQ1VSSVRZX0JMT0NLSU5HX0FCQU5ET05FRDogeyRibG9ja0FiYW5kb25lZEVudn0uIEV4cGVjdGVkIDAgb3IgMS4iCik7Cn0KJHJlc3VsdFsnYmxvY2stYWJhbmRvbmVkJ10gPSAoYm9vbCkgKGludCkgJGJsb2NrQWJhbmRvbmVkRW52Owp9CgpyZXR1cm4gJHJlc3VsdDsKCmRlZmF1bHQ6CmlmICghaXNzZXQoJHRoaXMtPmNvbmZpZ1ska2V5XSkpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiAkdGhpcy0+cHJvY2VzcygkdGhpcy0+Y29uZmlnWyRrZXldLCAkZmxhZ3MpOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhbGwoaW50ICRmbGFncyA9IDApOiBhcnJheQp7CiRhbGwgPSBbCidyZXBvc2l0b3JpZXMnID0+ICR0aGlzLT5nZXRSZXBvc2l0b3JpZXMoKSwKXTsKZm9yZWFjaCAoYXJyYXlfa2V5cygkdGhpcy0+Y29uZmlnKSBhcyAka2V5KSB7CiRhbGxbJ2NvbmZpZyddWyRrZXldID0gJHRoaXMtPmdldCgka2V5LCAkZmxhZ3MpOwp9CgpyZXR1cm4gJGFsbDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZU9mVmFsdWUoc3RyaW5nICRrZXkpOiBzdHJpbmcKewokdGhpcy0+Z2V0KCRrZXkpOwoKcmV0dXJuICR0aGlzLT5zb3VyY2VPZkNvbmZpZ1ZhbHVlWyRrZXldID8/IHNlbGY6OlNPVVJDRV9VTktOT1dOOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHNldFNvdXJjZU9mQ29uZmlnVmFsdWUoJGNvbmZpZ1ZhbHVlLCBzdHJpbmcgJHBhdGgsIHN0cmluZyAkc291cmNlKTogdm9pZAp7CiR0aGlzLT5zb3VyY2VPZkNvbmZpZ1ZhbHVlWyRwYXRoXSA9ICRzb3VyY2U7CgppZiAoaXNfYXJyYXkoJGNvbmZpZ1ZhbHVlKSkgewpmb3JlYWNoICgkY29uZmlnVmFsdWUgYXMgJGtleSA9PiAkdmFsdWUpIHsKJHRoaXMtPnNldFNvdXJjZU9mQ29uZmlnVmFsdWUoJHZhbHVlLCAkcGF0aCAuICcuJyAuICRrZXksICRzb3VyY2UpOwp9Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJhdygpOiBhcnJheQp7CnJldHVybiBbCidyZXBvc2l0b3JpZXMnID0+ICR0aGlzLT5nZXRSZXBvc2l0b3JpZXMoKSwKJ2NvbmZpZycgPT4gJHRoaXMtPmNvbmZpZywKXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhcyhzdHJpbmcgJGtleSk6IGJvb2wKewpyZXR1cm4gYXJyYXlfa2V5X2V4aXN0cygka2V5LCAkdGhpcy0+Y29uZmlnKTsKfQoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHByb2Nlc3MoJHZhbHVlLCBpbnQgJGZsYWdzKQp7CmlmICghaXNfc3RyaW5nKCR2YWx1ZSkpIHsKcmV0dXJuICR2YWx1ZTsKfQoKcmV0dXJuIFByZWc6OnJlcGxhY2VDYWxsYmFjaygnI1x7XCQoLispXH0jJywgZnVuY3Rpb24gKCRtYXRjaCkgdXNlICgkZmxhZ3MpIHsKcmV0dXJuICR0aGlzLT5nZXQoJG1hdGNoWzFdLCAkZmxhZ3MpOwp9LCAkdmFsdWUpOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVhbHBhdGgoc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKaWYgKFByZWc6OmlzTWF0Y2goJ3teKD86L3xbYS16XTp8W2EtejAtOS5dKzovL3xcXFxcXFxcXCl9aScsICRwYXRoKSkgewpyZXR1cm4gJHBhdGg7Cn0KCnJldHVybiAkdGhpcy0+YmFzZURpciAhPT0gbnVsbCA/ICR0aGlzLT5iYXNlRGlyIC4gJy8nIC4gJHBhdGggOiAkcGF0aDsKfQoKCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0Q29tcG9zZXJFbnYoc3RyaW5nICR2YXIpCnsKaWYgKCR0aGlzLT51c2VFbnZpcm9ubWVudCkgewpyZXR1cm4gUGxhdGZvcm06OmdldEVudigkdmFyKTsKfQoKcmV0dXJuIGZhbHNlOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGRpc2FibGVSZXBvQnlOYW1lKHN0cmluZyAkbmFtZSk6IHZvaWQKewppZiAoaXNzZXQoJHRoaXMtPnJlcG9zaXRvcmllc1skbmFtZV0pKSB7CnVuc2V0KCR0aGlzLT5yZXBvc2l0b3JpZXNbJG5hbWVdKTsKfSBlbHNlaWYgKCRuYW1lID09PSAncGFja2FnaXN0JykgeyAKdW5zZXQoJHRoaXMtPnJlcG9zaXRvcmllc1sncGFja2FnaXN0Lm9yZyddKTsKfQp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwcm9oaWJpdFVybEJ5Q29uZmlnKHN0cmluZyAkdXJsLCA/SU9JbnRlcmZhY2UgJGlvID0gbnVsbCwgYXJyYXkgJHJlcG9PcHRpb25zID0gW10pOiB2b2lkCnsKCmlmIChmYWxzZSA9PT0gZmlsdGVyX3ZhcigkdXJsLCBGSUxURVJfVkFMSURBVEVfVVJMKSAmJiAhUHJlZzo6aXNNYXRjaCgne15odHRwcz86Ly99JywgJHVybCkpIHsKcmV0dXJuOwp9CgoKJHNjaGVtZSA9IHBhcnNlX3VybCgkdXJsLCBQSFBfVVJMX1NDSEVNRSk7CiRob3N0bmFtZSA9IHBhcnNlX3VybCgkdXJsLCBQSFBfVVJMX0hPU1QpOwppZiAoaW5fYXJyYXkoJHNjaGVtZSwgWydodHRwJywgJ2dpdCcsICdmdHAnLCAnc3ZuJ10pKSB7CmlmICgkdGhpcy0+Z2V0KCdzZWN1cmUtaHR0cCcpKSB7CmlmICgkc2NoZW1lID09PSAnc3ZuJykgewppZiAoaW5fYXJyYXkoJGhvc3RuYW1lLCAkdGhpcy0+Z2V0KCdzZWN1cmUtc3ZuLWRvbWFpbnMnKSwgdHJ1ZSkpIHsKcmV0dXJuOwp9Cgp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCJZb3VyIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgYWxsb3cgY29ubmVjdGlvbnMgdG8gJHVybC4gU2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wNi1jb25maWcubWQjc2VjdXJlLXN2bi1kb21haW5zIGZvciBkZXRhaWxzLiIpOwp9Cgp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCJZb3VyIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgYWxsb3cgY29ubmVjdGlvbnMgdG8gJHVybC4gU2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wNi1jb25maWcubWQjc2VjdXJlLWh0dHAgZm9yIGRldGFpbHMuIik7Cn0KaWYgKCRpbyAhPT0gbnVsbCkgewppZiAoaXNfc3RyaW5nKCRob3N0bmFtZSkpIHsKaWYgKCFpc3NldCgkdGhpcy0+d2FybmVkSG9zdHNbJGhvc3RuYW1lXSkpIHsKJGlvLT53cml0ZUVycm9yKCI8d2FybmluZz5XYXJuaW5nOiBBY2Nlc3NpbmcgJGhvc3RuYW1lIG92ZXIgJHNjaGVtZSB3aGljaCBpcyBhbiBpbnNlY3VyZSBwcm90b2NvbC48L3dhcm5pbmc+Iik7Cn0KJHRoaXMtPndhcm5lZEhvc3RzWyRob3N0bmFtZV0gPSB0cnVlOwp9Cn0KfQoKaWYgKCRpbyAhPT0gbnVsbCAmJiBpc19zdHJpbmcoJGhvc3RuYW1lKSAmJiAhaXNzZXQoJHRoaXMtPnNzbFZlcmlmeVdhcm5lZEhvc3RzWyRob3N0bmFtZV0pKSB7CiR3YXJuaW5nID0gbnVsbDsKaWYgKGlzc2V0KCRyZXBvT3B0aW9uc1snc3NsJ11bJ3ZlcmlmeV9wZWVyJ10pICYmICEoYm9vbCkgJHJlcG9PcHRpb25zWydzc2wnXVsndmVyaWZ5X3BlZXInXSkgewokd2FybmluZyA9ICd2ZXJpZnlfcGVlcic7Cn0KCmlmIChpc3NldCgkcmVwb09wdGlvbnNbJ3NzbCddWyd2ZXJpZnlfcGVlcl9uYW1lJ10pICYmICEoYm9vbCkgJHJlcG9PcHRpb25zWydzc2wnXVsndmVyaWZ5X3BlZXJfbmFtZSddKSB7CiR3YXJuaW5nID0gJHdhcm5pbmcgPT09IG51bGwgPyAndmVyaWZ5X3BlZXJfbmFtZScgOiAkd2FybmluZyAuICcgYW5kIHZlcmlmeV9wZWVyX25hbWUnOwp9CgppZiAoJHdhcm5pbmcgIT09IG51bGwpIHsKJGlvLT53cml0ZUVycm9yKCI8d2FybmluZz5XYXJuaW5nOiBBY2Nlc3NpbmcgJGhvc3RuYW1lIHdpdGggJHdhcm5pbmcgZGlzYWJsZWQuPC93YXJuaW5nPiIpOwokdGhpcy0+c3NsVmVyaWZ5V2FybmVkSG9zdHNbJGhvc3RuYW1lXSA9IHRydWU7Cn0KfQp9CgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkaXNhYmxlUHJvY2Vzc1RpbWVvdXQoKTogdm9pZAp7CgpQcm9jZXNzRXhlY3V0b3I6OnNldFRpbWVvdXQoMCk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29uZmlnOwoKCgoKCgoKaW50ZXJmYWNlIENvbmZpZ1NvdXJjZUludGVyZmFjZQp7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkUmVwb3NpdG9yeShzdHJpbmcgJG5hbWUsICRjb25maWcsIGJvb2wgJGFwcGVuZCA9IHRydWUpOiB2b2lkOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5zZXJ0UmVwb3NpdG9yeShzdHJpbmcgJG5hbWUsICRjb25maWcsIHN0cmluZyAkcmVmZXJlbmNlTmFtZSwgaW50ICRvZmZzZXQgPSAwKTogdm9pZDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSZXBvc2l0b3J5VXJsKHN0cmluZyAkbmFtZSwgc3RyaW5nICR1cmwpOiB2b2lkOwoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZVJlcG9zaXRvcnkoc3RyaW5nICRuYW1lKTogdm9pZDsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRDb25maWdTZXR0aW5nKHN0cmluZyAkbmFtZSwgJHZhbHVlKTogdm9pZDsKCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVDb25maWdTZXR0aW5nKHN0cmluZyAkbmFtZSk6IHZvaWQ7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkUHJvcGVydHkoc3RyaW5nICRuYW1lLCAkdmFsdWUpOiB2b2lkOwoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZVByb3BlcnR5KHN0cmluZyAkbmFtZSk6IHZvaWQ7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZExpbmsoc3RyaW5nICR0eXBlLCBzdHJpbmcgJG5hbWUsIHN0cmluZyAkdmFsdWUpOiB2b2lkOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZUxpbmsoc3RyaW5nICR0eXBlLCBzdHJpbmcgJG5hbWUpOiB2b2lkOwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKTogc3RyaW5nOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb25maWc7Cgp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXEpzb25cSnNvbk1hbmlwdWxhdG9yOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uVmFsaWRhdGlvbkV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcU2lsZW5jZXI7CgoKCgoKCgpjbGFzcyBKc29uQ29uZmlnU291cmNlIGltcGxlbWVudHMgQ29uZmlnU291cmNlSW50ZXJmYWNlCnsKCgoKcHJpdmF0ZSAkZmlsZTsKCgoKCnByaXZhdGUgJGF1dGhDb25maWc7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSnNvbkZpbGUgJGZpbGUsIGJvb2wgJGF1dGhDb25maWcgPSBmYWxzZSkKewokdGhpcy0+ZmlsZSA9ICRmaWxlOwokdGhpcy0+YXV0aENvbmZpZyA9ICRhdXRoQ29uZmlnOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmZpbGUtPmdldFBhdGgoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFJlcG9zaXRvcnkoc3RyaW5nICRuYW1lLCAkY29uZmlnLCBib29sICRhcHBlbmQgPSB0cnVlKTogdm9pZAp7CiR0aGlzLT5tYW5pcHVsYXRlSnNvbignYWRkUmVwb3NpdG9yeScsIHN0YXRpYyBmdW5jdGlvbiAoJiRjb25maWcsICRyZXBvLCAkcmVwb0NvbmZpZykgdXNlICgkYXBwZW5kKTogdm9pZCB7CmlmICghYXJyYXlfaXNfbGlzdCgkY29uZmlnWydyZXBvc2l0b3JpZXMnXSA/PyBbXSkpIHsKJGxpc3QgPSBbXTsKCmZvcmVhY2ggKCRjb25maWdbJ3JlcG9zaXRvcmllcyddIGFzICRyZXBvc2l0b3J5SW5kZXggPT4gJHJlcG9zaXRvcnkpIHsKaWYgKGlzX3N0cmluZygkcmVwb3NpdG9yeUluZGV4KSAmJiBpc19hcnJheSgkcmVwb3NpdG9yeSkpIHsKCmlmICghaXNzZXQoJHJlcG9zaXRvcnlbJ25hbWUnXSkpIHsKJHJlcG9zaXRvcnkgPSBbJ25hbWUnID0+ICRyZXBvc2l0b3J5SW5kZXhdICsgJHJlcG9zaXRvcnk7Cn0KJGxpc3RbXSA9ICRyZXBvc2l0b3J5Owp9IGVsc2VpZiAoaXNfc3RyaW5nKCRyZXBvc2l0b3J5SW5kZXgpKSB7CgokbGlzdFtdID0gWyRyZXBvc2l0b3J5SW5kZXggPT4gJHJlcG9zaXRvcnldOwp9IGVsc2UgewokbGlzdFtdID0gJHJlcG9zaXRvcnk7Cn0KfQoKJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ10gPSAkbGlzdDsKfQoKaWYgKCRyZXBvQ29uZmlnID09PSBmYWxzZSkgewppZiAoaXNzZXQoJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ10pKSB7CmZvcmVhY2ggKCRjb25maWdbJ3JlcG9zaXRvcmllcyddIGFzICYkcmVwb3NpdG9yeSkgewppZiAoKCRyZXBvc2l0b3J5WyduYW1lJ10gPz8gbnVsbCkgPT09ICRyZXBvKSB7CiRyZXBvc2l0b3J5ID0gWyRyZXBvID0+ICRyZXBvQ29uZmlnXTsKCnJldHVybjsKfQoKaWYgKCRyZXBvc2l0b3J5ID09PSBbJHJlcG8gPT4gZmFsc2VdKSB7CnJldHVybjsKfQp9Cgp1bnNldCgkcmVwb3NpdG9yeSk7Cn0gZWxzZSB7CiRjb25maWdbJ3JlcG9zaXRvcmllcyddID0gW107Cn0KCiRjb25maWdbJ3JlcG9zaXRvcmllcyddW10gPSBbJHJlcG8gPT4gJHJlcG9Db25maWddOwoKcmV0dXJuOwp9CgppZiAoaXNfYXJyYXkoJHJlcG9Db25maWcpICYmICRyZXBvICE9PSAnJyAmJiAhaXNzZXQoJHJlcG9Db25maWdbJ25hbWUnXSkpIHsKJHJlcG9Db25maWcgPSBbJ25hbWUnID0+ICRyZXBvXSArICRyZXBvQ29uZmlnOwp9CgoKJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ10gPSBhcnJheV92YWx1ZXMoYXJyYXlfZmlsdGVyKCRjb25maWdbJ3JlcG9zaXRvcmllcyddID8/IFtdLCBzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHVzZSAoJHJlcG8pIHsKcmV0dXJuICFpc3NldCgkdmFsWyduYW1lJ10pIHx8ICR2YWxbJ25hbWUnXSAhPT0gJHJlcG8gfHwgJHZhbCAhPT0gWyRyZXBvID0+IGZhbHNlXTsKfSkpOwoKaWYgKCRhcHBlbmQpIHsKJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ11bXSA9ICRyZXBvQ29uZmlnOwp9IGVsc2UgewphcnJheV91bnNoaWZ0KCRjb25maWdbJ3JlcG9zaXRvcmllcyddLCAkcmVwb0NvbmZpZyk7Cn0KfSwgJG5hbWUsICRjb25maWcsICRhcHBlbmQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5zZXJ0UmVwb3NpdG9yeShzdHJpbmcgJG5hbWUsICRjb25maWcsIHN0cmluZyAkcmVmZXJlbmNlTmFtZSwgaW50ICRvZmZzZXQgPSAwKTogdm9pZAp7CiR0aGlzLT5tYW5pcHVsYXRlSnNvbignaW5zZXJ0UmVwb3NpdG9yeScsIHN0YXRpYyBmdW5jdGlvbiAoJiRjb25maWcsIHN0cmluZyAkbmFtZSwgJHJlcG9Db25maWcsIHN0cmluZyAkcmVmZXJlbmNlTmFtZSwgaW50ICRvZmZzZXQpOiB2b2lkIHsKaWYgKCFhcnJheV9pc19saXN0KCRjb25maWdbJ3JlcG9zaXRvcmllcyddID8/IFtdKSkgewokbGlzdCA9IFtdOwoKZm9yZWFjaCAoJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ10gYXMgJHJlcG9zaXRvcnlJbmRleCA9PiAkcmVwb3NpdG9yeSkgewppZiAoaXNfc3RyaW5nKCRyZXBvc2l0b3J5SW5kZXgpICYmIGlzX2FycmF5KCRyZXBvc2l0b3J5KSkgewoKaWYgKCFpc3NldCgkcmVwb3NpdG9yeVsnbmFtZSddKSkgewokcmVwb3NpdG9yeSA9IFsnbmFtZScgPT4gJHJlcG9zaXRvcnlJbmRleF0gKyAkcmVwb3NpdG9yeTsKfQokbGlzdFtdID0gJHJlcG9zaXRvcnk7Cn0gZWxzZWlmIChpc19zdHJpbmcoJHJlcG9zaXRvcnlJbmRleCkpIHsKCiRsaXN0W10gPSBbJHJlcG9zaXRvcnlJbmRleCA9PiAkcmVwb3NpdG9yeV07Cn0gZWxzZSB7CiRsaXN0W10gPSAkcmVwb3NpdG9yeTsKfQp9CgokY29uZmlnWydyZXBvc2l0b3JpZXMnXSA9ICRsaXN0Owp9CgoKJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ10gPSBhcnJheV92YWx1ZXMoYXJyYXlfZmlsdGVyKCRjb25maWdbJ3JlcG9zaXRvcmllcyddID8/IFtdLCBzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHVzZSAoJG5hbWUpIHsKcmV0dXJuICFpc3NldCgkdmFsWyduYW1lJ10pIHx8ICR2YWxbJ25hbWUnXSAhPT0gJG5hbWUgfHwgJHZhbCAhPT0gWyRuYW1lID0+IGZhbHNlXTsKfSkpOwoKJGluZGV4VG9JbnNlcnQgPSBudWxsOwoKZm9yZWFjaCAoJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ10gYXMgJHJlcG9zaXRvcnlJbmRleCA9PiAkcmVwb3NpdG9yeSkgewppZiAoKCRyZXBvc2l0b3J5WyduYW1lJ10gPz8gbnVsbCkgPT09ICRyZWZlcmVuY2VOYW1lKSB7CiRpbmRleFRvSW5zZXJ0ID0gJHJlcG9zaXRvcnlJbmRleDsKYnJlYWs7Cn0KCmlmIChbJHJlZmVyZW5jZU5hbWUgPT4gZmFsc2VdID09PSAkcmVwb3NpdG9yeSkgewokaW5kZXhUb0luc2VydCA9ICRyZXBvc2l0b3J5SW5kZXg7CmJyZWFrOwp9Cn0KCmlmICgkaW5kZXhUb0luc2VydCA9PT0gbnVsbCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZignVGhlIHJlZmVyZW5jZWQgcmVwb3NpdG9yeSAiJXMiIGRvZXMgbm90IGV4aXN0LicsICRyZWZlcmVuY2VOYW1lKSk7Cn0KCmlmIChpc19hcnJheSgkcmVwb0NvbmZpZykgJiYgJG5hbWUgIT09ICcnICYmICFpc3NldCgkcmVwb0NvbmZpZ1snbmFtZSddKSkgewokcmVwb0NvbmZpZyA9IFsnbmFtZScgPT4gJG5hbWVdICsgJHJlcG9Db25maWc7Cn0KCmFycmF5X3NwbGljZSgkY29uZmlnWydyZXBvc2l0b3JpZXMnXSwgJGluZGV4VG9JbnNlcnQgKyAkb2Zmc2V0LCAwLCBbJHJlcG9Db25maWddKTsKfSwgJG5hbWUsICRjb25maWcsICRyZWZlcmVuY2VOYW1lLCAkb2Zmc2V0KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJlcG9zaXRvcnlVcmwoc3RyaW5nICRuYW1lLCBzdHJpbmcgJHVybCk6IHZvaWQKewokdGhpcy0+bWFuaXB1bGF0ZUpzb24oJ3NldFJlcG9zaXRvcnlVcmwnLCBzdGF0aWMgZnVuY3Rpb24gKCYkY29uZmlnLCAkbmFtZSwgJHVybCk6IHZvaWQgewpmb3JlYWNoICgkY29uZmlnWydyZXBvc2l0b3JpZXMnXSA/PyBbXSBhcyAkaW5kZXggPT4gJHJlcG9zaXRvcnkpIHsKaWYgKCRuYW1lID09PSAkaW5kZXgpIHsKJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ11bJGluZGV4XVsndXJsJ10gPSAkdXJsOwoKcmV0dXJuOwp9CgppZiAoJG5hbWUgPT09ICgkcmVwb3NpdG9yeVsnbmFtZSddID8/IG51bGwpKSB7CiRjb25maWdbJ3JlcG9zaXRvcmllcyddWyRpbmRleF1bJ3VybCddID0gJHVybDsKCnJldHVybjsKfQp9Cn0sICRuYW1lLCAkdXJsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZVJlcG9zaXRvcnkoc3RyaW5nICRuYW1lKTogdm9pZAp7CiR0aGlzLT5tYW5pcHVsYXRlSnNvbigncmVtb3ZlUmVwb3NpdG9yeScsIHN0YXRpYyBmdW5jdGlvbiAoJiRjb25maWcsICRyZXBvKTogdm9pZCB7CmlmIChpc3NldCgkY29uZmlnWydyZXBvc2l0b3JpZXMnXVskcmVwb10pKSB7CnVuc2V0KCRjb25maWdbJ3JlcG9zaXRvcmllcyddWyRyZXBvXSk7Cn0gZWxzZSB7CiRjb25maWdbJ3JlcG9zaXRvcmllcyddID0gYXJyYXlfdmFsdWVzKGFycmF5X2ZpbHRlcigkY29uZmlnWydyZXBvc2l0b3JpZXMnXSA/PyBbXSwgc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB1c2UgKCRyZXBvKSB7CnJldHVybiAhaXNzZXQoJHZhbFsnbmFtZSddKSB8fCAkdmFsWyduYW1lJ10gIT09ICRyZXBvIHx8ICR2YWwgIT09IFskcmVwbyA9PiBmYWxzZV07Cn0pKTsKfQoKaWYgKFtdID09PSAkY29uZmlnWydyZXBvc2l0b3JpZXMnXSkgewp1bnNldCgkY29uZmlnWydyZXBvc2l0b3JpZXMnXSk7Cn0KfSwgJG5hbWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkQ29uZmlnU2V0dGluZyhzdHJpbmcgJG5hbWUsICR2YWx1ZSk6IHZvaWQKewokYXV0aENvbmZpZyA9ICR0aGlzLT5hdXRoQ29uZmlnOwokdGhpcy0+bWFuaXB1bGF0ZUpzb24oJ2FkZENvbmZpZ1NldHRpbmcnLCBzdGF0aWMgZnVuY3Rpb24gKCYkY29uZmlnLCAka2V5LCAkdmFsKSB1c2UgKCRhdXRoQ29uZmlnKTogdm9pZCB7CmlmIChQcmVnOjppc01hdGNoKCd7XihiaXRidWNrZXQtb2F1dGh8Z2l0aHViLW9hdXRofGdpdGxhYi1vYXV0aHxnaXRsYWItdG9rZW58YmVhcmVyfGh0dHAtYmFzaWN8Y3VzdG9tLWhlYWRlcnN8Zm9yZ2Vqby10b2tlbnxwbGF0Zm9ybSlcLn0nLCAka2V5KSkgewpbJGtleSwgJGhvc3RdID0gZXhwbG9kZSgnLicsICRrZXksIDIpOwppZiAoJGF1dGhDb25maWcpIHsKJGNvbmZpZ1ska2V5XVskaG9zdF0gPSAkdmFsOwp9IGVsc2UgewokY29uZmlnWydjb25maWcnXVska2V5XVskaG9zdF0gPSAkdmFsOwp9Cn0gZWxzZSB7CiRjb25maWdbJ2NvbmZpZyddWyRrZXldID0gJHZhbDsKfQp9LCAkbmFtZSwgJHZhbHVlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZUNvbmZpZ1NldHRpbmcoc3RyaW5nICRuYW1lKTogdm9pZAp7CiRhdXRoQ29uZmlnID0gJHRoaXMtPmF1dGhDb25maWc7CiR0aGlzLT5tYW5pcHVsYXRlSnNvbigncmVtb3ZlQ29uZmlnU2V0dGluZycsIHN0YXRpYyBmdW5jdGlvbiAoJiRjb25maWcsICRrZXkpIHVzZSAoJGF1dGhDb25maWcpOiB2b2lkIHsKaWYgKFByZWc6OmlzTWF0Y2goJ3teKGJpdGJ1Y2tldC1vYXV0aHxnaXRodWItb2F1dGh8Z2l0bGFiLW9hdXRofGdpdGxhYi10b2tlbnxiZWFyZXJ8aHR0cC1iYXNpY3xjdXN0b20taGVhZGVyc3xmb3JnZWpvLXRva2VufHBsYXRmb3JtKVwufScsICRrZXkpKSB7Clska2V5LCAkaG9zdF0gPSBleHBsb2RlKCcuJywgJGtleSwgMik7CmlmICgkYXV0aENvbmZpZykgewp1bnNldCgkY29uZmlnWyRrZXldWyRob3N0XSk7Cn0gZWxzZSB7CnVuc2V0KCRjb25maWdbJ2NvbmZpZyddWyRrZXldWyRob3N0XSk7Cn0KfSBlbHNlIHsKdW5zZXQoJGNvbmZpZ1snY29uZmlnJ11bJGtleV0pOwp9Cn0sICRuYW1lKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFByb3BlcnR5KHN0cmluZyAkbmFtZSwgJHZhbHVlKTogdm9pZAp7CiR0aGlzLT5tYW5pcHVsYXRlSnNvbignYWRkUHJvcGVydHknLCBzdGF0aWMgZnVuY3Rpb24gKCYkY29uZmlnLCAka2V5LCAkdmFsKTogdm9pZCB7CmlmIChzdHJwb3MoJGtleSwgJ2V4dHJhLicpID09PSAwIHx8IHN0cnBvcygka2V5LCAnc2NyaXB0cy4nKSA9PT0gMCkgewokYml0cyA9IGV4cGxvZGUoJy4nLCAka2V5KTsKJGxhc3QgPSBhcnJheV9wb3AoJGJpdHMpOwokYXJyID0gJiRjb25maWdbcmVzZXQoJGJpdHMpXTsKZm9yZWFjaCAoJGJpdHMgYXMgJGJpdCkgewppZiAoIWlzc2V0KCRhcnJbJGJpdF0pKSB7CiRhcnJbJGJpdF0gPSBbXTsKfQokYXJyID0gJiRhcnJbJGJpdF07Cn0KJGFyclskbGFzdF0gPSAkdmFsOwp9IGVsc2UgewokY29uZmlnWyRrZXldID0gJHZhbDsKfQp9LCAkbmFtZSwgJHZhbHVlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZVByb3BlcnR5KHN0cmluZyAkbmFtZSk6IHZvaWQKewokdGhpcy0+bWFuaXB1bGF0ZUpzb24oJ3JlbW92ZVByb3BlcnR5Jywgc3RhdGljIGZ1bmN0aW9uICgmJGNvbmZpZywgJGtleSk6IHZvaWQgewppZiAoc3RycG9zKCRrZXksICdleHRyYS4nKSA9PT0gMCB8fCBzdHJwb3MoJGtleSwgJ3NjcmlwdHMuJykgPT09IDAgfHwgc3RyaXBvcygka2V5LCAnYXV0b2xvYWQuJykgPT09IDAgfHwgc3RyaXBvcygka2V5LCAnYXV0b2xvYWQtZGV2LicpID09PSAwKSB7CiRiaXRzID0gZXhwbG9kZSgnLicsICRrZXkpOwokbGFzdCA9IGFycmF5X3BvcCgkYml0cyk7CiRhcnIgPSAmJGNvbmZpZ1tyZXNldCgkYml0cyldOwpmb3JlYWNoICgkYml0cyBhcyAkYml0KSB7CmlmICghaXNzZXQoJGFyclskYml0XSkpIHsKcmV0dXJuOwp9CiRhcnIgPSAmJGFyclskYml0XTsKfQp1bnNldCgkYXJyWyRsYXN0XSk7Cn0gZWxzZSB7CnVuc2V0KCRjb25maWdbJGtleV0pOwp9Cn0sICRuYW1lKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZExpbmsoc3RyaW5nICR0eXBlLCBzdHJpbmcgJG5hbWUsIHN0cmluZyAkdmFsdWUpOiB2b2lkCnsKJHRoaXMtPm1hbmlwdWxhdGVKc29uKCdhZGRMaW5rJywgc3RhdGljIGZ1bmN0aW9uICgmJGNvbmZpZywgJHR5cGUsICRuYW1lLCAkdmFsdWUpOiB2b2lkIHsKJGNvbmZpZ1skdHlwZV1bJG5hbWVdID0gJHZhbHVlOwp9LCAkdHlwZSwgJG5hbWUsICR2YWx1ZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVMaW5rKHN0cmluZyAkdHlwZSwgc3RyaW5nICRuYW1lKTogdm9pZAp7CiR0aGlzLT5tYW5pcHVsYXRlSnNvbigncmVtb3ZlU3ViTm9kZScsIHN0YXRpYyBmdW5jdGlvbiAoJiRjb25maWcsICR0eXBlLCAkbmFtZSk6IHZvaWQgewp1bnNldCgkY29uZmlnWyR0eXBlXVskbmFtZV0pOwp9LCAkdHlwZSwgJG5hbWUpOwokdGhpcy0+bWFuaXB1bGF0ZUpzb24oJ3JlbW92ZU1haW5LZXlJZkVtcHR5Jywgc3RhdGljIGZ1bmN0aW9uICgmJGNvbmZpZywgJHR5cGUpOiB2b2lkIHsKaWYgKDAgPT09IGNvdW50KCRjb25maWdbJHR5cGVdKSkgewp1bnNldCgkY29uZmlnWyR0eXBlXSk7Cn0KfSwgJHR5cGUpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIG1hbmlwdWxhdGVKc29uKHN0cmluZyAkbWV0aG9kLCBjYWxsYWJsZSAkZmFsbGJhY2ssIC4uLiRhcmdzKTogdm9pZAp7CmlmICgkdGhpcy0+ZmlsZS0+ZXhpc3RzKCkpIHsKaWYgKCFpc193cml0YWJsZSgkdGhpcy0+ZmlsZS0+Z2V0UGF0aCgpKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZignVGhlIGZpbGUgIiVzIiBpcyBub3Qgd3JpdGFibGUuJywgJHRoaXMtPmZpbGUtPmdldFBhdGgoKSkpOwp9CgppZiAoIUZpbGVzeXN0ZW06OmlzUmVhZGFibGUoJHRoaXMtPmZpbGUtPmdldFBhdGgoKSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJ1RoZSBmaWxlICIlcyIgaXMgbm90IHJlYWRhYmxlLicsICR0aGlzLT5maWxlLT5nZXRQYXRoKCkpKTsKfQoKJGNvbnRlbnRzID0gZmlsZV9nZXRfY29udGVudHMoJHRoaXMtPmZpbGUtPmdldFBhdGgoKSk7Cn0gZWxzZWlmICgkdGhpcy0+YXV0aENvbmZpZykgewokY29udGVudHMgPSAie1xufVxuIjsKfSBlbHNlIHsKJGNvbnRlbnRzID0gIntcbiAgICBcImNvbmZpZ1wiOiB7XG4gICAgfVxufVxuIjsKfQoKJG1hbmlwdWxhdG9yID0gbmV3IEpzb25NYW5pcHVsYXRvcigkY29udGVudHMpOwoKJG5ld0ZpbGUgPSAhJHRoaXMtPmZpbGUtPmV4aXN0cygpOwoKCmlmICgkdGhpcy0+YXV0aENvbmZpZyAmJiAkbWV0aG9kID09PSAnYWRkQ29uZmlnU2V0dGluZycpIHsKJG1ldGhvZCA9ICdhZGRTdWJOb2RlJzsKWyRtYWluTm9kZSwgJG5hbWVdID0gZXhwbG9kZSgnLicsICRhcmdzWzBdLCAyKTsKJGFyZ3MgPSBbJG1haW5Ob2RlLCAkbmFtZSwgJGFyZ3NbMV1dOwp9IGVsc2VpZiAoJHRoaXMtPmF1dGhDb25maWcgJiYgJG1ldGhvZCA9PT0gJ3JlbW92ZUNvbmZpZ1NldHRpbmcnKSB7CiRtZXRob2QgPSAncmVtb3ZlU3ViTm9kZSc7ClskbWFpbk5vZGUsICRuYW1lXSA9IGV4cGxvZGUoJy4nLCAkYXJnc1swXSwgMik7CiRhcmdzID0gWyRtYWluTm9kZSwgJG5hbWVdOwp9CgoKaWYgKGNhbGxfdXNlcl9mdW5jX2FycmF5KFskbWFuaXB1bGF0b3IsICRtZXRob2RdLCAkYXJncykpIHsKZmlsZV9wdXRfY29udGVudHMoJHRoaXMtPmZpbGUtPmdldFBhdGgoKSwgJG1hbmlwdWxhdG9yLT5nZXRDb250ZW50cygpKTsKfSBlbHNlIHsKCiRjb25maWcgPSAkdGhpcy0+ZmlsZS0+cmVhZCgpOwokdGhpcy0+YXJyYXlVbnNoaWZ0UmVmKCRhcmdzLCAkY29uZmlnKTsKJGZhbGxiYWNrKC4uLiRhcmdzKTsKCmZvcmVhY2ggKFsncmVxdWlyZScsICdyZXF1aXJlLWRldicsICdjb25mbGljdCcsICdwcm92aWRlJywgJ3JlcGxhY2UnLCAnc3VnZ2VzdCcsICdjb25maWcnLCAnYXV0b2xvYWQnLCAnYXV0b2xvYWQtZGV2JywgJ3NjcmlwdHMnLCAnc2NyaXB0cy1kZXNjcmlwdGlvbnMnLCAnc2NyaXB0cy1hbGlhc2VzJywgJ3N1cHBvcnQnXSBhcyAkcHJvcCkgewppZiAoaXNzZXQoJGNvbmZpZ1skcHJvcF0pICYmICRjb25maWdbJHByb3BdID09PSBbXSkgewokY29uZmlnWyRwcm9wXSA9IG5ldyBcc3RkQ2xhc3M7Cn0KfQpmb3JlYWNoIChbJ3Bzci0wJywgJ3Bzci00J10gYXMgJHByb3ApIHsKaWYgKGlzc2V0KCRjb25maWdbJ2F1dG9sb2FkJ11bJHByb3BdKSAmJiAkY29uZmlnWydhdXRvbG9hZCddWyRwcm9wXSA9PT0gW10pIHsKJGNvbmZpZ1snYXV0b2xvYWQnXVskcHJvcF0gPSBuZXcgXHN0ZENsYXNzOwp9CmlmIChpc3NldCgkY29uZmlnWydhdXRvbG9hZC1kZXYnXVskcHJvcF0pICYmICRjb25maWdbJ2F1dG9sb2FkLWRldiddWyRwcm9wXSA9PT0gW10pIHsKJGNvbmZpZ1snYXV0b2xvYWQtZGV2J11bJHByb3BdID0gbmV3IFxzdGRDbGFzczsKfQp9CmZvcmVhY2ggKFsncGxhdGZvcm0nLCAnaHR0cC1iYXNpYycsICdiZWFyZXInLCAnZ2l0bGFiLXRva2VuJywgJ2dpdGxhYi1vYXV0aCcsICdnaXRodWItb2F1dGgnLCAnY3VzdG9tLWhlYWRlcnMnLCAnZm9yZ2Vqby10b2tlbicsICdwcmVmZXJyZWQtaW5zdGFsbCddIGFzICRwcm9wKSB7CmlmIChpc3NldCgkY29uZmlnWydjb25maWcnXVskcHJvcF0pICYmICRjb25maWdbJ2NvbmZpZyddWyRwcm9wXSA9PT0gW10pIHsKJGNvbmZpZ1snY29uZmlnJ11bJHByb3BdID0gbmV3IFxzdGRDbGFzczsKfQp9CiR0aGlzLT5maWxlLT53cml0ZSgkY29uZmlnKTsKfQoKdHJ5IHsKJHRoaXMtPmZpbGUtPnZhbGlkYXRlU2NoZW1hKEpzb25GaWxlOjpMQVhfU0NIRU1BKTsKfSBjYXRjaCAoSnNvblZhbGlkYXRpb25FeGNlcHRpb24gJGUpIHsKCmZpbGVfcHV0X2NvbnRlbnRzKCR0aGlzLT5maWxlLT5nZXRQYXRoKCksICRjb250ZW50cyk7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIHVwZGF0ZSBjb21wb3Nlci5qc29uIHdpdGggYSB2YWxpZCBmb3JtYXQsIHJldmVydGluZyB0byB0aGUgb3JpZ2luYWwgY29udGVudC4gUGxlYXNlIHJlcG9ydCBhbiBpc3N1ZSB0byB1cyB3aXRoIGRldGFpbHMgKGNvbW1hbmQgeW91IHJ1biBhbmQgYSBjb3B5IG9mIHlvdXIgY29tcG9zZXIuanNvbikuICcuUEhQX0VPTC5pbXBsb2RlKFBIUF9FT0wsICRlLT5nZXRFcnJvcnMoKSksIDAsICRlKTsKfQoKaWYgKCRuZXdGaWxlKSB7ClNpbGVuY2VyOjpjYWxsKCdjaG1vZCcsICR0aGlzLT5maWxlLT5nZXRQYXRoKCksIDA2MDApOwp9Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gYXJyYXlVbnNoaWZ0UmVmKGFycmF5ICYkYXJyYXksICYkdmFsdWUpOiBpbnQKewokcmV0dXJuID0gYXJyYXlfdW5zaGlmdCgkYXJyYXksICcnKTsKJGFycmF5WzBdID0gJiR2YWx1ZTsKCnJldHVybiAkcmV0dXJuOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbnNvbGU7Cgp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyOwp1c2UgQ29tcG9zZXJcSU9cTnVsbElPOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFV0aWxcU2lsZW5jZXI7CnVzZSBMb2dpY0V4Y2VwdGlvbjsKdXNlIFJ1bnRpbWVFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEFwcGxpY2F0aW9uIGFzIEJhc2VBcHBsaWNhdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kIGFzIFN5bWZvbnlDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cQ29tbWFuZE5vdEZvdW5kRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cRXhjZXB0aW9uSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcSGVscGVyU2V0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcUXVlc3Rpb25IZWxwZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0RGVmaW5pdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcQ29uc29sZU91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIFNlbGRcSnNvbkxpbnRcUGFyc2luZ0V4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXENvbW1hbmQ7CnVzZSBDb21wb3NlclxDb21wb3NlcjsKdXNlIENvbXBvc2VyXEZhY3Rvcnk7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSU9cQ29uc29sZUlPOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uVmFsaWRhdGlvbkV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFV0aWxcRXJyb3JIYW5kbGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwRG93bmxvYWRlcjsKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxTY3JpcHRFeGVjdXRpb25FeGNlcHRpb247CnVzZSBDb21wb3NlclxFeGNlcHRpb25cTm9Tc2xFeGNlcHRpb247CnVzZSBDb21wb3NlclxYZGVidWdIYW5kbGVyXFhkZWJ1Z0hhbmRsZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFNpbmdsZUNvbW1hbmRBcHBsaWNhdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uXFByb2Nlc3NUaW1lZE91dEV4Y2VwdGlvbjsKCgoKCgoKCgpjbGFzcyBBcHBsaWNhdGlvbiBleHRlbmRzIEJhc2VBcHBsaWNhdGlvbgp7CgoKCnByb3RlY3RlZCAkY29tcG9zZXI7CgoKCgpwcm90ZWN0ZWQgJGlvOwoKCnByaXZhdGUgc3RhdGljICRsb2dvID0gJyAgIF9fX19fXwogIC8gX19fXy9fX18gIF9fX18gX19fICBfX19fICBfX19fICBfX19fX19fXyAgX19fX18KIC8gLyAgIC8gX18gXC8gX18gYF9fIFwvIF9fIFwvIF9fIFwvIF9fXy8gXyBcLyBfX18vCi8gL19fXy8gL18vIC8gLyAvIC8gLyAvIC9fLyAvIC9fLyAoX18gICkgIF9fLyAvClxfX19fL1xfX19fL18vIC9fLyAvXy8gLl9fXy9cX19fXy9fX19fL1xfX18vXy8KICAgICAgICAgICAgICAgICAgICAvXy8KJzsKCgpwcml2YXRlICRoYXNQbHVnaW5Db21tYW5kcyA9IGZhbHNlOwoKcHJpdmF0ZSAkZGlzYWJsZVBsdWdpbnNCeURlZmF1bHQgPSBmYWxzZTsKCnByaXZhdGUgJGRpc2FibGVTY3JpcHRzQnlEZWZhdWx0ID0gZmFsc2U7CgoKCgpwcml2YXRlICRpbml0aWFsV29ya2luZ0RpcmVjdG9yeTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG5hbWUgPSAnQ29tcG9zZXInLCBzdHJpbmcgJHZlcnNpb24gPSAnJykKewppZiAobWV0aG9kX2V4aXN0cygkdGhpcywgJ3NldENhdGNoRXJyb3JzJykpIHsKJHRoaXMtPnNldENhdGNoRXJyb3JzKHRydWUpOwp9CgpzdGF0aWMgJHNodXRkb3duUmVnaXN0ZXJlZCA9IGZhbHNlOwppZiAoJHZlcnNpb24gPT09ICcnKSB7CiR2ZXJzaW9uID0gQ29tcG9zZXI6OmdldFZlcnNpb24oKTsKfQppZiAoZnVuY3Rpb25fZXhpc3RzKCdpbmlfc2V0JykgJiYgZXh0ZW5zaW9uX2xvYWRlZCgneGRlYnVnJykpIHsKaW5pX3NldCgneGRlYnVnLnNob3dfZXhjZXB0aW9uX3RyYWNlJywgJzAnKTsKaW5pX3NldCgneGRlYnVnLnNjcmVhbScsICcwJyk7Cn0KCmlmIChmdW5jdGlvbl9leGlzdHMoJ2RhdGVfZGVmYXVsdF90aW1lem9uZV9zZXQnKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2RhdGVfZGVmYXVsdF90aW1lem9uZV9nZXQnKSkgewpkYXRlX2RlZmF1bHRfdGltZXpvbmVfc2V0KFNpbGVuY2VyOjpjYWxsKCdkYXRlX2RlZmF1bHRfdGltZXpvbmVfZ2V0JykpOwp9CgokdGhpcy0+aW8gPSBuZXcgTnVsbElPKCk7CgppZiAoISRzaHV0ZG93blJlZ2lzdGVyZWQpIHsKJHNodXRkb3duUmVnaXN0ZXJlZCA9IHRydWU7CgpyZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbihzdGF0aWMgZnVuY3Rpb24gKCk6IHZvaWQgewokbGFzdEVycm9yID0gZXJyb3JfZ2V0X2xhc3QoKTsKCmlmICgkbGFzdEVycm9yICYmICRsYXN0RXJyb3JbJ21lc3NhZ2UnXSAmJgooc3RycG9zKCRsYXN0RXJyb3JbJ21lc3NhZ2UnXSwgJ0FsbG93ZWQgbWVtb3J5JykgIT09IGZhbHNlICB8fApzdHJwb3MoJGxhc3RFcnJvclsnbWVzc2FnZSddLCAnZXhjZWVkZWQgbWVtb3J5JykgIT09IGZhbHNlICkpIHsKZWNobyAiXG4iLiAnQ2hlY2sgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jL2FydGljbGVzL3Ryb3VibGVzaG9vdGluZy5tZCNtZW1vcnktbGltaXQtZXJyb3JzIGZvciBtb3JlIGluZm8gb24gaG93IHRvIGhhbmRsZSBvdXQgb2YgbWVtb3J5IGVycm9ycy4nOwp9Cn0pOwp9CgokdGhpcy0+aW5pdGlhbFdvcmtpbmdEaXJlY3RvcnkgPSBnZXRjd2QoKTsKCnBhcmVudDo6X19jb25zdHJ1Y3QoJG5hbWUsICR2ZXJzaW9uKTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKQp7Cn0KCnB1YmxpYyBmdW5jdGlvbiBydW4oP0lucHV0SW50ZXJmYWNlICRpbnB1dCA9IG51bGwsID9PdXRwdXRJbnRlcmZhY2UgJG91dHB1dCA9IG51bGwpOiBpbnQKewppZiAobnVsbCA9PT0gJG91dHB1dCkgewokb3V0cHV0ID0gRmFjdG9yeTo6Y3JlYXRlT3V0cHV0KCk7Cn0KCnJldHVybiBwYXJlbnQ6OnJ1bigkaW5wdXQsICRvdXRwdXQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZG9SdW4oSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiR0aGlzLT5kaXNhYmxlUGx1Z2luc0J5RGVmYXVsdCA9ICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKCctLW5vLXBsdWdpbnMnKTsKJHRoaXMtPmRpc2FibGVTY3JpcHRzQnlEZWZhdWx0ID0gJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oJy0tbm8tc2NyaXB0cycpOwoKc3RhdGljICRzdGRpbiA9IG51bGw7CmlmIChudWxsID09PSAkc3RkaW4pIHsKJHN0ZGluID0gZGVmaW5lZCgnU1RESU4nKSA/IFNURElOIDogZm9wZW4oJ3BocDovL3N0ZGluJywgJ3InKTsKfQppZiAoUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfVEVTVFNfQVJFX1JVTk5JTkcnKSAhPT0gJzEnICYmIChQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9OT19JTlRFUkFDVElPTicpIHx8ICRzdGRpbiA9PT0gZmFsc2UgfHwgIVBsYXRmb3JtOjppc1R0eSgkc3RkaW4pKSkgewokaW5wdXQtPnNldEludGVyYWN0aXZlKGZhbHNlKTsKfQoKJGlvID0gJHRoaXMtPmlvID0gbmV3IENvbnNvbGVJTygkaW5wdXQsICRvdXRwdXQsIG5ldyBIZWxwZXJTZXQoWwpuZXcgUXVlc3Rpb25IZWxwZXIoKSwKXSkpOwoKCkVycm9ySGFuZGxlcjo6cmVnaXN0ZXIoJGlvKTsKCmlmICgkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbignLS1uby1jYWNoZScpKSB7CiRpby0+d3JpdGVFcnJvcignRGlzYWJsaW5nIGNhY2hlIHVzYWdlJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKUGxhdGZvcm06OnB1dEVudignQ09NUE9TRVJfQ0FDSEVfRElSJywgUGxhdGZvcm06OmlzV2luZG93cygpID8gJ251bCcgOiAnL2Rldi9udWxsJyk7Cn0KCgokbmV3V29ya0RpciA9ICR0aGlzLT5nZXROZXdXb3JraW5nRGlyKCRpbnB1dCk7CmlmIChudWxsICE9PSAkbmV3V29ya0Rpcikgewokb2xkV29ya2luZ0RpciA9IFBsYXRmb3JtOjpnZXRDd2QodHJ1ZSk7CmNoZGlyKCRuZXdXb3JrRGlyKTsKJHRoaXMtPmluaXRpYWxXb3JraW5nRGlyZWN0b3J5ID0gZ2V0Y3dkKCk7CiRjd2QgPSBQbGF0Zm9ybTo6Z2V0Q3dkKHRydWUpOwokaW8tPndyaXRlRXJyb3IoJ0NoYW5nZWQgQ1dEIHRvICcgLiAoJGN3ZCAhPT0gJycgPyAkY3dkIDogJG5ld1dvcmtEaXIpLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwp9CgoKJGNvbW1hbmROYW1lID0gJyc7CmlmICgkcmF3Q29tbWFuZE5hbWUgPSAkdGhpcy0+Z2V0Q29tbWFuZE5hbWVCZWZvcmVCaW5kaW5nKCRpbnB1dCkpIHsKdHJ5IHsKJGNvbW1hbmROYW1lID0gJHRoaXMtPmZpbmQoJHJhd0NvbW1hbmROYW1lKS0+Z2V0TmFtZSgpOwp9IGNhdGNoIChDb21tYW5kTm90Rm91bmRFeGNlcHRpb24gJGUpIHsKCiRjb21tYW5kTmFtZSA9IGZhbHNlOwp9IGNhdGNoIChcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uICRlKSB7Cn0KfQoKCmlmICgKbnVsbCA9PT0gJG5ld1dvcmtEaXIKCiYmICFpbl9hcnJheSgkY29tbWFuZE5hbWUsIFsnJywgJ2xpc3QnLCAnaW5pdCcsICdhYm91dCcsICdoZWxwJywgJ2RpYWdub3NlJywgJ3NlbGYtdXBkYXRlJywgJ2dsb2JhbCcsICdjcmVhdGUtcHJvamVjdCcsICdvdXRkYXRlZCddLCB0cnVlKQomJiAhZmlsZV9leGlzdHMoRmFjdG9yeTo6Z2V0Q29tcG9zZXJGaWxlKCkpCgomJiAoJHVzZVBhcmVudERpcklmTm9Kc29uQXZhaWxhYmxlID0gJHRoaXMtPmdldFVzZVBhcmVudERpckNvbmZpZ1ZhbHVlKCkpICE9PSBmYWxzZQoKJiYgKCRjb21tYW5kTmFtZSAhPT0gJ2NvbmZpZycgfHwgKCRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKCctLWZpbGUnLCB0cnVlKSA9PT0gZmFsc2UgJiYgJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oJy1mJywgdHJ1ZSkgPT09IGZhbHNlKSkKCiYmICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKCctLWhlbHAnLCB0cnVlKSA9PT0gZmFsc2UKJiYgJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oJy1oJywgdHJ1ZSkgPT09IGZhbHNlCikgewokZGlyID0gZGlybmFtZShQbGF0Zm9ybTo6Z2V0Q3dkKHRydWUpKTsKJGhvbWUgPSByZWFscGF0aChQbGF0Zm9ybTo6Z2V0RW52KCdIT01FJykgPzogUGxhdGZvcm06OmdldEVudignVVNFUlBST0ZJTEUnKSA/OiAnLycpOwoKCndoaWxlIChkaXJuYW1lKCRkaXIpICE9PSAkZGlyICYmICRkaXIgIT09ICRob21lKSB7CmlmIChmaWxlX2V4aXN0cygkZGlyLicvJy5GYWN0b3J5OjpnZXRDb21wb3NlckZpbGUoKSkpIHsKaWYgKCR1c2VQYXJlbnREaXJJZk5vSnNvbkF2YWlsYWJsZSAhPT0gdHJ1ZSAmJiAhJGlvLT5pc0ludGVyYWN0aXZlKCkpIHsKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5ObyBjb21wb3Nlci5qc29uIGluIGN1cnJlbnQgZGlyZWN0b3J5LCB0byB1c2UgdGhlIG9uZSBhdCAnLiRkaXIuJyBydW4gaW50ZXJhY3RpdmVseSBvciBzZXQgY29uZmlnLnVzZS1wYXJlbnQtZGlyIHRvIHRydWU8L2luZm8+Jyk7CmJyZWFrOwp9CmlmICgkdXNlUGFyZW50RGlySWZOb0pzb25BdmFpbGFibGUgPT09IHRydWUgfHwgJGlvLT5hc2tDb25maXJtYXRpb24oJzxpbmZvPk5vIGNvbXBvc2VyLmpzb24gaW4gY3VycmVudCBkaXJlY3RvcnksIGRvIHlvdSB3YW50IHRvIHVzZSB0aGUgb25lIGF0ICcuJGRpci4nPzwvaW5mbz4gWzxjb21tZW50PnksbjwvY29tbWVudD5dPyAnKSkgewppZiAoJHVzZVBhcmVudERpcklmTm9Kc29uQXZhaWxhYmxlID09PSB0cnVlKSB7CiRpby0+d3JpdGVFcnJvcignPGluZm8+Tm8gY29tcG9zZXIuanNvbiBpbiBjdXJyZW50IGRpcmVjdG9yeSwgY2hhbmdpbmcgd29ya2luZyBkaXJlY3RvcnkgdG8gJy4kZGlyLic8L2luZm8+Jyk7Cn0gZWxzZSB7CiRpby0+d3JpdGVFcnJvcignPGluZm8+QWx3YXlzIHdhbnQgdG8gdXNlIHRoZSBwYXJlbnQgZGlyPyBVc2UgImNvbXBvc2VyIGNvbmZpZyAtLWdsb2JhbCB1c2UtcGFyZW50LWRpciB0cnVlIiB0byBjaGFuZ2UgdGhlIGRlZmF1bHQuPC9pbmZvPicpOwp9CiRvbGRXb3JraW5nRGlyID0gUGxhdGZvcm06OmdldEN3ZCh0cnVlKTsKY2hkaXIoJGRpcik7Cn0KYnJlYWs7Cn0KJGRpciA9IGRpcm5hbWUoJGRpcik7Cn0KdW5zZXQoJGRpciwgJGhvbWUpOwp9CgokbmVlZHNTdWRvQ2hlY2sgPSAhUGxhdGZvcm06OmlzV2luZG93cygpCiYmIGZ1bmN0aW9uX2V4aXN0cygnZXhlYycpCiYmICFQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9BTExPV19TVVBFUlVTRVInKQomJiAhUGxhdGZvcm06OmlzRG9ja2VyKCk7CiRpc05vbkFsbG93ZWRSb290ID0gZmFsc2U7CgoKaWYgKCRuZWVkc1N1ZG9DaGVjaykgewokaXNOb25BbGxvd2VkUm9vdCA9ICR0aGlzLT5pc1J1bm5pbmdBc1Jvb3QoKTsKCmlmICgkaXNOb25BbGxvd2VkUm9vdCkgewppZiAoJHVpZCA9IChpbnQpIFBsYXRmb3JtOjpnZXRFbnYoJ1NVRE9fVUlEJykpIHsKCgpTaWxlbmNlcjo6Y2FsbCgnZXhlYycsICJzdWRvIC11IFxcI3skdWlkfSBzdWRvIC1LID4gL2Rldi9udWxsIDI+JjEiKTsKfQp9CgoKU2lsZW5jZXI6OmNhbGwoJ2V4ZWMnLCAnc3VkbyAtSyA+IC9kZXYvbnVsbCAyPiYxJyk7Cn0KCgoKJG1heU5lZWRQbHVnaW5Db21tYW5kID0gZmFsc2UgPT09ICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKFsnLS12ZXJzaW9uJywgJy1WJ10pCiYmICgKCmZhbHNlID09PSAkY29tbWFuZE5hbWUKCnx8IGluX2FycmF5KCRjb21tYW5kTmFtZSwgWycnLCAnbGlzdCcsICdoZWxwJ10sIHRydWUpCgoKfHwgKCRjb21tYW5kTmFtZSA9PT0gJ19jb21wbGV0ZScgJiYgISRpc05vbkFsbG93ZWRSb290KQopOwoKJG1heU5lZWRTY3JpcHRDb21tYW5kID0gJG1heU5lZWRQbHVnaW5Db21tYW5kIHx8ICRjb21tYW5kTmFtZSA9PT0gJ3J1bi1zY3JpcHQnIHx8ICRyYXdDb21tYW5kTmFtZSAhPT0gJGNvbW1hbmROYW1lOwoKaWYgKCRtYXlOZWVkUGx1Z2luQ29tbWFuZCAmJiAhJHRoaXMtPmRpc2FibGVQbHVnaW5zQnlEZWZhdWx0ICYmICEkdGhpcy0+aGFzUGx1Z2luQ29tbWFuZHMpIHsKCgppZiAoJGlzTm9uQWxsb3dlZFJvb3QpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5EbyBub3QgcnVuIENvbXBvc2VyIGFzIHJvb3Qvc3VwZXIgdXNlciEgU2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL3Jvb3QgZm9yIGRldGFpbHM8L3dhcm5pbmc+Jyk7CgppZiAoJGlvLT5pc0ludGVyYWN0aXZlKCkgJiYgJGlvLT5hc2tDb25maXJtYXRpb24oJzxpbmZvPkNvbnRpbnVlIGFzIHJvb3Qvc3VwZXIgdXNlcjwvaW5mbz4gWzxjb21tZW50PnllczwvY29tbWVudD5dPyAnKSkgewoKJGlzTm9uQWxsb3dlZFJvb3QgPSBmYWxzZTsKfSBlbHNlIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5BYm9ydGluZyBhcyBubyBwbHVnaW4gc2hvdWxkIGJlIGxvYWRlZCBpZiBydW5uaW5nIGFzIHN1cGVyIHVzZXIgaXMgbm90IGV4cGxpY2l0bHkgYWxsb3dlZDwvd2FybmluZz4nKTsKCnJldHVybiAxOwp9Cn0KCnRyeSB7CmZvcmVhY2ggKCR0aGlzLT5nZXRQbHVnaW5Db21tYW5kcygpIGFzICRjb21tYW5kKSB7CmlmICgkdGhpcy0+aGFzKCRjb21tYW5kLT5nZXROYW1lKCkpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+UGx1Z2luIGNvbW1hbmQgJy4kY29tbWFuZC0+Z2V0TmFtZSgpLicgKCcuZ2V0X2NsYXNzKCRjb21tYW5kKS4nKSB3b3VsZCBvdmVycmlkZSBhIENvbXBvc2VyIGNvbW1hbmQgYW5kIGhhcyBiZWVuIHNraXBwZWQ8L3dhcm5pbmc+Jyk7Cn0gZWxzZSB7CgoKbWV0aG9kX2V4aXN0cygkdGhpcywgJ2FkZENvbW1hbmQnKSA/ICR0aGlzLT5hZGRDb21tYW5kKCRjb21tYW5kKSA6ICR0aGlzLT5hZGQoJGNvbW1hbmQpOwp9Cn0KfSBjYXRjaCAoTm9Tc2xFeGNlcHRpb24gJGUpIHsKCn0gY2F0Y2ggKFBhcnNpbmdFeGNlcHRpb24gJGUpIHsKJGRldGFpbHMgPSAkZS0+Z2V0RGV0YWlscygpOwoKJGZpbGUgPSByZWFscGF0aChGYWN0b3J5OjpnZXRDb21wb3NlckZpbGUoKSk7CgokbGluZSA9IG51bGw7CmlmICgkZGV0YWlscyAmJiBpc3NldCgkZGV0YWlsc1snbGluZSddKSkgewokbGluZSA9ICRkZXRhaWxzWydsaW5lJ107Cn0KCiRnaGUgPSBuZXcgR2l0aHViQWN0aW9uRXJyb3IoJHRoaXMtPmlvKTsKJGdoZS0+ZW1pdCgkZS0+Z2V0TWVzc2FnZSgpLCAkZmlsZSwgJGxpbmUpOwoKdGhyb3cgJGU7Cn0KCiR0aGlzLT5oYXNQbHVnaW5Db21tYW5kcyA9IHRydWU7Cn0KCmlmICghJHRoaXMtPmRpc2FibGVQbHVnaW5zQnlEZWZhdWx0ICYmICRpc05vbkFsbG93ZWRSb290ICYmICEkaW8tPmlzSW50ZXJhY3RpdmUoKSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5Db21wb3NlciBwbHVnaW5zIGhhdmUgYmVlbiBkaXNhYmxlZCBmb3Igc2FmZXR5IGluIHRoaXMgbm9uLWludGVyYWN0aXZlIHNlc3Npb24uPC9lcnJvcj4nKTsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+U2V0IENPTVBPU0VSX0FMTE9XX1NVUEVSVVNFUj0xIGlmIHlvdSB3YW50IHRvIGFsbG93IHBsdWdpbnMgdG8gcnVuIGFzIHJvb3Qvc3VwZXIgdXNlci48L2Vycm9yPicpOwokdGhpcy0+ZGlzYWJsZVBsdWdpbnNCeURlZmF1bHQgPSB0cnVlOwp9CgoKJGlzUHJveHlDb21tYW5kID0gZmFsc2U7CmlmICgkbmFtZSA9ICR0aGlzLT5nZXRDb21tYW5kTmFtZUJlZm9yZUJpbmRpbmcoJGlucHV0KSkgewp0cnkgewokY29tbWFuZCA9ICR0aGlzLT5maW5kKCRuYW1lKTsKJGNvbW1hbmROYW1lID0gJGNvbW1hbmQtPmdldE5hbWUoKTsKJGlzUHJveHlDb21tYW5kID0gKCRjb21tYW5kIGluc3RhbmNlb2YgQ29tbWFuZFxCYXNlQ29tbWFuZCAmJiAkY29tbWFuZC0+aXNQcm94eUNvbW1hbmQoKSk7Cn0gY2F0Y2ggKFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gJGUpIHsKfQp9CgppZiAoISRpc1Byb3h5Q29tbWFuZCkgewokaW8tPndyaXRlRXJyb3Ioc3ByaW50ZigKJ1J1bm5pbmcgJXMgKCVzKSB3aXRoICVzIG9uICVzJywKQ29tcG9zZXI6OmdldFZlcnNpb24oKSwKQ29tcG9zZXI6OlJFTEVBU0VfREFURSwKZGVmaW5lZCgnSEhWTV9WRVJTSU9OJykgPyAnSEhWTSAnLkhIVk1fVkVSU0lPTiA6ICdQSFAgJy5QSFBfVkVSU0lPTiwKZnVuY3Rpb25fZXhpc3RzKCdwaHBfdW5hbWUnKSA/IHBocF91bmFtZSgncycpIC4gJyAvICcgLiBwaHBfdW5hbWUoJ3InKSA6ICdVbmtub3duIE9TJwopLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDcwMjA1KSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Q29tcG9zZXIgc3VwcG9ydHMgUEhQIDcuMi41IGFuZCBhYm92ZSwgeW91IHdpbGwgbW9zdCBsaWtlbHkgZW5jb3VudGVyIHByb2JsZW1zIHdpdGggeW91ciBQSFAgJy5QSFBfVkVSU0lPTi4nLiBVcGdyYWRpbmcgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgYnV0IHlvdSBjYW4gdXNlIENvbXBvc2VyIDIuMi54IExUUyBhcyBhIGZhbGxiYWNrLjwvd2FybmluZz4nKTsKfQoKaWYgKFhkZWJ1Z0hhbmRsZXI6OmlzWGRlYnVnQWN0aXZlKCkgJiYgIVBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0RJU0FCTEVfWERFQlVHX1dBUk4nKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkNvbXBvc2VyIGlzIG9wZXJhdGluZyBzbG93ZXIgdGhhbiBub3JtYWwgYmVjYXVzZSB5b3UgaGF2ZSBYZGVidWcgZW5hYmxlZC4gU2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL3hkZWJ1Zzwvd2FybmluZz4nKTsKfQoKaWYgKGRlZmluZWQoJ0NPTVBPU0VSX0RFVl9XQVJOSU5HX1RJTUUnKSAmJiAkY29tbWFuZE5hbWUgIT09ICdzZWxmLXVwZGF0ZScgJiYgJGNvbW1hbmROYW1lICE9PSAnc2VsZnVwZGF0ZScgJiYgdGltZSgpID4gQ09NUE9TRVJfREVWX1dBUk5JTkdfVElNRSkgewokaW8tPndyaXRlRXJyb3Ioc3ByaW50ZignPHdhcm5pbmc+V2FybmluZzogVGhpcyBkZXZlbG9wbWVudCBidWlsZCBvZiBDb21wb3NlciBpcyBvdmVyIDYwIGRheXMgb2xkLiBJdCBpcyByZWNvbW1lbmRlZCB0byB1cGRhdGUgaXQgYnkgcnVubmluZyAiJXMgc2VsZi11cGRhdGUiIHRvIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24uPC93YXJuaW5nPicsICRfU0VSVkVSWydQSFBfU0VMRiddKSk7Cn0KCmlmICgkaXNOb25BbGxvd2VkUm9vdCkgewppZiAoJGNvbW1hbmROYW1lICE9PSAnc2VsZi11cGRhdGUnICYmICRjb21tYW5kTmFtZSAhPT0gJ3NlbGZ1cGRhdGUnICYmICRjb21tYW5kTmFtZSAhPT0gJ19jb21wbGV0ZScpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5EbyBub3QgcnVuIENvbXBvc2VyIGFzIHJvb3Qvc3VwZXIgdXNlciEgU2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL3Jvb3QgZm9yIGRldGFpbHM8L3dhcm5pbmc+Jyk7CgppZiAoJGlvLT5pc0ludGVyYWN0aXZlKCkpIHsKaWYgKCEkaW8tPmFza0NvbmZpcm1hdGlvbignPGluZm8+Q29udGludWUgYXMgcm9vdC9zdXBlciB1c2VyPC9pbmZvPiBbPGNvbW1lbnQ+eWVzPC9jb21tZW50Pl0/ICcpKSB7CnJldHVybiAxOwp9Cn0KfQp9CgoKU2lsZW5jZXI6OmNhbGwoc3RhdGljIGZ1bmN0aW9uICgpIHVzZSAoJGlvKTogdm9pZCB7CiRwaWQgPSBmdW5jdGlvbl9leGlzdHMoJ2dldG15cGlkJykgPyBnZXRteXBpZCgpIC4gJy0nIDogJyc7CiR0ZW1wZmlsZSA9IHN5c19nZXRfdGVtcF9kaXIoKSAuICcvdGVtcC0nIC4gJHBpZCAuIGJpbjJoZXgocmFuZG9tX2J5dGVzKDUpKTsKaWYgKCEoZmlsZV9wdXRfY29udGVudHMoJHRlbXBmaWxlLCBfX0ZJTEVfXykgJiYgKGZpbGVfZ2V0X2NvbnRlbnRzKCR0ZW1wZmlsZSkgPT09IF9fRklMRV9fKSAmJiB1bmxpbmsoJHRlbXBmaWxlKSAmJiAhZmlsZV9leGlzdHMoJHRlbXBmaWxlKSkpIHsKJGlvLT53cml0ZUVycm9yKHNwcmludGYoJzxlcnJvcj5QSFAgdGVtcCBkaXJlY3RvcnkgKCVzKSBkb2VzIG5vdCBleGlzdCBvciBpcyBub3Qgd3JpdGFibGUgdG8gQ29tcG9zZXIuIFNldCBzeXNfdGVtcF9kaXIgaW4geW91ciBwaHAuaW5pPC9lcnJvcj4nLCBzeXNfZ2V0X3RlbXBfZGlyKCkpKTsKfQp9KTsKCgokZmlsZSA9IEZhY3Rvcnk6OmdldENvbXBvc2VyRmlsZSgpOwppZiAoJG1heU5lZWRTY3JpcHRDb21tYW5kICYmIGlzX2ZpbGUoJGZpbGUpICYmIEZpbGVzeXN0ZW06OmlzUmVhZGFibGUoJGZpbGUpICYmIGlzX2FycmF5KCRjb21wb3Nlckpzb24gPSBqc29uX2RlY29kZShmaWxlX2dldF9jb250ZW50cygkZmlsZSksIHRydWUpKSkgewppZiAoaXNzZXQoJGNvbXBvc2VySnNvblsnc2NyaXB0cyddKSAmJiBpc19hcnJheSgkY29tcG9zZXJKc29uWydzY3JpcHRzJ10pKSB7CmZvcmVhY2ggKCRjb21wb3Nlckpzb25bJ3NjcmlwdHMnXSBhcyAkc2NyaXB0ID0+ICRkdW1teSkgewppZiAoIWRlZmluZWQoJ0NvbXBvc2VyXFNjcmlwdFxTY3JpcHRFdmVudHM6Oicuc3RyX3JlcGxhY2UoJy0nLCAnXycsIHN0cnRvdXBwZXIoJHNjcmlwdCkpKSkgewppZiAoJHRoaXMtPmhhcygkc2NyaXB0KSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkEgc2NyaXB0IG5hbWVkICcuJHNjcmlwdC4nIHdvdWxkIG92ZXJyaWRlIGEgQ29tcG9zZXIgY29tbWFuZCBhbmQgaGFzIGJlZW4gc2tpcHBlZDwvd2FybmluZz4nKTsKfSBlbHNlIHsKJGRlc2NyaXB0aW9uID0gJ1J1bnMgdGhlICcuJHNjcmlwdC4nIHNjcmlwdCBhcyBkZWZpbmVkIGluIGNvbXBvc2VyLmpzb24nOwoKaWYgKGlzc2V0KCRjb21wb3Nlckpzb25bJ3NjcmlwdHMtZGVzY3JpcHRpb25zJ11bJHNjcmlwdF0pKSB7CiRkZXNjcmlwdGlvbiA9ICRjb21wb3Nlckpzb25bJ3NjcmlwdHMtZGVzY3JpcHRpb25zJ11bJHNjcmlwdF07Cn0KCiRhbGlhc2VzID0gJGNvbXBvc2VySnNvblsnc2NyaXB0cy1hbGlhc2VzJ11bJHNjcmlwdF0gPz8gW107CgokY29tcG9zZXIgPSAkdGhpcy0+Z2V0Q29tcG9zZXIoZmFsc2UpOwppZiAoJGNvbXBvc2VyICE9PSBudWxsKSB7CiRyb290UGFja2FnZSA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpOwokZ2VuZXJhdG9yID0gJGNvbXBvc2VyLT5nZXRBdXRvbG9hZEdlbmVyYXRvcigpOwoKJHBhY2thZ2VNYXAgPSAkZ2VuZXJhdG9yLT5idWlsZFBhY2thZ2VNYXAoJGNvbXBvc2VyLT5nZXRJbnN0YWxsYXRpb25NYW5hZ2VyKCksICRyb290UGFja2FnZSwgW10pOwokbWFwID0gJGdlbmVyYXRvci0+cGFyc2VBdXRvbG9hZHMoJHBhY2thZ2VNYXAsICRyb290UGFja2FnZSk7CgokbG9hZGVyID0gJGdlbmVyYXRvci0+Y3JlYXRlTG9hZGVyKCRtYXAsICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgndmVuZG9yLWRpcicpKTsKJGxvYWRlci0+cmVnaXN0ZXIoZmFsc2UpOwp9CgoKaWYgKGlzX3N0cmluZygkZHVtbXkpICYmIGNsYXNzX2V4aXN0cygkZHVtbXkpICYmIGlzX3N1YmNsYXNzX29mKCRkdW1teSwgU3ltZm9ueUNvbW1hbmQ6OmNsYXNzKSkgewppZiAoaXNfc3ViY2xhc3Nfb2YoJGR1bW15LCBTaW5nbGVDb21tYW5kQXBwbGljYXRpb246OmNsYXNzKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlRoZSBzY3JpcHQgbmFtZWQgJy4kc2NyaXB0LicgZXh0ZW5kcyBTaW5nbGVDb21tYW5kQXBwbGljYXRpb24gd2hpY2ggaXMgbm90IGNvbXBhdGlibGUgd2l0aCBDb21wb3NlciAyLjkrLCBtYWtlIHN1cmUgeW91IGV4dGVuZCBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmQgaW5zdGVhZC48L3dhcm5pbmc+Jyk7Cn0KCiRjbWQgPSBuZXcgJGR1bW15KCRzY3JpcHQpOwoKCmlmICgkY21kLT5nZXROYW1lKCkgIT09ICcnICYmICRjbWQtPmdldE5hbWUoKSAhPT0gbnVsbCAmJiAkY21kLT5nZXROYW1lKCkgIT09ICRzY3JpcHQpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5UaGUgc2NyaXB0IG5hbWVkICcuJHNjcmlwdC4nIGluIGNvbXBvc2VyLmpzb24gaGFzIGEgbWlzbWF0Y2hlZCBuYW1lIGluIGl0cyBjbGFzcyBkZWZpbml0aW9uLiBGb3IgY29uc2lzdGVuY3ksIGVpdGhlciB1c2UgdGhlIHNhbWUgbmFtZSwgb3IgZG8gbm90IGRlZmluZSBvbmUgaW5zaWRlIHRoZSBjbGFzcy48L3dhcm5pbmc+Jyk7CiRjbWQtPnNldE5hbWUoJHNjcmlwdCk7IAp9CgppZiAoJGNtZC0+Z2V0RGVzY3JpcHRpb24oKSA9PT0gJycgJiYgaXNfc3RyaW5nKCRkZXNjcmlwdGlvbikpIHsKJGNtZC0+c2V0RGVzY3JpcHRpb24oJGRlc2NyaXB0aW9uKTsKfQp9IGVsc2UgewoKJGNtZCA9IG5ldyBDb21tYW5kXFNjcmlwdEFsaWFzQ29tbWFuZCgkc2NyaXB0LCAkZGVzY3JpcHRpb24sICRhbGlhc2VzKTsKfQoKCgptZXRob2RfZXhpc3RzKCR0aGlzLCAnYWRkQ29tbWFuZCcpID8gJHRoaXMtPmFkZENvbW1hbmQoJGNtZCkgOiAkdGhpcy0+YWRkKCRjbWQpOwp9Cn0KfQp9Cn0KfQoKdHJ5IHsKaWYgKCRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKCctLXByb2ZpbGUnKSkgewokc3RhcnRUaW1lID0gbWljcm90aW1lKHRydWUpOwokdGhpcy0+aW8tPmVuYWJsZURlYnVnZ2luZygkc3RhcnRUaW1lKTsKfQoKJHJlc3VsdCA9IHBhcmVudDo6ZG9SdW4oJGlucHV0LCAkb3V0cHV0KTsKCmlmICh0cnVlID09PSAkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbihbJy0tdmVyc2lvbicsICctViddLCB0cnVlKSkgewokaW8tPndyaXRlRXJyb3Ioc3ByaW50ZignPGluZm8+UEhQPC9pbmZvPiB2ZXJzaW9uIDxjb21tZW50PiVzPC9jb21tZW50PiAoJXMpJywgXFBIUF9WRVJTSU9OLCBcUEhQX0JJTkFSWSkpOwokaW8tPndyaXRlRXJyb3IoJ1J1biB0aGUgImRpYWdub3NlIiBjb21tYW5kIHRvIGdldCBtb3JlIGRldGFpbGVkIGRpYWdub3N0aWNzIG91dHB1dC4nKTsKfQoKCmlmIChpc3NldCgkb2xkV29ya2luZ0RpcikgJiYgJycgIT09ICRvbGRXb3JraW5nRGlyKSB7ClNpbGVuY2VyOjpjYWxsKCdjaGRpcicsICRvbGRXb3JraW5nRGlyKTsKfQoKaWYgKGlzc2V0KCRzdGFydFRpbWUpKSB7CiRpby0+d3JpdGVFcnJvcignPGluZm8+TWVtb3J5IHVzYWdlOiAnLnJvdW5kKG1lbW9yeV9nZXRfdXNhZ2UoKSAvIDEwMjQgLyAxMDI0LCAyKS4nTWlCIChwZWFrOiAnLnJvdW5kKG1lbW9yeV9nZXRfcGVha191c2FnZSgpIC8gMTAyNCAvIDEwMjQsIDIpLidNaUIpLCB0aW1lOiAnLnJvdW5kKG1pY3JvdGltZSh0cnVlKSAtICRzdGFydFRpbWUsIDIpLidzPC9pbmZvPicpOwp9CgpyZXR1cm4gJHJlc3VsdDsKfSBjYXRjaCAoU2NyaXB0RXhlY3V0aW9uRXhjZXB0aW9uICRlKSB7CmlmICgkdGhpcy0+Z2V0RGlzYWJsZVBsdWdpbnNCeURlZmF1bHQoKSAmJiAkdGhpcy0+aXNSdW5uaW5nQXNSb290KCkgJiYgISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPlBsdWdpbnMgaGF2ZSBiZWVuIGRpc2FibGVkIGF1dG9tYXRpY2FsbHkgYXMgeW91IGFyZSBydW5uaW5nIGFzIHJvb3QsIHRoaXMgbWF5IGJlIHRoZSBjYXVzZSBvZiB0aGUgc2NyaXB0IGZhaWx1cmUuPC9lcnJvcj4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5TZWUgYWxzbyBodHRwczovL2dldGNvbXBvc2VyLm9yZy9yb290PC9lcnJvcj4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwp9CgpyZXR1cm4gJGUtPmdldENvZGUoKTsKfSBjYXRjaCAoXFRocm93YWJsZSAkZSkgewokZ2hlID0gbmV3IEdpdGh1YkFjdGlvbkVycm9yKCR0aGlzLT5pbyk7CiRnaGUtPmVtaXQoJGUtPmdldE1lc3NhZ2UoKSk7CgokdGhpcy0+aGludENvbW1vbkVycm9ycygkZSwgJG91dHB1dCk7CgoKCgppZiAoIW1ldGhvZF9leGlzdHMoJHRoaXMsICdzZXRDYXRjaEVycm9ycycpICYmICEkZSBpbnN0YW5jZW9mIFxFeGNlcHRpb24pIHsKaWYgKCRvdXRwdXQgaW5zdGFuY2VvZiBDb25zb2xlT3V0cHV0SW50ZXJmYWNlKSB7CiR0aGlzLT5yZW5kZXJUaHJvd2FibGUoJGUsICRvdXRwdXQtPmdldEVycm9yT3V0cHV0KCkpOwp9IGVsc2UgewokdGhpcy0+cmVuZGVyVGhyb3dhYmxlKCRlLCAkb3V0cHV0KTsKfQoKcmV0dXJuIG1heCgxLCAkZS0+Z2V0Q29kZSgpKTsKfQoKCgppZiAoJGUgaW5zdGFuY2VvZiBUcmFuc3BvcnRFeGNlcHRpb24pIHsKJHJlZmxQcm9wID0gbmV3IFxSZWZsZWN0aW9uUHJvcGVydHkoJGUsICdjb2RlJyk7CihcUEhQX1ZFUlNJT05fSUQgPCA4MDEwMCkgYW5kICRyZWZsUHJvcC0+c2V0QWNjZXNzaWJsZSh0cnVlKTsKJHJlZmxQcm9wLT5zZXRWYWx1ZSgkZSwgSW5zdGFsbGVyOjpFUlJPUl9UUkFOU1BPUlRfRVhDRVBUSU9OKTsKfQoKdGhyb3cgJGU7Cn0gZmluYWxseSB7CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0TmV3V29ya2luZ0RpcihJbnB1dEludGVyZmFjZSAkaW5wdXQpOiA/c3RyaW5nCnsKCiR3b3JraW5nRGlyID0gJGlucHV0LT5nZXRQYXJhbWV0ZXJPcHRpb24oWyctLXdvcmtpbmctZGlyJywgJy1kJ10sIG51bGwsIHRydWUpOwppZiAobnVsbCAhPT0gJHdvcmtpbmdEaXIgJiYgIWlzX2Rpcigkd29ya2luZ0RpcikpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ0ludmFsaWQgd29ya2luZyBkaXJlY3Rvcnkgc3BlY2lmaWVkLCAnLiR3b3JraW5nRGlyLicgZG9lcyBub3QgZXhpc3QuJyk7Cn0KCnJldHVybiAkd29ya2luZ0RpcjsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBoaW50Q29tbW9uRXJyb3JzKFxUaHJvd2FibGUgJGV4Y2VwdGlvbiwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiB2b2lkCnsKJGlvID0gJHRoaXMtPmdldElPKCk7CgppZiAoKGdldF9jbGFzcygkZXhjZXB0aW9uKSA9PT0gTG9naWNFeGNlcHRpb246OmNsYXNzIHx8ICRleGNlcHRpb24gaW5zdGFuY2VvZiBcRXJyb3IpICYmICRvdXRwdXQtPmdldFZlcmJvc2l0eSgpIDwgT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfVkVSQk9TRSkgewokb3V0cHV0LT5zZXRWZXJib3NpdHkoT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfVkVSQk9TRSk7Cn0KClNpbGVuY2VyOjpzdXBwcmVzcygpOwp0cnkgewokY29tcG9zZXIgPSAkdGhpcy0+Z2V0Q29tcG9zZXIoZmFsc2UsIHRydWUpOwppZiAobnVsbCAhPT0gJGNvbXBvc2VyICYmIGZ1bmN0aW9uX2V4aXN0cygnZGlza19mcmVlX3NwYWNlJykpIHsKJGNvbmZpZyA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCk7CgokbWluU3BhY2VGcmVlID0gMTAwICogMTAyNCAqIDEwMjQ7CmlmICgoKCRkZiA9IGRpc2tfZnJlZV9zcGFjZSgkZGlyID0gJGNvbmZpZy0+Z2V0KCdob21lJykpKSAhPT0gZmFsc2UgJiYgJGRmIDwgJG1pblNwYWNlRnJlZSkKfHwgKCgkZGYgPSBkaXNrX2ZyZWVfc3BhY2UoJGRpciA9ICRjb25maWctPmdldCgndmVuZG9yLWRpcicpKSkgIT09IGZhbHNlICYmICRkZiA8ICRtaW5TcGFjZUZyZWUpCnx8ICgoJGRmID0gZGlza19mcmVlX3NwYWNlKCRkaXIgPSBzeXNfZ2V0X3RlbXBfZGlyKCkpKSAhPT0gZmFsc2UgJiYgJGRmIDwgJG1pblNwYWNlRnJlZSkKKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPlRoZSBkaXNrIGhvc3RpbmcgJy4kZGlyLicgaGFzIGxlc3MgdGhhbiAxMDBNaUIgb2YgZnJlZSBzcGFjZSwgdGhpcyBtYXkgYmUgdGhlIGNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uPC9lcnJvcj4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwp9Cn0KfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewp9ClNpbGVuY2VyOjpyZXN0b3JlKCk7CgppZiAoJGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFRyYW5zcG9ydEV4Y2VwdGlvbiAmJiBzdHJfY29udGFpbnMoJGV4Y2VwdGlvbi0+Z2V0TWVzc2FnZSgpLCAnVW5hYmxlIHRvIHVzZSBhIHByb3h5JykpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+VGhlIGZvbGxvd2luZyBleGNlcHRpb24gaW5kaWNhdGVzIHlvdXIgcHJveHkgaXMgbWlzY29uZmlndXJlZDwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Q2hlY2sgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jL2ZhcXMvaG93LXRvLXVzZS1jb21wb3Nlci1iZWhpbmQtYS1wcm94eS5tZCBmb3IgZGV0YWlsczwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKfQoKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiAkZXhjZXB0aW9uIGluc3RhbmNlb2YgVHJhbnNwb3J0RXhjZXB0aW9uICYmIHN0cl9jb250YWlucygkZXhjZXB0aW9uLT5nZXRNZXNzYWdlKCksICd1bmFibGUgdG8gZ2V0IGxvY2FsIGlzc3VlciBjZXJ0aWZpY2F0ZScpKSB7CiRhdmFzdERldGVjdCA9IGdsb2IoJ0M6XFByb2dyYW0gRmlsZXNcQXZhc3QqJyk7CmlmIChpc19hcnJheSgkYXZhc3REZXRlY3QpICYmIGNvdW50KCRhdmFzdERldGVjdCkgIT09IDApIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+VGhlIGZvbGxvd2luZyBleGNlcHRpb24gaW5kaWNhdGVzIGEgcG9zc2libGUgaXNzdWUgd2l0aCB0aGUgQXZhc3QgRmlyZXdhbGw8L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPkNoZWNrIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2xvY2FsLWlzc3VlciBmb3IgZGV0YWlsczwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKfSBlbHNlIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+VGhlIGZvbGxvd2luZyBleGNlcHRpb24gaW5kaWNhdGVzIGEgcG9zc2libGUgaXNzdWUgd2l0aCBhIEZpcmV3YWxsL0FudGl2aXJ1czwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Q2hlY2sgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvbG9jYWwtaXNzdWVyIGZvciBkZXRhaWxzPC9lcnJvcj4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwp9Cn0KCmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkgJiYgZmFsc2UgIT09IHN0cnBvcygkZXhjZXB0aW9uLT5nZXRNZXNzYWdlKCksICdUaGUgc3lzdGVtIGNhbm5vdCBmaW5kIHRoZSBwYXRoIHNwZWNpZmllZCcpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPlRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uIG1heSBiZSBjYXVzZWQgYnkgYSBzdGFsZSBlbnRyeSBpbiB5b3VyIGNtZC5leGUgQXV0b1J1bjwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Q2hlY2sgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jL2FydGljbGVzL3Ryb3VibGVzaG9vdGluZy5tZCMtdGhlLXN5c3RlbS1jYW5ub3QtZmluZC10aGUtcGF0aC1zcGVjaWZpZWQtd2luZG93cy0gZm9yIGRldGFpbHM8L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7Cn0KCmlmIChmYWxzZSAhPT0gc3RycG9zKCRleGNlcHRpb24tPmdldE1lc3NhZ2UoKSwgJ2ZvcmsgZmFpbGVkIC0gQ2Fubm90IGFsbG9jYXRlIG1lbW9yeScpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPlRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uIGlzIGNhdXNlZCBieSBhIGxhY2sgb2YgbWVtb3J5IG9yIHN3YXAsIG9yIG5vdCBoYXZpbmcgc3dhcCBjb25maWd1cmVkPC9lcnJvcj4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5DaGVjayBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvYXJ0aWNsZXMvdHJvdWJsZXNob290aW5nLm1kI3Byb2Mtb3Blbi1mb3JrLWZhaWxlZC1lcnJvcnMgZm9yIGRldGFpbHM8L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7Cn0KCmlmICgkZXhjZXB0aW9uIGluc3RhbmNlb2YgUHJvY2Vzc1RpbWVkT3V0RXhjZXB0aW9uKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPlRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uIGlzIGNhdXNlZCBieSBhIHByb2Nlc3MgdGltZW91dDwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Q2hlY2sgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzA2LWNvbmZpZy5tZCNwcm9jZXNzLXRpbWVvdXQgZm9yIGRldGFpbHM8L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7Cn0KCmlmICgkdGhpcy0+Z2V0RGlzYWJsZVBsdWdpbnNCeURlZmF1bHQoKSAmJiAkdGhpcy0+aXNSdW5uaW5nQXNSb290KCkgJiYgISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPlBsdWdpbnMgaGF2ZSBiZWVuIGRpc2FibGVkIGF1dG9tYXRpY2FsbHkgYXMgeW91IGFyZSBydW5uaW5nIGFzIHJvb3QsIHRoaXMgbWF5IGJlIHRoZSBjYXVzZSBvZiB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbi4gU2VlIGFsc28gaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvcm9vdDwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKfSBlbHNlaWYgKCRleGNlcHRpb24gaW5zdGFuY2VvZiBDb21tYW5kTm90Rm91bmRFeGNlcHRpb24gJiYgJHRoaXMtPmdldERpc2FibGVQbHVnaW5zQnlEZWZhdWx0KCkpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+UGx1Z2lucyBoYXZlIGJlZW4gZGlzYWJsZWQsIHdoaWNoIG1heSBiZSB3aHkgc29tZSBjb21tYW5kcyBhcmUgbWlzc2luZywgdW5sZXNzIHlvdSBtYWRlIGEgdHlwbzwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKfQoKJGhpbnRzID0gSHR0cERvd25sb2FkZXI6OmdldEV4Y2VwdGlvbkhpbnRzKCRleGNlcHRpb24pOwppZiAobnVsbCAhPT0gJGhpbnRzICYmIGNvdW50KCRoaW50cykgPiAwKSB7CmZvcmVhY2ggKCRoaW50cyBhcyAkaGludCkgewokaW8tPndyaXRlRXJyb3IoJGhpbnQsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7Cn0KfQp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21wb3Nlcihib29sICRyZXF1aXJlZCA9IHRydWUsID9ib29sICRkaXNhYmxlUGx1Z2lucyA9IG51bGwsID9ib29sICRkaXNhYmxlU2NyaXB0cyA9IG51bGwpOiA/Q29tcG9zZXIKewppZiAobnVsbCA9PT0gJGRpc2FibGVQbHVnaW5zKSB7CiRkaXNhYmxlUGx1Z2lucyA9ICR0aGlzLT5kaXNhYmxlUGx1Z2luc0J5RGVmYXVsdDsKfQppZiAobnVsbCA9PT0gJGRpc2FibGVTY3JpcHRzKSB7CiRkaXNhYmxlU2NyaXB0cyA9ICR0aGlzLT5kaXNhYmxlU2NyaXB0c0J5RGVmYXVsdDsKfQoKaWYgKG51bGwgPT09ICR0aGlzLT5jb21wb3Nlcikgewp0cnkgewokdGhpcy0+Y29tcG9zZXIgPSBGYWN0b3J5OjpjcmVhdGUoUGxhdGZvcm06OmlzSW5wdXRDb21wbGV0aW9uUHJvY2VzcygpID8gbmV3IE51bGxJTygpIDogJHRoaXMtPmlvLCBudWxsLCAkZGlzYWJsZVBsdWdpbnMsICRkaXNhYmxlU2NyaXB0cyk7Cn0gY2F0Y2ggKFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gJGUpIHsKaWYgKCRyZXF1aXJlZCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJGUtPmdldE1lc3NhZ2UoKSk7CmlmICgkdGhpcy0+YXJlRXhjZXB0aW9uc0NhdWdodCgpKSB7CmV4aXQoMSk7Cn0KdGhyb3cgJGU7Cn0KfSBjYXRjaCAoSnNvblZhbGlkYXRpb25FeGNlcHRpb24gJGUpIHsKaWYgKCRyZXF1aXJlZCkgewp0aHJvdyAkZTsKfQp9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uICRlKSB7CmlmICgkcmVxdWlyZWQpIHsKdGhyb3cgJGU7Cn0KfQp9CgpyZXR1cm4gJHRoaXMtPmNvbXBvc2VyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzZXRDb21wb3NlcigpOiB2b2lkCnsKJHRoaXMtPmNvbXBvc2VyID0gbnVsbDsKaWYgKG1ldGhvZF9leGlzdHMoJHRoaXMtPmdldElPKCksICdyZXNldEF1dGhlbnRpY2F0aW9ucycpKSB7CiR0aGlzLT5nZXRJTygpLT5yZXNldEF1dGhlbnRpY2F0aW9ucygpOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRJTygpOiBJT0ludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+aW87Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRIZWxwKCk6IHN0cmluZwp7CnJldHVybiBzZWxmOjokbG9nbyAuIHBhcmVudDo6Z2V0SGVscCgpOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldERlZmF1bHRDb21tYW5kcygpOiBhcnJheQp7CnJldHVybiBhcnJheV9tZXJnZShwYXJlbnQ6OmdldERlZmF1bHRDb21tYW5kcygpLCBbCm5ldyBDb21tYW5kXEFib3V0Q29tbWFuZCgpLApuZXcgQ29tbWFuZFxDb25maWdDb21tYW5kKCksCm5ldyBDb21tYW5kXERlcGVuZHNDb21tYW5kKCksCm5ldyBDb21tYW5kXFByb2hpYml0c0NvbW1hbmQoKSwKbmV3IENvbW1hbmRcSW5pdENvbW1hbmQoKSwKbmV3IENvbW1hbmRcSW5zdGFsbENvbW1hbmQoKSwKbmV3IENvbW1hbmRcQ3JlYXRlUHJvamVjdENvbW1hbmQoKSwKbmV3IENvbW1hbmRcVXBkYXRlQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxTZWFyY2hDb21tYW5kKCksCm5ldyBDb21tYW5kXFZhbGlkYXRlQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxBdWRpdENvbW1hbmQoKSwKbmV3IENvbW1hbmRcU2hvd0NvbW1hbmQoKSwKbmV3IENvbW1hbmRcU3VnZ2VzdHNDb21tYW5kKCksCm5ldyBDb21tYW5kXFJlcXVpcmVDb21tYW5kKCksCm5ldyBDb21tYW5kXER1bXBBdXRvbG9hZENvbW1hbmQoKSwKbmV3IENvbW1hbmRcU3RhdHVzQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxBcmNoaXZlQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxEaWFnbm9zZUNvbW1hbmQoKSwKbmV3IENvbW1hbmRcUnVuU2NyaXB0Q29tbWFuZCgpLApuZXcgQ29tbWFuZFxMaWNlbnNlc0NvbW1hbmQoKSwKbmV3IENvbW1hbmRcR2xvYmFsQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxDbGVhckNhY2hlQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxSZW1vdmVDb21tYW5kKCksCm5ldyBDb21tYW5kXEhvbWVDb21tYW5kKCksCm5ldyBDb21tYW5kXEV4ZWNDb21tYW5kKCksCm5ldyBDb21tYW5kXE91dGRhdGVkQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxDaGVja1BsYXRmb3JtUmVxc0NvbW1hbmQoKSwKbmV3IENvbW1hbmRcRnVuZENvbW1hbmQoKSwKbmV3IENvbW1hbmRcUmVpbnN0YWxsQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxCdW1wQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxSZXBvc2l0b3J5Q29tbWFuZCgpLApuZXcgQ29tbWFuZFxTZWxmVXBkYXRlQ29tbWFuZCgpLApdKTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldENvbW1hbmROYW1lQmVmb3JlQmluZGluZyhJbnB1dEludGVyZmFjZSAkaW5wdXQpOiA/c3RyaW5nCnsKJGlucHV0ID0gY2xvbmUgJGlucHV0Owp0cnkgewoKJGlucHV0LT5iaW5kKCR0aGlzLT5nZXREZWZpbml0aW9uKCkpOwp9IGNhdGNoIChFeGNlcHRpb25JbnRlcmZhY2UgJGUpIHsKCn0KCnJldHVybiAkaW5wdXQtPmdldEZpcnN0QXJndW1lbnQoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldExvbmdWZXJzaW9uKCk6IHN0cmluZwp7CiRicmFuY2hBbGlhc1N0cmluZyA9ICcnOwppZiAoQ29tcG9zZXI6OkJSQU5DSF9BTElBU19WRVJTSU9OICYmIENvbXBvc2VyOjpCUkFOQ0hfQUxJQVNfVkVSU0lPTiAhPT0gJ0BwYWNrYWdlX2JyYW5jaF9hbGlhc192ZXJzaW9uJy4nQCcpIHsKJGJyYW5jaEFsaWFzU3RyaW5nID0gc3ByaW50ZignICglcyknLCBDb21wb3Nlcjo6QlJBTkNIX0FMSUFTX1ZFUlNJT04pOwp9CgpyZXR1cm4gc3ByaW50ZigKJzxpbmZvPiVzPC9pbmZvPiB2ZXJzaW9uIDxjb21tZW50PiVzJXM8L2NvbW1lbnQ+ICVzJywKJHRoaXMtPmdldE5hbWUoKSwKJHRoaXMtPmdldFZlcnNpb24oKSwKJGJyYW5jaEFsaWFzU3RyaW5nLApDb21wb3Nlcjo6UkVMRUFTRV9EQVRFCik7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBnZXREZWZhdWx0SW5wdXREZWZpbml0aW9uKCk6IElucHV0RGVmaW5pdGlvbgp7CiRkZWZpbml0aW9uID0gcGFyZW50OjpnZXREZWZhdWx0SW5wdXREZWZpbml0aW9uKCk7CiRkZWZpbml0aW9uLT5hZGRPcHRpb24obmV3IElucHV0T3B0aW9uKCctLXByb2ZpbGUnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc3BsYXkgdGltaW5nIGFuZCBtZW1vcnkgdXNhZ2UgaW5mb3JtYXRpb24nKSk7CiRkZWZpbml0aW9uLT5hZGRPcHRpb24obmV3IElucHV0T3B0aW9uKCctLW5vLXBsdWdpbnMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1doZXRoZXIgdG8gZGlzYWJsZSBwbHVnaW5zLicpKTsKJGRlZmluaXRpb24tPmFkZE9wdGlvbihuZXcgSW5wdXRPcHRpb24oJy0tbm8tc2NyaXB0cycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2tpcHMgdGhlIGV4ZWN1dGlvbiBvZiBhbGwgc2NyaXB0cyBkZWZpbmVkIGluIGNvbXBvc2VyLmpzb24gZmlsZS4nKSk7CiRkZWZpbml0aW9uLT5hZGRPcHRpb24obmV3IElucHV0T3B0aW9uKCctLXdvcmtpbmctZGlyJywgJy1kJywgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnSWYgc3BlY2lmaWVkLCB1c2UgdGhlIGdpdmVuIGRpcmVjdG9yeSBhcyB3b3JraW5nIGRpcmVjdG9yeS4nKSk7CiRkZWZpbml0aW9uLT5hZGRPcHRpb24obmV3IElucHV0T3B0aW9uKCctLW5vLWNhY2hlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdQcmV2ZW50IHVzZSBvZiB0aGUgY2FjaGUnKSk7CgpyZXR1cm4gJGRlZmluaXRpb247Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0UGx1Z2luQ29tbWFuZHMoKTogYXJyYXkKewokY29tbWFuZHMgPSBbXTsKCiRjb21wb3NlciA9ICR0aGlzLT5nZXRDb21wb3NlcihmYWxzZSwgZmFsc2UpOwppZiAobnVsbCA9PT0gJGNvbXBvc2VyKSB7CiRjb21wb3NlciA9IEZhY3Rvcnk6OmNyZWF0ZUdsb2JhbCgkdGhpcy0+aW8sICR0aGlzLT5kaXNhYmxlUGx1Z2luc0J5RGVmYXVsdCwgJHRoaXMtPmRpc2FibGVTY3JpcHRzQnlEZWZhdWx0KTsKfQoKaWYgKG51bGwgIT09ICRjb21wb3NlcikgewokcG0gPSAkY29tcG9zZXItPmdldFBsdWdpbk1hbmFnZXIoKTsKZm9yZWFjaCAoJHBtLT5nZXRQbHVnaW5DYXBhYmlsaXRpZXMoJ0NvbXBvc2VyXFBsdWdpblxDYXBhYmlsaXR5XENvbW1hbmRQcm92aWRlcicsIFsnY29tcG9zZXInID0+ICRjb21wb3NlciwgJ2lvJyA9PiAkdGhpcy0+aW9dKSBhcyAkY2FwYWJpbGl0eSkgewokbmV3Q29tbWFuZHMgPSAkY2FwYWJpbGl0eS0+Z2V0Q29tbWFuZHMoKTsKaWYgKCFpc19hcnJheSgkbmV3Q29tbWFuZHMpKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdQbHVnaW4gY2FwYWJpbGl0eSAnLmdldF9jbGFzcygkY2FwYWJpbGl0eSkuJyBmYWlsZWQgdG8gcmV0dXJuIGFuIGFycmF5IGZyb20gZ2V0Q29tbWFuZHMnKTsKfQpmb3JlYWNoICgkbmV3Q29tbWFuZHMgYXMgJGNvbW1hbmQpIHsKaWYgKCEkY29tbWFuZCBpbnN0YW5jZW9mIENvbW1hbmRcQmFzZUNvbW1hbmQpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ1BsdWdpbiBjYXBhYmlsaXR5ICcuZ2V0X2NsYXNzKCRjYXBhYmlsaXR5KS4nIHJldHVybmVkIGFuIGludmFsaWQgdmFsdWUsIHdlIGV4cGVjdGVkIGFuIGFycmF5IG9mIENvbXBvc2VyXENvbW1hbmRcQmFzZUNvbW1hbmQgb2JqZWN0cycpOwp9Cn0KJGNvbW1hbmRzID0gYXJyYXlfbWVyZ2UoJGNvbW1hbmRzLCAkbmV3Q29tbWFuZHMpOwp9Cn0KCnJldHVybiAkY29tbWFuZHM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEluaXRpYWxXb3JraW5nRGlyZWN0b3J5KCkKewpyZXR1cm4gJHRoaXMtPmluaXRpYWxXb3JraW5nRGlyZWN0b3J5Owp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzYWJsZVBsdWdpbnNCeURlZmF1bHQoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+ZGlzYWJsZVBsdWdpbnNCeURlZmF1bHQ7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXREaXNhYmxlU2NyaXB0c0J5RGVmYXVsdCgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5kaXNhYmxlU2NyaXB0c0J5RGVmYXVsdDsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRVc2VQYXJlbnREaXJDb25maWdWYWx1ZSgpCnsKJGNvbmZpZyA9IEZhY3Rvcnk6OmNyZWF0ZUNvbmZpZygkdGhpcy0+aW8pOwoKcmV0dXJuICRjb25maWctPmdldCgndXNlLXBhcmVudC1kaXInKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBpc1J1bm5pbmdBc1Jvb3QoKTogYm9vbAp7CnJldHVybiBmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldHVpZCcpICYmIHBvc2l4X2dldHVpZCgpID09PSAwOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbnNvbGU7Cgp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwoKZmluYWwgY2xhc3MgR2l0aHViQWN0aW9uRXJyb3IKewoKCgpwcm90ZWN0ZWQgJGlvOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbykKewokdGhpcy0+aW8gPSAkaW87Cn0KCnB1YmxpYyBmdW5jdGlvbiBlbWl0KHN0cmluZyAkbWVzc2FnZSwgP3N0cmluZyAkZmlsZSA9IG51bGwsID9pbnQgJGxpbmUgPSBudWxsKTogdm9pZAp7CmlmIChQbGF0Zm9ybTo6Z2V0RW52KCdHSVRIVUJfQUNUSU9OUycpICYmICFQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9URVNUU19BUkVfUlVOTklORycpKSB7CiRtZXNzYWdlID0gJHRoaXMtPmVzY2FwZURhdGEoJG1lc3NhZ2UpOwoKaWYgKCRmaWxlICYmICRsaW5lKSB7CiRmaWxlID0gJHRoaXMtPmVzY2FwZVByb3BlcnR5KCRmaWxlKTsKJHRoaXMtPmlvLT53cml0ZSgiOjplcnJvciBmaWxlPSIuICRmaWxlIC4iLGxpbmU9Ii4gJGxpbmUgLiI6OiIuICRtZXNzYWdlKTsKfSBlbHNlaWYgKCRmaWxlKSB7CiRmaWxlID0gJHRoaXMtPmVzY2FwZVByb3BlcnR5KCRmaWxlKTsKJHRoaXMtPmlvLT53cml0ZSgiOjplcnJvciBmaWxlPSIuICRmaWxlIC4iOjoiLiAkbWVzc2FnZSk7Cn0gZWxzZSB7CiR0aGlzLT5pby0+d3JpdGUoIjo6ZXJyb3IgOjoiLiAkbWVzc2FnZSk7Cn0KfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIGVzY2FwZURhdGEoc3RyaW5nICRkYXRhKTogc3RyaW5nCnsKCiRkYXRhID0gc3RyX3JlcGxhY2UoIiUiLCAnJTI1JywgJGRhdGEpOwokZGF0YSA9IHN0cl9yZXBsYWNlKCJcciIsICclMEQnLCAkZGF0YSk7CiRkYXRhID0gc3RyX3JlcGxhY2UoIlxuIiwgJyUwQScsICRkYXRhKTsKCnJldHVybiAkZGF0YTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBlc2NhcGVQcm9wZXJ0eShzdHJpbmcgJHByb3BlcnR5KTogc3RyaW5nCnsKCiRwcm9wZXJ0eSA9IHN0cl9yZXBsYWNlKCIlIiwgJyUyNScsICRwcm9wZXJ0eSk7CiRwcm9wZXJ0eSA9IHN0cl9yZXBsYWNlKCJcciIsICclMEQnLCAkcHJvcGVydHkpOwokcHJvcGVydHkgPSBzdHJfcmVwbGFjZSgiXG4iLCAnJTBBJywgJHByb3BlcnR5KTsKJHByb3BlcnR5ID0gc3RyX3JlcGxhY2UoIjoiLCAnJTNBJywgJHByb3BlcnR5KTsKJHByb3BlcnR5ID0gc3RyX3JlcGxhY2UoIiwiLCAnJTJDJywgJHByb3BlcnR5KTsKCnJldHVybiAkcHJvcGVydHk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29uc29sZTsKCnVzZSBDbG9zdXJlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyU3R5bGU7CgoKCgpjbGFzcyBIdG1sT3V0cHV0Rm9ybWF0dGVyIGV4dGVuZHMgT3V0cHV0Rm9ybWF0dGVyCnsKCnByaXZhdGUgc3RhdGljICRhdmFpbGFibGVGb3JlZ3JvdW5kQ29sb3JzID0gWwozMCA9PiAnYmxhY2snLAozMSA9PiAncmVkJywKMzIgPT4gJ2dyZWVuJywKMzMgPT4gJ3llbGxvdycsCjM0ID0+ICdibHVlJywKMzUgPT4gJ21hZ2VudGEnLAozNiA9PiAnY3lhbicsCjM3ID0+ICd3aGl0ZScsCl07Cgpwcml2YXRlIHN0YXRpYyAkYXZhaWxhYmxlQmFja2dyb3VuZENvbG9ycyA9IFsKNDAgPT4gJ2JsYWNrJywKNDEgPT4gJ3JlZCcsCjQyID0+ICdncmVlbicsCjQzID0+ICd5ZWxsb3cnLAo0NCA9PiAnYmx1ZScsCjQ1ID0+ICdtYWdlbnRhJywKNDYgPT4gJ2N5YW4nLAo0NyA9PiAnd2hpdGUnLApdOwoKcHJpdmF0ZSBzdGF0aWMgJGF2YWlsYWJsZU9wdGlvbnMgPSBbCjEgPT4gJ2JvbGQnLAo0ID0+ICd1bmRlcnNjb3JlJywKCgoKXTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkc3R5bGVzID0gW10pCnsKcGFyZW50OjpfX2NvbnN0cnVjdCh0cnVlLCAkc3R5bGVzKTsKfQoKcHVibGljIGZ1bmN0aW9uIGZvcm1hdCg/c3RyaW5nICRtZXNzYWdlKTogP3N0cmluZwp7CiRmb3JtYXR0ZWQgPSBwYXJlbnQ6OmZvcm1hdCgkbWVzc2FnZSk7CgppZiAoJGZvcm1hdHRlZCA9PT0gbnVsbCkgewpyZXR1cm4gbnVsbDsKfQoKJGNsZWFyRXNjYXBlQ29kZXMgPSAnKD86Mzl8NDl8MHwyMnwyNHwyNXwyN3wyOCknOwoKcmV0dXJuIFByZWc6OnJlcGxhY2VDYWxsYmFjaygie1wwMzNcWyhbMC05O10rKW0oLio/KVwwMzNcWyg/OiIuJGNsZWFyRXNjYXBlQ29kZXMuIjspKj8iLiRjbGVhckVzY2FwZUNvZGVzLiJtfXMiLCBDbG9zdXJlOjpmcm9tQ2FsbGFibGUoWyR0aGlzLCAnZm9ybWF0SHRtbCddKSwgJGZvcm1hdHRlZCk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZm9ybWF0SHRtbChhcnJheSAkbWF0Y2hlcyk6IHN0cmluZwp7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoZXNbMV0pKTsKJG91dCA9ICc8c3BhbiBzdHlsZT0iJzsKZm9yZWFjaCAoZXhwbG9kZSgnOycsICRtYXRjaGVzWzFdKSBhcyAkY29kZSkgewppZiAoaXNzZXQoc2VsZjo6JGF2YWlsYWJsZUZvcmVncm91bmRDb2xvcnNbKGludCkgJGNvZGVdKSkgewokb3V0IC49ICdjb2xvcjonLnNlbGY6OiRhdmFpbGFibGVGb3JlZ3JvdW5kQ29sb3JzWyhpbnQpICRjb2RlXS4nOyc7Cn0gZWxzZWlmIChpc3NldChzZWxmOjokYXZhaWxhYmxlQmFja2dyb3VuZENvbG9yc1soaW50KSAkY29kZV0pKSB7CiRvdXQgLj0gJ2JhY2tncm91bmQtY29sb3I6Jy5zZWxmOjokYXZhaWxhYmxlQmFja2dyb3VuZENvbG9yc1soaW50KSAkY29kZV0uJzsnOwp9IGVsc2VpZiAoaXNzZXQoc2VsZjo6JGF2YWlsYWJsZU9wdGlvbnNbKGludCkgJGNvZGVdKSkgewpzd2l0Y2ggKHNlbGY6OiRhdmFpbGFibGVPcHRpb25zWyhpbnQpICRjb2RlXSkgewpjYXNlICdib2xkJzoKJG91dCAuPSAnZm9udC13ZWlnaHQ6Ym9sZDsnOwpicmVhazsKCmNhc2UgJ3VuZGVyc2NvcmUnOgokb3V0IC49ICd0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOyc7CmJyZWFrOwp9Cn0KfQoKcmV0dXJuICRvdXQuJyI+Jy4kbWF0Y2hlc1syXS4nPC9zcGFuPic7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvbklucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25TdWdnZXN0aW9uczsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxTdWdnZXN0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cTG9naWNFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQgYXMgQmFzZUlucHV0QXJndW1lbnQ7CgoKCgoKCgoKCgpjbGFzcyBJbnB1dEFyZ3VtZW50IGV4dGVuZHMgQmFzZUlucHV0QXJndW1lbnQKewoKCgpwcml2YXRlICRzdWdnZXN0ZWRWYWx1ZXM7CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lLCA/aW50ICRtb2RlID0gbnVsbCwgc3RyaW5nICRkZXNjcmlwdGlvbiA9ICcnLCAkZGVmYXVsdCA9IG51bGwsICRzdWdnZXN0ZWRWYWx1ZXMgPSBbXSkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRuYW1lLCAkbW9kZSwgJGRlc2NyaXB0aW9uLCAkZGVmYXVsdCk7CgokdGhpcy0+c3VnZ2VzdGVkVmFsdWVzID0gJHN1Z2dlc3RlZFZhbHVlczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29tcGxldGUoQ29tcGxldGlvbklucHV0ICRpbnB1dCwgQ29tcGxldGlvblN1Z2dlc3Rpb25zICRzdWdnZXN0aW9ucyk6IHZvaWQKewokdmFsdWVzID0gJHRoaXMtPnN1Z2dlc3RlZFZhbHVlczsKaWYgKCR2YWx1ZXMgaW5zdGFuY2VvZiBcQ2xvc3VyZSAmJiAhXGlzX2FycmF5KCR2YWx1ZXMgPSAkdmFsdWVzKCRpbnB1dCwgJHN1Z2dlc3Rpb25zKSkpIHsgCnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKCdDbG9zdXJlIGZvciBvcHRpb24gIiVzIiBtdXN0IHJldHVybiBhbiBhcnJheS4gR290ICIlcyIuJywgJHRoaXMtPmdldE5hbWUoKSwgZ2V0X2RlYnVnX3R5cGUoJHZhbHVlcykpKTsKfQppZiAoW10gIT09ICR2YWx1ZXMpIHsKJHN1Z2dlc3Rpb25zLT5zdWdnZXN0VmFsdWVzKCR2YWx1ZXMpOwp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvbklucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25TdWdnZXN0aW9uczsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxTdWdnZXN0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cTG9naWNFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0T3B0aW9uIGFzIEJhc2VJbnB1dE9wdGlvbjsKCgoKCgoKCgoKCmNsYXNzIElucHV0T3B0aW9uIGV4dGVuZHMgQmFzZUlucHV0T3B0aW9uCnsKCgoKcHJpdmF0ZSAkc3VnZ2VzdGVkVmFsdWVzOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lLCAkc2hvcnRjdXQgPSBudWxsLCA/aW50ICRtb2RlID0gbnVsbCwgc3RyaW5nICRkZXNjcmlwdGlvbiA9ICcnLCAkZGVmYXVsdCA9IG51bGwsICRzdWdnZXN0ZWRWYWx1ZXMgPSBbXSkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRuYW1lLCAkc2hvcnRjdXQsICRtb2RlLCAkZGVzY3JpcHRpb24sICRkZWZhdWx0KTsKCiR0aGlzLT5zdWdnZXN0ZWRWYWx1ZXMgPSAkc3VnZ2VzdGVkVmFsdWVzOwoKaWYgKFtdICE9PSAkc3VnZ2VzdGVkVmFsdWVzICYmICEkdGhpcy0+YWNjZXB0VmFsdWUoKSkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ0Nhbm5vdCBzZXQgc3VnZ2VzdGVkIHZhbHVlcyBpZiB0aGUgb3B0aW9uIGRvZXMgbm90IGFjY2VwdCBhIHZhbHVlLicpOwp9Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbXBsZXRlKENvbXBsZXRpb25JbnB1dCAkaW5wdXQsIENvbXBsZXRpb25TdWdnZXN0aW9ucyAkc3VnZ2VzdGlvbnMpOiB2b2lkCnsKJHZhbHVlcyA9ICR0aGlzLT5zdWdnZXN0ZWRWYWx1ZXM7CmlmICgkdmFsdWVzIGluc3RhbmNlb2YgXENsb3N1cmUgJiYgIVxpc19hcnJheSgkdmFsdWVzID0gJHZhbHVlcygkaW5wdXQsICRzdWdnZXN0aW9ucykpKSB7IAp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oc3ByaW50ZignQ2xvc3VyZSBmb3IgYXJndW1lbnQgIiVzIiBtdXN0IHJldHVybiBhbiBhcnJheS4gR290ICIlcyIuJywgJHRoaXMtPmdldE5hbWUoKSwgZ2V0X2RlYnVnX3R5cGUoJHZhbHVlcykpKTsKfQppZiAoW10gIT09ICR2YWx1ZXMpIHsKJHN1Z2dlc3Rpb25zLT5zdWdnZXN0VmFsdWVzKCR2YWx1ZXMpOwp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKCgoKCgoKY2xhc3MgRGVjaXNpb25zIGltcGxlbWVudHMgXEl0ZXJhdG9yLCBcQ291bnRhYmxlCnsKcHVibGljIGNvbnN0IERFQ0lTSU9OX0xJVEVSQUwgPSAwOwpwdWJsaWMgY29uc3QgREVDSVNJT05fUkVBU09OID0gMTsKCgpwcm90ZWN0ZWQgJHBvb2w7Cgpwcm90ZWN0ZWQgJGRlY2lzaW9uTWFwOwoKCgpwcm90ZWN0ZWQgJGRlY2lzaW9uUXVldWUgPSBbXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQb29sICRwb29sKQp7CiR0aGlzLT5wb29sID0gJHBvb2w7CiR0aGlzLT5kZWNpc2lvbk1hcCA9IFtdOwp9CgpwdWJsaWMgZnVuY3Rpb24gZGVjaWRlKGludCAkbGl0ZXJhbCwgaW50ICRsZXZlbCwgUnVsZSAkd2h5KTogdm9pZAp7CiR0aGlzLT5hZGREZWNpc2lvbigkbGl0ZXJhbCwgJGxldmVsKTsKJHRoaXMtPmRlY2lzaW9uUXVldWVbXSA9IFsKc2VsZjo6REVDSVNJT05fTElURVJBTCA9PiAkbGl0ZXJhbCwKc2VsZjo6REVDSVNJT05fUkVBU09OID0+ICR3aHksCl07Cn0KCnB1YmxpYyBmdW5jdGlvbiBzYXRpc2Z5KGludCAkbGl0ZXJhbCk6IGJvb2wKewokcGFja2FnZUlkID0gYWJzKCRsaXRlcmFsKTsKCnJldHVybiAoCiRsaXRlcmFsID4gMCAmJiBpc3NldCgkdGhpcy0+ZGVjaXNpb25NYXBbJHBhY2thZ2VJZF0pICYmICR0aGlzLT5kZWNpc2lvbk1hcFskcGFja2FnZUlkXSA+IDAgfHwKJGxpdGVyYWwgPCAwICYmIGlzc2V0KCR0aGlzLT5kZWNpc2lvbk1hcFskcGFja2FnZUlkXSkgJiYgJHRoaXMtPmRlY2lzaW9uTWFwWyRwYWNrYWdlSWRdIDwgMAopOwp9CgpwdWJsaWMgZnVuY3Rpb24gY29uZmxpY3QoaW50ICRsaXRlcmFsKTogYm9vbAp7CiRwYWNrYWdlSWQgPSBhYnMoJGxpdGVyYWwpOwoKcmV0dXJuICgKKGlzc2V0KCR0aGlzLT5kZWNpc2lvbk1hcFskcGFja2FnZUlkXSkgJiYgJHRoaXMtPmRlY2lzaW9uTWFwWyRwYWNrYWdlSWRdID4gMCAmJiAkbGl0ZXJhbCA8IDApIHx8Cihpc3NldCgkdGhpcy0+ZGVjaXNpb25NYXBbJHBhY2thZ2VJZF0pICYmICR0aGlzLT5kZWNpc2lvbk1hcFskcGFja2FnZUlkXSA8IDAgJiYgJGxpdGVyYWwgPiAwKQopOwp9CgpwdWJsaWMgZnVuY3Rpb24gZGVjaWRlZChpbnQgJGxpdGVyYWxPclBhY2thZ2VJZCk6IGJvb2wKewpyZXR1cm4gKCR0aGlzLT5kZWNpc2lvbk1hcFthYnMoJGxpdGVyYWxPclBhY2thZ2VJZCldID8/IDApICE9PSAwOwp9CgpwdWJsaWMgZnVuY3Rpb24gdW5kZWNpZGVkKGludCAkbGl0ZXJhbE9yUGFja2FnZUlkKTogYm9vbAp7CnJldHVybiAoJHRoaXMtPmRlY2lzaW9uTWFwW2FicygkbGl0ZXJhbE9yUGFja2FnZUlkKV0gPz8gMCkgPT09IDA7Cn0KCnB1YmxpYyBmdW5jdGlvbiBkZWNpZGVkSW5zdGFsbChpbnQgJGxpdGVyYWxPclBhY2thZ2VJZCk6IGJvb2wKewokcGFja2FnZUlkID0gYWJzKCRsaXRlcmFsT3JQYWNrYWdlSWQpOwoKcmV0dXJuIGlzc2V0KCR0aGlzLT5kZWNpc2lvbk1hcFskcGFja2FnZUlkXSkgJiYgJHRoaXMtPmRlY2lzaW9uTWFwWyRwYWNrYWdlSWRdID4gMDsKfQoKcHVibGljIGZ1bmN0aW9uIGRlY2lzaW9uTGV2ZWwoaW50ICRsaXRlcmFsT3JQYWNrYWdlSWQpOiBpbnQKewokcGFja2FnZUlkID0gYWJzKCRsaXRlcmFsT3JQYWNrYWdlSWQpOwppZiAoaXNzZXQoJHRoaXMtPmRlY2lzaW9uTWFwWyRwYWNrYWdlSWRdKSkgewpyZXR1cm4gYWJzKCR0aGlzLT5kZWNpc2lvbk1hcFskcGFja2FnZUlkXSk7Cn0KCnJldHVybiAwOwp9CgpwdWJsaWMgZnVuY3Rpb24gZGVjaXNpb25SdWxlKGludCAkbGl0ZXJhbE9yUGFja2FnZUlkKTogUnVsZQp7CiRwYWNrYWdlSWQgPSBhYnMoJGxpdGVyYWxPclBhY2thZ2VJZCk7Cgpmb3JlYWNoICgkdGhpcy0+ZGVjaXNpb25RdWV1ZSBhcyAkZGVjaXNpb24pIHsKaWYgKCRwYWNrYWdlSWQgPT09IGFicygkZGVjaXNpb25bc2VsZjo6REVDSVNJT05fTElURVJBTF0pKSB7CnJldHVybiAkZGVjaXNpb25bc2VsZjo6REVDSVNJT05fUkVBU09OXTsKfQp9Cgp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdEaWQgbm90IGZpbmQgYSBkZWNpc2lvbiBydWxlIHVzaW5nICcuJGxpdGVyYWxPclBhY2thZ2VJZCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhdE9mZnNldChpbnQgJHF1ZXVlT2Zmc2V0KTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmRlY2lzaW9uUXVldWVbJHF1ZXVlT2Zmc2V0XTsKfQoKcHVibGljIGZ1bmN0aW9uIHZhbGlkT2Zmc2V0KGludCAkcXVldWVPZmZzZXQpOiBib29sCnsKcmV0dXJuICRxdWV1ZU9mZnNldCA+PSAwICYmICRxdWV1ZU9mZnNldCA8IFxjb3VudCgkdGhpcy0+ZGVjaXNpb25RdWV1ZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBsYXN0UmVhc29uKCk6IFJ1bGUKewpyZXR1cm4gJHRoaXMtPmRlY2lzaW9uUXVldWVbXGNvdW50KCR0aGlzLT5kZWNpc2lvblF1ZXVlKSAtIDFdW3NlbGY6OkRFQ0lTSU9OX1JFQVNPTl07Cn0KCnB1YmxpYyBmdW5jdGlvbiBsYXN0TGl0ZXJhbCgpOiBpbnQKewpyZXR1cm4gJHRoaXMtPmRlY2lzaW9uUXVldWVbXGNvdW50KCR0aGlzLT5kZWNpc2lvblF1ZXVlKSAtIDFdW3NlbGY6OkRFQ0lTSU9OX0xJVEVSQUxdOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVzZXQoKTogdm9pZAp7CndoaWxlICgkZGVjaXNpb24gPSBhcnJheV9wb3AoJHRoaXMtPmRlY2lzaW9uUXVldWUpKSB7CiR0aGlzLT5kZWNpc2lvbk1hcFthYnMoJGRlY2lzaW9uW3NlbGY6OkRFQ0lTSU9OX0xJVEVSQUxdKV0gPSAwOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZXNldFRvT2Zmc2V0KGludCAkb2Zmc2V0KTogdm9pZAp7CndoaWxlIChcY291bnQoJHRoaXMtPmRlY2lzaW9uUXVldWUpID4gJG9mZnNldCArIDEpIHsKJGRlY2lzaW9uID0gYXJyYXlfcG9wKCR0aGlzLT5kZWNpc2lvblF1ZXVlKTsKJHRoaXMtPmRlY2lzaW9uTWFwW2FicygkZGVjaXNpb25bc2VsZjo6REVDSVNJT05fTElURVJBTF0pXSA9IDA7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIHJldmVydExhc3QoKTogdm9pZAp7CiR0aGlzLT5kZWNpc2lvbk1hcFthYnMoJHRoaXMtPmxhc3RMaXRlcmFsKCkpXSA9IDA7CmFycmF5X3BvcCgkdGhpcy0+ZGVjaXNpb25RdWV1ZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjb3VudCgpOiBpbnQKewpyZXR1cm4gXGNvdW50KCR0aGlzLT5kZWNpc2lvblF1ZXVlKTsKfQoKcHVibGljIGZ1bmN0aW9uIHJld2luZCgpOiB2b2lkCnsKZW5kKCR0aGlzLT5kZWNpc2lvblF1ZXVlKTsKfQoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBjdXJyZW50KCkKewpyZXR1cm4gY3VycmVudCgkdGhpcy0+ZGVjaXNpb25RdWV1ZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBrZXkoKTogP2ludAp7CnJldHVybiBrZXkoJHRoaXMtPmRlY2lzaW9uUXVldWUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gbmV4dCgpOiB2b2lkCnsKcHJldigkdGhpcy0+ZGVjaXNpb25RdWV1ZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiB2YWxpZCgpOiBib29sCnsKcmV0dXJuIGZhbHNlICE9PSBjdXJyZW50KCR0aGlzLT5kZWNpc2lvblF1ZXVlKTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzRW1wdHkoKTogYm9vbAp7CnJldHVybiBcY291bnQoJHRoaXMtPmRlY2lzaW9uUXVldWUpID09PSAwOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkRGVjaXNpb24oaW50ICRsaXRlcmFsLCBpbnQgJGxldmVsKTogdm9pZAp7CiRwYWNrYWdlSWQgPSBhYnMoJGxpdGVyYWwpOwoKJHByZXZpb3VzRGVjaXNpb24gPSAkdGhpcy0+ZGVjaXNpb25NYXBbJHBhY2thZ2VJZF0gPz8gMDsKaWYgKCRwcmV2aW91c0RlY2lzaW9uICE9PSAwKSB7CiRsaXRlcmFsU3RyaW5nID0gJHRoaXMtPnBvb2wtPmxpdGVyYWxUb1ByZXR0eVN0cmluZygkbGl0ZXJhbCwgW10pOwokcGFja2FnZSA9ICR0aGlzLT5wb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsKTsKdGhyb3cgbmV3IFNvbHZlckJ1Z0V4Y2VwdGlvbigKIlRyeWluZyB0byBkZWNpZGUgJGxpdGVyYWxTdHJpbmcgb24gbGV2ZWwgJGxldmVsLCBldmVuIHRob3VnaCAkcGFja2FnZSB3YXMgcHJldmlvdXNseSBkZWNpZGVkIGFzICIuJHByZXZpb3VzRGVjaXNpb24uIi4iCik7Cn0KCmlmICgkbGl0ZXJhbCA+IDApIHsKJHRoaXMtPmRlY2lzaW9uTWFwWyRwYWNrYWdlSWRdID0gJGxldmVsOwp9IGVsc2UgewokdGhpcy0+ZGVjaXNpb25NYXBbJHBhY2thZ2VJZF0gPSAtJGxldmVsOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiB0b1N0cmluZyg/UG9vbCAkcG9vbCA9IG51bGwpOiBzdHJpbmcKewokZGVjaXNpb25NYXAgPSAkdGhpcy0+ZGVjaXNpb25NYXA7Cmtzb3J0KCRkZWNpc2lvbk1hcCk7CiRzdHIgPSAnWyc7CmZvcmVhY2ggKCRkZWNpc2lvbk1hcCBhcyAkcGFja2FnZUlkID0+ICRsZXZlbCkgewokc3RyIC49ICgkcG9vbCAhPT0gbnVsbCA/ICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRwYWNrYWdlSWQpIDogJHBhY2thZ2VJZCkuJzonLiRsZXZlbC4nLCc7Cn0KJHN0ciAuPSAnXSc7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT50b1N0cmluZygpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29tcGlsaW5nTWF0Y2hlcjsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwoKCgoKCmNsYXNzIERlZmF1bHRQb2xpY3kgaW1wbGVtZW50cyBQb2xpY3lJbnRlcmZhY2UKewoKcHJpdmF0ZSAkcHJlZmVyU3RhYmxlOwoKcHJpdmF0ZSAkcHJlZmVyTG93ZXN0OwoKcHJpdmF0ZSAkcHJlZmVyRGV2T3ZlclByZXJlbGVhc2U7Cgpwcml2YXRlICRwcmVmZXJyZWRWZXJzaW9uczsKCnByaXZhdGUgJHByZWZlcnJlZFBhY2thZ2VSZXN1bHRDYWNoZVBlclBvb2w7Cgpwcml2YXRlICRzb3J0aW5nQ2FjaGVQZXJQb29sOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGJvb2wgJHByZWZlclN0YWJsZSA9IGZhbHNlLCBib29sICRwcmVmZXJMb3dlc3QgPSBmYWxzZSwgP2FycmF5ICRwcmVmZXJyZWRWZXJzaW9ucyA9IG51bGwpCnsKJHRoaXMtPnByZWZlclN0YWJsZSA9ICRwcmVmZXJTdGFibGU7CiR0aGlzLT5wcmVmZXJMb3dlc3QgPSAkcHJlZmVyTG93ZXN0OwokdGhpcy0+cHJlZmVycmVkVmVyc2lvbnMgPSAkcHJlZmVycmVkVmVyc2lvbnM7CiR0aGlzLT5wcmVmZXJEZXZPdmVyUHJlcmVsZWFzZSA9IChib29sKSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9QUkVGRVJfREVWX09WRVJfUFJFUkVMRUFTRScpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB2ZXJzaW9uQ29tcGFyZShQYWNrYWdlSW50ZXJmYWNlICRhLCBQYWNrYWdlSW50ZXJmYWNlICRiLCBzdHJpbmcgJG9wZXJhdG9yKTogYm9vbAp7CmlmICgkdGhpcy0+cHJlZmVyU3RhYmxlICYmICgkc3RhYkEgPSAkYS0+Z2V0U3RhYmlsaXR5KCkpICE9PSAoJHN0YWJCID0gJGItPmdldFN0YWJpbGl0eSgpKSkgewppZiAoJHRoaXMtPnByZWZlckxvd2VzdCAmJiAkdGhpcy0+cHJlZmVyRGV2T3ZlclByZXJlbGVhc2UgJiYgJ3N0YWJsZScgIT09ICRzdGFiQSAmJiAnc3RhYmxlJyAhPT0gJHN0YWJCKSB7CgoKCiRzdGFiQSA9ICdkZXYnID09PSAkc3RhYkEgPyAnc3RhYmxlJyA6ICRzdGFiQTsKJHN0YWJCID0gJ2RldicgPT09ICRzdGFiQiA/ICdzdGFibGUnIDogJHN0YWJCOwp9CgpyZXR1cm4gQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTWyRzdGFiQV0gPCBCYXNlUGFja2FnZTo6U1RBQklMSVRJRVNbJHN0YWJCXTsKfQoKCmlmICgoJGEtPmlzRGV2KCkgJiYgc3RyX3N0YXJ0c193aXRoKCRhLT5nZXRWZXJzaW9uKCksICdkZXYtJykpIHx8ICgkYi0+aXNEZXYoKSAmJiBzdHJfc3RhcnRzX3dpdGgoJGItPmdldFZlcnNpb24oKSwgJ2Rldi0nKSkpIHsKJGNvbnN0cmFpbnQgPSBuZXcgQ29uc3RyYWludCgkb3BlcmF0b3IsICRiLT5nZXRWZXJzaW9uKCkpOwokdmVyc2lvbiA9IG5ldyBDb25zdHJhaW50KCc9PScsICRhLT5nZXRWZXJzaW9uKCkpOwoKcmV0dXJuICRjb25zdHJhaW50LT5tYXRjaFNwZWNpZmljKCR2ZXJzaW9uLCB0cnVlKTsKfQoKcmV0dXJuIENvbXBpbGluZ01hdGNoZXI6Om1hdGNoKG5ldyBDb25zdHJhaW50KCRvcGVyYXRvciwgJGItPmdldFZlcnNpb24oKSksIENvbnN0cmFpbnQ6Ok9QX0VRLCAkYS0+Z2V0VmVyc2lvbigpKTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZWxlY3RQcmVmZXJyZWRQYWNrYWdlcyhQb29sICRwb29sLCBhcnJheSAkbGl0ZXJhbHMsID9zdHJpbmcgJHJlcXVpcmVkUGFja2FnZSA9IG51bGwpOiBhcnJheQp7CnNvcnQoJGxpdGVyYWxzKTsKJHJlc3VsdENhY2hlS2V5ID0gaW1wbG9kZSgnLCcsICRsaXRlcmFscykuJHJlcXVpcmVkUGFja2FnZTsKJHBvb2xJZCA9IHNwbF9vYmplY3RfaWQoJHBvb2wpOwoKaWYgKGlzc2V0KCR0aGlzLT5wcmVmZXJyZWRQYWNrYWdlUmVzdWx0Q2FjaGVQZXJQb29sWyRwb29sSWRdWyRyZXN1bHRDYWNoZUtleV0pKSB7CnJldHVybiAkdGhpcy0+cHJlZmVycmVkUGFja2FnZVJlc3VsdENhY2hlUGVyUG9vbFskcG9vbElkXVskcmVzdWx0Q2FjaGVLZXldOwp9CgokcGFja2FnZXMgPSAkdGhpcy0+Z3JvdXBMaXRlcmFsc0J5TmFtZSgkcG9vbCwgJGxpdGVyYWxzKTsKCmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAmJG5hbWVMaXRlcmFscykgewp1c29ydCgkbmFtZUxpdGVyYWxzLCBmdW5jdGlvbiAoJGEsICRiKSB1c2UgKCRwb29sLCAkcmVxdWlyZWRQYWNrYWdlLCAkcG9vbElkKTogaW50IHsKJGNhY2hlS2V5ID0gJ2knLiRhLicuJy4kYi4kcmVxdWlyZWRQYWNrYWdlOyAKCmlmIChpc3NldCgkdGhpcy0+c29ydGluZ0NhY2hlUGVyUG9vbFskcG9vbElkXVskY2FjaGVLZXldKSkgewpyZXR1cm4gJHRoaXMtPnNvcnRpbmdDYWNoZVBlclBvb2xbJHBvb2xJZF1bJGNhY2hlS2V5XTsKfQoKcmV0dXJuICR0aGlzLT5zb3J0aW5nQ2FjaGVQZXJQb29sWyRwb29sSWRdWyRjYWNoZUtleV0gPSAkdGhpcy0+Y29tcGFyZUJ5UHJpb3JpdHkoJHBvb2wsICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRhKSwgJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGIpLCAkcmVxdWlyZWRQYWNrYWdlLCB0cnVlKTsKfSk7Cn0KCmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAmJHNvcnRlZExpdGVyYWxzKSB7CiRzb3J0ZWRMaXRlcmFscyA9ICR0aGlzLT5wcnVuZVRvQmVzdFZlcnNpb24oJHBvb2wsICRzb3J0ZWRMaXRlcmFscyk7CiRzb3J0ZWRMaXRlcmFscyA9ICR0aGlzLT5wcnVuZVJlbW90ZUFsaWFzZXMoJHBvb2wsICRzb3J0ZWRMaXRlcmFscyk7Cn0KCiRzZWxlY3RlZCA9IGFycmF5X21lcmdlKC4uLmFycmF5X3ZhbHVlcygkcGFja2FnZXMpKTsKCgp1c29ydCgkc2VsZWN0ZWQsIGZ1bmN0aW9uICgkYSwgJGIpIHVzZSAoJHBvb2wsICRyZXF1aXJlZFBhY2thZ2UsICRwb29sSWQpOiBpbnQgewokY2FjaGVLZXkgPSAkYS4nLicuJGIuJHJlcXVpcmVkUGFja2FnZTsgCgppZiAoaXNzZXQoJHRoaXMtPnNvcnRpbmdDYWNoZVBlclBvb2xbJHBvb2xJZF1bJGNhY2hlS2V5XSkpIHsKcmV0dXJuICR0aGlzLT5zb3J0aW5nQ2FjaGVQZXJQb29sWyRwb29sSWRdWyRjYWNoZUtleV07Cn0KCnJldHVybiAkdGhpcy0+c29ydGluZ0NhY2hlUGVyUG9vbFskcG9vbElkXVskY2FjaGVLZXldID0gJHRoaXMtPmNvbXBhcmVCeVByaW9yaXR5KCRwb29sLCAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkYSksICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRiKSwgJHJlcXVpcmVkUGFja2FnZSk7Cn0pOwoKcmV0dXJuICR0aGlzLT5wcmVmZXJyZWRQYWNrYWdlUmVzdWx0Q2FjaGVQZXJQb29sWyRwb29sSWRdWyRyZXN1bHRDYWNoZUtleV0gPSAkc2VsZWN0ZWQ7Cn0KCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ3JvdXBMaXRlcmFsc0J5TmFtZShQb29sICRwb29sLCBhcnJheSAkbGl0ZXJhbHMpOiBhcnJheQp7CiRwYWNrYWdlcyA9IFtdOwpmb3JlYWNoICgkbGl0ZXJhbHMgYXMgJGxpdGVyYWwpIHsKJHBhY2thZ2VOYW1lID0gJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGxpdGVyYWwpLT5nZXROYW1lKCk7CgppZiAoIWlzc2V0KCRwYWNrYWdlc1skcGFja2FnZU5hbWVdKSkgewokcGFja2FnZXNbJHBhY2thZ2VOYW1lXSA9IFtdOwp9CiRwYWNrYWdlc1skcGFja2FnZU5hbWVdW10gPSAkbGl0ZXJhbDsKfQoKcmV0dXJuICRwYWNrYWdlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbXBhcmVCeVByaW9yaXR5KFBvb2wgJHBvb2wsIEJhc2VQYWNrYWdlICRhLCBCYXNlUGFja2FnZSAkYiwgP3N0cmluZyAkcmVxdWlyZWRQYWNrYWdlID0gbnVsbCwgYm9vbCAkaWdub3JlUmVwbGFjZSA9IGZhbHNlKTogaW50CnsKCmlmICgkYS0+Z2V0TmFtZSgpID09PSAkYi0+Z2V0TmFtZSgpKSB7CiRhQWxpYXNlZCA9ICRhIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlOwokYkFsaWFzZWQgPSAkYiBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZTsKaWYgKCRhQWxpYXNlZCAmJiAhJGJBbGlhc2VkKSB7CnJldHVybiAtMTsgCn0KaWYgKCEkYUFsaWFzZWQgJiYgJGJBbGlhc2VkKSB7CnJldHVybiAxOyAKfQp9CgppZiAoISRpZ25vcmVSZXBsYWNlKSB7CgppZiAoJHRoaXMtPnJlcGxhY2VzKCRhLCAkYikpIHsKcmV0dXJuIDE7IAp9CmlmICgkdGhpcy0+cmVwbGFjZXMoJGIsICRhKSkgewpyZXR1cm4gLTE7IAp9CgoKCmlmICgkcmVxdWlyZWRQYWNrYWdlICE9PSBudWxsICYmIGZhbHNlICE9PSAoJHBvcyA9IHN0cnBvcygkcmVxdWlyZWRQYWNrYWdlLCAnLycpKSkgewokcmVxdWlyZWRWZW5kb3IgPSBzdWJzdHIoJHJlcXVpcmVkUGFja2FnZSwgMCwgJHBvcyk7CgokYUlzU2FtZVZlbmRvciA9IHN0cnBvcygkYS0+Z2V0TmFtZSgpLCAkcmVxdWlyZWRWZW5kb3IpID09PSAwOwokYklzU2FtZVZlbmRvciA9IHN0cnBvcygkYi0+Z2V0TmFtZSgpLCAkcmVxdWlyZWRWZW5kb3IpID09PSAwOwoKaWYgKCRiSXNTYW1lVmVuZG9yICE9PSAkYUlzU2FtZVZlbmRvcikgewpyZXR1cm4gJGFJc1NhbWVWZW5kb3IgPyAtMSA6IDE7Cn0KfQp9CgoKaWYgKCRhLT5pZCA9PT0gJGItPmlkKSB7CnJldHVybiAwOwp9CgpyZXR1cm4gKCRhLT5pZCA8ICRiLT5pZCkgPyAtMSA6IDE7Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiByZXBsYWNlcyhCYXNlUGFja2FnZSAkc291cmNlLCBCYXNlUGFja2FnZSAkdGFyZ2V0KTogYm9vbAp7CmZvcmVhY2ggKCRzb3VyY2UtPmdldFJlcGxhY2VzKCkgYXMgJGxpbmspIHsKaWYgKCRsaW5rLT5nZXRUYXJnZXQoKSA9PT0gJHRhcmdldC0+Z2V0TmFtZSgpCgoKKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwcnVuZVRvQmVzdFZlcnNpb24oUG9vbCAkcG9vbCwgYXJyYXkgJGxpdGVyYWxzKTogYXJyYXkKewppZiAoJHRoaXMtPnByZWZlcnJlZFZlcnNpb25zICE9PSBudWxsKSB7CiRuYW1lID0gJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGxpdGVyYWxzWzBdKS0+Z2V0TmFtZSgpOwppZiAoaXNzZXQoJHRoaXMtPnByZWZlcnJlZFZlcnNpb25zWyRuYW1lXSkpIHsKJHByZWZlcnJlZFZlcnNpb24gPSAkdGhpcy0+cHJlZmVycmVkVmVyc2lvbnNbJG5hbWVdOwokYmVzdExpdGVyYWxzID0gW107CmZvcmVhY2ggKCRsaXRlcmFscyBhcyAkbGl0ZXJhbCkgewppZiAoJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGxpdGVyYWwpLT5nZXRWZXJzaW9uKCkgPT09ICRwcmVmZXJyZWRWZXJzaW9uKSB7CiRiZXN0TGl0ZXJhbHNbXSA9ICRsaXRlcmFsOwp9Cn0KaWYgKFxjb3VudCgkYmVzdExpdGVyYWxzKSA+IDApIHsKcmV0dXJuICRiZXN0TGl0ZXJhbHM7Cn0KfQp9Cgokb3BlcmF0b3IgPSAkdGhpcy0+cHJlZmVyTG93ZXN0ID8gJzwnIDogJz4nOwokYmVzdExpdGVyYWxzID0gWyRsaXRlcmFsc1swXV07CiRiZXN0UGFja2FnZSA9ICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsc1swXSk7CmZvcmVhY2ggKCRsaXRlcmFscyBhcyAkaSA9PiAkbGl0ZXJhbCkgewppZiAoMCA9PT0gJGkpIHsKY29udGludWU7Cn0KCiRwYWNrYWdlID0gJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGxpdGVyYWwpOwoKaWYgKCR0aGlzLT52ZXJzaW9uQ29tcGFyZSgkcGFja2FnZSwgJGJlc3RQYWNrYWdlLCAkb3BlcmF0b3IpKSB7CiRiZXN0UGFja2FnZSA9ICRwYWNrYWdlOwokYmVzdExpdGVyYWxzID0gWyRsaXRlcmFsXTsKfSBlbHNlaWYgKCR0aGlzLT52ZXJzaW9uQ29tcGFyZSgkcGFja2FnZSwgJGJlc3RQYWNrYWdlLCAnPT0nKSkgewokYmVzdExpdGVyYWxzW10gPSAkbGl0ZXJhbDsKfQp9CgpyZXR1cm4gJGJlc3RMaXRlcmFsczsKfQoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJ1bmVSZW1vdGVBbGlhc2VzKFBvb2wgJHBvb2wsIGFycmF5ICRsaXRlcmFscyk6IGFycmF5CnsKJGhhc0xvY2FsQWxpYXMgPSBmYWxzZTsKCmZvcmVhY2ggKCRsaXRlcmFscyBhcyAkbGl0ZXJhbCkgewokcGFja2FnZSA9ICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsKTsKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSAmJiAkcGFja2FnZS0+aXNSb290UGFja2FnZUFsaWFzKCkpIHsKJGhhc0xvY2FsQWxpYXMgPSB0cnVlOwpicmVhazsKfQp9CgppZiAoISRoYXNMb2NhbEFsaWFzKSB7CnJldHVybiAkbGl0ZXJhbHM7Cn0KCiRzZWxlY3RlZCA9IFtdOwpmb3JlYWNoICgkbGl0ZXJhbHMgYXMgJGxpdGVyYWwpIHsKJHBhY2thZ2UgPSAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbCk7CgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UgJiYgJHBhY2thZ2UtPmlzUm9vdFBhY2thZ2VBbGlhcygpKSB7CiRzZWxlY3RlZFtdID0gJGxpdGVyYWw7Cn0KfQoKcmV0dXJuICRzZWxlY3RlZDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7CgoKCgpjbGFzcyBHZW5lcmljUnVsZSBleHRlbmRzIFJ1bGUKewoKcHJvdGVjdGVkICRsaXRlcmFsczsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkbGl0ZXJhbHMsICRyZWFzb24sICRyZWFzb25EYXRhKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJHJlYXNvbiwgJHJlYXNvbkRhdGEpOwoKCnNvcnQoJGxpdGVyYWxzKTsKCiR0aGlzLT5saXRlcmFscyA9ICRsaXRlcmFsczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExpdGVyYWxzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5saXRlcmFsczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEhhc2goKQp7CiRkYXRhID0gdW5wYWNrKCdpaGFzaCcsIChzdHJpbmcpIGhhc2goXFBIUF9WRVJTSU9OX0lEID4gODAxMDAgPyAneHhoMycgOiAnc2hhMScsIGltcGxvZGUoJywnLCAkdGhpcy0+bGl0ZXJhbHMpLCB0cnVlKSk7CmlmIChmYWxzZSA9PT0gJGRhdGEpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdW5wYWNraW5nOiAnLmltcGxvZGUoJywgJywgJHRoaXMtPmxpdGVyYWxzKSk7Cn0KCnJldHVybiAkZGF0YVsnaGFzaCddOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBlcXVhbHMoUnVsZSAkcnVsZSk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmxpdGVyYWxzID09PSAkcnVsZS0+Z2V0TGl0ZXJhbHMoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzQXNzZXJ0aW9uKCk6IGJvb2wKewpyZXR1cm4gMSA9PT0gXGNvdW50KCR0aGlzLT5saXRlcmFscyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwp7CiRyZXN1bHQgPSAkdGhpcy0+aXNEaXNhYmxlZCgpID8gJ2Rpc2FibGVkKCcgOiAnKCc7Cgpmb3JlYWNoICgkdGhpcy0+bGl0ZXJhbHMgYXMgJGkgPT4gJGxpdGVyYWwpIHsKaWYgKCRpICE9PSAwKSB7CiRyZXN1bHQgLj0gJ3wnOwp9CiRyZXN1bHQgLj0gJGxpdGVyYWw7Cn0KCiRyZXN1bHQgLj0gJyknOwoKcmV0dXJuICRyZXN1bHQ7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUludGVyZmFjZTsKCgoKCgpjbGFzcyBMb2NhbFJlcG9UcmFuc2FjdGlvbiBleHRlbmRzIFRyYW5zYWN0aW9uCnsKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFJlcG9zaXRvcnlJbnRlcmZhY2UgJGxvY2tlZFJlcG9zaXRvcnksIEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJGxvY2FsUmVwb3NpdG9yeSkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KAokbG9jYWxSZXBvc2l0b3J5LT5nZXRQYWNrYWdlcygpLAokbG9ja2VkUmVwb3NpdG9yeS0+Z2V0UGFja2FnZXMoKQopOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgoKY2xhc3MgTG9ja1RyYW5zYWN0aW9uIGV4dGVuZHMgVHJhbnNhY3Rpb24KewoKCgoKCgoKcHJvdGVjdGVkICRwcmVzZW50TWFwOwoKCgoKCgoKCnByb3RlY3RlZCAkdW5sb2NrYWJsZU1hcDsKCgoKCnByb3RlY3RlZCAkcmVzdWx0UGFja2FnZXM7CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFBvb2wgJHBvb2wsIGFycmF5ICRwcmVzZW50TWFwLCBhcnJheSAkdW5sb2NrYWJsZU1hcCwgRGVjaXNpb25zICRkZWNpc2lvbnMpCnsKJHRoaXMtPnByZXNlbnRNYXAgPSAkcHJlc2VudE1hcDsKJHRoaXMtPnVubG9ja2FibGVNYXAgPSAkdW5sb2NrYWJsZU1hcDsKCiR0aGlzLT5zZXRSZXN1bHRQYWNrYWdlcygkcG9vbCwgJGRlY2lzaW9ucyk7CnBhcmVudDo6X19jb25zdHJ1Y3QoJHRoaXMtPnByZXNlbnRNYXAsICR0aGlzLT5yZXN1bHRQYWNrYWdlc1snYWxsJ10pOwp9CgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSZXN1bHRQYWNrYWdlcyhQb29sICRwb29sLCBEZWNpc2lvbnMgJGRlY2lzaW9ucyk6IHZvaWQKewokdGhpcy0+cmVzdWx0UGFja2FnZXMgPSBbJ2FsbCcgPT4gW10sICdub24tZGV2JyA9PiBbXSwgJ2RldicgPT4gW11dOwpmb3JlYWNoICgkZGVjaXNpb25zIGFzICRpID0+ICRkZWNpc2lvbikgewokbGl0ZXJhbCA9ICRkZWNpc2lvbltEZWNpc2lvbnM6OkRFQ0lTSU9OX0xJVEVSQUxdOwoKaWYgKCRsaXRlcmFsID4gMCkgewokcGFja2FnZSA9ICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsKTsKCiR0aGlzLT5yZXN1bHRQYWNrYWdlc1snYWxsJ11bXSA9ICRwYWNrYWdlOwppZiAoIWlzc2V0KCR0aGlzLT51bmxvY2thYmxlTWFwWyRwYWNrYWdlLT5pZF0pKSB7CiR0aGlzLT5yZXN1bHRQYWNrYWdlc1snbm9uLWRldiddW10gPSAkcGFja2FnZTsKfQp9Cn0KfQoKcHVibGljIGZ1bmN0aW9uIHNldE5vbkRldlBhY2thZ2VzKExvY2tUcmFuc2FjdGlvbiAkZXh0cmFjdGlvblJlc3VsdCk6IHZvaWQKewokcGFja2FnZXMgPSAkZXh0cmFjdGlvblJlc3VsdC0+Z2V0TmV3TG9ja1BhY2thZ2VzKGZhbHNlKTsKCiR0aGlzLT5yZXN1bHRQYWNrYWdlc1snZGV2J10gPSAkdGhpcy0+cmVzdWx0UGFja2FnZXNbJ25vbi1kZXYnXTsKJHRoaXMtPnJlc3VsdFBhY2thZ2VzWydub24tZGV2J10gPSBbXTsKCmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewpmb3JlYWNoICgkdGhpcy0+cmVzdWx0UGFja2FnZXNbJ2RldiddIGFzICRpID0+ICRyZXN1bHRQYWNrYWdlKSB7CgppZiAoJHBhY2thZ2UtPmdldE5hbWUoKSA9PT0gJHJlc3VsdFBhY2thZ2UtPmdldE5hbWUoKSkgewokdGhpcy0+cmVzdWx0UGFja2FnZXNbJ25vbi1kZXYnXVtdID0gJHJlc3VsdFBhY2thZ2U7CnVuc2V0KCR0aGlzLT5yZXN1bHRQYWNrYWdlc1snZGV2J11bJGldKTsKfQp9Cn0KfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROZXdMb2NrUGFja2FnZXMoYm9vbCAkZGV2TW9kZSwgYm9vbCAkdXBkYXRlTWlycm9ycyA9IGZhbHNlKTogYXJyYXkKewokcGFja2FnZXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPnJlc3VsdFBhY2thZ2VzWyRkZXZNb2RlID8gJ2RldicgOiAnbm9uLWRldiddIGFzICRwYWNrYWdlKSB7CmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewpjb250aW51ZTsKfQoKCmlmICgkdXBkYXRlTWlycm9ycyA9PT0gdHJ1ZSAmJiAhYXJyYXlfa2V5X2V4aXN0cyhzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpLCAkdGhpcy0+cHJlc2VudE1hcCkpIHsKJHBhY2thZ2UgPSAkdGhpcy0+dXBkYXRlTWlycm9yQW5kVXJscygkcGFja2FnZSk7Cn0KCiRwYWNrYWdlc1tdID0gJHBhY2thZ2U7Cn0KCnJldHVybiAkcGFja2FnZXM7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB1cGRhdGVNaXJyb3JBbmRVcmxzKEJhc2VQYWNrYWdlICRwYWNrYWdlKTogQmFzZVBhY2thZ2UKewpmb3JlYWNoICgkdGhpcy0+cHJlc2VudE1hcCBhcyAkcHJlc2VudFBhY2thZ2UpIHsKaWYgKCRwYWNrYWdlLT5nZXROYW1lKCkgIT09ICRwcmVzZW50UGFja2FnZS0+Z2V0TmFtZSgpKSB7CmNvbnRpbnVlOwp9CgppZiAoJHBhY2thZ2UtPmdldFZlcnNpb24oKSAhPT0gJHByZXNlbnRQYWNrYWdlLT5nZXRWZXJzaW9uKCkpIHsKY29udGludWU7Cn0KCmlmICgkcHJlc2VudFBhY2thZ2UtPmdldFNvdXJjZVJlZmVyZW5jZSgpID09PSBudWxsKSB7CmNvbnRpbnVlOwp9CgppZiAoJHByZXNlbnRQYWNrYWdlLT5nZXRTb3VyY2VUeXBlKCkgIT09ICRwYWNrYWdlLT5nZXRTb3VyY2VUeXBlKCkpIHsKY29udGludWU7Cn0KCmlmICgkcHJlc2VudFBhY2thZ2UgaW5zdGFuY2VvZiBQYWNrYWdlKSB7CiRwcmVzZW50UGFja2FnZS0+c2V0U291cmNlVXJsKCRwYWNrYWdlLT5nZXRTb3VyY2VVcmwoKSk7CiRwcmVzZW50UGFja2FnZS0+c2V0U291cmNlTWlycm9ycygkcGFja2FnZS0+Z2V0U291cmNlTWlycm9ycygpKTsKfQoKCmlmICgkcHJlc2VudFBhY2thZ2UtPmdldERpc3RUeXBlKCkgIT09ICRwYWNrYWdlLT5nZXREaXN0VHlwZSgpKSB7CnJldHVybiAkcHJlc2VudFBhY2thZ2U7Cn0KCgppZiAoCiRwYWNrYWdlLT5nZXREaXN0VXJsKCkgIT09IG51bGwKJiYgJHByZXNlbnRQYWNrYWdlLT5nZXREaXN0UmVmZXJlbmNlKCkgIT09IG51bGwKJiYgUHJlZzo6aXNNYXRjaCgne15odHRwcz86Ly8oPzooPzp3d3dcLik/Yml0YnVja2V0XC5vcmd8KGFwaVwuKT9naXRodWJcLmNvbXwoPzp3d3dcLik/Z2l0bGFiXC5jb20pL31pJywgJHBhY2thZ2UtPmdldERpc3RVcmwoKSkKKSB7CiRwcmVzZW50UGFja2FnZS0+c2V0RGlzdFVybChQcmVnOjpyZXBsYWNlKCd7KD88PS98c2hhPSlbYS1mMC05XXs0MH0oPz0vfCQpfWknLCAkcHJlc2VudFBhY2thZ2UtPmdldERpc3RSZWZlcmVuY2UoKSwgJHBhY2thZ2UtPmdldERpc3RVcmwoKSkpOwp9CiRwcmVzZW50UGFja2FnZS0+c2V0RGlzdE1pcnJvcnMoJHBhY2thZ2UtPmdldERpc3RNaXJyb3JzKCkpOwoKcmV0dXJuICRwcmVzZW50UGFja2FnZTsKfQoKcmV0dXJuICRwYWNrYWdlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBbGlhc2VzKGFycmF5ICRhbGlhc2VzKTogYXJyYXkKewokdXNlZEFsaWFzZXMgPSBbXTsKCmZvcmVhY2ggKCR0aGlzLT5yZXN1bHRQYWNrYWdlc1snYWxsJ10gYXMgJHBhY2thZ2UpIHsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CmZvcmVhY2ggKCRhbGlhc2VzIGFzICRpbmRleCA9PiAkYWxpYXMpIHsKaWYgKCRhbGlhc1sncGFja2FnZSddID09PSAkcGFja2FnZS0+Z2V0TmFtZSgpKSB7CiR1c2VkQWxpYXNlc1tdID0gJGFsaWFzOwp1bnNldCgkYWxpYXNlc1skaW5kZXhdKTsKfQp9Cn0KfQoKdXNvcnQoJHVzZWRBbGlhc2VzLCBzdGF0aWMgZnVuY3Rpb24gKCRhLCAkYik6IGludCB7CnJldHVybiBzdHJjbXAoJGFbJ3BhY2thZ2UnXSwgJGJbJ3BhY2thZ2UnXSk7Cn0pOwoKcmV0dXJuICR1c2VkQWxpYXNlczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7CgoKCgoKCmNsYXNzIE11bHRpQ29uZmxpY3RSdWxlIGV4dGVuZHMgUnVsZQp7Cgpwcm90ZWN0ZWQgJGxpdGVyYWxzOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRsaXRlcmFscywgJHJlYXNvbiwgJHJlYXNvbkRhdGEpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkcmVhc29uLCAkcmVhc29uRGF0YSk7CgppZiAoXGNvdW50KCRsaXRlcmFscykgPCAzKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigibXVsdGkgY29uZmxpY3QgcnVsZSByZXF1aXJlcyBhdCBsZWFzdCAzIGxpdGVyYWxzIik7Cn0KCgpzb3J0KCRsaXRlcmFscyk7CgokdGhpcy0+bGl0ZXJhbHMgPSAkbGl0ZXJhbHM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMaXRlcmFscygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+bGl0ZXJhbHM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRIYXNoKCkKewokZGF0YSA9IHVucGFjaygnaWhhc2gnLCAoc3RyaW5nKSBoYXNoKFxQSFBfVkVSU0lPTl9JRCA+IDgwMTAwID8gJ3h4aDMnIDogJ3NoYTEnLCAnYzonLmltcGxvZGUoJywnLCAkdGhpcy0+bGl0ZXJhbHMpLCB0cnVlKSk7CmlmIChmYWxzZSA9PT0gJGRhdGEpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdW5wYWNraW5nOiAnLmltcGxvZGUoJywgJywgJHRoaXMtPmxpdGVyYWxzKSk7Cn0KCnJldHVybiAkZGF0YVsnaGFzaCddOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBlcXVhbHMoUnVsZSAkcnVsZSk6IGJvb2wKewppZiAoJHJ1bGUgaW5zdGFuY2VvZiBNdWx0aUNvbmZsaWN0UnVsZSkgewpyZXR1cm4gJHRoaXMtPmxpdGVyYWxzID09PSAkcnVsZS0+Z2V0TGl0ZXJhbHMoKTsKfQoKcmV0dXJuIGZhbHNlOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNBc3NlcnRpb24oKTogYm9vbAp7CnJldHVybiBmYWxzZTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkaXNhYmxlKCk6IHZvaWQKewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIkRpc2FibGluZyBtdWx0aSBjb25mbGljdCBydWxlcyBpcyBub3QgcG9zc2libGUuIFBsZWFzZSBjb250YWN0IGNvbXBvc2VyIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9jb21wb3NlciB0byBsZXQgdXMgZGVidWcgd2hhdCBsZWFkIHRvIHRoaXMgc2l0dWF0aW9uLiIpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKewoKJHJlc3VsdCA9ICR0aGlzLT5pc0Rpc2FibGVkKCkgPyAnZGlzYWJsZWQobXVsdGkoJyA6ICcobXVsdGkoJzsKCmZvcmVhY2ggKCR0aGlzLT5saXRlcmFscyBhcyAkaSA9PiAkbGl0ZXJhbCkgewppZiAoJGkgIT09IDApIHsKJHJlc3VsdCAuPSAnfCc7Cn0KJHJlc3VsdCAuPSAkbGl0ZXJhbDsKfQoKJHJlc3VsdCAuPSAnKSknOwoKcmV0dXJuICRyZXN1bHQ7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvbjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CgoKCgoKCmNsYXNzIEluc3RhbGxPcGVyYXRpb24gZXh0ZW5kcyBTb2x2ZXJPcGVyYXRpb24gaW1wbGVtZW50cyBPcGVyYXRpb25JbnRlcmZhY2UKewpwcm90ZWN0ZWQgY29uc3QgVFlQRSA9ICdpbnN0YWxsJzsKCgoKCnByb3RlY3RlZCAkcGFja2FnZTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CiR0aGlzLT5wYWNrYWdlID0gJHBhY2thZ2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWNrYWdlKCk6IFBhY2thZ2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPnBhY2thZ2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzaG93KCRsb2NrKTogc3RyaW5nCnsKcmV0dXJuIHNlbGY6OmZvcm1hdCgkdGhpcy0+cGFja2FnZSwgJGxvY2spOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZvcm1hdChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBib29sICRsb2NrID0gZmFsc2UpOiBzdHJpbmcKewpyZXR1cm4gKCRsb2NrID8gJ0xvY2tpbmcgJyA6ICdJbnN0YWxsaW5nICcpLic8aW5mbz4nLiRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuJzwvaW5mbz4gKDxjb21tZW50PicuJHBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkuJzwvY29tbWVudD4pJzsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwoKCgoKCgpjbGFzcyBNYXJrQWxpYXNJbnN0YWxsZWRPcGVyYXRpb24gZXh0ZW5kcyBTb2x2ZXJPcGVyYXRpb24gaW1wbGVtZW50cyBPcGVyYXRpb25JbnRlcmZhY2UKewpwcm90ZWN0ZWQgY29uc3QgVFlQRSA9ICdtYXJrQWxpYXNJbnN0YWxsZWQnOwoKCgoKcHJvdGVjdGVkICRwYWNrYWdlOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KEFsaWFzUGFja2FnZSAkcGFja2FnZSkKewokdGhpcy0+cGFja2FnZSA9ICRwYWNrYWdlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFja2FnZSgpOiBBbGlhc1BhY2thZ2UKewpyZXR1cm4gJHRoaXMtPnBhY2thZ2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzaG93KCRsb2NrKTogc3RyaW5nCnsKcmV0dXJuICdNYXJraW5nIDxpbmZvPicuJHRoaXMtPnBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nPC9pbmZvPiAoPGNvbW1lbnQ+Jy4kdGhpcy0+cGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKS4nPC9jb21tZW50PikgYXMgaW5zdGFsbGVkLCBhbGlhcyBvZiA8aW5mbz4nLiR0aGlzLT5wYWNrYWdlLT5nZXRBbGlhc09mKCktPmdldFByZXR0eU5hbWUoKS4nPC9pbmZvPiAoPGNvbW1lbnQ+Jy4kdGhpcy0+cGFja2FnZS0+Z2V0QWxpYXNPZigpLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpLic8L2NvbW1lbnQ+KSc7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvbjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKCgoKCgoKY2xhc3MgTWFya0FsaWFzVW5pbnN0YWxsZWRPcGVyYXRpb24gZXh0ZW5kcyBTb2x2ZXJPcGVyYXRpb24gaW1wbGVtZW50cyBPcGVyYXRpb25JbnRlcmZhY2UKewpwcm90ZWN0ZWQgY29uc3QgVFlQRSA9ICdtYXJrQWxpYXNVbmluc3RhbGxlZCc7CgoKCgpwcm90ZWN0ZWQgJHBhY2thZ2U7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoQWxpYXNQYWNrYWdlICRwYWNrYWdlKQp7CiR0aGlzLT5wYWNrYWdlID0gJHBhY2thZ2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWNrYWdlKCk6IEFsaWFzUGFja2FnZQp7CnJldHVybiAkdGhpcy0+cGFja2FnZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNob3coJGxvY2spOiBzdHJpbmcKewpyZXR1cm4gJ01hcmtpbmcgPGluZm8+Jy4kdGhpcy0+cGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLic8L2luZm8+ICg8Y29tbWVudD4nLiR0aGlzLT5wYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpLic8L2NvbW1lbnQ+KSBhcyB1bmluc3RhbGxlZCwgYWxpYXMgb2YgPGluZm8+Jy4kdGhpcy0+cGFja2FnZS0+Z2V0QWxpYXNPZigpLT5nZXRQcmV0dHlOYW1lKCkuJzwvaW5mbz4gKDxjb21tZW50PicuJHRoaXMtPnBhY2thZ2UtPmdldEFsaWFzT2YoKS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKS4nPC9jb21tZW50PiknOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb247CgoKCgoKCmludGVyZmFjZSBPcGVyYXRpb25JbnRlcmZhY2UKewoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPcGVyYXRpb25UeXBlKCk7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2hvdyhib29sICRsb2NrKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvbjsKCgoKCgoKYWJzdHJhY3QgY2xhc3MgU29sdmVyT3BlcmF0aW9uIGltcGxlbWVudHMgT3BlcmF0aW9uSW50ZXJmYWNlCnsKCgoKcHJvdGVjdGVkIGNvbnN0IFRZUEUgPSAnJzsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPcGVyYXRpb25UeXBlKCk6IHN0cmluZwp7CnJldHVybiBzdGF0aWM6OlRZUEU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCkKewpyZXR1cm4gJHRoaXMtPnNob3coZmFsc2UpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb247Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBVbmluc3RhbGxPcGVyYXRpb24gZXh0ZW5kcyBTb2x2ZXJPcGVyYXRpb24gaW1wbGVtZW50cyBPcGVyYXRpb25JbnRlcmZhY2UKewpwcm90ZWN0ZWQgY29uc3QgVFlQRSA9ICd1bmluc3RhbGwnOwoKCgoKcHJvdGVjdGVkICRwYWNrYWdlOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKJHRoaXMtPnBhY2thZ2UgPSAkcGFja2FnZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhY2thZ2UoKTogUGFja2FnZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+cGFja2FnZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNob3coJGxvY2spOiBzdHJpbmcKewpyZXR1cm4gc2VsZjo6Zm9ybWF0KCR0aGlzLT5wYWNrYWdlLCAkbG9jayk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZm9ybWF0KFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIGJvb2wgJGxvY2sgPSBmYWxzZSk6IHN0cmluZwp7CnJldHVybiAnUmVtb3ZpbmcgPGluZm8+Jy4kcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLic8L2luZm8+ICg8Y29tbWVudD4nLiRwYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpLic8L2NvbW1lbnQ+KSc7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvbjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKCgoKCgoKY2xhc3MgVXBkYXRlT3BlcmF0aW9uIGV4dGVuZHMgU29sdmVyT3BlcmF0aW9uIGltcGxlbWVudHMgT3BlcmF0aW9uSW50ZXJmYWNlCnsKcHJvdGVjdGVkIGNvbnN0IFRZUEUgPSAndXBkYXRlJzsKCgoKCnByb3RlY3RlZCAkaW5pdGlhbFBhY2thZ2U7CgoKCgpwcm90ZWN0ZWQgJHRhcmdldFBhY2thZ2U7CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFBhY2thZ2VJbnRlcmZhY2UgJGluaXRpYWwsIFBhY2thZ2VJbnRlcmZhY2UgJHRhcmdldCkKewokdGhpcy0+aW5pdGlhbFBhY2thZ2UgPSAkaW5pdGlhbDsKJHRoaXMtPnRhcmdldFBhY2thZ2UgPSAkdGFyZ2V0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5pdGlhbFBhY2thZ2UoKTogUGFja2FnZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+aW5pdGlhbFBhY2thZ2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUYXJnZXRQYWNrYWdlKCk6IFBhY2thZ2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPnRhcmdldFBhY2thZ2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzaG93KCRsb2NrKTogc3RyaW5nCnsKcmV0dXJuIHNlbGY6OmZvcm1hdCgkdGhpcy0+aW5pdGlhbFBhY2thZ2UsICR0aGlzLT50YXJnZXRQYWNrYWdlLCAkbG9jayk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZm9ybWF0KFBhY2thZ2VJbnRlcmZhY2UgJGluaXRpYWxQYWNrYWdlLCBQYWNrYWdlSW50ZXJmYWNlICR0YXJnZXRQYWNrYWdlLCBib29sICRsb2NrID0gZmFsc2UpOiBzdHJpbmcKewokZnJvbVZlcnNpb24gPSAkaW5pdGlhbFBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCk7CiR0b1ZlcnNpb24gPSAkdGFyZ2V0UGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKTsKCmlmICgkZnJvbVZlcnNpb24gPT09ICR0b1ZlcnNpb24gJiYgJGluaXRpYWxQYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKSAhPT0gJHRhcmdldFBhY2thZ2UtPmdldFNvdXJjZVJlZmVyZW5jZSgpKSB7CiRmcm9tVmVyc2lvbiA9ICRpbml0aWFsUGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24odHJ1ZSwgUGFja2FnZUludGVyZmFjZTo6RElTUExBWV9TT1VSQ0VfUkVGKTsKJHRvVmVyc2lvbiA9ICR0YXJnZXRQYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbih0cnVlLCBQYWNrYWdlSW50ZXJmYWNlOjpESVNQTEFZX1NPVVJDRV9SRUYpOwp9IGVsc2VpZiAoJGZyb21WZXJzaW9uID09PSAkdG9WZXJzaW9uICYmICRpbml0aWFsUGFja2FnZS0+Z2V0RGlzdFJlZmVyZW5jZSgpICE9PSAkdGFyZ2V0UGFja2FnZS0+Z2V0RGlzdFJlZmVyZW5jZSgpKSB7CiRmcm9tVmVyc2lvbiA9ICRpbml0aWFsUGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24odHJ1ZSwgUGFja2FnZUludGVyZmFjZTo6RElTUExBWV9ESVNUX1JFRik7CiR0b1ZlcnNpb24gPSAkdGFyZ2V0UGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24odHJ1ZSwgUGFja2FnZUludGVyZmFjZTo6RElTUExBWV9ESVNUX1JFRik7Cn0KCiRhY3Rpb25OYW1lID0gVmVyc2lvblBhcnNlcjo6aXNVcGdyYWRlKCRpbml0aWFsUGFja2FnZS0+Z2V0VmVyc2lvbigpLCAkdGFyZ2V0UGFja2FnZS0+Z2V0VmVyc2lvbigpKSA/ICdVcGdyYWRpbmcnIDogJ0Rvd25ncmFkaW5nJzsKCnJldHVybiAkYWN0aW9uTmFtZS4nIDxpbmZvPicuJGluaXRpYWxQYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuJzwvaW5mbz4gKDxjb21tZW50PicuJGZyb21WZXJzaW9uLic8L2NvbW1lbnQ+ID0+IDxjb21tZW50PicuJHRvVmVyc2lvbi4nPC9jb21tZW50PiknOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50OwoKCgoKaW50ZXJmYWNlIFBvbGljeUludGVyZmFjZQp7CgoKCnB1YmxpYyBmdW5jdGlvbiB2ZXJzaW9uQ29tcGFyZShQYWNrYWdlSW50ZXJmYWNlICRhLCBQYWNrYWdlSW50ZXJmYWNlICRiLCBzdHJpbmcgJG9wZXJhdG9yKTogYm9vbDsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2VsZWN0UHJlZmVycmVkUGFja2FnZXMoUG9vbCAkcG9vbCwgYXJyYXkgJGxpdGVyYWxzLCA/c3RyaW5nICRyZXF1aXJlZFBhY2thZ2UgPSBudWxsKTogYXJyYXk7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCnVzZSBDb21wb3NlclxBZHZpc29yeVxQYXJ0aWFsU2VjdXJpdHlBZHZpc29yeTsKdXNlIENvbXBvc2VyXEFkdmlzb3J5XFNlY3VyaXR5QWR2aXNvcnk7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29tcGlsaW5nTWF0Y2hlcjsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50OwoKCgoKCgoKY2xhc3MgUG9vbCBpbXBsZW1lbnRzIFxDb3VudGFibGUKewoKcHJvdGVjdGVkICRwYWNrYWdlcyA9IFtdOwoKcHJvdGVjdGVkICRwYWNrYWdlQnlOYW1lID0gW107Cgpwcm90ZWN0ZWQgJHZlcnNpb25QYXJzZXI7Cgpwcm90ZWN0ZWQgJHByb3ZpZGVyQ2FjaGUgPSBbXTsKCnByb3RlY3RlZCAkdW5hY2NlcHRhYmxlRml4ZWRPckxvY2tlZFBhY2thZ2VzOwoKcHJvdGVjdGVkICRyZW1vdmVkVmVyc2lvbnMgPSBbXTsKCnByb3RlY3RlZCAkcmVtb3ZlZFZlcnNpb25zQnlQYWNrYWdlID0gW107Cgpwcml2YXRlICRzZWN1cml0eVJlbW92ZWRWZXJzaW9ucyA9IFtdOwoKcHJpdmF0ZSAkYWJhbmRvbmVkUmVtb3ZlZFZlcnNpb25zID0gW107CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkcGFja2FnZXMgPSBbXSwgYXJyYXkgJHVuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlcyA9IFtdLCBhcnJheSAkcmVtb3ZlZFZlcnNpb25zID0gW10sIGFycmF5ICRyZW1vdmVkVmVyc2lvbnNCeVBhY2thZ2UgPSBbXSwgYXJyYXkgJHNlY3VyaXR5UmVtb3ZlZFZlcnNpb25zID0gW10sIGFycmF5ICRhYmFuZG9uZWRSZW1vdmVkVmVyc2lvbnMgPSBbXSkKewokdGhpcy0+dmVyc2lvblBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyOwokdGhpcy0+c2V0UGFja2FnZXMoJHBhY2thZ2VzKTsKJHRoaXMtPnVuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlcyA9ICR1bmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZXM7CiR0aGlzLT5yZW1vdmVkVmVyc2lvbnMgPSAkcmVtb3ZlZFZlcnNpb25zOwokdGhpcy0+cmVtb3ZlZFZlcnNpb25zQnlQYWNrYWdlID0gJHJlbW92ZWRWZXJzaW9uc0J5UGFja2FnZTsKJHRoaXMtPnNlY3VyaXR5UmVtb3ZlZFZlcnNpb25zID0gJHNlY3VyaXR5UmVtb3ZlZFZlcnNpb25zOwokdGhpcy0+YWJhbmRvbmVkUmVtb3ZlZFZlcnNpb25zID0gJGFiYW5kb25lZFJlbW92ZWRWZXJzaW9uczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlbW92ZWRWZXJzaW9ucyhzdHJpbmcgJG5hbWUsIENvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQpOiBhcnJheQp7CmlmICghaXNzZXQoJHRoaXMtPnJlbW92ZWRWZXJzaW9uc1skbmFtZV0pKSB7CnJldHVybiBbXTsKfQoKJHJlc3VsdCA9IFtdOwpmb3JlYWNoICgkdGhpcy0+cmVtb3ZlZFZlcnNpb25zWyRuYW1lXSBhcyAkdmVyc2lvbiA9PiAkcHJldHR5VmVyc2lvbikgewppZiAoJGNvbnN0cmFpbnQtPm1hdGNoZXMobmV3IENvbnN0cmFpbnQoJz09JywgJHZlcnNpb24pKSkgewokcmVzdWx0WyR2ZXJzaW9uXSA9ICRwcmV0dHlWZXJzaW9uOwp9Cn0KCnJldHVybiAkcmVzdWx0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QWxsUmVtb3ZlZFZlcnNpb25zKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yZW1vdmVkVmVyc2lvbnM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZW1vdmVkVmVyc2lvbnNCeVBhY2thZ2Uoc3RyaW5nICRvYmplY3RIYXNoKTogYXJyYXkKewppZiAoIWlzc2V0KCR0aGlzLT5yZW1vdmVkVmVyc2lvbnNCeVBhY2thZ2VbJG9iamVjdEhhc2hdKSkgewpyZXR1cm4gW107Cn0KCnJldHVybiAkdGhpcy0+cmVtb3ZlZFZlcnNpb25zQnlQYWNrYWdlWyRvYmplY3RIYXNoXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFsbFJlbW92ZWRWZXJzaW9uc0J5UGFja2FnZSgpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cmVtb3ZlZFZlcnNpb25zQnlQYWNrYWdlOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNTZWN1cml0eVJlbW92ZWRQYWNrYWdlVmVyc2lvbihzdHJpbmcgJHBhY2thZ2VOYW1lLCA/Q29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCk6IGJvb2wKewpmb3JlYWNoICgkdGhpcy0+c2VjdXJpdHlSZW1vdmVkVmVyc2lvbnNbJHBhY2thZ2VOYW1lXSA/PyBbXSBhcyAkdmVyc2lvbiA9PiAkcGFja2FnZVdpdGhTZWN1cml0eUFkdmlzb3JpZXMpIHsKaWYgKCRjb25zdHJhaW50ICE9PSBudWxsICYmICRjb25zdHJhaW50LT5tYXRjaGVzKG5ldyBDb25zdHJhaW50KCc9PScsICR2ZXJzaW9uKSkpIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U2VjdXJpdHlBZHZpc29yeUlkZW50aWZpZXJzRm9yUGFja2FnZVZlcnNpb24oc3RyaW5nICRwYWNrYWdlTmFtZSwgP0NvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQpOiBhcnJheQp7CmZvcmVhY2ggKCR0aGlzLT5zZWN1cml0eVJlbW92ZWRWZXJzaW9uc1skcGFja2FnZU5hbWVdID8/IFtdIGFzICR2ZXJzaW9uID0+ICRwYWNrYWdlV2l0aFNlY3VyaXR5QWR2aXNvcmllcykgewppZiAoJGNvbnN0cmFpbnQgIT09IG51bGwgJiYgJGNvbnN0cmFpbnQtPm1hdGNoZXMobmV3IENvbnN0cmFpbnQoJz09JywgJHZlcnNpb24pKSkgewpyZXR1cm4gYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGFkdmlzb3J5KSB7CnJldHVybiAkYWR2aXNvcnktPmFkdmlzb3J5SWQ7Cn0sICRwYWNrYWdlV2l0aFNlY3VyaXR5QWR2aXNvcmllcyk7Cn0KfQoKcmV0dXJuIFtdOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNBYmFuZG9uZWRSZW1vdmVkUGFja2FnZVZlcnNpb24oc3RyaW5nICRwYWNrYWdlTmFtZSwgP0NvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQpOiBib29sCnsKZm9yZWFjaCAoJHRoaXMtPmFiYW5kb25lZFJlbW92ZWRWZXJzaW9uc1skcGFja2FnZU5hbWVdID8/IFtdIGFzICR2ZXJzaW9uID0+ICRwcmV0dHlWZXJzaW9uKSB7CmlmICgkY29uc3RyYWludCAhPT0gbnVsbCAmJiAkY29uc3RyYWludC0+bWF0Y2hlcyhuZXcgQ29uc3RyYWludCgnPT0nLCAkdmVyc2lvbikpKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFsbFNlY3VyaXR5UmVtb3ZlZFBhY2thZ2VWZXJzaW9ucygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+c2VjdXJpdHlSZW1vdmVkVmVyc2lvbnM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBbGxBYmFuZG9uZWRSZW1vdmVkUGFja2FnZVZlcnNpb25zKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hYmFuZG9uZWRSZW1vdmVkVmVyc2lvbnM7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gc2V0UGFja2FnZXMoYXJyYXkgJHBhY2thZ2VzKTogdm9pZAp7CiRpZCA9IDE7Cgpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJHRoaXMtPnBhY2thZ2VzW10gPSAkcGFja2FnZTsKCiRwYWNrYWdlLT5pZCA9ICRpZCsrOwoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldE5hbWVzKCkgYXMgJHByb3ZpZGVkKSB7CiR0aGlzLT5wYWNrYWdlQnlOYW1lWyRwcm92aWRlZF1bXSA9ICRwYWNrYWdlOwp9Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhY2thZ2VzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5wYWNrYWdlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHBhY2thZ2VCeUlkKGludCAkaWQpOiBCYXNlUGFja2FnZQp7CnJldHVybiAkdGhpcy0+cGFja2FnZXNbJGlkIC0gMV07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb3VudCgpOiBpbnQKewpyZXR1cm4gXGNvdW50KCR0aGlzLT5wYWNrYWdlcyk7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdoYXRQcm92aWRlcyhzdHJpbmcgJG5hbWUsID9Db25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50ID0gbnVsbCk6IGFycmF5CnsKJGtleSA9IChzdHJpbmcpICRjb25zdHJhaW50OwppZiAoaXNzZXQoJHRoaXMtPnByb3ZpZGVyQ2FjaGVbJG5hbWVdWyRrZXldKSkgewpyZXR1cm4gJHRoaXMtPnByb3ZpZGVyQ2FjaGVbJG5hbWVdWyRrZXldOwp9CgpyZXR1cm4gJHRoaXMtPnByb3ZpZGVyQ2FjaGVbJG5hbWVdWyRrZXldID0gJHRoaXMtPmNvbXB1dGVXaGF0UHJvdmlkZXMoJG5hbWUsICRjb25zdHJhaW50KTsKfQoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjb21wdXRlV2hhdFByb3ZpZGVzKHN0cmluZyAkbmFtZSwgP0NvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQgPSBudWxsKTogYXJyYXkKewppZiAoIWlzc2V0KCR0aGlzLT5wYWNrYWdlQnlOYW1lWyRuYW1lXSkpIHsKcmV0dXJuIFtdOwp9CgokbWF0Y2hlcyA9IFtdOwoKZm9yZWFjaCAoJHRoaXMtPnBhY2thZ2VCeU5hbWVbJG5hbWVdIGFzICRjYW5kaWRhdGUpIHsKaWYgKCR0aGlzLT5tYXRjaCgkY2FuZGlkYXRlLCAkbmFtZSwgJGNvbnN0cmFpbnQpKSB7CiRtYXRjaGVzW10gPSAkY2FuZGlkYXRlOwp9Cn0KCnJldHVybiAkbWF0Y2hlczsKfQoKcHVibGljIGZ1bmN0aW9uIGxpdGVyYWxUb1BhY2thZ2UoaW50ICRsaXRlcmFsKTogQmFzZVBhY2thZ2UKewokcGFja2FnZUlkID0gYWJzKCRsaXRlcmFsKTsKCnJldHVybiAkdGhpcy0+cGFja2FnZUJ5SWQoJHBhY2thZ2VJZCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBsaXRlcmFsVG9QcmV0dHlTdHJpbmcoaW50ICRsaXRlcmFsLCBhcnJheSAkaW5zdGFsbGVkTWFwKTogc3RyaW5nCnsKJHBhY2thZ2UgPSAkdGhpcy0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbCk7CgppZiAoaXNzZXQoJGluc3RhbGxlZE1hcFskcGFja2FnZS0+aWRdKSkgewokcHJlZml4ID0gKCRsaXRlcmFsID4gMCA/ICdrZWVwJyA6ICdyZW1vdmUnKTsKfSBlbHNlIHsKJHByZWZpeCA9ICgkbGl0ZXJhbCA+IDAgPyAnaW5zdGFsbCcgOiAnZG9uXCd0IGluc3RhbGwnKTsKfQoKcmV0dXJuICRwcmVmaXguJyAnLiRwYWNrYWdlLT5nZXRQcmV0dHlTdHJpbmcoKTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG1hdGNoKEJhc2VQYWNrYWdlICRjYW5kaWRhdGUsIHN0cmluZyAkbmFtZSwgP0NvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQgPSBudWxsKTogYm9vbAp7CiRjYW5kaWRhdGVOYW1lID0gJGNhbmRpZGF0ZS0+Z2V0TmFtZSgpOwokY2FuZGlkYXRlVmVyc2lvbiA9ICRjYW5kaWRhdGUtPmdldFZlcnNpb24oKTsKCmlmICgkY2FuZGlkYXRlTmFtZSA9PT0gJG5hbWUpIHsKcmV0dXJuICRjb25zdHJhaW50ID09PSBudWxsIHx8IENvbXBpbGluZ01hdGNoZXI6Om1hdGNoKCRjb25zdHJhaW50LCBDb25zdHJhaW50OjpPUF9FUSwgJGNhbmRpZGF0ZVZlcnNpb24pOwp9CgokcHJvdmlkZXMgPSAkY2FuZGlkYXRlLT5nZXRQcm92aWRlcygpOwokcmVwbGFjZXMgPSAkY2FuZGlkYXRlLT5nZXRSZXBsYWNlcygpOwoKCmlmIChpc3NldCgkcmVwbGFjZXNbMF0pIHx8IGlzc2V0KCRwcm92aWRlc1swXSkpIHsKZm9yZWFjaCAoJHByb3ZpZGVzIGFzICRsaW5rKSB7CmlmICgkbGluay0+Z2V0VGFyZ2V0KCkgPT09ICRuYW1lICYmICgkY29uc3RyYWludCA9PT0gbnVsbCB8fCAkY29uc3RyYWludC0+bWF0Y2hlcygkbGluay0+Z2V0Q29uc3RyYWludCgpKSkpIHsKcmV0dXJuIHRydWU7Cn0KfQoKZm9yZWFjaCAoJHJlcGxhY2VzIGFzICRsaW5rKSB7CmlmICgkbGluay0+Z2V0VGFyZ2V0KCkgPT09ICRuYW1lICYmICgkY29uc3RyYWludCA9PT0gbnVsbCB8fCAkY29uc3RyYWludC0+bWF0Y2hlcygkbGluay0+Z2V0Q29uc3RyYWludCgpKSkpIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgppZiAoaXNzZXQoJHByb3ZpZGVzWyRuYW1lXSkgJiYgKCRjb25zdHJhaW50ID09PSBudWxsIHx8ICRjb25zdHJhaW50LT5tYXRjaGVzKCRwcm92aWRlc1skbmFtZV0tPmdldENvbnN0cmFpbnQoKSkpKSB7CnJldHVybiB0cnVlOwp9CgppZiAoaXNzZXQoJHJlcGxhY2VzWyRuYW1lXSkgJiYgKCRjb25zdHJhaW50ID09PSBudWxsIHx8ICRjb25zdHJhaW50LT5tYXRjaGVzKCRyZXBsYWNlc1skbmFtZV0tPmdldENvbnN0cmFpbnQoKSkpKSB7CnJldHVybiB0cnVlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc1VuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlKEJhc2VQYWNrYWdlICRwYWNrYWdlKTogYm9vbAp7CnJldHVybiBcaW5fYXJyYXkoJHBhY2thZ2UsICR0aGlzLT51bmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZXMsIHRydWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VW5hY2NlcHRhYmxlRml4ZWRPckxvY2tlZFBhY2thZ2VzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT51bmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZXM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwp7CiRzdHIgPSAiUG9vbDpcbiI7Cgpmb3JlYWNoICgkdGhpcy0+cGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJHN0ciAuPSAnLSAnLnN0cl9wYWQoKHN0cmluZykgJHBhY2thZ2UtPmlkLCA2LCAnICcsIFNUUl9QQURfTEVGVCkuJzogJy4kcGFja2FnZS0+Z2V0TmFtZSgpLiJcbiI7Cn0KCnJldHVybiAkc3RyOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnREaXNwYXRjaGVyOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cU3RhYmlsaXR5RmlsdGVyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXFBsdWdpblxQcmVQb29sQ3JlYXRlRXZlbnQ7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUm9vdFBhY2thZ2VSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbXBpbGluZ01hdGNoZXI7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE1hdGNoQWxsQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE11bHRpQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxJbnRlcnZhbHM7CgoKCgpjbGFzcyBQb29sQnVpbGRlcgp7CnByaXZhdGUgY29uc3QgTE9BRF9CQVRDSF9TSVpFID0gNTA7CgoKCgoKcHJpdmF0ZSAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzOwoKCgoKcHJpdmF0ZSAkc3RhYmlsaXR5RmxhZ3M7CgoKCgpwcml2YXRlICRyb290QWxpYXNlczsKCgoKCnByaXZhdGUgJHJvb3RSZWZlcmVuY2VzOwoKCgpwcml2YXRlICR0ZW1wb3JhcnlDb25zdHJhaW50czsKCgoKcHJpdmF0ZSAkZXZlbnREaXNwYXRjaGVyOwoKCgpwcml2YXRlICRwb29sT3B0aW1pemVyOwoKCgpwcml2YXRlICRpbzsKCgoKCnByaXZhdGUgJGFsaWFzTWFwID0gW107CgoKCgpwcml2YXRlICRwYWNrYWdlc1RvTG9hZCA9IFtdOwoKCgoKcHJpdmF0ZSAkbG9hZGVkUGFja2FnZXMgPSBbXTsKCgoKCnByaXZhdGUgJGxvYWRlZFBlclJlcG8gPSBbXTsKCgoKcHJpdmF0ZSAkcGFja2FnZXMgPSBbXTsKCgoKcHJpdmF0ZSAkdW5hY2NlcHRhYmxlRml4ZWRPckxvY2tlZFBhY2thZ2VzID0gW107Cgpwcml2YXRlICR1cGRhdGVBbGxvd0xpc3QgPSBbXTsKCnByaXZhdGUgJHNraXBwZWRMb2FkID0gW107Cgpwcml2YXRlICRpZ25vcmVkVHlwZXMgPSBbXTsKCnByaXZhdGUgJGFsbG93ZWRUeXBlcyA9IG51bGw7CgoKCgoKCgoKCnByaXZhdGUgJHJlc3RyaWN0ZWRQYWNrYWdlc0xpc3QgPSBudWxsOwoKCgoKCgoKCgpwcml2YXRlICRwYXRoUmVwb1VubG9ja2VkID0gW107CgoKCgoKCgoKCgoKcHJpdmF0ZSAkbWF4RXh0ZW5kZWRSZXFzID0gW107CgoKCgpwcml2YXRlICR1cGRhdGVBbGxvd1dhcm5lZCA9IFtdOwoKCnByaXZhdGUgJGluZGV4Q291bnRlciA9IDA7CgoKcHJpdmF0ZSAkc2VjdXJpdHlBZHZpc29yeVBvb2xGaWx0ZXI7CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCBhcnJheSAkc3RhYmlsaXR5RmxhZ3MsIGFycmF5ICRyb290QWxpYXNlcywgYXJyYXkgJHJvb3RSZWZlcmVuY2VzLCBJT0ludGVyZmFjZSAkaW8sID9FdmVudERpc3BhdGNoZXIgJGV2ZW50RGlzcGF0Y2hlciA9IG51bGwsID9Qb29sT3B0aW1pemVyICRwb29sT3B0aW1pemVyID0gbnVsbCwgYXJyYXkgJHRlbXBvcmFyeUNvbnN0cmFpbnRzID0gW10sID9TZWN1cml0eUFkdmlzb3J5UG9vbEZpbHRlciAkc2VjdXJpdHlBZHZpc29yeVBvb2xGaWx0ZXIgPSBudWxsKQp7CiR0aGlzLT5hY2NlcHRhYmxlU3RhYmlsaXRpZXMgPSAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzOwokdGhpcy0+c3RhYmlsaXR5RmxhZ3MgPSAkc3RhYmlsaXR5RmxhZ3M7CiR0aGlzLT5yb290QWxpYXNlcyA9ICRyb290QWxpYXNlczsKJHRoaXMtPnJvb3RSZWZlcmVuY2VzID0gJHJvb3RSZWZlcmVuY2VzOwokdGhpcy0+ZXZlbnREaXNwYXRjaGVyID0gJGV2ZW50RGlzcGF0Y2hlcjsKJHRoaXMtPnBvb2xPcHRpbWl6ZXIgPSAkcG9vbE9wdGltaXplcjsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+dGVtcG9yYXJ5Q29uc3RyYWludHMgPSAkdGVtcG9yYXJ5Q29uc3RyYWludHM7CiR0aGlzLT5zZWN1cml0eUFkdmlzb3J5UG9vbEZpbHRlciA9ICRzZWN1cml0eUFkdmlzb3J5UG9vbEZpbHRlcjsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SWdub3JlZFR5cGVzKGFycmF5ICR0eXBlcyk6IHZvaWQKewokdGhpcy0+aWdub3JlZFR5cGVzID0gJHR5cGVzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBbGxvd2VkVHlwZXMoP2FycmF5ICR0eXBlcyk6IHZvaWQKewokdGhpcy0+YWxsb3dlZFR5cGVzID0gJHR5cGVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYnVpbGRQb29sKGFycmF5ICRyZXBvc2l0b3JpZXMsIFJlcXVlc3QgJHJlcXVlc3QpOiBQb29sCnsKJHRoaXMtPnJlc3RyaWN0ZWRQYWNrYWdlc0xpc3QgPSAkcmVxdWVzdC0+Z2V0UmVzdHJpY3RlZFBhY2thZ2VzKCkgIT09IG51bGwgPyBhcnJheV9mbGlwKCRyZXF1ZXN0LT5nZXRSZXN0cmljdGVkUGFja2FnZXMoKSkgOiBudWxsOwoKaWYgKFxjb3VudCgkcmVxdWVzdC0+Z2V0VXBkYXRlQWxsb3dMaXN0KCkpID4gMCkgewokdGhpcy0+dXBkYXRlQWxsb3dMaXN0ID0gJHJlcXVlc3QtPmdldFVwZGF0ZUFsbG93TGlzdCgpOwokdGhpcy0+d2FybkFib3V0Tm9uTWF0Y2hpbmdVcGRhdGVBbGxvd0xpc3QoJHJlcXVlc3QpOwoKaWYgKG51bGwgPT09ICRyZXF1ZXN0LT5nZXRMb2NrZWRSZXBvc2l0b3J5KCkpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignTm8gbG9jayByZXBvIHByZXNlbnQgYW5kIHlldCBhIHBhcnRpYWwgdXBkYXRlIHdhcyByZXF1ZXN0ZWQuJyk7Cn0KCmZvcmVhY2ggKCRyZXF1ZXN0LT5nZXRMb2NrZWRSZXBvc2l0b3J5KCktPmdldFBhY2thZ2VzKCkgYXMgJGxvY2tlZFBhY2thZ2UpIHsKaWYgKCEkdGhpcy0+aXNVcGRhdGVBbGxvd2VkKCRsb2NrZWRQYWNrYWdlKSkgewoKJHRoaXMtPnNraXBwZWRMb2FkWyRsb2NrZWRQYWNrYWdlLT5nZXROYW1lKCldW10gPSAkbG9ja2VkUGFja2FnZTsKZm9yZWFjaCAoJGxvY2tlZFBhY2thZ2UtPmdldFJlcGxhY2VzKCkgYXMgJGxpbmspIHsKJHRoaXMtPnNraXBwZWRMb2FkWyRsaW5rLT5nZXRUYXJnZXQoKV1bXSA9ICRsb2NrZWRQYWNrYWdlOwp9CgoKCgoKaWYgKCRsb2NrZWRQYWNrYWdlLT5nZXREaXN0VHlwZSgpID09PSAncGF0aCcpIHsKJHRyYW5zcG9ydE9wdGlvbnMgPSAkbG9ja2VkUGFja2FnZS0+Z2V0VHJhbnNwb3J0T3B0aW9ucygpOwppZiAoIWlzc2V0KCR0cmFuc3BvcnRPcHRpb25zWydzeW1saW5rJ10pIHx8ICR0cmFuc3BvcnRPcHRpb25zWydzeW1saW5rJ10gIT09IGZhbHNlKSB7CiR0aGlzLT5wYXRoUmVwb1VubG9ja2VkWyRsb2NrZWRQYWNrYWdlLT5nZXROYW1lKCldID0gdHJ1ZTsKY29udGludWU7Cn0KfQoKJHJlcXVlc3QtPmxvY2tQYWNrYWdlKCRsb2NrZWRQYWNrYWdlKTsKfQp9Cn0KCmZvcmVhY2ggKCRyZXF1ZXN0LT5nZXRGaXhlZE9yTG9ja2VkUGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewoKCiR0aGlzLT5sb2FkZWRQYWNrYWdlc1skcGFja2FnZS0+Z2V0TmFtZSgpXSA9IG5ldyBNYXRjaEFsbENvbnN0cmFpbnQoKTsKCgpmb3JlYWNoICgkcGFja2FnZS0+Z2V0UmVwbGFjZXMoKSBhcyAkbGluaykgewokdGhpcy0+bG9hZGVkUGFja2FnZXNbJGxpbmstPmdldFRhcmdldCgpXSA9IG5ldyBNYXRjaEFsbENvbnN0cmFpbnQoKTsKfQoKCgoKaWYgKAokcGFja2FnZS0+Z2V0UmVwb3NpdG9yeSgpIGluc3RhbmNlb2YgUm9vdFBhY2thZ2VSZXBvc2l0b3J5Cnx8ICRwYWNrYWdlLT5nZXRSZXBvc2l0b3J5KCkgaW5zdGFuY2VvZiBQbGF0Zm9ybVJlcG9zaXRvcnkKfHwgU3RhYmlsaXR5RmlsdGVyOjppc1BhY2thZ2VBY2NlcHRhYmxlKCR0aGlzLT5hY2NlcHRhYmxlU3RhYmlsaXRpZXMsICR0aGlzLT5zdGFiaWxpdHlGbGFncywgJHBhY2thZ2UtPmdldE5hbWVzKCksICRwYWNrYWdlLT5nZXRTdGFiaWxpdHkoKSkKKSB7CiR0aGlzLT5sb2FkUGFja2FnZSgkcmVxdWVzdCwgJHJlcG9zaXRvcmllcywgJHBhY2thZ2UsIGZhbHNlKTsKfSBlbHNlIHsKJHRoaXMtPnVuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlc1tdID0gJHBhY2thZ2U7Cn0KfQoKZm9yZWFjaCAoJHJlcXVlc3QtPmdldFJlcXVpcmVzKCkgYXMgJHBhY2thZ2VOYW1lID0+ICRjb25zdHJhaW50KSB7CgppZiAoaXNzZXQoJHRoaXMtPmxvYWRlZFBhY2thZ2VzWyRwYWNrYWdlTmFtZV0pKSB7CmNvbnRpbnVlOwp9CgokdGhpcy0+cGFja2FnZXNUb0xvYWRbJHBhY2thZ2VOYW1lXSA9ICRjb25zdHJhaW50OwokdGhpcy0+bWF4RXh0ZW5kZWRSZXFzWyRwYWNrYWdlTmFtZV0gPSB0cnVlOwp9CgoKZm9yZWFjaCAoJHRoaXMtPnBhY2thZ2VzVG9Mb2FkIGFzICRuYW1lID0+ICRjb25zdHJhaW50KSB7CmlmIChpc3NldCgkdGhpcy0+bG9hZGVkUGFja2FnZXNbJG5hbWVdKSkgewp1bnNldCgkdGhpcy0+cGFja2FnZXNUb0xvYWRbJG5hbWVdKTsKfQp9Cgp3aGlsZSAoXGNvdW50KCR0aGlzLT5wYWNrYWdlc1RvTG9hZCkgPiAwKSB7CiR0aGlzLT5sb2FkUGFja2FnZXNNYXJrZWRGb3JMb2FkaW5nKCRyZXF1ZXN0LCAkcmVwb3NpdG9yaWVzKTsKfQoKaWYgKFxjb3VudCgkdGhpcy0+dGVtcG9yYXJ5Q29uc3RyYWludHMpID4gMCkgewpmb3JlYWNoICgkdGhpcy0+cGFja2FnZXMgYXMgJGkgPT4gJHBhY2thZ2UpIHsKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewpjb250aW51ZTsKfQoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldE5hbWVzKCkgYXMgJHBhY2thZ2VOYW1lKSB7CmlmICghaXNzZXQoJHRoaXMtPnRlbXBvcmFyeUNvbnN0cmFpbnRzWyRwYWNrYWdlTmFtZV0pKSB7CmNvbnRpbnVlOwp9CgokY29uc3RyYWludCA9ICR0aGlzLT50ZW1wb3JhcnlDb25zdHJhaW50c1skcGFja2FnZU5hbWVdOwokcGFja2FnZUFuZEFsaWFzZXMgPSBbJGkgPT4gJHBhY2thZ2VdOwppZiAoaXNzZXQoJHRoaXMtPmFsaWFzTWFwW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldKSkgewokcGFja2FnZUFuZEFsaWFzZXMgKz0gJHRoaXMtPmFsaWFzTWFwW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldOwp9CgokZm91bmQgPSBmYWxzZTsKZm9yZWFjaCAoJHBhY2thZ2VBbmRBbGlhc2VzIGFzICRwYWNrYWdlT3JBbGlhcykgewppZiAoQ29tcGlsaW5nTWF0Y2hlcjo6bWF0Y2goJGNvbnN0cmFpbnQsIENvbnN0cmFpbnQ6Ok9QX0VRLCAkcGFja2FnZU9yQWxpYXMtPmdldFZlcnNpb24oKSkpIHsKJGZvdW5kID0gdHJ1ZTsKfQp9CgppZiAoISRmb3VuZCkgewpmb3JlYWNoICgkcGFja2FnZUFuZEFsaWFzZXMgYXMgJGluZGV4ID0+ICRwYWNrYWdlT3JBbGlhcykgewp1bnNldCgkdGhpcy0+cGFja2FnZXNbJGluZGV4XSk7Cn0KfQp9Cn0KfQoKaWYgKCR0aGlzLT5ldmVudERpc3BhdGNoZXIgIT09IG51bGwpIHsKJHByZVBvb2xDcmVhdGVFdmVudCA9IG5ldyBQcmVQb29sQ3JlYXRlRXZlbnQoClBsdWdpbkV2ZW50czo6UFJFX1BPT0xfQ1JFQVRFLAokcmVwb3NpdG9yaWVzLAokcmVxdWVzdCwKJHRoaXMtPmFjY2VwdGFibGVTdGFiaWxpdGllcywKJHRoaXMtPnN0YWJpbGl0eUZsYWdzLAokdGhpcy0+cm9vdEFsaWFzZXMsCiR0aGlzLT5yb290UmVmZXJlbmNlcywKJHRoaXMtPnBhY2thZ2VzLAokdGhpcy0+dW5hY2NlcHRhYmxlRml4ZWRPckxvY2tlZFBhY2thZ2VzCik7CiR0aGlzLT5ldmVudERpc3BhdGNoZXItPmRpc3BhdGNoKCRwcmVQb29sQ3JlYXRlRXZlbnQtPmdldE5hbWUoKSwgJHByZVBvb2xDcmVhdGVFdmVudCk7CiR0aGlzLT5wYWNrYWdlcyA9ICRwcmVQb29sQ3JlYXRlRXZlbnQtPmdldFBhY2thZ2VzKCk7CiR0aGlzLT51bmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZXMgPSAkcHJlUG9vbENyZWF0ZUV2ZW50LT5nZXRVbmFjY2VwdGFibGVGaXhlZFBhY2thZ2VzKCk7Cn0KCiRwb29sID0gbmV3IFBvb2woJHRoaXMtPnBhY2thZ2VzLCAkdGhpcy0+dW5hY2NlcHRhYmxlRml4ZWRPckxvY2tlZFBhY2thZ2VzKTsKCiR0aGlzLT5hbGlhc01hcCA9IFtdOwokdGhpcy0+cGFja2FnZXNUb0xvYWQgPSBbXTsKJHRoaXMtPmxvYWRlZFBhY2thZ2VzID0gW107CiR0aGlzLT5sb2FkZWRQZXJSZXBvID0gW107CiR0aGlzLT5wYWNrYWdlcyA9IFtdOwokdGhpcy0+dW5hY2NlcHRhYmxlRml4ZWRPckxvY2tlZFBhY2thZ2VzID0gW107CiR0aGlzLT5tYXhFeHRlbmRlZFJlcXMgPSBbXTsKJHRoaXMtPnNraXBwZWRMb2FkID0gW107CiR0aGlzLT5pbmRleENvdW50ZXIgPSAwOwoKJHRoaXMtPmlvLT5kZWJ1ZygnQnVpbHQgcG9vbC4nKTsKCgoKJHBvb2wgPSAkdGhpcy0+cnVuU2VjdXJpdHlBZHZpc29yeUZpbHRlcigkcG9vbCwgJHJlcG9zaXRvcmllcywgJHJlcXVlc3QpOwokcG9vbCA9ICR0aGlzLT5ydW5PcHRpbWl6ZXIoJHJlcXVlc3QsICRwb29sKTsKCkludGVydmFsczo6Y2xlYXIoKTsKCnJldHVybiAkcG9vbDsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBtYXJrUGFja2FnZU5hbWVGb3JMb2FkaW5nKFJlcXVlc3QgJHJlcXVlc3QsIHN0cmluZyAkbmFtZSwgQ29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCk6IHZvaWQKewoKaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJG5hbWUpKSB7CnJldHVybjsKfQoKCgppZiAoaXNzZXQoJHRoaXMtPm1heEV4dGVuZGVkUmVxc1skbmFtZV0pKSB7CnJldHVybjsKfQoKCgoKCiRyb290UmVxdWlyZXMgPSAkcmVxdWVzdC0+Z2V0UmVxdWlyZXMoKTsKaWYgKGlzc2V0KCRyb290UmVxdWlyZXNbJG5hbWVdKSAmJiAhSW50ZXJ2YWxzOjppc1N1YnNldE9mKCRjb25zdHJhaW50LCAkcm9vdFJlcXVpcmVzWyRuYW1lXSkpIHsKJGNvbnN0cmFpbnQgPSAkcm9vdFJlcXVpcmVzWyRuYW1lXTsKfQoKCmlmICghaXNzZXQoJHRoaXMtPmxvYWRlZFBhY2thZ2VzWyRuYW1lXSkpIHsKCgoKaWYgKGlzc2V0KCR0aGlzLT5wYWNrYWdlc1RvTG9hZFskbmFtZV0pKSB7CgppZiAoSW50ZXJ2YWxzOjppc1N1YnNldE9mKCRjb25zdHJhaW50LCAkdGhpcy0+cGFja2FnZXNUb0xvYWRbJG5hbWVdKSkgewpyZXR1cm47Cn0KCgokY29uc3RyYWludCA9IEludGVydmFsczo6Y29tcGFjdENvbnN0cmFpbnQoTXVsdGlDb25zdHJhaW50OjpjcmVhdGUoWyR0aGlzLT5wYWNrYWdlc1RvTG9hZFskbmFtZV0sICRjb25zdHJhaW50XSwgZmFsc2UpKTsKfQoKJHRoaXMtPnBhY2thZ2VzVG9Mb2FkWyRuYW1lXSA9ICRjb25zdHJhaW50OwoKcmV0dXJuOwp9CgoKCmlmIChJbnRlcnZhbHM6OmlzU3Vic2V0T2YoJGNvbnN0cmFpbnQsICR0aGlzLT5sb2FkZWRQYWNrYWdlc1skbmFtZV0pKSB7CnJldHVybjsKfQoKCgoKJHRoaXMtPnBhY2thZ2VzVG9Mb2FkWyRuYW1lXSA9IEludGVydmFsczo6Y29tcGFjdENvbnN0cmFpbnQoTXVsdGlDb25zdHJhaW50OjpjcmVhdGUoWyR0aGlzLT5sb2FkZWRQYWNrYWdlc1skbmFtZV0sICRjb25zdHJhaW50XSwgZmFsc2UpKTsKdW5zZXQoJHRoaXMtPmxvYWRlZFBhY2thZ2VzWyRuYW1lXSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gbG9hZFBhY2thZ2VzTWFya2VkRm9yTG9hZGluZyhSZXF1ZXN0ICRyZXF1ZXN0LCBhcnJheSAkcmVwb3NpdG9yaWVzKTogdm9pZAp7CmZvcmVhY2ggKCR0aGlzLT5wYWNrYWdlc1RvTG9hZCBhcyAkbmFtZSA9PiAkY29uc3RyYWludCkgewppZiAoJHRoaXMtPnJlc3RyaWN0ZWRQYWNrYWdlc0xpc3QgIT09IG51bGwgJiYgIWlzc2V0KCR0aGlzLT5yZXN0cmljdGVkUGFja2FnZXNMaXN0WyRuYW1lXSkpIHsKdW5zZXQoJHRoaXMtPnBhY2thZ2VzVG9Mb2FkWyRuYW1lXSk7CmNvbnRpbnVlOwp9CiR0aGlzLT5sb2FkZWRQYWNrYWdlc1skbmFtZV0gPSAkY29uc3RyYWludDsKfQoKCiRwYWNrYWdlQmF0Y2hlcyA9IGFycmF5X2NodW5rKCR0aGlzLT5wYWNrYWdlc1RvTG9hZCwgc2VsZjo6TE9BRF9CQVRDSF9TSVpFLCB0cnVlKTsKJHRoaXMtPnBhY2thZ2VzVG9Mb2FkID0gW107Cgpmb3JlYWNoICgkcmVwb3NpdG9yaWVzIGFzICRyZXBvSW5kZXggPT4gJHJlcG9zaXRvcnkpIHsKCgppZiAoJHJlcG9zaXRvcnkgaW5zdGFuY2VvZiBQbGF0Zm9ybVJlcG9zaXRvcnkgfHwgJHJlcG9zaXRvcnkgPT09ICRyZXF1ZXN0LT5nZXRMb2NrZWRSZXBvc2l0b3J5KCkpIHsKY29udGludWU7Cn0KCmlmICgwID09PSBcY291bnQoJHBhY2thZ2VCYXRjaGVzKSkgewpicmVhazsKfQoKZm9yZWFjaCAoJHBhY2thZ2VCYXRjaGVzIGFzICRiYXRjaEluZGV4ID0+ICRwYWNrYWdlQmF0Y2gpIHsKJHJlc3VsdCA9ICRyZXBvc2l0b3J5LT5sb2FkUGFja2FnZXMoJHBhY2thZ2VCYXRjaCwgJHRoaXMtPmFjY2VwdGFibGVTdGFiaWxpdGllcywgJHRoaXMtPnN0YWJpbGl0eUZsYWdzLCAkdGhpcy0+bG9hZGVkUGVyUmVwb1skcmVwb0luZGV4XSA/PyBbXSk7Cgpmb3JlYWNoICgkcmVzdWx0WyduYW1lc0ZvdW5kJ10gYXMgJG5hbWUpIHsKCnVuc2V0KCRwYWNrYWdlQmF0Y2hlc1skYmF0Y2hJbmRleF1bJG5hbWVdKTsKfQpmb3JlYWNoICgkcmVzdWx0WydwYWNrYWdlcyddIGFzICRwYWNrYWdlKSB7CiR0aGlzLT5sb2FkZWRQZXJSZXBvWyRyZXBvSW5kZXhdWyRwYWNrYWdlLT5nZXROYW1lKCldWyRwYWNrYWdlLT5nZXRWZXJzaW9uKCldID0gJHBhY2thZ2U7CgppZiAoaW5fYXJyYXkoJHBhY2thZ2UtPmdldFR5cGUoKSwgJHRoaXMtPmlnbm9yZWRUeXBlcywgdHJ1ZSkgfHwgKCR0aGlzLT5hbGxvd2VkVHlwZXMgIT09IG51bGwgJiYgIWluX2FycmF5KCRwYWNrYWdlLT5nZXRUeXBlKCksICR0aGlzLT5hbGxvd2VkVHlwZXMsIHRydWUpKSkgewpjb250aW51ZTsKfQokdGhpcy0+bG9hZFBhY2thZ2UoJHJlcXVlc3QsICRyZXBvc2l0b3JpZXMsICRwYWNrYWdlLCAhaXNzZXQoJHRoaXMtPnBhdGhSZXBvVW5sb2NrZWRbJHBhY2thZ2UtPmdldE5hbWUoKV0pKTsKfQp9CgokcGFja2FnZUJhdGNoZXMgPSBhcnJheV9jaHVuayhhcnJheV9tZXJnZSguLi4kcGFja2FnZUJhdGNoZXMpLCBzZWxmOjpMT0FEX0JBVENIX1NJWkUsIHRydWUpOwp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gbG9hZFBhY2thZ2UoUmVxdWVzdCAkcmVxdWVzdCwgYXJyYXkgJHJlcG9zaXRvcmllcywgQmFzZVBhY2thZ2UgJHBhY2thZ2UsIGJvb2wgJHByb3BhZ2F0ZVVwZGF0ZSk6IHZvaWQKewokaW5kZXggPSAkdGhpcy0+aW5kZXhDb3VudGVyKys7CiR0aGlzLT5wYWNrYWdlc1skaW5kZXhdID0gJHBhY2thZ2U7CgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJHRoaXMtPmFsaWFzTWFwW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZS0+Z2V0QWxpYXNPZigpKV1bJGluZGV4XSA9ICRwYWNrYWdlOwp9CgokbmFtZSA9ICRwYWNrYWdlLT5nZXROYW1lKCk7CgoKCgppZiAoaXNzZXQoJHRoaXMtPnJvb3RSZWZlcmVuY2VzWyRuYW1lXSkpIHsKCmlmICghJHJlcXVlc3QtPmlzTG9ja2VkUGFja2FnZSgkcGFja2FnZSkgJiYgISRyZXF1ZXN0LT5pc0ZpeGVkUGFja2FnZSgkcGFja2FnZSkpIHsKJHBhY2thZ2UtPnNldFNvdXJjZURpc3RSZWZlcmVuY2VzKCR0aGlzLT5yb290UmVmZXJlbmNlc1skbmFtZV0pOwp9Cn0KCgoKCgoKaWYgKCgkcHJvcGFnYXRlVXBkYXRlIHx8IGlzc2V0KCR0aGlzLT5wYXRoUmVwb1VubG9ja2VkWyRwYWNrYWdlLT5nZXROYW1lKCldKSkgJiYgaXNzZXQoJHRoaXMtPnJvb3RBbGlhc2VzWyRuYW1lXVskcGFja2FnZS0+Z2V0VmVyc2lvbigpXSkpIHsKJGFsaWFzID0gJHRoaXMtPnJvb3RBbGlhc2VzWyRuYW1lXVskcGFja2FnZS0+Z2V0VmVyc2lvbigpXTsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiRiYXNlUGFja2FnZSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7Cn0gZWxzZSB7CiRiYXNlUGFja2FnZSA9ICRwYWNrYWdlOwp9CmlmICgkYmFzZVBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2UpIHsKJGFsaWFzUGFja2FnZSA9IG5ldyBDb21wbGV0ZUFsaWFzUGFja2FnZSgkYmFzZVBhY2thZ2UsICRhbGlhc1snYWxpYXNfbm9ybWFsaXplZCddLCAkYWxpYXNbJ2FsaWFzJ10pOwp9IGVsc2UgewokYWxpYXNQYWNrYWdlID0gbmV3IEFsaWFzUGFja2FnZSgkYmFzZVBhY2thZ2UsICRhbGlhc1snYWxpYXNfbm9ybWFsaXplZCddLCAkYWxpYXNbJ2FsaWFzJ10pOwp9CiRhbGlhc1BhY2thZ2UtPnNldFJvb3RQYWNrYWdlQWxpYXModHJ1ZSk7CgokbmV3SW5kZXggPSAkdGhpcy0+aW5kZXhDb3VudGVyKys7CiR0aGlzLT5wYWNrYWdlc1skbmV3SW5kZXhdID0gJGFsaWFzUGFja2FnZTsKJHRoaXMtPmFsaWFzTWFwW3NwbF9vYmplY3RfaGFzaCgkYWxpYXNQYWNrYWdlLT5nZXRBbGlhc09mKCkpXVskbmV3SW5kZXhdID0gJGFsaWFzUGFja2FnZTsKfQoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcXVpcmVzKCkgYXMgJGxpbmspIHsKJHJlcXVpcmUgPSAkbGluay0+Z2V0VGFyZ2V0KCk7CiRsaW5rQ29uc3RyYWludCA9ICRsaW5rLT5nZXRDb25zdHJhaW50KCk7CgoKaWYgKGlzc2V0KCR0aGlzLT5za2lwcGVkTG9hZFskcmVxdWlyZV0pKSB7CgoKCmlmICgkcHJvcGFnYXRlVXBkYXRlICYmICRyZXF1ZXN0LT5nZXRVcGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMoKSkgewokc2tpcHBlZFJvb3RSZXF1aXJlcyA9ICR0aGlzLT5nZXRTa2lwcGVkUm9vdFJlcXVpcmVzKCRyZXF1ZXN0LCAkcmVxdWlyZSk7CgppZiAoJHJlcXVlc3QtPmdldFVwZGF0ZUFsbG93VHJhbnNpdGl2ZVJvb3REZXBlbmRlbmNpZXMoKSB8fCAwID09PSBcY291bnQoJHNraXBwZWRSb290UmVxdWlyZXMpKSB7CiR0aGlzLT51bmxvY2tQYWNrYWdlKCRyZXF1ZXN0LCAkcmVwb3NpdG9yaWVzLCAkcmVxdWlyZSk7CiR0aGlzLT5tYXJrUGFja2FnZU5hbWVGb3JMb2FkaW5nKCRyZXF1ZXN0LCAkcmVxdWlyZSwgJGxpbmtDb25zdHJhaW50KTsKfSBlbHNlIHsKZm9yZWFjaCAoJHNraXBwZWRSb290UmVxdWlyZXMgYXMgJHJvb3RSZXF1aXJlKSB7CmlmICghaXNzZXQoJHRoaXMtPnVwZGF0ZUFsbG93V2FybmVkWyRyb290UmVxdWlyZV0pKSB7CiR0aGlzLT51cGRhdGVBbGxvd1dhcm5lZFskcm9vdFJlcXVpcmVdID0gdHJ1ZTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5EZXBlbmRlbmN5ICcuJHJvb3RSZXF1aXJlLicgaXMgYWxzbyBhIHJvb3QgcmVxdWlyZW1lbnQuIFBhY2thZ2UgaGFzIG5vdCBiZWVuIGxpc3RlZCBhcyBhbiB1cGRhdGUgYXJndW1lbnQsIHNvIGtlZXBpbmcgbG9ja2VkIGF0IG9sZCB2ZXJzaW9uLiBVc2UgLS13aXRoLWFsbC1kZXBlbmRlbmNpZXMgKC1XKSB0byBpbmNsdWRlIHJvb3QgZGVwZW5kZW5jaWVzLjwvd2FybmluZz4nKTsKfQp9Cn0KfSBlbHNlaWYgKGlzc2V0KCR0aGlzLT5wYXRoUmVwb1VubG9ja2VkWyRyZXF1aXJlXSkgJiYgIWlzc2V0KCR0aGlzLT5sb2FkZWRQYWNrYWdlc1skcmVxdWlyZV0pKSB7CgoKJHRoaXMtPm1hcmtQYWNrYWdlTmFtZUZvckxvYWRpbmcoJHJlcXVlc3QsICRyZXF1aXJlLCAkbGlua0NvbnN0cmFpbnQpOwp9Cn0gZWxzZSB7CiR0aGlzLT5tYXJrUGFja2FnZU5hbWVGb3JMb2FkaW5nKCRyZXF1ZXN0LCAkcmVxdWlyZSwgJGxpbmtDb25zdHJhaW50KTsKfQp9CgoKCmlmICgkcHJvcGFnYXRlVXBkYXRlICYmICRyZXF1ZXN0LT5nZXRVcGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMoKSkgewpmb3JlYWNoICgkcGFja2FnZS0+Z2V0UmVwbGFjZXMoKSBhcyAkbGluaykgewokcmVwbGFjZSA9ICRsaW5rLT5nZXRUYXJnZXQoKTsKaWYgKGlzc2V0KCR0aGlzLT5sb2FkZWRQYWNrYWdlc1skcmVwbGFjZV0sICR0aGlzLT5za2lwcGVkTG9hZFskcmVwbGFjZV0pKSB7CiRza2lwcGVkUm9vdFJlcXVpcmVzID0gJHRoaXMtPmdldFNraXBwZWRSb290UmVxdWlyZXMoJHJlcXVlc3QsICRyZXBsYWNlKTsKCmlmICgkcmVxdWVzdC0+Z2V0VXBkYXRlQWxsb3dUcmFuc2l0aXZlUm9vdERlcGVuZGVuY2llcygpIHx8IDAgPT09IFxjb3VudCgkc2tpcHBlZFJvb3RSZXF1aXJlcykpIHsKJHRoaXMtPnVubG9ja1BhY2thZ2UoJHJlcXVlc3QsICRyZXBvc2l0b3JpZXMsICRyZXBsYWNlKTsKCiR0aGlzLT5tYXJrUGFja2FnZU5hbWVGb3JMb2FkaW5nSWZSZXF1aXJlZCgkcmVxdWVzdCwgJHJlcGxhY2UpOwp9IGVsc2Ugewpmb3JlYWNoICgkc2tpcHBlZFJvb3RSZXF1aXJlcyBhcyAkcm9vdFJlcXVpcmUpIHsKaWYgKCFpc3NldCgkdGhpcy0+dXBkYXRlQWxsb3dXYXJuZWRbJHJvb3RSZXF1aXJlXSkpIHsKJHRoaXMtPnVwZGF0ZUFsbG93V2FybmVkWyRyb290UmVxdWlyZV0gPSB0cnVlOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkRlcGVuZGVuY3kgJy4kcm9vdFJlcXVpcmUuJyBpcyBhbHNvIGEgcm9vdCByZXF1aXJlbWVudC4gUGFja2FnZSBoYXMgbm90IGJlZW4gbGlzdGVkIGFzIGFuIHVwZGF0ZSBhcmd1bWVudCwgc28ga2VlcGluZyBsb2NrZWQgYXQgb2xkIHZlcnNpb24uIFVzZSAtLXdpdGgtYWxsLWRlcGVuZGVuY2llcyAoLVcpIHRvIGluY2x1ZGUgcm9vdCBkZXBlbmRlbmNpZXMuPC93YXJuaW5nPicpOwp9Cn0KfQp9Cn0KfQp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gaXNSb290UmVxdWlyZShSZXF1ZXN0ICRyZXF1ZXN0LCBzdHJpbmcgJG5hbWUpOiBib29sCnsKJHJvb3RSZXF1aXJlcyA9ICRyZXF1ZXN0LT5nZXRSZXF1aXJlcygpOwoKcmV0dXJuIGlzc2V0KCRyb290UmVxdWlyZXNbJG5hbWVdKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRTa2lwcGVkUm9vdFJlcXVpcmVzKFJlcXVlc3QgJHJlcXVlc3QsIHN0cmluZyAkbmFtZSk6IGFycmF5CnsKaWYgKCFpc3NldCgkdGhpcy0+c2tpcHBlZExvYWRbJG5hbWVdKSkgewpyZXR1cm4gW107Cn0KCiRyb290UmVxdWlyZXMgPSAkcmVxdWVzdC0+Z2V0UmVxdWlyZXMoKTsKJG1hdGNoZXMgPSBbXTsKCmlmIChpc3NldCgkcm9vdFJlcXVpcmVzWyRuYW1lXSkpIHsKcmV0dXJuIGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpIHVzZSAoJG5hbWUpOiBzdHJpbmcgewppZiAoJG5hbWUgIT09ICRwYWNrYWdlLT5nZXROYW1lKCkpIHsKcmV0dXJuICRwYWNrYWdlLT5nZXROYW1lKCkgLicgKHZpYSByZXBsYWNlIG9mICcuJG5hbWUuJyknOwp9CgpyZXR1cm4gJHBhY2thZ2UtPmdldE5hbWUoKTsKfSwgJHRoaXMtPnNraXBwZWRMb2FkWyRuYW1lXSk7Cn0KCmZvcmVhY2ggKCR0aGlzLT5za2lwcGVkTG9hZFskbmFtZV0gYXMgJHBhY2thZ2VPclJlcGxhY2VyKSB7CmlmIChpc3NldCgkcm9vdFJlcXVpcmVzWyRwYWNrYWdlT3JSZXBsYWNlci0+Z2V0TmFtZSgpXSkpIHsKJG1hdGNoZXNbXSA9ICRwYWNrYWdlT3JSZXBsYWNlci0+Z2V0TmFtZSgpOwp9CmZvcmVhY2ggKCRwYWNrYWdlT3JSZXBsYWNlci0+Z2V0UmVwbGFjZXMoKSBhcyAkbGluaykgewppZiAoaXNzZXQoJHJvb3RSZXF1aXJlc1skbGluay0+Z2V0VGFyZ2V0KCldKSkgewppZiAoJG5hbWUgIT09ICRwYWNrYWdlT3JSZXBsYWNlci0+Z2V0TmFtZSgpKSB7CiRtYXRjaGVzW10gPSAkcGFja2FnZU9yUmVwbGFjZXItPmdldE5hbWUoKSAuJyAodmlhIHJlcGxhY2Ugb2YgJy4kbmFtZS4nKSc7Cn0gZWxzZSB7CiRtYXRjaGVzW10gPSAkcGFja2FnZU9yUmVwbGFjZXItPmdldE5hbWUoKTsKfQpicmVhazsKfQp9Cn0KCnJldHVybiAkbWF0Y2hlczsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpc1VwZGF0ZUFsbG93ZWQoQmFzZVBhY2thZ2UgJHBhY2thZ2UpOiBib29sCnsKZm9yZWFjaCAoJHRoaXMtPnVwZGF0ZUFsbG93TGlzdCBhcyAkcGF0dGVybikgewokcGF0dGVyblJlZ2V4cCA9IEJhc2VQYWNrYWdlOjpwYWNrYWdlTmFtZVRvUmVnZXhwKCRwYXR0ZXJuKTsKaWYgKFByZWc6OmlzTWF0Y2goJHBhdHRlcm5SZWdleHAsICRwYWNrYWdlLT5nZXROYW1lKCkpKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiB3YXJuQWJvdXROb25NYXRjaGluZ1VwZGF0ZUFsbG93TGlzdChSZXF1ZXN0ICRyZXF1ZXN0KTogdm9pZAp7CmlmIChudWxsID09PSAkcmVxdWVzdC0+Z2V0TG9ja2VkUmVwb3NpdG9yeSgpKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ05vIGxvY2sgcmVwbyBwcmVzZW50IGFuZCB5ZXQgYSBwYXJ0aWFsIHVwZGF0ZSB3YXMgcmVxdWVzdGVkLicpOwp9Cgpmb3JlYWNoICgkdGhpcy0+dXBkYXRlQWxsb3dMaXN0IGFzICRwYXR0ZXJuKSB7CiRtYXRjaGVkUGxhdGZvcm1QYWNrYWdlID0gZmFsc2U7CgokcGF0dGVyblJlZ2V4cCA9IEJhc2VQYWNrYWdlOjpwYWNrYWdlTmFtZVRvUmVnZXhwKCRwYXR0ZXJuKTsKCmZvcmVhY2ggKCRyZXF1ZXN0LT5nZXRMb2NrZWRSZXBvc2l0b3J5KCktPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKFByZWc6OmlzTWF0Y2goJHBhdHRlcm5SZWdleHAsICRwYWNrYWdlLT5nZXROYW1lKCkpKSB7CmNvbnRpbnVlIDI7Cn0KfQoKZm9yZWFjaCAoJHJlcXVlc3QtPmdldFJlcXVpcmVzKCkgYXMgJHBhY2thZ2VOYW1lID0+ICRjb25zdHJhaW50KSB7CmlmIChQcmVnOjppc01hdGNoKCRwYXR0ZXJuUmVnZXhwLCAkcGFja2FnZU5hbWUpKSB7CmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRwYWNrYWdlTmFtZSkpIHsKJG1hdGNoZWRQbGF0Zm9ybVBhY2thZ2UgPSB0cnVlOwpjb250aW51ZTsKfQpjb250aW51ZSAyOwp9Cn0KaWYgKCRtYXRjaGVkUGxhdGZvcm1QYWNrYWdlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+UGF0dGVybiAiJyAuICRwYXR0ZXJuIC4gJyIgbGlzdGVkIGZvciB1cGRhdGUgbWF0Y2hlcyBwbGF0Zm9ybSBwYWNrYWdlcywgYnV0IHRoZXNlIGNhbm5vdCBiZSB1cGRhdGVkIGJ5IENvbXBvc2VyLjwvd2FybmluZz4nKTsKfSBlbHNlaWYgKHN0cnBvcygkcGF0dGVybiwgJyonKSAhPT0gZmFsc2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5QYXR0ZXJuICInIC4gJHBhdHRlcm4gLiAnIiBsaXN0ZWQgZm9yIHVwZGF0ZSBkb2VzIG5vdCBtYXRjaCBhbnkgbG9ja2VkIHBhY2thZ2VzLjwvd2FybmluZz4nKTsKfSBlbHNlIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5QYWNrYWdlICInIC4gJHBhdHRlcm4gLiAnIiBsaXN0ZWQgZm9yIHVwZGF0ZSBpcyBub3QgbG9ja2VkLjwvd2FybmluZz4nKTsKfQp9Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gdW5sb2NrUGFja2FnZShSZXF1ZXN0ICRyZXF1ZXN0LCBhcnJheSAkcmVwb3NpdG9yaWVzLCBzdHJpbmcgJG5hbWUpOiB2b2lkCnsKZm9yZWFjaCAoJHRoaXMtPnNraXBwZWRMb2FkWyRuYW1lXSBhcyAkcGFja2FnZU9yUmVwbGFjZXIpIHsKCgppZiAoJHBhY2thZ2VPclJlcGxhY2VyLT5nZXROYW1lKCkgIT09ICRuYW1lICYmIGlzc2V0KCR0aGlzLT5za2lwcGVkTG9hZFskcGFja2FnZU9yUmVwbGFjZXItPmdldE5hbWUoKV0pKSB7CiRyZXBsYWNlck5hbWUgPSAkcGFja2FnZU9yUmVwbGFjZXItPmdldE5hbWUoKTsKaWYgKCRyZXF1ZXN0LT5nZXRVcGRhdGVBbGxvd1RyYW5zaXRpdmVSb290RGVwZW5kZW5jaWVzKCkgfHwgKCEkdGhpcy0+aXNSb290UmVxdWlyZSgkcmVxdWVzdCwgJG5hbWUpICYmICEkdGhpcy0+aXNSb290UmVxdWlyZSgkcmVxdWVzdCwgJHJlcGxhY2VyTmFtZSkpKSB7CiR0aGlzLT51bmxvY2tQYWNrYWdlKCRyZXF1ZXN0LCAkcmVwb3NpdG9yaWVzLCAkcmVwbGFjZXJOYW1lKTsKCmlmICgkdGhpcy0+aXNSb290UmVxdWlyZSgkcmVxdWVzdCwgJHJlcGxhY2VyTmFtZSkpIHsKJHRoaXMtPm1hcmtQYWNrYWdlTmFtZUZvckxvYWRpbmcoJHJlcXVlc3QsICRyZXBsYWNlck5hbWUsIG5ldyBNYXRjaEFsbENvbnN0cmFpbnQpOwp9IGVsc2Ugewpmb3JlYWNoICgkdGhpcy0+cGFja2FnZXMgYXMgJGxvYWRlZFBhY2thZ2UpIHsKJHJlcXVpcmVzID0gJGxvYWRlZFBhY2thZ2UtPmdldFJlcXVpcmVzKCk7CmlmIChpc3NldCgkcmVxdWlyZXNbJHJlcGxhY2VyTmFtZV0pKSB7CiR0aGlzLT5tYXJrUGFja2FnZU5hbWVGb3JMb2FkaW5nKCRyZXF1ZXN0LCAkcmVwbGFjZXJOYW1lLCAkcmVxdWlyZXNbJHJlcGxhY2VyTmFtZV0tPmdldENvbnN0cmFpbnQoKSk7Cn0KfQp9Cn0KfQp9CgppZiAoaXNzZXQoJHRoaXMtPnBhdGhSZXBvVW5sb2NrZWRbJG5hbWVdKSkgewpmb3JlYWNoICgkdGhpcy0+cGFja2FnZXMgYXMgJGluZGV4ID0+ICRwYWNrYWdlKSB7CmlmICgkcGFja2FnZS0+Z2V0TmFtZSgpID09PSAkbmFtZSkgewokdGhpcy0+cmVtb3ZlTG9hZGVkUGFja2FnZSgkcmVxdWVzdCwgJHJlcG9zaXRvcmllcywgJHBhY2thZ2UsICRpbmRleCk7Cn0KfQp9Cgp1bnNldCgkdGhpcy0+c2tpcHBlZExvYWRbJG5hbWVdLCAkdGhpcy0+bG9hZGVkUGFja2FnZXNbJG5hbWVdLCAkdGhpcy0+bWF4RXh0ZW5kZWRSZXFzWyRuYW1lXSwgJHRoaXMtPnBhdGhSZXBvVW5sb2NrZWRbJG5hbWVdKTsKCgpmb3JlYWNoICgkcmVxdWVzdC0+Z2V0TG9ja2VkUGFja2FnZXMoKSBhcyAkbG9ja2VkUGFja2FnZSkgewppZiAoISgkbG9ja2VkUGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgJiYgJGxvY2tlZFBhY2thZ2UtPmdldE5hbWUoKSA9PT0gJG5hbWUpIHsKaWYgKGZhbHNlICE9PSAkaW5kZXggPSBhcnJheV9zZWFyY2goJGxvY2tlZFBhY2thZ2UsICR0aGlzLT5wYWNrYWdlcywgdHJ1ZSkpIHsKJHJlcXVlc3QtPnVubG9ja1BhY2thZ2UoJGxvY2tlZFBhY2thZ2UpOwokdGhpcy0+cmVtb3ZlTG9hZGVkUGFja2FnZSgkcmVxdWVzdCwgJHJlcG9zaXRvcmllcywgJGxvY2tlZFBhY2thZ2UsICRpbmRleCk7CgoKCgoKCmZvcmVhY2ggKCRyZXF1ZXN0LT5nZXRGaXhlZE9yTG9ja2VkUGFja2FnZXMoKSBhcyAkZml4ZWRPckxvY2tlZFBhY2thZ2UpIHsKaWYgKCRmaXhlZE9yTG9ja2VkUGFja2FnZSA9PT0gJGxvY2tlZFBhY2thZ2UpIHsKY29udGludWU7Cn0KCmlmIChpc3NldCgkdGhpcy0+c2tpcHBlZExvYWRbJGZpeGVkT3JMb2NrZWRQYWNrYWdlLT5nZXROYW1lKCldKSkgewokcmVxdWlyZXMgPSAkZml4ZWRPckxvY2tlZFBhY2thZ2UtPmdldFJlcXVpcmVzKCk7CmlmIChpc3NldCgkcmVxdWlyZXNbJGxvY2tlZFBhY2thZ2UtPmdldE5hbWUoKV0pKSB7CiR0aGlzLT5tYXJrUGFja2FnZU5hbWVGb3JMb2FkaW5nKCRyZXF1ZXN0LCAkbG9ja2VkUGFja2FnZS0+Z2V0TmFtZSgpLCAkcmVxdWlyZXNbJGxvY2tlZFBhY2thZ2UtPmdldE5hbWUoKV0tPmdldENvbnN0cmFpbnQoKSk7Cn0KCmZvcmVhY2ggKCRsb2NrZWRQYWNrYWdlLT5nZXRSZXBsYWNlcygpIGFzICRyZXBsYWNlKSB7CmlmIChpc3NldCgkcmVxdWlyZXNbJHJlcGxhY2UtPmdldFRhcmdldCgpXSwgJHRoaXMtPnNraXBwZWRMb2FkWyRyZXBsYWNlLT5nZXRUYXJnZXQoKV0pKSB7CiR0aGlzLT51bmxvY2tQYWNrYWdlKCRyZXF1ZXN0LCAkcmVwb3NpdG9yaWVzLCAkcmVwbGFjZS0+Z2V0VGFyZ2V0KCkpOwoKJHRoaXMtPm1hcmtQYWNrYWdlTmFtZUZvckxvYWRpbmcoJHJlcXVlc3QsICRyZXBsYWNlLT5nZXRUYXJnZXQoKSwgJHJlcGxhY2UtPmdldENvbnN0cmFpbnQoKSk7Cn0KfQp9Cn0KfQp9Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBtYXJrUGFja2FnZU5hbWVGb3JMb2FkaW5nSWZSZXF1aXJlZChSZXF1ZXN0ICRyZXF1ZXN0LCBzdHJpbmcgJG5hbWUpOiB2b2lkCnsKaWYgKCR0aGlzLT5pc1Jvb3RSZXF1aXJlKCRyZXF1ZXN0LCAkbmFtZSkpIHsKJHRoaXMtPm1hcmtQYWNrYWdlTmFtZUZvckxvYWRpbmcoJHJlcXVlc3QsICRuYW1lLCAkcmVxdWVzdC0+Z2V0UmVxdWlyZXMoKVskbmFtZV0pOwp9Cgpmb3JlYWNoICgkdGhpcy0+cGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcXVpcmVzKCkgYXMgJGxpbmspIHsKaWYgKCRuYW1lID09PSAkbGluay0+Z2V0VGFyZ2V0KCkpIHsKJHRoaXMtPm1hcmtQYWNrYWdlTmFtZUZvckxvYWRpbmcoJHJlcXVlc3QsICRsaW5rLT5nZXRUYXJnZXQoKSwgJGxpbmstPmdldENvbnN0cmFpbnQoKSk7Cn0KfQp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVtb3ZlTG9hZGVkUGFja2FnZShSZXF1ZXN0ICRyZXF1ZXN0LCBhcnJheSAkcmVwb3NpdG9yaWVzLCBCYXNlUGFja2FnZSAkcGFja2FnZSwgaW50ICRpbmRleCk6IHZvaWQKewokcmVwb0luZGV4ID0gYXJyYXlfc2VhcmNoKCRwYWNrYWdlLT5nZXRSZXBvc2l0b3J5KCksICRyZXBvc2l0b3JpZXMsIHRydWUpOwoKdW5zZXQoJHRoaXMtPmxvYWRlZFBlclJlcG9bJHJlcG9JbmRleF1bJHBhY2thZ2UtPmdldE5hbWUoKV1bJHBhY2thZ2UtPmdldFZlcnNpb24oKV0pOwp1bnNldCgkdGhpcy0+cGFja2FnZXNbJGluZGV4XSk7CmlmIChpc3NldCgkdGhpcy0+YWxpYXNNYXBbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0pKSB7CmZvcmVhY2ggKCR0aGlzLT5hbGlhc01hcFtzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSBhcyAkYWxpYXNJbmRleCA9PiAkYWxpYXNQYWNrYWdlKSB7CnVuc2V0KCR0aGlzLT5sb2FkZWRQZXJSZXBvWyRyZXBvSW5kZXhdWyRhbGlhc1BhY2thZ2UtPmdldE5hbWUoKV1bJGFsaWFzUGFja2FnZS0+Z2V0VmVyc2lvbigpXSk7CnVuc2V0KCR0aGlzLT5wYWNrYWdlc1skYWxpYXNJbmRleF0pOwp9CnVuc2V0KCR0aGlzLT5hbGlhc01hcFtzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSk7Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBydW5PcHRpbWl6ZXIoUmVxdWVzdCAkcmVxdWVzdCwgUG9vbCAkcG9vbCk6IFBvb2wKewppZiAobnVsbCA9PT0gJHRoaXMtPnBvb2xPcHRpbWl6ZXIpIHsKcmV0dXJuICRwb29sOwp9CgokdGhpcy0+aW8tPmRlYnVnKCdSdW5uaW5nIHBvb2wgb3B0aW1pemVyLicpOwoKJGJlZm9yZSA9IG1pY3JvdGltZSh0cnVlKTsKJHRvdGFsID0gXGNvdW50KCRwb29sLT5nZXRQYWNrYWdlcygpKTsKCiRwb29sID0gJHRoaXMtPnBvb2xPcHRpbWl6ZXItPm9wdGltaXplKCRyZXF1ZXN0LCAkcG9vbCk7CgokZmlsdGVyZWQgPSAkdG90YWwgLSBcY291bnQoJHBvb2wtPmdldFBhY2thZ2VzKCkpOwoKaWYgKDAgPT09ICRmaWx0ZXJlZCkgewpyZXR1cm4gJHBvb2w7Cn0KCiR0aGlzLT5pby0+d3JpdGUoc3ByaW50ZignUG9vbCBvcHRpbWl6ZXIgY29tcGxldGVkIGluICUuM2Ygc2Vjb25kcycsIG1pY3JvdGltZSh0cnVlKSAtICRiZWZvcmUpLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSWV9WRVJCT1NFKTsKJHRoaXMtPmlvLT53cml0ZShzcHJpbnRmKAonPGluZm8+Rm91bmQgJXMgcGFja2FnZSB2ZXJzaW9ucyByZWZlcmVuY2VkIGluIHlvdXIgZGVwZW5kZW5jeSBncmFwaC4gJXMgKCVkJSUpIHdlcmUgb3B0aW1pemVkIGF3YXkuPC9pbmZvPicsCm51bWJlcl9mb3JtYXQoJHRvdGFsKSwKbnVtYmVyX2Zvcm1hdCgkZmlsdGVyZWQpLApyb3VuZCgxMDAgLyAkdG90YWwgKiAkZmlsdGVyZWQpCiksIHRydWUsIElPSW50ZXJmYWNlOjpWRVJZX1ZFUkJPU0UpOwoKcmV0dXJuICRwb29sOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJ1blNlY3VyaXR5QWR2aXNvcnlGaWx0ZXIoUG9vbCAkcG9vbCwgYXJyYXkgJHJlcG9zaXRvcmllcywgUmVxdWVzdCAkcmVxdWVzdCk6IFBvb2wKewppZiAobnVsbCA9PT0gJHRoaXMtPnNlY3VyaXR5QWR2aXNvcnlQb29sRmlsdGVyKSB7CnJldHVybiAkcG9vbDsKfQoKJHRoaXMtPmlvLT5kZWJ1ZygnUnVubmluZyBzZWN1cml0eSBhZHZpc29yeSBwb29sIGZpbHRlci4nKTsKCiRiZWZvcmUgPSBtaWNyb3RpbWUodHJ1ZSk7CiR0b3RhbCA9IFxjb3VudCgkcG9vbC0+Z2V0UGFja2FnZXMoKSk7CgokcG9vbCA9ICR0aGlzLT5zZWN1cml0eUFkdmlzb3J5UG9vbEZpbHRlci0+ZmlsdGVyKCRwb29sLCAkcmVwb3NpdG9yaWVzLCAkcmVxdWVzdCk7CgokZmlsdGVyZWQgPSAkdG90YWwgLSBcY291bnQoJHBvb2wtPmdldFBhY2thZ2VzKCkpOwoKaWYgKDAgPT09ICRmaWx0ZXJlZCkgewpyZXR1cm4gJHBvb2w7Cn0KCiR0aGlzLT5pby0+d3JpdGUoc3ByaW50ZignU2VjdXJpdHkgYWR2aXNvcnkgcG9vbCBmaWx0ZXIgY29tcGxldGVkIGluICUuM2Ygc2Vjb25kcycsIG1pY3JvdGltZSh0cnVlKSAtICRiZWZvcmUpLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSWV9WRVJCT1NFKTsKJHRoaXMtPmlvLT53cml0ZShzcHJpbnRmKAonPGluZm8+Rm91bmQgJXMgcGFja2FnZSB2ZXJzaW9ucyByZWZlcmVuY2VkIGluIHlvdXIgZGVwZW5kZW5jeSBncmFwaC4gJXMgKCVkJSUpIHdlcmUgZmlsdGVyZWQgYXdheS48L2luZm8+JywKbnVtYmVyX2Zvcm1hdCgkdG90YWwpLApudW1iZXJfZm9ybWF0KCRmaWx0ZXJlZCksCnJvdW5kKDEwMCAvICR0b3RhbCAqICRmaWx0ZXJlZCkKKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUllfVkVSQk9TRSk7CgpyZXR1cm4gJHBvb2w7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbXBpbGluZ01hdGNoZXI7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE11bHRpQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxJbnRlcnZhbHM7CgoKCgoKCmNsYXNzIFBvb2xPcHRpbWl6ZXIKewoKCgpwcml2YXRlICRwb2xpY3k7CgoKCgpwcml2YXRlICRpcnJlbW92YWJsZVBhY2thZ2VzID0gW107CgoKCgpwcml2YXRlICRyZXF1aXJlQ29uc3RyYWludHNQZXJQYWNrYWdlID0gW107CgoKCgpwcml2YXRlICRjb25mbGljdENvbnN0cmFpbnRzUGVyUGFja2FnZSA9IFtdOwoKCgoKcHJpdmF0ZSAkcGFja2FnZXNUb1JlbW92ZSA9IFtdOwoKCgoKcHJpdmF0ZSAkYWxpYXNlc1BlclBhY2thZ2UgPSBbXTsKCgoKCnByaXZhdGUgJHJlbW92ZWRWZXJzaW9uc0J5UGFja2FnZSA9IFtdOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFBvbGljeUludGVyZmFjZSAkcG9saWN5KQp7CiR0aGlzLT5wb2xpY3kgPSAkcG9saWN5Owp9CgpwdWJsaWMgZnVuY3Rpb24gb3B0aW1pemUoUmVxdWVzdCAkcmVxdWVzdCwgUG9vbCAkcG9vbCk6IFBvb2wKewokdGhpcy0+cHJlcGFyZSgkcmVxdWVzdCwgJHBvb2wpOwoKJHRoaXMtPm9wdGltaXplQnlJZGVudGljYWxEZXBlbmRlbmNpZXMoJHJlcXVlc3QsICRwb29sKTsKCiR0aGlzLT5vcHRpbWl6ZUltcG9zc2libGVQYWNrYWdlc0F3YXkoJHJlcXVlc3QsICRwb29sKTsKCiRvcHRpbWl6ZWRQb29sID0gJHRoaXMtPmFwcGx5UmVtb3ZhbHNUb1Bvb2woJHBvb2wpOwoKCgoKCgokdGhpcy0+aXJyZW1vdmFibGVQYWNrYWdlcyA9IFtdOwokdGhpcy0+cmVxdWlyZUNvbnN0cmFpbnRzUGVyUGFja2FnZSA9IFtdOwokdGhpcy0+Y29uZmxpY3RDb25zdHJhaW50c1BlclBhY2thZ2UgPSBbXTsKJHRoaXMtPnBhY2thZ2VzVG9SZW1vdmUgPSBbXTsKJHRoaXMtPmFsaWFzZXNQZXJQYWNrYWdlID0gW107CiR0aGlzLT5yZW1vdmVkVmVyc2lvbnNCeVBhY2thZ2UgPSBbXTsKCnJldHVybiAkb3B0aW1pemVkUG9vbDsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBwcmVwYXJlKFJlcXVlc3QgJHJlcXVlc3QsIFBvb2wgJHBvb2wpOiB2b2lkCnsKJGlycmVtb3ZhYmxlUGFja2FnZUNvbnN0cmFpbnRHcm91cHMgPSBbXTsKCgpmb3JlYWNoICgkcmVxdWVzdC0+Z2V0Rml4ZWRPckxvY2tlZFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKJGlycmVtb3ZhYmxlUGFja2FnZUNvbnN0cmFpbnRHcm91cHNbJHBhY2thZ2UtPmdldE5hbWUoKV1bXSA9IG5ldyBDb25zdHJhaW50KCc9PScsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkpOwp9CgoKZm9yZWFjaCAoJHJlcXVlc3QtPmdldFJlcXVpcmVzKCkgYXMgJHJlcXVpcmUgPT4gJGNvbnN0cmFpbnQpIHsKJHRoaXMtPmV4dHJhY3RSZXF1aXJlQ29uc3RyYWludHNQZXJQYWNrYWdlKCRyZXF1aXJlLCAkY29uc3RyYWludCk7Cn0KCgpmb3JlYWNoICgkcG9vbC0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcXVpcmVzKCkgYXMgJGxpbmspIHsKJHRoaXMtPmV4dHJhY3RSZXF1aXJlQ29uc3RyYWludHNQZXJQYWNrYWdlKCRsaW5rLT5nZXRUYXJnZXQoKSwgJGxpbmstPmdldENvbnN0cmFpbnQoKSk7Cn0KCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRDb25mbGljdHMoKSBhcyAkbGluaykgewokdGhpcy0+ZXh0cmFjdENvbmZsaWN0Q29uc3RyYWludHNQZXJQYWNrYWdlKCRsaW5rLT5nZXRUYXJnZXQoKSwgJGxpbmstPmdldENvbnN0cmFpbnQoKSk7Cn0KCgoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiR0aGlzLT5hbGlhc2VzUGVyUGFja2FnZVskcGFja2FnZS0+Z2V0QWxpYXNPZigpLT5pZF1bXSA9ICRwYWNrYWdlOwp9Cn0KCiRpcnJlbW92YWJsZVBhY2thZ2VDb25zdHJhaW50cyA9IFtdOwpmb3JlYWNoICgkaXJyZW1vdmFibGVQYWNrYWdlQ29uc3RyYWludEdyb3VwcyBhcyAkcGFja2FnZU5hbWUgPT4gJGNvbnN0cmFpbnRzKSB7CiRpcnJlbW92YWJsZVBhY2thZ2VDb25zdHJhaW50c1skcGFja2FnZU5hbWVdID0gMSA9PT0gXGNvdW50KCRjb25zdHJhaW50cykgPyAkY29uc3RyYWludHNbMF0gOiBuZXcgTXVsdGlDb25zdHJhaW50KCRjb25zdHJhaW50cywgZmFsc2UpOwp9CnVuc2V0KCRpcnJlbW92YWJsZVBhY2thZ2VDb25zdHJhaW50R3JvdXBzKTsKCgpmb3JlYWNoICgkcG9vbC0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoIWlzc2V0KCRpcnJlbW92YWJsZVBhY2thZ2VDb25zdHJhaW50c1skcGFja2FnZS0+Z2V0TmFtZSgpXSkpIHsKY29udGludWU7Cn0KCmlmIChDb21waWxpbmdNYXRjaGVyOjptYXRjaCgkaXJyZW1vdmFibGVQYWNrYWdlQ29uc3RyYWludHNbJHBhY2thZ2UtPmdldE5hbWUoKV0sIENvbnN0cmFpbnQ6Ok9QX0VRLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKSkgewokdGhpcy0+bWFya1BhY2thZ2VJcnJlbW92YWJsZSgkcGFja2FnZSk7Cn0KfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIG1hcmtQYWNrYWdlSXJyZW1vdmFibGUoQmFzZVBhY2thZ2UgJHBhY2thZ2UpOiB2b2lkCnsKJHRoaXMtPmlycmVtb3ZhYmxlUGFja2FnZXNbJHBhY2thZ2UtPmlkXSA9IHRydWU7CmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewoKCiR0aGlzLT5tYXJrUGFja2FnZUlycmVtb3ZhYmxlKCRwYWNrYWdlLT5nZXRBbGlhc09mKCkpOwp9CmlmIChpc3NldCgkdGhpcy0+YWxpYXNlc1BlclBhY2thZ2VbJHBhY2thZ2UtPmlkXSkpIHsKZm9yZWFjaCAoJHRoaXMtPmFsaWFzZXNQZXJQYWNrYWdlWyRwYWNrYWdlLT5pZF0gYXMgJGFsaWFzUGFja2FnZSkgewokdGhpcy0+aXJyZW1vdmFibGVQYWNrYWdlc1skYWxpYXNQYWNrYWdlLT5pZF0gPSB0cnVlOwp9Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBhcHBseVJlbW92YWxzVG9Qb29sKFBvb2wgJHBvb2wpOiBQb29sCnsKJHBhY2thZ2VzID0gW107CiRyZW1vdmVkVmVyc2lvbnMgPSBbXTsKZm9yZWFjaCAoJHBvb2wtPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKCFpc3NldCgkdGhpcy0+cGFja2FnZXNUb1JlbW92ZVskcGFja2FnZS0+aWRdKSkgewokcGFja2FnZXNbXSA9ICRwYWNrYWdlOwp9IGVsc2UgewokcmVtb3ZlZFZlcnNpb25zWyRwYWNrYWdlLT5nZXROYW1lKCldWyRwYWNrYWdlLT5nZXRWZXJzaW9uKCldID0gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKfQp9Cgokb3B0aW1pemVkUG9vbCA9IG5ldyBQb29sKCRwYWNrYWdlcywgJHBvb2wtPmdldFVuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlcygpLCAkcmVtb3ZlZFZlcnNpb25zLCAkdGhpcy0+cmVtb3ZlZFZlcnNpb25zQnlQYWNrYWdlLCAkcG9vbC0+Z2V0QWxsU2VjdXJpdHlSZW1vdmVkUGFja2FnZVZlcnNpb25zKCksICRwb29sLT5nZXRBbGxBYmFuZG9uZWRSZW1vdmVkUGFja2FnZVZlcnNpb25zKCkpOwoKcmV0dXJuICRvcHRpbWl6ZWRQb29sOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIG9wdGltaXplQnlJZGVudGljYWxEZXBlbmRlbmNpZXMoUmVxdWVzdCAkcmVxdWVzdCwgUG9vbCAkcG9vbCk6IHZvaWQKewokaWRlbnRpY2FsRGVmaW5pdGlvbnNQZXJQYWNrYWdlID0gW107CiRwYWNrYWdlSWRlbnRpY2FsRGVmaW5pdGlvbkxvb2t1cCA9IFtdOwoKZm9yZWFjaCAoJHBvb2wtPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKCgoKaWYgKGlzc2V0KCR0aGlzLT5pcnJlbW92YWJsZVBhY2thZ2VzWyRwYWNrYWdlLT5pZF0pKSB7CmNvbnRpbnVlOwp9CgokdGhpcy0+bWFya1BhY2thZ2VGb3JSZW1vdmFsKCRwYWNrYWdlLT5pZCk7CgokZGVwZW5kZW5jeUhhc2ggPSAkdGhpcy0+Y2FsY3VsYXRlRGVwZW5kZW5jeUhhc2goJHBhY2thZ2UpOwoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldE5hbWVzKGZhbHNlKSBhcyAkcGFja2FnZU5hbWUpIHsKaWYgKCFpc3NldCgkdGhpcy0+cmVxdWlyZUNvbnN0cmFpbnRzUGVyUGFja2FnZVskcGFja2FnZU5hbWVdKSkgewpjb250aW51ZTsKfQoKZm9yZWFjaCAoJHRoaXMtPnJlcXVpcmVDb25zdHJhaW50c1BlclBhY2thZ2VbJHBhY2thZ2VOYW1lXSBhcyAkcmVxdWlyZUNvbnN0cmFpbnQpIHsKJGdyb3VwSGFzaFBhcnRzID0gW107CgppZiAoQ29tcGlsaW5nTWF0Y2hlcjo6bWF0Y2goJHJlcXVpcmVDb25zdHJhaW50LCBDb25zdHJhaW50OjpPUF9FUSwgJHBhY2thZ2UtPmdldFZlcnNpb24oKSkpIHsKJGdyb3VwSGFzaFBhcnRzW10gPSAncmVxdWlyZTonIC4gKHN0cmluZykgJHJlcXVpcmVDb25zdHJhaW50Owp9CgppZiAoXGNvdW50KCRwYWNrYWdlLT5nZXRSZXBsYWNlcygpKSA+IDApIHsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcGxhY2VzKCkgYXMgJGxpbmspIHsKaWYgKENvbXBpbGluZ01hdGNoZXI6Om1hdGNoKCRsaW5rLT5nZXRDb25zdHJhaW50KCksIENvbnN0cmFpbnQ6Ok9QX0VRLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKSkgewoKJGdyb3VwSGFzaFBhcnRzW10gPSAncmVxdWlyZTonIC4gKHN0cmluZykgJGxpbmstPmdldENvbnN0cmFpbnQoKTsKfQp9Cn0KCmlmIChpc3NldCgkdGhpcy0+Y29uZmxpY3RDb25zdHJhaW50c1BlclBhY2thZ2VbJHBhY2thZ2VOYW1lXSkpIHsKZm9yZWFjaCAoJHRoaXMtPmNvbmZsaWN0Q29uc3RyYWludHNQZXJQYWNrYWdlWyRwYWNrYWdlTmFtZV0gYXMgJGNvbmZsaWN0Q29uc3RyYWludCkgewppZiAoQ29tcGlsaW5nTWF0Y2hlcjo6bWF0Y2goJGNvbmZsaWN0Q29uc3RyYWludCwgQ29uc3RyYWludDo6T1BfRVEsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkpKSB7CiRncm91cEhhc2hQYXJ0c1tdID0gJ2NvbmZsaWN0OicgLiAoc3RyaW5nKSAkY29uZmxpY3RDb25zdHJhaW50Owp9Cn0KfQoKaWYgKDAgPT09IFxjb3VudCgkZ3JvdXBIYXNoUGFydHMpKSB7CmNvbnRpbnVlOwp9CgokZ3JvdXBIYXNoID0gaW1wbG9kZSgnJywgJGdyb3VwSGFzaFBhcnRzKTsKJGlkZW50aWNhbERlZmluaXRpb25zUGVyUGFja2FnZVskcGFja2FnZU5hbWVdWyRncm91cEhhc2hdWyRkZXBlbmRlbmN5SGFzaF1bXSA9ICRwYWNrYWdlOwokcGFja2FnZUlkZW50aWNhbERlZmluaXRpb25Mb29rdXBbJHBhY2thZ2UtPmlkXVskcGFja2FnZU5hbWVdID0gWydncm91cEhhc2gnID0+ICRncm91cEhhc2gsICdkZXBlbmRlbmN5SGFzaCcgPT4gJGRlcGVuZGVuY3lIYXNoXTsKfQp9Cn0KCmZvcmVhY2ggKCRpZGVudGljYWxEZWZpbml0aW9uc1BlclBhY2thZ2UgYXMgJGNvbnN0cmFpbnRHcm91cHMpIHsKZm9yZWFjaCAoJGNvbnN0cmFpbnRHcm91cHMgYXMgJGNvbnN0cmFpbnRHcm91cCkgewpmb3JlYWNoICgkY29uc3RyYWludEdyb3VwIGFzICRwYWNrYWdlcykgewoKaWYgKDEgPT09IFxjb3VudCgkcGFja2FnZXMpKSB7CiR0aGlzLT5rZWVwUGFja2FnZSgkcGFja2FnZXNbMF0sICRpZGVudGljYWxEZWZpbml0aW9uc1BlclBhY2thZ2UsICRwYWNrYWdlSWRlbnRpY2FsRGVmaW5pdGlvbkxvb2t1cCk7CmNvbnRpbnVlOwp9CgoKCiRsaXRlcmFscyA9IFtdOwoKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRsaXRlcmFsc1tdID0gJHBhY2thZ2UtPmlkOwp9Cgpmb3JlYWNoICgkdGhpcy0+cG9saWN5LT5zZWxlY3RQcmVmZXJyZWRQYWNrYWdlcygkcG9vbCwgJGxpdGVyYWxzKSBhcyAkcHJlZmVycmVkTGl0ZXJhbCkgewokdGhpcy0+a2VlcFBhY2thZ2UoJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJHByZWZlcnJlZExpdGVyYWwpLCAkaWRlbnRpY2FsRGVmaW5pdGlvbnNQZXJQYWNrYWdlLCAkcGFja2FnZUlkZW50aWNhbERlZmluaXRpb25Mb29rdXApOwp9Cn0KfQp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gY2FsY3VsYXRlRGVwZW5kZW5jeUhhc2goQmFzZVBhY2thZ2UgJHBhY2thZ2UpOiBzdHJpbmcKewokaGFzaCA9ICcnOwoKJGhhc2hSZWxldmFudExpbmtzID0gWwoncmVxdWlyZXMnID0+ICRwYWNrYWdlLT5nZXRSZXF1aXJlcygpLAonY29uZmxpY3RzJyA9PiAkcGFja2FnZS0+Z2V0Q29uZmxpY3RzKCksCidyZXBsYWNlcycgPT4gJHBhY2thZ2UtPmdldFJlcGxhY2VzKCksCidwcm92aWRlcycgPT4gJHBhY2thZ2UtPmdldFByb3ZpZGVzKCksCl07Cgpmb3JlYWNoICgkaGFzaFJlbGV2YW50TGlua3MgYXMgJGtleSA9PiAkbGlua3MpIHsKaWYgKDAgPT09IFxjb3VudCgkbGlua3MpKSB7CmNvbnRpbnVlOwp9CgoKJGhhc2ggLj0gJGtleSAuICc6JzsKCiRzdWJoYXNoID0gW107Cgpmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspIHsKCgoKCiRzdWJoYXNoWyRsaW5rLT5nZXRUYXJnZXQoKV0gPSAoc3RyaW5nKSAkbGluay0+Z2V0Q29uc3RyYWludCgpOwp9CgoKa3NvcnQoJHN1Ymhhc2gpOwoKZm9yZWFjaCAoJHN1Ymhhc2ggYXMgJHRhcmdldCA9PiAkY29uc3RyYWludCkgewokaGFzaCAuPSAkdGFyZ2V0IC4gJ0AnIC4gJGNvbnN0cmFpbnQ7Cn0KfQoKcmV0dXJuICRoYXNoOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIG1hcmtQYWNrYWdlRm9yUmVtb3ZhbChpbnQgJGlkKTogdm9pZAp7CgppZiAoaXNzZXQoJHRoaXMtPmlycmVtb3ZhYmxlUGFja2FnZXNbJGlkXSkpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignQXR0ZW1wdGVkIHJlbW92aW5nIGEgcGFja2FnZSB3aGljaCB3YXMgcHJldmlvdXNseSBtYXJrZWQgaXJyZW1vdmFibGUnKTsKfQoKJHRoaXMtPnBhY2thZ2VzVG9SZW1vdmVbJGlkXSA9IHRydWU7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGtlZXBQYWNrYWdlKEJhc2VQYWNrYWdlICRwYWNrYWdlLCBhcnJheSAkaWRlbnRpY2FsRGVmaW5pdGlvbnNQZXJQYWNrYWdlLCBhcnJheSAkcGFja2FnZUlkZW50aWNhbERlZmluaXRpb25Mb29rdXApOiB2b2lkCnsKCmlmICghaXNzZXQoJHRoaXMtPnBhY2thZ2VzVG9SZW1vdmVbJHBhY2thZ2UtPmlkXSkpIHsKcmV0dXJuOwp9Cgp1bnNldCgkdGhpcy0+cGFja2FnZXNUb1JlbW92ZVskcGFja2FnZS0+aWRdKTsKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewoKCiR0aGlzLT5rZWVwUGFja2FnZSgkcGFja2FnZS0+Z2V0QWxpYXNPZigpLCAkaWRlbnRpY2FsRGVmaW5pdGlvbnNQZXJQYWNrYWdlLCAkcGFja2FnZUlkZW50aWNhbERlZmluaXRpb25Mb29rdXApOwp9CgoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldE5hbWVzKGZhbHNlKSBhcyAkbmFtZSkgewppZiAoaXNzZXQoJHBhY2thZ2VJZGVudGljYWxEZWZpbml0aW9uTG9va3VwWyRwYWNrYWdlLT5pZF1bJG5hbWVdKSkgewokcGFja2FnZUdyb3VwUG9pbnRlcnMgPSAkcGFja2FnZUlkZW50aWNhbERlZmluaXRpb25Mb29rdXBbJHBhY2thZ2UtPmlkXVskbmFtZV07CiRwYWNrYWdlR3JvdXAgPSAkaWRlbnRpY2FsRGVmaW5pdGlvbnNQZXJQYWNrYWdlWyRuYW1lXVskcGFja2FnZUdyb3VwUG9pbnRlcnNbJ2dyb3VwSGFzaCddXVskcGFja2FnZUdyb3VwUG9pbnRlcnNbJ2RlcGVuZGVuY3lIYXNoJ11dOwpmb3JlYWNoICgkcGFja2FnZUdyb3VwIGFzICRwa2cpIHsKaWYgKCRwa2cgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UgJiYgJHBrZy0+Z2V0UHJldHR5VmVyc2lvbigpID09PSBWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBUykgewokcGtnID0gJHBrZy0+Z2V0QWxpYXNPZigpOwp9CiR0aGlzLT5yZW1vdmVkVmVyc2lvbnNCeVBhY2thZ2Vbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV1bJHBrZy0+Z2V0VmVyc2lvbigpXSA9ICRwa2ctPmdldFByZXR0eVZlcnNpb24oKTsKfQp9Cn0KCmlmIChpc3NldCgkdGhpcy0+YWxpYXNlc1BlclBhY2thZ2VbJHBhY2thZ2UtPmlkXSkpIHsKZm9yZWFjaCAoJHRoaXMtPmFsaWFzZXNQZXJQYWNrYWdlWyRwYWNrYWdlLT5pZF0gYXMgJGFsaWFzUGFja2FnZSkgewp1bnNldCgkdGhpcy0+cGFja2FnZXNUb1JlbW92ZVskYWxpYXNQYWNrYWdlLT5pZF0pOwoKCmZvcmVhY2ggKCRhbGlhc1BhY2thZ2UtPmdldE5hbWVzKGZhbHNlKSBhcyAkbmFtZSkgewppZiAoaXNzZXQoJHBhY2thZ2VJZGVudGljYWxEZWZpbml0aW9uTG9va3VwWyRhbGlhc1BhY2thZ2UtPmlkXVskbmFtZV0pKSB7CiRwYWNrYWdlR3JvdXBQb2ludGVycyA9ICRwYWNrYWdlSWRlbnRpY2FsRGVmaW5pdGlvbkxvb2t1cFskYWxpYXNQYWNrYWdlLT5pZF1bJG5hbWVdOwokcGFja2FnZUdyb3VwID0gJGlkZW50aWNhbERlZmluaXRpb25zUGVyUGFja2FnZVskbmFtZV1bJHBhY2thZ2VHcm91cFBvaW50ZXJzWydncm91cEhhc2gnXV1bJHBhY2thZ2VHcm91cFBvaW50ZXJzWydkZXBlbmRlbmN5SGFzaCddXTsKZm9yZWFjaCAoJHBhY2thZ2VHcm91cCBhcyAkcGtnKSB7CmlmICgkcGtnIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICYmICRwa2ctPmdldFByZXR0eVZlcnNpb24oKSA9PT0gVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVMpIHsKJHBrZyA9ICRwa2ctPmdldEFsaWFzT2YoKTsKfQokdGhpcy0+cmVtb3ZlZFZlcnNpb25zQnlQYWNrYWdlW3NwbF9vYmplY3RfaGFzaCgkYWxpYXNQYWNrYWdlKV1bJHBrZy0+Z2V0VmVyc2lvbigpXSA9ICRwa2ctPmdldFByZXR0eVZlcnNpb24oKTsKfQp9Cn0KfQp9Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBvcHRpbWl6ZUltcG9zc2libGVQYWNrYWdlc0F3YXkoUmVxdWVzdCAkcmVxdWVzdCwgUG9vbCAkcG9vbCk6IHZvaWQKewppZiAoXGNvdW50KCRyZXF1ZXN0LT5nZXRMb2NrZWRQYWNrYWdlcygpKSA9PT0gMCkgewpyZXR1cm47Cn0KCiRwYWNrYWdlSW5kZXggPSBbXTsKCmZvcmVhY2ggKCRwb29sLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiRpZCA9ICRwYWNrYWdlLT5pZDsKCgppZiAoaXNzZXQoJHRoaXMtPmlycmVtb3ZhYmxlUGFja2FnZXNbJGlkXSkpIHsKY29udGludWU7Cn0KCmlmIChpc3NldCgkdGhpcy0+YWxpYXNlc1BlclBhY2thZ2VbJGlkXSkgfHwgJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKY29udGludWU7Cn0KCmlmICgkcmVxdWVzdC0+aXNGaXhlZFBhY2thZ2UoJHBhY2thZ2UpIHx8ICRyZXF1ZXN0LT5pc0xvY2tlZFBhY2thZ2UoJHBhY2thZ2UpKSB7CmNvbnRpbnVlOwp9CgokcGFja2FnZUluZGV4WyRwYWNrYWdlLT5nZXROYW1lKCldWyRwYWNrYWdlLT5pZF0gPSAkcGFja2FnZTsKfQoKZm9yZWFjaCAoJHJlcXVlc3QtPmdldExvY2tlZFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKCgokaXNVbnVzZWRQYWNrYWdlID0gdHJ1ZTsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldE5hbWVzKGZhbHNlKSBhcyAkcGFja2FnZU5hbWUpIHsKaWYgKGlzc2V0KCR0aGlzLT5yZXF1aXJlQ29uc3RyYWludHNQZXJQYWNrYWdlWyRwYWNrYWdlTmFtZV0pKSB7CiRpc1VudXNlZFBhY2thZ2UgPSBmYWxzZTsKYnJlYWs7Cn0KfQoKaWYgKCRpc1VudXNlZFBhY2thZ2UpIHsKY29udGludWU7Cn0KCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXF1aXJlcygpIGFzICRsaW5rKSB7CiRyZXF1aXJlID0gJGxpbmstPmdldFRhcmdldCgpOwppZiAoIWlzc2V0KCRwYWNrYWdlSW5kZXhbJHJlcXVpcmVdKSkgewpjb250aW51ZTsKfQoKJGxpbmtDb25zdHJhaW50ID0gJGxpbmstPmdldENvbnN0cmFpbnQoKTsKZm9yZWFjaCAoJHBhY2thZ2VJbmRleFskcmVxdWlyZV0gYXMgJGlkID0+ICRyZXF1aXJlZFBrZykgewppZiAoZmFsc2UgPT09IENvbXBpbGluZ01hdGNoZXI6Om1hdGNoKCRsaW5rQ29uc3RyYWludCwgQ29uc3RyYWludDo6T1BfRVEsICRyZXF1aXJlZFBrZy0+Z2V0VmVyc2lvbigpKSkgewokdGhpcy0+bWFya1BhY2thZ2VGb3JSZW1vdmFsKCRpZCk7CnVuc2V0KCRwYWNrYWdlSW5kZXhbJHJlcXVpcmVdWyRpZF0pOwp9Cn0KfQp9Cn0KCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGV4dHJhY3RSZXF1aXJlQ29uc3RyYWludHNQZXJQYWNrYWdlKHN0cmluZyAkcGFja2FnZSwgQ29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCkKewpmb3JlYWNoICgkdGhpcy0+ZXhwYW5kRGlzanVuY3RpdmVNdWx0aUNvbnN0cmFpbnRzKCRjb25zdHJhaW50KSBhcyAkZXhwYW5kZWQpIHsKJHRoaXMtPnJlcXVpcmVDb25zdHJhaW50c1BlclBhY2thZ2VbJHBhY2thZ2VdWyhzdHJpbmcpICRleHBhbmRlZF0gPSAkZXhwYW5kZWQ7Cn0KfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZXh0cmFjdENvbmZsaWN0Q29uc3RyYWludHNQZXJQYWNrYWdlKHN0cmluZyAkcGFja2FnZSwgQ29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCkKewpmb3JlYWNoICgkdGhpcy0+ZXhwYW5kRGlzanVuY3RpdmVNdWx0aUNvbnN0cmFpbnRzKCRjb25zdHJhaW50KSBhcyAkZXhwYW5kZWQpIHsKJHRoaXMtPmNvbmZsaWN0Q29uc3RyYWludHNQZXJQYWNrYWdlWyRwYWNrYWdlXVsoc3RyaW5nKSAkZXhwYW5kZWRdID0gJGV4cGFuZGVkOwp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZXhwYW5kRGlzanVuY3RpdmVNdWx0aUNvbnN0cmFpbnRzKENvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQpCnsKJGNvbnN0cmFpbnQgPSBJbnRlcnZhbHM6OmNvbXBhY3RDb25zdHJhaW50KCRjb25zdHJhaW50KTsKCmlmICgkY29uc3RyYWludCBpbnN0YW5jZW9mIE11bHRpQ29uc3RyYWludCAmJiAkY29uc3RyYWludC0+aXNEaXNqdW5jdGl2ZSgpKSB7CgoKcmV0dXJuICRjb25zdHJhaW50LT5nZXRDb25zdHJhaW50cygpOwp9CgoKcmV0dXJuIFskY29uc3RyYWludF07Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKdXNlIENvbXBvc2VyXEFkdmlzb3J5XFBhcnRpYWxTZWN1cml0eUFkdmlzb3J5Owp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcU2VjdXJpdHlBZHZpc29yeTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMaW5rOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVNldDsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcTG9ja0FycmF5UmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE11bHRpQ29uc3RyYWludDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlcjsKCgoKCgoKY2xhc3MgUHJvYmxlbQp7CgoKCgpwcm90ZWN0ZWQgJHJlYXNvblNlZW47CgoKCgoKcHJvdGVjdGVkICRyZWFzb25zID0gW107CgoKcHJvdGVjdGVkICRzZWN0aW9uID0gMDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFJ1bGUoUnVsZSAkcnVsZSk6IHZvaWQKewokdGhpcy0+YWRkUmVhc29uKHNwbF9vYmplY3RfaGFzaCgkcnVsZSksICRydWxlKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVhc29ucygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cmVhc29uczsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByZXR0eVN0cmluZyhSZXBvc2l0b3J5U2V0ICRyZXBvc2l0b3J5U2V0LCBSZXF1ZXN0ICRyZXF1ZXN0LCBQb29sICRwb29sLCBib29sICRpc1ZlcmJvc2UsIGFycmF5ICRpbnN0YWxsZWRNYXAgPSBbXSwgYXJyYXkgJGxlYXJuZWRQb29sID0gW10pOiBzdHJpbmcKewoKJHJlYXNvbnMgPSBhcnJheV9tZXJnZSguLi5hcnJheV9yZXZlcnNlKCR0aGlzLT5yZWFzb25zKSk7CgppZiAoXGNvdW50KCRyZWFzb25zKSA9PT0gMSkgewpyZXNldCgkcmVhc29ucyk7CiRydWxlID0gY3VycmVudCgkcmVhc29ucyk7CgppZiAoJHJ1bGUtPmdldFJlYXNvbigpICE9PSBSdWxlOjpSVUxFX1JPT1RfUkVRVUlSRSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCJTaW5nbGUgcmVhc29uIHByb2JsZW1zIG11c3QgY29udGFpbiBhIHJvb3QgcmVxdWlyZSBydWxlLiIpOwp9CgokcmVhc29uRGF0YSA9ICRydWxlLT5nZXRSZWFzb25EYXRhKCk7CiRwYWNrYWdlTmFtZSA9ICRyZWFzb25EYXRhWydwYWNrYWdlTmFtZSddOwokY29uc3RyYWludCA9ICRyZWFzb25EYXRhWydjb25zdHJhaW50J107CgokcGFja2FnZXMgPSAkcG9vbC0+d2hhdFByb3ZpZGVzKCRwYWNrYWdlTmFtZSwgJGNvbnN0cmFpbnQpOwppZiAoXGNvdW50KCRwYWNrYWdlcykgPT09IDApIHsKcmV0dXJuICJcbiAgICAiLmltcGxvZGUoc2VsZjo6Z2V0TWlzc2luZ1BhY2thZ2VSZWFzb24oJHJlcG9zaXRvcnlTZXQsICRyZXF1ZXN0LCAkcG9vbCwgJGlzVmVyYm9zZSwgJHBhY2thZ2VOYW1lLCAkY29uc3RyYWludCkpOwp9Cn0KCnVzb3J0KCRyZWFzb25zLCBmdW5jdGlvbiAoUnVsZSAkcnVsZTEsIFJ1bGUgJHJ1bGUyKSB1c2UgKCRwb29sKSB7CiRydWxlMVByaW8gPSAkdGhpcy0+Z2V0UnVsZVByaW9yaXR5KCRydWxlMSk7CiRydWxlMlByaW8gPSAkdGhpcy0+Z2V0UnVsZVByaW9yaXR5KCRydWxlMik7CmlmICgkcnVsZTFQcmlvICE9PSAkcnVsZTJQcmlvKSB7CnJldHVybiAkcnVsZTJQcmlvIC0gJHJ1bGUxUHJpbzsKfQoKcmV0dXJuICR0aGlzLT5nZXRTb3J0YWJsZVN0cmluZygkcG9vbCwgJHJ1bGUxKSA8PT4gJHRoaXMtPmdldFNvcnRhYmxlU3RyaW5nKCRwb29sLCAkcnVsZTIpOwp9KTsKCnJldHVybiBzZWxmOjpmb3JtYXREZWR1cGxpY2F0ZWRSdWxlcygkcmVhc29ucywgJyAgICAnLCAkcmVwb3NpdG9yeVNldCwgJHJlcXVlc3QsICRwb29sLCAkaXNWZXJib3NlLCAkaW5zdGFsbGVkTWFwLCAkbGVhcm5lZFBvb2wpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldFNvcnRhYmxlU3RyaW5nKFBvb2wgJHBvb2wsIFJ1bGUgJHJ1bGUpOiBzdHJpbmcKewpzd2l0Y2ggKCRydWxlLT5nZXRSZWFzb24oKSkgewpjYXNlIFJ1bGU6OlJVTEVfUk9PVF9SRVFVSVJFOgpyZXR1cm4gJHJ1bGUtPmdldFJlYXNvbkRhdGEoKVsncGFja2FnZU5hbWUnXTsKY2FzZSBSdWxlOjpSVUxFX0ZJWEVEOgpyZXR1cm4gKHN0cmluZykgJHJ1bGUtPmdldFJlYXNvbkRhdGEoKVsncGFja2FnZSddOwpjYXNlIFJ1bGU6OlJVTEVfUEFDS0FHRV9DT05GTElDVDoKY2FzZSBSdWxlOjpSVUxFX1BBQ0tBR0VfUkVRVUlSRVM6CnJldHVybiAkcnVsZS0+Z2V0U291cmNlUGFja2FnZSgkcG9vbCkgLiAnLy8nIC4gJHJ1bGUtPmdldFJlYXNvbkRhdGEoKS0+Z2V0UHJldHR5U3RyaW5nKCRydWxlLT5nZXRTb3VyY2VQYWNrYWdlKCRwb29sKSk7CmNhc2UgUnVsZTo6UlVMRV9QQUNLQUdFX1NBTUVfTkFNRToKY2FzZSBSdWxlOjpSVUxFX1BBQ0tBR0VfQUxJQVM6CmNhc2UgUnVsZTo6UlVMRV9QQUNLQUdFX0lOVkVSU0VfQUxJQVM6CnJldHVybiAoc3RyaW5nKSAkcnVsZS0+Z2V0UmVhc29uRGF0YSgpOwpjYXNlIFJ1bGU6OlJVTEVfTEVBUk5FRDoKcmV0dXJuIGltcGxvZGUoJy0nLCAkcnVsZS0+Z2V0TGl0ZXJhbHMoKSk7Cn0KCgp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdVbmtub3duIHJ1bGUgdHlwZTogJy4kcnVsZS0+Z2V0UmVhc29uKCkpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldFJ1bGVQcmlvcml0eShSdWxlICRydWxlKTogaW50CnsKc3dpdGNoICgkcnVsZS0+Z2V0UmVhc29uKCkpIHsKY2FzZSBSdWxlOjpSVUxFX0ZJWEVEOgpyZXR1cm4gMzsKY2FzZSBSdWxlOjpSVUxFX1JPT1RfUkVRVUlSRToKcmV0dXJuIDI7CmNhc2UgUnVsZTo6UlVMRV9QQUNLQUdFX0NPTkZMSUNUOgpjYXNlIFJ1bGU6OlJVTEVfUEFDS0FHRV9SRVFVSVJFUzoKcmV0dXJuIDE7CmNhc2UgUnVsZTo6UlVMRV9QQUNLQUdFX1NBTUVfTkFNRToKY2FzZSBSdWxlOjpSVUxFX0xFQVJORUQ6CmNhc2UgUnVsZTo6UlVMRV9QQUNLQUdFX0FMSUFTOgpjYXNlIFJ1bGU6OlJVTEVfUEFDS0FHRV9JTlZFUlNFX0FMSUFTOgpyZXR1cm4gMDsKfQoKCnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ1Vua25vd24gcnVsZSB0eXBlOiAnLiRydWxlLT5nZXRSZWFzb24oKSk7Cn0KCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZm9ybWF0RGVkdXBsaWNhdGVkUnVsZXMoYXJyYXkgJHJ1bGVzLCBzdHJpbmcgJGluZGVudCwgUmVwb3NpdG9yeVNldCAkcmVwb3NpdG9yeVNldCwgUmVxdWVzdCAkcmVxdWVzdCwgUG9vbCAkcG9vbCwgYm9vbCAkaXNWZXJib3NlLCBhcnJheSAkaW5zdGFsbGVkTWFwID0gW10sIGFycmF5ICRsZWFybmVkUG9vbCA9IFtdKTogc3RyaW5nCnsKJG1lc3NhZ2VzID0gW107CiR0ZW1wbGF0ZXMgPSBbXTsKJHBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyOwokZGVkdXBsaWNhdGFibGVSdWxlVHlwZXMgPSBbUnVsZTo6UlVMRV9QQUNLQUdFX1JFUVVJUkVTLCBSdWxlOjpSVUxFX1BBQ0tBR0VfQ09ORkxJQ1RdOwpmb3JlYWNoICgkcnVsZXMgYXMgJHJ1bGUpIHsKJG1lc3NhZ2UgPSAkcnVsZS0+Z2V0UHJldHR5U3RyaW5nKCRyZXBvc2l0b3J5U2V0LCAkcmVxdWVzdCwgJHBvb2wsICRpc1ZlcmJvc2UsICRpbnN0YWxsZWRNYXAsICRsZWFybmVkUG9vbCk7CmlmIChpbl9hcnJheSgkcnVsZS0+Z2V0UmVhc29uKCksICRkZWR1cGxpY2F0YWJsZVJ1bGVUeXBlcywgdHJ1ZSkgJiYgUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14oP1A8cGFja2FnZT5cUyspICg/UDx2ZXJzaW9uPlxTKykgKD9QPHR5cGU+cmVxdWlyZXN8Y29uZmxpY3RzKX0nLCAkbWVzc2FnZSwgJG0pKSB7CiRtZXNzYWdlID0gc3RyX3JlcGxhY2UoJyUnLCAnJSUnLCAkbWVzc2FnZSk7CiR0ZW1wbGF0ZSA9IFByZWc6OnJlcGxhY2UoJ3teXFMrIFxTKyB9JywgJyVzJXMgJywgJG1lc3NhZ2UpOwokbWVzc2FnZXNbXSA9ICR0ZW1wbGF0ZTsKJHRlbXBsYXRlc1skdGVtcGxhdGVdWyRtWzFdXVskcGFyc2VyLT5ub3JtYWxpemUoJG1bMl0pXSA9ICRtWzJdOwokc291cmNlUGFja2FnZSA9ICRydWxlLT5nZXRTb3VyY2VQYWNrYWdlKCRwb29sKTsKZm9yZWFjaCAoJHBvb2wtPmdldFJlbW92ZWRWZXJzaW9uc0J5UGFja2FnZShzcGxfb2JqZWN0X2hhc2goJHNvdXJjZVBhY2thZ2UpKSBhcyAkdmVyc2lvbiA9PiAkcHJldHR5VmVyc2lvbikgewokdGVtcGxhdGVzWyR0ZW1wbGF0ZV1bJG1bMV1dWyR2ZXJzaW9uXSA9ICRwcmV0dHlWZXJzaW9uOwp9Cn0gZWxzZWlmICgkbWVzc2FnZSAhPT0gJycpIHsKJG1lc3NhZ2VzW10gPSAkbWVzc2FnZTsKfQp9CgokcmVzdWx0ID0gW107CmZvcmVhY2ggKGFycmF5X3VuaXF1ZSgkbWVzc2FnZXMpIGFzICRtZXNzYWdlKSB7CmlmIChpc3NldCgkdGVtcGxhdGVzWyRtZXNzYWdlXSkpIHsKZm9yZWFjaCAoJHRlbXBsYXRlc1skbWVzc2FnZV0gYXMgJHBhY2thZ2UgPT4gJHZlcnNpb25zKSB7CnVrc29ydCgkdmVyc2lvbnMsICd2ZXJzaW9uX2NvbXBhcmUnKTsKaWYgKCEkaXNWZXJib3NlKSB7CiR2ZXJzaW9ucyA9IHNlbGY6OmNvbmRlbnNlVmVyc2lvbkxpc3QoJHZlcnNpb25zLCAxKTsKfQppZiAoXGNvdW50KCR2ZXJzaW9ucykgPiAxKSB7CgokbWVzc2FnZSA9IFByZWc6OnJlcGxhY2UoJ3teKCVzJXMgKD86cmVxdWlyZXxjb25mbGljdCkpc30nLCAnJDEnLCAkbWVzc2FnZSk7CiRyZXN1bHRbXSA9IHNwcmludGYoJG1lc3NhZ2UsICRwYWNrYWdlLCAnWycuaW1wbG9kZSgnLCAnLCAkdmVyc2lvbnMpLiddJyk7Cn0gZWxzZSB7CiRyZXN1bHRbXSA9IHNwcmludGYoJG1lc3NhZ2UsICRwYWNrYWdlLCAnICcucmVzZXQoJHZlcnNpb25zKSk7Cn0KfQp9IGVsc2UgewokcmVzdWx0W10gPSAkbWVzc2FnZTsKfQp9CgpyZXR1cm4gIlxuJGluZGVudC0gIi5pbXBsb2RlKCJcbiRpbmRlbnQtICIsICRyZXN1bHQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNDYXVzZWRCeUxvY2soUmVwb3NpdG9yeVNldCAkcmVwb3NpdG9yeVNldCwgUmVxdWVzdCAkcmVxdWVzdCwgUG9vbCAkcG9vbCk6IGJvb2wKewpmb3JlYWNoICgkdGhpcy0+cmVhc29ucyBhcyAkc2VjdGlvblJ1bGVzKSB7CmZvcmVhY2ggKCRzZWN0aW9uUnVsZXMgYXMgJHJ1bGUpIHsKaWYgKCRydWxlLT5pc0NhdXNlZEJ5TG9jaygkcmVwb3NpdG9yeVNldCwgJHJlcXVlc3QsICRwb29sKSkgewpyZXR1cm4gdHJ1ZTsKfQp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZFJlYXNvbihzdHJpbmcgJGlkLCBSdWxlICRyZWFzb24pOiB2b2lkCnsKCgoKaWYgKCFpc3NldCgkdGhpcy0+cmVhc29uU2VlblskaWRdKSkgewokdGhpcy0+cmVhc29uU2VlblskaWRdID0gdHJ1ZTsKJHRoaXMtPnJlYXNvbnNbJHRoaXMtPnNlY3Rpb25dW10gPSAkcmVhc29uOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBuZXh0U2VjdGlvbigpOiB2b2lkCnsKJHRoaXMtPnNlY3Rpb24rKzsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0TWlzc2luZ1BhY2thZ2VSZWFzb24oUmVwb3NpdG9yeVNldCAkcmVwb3NpdG9yeVNldCwgUmVxdWVzdCAkcmVxdWVzdCwgUG9vbCAkcG9vbCwgYm9vbCAkaXNWZXJib3NlLCBzdHJpbmcgJHBhY2thZ2VOYW1lLCA/Q29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCA9IG51bGwpOiBhcnJheQp7CmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRwYWNrYWdlTmFtZSkpIHsKCmlmICgwID09PSBzdHJpcG9zKCRwYWNrYWdlTmFtZSwgJ3BocCcpIHx8ICRwYWNrYWdlTmFtZSA9PT0gJ2hodm0nKSB7CiR2ZXJzaW9uID0gc2VsZjo6Z2V0UGxhdGZvcm1QYWNrYWdlVmVyc2lvbigkcG9vbCwgJHBhY2thZ2VOYW1lLCBwaHB2ZXJzaW9uKCkpOwoKJG1zZyA9ICItIFJvb3QgY29tcG9zZXIuanNvbiByZXF1aXJlcyAiLiRwYWNrYWdlTmFtZS5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KS4nIGJ1dCAnOwoKaWYgKGRlZmluZWQoJ0hIVk1fVkVSU0lPTicpIHx8ICgkcGFja2FnZU5hbWUgPT09ICdoaHZtJyAmJiBjb3VudCgkcG9vbC0+d2hhdFByb3ZpZGVzKCRwYWNrYWdlTmFtZSkpID4gMCkpIHsKcmV0dXJuIFskbXNnLCAneW91ciBISFZNIHZlcnNpb24gZG9lcyBub3Qgc2F0aXNmeSB0aGF0IHJlcXVpcmVtZW50LiddOwp9CgppZiAoJHBhY2thZ2VOYW1lID09PSAnaGh2bScpIHsKcmV0dXJuIFskbXNnLCAnSEhWTSB3YXMgbm90IGRldGVjdGVkIG9uIHRoaXMgbWFjaGluZSwgbWFrZSBzdXJlIGl0IGlzIGluIHlvdXIgUEFUSC4nXTsKfQoKaWYgKG51bGwgPT09ICR2ZXJzaW9uKSB7CnJldHVybiBbJG1zZywgJ3RoZSAnLiRwYWNrYWdlTmFtZS4nIHBhY2thZ2UgaXMgZGlzYWJsZWQgYnkgeW91ciBwbGF0Zm9ybSBjb25maWcuIEVuYWJsZSBpdCBhZ2FpbiB3aXRoICJjb21wb3NlciBjb25maWcgcGxhdGZvcm0uJy4kcGFja2FnZU5hbWUuJyAtLXVuc2V0Ii4nXTsKfQoKcmV0dXJuIFskbXNnLCAneW91ciAnLiRwYWNrYWdlTmFtZS4nIHZlcnNpb24gKCcuICR2ZXJzaW9uIC4nKSBkb2VzIG5vdCBzYXRpc2Z5IHRoYXQgcmVxdWlyZW1lbnQuJ107Cn0KCgppZiAoMCA9PT0gc3RyaXBvcygkcGFja2FnZU5hbWUsICdleHQtJykpIHsKaWYgKGZhbHNlICE9PSBzdHJwb3MoJHBhY2thZ2VOYW1lLCAnICcpKSB7CnJldHVybiBbJy0gJywgIlBIUCBleHRlbnNpb24gIi4kcGFja2FnZU5hbWUuJyBzaG91bGQgYmUgcmVxdWlyZWQgYXMgJy5zdHJfcmVwbGFjZSgnICcsICctJywgJHBhY2thZ2VOYW1lKS4nLiddOwp9CgokZXh0ID0gc3Vic3RyKCRwYWNrYWdlTmFtZSwgNCk7CiRtc2cgPSAiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgUEhQIGV4dGVuc2lvbiAiLiRwYWNrYWdlTmFtZS5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KS4nIGJ1dCAnOwoKJHZlcnNpb24gPSBzZWxmOjpnZXRQbGF0Zm9ybVBhY2thZ2VWZXJzaW9uKCRwb29sLCAkcGFja2FnZU5hbWUsIHBocHZlcnNpb24oJGV4dCkgPT09IGZhbHNlID8gJzAnIDogcGhwdmVyc2lvbigkZXh0KSk7CmlmIChudWxsID09PSAkdmVyc2lvbikgewokcHJvdmlkZXJzU3RyID0gc2VsZjo6Z2V0UHJvdmlkZXJzTGlzdCgkcmVwb3NpdG9yeVNldCwgJHBhY2thZ2VOYW1lLCA1KTsKaWYgKCRwcm92aWRlcnNTdHIgIT09IG51bGwpIHsKJHByb3ZpZGVyc1N0ciA9ICJcblxuICAgICAgQWx0ZXJuYXRpdmVseSB5b3UgY2FuIHJlcXVpcmUgb25lIG9mIHRoZXNlIHBhY2thZ2VzIHRoYXQgcHJvdmlkZSB0aGUgZXh0ZW5zaW9uIChvciBwYXJ0cyBvZiBpdCk6XG4iLgoiICAgICAgPHdhcm5pbmc+S2VlcCBpbiBtaW5kIHRoYXQgdGhlIHN1Z2dlc3Rpb25zIGFyZSBhdXRvbWF0ZWQgYW5kIG1heSBub3QgYmUgdmFsaWQgb3Igc2FmZSB0byB1c2U8L3dhcm5pbmc+XG4kcHJvdmlkZXJzU3RyIjsKfQoKaWYgKGV4dGVuc2lvbl9sb2FkZWQoJGV4dCkpIHsKcmV0dXJuIFsKJG1zZywKJ3RoZSAnLiRwYWNrYWdlTmFtZS4nIHBhY2thZ2UgaXMgZGlzYWJsZWQgYnkgeW91ciBwbGF0Zm9ybSBjb25maWcuIEVuYWJsZSBpdCBhZ2FpbiB3aXRoICJjb21wb3NlciBjb25maWcgcGxhdGZvcm0uJy4kcGFja2FnZU5hbWUuJyAtLXVuc2V0Ii4nIC4gJHByb3ZpZGVyc1N0ciwKXTsKfQoKcmV0dXJuIFskbXNnLCAnaXQgaXMgbWlzc2luZyBmcm9tIHlvdXIgc3lzdGVtLiBJbnN0YWxsIG9yIGVuYWJsZSBQSFBcJ3MgJy4kZXh0LicgZXh0ZW5zaW9uLicgLiAkcHJvdmlkZXJzU3RyXTsKfQoKcmV0dXJuIFskbXNnLCAnaXQgaGFzIHRoZSB3cm9uZyB2ZXJzaW9uIGluc3RhbGxlZCAoJy4kdmVyc2lvbi4nKS4nXTsKfQoKCmlmICgwID09PSBzdHJpcG9zKCRwYWNrYWdlTmFtZSwgJ2xpYi0nKSkgewppZiAoc3RydG9sb3dlcigkcGFja2FnZU5hbWUpID09PSAnbGliLWljdScpIHsKJGVycm9yID0gZXh0ZW5zaW9uX2xvYWRlZCgnaW50bCcpID8gJ2l0IGhhcyB0aGUgd3JvbmcgdmVyc2lvbiBpbnN0YWxsZWQsIHRyeSB1cGdyYWRpbmcgdGhlIGludGwgZXh0ZW5zaW9uLicgOiAnaXQgaXMgbWlzc2luZyBmcm9tIHlvdXIgc3lzdGVtLCBtYWtlIHN1cmUgdGhlIGludGwgZXh0ZW5zaW9uIGlzIGxvYWRlZC4nOwoKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgbGlua2VkIGxpYnJhcnkgIi4kcGFja2FnZU5hbWUuc2VsZjo6Y29uc3RyYWludFRvVGV4dCgkY29uc3RyYWludCkuJyBidXQgJywgJGVycm9yXTsKfQoKJHByb3ZpZGVyc1N0ciA9IHNlbGY6OmdldFByb3ZpZGVyc0xpc3QoJHJlcG9zaXRvcnlTZXQsICRwYWNrYWdlTmFtZSwgNSk7CmlmICgkcHJvdmlkZXJzU3RyICE9PSBudWxsKSB7CiRwcm92aWRlcnNTdHIgPSAiXG5cbiAgICAgIEFsdGVybmF0aXZlbHkgeW91IGNhbiByZXF1aXJlIG9uZSBvZiB0aGVzZSBwYWNrYWdlcyB0aGF0IHByb3ZpZGUgdGhlIGxpYnJhcnkgKG9yIHBhcnRzIG9mIGl0KTpcbiIuCiIgICAgICA8d2FybmluZz5LZWVwIGluIG1pbmQgdGhhdCB0aGUgc3VnZ2VzdGlvbnMgYXJlIGF1dG9tYXRlZCBhbmQgbWF5IG5vdCBiZSB2YWxpZCBvciBzYWZlIHRvIHVzZTwvd2FybmluZz5cbiRwcm92aWRlcnNTdHIiOwp9CgpyZXR1cm4gWyItIFJvb3QgY29tcG9zZXIuanNvbiByZXF1aXJlcyBsaW5rZWQgbGlicmFyeSAiLiRwYWNrYWdlTmFtZS5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KS4nIGJ1dCAnLCAnaXQgaGFzIHRoZSB3cm9uZyB2ZXJzaW9uIGluc3RhbGxlZCBvciBpcyBtaXNzaW5nIGZyb20geW91ciBzeXN0ZW0sIG1ha2Ugc3VyZSB0byBsb2FkIHRoZSBleHRlbnNpb24gcHJvdmlkaW5nIGl0LicuJHByb3ZpZGVyc1N0cl07Cn0KfQoKJGxvY2tlZFBhY2thZ2UgPSBudWxsOwpmb3JlYWNoICgkcmVxdWVzdC0+Z2V0TG9ja2VkUGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UtPmdldE5hbWUoKSA9PT0gJHBhY2thZ2VOYW1lKSB7CiRsb2NrZWRQYWNrYWdlID0gJHBhY2thZ2U7CmlmICgkcG9vbC0+aXNVbmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZSgkcGFja2FnZSkpIHsKcmV0dXJuIFsiLSAiLCAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLicgaXMgZml4ZWQgdG8gJy4kcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpLicgKGxvY2sgZmlsZSB2ZXJzaW9uKSBieSBhIHBhcnRpYWwgdXBkYXRlIGJ1dCB0aGF0IHZlcnNpb24gaXMgcmVqZWN0ZWQgYnkgeW91ciBtaW5pbXVtLXN0YWJpbGl0eS4gTWFrZSBzdXJlIHlvdSBsaXN0IGl0IGFzIGFuIGFyZ3VtZW50IGZvciB0aGUgdXBkYXRlIGNvbW1hbmQuJ107Cn0KYnJlYWs7Cn0KfQoKaWYgKCRjb25zdHJhaW50IGluc3RhbmNlb2YgQ29uc3RyYWludCAmJiAkY29uc3RyYWludC0+Z2V0T3BlcmF0b3IoKSA9PT0gQ29uc3RyYWludDo6U1RSX09QX0VRICYmIFByZWc6OmlzTWF0Y2goJ3teZGV2LS4qIy4qfScsICRjb25zdHJhaW50LT5nZXRQcmV0dHlTdHJpbmcoKSkpIHsKJG5ld0NvbnN0cmFpbnQgPSBQcmVnOjpyZXBsYWNlKCd7ICthcyArKFteLFxzfF0rKSR9JywgJycsICRjb25zdHJhaW50LT5nZXRQcmV0dHlTdHJpbmcoKSk7CiRwYWNrYWdlcyA9ICRyZXBvc2l0b3J5U2V0LT5maW5kUGFja2FnZXMoJHBhY2thZ2VOYW1lLCBuZXcgTXVsdGlDb25zdHJhaW50KFsKbmV3IENvbnN0cmFpbnQoQ29uc3RyYWludDo6U1RSX09QX0VRLCAkbmV3Q29uc3RyYWludCksCm5ldyBDb25zdHJhaW50KENvbnN0cmFpbnQ6OlNUUl9PUF9FUSwgc3RyX3JlcGxhY2UoJyMnLCAnKycsICRuZXdDb25zdHJhaW50KSksCl0sIGZhbHNlKSk7CmlmIChcY291bnQoJHBhY2thZ2VzKSA+IDApIHsKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJHBhY2thZ2VOYW1lIi5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KSAuICcsICcsICdmb3VuZCAnLnNlbGY6OmdldFBhY2thZ2VMaXN0KCRwYWNrYWdlcywgJGlzVmVyYm9zZSwgJHBvb2wsICRjb25zdHJhaW50KS4nLiBUaGUgIyBjaGFyYWN0ZXIgaW4gYnJhbmNoIG5hbWVzIGlzIHJlcGxhY2VkIGJ5IGEgKyBjaGFyYWN0ZXIuIE1ha2Ugc3VyZSB0byByZXF1aXJlIGl0IGFzICInLnN0cl9yZXBsYWNlKCcjJywgJysnLCAkY29uc3RyYWludC0+Z2V0UHJldHR5U3RyaW5nKCkpLiciLiddOwp9Cn0KCgoKJHBhY2thZ2VzID0gJHJlcG9zaXRvcnlTZXQtPmZpbmRQYWNrYWdlcygkcGFja2FnZU5hbWUsICRjb25zdHJhaW50KTsKaWYgKFxjb3VudCgkcGFja2FnZXMpID4gMCkgewokcm9vdFJlcXMgPSAkcmVwb3NpdG9yeVNldC0+Z2V0Um9vdFJlcXVpcmVzKCk7CmlmIChpc3NldCgkcm9vdFJlcXNbJHBhY2thZ2VOYW1lXSkpIHsKJGZpbHRlcmVkID0gYXJyYXlfZmlsdGVyKCRwYWNrYWdlcywgc3RhdGljIGZ1bmN0aW9uICgkcCkgdXNlICgkcm9vdFJlcXMsICRwYWNrYWdlTmFtZSk6IGJvb2wgewpyZXR1cm4gJHJvb3RSZXFzWyRwYWNrYWdlTmFtZV0tPm1hdGNoZXMobmV3IENvbnN0cmFpbnQoJz09JywgJHAtPmdldFZlcnNpb24oKSkpOwp9KTsKaWYgKDAgPT09IGNvdW50KCRmaWx0ZXJlZCkpIHsKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJHBhY2thZ2VOYW1lIi5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KSAuICcsICcsICdmb3VuZCAnLnNlbGY6OmdldFBhY2thZ2VMaXN0KCRwYWNrYWdlcywgJGlzVmVyYm9zZSwgJHBvb2wsICRjb25zdHJhaW50KS4nIGJ1dCAnLihzZWxmOjpoYXNNdWx0aXBsZU5hbWVzKCRwYWNrYWdlcykgPyAndGhlc2UgY29uZmxpY3QnIDogJ2l0IGNvbmZsaWN0cycpLicgd2l0aCB5b3VyIHJvb3QgY29tcG9zZXIuanNvbiByZXF1aXJlICgnLiRyb290UmVxc1skcGFja2FnZU5hbWVdLT5nZXRQcmV0dHlTdHJpbmcoKS4nKS4nXTsKfQp9CgokdGVtcFJlcXMgPSAkcmVwb3NpdG9yeVNldC0+Z2V0VGVtcG9yYXJ5Q29uc3RyYWludHMoKTsKZm9yZWFjaCAocmVzZXQoJHBhY2thZ2VzKS0+Z2V0TmFtZXMoKSBhcyAkbmFtZSkgewppZiAoaXNzZXQoJHRlbXBSZXFzWyRuYW1lXSkpIHsKJGZpbHRlcmVkID0gYXJyYXlfZmlsdGVyKCRwYWNrYWdlcywgc3RhdGljIGZ1bmN0aW9uICgkcCkgdXNlICgkdGVtcFJlcXMsICRuYW1lKTogYm9vbCB7CnJldHVybiAkdGVtcFJlcXNbJG5hbWVdLT5tYXRjaGVzKG5ldyBDb25zdHJhaW50KCc9PScsICRwLT5nZXRWZXJzaW9uKCkpKTsKfSk7CmlmICgwID09PSBjb3VudCgkZmlsdGVyZWQpKSB7CnJldHVybiBbIi0gUm9vdCBjb21wb3Nlci5qc29uIHJlcXVpcmVzICRuYW1lIi5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KSAuICcsICcsICdmb3VuZCAnLnNlbGY6OmdldFBhY2thZ2VMaXN0KCRwYWNrYWdlcywgJGlzVmVyYm9zZSwgJHBvb2wsICRjb25zdHJhaW50KS4nIGJ1dCAnLihzZWxmOjpoYXNNdWx0aXBsZU5hbWVzKCRwYWNrYWdlcykgPyAndGhlc2UgY29uZmxpY3QnIDogJ2l0IGNvbmZsaWN0cycpLicgd2l0aCB5b3VyIHRlbXBvcmFyeSB1cGRhdGUgY29uc3RyYWludCAoJy4kbmFtZS4nOicuJHRlbXBSZXFzWyRuYW1lXS0+Z2V0UHJldHR5U3RyaW5nKCkuJykuJ107Cn0KfQp9CgppZiAoJGxvY2tlZFBhY2thZ2UgIT09IG51bGwpIHsKJGZpeGVkQ29uc3RyYWludCA9IG5ldyBDb25zdHJhaW50KCc9PScsICRsb2NrZWRQYWNrYWdlLT5nZXRWZXJzaW9uKCkpOwokZmlsdGVyZWQgPSBhcnJheV9maWx0ZXIoJHBhY2thZ2VzLCBzdGF0aWMgZnVuY3Rpb24gKCRwKSB1c2UgKCRmaXhlZENvbnN0cmFpbnQpOiBib29sIHsKcmV0dXJuICRmaXhlZENvbnN0cmFpbnQtPm1hdGNoZXMobmV3IENvbnN0cmFpbnQoJz09JywgJHAtPmdldFZlcnNpb24oKSkpOwp9KTsKaWYgKDAgPT09IGNvdW50KCRmaWx0ZXJlZCkpIHsKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJHBhY2thZ2VOYW1lIi5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KSAuICcsICcsICdmb3VuZCAnLnNlbGY6OmdldFBhY2thZ2VMaXN0KCRwYWNrYWdlcywgJGlzVmVyYm9zZSwgJHBvb2wsICRjb25zdHJhaW50KS4nIGJ1dCB0aGUgcGFja2FnZSBpcyBmaXhlZCB0byAnLiRsb2NrZWRQYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkuJyAobG9jayBmaWxlIHZlcnNpb24pIGJ5IGEgcGFydGlhbCB1cGRhdGUgYW5kIHRoYXQgdmVyc2lvbiBkb2VzIG5vdCBtYXRjaC4gTWFrZSBzdXJlIHlvdSBsaXN0IGl0IGFzIGFuIGFyZ3VtZW50IGZvciB0aGUgdXBkYXRlIGNvbW1hbmQuJ107Cn0KfQoKJG5vbkxvY2tlZFBhY2thZ2VzID0gYXJyYXlfZmlsdGVyKCRwYWNrYWdlcywgc3RhdGljIGZ1bmN0aW9uICgkcCk6IGJvb2wgewpyZXR1cm4gISRwLT5nZXRSZXBvc2l0b3J5KCkgaW5zdGFuY2VvZiBMb2NrQXJyYXlSZXBvc2l0b3J5Owp9KTsKCmlmICgwID09PSBcY291bnQoJG5vbkxvY2tlZFBhY2thZ2VzKSkgewpyZXR1cm4gWyItIFJvb3QgY29tcG9zZXIuanNvbiByZXF1aXJlcyAkcGFja2FnZU5hbWUiLnNlbGY6OmNvbnN0cmFpbnRUb1RleHQoJGNvbnN0cmFpbnQpIC4gJywgJywgJ2ZvdW5kICcuc2VsZjo6Z2V0UGFja2FnZUxpc3QoJHBhY2thZ2VzLCAkaXNWZXJib3NlLCAkcG9vbCwgJGNvbnN0cmFpbnQpLicgaW4gdGhlIGxvY2sgZmlsZSBidXQgbm90IGluIHJlbW90ZSByZXBvc2l0b3JpZXMsIG1ha2Ugc3VyZSB5b3UgYXZvaWQgdXBkYXRpbmcgdGhpcyBwYWNrYWdlIHRvIGtlZXAgdGhlIG9uZSBmcm9tIHRoZSBsb2NrIGZpbGUuJ107Cn0KCmlmICgkcG9vbC0+aXNBYmFuZG9uZWRSZW1vdmVkUGFja2FnZVZlcnNpb24oJHBhY2thZ2VOYW1lLCAkY29uc3RyYWludCkpIHsKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJHBhY2thZ2VOYW1lIi5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KSAuICcsICcsICdmb3VuZCAnLnNlbGY6OmdldFBhY2thZ2VMaXN0KCRwYWNrYWdlcywgJGlzVmVyYm9zZSwgJHBvb2wsICRjb25zdHJhaW50KS4nIGJ1dCB0aGVzZSB3ZXJlIG5vdCBsb2FkZWQsIGJlY2F1c2UgdGhleSBhcmUgYWJhbmRvbmVkIGFuZCB5b3UgY29uZmlndXJlZCAiYmxvY2stYWJhbmRvbmVkIiB0byB0cnVlIGluIHlvdXIgImF1ZGl0IiBjb25maWcuJ107Cn0KCmlmICgkcG9vbC0+aXNTZWN1cml0eVJlbW92ZWRQYWNrYWdlVmVyc2lvbigkcGFja2FnZU5hbWUsICRjb25zdHJhaW50KSkgewokYWR2aXNvcmllcyA9ICRyZXBvc2l0b3J5U2V0LT5nZXRNYXRjaGluZ1NlY3VyaXR5QWR2aXNvcmllcygkcGFja2FnZXMsIGZhbHNlLCB0cnVlKTsKaWYgKGlzc2V0KCRhZHZpc29yaWVzWydhZHZpc29yaWVzJ11bJHBhY2thZ2VOYW1lXSkgJiYgXGNvdW50KCRhZHZpc29yaWVzWydhZHZpc29yaWVzJ11bJHBhY2thZ2VOYW1lXSkgPiAwKSB7CiRhZHZpc29yaWVzTGlzdCA9IGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKFNlY3VyaXR5QWR2aXNvcnkgJGFkdmlzb3J5KTogc3RyaW5nIHsKaWYgKCRhZHZpc29yeS0+bGluayAhPT0gbnVsbCAmJiAkYWR2aXNvcnktPmxpbmsgIT09ICcnKSB7CnJldHVybiAnPGhyZWY9Jy5PdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkYWR2aXNvcnktPmxpbmspLic+Jy4kYWR2aXNvcnktPmFkdmlzb3J5SWQuJzwvPic7Cn0KCmlmIChzdHJfc3RhcnRzX3dpdGgoJGFkdmlzb3J5LT5hZHZpc29yeUlkLCAnUEtTQS0nKSkgewpyZXR1cm4gJzxocmVmPScuT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJ2h0dHBzOi8vcGFja2FnaXN0Lm9yZy9zZWN1cml0eS1hZHZpc29yaWVzLycuJGFkdmlzb3J5LT5hZHZpc29yeUlkKS4nPicuJGFkdmlzb3J5LT5hZHZpc29yeUlkLic8Lz4nOwp9CgpyZXR1cm4gJGFkdmlzb3J5LT5hZHZpc29yeUlkOwp9LCAkYWR2aXNvcmllc1snYWR2aXNvcmllcyddWyRwYWNrYWdlTmFtZV0pOwp9IGVsc2UgewokYWR2aXNvcmllc0xpc3QgPSBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uIChzdHJpbmcgJGFkdmlzb3J5SWQpOiBzdHJpbmcgewppZiAoc3RyX3N0YXJ0c193aXRoKCRhZHZpc29yeUlkLCAnUEtTQS0nKSkgewpyZXR1cm4gJzxocmVmPScuT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJ2h0dHBzOi8vcGFja2FnaXN0Lm9yZy9zZWN1cml0eS1hZHZpc29yaWVzLycuJGFkdmlzb3J5SWQpLic+Jy4kYWR2aXNvcnlJZC4nPC8+JzsKfQoKcmV0dXJuICRhZHZpc29yeUlkOwp9LCAkcG9vbC0+Z2V0U2VjdXJpdHlBZHZpc29yeUlkZW50aWZpZXJzRm9yUGFja2FnZVZlcnNpb24oJHBhY2thZ2VOYW1lLCAkY29uc3RyYWludCkpOwp9CgpyZXR1cm4gWyItIFJvb3QgY29tcG9zZXIuanNvbiByZXF1aXJlcyAkcGFja2FnZU5hbWUiLnNlbGY6OmNvbnN0cmFpbnRUb1RleHQoJGNvbnN0cmFpbnQpIC4gJywgJywgJ2ZvdW5kICcuc2VsZjo6Z2V0UGFja2FnZUxpc3QoJHBhY2thZ2VzLCAkaXNWZXJib3NlLCAkcG9vbCwgJGNvbnN0cmFpbnQpLicgYnV0IHRoZXNlIHdlcmUgbm90IGxvYWRlZCwgYmVjYXVzZSB0aGV5IGFyZSBhZmZlY3RlZCBieSBzZWN1cml0eSBhZHZpc29yaWVzICgiJyAuIGltcGxvZGUoJyIsICInLCAkYWR2aXNvcmllc0xpc3QpLiAnIikuIEdvIHRvIGh0dHBzOi8vcGFja2FnaXN0Lm9yZy9zZWN1cml0eS1hZHZpc29yaWVzLyB0byBmaW5kIGFkdmlzb3J5IGRldGFpbHMuIFRvIGlnbm9yZSB0aGUgYWR2aXNvcmllcywgYWRkIHRoZW0gdG8gdGhlIGF1ZGl0ICJpZ25vcmUiIGNvbmZpZy4gVG8gdHVybiB0aGUgZmVhdHVyZSBvZmYgZW50aXJlbHksIHlvdSBjYW4gc2V0ICJibG9jay1pbnNlY3VyZSIgdG8gZmFsc2UgaW4geW91ciAiYXVkaXQiIGNvbmZpZy4nXTsKfQoKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJHBhY2thZ2VOYW1lIi5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KSAuICcsICcsICdmb3VuZCAnLnNlbGY6OmdldFBhY2thZ2VMaXN0KCRwYWNrYWdlcywgJGlzVmVyYm9zZSwgJHBvb2wsICRjb25zdHJhaW50KS4nIGJ1dCB0aGVzZSB3ZXJlIG5vdCBsb2FkZWQsIGxpa2VseSBiZWNhdXNlICcuKHNlbGY6Omhhc011bHRpcGxlTmFtZXMoJHBhY2thZ2VzKSA/ICd0aGV5IGNvbmZsaWN0JyA6ICdpdCBjb25mbGljdHMnKS4nIHdpdGggYW5vdGhlciByZXF1aXJlLiddOwp9CgoKJHBhY2thZ2VzID0gJHJlcG9zaXRvcnlTZXQtPmZpbmRQYWNrYWdlcygkcGFja2FnZU5hbWUsICRjb25zdHJhaW50LCBSZXBvc2l0b3J5U2V0OjpBTExPV19VTkFDQ0VQVEFCTEVfU1RBQklMSVRJRVMpOwppZiAoXGNvdW50KCRwYWNrYWdlcykgPiAwKSB7CgokYWxsUmVwb3NQYWNrYWdlcyA9ICRyZXBvc2l0b3J5U2V0LT5maW5kUGFja2FnZXMoJHBhY2thZ2VOYW1lLCAkY29uc3RyYWludCwgUmVwb3NpdG9yeVNldDo6QUxMT1dfU0hBRE9XRURfUkVQT1NJVE9SSUVTKTsKaWYgKFxjb3VudCgkYWxsUmVwb3NQYWNrYWdlcykgPiAwKSB7CnJldHVybiBzZWxmOjpjb21wdXRlQ2hlY2tGb3JMb3dlclByaW9SZXBvKCRwb29sLCAkaXNWZXJib3NlLCAkcGFja2FnZU5hbWUsICRwYWNrYWdlcywgJGFsbFJlcG9zUGFja2FnZXMsICdtaW5pbXVtLXN0YWJpbGl0eScsICRjb25zdHJhaW50KTsKfQoKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJHBhY2thZ2VOYW1lIi5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KSAuICcsICcsICdmb3VuZCAnLnNlbGY6OmdldFBhY2thZ2VMaXN0KCRwYWNrYWdlcywgJGlzVmVyYm9zZSwgJHBvb2wsICRjb25zdHJhaW50KS4nIGJ1dCAnLihzZWxmOjpoYXNNdWx0aXBsZU5hbWVzKCRwYWNrYWdlcykgPyAndGhlc2UgZG8nIDogJ2l0IGRvZXMnKS4nIG5vdCBtYXRjaCB5b3VyIG1pbmltdW0tc3RhYmlsaXR5LiddOwp9CgoKJHBhY2thZ2VzID0gJHJlcG9zaXRvcnlTZXQtPmZpbmRQYWNrYWdlcygkcGFja2FnZU5hbWUsIG51bGwsIFJlcG9zaXRvcnlTZXQ6OkFMTE9XX1VOQUNDRVBUQUJMRV9TVEFCSUxJVElFUyk7CmlmIChcY291bnQoJHBhY2thZ2VzKSA+IDApIHsKCiRhbGxSZXBvc1BhY2thZ2VzID0gJHJlcG9zaXRvcnlTZXQtPmZpbmRQYWNrYWdlcygkcGFja2FnZU5hbWUsICRjb25zdHJhaW50LCBSZXBvc2l0b3J5U2V0OjpBTExPV19TSEFET1dFRF9SRVBPU0lUT1JJRVMpOwppZiAoXGNvdW50KCRhbGxSZXBvc1BhY2thZ2VzKSA+IDApIHsKcmV0dXJuIHNlbGY6OmNvbXB1dGVDaGVja0Zvckxvd2VyUHJpb1JlcG8oJHBvb2wsICRpc1ZlcmJvc2UsICRwYWNrYWdlTmFtZSwgJHBhY2thZ2VzLCAkYWxsUmVwb3NQYWNrYWdlcywgJ2NvbnN0cmFpbnQnLCAkY29uc3RyYWludCk7Cn0KCiRzdWZmaXggPSAnJzsKaWYgKCRjb25zdHJhaW50IGluc3RhbmNlb2YgQ29uc3RyYWludCAmJiAkY29uc3RyYWludC0+Z2V0VmVyc2lvbigpID09PSAnZGV2LW1hc3RlcicpIHsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRjYW5kaWRhdGUpIHsKaWYgKGluX2FycmF5KCRjYW5kaWRhdGUtPmdldFZlcnNpb24oKSwgWydkZXYtZGVmYXVsdCcsICdkZXYtbWFpbiddLCB0cnVlKSkgewokc3VmZml4ID0gJyBQZXJoYXBzIGRldi1tYXN0ZXIgd2FzIHJlbmFtZWQgdG8gJy4kY2FuZGlkYXRlLT5nZXRQcmV0dHlWZXJzaW9uKCkuJz8nOwpicmVhazsKfQp9Cn0KCgokYWxsUmVwb3NQYWNrYWdlcyA9ICRwYWNrYWdlczsKJHRvcFBhY2thZ2UgPSByZXNldCgkYWxsUmVwb3NQYWNrYWdlcyk7CmlmICgkdG9wUGFja2FnZSBpbnN0YW5jZW9mIFJvb3RQYWNrYWdlSW50ZXJmYWNlKSB7CiRzdWZmaXggPSAnIFNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kZXAtb24tcm9vdCBmb3IgZGV0YWlscyBhbmQgYXNzaXN0YW5jZS4nOwp9CgpyZXR1cm4gWyItIFJvb3QgY29tcG9zZXIuanNvbiByZXF1aXJlcyAkcGFja2FnZU5hbWUiLnNlbGY6OmNvbnN0cmFpbnRUb1RleHQoJGNvbnN0cmFpbnQpIC4gJywgJywgJ2ZvdW5kICcuc2VsZjo6Z2V0UGFja2FnZUxpc3QoJHBhY2thZ2VzLCAkaXNWZXJib3NlLCAkcG9vbCwgJGNvbnN0cmFpbnQpLicgYnV0ICcuKHNlbGY6Omhhc011bHRpcGxlTmFtZXMoJHBhY2thZ2VzKSA/ICd0aGVzZSBkbycgOiAnaXQgZG9lcycpLicgbm90IG1hdGNoIHRoZSBjb25zdHJhaW50LicgLiAkc3VmZml4XTsKfQoKaWYgKCFQcmVnOjppc01hdGNoKCd7XltBLVphLXowLTlfLi8tXSskfScsICRwYWNrYWdlTmFtZSkpIHsKJGlsbGVnYWxDaGFycyA9IFByZWc6OnJlcGxhY2UoJ3tbQS1aYS16MC05Xy4vLV0rfScsICcnLCAkcGFja2FnZU5hbWUpOwoKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJHBhY2thZ2VOYW1lLCBpdCAiLCAnY291bGQgbm90IGJlIGZvdW5kLCBpdCBsb29rcyBsaWtlIGl0cyBuYW1lIGlzIGludmFsaWQsICInLiRpbGxlZ2FsQ2hhcnMuJyIgaXMgbm90IGFsbG93ZWQgaW4gcGFja2FnZSBuYW1lcy4nXTsKfQoKJHByb3ZpZGVyc1N0ciA9IHNlbGY6OmdldFByb3ZpZGVyc0xpc3QoJHJlcG9zaXRvcnlTZXQsICRwYWNrYWdlTmFtZSwgMTUpOwppZiAoJHByb3ZpZGVyc1N0ciAhPT0gbnVsbCkgewpyZXR1cm4gWyItIFJvb3QgY29tcG9zZXIuanNvbiByZXF1aXJlcyAkcGFja2FnZU5hbWUiLnNlbGY6OmNvbnN0cmFpbnRUb1RleHQoJGNvbnN0cmFpbnQpLiIsIGl0ICIsICJjb3VsZCBub3QgYmUgZm91bmQgaW4gYW55IHZlcnNpb24sIGJ1dCB0aGUgZm9sbG93aW5nIHBhY2thZ2VzIHByb3ZpZGUgaXQ6XG4iLiRwcm92aWRlcnNTdHIuIiAgICAgIENvbnNpZGVyIHJlcXVpcmluZyBvbmUgb2YgdGhlc2UgdG8gc2F0aXNmeSB0aGUgJHBhY2thZ2VOYW1lIHJlcXVpcmVtZW50LiJdOwp9CgpyZXR1cm4gWyItIFJvb3QgY29tcG9zZXIuanNvbiByZXF1aXJlcyAkcGFja2FnZU5hbWUsIGl0ICIsICJjb3VsZCBub3QgYmUgZm91bmQgaW4gYW55IHZlcnNpb24sIHRoZXJlIG1heSBiZSBhIHR5cG8gaW4gdGhlIHBhY2thZ2UgbmFtZS4iXTsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UGFja2FnZUxpc3QoYXJyYXkgJHBhY2thZ2VzLCBib29sICRpc1ZlcmJvc2UsID9Qb29sICRwb29sID0gbnVsbCwgP0NvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQgPSBudWxsLCBib29sICR1c2VSZW1vdmVkVmVyc2lvbkdyb3VwID0gZmFsc2UpOiBzdHJpbmcKewokcHJlcGFyZWQgPSBbXTsKJGhhc0RlZmF1bHRCcmFuY2ggPSBbXTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRwcmVwYXJlZFskcGFja2FnZS0+Z2V0TmFtZSgpXVsnbmFtZSddID0gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKTsKJHByZXBhcmVkWyRwYWNrYWdlLT5nZXROYW1lKCldWyd2ZXJzaW9ucyddWyRwYWNrYWdlLT5nZXRWZXJzaW9uKCldID0gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKS4oJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UgPyAnIChhbGlhcyBvZiAnLiRwYWNrYWdlLT5nZXRBbGlhc09mKCktPmdldFByZXR0eVZlcnNpb24oKS4nKScgOiAnJyk7CmlmICgkcG9vbCAhPT0gbnVsbCAmJiAkY29uc3RyYWludCAhPT0gbnVsbCkgewpmb3JlYWNoICgkcG9vbC0+Z2V0UmVtb3ZlZFZlcnNpb25zKCRwYWNrYWdlLT5nZXROYW1lKCksICRjb25zdHJhaW50KSBhcyAkdmVyc2lvbiA9PiAkcHJldHR5VmVyc2lvbikgewokcHJlcGFyZWRbJHBhY2thZ2UtPmdldE5hbWUoKV1bJ3ZlcnNpb25zJ11bJHZlcnNpb25dID0gJHByZXR0eVZlcnNpb247Cn0KfQppZiAoJHBvb2wgIT09IG51bGwgJiYgJHVzZVJlbW92ZWRWZXJzaW9uR3JvdXApIHsKZm9yZWFjaCAoJHBvb2wtPmdldFJlbW92ZWRWZXJzaW9uc0J5UGFja2FnZShzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpKSBhcyAkdmVyc2lvbiA9PiAkcHJldHR5VmVyc2lvbikgewokcHJlcGFyZWRbJHBhY2thZ2UtPmdldE5hbWUoKV1bJ3ZlcnNpb25zJ11bJHZlcnNpb25dID0gJHByZXR0eVZlcnNpb247Cn0KfQppZiAoJHBhY2thZ2UtPmlzRGVmYXVsdEJyYW5jaCgpKSB7CiRoYXNEZWZhdWx0QnJhbmNoWyRwYWNrYWdlLT5nZXROYW1lKCldID0gdHJ1ZTsKfQp9CgokcHJlcGFyZWRTdHJpbmdzID0gW107CmZvcmVhY2ggKCRwcmVwYXJlZCBhcyAkbmFtZSA9PiAkcGFja2FnZSkgewoKaWYgKGlzc2V0KCRwYWNrYWdlWyd2ZXJzaW9ucyddW1ZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTXSwgJGhhc0RlZmF1bHRCcmFuY2hbJG5hbWVdKSkgewp1bnNldCgkcGFja2FnZVsndmVyc2lvbnMnXVtWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBU10pOwp9Cgp1a3NvcnQoJHBhY2thZ2VbJ3ZlcnNpb25zJ10sICd2ZXJzaW9uX2NvbXBhcmUnKTsKCmlmICghJGlzVmVyYm9zZSkgewokcGFja2FnZVsndmVyc2lvbnMnXSA9IHNlbGY6OmNvbmRlbnNlVmVyc2lvbkxpc3QoJHBhY2thZ2VbJ3ZlcnNpb25zJ10sIDQpOwp9CiRwcmVwYXJlZFN0cmluZ3NbXSA9ICRwYWNrYWdlWyduYW1lJ10uJ1snLmltcGxvZGUoJywgJywgJHBhY2thZ2VbJ3ZlcnNpb25zJ10pLiddJzsKfQoKcmV0dXJuIGltcGxvZGUoJywgJywgJHByZXBhcmVkU3RyaW5ncyk7Cn0KCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRQbGF0Zm9ybVBhY2thZ2VWZXJzaW9uKFBvb2wgJHBvb2wsIHN0cmluZyAkcGFja2FnZU5hbWUsIHN0cmluZyAkdmVyc2lvbik6ID9zdHJpbmcKewokYXZhaWxhYmxlID0gJHBvb2wtPndoYXRQcm92aWRlcygkcGFja2FnZU5hbWUpOwoKaWYgKFxjb3VudCgkYXZhaWxhYmxlKSA+IDApIHsKJHNlbGVjdGVkID0gbnVsbDsKZm9yZWFjaCAoJGF2YWlsYWJsZSBhcyAkcGtnKSB7CmlmICgkcGtnLT5nZXRSZXBvc2l0b3J5KCkgaW5zdGFuY2VvZiBQbGF0Zm9ybVJlcG9zaXRvcnkpIHsKJHNlbGVjdGVkID0gJHBrZzsKYnJlYWs7Cn0KfQppZiAoJHNlbGVjdGVkID09PSBudWxsKSB7CiRzZWxlY3RlZCA9IHJlc2V0KCRhdmFpbGFibGUpOwp9CgoKaWYgKCRzZWxlY3RlZC0+Z2V0TmFtZSgpICE9PSAkcGFja2FnZU5hbWUpIHsKCmZvcmVhY2ggKGFycmF5X21lcmdlKGFycmF5X3ZhbHVlcygkc2VsZWN0ZWQtPmdldFByb3ZpZGVzKCkpLCBhcnJheV92YWx1ZXMoJHNlbGVjdGVkLT5nZXRSZXBsYWNlcygpKSkgYXMgJGxpbmspIHsKaWYgKCRsaW5rLT5nZXRUYXJnZXQoKSA9PT0gJHBhY2thZ2VOYW1lKSB7CnJldHVybiAkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpLicgJy5zdWJzdHIoJGxpbmstPmdldERlc2NyaXB0aW9uKCksIDAsIC0xKS4nZCBieSAnLiRzZWxlY3RlZC0+Z2V0UHJldHR5U3RyaW5nKCk7Cn0KfQp9CgokdmVyc2lvbiA9ICRzZWxlY3RlZC0+Z2V0UHJldHR5VmVyc2lvbigpOwokZXh0cmEgPSAkc2VsZWN0ZWQtPmdldEV4dHJhKCk7CmlmICgkc2VsZWN0ZWQgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJiYgaXNzZXQoJGV4dHJhWydjb25maWcucGxhdGZvcm0nXSkgJiYgJGV4dHJhWydjb25maWcucGxhdGZvcm0nXSA9PT0gdHJ1ZSkgewokdmVyc2lvbiAuPSAnOyAnIC4gc3RyX3JlcGxhY2UoJ1BhY2thZ2UgJywgJycsIChzdHJpbmcpICRzZWxlY3RlZC0+Z2V0RGVzY3JpcHRpb24oKSk7Cn0KfSBlbHNlIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiAkdmVyc2lvbjsKfQoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNvbmRlbnNlVmVyc2lvbkxpc3QoYXJyYXkgJHZlcnNpb25zLCBpbnQgJG1heCwgaW50ICRtYXhEZXYgPSAxNik6IGFycmF5CnsKaWYgKGNvdW50KCR2ZXJzaW9ucykgPD0gJG1heCkgewpyZXR1cm4gYXJyYXlfdmFsdWVzKCR2ZXJzaW9ucyk7Cn0KCiRmaWx0ZXJlZCA9IFtdOwokYnlNYWpvciA9IFtdOwpmb3JlYWNoICgkdmVyc2lvbnMgYXMgJHZlcnNpb24gPT4gJHByZXR0eSkgewppZiAoMCA9PT0gc3RyaXBvcygoc3RyaW5nKSAkdmVyc2lvbiwgJ2Rldi0nKSkgewokYnlNYWpvclsnZGV2J11bXSA9ICRwcmV0dHk7Cn0gZWxzZSB7CiRieU1ham9yW1ByZWc6OnJlcGxhY2UoJ3teKFxkKylcLi4qfScsICckMScsIChzdHJpbmcpICR2ZXJzaW9uKV1bXSA9ICRwcmV0dHk7Cn0KfQpmb3JlYWNoICgkYnlNYWpvciBhcyAkbWFqb3JWZXJzaW9uID0+ICR2ZXJzaW9uc0Zvck1ham9yKSB7CiRtYXhWZXJzaW9ucyA9ICRtYWpvclZlcnNpb24gPT09ICdkZXYnID8gJG1heERldiA6ICRtYXg7CmlmIChjb3VudCgkdmVyc2lvbnNGb3JNYWpvcikgPiAkbWF4VmVyc2lvbnMpIHsKCiRmaWx0ZXJlZFtdID0gJHZlcnNpb25zRm9yTWFqb3JbMF07CiRmaWx0ZXJlZFtdID0gJy4uLic7CiRmaWx0ZXJlZFtdID0gJHZlcnNpb25zRm9yTWFqb3JbY291bnQoJHZlcnNpb25zRm9yTWFqb3IpIC0gMV07Cn0gZWxzZSB7CiRmaWx0ZXJlZCA9IGFycmF5X21lcmdlKCRmaWx0ZXJlZCwgJHZlcnNpb25zRm9yTWFqb3IpOwp9Cn0KCnJldHVybiAkZmlsdGVyZWQ7Cn0KCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGhhc011bHRpcGxlTmFtZXMoYXJyYXkgJHBhY2thZ2VzKTogYm9vbAp7CiRuYW1lID0gbnVsbDsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CmlmICgkbmFtZSA9PT0gbnVsbCB8fCAkbmFtZSA9PT0gJHBhY2thZ2UtPmdldE5hbWUoKSkgewokbmFtZSA9ICRwYWNrYWdlLT5nZXROYW1lKCk7Cn0gZWxzZSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjb21wdXRlQ2hlY2tGb3JMb3dlclByaW9SZXBvKFBvb2wgJHBvb2wsIGJvb2wgJGlzVmVyYm9zZSwgc3RyaW5nICRwYWNrYWdlTmFtZSwgYXJyYXkgJGhpZ2hlclJlcG9QYWNrYWdlcywgYXJyYXkgJGFsbFJlcG9zUGFja2FnZXMsIHN0cmluZyAkcmVhc29uLCA/Q29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCA9IG51bGwpOiBhcnJheQp7CiRuZXh0UmVwb1BhY2thZ2VzID0gW107CiRuZXh0UmVwbyA9IG51bGw7Cgpmb3JlYWNoICgkYWxsUmVwb3NQYWNrYWdlcyBhcyAkcGFja2FnZSkgewppZiAoJG5leHRSZXBvID09PSBudWxsIHx8ICRuZXh0UmVwbyA9PT0gJHBhY2thZ2UtPmdldFJlcG9zaXRvcnkoKSkgewokbmV4dFJlcG9QYWNrYWdlc1tdID0gJHBhY2thZ2U7CiRuZXh0UmVwbyA9ICRwYWNrYWdlLT5nZXRSZXBvc2l0b3J5KCk7Cn0gZWxzZSB7CmJyZWFrOwp9Cn0KCmFzc2VydChudWxsICE9PSAkbmV4dFJlcG8pOwoKaWYgKFxjb3VudCgkaGlnaGVyUmVwb1BhY2thZ2VzKSA+IDApIHsKJHRvcFBhY2thZ2UgPSByZXNldCgkaGlnaGVyUmVwb1BhY2thZ2VzKTsKaWYgKCR0b3BQYWNrYWdlIGluc3RhbmNlb2YgUm9vdFBhY2thZ2VJbnRlcmZhY2UpIHsKcmV0dXJuIFsKIi0gUm9vdCBjb21wb3Nlci5qc29uIHJlcXVpcmVzICRwYWNrYWdlTmFtZSIuc2VsZjo6Y29uc3RyYWludFRvVGV4dCgkY29uc3RyYWludCkuJywgaXQgaXMgJywKJ3NhdGlzZmlhYmxlIGJ5ICcuc2VsZjo6Z2V0UGFja2FnZUxpc3QoJG5leHRSZXBvUGFja2FnZXMsICRpc1ZlcmJvc2UsICRwb29sLCAkY29uc3RyYWludCkuJyBmcm9tICcuJG5leHRSZXBvLT5nZXRSZXBvTmFtZSgpLicgYnV0ICcuJHRvcFBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nICcuJHRvcFBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKS4nIGlzIHRoZSByb290IHBhY2thZ2UgYW5kIGNhbm5vdCBiZSBtb2RpZmllZC4gU2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RlcC1vbi1yb290IGZvciBkZXRhaWxzIGFuZCBhc3Npc3RhbmNlLicsCl07Cn0KfQoKaWYgKCRuZXh0UmVwbyBpbnN0YW5jZW9mIExvY2tBcnJheVJlcG9zaXRvcnkpIHsKJHNpbmd1bGFyID0gY291bnQoJGhpZ2hlclJlcG9QYWNrYWdlcykgPT09IDE7Cgokc3VnZ2VzdGlvbiA9ICdNYWtlIHN1cmUgeW91IGVpdGhlciBmaXggdGhlICcuJHJlYXNvbi4nIG9yIGF2b2lkIHVwZGF0aW5nIHRoaXMgcGFja2FnZSB0byBrZWVwIHRoZSBvbmUgcHJlc2VudCBpbiB0aGUgbG9jayBmaWxlICgnLnNlbGY6OmdldFBhY2thZ2VMaXN0KCRuZXh0UmVwb1BhY2thZ2VzLCAkaXNWZXJib3NlLCAkcG9vbCwgJGNvbnN0cmFpbnQpLicpLic7CgppZiAoJG5leHRSZXBvUGFja2FnZXNbMF0tPmdldERpc3RUeXBlKCkgPT09ICdwYXRoJykgewokdHJhbnNwb3J0T3B0aW9ucyA9ICRuZXh0UmVwb1BhY2thZ2VzWzBdLT5nZXRUcmFuc3BvcnRPcHRpb25zKCk7CmlmICghaXNzZXQoJHRyYW5zcG9ydE9wdGlvbnNbJ3N5bWxpbmsnXSkgfHwgJHRyYW5zcG9ydE9wdGlvbnNbJ3N5bWxpbmsnXSAhPT0gZmFsc2UpIHsKJHN1Z2dlc3Rpb24gPSAnTWFrZSBzdXJlIHlvdSBmaXggdGhlICcuJHJlYXNvbi4nIGFzIHBhY2thZ2VzIGluc3RhbGxlZCBmcm9tIHN5bWxpbmtlZCBwYXRoIHJlcG9zIGFyZSB1cGRhdGVkIGV2ZW4gaW4gcGFydGlhbCB1cGRhdGVzIGFuZCB0aGUgb25lIGZyb20gdGhlIGxvY2sgZmlsZSBjYW4gdGh1cyBub3QgYmUgdXNlZC4nOwp9Cn0KCnJldHVybiBbIi0gUm9vdCBjb21wb3Nlci5qc29uIHJlcXVpcmVzICRwYWNrYWdlTmFtZSIuc2VsZjo6Y29uc3RyYWludFRvVGV4dCgkY29uc3RyYWludCkgLiAnLCAnLAonZm91bmQgJyAuIHNlbGY6OmdldFBhY2thZ2VMaXN0KCRoaWdoZXJSZXBvUGFja2FnZXMsICRpc1ZlcmJvc2UsICRwb29sLCAkY29uc3RyYWludCkuJyBidXQgJyAuICgkc2luZ3VsYXIgPyAnaXQgZG9lcycgOiAndGhlc2UgZG8nKSAuICcgbm90IG1hdGNoIHlvdXIgJy4kcmVhc29uLicgYW5kICcgLiAoJHNpbmd1bGFyID8gJ2lzJyA6ICdhcmUnKSAuICcgdGhlcmVmb3JlIG5vdCBpbnN0YWxsYWJsZS4gJy4kc3VnZ2VzdGlvbiwKXTsKfQoKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJHBhY2thZ2VOYW1lIi5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KSAuICcsIGl0IGlzICcsICdzYXRpc2ZpYWJsZSBieSAnLnNlbGY6OmdldFBhY2thZ2VMaXN0KCRuZXh0UmVwb1BhY2thZ2VzLCAkaXNWZXJib3NlLCAkcG9vbCwgJGNvbnN0cmFpbnQpLicgZnJvbSAnLiRuZXh0UmVwby0+Z2V0UmVwb05hbWUoKS4nIGJ1dCAnLnNlbGY6OmdldFBhY2thZ2VMaXN0KCRoaWdoZXJSZXBvUGFja2FnZXMsICRpc1ZlcmJvc2UsICRwb29sLCAkY29uc3RyYWludCkuJyBmcm9tICcucmVzZXQoJGhpZ2hlclJlcG9QYWNrYWdlcyktPmdldFJlcG9zaXRvcnkoKS0+Z2V0UmVwb05hbWUoKS4nIGhhcyBoaWdoZXIgcmVwb3NpdG9yeSBwcmlvcml0eS4gVGhlIHBhY2thZ2VzIGZyb20gdGhlIGhpZ2hlciBwcmlvcml0eSByZXBvc2l0b3J5IGRvIG5vdCBtYXRjaCB5b3VyICcuJHJlYXNvbi4nIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBpbnN0YWxsYWJsZS4gVGhhdCByZXBvc2l0b3J5IGlzIGNhbm9uaWNhbCBzbyB0aGUgbG93ZXIgcHJpb3JpdHkgcmVwb1wncyBwYWNrYWdlcyBhcmUgbm90IGluc3RhbGxhYmxlLiBTZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvcmVwb3ByaW8gZm9yIGRldGFpbHMgYW5kIGFzc2lzdGFuY2UuJ107Cn0KCgoKCnByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gY29uc3RyYWludFRvVGV4dCg/Q29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCA9IG51bGwpOiBzdHJpbmcKewppZiAoJGNvbnN0cmFpbnQgaW5zdGFuY2VvZiBDb25zdHJhaW50ICYmICRjb25zdHJhaW50LT5nZXRPcGVyYXRvcigpID09PSBDb25zdHJhaW50OjpTVFJfT1BfRVEgJiYgIXN0cl9zdGFydHNfd2l0aCgkY29uc3RyYWludC0+Z2V0VmVyc2lvbigpLCAnZGV2LScpKSB7CmlmICghUHJlZzo6aXNNYXRjaCgne15cZCsoPzpcLlxkKykqJH0nLCAkY29uc3RyYWludC0+Z2V0UHJldHR5U3RyaW5nKCkpKSB7CnJldHVybiAnICcuJGNvbnN0cmFpbnQtPmdldFByZXR0eVN0cmluZygpIC4nIChleGFjdCB2ZXJzaW9uIG1hdGNoKSc7Cn0KCiR2ZXJzaW9ucyA9IFskY29uc3RyYWludC0+Z2V0UHJldHR5U3RyaW5nKCldOwpmb3IgKCRpID0gMyAtIHN1YnN0cl9jb3VudCgkdmVyc2lvbnNbMF0sICcuJyk7ICRpID4gMDsgJGktLSkgewokdmVyc2lvbnNbXSA9IGVuZCgkdmVyc2lvbnMpIC4gJy4wJzsKfQoKcmV0dXJuICcgJyAuICRjb25zdHJhaW50LT5nZXRQcmV0dHlTdHJpbmcoKSAuICcgKGV4YWN0IHZlcnNpb24gbWF0Y2g6ICcgLiAoY291bnQoJHZlcnNpb25zKSA+IDEgPyBpbXBsb2RlKCcsICcsIGFycmF5X3NsaWNlKCR2ZXJzaW9ucywgMCwgLTEpKSAuICcgb3IgJyAuIGVuZCgkdmVyc2lvbnMpIDogJHZlcnNpb25zWzBdKSAuICcpJzsKfQoKcmV0dXJuICRjb25zdHJhaW50ICE9PSBudWxsID8gJyAnLiRjb25zdHJhaW50LT5nZXRQcmV0dHlTdHJpbmcoKSA6ICcnOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRQcm92aWRlcnNMaXN0KFJlcG9zaXRvcnlTZXQgJHJlcG9zaXRvcnlTZXQsIHN0cmluZyAkcGFja2FnZU5hbWUsIGludCAkbWF4UHJvdmlkZXJzKTogP3N0cmluZwp7CiRwcm92aWRlcnMgPSAkcmVwb3NpdG9yeVNldC0+Z2V0UHJvdmlkZXJzKCRwYWNrYWdlTmFtZSk7CmlmIChcY291bnQoJHByb3ZpZGVycykgPiAwKSB7CiRwcm92aWRlcnNTdHIgPSBpbXBsb2RlKGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRwKTogc3RyaW5nIHsKJGRlc2NyaXB0aW9uID0gJHBbJ2Rlc2NyaXB0aW9uJ10gIT09ICcnICYmICRwWydkZXNjcmlwdGlvbiddICE9PSBudWxsID8gJyAnLnN1YnN0cigkcFsnZGVzY3JpcHRpb24nXSwgMCwgMTAwKSA6ICcnOwoKcmV0dXJuICcgICAgICAtICcuJHBbJ25hbWUnXS4kZGVzY3JpcHRpb24uIlxuIjsKfSwgY291bnQoJHByb3ZpZGVycykgPiAkbWF4UHJvdmlkZXJzICsgMSA/IGFycmF5X3NsaWNlKCRwcm92aWRlcnMsIDAsICRtYXhQcm92aWRlcnMpIDogJHByb3ZpZGVycykpOwppZiAoY291bnQoJHByb3ZpZGVycykgPiAkbWF4UHJvdmlkZXJzICsgMSkgewokcHJvdmlkZXJzU3RyIC49ICcgICAgICAuLi4gYW5kICcuKGNvdW50KCRwcm92aWRlcnMpIC0gJG1heFByb3ZpZGVycykuJyBtb3JlLicuIlxuIjsKfQoKcmV0dXJuICRwcm92aWRlcnNTdHI7Cn0KCnJldHVybiBudWxsOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxMb2NrQXJyYXlSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE1hdGNoQWxsQ29uc3RyYWludDsKCgoKCmNsYXNzIFJlcXVlc3QKewoKCgpwdWJsaWMgY29uc3QgVVBEQVRFX09OTFlfTElTVEVEID0gMDsKCgoKCgpwdWJsaWMgY29uc3QgVVBEQVRFX0xJU1RFRF9XSVRIX1RSQU5TSVRJVkVfREVQU19OT19ST09UX1JFUVVJUkUgPSAxOwoKCgoKCnB1YmxpYyBjb25zdCBVUERBVEVfTElTVEVEX1dJVEhfVFJBTlNJVElWRV9ERVBTID0gMjsKCgpwcm90ZWN0ZWQgJGxvY2tlZFJlcG9zaXRvcnk7Cgpwcm90ZWN0ZWQgJHJlcXVpcmVzID0gW107Cgpwcm90ZWN0ZWQgJGZpeGVkUGFja2FnZXMgPSBbXTsKCnByb3RlY3RlZCAkbG9ja2VkUGFja2FnZXMgPSBbXTsKCnByb3RlY3RlZCAkZml4ZWRMb2NrZWRQYWNrYWdlcyA9IFtdOwoKcHJvdGVjdGVkICR1cGRhdGVBbGxvd0xpc3QgPSBbXTsKCnByb3RlY3RlZCAkdXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzID0gZmFsc2U7Cgpwcml2YXRlICRyZXN0cmljdGVkUGFja2FnZXMgPSBudWxsOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9Mb2NrQXJyYXlSZXBvc2l0b3J5ICRsb2NrZWRSZXBvc2l0b3J5ID0gbnVsbCkKewokdGhpcy0+bG9ja2VkUmVwb3NpdG9yeSA9ICRsb2NrZWRSZXBvc2l0b3J5Owp9CgpwdWJsaWMgZnVuY3Rpb24gcmVxdWlyZU5hbWUoc3RyaW5nICRwYWNrYWdlTmFtZSwgP0NvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQgPSBudWxsKTogdm9pZAp7CiRwYWNrYWdlTmFtZSA9IHN0cnRvbG93ZXIoJHBhY2thZ2VOYW1lKTsKCmlmICgkY29uc3RyYWludCA9PT0gbnVsbCkgewokY29uc3RyYWludCA9IG5ldyBNYXRjaEFsbENvbnN0cmFpbnQoKTsKfQppZiAoaXNzZXQoJHRoaXMtPnJlcXVpcmVzWyRwYWNrYWdlTmFtZV0pKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ092ZXJ3cml0aW5nIHJlcXVpcmVzIHNlZW1zIGxpa2UgYSBidWcgKCcuJHBhY2thZ2VOYW1lLicgJy4kdGhpcy0+cmVxdWlyZXNbJHBhY2thZ2VOYW1lXS0+Z2V0UHJldHR5U3RyaW5nKCkuJyA9PiAnLiRjb25zdHJhaW50LT5nZXRQcmV0dHlTdHJpbmcoKS4nLCBjaGVjayB3aHkgaXQgaXMgaGFwcGVuaW5nLCBtaWdodCBiZSBhIHJvb3QgYWxpYXMnKTsKfQokdGhpcy0+cmVxdWlyZXNbJHBhY2thZ2VOYW1lXSA9ICRjb25zdHJhaW50Owp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZml4UGFja2FnZShCYXNlUGFja2FnZSAkcGFja2FnZSk6IHZvaWQKewokdGhpcy0+Zml4ZWRQYWNrYWdlc1tzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSA9ICRwYWNrYWdlOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGxvY2tQYWNrYWdlKEJhc2VQYWNrYWdlICRwYWNrYWdlKTogdm9pZAp7CiR0aGlzLT5sb2NrZWRQYWNrYWdlc1tzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSA9ICRwYWNrYWdlOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpeExvY2tlZFBhY2thZ2UoQmFzZVBhY2thZ2UgJHBhY2thZ2UpOiB2b2lkCnsKJHRoaXMtPmZpeGVkUGFja2FnZXNbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0gPSAkcGFja2FnZTsKJHRoaXMtPmZpeGVkTG9ja2VkUGFja2FnZXNbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0gPSAkcGFja2FnZTsKfQoKcHVibGljIGZ1bmN0aW9uIHVubG9ja1BhY2thZ2UoQmFzZVBhY2thZ2UgJHBhY2thZ2UpOiB2b2lkCnsKdW5zZXQoJHRoaXMtPmxvY2tlZFBhY2thZ2VzW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldKTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRVcGRhdGVBbGxvd0xpc3QoYXJyYXkgJHVwZGF0ZUFsbG93TGlzdCwgJHVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyk6IHZvaWQKewokdGhpcy0+dXBkYXRlQWxsb3dMaXN0ID0gJHVwZGF0ZUFsbG93TGlzdDsKJHRoaXMtPnVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyA9ICR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVcGRhdGVBbGxvd0xpc3QoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnVwZGF0ZUFsbG93TGlzdDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcygpOiBib29sCnsKcmV0dXJuICR0aGlzLT51cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMgIT09IHNlbGY6OlVQREFURV9PTkxZX0xJU1RFRDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFVwZGF0ZUFsbG93VHJhbnNpdGl2ZVJvb3REZXBlbmRlbmNpZXMoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+dXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzID09PSBzZWxmOjpVUERBVEVfTElTVEVEX1dJVEhfVFJBTlNJVElWRV9ERVBTOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVxdWlyZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnJlcXVpcmVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Rml4ZWRQYWNrYWdlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+Zml4ZWRQYWNrYWdlczsKfQoKcHVibGljIGZ1bmN0aW9uIGlzRml4ZWRQYWNrYWdlKEJhc2VQYWNrYWdlICRwYWNrYWdlKTogYm9vbAp7CnJldHVybiBpc3NldCgkdGhpcy0+Zml4ZWRQYWNrYWdlc1tzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMb2NrZWRQYWNrYWdlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+bG9ja2VkUGFja2FnZXM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0xvY2tlZFBhY2thZ2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IGJvb2wKewpyZXR1cm4gaXNzZXQoJHRoaXMtPmxvY2tlZFBhY2thZ2VzW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldKSB8fCBpc3NldCgkdGhpcy0+Zml4ZWRMb2NrZWRQYWNrYWdlc1tzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGaXhlZE9yTG9ja2VkUGFja2FnZXMoKTogYXJyYXkKewpyZXR1cm4gYXJyYXlfbWVyZ2UoJHRoaXMtPmZpeGVkUGFja2FnZXMsICR0aGlzLT5sb2NrZWRQYWNrYWdlcyk7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByZXNlbnRNYXAoYm9vbCAkcGFja2FnZUlkcyA9IGZhbHNlKTogYXJyYXkKewokcHJlc2VudE1hcCA9IFtdOwoKaWYgKCR0aGlzLT5sb2NrZWRSZXBvc2l0b3J5ICE9PSBudWxsKSB7CmZvcmVhY2ggKCR0aGlzLT5sb2NrZWRSZXBvc2l0b3J5LT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiRwcmVzZW50TWFwWyRwYWNrYWdlSWRzID8gJHBhY2thZ2UtPmdldElkKCkgOiBzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSA9ICRwYWNrYWdlOwp9Cn0KCmZvcmVhY2ggKCR0aGlzLT5maXhlZFBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRwcmVzZW50TWFwWyRwYWNrYWdlSWRzID8gJHBhY2thZ2UtPmdldElkKCkgOiBzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSA9ICRwYWNrYWdlOwp9CgpyZXR1cm4gJHByZXNlbnRNYXA7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGaXhlZFBhY2thZ2VzTWFwKCk6IGFycmF5CnsKJGZpeGVkUGFja2FnZXNNYXAgPSBbXTsKCmZvcmVhY2ggKCR0aGlzLT5maXhlZFBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRmaXhlZFBhY2thZ2VzTWFwWyRwYWNrYWdlLT5nZXRJZCgpXSA9ICRwYWNrYWdlOwp9CgpyZXR1cm4gJGZpeGVkUGFja2FnZXNNYXA7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRMb2NrZWRSZXBvc2l0b3J5KCk6ID9Mb2NrQXJyYXlSZXBvc2l0b3J5CnsKcmV0dXJuICR0aGlzLT5sb2NrZWRSZXBvc2l0b3J5Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXN0cmljdFBhY2thZ2VzKGFycmF5ICRuYW1lcyk6IHZvaWQKewokdGhpcy0+cmVzdHJpY3RlZFBhY2thZ2VzID0gJG5hbWVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVzdHJpY3RlZFBhY2thZ2VzKCk6ID9hcnJheQp7CnJldHVybiAkdGhpcy0+cmVzdHJpY3RlZFBhY2thZ2VzOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXExpbms7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVNldDsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CgoKCgoKCmFic3RyYWN0IGNsYXNzIFJ1bGUKewoKcHVibGljIGNvbnN0IFJVTEVfUk9PVF9SRVFVSVJFID0gMjsgCnB1YmxpYyBjb25zdCBSVUxFX0ZJWEVEID0gMzsgCnB1YmxpYyBjb25zdCBSVUxFX1BBQ0tBR0VfQ09ORkxJQ1QgPSA2OyAKcHVibGljIGNvbnN0IFJVTEVfUEFDS0FHRV9SRVFVSVJFUyA9IDc7IApwdWJsaWMgY29uc3QgUlVMRV9QQUNLQUdFX1NBTUVfTkFNRSA9IDEwOyAKcHVibGljIGNvbnN0IFJVTEVfTEVBUk5FRCA9IDEyOyAKcHVibGljIGNvbnN0IFJVTEVfUEFDS0FHRV9BTElBUyA9IDEzOyAKcHVibGljIGNvbnN0IFJVTEVfUEFDS0FHRV9JTlZFUlNFX0FMSUFTID0gMTQ7IAoKCnByaXZhdGUgY29uc3QgQklURklFTERfVFlQRSA9IDA7CnByaXZhdGUgY29uc3QgQklURklFTERfUkVBU09OID0gODsKcHJpdmF0ZSBjb25zdCBCSVRGSUVMRF9ESVNBQkxFRCA9IDE2OwoKCnByb3RlY3RlZCAkYml0ZmllbGQ7Cgpwcm90ZWN0ZWQgJHJlcXVlc3Q7CgoKCgpwcm90ZWN0ZWQgJHJlYXNvbkRhdGE7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHJlYXNvbiwgJHJlYXNvbkRhdGEpCnsKJHRoaXMtPnJlYXNvbkRhdGEgPSAkcmVhc29uRGF0YTsKCiR0aGlzLT5iaXRmaWVsZCA9ICgwIDw8IHNlbGY6OkJJVEZJRUxEX0RJU0FCTEVEKSB8CigkcmVhc29uIDw8IHNlbGY6OkJJVEZJRUxEX1JFQVNPTikgfAooMjU1IDw8IHNlbGY6OkJJVEZJRUxEX1RZUEUpOwp9CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gZ2V0TGl0ZXJhbHMoKTogYXJyYXk7CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gZ2V0SGFzaCgpOwoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nOwoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGVxdWFscyhSdWxlICRydWxlKTogYm9vbDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZWFzb24oKTogaW50CnsKcmV0dXJuICgkdGhpcy0+Yml0ZmllbGQgJiAoMjU1IDw8IHNlbGY6OkJJVEZJRUxEX1JFQVNPTikpID4+IHNlbGY6OkJJVEZJRUxEX1JFQVNPTjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlYXNvbkRhdGEoKQp7CnJldHVybiAkdGhpcy0+cmVhc29uRGF0YTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcXVpcmVkUGFja2FnZSgpOiA/c3RyaW5nCnsKc3dpdGNoICgkdGhpcy0+Z2V0UmVhc29uKCkpIHsKY2FzZSBzZWxmOjpSVUxFX1JPT1RfUkVRVUlSRToKcmV0dXJuICR0aGlzLT5nZXRSZWFzb25EYXRhKClbJ3BhY2thZ2VOYW1lJ107CmNhc2Ugc2VsZjo6UlVMRV9GSVhFRDoKcmV0dXJuICR0aGlzLT5nZXRSZWFzb25EYXRhKClbJ3BhY2thZ2UnXS0+Z2V0TmFtZSgpOwpjYXNlIHNlbGY6OlJVTEVfUEFDS0FHRV9SRVFVSVJFUzoKcmV0dXJuICR0aGlzLT5nZXRSZWFzb25EYXRhKCktPmdldFRhcmdldCgpOwp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFR5cGUoJHR5cGUpOiB2b2lkCnsKJHRoaXMtPmJpdGZpZWxkID0gKCR0aGlzLT5iaXRmaWVsZCAmIH4oMjU1IDw8IHNlbGY6OkJJVEZJRUxEX1RZUEUpKSB8ICgoMjU1ICYgJHR5cGUpIDw8IHNlbGY6OkJJVEZJRUxEX1RZUEUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0VHlwZSgpOiBpbnQKewpyZXR1cm4gKCR0aGlzLT5iaXRmaWVsZCAmICgyNTUgPDwgc2VsZjo6QklURklFTERfVFlQRSkpID4+IHNlbGY6OkJJVEZJRUxEX1RZUEU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBkaXNhYmxlKCk6IHZvaWQKewokdGhpcy0+Yml0ZmllbGQgPSAoJHRoaXMtPmJpdGZpZWxkICYgfigyNTUgPDwgc2VsZjo6QklURklFTERfRElTQUJMRUQpKSB8ICgxIDw8IHNlbGY6OkJJVEZJRUxEX0RJU0FCTEVEKTsKfQoKcHVibGljIGZ1bmN0aW9uIGVuYWJsZSgpOiB2b2lkCnsKJHRoaXMtPmJpdGZpZWxkICY9IH4oMjU1IDw8IHNlbGY6OkJJVEZJRUxEX0RJU0FCTEVEKTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzRGlzYWJsZWQoKTogYm9vbAp7CnJldHVybiAwICE9PSAoKCR0aGlzLT5iaXRmaWVsZCAmICgyNTUgPDwgc2VsZjo6QklURklFTERfRElTQUJMRUQpKSA+PiBzZWxmOjpCSVRGSUVMRF9ESVNBQkxFRCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0VuYWJsZWQoKTogYm9vbAp7CnJldHVybiAwID09PSAoKCR0aGlzLT5iaXRmaWVsZCAmICgyNTUgPDwgc2VsZjo6QklURklFTERfRElTQUJMRUQpKSA+PiBzZWxmOjpCSVRGSUVMRF9ESVNBQkxFRCk7Cn0KCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBpc0Fzc2VydGlvbigpOiBib29sOwoKcHVibGljIGZ1bmN0aW9uIGlzQ2F1c2VkQnlMb2NrKFJlcG9zaXRvcnlTZXQgJHJlcG9zaXRvcnlTZXQsIFJlcXVlc3QgJHJlcXVlc3QsIFBvb2wgJHBvb2wpOiBib29sCnsKaWYgKCR0aGlzLT5nZXRSZWFzb24oKSA9PT0gc2VsZjo6UlVMRV9QQUNLQUdFX1JFUVVJUkVTKSB7CmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCR0aGlzLT5nZXRSZWFzb25EYXRhKCktPmdldFRhcmdldCgpKSkgewpyZXR1cm4gZmFsc2U7Cn0KaWYgKCRyZXF1ZXN0LT5nZXRMb2NrZWRSZXBvc2l0b3J5KCkgIT09IG51bGwpIHsKZm9yZWFjaCAoJHJlcXVlc3QtPmdldExvY2tlZFJlcG9zaXRvcnkoKS0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UtPmdldE5hbWUoKSA9PT0gJHRoaXMtPmdldFJlYXNvbkRhdGEoKS0+Z2V0VGFyZ2V0KCkpIHsKaWYgKCRwb29sLT5pc1VuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlKCRwYWNrYWdlKSkgewpyZXR1cm4gdHJ1ZTsKfQppZiAoISR0aGlzLT5nZXRSZWFzb25EYXRhKCktPmdldENvbnN0cmFpbnQoKS0+bWF0Y2hlcyhuZXcgQ29uc3RyYWludCgnPScsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkpKSkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKCEkcmVxdWVzdC0+aXNMb2NrZWRQYWNrYWdlKCRwYWNrYWdlKSkgewpyZXR1cm4gdHJ1ZTsKfQpicmVhazsKfQp9Cn0KfQoKaWYgKCR0aGlzLT5nZXRSZWFzb24oKSA9PT0gc2VsZjo6UlVMRV9ST09UX1JFUVVJUkUpIHsKaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJHRoaXMtPmdldFJlYXNvbkRhdGEoKVsncGFja2FnZU5hbWUnXSkpIHsKcmV0dXJuIGZhbHNlOwp9CmlmICgkcmVxdWVzdC0+Z2V0TG9ja2VkUmVwb3NpdG9yeSgpICE9PSBudWxsKSB7CmZvcmVhY2ggKCRyZXF1ZXN0LT5nZXRMb2NrZWRSZXBvc2l0b3J5KCktPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKCRwYWNrYWdlLT5nZXROYW1lKCkgPT09ICR0aGlzLT5nZXRSZWFzb25EYXRhKClbJ3BhY2thZ2VOYW1lJ10pIHsKaWYgKCRwb29sLT5pc1VuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlKCRwYWNrYWdlKSkgewpyZXR1cm4gdHJ1ZTsKfQppZiAoISR0aGlzLT5nZXRSZWFzb25EYXRhKClbJ2NvbnN0cmFpbnQnXS0+bWF0Y2hlcyhuZXcgQ29uc3RyYWludCgnPScsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkpKSkgewpyZXR1cm4gdHJ1ZTsKfQpicmVhazsKfQp9Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlUGFja2FnZShQb29sICRwb29sKTogQmFzZVBhY2thZ2UKewokbGl0ZXJhbHMgPSAkdGhpcy0+Z2V0TGl0ZXJhbHMoKTsKCnN3aXRjaCAoJHRoaXMtPmdldFJlYXNvbigpKSB7CmNhc2Ugc2VsZjo6UlVMRV9QQUNLQUdFX0NPTkZMSUNUOgokcGFja2FnZTEgPSAkdGhpcy0+ZGVkdXBsaWNhdGVEZWZhdWx0QnJhbmNoQWxpYXMoJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGxpdGVyYWxzWzBdKSk7CiRwYWNrYWdlMiA9ICR0aGlzLT5kZWR1cGxpY2F0ZURlZmF1bHRCcmFuY2hBbGlhcygkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbHNbMV0pKTsKCiRyZWFzb25EYXRhID0gJHRoaXMtPmdldFJlYXNvbkRhdGEoKTsKCmlmICgkcmVhc29uRGF0YS0+Z2V0U291cmNlKCkgPT09ICRwYWNrYWdlMS0+Z2V0TmFtZSgpKSB7ClskcGFja2FnZTIsICRwYWNrYWdlMV0gPSBbJHBhY2thZ2UxLCAkcGFja2FnZTJdOwp9CgpyZXR1cm4gJHBhY2thZ2UyOwoKY2FzZSBzZWxmOjpSVUxFX1BBQ0tBR0VfUkVRVUlSRVM6CiRzb3VyY2VMaXRlcmFsID0gJGxpdGVyYWxzWzBdOwokc291cmNlUGFja2FnZSA9ICR0aGlzLT5kZWR1cGxpY2F0ZURlZmF1bHRCcmFuY2hBbGlhcygkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkc291cmNlTGl0ZXJhbCkpOwoKcmV0dXJuICRzb3VyY2VQYWNrYWdlOwoKZGVmYXVsdDoKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignTm90IGltcGxlbWVudGVkJyk7Cn0KfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmV0dHlTdHJpbmcoUmVwb3NpdG9yeVNldCAkcmVwb3NpdG9yeVNldCwgUmVxdWVzdCAkcmVxdWVzdCwgUG9vbCAkcG9vbCwgYm9vbCAkaXNWZXJib3NlLCBhcnJheSAkaW5zdGFsbGVkTWFwID0gW10sIGFycmF5ICRsZWFybmVkUG9vbCA9IFtdKTogc3RyaW5nCnsKJGxpdGVyYWxzID0gJHRoaXMtPmdldExpdGVyYWxzKCk7Cgpzd2l0Y2ggKCR0aGlzLT5nZXRSZWFzb24oKSkgewpjYXNlIHNlbGY6OlJVTEVfUk9PVF9SRVFVSVJFOgokcmVhc29uRGF0YSA9ICR0aGlzLT5nZXRSZWFzb25EYXRhKCk7CiRwYWNrYWdlTmFtZSA9ICRyZWFzb25EYXRhWydwYWNrYWdlTmFtZSddOwokY29uc3RyYWludCA9ICRyZWFzb25EYXRhWydjb25zdHJhaW50J107CgokcGFja2FnZXMgPSAkcG9vbC0+d2hhdFByb3ZpZGVzKCRwYWNrYWdlTmFtZSwgJGNvbnN0cmFpbnQpOwppZiAoMCA9PT0gXGNvdW50KCRwYWNrYWdlcykpIHsKcmV0dXJuICdObyBwYWNrYWdlIGZvdW5kIHRvIHNhdGlzZnkgcm9vdCBjb21wb3Nlci5qc29uIHJlcXVpcmUgJy4kcGFja2FnZU5hbWUuJyAnLiRjb25zdHJhaW50LT5nZXRQcmV0dHlTdHJpbmcoKTsKfQoKJHBhY2thZ2VzTm9uQWxpYXMgPSBhcnJheV92YWx1ZXMoYXJyYXlfZmlsdGVyKCRwYWNrYWdlcywgc3RhdGljIGZ1bmN0aW9uICgkcCk6IGJvb2wgewpyZXR1cm4gISgkcCBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSk7Cn0pKTsKaWYgKFxjb3VudCgkcGFja2FnZXNOb25BbGlhcykgPT09IDEpIHsKJHBhY2thZ2UgPSAkcGFja2FnZXNOb25BbGlhc1swXTsKaWYgKCRyZXF1ZXN0LT5pc0xvY2tlZFBhY2thZ2UoJHBhY2thZ2UpKSB7CnJldHVybiAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLicgaXMgbG9ja2VkIHRvIHZlcnNpb24gJy4kcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpLiIgYW5kIGFuIHVwZGF0ZSBvZiB0aGlzIHBhY2thZ2Ugd2FzIG5vdCByZXF1ZXN0ZWQuIjsKfQp9CgpyZXR1cm4gJ1Jvb3QgY29tcG9zZXIuanNvbiByZXF1aXJlcyAnLiRwYWNrYWdlTmFtZS4nICcuJGNvbnN0cmFpbnQtPmdldFByZXR0eVN0cmluZygpLicgLT4gc2F0aXNmaWFibGUgYnkgJy4kdGhpcy0+Zm9ybWF0UGFja2FnZXNVbmlxdWUoJHBvb2wsICRwYWNrYWdlcywgJGlzVmVyYm9zZSwgJGNvbnN0cmFpbnQpLicuJzsKCmNhc2Ugc2VsZjo6UlVMRV9GSVhFRDoKJHBhY2thZ2UgPSAkdGhpcy0+ZGVkdXBsaWNhdGVEZWZhdWx0QnJhbmNoQWxpYXMoJHRoaXMtPmdldFJlYXNvbkRhdGEoKVsncGFja2FnZSddKTsKCmlmICgkcmVxdWVzdC0+aXNMb2NrZWRQYWNrYWdlKCRwYWNrYWdlKSkgewpyZXR1cm4gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nIGlzIGxvY2tlZCB0byB2ZXJzaW9uICcuJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKS4nIGFuZCBhbiB1cGRhdGUgb2YgdGhpcyBwYWNrYWdlIHdhcyBub3QgcmVxdWVzdGVkLic7Cn0KCnJldHVybiAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLicgaXMgcHJlc2VudCBhdCB2ZXJzaW9uICcuJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKSAuICcgYW5kIGNhbm5vdCBiZSBtb2RpZmllZCBieSBDb21wb3Nlcic7CgpjYXNlIHNlbGY6OlJVTEVfUEFDS0FHRV9DT05GTElDVDoKJHBhY2thZ2UxID0gJHRoaXMtPmRlZHVwbGljYXRlRGVmYXVsdEJyYW5jaEFsaWFzKCRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsc1swXSkpOwokcGFja2FnZTIgPSAkdGhpcy0+ZGVkdXBsaWNhdGVEZWZhdWx0QnJhbmNoQWxpYXMoJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGxpdGVyYWxzWzFdKSk7CgokY29uZmxpY3RUYXJnZXQgPSAkcGFja2FnZTEtPmdldFByZXR0eVN0cmluZygpOwokcmVhc29uRGF0YSA9ICR0aGlzLT5nZXRSZWFzb25EYXRhKCk7CgoKaWYgKCRyZWFzb25EYXRhLT5nZXRTb3VyY2UoKSA9PT0gJHBhY2thZ2UxLT5nZXROYW1lKCkpIHsKWyRwYWNrYWdlMiwgJHBhY2thZ2UxXSA9IFskcGFja2FnZTEsICRwYWNrYWdlMl07CiRjb25mbGljdFRhcmdldCA9ICRwYWNrYWdlMS0+Z2V0UHJldHR5TmFtZSgpLicgJy4kcmVhc29uRGF0YS0+Z2V0UHJldHR5Q29uc3RyYWludCgpOwp9CgoKCmlmICgkcmVhc29uRGF0YS0+Z2V0VGFyZ2V0KCkgIT09ICRwYWNrYWdlMS0+Z2V0TmFtZSgpKSB7CiRwcm92aWRlVHlwZSA9IG51bGw7CiRwcm92aWRlZCA9IG51bGw7CmZvcmVhY2ggKCRwYWNrYWdlMS0+Z2V0UHJvdmlkZXMoKSBhcyAkcHJvdmlkZSkgewppZiAoJHByb3ZpZGUtPmdldFRhcmdldCgpID09PSAkcmVhc29uRGF0YS0+Z2V0VGFyZ2V0KCkpIHsKJHByb3ZpZGVUeXBlID0gJ3Byb3ZpZGVzJzsKJHByb3ZpZGVkID0gJHByb3ZpZGUtPmdldFByZXR0eUNvbnN0cmFpbnQoKTsKYnJlYWs7Cn0KfQpmb3JlYWNoICgkcGFja2FnZTEtPmdldFJlcGxhY2VzKCkgYXMgJHJlcGxhY2UpIHsKaWYgKCRyZXBsYWNlLT5nZXRUYXJnZXQoKSA9PT0gJHJlYXNvbkRhdGEtPmdldFRhcmdldCgpKSB7CiRwcm92aWRlVHlwZSA9ICdyZXBsYWNlcyc7CiRwcm92aWRlZCA9ICRyZXBsYWNlLT5nZXRQcmV0dHlDb25zdHJhaW50KCk7CmJyZWFrOwp9Cn0KaWYgKG51bGwgIT09ICRwcm92aWRlVHlwZSkgewokY29uZmxpY3RUYXJnZXQgPSAkcmVhc29uRGF0YS0+Z2V0VGFyZ2V0KCkuJyAnLiRyZWFzb25EYXRhLT5nZXRQcmV0dHlDb25zdHJhaW50KCkuJyAoJy4kcGFja2FnZTEtPmdldFByZXR0eVN0cmluZygpLicgJy4kcHJvdmlkZVR5cGUuJyAnLiRyZWFzb25EYXRhLT5nZXRUYXJnZXQoKS4nICcuJHByb3ZpZGVkLicpJzsKfQp9CgpyZXR1cm4gJHBhY2thZ2UyLT5nZXRQcmV0dHlTdHJpbmcoKS4nIGNvbmZsaWN0cyB3aXRoICcuJGNvbmZsaWN0VGFyZ2V0LicuJzsKCmNhc2Ugc2VsZjo6UlVMRV9QQUNLQUdFX1JFUVVJUkVTOgphc3NlcnQoXGNvdW50KCRsaXRlcmFscykgPiAwKTsKJHNvdXJjZUxpdGVyYWwgPSBhcnJheV9zaGlmdCgkbGl0ZXJhbHMpOwokc291cmNlUGFja2FnZSA9ICR0aGlzLT5kZWR1cGxpY2F0ZURlZmF1bHRCcmFuY2hBbGlhcygkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkc291cmNlTGl0ZXJhbCkpOwokcmVhc29uRGF0YSA9ICR0aGlzLT5nZXRSZWFzb25EYXRhKCk7CgokcmVxdWlyZXMgPSBbXTsKZm9yZWFjaCAoJGxpdGVyYWxzIGFzICRsaXRlcmFsKSB7CiRyZXF1aXJlc1tdID0gJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGxpdGVyYWwpOwp9CgokdGV4dCA9ICRyZWFzb25EYXRhLT5nZXRQcmV0dHlTdHJpbmcoJHNvdXJjZVBhY2thZ2UpOwppZiAoXGNvdW50KCRyZXF1aXJlcykgPiAwKSB7CiR0ZXh0IC49ICcgLT4gc2F0aXNmaWFibGUgYnkgJyAuICR0aGlzLT5mb3JtYXRQYWNrYWdlc1VuaXF1ZSgkcG9vbCwgJHJlcXVpcmVzLCAkaXNWZXJib3NlLCAkcmVhc29uRGF0YS0+Z2V0Q29uc3RyYWludCgpKSAuICcuJzsKfSBlbHNlIHsKJHRhcmdldE5hbWUgPSAkcmVhc29uRGF0YS0+Z2V0VGFyZ2V0KCk7CgokcmVhc29uID0gUHJvYmxlbTo6Z2V0TWlzc2luZ1BhY2thZ2VSZWFzb24oJHJlcG9zaXRvcnlTZXQsICRyZXF1ZXN0LCAkcG9vbCwgJGlzVmVyYm9zZSwgJHRhcmdldE5hbWUsICRyZWFzb25EYXRhLT5nZXRDb25zdHJhaW50KCkpOwoKcmV0dXJuICR0ZXh0IC4gJyAtPiAnIC4gJHJlYXNvblsxXTsKfQoKcmV0dXJuICR0ZXh0OwoKY2FzZSBzZWxmOjpSVUxFX1BBQ0tBR0VfU0FNRV9OQU1FOgokcGFja2FnZU5hbWVzID0gW107CmZvcmVhY2ggKCRsaXRlcmFscyBhcyAkbGl0ZXJhbCkgewokcGFja2FnZSA9ICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsKTsKJHBhY2thZ2VOYW1lc1skcGFja2FnZS0+Z2V0TmFtZSgpXSA9IHRydWU7Cn0KdW5zZXQoJGxpdGVyYWwpOwokcmVwbGFjZWROYW1lID0gJHRoaXMtPmdldFJlYXNvbkRhdGEoKTsKCmlmIChcY291bnQoJHBhY2thZ2VOYW1lcykgPiAxKSB7CmlmICghaXNzZXQoJHBhY2thZ2VOYW1lc1skcmVwbGFjZWROYW1lXSkpIHsKJHJlYXNvbiA9ICdUaGV5ICcuKFxjb3VudCgkbGl0ZXJhbHMpID09PSAyID8gJ2JvdGgnIDogJ2FsbCcpLicgcmVwbGFjZSAnLiRyZXBsYWNlZE5hbWUuJyBhbmQgdGh1cyBjYW5ub3QgY29leGlzdC4nOwp9IGVsc2UgewokcmVwbGFjZXJOYW1lcyA9ICRwYWNrYWdlTmFtZXM7CnVuc2V0KCRyZXBsYWNlck5hbWVzWyRyZXBsYWNlZE5hbWVdKTsKJHJlcGxhY2VyTmFtZXMgPSBhcnJheV9rZXlzKCRyZXBsYWNlck5hbWVzKTsKCmlmIChcY291bnQoJHJlcGxhY2VyTmFtZXMpID09PSAxKSB7CiRyZWFzb24gPSAkcmVwbGFjZXJOYW1lc1swXSAuICcgcmVwbGFjZXMgJzsKfSBlbHNlIHsKJHJlYXNvbiA9ICdbJy5pbXBsb2RlKCcsICcsICRyZXBsYWNlck5hbWVzKS4nXSByZXBsYWNlICc7Cn0KJHJlYXNvbiAuPSAkcmVwbGFjZWROYW1lLicgYW5kIHRodXMgY2Fubm90IGNvZXhpc3Qgd2l0aCBpdC4nOwp9CgokaW5zdGFsbGVkUGFja2FnZXMgPSBbXTsKJHJlbW92YWJsZVBhY2thZ2VzID0gW107CmZvcmVhY2ggKCRsaXRlcmFscyBhcyAkbGl0ZXJhbCkgewppZiAoaXNzZXQoJGluc3RhbGxlZE1hcFthYnMoJGxpdGVyYWwpXSkpIHsKJGluc3RhbGxlZFBhY2thZ2VzW10gPSAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbCk7Cn0gZWxzZSB7CiRyZW1vdmFibGVQYWNrYWdlc1tdID0gJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGxpdGVyYWwpOwp9Cn0KCmlmIChcY291bnQoJGluc3RhbGxlZFBhY2thZ2VzKSA+IDAgJiYgXGNvdW50KCRyZW1vdmFibGVQYWNrYWdlcykgPiAwKSB7CnJldHVybiAkdGhpcy0+Zm9ybWF0UGFja2FnZXNVbmlxdWUoJHBvb2wsICRyZW1vdmFibGVQYWNrYWdlcywgJGlzVmVyYm9zZSwgbnVsbCwgdHJ1ZSkuJyBjYW5ub3QgYmUgaW5zdGFsbGVkIGFzIHRoYXQgd291bGQgcmVxdWlyZSByZW1vdmluZyAnLiR0aGlzLT5mb3JtYXRQYWNrYWdlc1VuaXF1ZSgkcG9vbCwgJGluc3RhbGxlZFBhY2thZ2VzLCAkaXNWZXJib3NlLCBudWxsLCB0cnVlKS4nLiAnLiRyZWFzb247Cn0KCnJldHVybiAnT25seSBvbmUgb2YgdGhlc2UgY2FuIGJlIGluc3RhbGxlZDogJy4kdGhpcy0+Zm9ybWF0UGFja2FnZXNVbmlxdWUoJHBvb2wsICRsaXRlcmFscywgJGlzVmVyYm9zZSwgbnVsbCwgdHJ1ZSkuJy4gJy4kcmVhc29uOwp9CgpyZXR1cm4gJ1lvdSBjYW4gb25seSBpbnN0YWxsIG9uZSB2ZXJzaW9uIG9mIGEgcGFja2FnZSwgc28gb25seSBvbmUgb2YgdGhlc2UgY2FuIGJlIGluc3RhbGxlZDogJyAuICR0aGlzLT5mb3JtYXRQYWNrYWdlc1VuaXF1ZSgkcG9vbCwgJGxpdGVyYWxzLCAkaXNWZXJib3NlLCBudWxsLCB0cnVlKSAuICcuJzsKY2FzZSBzZWxmOjpSVUxFX0xFQVJORUQ6CgoKCgoKCgokbGVhcm5lZFN0cmluZyA9ICcgKGNvbmZsaWN0IGFuYWx5c2lzIHJlc3VsdCknOwoKaWYgKFxjb3VudCgkbGl0ZXJhbHMpID09PSAxKSB7CiRydWxlVGV4dCA9ICRwb29sLT5saXRlcmFsVG9QcmV0dHlTdHJpbmcoJGxpdGVyYWxzWzBdLCAkaW5zdGFsbGVkTWFwKTsKfSBlbHNlIHsKJGdyb3VwcyA9IFtdOwpmb3JlYWNoICgkbGl0ZXJhbHMgYXMgJGxpdGVyYWwpIHsKJHBhY2thZ2UgPSAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbCk7CmlmIChpc3NldCgkaW5zdGFsbGVkTWFwWyRwYWNrYWdlLT5pZF0pKSB7CiRncm91cCA9ICRsaXRlcmFsID4gMCA/ICdrZWVwJyA6ICdyZW1vdmUnOwp9IGVsc2UgewokZ3JvdXAgPSAkbGl0ZXJhbCA+IDAgPyAnaW5zdGFsbCcgOiAnZG9uXCd0IGluc3RhbGwnOwp9CgokZ3JvdXBzWyRncm91cF1bXSA9ICR0aGlzLT5kZWR1cGxpY2F0ZURlZmF1bHRCcmFuY2hBbGlhcygkcGFja2FnZSk7Cn0KJHJ1bGVUZXh0cyA9IFtdOwpmb3JlYWNoICgkZ3JvdXBzIGFzICRncm91cCA9PiAkcGFja2FnZXMpIHsKJHJ1bGVUZXh0c1tdID0gJGdyb3VwIC4gKFxjb3VudCgkcGFja2FnZXMpID4gMSA/ICcgb25lIG9mJyA6ICcnKS4nICcgLiAkdGhpcy0+Zm9ybWF0UGFja2FnZXNVbmlxdWUoJHBvb2wsICRwYWNrYWdlcywgJGlzVmVyYm9zZSk7Cn0KCiRydWxlVGV4dCA9IGltcGxvZGUoJyB8ICcsICRydWxlVGV4dHMpOwp9CgpyZXR1cm4gJ0NvbmNsdXNpb246ICcuJHJ1bGVUZXh0LiRsZWFybmVkU3RyaW5nOwpjYXNlIHNlbGY6OlJVTEVfUEFDS0FHRV9BTElBUzoKJGFsaWFzUGFja2FnZSA9ICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsc1swXSk7CgoKaWYgKCRhbGlhc1BhY2thZ2UtPmdldFZlcnNpb24oKSA9PT0gVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVMpIHsKcmV0dXJuICcnOwp9CiRwYWNrYWdlID0gJHRoaXMtPmRlZHVwbGljYXRlRGVmYXVsdEJyYW5jaEFsaWFzKCRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsc1sxXSkpOwoKcmV0dXJuICRhbGlhc1BhY2thZ2UtPmdldFByZXR0eVN0cmluZygpIC4nIGlzIGFuIGFsaWFzIG9mICcuJHBhY2thZ2UtPmdldFByZXR0eVN0cmluZygpLicgYW5kIHRodXMgcmVxdWlyZXMgaXQgdG8gYmUgaW5zdGFsbGVkIHRvby4nOwpjYXNlIHNlbGY6OlJVTEVfUEFDS0FHRV9JTlZFUlNFX0FMSUFTOgoKJGFsaWFzUGFja2FnZSA9ICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsc1sxXSk7CgoKaWYgKCRhbGlhc1BhY2thZ2UtPmdldFZlcnNpb24oKSA9PT0gVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVMpIHsKcmV0dXJuICcnOwp9CiRwYWNrYWdlID0gJHRoaXMtPmRlZHVwbGljYXRlRGVmYXVsdEJyYW5jaEFsaWFzKCRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsc1swXSkpOwoKcmV0dXJuICRhbGlhc1BhY2thZ2UtPmdldFByZXR0eVN0cmluZygpIC4nIGlzIGFuIGFsaWFzIG9mICcuJHBhY2thZ2UtPmdldFByZXR0eVN0cmluZygpLicgYW5kIG11c3QgYmUgaW5zdGFsbGVkIHdpdGggaXQuJzsKZGVmYXVsdDoKJHJ1bGVUZXh0ID0gJyc7CmZvcmVhY2ggKCRsaXRlcmFscyBhcyAkaSA9PiAkbGl0ZXJhbCkgewppZiAoJGkgIT09IDApIHsKJHJ1bGVUZXh0IC49ICd8JzsKfQokcnVsZVRleHQgLj0gJHBvb2wtPmxpdGVyYWxUb1ByZXR0eVN0cmluZygkbGl0ZXJhbCwgJGluc3RhbGxlZE1hcCk7Cn0KCnJldHVybiAnKCcuJHJ1bGVUZXh0LicpJzsKfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZm9ybWF0UGFja2FnZXNVbmlxdWUoUG9vbCAkcG9vbCwgYXJyYXkgJGxpdGVyYWxzT3JQYWNrYWdlcywgYm9vbCAkaXNWZXJib3NlLCA/Q29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCA9IG51bGwsIGJvb2wgJHVzZVJlbW92ZWRWZXJzaW9uR3JvdXAgPSBmYWxzZSk6IHN0cmluZwp7CiRwYWNrYWdlcyA9IFtdOwpmb3JlYWNoICgkbGl0ZXJhbHNPclBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRwYWNrYWdlc1tdID0gXGlzX29iamVjdCgkcGFja2FnZSkgPyAkcGFja2FnZSA6ICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRwYWNrYWdlKTsKfQoKcmV0dXJuIFByb2JsZW06OmdldFBhY2thZ2VMaXN0KCRwYWNrYWdlcywgJGlzVmVyYm9zZSwgJHBvb2wsICRjb25zdHJhaW50LCAkdXNlUmVtb3ZlZFZlcnNpb25Hcm91cCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZGVkdXBsaWNhdGVEZWZhdWx0QnJhbmNoQWxpYXMoQmFzZVBhY2thZ2UgJHBhY2thZ2UpOiBCYXNlUGFja2FnZQp7CmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSAmJiAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpID09PSBWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBUykgewokcGFja2FnZSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7Cn0KCnJldHVybiAkcGFja2FnZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7CgoKCgoKY2xhc3MgUnVsZTJMaXRlcmFscyBleHRlbmRzIFJ1bGUKewoKcHJvdGVjdGVkICRsaXRlcmFsMTsKCnByb3RlY3RlZCAkbGl0ZXJhbDI7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoaW50ICRsaXRlcmFsMSwgaW50ICRsaXRlcmFsMiwgJHJlYXNvbiwgJHJlYXNvbkRhdGEpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkcmVhc29uLCAkcmVhc29uRGF0YSk7CgppZiAoJGxpdGVyYWwxIDwgJGxpdGVyYWwyKSB7CiR0aGlzLT5saXRlcmFsMSA9ICRsaXRlcmFsMTsKJHRoaXMtPmxpdGVyYWwyID0gJGxpdGVyYWwyOwp9IGVsc2UgewokdGhpcy0+bGl0ZXJhbDEgPSAkbGl0ZXJhbDI7CiR0aGlzLT5saXRlcmFsMiA9ICRsaXRlcmFsMTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TGl0ZXJhbHMoKTogYXJyYXkKewpyZXR1cm4gWyR0aGlzLT5saXRlcmFsMSwgJHRoaXMtPmxpdGVyYWwyXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEhhc2goKQp7CnJldHVybiAkdGhpcy0+bGl0ZXJhbDEuJywnLiR0aGlzLT5saXRlcmFsMjsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKFJ1bGUgJHJ1bGUpOiBib29sCnsKCmlmICgkcnVsZSBpbnN0YW5jZW9mIHNlbGYpIHsKaWYgKCR0aGlzLT5saXRlcmFsMSAhPT0gJHJ1bGUtPmxpdGVyYWwxKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCR0aGlzLT5saXRlcmFsMiAhPT0gJHJ1bGUtPmxpdGVyYWwyKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KCiRsaXRlcmFscyA9ICRydWxlLT5nZXRMaXRlcmFscygpOwppZiAoMiAhPT0gXGNvdW50KCRsaXRlcmFscykpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoJHRoaXMtPmxpdGVyYWwxICE9PSAkbGl0ZXJhbHNbMF0pIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoJHRoaXMtPmxpdGVyYWwyICE9PSAkbGl0ZXJhbHNbMV0pIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCnB1YmxpYyBmdW5jdGlvbiBpc0Fzc2VydGlvbigpOiBib29sCnsKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKewokcmVzdWx0ID0gJHRoaXMtPmlzRGlzYWJsZWQoKSA/ICdkaXNhYmxlZCgnIDogJygnOwoKJHJlc3VsdCAuPSAkdGhpcy0+bGl0ZXJhbDEgLiAnfCcgLiAkdGhpcy0+bGl0ZXJhbDIgLiAnKSc7CgpyZXR1cm4gJHJlc3VsdDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7Cgp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5U2V0OwoKCgoKCgoKY2xhc3MgUnVsZVNldCBpbXBsZW1lbnRzIFxJdGVyYXRvckFnZ3JlZ2F0ZSwgXENvdW50YWJsZQp7CgpwdWJsaWMgY29uc3QgVFlQRV9QQUNLQUdFID0gMDsKcHVibGljIGNvbnN0IFRZUEVfUkVRVUVTVCA9IDE7CnB1YmxpYyBjb25zdCBUWVBFX0xFQVJORUQgPSA0OwoKCgoKCgpwdWJsaWMgJHJ1bGVCeUlkID0gW107CgpwdWJsaWMgY29uc3QgVFlQRVMgPSBbCnNlbGY6OlRZUEVfUEFDS0FHRSA9PiAnUEFDS0FHRScsCnNlbGY6OlRZUEVfUkVRVUVTVCA9PiAnUkVRVUVTVCcsCnNlbGY6OlRZUEVfTEVBUk5FRCA9PiAnTEVBUk5FRCcsCl07CgoKcHJvdGVjdGVkICRydWxlczsKCgpwcm90ZWN0ZWQgJG5leHRSdWxlSWQgPSAwOwoKCnByb3RlY3RlZCAkcnVsZXNCeUhhc2ggPSBbXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCnsKZm9yZWFjaCAoJHRoaXMtPmdldFR5cGVzKCkgYXMgJHR5cGUpIHsKJHRoaXMtPnJ1bGVzWyR0eXBlXSA9IFtdOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGQoUnVsZSAkcnVsZSwgJHR5cGUpOiB2b2lkCnsKaWYgKCFpc3NldChzZWxmOjpUWVBFU1skdHlwZV0pKSB7CnRocm93IG5ldyBcT3V0T2ZCb3VuZHNFeGNlcHRpb24oJ1Vua25vd24gcnVsZSB0eXBlOiAnIC4gJHR5cGUpOwp9CgokaGFzaCA9ICRydWxlLT5nZXRIYXNoKCk7CgoKaWYgKGlzc2V0KCR0aGlzLT5ydWxlc0J5SGFzaFskaGFzaF0pKSB7CiRwb3RlbnRpYWxEdXBsaWNhdGVzID0gJHRoaXMtPnJ1bGVzQnlIYXNoWyRoYXNoXTsKaWYgKFxpc19hcnJheSgkcG90ZW50aWFsRHVwbGljYXRlcykpIHsKZm9yZWFjaCAoJHBvdGVudGlhbER1cGxpY2F0ZXMgYXMgJHBvdGVudGlhbER1cGxpY2F0ZSkgewppZiAoJHJ1bGUtPmVxdWFscygkcG90ZW50aWFsRHVwbGljYXRlKSkgewpyZXR1cm47Cn0KfQp9IGVsc2UgewppZiAoJHJ1bGUtPmVxdWFscygkcG90ZW50aWFsRHVwbGljYXRlcykpIHsKcmV0dXJuOwp9Cn0KfQoKaWYgKCFpc3NldCgkdGhpcy0+cnVsZXNbJHR5cGVdKSkgewokdGhpcy0+cnVsZXNbJHR5cGVdID0gW107Cn0KCiR0aGlzLT5ydWxlc1skdHlwZV1bXSA9ICRydWxlOwokdGhpcy0+cnVsZUJ5SWRbJHRoaXMtPm5leHRSdWxlSWRdID0gJHJ1bGU7CiRydWxlLT5zZXRUeXBlKCR0eXBlKTsKCiR0aGlzLT5uZXh0UnVsZUlkKys7CgppZiAoIWlzc2V0KCR0aGlzLT5ydWxlc0J5SGFzaFskaGFzaF0pKSB7CiR0aGlzLT5ydWxlc0J5SGFzaFskaGFzaF0gPSAkcnVsZTsKfSBlbHNlaWYgKFxpc19hcnJheSgkdGhpcy0+cnVsZXNCeUhhc2hbJGhhc2hdKSkgewokdGhpcy0+cnVsZXNCeUhhc2hbJGhhc2hdW10gPSAkcnVsZTsKfSBlbHNlIHsKJG9yaWdpbmFsUnVsZSA9ICR0aGlzLT5ydWxlc0J5SGFzaFskaGFzaF07CiR0aGlzLT5ydWxlc0J5SGFzaFskaGFzaF0gPSBbJG9yaWdpbmFsUnVsZSwgJHJ1bGVdOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBjb3VudCgpOiBpbnQKewpyZXR1cm4gJHRoaXMtPm5leHRSdWxlSWQ7Cn0KCnB1YmxpYyBmdW5jdGlvbiBydWxlQnlJZChpbnQgJGlkKTogUnVsZQp7CnJldHVybiAkdGhpcy0+cnVsZUJ5SWRbJGlkXTsKfQoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSdWxlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cnVsZXM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRJdGVyYXRvcigpOiBSdWxlU2V0SXRlcmF0b3IKewpyZXR1cm4gbmV3IFJ1bGVTZXRJdGVyYXRvcigkdGhpcy0+Z2V0UnVsZXMoKSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJdGVyYXRvckZvcigkdHlwZXMpOiBSdWxlU2V0SXRlcmF0b3IKewppZiAoIVxpc19hcnJheSgkdHlwZXMpKSB7CiR0eXBlcyA9IFskdHlwZXNdOwp9CgokYWxsUnVsZXMgPSAkdGhpcy0+Z2V0UnVsZXMoKTsKCgokcnVsZXMgPSBbXTsKCmZvcmVhY2ggKCR0eXBlcyBhcyAkdHlwZSkgewokcnVsZXNbJHR5cGVdID0gJGFsbFJ1bGVzWyR0eXBlXTsKfQoKcmV0dXJuIG5ldyBSdWxlU2V0SXRlcmF0b3IoJHJ1bGVzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEl0ZXJhdG9yV2l0aG91dCgkdHlwZXMpOiBSdWxlU2V0SXRlcmF0b3IKewppZiAoIVxpc19hcnJheSgkdHlwZXMpKSB7CiR0eXBlcyA9IFskdHlwZXNdOwp9CgokcnVsZXMgPSAkdGhpcy0+Z2V0UnVsZXMoKTsKCmZvcmVhY2ggKCR0eXBlcyBhcyAkdHlwZSkgewp1bnNldCgkcnVsZXNbJHR5cGVdKTsKfQoKcmV0dXJuIG5ldyBSdWxlU2V0SXRlcmF0b3IoJHJ1bGVzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFR5cGVzKCk6IGFycmF5CnsKJHR5cGVzID0gc2VsZjo6VFlQRVM7CgpyZXR1cm4gYXJyYXlfa2V5cygkdHlwZXMpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJldHR5U3RyaW5nKD9SZXBvc2l0b3J5U2V0ICRyZXBvc2l0b3J5U2V0ID0gbnVsbCwgP1JlcXVlc3QgJHJlcXVlc3QgPSBudWxsLCA/UG9vbCAkcG9vbCA9IG51bGwsIGJvb2wgJGlzVmVyYm9zZSA9IGZhbHNlKTogc3RyaW5nCnsKJHN0cmluZyA9ICJcbiI7CmZvcmVhY2ggKCR0aGlzLT5ydWxlcyBhcyAkdHlwZSA9PiAkcnVsZXMpIHsKJHN0cmluZyAuPSBzdHJfcGFkKHNlbGY6OlRZUEVTWyR0eXBlXSwgOCwgJyAnKSAuICI6ICI7CmZvcmVhY2ggKCRydWxlcyBhcyAkcnVsZSkgewokc3RyaW5nIC49ICgkcmVwb3NpdG9yeVNldCAhPT0gbnVsbCAmJiAkcmVxdWVzdCAhPT0gbnVsbCAmJiAkcG9vbCAhPT0gbnVsbCA/ICRydWxlLT5nZXRQcmV0dHlTdHJpbmcoJHJlcG9zaXRvcnlTZXQsICRyZXF1ZXN0LCAkcG9vbCwgJGlzVmVyYm9zZSkgOiAkcnVsZSkuIlxuIjsKfQokc3RyaW5nIC49ICJcblxuIjsKfQoKcmV0dXJuICRzdHJpbmc7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+Z2V0UHJldHR5U3RyaW5nKCk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXElnbm9yZUxpc3RQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwoKCgoKCmNsYXNzIFJ1bGVTZXRHZW5lcmF0b3IKewoKcHJvdGVjdGVkICRwb2xpY3k7Cgpwcm90ZWN0ZWQgJHBvb2w7Cgpwcm90ZWN0ZWQgJHJ1bGVzOwoKcHJvdGVjdGVkICRhZGRlZE1hcCA9IFtdOwoKcHJvdGVjdGVkICRhZGRlZFBhY2thZ2VzQnlOYW1lcyA9IFtdOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFBvbGljeUludGVyZmFjZSAkcG9saWN5LCBQb29sICRwb29sKQp7CiR0aGlzLT5wb2xpY3kgPSAkcG9saWN5OwokdGhpcy0+cG9vbCA9ICRwb29sOwokdGhpcy0+cnVsZXMgPSBuZXcgUnVsZVNldDsKfQoKCgoKCgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY3JlYXRlUmVxdWlyZVJ1bGUoQmFzZVBhY2thZ2UgJHBhY2thZ2UsIGFycmF5ICRwcm92aWRlcnMsICRyZWFzb24sICRyZWFzb25EYXRhKTogP1J1bGUKewokbGl0ZXJhbHMgPSBbLSRwYWNrYWdlLT5pZF07Cgpmb3JlYWNoICgkcHJvdmlkZXJzIGFzICRwcm92aWRlcikgewoKaWYgKCRwcm92aWRlciA9PT0gJHBhY2thZ2UpIHsKcmV0dXJuIG51bGw7Cn0KJGxpdGVyYWxzW10gPSAkcHJvdmlkZXItPmlkOwp9CgpyZXR1cm4gbmV3IEdlbmVyaWNSdWxlKCRsaXRlcmFscywgJHJlYXNvbiwgJHJlYXNvbkRhdGEpOwp9CgoKCgoKCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjcmVhdGVJbnN0YWxsT25lT2ZSdWxlKGFycmF5ICRwYWNrYWdlcywgJHJlYXNvbiwgJHJlYXNvbkRhdGEpOiBSdWxlCnsKJGxpdGVyYWxzID0gW107CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewokbGl0ZXJhbHNbXSA9ICRwYWNrYWdlLT5pZDsKfQoKcmV0dXJuIG5ldyBHZW5lcmljUnVsZSgkbGl0ZXJhbHMsICRyZWFzb24sICRyZWFzb25EYXRhKTsKfQoKCgoKCgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY3JlYXRlUnVsZTJMaXRlcmFscyhCYXNlUGFja2FnZSAkaXNzdWVyLCBCYXNlUGFja2FnZSAkcHJvdmlkZXIsICRyZWFzb24sICRyZWFzb25EYXRhKTogP1J1bGUKewoKaWYgKCRpc3N1ZXIgPT09ICRwcm92aWRlcikgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuIG5ldyBSdWxlMkxpdGVyYWxzKC0kaXNzdWVyLT5pZCwgLSRwcm92aWRlci0+aWQsICRyZWFzb24sICRyZWFzb25EYXRhKTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjcmVhdGVNdWx0aUNvbmZsaWN0UnVsZShhcnJheSAkcGFja2FnZXMsICRyZWFzb24sICRyZWFzb25EYXRhKTogUnVsZQp7CiRsaXRlcmFscyA9IFtdOwpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJGxpdGVyYWxzW10gPSAtJHBhY2thZ2UtPmlkOwp9CgppZiAoXGNvdW50KCRsaXRlcmFscykgPT09IDIpIHsKcmV0dXJuIG5ldyBSdWxlMkxpdGVyYWxzKCRsaXRlcmFsc1swXSwgJGxpdGVyYWxzWzFdLCAkcmVhc29uLCAkcmVhc29uRGF0YSk7Cn0KCnJldHVybiBuZXcgTXVsdGlDb25mbGljdFJ1bGUoJGxpdGVyYWxzLCAkcmVhc29uLCAkcmVhc29uRGF0YSk7Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gYWRkUnVsZSgkdHlwZSwgP1J1bGUgJG5ld1J1bGUgPSBudWxsKTogdm9pZAp7CmlmIChudWxsID09PSAkbmV3UnVsZSkgewpyZXR1cm47Cn0KCiR0aGlzLT5ydWxlcy0+YWRkKCRuZXdSdWxlLCAkdHlwZSk7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBhZGRSdWxlc0ZvclBhY2thZ2UoQmFzZVBhY2thZ2UgJHBhY2thZ2UsIFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpOiB2b2lkCnsKCiR3b3JrUXVldWUgPSBuZXcgXFNwbFF1ZXVlOwokd29ya1F1ZXVlLT5lbnF1ZXVlKCRwYWNrYWdlKTsKCndoaWxlICghJHdvcmtRdWV1ZS0+aXNFbXB0eSgpKSB7CiRwYWNrYWdlID0gJHdvcmtRdWV1ZS0+ZGVxdWV1ZSgpOwppZiAoaXNzZXQoJHRoaXMtPmFkZGVkTWFwWyRwYWNrYWdlLT5pZF0pKSB7CmNvbnRpbnVlOwp9CgokdGhpcy0+YWRkZWRNYXBbJHBhY2thZ2UtPmlkXSA9ICRwYWNrYWdlOwoKaWYgKCEkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewpmb3JlYWNoICgkcGFja2FnZS0+Z2V0TmFtZXMoZmFsc2UpIGFzICRuYW1lKSB7CiR0aGlzLT5hZGRlZFBhY2thZ2VzQnlOYW1lc1skbmFtZV1bXSA9ICRwYWNrYWdlOwp9Cn0gZWxzZSB7CiR3b3JrUXVldWUtPmVucXVldWUoJHBhY2thZ2UtPmdldEFsaWFzT2YoKSk7CiR0aGlzLT5hZGRSdWxlKFJ1bGVTZXQ6OlRZUEVfUEFDS0FHRSwgJHRoaXMtPmNyZWF0ZVJlcXVpcmVSdWxlKCRwYWNrYWdlLCBbJHBhY2thZ2UtPmdldEFsaWFzT2YoKV0sIFJ1bGU6OlJVTEVfUEFDS0FHRV9BTElBUywgJHBhY2thZ2UpKTsKCgokdGhpcy0+YWRkUnVsZShSdWxlU2V0OjpUWVBFX1BBQ0tBR0UsICR0aGlzLT5jcmVhdGVSZXF1aXJlUnVsZSgkcGFja2FnZS0+Z2V0QWxpYXNPZigpLCBbJHBhY2thZ2VdLCBSdWxlOjpSVUxFX1BBQ0tBR0VfSU5WRVJTRV9BTElBUywgJHBhY2thZ2UtPmdldEFsaWFzT2YoKSkpOwoKCgppZiAoISRwYWNrYWdlLT5oYXNTZWxmVmVyc2lvblJlcXVpcmVzKCkpIHsKY29udGludWU7Cn0KfQoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcXVpcmVzKCkgYXMgJGxpbmspIHsKJGNvbnN0cmFpbnQgPSAkbGluay0+Z2V0Q29uc3RyYWludCgpOwppZiAoJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXItPmlzSWdub3JlZCgkbGluay0+Z2V0VGFyZ2V0KCkpKSB7CmNvbnRpbnVlOwp9IGVsc2VpZiAoJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgaW5zdGFuY2VvZiBJZ25vcmVMaXN0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcikgewokY29uc3RyYWludCA9ICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLT5maWx0ZXJDb25zdHJhaW50KCRsaW5rLT5nZXRUYXJnZXQoKSwgJGNvbnN0cmFpbnQpOwp9CgokcG9zc2libGVSZXF1aXJlcyA9ICR0aGlzLT5wb29sLT53aGF0UHJvdmlkZXMoJGxpbmstPmdldFRhcmdldCgpLCAkY29uc3RyYWludCk7CgokdGhpcy0+YWRkUnVsZShSdWxlU2V0OjpUWVBFX1BBQ0tBR0UsICR0aGlzLT5jcmVhdGVSZXF1aXJlUnVsZSgkcGFja2FnZSwgJHBvc3NpYmxlUmVxdWlyZXMsIFJ1bGU6OlJVTEVfUEFDS0FHRV9SRVFVSVJFUywgJGxpbmspKTsKCmZvcmVhY2ggKCRwb3NzaWJsZVJlcXVpcmVzIGFzICRyZXF1aXJlKSB7CiR3b3JrUXVldWUtPmVucXVldWUoJHJlcXVpcmUpOwp9Cn0KfQp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkQ29uZmxpY3RSdWxlcyhQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKTogdm9pZAp7Cgpmb3JlYWNoICgkdGhpcy0+YWRkZWRNYXAgYXMgJHBhY2thZ2UpIHsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldENvbmZsaWN0cygpIGFzICRsaW5rKSB7CgppZiAoIWlzc2V0KCR0aGlzLT5hZGRlZFBhY2thZ2VzQnlOYW1lc1skbGluay0+Z2V0VGFyZ2V0KCldKSkgewpjb250aW51ZTsKfQoKJGNvbnN0cmFpbnQgPSAkbGluay0+Z2V0Q29uc3RyYWludCgpOwppZiAoJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXItPmlzSWdub3JlZCgkbGluay0+Z2V0VGFyZ2V0KCkpKSB7CmNvbnRpbnVlOwp9IGVsc2VpZiAoJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgaW5zdGFuY2VvZiBJZ25vcmVMaXN0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcikgewokY29uc3RyYWludCA9ICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLT5maWx0ZXJDb25zdHJhaW50KCRsaW5rLT5nZXRUYXJnZXQoKSwgJGNvbnN0cmFpbnQsIGZhbHNlKTsKfQoKJGNvbmZsaWN0cyA9ICR0aGlzLT5wb29sLT53aGF0UHJvdmlkZXMoJGxpbmstPmdldFRhcmdldCgpLCAkY29uc3RyYWludCk7Cgpmb3JlYWNoICgkY29uZmxpY3RzIGFzICRjb25mbGljdCkgewoKCgppZiAoISRjb25mbGljdCBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSB8fCAkY29uZmxpY3QtPmdldE5hbWUoKSA9PT0gJGxpbmstPmdldFRhcmdldCgpKSB7CiR0aGlzLT5hZGRSdWxlKFJ1bGVTZXQ6OlRZUEVfUEFDS0FHRSwgJHRoaXMtPmNyZWF0ZVJ1bGUyTGl0ZXJhbHMoJHBhY2thZ2UsICRjb25mbGljdCwgUnVsZTo6UlVMRV9QQUNLQUdFX0NPTkZMSUNULCAkbGluaykpOwp9Cn0KfQp9Cgpmb3JlYWNoICgkdGhpcy0+YWRkZWRQYWNrYWdlc0J5TmFtZXMgYXMgJG5hbWUgPT4gJHBhY2thZ2VzKSB7CmlmIChcY291bnQoJHBhY2thZ2VzKSA+IDEpIHsKJHJlYXNvbiA9IFJ1bGU6OlJVTEVfUEFDS0FHRV9TQU1FX05BTUU7CiR0aGlzLT5hZGRSdWxlKFJ1bGVTZXQ6OlRZUEVfUEFDS0FHRSwgJHRoaXMtPmNyZWF0ZU11bHRpQ29uZmxpY3RSdWxlKCRwYWNrYWdlcywgJHJlYXNvbiwgJG5hbWUpKTsKfQp9Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBhZGRSdWxlc0ZvclJlcXVlc3QoUmVxdWVzdCAkcmVxdWVzdCwgUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik6IHZvaWQKewpmb3JlYWNoICgkcmVxdWVzdC0+Z2V0Rml4ZWRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CmlmICgkcGFja2FnZS0+aWQgPT09IC0xKSB7CgppZiAoJHRoaXMtPnBvb2wtPmlzVW5hY2NlcHRhYmxlRml4ZWRPckxvY2tlZFBhY2thZ2UoJHBhY2thZ2UpKSB7CmNvbnRpbnVlOwp9CgoKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbigiRml4ZWQgcGFja2FnZSAiLiRwYWNrYWdlLT5nZXRQcmV0dHlTdHJpbmcoKS4iIHdhcyBub3QgYWRkZWQgdG8gc29sdmVyIHBvb2wuIik7Cn0KCiR0aGlzLT5hZGRSdWxlc0ZvclBhY2thZ2UoJHBhY2thZ2UsICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKTsKCiRydWxlID0gJHRoaXMtPmNyZWF0ZUluc3RhbGxPbmVPZlJ1bGUoWyRwYWNrYWdlXSwgUnVsZTo6UlVMRV9GSVhFRCwgWwoncGFja2FnZScgPT4gJHBhY2thZ2UsCl0pOwokdGhpcy0+YWRkUnVsZShSdWxlU2V0OjpUWVBFX1JFUVVFU1QsICRydWxlKTsKfQoKZm9yZWFjaCAoJHJlcXVlc3QtPmdldFJlcXVpcmVzKCkgYXMgJHBhY2thZ2VOYW1lID0+ICRjb25zdHJhaW50KSB7CmlmICgkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci0+aXNJZ25vcmVkKCRwYWNrYWdlTmFtZSkpIHsKY29udGludWU7Cn0gZWxzZWlmICgkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciBpbnN0YW5jZW9mIElnbm9yZUxpc3RQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKSB7CiRjb25zdHJhaW50ID0gJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXItPmZpbHRlckNvbnN0cmFpbnQoJHBhY2thZ2VOYW1lLCAkY29uc3RyYWludCk7Cn0KCiRwYWNrYWdlcyA9ICR0aGlzLT5wb29sLT53aGF0UHJvdmlkZXMoJHBhY2thZ2VOYW1lLCAkY29uc3RyYWludCk7CmlmIChcY291bnQoJHBhY2thZ2VzKSA+IDApIHsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiR0aGlzLT5hZGRSdWxlc0ZvclBhY2thZ2UoJHBhY2thZ2UsICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKTsKfQoKJHJ1bGUgPSAkdGhpcy0+Y3JlYXRlSW5zdGFsbE9uZU9mUnVsZSgkcGFja2FnZXMsIFJ1bGU6OlJVTEVfUk9PVF9SRVFVSVJFLCBbCidwYWNrYWdlTmFtZScgPT4gJHBhY2thZ2VOYW1lLAonY29uc3RyYWludCcgPT4gJGNvbnN0cmFpbnQsCl0pOwokdGhpcy0+YWRkUnVsZShSdWxlU2V0OjpUWVBFX1JFUVVFU1QsICRydWxlKTsKfQp9Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBhZGRSdWxlc0ZvclJvb3RBbGlhc2VzKFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpOiB2b2lkCnsKZm9yZWFjaCAoJHRoaXMtPnBvb2wtPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKCgoKaWYgKCFpc3NldCgkdGhpcy0+YWRkZWRNYXBbJHBhY2thZ2UtPmlkXSkgJiYKJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UgJiYKKCRwYWNrYWdlLT5pc1Jvb3RQYWNrYWdlQWxpYXMoKSB8fCBpc3NldCgkdGhpcy0+YWRkZWRNYXBbJHBhY2thZ2UtPmdldEFsaWFzT2YoKS0+aWRdKSkKKSB7CiR0aGlzLT5hZGRSdWxlc0ZvclBhY2thZ2UoJHBhY2thZ2UsICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKTsKfQp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSdWxlc0ZvcihSZXF1ZXN0ICRyZXF1ZXN0LCA/UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciA9IG51bGwpOiBSdWxlU2V0CnsKJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgPSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciA/PyBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTo6aWdub3JlTm90aGluZygpOwoKJHRoaXMtPmFkZFJ1bGVzRm9yUmVxdWVzdCgkcmVxdWVzdCwgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpOwoKJHRoaXMtPmFkZFJ1bGVzRm9yUm9vdEFsaWFzZXMoJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpOwoKJHRoaXMtPmFkZENvbmZsaWN0UnVsZXMoJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpOwoKCiR0aGlzLT5hZGRlZE1hcCA9ICR0aGlzLT5hZGRlZFBhY2thZ2VzQnlOYW1lcyA9IFtdOwoKJHJ1bGVzID0gJHRoaXMtPnJ1bGVzOwoKJHRoaXMtPnJ1bGVzID0gbmV3IFJ1bGVTZXQ7CgpyZXR1cm4gJHJ1bGVzOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCgoKCgpjbGFzcyBSdWxlU2V0SXRlcmF0b3IgaW1wbGVtZW50cyBcSXRlcmF0b3IKewoKcHJvdGVjdGVkICRydWxlczsKCnByb3RlY3RlZCAkdHlwZXM7CgoKcHJvdGVjdGVkICRjdXJyZW50T2Zmc2V0OwoKcHJvdGVjdGVkICRjdXJyZW50VHlwZTsKCnByb3RlY3RlZCAkY3VycmVudFR5cGVPZmZzZXQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJHJ1bGVzKQp7CiR0aGlzLT5ydWxlcyA9ICRydWxlczsKJHRoaXMtPnR5cGVzID0gYXJyYXlfa2V5cygkcnVsZXMpOwpzb3J0KCR0aGlzLT50eXBlcyk7CgokdGhpcy0+cmV3aW5kKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjdXJyZW50KCk6IFJ1bGUKewpyZXR1cm4gJHRoaXMtPnJ1bGVzWyR0aGlzLT5jdXJyZW50VHlwZV1bJHRoaXMtPmN1cnJlbnRPZmZzZXRdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24ga2V5KCk6IGludAp7CnJldHVybiAkdGhpcy0+Y3VycmVudFR5cGU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBuZXh0KCk6IHZvaWQKewokdGhpcy0+Y3VycmVudE9mZnNldCsrOwoKaWYgKCFpc3NldCgkdGhpcy0+cnVsZXNbJHRoaXMtPmN1cnJlbnRUeXBlXSkpIHsKcmV0dXJuOwp9CgppZiAoJHRoaXMtPmN1cnJlbnRPZmZzZXQgPj0gXGNvdW50KCR0aGlzLT5ydWxlc1skdGhpcy0+Y3VycmVudFR5cGVdKSkgewokdGhpcy0+Y3VycmVudE9mZnNldCA9IDA7CgpkbyB7CiR0aGlzLT5jdXJyZW50VHlwZU9mZnNldCsrOwoKaWYgKCFpc3NldCgkdGhpcy0+dHlwZXNbJHRoaXMtPmN1cnJlbnRUeXBlT2Zmc2V0XSkpIHsKJHRoaXMtPmN1cnJlbnRUeXBlID0gLTE7CmJyZWFrOwp9CgokdGhpcy0+Y3VycmVudFR5cGUgPSAkdGhpcy0+dHlwZXNbJHRoaXMtPmN1cnJlbnRUeXBlT2Zmc2V0XTsKfSB3aGlsZSAoMCA9PT0gXGNvdW50KCR0aGlzLT5ydWxlc1skdGhpcy0+Y3VycmVudFR5cGVdKSk7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIHJld2luZCgpOiB2b2lkCnsKJHRoaXMtPmN1cnJlbnRPZmZzZXQgPSAwOwoKJHRoaXMtPmN1cnJlbnRUeXBlT2Zmc2V0ID0gLTE7CiR0aGlzLT5jdXJyZW50VHlwZSA9IC0xOwoKZG8gewokdGhpcy0+Y3VycmVudFR5cGVPZmZzZXQrKzsKCmlmICghaXNzZXQoJHRoaXMtPnR5cGVzWyR0aGlzLT5jdXJyZW50VHlwZU9mZnNldF0pKSB7CiR0aGlzLT5jdXJyZW50VHlwZSA9IC0xOwpicmVhazsKfQoKJHRoaXMtPmN1cnJlbnRUeXBlID0gJHRoaXMtPnR5cGVzWyR0aGlzLT5jdXJyZW50VHlwZU9mZnNldF07Cn0gd2hpbGUgKDAgPT09IFxjb3VudCgkdGhpcy0+cnVsZXNbJHRoaXMtPmN1cnJlbnRUeXBlXSkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gdmFsaWQoKTogYm9vbAp7CnJldHVybiBpc3NldCgkdGhpcy0+cnVsZXNbJHRoaXMtPmN1cnJlbnRUeXBlXSwgJHRoaXMtPnJ1bGVzWyR0aGlzLT5jdXJyZW50VHlwZV1bJHRoaXMtPmN1cnJlbnRPZmZzZXRdKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7CgoKCgoKCgoKCgpjbGFzcyBSdWxlV2F0Y2hDaGFpbiBleHRlbmRzIFxTcGxEb3VibHlMaW5rZWRMaXN0CnsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2VlayhpbnQgJG9mZnNldCk6IHZvaWQKewokdGhpcy0+cmV3aW5kKCk7CmZvciAoJGkgPSAwOyAkaSA8ICRvZmZzZXQ7ICRpKyssICR0aGlzLT5uZXh0KCkpOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmUoKTogdm9pZAp7CiRvZmZzZXQgPSAkdGhpcy0+a2V5KCk7CiR0aGlzLT5vZmZzZXRVbnNldCgkb2Zmc2V0KTsKJHRoaXMtPnNlZWsoJG9mZnNldCk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKCgoKCgoKCgoKCmNsYXNzIFJ1bGVXYXRjaEdyYXBoCnsKCnByb3RlY3RlZCAkd2F0Y2hDaGFpbnMgPSBbXTsKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbnNlcnQoUnVsZVdhdGNoTm9kZSAkbm9kZSk6IHZvaWQKewppZiAoJG5vZGUtPmdldFJ1bGUoKS0+aXNBc3NlcnRpb24oKSkgewpyZXR1cm47Cn0KCmlmICghJG5vZGUtPmdldFJ1bGUoKSBpbnN0YW5jZW9mIE11bHRpQ29uZmxpY3RSdWxlKSB7CmZvcmVhY2ggKFskbm9kZS0+d2F0Y2gxLCAkbm9kZS0+d2F0Y2gyXSBhcyAkbGl0ZXJhbCkgewppZiAoIWlzc2V0KCR0aGlzLT53YXRjaENoYWluc1skbGl0ZXJhbF0pKSB7CiR0aGlzLT53YXRjaENoYWluc1skbGl0ZXJhbF0gPSBuZXcgUnVsZVdhdGNoQ2hhaW47Cn0KCiR0aGlzLT53YXRjaENoYWluc1skbGl0ZXJhbF0tPnVuc2hpZnQoJG5vZGUpOwp9Cn0gZWxzZSB7CmZvcmVhY2ggKCRub2RlLT5nZXRSdWxlKCktPmdldExpdGVyYWxzKCkgYXMgJGxpdGVyYWwpIHsKaWYgKCFpc3NldCgkdGhpcy0+d2F0Y2hDaGFpbnNbJGxpdGVyYWxdKSkgewokdGhpcy0+d2F0Y2hDaGFpbnNbJGxpdGVyYWxdID0gbmV3IFJ1bGVXYXRjaENoYWluOwp9CgokdGhpcy0+d2F0Y2hDaGFpbnNbJGxpdGVyYWxdLT51bnNoaWZ0KCRub2RlKTsKfQp9Cn0KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHByb3BhZ2F0ZUxpdGVyYWwoaW50ICRkZWNpZGVkTGl0ZXJhbCwgaW50ICRsZXZlbCwgRGVjaXNpb25zICRkZWNpc2lvbnMpOiA/UnVsZQp7CgoKCiRsaXRlcmFsID0gLSRkZWNpZGVkTGl0ZXJhbDsKCmlmICghaXNzZXQoJHRoaXMtPndhdGNoQ2hhaW5zWyRsaXRlcmFsXSkpIHsKcmV0dXJuIG51bGw7Cn0KCiRjaGFpbiA9ICR0aGlzLT53YXRjaENoYWluc1skbGl0ZXJhbF07CgokY2hhaW4tPnJld2luZCgpOwp3aGlsZSAoJGNoYWluLT52YWxpZCgpKSB7CiRub2RlID0gJGNoYWluLT5jdXJyZW50KCk7CmlmICghJG5vZGUtPmdldFJ1bGUoKSBpbnN0YW5jZW9mIE11bHRpQ29uZmxpY3RSdWxlKSB7CiRvdGhlcldhdGNoID0gJG5vZGUtPmdldE90aGVyV2F0Y2goJGxpdGVyYWwpOwoKaWYgKCEkbm9kZS0+Z2V0UnVsZSgpLT5pc0Rpc2FibGVkKCkgJiYgISRkZWNpc2lvbnMtPnNhdGlzZnkoJG90aGVyV2F0Y2gpKSB7CiRydWxlTGl0ZXJhbHMgPSAkbm9kZS0+Z2V0UnVsZSgpLT5nZXRMaXRlcmFscygpOwoKJGFsdGVybmF0aXZlTGl0ZXJhbHMgPSBhcnJheV9maWx0ZXIoJHJ1bGVMaXRlcmFscywgc3RhdGljIGZ1bmN0aW9uICgkcnVsZUxpdGVyYWwpIHVzZSAoJGxpdGVyYWwsICRvdGhlcldhdGNoLCAkZGVjaXNpb25zKTogYm9vbCB7CnJldHVybiAkbGl0ZXJhbCAhPT0gJHJ1bGVMaXRlcmFsICYmCiRvdGhlcldhdGNoICE9PSAkcnVsZUxpdGVyYWwgJiYKISRkZWNpc2lvbnMtPmNvbmZsaWN0KCRydWxlTGl0ZXJhbCk7Cn0pOwoKaWYgKFxjb3VudCgkYWx0ZXJuYXRpdmVMaXRlcmFscykgPiAwKSB7CnJlc2V0KCRhbHRlcm5hdGl2ZUxpdGVyYWxzKTsKJHRoaXMtPm1vdmVXYXRjaCgkbGl0ZXJhbCwgY3VycmVudCgkYWx0ZXJuYXRpdmVMaXRlcmFscyksICRub2RlKTsKY29udGludWU7Cn0KCmlmICgkZGVjaXNpb25zLT5jb25mbGljdCgkb3RoZXJXYXRjaCkpIHsKcmV0dXJuICRub2RlLT5nZXRSdWxlKCk7Cn0KCiRkZWNpc2lvbnMtPmRlY2lkZSgkb3RoZXJXYXRjaCwgJGxldmVsLCAkbm9kZS0+Z2V0UnVsZSgpKTsKfQp9IGVsc2Ugewpmb3JlYWNoICgkbm9kZS0+Z2V0UnVsZSgpLT5nZXRMaXRlcmFscygpIGFzICRvdGhlckxpdGVyYWwpIHsKaWYgKCRsaXRlcmFsICE9PSAkb3RoZXJMaXRlcmFsICYmICEkZGVjaXNpb25zLT5zYXRpc2Z5KCRvdGhlckxpdGVyYWwpKSB7CmlmICgkZGVjaXNpb25zLT5jb25mbGljdCgkb3RoZXJMaXRlcmFsKSkgewpyZXR1cm4gJG5vZGUtPmdldFJ1bGUoKTsKfQoKJGRlY2lzaW9ucy0+ZGVjaWRlKCRvdGhlckxpdGVyYWwsICRsZXZlbCwgJG5vZGUtPmdldFJ1bGUoKSk7Cn0KfQp9CgokY2hhaW4tPm5leHQoKTsKfQoKcmV0dXJuIG51bGw7Cn0KCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBtb3ZlV2F0Y2goaW50ICRmcm9tTGl0ZXJhbCwgaW50ICR0b0xpdGVyYWwsIFJ1bGVXYXRjaE5vZGUgJG5vZGUpOiB2b2lkCnsKaWYgKCFpc3NldCgkdGhpcy0+d2F0Y2hDaGFpbnNbJHRvTGl0ZXJhbF0pKSB7CiR0aGlzLT53YXRjaENoYWluc1skdG9MaXRlcmFsXSA9IG5ldyBSdWxlV2F0Y2hDaGFpbjsKfQoKJG5vZGUtPm1vdmVXYXRjaCgkZnJvbUxpdGVyYWwsICR0b0xpdGVyYWwpOwokdGhpcy0+d2F0Y2hDaGFpbnNbJGZyb21MaXRlcmFsXS0+cmVtb3ZlKCk7CiR0aGlzLT53YXRjaENoYWluc1skdG9MaXRlcmFsXS0+dW5zaGlmdCgkbm9kZSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKCgoKCgoKCmNsYXNzIFJ1bGVXYXRjaE5vZGUKewoKcHVibGljICR3YXRjaDE7CgpwdWJsaWMgJHdhdGNoMjsKCgpwcm90ZWN0ZWQgJHJ1bGU7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChSdWxlICRydWxlKQp7CiR0aGlzLT5ydWxlID0gJHJ1bGU7CgokbGl0ZXJhbHMgPSAkcnVsZS0+Z2V0TGl0ZXJhbHMoKTsKCiRsaXRlcmFsQ291bnQgPSBcY291bnQoJGxpdGVyYWxzKTsKJHRoaXMtPndhdGNoMSA9ICRsaXRlcmFsQ291bnQgPiAwID8gJGxpdGVyYWxzWzBdIDogMDsKJHRoaXMtPndhdGNoMiA9ICRsaXRlcmFsQ291bnQgPiAxID8gJGxpdGVyYWxzWzFdIDogMDsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2F0Y2gyT25IaWdoZXN0KERlY2lzaW9ucyAkZGVjaXNpb25zKTogdm9pZAp7CiRsaXRlcmFscyA9ICR0aGlzLT5ydWxlLT5nZXRMaXRlcmFscygpOwoKCmlmIChcY291bnQoJGxpdGVyYWxzKSA8IDMgfHwgJHRoaXMtPnJ1bGUgaW5zdGFuY2VvZiBNdWx0aUNvbmZsaWN0UnVsZSkgewpyZXR1cm47Cn0KCiR3YXRjaExldmVsID0gMDsKCmZvcmVhY2ggKCRsaXRlcmFscyBhcyAkbGl0ZXJhbCkgewokbGV2ZWwgPSAkZGVjaXNpb25zLT5kZWNpc2lvbkxldmVsKCRsaXRlcmFsKTsKCmlmICgkbGV2ZWwgPiAkd2F0Y2hMZXZlbCkgewokdGhpcy0+d2F0Y2gyID0gJGxpdGVyYWw7CiR3YXRjaExldmVsID0gJGxldmVsOwp9Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJ1bGUoKTogUnVsZQp7CnJldHVybiAkdGhpcy0+cnVsZTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE90aGVyV2F0Y2goaW50ICRsaXRlcmFsKTogaW50CnsKaWYgKCR0aGlzLT53YXRjaDEgPT09ICRsaXRlcmFsKSB7CnJldHVybiAkdGhpcy0+d2F0Y2gyOwp9CgpyZXR1cm4gJHRoaXMtPndhdGNoMTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG1vdmVXYXRjaChpbnQgJGZyb20sIGludCAkdG8pOiB2b2lkCnsKaWYgKCR0aGlzLT53YXRjaDEgPT09ICRmcm9tKSB7CiR0aGlzLT53YXRjaDEgPSAkdG87Cn0gZWxzZSB7CiR0aGlzLT53YXRjaDIgPSAkdG87Cn0KfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7Cgp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcQXVkaXRDb25maWc7CnVzZSBDb21wb3NlclxBZHZpc29yeVxBdWRpdG9yOwp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcUGFydGlhbFNlY3VyaXR5QWR2aXNvcnk7CnVzZSBDb21wb3NlclxBZHZpc29yeVxTZWN1cml0eUFkdmlzb3J5Owp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5U2V0Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKCgoKCmNsYXNzIFNlY3VyaXR5QWR2aXNvcnlQb29sRmlsdGVyCnsKCnByaXZhdGUgJGF1ZGl0b3I7Cgpwcml2YXRlICRhdWRpdENvbmZpZzsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKQXVkaXRvciAkYXVkaXRvciwKQXVkaXRDb25maWcgJGF1ZGl0Q29uZmlnCikgewokdGhpcy0+YXVkaXRvciA9ICRhdWRpdG9yOwokdGhpcy0+YXVkaXRDb25maWcgPSAkYXVkaXRDb25maWc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBmaWx0ZXIoUG9vbCAkcG9vbCwgYXJyYXkgJHJlcG9zaXRvcmllcywgUmVxdWVzdCAkcmVxdWVzdCk6IFBvb2wKewppZiAoISR0aGlzLT5hdWRpdENvbmZpZy0+YmxvY2tJbnNlY3VyZSkgewpyZXR1cm4gJHBvb2w7Cn0KCiRyZXBvU2V0ID0gbmV3IFJlcG9zaXRvcnlTZXQoKTsKZm9yZWFjaCAoJHJlcG9zaXRvcmllcyBhcyAkcmVwbykgewokcmVwb1NldC0+YWRkUmVwb3NpdG9yeSgkcmVwbyk7Cn0KCiRwYWNrYWdlc0ZvckFkdmlzb3JpZXMgPSBbXTsKZm9yZWFjaCAoJHBvb2wtPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKCEkcGFja2FnZSBpbnN0YW5jZW9mIFJvb3RQYWNrYWdlSW50ZXJmYWNlICYmICFQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRwYWNrYWdlLT5nZXROYW1lKCkpICYmICEkcmVxdWVzdC0+aXNMb2NrZWRQYWNrYWdlKCRwYWNrYWdlKSkgewokcGFja2FnZXNGb3JBZHZpc29yaWVzW10gPSAkcGFja2FnZTsKfQp9CgokYWxsQWR2aXNvcmllcyA9ICRyZXBvU2V0LT5nZXRNYXRjaGluZ1NlY3VyaXR5QWR2aXNvcmllcygkcGFja2FnZXNGb3JBZHZpc29yaWVzLCB0cnVlLCB0cnVlKTsKaWYgKCR0aGlzLT5hdWRpdG9yLT5uZWVkc0NvbXBsZXRlQWR2aXNvcnlMb2FkKCRhbGxBZHZpc29yaWVzWydhZHZpc29yaWVzJ10sICR0aGlzLT5hdWRpdENvbmZpZy0+aWdub3JlTGlzdEZvckJsb2NraW5nKSkgewokYWxsQWR2aXNvcmllcyA9ICRyZXBvU2V0LT5nZXRNYXRjaGluZ1NlY3VyaXR5QWR2aXNvcmllcygkcGFja2FnZXNGb3JBZHZpc29yaWVzLCBmYWxzZSwgdHJ1ZSk7Cn0KCiRhZHZpc29yeU1hcCA9ICR0aGlzLT5hdWRpdG9yLT5wcm9jZXNzQWR2aXNvcmllcygkYWxsQWR2aXNvcmllc1snYWR2aXNvcmllcyddLCAkdGhpcy0+YXVkaXRDb25maWctPmlnbm9yZUxpc3RGb3JCbG9ja2luZywgJHRoaXMtPmF1ZGl0Q29uZmlnLT5pZ25vcmVTZXZlcml0eUZvckJsb2NraW5nKVsnYWR2aXNvcmllcyddOwoKJHBhY2thZ2VzID0gW107CiRzZWN1cml0eVJlbW92ZWRWZXJzaW9ucyA9IFtdOwokYWJhbmRvbmVkUmVtb3ZlZFZlcnNpb25zID0gW107CmZvcmVhY2ggKCRwb29sLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CmlmICgkdGhpcy0+YXVkaXRDb25maWctPmJsb2NrQWJhbmRvbmVkICYmIGNvdW50KCR0aGlzLT5hdWRpdG9yLT5maWx0ZXJBYmFuZG9uZWRQYWNrYWdlcyhbJHBhY2thZ2VdLCAkdGhpcy0+YXVkaXRDb25maWctPmlnbm9yZUFiYW5kb25lZEZvckJsb2NraW5nKSkgIT09IDApIHsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldE5hbWVzKGZhbHNlKSBhcyAkcGFja2FnZU5hbWUpIHsKJGFiYW5kb25lZFJlbW92ZWRWZXJzaW9uc1skcGFja2FnZU5hbWVdWyRwYWNrYWdlLT5nZXRWZXJzaW9uKCldID0gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKfQpjb250aW51ZTsKfQoKJG1hdGNoaW5nQWR2aXNvcmllcyA9ICR0aGlzLT5nZXRNYXRjaGluZ0Fkdmlzb3JpZXMoJHBhY2thZ2UsICRhZHZpc29yeU1hcCk7CmlmIChjb3VudCgkbWF0Y2hpbmdBZHZpc29yaWVzKSA+IDApIHsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldE5hbWVzKGZhbHNlKSBhcyAkcGFja2FnZU5hbWUpIHsKJHNlY3VyaXR5UmVtb3ZlZFZlcnNpb25zWyRwYWNrYWdlTmFtZV1bJHBhY2thZ2UtPmdldFZlcnNpb24oKV0gPSAkbWF0Y2hpbmdBZHZpc29yaWVzOwp9Cgpjb250aW51ZTsKfQoKJHBhY2thZ2VzW10gPSAkcGFja2FnZTsKfQoKcmV0dXJuIG5ldyBQb29sKCRwYWNrYWdlcywgJHBvb2wtPmdldFVuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlcygpLCAkcG9vbC0+Z2V0QWxsUmVtb3ZlZFZlcnNpb25zKCksICRwb29sLT5nZXRBbGxSZW1vdmVkVmVyc2lvbnNCeVBhY2thZ2UoKSwgJHNlY3VyaXR5UmVtb3ZlZFZlcnNpb25zLCAkYWJhbmRvbmVkUmVtb3ZlZFZlcnNpb25zKTsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0TWF0Y2hpbmdBZHZpc29yaWVzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIGFycmF5ICRhZHZpc29yeU1hcCk6IGFycmF5CnsKaWYgKCRwYWNrYWdlLT5pc0RldigpKSB7CnJldHVybiBbXTsKfQoKJG1hdGNoaW5nQWR2aXNvcmllcyA9IFtdOwpmb3JlYWNoICgkcGFja2FnZS0+Z2V0TmFtZXMoZmFsc2UpIGFzICRwYWNrYWdlTmFtZSkgewppZiAoIWlzc2V0KCRhZHZpc29yeU1hcFskcGFja2FnZU5hbWVdKSkgewpjb250aW51ZTsKfQoKJHBhY2thZ2VDb25zdHJhaW50ID0gbmV3IENvbnN0cmFpbnQoQ29uc3RyYWludDo6U1RSX09QX0VRLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKTsKZm9yZWFjaCAoJGFkdmlzb3J5TWFwWyRwYWNrYWdlTmFtZV0gYXMgJGFkdmlzb3J5KSB7CmlmICgkYWR2aXNvcnktPmFmZmVjdGVkVmVyc2lvbnMtPm1hdGNoZXMoJHBhY2thZ2VDb25zdHJhaW50KSkgewokbWF0Y2hpbmdBZHZpc29yaWVzW10gPSAkYWR2aXNvcnk7Cn0KfQp9CgpyZXR1cm4gJG1hdGNoaW5nQWR2aXNvcmllczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7Cgp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcSWdub3JlTGlzdFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXI7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CgoKCgpjbGFzcyBTb2x2ZXIKewpwcml2YXRlIGNvbnN0IEJSQU5DSF9MSVRFUkFMUyA9IDA7CnByaXZhdGUgY29uc3QgQlJBTkNIX0xFVkVMID0gMTsKCgpwcm90ZWN0ZWQgJHBvbGljeTsKCnByb3RlY3RlZCAkcG9vbDsKCgpwcm90ZWN0ZWQgJHJ1bGVzOwoKCnByb3RlY3RlZCAkd2F0Y2hHcmFwaDsKCnByb3RlY3RlZCAkZGVjaXNpb25zOwoKcHJvdGVjdGVkICRmaXhlZE1hcDsKCgpwcm90ZWN0ZWQgJHByb3BhZ2F0ZUluZGV4OwoKcHJvdGVjdGVkICRicmFuY2hlcyA9IFtdOwoKcHJvdGVjdGVkICRwcm9ibGVtcyA9IFtdOwoKcHJvdGVjdGVkICRsZWFybmVkUG9vbCA9IFtdOwoKcHJvdGVjdGVkICRsZWFybmVkV2h5ID0gW107CgoKcHVibGljICR0ZXN0RmxhZ0xlYXJuZWRQb3NpdGl2ZUxpdGVyYWwgPSBmYWxzZTsKCgpwcm90ZWN0ZWQgJGlvOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFBvbGljeUludGVyZmFjZSAkcG9saWN5LCBQb29sICRwb29sLCBJT0ludGVyZmFjZSAkaW8pCnsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+cG9saWN5ID0gJHBvbGljeTsKJHRoaXMtPnBvb2wgPSAkcG9vbDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJ1bGVTZXRTaXplKCk6IGludAp7CnJldHVybiBcY291bnQoJHRoaXMtPnJ1bGVzKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFBvb2woKTogUG9vbAp7CnJldHVybiAkdGhpcy0+cG9vbDsKfQoKCgpwcml2YXRlIGZ1bmN0aW9uIG1ha2VBc3NlcnRpb25SdWxlRGVjaXNpb25zKCk6IHZvaWQKewokZGVjaXNpb25TdGFydCA9IFxjb3VudCgkdGhpcy0+ZGVjaXNpb25zKSAtIDE7CgokcnVsZXNDb3VudCA9IFxjb3VudCgkdGhpcy0+cnVsZXMpOwpmb3IgKCRydWxlSW5kZXggPSAwOyAkcnVsZUluZGV4IDwgJHJ1bGVzQ291bnQ7ICRydWxlSW5kZXgrKykgewokcnVsZSA9ICR0aGlzLT5ydWxlcy0+cnVsZUJ5SWRbJHJ1bGVJbmRleF07CgppZiAoISRydWxlLT5pc0Fzc2VydGlvbigpIHx8ICRydWxlLT5pc0Rpc2FibGVkKCkpIHsKY29udGludWU7Cn0KCiRsaXRlcmFscyA9ICRydWxlLT5nZXRMaXRlcmFscygpOwokbGl0ZXJhbCA9ICRsaXRlcmFsc1swXTsKCmlmICghJHRoaXMtPmRlY2lzaW9ucy0+ZGVjaWRlZCgkbGl0ZXJhbCkpIHsKJHRoaXMtPmRlY2lzaW9ucy0+ZGVjaWRlKCRsaXRlcmFsLCAxLCAkcnVsZSk7CmNvbnRpbnVlOwp9CgppZiAoJHRoaXMtPmRlY2lzaW9ucy0+c2F0aXNmeSgkbGl0ZXJhbCkpIHsKY29udGludWU7Cn0KCgppZiAoUnVsZVNldDo6VFlQRV9MRUFSTkVEID09PSAkcnVsZS0+Z2V0VHlwZSgpKSB7CiRydWxlLT5kaXNhYmxlKCk7CmNvbnRpbnVlOwp9CgokY29uZmxpY3QgPSAkdGhpcy0+ZGVjaXNpb25zLT5kZWNpc2lvblJ1bGUoJGxpdGVyYWwpOwoKaWYgKFJ1bGVTZXQ6OlRZUEVfUEFDS0FHRSA9PT0gJGNvbmZsaWN0LT5nZXRUeXBlKCkpIHsKJHByb2JsZW0gPSBuZXcgUHJvYmxlbSgpOwoKJHByb2JsZW0tPmFkZFJ1bGUoJHJ1bGUpOwokcHJvYmxlbS0+YWRkUnVsZSgkY29uZmxpY3QpOwokcnVsZS0+ZGlzYWJsZSgpOwokdGhpcy0+cHJvYmxlbXNbXSA9ICRwcm9ibGVtOwpjb250aW51ZTsKfQoKCiRwcm9ibGVtID0gbmV3IFByb2JsZW0oKTsKJHByb2JsZW0tPmFkZFJ1bGUoJHJ1bGUpOwokcHJvYmxlbS0+YWRkUnVsZSgkY29uZmxpY3QpOwoKCgpmb3JlYWNoICgkdGhpcy0+cnVsZXMtPmdldEl0ZXJhdG9yRm9yKFJ1bGVTZXQ6OlRZUEVfUkVRVUVTVCkgYXMgJGFzc2VydFJ1bGUpIHsKaWYgKCRhc3NlcnRSdWxlLT5pc0Rpc2FibGVkKCkgfHwgISRhc3NlcnRSdWxlLT5pc0Fzc2VydGlvbigpKSB7CmNvbnRpbnVlOwp9CgokYXNzZXJ0UnVsZUxpdGVyYWxzID0gJGFzc2VydFJ1bGUtPmdldExpdGVyYWxzKCk7CiRhc3NlcnRSdWxlTGl0ZXJhbCA9ICRhc3NlcnRSdWxlTGl0ZXJhbHNbMF07CgppZiAoYWJzKCRsaXRlcmFsKSAhPT0gYWJzKCRhc3NlcnRSdWxlTGl0ZXJhbCkpIHsKY29udGludWU7Cn0KJHByb2JsZW0tPmFkZFJ1bGUoJGFzc2VydFJ1bGUpOwokYXNzZXJ0UnVsZS0+ZGlzYWJsZSgpOwp9CiR0aGlzLT5wcm9ibGVtc1tdID0gJHByb2JsZW07CgokdGhpcy0+ZGVjaXNpb25zLT5yZXNldFRvT2Zmc2V0KCRkZWNpc2lvblN0YXJ0KTsKJHJ1bGVJbmRleCA9IC0xOwp9Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBzZXR1cEZpeGVkTWFwKFJlcXVlc3QgJHJlcXVlc3QpOiB2b2lkCnsKJHRoaXMtPmZpeGVkTWFwID0gW107CmZvcmVhY2ggKCRyZXF1ZXN0LT5nZXRGaXhlZFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKJHRoaXMtPmZpeGVkTWFwWyRwYWNrYWdlLT5pZF0gPSAkcGFja2FnZTsKfQp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2hlY2tGb3JSb290UmVxdWlyZVByb2JsZW1zKFJlcXVlc3QgJHJlcXVlc3QsIFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpOiB2b2lkCnsKZm9yZWFjaCAoJHJlcXVlc3QtPmdldFJlcXVpcmVzKCkgYXMgJHBhY2thZ2VOYW1lID0+ICRjb25zdHJhaW50KSB7CmlmICgkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci0+aXNJZ25vcmVkKCRwYWNrYWdlTmFtZSkpIHsKY29udGludWU7Cn0gZWxzZWlmICgkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciBpbnN0YW5jZW9mIElnbm9yZUxpc3RQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKSB7CiRjb25zdHJhaW50ID0gJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXItPmZpbHRlckNvbnN0cmFpbnQoJHBhY2thZ2VOYW1lLCAkY29uc3RyYWludCk7Cn0KCmlmICgwID09PSBcY291bnQoJHRoaXMtPnBvb2wtPndoYXRQcm92aWRlcygkcGFja2FnZU5hbWUsICRjb25zdHJhaW50KSkpIHsKJHByb2JsZW0gPSBuZXcgUHJvYmxlbSgpOwokcHJvYmxlbS0+YWRkUnVsZShuZXcgR2VuZXJpY1J1bGUoW10sIFJ1bGU6OlJVTEVfUk9PVF9SRVFVSVJFLCBbJ3BhY2thZ2VOYW1lJyA9PiAkcGFja2FnZU5hbWUsICdjb25zdHJhaW50JyA9PiAkY29uc3RyYWludF0pKTsKJHRoaXMtPnByb2JsZW1zW10gPSAkcHJvYmxlbTsKfQp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBzb2x2ZShSZXF1ZXN0ICRyZXF1ZXN0LCA/UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciA9IG51bGwpOiBMb2NrVHJhbnNhY3Rpb24KewokcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciA9ICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyID8/IFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5OjppZ25vcmVOb3RoaW5nKCk7CgokdGhpcy0+c2V0dXBGaXhlZE1hcCgkcmVxdWVzdCk7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0dlbmVyYXRpbmcgcnVsZXMnLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwokcnVsZVNldEdlbmVyYXRvciA9IG5ldyBSdWxlU2V0R2VuZXJhdG9yKCR0aGlzLT5wb2xpY3ksICR0aGlzLT5wb29sKTsKJHRoaXMtPnJ1bGVzID0gJHJ1bGVTZXRHZW5lcmF0b3ItPmdldFJ1bGVzRm9yKCRyZXF1ZXN0LCAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik7CnVuc2V0KCRydWxlU2V0R2VuZXJhdG9yKTsKJHRoaXMtPmNoZWNrRm9yUm9vdFJlcXVpcmVQcm9ibGVtcygkcmVxdWVzdCwgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpOwokdGhpcy0+ZGVjaXNpb25zID0gbmV3IERlY2lzaW9ucygkdGhpcy0+cG9vbCk7CiR0aGlzLT53YXRjaEdyYXBoID0gbmV3IFJ1bGVXYXRjaEdyYXBoOwoKZm9yZWFjaCAoJHRoaXMtPnJ1bGVzIGFzICRydWxlKSB7CiR0aGlzLT53YXRjaEdyYXBoLT5pbnNlcnQobmV3IFJ1bGVXYXRjaE5vZGUoJHJ1bGUpKTsKfQoKCiR0aGlzLT5tYWtlQXNzZXJ0aW9uUnVsZURlY2lzaW9ucygpOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdSZXNvbHZpbmcgZGVwZW5kZW5jaWVzIHRocm91Z2ggU0FUJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKJGJlZm9yZSA9IG1pY3JvdGltZSh0cnVlKTsKJHRoaXMtPnJ1blNhdCgpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJycsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCdEZXBlbmRlbmN5IHJlc29sdXRpb24gY29tcGxldGVkIGluICUuM2Ygc2Vjb25kcycsIG1pY3JvdGltZSh0cnVlKSAtICRiZWZvcmUpLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7CgppZiAoXGNvdW50KCR0aGlzLT5wcm9ibGVtcykgPiAwKSB7CnRocm93IG5ldyBTb2x2ZXJQcm9ibGVtc0V4Y2VwdGlvbigkdGhpcy0+cHJvYmxlbXMsICR0aGlzLT5sZWFybmVkUG9vbCk7Cn0KCnJldHVybiBuZXcgTG9ja1RyYW5zYWN0aW9uKCR0aGlzLT5wb29sLCAkcmVxdWVzdC0+Z2V0UHJlc2VudE1hcCgpLCAkcmVxdWVzdC0+Z2V0Rml4ZWRQYWNrYWdlc01hcCgpLCAkdGhpcy0+ZGVjaXNpb25zKTsKfQoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJvcGFnYXRlKGludCAkbGV2ZWwpOiA/UnVsZQp7CndoaWxlICgkdGhpcy0+ZGVjaXNpb25zLT52YWxpZE9mZnNldCgkdGhpcy0+cHJvcGFnYXRlSW5kZXgpKSB7CiRkZWNpc2lvbiA9ICR0aGlzLT5kZWNpc2lvbnMtPmF0T2Zmc2V0KCR0aGlzLT5wcm9wYWdhdGVJbmRleCk7CgokY29uZmxpY3QgPSAkdGhpcy0+d2F0Y2hHcmFwaC0+cHJvcGFnYXRlTGl0ZXJhbCgKJGRlY2lzaW9uW0RlY2lzaW9uczo6REVDSVNJT05fTElURVJBTF0sCiRsZXZlbCwKJHRoaXMtPmRlY2lzaW9ucwopOwoKJHRoaXMtPnByb3BhZ2F0ZUluZGV4Kys7CgppZiAoJGNvbmZsaWN0ICE9PSBudWxsKSB7CnJldHVybiAkY29uZmxpY3Q7Cn0KfQoKcmV0dXJuIG51bGw7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcmV2ZXJ0KGludCAkbGV2ZWwpOiB2b2lkCnsKd2hpbGUgKCEkdGhpcy0+ZGVjaXNpb25zLT5pc0VtcHR5KCkpIHsKJGxpdGVyYWwgPSAkdGhpcy0+ZGVjaXNpb25zLT5sYXN0TGl0ZXJhbCgpOwoKaWYgKCR0aGlzLT5kZWNpc2lvbnMtPnVuZGVjaWRlZCgkbGl0ZXJhbCkpIHsKYnJlYWs7Cn0KCiRkZWNpc2lvbkxldmVsID0gJHRoaXMtPmRlY2lzaW9ucy0+ZGVjaXNpb25MZXZlbCgkbGl0ZXJhbCk7CgppZiAoJGRlY2lzaW9uTGV2ZWwgPD0gJGxldmVsKSB7CmJyZWFrOwp9CgokdGhpcy0+ZGVjaXNpb25zLT5yZXZlcnRMYXN0KCk7CiR0aGlzLT5wcm9wYWdhdGVJbmRleCA9IFxjb3VudCgkdGhpcy0+ZGVjaXNpb25zKTsKfQoKd2hpbGUgKFxjb3VudCgkdGhpcy0+YnJhbmNoZXMpID4gMCAmJiAkdGhpcy0+YnJhbmNoZXNbXGNvdW50KCR0aGlzLT5icmFuY2hlcykgLSAxXVtzZWxmOjpCUkFOQ0hfTEVWRUxdID49ICRsZXZlbCkgewphcnJheV9wb3AoJHRoaXMtPmJyYW5jaGVzKTsKfQp9CgoKCgoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzZXRQcm9wYWdhdGVMZWFybihpbnQgJGxldmVsLCBpbnQgJGxpdGVyYWwsIFJ1bGUgJHJ1bGUpOiBpbnQKewokbGV2ZWwrKzsKCiR0aGlzLT5kZWNpc2lvbnMtPmRlY2lkZSgkbGl0ZXJhbCwgJGxldmVsLCAkcnVsZSk7Cgp3aGlsZSAodHJ1ZSkgewokcnVsZSA9ICR0aGlzLT5wcm9wYWdhdGUoJGxldmVsKTsKCmlmIChudWxsID09PSAkcnVsZSkgewpicmVhazsKfQoKaWYgKCRsZXZlbCA9PT0gMSkgewokdGhpcy0+YW5hbHl6ZVVuc29sdmFibGUoJHJ1bGUpOwoKcmV0dXJuIDA7Cn0KCgpbJGxlYXJuTGl0ZXJhbCwgJG5ld0xldmVsLCAkbmV3UnVsZSwgJHdoeV0gPSAkdGhpcy0+YW5hbHl6ZSgkbGV2ZWwsICRydWxlKTsKCmlmICgkbmV3TGV2ZWwgPD0gMCB8fCAkbmV3TGV2ZWwgPj0gJGxldmVsKSB7CnRocm93IG5ldyBTb2x2ZXJCdWdFeGNlcHRpb24oCiJUcnlpbmcgdG8gcmV2ZXJ0IHRvIGludmFsaWQgbGV2ZWwgIi4kbmV3TGV2ZWwuIiBmcm9tIGxldmVsICIuJGxldmVsLiIuIgopOwp9CgokbGV2ZWwgPSAkbmV3TGV2ZWw7CgokdGhpcy0+cmV2ZXJ0KCRsZXZlbCk7CgokdGhpcy0+cnVsZXMtPmFkZCgkbmV3UnVsZSwgUnVsZVNldDo6VFlQRV9MRUFSTkVEKTsKCiR0aGlzLT5sZWFybmVkV2h5W3NwbF9vYmplY3RfaGFzaCgkbmV3UnVsZSldID0gJHdoeTsKCiRydWxlTm9kZSA9IG5ldyBSdWxlV2F0Y2hOb2RlKCRuZXdSdWxlKTsKJHJ1bGVOb2RlLT53YXRjaDJPbkhpZ2hlc3QoJHRoaXMtPmRlY2lzaW9ucyk7CiR0aGlzLT53YXRjaEdyYXBoLT5pbnNlcnQoJHJ1bGVOb2RlKTsKCiR0aGlzLT5kZWNpc2lvbnMtPmRlY2lkZSgkbGVhcm5MaXRlcmFsLCAkbGV2ZWwsICRuZXdSdWxlKTsKfQoKcmV0dXJuICRsZXZlbDsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzZWxlY3RBbmRJbnN0YWxsKGludCAkbGV2ZWwsIGFycmF5ICRkZWNpc2lvblF1ZXVlLCBSdWxlICRydWxlKTogaW50CnsKCiRsaXRlcmFscyA9ICR0aGlzLT5wb2xpY3ktPnNlbGVjdFByZWZlcnJlZFBhY2thZ2VzKCR0aGlzLT5wb29sLCAkZGVjaXNpb25RdWV1ZSwgJHJ1bGUtPmdldFJlcXVpcmVkUGFja2FnZSgpKTsKCiRzZWxlY3RlZExpdGVyYWwgPSBhcnJheV9zaGlmdCgkbGl0ZXJhbHMpOwoKCmlmIChcY291bnQoJGxpdGVyYWxzKSA+IDApIHsKJHRoaXMtPmJyYW5jaGVzW10gPSBbJGxpdGVyYWxzLCAkbGV2ZWxdOwp9CgpyZXR1cm4gJHRoaXMtPnNldFByb3BhZ2F0ZUxlYXJuKCRsZXZlbCwgJHNlbGVjdGVkTGl0ZXJhbCwgJHJ1bGUpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gYW5hbHl6ZShpbnQgJGxldmVsLCBSdWxlICRydWxlKTogYXJyYXkKewokYW5hbHl6ZWRSdWxlID0gJHJ1bGU7CiRydWxlTGV2ZWwgPSAxOwokbnVtID0gMDsKJGwxbnVtID0gMDsKJHNlZW4gPSBbXTsKJGxlYXJuZWRMaXRlcmFsID0gbnVsbDsKJG90aGVyTGVhcm5lZExpdGVyYWxzID0gW107CgokZGVjaXNpb25JZCA9IFxjb3VudCgkdGhpcy0+ZGVjaXNpb25zKTsKCiR0aGlzLT5sZWFybmVkUG9vbFtdID0gW107Cgp3aGlsZSAodHJ1ZSkgewokdGhpcy0+bGVhcm5lZFBvb2xbXGNvdW50KCR0aGlzLT5sZWFybmVkUG9vbCkgLSAxXVtdID0gJHJ1bGU7Cgpmb3JlYWNoICgkcnVsZS0+Z2V0TGl0ZXJhbHMoKSBhcyAkbGl0ZXJhbCkgewoKaWYgKCRydWxlIGluc3RhbmNlb2YgTXVsdGlDb25mbGljdFJ1bGUgJiYgISR0aGlzLT5kZWNpc2lvbnMtPmRlY2lkZWQoJGxpdGVyYWwpKSB7CmNvbnRpbnVlOwp9CgoKaWYgKCR0aGlzLT5kZWNpc2lvbnMtPnNhdGlzZnkoJGxpdGVyYWwpKSB7CmNvbnRpbnVlOwp9CgppZiAoaXNzZXQoJHNlZW5bYWJzKCRsaXRlcmFsKV0pKSB7CmNvbnRpbnVlOwp9CiRzZWVuW2FicygkbGl0ZXJhbCldID0gdHJ1ZTsKCiRsID0gJHRoaXMtPmRlY2lzaW9ucy0+ZGVjaXNpb25MZXZlbCgkbGl0ZXJhbCk7CgppZiAoMSA9PT0gJGwpIHsKJGwxbnVtKys7Cn0gZWxzZWlmICgkbGV2ZWwgPT09ICRsKSB7CiRudW0rKzsKfSBlbHNlIHsKCiRvdGhlckxlYXJuZWRMaXRlcmFsc1tdID0gJGxpdGVyYWw7CgppZiAoJGwgPiAkcnVsZUxldmVsKSB7CiRydWxlTGV2ZWwgPSAkbDsKfQp9Cn0KdW5zZXQoJGxpdGVyYWwpOwoKJGwxcmV0cnkgPSB0cnVlOwp3aGlsZSAoJGwxcmV0cnkpIHsKJGwxcmV0cnkgPSBmYWxzZTsKCmlmICgwID09PSAkbnVtICYmIDAgPT09IC0tJGwxbnVtKSB7CgpicmVhayAyOwp9Cgp3aGlsZSAodHJ1ZSkgewppZiAoJGRlY2lzaW9uSWQgPD0gMCkgewp0aHJvdyBuZXcgU29sdmVyQnVnRXhjZXB0aW9uKAoiUmVhY2hlZCBpbnZhbGlkIGRlY2lzaW9uIGlkICRkZWNpc2lvbklkIHdoaWxlIGxvb2tpbmcgdGhyb3VnaCAkcnVsZSBmb3IgYSBsaXRlcmFsIHByZXNlbnQgaW4gdGhlIGFuYWx5emVkIHJ1bGUgJGFuYWx5emVkUnVsZS4iCik7Cn0KCiRkZWNpc2lvbklkLS07CgokZGVjaXNpb24gPSAkdGhpcy0+ZGVjaXNpb25zLT5hdE9mZnNldCgkZGVjaXNpb25JZCk7CiRsaXRlcmFsID0gJGRlY2lzaW9uW0RlY2lzaW9uczo6REVDSVNJT05fTElURVJBTF07CgppZiAoaXNzZXQoJHNlZW5bYWJzKCRsaXRlcmFsKV0pKSB7CmJyZWFrOwp9Cn0KCnVuc2V0KCRzZWVuW2FicygkbGl0ZXJhbCldKTsKCmlmICgwICE9PSAkbnVtICYmIDAgPT09IC0tJG51bSkgewppZiAoJGxpdGVyYWwgPCAwKSB7CiR0aGlzLT50ZXN0RmxhZ0xlYXJuZWRQb3NpdGl2ZUxpdGVyYWwgPSB0cnVlOwp9CiRsZWFybmVkTGl0ZXJhbCA9IC0kbGl0ZXJhbDsKCmlmICgwID09PSAkbDFudW0pIHsKYnJlYWsgMjsKfQoKZm9yZWFjaCAoJG90aGVyTGVhcm5lZExpdGVyYWxzIGFzICRvdGhlckxpdGVyYWwpIHsKdW5zZXQoJHNlZW5bYWJzKCRvdGhlckxpdGVyYWwpXSk7Cn0KCiRsMW51bSsrOwokbDFyZXRyeSA9IHRydWU7Cn0gZWxzZSB7CiRkZWNpc2lvbiA9ICR0aGlzLT5kZWNpc2lvbnMtPmF0T2Zmc2V0KCRkZWNpc2lvbklkKTsKJHJ1bGUgPSAkZGVjaXNpb25bRGVjaXNpb25zOjpERUNJU0lPTl9SRUFTT05dOwoKaWYgKCRydWxlIGluc3RhbmNlb2YgTXVsdGlDb25mbGljdFJ1bGUpIHsKCmZvcmVhY2ggKCRydWxlLT5nZXRMaXRlcmFscygpIGFzICRydWxlTGl0ZXJhbCkgewppZiAoIWlzc2V0KCRzZWVuW2FicygkcnVsZUxpdGVyYWwpXSkgJiYgJHRoaXMtPmRlY2lzaW9ucy0+c2F0aXNmeSgtJHJ1bGVMaXRlcmFsKSkgewokdGhpcy0+bGVhcm5lZFBvb2xbXGNvdW50KCR0aGlzLT5sZWFybmVkUG9vbCkgLSAxXVtdID0gJHJ1bGU7CiRsID0gJHRoaXMtPmRlY2lzaW9ucy0+ZGVjaXNpb25MZXZlbCgkcnVsZUxpdGVyYWwpOwppZiAoMSA9PT0gJGwpIHsKJGwxbnVtKys7Cn0gZWxzZWlmICgkbGV2ZWwgPT09ICRsKSB7CiRudW0rKzsKfSBlbHNlIHsKCiRvdGhlckxlYXJuZWRMaXRlcmFsc1tdID0gJHJ1bGVMaXRlcmFsOwoKaWYgKCRsID4gJHJ1bGVMZXZlbCkgewokcnVsZUxldmVsID0gJGw7Cn0KfQokc2VlblthYnMoJHJ1bGVMaXRlcmFsKV0gPSB0cnVlOwpicmVhazsKfQp9CgokbDFyZXRyeSA9IHRydWU7Cn0KfQp9CgokZGVjaXNpb24gPSAkdGhpcy0+ZGVjaXNpb25zLT5hdE9mZnNldCgkZGVjaXNpb25JZCk7CiRydWxlID0gJGRlY2lzaW9uW0RlY2lzaW9uczo6REVDSVNJT05fUkVBU09OXTsKfQoKJHdoeSA9IFxjb3VudCgkdGhpcy0+bGVhcm5lZFBvb2wpIC0gMTsKCmlmIChudWxsID09PSAkbGVhcm5lZExpdGVyYWwpIHsKdGhyb3cgbmV3IFNvbHZlckJ1Z0V4Y2VwdGlvbigKIkRpZCBub3QgZmluZCBhIGxlYXJuYWJsZSBsaXRlcmFsIGluIGFuYWx5emVkIHJ1bGUgJGFuYWx5emVkUnVsZS4iCik7Cn0KCmFycmF5X3Vuc2hpZnQoJG90aGVyTGVhcm5lZExpdGVyYWxzLCAkbGVhcm5lZExpdGVyYWwpOwokbmV3UnVsZSA9IG5ldyBHZW5lcmljUnVsZSgkb3RoZXJMZWFybmVkTGl0ZXJhbHMsIFJ1bGU6OlJVTEVfTEVBUk5FRCwgJHdoeSk7CgpyZXR1cm4gWyRsZWFybmVkTGl0ZXJhbCwgJHJ1bGVMZXZlbCwgJG5ld1J1bGUsICR3aHldOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFuYWx5emVVbnNvbHZhYmxlUnVsZShQcm9ibGVtICRwcm9ibGVtLCBSdWxlICRjb25mbGljdFJ1bGUsIGFycmF5ICYkcnVsZVNlZW4pOiB2b2lkCnsKJHdoeSA9IHNwbF9vYmplY3RfaGFzaCgkY29uZmxpY3RSdWxlKTsKJHJ1bGVTZWVuWyR3aHldID0gdHJ1ZTsKCmlmICgkY29uZmxpY3RSdWxlLT5nZXRUeXBlKCkgPT09IFJ1bGVTZXQ6OlRZUEVfTEVBUk5FRCkgewokbGVhcm5lZFdoeSA9ICR0aGlzLT5sZWFybmVkV2h5WyR3aHldOwokcHJvYmxlbVJ1bGVzID0gJHRoaXMtPmxlYXJuZWRQb29sWyRsZWFybmVkV2h5XTsKCmZvcmVhY2ggKCRwcm9ibGVtUnVsZXMgYXMgJHByb2JsZW1SdWxlKSB7CmlmICghaXNzZXQoJHJ1bGVTZWVuW3NwbF9vYmplY3RfaGFzaCgkcHJvYmxlbVJ1bGUpXSkpIHsKJHRoaXMtPmFuYWx5emVVbnNvbHZhYmxlUnVsZSgkcHJvYmxlbSwgJHByb2JsZW1SdWxlLCAkcnVsZVNlZW4pOwp9Cn0KCnJldHVybjsKfQoKaWYgKCRjb25mbGljdFJ1bGUtPmdldFR5cGUoKSA9PT0gUnVsZVNldDo6VFlQRV9QQUNLQUdFKSB7CgpyZXR1cm47Cn0KCiRwcm9ibGVtLT5uZXh0U2VjdGlvbigpOwokcHJvYmxlbS0+YWRkUnVsZSgkY29uZmxpY3RSdWxlKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBhbmFseXplVW5zb2x2YWJsZShSdWxlICRjb25mbGljdFJ1bGUpOiB2b2lkCnsKJHByb2JsZW0gPSBuZXcgUHJvYmxlbSgpOwokcHJvYmxlbS0+YWRkUnVsZSgkY29uZmxpY3RSdWxlKTsKCiRydWxlU2VlbiA9IFtdOwoKJHRoaXMtPmFuYWx5emVVbnNvbHZhYmxlUnVsZSgkcHJvYmxlbSwgJGNvbmZsaWN0UnVsZSwgJHJ1bGVTZWVuKTsKCiR0aGlzLT5wcm9ibGVtc1tdID0gJHByb2JsZW07Cgokc2VlbiA9IFtdOwokbGl0ZXJhbHMgPSAkY29uZmxpY3RSdWxlLT5nZXRMaXRlcmFscygpOwoKZm9yZWFjaCAoJGxpdGVyYWxzIGFzICRsaXRlcmFsKSB7CgppZiAoJHRoaXMtPmRlY2lzaW9ucy0+c2F0aXNmeSgkbGl0ZXJhbCkpIHsKY29udGludWU7Cn0KJHNlZW5bYWJzKCRsaXRlcmFsKV0gPSB0cnVlOwp9Cgpmb3JlYWNoICgkdGhpcy0+ZGVjaXNpb25zIGFzICRkZWNpc2lvbikgewokZGVjaXNpb25MaXRlcmFsID0gJGRlY2lzaW9uW0RlY2lzaW9uczo6REVDSVNJT05fTElURVJBTF07CgoKaWYgKCFpc3NldCgkc2VlblthYnMoJGRlY2lzaW9uTGl0ZXJhbCldKSkgewpjb250aW51ZTsKfQoKJHdoeSA9ICRkZWNpc2lvbltEZWNpc2lvbnM6OkRFQ0lTSU9OX1JFQVNPTl07CgokcHJvYmxlbS0+YWRkUnVsZSgkd2h5KTsKJHRoaXMtPmFuYWx5emVVbnNvbHZhYmxlUnVsZSgkcHJvYmxlbSwgJHdoeSwgJHJ1bGVTZWVuKTsKCiRsaXRlcmFscyA9ICR3aHktPmdldExpdGVyYWxzKCk7CmZvcmVhY2ggKCRsaXRlcmFscyBhcyAkbGl0ZXJhbCkgewoKaWYgKCR0aGlzLT5kZWNpc2lvbnMtPnNhdGlzZnkoJGxpdGVyYWwpKSB7CmNvbnRpbnVlOwp9CiRzZWVuW2FicygkbGl0ZXJhbCldID0gdHJ1ZTsKfQp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gcnVuU2F0KCk6IHZvaWQKewokdGhpcy0+cHJvcGFnYXRlSW5kZXggPSAwOwoKCgoKCgoKCgoKCiRsZXZlbCA9IDE7CiRzeXN0ZW1MZXZlbCA9ICRsZXZlbCArIDE7Cgp3aGlsZSAodHJ1ZSkgewppZiAoMSA9PT0gJGxldmVsKSB7CiRjb25mbGljdFJ1bGUgPSAkdGhpcy0+cHJvcGFnYXRlKCRsZXZlbCk7CmlmIChudWxsICE9PSAkY29uZmxpY3RSdWxlKSB7CiR0aGlzLT5hbmFseXplVW5zb2x2YWJsZSgkY29uZmxpY3RSdWxlKTsKCnJldHVybjsKfQp9CgoKaWYgKCRsZXZlbCA8ICRzeXN0ZW1MZXZlbCkgewokaXRlcmF0b3IgPSAkdGhpcy0+cnVsZXMtPmdldEl0ZXJhdG9yRm9yKFJ1bGVTZXQ6OlRZUEVfUkVRVUVTVCk7CmZvcmVhY2ggKCRpdGVyYXRvciBhcyAkcnVsZSkgewppZiAoJHJ1bGUtPmlzRW5hYmxlZCgpKSB7CiRkZWNpc2lvblF1ZXVlID0gW107CiRub25lU2F0aXNmaWVkID0gdHJ1ZTsKCmZvcmVhY2ggKCRydWxlLT5nZXRMaXRlcmFscygpIGFzICRsaXRlcmFsKSB7CmlmICgkdGhpcy0+ZGVjaXNpb25zLT5zYXRpc2Z5KCRsaXRlcmFsKSkgewokbm9uZVNhdGlzZmllZCA9IGZhbHNlOwpicmVhazsKfQppZiAoJGxpdGVyYWwgPiAwICYmICR0aGlzLT5kZWNpc2lvbnMtPnVuZGVjaWRlZCgkbGl0ZXJhbCkpIHsKJGRlY2lzaW9uUXVldWVbXSA9ICRsaXRlcmFsOwp9Cn0KCmlmICgkbm9uZVNhdGlzZmllZCAmJiBcY291bnQoJGRlY2lzaW9uUXVldWUpID4gMCkgewoKJHBydW5lZFF1ZXVlID0gW107CmZvcmVhY2ggKCRkZWNpc2lvblF1ZXVlIGFzICRsaXRlcmFsKSB7CmlmIChpc3NldCgkdGhpcy0+Zml4ZWRNYXBbYWJzKCRsaXRlcmFsKV0pKSB7CiRwcnVuZWRRdWV1ZVtdID0gJGxpdGVyYWw7Cn0KfQppZiAoXGNvdW50KCRwcnVuZWRRdWV1ZSkgPiAwKSB7CiRkZWNpc2lvblF1ZXVlID0gJHBydW5lZFF1ZXVlOwp9Cn0KCmlmICgkbm9uZVNhdGlzZmllZCAmJiBcY291bnQoJGRlY2lzaW9uUXVldWUpID4gMCkgewokb0xldmVsID0gJGxldmVsOwokbGV2ZWwgPSAkdGhpcy0+c2VsZWN0QW5kSW5zdGFsbCgkbGV2ZWwsICRkZWNpc2lvblF1ZXVlLCAkcnVsZSk7CgppZiAoMCA9PT0gJGxldmVsKSB7CnJldHVybjsKfQppZiAoJGxldmVsIDw9ICRvTGV2ZWwpIHsKYnJlYWs7Cn0KfQp9Cn0KCiRzeXN0ZW1MZXZlbCA9ICRsZXZlbCArIDE7CgoKJGl0ZXJhdG9yLT5uZXh0KCk7CmlmICgkaXRlcmF0b3ItPnZhbGlkKCkpIHsKY29udGludWU7Cn0KfQoKaWYgKCRsZXZlbCA8ICRzeXN0ZW1MZXZlbCkgewokc3lzdGVtTGV2ZWwgPSAkbGV2ZWw7Cn0KCiRydWxlc0NvdW50ID0gXGNvdW50KCR0aGlzLT5ydWxlcyk7CiRwYXNzID0gMTsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcignTG9va2luZyBhdCBhbGwgcnVsZXMuJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKZm9yICgkaSA9IDAsICRuID0gMDsgJG4gPCAkcnVsZXNDb3VudDsgJGkrKywgJG4rKykgewppZiAoJGkgPT09ICRydWxlc0NvdW50KSB7CmlmICgxID09PSAkcGFzcykgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIlNvbWV0aGluZydzIGNoYW5nZWQsIGxvb2tpbmcgYXQgYWxsIHJ1bGVzIGFnYWluIChwYXNzICMkcGFzcykiLCBmYWxzZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKfSBlbHNlIHsKJHRoaXMtPmlvLT5vdmVyd3JpdGVFcnJvcigiU29tZXRoaW5nJ3MgY2hhbmdlZCwgbG9va2luZyBhdCBhbGwgcnVsZXMgYWdhaW4gKHBhc3MgIyRwYXNzKSIsIGZhbHNlLCBudWxsLCBJT0ludGVyZmFjZTo6REVCVUcpOwp9CgokaSA9IDA7CiRwYXNzKys7Cn0KCiRydWxlID0gJHRoaXMtPnJ1bGVzLT5ydWxlQnlJZFskaV07CiRsaXRlcmFscyA9ICRydWxlLT5nZXRMaXRlcmFscygpOwoKaWYgKCRydWxlLT5pc0Rpc2FibGVkKCkpIHsKY29udGludWU7Cn0KCiRkZWNpc2lvblF1ZXVlID0gW107CgoKCgoKCgpmb3JlYWNoICgkbGl0ZXJhbHMgYXMgJGxpdGVyYWwpIHsKaWYgKCRsaXRlcmFsIDw9IDApIHsKaWYgKCEkdGhpcy0+ZGVjaXNpb25zLT5kZWNpZGVkSW5zdGFsbCgkbGl0ZXJhbCkpIHsKY29udGludWUgMjsgCn0KfSBlbHNlIHsKaWYgKCR0aGlzLT5kZWNpc2lvbnMtPmRlY2lkZWRJbnN0YWxsKCRsaXRlcmFsKSkgewpjb250aW51ZSAyOyAKfQppZiAoJHRoaXMtPmRlY2lzaW9ucy0+dW5kZWNpZGVkKCRsaXRlcmFsKSkgewokZGVjaXNpb25RdWV1ZVtdID0gJGxpdGVyYWw7Cn0KfQp9CgoKaWYgKFxjb3VudCgkZGVjaXNpb25RdWV1ZSkgPCAyKSB7CmNvbnRpbnVlOwp9CgokbGV2ZWwgPSAkdGhpcy0+c2VsZWN0QW5kSW5zdGFsbCgkbGV2ZWwsICRkZWNpc2lvblF1ZXVlLCAkcnVsZSk7CgppZiAoMCA9PT0gJGxldmVsKSB7CnJldHVybjsKfQoKCiRydWxlc0NvdW50ID0gXGNvdW50KCR0aGlzLT5ydWxlcyk7CiRuID0gLTE7Cn0KCmlmICgkbGV2ZWwgPCAkc3lzdGVtTGV2ZWwpIHsKY29udGludWU7Cn0KCgppZiAoXGNvdW50KCR0aGlzLT5icmFuY2hlcykgPiAwKSB7CiRsYXN0TGl0ZXJhbCA9IG51bGw7CiRsYXN0TGV2ZWwgPSBudWxsOwokbGFzdEJyYW5jaEluZGV4ID0gMDsKJGxhc3RCcmFuY2hPZmZzZXQgPSAwOwoKZm9yICgkaSA9IFxjb3VudCgkdGhpcy0+YnJhbmNoZXMpIC0gMTsgJGkgPj0gMDsgJGktLSkgewpbJGxpdGVyYWxzLCAkbF0gPSAkdGhpcy0+YnJhbmNoZXNbJGldOwoKZm9yZWFjaCAoJGxpdGVyYWxzIGFzICRvZmZzZXQgPT4gJGxpdGVyYWwpIHsKaWYgKCRsaXRlcmFsID4gMCAmJiAkdGhpcy0+ZGVjaXNpb25zLT5kZWNpc2lvbkxldmVsKCRsaXRlcmFsKSA+ICRsICsgMSkgewokbGFzdExpdGVyYWwgPSAkbGl0ZXJhbDsKJGxhc3RCcmFuY2hJbmRleCA9ICRpOwokbGFzdEJyYW5jaE9mZnNldCA9ICRvZmZzZXQ7CiRsYXN0TGV2ZWwgPSAkbDsKfQp9Cn0KCmlmICgkbGFzdExpdGVyYWwgIT09IG51bGwpIHsKYXNzZXJ0KCRsYXN0TGV2ZWwgIT09IG51bGwpOwp1bnNldCgkdGhpcy0+YnJhbmNoZXNbJGxhc3RCcmFuY2hJbmRleF1bc2VsZjo6QlJBTkNIX0xJVEVSQUxTXVskbGFzdEJyYW5jaE9mZnNldF0pOwoKJGxldmVsID0gJGxhc3RMZXZlbDsKJHRoaXMtPnJldmVydCgkbGV2ZWwpOwoKJHdoeSA9ICR0aGlzLT5kZWNpc2lvbnMtPmxhc3RSZWFzb24oKTsKCiRsZXZlbCA9ICR0aGlzLT5zZXRQcm9wYWdhdGVMZWFybigkbGV2ZWwsICRsYXN0TGl0ZXJhbCwgJHdoeSk7CgppZiAoJGxldmVsID09PSAwKSB7CnJldHVybjsKfQoKY29udGludWU7Cn0KfQoKYnJlYWs7Cn0KfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7CgoKCgpjbGFzcyBTb2x2ZXJCdWdFeGNlcHRpb24gZXh0ZW5kcyBcUnVudGltZUV4Y2VwdGlvbgp7CnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG1lc3NhZ2UpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgKJG1lc3NhZ2UuIlxuVGhpcyBleGNlcHRpb24gd2FzIG1vc3QgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBDb21wb3Nlci5cbiIuCiJQbGVhc2UgcmVwb3J0IHRoZSBjb21tYW5kIHlvdSByYW4sIHRoZSBleGFjdCBlcnJvciB5b3UgcmVjZWl2ZWQsIGFuZCB5b3VyIGNvbXBvc2VyLmpzb24gb24gaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NvbXBvc2VyL2lzc3VlcyAtIHRoYW5rIHlvdSFcbiIKKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7Cgp1c2UgQ29tcG9zZXJcVXRpbFxJbmlIZWxwZXI7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlTZXQ7CgoKCgoKCmNsYXNzIFNvbHZlclByb2JsZW1zRXhjZXB0aW9uIGV4dGVuZHMgXFJ1bnRpbWVFeGNlcHRpb24KewpwdWJsaWMgY29uc3QgRVJST1JfREVQRU5ERU5DWV9SRVNPTFVUSU9OX0ZBSUxFRCA9IDI7CgoKcHJvdGVjdGVkICRwcm9ibGVtczsKCnByb3RlY3RlZCAkbGVhcm5lZFBvb2w7CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRwcm9ibGVtcywgYXJyYXkgJGxlYXJuZWRQb29sKQp7CiR0aGlzLT5wcm9ibGVtcyA9ICRwcm9ibGVtczsKJHRoaXMtPmxlYXJuZWRQb29sID0gJGxlYXJuZWRQb29sOwoKcGFyZW50OjpfX2NvbnN0cnVjdCgnRmFpbGVkIHJlc29sdmluZyBkZXBlbmRlbmNpZXMgd2l0aCAnLlxjb3VudCgkcHJvYmxlbXMpLicgcHJvYmxlbXMsIGNhbGwgZ2V0UHJldHR5U3RyaW5nIHRvIGdldCBmb3JtYXR0ZWQgZGV0YWlscycsIHNlbGY6OkVSUk9SX0RFUEVOREVOQ1lfUkVTT0xVVElPTl9GQUlMRUQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJldHR5U3RyaW5nKFJlcG9zaXRvcnlTZXQgJHJlcG9zaXRvcnlTZXQsIFJlcXVlc3QgJHJlcXVlc3QsIFBvb2wgJHBvb2wsIGJvb2wgJGlzVmVyYm9zZSwgYm9vbCAkaXNEZXZFeHRyYWN0aW9uID0gZmFsc2UpOiBzdHJpbmcKewokaW5zdGFsbGVkTWFwID0gJHJlcXVlc3QtPmdldFByZXNlbnRNYXAodHJ1ZSk7CiRtaXNzaW5nRXh0ZW5zaW9ucyA9IFtdOwokaXNDYXVzZWRCeUxvY2sgPSBmYWxzZTsKCiRwcm9ibGVtcyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+cHJvYmxlbXMgYXMgJHByb2JsZW0pIHsKJHByb2JsZW1zW10gPSAkcHJvYmxlbS0+Z2V0UHJldHR5U3RyaW5nKCRyZXBvc2l0b3J5U2V0LCAkcmVxdWVzdCwgJHBvb2wsICRpc1ZlcmJvc2UsICRpbnN0YWxsZWRNYXAsICR0aGlzLT5sZWFybmVkUG9vbCkuIlxuIjsKCiRtaXNzaW5nRXh0ZW5zaW9ucyA9IGFycmF5X21lcmdlKCRtaXNzaW5nRXh0ZW5zaW9ucywgJHRoaXMtPmdldEV4dGVuc2lvblByb2JsZW1zKCRwcm9ibGVtLT5nZXRSZWFzb25zKCkpKTsKCiRpc0NhdXNlZEJ5TG9jayA9ICRpc0NhdXNlZEJ5TG9jayB8fCAkcHJvYmxlbS0+aXNDYXVzZWRCeUxvY2soJHJlcG9zaXRvcnlTZXQsICRyZXF1ZXN0LCAkcG9vbCk7Cn0KCiRpID0gMTsKJHRleHQgPSAiXG4iOwpmb3JlYWNoIChhcnJheV91bmlxdWUoJHByb2JsZW1zKSBhcyAkcHJvYmxlbSkgewokdGV4dCAuPSAiICBQcm9ibGVtICIuKCRpKyspLiRwcm9ibGVtOwp9CgokaGludHMgPSBbXTsKaWYgKCEkaXNEZXZFeHRyYWN0aW9uICYmIChzdHJfY29udGFpbnMoJHRleHQsICdjb3VsZCBub3QgYmUgZm91bmQnKSB8fCBzdHJfY29udGFpbnMoJHRleHQsICdubyBtYXRjaGluZyBwYWNrYWdlIGZvdW5kJykpKSB7CiRoaW50c1tdID0gIlBvdGVudGlhbCBjYXVzZXM6XG4gLSBBIHR5cG8gaW4gdGhlIHBhY2thZ2UgbmFtZVxuIC0gVGhlIHBhY2thZ2UgaXMgbm90IGF2YWlsYWJsZSBpbiBhIHN0YWJsZS1lbm91Z2ggdmVyc2lvbiBhY2NvcmRpbmcgdG8geW91ciBtaW5pbXVtLXN0YWJpbGl0eSBzZXR0aW5nXG4gICBzZWUgPGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wNC1zY2hlbWEubWQjbWluaW11bS1zdGFiaWxpdHk+IGZvciBtb3JlIGRldGFpbHMuXG4gLSBJdCdzIGEgcHJpdmF0ZSBwYWNrYWdlIGFuZCB5b3UgZm9yZ290IHRvIGFkZCBhIGN1c3RvbSByZXBvc2l0b3J5IHRvIGZpbmQgaXRcblxuUmVhZCA8aHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jL2FydGljbGVzL3Ryb3VibGVzaG9vdGluZy5tZD4gZm9yIGZ1cnRoZXIgY29tbW9uIHByb2JsZW1zLiI7Cn0KCmlmIChcY291bnQoJG1pc3NpbmdFeHRlbnNpb25zKSA+IDApIHsKJGhpbnRzW10gPSAkdGhpcy0+Y3JlYXRlRXh0ZW5zaW9uSGludCgkbWlzc2luZ0V4dGVuc2lvbnMpOwp9CgppZiAoJGlzQ2F1c2VkQnlMb2NrICYmICEkaXNEZXZFeHRyYWN0aW9uICYmICEkcmVxdWVzdC0+Z2V0VXBkYXRlQWxsb3dUcmFuc2l0aXZlUm9vdERlcGVuZGVuY2llcygpKSB7CiRoaW50c1tdID0gIlVzZSB0aGUgb3B0aW9uIC0td2l0aC1hbGwtZGVwZW5kZW5jaWVzICgtVykgdG8gYWxsb3cgdXBncmFkZXMsIGRvd25ncmFkZXMgYW5kIHJlbW92YWxzIGZvciBwYWNrYWdlcyBjdXJyZW50bHkgbG9ja2VkIHRvIHNwZWNpZmljIHZlcnNpb25zLiI7Cn0KCmlmIChzdHJfY29udGFpbnMoJHRleHQsICdmb3VuZCBjb21wb3Nlci1wbHVnaW4tYXBpWzIuMC4wXSBidXQgaXQgZG9lcyBub3QgbWF0Y2gnKSAmJiBzdHJfY29udGFpbnMoJHRleHQsICctIG9jcmFtaXVzL3BhY2thZ2UtdmVyc2lvbnMnKSkgewokaGludHNbXSA9ICI8d2FybmluZz5vY3JhbWl1cy9wYWNrYWdlLXZlcnNpb25zIG9ubHkgcHJvdmlkZXMgc3VwcG9ydCBmb3IgQ29tcG9zZXIgMiBpbiAxLjgrLCB3aGljaCByZXF1aXJlcyBQSFAgNy40Ljwvd2FybmluZz5cbklmIHlvdSBjYW4gbm90IHVwZ3JhZGUgUEhQIHlvdSBjYW4gcmVxdWlyZSA8aW5mbz5jb21wb3Nlci9wYWNrYWdlLXZlcnNpb25zLWRlcHJlY2F0ZWQ8L2luZm8+IHRvIHJlc29sdmUgdGhpcyB3aXRoIFBIUCA3LjArLiI7Cn0KCmlmICghY2xhc3NfZXhpc3RzKCdQSFBVbml0XEZyYW1ld29ya1xUZXN0Q2FzZScsIGZhbHNlKSkgewppZiAoc3RyX2NvbnRhaW5zKCR0ZXh0LCAnZm91bmQgY29tcG9zZXItcGx1Z2luLWFwaVsyLjAuMF0gYnV0IGl0IGRvZXMgbm90IG1hdGNoJykpIHsKJGhpbnRzW10gPSAiWW91IGFyZSB1c2luZyBDb21wb3NlciAyLCB3aGljaCBzb21lIG9mIHlvdXIgcGx1Z2lucyBzZWVtIHRvIGJlIGluY29tcGF0aWJsZSB3aXRoLiBNYWtlIHN1cmUgeW91IHVwZGF0ZSB5b3VyIHBsdWdpbnMgb3IgcmVwb3J0IGEgcGx1Z2luLWlzc3VlIHRvIGFzayB0aGVtIHRvIHN1cHBvcnQgQ29tcG9zZXIgMi4iOwp9Cn0KCmlmIChcY291bnQoJGhpbnRzKSA+IDApIHsKJHRleHQgLj0gIlxuIiAuIGltcGxvZGUoIlxuXG4iLCAkaGludHMpOwp9CgpyZXR1cm4gJHRleHQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm9ibGVtcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cHJvYmxlbXM7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY3JlYXRlRXh0ZW5zaW9uSGludChhcnJheSAkbWlzc2luZ0V4dGVuc2lvbnMpOiBzdHJpbmcKewokcGF0aHMgPSBJbmlIZWxwZXI6OmdldEFsbCgpOwoKaWYgKCcnID09PSAkcGF0aHNbMF0pIHsKaWYgKGNvdW50KCRwYXRocykgPT09IDEpIHsKcmV0dXJuICcnOwp9CgphcnJheV9zaGlmdCgkcGF0aHMpOwp9CgokaWdub3JlRXh0ZW5zaW9uc0FyZ3VtZW50cyA9IGltcGxvZGUoIiAiLCBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkZXh0ZW5zaW9uKSB7CnJldHVybiAiLS1pZ25vcmUtcGxhdGZvcm0tcmVxPSRleHRlbnNpb24iOwp9LCBhcnJheV91bmlxdWUoJG1pc3NpbmdFeHRlbnNpb25zKSkpOwoKJHRleHQgPSAiVG8gZW5hYmxlIGV4dGVuc2lvbnMsIHZlcmlmeSB0aGF0IHRoZXkgYXJlIGVuYWJsZWQgaW4geW91ciAuaW5pIGZpbGVzOlxuICAgIC0gIjsKJHRleHQgLj0gaW1wbG9kZSgiXG4gICAgLSAiLCAkcGF0aHMpOwokdGV4dCAuPSAiXG5Zb3UgY2FuIGFsc28gcnVuIGBwaHAgLS1pbmlgIGluIGEgdGVybWluYWwgdG8gc2VlIHdoaWNoIGZpbGVzIGFyZSB1c2VkIGJ5IFBIUCBpbiBDTEkgbW9kZS4iOwokdGV4dCAuPSAiXG5BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHJ1biBDb21wb3NlciB3aXRoIGAkaWdub3JlRXh0ZW5zaW9uc0FyZ3VtZW50c2AgdG8gdGVtcG9yYXJpbHkgaWdub3JlIHRoZXNlIHJlcXVpcmVkIGV4dGVuc2lvbnMuIjsKCnJldHVybiAkdGV4dDsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uUHJvYmxlbXMoYXJyYXkgJHJlYXNvblNldHMpOiBhcnJheQp7CiRtaXNzaW5nRXh0ZW5zaW9ucyA9IFtdOwpmb3JlYWNoICgkcmVhc29uU2V0cyBhcyAkcmVhc29uU2V0KSB7CmZvcmVhY2ggKCRyZWFzb25TZXQgYXMgJHJ1bGUpIHsKJHJlcXVpcmVkID0gJHJ1bGUtPmdldFJlcXVpcmVkUGFja2FnZSgpOwppZiAobnVsbCAhPT0gJHJlcXVpcmVkICYmIDAgPT09IHN0cnBvcygkcmVxdWlyZWQsICdleHQtJykpIHsKJG1pc3NpbmdFeHRlbnNpb25zWyRyZXF1aXJlZF0gPSAxOwp9Cn0KfQoKcmV0dXJuIGFycmF5X2tleXMoJG1pc3NpbmdFeHRlbnNpb25zKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTGluazsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxPcGVyYXRpb25JbnRlcmZhY2U7CgoKCgoKY2xhc3MgVHJhbnNhY3Rpb24KewoKCgpwcm90ZWN0ZWQgJG9wZXJhdGlvbnM7CgoKCgoKcHJvdGVjdGVkICRwcmVzZW50UGFja2FnZXM7CgoKCgoKcHJvdGVjdGVkICRyZXN1bHRQYWNrYWdlTWFwOwoKCgoKcHJvdGVjdGVkICRyZXN1bHRQYWNrYWdlc0J5TmFtZSA9IFtdOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkcHJlc2VudFBhY2thZ2VzLCBhcnJheSAkcmVzdWx0UGFja2FnZXMpCnsKJHRoaXMtPnByZXNlbnRQYWNrYWdlcyA9ICRwcmVzZW50UGFja2FnZXM7CiR0aGlzLT5zZXRSZXN1bHRQYWNrYWdlTWFwcygkcmVzdWx0UGFja2FnZXMpOwokdGhpcy0+b3BlcmF0aW9ucyA9ICR0aGlzLT5jYWxjdWxhdGVPcGVyYXRpb25zKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPcGVyYXRpb25zKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5vcGVyYXRpb25zOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHNldFJlc3VsdFBhY2thZ2VNYXBzKGFycmF5ICRyZXN1bHRQYWNrYWdlcyk6IHZvaWQKewokcGFja2FnZVNvcnQgPSBzdGF0aWMgZnVuY3Rpb24gKFBhY2thZ2VJbnRlcmZhY2UgJGEsIFBhY2thZ2VJbnRlcmZhY2UgJGIpOiBpbnQgewoKaWYgKCRhLT5nZXROYW1lKCkgPT09ICRiLT5nZXROYW1lKCkpIHsKaWYgKCRhIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICE9PSAkYiBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewpyZXR1cm4gJGEgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UgPyAtMSA6IDE7Cn0KCgpyZXR1cm4gc3RyY21wKCRiLT5nZXRWZXJzaW9uKCksICRhLT5nZXRWZXJzaW9uKCkpOwp9CgpyZXR1cm4gc3RyY21wKCRiLT5nZXROYW1lKCksICRhLT5nZXROYW1lKCkpOwp9OwoKJHRoaXMtPnJlc3VsdFBhY2thZ2VNYXAgPSBbXTsKZm9yZWFjaCAoJHJlc3VsdFBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiR0aGlzLT5yZXN1bHRQYWNrYWdlTWFwW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldID0gJHBhY2thZ2U7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXROYW1lcygpIGFzICRuYW1lKSB7CiR0aGlzLT5yZXN1bHRQYWNrYWdlc0J5TmFtZVskbmFtZV1bXSA9ICRwYWNrYWdlOwp9Cn0KCnVhc29ydCgkdGhpcy0+cmVzdWx0UGFja2FnZU1hcCwgJHBhY2thZ2VTb3J0KTsKZm9yZWFjaCAoJHRoaXMtPnJlc3VsdFBhY2thZ2VzQnlOYW1lIGFzICRuYW1lID0+ICRwYWNrYWdlcykgewp1YXNvcnQoJHRoaXMtPnJlc3VsdFBhY2thZ2VzQnlOYW1lWyRuYW1lXSwgJHBhY2thZ2VTb3J0KTsKfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2FsY3VsYXRlT3BlcmF0aW9ucygpOiBhcnJheQp7CiRvcGVyYXRpb25zID0gW107CgokcHJlc2VudFBhY2thZ2VNYXAgPSBbXTsKJHJlbW92ZU1hcCA9IFtdOwokcHJlc2VudEFsaWFzTWFwID0gW107CiRyZW1vdmVBbGlhc01hcCA9IFtdOwpmb3JlYWNoICgkdGhpcy0+cHJlc2VudFBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokcHJlc2VudEFsaWFzTWFwWyRwYWNrYWdlLT5nZXROYW1lKCkuJzo6Jy4kcGFja2FnZS0+Z2V0VmVyc2lvbigpXSA9ICRwYWNrYWdlOwokcmVtb3ZlQWxpYXNNYXBbJHBhY2thZ2UtPmdldE5hbWUoKS4nOjonLiRwYWNrYWdlLT5nZXRWZXJzaW9uKCldID0gJHBhY2thZ2U7Cn0gZWxzZSB7CiRwcmVzZW50UGFja2FnZU1hcFskcGFja2FnZS0+Z2V0TmFtZSgpXSA9ICRwYWNrYWdlOwokcmVtb3ZlTWFwWyRwYWNrYWdlLT5nZXROYW1lKCldID0gJHBhY2thZ2U7Cn0KfQoKJHN0YWNrID0gJHRoaXMtPmdldFJvb3RQYWNrYWdlcygpOwoKJHZpc2l0ZWQgPSBbXTsKJHByb2Nlc3NlZCA9IFtdOwoKd2hpbGUgKFxjb3VudCgkc3RhY2spID4gMCkgewokcGFja2FnZSA9IGFycmF5X3BvcCgkc3RhY2spOwoKaWYgKGlzc2V0KCRwcm9jZXNzZWRbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0pKSB7CmNvbnRpbnVlOwp9CgppZiAoIWlzc2V0KCR2aXNpdGVkW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldKSkgewokdmlzaXRlZFtzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSA9IHRydWU7Cgokc3RhY2tbXSA9ICRwYWNrYWdlOwppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJHN0YWNrW10gPSAkcGFja2FnZS0+Z2V0QWxpYXNPZigpOwp9IGVsc2Ugewpmb3JlYWNoICgkcGFja2FnZS0+Z2V0UmVxdWlyZXMoKSBhcyAkbGluaykgewokcG9zc2libGVSZXF1aXJlcyA9ICR0aGlzLT5nZXRQcm92aWRlcnNJblJlc3VsdCgkbGluayk7Cgpmb3JlYWNoICgkcG9zc2libGVSZXF1aXJlcyBhcyAkcmVxdWlyZSkgewokc3RhY2tbXSA9ICRyZXF1aXJlOwp9Cn0KfQp9IGVsc2VpZiAoIWlzc2V0KCRwcm9jZXNzZWRbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0pKSB7CiRwcm9jZXNzZWRbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0gPSB0cnVlOwoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiRhbGlhc0tleSA9ICRwYWNrYWdlLT5nZXROYW1lKCkuJzo6Jy4kcGFja2FnZS0+Z2V0VmVyc2lvbigpOwppZiAoaXNzZXQoJHByZXNlbnRBbGlhc01hcFskYWxpYXNLZXldKSkgewp1bnNldCgkcmVtb3ZlQWxpYXNNYXBbJGFsaWFzS2V5XSk7Cn0gZWxzZSB7CiRvcGVyYXRpb25zW10gPSBuZXcgT3BlcmF0aW9uXE1hcmtBbGlhc0luc3RhbGxlZE9wZXJhdGlvbigkcGFja2FnZSk7Cn0KfSBlbHNlIHsKaWYgKGlzc2V0KCRwcmVzZW50UGFja2FnZU1hcFskcGFja2FnZS0+Z2V0TmFtZSgpXSkpIHsKJHNvdXJjZSA9ICRwcmVzZW50UGFja2FnZU1hcFskcGFja2FnZS0+Z2V0TmFtZSgpXTsKCgoKaWYgKCRwYWNrYWdlLT5nZXRWZXJzaW9uKCkgIT09ICRwcmVzZW50UGFja2FnZU1hcFskcGFja2FnZS0+Z2V0TmFtZSgpXS0+Z2V0VmVyc2lvbigpIHx8CiRwYWNrYWdlLT5nZXREaXN0UmVmZXJlbmNlKCkgIT09ICRwcmVzZW50UGFja2FnZU1hcFskcGFja2FnZS0+Z2V0TmFtZSgpXS0+Z2V0RGlzdFJlZmVyZW5jZSgpIHx8CiRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKSAhPT0gJHByZXNlbnRQYWNrYWdlTWFwWyRwYWNrYWdlLT5nZXROYW1lKCldLT5nZXRTb3VyY2VSZWZlcmVuY2UoKSB8fAooCiRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlCiYmICRwcmVzZW50UGFja2FnZU1hcFskcGFja2FnZS0+Z2V0TmFtZSgpXSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZQomJiAoCiRwYWNrYWdlLT5pc0FiYW5kb25lZCgpICE9PSAkcHJlc2VudFBhY2thZ2VNYXBbJHBhY2thZ2UtPmdldE5hbWUoKV0tPmlzQWJhbmRvbmVkKCkKfHwgJHBhY2thZ2UtPmdldFJlcGxhY2VtZW50UGFja2FnZSgpICE9PSAkcHJlc2VudFBhY2thZ2VNYXBbJHBhY2thZ2UtPmdldE5hbWUoKV0tPmdldFJlcGxhY2VtZW50UGFja2FnZSgpCikKKQopIHsKJG9wZXJhdGlvbnNbXSA9IG5ldyBPcGVyYXRpb25cVXBkYXRlT3BlcmF0aW9uKCRzb3VyY2UsICRwYWNrYWdlKTsKfQp1bnNldCgkcmVtb3ZlTWFwWyRwYWNrYWdlLT5nZXROYW1lKCldKTsKfSBlbHNlIHsKJG9wZXJhdGlvbnNbXSA9IG5ldyBPcGVyYXRpb25cSW5zdGFsbE9wZXJhdGlvbigkcGFja2FnZSk7CnVuc2V0KCRyZW1vdmVNYXBbJHBhY2thZ2UtPmdldE5hbWUoKV0pOwp9Cn0KfQp9Cgpmb3JlYWNoICgkcmVtb3ZlTWFwIGFzICRuYW1lID0+ICRwYWNrYWdlKSB7CmFycmF5X3Vuc2hpZnQoJG9wZXJhdGlvbnMsIG5ldyBPcGVyYXRpb25cVW5pbnN0YWxsT3BlcmF0aW9uKCRwYWNrYWdlKSk7Cn0KZm9yZWFjaCAoJHJlbW92ZUFsaWFzTWFwIGFzICRuYW1lVmVyc2lvbiA9PiAkcGFja2FnZSkgewokb3BlcmF0aW9uc1tdID0gbmV3IE9wZXJhdGlvblxNYXJrQWxpYXNVbmluc3RhbGxlZE9wZXJhdGlvbigkcGFja2FnZSk7Cn0KCiRvcGVyYXRpb25zID0gJHRoaXMtPm1vdmVQbHVnaW5zVG9Gcm9udCgkb3BlcmF0aW9ucyk7CgoKJG9wZXJhdGlvbnMgPSAkdGhpcy0+bW92ZVVuaW5zdGFsbHNUb0Zyb250KCRvcGVyYXRpb25zKTsKCgoKCgoKCgoKCgoKCgoKCgoKCnJldHVybiAkdGhpcy0+b3BlcmF0aW9ucyA9ICRvcGVyYXRpb25zOwp9CgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRSb290UGFja2FnZXMoKTogYXJyYXkKewokcm9vdHMgPSAkdGhpcy0+cmVzdWx0UGFja2FnZU1hcDsKCmZvcmVhY2ggKCR0aGlzLT5yZXN1bHRQYWNrYWdlTWFwIGFzICRwYWNrYWdlSGFzaCA9PiAkcGFja2FnZSkgewppZiAoIWlzc2V0KCRyb290c1skcGFja2FnZUhhc2hdKSkgewpjb250aW51ZTsKfQoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcXVpcmVzKCkgYXMgJGxpbmspIHsKJHBvc3NpYmxlUmVxdWlyZXMgPSAkdGhpcy0+Z2V0UHJvdmlkZXJzSW5SZXN1bHQoJGxpbmspOwoKZm9yZWFjaCAoJHBvc3NpYmxlUmVxdWlyZXMgYXMgJHJlcXVpcmUpIHsKaWYgKCRyZXF1aXJlICE9PSAkcGFja2FnZSkgewp1bnNldCgkcm9vdHNbc3BsX29iamVjdF9oYXNoKCRyZXF1aXJlKV0pOwp9Cn0KfQp9CgpyZXR1cm4gJHJvb3RzOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UHJvdmlkZXJzSW5SZXN1bHQoTGluayAkbGluayk6IGFycmF5CnsKaWYgKCFpc3NldCgkdGhpcy0+cmVzdWx0UGFja2FnZXNCeU5hbWVbJGxpbmstPmdldFRhcmdldCgpXSkpIHsKcmV0dXJuIFtdOwp9CgpyZXR1cm4gJHRoaXMtPnJlc3VsdFBhY2thZ2VzQnlOYW1lWyRsaW5rLT5nZXRUYXJnZXQoKV07Cn0KCgoKCgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIG1vdmVQbHVnaW5zVG9Gcm9udChhcnJheSAkb3BlcmF0aW9ucyk6IGFycmF5CnsKJGRsTW9kaWZ5aW5nUGx1Z2luc05vRGVwcyA9IFtdOwokZGxNb2RpZnlpbmdQbHVnaW5zV2l0aERlcHMgPSBbXTsKJGRsTW9kaWZ5aW5nUGx1Z2luUmVxdWlyZXMgPSBbXTsKJHBsdWdpbnNOb0RlcHMgPSBbXTsKJHBsdWdpbnNXaXRoRGVwcyA9IFtdOwokcGx1Z2luUmVxdWlyZXMgPSBbXTsKCmZvcmVhY2ggKGFycmF5X3JldmVyc2UoJG9wZXJhdGlvbnMsIHRydWUpIGFzICRpZHggPT4gJG9wKSB7CmlmICgkb3AgaW5zdGFuY2VvZiBPcGVyYXRpb25cSW5zdGFsbE9wZXJhdGlvbikgewokcGFja2FnZSA9ICRvcC0+Z2V0UGFja2FnZSgpOwp9IGVsc2VpZiAoJG9wIGluc3RhbmNlb2YgT3BlcmF0aW9uXFVwZGF0ZU9wZXJhdGlvbikgewokcGFja2FnZSA9ICRvcC0+Z2V0VGFyZ2V0UGFja2FnZSgpOwp9IGVsc2Ugewpjb250aW51ZTsKfQoKJGV4dHJhID0gJHBhY2thZ2UtPmdldEV4dHJhKCk7CiRpc0Rvd25sb2Fkc01vZGlmeWluZ1BsdWdpbiA9ICRwYWNrYWdlLT5nZXRUeXBlKCkgPT09ICdjb21wb3Nlci1wbHVnaW4nICYmIGlzc2V0KCRleHRyYVsncGx1Z2luLW1vZGlmaWVzLWRvd25sb2FkcyddKSAmJiAkZXh0cmFbJ3BsdWdpbi1tb2RpZmllcy1kb3dubG9hZHMnXSA9PT0gdHJ1ZTsKCgppZiAoJGlzRG93bmxvYWRzTW9kaWZ5aW5nUGx1Z2luIHx8IFxjb3VudChhcnJheV9pbnRlcnNlY3QoJHBhY2thZ2UtPmdldE5hbWVzKCksICRkbE1vZGlmeWluZ1BsdWdpblJlcXVpcmVzKSkgPiAwKSB7CgokcmVxdWlyZXMgPSBhcnJheV9maWx0ZXIoYXJyYXlfa2V5cygkcGFja2FnZS0+Z2V0UmVxdWlyZXMoKSksIHN0YXRpYyBmdW5jdGlvbiAoJHJlcSk6IGJvb2wgewpyZXR1cm4gIVBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJHJlcSk7Cn0pOwoKCmlmICgkaXNEb3dubG9hZHNNb2RpZnlpbmdQbHVnaW4gJiYgMCA9PT0gXGNvdW50KCRyZXF1aXJlcykpIHsKCmFycmF5X3Vuc2hpZnQoJGRsTW9kaWZ5aW5nUGx1Z2luc05vRGVwcywgJG9wKTsKfSBlbHNlIHsKCiRkbE1vZGlmeWluZ1BsdWdpblJlcXVpcmVzID0gYXJyYXlfbWVyZ2UoJGRsTW9kaWZ5aW5nUGx1Z2luUmVxdWlyZXMsICRyZXF1aXJlcyk7CgphcnJheV91bnNoaWZ0KCRkbE1vZGlmeWluZ1BsdWdpbnNXaXRoRGVwcywgJG9wKTsKfQoKdW5zZXQoJG9wZXJhdGlvbnNbJGlkeF0pOwpjb250aW51ZTsKfQoKCiRpc1BsdWdpbiA9ICRwYWNrYWdlLT5nZXRUeXBlKCkgPT09ICdjb21wb3Nlci1wbHVnaW4nIHx8ICRwYWNrYWdlLT5nZXRUeXBlKCkgPT09ICdjb21wb3Nlci1pbnN0YWxsZXInOwoKCmlmICgkaXNQbHVnaW4gfHwgXGNvdW50KGFycmF5X2ludGVyc2VjdCgkcGFja2FnZS0+Z2V0TmFtZXMoKSwgJHBsdWdpblJlcXVpcmVzKSkgPiAwKSB7CgokcmVxdWlyZXMgPSBhcnJheV9maWx0ZXIoYXJyYXlfa2V5cygkcGFja2FnZS0+Z2V0UmVxdWlyZXMoKSksIHN0YXRpYyBmdW5jdGlvbiAoJHJlcSk6IGJvb2wgewpyZXR1cm4gIVBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJHJlcSk7Cn0pOwoKCmlmICgkaXNQbHVnaW4gJiYgMCA9PT0gXGNvdW50KCRyZXF1aXJlcykpIHsKCmFycmF5X3Vuc2hpZnQoJHBsdWdpbnNOb0RlcHMsICRvcCk7Cn0gZWxzZSB7CgokcGx1Z2luUmVxdWlyZXMgPSBhcnJheV9tZXJnZSgkcGx1Z2luUmVxdWlyZXMsICRyZXF1aXJlcyk7CgphcnJheV91bnNoaWZ0KCRwbHVnaW5zV2l0aERlcHMsICRvcCk7Cn0KCnVuc2V0KCRvcGVyYXRpb25zWyRpZHhdKTsKfQp9CgpyZXR1cm4gYXJyYXlfbWVyZ2UoJGRsTW9kaWZ5aW5nUGx1Z2luc05vRGVwcywgJGRsTW9kaWZ5aW5nUGx1Z2luc1dpdGhEZXBzLCAkcGx1Z2luc05vRGVwcywgJHBsdWdpbnNXaXRoRGVwcywgJG9wZXJhdGlvbnMpOwp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBtb3ZlVW5pbnN0YWxsc1RvRnJvbnQoYXJyYXkgJG9wZXJhdGlvbnMpOiBhcnJheQp7CiR1bmluc3RPcHMgPSBbXTsKZm9yZWFjaCAoJG9wZXJhdGlvbnMgYXMgJGlkeCA9PiAkb3ApIHsKaWYgKCRvcCBpbnN0YW5jZW9mIE9wZXJhdGlvblxVbmluc3RhbGxPcGVyYXRpb24gfHwgJG9wIGluc3RhbmNlb2YgT3BlcmF0aW9uXE1hcmtBbGlhc1VuaW5zdGFsbGVkT3BlcmF0aW9uKSB7CiR1bmluc3RPcHNbXSA9ICRvcDsKdW5zZXQoJG9wZXJhdGlvbnNbJGlkeF0pOwp9Cn0KCnJldHVybiBhcnJheV9tZXJnZSgkdW5pbnN0T3BzLCAkb3BlcmF0aW9ucyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEZpbmRlcjsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cSW5zdGFsbE9wZXJhdGlvbjsKCgoKCgoKCgphYnN0cmFjdCBjbGFzcyBBcmNoaXZlRG93bmxvYWRlciBleHRlbmRzIEZpbGVEb3dubG9hZGVyCnsKCgoKcHJvdGVjdGVkICRjbGVhbnVwRXhlY3V0ZWQgPSBbXTsKCnB1YmxpYyBmdW5jdGlvbiBwcmVwYXJlKHN0cmluZyAkdHlwZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CnVuc2V0KCR0aGlzLT5jbGVhbnVwRXhlY3V0ZWRbJHBhY2thZ2UtPmdldE5hbWUoKV0pOwoKcmV0dXJuIHBhcmVudDo6cHJlcGFyZSgkdHlwZSwgJHBhY2thZ2UsICRwYXRoLCAkcHJldlBhY2thZ2UpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2xlYW51cChzdHJpbmcgJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewokdGhpcy0+Y2xlYW51cEV4ZWN1dGVkWyRwYWNrYWdlLT5nZXROYW1lKCldID0gdHJ1ZTsKCnJldHVybiBwYXJlbnQ6OmNsZWFudXAoJHR5cGUsICRwYWNrYWdlLCAkcGF0aCwgJHByZXZQYWNrYWdlKTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGluc3RhbGwoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBib29sICRvdXRwdXQgPSB0cnVlKTogUHJvbWlzZUludGVyZmFjZQp7CmlmICgkb3V0cHV0KSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiICAtICIgLiBJbnN0YWxsT3BlcmF0aW9uOjpmb3JtYXQoJHBhY2thZ2UpIC4gJHRoaXMtPmdldEluc3RhbGxPcGVyYXRpb25BcHBlbmRpeCgkcGFja2FnZSwgJHBhdGgpKTsKfQoKJHZlbmRvckRpciA9ICR0aGlzLT5jb25maWctPmdldCgndmVuZG9yLWRpcicpOwoKCgoKaWYgKGZhbHNlID09PSBzdHJwb3MoJHRoaXMtPmZpbGVzeXN0ZW0tPm5vcm1hbGl6ZVBhdGgoJHZlbmRvckRpciksICR0aGlzLT5maWxlc3lzdGVtLT5ub3JtYWxpemVQYXRoKCRwYXRoLkRJUkVDVE9SWV9TRVBBUkFUT1IpKSkgewokdGhpcy0+ZmlsZXN5c3RlbS0+ZW1wdHlEaXJlY3RvcnkoJHBhdGgpOwp9CgpkbyB7CiR0ZW1wb3JhcnlEaXIgPSAkdmVuZG9yRGlyLicvY29tcG9zZXIvJy5iaW4yaGV4KHJhbmRvbV9ieXRlcyg0KSk7Cn0gd2hpbGUgKGlzX2RpcigkdGVtcG9yYXJ5RGlyKSk7CgokdGhpcy0+YWRkQ2xlYW51cFBhdGgoJHBhY2thZ2UsICR0ZW1wb3JhcnlEaXIpOwoKCmlmICghaXNfZGlyKCRwYXRoKSB8fCByZWFscGF0aCgkcGF0aCkgIT09IFBsYXRmb3JtOjpnZXRDd2QoKSkgewokdGhpcy0+YWRkQ2xlYW51cFBhdGgoJHBhY2thZ2UsICRwYXRoKTsKfQoKJHRoaXMtPmZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkdGVtcG9yYXJ5RGlyKTsKJGZpbGVOYW1lID0gJHRoaXMtPmdldEZpbGVOYW1lKCRwYWNrYWdlLCAkcGF0aCk7CgokZmlsZXN5c3RlbSA9ICR0aGlzLT5maWxlc3lzdGVtOwoKJGNsZWFudXAgPSBmdW5jdGlvbiAoKSB1c2UgKCRwYXRoLCAkZmlsZXN5c3RlbSwgJHRlbXBvcmFyeURpciwgJHBhY2thZ2UpIHsKCiR0aGlzLT5jbGVhckxhc3RDYWNoZVdyaXRlKCRwYWNrYWdlKTsKCgokZmlsZXN5c3RlbS0+cmVtb3ZlRGlyZWN0b3J5KCR0ZW1wb3JhcnlEaXIpOwppZiAoaXNfZGlyKCRwYXRoKSAmJiByZWFscGF0aCgkcGF0aCkgIT09IFBsYXRmb3JtOjpnZXRDd2QoKSkgewokZmlsZXN5c3RlbS0+cmVtb3ZlRGlyZWN0b3J5KCRwYXRoKTsKfQokdGhpcy0+cmVtb3ZlQ2xlYW51cFBhdGgoJHBhY2thZ2UsICR0ZW1wb3JhcnlEaXIpOwokcmVhbHBhdGggPSByZWFscGF0aCgkcGF0aCk7CmlmICgkcmVhbHBhdGggIT09IGZhbHNlKSB7CiR0aGlzLT5yZW1vdmVDbGVhbnVwUGF0aCgkcGFja2FnZSwgJHJlYWxwYXRoKTsKfQp9OwoKdHJ5IHsKJHByb21pc2UgPSAkdGhpcy0+ZXh0cmFjdCgkcGFja2FnZSwgJGZpbGVOYW1lLCAkdGVtcG9yYXJ5RGlyKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewokY2xlYW51cCgpOwp0aHJvdyAkZTsKfQoKcmV0dXJuICRwcm9taXNlLT50aGVuKGZ1bmN0aW9uICgpIHVzZSAoJHBhY2thZ2UsICRmaWxlc3lzdGVtLCAkZmlsZU5hbWUsICR0ZW1wb3JhcnlEaXIsICRwYXRoKTogUHJvbWlzZUludGVyZmFjZSB7CmlmIChmaWxlX2V4aXN0cygkZmlsZU5hbWUpKSB7CiRmaWxlc3lzdGVtLT51bmxpbmsoJGZpbGVOYW1lKTsKfQoKCgoKCgoKJGdldEZvbGRlckNvbnRlbnQgPSBzdGF0aWMgZnVuY3Rpb24gKCRkaXIpOiBhcnJheSB7CiRmaW5kZXIgPSBGaW5kZXI6OmNyZWF0ZSgpCi0+aWdub3JlVkNTKGZhbHNlKQotPmlnbm9yZURvdEZpbGVzKGZhbHNlKQotPm5vdE5hbWUoJy5EU19TdG9yZScpCi0+ZGVwdGgoMCkKLT5pbigkZGlyKTsKCnJldHVybiBpdGVyYXRvcl90b19hcnJheSgkZmluZGVyKTsKfTsKJHJlbmFtZVJlY3Vyc2l2ZWx5ID0gbnVsbDsKCgoKCgoKCgoKCgokcmVuYW1lUmVjdXJzaXZlbHkgPSBzdGF0aWMgZnVuY3Rpb24gKCRmcm9tLCAkdG8pIHVzZSAoJGZpbGVzeXN0ZW0sICRnZXRGb2xkZXJDb250ZW50LCAkcGFja2FnZSwgJiRyZW5hbWVSZWN1cnNpdmVseSkgewokY29udGVudERpciA9ICRnZXRGb2xkZXJDb250ZW50KCRmcm9tKTsKCgpmb3JlYWNoICgkY29udGVudERpciBhcyAkZmlsZSkgewokZmlsZSA9IChzdHJpbmcpICRmaWxlOwppZiAoaXNfZGlyKCR0byAuICcvJyAuIGJhc2VuYW1lKCRmaWxlKSkpIHsKaWYgKCFpc19kaXIoJGZpbGUpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignSW5zdGFsbGluZyAnLiRwYWNrYWdlLicgd291bGQgbGVhZCB0byBvdmVyd3JpdGluZyB0aGUgJy4kdG8uJy8nLmJhc2VuYW1lKCRmaWxlKS4nIGRpcmVjdG9yeSB3aXRoIGEgZmlsZSBmcm9tIHRoZSBwYWNrYWdlLCBpbnZhbGlkIG9wZXJhdGlvbi4nKTsKfQokcmVuYW1lUmVjdXJzaXZlbHkoJGZpbGUsICR0byAuICcvJyAuIGJhc2VuYW1lKCRmaWxlKSk7Cn0gZWxzZSB7CiRmaWxlc3lzdGVtLT5yZW5hbWUoJGZpbGUsICR0byAuICcvJyAuIGJhc2VuYW1lKCRmaWxlKSk7Cn0KfQp9OwoKJHJlbmFtZUFzT25lID0gZmFsc2U7CmlmICghZmlsZV9leGlzdHMoJHBhdGgpKSB7CiRyZW5hbWVBc09uZSA9IHRydWU7Cn0gZWxzZWlmICgkZmlsZXN5c3RlbS0+aXNEaXJFbXB0eSgkcGF0aCkpIHsKdHJ5IHsKaWYgKCRmaWxlc3lzdGVtLT5yZW1vdmVEaXJlY3RvcnlQaHAoJHBhdGgpKSB7CiRyZW5hbWVBc09uZSA9IHRydWU7Cn0KfSBjYXRjaCAoXFJ1bnRpbWVFeGNlcHRpb24gJGUpIHsKCn0KfQoKJGNvbnRlbnREaXIgPSAkZ2V0Rm9sZGVyQ29udGVudCgkdGVtcG9yYXJ5RGlyKTsKJHNpbmdsZURpckF0VG9wTGV2ZWwgPSAxID09PSBjb3VudCgkY29udGVudERpcikgJiYgaXNfZGlyKChzdHJpbmcpIHJlc2V0KCRjb250ZW50RGlyKSk7CgppZiAoJHJlbmFtZUFzT25lKSB7CgppZiAoJHNpbmdsZURpckF0VG9wTGV2ZWwpIHsKJGV4dHJhY3RlZERpciA9IChzdHJpbmcpIHJlc2V0KCRjb250ZW50RGlyKTsKfSBlbHNlIHsKJGV4dHJhY3RlZERpciA9ICR0ZW1wb3JhcnlEaXI7Cn0KJGZpbGVzeXN0ZW0tPnJlbmFtZSgkZXh0cmFjdGVkRGlyLCAkcGF0aCk7Cn0gZWxzZSB7CgokZnJvbSA9ICR0ZW1wb3JhcnlEaXI7CmlmICgkc2luZ2xlRGlyQXRUb3BMZXZlbCkgewokZnJvbSA9IChzdHJpbmcpIHJlc2V0KCRjb250ZW50RGlyKTsKfQoKJHJlbmFtZVJlY3Vyc2l2ZWx5KCRmcm9tLCAkcGF0aCk7Cn0KCiRwcm9taXNlID0gJGZpbGVzeXN0ZW0tPnJlbW92ZURpcmVjdG9yeUFzeW5jKCR0ZW1wb3JhcnlEaXIpOwoKcmV0dXJuICRwcm9taXNlLT50aGVuKGZ1bmN0aW9uICgpIHVzZSAoJHBhY2thZ2UsICRwYXRoLCAkdGVtcG9yYXJ5RGlyKSB7CiR0aGlzLT5yZW1vdmVDbGVhbnVwUGF0aCgkcGFja2FnZSwgJHRlbXBvcmFyeURpcik7CiR0aGlzLT5yZW1vdmVDbGVhbnVwUGF0aCgkcGFja2FnZSwgJHBhdGgpOwp9KTsKfSwgc3RhdGljIGZ1bmN0aW9uICgkZSkgdXNlICgkY2xlYW51cCkgewokY2xlYW51cCgpOwoKdGhyb3cgJGU7Cn0pOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0SW5zdGFsbE9wZXJhdGlvbkFwcGVuZGl4KFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CnJldHVybiAnOiBFeHRyYWN0aW5nIGFyY2hpdmUnOwp9CgoKCgoKCgoKCgphYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gZXh0cmFjdChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJGZpbGUsIHN0cmluZyAkcGF0aCk6IFByb21pc2VJbnRlcmZhY2U7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwoKCgoKCgppbnRlcmZhY2UgQ2hhbmdlUmVwb3J0SW50ZXJmYWNlCnsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMb2NhbENoYW5nZXMoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKTogP3N0cmluZzsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXEV4Y2VwdGlvblxJcnJlY292ZXJhYmxlRG93bmxvYWRFeGNlcHRpb247CnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CgoKCgoKCmNsYXNzIERvd25sb2FkTWFuYWdlcgp7Cgpwcml2YXRlICRpbzsKCnByaXZhdGUgJHByZWZlckRpc3QgPSBmYWxzZTsKCnByaXZhdGUgJHByZWZlclNvdXJjZTsKCnByaXZhdGUgJHBhY2thZ2VQcmVmZXJlbmNlcyA9IFtdOwoKcHJpdmF0ZSAkZmlsZXN5c3RlbTsKCnByaXZhdGUgJGRvd25sb2FkZXJzID0gW107CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgYm9vbCAkcHJlZmVyU291cmNlID0gZmFsc2UsID9GaWxlc3lzdGVtICRmaWxlc3lzdGVtID0gbnVsbCkKewokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5wcmVmZXJTb3VyY2UgPSAkcHJlZmVyU291cmNlOwokdGhpcy0+ZmlsZXN5c3RlbSA9ICRmaWxlc3lzdGVtID86IG5ldyBGaWxlc3lzdGVtKCk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByZWZlclNvdXJjZShib29sICRwcmVmZXJTb3VyY2UpOiBzZWxmCnsKJHRoaXMtPnByZWZlclNvdXJjZSA9ICRwcmVmZXJTb3VyY2U7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByZWZlckRpc3QoYm9vbCAkcHJlZmVyRGlzdCk6IHNlbGYKewokdGhpcy0+cHJlZmVyRGlzdCA9ICRwcmVmZXJEaXN0OwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQcmVmZXJlbmNlcyhhcnJheSAkcHJlZmVyZW5jZXMpOiBzZWxmCnsKJHRoaXMtPnBhY2thZ2VQcmVmZXJlbmNlcyA9ICRwcmVmZXJlbmNlczsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERvd25sb2FkZXIoc3RyaW5nICR0eXBlLCBEb3dubG9hZGVySW50ZXJmYWNlICRkb3dubG9hZGVyKTogc2VsZgp7CiR0eXBlID0gc3RydG9sb3dlcigkdHlwZSk7CiR0aGlzLT5kb3dubG9hZGVyc1skdHlwZV0gPSAkZG93bmxvYWRlcjsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERvd25sb2FkZXIoc3RyaW5nICR0eXBlKTogRG93bmxvYWRlckludGVyZmFjZQp7CiR0eXBlID0gc3RydG9sb3dlcigkdHlwZSk7CmlmICghaXNzZXQoJHRoaXMtPmRvd25sb2FkZXJzWyR0eXBlXSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVW5rbm93biBkb3dubG9hZGVyIHR5cGU6ICVzLiBBdmFpbGFibGUgdHlwZXM6ICVzLicsICR0eXBlLCBpbXBsb2RlKCcsICcsIGFycmF5X2tleXMoJHRoaXMtPmRvd25sb2FkZXJzKSkpKTsKfQoKcmV0dXJuICR0aGlzLT5kb3dubG9hZGVyc1skdHlwZV07Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERvd25sb2FkZXJGb3JQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiA/RG93bmxvYWRlckludGVyZmFjZQp7CiRpbnN0YWxsYXRpb25Tb3VyY2UgPSAkcGFja2FnZS0+Z2V0SW5zdGFsbGF0aW9uU291cmNlKCk7CgppZiAoJ21ldGFwYWNrYWdlJyA9PT0gJHBhY2thZ2UtPmdldFR5cGUoKSkgewpyZXR1cm4gbnVsbDsKfQoKaWYgKCdkaXN0JyA9PT0gJGluc3RhbGxhdGlvblNvdXJjZSkgewokZG93bmxvYWRlciA9ICR0aGlzLT5nZXREb3dubG9hZGVyKCRwYWNrYWdlLT5nZXREaXN0VHlwZSgpKTsKfSBlbHNlaWYgKCdzb3VyY2UnID09PSAkaW5zdGFsbGF0aW9uU291cmNlKSB7CiRkb3dubG9hZGVyID0gJHRoaXMtPmdldERvd25sb2FkZXIoJHBhY2thZ2UtPmdldFNvdXJjZVR5cGUoKSk7Cn0gZWxzZSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKAonUGFja2FnZSAnLiRwYWNrYWdlLicgZG9lcyBub3QgaGF2ZSBhbiBpbnN0YWxsYXRpb24gc291cmNlIHNldCcKKTsKfQoKaWYgKCRpbnN0YWxsYXRpb25Tb3VyY2UgIT09ICRkb3dubG9hZGVyLT5nZXRJbnN0YWxsYXRpb25Tb3VyY2UoKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKHNwcmludGYoCidEb3dubG9hZGVyICIlcyIgaXMgYSAlcyB0eXBlIGRvd25sb2FkZXIgYW5kIGNhbiBub3QgYmUgdXNlZCB0byBkb3dubG9hZCAlcyBmb3IgcGFja2FnZSAlcycsCmdldF9jbGFzcygkZG93bmxvYWRlciksCiRkb3dubG9hZGVyLT5nZXRJbnN0YWxsYXRpb25Tb3VyY2UoKSwKJGluc3RhbGxhdGlvblNvdXJjZSwKJHBhY2thZ2UKKSk7Cn0KCnJldHVybiAkZG93bmxvYWRlcjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldERvd25sb2FkZXJUeXBlKERvd25sb2FkZXJJbnRlcmZhY2UgJGRvd25sb2FkZXIpOiBzdHJpbmcKewpyZXR1cm4gYXJyYXlfc2VhcmNoKCRkb3dubG9hZGVyLCAkdGhpcy0+ZG93bmxvYWRlcnMpOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkb3dubG9hZChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHRhcmdldERpciwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewokdGFyZ2V0RGlyID0gJHRoaXMtPm5vcm1hbGl6ZVRhcmdldERpcigkdGFyZ2V0RGlyKTsKJHRoaXMtPmZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cyhkaXJuYW1lKCR0YXJnZXREaXIpKTsKCiRzb3VyY2VzID0gJHRoaXMtPmdldEF2YWlsYWJsZVNvdXJjZXMoJHBhY2thZ2UsICRwcmV2UGFja2FnZSk7CgokaW8gPSAkdGhpcy0+aW87CgokZG93bmxvYWQgPSBmdW5jdGlvbiAoJHJldHJ5ID0gZmFsc2UpIHVzZSAoJiRzb3VyY2VzLCAkaW8sICRwYWNrYWdlLCAkdGFyZ2V0RGlyLCAmJGRvd25sb2FkLCAkcHJldlBhY2thZ2UpIHsKJHNvdXJjZSA9IGFycmF5X3NoaWZ0KCRzb3VyY2VzKTsKaWYgKCRyZXRyeSkgewokaW8tPndyaXRlRXJyb3IoJyAgICA8d2FybmluZz5Ob3cgdHJ5aW5nIHRvIGRvd25sb2FkIGZyb20gJyAuICRzb3VyY2UgLiAnPC93YXJuaW5nPicpOwp9CiRwYWNrYWdlLT5zZXRJbnN0YWxsYXRpb25Tb3VyY2UoJHNvdXJjZSk7CgokZG93bmxvYWRlciA9ICR0aGlzLT5nZXREb3dubG9hZGVyRm9yUGFja2FnZSgkcGFja2FnZSk7CmlmICghJGRvd25sb2FkZXIpIHsKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCiRoYW5kbGVFcnJvciA9IHN0YXRpYyBmdW5jdGlvbiAoJGUpIHVzZSAoJHNvdXJjZXMsICRzb3VyY2UsICRwYWNrYWdlLCAkaW8sICRkb3dubG9hZCkgewppZiAoJGUgaW5zdGFuY2VvZiBcUnVudGltZUV4Y2VwdGlvbiAmJiAhJGUgaW5zdGFuY2VvZiBJcnJlY292ZXJhYmxlRG93bmxvYWRFeGNlcHRpb24pIHsKaWYgKCEkc291cmNlcykgewp0aHJvdyAkZTsKfQoKJGlvLT53cml0ZUVycm9yKAonICAgIDx3YXJuaW5nPkZhaWxlZCB0byBkb3dubG9hZCAnLgokcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLgonIGZyb20gJyAuICRzb3VyY2UgLiAnOiAnLgokZS0+Z2V0TWVzc2FnZSgpLic8L3dhcm5pbmc+JwopOwoKcmV0dXJuICRkb3dubG9hZCh0cnVlKTsKfQoKdGhyb3cgJGU7Cn07Cgp0cnkgewokcmVzdWx0ID0gJGRvd25sb2FkZXItPmRvd25sb2FkKCRwYWNrYWdlLCAkdGFyZ2V0RGlyLCAkcHJldlBhY2thZ2UpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CnJldHVybiAkaGFuZGxlRXJyb3IoJGUpOwp9CgokcmVzID0gJHJlc3VsdC0+dGhlbihzdGF0aWMgZnVuY3Rpb24gKCRyZXMpIHsKcmV0dXJuICRyZXM7Cn0sICRoYW5kbGVFcnJvcik7CgpyZXR1cm4gJHJlczsKfTsKCnJldHVybiAkZG93bmxvYWQoKTsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHByZXBhcmUoc3RyaW5nICR0eXBlLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHRhcmdldERpciwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewokdGFyZ2V0RGlyID0gJHRoaXMtPm5vcm1hbGl6ZVRhcmdldERpcigkdGFyZ2V0RGlyKTsKJGRvd25sb2FkZXIgPSAkdGhpcy0+Z2V0RG93bmxvYWRlckZvclBhY2thZ2UoJHBhY2thZ2UpOwppZiAoJGRvd25sb2FkZXIpIHsKcmV0dXJuICRkb3dubG9hZGVyLT5wcmVwYXJlKCR0eXBlLCAkcGFja2FnZSwgJHRhcmdldERpciwgJHByZXZQYWNrYWdlKTsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5zdGFsbChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHRhcmdldERpcik6IFByb21pc2VJbnRlcmZhY2UKewokdGFyZ2V0RGlyID0gJHRoaXMtPm5vcm1hbGl6ZVRhcmdldERpcigkdGFyZ2V0RGlyKTsKJGRvd25sb2FkZXIgPSAkdGhpcy0+Z2V0RG93bmxvYWRlckZvclBhY2thZ2UoJHBhY2thZ2UpOwppZiAoJGRvd25sb2FkZXIpIHsKcmV0dXJuICRkb3dubG9hZGVyLT5pbnN0YWxsKCRwYWNrYWdlLCAkdGFyZ2V0RGlyKTsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdXBkYXRlKFBhY2thZ2VJbnRlcmZhY2UgJGluaXRpYWwsIFBhY2thZ2VJbnRlcmZhY2UgJHRhcmdldCwgc3RyaW5nICR0YXJnZXREaXIpOiBQcm9taXNlSW50ZXJmYWNlCnsKJHRhcmdldERpciA9ICR0aGlzLT5ub3JtYWxpemVUYXJnZXREaXIoJHRhcmdldERpcik7CiRkb3dubG9hZGVyID0gJHRoaXMtPmdldERvd25sb2FkZXJGb3JQYWNrYWdlKCR0YXJnZXQpOwokaW5pdGlhbERvd25sb2FkZXIgPSAkdGhpcy0+Z2V0RG93bmxvYWRlckZvclBhY2thZ2UoJGluaXRpYWwpOwoKCmlmICghJGluaXRpYWxEb3dubG9hZGVyICYmICEkZG93bmxvYWRlcikgewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCmlmICghJGRvd25sb2FkZXIpIHsKcmV0dXJuICRpbml0aWFsRG93bmxvYWRlci0+cmVtb3ZlKCRpbml0aWFsLCAkdGFyZ2V0RGlyKTsKfQoKJGluaXRpYWxUeXBlID0gJHRoaXMtPmdldERvd25sb2FkZXJUeXBlKCRpbml0aWFsRG93bmxvYWRlcik7CiR0YXJnZXRUeXBlID0gJHRoaXMtPmdldERvd25sb2FkZXJUeXBlKCRkb3dubG9hZGVyKTsKaWYgKCRpbml0aWFsVHlwZSA9PT0gJHRhcmdldFR5cGUpIHsKdHJ5IHsKcmV0dXJuICRkb3dubG9hZGVyLT51cGRhdGUoJGluaXRpYWwsICR0YXJnZXQsICR0YXJnZXREaXIpOwp9IGNhdGNoIChcUnVudGltZUV4Y2VwdGlvbiAkZSkgewppZiAoISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpKSB7CnRocm93ICRlOwp9CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPiAgICBVcGRhdGUgZmFpbGVkICgnLiRlLT5nZXRNZXNzYWdlKCkuJyk8L2Vycm9yPicpOwppZiAoISR0aGlzLT5pby0+YXNrQ29uZmlybWF0aW9uKCcgICAgV291bGQgeW91IGxpa2UgdG8gdHJ5IHJlaW5zdGFsbGluZyB0aGUgcGFja2FnZSBpbnN0ZWFkIFs8Y29tbWVudD55ZXM8L2NvbW1lbnQ+XT8gJykpIHsKdGhyb3cgJGU7Cn0KfQp9CgoKCiRwcm9taXNlID0gJGluaXRpYWxEb3dubG9hZGVyLT5yZW1vdmUoJGluaXRpYWwsICR0YXJnZXREaXIpOwoKcmV0dXJuICRwcm9taXNlLT50aGVuKGZ1bmN0aW9uICgkcmVzKSB1c2UgKCR0YXJnZXQsICR0YXJnZXREaXIpOiBQcm9taXNlSW50ZXJmYWNlIHsKcmV0dXJuICR0aGlzLT5pbnN0YWxsKCR0YXJnZXQsICR0YXJnZXREaXIpOwp9KTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmUoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICR0YXJnZXREaXIpOiBQcm9taXNlSW50ZXJmYWNlCnsKJHRhcmdldERpciA9ICR0aGlzLT5ub3JtYWxpemVUYXJnZXREaXIoJHRhcmdldERpcik7CiRkb3dubG9hZGVyID0gJHRoaXMtPmdldERvd25sb2FkZXJGb3JQYWNrYWdlKCRwYWNrYWdlKTsKaWYgKCRkb3dubG9hZGVyKSB7CnJldHVybiAkZG93bmxvYWRlci0+cmVtb3ZlKCRwYWNrYWdlLCAkdGFyZ2V0RGlyKTsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjbGVhbnVwKHN0cmluZyAkdHlwZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICR0YXJnZXREaXIsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlCnsKJHRhcmdldERpciA9ICR0aGlzLT5ub3JtYWxpemVUYXJnZXREaXIoJHRhcmdldERpcik7CiRkb3dubG9hZGVyID0gJHRoaXMtPmdldERvd25sb2FkZXJGb3JQYWNrYWdlKCRwYWNrYWdlKTsKaWYgKCRkb3dubG9hZGVyKSB7CnJldHVybiAkZG93bmxvYWRlci0+Y2xlYW51cCgkdHlwZSwgJHBhY2thZ2UsICR0YXJnZXREaXIsICRwcmV2UGFja2FnZSk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiByZXNvbHZlUGFja2FnZUluc3RhbGxQcmVmZXJlbmNlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBzdHJpbmcKewpmb3JlYWNoICgkdGhpcy0+cGFja2FnZVByZWZlcmVuY2VzIGFzICRwYXR0ZXJuID0+ICRwcmVmZXJlbmNlKSB7CiRwYXR0ZXJuID0gJ3teJy5zdHJfcmVwbGFjZSgnXFwqJywgJy4qJywgcHJlZ19xdW90ZSgkcGF0dGVybikpLickfWknOwppZiAoUHJlZzo6aXNNYXRjaCgkcGF0dGVybiwgJHBhY2thZ2UtPmdldE5hbWUoKSkpIHsKaWYgKCdkaXN0JyA9PT0gJHByZWZlcmVuY2UgfHwgKCEkcGFja2FnZS0+aXNEZXYoKSAmJiAnYXV0bycgPT09ICRwcmVmZXJlbmNlKSkgewpyZXR1cm4gJ2Rpc3QnOwp9CgpyZXR1cm4gJ3NvdXJjZSc7Cn0KfQoKcmV0dXJuICRwYWNrYWdlLT5pc0RldigpID8gJ3NvdXJjZScgOiAnZGlzdCc7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldEF2YWlsYWJsZVNvdXJjZXMoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IGFycmF5CnsKJHNvdXJjZVR5cGUgPSAkcGFja2FnZS0+Z2V0U291cmNlVHlwZSgpOwokZGlzdFR5cGUgPSAkcGFja2FnZS0+Z2V0RGlzdFR5cGUoKTsKCgokc291cmNlcyA9IFtdOwppZiAoJHNvdXJjZVR5cGUpIHsKJHNvdXJjZXNbXSA9ICdzb3VyY2UnOwp9CmlmICgkZGlzdFR5cGUpIHsKJHNvdXJjZXNbXSA9ICdkaXN0JzsKfQoKaWYgKGVtcHR5KCRzb3VyY2VzKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUGFja2FnZSAnLiRwYWNrYWdlLicgbXVzdCBoYXZlIGEgc291cmNlIG9yIGRpc3Qgc3BlY2lmaWVkJyk7Cn0KCmlmICgKJHByZXZQYWNrYWdlCgomJiBpbl9hcnJheSgkcHJldlBhY2thZ2UtPmdldEluc3RhbGxhdGlvblNvdXJjZSgpLCAkc291cmNlcywgdHJ1ZSkKCiYmICEoISRwcmV2UGFja2FnZS0+aXNEZXYoKSAmJiAkcHJldlBhY2thZ2UtPmdldEluc3RhbGxhdGlvblNvdXJjZSgpID09PSAnZGlzdCcgJiYgJHBhY2thZ2UtPmlzRGV2KCkpCikgewokcHJldlNvdXJjZSA9ICRwcmV2UGFja2FnZS0+Z2V0SW5zdGFsbGF0aW9uU291cmNlKCk7CnVzb3J0KCRzb3VyY2VzLCBzdGF0aWMgZnVuY3Rpb24gKCRhLCAkYikgdXNlICgkcHJldlNvdXJjZSk6IGludCB7CnJldHVybiAkYSA9PT0gJHByZXZTb3VyY2UgPyAtMSA6IDE7Cn0pOwoKcmV0dXJuICRzb3VyY2VzOwp9CgoKaWYgKCEkdGhpcy0+cHJlZmVyU291cmNlICYmICgkdGhpcy0+cHJlZmVyRGlzdCB8fCAnZGlzdCcgPT09ICR0aGlzLT5yZXNvbHZlUGFja2FnZUluc3RhbGxQcmVmZXJlbmNlKCRwYWNrYWdlKSkpIHsKJHNvdXJjZXMgPSBhcnJheV9yZXZlcnNlKCRzb3VyY2VzKTsKfQoKcmV0dXJuICRzb3VyY2VzOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gbm9ybWFsaXplVGFyZ2V0RGlyKHN0cmluZyAkZGlyKTogc3RyaW5nCnsKaWYgKCRkaXIgPT09ICdcXCcgfHwgJGRpciA9PT0gJy8nKSB7CnJldHVybiAkZGlyOwp9CgpyZXR1cm4gcnRyaW0oJGRpciwgJ1xcLycpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwoKCgoKCgoKaW50ZXJmYWNlIERvd25sb2FkZXJJbnRlcmZhY2UKewoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJbnN0YWxsYXRpb25Tb3VyY2UoKTogc3RyaW5nOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRvd25sb2FkKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2U7CgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwcmVwYXJlKHN0cmluZyAkdHlwZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5zdGFsbChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdXBkYXRlKFBhY2thZ2VJbnRlcmZhY2UgJGluaXRpYWwsIFBhY2thZ2VJbnRlcmZhY2UgJHRhcmdldCwgc3RyaW5nICRwYXRoKTogUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6IFByb21pc2VJbnRlcmZhY2U7CgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNsZWFudXAoc3RyaW5nICR0eXBlLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKCgoKCgoKaW50ZXJmYWNlIER2Y3NEb3dubG9hZGVySW50ZXJmYWNlCnsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVbnB1c2hlZENoYW5nZXMoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKTogP3N0cmluZzsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxDYWNoZTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSU9cTnVsbElPOwp1c2UgQ29tcG9zZXJcRXhjZXB0aW9uXElycmVjb3ZlcmFibGVEb3dubG9hZEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGFyZXJcQ29tcGFyZXI7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXFVwZGF0ZU9wZXJhdGlvbjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cSW5zdGFsbE9wZXJhdGlvbjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cVW5pbnN0YWxsT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXFBsdWdpblxQb3N0RmlsZURvd25sb2FkRXZlbnQ7CnVzZSBDb21wb3NlclxQbHVnaW5cUHJlRmlsZURvd25sb2FkRXZlbnQ7CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnREaXNwYXRjaGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwXFJlc3BvbnNlOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFV0aWxcU2lsZW5jZXI7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBEb3dubG9hZGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxVcmwgYXMgVXJsVXRpbDsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwoKCgoKCgoKCgpjbGFzcyBGaWxlRG93bmxvYWRlciBpbXBsZW1lbnRzIERvd25sb2FkZXJJbnRlcmZhY2UsIENoYW5nZVJlcG9ydEludGVyZmFjZQp7Cgpwcm90ZWN0ZWQgJGlvOwoKcHJvdGVjdGVkICRjb25maWc7Cgpwcm90ZWN0ZWQgJGh0dHBEb3dubG9hZGVyOwoKcHJvdGVjdGVkICRmaWxlc3lzdGVtOwoKcHJvdGVjdGVkICRjYWNoZTsKCnByb3RlY3RlZCAkZXZlbnREaXNwYXRjaGVyOwoKcHJvdGVjdGVkICRwcm9jZXNzOwoKCgoKCnB1YmxpYyBzdGF0aWMgJGRvd25sb2FkTWV0YWRhdGEgPSBbXTsKCgoKCgoKCgpwdWJsaWMgc3RhdGljICRyZXNwb25zZUhlYWRlcnMgPSBbXTsKCgoKCnByaXZhdGUgJGxhc3RDYWNoZVdyaXRlcyA9IFtdOwoKcHJpdmF0ZSAkYWRkaXRpb25hbENsZWFudXBQYXRocyA9IFtdOwoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBIdHRwRG93bmxvYWRlciAkaHR0cERvd25sb2FkZXIsID9FdmVudERpc3BhdGNoZXIgJGV2ZW50RGlzcGF0Y2hlciA9IG51bGwsID9DYWNoZSAkY2FjaGUgPSBudWxsLCA/RmlsZXN5c3RlbSAkZmlsZXN5c3RlbSA9IG51bGwsID9Qcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MgPSBudWxsKQp7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7CiR0aGlzLT5ldmVudERpc3BhdGNoZXIgPSAkZXZlbnREaXNwYXRjaGVyOwokdGhpcy0+aHR0cERvd25sb2FkZXIgPSAkaHR0cERvd25sb2FkZXI7CiR0aGlzLT5jYWNoZSA9ICRjYWNoZTsKJHRoaXMtPnByb2Nlc3MgPSAkcHJvY2VzcyA/PyBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7CiR0aGlzLT5maWxlc3lzdGVtID0gJGZpbGVzeXN0ZW0gPz8gbmV3IEZpbGVzeXN0ZW0oJHRoaXMtPnByb2Nlc3MpOwoKaWYgKCR0aGlzLT5jYWNoZSAhPT0gbnVsbCAmJiAkdGhpcy0+Y2FjaGUtPmdjSXNOZWNlc3NhcnkoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1J1bm5pbmcgY2FjaGUgZ2FyYmFnZSBjb2xsZWN0aW9uJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUllfVkVSQk9TRSk7CiR0aGlzLT5jYWNoZS0+Z2MoJGNvbmZpZy0+Z2V0KCdjYWNoZS1maWxlcy10dGwnKSwgJGNvbmZpZy0+Z2V0KCdjYWNoZS1maWxlcy1tYXhzaXplJykpOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJbnN0YWxsYXRpb25Tb3VyY2UoKTogc3RyaW5nCnsKcmV0dXJuICdkaXN0JzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGRvd25sb2FkKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCwgYm9vbCAkb3V0cHV0ID0gdHJ1ZSk6IFByb21pc2VJbnRlcmZhY2UKewppZiAobnVsbCA9PT0gJHBhY2thZ2UtPmdldERpc3RVcmwoKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVGhlIGdpdmVuIHBhY2thZ2UgaXMgbWlzc2luZyB1cmwgaW5mb3JtYXRpb24nKTsKfQoKJGNhY2hlS2V5R2VuZXJhdG9yID0gc3RhdGljIGZ1bmN0aW9uIChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCAka2V5KTogc3RyaW5nIHsKJGNhY2hlS2V5ID0gaGFzaCgnc2hhMScsICRrZXkpOwoKcmV0dXJuICRwYWNrYWdlLT5nZXROYW1lKCkuJy8nLiRjYWNoZUtleS4nLicuJHBhY2thZ2UtPmdldERpc3RUeXBlKCk7Cn07CgokcmV0cmllcyA9IDM7CiRkaXN0VXJscyA9ICRwYWNrYWdlLT5nZXREaXN0VXJscygpOwoKJHVybHMgPSBbXTsKZm9yZWFjaCAoJGRpc3RVcmxzIGFzICRpbmRleCA9PiAkdXJsKSB7CiRwcm9jZXNzZWRVcmwgPSAkdGhpcy0+cHJvY2Vzc1VybCgkcGFja2FnZSwgJHVybCk7CiR1cmxzWyRpbmRleF0gPSBbCidiYXNlJyA9PiAkdXJsLAoncHJvY2Vzc2VkJyA9PiAkcHJvY2Vzc2VkVXJsLAoKCgoKJ2NhY2hlS2V5JyA9PiAkY2FjaGVLZXlHZW5lcmF0b3IoJHBhY2thZ2UsICRwcm9jZXNzZWRVcmwpLApdOwp9CmFzc2VydChjb3VudCgkdXJscykgPiAwKTsKCiRmaWxlTmFtZSA9ICR0aGlzLT5nZXRGaWxlTmFtZSgkcGFja2FnZSwgJHBhdGgpOwokdGhpcy0+ZmlsZXN5c3RlbS0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKCRwYXRoKTsKJHRoaXMtPmZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cyhkaXJuYW1lKCRmaWxlTmFtZSkpOwoKJGFjY2VwdCA9IG51bGw7CiRyZWplY3QgPSBudWxsOwokZG93bmxvYWQgPSBmdW5jdGlvbiAoKSB1c2UgKCRvdXRwdXQsICRjYWNoZUtleUdlbmVyYXRvciwgJHBhY2thZ2UsICRmaWxlTmFtZSwgJiR1cmxzLCAmJGFjY2VwdCwgJiRyZWplY3QpIHsKJHVybCA9IHJlc2V0KCR1cmxzKTsKJGluZGV4ID0ga2V5KCR1cmxzKTsKCmlmICgkdGhpcy0+ZXZlbnREaXNwYXRjaGVyICE9PSBudWxsKSB7CiRwcmVGaWxlRG93bmxvYWRFdmVudCA9IG5ldyBQcmVGaWxlRG93bmxvYWRFdmVudChQbHVnaW5FdmVudHM6OlBSRV9GSUxFX0RPV05MT0FELCAkdGhpcy0+aHR0cERvd25sb2FkZXIsICR1cmxbJ3Byb2Nlc3NlZCddLCAncGFja2FnZScsICRwYWNrYWdlKTsKJHRoaXMtPmV2ZW50RGlzcGF0Y2hlci0+ZGlzcGF0Y2goJHByZUZpbGVEb3dubG9hZEV2ZW50LT5nZXROYW1lKCksICRwcmVGaWxlRG93bmxvYWRFdmVudCk7CmlmICgkcHJlRmlsZURvd25sb2FkRXZlbnQtPmdldEN1c3RvbUNhY2hlS2V5KCkgIT09IG51bGwpIHsKJHVybFsnY2FjaGVLZXknXSA9ICRjYWNoZUtleUdlbmVyYXRvcigkcGFja2FnZSwgJHByZUZpbGVEb3dubG9hZEV2ZW50LT5nZXRDdXN0b21DYWNoZUtleSgpKTsKfSBlbHNlaWYgKCRwcmVGaWxlRG93bmxvYWRFdmVudC0+Z2V0UHJvY2Vzc2VkVXJsKCkgIT09ICR1cmxbJ3Byb2Nlc3NlZCddKSB7CiR1cmxbJ2NhY2hlS2V5J10gPSAkY2FjaGVLZXlHZW5lcmF0b3IoJHBhY2thZ2UsICRwcmVGaWxlRG93bmxvYWRFdmVudC0+Z2V0UHJvY2Vzc2VkVXJsKCkpOwp9CiR1cmxbJ3Byb2Nlc3NlZCddID0gJHByZUZpbGVEb3dubG9hZEV2ZW50LT5nZXRQcm9jZXNzZWRVcmwoKTsKfQoKJHVybHNbJGluZGV4XSA9ICR1cmw7CgokY2hlY2tzdW0gPSAkcGFja2FnZS0+Z2V0RGlzdFNoYTFDaGVja3N1bSgpOwokY2FjaGVLZXkgPSAkdXJsWydjYWNoZUtleSddOwoKCmlmICgkdGhpcy0+Y2FjaGUgIT09IG51bGwgJiYgKCRjaGVja3N1bSA9PT0gbnVsbCB8fCAkY2hlY2tzdW0gPT09ICcnIHx8ICRjaGVja3N1bSA9PT0gJHRoaXMtPmNhY2hlLT5zaGExKCRjYWNoZUtleSkpICYmICR0aGlzLT5jYWNoZS0+Y29weVRvKCRjYWNoZUtleSwgJGZpbGVOYW1lKSkgewppZiAoJG91dHB1dCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiAgLSBMb2FkaW5nIDxpbmZvPiIgLiAkcGFja2FnZS0+Z2V0TmFtZSgpIC4gIjwvaW5mbz4gKDxjb21tZW50PiIgLiAkcGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKSAuICI8L2NvbW1lbnQ+KSBmcm9tIGNhY2hlIiwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUllfVkVSQk9TRSk7Cn0KCgoKaWYgKCEkdGhpcy0+Y2FjaGUtPmlzUmVhZE9ubHkoKSkgewokdGhpcy0+bGFzdENhY2hlV3JpdGVzWyRwYWNrYWdlLT5nZXROYW1lKCldID0gJGNhY2hlS2V5Owp9CiRyZXN1bHQgPSBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKCRmaWxlTmFtZSk7Cn0gZWxzZSB7CmlmICgkb3V0cHV0KSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiICAtIERvd25sb2FkaW5nIDxpbmZvPiIgLiAkcGFja2FnZS0+Z2V0TmFtZSgpIC4gIjwvaW5mbz4gKDxjb21tZW50PiIgLiAkcGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKSAuICI8L2NvbW1lbnQ+KSIpOwp9CgokcmVzdWx0ID0gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5hZGRDb3B5KCR1cmxbJ3Byb2Nlc3NlZCddLCAkZmlsZU5hbWUsICRwYWNrYWdlLT5nZXRUcmFuc3BvcnRPcHRpb25zKCkpCi0+dGhlbigkYWNjZXB0LCAkcmVqZWN0KTsKfQoKcmV0dXJuICRyZXN1bHQtPnRoZW4oZnVuY3Rpb24gKCRyZXN1bHQpIHVzZSAoJGZpbGVOYW1lLCAkY2hlY2tzdW0sICR1cmwsICRwYWNrYWdlKTogc3RyaW5nIHsKCgoKaWYgKG51bGwgPT09ICRyZXN1bHQpIHsKcmV0dXJuICRmaWxlTmFtZTsKfQoKaWYgKCFmaWxlX2V4aXN0cygkZmlsZU5hbWUpKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCR1cmxbJ2Jhc2UnXS4nIGNvdWxkIG5vdCBiZSBzYXZlZCB0byAnLiRmaWxlTmFtZS4nLCBtYWtlIHN1cmUgdGhlJwouJyBkaXJlY3RvcnkgaXMgd3JpdGFibGUgYW5kIHlvdSBoYXZlIGludGVybmV0IGNvbm5lY3Rpdml0eScpOwp9CgppZiAoJGNoZWNrc3VtICE9PSBudWxsICYmICRjaGVja3N1bSAhPT0gJycgJiYgaGFzaF9maWxlKCdzaGExJywgJGZpbGVOYW1lKSAhPT0gJGNoZWNrc3VtKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdUaGUgY2hlY2tzdW0gdmVyaWZpY2F0aW9uIG9mIHRoZSBmaWxlIGZhaWxlZCAoZG93bmxvYWRlZCBmcm9tICcuJHVybFsnYmFzZSddLicpJyk7Cn0KCmlmICgkdGhpcy0+ZXZlbnREaXNwYXRjaGVyICE9PSBudWxsKSB7CiRwb3N0RmlsZURvd25sb2FkRXZlbnQgPSBuZXcgUG9zdEZpbGVEb3dubG9hZEV2ZW50KFBsdWdpbkV2ZW50czo6UE9TVF9GSUxFX0RPV05MT0FELCAkZmlsZU5hbWUsICRjaGVja3N1bSwgJHVybFsncHJvY2Vzc2VkJ10sICdwYWNrYWdlJywgJHBhY2thZ2UpOwokdGhpcy0+ZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaCgkcG9zdEZpbGVEb3dubG9hZEV2ZW50LT5nZXROYW1lKCksICRwb3N0RmlsZURvd25sb2FkRXZlbnQpOwp9CgpyZXR1cm4gJGZpbGVOYW1lOwp9KTsKfTsKCiRhY2NlcHQgPSBmdW5jdGlvbiAoUmVzcG9uc2UgJHJlc3BvbnNlKSB1c2UgKCRwYWNrYWdlLCAkZmlsZU5hbWUsICYkdXJscyk6IHN0cmluZyB7CiR1cmwgPSByZXNldCgkdXJscyk7CiRjYWNoZUtleSA9ICR1cmxbJ2NhY2hlS2V5J107CiRmaWxlU2l6ZSA9IEBmaWxlc2l6ZSgkZmlsZU5hbWUpOwppZiAoZmFsc2UgPT09ICRmaWxlU2l6ZSkgewokZmlsZVNpemUgPSAkcmVzcG9uc2UtPmdldEhlYWRlcignQ29udGVudC1MZW5ndGgnKSA/PyAnPyc7Cn0KRmlsZURvd25sb2FkZXI6OiRkb3dubG9hZE1ldGFkYXRhWyRwYWNrYWdlLT5nZXROYW1lKCldID0gJGZpbGVTaXplOwoKaWYgKFBsYXRmb3JtOjpnZXRFbnYoJ0dJVEhVQl9BQ1RJT05TJykgIT09IGZhbHNlICYmIFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX1RFU1RTX0FSRV9SVU5OSU5HJykgPT09IGZhbHNlKSB7CkZpbGVEb3dubG9hZGVyOjokcmVzcG9uc2VIZWFkZXJzWyRwYWNrYWdlLT5nZXROYW1lKCldID0gJHJlc3BvbnNlLT5nZXRIZWFkZXJzKCk7Cn0KCmlmICgkdGhpcy0+Y2FjaGUgIT09IG51bGwgJiYgISR0aGlzLT5jYWNoZS0+aXNSZWFkT25seSgpKSB7CiR0aGlzLT5sYXN0Q2FjaGVXcml0ZXNbJHBhY2thZ2UtPmdldE5hbWUoKV0gPSAkY2FjaGVLZXk7CiR0aGlzLT5jYWNoZS0+Y29weUZyb20oJGNhY2hlS2V5LCAkZmlsZU5hbWUpOwp9CgokcmVzcG9uc2UtPmNvbGxlY3QoKTsKCnJldHVybiAkZmlsZU5hbWU7Cn07CgokcmVqZWN0ID0gZnVuY3Rpb24gKCRlKSB1c2UgKCYkdXJscywgJGRvd25sb2FkLCAkZmlsZU5hbWUsICRwYWNrYWdlLCAmJHJldHJpZXMpIHsKCmlmIChmaWxlX2V4aXN0cygkZmlsZU5hbWUpKSB7CiR0aGlzLT5maWxlc3lzdGVtLT51bmxpbmsoJGZpbGVOYW1lKTsKfQokdGhpcy0+Y2xlYXJMYXN0Q2FjaGVXcml0ZSgkcGFja2FnZSk7CgppZiAoJGUgaW5zdGFuY2VvZiBJcnJlY292ZXJhYmxlRG93bmxvYWRFeGNlcHRpb24pIHsKdGhyb3cgJGU7Cn0KCmlmICgkZSBpbnN0YW5jZW9mIE1heEZpbGVTaXplRXhjZWVkZWRFeGNlcHRpb24pIHsKdGhyb3cgJGU7Cn0KCmlmICgkZSBpbnN0YW5jZW9mIFRyYW5zcG9ydEV4Y2VwdGlvbikgewoKaWYgKDAgIT09ICRlLT5nZXRDb2RlKCkgJiYgIWluX2FycmF5KCRlLT5nZXRDb2RlKCksIFs1MDAsIDUwMiwgNTAzLCA1MDRdLCB0cnVlKSkgewokcmV0cmllcyA9IDA7Cn0KfQoKCmlmICgkZSBpbnN0YW5jZW9mIFRyYW5zcG9ydEV4Y2VwdGlvbiAmJiAkZS0+Z2V0U3RhdHVzQ29kZSgpID09PSA0OTkpIHsKJHJldHJpZXMgPSAwOwokdXJscyA9IFtdOwp9CgppZiAoJHJldHJpZXMgPiAwKSB7CnVzbGVlcCg1MDAwMDApOwokcmV0cmllcy0tOwoKcmV0dXJuICRkb3dubG9hZCgpOwp9CgphcnJheV9zaGlmdCgkdXJscyk7CmlmIChcY291bnQoJHVybHMpID4gMCkgewppZiAoJHRoaXMtPmlvLT5pc0RlYnVnKCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgRmFpbGVkIGRvd25sb2FkaW5nICcuJHBhY2thZ2UtPmdldE5hbWUoKS4nOiBbJy5nZXRfY2xhc3MoJGUpLiddICcuJGUtPmdldENvZGUoKS4nOiAnLiRlLT5nZXRNZXNzYWdlKCkpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICBUcnlpbmcgdGhlIG5leHQgVVJMIGZvciAnLiRwYWNrYWdlLT5nZXROYW1lKCkpOwp9IGVsc2UgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICBGYWlsZWQgZG93bmxvYWRpbmcgJy4kcGFja2FnZS0+Z2V0TmFtZSgpLicsIHRyeWluZyB0aGUgbmV4dCBVUkwgKCcuJGUtPmdldENvZGUoKS4nOiAnLiRlLT5nZXRNZXNzYWdlKCkuJyknKTsKfQoKJHJldHJpZXMgPSAzOwp1c2xlZXAoMTAwMDAwKTsKCnJldHVybiAkZG93bmxvYWQoKTsKfQoKdGhyb3cgJGU7Cn07CgpyZXR1cm4gJGRvd25sb2FkKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBwcmVwYXJlKHN0cmluZyAkdHlwZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYW51cChzdHJpbmcgJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewokZmlsZU5hbWUgPSAkdGhpcy0+Z2V0RmlsZU5hbWUoJHBhY2thZ2UsICRwYXRoKTsKaWYgKGZpbGVfZXhpc3RzKCRmaWxlTmFtZSkpIHsKJHRoaXMtPmZpbGVzeXN0ZW0tPnVubGluaygkZmlsZU5hbWUpOwp9CgokZGlyc1RvQ2xlYW5VcCA9IFsKJHBhdGgsCiR0aGlzLT5jb25maWctPmdldCgndmVuZG9yLWRpcicpLicvJy5leHBsb2RlKCcvJywgJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKSlbMF0sCiR0aGlzLT5jb25maWctPmdldCgndmVuZG9yLWRpcicpLicvY29tcG9zZXIvJywKJHRoaXMtPmNvbmZpZy0+Z2V0KCd2ZW5kb3ItZGlyJyksCl07CgppZiAoaXNzZXQoJHRoaXMtPmFkZGl0aW9uYWxDbGVhbnVwUGF0aHNbJHBhY2thZ2UtPmdldE5hbWUoKV0pKSB7CmZvcmVhY2ggKCR0aGlzLT5hZGRpdGlvbmFsQ2xlYW51cFBhdGhzWyRwYWNrYWdlLT5nZXROYW1lKCldIGFzICRwYXRoVG9DbGVhbikgewokdGhpcy0+ZmlsZXN5c3RlbS0+cmVtb3ZlKCRwYXRoVG9DbGVhbik7Cn0KfQoKZm9yZWFjaCAoJGRpcnNUb0NsZWFuVXAgYXMgJGRpcikgewppZiAoaXNfZGlyKCRkaXIpICYmICR0aGlzLT5maWxlc3lzdGVtLT5pc0RpckVtcHR5KCRkaXIpICYmIHJlYWxwYXRoKCRkaXIpICE9PSBQbGF0Zm9ybTo6Z2V0Q3dkKCkpIHsKJHRoaXMtPmZpbGVzeXN0ZW0tPnJlbW92ZURpcmVjdG9yeVBocCgkZGlyKTsKfQp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGluc3RhbGwoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBib29sICRvdXRwdXQgPSB0cnVlKTogUHJvbWlzZUludGVyZmFjZQp7CmlmICgkb3V0cHV0KSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiICAtICIgLiBJbnN0YWxsT3BlcmF0aW9uOjpmb3JtYXQoJHBhY2thZ2UpKTsKfQoKJHZlbmRvckRpciA9ICR0aGlzLT5jb25maWctPmdldCgndmVuZG9yLWRpcicpOwoKCgoKaWYgKGZhbHNlID09PSBzdHJwb3MoJHRoaXMtPmZpbGVzeXN0ZW0tPm5vcm1hbGl6ZVBhdGgoJHZlbmRvckRpciksICR0aGlzLT5maWxlc3lzdGVtLT5ub3JtYWxpemVQYXRoKCRwYXRoLkRJUkVDVE9SWV9TRVBBUkFUT1IpKSkgewokdGhpcy0+ZmlsZXN5c3RlbS0+ZW1wdHlEaXJlY3RvcnkoJHBhdGgpOwp9CiR0aGlzLT5maWxlc3lzdGVtLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoJHBhdGgpOwokdGhpcy0+ZmlsZXN5c3RlbS0+cmVuYW1lKCR0aGlzLT5nZXRGaWxlTmFtZSgkcGFja2FnZSwgJHBhdGgpLCAkcGF0aCAuICcvJyAuICR0aGlzLT5nZXREaXN0UGF0aCgkcGFja2FnZSwgUEFUSElORk9fQkFTRU5BTUUpKTsKCgoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldEJpbmFyaWVzKCkgYXMgJGJpbikgewppZiAoZmlsZV9leGlzdHMoJHBhdGggLiAnLycgLiAkYmluKSAmJiAhaXNfZXhlY3V0YWJsZSgkcGF0aCAuICcvJyAuICRiaW4pKSB7ClNpbGVuY2VyOjpjYWxsKCdjaG1vZCcsICRwYXRoIC4gJy8nIC4gJGJpbiwgMDc3NyAmIH51bWFzaygpKTsKfQp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldERpc3RQYXRoKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIGludCAkY29tcG9uZW50KTogc3RyaW5nCnsKcmV0dXJuIHBhdGhpbmZvKChzdHJpbmcpIHBhcnNlX3VybChzdHJ0cigoc3RyaW5nKSAkcGFja2FnZS0+Z2V0RGlzdFVybCgpLCAnXFwnLCAnLycpLCBQSFBfVVJMX1BBVEgpLCAkY29tcG9uZW50KTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNsZWFyTGFzdENhY2hlV3JpdGUoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IHZvaWQKewppZiAoJHRoaXMtPmNhY2hlICE9PSBudWxsICYmIGlzc2V0KCR0aGlzLT5sYXN0Q2FjaGVXcml0ZXNbJHBhY2thZ2UtPmdldE5hbWUoKV0pKSB7CiR0aGlzLT5jYWNoZS0+cmVtb3ZlKCR0aGlzLT5sYXN0Q2FjaGVXcml0ZXNbJHBhY2thZ2UtPmdldE5hbWUoKV0pOwp1bnNldCgkdGhpcy0+bGFzdENhY2hlV3JpdGVzWyRwYWNrYWdlLT5nZXROYW1lKCldKTsKfQp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkQ2xlYW51cFBhdGgoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKTogdm9pZAp7CiR0aGlzLT5hZGRpdGlvbmFsQ2xlYW51cFBhdGhzWyRwYWNrYWdlLT5nZXROYW1lKCldW10gPSAkcGF0aDsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIHJlbW92ZUNsZWFudXBQYXRoKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6IHZvaWQKewppZiAoaXNzZXQoJHRoaXMtPmFkZGl0aW9uYWxDbGVhbnVwUGF0aHNbJHBhY2thZ2UtPmdldE5hbWUoKV0pKSB7CiRpZHggPSBhcnJheV9zZWFyY2goJHBhdGgsICR0aGlzLT5hZGRpdGlvbmFsQ2xlYW51cFBhdGhzWyRwYWNrYWdlLT5nZXROYW1lKCldLCB0cnVlKTsKaWYgKGZhbHNlICE9PSAkaWR4KSB7CnVuc2V0KCR0aGlzLT5hZGRpdGlvbmFsQ2xlYW51cFBhdGhzWyRwYWNrYWdlLT5nZXROYW1lKCldWyRpZHhdKTsKfQp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB1cGRhdGUoUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0LCBzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlCnsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgIC0gIiAuIFVwZGF0ZU9wZXJhdGlvbjo6Zm9ybWF0KCRpbml0aWFsLCAkdGFyZ2V0KSAuICR0aGlzLT5nZXRJbnN0YWxsT3BlcmF0aW9uQXBwZW5kaXgoJHRhcmdldCwgJHBhdGgpKTsKCiRwcm9taXNlID0gJHRoaXMtPnJlbW92ZSgkaW5pdGlhbCwgJHBhdGgsIGZhbHNlKTsKCnJldHVybiAkcHJvbWlzZS0+dGhlbihmdW5jdGlvbiAoKSB1c2UgKCR0YXJnZXQsICRwYXRoKTogUHJvbWlzZUludGVyZmFjZSB7CnJldHVybiAkdGhpcy0+aW5zdGFsbCgkdGFyZ2V0LCAkcGF0aCwgZmFsc2UpOwp9KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsIGJvb2wgJG91dHB1dCA9IHRydWUpOiBQcm9taXNlSW50ZXJmYWNlCnsKaWYgKCRvdXRwdXQpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgIC0gIiAuIFVuaW5zdGFsbE9wZXJhdGlvbjo6Zm9ybWF0KCRwYWNrYWdlKSk7Cn0KJHByb21pc2UgPSAkdGhpcy0+ZmlsZXN5c3RlbS0+cmVtb3ZlRGlyZWN0b3J5QXN5bmMoJHBhdGgpOwoKcmV0dXJuICRwcm9taXNlLT50aGVuKHN0YXRpYyBmdW5jdGlvbiAoJHJlc3VsdCkgdXNlICgkcGF0aCk6IHZvaWQgewppZiAoISRyZXN1bHQpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgY29tcGxldGVseSBkZWxldGUgJy4kcGF0aC4nLCBhYm9ydGluZy4nKTsKfQp9KTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRGaWxlTmFtZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiBzdHJpbmcKewokZXh0ZW5zaW9uID0gJHRoaXMtPmdldERpc3RQYXRoKCRwYWNrYWdlLCBQQVRISU5GT19FWFRFTlNJT04pOwppZiAoJGV4dGVuc2lvbiA9PT0gJycpIHsKJGV4dGVuc2lvbiA9ICRwYWNrYWdlLT5nZXREaXN0VHlwZSgpOwp9CgpyZXR1cm4gcnRyaW0oJHRoaXMtPmNvbmZpZy0+Z2V0KCd2ZW5kb3ItZGlyJykgLiAnL2NvbXBvc2VyL3RtcC0nIC4gaGFzaCgnbWQ1JywgJHBhY2thZ2UgLiBzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpKSAuICcuJyAuICRleHRlbnNpb24sICcuJyk7Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRJbnN0YWxsT3BlcmF0aW9uQXBwZW5kaXgoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKcmV0dXJuICcnOwp9CgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwcm9jZXNzVXJsKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkdXJsKTogc3RyaW5nCnsKaWYgKCFleHRlbnNpb25fbG9hZGVkKCdvcGVuc3NsJykgJiYgMCA9PT0gc3RycG9zKCR1cmwsICdodHRwczonKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1lvdSBtdXN0IGVuYWJsZSB0aGUgb3BlbnNzbCBleHRlbnNpb24gdG8gZG93bmxvYWQgZmlsZXMgdmlhIGh0dHBzJyk7Cn0KCmlmICgkcGFja2FnZS0+Z2V0RGlzdFJlZmVyZW5jZSgpICE9PSBudWxsKSB7CiR1cmwgPSBVcmxVdGlsOjp1cGRhdGVEaXN0UmVmZXJlbmNlKCR0aGlzLT5jb25maWcsICR1cmwsICRwYWNrYWdlLT5nZXREaXN0UmVmZXJlbmNlKCkpOwp9CgpyZXR1cm4gJHVybDsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMb2NhbENoYW5nZXMoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKTogP3N0cmluZwp7CiRwcmV2SU8gPSAkdGhpcy0+aW87CgokdGhpcy0+aW8gPSBuZXcgTnVsbElPOwokdGhpcy0+aW8tPmxvYWRDb25maWd1cmF0aW9uKCR0aGlzLT5jb25maWcpOwokZSA9IG51bGw7CiRvdXRwdXQgPSAnJzsKCiR0YXJnZXREaXIgPSBGaWxlc3lzdGVtOjp0cmltVHJhaWxpbmdTbGFzaCgkcGF0aCk7CnRyeSB7CmlmIChpc19kaXIoJHRhcmdldERpci4nX2NvbXBhcmUnKSkgewokdGhpcy0+ZmlsZXN5c3RlbS0+cmVtb3ZlRGlyZWN0b3J5KCR0YXJnZXREaXIuJ19jb21wYXJlJyk7Cn0KCiRwcm9taXNlID0gJHRoaXMtPmRvd25sb2FkKCRwYWNrYWdlLCAkdGFyZ2V0RGlyLidfY29tcGFyZScsIG51bGwsIGZhbHNlKTsKJHByb21pc2UtPnRoZW4obnVsbCwgc3RhdGljIGZ1bmN0aW9uICgkZXgpIHVzZSAoJiRlKSB7CiRlID0gJGV4Owp9KTsKJHRoaXMtPmh0dHBEb3dubG9hZGVyLT53YWl0KCk7CmlmICgkZSAhPT0gbnVsbCkgewp0aHJvdyAkZTsKfQokcHJvbWlzZSA9ICR0aGlzLT5pbnN0YWxsKCRwYWNrYWdlLCAkdGFyZ2V0RGlyLidfY29tcGFyZScsIGZhbHNlKTsKJHByb21pc2UtPnRoZW4obnVsbCwgc3RhdGljIGZ1bmN0aW9uICgkZXgpIHVzZSAoJiRlKSB7CiRlID0gJGV4Owp9KTsKJHRoaXMtPnByb2Nlc3MtPndhaXQoKTsKaWYgKCRlICE9PSBudWxsKSB7CnRocm93ICRlOwp9CgokY29tcGFyZXIgPSBuZXcgQ29tcGFyZXIoKTsKJGNvbXBhcmVyLT5zZXRTb3VyY2UoJHRhcmdldERpci4nX2NvbXBhcmUnKTsKJGNvbXBhcmVyLT5zZXRVcGRhdGUoJHRhcmdldERpcik7CiRjb21wYXJlci0+ZG9Db21wYXJlKCk7CiRvdXRwdXQgPSAkY29tcGFyZXItPmdldENoYW5nZWRBc1N0cmluZyh0cnVlKTsKJHRoaXMtPmZpbGVzeXN0ZW0tPnJlbW92ZURpcmVjdG9yeSgkdGFyZ2V0RGlyLidfY29tcGFyZScpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7Cn0KCiR0aGlzLT5pbyA9ICRwcmV2SU87CgppZiAoJGUgIT09IG51bGwpIHsKaWYgKCR0aGlzLT5pby0+aXNEZWJ1ZygpKSB7CnRocm93ICRlOwp9CgpyZXR1cm4gJ0ZhaWxlZCB0byBkZXRlY3QgY2hhbmdlczogWycuZ2V0X2NsYXNzKCRlKS4nXSAnLiRlLT5nZXRNZXNzYWdlKCk7Cn0KCiRvdXRwdXQgPSB0cmltKCRvdXRwdXQpOwoKcmV0dXJuIHN0cmxlbigkb3V0cHV0KSA+IDAgPyAkb3V0cHV0IDogbnVsbDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKCgoKCgpjbGFzcyBGaWxlc3lzdGVtRXhjZXB0aW9uIGV4dGVuZHMgXEV4Y2VwdGlvbgp7CnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG1lc3NhZ2UgPSAnJywgaW50ICRjb2RlID0gMCwgP1xFeGNlcHRpb24gJHByZXZpb3VzID0gbnVsbCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCJGaWxlc3lzdGVtIGV4Y2VwdGlvbjogXG4iLiRtZXNzYWdlLCAkY29kZSwgJHByZXZpb3VzKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBSdW50aW1lRXhjZXB0aW9uOwoKCgoKY2xhc3MgRm9zc2lsRG93bmxvYWRlciBleHRlbmRzIFZjc0Rvd25sb2FkZXIKewoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9Eb3dubG9hZChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9JbnN0YWxsKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgc3RyaW5nICR1cmwpOiBQcm9taXNlSW50ZXJmYWNlCnsKCiR0aGlzLT5jb25maWctPnByb2hpYml0VXJsQnlDb25maWcoJHVybCwgJHRoaXMtPmlvKTsKCiRyZXBvRmlsZSA9ICRwYXRoIC4gJy5mb3NzaWwnOwokcmVhbFBhdGggPSBQbGF0Zm9ybTo6cmVhbHBhdGgoJHBhdGgpOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCJDbG9uaW5nICIuJHBhY2thZ2UtPmdldFNvdXJjZVJlZmVyZW5jZSgpKTsKJHRoaXMtPmV4ZWN1dGUoWydmb3NzaWwnLCAnY2xvbmUnLCAnLS0nLCAkdXJsLCAkcmVwb0ZpbGVdKTsKJHRoaXMtPmV4ZWN1dGUoWydmb3NzaWwnLCAnb3BlbicsICctLW5lc3RlZCcsICctLScsICRyZXBvRmlsZV0sICRyZWFsUGF0aCk7CiR0aGlzLT5leGVjdXRlKFsnZm9zc2lsJywgJ3VwZGF0ZScsICctLScsIChzdHJpbmcpICRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKV0sICRyZWFsUGF0aCk7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvVXBkYXRlKFBhY2thZ2VJbnRlcmZhY2UgJGluaXRpYWwsIFBhY2thZ2VJbnRlcmZhY2UgJHRhcmdldCwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCk6IFByb21pc2VJbnRlcmZhY2UKewoKJHRoaXMtPmNvbmZpZy0+cHJvaGliaXRVcmxCeUNvbmZpZygkdXJsLCAkdGhpcy0+aW8pOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgVXBkYXRpbmcgdG8gIi4kdGFyZ2V0LT5nZXRTb3VyY2VSZWZlcmVuY2UoKSk7CgppZiAoISR0aGlzLT5oYXNNZXRhZGF0YVJlcG9zaXRvcnkoJHBhdGgpKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdUaGUgLmZzbGNrb3V0IGZpbGUgaXMgbWlzc2luZyBmcm9tICcuJHBhdGguJywgc2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2NvbW1pdC1kZXBzIGZvciBtb3JlIGluZm9ybWF0aW9uJyk7Cn0KCiRyZWFsUGF0aCA9IFBsYXRmb3JtOjpyZWFscGF0aCgkcGF0aCk7CiR0aGlzLT5leGVjdXRlKFsnZm9zc2lsJywgJ3B1bGwnXSwgJHJlYWxQYXRoKTsKJHRoaXMtPmV4ZWN1dGUoWydmb3NzaWwnLCAndXAnLCAnLS0nLCAoc3RyaW5nKSAkdGFyZ2V0LT5nZXRTb3VyY2VSZWZlcmVuY2UoKV0sICRyZWFsUGF0aCk7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExvY2FsQ2hhbmdlcyhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiA/c3RyaW5nCnsKaWYgKCEkdGhpcy0+aGFzTWV0YWRhdGFSZXBvc2l0b3J5KCRwYXRoKSkgewpyZXR1cm4gbnVsbDsKfQoKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydmb3NzaWwnLCAnY2hhbmdlcyddLCAkb3V0cHV0LCBQbGF0Zm9ybTo6cmVhbHBhdGgoJHBhdGgpKTsKCiRvdXRwdXQgPSB0cmltKCRvdXRwdXQpOwoKcmV0dXJuIHN0cmxlbigkb3V0cHV0KSA+IDAgPyAkb3V0cHV0IDogbnVsbDsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldENvbW1pdExvZ3Moc3RyaW5nICRmcm9tUmVmZXJlbmNlLCBzdHJpbmcgJHRvUmVmZXJlbmNlLCBzdHJpbmcgJHBhdGgpOiBzdHJpbmcKewokdGhpcy0+ZXhlY3V0ZShbJ2Zvc3NpbCcsICd0aW1lbGluZScsICctdCcsICdjaScsICctVycsICcwJywgJy1uJywgJzAnLCAnYmVmb3JlJywgJHRvUmVmZXJlbmNlXSwgUGxhdGZvcm06OnJlYWxwYXRoKCRwYXRoKSwgJG91dHB1dCk7CgokbG9nID0gJyc7CiRtYXRjaCA9ICcvXGRcZDpcZFxkOlxkXGRccytcWycgLiAkdG9SZWZlcmVuY2UgLiAnXF0vJzsKCmZvcmVhY2ggKCR0aGlzLT5wcm9jZXNzLT5zcGxpdExpbmVzKCRvdXRwdXQpIGFzICRsaW5lKSB7CmlmIChQcmVnOjppc01hdGNoKCRtYXRjaCwgJGxpbmUpKSB7CmJyZWFrOwp9CiRsb2cgLj0gJGxpbmU7Cn0KCnJldHVybiAkbG9nOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBleGVjdXRlKGFycmF5ICRjb21tYW5kLCA/c3RyaW5nICRjd2QgPSBudWxsLCA/c3RyaW5nICYkb3V0cHV0ID0gbnVsbCk6IHZvaWQKewppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRvdXRwdXQsICRjd2QpKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gaW1wbG9kZSgnICcsICRjb21tYW5kKSAuICJcblxuIiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpKTsKfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaGFzTWV0YWRhdGFSZXBvc2l0b3J5KHN0cmluZyAkcGF0aCk6IGJvb2wKewpyZXR1cm4gaXNfZmlsZSgkcGF0aCAuICcvLmZzbGNrb3V0JykgfHwgaXNfZmlsZSgkcGF0aCAuICcvX0ZPU1NJTF8nKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxHaXQgYXMgR2l0VXRpbDsKdXNlIENvbXBvc2VyXFV0aWxcVXJsOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwp1c2UgQ29tcG9zZXJcQ2FjaGU7CnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CgoKCgpjbGFzcyBHaXREb3dubG9hZGVyIGV4dGVuZHMgVmNzRG93bmxvYWRlciBpbXBsZW1lbnRzIER2Y3NEb3dubG9hZGVySW50ZXJmYWNlCnsKCgoKCnByaXZhdGUgJGhhc1N0YXNoZWRDaGFuZ2VzID0gW107CgoKCgpwcml2YXRlICRoYXNEaXNjYXJkZWRDaGFuZ2VzID0gW107CgoKCnByaXZhdGUgJGdpdFV0aWw7CgoKCgpwcml2YXRlICRjYWNoZWRQYWNrYWdlcyA9IFtdOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsID9Qcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MgPSBudWxsLCA/RmlsZXN5c3RlbSAkZnMgPSBudWxsKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJGlvLCAkY29uZmlnLCAkcHJvY2VzcywgJGZzKTsKJHRoaXMtPmdpdFV0aWwgPSBuZXcgR2l0VXRpbCgkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsICR0aGlzLT5wcm9jZXNzLCAkdGhpcy0+ZmlsZXN5c3RlbSk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb0Rvd25sb2FkKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgc3RyaW5nICR1cmwsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlCnsKCmlmIChGaWxlc3lzdGVtOjppc0xvY2FsUGF0aCgkdXJsKSkgewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKR2l0VXRpbDo6Y2xlYW5FbnYoJHRoaXMtPnByb2Nlc3MpOwoKJGNhY2hlUGF0aCA9ICR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtdmNzLWRpcicpLicvJy5QcmVnOjpyZXBsYWNlKCd7W15hLXowLTkuXX1pJywgJy0nLCBVcmw6OnNhbml0aXplKCR1cmwpKS4nLyc7CiRnaXRWZXJzaW9uID0gR2l0VXRpbDo6Z2V0VmVyc2lvbigkdGhpcy0+cHJvY2Vzcyk7CgoKaWYgKCRnaXRWZXJzaW9uICYmIHZlcnNpb25fY29tcGFyZSgkZ2l0VmVyc2lvbiwgJzIuMy4wLXJjMCcsICc+PScpICYmIENhY2hlOjppc1VzYWJsZSgkY2FjaGVQYXRoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiAgLSBTeW5jaW5nIDxpbmZvPiIgLiAkcGFja2FnZS0+Z2V0TmFtZSgpIC4gIjwvaW5mbz4gKDxjb21tZW50PiIgLiAkcGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKSAuICI8L2NvbW1lbnQ+KSBpbnRvIGNhY2hlIik7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCcgICAgQ2xvbmluZyB0byBjYWNoZSBhdCAlcycsICRjYWNoZVBhdGgpLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwokcmVmID0gJHBhY2thZ2UtPmdldFNvdXJjZVJlZmVyZW5jZSgpOwppZiAoJHRoaXMtPmdpdFV0aWwtPmZldGNoUmVmT3JTeW5jTWlycm9yKCR1cmwsICRjYWNoZVBhdGgsICRyZWYsICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkpICYmIGlzX2RpcigkY2FjaGVQYXRoKSkgewokdGhpcy0+Y2FjaGVkUGFja2FnZXNbJHBhY2thZ2UtPmdldElkKCldWyRyZWZdID0gdHJ1ZTsKfQp9IGVsc2VpZiAobnVsbCA9PT0gJGdpdFZlcnNpb24pIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdnaXQgd2FzIG5vdCBmb3VuZCBpbiB5b3VyIFBBVEgsIHNraXBwaW5nIHNvdXJjZSBkb3dubG9hZCcpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvSW5zdGFsbChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsKTogUHJvbWlzZUludGVyZmFjZQp7CkdpdFV0aWw6OmNsZWFuRW52KCR0aGlzLT5wcm9jZXNzKTsKJHBhdGggPSAkdGhpcy0+bm9ybWFsaXplUGF0aCgkcGF0aCk7CiRjYWNoZVBhdGggPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXZjcy1kaXInKS4nLycuUHJlZzo6cmVwbGFjZSgne1teYS16MC05Ll19aScsICctJywgVXJsOjpzYW5pdGl6ZSgkdXJsKSkuJy8nOwokcmVmID0gJHBhY2thZ2UtPmdldFNvdXJjZVJlZmVyZW5jZSgpOwoKaWYgKCFlbXB0eSgkdGhpcy0+Y2FjaGVkUGFja2FnZXNbJHBhY2thZ2UtPmdldElkKCldWyRyZWZdKSkgewokbXNnID0gIkNsb25pbmcgIi4kdGhpcy0+Z2V0U2hvcnRIYXNoKCRyZWYpLicgZnJvbSBjYWNoZSc7CgokY2xvbmVGbGFncyA9IFsnLS1kaXNzb2NpYXRlJywgJy0tcmVmZXJlbmNlJywgJGNhY2hlUGF0aF07CiR0cmFuc3BvcnRPcHRpb25zID0gJHBhY2thZ2UtPmdldFRyYW5zcG9ydE9wdGlvbnMoKTsKaWYgKGlzc2V0KCR0cmFuc3BvcnRPcHRpb25zWydnaXQnXVsnc2luZ2xlX3VzZV9jbG9uZSddKSAmJiAkdHJhbnNwb3J0T3B0aW9uc1snZ2l0J11bJ3NpbmdsZV91c2VfY2xvbmUnXSkgewokY2xvbmVGbGFncyA9IFtdOwp9CgokY29tbWFuZHMgPSBbCmFycmF5X21lcmdlKFsnZ2l0JywgJ2Nsb25lJywgJy0tbm8tY2hlY2tvdXQnLCAkY2FjaGVQYXRoLCAkcGF0aF0sICRjbG9uZUZsYWdzKSwKWydnaXQnLCAncmVtb3RlJywgJ3NldC11cmwnLCAnb3JpZ2luJywgJy0tJywgJyVzYW5pdGl6ZWRVcmwlJ10sClsnZ2l0JywgJ3JlbW90ZScsICdhZGQnLCAnY29tcG9zZXInLCAnLS0nLCAnJXNhbml0aXplZFVybCUnXSwKXTsKfSBlbHNlIHsKJG1zZyA9ICJDbG9uaW5nICIuJHRoaXMtPmdldFNob3J0SGFzaCgkcmVmKTsKJGNvbW1hbmRzID0gWwphcnJheV9tZXJnZShbJ2dpdCcsICdjbG9uZScsICctLW5vLWNoZWNrb3V0JywgJy0tJywgJyV1cmwlJywgJHBhdGhdKSwKWydnaXQnLCAncmVtb3RlJywgJ2FkZCcsICdjb21wb3NlcicsICctLScsICcldXJsJSddLApbJ2dpdCcsICdmZXRjaCcsICdjb21wb3NlciddLApbJ2dpdCcsICdyZW1vdGUnLCAnc2V0LXVybCcsICdvcmlnaW4nLCAnLS0nLCAnJXNhbml0aXplZFVybCUnXSwKWydnaXQnLCAncmVtb3RlJywgJ3NldC11cmwnLCAnY29tcG9zZXInLCAnLS0nLCAnJXNhbml0aXplZFVybCUnXSwKXTsKaWYgKFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0RJU0FCTEVfTkVUV09SSycpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIHJlcXVpcmVkIGdpdCByZWZlcmVuY2UgZm9yICcuJHBhY2thZ2UtPmdldE5hbWUoKS4nIGlzIG5vdCBpbiBjYWNoZSBhbmQgbmV0d29yayBpcyBkaXNhYmxlZCwgYWJvcnRpbmcnKTsKfQp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJG1zZyk7CgokdGhpcy0+Z2l0VXRpbC0+cnVuQ29tbWFuZHMoJGNvbW1hbmRzLCAkdXJsLCAkcGF0aCwgdHJ1ZSk7Cgokc291cmNlVXJsID0gJHBhY2thZ2UtPmdldFNvdXJjZVVybCgpOwppZiAoJHVybCAhPT0gJHNvdXJjZVVybCAmJiAkc291cmNlVXJsICE9PSBudWxsKSB7CiR0aGlzLT51cGRhdGVPcmlnaW5VcmwoJHBhdGgsICRzb3VyY2VVcmwpOwp9IGVsc2UgewokdGhpcy0+c2V0UHVzaFVybCgkcGF0aCwgJHVybCk7Cn0KCmlmICgkbmV3UmVmID0gJHRoaXMtPnVwZGF0ZVRvQ29tbWl0KCRwYWNrYWdlLCAkcGF0aCwgKHN0cmluZykgJHJlZiwgJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKSkpIHsKaWYgKCRwYWNrYWdlLT5nZXREaXN0UmVmZXJlbmNlKCkgPT09ICRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKSkgewokcGFja2FnZS0+c2V0RGlzdFJlZmVyZW5jZSgkbmV3UmVmKTsKfQokcGFja2FnZS0+c2V0U291cmNlUmVmZXJlbmNlKCRuZXdSZWYpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvVXBkYXRlKFBhY2thZ2VJbnRlcmZhY2UgJGluaXRpYWwsIFBhY2thZ2VJbnRlcmZhY2UgJHRhcmdldCwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCk6IFByb21pc2VJbnRlcmZhY2UKewpHaXRVdGlsOjpjbGVhbkVudigkdGhpcy0+cHJvY2Vzcyk7CiRwYXRoID0gJHRoaXMtPm5vcm1hbGl6ZVBhdGgoJHBhdGgpOwppZiAoISR0aGlzLT5oYXNNZXRhZGF0YVJlcG9zaXRvcnkoJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIC5naXQgZGlyZWN0b3J5IGlzIG1pc3NpbmcgZnJvbSAnLiRwYXRoLicsIHNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9jb21taXQtZGVwcyBmb3IgbW9yZSBpbmZvcm1hdGlvbicpOwp9CgokY2FjaGVQYXRoID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS12Y3MtZGlyJykuJy8nLlByZWc6OnJlcGxhY2UoJ3tbXmEtejAtOS5dfWknLCAnLScsIFVybDo6c2FuaXRpemUoJHVybCkpLicvJzsKJHJlZiA9ICR0YXJnZXQtPmdldFNvdXJjZVJlZmVyZW5jZSgpOwoKaWYgKCFlbXB0eSgkdGhpcy0+Y2FjaGVkUGFja2FnZXNbJHRhcmdldC0+Z2V0SWQoKV1bJHJlZl0pKSB7CiRtc2cgPSAiQ2hlY2tpbmcgb3V0ICIuJHRoaXMtPmdldFNob3J0SGFzaCgkcmVmKS4nIGZyb20gY2FjaGUnOwokcmVtb3RlVXJsID0gJGNhY2hlUGF0aDsKfSBlbHNlIHsKJG1zZyA9ICJDaGVja2luZyBvdXQgIi4kdGhpcy0+Z2V0U2hvcnRIYXNoKCRyZWYpOwokcmVtb3RlVXJsID0gJyV1cmwlJzsKaWYgKFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0RJU0FCTEVfTkVUV09SSycpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIHJlcXVpcmVkIGdpdCByZWZlcmVuY2UgZm9yICcuJHRhcmdldC0+Z2V0TmFtZSgpLicgaXMgbm90IGluIGNhY2hlIGFuZCBuZXR3b3JrIGlzIGRpc2FibGVkLCBhYm9ydGluZycpOwp9Cn0KCiR0aGlzLT5pby0+d3JpdGVFcnJvcigkbXNnKTsKCmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdyZXYtcGFyc2UnLCAnLS1xdWlldCcsICctLXZlcmlmeScsICRyZWYuJ157Y29tbWl0fSddLCAkb3V0cHV0LCAkcGF0aCkpIHsKJGNvbW1hbmRzID0gWwpbJ2dpdCcsICdyZW1vdGUnLCAnc2V0LXVybCcsICdjb21wb3NlcicsICctLScsICRyZW1vdGVVcmxdLApbJ2dpdCcsICdmZXRjaCcsICdjb21wb3NlciddLApbJ2dpdCcsICdmZXRjaCcsICctLXRhZ3MnLCAnY29tcG9zZXInXSwKXTsKCiR0aGlzLT5naXRVdGlsLT5ydW5Db21tYW5kcygkY29tbWFuZHMsICR1cmwsICRwYXRoKTsKfQoKJGNvbW1hbmQgPSBbJ2dpdCcsICdyZW1vdGUnLCAnc2V0LXVybCcsICdjb21wb3NlcicsICctLScsICclc2FuaXRpemVkVXJsJSddOwokdGhpcy0+Z2l0VXRpbC0+cnVuQ29tbWFuZHMoWyRjb21tYW5kXSwgJHVybCwgJHBhdGgpOwoKaWYgKCRuZXdSZWYgPSAkdGhpcy0+dXBkYXRlVG9Db21taXQoJHRhcmdldCwgJHBhdGgsIChzdHJpbmcpICRyZWYsICR0YXJnZXQtPmdldFByZXR0eVZlcnNpb24oKSkpIHsKaWYgKCR0YXJnZXQtPmdldERpc3RSZWZlcmVuY2UoKSA9PT0gJHRhcmdldC0+Z2V0U291cmNlUmVmZXJlbmNlKCkpIHsKJHRhcmdldC0+c2V0RGlzdFJlZmVyZW5jZSgkbmV3UmVmKTsKfQokdGFyZ2V0LT5zZXRTb3VyY2VSZWZlcmVuY2UoJG5ld1JlZik7Cn0KCiR1cGRhdGVPcmlnaW5VcmwgPSBmYWxzZTsKaWYgKAowID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdyZW1vdGUnLCAnLXYnXSwgJG91dHB1dCwgJHBhdGgpCiYmIFByZWc6OmlzTWF0Y2goJ3teb3JpZ2luXHMrKD9QPHVybD5cUyspfW0nLCAkb3V0cHV0LCAkb3JpZ2luTWF0Y2gpCiYmIFByZWc6OmlzTWF0Y2goJ3teY29tcG9zZXJccysoP1A8dXJsPlxTKyl9bScsICRvdXRwdXQsICRjb21wb3Nlck1hdGNoKQopIHsKaWYgKCRvcmlnaW5NYXRjaFsndXJsJ10gPT09ICRjb21wb3Nlck1hdGNoWyd1cmwnXSAmJiAkY29tcG9zZXJNYXRjaFsndXJsJ10gIT09ICR0YXJnZXQtPmdldFNvdXJjZVVybCgpKSB7CiR1cGRhdGVPcmlnaW5VcmwgPSB0cnVlOwp9Cn0KaWYgKCR1cGRhdGVPcmlnaW5VcmwgJiYgJHRhcmdldC0+Z2V0U291cmNlVXJsKCkgIT09IG51bGwpIHsKJHRoaXMtPnVwZGF0ZU9yaWdpblVybCgkcGF0aCwgJHRhcmdldC0+Z2V0U291cmNlVXJsKCkpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExvY2FsQ2hhbmdlcyhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiA/c3RyaW5nCnsKR2l0VXRpbDo6Y2xlYW5FbnYoJHRoaXMtPnByb2Nlc3MpOwppZiAoISR0aGlzLT5oYXNNZXRhZGF0YVJlcG9zaXRvcnkoJHBhdGgpKSB7CnJldHVybiBudWxsOwp9CgokY29tbWFuZCA9IFsnZ2l0JywgJ3N0YXR1cycsICctLXBvcmNlbGFpbicsICctLXVudHJhY2tlZC1maWxlcz1ubyddOwppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRvdXRwdXQsICRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byBleGVjdXRlICcgLiBpbXBsb2RlKCcgJywgJGNvbW1hbmQpIC4gIlxuXG4iIC4gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCkpOwp9Cgokb3V0cHV0ID0gdHJpbSgkb3V0cHV0KTsKCnJldHVybiBzdHJsZW4oJG91dHB1dCkgPiAwID8gJG91dHB1dCA6IG51bGw7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRVbnB1c2hlZENoYW5nZXMoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKTogP3N0cmluZwp7CkdpdFV0aWw6OmNsZWFuRW52KCR0aGlzLT5wcm9jZXNzKTsKJHBhdGggPSAkdGhpcy0+bm9ybWFsaXplUGF0aCgkcGF0aCk7CmlmICghJHRoaXMtPmhhc01ldGFkYXRhUmVwb3NpdG9yeSgkcGF0aCkpIHsKcmV0dXJuIG51bGw7Cn0KCiRjb21tYW5kID0gWydnaXQnLCAnc2hvdy1yZWYnLCAnLS1oZWFkJywgJy1kJ107CmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY29tbWFuZCwgJG91dHB1dCwgJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIGV4ZWN1dGUgJyAuIGltcGxvZGUoJyAnLCAkY29tbWFuZCkgLiAiXG5cbiIgLiAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSk7Cn0KCiRyZWZzID0gdHJpbSgkb3V0cHV0KTsKaWYgKCFQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XihbYS1mMC05XSspIEhFQUQkfW1pJywgJHJlZnMsICRtYXRjaCkpIHsKCnJldHVybiBudWxsOwp9CgokaGVhZFJlZiA9ICRtYXRjaFsxXTsKaWYgKCFQcmVnOjppc01hdGNoQWxsU3RyaWN0R3JvdXBzKCd7XicucHJlZ19xdW90ZSgkaGVhZFJlZikuJyByZWZzL2hlYWRzLyguKykkfW1pJywgJHJlZnMsICRtYXRjaGVzKSkgewoKcmV0dXJuIG51bGw7Cn0KCiRjYW5kaWRhdGVCcmFuY2hlcyA9ICRtYXRjaGVzWzFdOwoKJGJyYW5jaCA9ICRjYW5kaWRhdGVCcmFuY2hlc1swXTsKJHVucHVzaGVkQ2hhbmdlcyA9IG51bGw7CiRicmFuY2hOb3RGb3VuZEVycm9yID0gZmFsc2U7CgoKZm9yICgkaSA9IDA7ICRpIDw9IDE7ICRpKyspIHsKJHJlbW90ZUJyYW5jaGVzID0gW107CgoKZm9yZWFjaCAoJGNhbmRpZGF0ZUJyYW5jaGVzIGFzICRjYW5kaWRhdGUpIHsKaWYgKFByZWc6OmlzTWF0Y2hBbGxTdHJpY3RHcm91cHMoJ3teW2EtZjAtOV0rIHJlZnMvcmVtb3Rlcy8oKD86W14vXSspLycucHJlZ19xdW90ZSgkY2FuZGlkYXRlKS4nKSR9bWknLCAkcmVmcywgJG1hdGNoZXMpKSB7CmZvcmVhY2ggKCRtYXRjaGVzWzFdIGFzICRtYXRjaCkgewokYnJhbmNoID0gJGNhbmRpZGF0ZTsKJHJlbW90ZUJyYW5jaGVzW10gPSAkbWF0Y2g7Cn0KYnJlYWs7Cn0KfQoKCgoKaWYgKGNvdW50KCRyZW1vdGVCcmFuY2hlcykgPT09IDApIHsKJHVucHVzaGVkQ2hhbmdlcyA9ICdCcmFuY2ggJyAuICRicmFuY2ggLiAnIGNvdWxkIG5vdCBiZSBmb3VuZCBvbiBhbnkgcmVtb3RlIGFuZCBhcHBlYXJzIHRvIGJlIHVucHVzaGVkJzsKJGJyYW5jaE5vdEZvdW5kRXJyb3IgPSB0cnVlOwp9IGVsc2UgewoKCmlmICgkYnJhbmNoTm90Rm91bmRFcnJvcikgewokdW5wdXNoZWRDaGFuZ2VzID0gbnVsbDsKfQpmb3JlYWNoICgkcmVtb3RlQnJhbmNoZXMgYXMgJHJlbW90ZUJyYW5jaCkgewokY29tbWFuZCA9IFsnZ2l0JywgJ2RpZmYnLCAnLS1uYW1lLXN0YXR1cycsICRyZW1vdGVCcmFuY2guJy4uLicuJGJyYW5jaCwgJy0tJ107CmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY29tbWFuZCwgJG91dHB1dCwgJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIGV4ZWN1dGUgJyAuIGltcGxvZGUoJyAnLCAkY29tbWFuZCkgLiAiXG5cbiIgLiAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSk7Cn0KCiRvdXRwdXQgPSB0cmltKCRvdXRwdXQpOwoKaWYgKCR1bnB1c2hlZENoYW5nZXMgPT09IG51bGwgfHwgc3RybGVuKCRvdXRwdXQpIDwgc3RybGVuKCR1bnB1c2hlZENoYW5nZXMpKSB7CiR1bnB1c2hlZENoYW5nZXMgPSAkb3V0cHV0Owp9Cn0KfQoKCgppZiAoJHVucHVzaGVkQ2hhbmdlcyAmJiAkaSA9PT0gMCkgewokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdmZXRjaCcsICctLWFsbCddLCAkb3V0cHV0LCAkcGF0aCk7CgoKJGNvbW1hbmQgPSBbJ2dpdCcsICdzaG93LXJlZicsICctLWhlYWQnLCAnLWQnXTsKaWYgKDAgIT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjb21tYW5kLCAkb3V0cHV0LCAkcGF0aCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gaW1wbG9kZSgnICcsICRjb21tYW5kKSAuICJcblxuIiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpKTsKfQokcmVmcyA9IHRyaW0oJG91dHB1dCk7Cn0KCgppZiAoISR1bnB1c2hlZENoYW5nZXMpIHsKYnJlYWs7Cn0KfQoKcmV0dXJuICR1bnB1c2hlZENoYW5nZXM7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjbGVhbkNoYW5nZXMoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBib29sICR1cGRhdGUpOiBQcm9taXNlSW50ZXJmYWNlCnsKR2l0VXRpbDo6Y2xlYW5FbnYoJHRoaXMtPnByb2Nlc3MpOwokcGF0aCA9ICR0aGlzLT5ub3JtYWxpemVQYXRoKCRwYXRoKTsKCiR1bnB1c2hlZCA9ICR0aGlzLT5nZXRVbnB1c2hlZENoYW5nZXMoJHBhY2thZ2UsICRwYXRoKTsKaWYgKCR1bnB1c2hlZCAmJiAoJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkgfHwgJHRoaXMtPmNvbmZpZy0+Z2V0KCdkaXNjYXJkLWNoYW5nZXMnKSAhPT0gdHJ1ZSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdTb3VyY2UgZGlyZWN0b3J5ICcgLiAkcGF0aCAuICcgaGFzIHVucHVzaGVkIGNoYW5nZXMgb24gdGhlIGN1cnJlbnQgYnJhbmNoOiAnLiJcbiIuJHVucHVzaGVkKTsKfQoKaWYgKG51bGwgPT09ICgkY2hhbmdlcyA9ICR0aGlzLT5nZXRMb2NhbENoYW5nZXMoJHBhY2thZ2UsICRwYXRoKSkpIHsKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCmlmICghJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkpIHsKJGRpc2NhcmRDaGFuZ2VzID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdkaXNjYXJkLWNoYW5nZXMnKTsKaWYgKHRydWUgPT09ICRkaXNjYXJkQ2hhbmdlcykgewpyZXR1cm4gJHRoaXMtPmRpc2NhcmRDaGFuZ2VzKCRwYXRoKTsKfQppZiAoJ3N0YXNoJyA9PT0gJGRpc2NhcmRDaGFuZ2VzKSB7CmlmICghJHVwZGF0ZSkgewpyZXR1cm4gcGFyZW50OjpjbGVhbkNoYW5nZXMoJHBhY2thZ2UsICRwYXRoLCAkdXBkYXRlKTsKfQoKcmV0dXJuICR0aGlzLT5zdGFzaENoYW5nZXMoJHBhdGgpOwp9CgpyZXR1cm4gcGFyZW50OjpjbGVhbkNoYW5nZXMoJHBhY2thZ2UsICRwYXRoLCAkdXBkYXRlKTsKfQoKJGNoYW5nZXMgPSBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkZWxlbSk6IHN0cmluZyB7CnJldHVybiAnICAgICcuJGVsZW07Cn0sIFByZWc6OnNwbGl0KCd7XHMqXHI/XG5ccyp9JywgJGNoYW5nZXMpKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgPGVycm9yPicuJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nIGhhcyBtb2RpZmllZCBmaWxlczo8L2Vycm9yPicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoYXJyYXlfc2xpY2UoJGNoYW5nZXMsIDAsIDEwKSk7CmlmIChjb3VudCgkY2hhbmdlcykgPiAxMCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICA8aW5mbz4nIC4gKGNvdW50KCRjaGFuZ2VzKSAtIDEwKSAuICcgbW9yZSBmaWxlcyBtb2RpZmllZCwgY2hvb3NlICJ2IiB0byB2aWV3IHRoZSBmdWxsIGxpc3Q8L2luZm8+Jyk7Cn0KCndoaWxlICh0cnVlKSB7CnN3aXRjaCAoJHRoaXMtPmlvLT5hc2soJyAgICA8aW5mbz5EaXNjYXJkIGNoYW5nZXMgW3ksbix2LGQsJy4oJHVwZGF0ZSA/ICdzLCcgOiAnJykuJz9dPzwvaW5mbz4gJywgJz8nKSkgewpjYXNlICd5JzoKJHRoaXMtPmRpc2NhcmRDaGFuZ2VzKCRwYXRoKTsKYnJlYWsgMjsKCmNhc2UgJ3MnOgppZiAoISR1cGRhdGUpIHsKZ290byBoZWxwOwp9CgokdGhpcy0+c3Rhc2hDaGFuZ2VzKCRwYXRoKTsKYnJlYWsgMjsKCmNhc2UgJ24nOgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1VwZGF0ZSBhYm9ydGVkJyk7CgpjYXNlICd2JzoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRjaGFuZ2VzKTsKYnJlYWs7CgpjYXNlICdkJzoKJHRoaXMtPnZpZXdEaWZmKCRwYXRoKTsKYnJlYWs7CgpjYXNlICc/JzoKZGVmYXVsdDoKaGVscCA6CiR0aGlzLT5pby0+d3JpdGVFcnJvcihbCicgICAgeSAtIGRpc2NhcmQgY2hhbmdlcyBhbmQgYXBwbHkgdGhlICcuKCR1cGRhdGUgPyAndXBkYXRlJyA6ICd1bmluc3RhbGwnKSwKJyAgICBuIC0gYWJvcnQgdGhlICcuKCR1cGRhdGUgPyAndXBkYXRlJyA6ICd1bmluc3RhbGwnKS4nIGFuZCBsZXQgeW91IG1hbnVhbGx5IGNsZWFuIHRoaW5ncyB1cCcsCicgICAgdiAtIHZpZXcgbW9kaWZpZWQgZmlsZXMnLAonICAgIGQgLSB2aWV3IGxvY2FsIG1vZGlmaWNhdGlvbnMgKGRpZmYpJywKXSk7CmlmICgkdXBkYXRlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignICAgIHMgLSBzdGFzaCBjaGFuZ2VzIGFuZCB0cnkgdG8gcmVhcHBseSB0aGVtIGFmdGVyIHRoZSB1cGRhdGUnKTsKfQokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICA/IC0gcHJpbnQgaGVscCcpOwpicmVhazsKfQp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHJlYXBwbHlDaGFuZ2VzKHN0cmluZyAkcGF0aCk6IHZvaWQKewokcGF0aCA9ICR0aGlzLT5ub3JtYWxpemVQYXRoKCRwYXRoKTsKaWYgKCFlbXB0eSgkdGhpcy0+aGFzU3Rhc2hlZENoYW5nZXNbJHBhdGhdKSkgewp1bnNldCgkdGhpcy0+aGFzU3Rhc2hlZENoYW5nZXNbJHBhdGhdKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgPGluZm8+UmUtYXBwbHlpbmcgc3Rhc2hlZCBjaGFuZ2VzPC9pbmZvPicpOwppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAnc3Rhc2gnLCAncG9wJ10sICRvdXRwdXQsICRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIkZhaWxlZCB0byBhcHBseSBzdGFzaGVkIGNoYW5nZXM6XG5cbiIuJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCkpOwp9Cn0KCnVuc2V0KCR0aGlzLT5oYXNEaXNjYXJkZWRDaGFuZ2VzWyRwYXRoXSk7Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB1cGRhdGVUb0NvbW1pdChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsIHN0cmluZyAkcmVmZXJlbmNlLCBzdHJpbmcgJHByZXR0eVZlcnNpb24pOiA/c3RyaW5nCnsKJGZvcmNlID0gIWVtcHR5KCR0aGlzLT5oYXNEaXNjYXJkZWRDaGFuZ2VzWyRwYXRoXSkgfHwgIWVtcHR5KCR0aGlzLT5oYXNTdGFzaGVkQ2hhbmdlc1skcGF0aF0pID8gWyctZiddIDogW107CgoKCgoKCgokYnJhbmNoID0gUHJlZzo6cmVwbGFjZSgneyg/Ol5kZXYtfCg/OlwueCk/LWRldiQpfWknLCAnJywgJHByZXR0eVZlcnNpb24pOwoKCgoKCiRleGVjdXRlID0gZnVuY3Rpb24gKGFycmF5ICRjb21tYW5kKSB1c2UgKCYkb3V0cHV0LCAkcGF0aCkgewoKJG91dHB1dCA9ICcnOwoKcmV0dXJuIDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjb21tYW5kLCAkb3V0cHV0LCAkcGF0aCk7Cn07CgokYnJhbmNoZXMgPSBudWxsOwppZiAoJGV4ZWN1dGUoWydnaXQnLCAnYnJhbmNoJywgJy1yJ10pKSB7CiRicmFuY2hlcyA9ICRvdXRwdXQ7Cn0KCgokZ2l0UmVmID0gJHJlZmVyZW5jZTsKaWYgKCFQcmVnOjppc01hdGNoKCd7XlthLWYwLTldezQwfSR9JywgJHJlZmVyZW5jZSkKJiYgbnVsbCAhPT0gJGJyYW5jaGVzCiYmIFByZWc6OmlzTWF0Y2goJ3teXHMrY29tcG9zZXIvJy5wcmVnX3F1b3RlKCRyZWZlcmVuY2UpLickfW0nLCAkYnJhbmNoZXMpCikgewokY29tbWFuZDEgPSBhcnJheV9tZXJnZShbJ2dpdCcsICdjaGVja291dCddLCAkZm9yY2UsIFsnLUInLCAkYnJhbmNoLCAnY29tcG9zZXIvJy4kcmVmZXJlbmNlLCAnLS0nXSk7CiRjb21tYW5kMiA9IFsnZ2l0JywgJ3Jlc2V0JywgJy0taGFyZCcsICdjb21wb3Nlci8nLiRyZWZlcmVuY2UsICctLSddOwoKaWYgKCRleGVjdXRlKCRjb21tYW5kMSkgJiYgJGV4ZWN1dGUoJGNvbW1hbmQyKSkgewpyZXR1cm4gbnVsbDsKfQp9CgoKaWYgKFByZWc6OmlzTWF0Y2goJ3teW2EtZjAtOV17NDB9JH0nLCAkcmVmZXJlbmNlKSkgewoKaWYgKG51bGwgIT09ICRicmFuY2hlcyAmJiAhUHJlZzo6aXNNYXRjaCgne15ccytjb21wb3Nlci8nLnByZWdfcXVvdGUoJGJyYW5jaCkuJyR9bScsICRicmFuY2hlcykgJiYgUHJlZzo6aXNNYXRjaCgne15ccytjb21wb3Nlci92Jy5wcmVnX3F1b3RlKCRicmFuY2gpLickfW0nLCAkYnJhbmNoZXMpKSB7CiRicmFuY2ggPSAndicgLiAkYnJhbmNoOwp9CgokY29tbWFuZCA9IFsnZ2l0JywgJ2NoZWNrb3V0JywgJGJyYW5jaCwgJy0tJ107CiRmYWxsYmFja0NvbW1hbmQgPSBhcnJheV9tZXJnZShbJ2dpdCcsICdjaGVja291dCddLCAkZm9yY2UsIFsnLUInLCAkYnJhbmNoLCAnY29tcG9zZXIvJy4kYnJhbmNoLCAnLS0nXSk7CiRyZXNldENvbW1hbmQgPSBbJ2dpdCcsICdyZXNldCcsICctLWhhcmQnLCAkcmVmZXJlbmNlLCAnLS0nXTsKCmlmICgoJGV4ZWN1dGUoJGNvbW1hbmQpIHx8ICRleGVjdXRlKCRmYWxsYmFja0NvbW1hbmQpKSAmJiAkZXhlY3V0ZSgkcmVzZXRDb21tYW5kKSkgewpyZXR1cm4gbnVsbDsKfQp9CgokY29tbWFuZDEgPSBhcnJheV9tZXJnZShbJ2dpdCcsICdjaGVja291dCddLCAkZm9yY2UsIFskZ2l0UmVmLCAnLS0nXSk7CiRjb21tYW5kMiA9IFsnZ2l0JywgJ3Jlc2V0JywgJy0taGFyZCcsICRnaXRSZWYsICctLSddOwppZiAoJGV4ZWN1dGUoJGNvbW1hbmQxKSAmJiAkZXhlY3V0ZSgkY29tbWFuZDIpKSB7CnJldHVybiBudWxsOwp9CgokZXhjZXB0aW9uRXh0cmEgPSAnJzsKCgppZiAoZmFsc2UgIT09IHN0cnBvcygkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSwgJHJlZmVyZW5jZSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgPHdhcm5pbmc+Jy4kcmVmZXJlbmNlLicgaXMgZ29uZSAoaGlzdG9yeSB3YXMgcmV3cml0dGVuPyk8L3dhcm5pbmc+Jyk7CiRleGNlcHRpb25FeHRyYSA9ICJcbkl0IGxvb2tzIGxpa2UgdGhlIGNvbW1pdCBoYXNoIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIHJlcG9zaXRvcnksIG1heWJlICIuKCRwYWNrYWdlLT5pc0RldigpID8gJ3RoZSBjb21taXQgd2FzIHJlbW92ZWQgZnJvbSB0aGUgYnJhbmNoJyA6ICd0aGUgdGFnIHdhcyByZWNyZWF0ZWQnKS4nPyBSdW4gImNvbXBvc2VyIHVwZGF0ZSAnLiRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuJyIgdG8gcmVzb2x2ZSB0aGlzLic7Cn0KCiRjb21tYW5kID0gaW1wbG9kZSgnICcsICRjb21tYW5kMSkuICcgJiYgJy5pbXBsb2RlKCcgJywgJGNvbW1hbmQyKTsKCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihVcmw6OnNhbml0aXplKCdGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gJGNvbW1hbmQgLiAiXG5cbiIgLiAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSAuICRleGNlcHRpb25FeHRyYSkpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gdXBkYXRlT3JpZ2luVXJsKHN0cmluZyAkcGF0aCwgc3RyaW5nICR1cmwpOiB2b2lkCnsKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAncmVtb3RlJywgJ3NldC11cmwnLCAnb3JpZ2luJywgJy0tJywgJHVybF0sICRvdXRwdXQsICRwYXRoKTsKJHRoaXMtPnNldFB1c2hVcmwoJHBhdGgsICR1cmwpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0UHVzaFVybChzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsKTogdm9pZAp7CgppZiAoUHJlZzo6aXNNYXRjaCgne14oPzpodHRwcz98Z2l0KTovLycuR2l0VXRpbDo6Z2V0R2l0SHViRG9tYWluc1JlZ2V4KCR0aGlzLT5jb25maWcpLicvKFteL10rKS8oW14vXSs/KSg/OlwuZ2l0KT8kfScsICR1cmwsICRtYXRjaCkpIHsKJHByb3RvY29scyA9ICR0aGlzLT5jb25maWctPmdldCgnZ2l0aHViLXByb3RvY29scycpOwokcHVzaFVybCA9ICdnaXRAJy4kbWF0Y2hbMV0uJzonLiRtYXRjaFsyXS4nLycuJG1hdGNoWzNdLicuZ2l0JzsKaWYgKCFpbl9hcnJheSgnc3NoJywgJHByb3RvY29scywgdHJ1ZSkpIHsKJHB1c2hVcmwgPSAnaHR0cHM6Ly8nIC4gJG1hdGNoWzFdIC4gJy8nLiRtYXRjaFsyXS4nLycuJG1hdGNoWzNdLicuZ2l0JzsKfQokY21kID0gWydnaXQnLCAncmVtb3RlJywgJ3NldC11cmwnLCAnLS1wdXNoJywgJ29yaWdpbicsICctLScsICRwdXNoVXJsXTsKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNtZCwgJGlnbm9yZWRPdXRwdXQsICRwYXRoKTsKfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Q29tbWl0TG9ncyhzdHJpbmcgJGZyb21SZWZlcmVuY2UsIHN0cmluZyAkdG9SZWZlcmVuY2UsIHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CiRwYXRoID0gJHRoaXMtPm5vcm1hbGl6ZVBhdGgoJHBhdGgpOwokY29tbWFuZCA9IEdpdFV0aWw6OmJ1aWxkUmV2TGlzdENvbW1hbmQoJHRoaXMtPnByb2Nlc3MsIGFycmF5X21lcmdlKFsnLS1mb3JtYXQ9JWggLSAlYW46ICVzJywgJGZyb21SZWZlcmVuY2UuJy4uJy4kdG9SZWZlcmVuY2VdLCBHaXRVdGlsOjpnZXROb1Nob3dTaWduYXR1cmVGbGFncygkdGhpcy0+cHJvY2VzcykpKTsKCmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY29tbWFuZCwgJG91dHB1dCwgJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIGV4ZWN1dGUgJyAuIGltcGxvZGUoJyAnLCAkY29tbWFuZCkgLiAiXG5cbiIgLiAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSk7Cn0KCnJldHVybiBHaXRVdGlsOjpwYXJzZVJldkxpc3RPdXRwdXQoJG91dHB1dCwgJHRoaXMtPnByb2Nlc3MpOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRpc2NhcmRDaGFuZ2VzKHN0cmluZyAkcGF0aCk6IFByb21pc2VJbnRlcmZhY2UKewokcGF0aCA9ICR0aGlzLT5ub3JtYWxpemVQYXRoKCRwYXRoKTsKaWYgKDAgIT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ2NsZWFuJywgJy1kZiddLCAkb3V0cHV0LCAkcGF0aCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgcmVzZXQgY2hhbmdlc1xuXG46Ii4kb3V0cHV0KTsKfQppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAncmVzZXQnLCAnLS1oYXJkJ10sICRvdXRwdXQsICRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkIG5vdCByZXNldCBjaGFuZ2VzXG5cbjoiLiRvdXRwdXQpOwp9CgokdGhpcy0+aGFzRGlzY2FyZGVkQ2hhbmdlc1skcGF0aF0gPSB0cnVlOwoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gc3Rhc2hDaGFuZ2VzKHN0cmluZyAkcGF0aCk6IFByb21pc2VJbnRlcmZhY2UKewokcGF0aCA9ICR0aGlzLT5ub3JtYWxpemVQYXRoKCRwYXRoKTsKaWYgKDAgIT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ3N0YXNoJywgJy0taW5jbHVkZS11bnRyYWNrZWQnXSwgJG91dHB1dCwgJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IHN0YXNoIGNoYW5nZXNcblxuOiIuJG91dHB1dCk7Cn0KCiR0aGlzLT5oYXNTdGFzaGVkQ2hhbmdlc1skcGF0aF0gPSB0cnVlOwoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB2aWV3RGlmZihzdHJpbmcgJHBhdGgpOiB2b2lkCnsKJHBhdGggPSAkdGhpcy0+bm9ybWFsaXplUGF0aCgkcGF0aCk7CmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdkaWZmJywgJ0hFQUQnXSwgJG91dHB1dCwgJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IHZpZXcgZGlmZlxuXG46Ii4kb3V0cHV0KTsKfQoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRvdXRwdXQpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChzdHJpbmcgJHBhdGgpOiBzdHJpbmcKewppZiAoUGxhdGZvcm06OmlzV2luZG93cygpICYmIHN0cmxlbigkcGF0aCkgPiAwKSB7CiRiYXNlUGF0aCA9ICRwYXRoOwokcmVtb3ZlZCA9IFtdOwoKd2hpbGUgKCFpc19kaXIoJGJhc2VQYXRoKSAmJiAkYmFzZVBhdGggIT09ICdcXCcpIHsKYXJyYXlfdW5zaGlmdCgkcmVtb3ZlZCwgYmFzZW5hbWUoJGJhc2VQYXRoKSk7CiRiYXNlUGF0aCA9IGRpcm5hbWUoJGJhc2VQYXRoKTsKfQoKaWYgKCRiYXNlUGF0aCA9PT0gJ1xcJykgewpyZXR1cm4gJHBhdGg7Cn0KCiRwYXRoID0gcnRyaW0ocmVhbHBhdGgoJGJhc2VQYXRoKSAuICcvJyAuIGltcGxvZGUoJy8nLCAkcmVtb3ZlZCksICcvJyk7Cn0KCnJldHVybiAkcGF0aDsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGhhc01ldGFkYXRhUmVwb3NpdG9yeShzdHJpbmcgJHBhdGgpOiBib29sCnsKJHBhdGggPSAkdGhpcy0+bm9ybWFsaXplUGF0aCgkcGF0aCk7CgpyZXR1cm4gaXNfZGlyKCRwYXRoLicvLmdpdCcpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0U2hvcnRIYXNoKHN0cmluZyAkcmVmZXJlbmNlKTogc3RyaW5nCnsKaWYgKCEkdGhpcy0+aW8tPmlzVmVyYm9zZSgpICYmIFByZWc6OmlzTWF0Y2goJ3teWzAtOWEtZl17NDB9JH0nLCAkcmVmZXJlbmNlKSkgewpyZXR1cm4gc3Vic3RyKCRyZWZlcmVuY2UsIDAsIDEwKTsKfQoKcmV0dXJuICRyZWZlcmVuY2U7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwoKCgoKCgpjbGFzcyBHemlwRG93bmxvYWRlciBleHRlbmRzIEFyY2hpdmVEb3dubG9hZGVyCnsKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4dHJhY3QoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRmaWxlLCBzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlCnsKJGZpbGVuYW1lID0gcGF0aGluZm8ocGFyc2VfdXJsKHN0cnRyKChzdHJpbmcpICRwYWNrYWdlLT5nZXREaXN0VXJsKCksICdcXCcsICcvJyksIFBIUF9VUkxfUEFUSCksIFBBVEhJTkZPX0ZJTEVOQU1FKTsKJHRhcmdldEZpbGVwYXRoID0gJHBhdGggLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGZpbGVuYW1lOwoKCmlmICghUGxhdGZvcm06OmlzV2luZG93cygpKSB7CiRjb21tYW5kID0gWydzaCcsICctYycsICdnemlwIC1jZCAtLSAiJDAiID4gIiQxIicsICRmaWxlLCAkdGFyZ2V0RmlsZXBhdGhdOwoKaWYgKDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjb21tYW5kLCAkaWdub3JlZE91dHB1dCkpIHsKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCmlmIChleHRlbnNpb25fbG9hZGVkKCd6bGliJykpIHsKCiR0aGlzLT5leHRyYWN0VXNpbmdFeHQoJGZpbGUsICR0YXJnZXRGaWxlcGF0aCk7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKJHByb2Nlc3NFcnJvciA9ICdGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gaW1wbG9kZSgnICcsICRjb21tYW5kKSAuICJcblxuIiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpOwp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJHByb2Nlc3NFcnJvcik7Cn0KCgokdGhpcy0+ZXh0cmFjdFVzaW5nRXh0KCRmaWxlLCAkdGFyZ2V0RmlsZXBhdGgpOwoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZXh0cmFjdFVzaW5nRXh0KHN0cmluZyAkZmlsZSwgc3RyaW5nICR0YXJnZXRGaWxlcGF0aCk6IHZvaWQKewokYXJjaGl2ZUZpbGUgPSBnem9wZW4oJGZpbGUsICdyYicpOwokdGFyZ2V0RmlsZSA9IGZvcGVuKCR0YXJnZXRGaWxlcGF0aCwgJ3diJyk7CndoaWxlICgkc3RyaW5nID0gZ3pyZWFkKCRhcmNoaXZlRmlsZSwgNDA5NikpIHsKZndyaXRlKCR0YXJnZXRGaWxlLCAkc3RyaW5nLCBQbGF0Zm9ybTo6c3RybGVuKCRzdHJpbmcpKTsKfQpnemNsb3NlKCRhcmNoaXZlRmlsZSk7CmZjbG9zZSgkdGFyZ2V0RmlsZSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxVdGlsXEhnIGFzIEhnVXRpbHM7CgoKCgpjbGFzcyBIZ0Rvd25sb2FkZXIgZXh0ZW5kcyBWY3NEb3dubG9hZGVyCnsKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvRG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewppZiAobnVsbCA9PT0gSGdVdGlsczo6Z2V0VmVyc2lvbigkdGhpcy0+cHJvY2VzcykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdoZyB3YXMgbm90IGZvdW5kIGluIHlvdXIgUEFUSCwgc2tpcHBpbmcgc291cmNlIGRvd25sb2FkJyk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9JbnN0YWxsKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgc3RyaW5nICR1cmwpOiBQcm9taXNlSW50ZXJmYWNlCnsKJGhnVXRpbHMgPSBuZXcgSGdVdGlscygkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsICR0aGlzLT5wcm9jZXNzKTsKCiRjbG9uZUNvbW1hbmQgPSBzdGF0aWMgZnVuY3Rpb24gKHN0cmluZyAkdXJsKSB1c2UgKCRwYXRoKTogYXJyYXkgewpyZXR1cm4gWydoZycsICdjbG9uZScsICctLScsICR1cmwsICRwYXRoXTsKfTsKCiRoZ1V0aWxzLT5ydW5Db21tYW5kKCRjbG9uZUNvbW1hbmQsICR1cmwsICRwYXRoKTsKCiRjb21tYW5kID0gWydoZycsICd1cCcsICctLScsIChzdHJpbmcpICRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKV07CmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY29tbWFuZCwgJGlnbm9yZWRPdXRwdXQsIHJlYWxwYXRoKCRwYXRoKSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gaW1wbG9kZSgnICcsICRjb21tYW5kKSAuICJcblxuIiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpKTsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb1VwZGF0ZShQYWNrYWdlSW50ZXJmYWNlICRpbml0aWFsLCBQYWNrYWdlSW50ZXJmYWNlICR0YXJnZXQsIHN0cmluZyAkcGF0aCwgc3RyaW5nICR1cmwpOiBQcm9taXNlSW50ZXJmYWNlCnsKJGhnVXRpbHMgPSBuZXcgSGdVdGlscygkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsICR0aGlzLT5wcm9jZXNzKTsKCiRyZWYgPSAkdGFyZ2V0LT5nZXRTb3VyY2VSZWZlcmVuY2UoKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgVXBkYXRpbmcgdG8gIi4kdGFyZ2V0LT5nZXRTb3VyY2VSZWZlcmVuY2UoKSk7CgppZiAoISR0aGlzLT5oYXNNZXRhZGF0YVJlcG9zaXRvcnkoJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIC5oZyBkaXJlY3RvcnkgaXMgbWlzc2luZyBmcm9tICcuJHBhdGguJywgc2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2NvbW1pdC1kZXBzIGZvciBtb3JlIGluZm9ybWF0aW9uJyk7Cn0KCiRjb21tYW5kID0gc3RhdGljIGZ1bmN0aW9uICgkdXJsKTogYXJyYXkgewpyZXR1cm4gWydoZycsICdwdWxsJywgJy0tJywgJHVybF07Cn07CiRoZ1V0aWxzLT5ydW5Db21tYW5kKCRjb21tYW5kLCAkdXJsLCAkcGF0aCk7CgokY29tbWFuZCA9IHN0YXRpYyBmdW5jdGlvbiAoKSB1c2UgKCRyZWYpOiBhcnJheSB7CnJldHVybiBbJ2hnJywgJ3VwJywgJy0tJywgJHJlZl07Cn07CiRoZ1V0aWxzLT5ydW5Db21tYW5kKCRjb21tYW5kLCAkdXJsLCAkcGF0aCk7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExvY2FsQ2hhbmdlcyhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiA/c3RyaW5nCnsKaWYgKCFpc19kaXIoJHBhdGguJy8uaGcnKSkgewpyZXR1cm4gbnVsbDsKfQoKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydoZycsICdzdCddLCAkb3V0cHV0LCByZWFscGF0aCgkcGF0aCkpOwoKJG91dHB1dCA9IHRyaW0oJG91dHB1dCk7CgpyZXR1cm4gc3RybGVuKCRvdXRwdXQpID4gMCA/ICRvdXRwdXQgOiBudWxsOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Q29tbWl0TG9ncyhzdHJpbmcgJGZyb21SZWZlcmVuY2UsIHN0cmluZyAkdG9SZWZlcmVuY2UsIHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CiRjb21tYW5kID0gWydoZycsICdsb2cnLCAnLXInLCAkZnJvbVJlZmVyZW5jZS4nOicuJHRvUmVmZXJlbmNlLCAnLS1zdHlsZScsICdjb21wYWN0J107CgppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRvdXRwdXQsIHJlYWxwYXRoKCRwYXRoKSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gaW1wbG9kZSgnICcsICRjb21tYW5kKSAuICJcblxuIiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpKTsKfQoKcmV0dXJuICRvdXRwdXQ7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBoYXNNZXRhZGF0YVJlcG9zaXRvcnkoc3RyaW5nICRwYXRoKTogYm9vbAp7CnJldHVybiBpc19kaXIoJHBhdGggLiAnLy5oZycpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7CgpjbGFzcyBNYXhGaWxlU2l6ZUV4Y2VlZGVkRXhjZXB0aW9uIGV4dGVuZHMgVHJhbnNwb3J0RXhjZXB0aW9uCnsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEFyY2hpdmVyXEFyY2hpdmFibGVGaWxlc0ZpbmRlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcRHVtcGVyXEFycmF5RHVtcGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25HdWVzc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmlsZXN5c3RlbVxFeGNlcHRpb25cSU9FeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxGaWxlc3lzdGVtXEZpbGVzeXN0ZW0gYXMgU3ltZm9ueUZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXEluc3RhbGxPcGVyYXRpb247CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXFVuaW5zdGFsbE9wZXJhdGlvbjsKCgoKCgoKCmNsYXNzIFBhdGhEb3dubG9hZGVyIGV4dGVuZHMgRmlsZURvd25sb2FkZXIgaW1wbGVtZW50cyBWY3NDYXBhYmxlRG93bmxvYWRlckludGVyZmFjZQp7CnByaXZhdGUgY29uc3QgU1RSQVRFR1lfU1lNTElOSyA9IDEwOwpwcml2YXRlIGNvbnN0IFNUUkFURUdZX01JUlJPUiA9IDIwOwoKCgoKcHVibGljIGZ1bmN0aW9uIGRvd25sb2FkKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCwgYm9vbCAkb3V0cHV0ID0gdHJ1ZSk6IFByb21pc2VJbnRlcmZhY2UKewokcGF0aCA9IEZpbGVzeXN0ZW06OnRyaW1UcmFpbGluZ1NsYXNoKCRwYXRoKTsKJHVybCA9ICRwYWNrYWdlLT5nZXREaXN0VXJsKCk7CmlmIChudWxsID09PSAkdXJsKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIHBhY2thZ2UgJy4kcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLicgaGFzIG5vIGRpc3QgdXJsIGNvbmZpZ3VyZWQsIGNhbm5vdCBkb3dubG9hZC4nKTsKfQokcmVhbFVybCA9IHJlYWxwYXRoKCR1cmwpOwppZiAoZmFsc2UgPT09ICRyZWFsVXJsIHx8ICFmaWxlX2V4aXN0cygkcmVhbFVybCkgfHwgIWlzX2RpcigkcmVhbFVybCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoCidTb3VyY2UgcGF0aCAiJXMiIGlzIG5vdCBmb3VuZCBmb3IgcGFja2FnZSAlcycsCiR1cmwsCiRwYWNrYWdlLT5nZXROYW1lKCkKKSk7Cn0KCmlmIChyZWFscGF0aCgkcGF0aCkgPT09ICRyZWFsVXJsKSB7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgppZiAoc3RycG9zKHJlYWxwYXRoKCRwYXRoKSAuIERJUkVDVE9SWV9TRVBBUkFUT1IsICRyZWFsVXJsIC4gRElSRUNUT1JZX1NFUEFSQVRPUikgPT09IDApIHsKCgoKCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKAonUGFja2FnZSAlcyBjYW5ub3QgaW5zdGFsbCB0byAiJXMiIGluc2lkZSBpdHMgc291cmNlIGF0ICIlcyInLAokcGFja2FnZS0+Z2V0TmFtZSgpLApyZWFscGF0aCgkcGF0aCksCiRyZWFsVXJsCikpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGluc3RhbGwoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBib29sICRvdXRwdXQgPSB0cnVlKTogUHJvbWlzZUludGVyZmFjZQp7CiRwYXRoID0gRmlsZXN5c3RlbTo6dHJpbVRyYWlsaW5nU2xhc2goJHBhdGgpOwokdXJsID0gJHBhY2thZ2UtPmdldERpc3RVcmwoKTsKaWYgKG51bGwgPT09ICR1cmwpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgcGFja2FnZSAnLiRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuJyBoYXMgbm8gZGlzdCB1cmwgY29uZmlndXJlZCwgY2Fubm90IGluc3RhbGwuJyk7Cn0KJHJlYWxVcmwgPSByZWFscGF0aCgkdXJsKTsKaWYgKGZhbHNlID09PSAkcmVhbFVybCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byByZWFscGF0aCAnLiR1cmwpOwp9CgppZiAocmVhbHBhdGgoJHBhdGgpID09PSAkcmVhbFVybCkgewppZiAoJG91dHB1dCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiAgLSAiIC4gSW5zdGFsbE9wZXJhdGlvbjo6Zm9ybWF0KCRwYWNrYWdlKSAuICR0aGlzLT5nZXRJbnN0YWxsT3BlcmF0aW9uQXBwZW5kaXgoJHBhY2thZ2UsICRwYXRoKSk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKJHRyYW5zcG9ydE9wdGlvbnMgPSAkcGFja2FnZS0+Z2V0VHJhbnNwb3J0T3B0aW9ucygpICsgWydyZWxhdGl2ZScgPT4gdHJ1ZV07CgpbJGN1cnJlbnRTdHJhdGVneSwgJGFsbG93ZWRTdHJhdGVnaWVzXSA9ICR0aGlzLT5jb21wdXRlQWxsb3dlZFN0cmF0ZWdpZXMoJHRyYW5zcG9ydE9wdGlvbnMpOwoKJHN5bWZvbnlGaWxlc3lzdGVtID0gbmV3IFN5bWZvbnlGaWxlc3lzdGVtKCk7CiR0aGlzLT5maWxlc3lzdGVtLT5yZW1vdmVEaXJlY3RvcnkoJHBhdGgpOwoKaWYgKCRvdXRwdXQpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgIC0gIiAuIEluc3RhbGxPcGVyYXRpb246OmZvcm1hdCgkcGFja2FnZSkuJzogJywgZmFsc2UpOwp9CgokaXNGYWxsYmFjayA9IGZhbHNlOwppZiAoc2VsZjo6U1RSQVRFR1lfU1lNTElOSyA9PT0gJGN1cnJlbnRTdHJhdGVneSkgewp0cnkgewppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CgppZiAoJG91dHB1dCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignSnVuY3Rpb25pbmcgZnJvbSAlcycsICR1cmwpLCBmYWxzZSk7Cn0KJHRoaXMtPmZpbGVzeXN0ZW0tPmp1bmN0aW9uKCRyZWFsVXJsLCAkcGF0aCk7Cn0gZWxzZSB7CiRwYXRoID0gcnRyaW0oJHBhdGgsICIvIik7CmlmICgkb3V0cHV0KSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCdTeW1saW5raW5nIGZyb20gJXMnLCAkdXJsKSwgZmFsc2UpOwp9CmlmICgkdHJhbnNwb3J0T3B0aW9uc1sncmVsYXRpdmUnXSA9PT0gdHJ1ZSkgewokYWJzb2x1dGVQYXRoID0gJHBhdGg7CmlmICghJHRoaXMtPmZpbGVzeXN0ZW0tPmlzQWJzb2x1dGVQYXRoKCRhYnNvbHV0ZVBhdGgpKSB7CiRhYnNvbHV0ZVBhdGggPSBQbGF0Zm9ybTo6Z2V0Q3dkKCkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHBhdGg7Cn0KJHNob3J0ZXN0UGF0aCA9ICR0aGlzLT5maWxlc3lzdGVtLT5maW5kU2hvcnRlc3RQYXRoKCRhYnNvbHV0ZVBhdGgsICRyZWFsVXJsLCBmYWxzZSwgdHJ1ZSk7CiRzeW1mb255RmlsZXN5c3RlbS0+c3ltbGluaygkc2hvcnRlc3RQYXRoLicvJywgJHBhdGgpOwp9IGVsc2Ugewokc3ltZm9ueUZpbGVzeXN0ZW0tPnN5bWxpbmsoJHJlYWxVcmwuJy8nLCAkcGF0aCk7Cn0KfQp9IGNhdGNoIChJT0V4Y2VwdGlvbiAkZSkgewppZiAoaW5fYXJyYXkoc2VsZjo6U1RSQVRFR1lfTUlSUk9SLCAkYWxsb3dlZFN0cmF0ZWdpZXMsIHRydWUpKSB7CmlmICgkb3V0cHV0KSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignJyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignICAgIDxlcnJvcj5TeW1saW5rIGZhaWxlZCwgZmFsbGJhY2sgdG8gdXNlIG1pcnJvcmluZyE8L2Vycm9yPicpOwp9CiRjdXJyZW50U3RyYXRlZ3kgPSBzZWxmOjpTVFJBVEVHWV9NSVJST1I7CiRpc0ZhbGxiYWNrID0gdHJ1ZTsKfSBlbHNlIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJ1N5bWxpbmsgZnJvbSAiJXMiIHRvICIlcyIgZmFpbGVkIScsICRyZWFsVXJsLCAkcGF0aCkpOwp9Cn0KfQoKCmlmIChzZWxmOjpTVFJBVEVHWV9NSVJST1IgPT09ICRjdXJyZW50U3RyYXRlZ3kpIHsKJHJlYWxVcmwgPSAkdGhpcy0+ZmlsZXN5c3RlbS0+bm9ybWFsaXplUGF0aCgkcmVhbFVybCk7CgppZiAoJG91dHB1dCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignJXNNaXJyb3JpbmcgZnJvbSAlcycsICRpc0ZhbGxiYWNrID8gJyAgICAnIDogJycsICR1cmwpLCBmYWxzZSk7Cn0KJGl0ZXJhdG9yID0gbmV3IEFyY2hpdmFibGVGaWxlc0ZpbmRlcigkcmVhbFVybCwgW10pOwokc3ltZm9ueUZpbGVzeXN0ZW0tPm1pcnJvcigkcmVhbFVybCwgJHBhdGgsICRpdGVyYXRvcik7Cn0KCmlmICgkb3V0cHV0KSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignJyk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgYm9vbCAkb3V0cHV0ID0gdHJ1ZSk6IFByb21pc2VJbnRlcmZhY2UKewokcGF0aCA9IEZpbGVzeXN0ZW06OnRyaW1UcmFpbGluZ1NsYXNoKCRwYXRoKTsKCgoKCgoKCgoKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiAkdGhpcy0+ZmlsZXN5c3RlbS0+aXNKdW5jdGlvbigkcGF0aCkpIHsKaWYgKCRvdXRwdXQpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgIC0gIiAuIFVuaW5zdGFsbE9wZXJhdGlvbjo6Zm9ybWF0KCRwYWNrYWdlKS4iLCBzb3VyY2UgaXMgc3RpbGwgcHJlc2VudCBpbiAkcGF0aCIpOwp9CmlmICghJHRoaXMtPmZpbGVzeXN0ZW0tPnJlbW92ZUp1bmN0aW9uKCRwYXRoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiAgICA8d2FybmluZz5Db3VsZCBub3QgcmVtb3ZlIGp1bmN0aW9uIGF0ICIgLiAkcGF0aCAuICIgLSBpcyBhbm90aGVyIHByb2Nlc3MgbG9ja2luZyBpdD88L3dhcm5pbmc+Iik7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IHJlbGlhYmx5IHJlbW92ZSBqdW5jdGlvbiBmb3IgcGFja2FnZSAnIC4gJHBhY2thZ2UtPmdldE5hbWUoKSk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgokdXJsID0gJHBhY2thZ2UtPmdldERpc3RVcmwoKTsKaWYgKG51bGwgPT09ICR1cmwpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgcGFja2FnZSAnLiRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuJyBoYXMgbm8gZGlzdCB1cmwgY29uZmlndXJlZCwgY2Fubm90IHJlbW92ZS4nKTsKfQoKCgoKCiRmcyA9IG5ldyBGaWxlc3lzdGVtOwokYWJzUGF0aCA9ICRmcy0+aXNBYnNvbHV0ZVBhdGgoJHBhdGgpID8gJHBhdGggOiBQbGF0Zm9ybTo6Z2V0Q3dkKCkgLiAnLycgLiAkcGF0aDsKJGFic0Rpc3RVcmwgPSAkZnMtPmlzQWJzb2x1dGVQYXRoKCR1cmwpID8gJHVybCA6IFBsYXRmb3JtOjpnZXRDd2QoKSAuICcvJyAuICR1cmw7CmlmICgkZnMtPm5vcm1hbGl6ZVBhdGgoJGFic1BhdGgpID09PSAkZnMtPm5vcm1hbGl6ZVBhdGgoJGFic0Rpc3RVcmwpKSB7CmlmICgkb3V0cHV0KSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiICAtICIgLiBVbmluc3RhbGxPcGVyYXRpb246OmZvcm1hdCgkcGFja2FnZSkuIiwgc291cmNlIGlzIHN0aWxsIHByZXNlbnQgaW4gJHBhdGgiKTsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCnJldHVybiBwYXJlbnQ6OnJlbW92ZSgkcGFja2FnZSwgJHBhdGgsICRvdXRwdXQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmNzUmVmZXJlbmNlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6ID9zdHJpbmcKewokcGF0aCA9IEZpbGVzeXN0ZW06OnRyaW1UcmFpbGluZ1NsYXNoKCRwYXRoKTsKJHBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyOwokZ3Vlc3NlciA9IG5ldyBWZXJzaW9uR3Vlc3NlcigkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2VzcywgJHBhcnNlciwgJHRoaXMtPmlvKTsKJGR1bXBlciA9IG5ldyBBcnJheUR1bXBlcjsKCiRwYWNrYWdlQ29uZmlnID0gJGR1bXBlci0+ZHVtcCgkcGFja2FnZSk7CiRwYWNrYWdlVmVyc2lvbiA9ICRndWVzc2VyLT5ndWVzc1ZlcnNpb24oJHBhY2thZ2VDb25maWcsICRwYXRoKTsKaWYgKCRwYWNrYWdlVmVyc2lvbiAhPT0gbnVsbCkgewpyZXR1cm4gJHBhY2thZ2VWZXJzaW9uWydjb21taXQnXTsKfQoKcmV0dXJuIG51bGw7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRJbnN0YWxsT3BlcmF0aW9uQXBwZW5kaXgoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKJHVybCA9ICRwYWNrYWdlLT5nZXREaXN0VXJsKCk7CmlmIChudWxsID09PSAkdXJsKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIHBhY2thZ2UgJy4kcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLicgaGFzIG5vIGRpc3QgdXJsIGNvbmZpZ3VyZWQsIGNhbm5vdCBpbnN0YWxsLicpOwp9CiRyZWFsVXJsID0gcmVhbHBhdGgoJHVybCk7CmlmIChmYWxzZSA9PT0gJHJlYWxVcmwpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gcmVhbHBhdGggJy4kdXJsKTsKfQoKaWYgKHJlYWxwYXRoKCRwYXRoKSA9PT0gJHJlYWxVcmwpIHsKcmV0dXJuICc6IFNvdXJjZSBhbHJlYWR5IHByZXNlbnQnOwp9CgpbJGN1cnJlbnRTdHJhdGVneV0gPSAkdGhpcy0+Y29tcHV0ZUFsbG93ZWRTdHJhdGVnaWVzKCRwYWNrYWdlLT5nZXRUcmFuc3BvcnRPcHRpb25zKCkpOwoKaWYgKCRjdXJyZW50U3RyYXRlZ3kgPT09IHNlbGY6OlNUUkFURUdZX1NZTUxJTkspIHsKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewpyZXR1cm4gJzogSnVuY3Rpb25pbmcgZnJvbSAnLiRwYWNrYWdlLT5nZXREaXN0VXJsKCk7Cn0KCnJldHVybiAnOiBTeW1saW5raW5nIGZyb20gJy4kcGFja2FnZS0+Z2V0RGlzdFVybCgpOwp9CgpyZXR1cm4gJzogTWlycm9yaW5nIGZyb20gJy4kcGFja2FnZS0+Z2V0RGlzdFVybCgpOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gY29tcHV0ZUFsbG93ZWRTdHJhdGVnaWVzKGFycmF5ICR0cmFuc3BvcnRPcHRpb25zKTogYXJyYXkKewoKJGN1cnJlbnRTdHJhdGVneSA9IHNlbGY6OlNUUkFURUdZX1NZTUxJTks7CiRhbGxvd2VkU3RyYXRlZ2llcyA9IFtzZWxmOjpTVFJBVEVHWV9TWU1MSU5LLCBzZWxmOjpTVFJBVEVHWV9NSVJST1JdOwoKJG1pcnJvclBhdGhSZXBvcyA9IFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX01JUlJPUl9QQVRIX1JFUE9TJyk7CmlmICgoYm9vbCkgJG1pcnJvclBhdGhSZXBvcykgewokY3VycmVudFN0cmF0ZWd5ID0gc2VsZjo6U1RSQVRFR1lfTUlSUk9SOwp9Cgokc3ltbGlua09wdGlvbiA9ICR0cmFuc3BvcnRPcHRpb25zWydzeW1saW5rJ10gPz8gbnVsbDsKCmlmICh0cnVlID09PSAkc3ltbGlua09wdGlvbikgewokY3VycmVudFN0cmF0ZWd5ID0gc2VsZjo6U1RSQVRFR1lfU1lNTElOSzsKJGFsbG93ZWRTdHJhdGVnaWVzID0gW3NlbGY6OlNUUkFURUdZX1NZTUxJTktdOwp9IGVsc2VpZiAoZmFsc2UgPT09ICRzeW1saW5rT3B0aW9uKSB7CiRjdXJyZW50U3RyYXRlZ3kgPSBzZWxmOjpTVFJBVEVHWV9NSVJST1I7CiRhbGxvd2VkU3RyYXRlZ2llcyA9IFtzZWxmOjpTVFJBVEVHWV9NSVJST1JdOwp9CgoKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiBzZWxmOjpTVFJBVEVHWV9TWU1MSU5LID09PSAkY3VycmVudFN0cmF0ZWd5ICYmICEkdGhpcy0+c2FmZUp1bmN0aW9ucygpKSB7CmlmICghaW5fYXJyYXkoc2VsZjo6U1RSQVRFR1lfTUlSUk9SLCAkYWxsb3dlZFN0cmF0ZWdpZXMsIHRydWUpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignWW91IGFyZSBvbiBhbiBvbGQgV2luZG93cyAvIG9sZCBQSFAgY29tYm8gd2hpY2ggZG9lcyBub3QgYWxsb3cgQ29tcG9zZXIgdG8gdXNlIGp1bmN0aW9ucy9zeW1saW5rcyBhbmQgdGhpcyBwYXRoIHJlcG9zaXRvcnkgaGFzIHN5bWxpbms6dHJ1ZSBpbiBpdHMgb3B0aW9ucyBzbyBjb3B5aW5nIGlzIG5vdCBhbGxvd2VkJyk7Cn0KJGN1cnJlbnRTdHJhdGVneSA9IHNlbGY6OlNUUkFURUdZX01JUlJPUjsKJGFsbG93ZWRTdHJhdGVnaWVzID0gW3NlbGY6OlNUUkFURUdZX01JUlJPUl07Cn0KCgppZiAoIVBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiBzZWxmOjpTVFJBVEVHWV9TWU1MSU5LID09PSAkY3VycmVudFN0cmF0ZWd5ICYmICFmdW5jdGlvbl9leGlzdHMoJ3N5bWxpbmsnKSkgewppZiAoIWluX2FycmF5KHNlbGY6OlNUUkFURUdZX01JUlJPUiwgJGFsbG93ZWRTdHJhdGVnaWVzLCB0cnVlKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1lvdXIgUEhQIGhhcyB0aGUgc3ltbGluaygpIGZ1bmN0aW9uIGRpc2FibGVkIHdoaWNoIGRvZXMgbm90IGFsbG93IENvbXBvc2VyIHRvIHVzZSBzeW1saW5rcyBhbmQgdGhpcyBwYXRoIHJlcG9zaXRvcnkgaGFzIHN5bWxpbms6dHJ1ZSBpbiBpdHMgb3B0aW9ucyBzbyBjb3B5aW5nIGlzIG5vdCBhbGxvd2VkJyk7Cn0KJGN1cnJlbnRTdHJhdGVneSA9IHNlbGY6OlNUUkFURUdZX01JUlJPUjsKJGFsbG93ZWRTdHJhdGVnaWVzID0gW3NlbGY6OlNUUkFURUdZX01JUlJPUl07Cn0KCnJldHVybiBbJGN1cnJlbnRTdHJhdGVneSwgJGFsbG93ZWRTdHJhdGVnaWVzXTsKfQoKCgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHNhZmVKdW5jdGlvbnMoKTogYm9vbAp7CgpyZXR1cm4gZnVuY3Rpb25fZXhpc3RzKCdwcm9jX29wZW4nKSAmJgooUEhQX1dJTkRPV1NfVkVSU0lPTl9NQUpPUiA+IDYgfHwKKFBIUF9XSU5ET1dTX1ZFUlNJT05fTUFKT1IgPT09IDYgJiYgUEhQX1dJTkRPV1NfVkVSU0lPTl9NSU5PUiA+PSAxKSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFZjc1JlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxVdGlsXFBlcmZvcmNlOwoKCgoKY2xhc3MgUGVyZm9yY2VEb3dubG9hZGVyIGV4dGVuZHMgVmNzRG93bmxvYWRlcgp7Cgpwcm90ZWN0ZWQgJHBlcmZvcmNlOwoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvRG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGRvSW5zdGFsbChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsKTogUHJvbWlzZUludGVyZmFjZQp7CiRyZWYgPSAkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCk7CiRsYWJlbCA9ICR0aGlzLT5nZXRMYWJlbEZyb21Tb3VyY2VSZWZlcmVuY2UoKHN0cmluZykgJHJlZik7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0Nsb25pbmcgJyAuICRyZWYpOwokdGhpcy0+aW5pdFBlcmZvcmNlKCRwYWNrYWdlLCAkcGF0aCwgJHVybCk7CiR0aGlzLT5wZXJmb3JjZS0+c2V0U3RyZWFtKCRyZWYpOwokdGhpcy0+cGVyZm9yY2UtPnA0TG9naW4oKTsKJHRoaXMtPnBlcmZvcmNlLT53cml0ZVA0Q2xpZW50U3BlYygpOwokdGhpcy0+cGVyZm9yY2UtPmNvbm5lY3RDbGllbnQoKTsKJHRoaXMtPnBlcmZvcmNlLT5zeW5jQ29kZUJhc2UoJGxhYmVsKTsKJHRoaXMtPnBlcmZvcmNlLT5jbGVhbnVwQ2xpZW50U3BlYygpOwoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0TGFiZWxGcm9tU291cmNlUmVmZXJlbmNlKHN0cmluZyAkcmVmKTogP3N0cmluZwp7CiRwb3MgPSBzdHJwb3MoJHJlZiwgJ0AnKTsKaWYgKGZhbHNlICE9PSAkcG9zKSB7CnJldHVybiBzdWJzdHIoJHJlZiwgJHBvcyArIDEpOwp9CgpyZXR1cm4gbnVsbDsKfQoKcHVibGljIGZ1bmN0aW9uIGluaXRQZXJmb3JjZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsKTogdm9pZAp7CmlmICghZW1wdHkoJHRoaXMtPnBlcmZvcmNlKSkgewokdGhpcy0+cGVyZm9yY2UtPmluaXRpYWxpemVQYXRoKCRwYXRoKTsKCnJldHVybjsKfQoKJHJlcG9zaXRvcnkgPSAkcGFja2FnZS0+Z2V0UmVwb3NpdG9yeSgpOwokcmVwb0NvbmZpZyA9IG51bGw7CmlmICgkcmVwb3NpdG9yeSBpbnN0YW5jZW9mIFZjc1JlcG9zaXRvcnkpIHsKJHJlcG9Db25maWcgPSAkdGhpcy0+Z2V0UmVwb0NvbmZpZygkcmVwb3NpdG9yeSk7Cn0KJHRoaXMtPnBlcmZvcmNlID0gUGVyZm9yY2U6OmNyZWF0ZSgkcmVwb0NvbmZpZywgJHVybCwgJHBhdGgsICR0aGlzLT5wcm9jZXNzLCAkdGhpcy0+aW8pOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFJlcG9Db25maWcoVmNzUmVwb3NpdG9yeSAkcmVwb3NpdG9yeSk6IGFycmF5CnsKcmV0dXJuICRyZXBvc2l0b3J5LT5nZXRSZXBvQ29uZmlnKCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb1VwZGF0ZShQYWNrYWdlSW50ZXJmYWNlICRpbml0aWFsLCBQYWNrYWdlSW50ZXJmYWNlICR0YXJnZXQsIHN0cmluZyAkcGF0aCwgc3RyaW5nICR1cmwpOiBQcm9taXNlSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5kb0luc3RhbGwoJHRhcmdldCwgJHBhdGgsICR1cmwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG9jYWxDaGFuZ2VzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6ID9zdHJpbmcKewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1BlcmZvcmNlIGRyaXZlciBkb2VzIG5vdCBjaGVjayBmb3IgbG9jYWwgY2hhbmdlcyBiZWZvcmUgb3ZlcnJpZGluZycpOwoKcmV0dXJuIG51bGw7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRDb21taXRMb2dzKHN0cmluZyAkZnJvbVJlZmVyZW5jZSwgc3RyaW5nICR0b1JlZmVyZW5jZSwgc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5wZXJmb3JjZS0+Z2V0Q29tbWl0TG9ncygkZnJvbVJlZmVyZW5jZSwgJHRvUmVmZXJlbmNlKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFBlcmZvcmNlKFBlcmZvcmNlICRwZXJmb3JjZSk6IHZvaWQKewokdGhpcy0+cGVyZm9yY2UgPSAkcGVyZm9yY2U7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBoYXNNZXRhZGF0YVJlcG9zaXRvcnkoc3RyaW5nICRwYXRoKTogYm9vbAp7CnJldHVybiB0cnVlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBQaGFyRG93bmxvYWRlciBleHRlbmRzIEFyY2hpdmVEb3dubG9hZGVyCnsKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4dHJhY3QoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRmaWxlLCBzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlCnsKCiRhcmNoaXZlID0gbmV3IFxQaGFyKCRmaWxlKTsKJGFyY2hpdmUtPmV4dHJhY3RUbygkcGF0aCwgbnVsbCwgdHJ1ZSk7CgoKCgoKCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcVXRpbFxJbmlIZWxwZXI7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgUmFyQXJjaGl2ZTsKCgoKCgoKCgpjbGFzcyBSYXJEb3dubG9hZGVyIGV4dGVuZHMgQXJjaGl2ZURvd25sb2FkZXIKewpwcm90ZWN0ZWQgZnVuY3Rpb24gZXh0cmFjdChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJGZpbGUsIHN0cmluZyAkcGF0aCk6IFByb21pc2VJbnRlcmZhY2UKewokcHJvY2Vzc0Vycm9yID0gbnVsbDsKCgppZiAoIVBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewokY29tbWFuZCA9IFsnc2gnLCAnLWMnLCAndW5yYXIgeCAtLSAiJDAiICIkMSIgPi9kZXYvbnVsbCAmJiBjaG1vZCAtUiB1K3cgIiQxIicsICRmaWxlLCAkcGF0aF07CgppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRpZ25vcmVkT3V0cHV0KSkgewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKJHByb2Nlc3NFcnJvciA9ICdGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gaW1wbG9kZSgnICcsICRjb21tYW5kKSAuICJcblxuIiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpOwp9CgppZiAoIWNsYXNzX2V4aXN0cygnUmFyQXJjaGl2ZScpKSB7CgokaW5pTWVzc2FnZSA9IEluaUhlbHBlcjo6Z2V0TWVzc2FnZSgpOwoKJGVycm9yID0gIkNvdWxkIG5vdCBkZWNvbXByZXNzIHRoZSBhcmNoaXZlLCBlbmFibGUgdGhlIFBIUCByYXIgZXh0ZW5zaW9uIG9yIGluc3RhbGwgdW5yYXIuXG4iCi4gJGluaU1lc3NhZ2UgLiAiXG4iIC4gJHByb2Nlc3NFcnJvcjsKCmlmICghUGxhdGZvcm06OmlzV2luZG93cygpKSB7CiRlcnJvciA9ICJDb3VsZCBub3QgZGVjb21wcmVzcyB0aGUgYXJjaGl2ZSwgZW5hYmxlIHRoZSBQSFAgcmFyIGV4dGVuc2lvbi5cbiIgLiAkaW5pTWVzc2FnZTsKfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRlcnJvcik7Cn0KCiRyYXJBcmNoaXZlID0gUmFyQXJjaGl2ZTo6b3BlbigkZmlsZSk7CgppZiAoZmFsc2UgPT09ICRyYXJBcmNoaXZlKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdDb3VsZCBub3Qgb3BlbiBSQVIgYXJjaGl2ZTogJyAuICRmaWxlKTsKfQoKJGVudHJpZXMgPSAkcmFyQXJjaGl2ZS0+Z2V0RW50cmllcygpOwoKaWYgKGZhbHNlID09PSAkZW50cmllcykgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCByZXRyaWV2ZSBSQVIgYXJjaGl2ZSBlbnRyaWVzJyk7Cn0KCmZvcmVhY2ggKCRlbnRyaWVzIGFzICRlbnRyeSkgewppZiAoZmFsc2UgPT09ICRlbnRyeS0+ZXh0cmFjdCgkcGF0aCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgZXh0cmFjdCBlbnRyeScpOwp9Cn0KCiRyYXJBcmNoaXZlLT5jbG9zZSgpOwoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXFN2biBhcyBTdm5VdGlsOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NSZXBvc2l0b3J5Owp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwoKCgoKCmNsYXNzIFN2bkRvd25sb2FkZXIgZXh0ZW5kcyBWY3NEb3dubG9hZGVyCnsKCnByb3RlY3RlZCAkY2FjaGVDcmVkZW50aWFscyA9IHRydWU7CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9Eb3dubG9hZChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7ClN2blV0aWw6OmNsZWFuRW52KCk7CiR1dGlsID0gbmV3IFN2blV0aWwoJHVybCwgJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2Vzcyk7CmlmIChudWxsID09PSAkdXRpbC0+YmluYXJ5VmVyc2lvbigpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignc3ZuIHdhcyBub3QgZm91bmQgaW4geW91ciBQQVRILCBza2lwcGluZyBzb3VyY2UgZG93bmxvYWQnKTsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb0luc3RhbGwoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCk6IFByb21pc2VJbnRlcmZhY2UKewpTdm5VdGlsOjpjbGVhbkVudigpOwokcmVmID0gJHBhY2thZ2UtPmdldFNvdXJjZVJlZmVyZW5jZSgpOwoKJHJlcG8gPSAkcGFja2FnZS0+Z2V0UmVwb3NpdG9yeSgpOwppZiAoJHJlcG8gaW5zdGFuY2VvZiBWY3NSZXBvc2l0b3J5KSB7CiRyZXBvQ29uZmlnID0gJHJlcG8tPmdldFJlcG9Db25maWcoKTsKaWYgKGFycmF5X2tleV9leGlzdHMoJ3N2bi1jYWNoZS1jcmVkZW50aWFscycsICRyZXBvQ29uZmlnKSkgewokdGhpcy0+Y2FjaGVDcmVkZW50aWFscyA9IChib29sKSAkcmVwb0NvbmZpZ1snc3ZuLWNhY2hlLWNyZWRlbnRpYWxzJ107Cn0KfQoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgQ2hlY2tpbmcgb3V0ICIuJHBhY2thZ2UtPmdldFNvdXJjZVJlZmVyZW5jZSgpKTsKJHRoaXMtPmV4ZWN1dGUoJHBhY2thZ2UsICR1cmwsIFsnc3ZuJywgJ2NvJ10sIHNwcmludGYoIiVzLyVzIiwgJHVybCwgJHJlZiksIG51bGwsICRwYXRoKTsKCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9VcGRhdGUoUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0LCBzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsKTogUHJvbWlzZUludGVyZmFjZQp7ClN2blV0aWw6OmNsZWFuRW52KCk7CiRyZWYgPSAkdGFyZ2V0LT5nZXRTb3VyY2VSZWZlcmVuY2UoKTsKCmlmICghJHRoaXMtPmhhc01ldGFkYXRhUmVwb3NpdG9yeSgkcGF0aCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgLnN2biBkaXJlY3RvcnkgaXMgbWlzc2luZyBmcm9tICcuJHBhdGguJywgc2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2NvbW1pdC1kZXBzIGZvciBtb3JlIGluZm9ybWF0aW9uJyk7Cn0KCiR1dGlsID0gbmV3IFN2blV0aWwoJHVybCwgJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2Vzcyk7CiRmbGFncyA9IFtdOwppZiAodmVyc2lvbl9jb21wYXJlKCR1dGlsLT5iaW5hcnlWZXJzaW9uKCksICcxLjcuMCcsICc+PScpKSB7CiRmbGFnc1tdID0gJy0taWdub3JlLWFuY2VzdHJ5JzsKfQoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgQ2hlY2tpbmcgb3V0ICIgLiAkcmVmKTsKJHRoaXMtPmV4ZWN1dGUoJHRhcmdldCwgJHVybCwgYXJyYXlfbWVyZ2UoWydzdm4nLCAnc3dpdGNoJ10sICRmbGFncyksIHNwcmludGYoIiVzLyVzIiwgJHVybCwgJHJlZiksICRwYXRoKTsKCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG9jYWxDaGFuZ2VzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6ID9zdHJpbmcKewppZiAoISR0aGlzLT5oYXNNZXRhZGF0YVJlcG9zaXRvcnkoJHBhdGgpKSB7CnJldHVybiBudWxsOwp9CgokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ3N2bicsICdzdGF0dXMnLCAnLS1pZ25vcmUtZXh0ZXJuYWxzJ10sICRvdXRwdXQsICRwYXRoKTsKCnJldHVybiBQcmVnOjppc01hdGNoKCd7XiAqW15YIF0gK31tJywgJG91dHB1dCkgPyAkb3V0cHV0IDogbnVsbDsKfQoKCgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJGJhc2VVcmwsIGFycmF5ICRjb21tYW5kLCBzdHJpbmcgJHVybCwgP3N0cmluZyAkY3dkID0gbnVsbCwgP3N0cmluZyAkcGF0aCA9IG51bGwpOiBzdHJpbmcKewokdXRpbCA9IG5ldyBTdm5VdGlsKCRiYXNlVXJsLCAkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsICR0aGlzLT5wcm9jZXNzKTsKJHV0aWwtPnNldENhY2hlQ3JlZGVudGlhbHMoJHRoaXMtPmNhY2hlQ3JlZGVudGlhbHMpOwp0cnkgewpyZXR1cm4gJHV0aWwtPmV4ZWN1dGUoJGNvbW1hbmQsICR1cmwsICRjd2QsICRwYXRoLCAkdGhpcy0+aW8tPmlzVmVyYm9zZSgpKTsKfSBjYXRjaCAoXFJ1bnRpbWVFeGNlcHRpb24gJGUpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKAokcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLicgY291bGQgbm90IGJlIGRvd25sb2FkZWQsICcuJGUtPmdldE1lc3NhZ2UoKQopOwp9Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjbGVhbkNoYW5nZXMoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBib29sICR1cGRhdGUpOiBQcm9taXNlSW50ZXJmYWNlCnsKaWYgKG51bGwgPT09ICgkY2hhbmdlcyA9ICR0aGlzLT5nZXRMb2NhbENoYW5nZXMoJHBhY2thZ2UsICRwYXRoKSkpIHsKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCmlmICghJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkpIHsKaWYgKHRydWUgPT09ICR0aGlzLT5jb25maWctPmdldCgnZGlzY2FyZC1jaGFuZ2VzJykpIHsKcmV0dXJuICR0aGlzLT5kaXNjYXJkQ2hhbmdlcygkcGF0aCk7Cn0KCnJldHVybiBwYXJlbnQ6OmNsZWFuQ2hhbmdlcygkcGFja2FnZSwgJHBhdGgsICR1cGRhdGUpOwp9CgokY2hhbmdlcyA9IGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRlbGVtKTogc3RyaW5nIHsKcmV0dXJuICcgICAgJy4kZWxlbTsKfSwgUHJlZzo6c3BsaXQoJ3tccypccj9cblxzKn0nLCAkY2hhbmdlcykpOwokY291bnRDaGFuZ2VzID0gY291bnQoJGNoYW5nZXMpOwokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignICAgIDxlcnJvcj4nLiRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuJyBoYXMgbW9kaWZpZWQgZmlsZSVzOjwvZXJyb3I+JywgJGNvdW50Q2hhbmdlcyA9PT0gMSA/ICcnIDogJ3MnKSk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihhcnJheV9zbGljZSgkY2hhbmdlcywgMCwgMTApKTsKaWYgKCRjb3VudENoYW5nZXMgPiAxMCkgewokcmVtYWluaW5nQ2hhbmdlcyA9ICRjb3VudENoYW5nZXMgLSAxMDsKJHRoaXMtPmlvLT53cml0ZUVycm9yKApzcHJpbnRmKAonICAgIDxpbmZvPicuJHJlbWFpbmluZ0NoYW5nZXMuJyBtb3JlIGZpbGUlcyBtb2RpZmllZCwgY2hvb3NlICJ2IiB0byB2aWV3IHRoZSBmdWxsIGxpc3Q8L2luZm8+JywKJHJlbWFpbmluZ0NoYW5nZXMgPT09IDEgPyAnJyA6ICdzJwopCik7Cn0KCndoaWxlICh0cnVlKSB7CnN3aXRjaCAoJHRoaXMtPmlvLT5hc2soJyAgICA8aW5mbz5EaXNjYXJkIGNoYW5nZXMgW3ksbix2LD9dPzwvaW5mbz4gJywgJz8nKSkgewpjYXNlICd5JzoKJHRoaXMtPmRpc2NhcmRDaGFuZ2VzKCRwYXRoKTsKYnJlYWsgMjsKCmNhc2UgJ24nOgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1VwZGF0ZSBhYm9ydGVkJyk7CgpjYXNlICd2JzoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRjaGFuZ2VzKTsKYnJlYWs7CgpjYXNlICc/JzoKZGVmYXVsdDoKJHRoaXMtPmlvLT53cml0ZUVycm9yKFsKJyAgICB5IC0gZGlzY2FyZCBjaGFuZ2VzIGFuZCBhcHBseSB0aGUgJy4oJHVwZGF0ZSA/ICd1cGRhdGUnIDogJ3VuaW5zdGFsbCcpLAonICAgIG4gLSBhYm9ydCB0aGUgJy4oJHVwZGF0ZSA/ICd1cGRhdGUnIDogJ3VuaW5zdGFsbCcpLicgYW5kIGxldCB5b3UgbWFudWFsbHkgY2xlYW4gdGhpbmdzIHVwJywKJyAgICB2IC0gdmlldyBtb2RpZmllZCBmaWxlcycsCicgICAgPyAtIHByaW50IGhlbHAnLApdKTsKYnJlYWs7Cn0KfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRDb21taXRMb2dzKHN0cmluZyAkZnJvbVJlZmVyZW5jZSwgc3RyaW5nICR0b1JlZmVyZW5jZSwgc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKaWYgKFByZWc6OmlzTWF0Y2goJ3tAKFxkKykkfScsICRmcm9tUmVmZXJlbmNlKSAmJiBQcmVnOjppc01hdGNoKCd7QChcZCspJH0nLCAkdG9SZWZlcmVuY2UpKSB7CgokY29tbWFuZCA9IFsnc3ZuJywgJ2luZm8nLCAnLS1ub24taW50ZXJhY3RpdmUnLCAnLS14bWwnLCAnLS0nLCAkcGF0aF07CmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY29tbWFuZCwgJG91dHB1dCwgJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigKJ0ZhaWxlZCB0byBleGVjdXRlICcgLiBpbXBsb2RlKCcgJywgJGNvbW1hbmQpIC4gIlxuXG4iIC4gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCkKKTsKfQoKJHVybFBhdHRlcm4gPSAnIzx1cmw+KC4qKTwvdXJsPiMnOwppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygkdXJsUGF0dGVybiwgJG91dHB1dCwgJG1hdGNoZXMpKSB7CiRiYXNlVXJsID0gJG1hdGNoZXNbMV07Cn0gZWxzZSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigKJ1VuYWJsZSB0byBkZXRlcm1pbmUgc3ZuIHVybCBmb3IgcGF0aCAnLiAkcGF0aAopOwp9CgoKJGZyb21SZXZpc2lvbiA9IFByZWc6OnJlcGxhY2UoJ3suKkAoXGQrKSR9JywgJyQxJywgJGZyb21SZWZlcmVuY2UpOwokdG9SZXZpc2lvbiA9IFByZWc6OnJlcGxhY2UoJ3suKkAoXGQrKSR9JywgJyQxJywgJHRvUmVmZXJlbmNlKTsKCiRjb21tYW5kID0gWydzdm4nLCAnbG9nJywgJy1yJywgJGZyb21SZXZpc2lvbi4nOicuJHRvUmV2aXNpb24sICctLWluY3JlbWVudGFsJ107CgokdXRpbCA9IG5ldyBTdm5VdGlsKCRiYXNlVXJsLCAkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsICR0aGlzLT5wcm9jZXNzKTsKJHV0aWwtPnNldENhY2hlQ3JlZGVudGlhbHMoJHRoaXMtPmNhY2hlQ3JlZGVudGlhbHMpOwp0cnkgewpyZXR1cm4gJHV0aWwtPmV4ZWN1dGVMb2NhbCgkY29tbWFuZCwgJHBhdGgsIG51bGwsICR0aGlzLT5pby0+aXNWZXJib3NlKCkpOwp9IGNhdGNoIChcUnVudGltZUV4Y2VwdGlvbiAkZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCidGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gaW1wbG9kZSgnICcsICRjb21tYW5kKSAuICJcblxuIi4kZS0+Z2V0TWVzc2FnZSgpCik7Cn0KfQoKcmV0dXJuICJDb3VsZCBub3QgcmV0cmlldmUgY2hhbmdlcyBiZXR3ZWVuICRmcm9tUmVmZXJlbmNlIGFuZCAkdG9SZWZlcmVuY2UgZHVlIHRvIG1pc3NpbmcgcmV2aXNpb24gaW5mb3JtYXRpb24iOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGlzY2FyZENoYW5nZXMoc3RyaW5nICRwYXRoKTogUHJvbWlzZUludGVyZmFjZQp7CmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ3N2bicsICdyZXZlcnQnLCAnLVInLCAnLiddLCAkb3V0cHV0LCAkcGF0aCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgcmVzZXQgY2hhbmdlc1xuXG46Ii4kdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaGFzTWV0YWRhdGFSZXBvc2l0b3J5KHN0cmluZyAkcGF0aCk6IGJvb2wKewpyZXR1cm4gaXNfZGlyKCRwYXRoLicvLnN2bicpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBUYXJEb3dubG9hZGVyIGV4dGVuZHMgQXJjaGl2ZURvd25sb2FkZXIKewoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXh0cmFjdChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJGZpbGUsIHN0cmluZyAkcGF0aCk6IFByb21pc2VJbnRlcmZhY2UKewoKJGFyY2hpdmUgPSBuZXcgXFBoYXJEYXRhKCRmaWxlKTsKJGFyY2hpdmUtPmV4dHJhY3RUbygkcGF0aCwgbnVsbCwgdHJ1ZSk7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKCgoKY2xhc3MgVHJhbnNwb3J0RXhjZXB0aW9uIGV4dGVuZHMgXFJ1bnRpbWVFeGNlcHRpb24KewoKcHJvdGVjdGVkICRoZWFkZXJzOwoKcHJvdGVjdGVkICRyZXNwb25zZTsKCnByb3RlY3RlZCAkc3RhdHVzQ29kZTsKCnByb3RlY3RlZCAkcmVzcG9uc2VJbmZvID0gW107CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRtZXNzYWdlID0gIiIsIGludCAkY29kZSA9IDQwMCwgP1xUaHJvd2FibGUgJHByZXZpb3VzID0gbnVsbCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlLCAkY29kZSwgJHByZXZpb3VzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEhlYWRlcnMoYXJyYXkgJGhlYWRlcnMpOiB2b2lkCnsKJHRoaXMtPmhlYWRlcnMgPSAkaGVhZGVyczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEhlYWRlcnMoKTogP2FycmF5CnsKcmV0dXJuICR0aGlzLT5oZWFkZXJzOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVzcG9uc2UoP3N0cmluZyAkcmVzcG9uc2UpOiB2b2lkCnsKJHRoaXMtPnJlc3BvbnNlID0gJHJlc3BvbnNlOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVzcG9uc2UoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+cmVzcG9uc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRTdGF0dXNDb2RlKCRzdGF0dXNDb2RlKTogdm9pZAp7CiR0aGlzLT5zdGF0dXNDb2RlID0gJHN0YXR1c0NvZGU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTdGF0dXNDb2RlKCk6ID9pbnQKewpyZXR1cm4gJHRoaXMtPnN0YXR1c0NvZGU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXNwb25zZUluZm8oKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnJlc3BvbnNlSW5mbzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJlc3BvbnNlSW5mbyhhcnJheSAkcmVzcG9uc2VJbmZvKTogdm9pZAp7CiR0aGlzLT5yZXNwb25zZUluZm8gPSAkcmVzcG9uc2VJbmZvOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwoKCgoKCgppbnRlcmZhY2UgVmNzQ2FwYWJsZURvd25sb2FkZXJJbnRlcmZhY2UKewoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFZjc1JlZmVyZW5jZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiA/c3RyaW5nOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXFBhY2thZ2VcRHVtcGVyXEFycmF5RHVtcGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25HdWVzc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxVcGRhdGVPcGVyYXRpb247CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXEluc3RhbGxPcGVyYXRpb247CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXFVuaW5zdGFsbE9wZXJhdGlvbjsKCgoKCmFic3RyYWN0IGNsYXNzIFZjc0Rvd25sb2FkZXIgaW1wbGVtZW50cyBEb3dubG9hZGVySW50ZXJmYWNlLCBDaGFuZ2VSZXBvcnRJbnRlcmZhY2UsIFZjc0NhcGFibGVEb3dubG9hZGVySW50ZXJmYWNlCnsKCnByb3RlY3RlZCAkaW87Cgpwcm90ZWN0ZWQgJGNvbmZpZzsKCnByb3RlY3RlZCAkcHJvY2VzczsKCnByb3RlY3RlZCAkZmlsZXN5c3RlbTsKCnByb3RlY3RlZCAkaGFzQ2xlYW5lZENoYW5nZXMgPSBbXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCA/UHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzID0gbnVsbCwgP0ZpbGVzeXN0ZW0gJGZzID0gbnVsbCkKewokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwokdGhpcy0+cHJvY2VzcyA9ICRwcm9jZXNzID8/IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKJHRoaXMtPmZpbGVzeXN0ZW0gPSAkZnMgPz8gbmV3IEZpbGVzeXN0ZW0oJHRoaXMtPnByb2Nlc3MpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5zdGFsbGF0aW9uU291cmNlKCk6IHN0cmluZwp7CnJldHVybiAnc291cmNlJzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGRvd25sb2FkKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewppZiAoISRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUGFja2FnZSAnLiRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuJyBpcyBtaXNzaW5nIHJlZmVyZW5jZSBpbmZvcm1hdGlvbicpOwp9CgokdXJscyA9ICR0aGlzLT5wcmVwYXJlVXJscygkcGFja2FnZS0+Z2V0U291cmNlVXJscygpKTsKCndoaWxlICgkdXJsID0gYXJyYXlfc2hpZnQoJHVybHMpKSB7CnRyeSB7CnJldHVybiAkdGhpcy0+ZG9Eb3dubG9hZCgkcGFja2FnZSwgJHBhdGgsICR1cmwsICRwcmV2UGFja2FnZSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKCmlmICgkZSBpbnN0YW5jZW9mIFxQSFBVbml0XEZyYW1ld29ya1xFeGNlcHRpb24pIHsKdGhyb3cgJGU7Cn0KaWYgKCR0aGlzLT5pby0+aXNEZWJ1ZygpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignRmFpbGVkOiBbJy5nZXRfY2xhc3MoJGUpLiddICcuJGUtPmdldE1lc3NhZ2UoKSk7Cn0gZWxzZWlmIChjb3VudCgkdXJscykpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgRmFpbGVkLCB0cnlpbmcgdGhlIG5leHQgVVJMJyk7Cn0KaWYgKCFjb3VudCgkdXJscykpIHsKdGhyb3cgJGU7Cn0KfQp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHByZXBhcmUoc3RyaW5nICR0eXBlLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlCnsKaWYgKCR0eXBlID09PSAndXBkYXRlJykgewokdGhpcy0+Y2xlYW5DaGFuZ2VzKCRwcmV2UGFja2FnZSwgJHBhdGgsIHRydWUpOwokdGhpcy0+aGFzQ2xlYW5lZENoYW5nZXNbJHByZXZQYWNrYWdlLT5nZXRVbmlxdWVOYW1lKCldID0gdHJ1ZTsKfSBlbHNlaWYgKCR0eXBlID09PSAnaW5zdGFsbCcpIHsKJHRoaXMtPmZpbGVzeXN0ZW0tPmVtcHR5RGlyZWN0b3J5KCRwYXRoKTsKfSBlbHNlaWYgKCR0eXBlID09PSAndW5pbnN0YWxsJykgewokdGhpcy0+Y2xlYW5DaGFuZ2VzKCRwYWNrYWdlLCAkcGF0aCwgZmFsc2UpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNsZWFudXAoc3RyaW5nICR0eXBlLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlCnsKaWYgKCR0eXBlID09PSAndXBkYXRlJyAmJiBpc3NldCgkdGhpcy0+aGFzQ2xlYW5lZENoYW5nZXNbJHByZXZQYWNrYWdlLT5nZXRVbmlxdWVOYW1lKCldKSkgewokdGhpcy0+cmVhcHBseUNoYW5nZXMoJHBhdGgpOwp1bnNldCgkdGhpcy0+aGFzQ2xlYW5lZENoYW5nZXNbJHByZXZQYWNrYWdlLT5nZXRVbmlxdWVOYW1lKCldKTsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpbnN0YWxsKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6IFByb21pc2VJbnRlcmZhY2UKewppZiAoISRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUGFja2FnZSAnLiRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuJyBpcyBtaXNzaW5nIHJlZmVyZW5jZSBpbmZvcm1hdGlvbicpOwp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiAgLSAiIC4gSW5zdGFsbE9wZXJhdGlvbjo6Zm9ybWF0KCRwYWNrYWdlKS4nOiAnLCBmYWxzZSk7CgokdXJscyA9ICR0aGlzLT5wcmVwYXJlVXJscygkcGFja2FnZS0+Z2V0U291cmNlVXJscygpKTsKd2hpbGUgKCR1cmwgPSBhcnJheV9zaGlmdCgkdXJscykpIHsKdHJ5IHsKJHRoaXMtPmRvSW5zdGFsbCgkcGFja2FnZSwgJHBhdGgsICR1cmwpOwpicmVhazsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewoKaWYgKCRlIGluc3RhbmNlb2YgXFBIUFVuaXRcRnJhbWV3b3JrXEV4Y2VwdGlvbikgewp0aHJvdyAkZTsKfQppZiAoJHRoaXMtPmlvLT5pc0RlYnVnKCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdGYWlsZWQ6IFsnLmdldF9jbGFzcygkZSkuJ10gJy4kZS0+Z2V0TWVzc2FnZSgpKTsKfSBlbHNlaWYgKGNvdW50KCR1cmxzKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICBGYWlsZWQsIHRyeWluZyB0aGUgbmV4dCBVUkwnKTsKfQppZiAoIWNvdW50KCR1cmxzKSkgewp0aHJvdyAkZTsKfQp9Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdXBkYXRlKFBhY2thZ2VJbnRlcmZhY2UgJGluaXRpYWwsIFBhY2thZ2VJbnRlcmZhY2UgJHRhcmdldCwgc3RyaW5nICRwYXRoKTogUHJvbWlzZUludGVyZmFjZQp7CmlmICghJHRhcmdldC0+Z2V0U291cmNlUmVmZXJlbmNlKCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1BhY2thZ2UgJy4kdGFyZ2V0LT5nZXRQcmV0dHlOYW1lKCkuJyBpcyBtaXNzaW5nIHJlZmVyZW5jZSBpbmZvcm1hdGlvbicpOwp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiAgLSAiIC4gVXBkYXRlT3BlcmF0aW9uOjpmb3JtYXQoJGluaXRpYWwsICR0YXJnZXQpLic6ICcsIGZhbHNlKTsKCiR1cmxzID0gJHRoaXMtPnByZXBhcmVVcmxzKCR0YXJnZXQtPmdldFNvdXJjZVVybHMoKSk7CgokZXhjZXB0aW9uID0gbnVsbDsKd2hpbGUgKCR1cmwgPSBhcnJheV9zaGlmdCgkdXJscykpIHsKdHJ5IHsKJHRoaXMtPmRvVXBkYXRlKCRpbml0aWFsLCAkdGFyZ2V0LCAkcGF0aCwgJHVybCk7CgokZXhjZXB0aW9uID0gbnVsbDsKYnJlYWs7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGV4Y2VwdGlvbikgewoKaWYgKCRleGNlcHRpb24gaW5zdGFuY2VvZiBcUEhQVW5pdFxGcmFtZXdvcmtcRXhjZXB0aW9uKSB7CnRocm93ICRleGNlcHRpb247Cn0KaWYgKCR0aGlzLT5pby0+aXNEZWJ1ZygpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignRmFpbGVkOiBbJy5nZXRfY2xhc3MoJGV4Y2VwdGlvbikuJ10gJy4kZXhjZXB0aW9uLT5nZXRNZXNzYWdlKCkpOwp9IGVsc2VpZiAoY291bnQoJHVybHMpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignICAgIEZhaWxlZCwgdHJ5aW5nIHRoZSBuZXh0IFVSTCcpOwp9Cn0KfQoKCgppZiAoISRleGNlcHRpb24gJiYgJHRoaXMtPmlvLT5pc1ZlcmJvc2UoKSAmJiAkdGhpcy0+aGFzTWV0YWRhdGFSZXBvc2l0b3J5KCRwYXRoKSkgewokbWVzc2FnZSA9ICdQdWxsaW5nIGluIGNoYW5nZXM6JzsKJGxvZ3MgPSAkdGhpcy0+Z2V0Q29tbWl0TG9ncygkaW5pdGlhbC0+Z2V0U291cmNlUmVmZXJlbmNlKCksICR0YXJnZXQtPmdldFNvdXJjZVJlZmVyZW5jZSgpLCAkcGF0aCk7CgppZiAoJycgPT09IHRyaW0oJGxvZ3MpKSB7CiRtZXNzYWdlID0gJ1JvbGxpbmcgYmFjayBjaGFuZ2VzOic7CiRsb2dzID0gJHRoaXMtPmdldENvbW1pdExvZ3MoJHRhcmdldC0+Z2V0U291cmNlUmVmZXJlbmNlKCksICRpbml0aWFsLT5nZXRTb3VyY2VSZWZlcmVuY2UoKSwgJHBhdGgpOwp9CgppZiAoJycgIT09IHRyaW0oJGxvZ3MpKSB7CiRsb2dzID0gaW1wbG9kZSgiXG4iLCBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkbGluZSk6IHN0cmluZyB7CnJldHVybiAnICAgICAgJyAuICRsaW5lOwp9LCBleHBsb2RlKCJcbiIsICRsb2dzKSkpOwoKCiRsb2dzID0gc3RyX3JlcGxhY2UoJzwnLCAnXDwnLCAkbG9ncyk7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICAnLiRtZXNzYWdlKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRsb2dzKTsKfQp9CgppZiAoISR1cmxzICYmICRleGNlcHRpb24pIHsKdGhyb3cgJGV4Y2VwdGlvbjsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmUoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKTogUHJvbWlzZUludGVyZmFjZQp7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiICAtICIgLiBVbmluc3RhbGxPcGVyYXRpb246OmZvcm1hdCgkcGFja2FnZSkpOwoKJHByb21pc2UgPSAkdGhpcy0+ZmlsZXN5c3RlbS0+cmVtb3ZlRGlyZWN0b3J5QXN5bmMoJHBhdGgpOwoKcmV0dXJuICRwcm9taXNlLT50aGVuKHN0YXRpYyBmdW5jdGlvbiAoYm9vbCAkcmVzdWx0KSB1c2UgKCRwYXRoKSB7CmlmICghJHJlc3VsdCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBjb21wbGV0ZWx5IGRlbGV0ZSAnLiRwYXRoLicsIGFib3J0aW5nLicpOwp9Cn0pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmNzUmVmZXJlbmNlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6ID9zdHJpbmcKewokcGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXI7CiRndWVzc2VyID0gbmV3IFZlcnNpb25HdWVzc2VyKCR0aGlzLT5jb25maWcsICR0aGlzLT5wcm9jZXNzLCAkcGFyc2VyLCAkdGhpcy0+aW8pOwokZHVtcGVyID0gbmV3IEFycmF5RHVtcGVyOwoKJHBhY2thZ2VDb25maWcgPSAkZHVtcGVyLT5kdW1wKCRwYWNrYWdlKTsKaWYgKCRwYWNrYWdlVmVyc2lvbiA9ICRndWVzc2VyLT5ndWVzc1ZlcnNpb24oJHBhY2thZ2VDb25maWcsICRwYXRoKSkgewpyZXR1cm4gJHBhY2thZ2VWZXJzaW9uWydjb21taXQnXTsKfQoKcmV0dXJuIG51bGw7Cn0KCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjbGVhbkNoYW5nZXMoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBib29sICR1cGRhdGUpOiBQcm9taXNlSW50ZXJmYWNlCnsKCmlmIChudWxsICE9PSAkdGhpcy0+Z2V0TG9jYWxDaGFuZ2VzKCRwYWNrYWdlLCAkcGF0aCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdTb3VyY2UgZGlyZWN0b3J5ICcgLiAkcGF0aCAuICcgaGFzIHVuY29tbWl0dGVkIGNoYW5nZXMuJyk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiByZWFwcGx5Q2hhbmdlcyhzdHJpbmcgJHBhdGgpOiB2b2lkCnsKfQoKCgoKCgoKCgoKYWJzdHJhY3QgcHJvdGVjdGVkIGZ1bmN0aW9uIGRvRG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2U7CgoKCgoKCgoKCmFic3RyYWN0IHByb3RlY3RlZCBmdW5jdGlvbiBkb0luc3RhbGwoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCk6IFByb21pc2VJbnRlcmZhY2U7CgoKCgoKCgoKCgphYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gZG9VcGRhdGUoUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0LCBzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsKTogUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKCgphYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Q29tbWl0TG9ncyhzdHJpbmcgJGZyb21SZWZlcmVuY2UsIHN0cmluZyAkdG9SZWZlcmVuY2UsIHN0cmluZyAkcGF0aCk6IHN0cmluZzsKCgoKCgphYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gaGFzTWV0YWRhdGFSZXBvc2l0b3J5KHN0cmluZyAkcGF0aCk6IGJvb2w7CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcHJlcGFyZVVybHMoYXJyYXkgJHVybHMpOiBhcnJheQp7CmZvcmVhY2ggKCR1cmxzIGFzICRpbmRleCA9PiAkdXJsKSB7CmlmIChGaWxlc3lzdGVtOjppc0xvY2FsUGF0aCgkdXJsKSkgewoKCiRmaWxlUHJvdG9jb2wgPSAnZmlsZTovLyc7CiRpc0ZpbGVQcm90b2NvbCA9IGZhbHNlOwppZiAoMCA9PT0gc3RycG9zKCR1cmwsICRmaWxlUHJvdG9jb2wpKSB7CiR1cmwgPSBzdWJzdHIoJHVybCwgc3RybGVuKCRmaWxlUHJvdG9jb2wpKTsKJGlzRmlsZVByb3RvY29sID0gdHJ1ZTsKfQoKCmlmIChmYWxzZSAhPT0gc3RycG9zKCR1cmwsICclJykpIHsKJHVybCA9IHJhd3VybGRlY29kZSgkdXJsKTsKfQoKJHVybHNbJGluZGV4XSA9IHJlYWxwYXRoKCR1cmwpOwoKaWYgKCRpc0ZpbGVQcm90b2NvbCkgewokdXJsc1skaW5kZXhdID0gJGZpbGVQcm90b2NvbCAuICR1cmxzWyRpbmRleF07Cn0KfQp9CgpyZXR1cm4gJHVybHM7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CgoKCgoKCgpjbGFzcyBYekRvd25sb2FkZXIgZXh0ZW5kcyBBcmNoaXZlRG93bmxvYWRlcgp7CnByb3RlY3RlZCBmdW5jdGlvbiBleHRyYWN0KFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkZmlsZSwgc3RyaW5nICRwYXRoKTogUHJvbWlzZUludGVyZmFjZQp7CiRjb21tYW5kID0gWyd0YXInLCAnLXhKZicsICRmaWxlLCAnLUMnLCAkcGF0aF07CgppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRpZ25vcmVkT3V0cHV0KSkgewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKJHByb2Nlc3NFcnJvciA9ICdGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gaW1wbG9kZSgnICcsICRjb21tYW5kKSAuICJcblxuIiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpOwoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRwcm9jZXNzRXJyb3IpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxJbmlIZWxwZXI7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGVjdXRhYmxlRmluZGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xQcm9jZXNzOwp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwp1c2UgWmlwQXJjaGl2ZTsKCgoKCmNsYXNzIFppcERvd25sb2FkZXIgZXh0ZW5kcyBBcmNoaXZlRG93bmxvYWRlcgp7Cgpwcml2YXRlIHN0YXRpYyAkdW56aXBDb21tYW5kczsKCnByaXZhdGUgc3RhdGljICRoYXNaaXBBcmNoaXZlOwoKcHJpdmF0ZSBzdGF0aWMgJGlzV2luZG93czsKCgpwcml2YXRlICR6aXBBcmNoaXZlT2JqZWN0OyAKCgoKCnB1YmxpYyBmdW5jdGlvbiBkb3dubG9hZChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwsIGJvb2wgJG91dHB1dCA9IHRydWUpOiBQcm9taXNlSW50ZXJmYWNlCnsKaWYgKG51bGwgPT09IHNlbGY6OiR1bnppcENvbW1hbmRzKSB7CnNlbGY6OiR1bnppcENvbW1hbmRzID0gW107CiRmaW5kZXIgPSBuZXcgRXhlY3V0YWJsZUZpbmRlcjsKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiBudWxsICE9PSAoJGNtZCA9ICRmaW5kZXItPmZpbmQoJzd6JywgbnVsbCwgWydDOlxQcm9ncmFtIEZpbGVzXDctWmlwJ10pKSkgewpzZWxmOjokdW56aXBDb21tYW5kc1tdID0gWyc3eicsICRjbWQsICd4JywgJy1iYjAnLCAnLXknLCAnJWZpbGUlJywgJy1vJXBhdGglJ107Cn0KaWYgKG51bGwgIT09ICgkY21kID0gJGZpbmRlci0+ZmluZCgndW56aXAnKSkpIHsKc2VsZjo6JHVuemlwQ29tbWFuZHNbXSA9IFsndW56aXAnLCAkY21kLCAnLXFxJywgJyVmaWxlJScsICctZCcsICclcGF0aCUnXTsKfQppZiAoIVBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiBudWxsICE9PSAoJGNtZCA9ICRmaW5kZXItPmZpbmQoJzd6JykpKSB7IApzZWxmOjokdW56aXBDb21tYW5kc1tdID0gWyc3eicsICRjbWQsICd4JywgJy1iYjAnLCAnLXknLCAnJWZpbGUlJywgJy1vJXBhdGglJ107Cn0gZWxzZWlmICghUGxhdGZvcm06OmlzV2luZG93cygpICYmIG51bGwgIT09ICgkY21kID0gJGZpbmRlci0+ZmluZCgnN3p6JykpKSB7IApzZWxmOjokdW56aXBDb21tYW5kc1tdID0gWyc3enonLCAkY21kLCAneCcsICctYmIwJywgJy15JywgJyVmaWxlJScsICctbyVwYXRoJSddOwp9IGVsc2VpZiAoIVBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiBudWxsICE9PSAoJGNtZCA9ICRmaW5kZXItPmZpbmQoJzd6YScpKSkgeyAKc2VsZjo6JHVuemlwQ29tbWFuZHNbXSA9IFsnN3phJywgJGNtZCwgJ3gnLCAnLWJiMCcsICcteScsICclZmlsZSUnLCAnLW8lcGF0aCUnXTsKfQp9CgokcHJvY09wZW5NaXNzaW5nID0gZmFsc2U7CmlmICghZnVuY3Rpb25fZXhpc3RzKCdwcm9jX29wZW4nKSkgewpzZWxmOjokdW56aXBDb21tYW5kcyA9IFtdOwokcHJvY09wZW5NaXNzaW5nID0gdHJ1ZTsKfQoKaWYgKG51bGwgPT09IHNlbGY6OiRoYXNaaXBBcmNoaXZlKSB7CnNlbGY6OiRoYXNaaXBBcmNoaXZlID0gY2xhc3NfZXhpc3RzKCdaaXBBcmNoaXZlJyk7Cn0KCmlmICghc2VsZjo6JGhhc1ppcEFyY2hpdmUgJiYgIXNlbGY6OiR1bnppcENvbW1hbmRzKSB7CgokaW5pTWVzc2FnZSA9IEluaUhlbHBlcjo6Z2V0TWVzc2FnZSgpOwppZiAoJHByb2NPcGVuTWlzc2luZykgewokZXJyb3IgPSAiVGhlIHppcCBleHRlbnNpb24gaXMgbWlzc2luZyBhbmQgdW56aXAvN3ogY29tbWFuZHMgY2Fubm90IGJlIGNhbGxlZCBhcyBwcm9jX29wZW4gaXMgZGlzYWJsZWQsIHNraXBwaW5nLlxuIiAuICRpbmlNZXNzYWdlOwp9IGVsc2UgewokZXJyb3IgPSAiVGhlIHppcCBleHRlbnNpb24gYW5kIHVuemlwLzd6IGNvbW1hbmRzIGFyZSBib3RoIG1pc3NpbmcsIHNraXBwaW5nLlxuIiAuICRpbmlNZXNzYWdlOwp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJGVycm9yKTsKfQoKaWYgKG51bGwgPT09IHNlbGY6OiRpc1dpbmRvd3MpIHsKc2VsZjo6JGlzV2luZG93cyA9IFBsYXRmb3JtOjppc1dpbmRvd3MoKTsKCmlmICghc2VsZjo6JGlzV2luZG93cyAmJiAhc2VsZjo6JHVuemlwQ29tbWFuZHMpIHsKaWYgKCRwcm9jT3Blbk1pc3NpbmcpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCI8d2FybmluZz5wcm9jX29wZW4gaXMgZGlzYWJsZWQgc28gJ3VuemlwJyBhbmQgJzd6JyBjb21tYW5kcyBjYW5ub3QgYmUgdXNlZCwgemlwIGZpbGVzIGFyZSBiZWluZyB1bnBhY2tlZCB1c2luZyB0aGUgUEhQIHppcCBleHRlbnNpb24uPC93YXJuaW5nPiIpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoIjx3YXJuaW5nPlRoaXMgbWF5IGNhdXNlIGludmFsaWQgcmVwb3J0cyBvZiBjb3JydXB0ZWQgYXJjaGl2ZXMuIEJlc2lkZXMsIGFueSBVTklYIHBlcm1pc3Npb25zIChlLmcuIGV4ZWN1dGFibGUpIGRlZmluZWQgaW4gdGhlIGFyY2hpdmVzIHdpbGwgYmUgbG9zdC48L3dhcm5pbmc+Iik7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiPHdhcm5pbmc+RW5hYmxpbmcgcHJvY19vcGVuIGFuZCBpbnN0YWxsaW5nICd1bnppcCcgb3IgJzd6JyAoMjEuMDErKSBtYXkgcmVtZWRpYXRlIHRoZW0uPC93YXJuaW5nPiIpOwp9IGVsc2UgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIjx3YXJuaW5nPkFzIHRoZXJlIGlzIG5vICd1bnppcCcgbm9yICc3eicgY29tbWFuZCBpbnN0YWxsZWQgemlwIGZpbGVzIGFyZSBiZWluZyB1bnBhY2tlZCB1c2luZyB0aGUgUEhQIHppcCBleHRlbnNpb24uPC93YXJuaW5nPiIpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoIjx3YXJuaW5nPlRoaXMgbWF5IGNhdXNlIGludmFsaWQgcmVwb3J0cyBvZiBjb3JydXB0ZWQgYXJjaGl2ZXMuIEJlc2lkZXMsIGFueSBVTklYIHBlcm1pc3Npb25zIChlLmcuIGV4ZWN1dGFibGUpIGRlZmluZWQgaW4gdGhlIGFyY2hpdmVzIHdpbGwgYmUgbG9zdC48L3dhcm5pbmc+Iik7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiPHdhcm5pbmc+SW5zdGFsbGluZyAndW56aXAnIG9yICc3eicgKDIxLjAxKykgbWF5IHJlbWVkaWF0ZSB0aGVtLjwvd2FybmluZz4iKTsKfQp9Cn0KCnJldHVybiBwYXJlbnQ6OmRvd25sb2FkKCRwYWNrYWdlLCAkcGF0aCwgJHByZXZQYWNrYWdlLCAkb3V0cHV0KTsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZXh0cmFjdFdpdGhTeXN0ZW1VbnppcChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJGZpbGUsIHN0cmluZyAkcGF0aCk6IFByb21pc2VJbnRlcmZhY2UKewpzdGF0aWMgJHdhcm5lZDdaaXBMaW51eCA9IGZhbHNlOwoKCiRpc0xhc3RDaGFuY2UgPSAhc2VsZjo6JGhhc1ppcEFyY2hpdmU7CgppZiAoMCA9PT0gXGNvdW50KHNlbGY6OiR1bnppcENvbW1hbmRzKSkgewoKCnJldHVybiAkdGhpcy0+ZXh0cmFjdFdpdGhaaXBBcmNoaXZlKCRwYWNrYWdlLCAkZmlsZSwgJHBhdGgpOwp9CgokY29tbWFuZFNwZWMgPSByZXNldChzZWxmOjokdW56aXBDb21tYW5kcyk7CiRleGVjdXRhYmxlID0gJGNvbW1hbmRTcGVjWzBdOwokY29tbWFuZCA9IGFycmF5X3NsaWNlKCRjb21tYW5kU3BlYywgMSk7CiRtYXAgPSBbCgoKJyVmaWxlJScgPT4gc3RydHIoJGZpbGUsICcvJywgRElSRUNUT1JZX1NFUEFSQVRPUiksCiclcGF0aCUnID0+IHN0cnRyKCRwYXRoLCAnLycsIERJUkVDVE9SWV9TRVBBUkFUT1IpLApdOwokY29tbWFuZCA9IGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCR2YWx1ZSkgdXNlICgkbWFwKSB7CnJldHVybiBzdHJ0cigkdmFsdWUsICRtYXApOwp9LCAkY29tbWFuZCk7CgppZiAoISR3YXJuZWQ3WmlwTGludXggJiYgIVBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiBpbl9hcnJheSgkZXhlY3V0YWJsZSwgWyc3eicsICc3enonLCAnN3phJ10sIHRydWUpKSB7CiR3YXJuZWQ3WmlwTGludXggPSB0cnVlOwppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWyRjb21tYW5kU3BlY1sxXV0sICRvdXRwdXQpKSB7CmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XlxzKjctWmlwKD86IFxbNjRcXSk/IChbMC05Ll0rKX0nLCAkb3V0cHV0LCAkbWF0Y2gpICYmIHZlcnNpb25fY29tcGFyZSgkbWF0Y2hbMV0sICcyMS4wMScsICc8JykpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgPHdhcm5pbmc+VW56aXBwaW5nIHVzaW5nICcuJGV4ZWN1dGFibGUuJyAnLiRtYXRjaFsxXS4nIG1heSByZXN1bHQgaW4gaW5jb3JyZWN0IGZpbGUgcGVybWlzc2lvbnMuIEluc3RhbGwgJy4kZXhlY3V0YWJsZS4nIDIxLjAxKyBvciB1bnppcCB0byBlbnN1cmUgeW91IGdldCBjb3JyZWN0IHBlcm1pc3Npb25zLjwvd2FybmluZz4nKTsKfQp9Cn0KCiRpbyA9ICR0aGlzLT5pbzsKJHRyeUZhbGxiYWNrID0gZnVuY3Rpb24gKFxUaHJvd2FibGUgJHByb2Nlc3NFcnJvcikgdXNlICgkaXNMYXN0Q2hhbmNlLCAkaW8sICRmaWxlLCAkcGF0aCwgJHBhY2thZ2UsICRleGVjdXRhYmxlKTogUHJvbWlzZUludGVyZmFjZSB7CmlmICgkaXNMYXN0Q2hhbmNlKSB7CnRocm93ICRwcm9jZXNzRXJyb3I7Cn0KCmlmIChzdHJfY29udGFpbnMoJHByb2Nlc3NFcnJvci0+Z2V0TWVzc2FnZSgpLCAnemlwIGJvbWInKSkgewp0aHJvdyAkcHJvY2Vzc0Vycm9yOwp9CgppZiAoIWlzX2ZpbGUoJGZpbGUpKSB7CiRpby0+d3JpdGVFcnJvcignICAgIDx3YXJuaW5nPicuJHByb2Nlc3NFcnJvci0+Z2V0TWVzc2FnZSgpLic8L3dhcm5pbmc+Jyk7CiRpby0+d3JpdGVFcnJvcignICAgIDx3YXJuaW5nPlRoaXMgbW9zdCBsaWtlbHkgaXMgZHVlIHRvIGEgY3VzdG9tIGluc3RhbGxlciBwbHVnaW4gbm90IGhhbmRsaW5nIHRoZSByZXR1cm5lZCBQcm9taXNlIGZyb20gdGhlIGRvd25sb2FkZXI8L3dhcm5pbmc+Jyk7CiRpby0+d3JpdGVFcnJvcignICAgIDx3YXJuaW5nPlNlZSBodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvaW5zdGFsbGVycy9jb21taXQvNTAwNmQwYzI4NzMwYWRlMjMzYThmNDJlYzMxYWM2OGZiMWM1YzliYiBmb3IgYW4gZXhhbXBsZSBmaXg8L3dhcm5pbmc+Jyk7Cn0gZWxzZSB7CiRpby0+d3JpdGVFcnJvcignICAgIDx3YXJuaW5nPicuJHByb2Nlc3NFcnJvci0+Z2V0TWVzc2FnZSgpLic8L3dhcm5pbmc+Jyk7CiRpby0+d3JpdGVFcnJvcignICAgIFRoZSBhcmNoaXZlIG1heSBjb250YWluIGlkZW50aWNhbCBmaWxlIG5hbWVzIHdpdGggZGlmZmVyZW50IGNhcGl0YWxpemF0aW9uICh3aGljaCBmYWlscyBvbiBjYXNlIGluc2Vuc2l0aXZlIGZpbGVzeXN0ZW1zKScpOwokaW8tPndyaXRlRXJyb3IoJyAgICBVbnppcCB3aXRoICcuJGV4ZWN1dGFibGUuJyBjb21tYW5kIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIFppcEFyY2hpdmUgY2xhc3MnKTsKCgppZiAoUGxhdGZvcm06OmdldEVudignR0lUSFVCX0FDVElPTlMnKSAhPT0gZmFsc2UgJiYgUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfVEVTVFNfQVJFX1JVTk5JTkcnKSA9PT0gZmFsc2UpIHsKJGlvLT53cml0ZUVycm9yKCcgICAgPHdhcm5pbmc+QWRkaXRpb25hbCBkZWJ1ZyBpbmZvLCBwbGVhc2UgcmVwb3J0IHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9jb21wb3Nlci9pc3N1ZXMvMTExNDggaWYgeW91IHNlZSB0aGlzOjwvd2FybmluZz4nKTsKJGlvLT53cml0ZUVycm9yKCdGaWxlIHNpemU6ICcuQGZpbGVzaXplKCRmaWxlKSk7CiRpby0+d3JpdGVFcnJvcignRmlsZSBTSEExOiAnLmhhc2hfZmlsZSgnc2hhMScsICRmaWxlKSk7CiRpby0+d3JpdGVFcnJvcignRmlyc3QgMTAwIGJ5dGVzIChoZXgpOiAnLmJpbjJoZXgoc3Vic3RyKChzdHJpbmcpIGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKSwgMCwgMTAwKSkpOwokaW8tPndyaXRlRXJyb3IoJ0xhc3QgMTAwIGJ5dGVzIChoZXgpOiAnLmJpbjJoZXgoc3Vic3RyKChzdHJpbmcpIGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKSwgLTEwMCkpKTsKaWYgKHN0cmxlbigoc3RyaW5nKSAkcGFja2FnZS0+Z2V0RGlzdFVybCgpKSA+IDApIHsKJGlvLT53cml0ZUVycm9yKCdPcmlnaW4gVVJMOiAnLiR0aGlzLT5wcm9jZXNzVXJsKCRwYWNrYWdlLCAoc3RyaW5nKSAkcGFja2FnZS0+Z2V0RGlzdFVybCgpKSk7CiRpby0+d3JpdGVFcnJvcignUmVzcG9uc2UgSGVhZGVyczogJy5qc29uX2VuY29kZShGaWxlRG93bmxvYWRlcjo6JHJlc3BvbnNlSGVhZGVyc1skcGFja2FnZS0+Z2V0TmFtZSgpXSA/PyBbXSkpOwp9Cn0KfQoKcmV0dXJuICR0aGlzLT5leHRyYWN0V2l0aFppcEFyY2hpdmUoJHBhY2thZ2UsICRmaWxlLCAkcGF0aCk7Cn07Cgp0cnkgewokcHJvbWlzZSA9ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlQXN5bmMoJGNvbW1hbmQpOwoKcmV0dXJuICRwcm9taXNlLT50aGVuKGZ1bmN0aW9uIChQcm9jZXNzICRwcm9jZXNzKSB1c2UgKCR0cnlGYWxsYmFjaywgJGNvbW1hbmQsICRwYWNrYWdlLCAkZmlsZSkgewppZiAoISRwcm9jZXNzLT5pc1N1Y2Nlc3NmdWwoKSkgewppZiAoaXNzZXQoJHRoaXMtPmNsZWFudXBFeGVjdXRlZFskcGFja2FnZS0+Z2V0TmFtZSgpXSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gZXh0cmFjdCAnLiRwYWNrYWdlLT5nZXROYW1lKCkuJyBhcyB0aGUgaW5zdGFsbGF0aW9uIHdhcyBhYm9ydGVkIGJ5IGFub3RoZXIgcGFja2FnZSBvcGVyYXRpb24uJyk7Cn0KCiRvdXRwdXQgPSAkcHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKTsKJG91dHB1dCA9IHN0cl9yZXBsYWNlKCcsICcuJGZpbGUuJy56aXAgb3IgJy4kZmlsZS4nLlpJUCcsICcnLCAkb3V0cHV0KTsKCnJldHVybiAkdHJ5RmFsbGJhY2sobmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gZXh0cmFjdCAnLiRwYWNrYWdlLT5nZXROYW1lKCkuJzogKCcuJHByb2Nlc3MtPmdldEV4aXRDb2RlKCkuJykgJy5pbXBsb2RlKCcgJywgJGNvbW1hbmQpLiJcblxuIi4kb3V0cHV0KSk7Cn0KfSk7Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGUpIHsKcmV0dXJuICR0cnlGYWxsYmFjaygkZSk7Cn0KfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZXh0cmFjdFdpdGhaaXBBcmNoaXZlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkZmlsZSwgc3RyaW5nICRwYXRoKTogUHJvbWlzZUludGVyZmFjZQp7CiRwcm9jZXNzRXJyb3IgPSBudWxsOwokemlwQXJjaGl2ZSA9ICR0aGlzLT56aXBBcmNoaXZlT2JqZWN0ID86IG5ldyBaaXBBcmNoaXZlKCk7Cgp0cnkgewppZiAoIWZpbGVfZXhpc3RzKCRmaWxlKSB8fCAoJGZpbGVzaXplID0gZmlsZXNpemUoJGZpbGUpKSA9PT0gZmFsc2UgfHwgJGZpbGVzaXplID09PSAwKSB7CiRyZXR2YWwgPSAtMTsKfSBlbHNlIHsKJHJldHZhbCA9ICR6aXBBcmNoaXZlLT5vcGVuKCRmaWxlKTsKfQoKaWYgKHRydWUgPT09ICRyZXR2YWwpIHsKJHRvdGFsU2l6ZSA9IDA7CiRhcmNoaXZlU2l6ZSA9IGZpbGVzaXplKCRmaWxlKTsKJHRvdGFsRmlsZXMgPSAkemlwQXJjaGl2ZS0+Y291bnQoKTsKaWYgKCR0b3RhbEZpbGVzID4gMCkgewokaW5zcGVjdEFsbCA9IGZhbHNlOwokZmlsZXNUb0luc3BlY3QgPSBtaW4oJHRvdGFsRmlsZXMsIDUpOwpmb3IgKCRpID0gMDsgJGkgPCAkZmlsZXNUb0luc3BlY3Q7ICRpKyspIHsKJHN0YXQgPSAkemlwQXJjaGl2ZS0+c3RhdEluZGV4KCRpbnNwZWN0QWxsID8gJGkgOiByYW5kb21faW50KDAsICR0b3RhbEZpbGVzIC0gMSkpOwppZiAoJHN0YXQgPT09IGZhbHNlKSB7CmNvbnRpbnVlOwp9CiR0b3RhbFNpemUgKz0gJHN0YXRbJ3NpemUnXTsKaWYgKCEkaW5zcGVjdEFsbCAmJiAkc3RhdFsnc2l6ZSddID4gJHN0YXRbJ2NvbXBfc2l6ZSddICogMjAwKSB7CiR0b3RhbFNpemUgPSAwOwokaW5zcGVjdEFsbCA9IHRydWU7CiRpID0gLTE7CiRmaWxlc1RvSW5zcGVjdCA9ICR0b3RhbEZpbGVzOwp9Cn0KaWYgKCRhcmNoaXZlU2l6ZSAhPT0gZmFsc2UgJiYgJHRvdGFsU2l6ZSA+ICRhcmNoaXZlU2l6ZSAqIDEwMCAmJiAkdG90YWxTaXplID4gNTAgKiAxMDI0ICogMTAyNCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ludmFsaWQgemlwIGZpbGUgZm9yICInLiRwYWNrYWdlLT5nZXROYW1lKCkuJyIgd2l0aCBjb21wcmVzc2lvbiByYXRpbyA+OTklIChwb3NzaWJsZSB6aXAgYm9tYiknKTsKfQp9CgokZXh0cmFjdFJlc3VsdCA9ICR6aXBBcmNoaXZlLT5leHRyYWN0VG8oJHBhdGgpOwoKaWYgKHRydWUgPT09ICRleHRyYWN0UmVzdWx0KSB7CiR6aXBBcmNoaXZlLT5jbG9zZSgpOwoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCiRwcm9jZXNzRXJyb3IgPSBuZXcgXFJ1bnRpbWVFeGNlcHRpb24ocnRyaW0oIlRoZXJlIHdhcyBhbiBlcnJvciBleHRyYWN0aW5nIHRoZSBaSVAgZmlsZSBmb3IgXCJ7JHBhY2thZ2UtPmdldE5hbWUoKX1cIiwgaXQgaXMgZWl0aGVyIGNvcnJ1cHRlZCBvciB1c2luZyBhbiBpbnZhbGlkIGZvcm1hdC5cbiIpKTsKfSBlbHNlIHsKJHByb2Nlc3NFcnJvciA9IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKHJ0cmltKCR0aGlzLT5nZXRFcnJvck1lc3NhZ2UoJHJldHZhbCwgJGZpbGUpLiJcbiIpLCAkcmV0dmFsKTsKfQp9IGNhdGNoIChcRXJyb3JFeGNlcHRpb24gJGUpIHsKJHByb2Nlc3NFcnJvciA9IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIGFyY2hpdmUgZm9yICInLiRwYWNrYWdlLT5nZXROYW1lKCkuJyIgbWF5IGNvbnRhaW4gaWRlbnRpY2FsIGZpbGUgbmFtZXMgd2l0aCBkaWZmZXJlbnQgY2FwaXRhbGl6YXRpb24gKHdoaWNoIGZhaWxzIG9uIGNhc2UgaW5zZW5zaXRpdmUgZmlsZXN5c3RlbXMpOiAnLiRlLT5nZXRNZXNzYWdlKCksIDAsICRlKTsKfSBjYXRjaCAoXFRocm93YWJsZSAkZSkgewokcHJvY2Vzc0Vycm9yID0gJGU7Cn0KCnRocm93ICRwcm9jZXNzRXJyb3I7Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBleHRyYWN0KFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkZmlsZSwgc3RyaW5nICRwYXRoKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+ZXh0cmFjdFdpdGhTeXN0ZW1VbnppcCgkcGFja2FnZSwgJGZpbGUsICRwYXRoKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEVycm9yTWVzc2FnZShpbnQgJHJldHZhbCwgc3RyaW5nICRmaWxlKTogc3RyaW5nCnsKc3dpdGNoICgkcmV0dmFsKSB7CmNhc2UgWmlwQXJjaGl2ZTo6RVJfRVhJU1RTOgpyZXR1cm4gc3ByaW50ZigiRmlsZSAnJXMnIGFscmVhZHkgZXhpc3RzLiIsICRmaWxlKTsKY2FzZSBaaXBBcmNoaXZlOjpFUl9JTkNPTlM6CnJldHVybiBzcHJpbnRmKCJaaXAgYXJjaGl2ZSAnJXMnIGlzIGluY29uc2lzdGVudC4iLCAkZmlsZSk7CmNhc2UgWmlwQXJjaGl2ZTo6RVJfSU5WQUw6CnJldHVybiBzcHJpbnRmKCJJbnZhbGlkIGFyZ3VtZW50ICglcykiLCAkZmlsZSk7CmNhc2UgWmlwQXJjaGl2ZTo6RVJfTUVNT1JZOgpyZXR1cm4gc3ByaW50ZigiTWFsbG9jIGZhaWx1cmUgKCVzKSIsICRmaWxlKTsKY2FzZSBaaXBBcmNoaXZlOjpFUl9OT0VOVDoKcmV0dXJuIHNwcmludGYoIk5vIHN1Y2ggemlwIGZpbGU6ICclcyciLCAkZmlsZSk7CmNhc2UgWmlwQXJjaGl2ZTo6RVJfTk9aSVA6CnJldHVybiBzcHJpbnRmKCInJXMnIGlzIG5vdCBhIHppcCBhcmNoaXZlLiIsICRmaWxlKTsKY2FzZSBaaXBBcmNoaXZlOjpFUl9PUEVOOgpyZXR1cm4gc3ByaW50ZigiQ2FuJ3Qgb3BlbiB6aXAgZmlsZTogJXMiLCAkZmlsZSk7CmNhc2UgWmlwQXJjaGl2ZTo6RVJfUkVBRDoKcmV0dXJuIHNwcmludGYoIlppcCByZWFkIGVycm9yICglcykiLCAkZmlsZSk7CmNhc2UgWmlwQXJjaGl2ZTo6RVJfU0VFSzoKcmV0dXJuIHNwcmludGYoIlppcCBzZWVrIGVycm9yICglcykiLCAkZmlsZSk7CmNhc2UgLTE6CnJldHVybiBzcHJpbnRmKCInJXMnIGlzIGEgY29ycnVwdGVkIHppcCBhcmNoaXZlICgwIGJ5dGVzKSwgdHJ5IGFnYWluLiIsICRmaWxlKTsKZGVmYXVsdDoKcmV0dXJuIHNwcmludGYoIiclcycgaXMgbm90IGEgdmFsaWQgemlwIGFyY2hpdmUsIGdvdCBlcnJvciBjb2RlOiAlcyIsICRmaWxlLCAkcmV0dmFsKTsKfQp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlcjsKCgoKCgoKY2xhc3MgRXZlbnQKewoKCgpwcm90ZWN0ZWQgJG5hbWU7CgoKCgpwcm90ZWN0ZWQgJGFyZ3M7CgoKCgpwcm90ZWN0ZWQgJGZsYWdzOwoKCgoKcHJpdmF0ZSAkcHJvcGFnYXRpb25TdG9wcGVkID0gZmFsc2U7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSwgYXJyYXkgJGFyZ3MgPSBbXSwgYXJyYXkgJGZsYWdzID0gW10pCnsKJHRoaXMtPm5hbWUgPSAkbmFtZTsKJHRoaXMtPmFyZ3MgPSAkYXJnczsKJHRoaXMtPmZsYWdzID0gJGZsYWdzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+bmFtZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXJndW1lbnRzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hcmdzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGbGFncygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+ZmxhZ3M7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUHJvcGFnYXRpb25TdG9wcGVkKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPnByb3BhZ2F0aW9uU3RvcHBlZDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHN0b3BQcm9wYWdhdGlvbigpOiB2b2lkCnsKJHRoaXMtPnByb3BhZ2F0aW9uU3RvcHBlZCA9IHRydWU7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyOwoKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxUcmFuc2FjdGlvbjsKdXNlIENvbXBvc2VyXEluc3RhbGxlclxJbnN0YWxsZXJFdmVudDsKdXNlIENvbXBvc2VyXElPXENvbnNvbGVJTzsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYXJ0aWFsQ29tcG9zZXI7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxQbHVnaW5cQ29tbWFuZEV2ZW50Owp1c2UgQ29tcG9zZXJcUGx1Z2luXFByZUNvbW1hbmRSdW5FdmVudDsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXE9wZXJhdGlvbkludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNjcmlwdDsKdXNlIENvbXBvc2VyXEluc3RhbGxlclxQYWNrYWdlRXZlbnQ7CnVzZSBDb21wb3NlclxJbnN0YWxsZXJcQmluYXJ5SW5zdGFsbGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxTY3JpcHRcRXZlbnQgYXMgU2NyaXB0RXZlbnQ7CnVzZSBDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQXBwbGljYXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcU3RyaW5nSW5wdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxDb25zb2xlT3V0cHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xQaHBFeGVjdXRhYmxlRmluZGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGVjdXRhYmxlRmluZGVyOwoKCgoKCgoKCgoKCgoKCmNsYXNzIEV2ZW50RGlzcGF0Y2hlcgp7Cgpwcm90ZWN0ZWQgJGNvbXBvc2VyOwoKcHJvdGVjdGVkICRpbzsKCnByb3RlY3RlZCAkbG9hZGVyOwoKcHJvdGVjdGVkICRwcm9jZXNzOwoKcHJvdGVjdGVkICRsaXN0ZW5lcnMgPSBbXTsKCnByb3RlY3RlZCAkcnVuU2NyaXB0cyA9IHRydWU7Cgpwcml2YXRlICRldmVudFN0YWNrOwoKcHJpdmF0ZSAkc2tpcFNjcmlwdHM7Cgpwcml2YXRlICRwcmV2aW91c0hhc2ggPSBudWxsOwoKcHJpdmF0ZSAkcHJldmlvdXNMaXN0ZW5lcnMgPSBbXTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQYXJ0aWFsQ29tcG9zZXIgJGNvbXBvc2VyLCBJT0ludGVyZmFjZSAkaW8sID9Qcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MgPSBudWxsKQp7CiR0aGlzLT5jb21wb3NlciA9ICRjb21wb3NlcjsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+cHJvY2VzcyA9ICRwcm9jZXNzID8/IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKJHRoaXMtPmV2ZW50U3RhY2sgPSBbXTsKJHRoaXMtPnNraXBTY3JpcHRzID0gYXJyYXlfdmFsdWVzKGFycmF5X2ZpbHRlcigKYXJyYXlfbWFwKCd0cmltJywgZXhwbG9kZSgnLCcsIChzdHJpbmcpIFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX1NLSVBfU0NSSVBUUycpKSksCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbCAhPT0gJyc7Cn0KKSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJ1blNjcmlwdHMoYm9vbCAkcnVuU2NyaXB0cyA9IHRydWUpOiBzZWxmCnsKJHRoaXMtPnJ1blNjcmlwdHMgPSAkcnVuU2NyaXB0czsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGlzcGF0Y2goP3N0cmluZyAkZXZlbnROYW1lLCA/RXZlbnQgJGV2ZW50ID0gbnVsbCk6IGludAp7CmlmIChudWxsID09PSAkZXZlbnQpIHsKaWYgKG51bGwgPT09ICRldmVudE5hbWUpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0lmIG5vICRldmVudCBpcyBwYXNzZWQgaW4gdG8gJy5fX01FVEhPRF9fLicgeW91IGhhdmUgdG8gcGFzcyBpbiBhbiAkZXZlbnROYW1lLCBnb3QgbnVsbC4nKTsKfQokZXZlbnQgPSBuZXcgRXZlbnQoJGV2ZW50TmFtZSk7Cn0KCnJldHVybiAkdGhpcy0+ZG9EaXNwYXRjaCgkZXZlbnQpOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGlzcGF0Y2hTY3JpcHQoc3RyaW5nICRldmVudE5hbWUsIGJvb2wgJGRldk1vZGUgPSBmYWxzZSwgYXJyYXkgJGFkZGl0aW9uYWxBcmdzID0gW10sIGFycmF5ICRmbGFncyA9IFtdKTogaW50CnsKYXNzZXJ0KCR0aGlzLT5jb21wb3NlciBpbnN0YW5jZW9mIENvbXBvc2VyLCBuZXcgXExvZ2ljRXhjZXB0aW9uKCdUaGlzIHNob3VsZCBvbmx5IGJlIHJlYWNoZWQgd2l0aCBhIGZ1bGx5IGxvYWRlZCBDb21wb3NlcicpKTsKCnJldHVybiAkdGhpcy0+ZG9EaXNwYXRjaChuZXcgU2NyaXB0RXZlbnQoJGV2ZW50TmFtZSwgJHRoaXMtPmNvbXBvc2VyLCAkdGhpcy0+aW8sICRkZXZNb2RlLCAkYWRkaXRpb25hbEFyZ3MsICRmbGFncykpOwp9CgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGlzcGF0Y2hQYWNrYWdlRXZlbnQoc3RyaW5nICRldmVudE5hbWUsIGJvb2wgJGRldk1vZGUsIFJlcG9zaXRvcnlJbnRlcmZhY2UgJGxvY2FsUmVwbywgYXJyYXkgJG9wZXJhdGlvbnMsIE9wZXJhdGlvbkludGVyZmFjZSAkb3BlcmF0aW9uKTogaW50CnsKYXNzZXJ0KCR0aGlzLT5jb21wb3NlciBpbnN0YW5jZW9mIENvbXBvc2VyLCBuZXcgXExvZ2ljRXhjZXB0aW9uKCdUaGlzIHNob3VsZCBvbmx5IGJlIHJlYWNoZWQgd2l0aCBhIGZ1bGx5IGxvYWRlZCBDb21wb3NlcicpKTsKCnJldHVybiAkdGhpcy0+ZG9EaXNwYXRjaChuZXcgUGFja2FnZUV2ZW50KCRldmVudE5hbWUsICR0aGlzLT5jb21wb3NlciwgJHRoaXMtPmlvLCAkZGV2TW9kZSwgJGxvY2FsUmVwbywgJG9wZXJhdGlvbnMsICRvcGVyYXRpb24pKTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGlzcGF0Y2hJbnN0YWxsZXJFdmVudChzdHJpbmcgJGV2ZW50TmFtZSwgYm9vbCAkZGV2TW9kZSwgYm9vbCAkZXhlY3V0ZU9wZXJhdGlvbnMsIFRyYW5zYWN0aW9uICR0cmFuc2FjdGlvbik6IGludAp7CmFzc2VydCgkdGhpcy0+Y29tcG9zZXIgaW5zdGFuY2VvZiBDb21wb3NlciwgbmV3IFxMb2dpY0V4Y2VwdGlvbignVGhpcyBzaG91bGQgb25seSBiZSByZWFjaGVkIHdpdGggYSBmdWxseSBsb2FkZWQgQ29tcG9zZXInKSk7CgpyZXR1cm4gJHRoaXMtPmRvRGlzcGF0Y2gobmV3IEluc3RhbGxlckV2ZW50KCRldmVudE5hbWUsICR0aGlzLT5jb21wb3NlciwgJHRoaXMtPmlvLCAkZGV2TW9kZSwgJGV4ZWN1dGVPcGVyYXRpb25zLCAkdHJhbnNhY3Rpb24pKTsKfQoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9EaXNwYXRjaChFdmVudCAkZXZlbnQpCnsKaWYgKFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0RFQlVHX0VWRU5UUycpKSB7CiRkZXRhaWxzID0gbnVsbDsKaWYgKCRldmVudCBpbnN0YW5jZW9mIFBhY2thZ2VFdmVudCkgewokZGV0YWlscyA9IChzdHJpbmcpICRldmVudC0+Z2V0T3BlcmF0aW9uKCk7Cn0gZWxzZWlmICgkZXZlbnQgaW5zdGFuY2VvZiBDb21tYW5kRXZlbnQpIHsKJGRldGFpbHMgPSAkZXZlbnQtPmdldENvbW1hbmROYW1lKCk7Cn0gZWxzZWlmICgkZXZlbnQgaW5zdGFuY2VvZiBQcmVDb21tYW5kUnVuRXZlbnQpIHsKJGRldGFpbHMgPSAkZXZlbnQtPmdldENvbW1hbmQoKTsKfQokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0Rpc3BhdGNoaW5nIDxpbmZvPicuJGV2ZW50LT5nZXROYW1lKCkuJzwvaW5mbz4nLigkZGV0YWlscyA/ICcgKCcuJGRldGFpbHMuJyknIDogJycpLicgZXZlbnQnKTsKfQoKJGxpc3RlbmVycyA9ICR0aGlzLT5nZXRMaXN0ZW5lcnMoJGV2ZW50KTsKCiR0aGlzLT5wdXNoRXZlbnQoJGV2ZW50KTsKCiRhdXRvbG9hZGVyc0JlZm9yZSA9IHNwbF9hdXRvbG9hZF9mdW5jdGlvbnMoKTsKCnRyeSB7CiRyZXR1cm5NYXggPSAwOwpmb3JlYWNoICgkbGlzdGVuZXJzIGFzICRjYWxsYWJsZSkgewokcmV0dXJuID0gMDsKJHRoaXMtPmVuc3VyZUJpbkRpcklzSW5QYXRoKCk7CgokYWRkaXRpb25hbEFyZ3MgPSAkZXZlbnQtPmdldEFyZ3VtZW50cygpOwppZiAoaXNfc3RyaW5nKCRjYWxsYWJsZSkgJiYgc3RyX2NvbnRhaW5zKCRjYWxsYWJsZSwgJ0Bub19hZGRpdGlvbmFsX2FyZ3MnKSkgewokY2FsbGFibGUgPSBQcmVnOjpyZXBsYWNlKCd7ID9Abm9fYWRkaXRpb25hbF9hcmdzfScsICcnLCAkY2FsbGFibGUpOwokYWRkaXRpb25hbEFyZ3MgPSBbXTsKfQokZm9ybWF0dGVkRXZlbnROYW1lV2l0aEFyZ3MgPSAkZXZlbnQtPmdldE5hbWUoKSAuICgkYWRkaXRpb25hbEFyZ3MgIT09IFtdID8gJyAoJyAuIGltcGxvZGUoJywgJywgJGFkZGl0aW9uYWxBcmdzKSAuICcpJyA6ICcnKTsKaWYgKCFpc19zdHJpbmcoJGNhbGxhYmxlKSkgewokdGhpcy0+bWFrZUF1dG9sb2FkZXIoJGV2ZW50LCAkY2FsbGFibGUpOwppZiAoIWlzX2NhbGxhYmxlKCRjYWxsYWJsZSkpIHsKJGNsYXNzTmFtZSA9IGlzX29iamVjdCgkY2FsbGFibGVbMF0pID8gZ2V0X2NsYXNzKCRjYWxsYWJsZVswXSkgOiAkY2FsbGFibGVbMF07Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1N1YnNjcmliZXIgJy4kY2xhc3NOYW1lLic6OicuJGNhbGxhYmxlWzFdLicgZm9yIGV2ZW50ICcuJGV2ZW50LT5nZXROYW1lKCkuJyBpcyBub3QgY2FsbGFibGUsIG1ha2Ugc3VyZSB0aGUgZnVuY3Rpb24gaXMgZGVmaW5lZCBhbmQgcHVibGljJyk7Cn0KaWYgKGlzX2FycmF5KCRjYWxsYWJsZSkgJiYgKGlzX3N0cmluZygkY2FsbGFibGVbMF0pIHx8IGlzX29iamVjdCgkY2FsbGFibGVbMF0pKSAmJiBpc19zdHJpbmcoJGNhbGxhYmxlWzFdKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignPiAlczogJXMnLCAkZm9ybWF0dGVkRXZlbnROYW1lV2l0aEFyZ3MsIChpc19vYmplY3QoJGNhbGxhYmxlWzBdKSA/IGdldF9jbGFzcygkY2FsbGFibGVbMF0pIDogJGNhbGxhYmxlWzBdKS4nLT4nLiRjYWxsYWJsZVsxXSksIHRydWUsIElPSW50ZXJmYWNlOjpWRVJCT1NFKTsKfQokcmV0dXJuID0gZmFsc2UgPT09ICRjYWxsYWJsZSgkZXZlbnQpID8gMSA6IDA7Cn0gZWxzZWlmICgkdGhpcy0+aXNDb21wb3NlclNjcmlwdCgkY2FsbGFibGUpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCc+ICVzOiAlcycsICRmb3JtYXR0ZWRFdmVudE5hbWVXaXRoQXJncywgJGNhbGxhYmxlKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUkJPU0UpOwoKJHNjcmlwdCA9IGV4cGxvZGUoJyAnLCBzdWJzdHIoJGNhbGxhYmxlLCAxKSk7CiRzY3JpcHROYW1lID0gJHNjcmlwdFswXTsKdW5zZXQoJHNjcmlwdFswXSk7CgokaW5kZXggPSBhcnJheV9zZWFyY2goJ0BhZGRpdGlvbmFsX2FyZ3MnLCAkc2NyaXB0LCB0cnVlKTsKaWYgKCRpbmRleCAhPT0gZmFsc2UpIHsKJGFyZ3MgPSBhcnJheV9zcGxpY2UoJHNjcmlwdCwgJGluZGV4LCAwLCAkYWRkaXRpb25hbEFyZ3MpOwp9IGVsc2UgewokYXJncyA9IGFycmF5X21lcmdlKCRzY3JpcHQsICRhZGRpdGlvbmFsQXJncyk7Cn0KJGZsYWdzID0gJGV2ZW50LT5nZXRGbGFncygpOwppZiAoaXNzZXQoJGZsYWdzWydzY3JpcHQtYWxpYXMtaW5wdXQnXSkpIHsKJGFyZ3NTdHJpbmcgPSBpbXBsb2RlKCcgJywgYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGFyZykgeyByZXR1cm4gUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJGFyZyk7IH0sICRzY3JpcHQpKTsKJGZsYWdzWydzY3JpcHQtYWxpYXMtaW5wdXQnXSA9ICRhcmdzU3RyaW5nIC4gJyAnIC4gJGZsYWdzWydzY3JpcHQtYWxpYXMtaW5wdXQnXTsKdW5zZXQoJGFyZ3NTdHJpbmcpOwp9CmlmIChzdHJwb3MoJGNhbGxhYmxlLCAnQGNvbXBvc2VyICcpID09PSAwKSB7CiRleGVjID0gJHRoaXMtPmdldFBocEV4ZWNDb21tYW5kKCkgLiAnICcgLiBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZShQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9CSU5BUlknKSkgLiAnICcgLiBpbXBsb2RlKCcgJywgJGFyZ3MpOwppZiAoMCAhPT0gKCRleGl0Q29kZSA9ICR0aGlzLT5leGVjdXRlVHR5KCRleGVjKSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoJzxlcnJvcj5TY3JpcHQgJXMgaGFuZGxpbmcgdGhlICVzIGV2ZW50IHJldHVybmVkIHdpdGggZXJyb3IgY29kZSAnLiRleGl0Q29kZS4nPC9lcnJvcj4nLCAkY2FsbGFibGUsICRldmVudC0+Z2V0TmFtZSgpKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKCnRocm93IG5ldyBTY3JpcHRFeGVjdXRpb25FeGNlcHRpb24oJ0Vycm9yIE91dHB1dDogJy4kdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSwgJGV4aXRDb2RlKTsKfQp9IGVsc2UgewppZiAoISR0aGlzLT5nZXRMaXN0ZW5lcnMobmV3IEV2ZW50KCRzY3JpcHROYW1lKSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoJzx3YXJuaW5nPllvdSBtYWRlIGEgcmVmZXJlbmNlIHRvIGEgbm9uLWV4aXN0ZW50IHNjcmlwdCAlczwvd2FybmluZz4nLCAkY2FsbGFibGUpLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwp9Cgp0cnkgewoKJHNjcmlwdEV2ZW50ID0gbmV3IFNjcmlwdEV2ZW50KCRzY3JpcHROYW1lLCAkZXZlbnQtPmdldENvbXBvc2VyKCksICRldmVudC0+Z2V0SU8oKSwgJGV2ZW50LT5pc0Rldk1vZGUoKSwgJGFyZ3MsICRmbGFncyk7CiRzY3JpcHRFdmVudC0+c2V0T3JpZ2luYXRpbmdFdmVudCgkZXZlbnQpOwokcmV0dXJuID0gJHRoaXMtPmRpc3BhdGNoKCRzY3JpcHROYW1lLCAkc2NyaXB0RXZlbnQpOwp9IGNhdGNoIChTY3JpcHRFeGVjdXRpb25FeGNlcHRpb24gJGUpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoJzxlcnJvcj5TY3JpcHQgJXMgd2FzIGNhbGxlZCB2aWEgJXM8L2Vycm9yPicsICRjYWxsYWJsZSwgJGV2ZW50LT5nZXROYW1lKCkpLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwp0aHJvdyAkZTsKfQp9Cn0gZWxzZWlmICgkdGhpcy0+aXNQaHBTY3JpcHQoJGNhbGxhYmxlKSkgewokY2xhc3NOYW1lID0gc3Vic3RyKCRjYWxsYWJsZSwgMCwgc3RycG9zKCRjYWxsYWJsZSwgJzo6JykpOwokbWV0aG9kTmFtZSA9IHN1YnN0cigkY2FsbGFibGUsIHN0cnBvcygkY2FsbGFibGUsICc6OicpICsgMik7CgokdGhpcy0+bWFrZUF1dG9sb2FkZXIoJGV2ZW50LCAkY2FsbGFibGUpOwppZiAoIWNsYXNzX2V4aXN0cygkY2xhc3NOYW1lKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkNsYXNzICcuJGNsYXNzTmFtZS4nIGlzIG5vdCBhdXRvbG9hZGFibGUsIGNhbiBub3QgY2FsbCAnLiRldmVudC0+Z2V0TmFtZSgpLicgc2NyaXB0PC93YXJuaW5nPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7CmNvbnRpbnVlOwp9CmlmICghaXNfY2FsbGFibGUoJGNhbGxhYmxlKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPk1ldGhvZCAnLiRjYWxsYWJsZS4nIGlzIG5vdCBjYWxsYWJsZSwgY2FuIG5vdCBjYWxsICcuJGV2ZW50LT5nZXROYW1lKCkuJyBzY3JpcHQ8L3dhcm5pbmc+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKY29udGludWU7Cn0KCnRyeSB7CiRyZXR1cm4gPSBmYWxzZSA9PT0gJHRoaXMtPmV4ZWN1dGVFdmVudFBocFNjcmlwdCgkY2xhc3NOYW1lLCAkbWV0aG9kTmFtZSwgJGV2ZW50KSA/IDEgOiAwOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CiRtZXNzYWdlID0gIlNjcmlwdCAlcyBoYW5kbGluZyB0aGUgJXMgZXZlbnQgdGVybWluYXRlZCB3aXRoIGFuIGV4Y2VwdGlvbiI7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPicuc3ByaW50ZigkbWVzc2FnZSwgJGNhbGxhYmxlLCAkZXZlbnQtPmdldE5hbWUoKSkuJzwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKdGhyb3cgJGU7Cn0KfSBlbHNlaWYgKCR0aGlzLT5pc0NvbW1hbmRDbGFzcygkY2FsbGFibGUpKSB7CiRjbGFzc05hbWUgPSAkY2FsbGFibGU7CgokdGhpcy0+bWFrZUF1dG9sb2FkZXIoJGV2ZW50LCBbJGNhbGxhYmxlLCAncnVuJ10pOwppZiAoIWNsYXNzX2V4aXN0cygkY2xhc3NOYW1lKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkNsYXNzICcuJGNsYXNzTmFtZS4nIGlzIG5vdCBhdXRvbG9hZGFibGUsIGNhbiBub3QgY2FsbCAnLiRldmVudC0+Z2V0TmFtZSgpLicgc2NyaXB0PC93YXJuaW5nPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7CmNvbnRpbnVlOwp9CmlmICghaXNfYSgkY2xhc3NOYW1lLCBDb21tYW5kOjpjbGFzcywgdHJ1ZSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5DbGFzcyAnLiRjbGFzc05hbWUuJyBkb2VzIG5vdCBleHRlbmQgJy5Db21tYW5kOjpjbGFzcy4nLCBjYW4gbm90IGNhbGwgJy4kZXZlbnQtPmdldE5hbWUoKS4nIHNjcmlwdDwvd2FybmluZz4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwpjb250aW51ZTsKfQppZiAoZGVmaW5lZCgnQ29tcG9zZXJcU2NyaXB0XFNjcmlwdEV2ZW50czo6Jy5zdHJfcmVwbGFjZSgnLScsICdfJywgc3RydG91cHBlcigkZXZlbnQtPmdldE5hbWUoKSkpKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPllvdSBjYW5ub3QgYmluZCAnLiRldmVudC0+Z2V0TmFtZSgpLicgdG8gYSBDb21tYW5kIGNsYXNzLCB1c2UgYSBub24tcmVzZXJ2ZWQgbmFtZTwvd2FybmluZz4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwpjb250aW51ZTsKfQoKJGFwcCA9IG5ldyBBcHBsaWNhdGlvbigpOwokYXBwLT5zZXRDYXRjaEV4Y2VwdGlvbnMoZmFsc2UpOwppZiAobWV0aG9kX2V4aXN0cygkYXBwLCAnc2V0Q2F0Y2hFcnJvcnMnKSkgewokYXBwLT5zZXRDYXRjaEVycm9ycyhmYWxzZSk7Cn0KJGFwcC0+c2V0QXV0b0V4aXQoZmFsc2UpOwokY21kID0gbmV3ICRjbGFzc05hbWUoJGV2ZW50LT5nZXROYW1lKCkpOwoKaWYgKG1ldGhvZF9leGlzdHMoJGFwcCwgJ2FkZENvbW1hbmQnKSkgewokYXBwLT5hZGRDb21tYW5kKCRjbWQpOwp9IGVsc2UgewoKCiRhcHAtPmFkZCgkY21kKTsKfQokYXBwLT5zZXREZWZhdWx0Q29tbWFuZCgoc3RyaW5nKSAkY21kLT5nZXROYW1lKCksIHRydWUpOwp0cnkgewokYXJncyA9IGltcGxvZGUoJyAnLCBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkYXJnKSB7IHJldHVybiBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkYXJnKTsgfSwgJGFkZGl0aW9uYWxBcmdzKSk7CgoKaWYgKCR0aGlzLT5pbyBpbnN0YW5jZW9mIENvbnNvbGVJTykgewokcmVmbFByb3AgPSBuZXcgXFJlZmxlY3Rpb25Qcm9wZXJ0eSgkdGhpcy0+aW8sICdvdXRwdXQnKTsKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDgwMTAwKSB7CiRyZWZsUHJvcC0+c2V0QWNjZXNzaWJsZSh0cnVlKTsKfQokb3V0cHV0ID0gJHJlZmxQcm9wLT5nZXRWYWx1ZSgkdGhpcy0+aW8pOwp9IGVsc2Ugewokb3V0cHV0ID0gbmV3IENvbnNvbGVPdXRwdXQoKTsKfQokcmV0dXJuID0gJGFwcC0+cnVuKG5ldyBTdHJpbmdJbnB1dCgkZXZlbnQtPmdldEZsYWdzKClbJ3NjcmlwdC1hbGlhcy1pbnB1dCddID8/ICRhcmdzKSwgJG91dHB1dCk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJG1lc3NhZ2UgPSAiU2NyaXB0ICVzIGhhbmRsaW5nIHRoZSAlcyBldmVudCB0ZXJtaW5hdGVkIHdpdGggYW4gZXhjZXB0aW9uIjsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Jy5zcHJpbnRmKCRtZXNzYWdlLCAkY2FsbGFibGUsICRldmVudC0+Z2V0TmFtZSgpKS4nPC9lcnJvcj4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwp0aHJvdyAkZTsKfQp9IGVsc2UgewokYXJncyA9IGltcGxvZGUoJyAnLCBhcnJheV9tYXAoWydDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcicsICdlc2NhcGUnXSwgJGFkZGl0aW9uYWxBcmdzKSk7CgoKaWYgKHN0cnBvcygkY2FsbGFibGUsICdAcHV0ZW52ICcpID09PSAwKSB7CiRleGVjID0gJGNhbGxhYmxlOwp9IGVsc2UgewppZiAoc3RyX2NvbnRhaW5zKCRjYWxsYWJsZSwgJ0BhZGRpdGlvbmFsX2FyZ3MnKSkgewokZXhlYyA9IHN0cl9yZXBsYWNlKCdAYWRkaXRpb25hbF9hcmdzJywgJGFyZ3MsICRjYWxsYWJsZSk7Cn0gZWxzZSB7CiRleGVjID0gJGNhbGxhYmxlIC4gKCRhcmdzID09PSAnJyA/ICcnIDogJyAnLiRhcmdzKTsKfQp9CgppZiAoJHRoaXMtPmlvLT5pc1ZlcmJvc2UoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignPiAlczogJXMnLCAkZXZlbnQtPmdldE5hbWUoKSwgJGV4ZWMpKTsKfSBlbHNlaWYgKCR0aGlzLT5ldmVudE5lZWRzVG9PdXRwdXQoJGV2ZW50KSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignPiAlcycsICRleGVjKSk7Cn0KCiRwb3NzaWJsZUxvY2FsQmluYXJpZXMgPSAkdGhpcy0+Y29tcG9zZXItPmdldFBhY2thZ2UoKS0+Z2V0QmluYXJpZXMoKTsKaWYgKGNvdW50KCRwb3NzaWJsZUxvY2FsQmluYXJpZXMpID4gMCkgewpmb3JlYWNoICgkcG9zc2libGVMb2NhbEJpbmFyaWVzIGFzICRsb2NhbEV4ZWMpIHsKaWYgKFByZWc6OmlzTWF0Y2goJ3tcYicucHJlZ19xdW90ZSgkY2FsbGFibGUpLickfScsICRsb2NhbEV4ZWMpKSB7CiRjYWxsZXIgPSBCaW5hcnlJbnN0YWxsZXI6OmRldGVybWluZUJpbmFyeUNhbGxlcigkbG9jYWxFeGVjKTsKJGV4ZWMgPSBQcmVnOjpyZXBsYWNlKCd7XicucHJlZ19xdW90ZSgkY2FsbGFibGUpLid9JywgJGNhbGxlciAuICcgJyAuICRsb2NhbEV4ZWMsICRleGVjKTsKYnJlYWs7Cn0KfQp9CgppZiAoc3RycG9zKCRleGVjLCAnQHB1dGVudiAnKSA9PT0gMCkgewppZiAoZmFsc2UgPT09IHN0cnBvcygkZXhlYywgJz0nKSkgewpQbGF0Zm9ybTo6Y2xlYXJFbnYoc3Vic3RyKCRleGVjLCA4KSk7Cn0gZWxzZSB7ClskdmFyLCAkdmFsdWVdID0gZXhwbG9kZSgnPScsIHN1YnN0cigkZXhlYywgOCksIDIpOwpQbGF0Zm9ybTo6cHV0RW52KCR2YXIsICR2YWx1ZSk7Cn0KCmNvbnRpbnVlOwp9CmlmIChzdHJwb3MoJGV4ZWMsICdAcGhwICcpID09PSAwKSB7CiRwYXRoQW5kQXJncyA9IHN1YnN0cigkZXhlYywgNSk7CmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKJHBhdGhBbmRBcmdzID0gUHJlZzo6cmVwbGFjZUNhbGxiYWNrKCd7XlxTK30nLCBzdGF0aWMgZnVuY3Rpb24gKCRwYXRoKSB7CnJldHVybiBzdHJfcmVwbGFjZSgnLycsICdcXCcsICRwYXRoWzBdKTsKfSwgJHBhdGhBbmRBcmdzKTsKfQoKCiRtYXRjaGVkID0gUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne15bXlwnIlxzL1xcXFxdK30nLCAkcGF0aEFuZEFyZ3MsICRtYXRjaCk7CmlmICgkbWF0Y2hlZCAmJiAhZmlsZV9leGlzdHMoJG1hdGNoWzBdKSkgewokZmluZGVyID0gbmV3IEV4ZWN1dGFibGVGaW5kZXI7CmlmICgkcGF0aFRvRXhlYyA9ICRmaW5kZXItPmZpbmQoJG1hdGNoWzBdKSkgewppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CiRleGVjV2l0aG91dEV4dCA9IFByZWc6OnJlcGxhY2UoJ3tcLihleGV8YmF0fGNtZHxjb20pJH1pJywgJycsICRwYXRoVG9FeGVjKTsKCmlmIChmaWxlX2V4aXN0cygkZXhlY1dpdGhvdXRFeHQpKSB7CiRwYXRoVG9FeGVjID0gJGV4ZWNXaXRob3V0RXh0Owp9CnVuc2V0KCRleGVjV2l0aG91dEV4dCk7Cn0KJHBhdGhBbmRBcmdzID0gJHBhdGhUb0V4ZWMgLiBzdWJzdHIoJHBhdGhBbmRBcmdzLCBzdHJsZW4oJG1hdGNoWzBdKSk7Cn0KfQokZXhlYyA9ICR0aGlzLT5nZXRQaHBFeGVjQ29tbWFuZCgpIC4gJyAnIC4gJHBhdGhBbmRBcmdzOwp9IGVsc2UgewokZmluZGVyID0gbmV3IFBocEV4ZWN1dGFibGVGaW5kZXIoKTsKJHBocFBhdGggPSAkZmluZGVyLT5maW5kKGZhbHNlKTsKaWYgKCRwaHBQYXRoKSB7ClBsYXRmb3JtOjpwdXRFbnYoJ1BIUF9CSU5BUlknLCAkcGhwUGF0aCk7Cn0KCmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKJGV4ZWMgPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJ3teXFMrfScsIHN0YXRpYyBmdW5jdGlvbiAoJHBhdGgpIHsKcmV0dXJuIHN0cl9yZXBsYWNlKCcvJywgJ1xcJywgJHBhdGhbMF0pOwp9LCAkZXhlYyk7Cn0KfQoKCgoKaWYgKHN0cnBvcygkZXhlYywgJ2NvbXBvc2VyICcpID09PSAwKSB7CiRleGVjID0gJHRoaXMtPmdldFBocEV4ZWNDb21tYW5kKCkgLiAnICcgLiBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZShQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9CSU5BUlknKSkgLiBzdWJzdHIoJGV4ZWMsIDgpOwp9CgppZiAoMCAhPT0gKCRleGl0Q29kZSA9ICR0aGlzLT5leGVjdXRlVHR5KCRleGVjKSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoJzxlcnJvcj5TY3JpcHQgJXMgaGFuZGxpbmcgdGhlICVzIGV2ZW50IHJldHVybmVkIHdpdGggZXJyb3IgY29kZSAnLiRleGl0Q29kZS4nPC9lcnJvcj4nLCAkY2FsbGFibGUsICRldmVudC0+Z2V0TmFtZSgpKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKCnRocm93IG5ldyBTY3JpcHRFeGVjdXRpb25FeGNlcHRpb24oJ0Vycm9yIE91dHB1dDogJy4kdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSwgJGV4aXRDb2RlKTsKfQp9CgokcmV0dXJuTWF4ID0gbWF4KCRyZXR1cm5NYXgsICRyZXR1cm4pOwoKaWYgKCRldmVudC0+aXNQcm9wYWdhdGlvblN0b3BwZWQoKSkgewpicmVhazsKfQp9Cn0gZmluYWxseSB7CiR0aGlzLT5wb3BFdmVudCgpOwoKJGtub3duSWRlbnRpZmllcnMgPSBbXTsKZm9yZWFjaCAoJGF1dG9sb2FkZXJzQmVmb3JlIGFzICRrZXkgPT4gJGNiKSB7CiRrbm93bklkZW50aWZpZXJzWyR0aGlzLT5nZXRDYWxsYmFja0lkZW50aWZpZXIoJGNiKV0gPSBbJ2tleScgPT4gJGtleSwgJ2NhbGxiYWNrJyA9PiAkY2JdOwp9CmZvcmVhY2ggKHNwbF9hdXRvbG9hZF9mdW5jdGlvbnMoKSBhcyAkY2IpIHsKCmlmIChpc3NldCgka25vd25JZGVudGlmaWVyc1skdGhpcy0+Z2V0Q2FsbGJhY2tJZGVudGlmaWVyKCRjYildKSAmJiAka25vd25JZGVudGlmaWVyc1skdGhpcy0+Z2V0Q2FsbGJhY2tJZGVudGlmaWVyKCRjYildWydrZXknXSA9PT0gMCkgewpicmVhazsKfQoKCmlmICgkY2IgaW5zdGFuY2VvZiBDbGFzc0xvYWRlcikgewokY2ItPnVucmVnaXN0ZXIoKTsKJGNiLT5yZWdpc3RlcihmYWxzZSk7Cn0gZWxzZSB7CnNwbF9hdXRvbG9hZF91bnJlZ2lzdGVyKCRjYik7CnNwbF9hdXRvbG9hZF9yZWdpc3RlcigkY2IpOwp9Cn0KfQoKcmV0dXJuICRyZXR1cm5NYXg7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlVHR5KHN0cmluZyAkZXhlYyk6IGludAp7CmlmICgkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewpyZXR1cm4gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGVUdHkoJGV4ZWMpOwp9CgpyZXR1cm4gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGV4ZWMpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UGhwRXhlY0NvbW1hbmQoKTogc3RyaW5nCnsKJGZpbmRlciA9IG5ldyBQaHBFeGVjdXRhYmxlRmluZGVyKCk7CiRwaHBQYXRoID0gJGZpbmRlci0+ZmluZChmYWxzZSk7CmlmICghJHBocFBhdGgpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gbG9jYXRlIFBIUCBiaW5hcnkgdG8gZXhlY3V0ZSAnLiRwaHBQYXRoKTsKfQokcGhwQXJncyA9ICRmaW5kZXItPmZpbmRBcmd1bWVudHMoKTsKJHBocEFyZ3MgPSBcY291bnQoJHBocEFyZ3MpID4gMCA/ICcgJyAuIGltcGxvZGUoJyAnLCAkcGhwQXJncykgOiAnJzsKJGFsbG93VXJsRk9wZW5GbGFnID0gJyAtZCBhbGxvd191cmxfZm9wZW49JyAuIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKGluaV9nZXQoJ2FsbG93X3VybF9mb3BlbicpKTsKJGRpc2FibGVGdW5jdGlvbnNGbGFnID0gJyAtZCBkaXNhYmxlX2Z1bmN0aW9ucz0nIC4gUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoaW5pX2dldCgnZGlzYWJsZV9mdW5jdGlvbnMnKSk7CiRtZW1vcnlMaW1pdEZsYWcgPSAnIC1kIG1lbW9yeV9saW1pdD0nIC4gUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoaW5pX2dldCgnbWVtb3J5X2xpbWl0JykpOwoKcmV0dXJuIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRwaHBQYXRoKSAuICRwaHBBcmdzIC4gJGFsbG93VXJsRk9wZW5GbGFnIC4gJGRpc2FibGVGdW5jdGlvbnNGbGFnIC4gJG1lbW9yeUxpbWl0RmxhZzsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZUV2ZW50UGhwU2NyaXB0KHN0cmluZyAkY2xhc3NOYW1lLCBzdHJpbmcgJG1ldGhvZE5hbWUsIEV2ZW50ICRldmVudCkKewppZiAoJHRoaXMtPmlvLT5pc1ZlcmJvc2UoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignPiAlczogJXM6OiVzJywgJGV2ZW50LT5nZXROYW1lKCksICRjbGFzc05hbWUsICRtZXRob2ROYW1lKSk7Cn0gZWxzZWlmICgkdGhpcy0+ZXZlbnROZWVkc1RvT3V0cHV0KCRldmVudCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoJz4gJXM6OiVzJywgJGNsYXNzTmFtZSwgJG1ldGhvZE5hbWUpKTsKfQoKcmV0dXJuICRjbGFzc05hbWU6OiRtZXRob2ROYW1lKCRldmVudCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZXZlbnROZWVkc1RvT3V0cHV0KEV2ZW50ICRldmVudCk6IGJvb2wKewoKaWYgKCRldmVudC0+Z2V0TmFtZSgpID09PSAnX19leGVjX2NvbW1hbmQnKSB7CnJldHVybiBmYWxzZTsKfQoKCmlmICgoJGV2ZW50LT5nZXRGbGFncygpWydzY3JpcHQtYWxpYXMtaW5wdXQnXSA/PyBudWxsKSAhPT0gbnVsbCkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiB0cnVlOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZExpc3RlbmVyKHN0cmluZyAkZXZlbnROYW1lLCAkbGlzdGVuZXIsIGludCAkcHJpb3JpdHkgPSAwKTogdm9pZAp7CiR0aGlzLT5saXN0ZW5lcnNbJGV2ZW50TmFtZV1bJHByaW9yaXR5XVtdID0gJGxpc3RlbmVyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIoJGxpc3RlbmVyKTogdm9pZAp7CmZvcmVhY2ggKCR0aGlzLT5saXN0ZW5lcnMgYXMgJGV2ZW50TmFtZSA9PiAkcHJpb3JpdGllcykgewpmb3JlYWNoICgkcHJpb3JpdGllcyBhcyAkcHJpb3JpdHkgPT4gJGxpc3RlbmVycykgewpmb3JlYWNoICgkbGlzdGVuZXJzIGFzICRpbmRleCA9PiAkY2FuZGlkYXRlKSB7CmlmICgkbGlzdGVuZXIgPT09ICRjYW5kaWRhdGUgfHwgKGlzX2FycmF5KCRjYW5kaWRhdGUpICYmIGlzX29iamVjdCgkbGlzdGVuZXIpICYmICRjYW5kaWRhdGVbMF0gPT09ICRsaXN0ZW5lcikpIHsKdW5zZXQoJHRoaXMtPmxpc3RlbmVyc1skZXZlbnROYW1lXVskcHJpb3JpdHldWyRpbmRleF0pOwp9Cn0KfQp9Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFN1YnNjcmliZXIoRXZlbnRTdWJzY3JpYmVySW50ZXJmYWNlICRzdWJzY3JpYmVyKTogdm9pZAp7CmZvcmVhY2ggKCRzdWJzY3JpYmVyLT5nZXRTdWJzY3JpYmVkRXZlbnRzKCkgYXMgJGV2ZW50TmFtZSA9PiAkcGFyYW1zKSB7CmlmIChpc19zdHJpbmcoJHBhcmFtcykpIHsKJHRoaXMtPmFkZExpc3RlbmVyKCRldmVudE5hbWUsIFskc3Vic2NyaWJlciwgJHBhcmFtc10pOwp9IGVsc2VpZiAoaXNfc3RyaW5nKCRwYXJhbXNbMF0pKSB7CiR0aGlzLT5hZGRMaXN0ZW5lcigkZXZlbnROYW1lLCBbJHN1YnNjcmliZXIsICRwYXJhbXNbMF1dLCAkcGFyYW1zWzFdID8/IDApOwp9IGVsc2Ugewpmb3JlYWNoICgkcGFyYW1zIGFzICRsaXN0ZW5lcikgewokdGhpcy0+YWRkTGlzdGVuZXIoJGV2ZW50TmFtZSwgWyRzdWJzY3JpYmVyLCAkbGlzdGVuZXJbMF1dLCAkbGlzdGVuZXJbMV0gPz8gMCk7Cn0KfQp9Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldExpc3RlbmVycyhFdmVudCAkZXZlbnQpOiBhcnJheQp7CiRzY3JpcHRMaXN0ZW5lcnMgPSAkdGhpcy0+cnVuU2NyaXB0cyA/ICR0aGlzLT5nZXRTY3JpcHRMaXN0ZW5lcnMoJGV2ZW50KSA6IFtdOwoKaWYgKCFpc3NldCgkdGhpcy0+bGlzdGVuZXJzWyRldmVudC0+Z2V0TmFtZSgpXVswXSkpIHsKJHRoaXMtPmxpc3RlbmVyc1skZXZlbnQtPmdldE5hbWUoKV1bMF0gPSBbXTsKfQprcnNvcnQoJHRoaXMtPmxpc3RlbmVyc1skZXZlbnQtPmdldE5hbWUoKV0pOwoKJGxpc3RlbmVycyA9ICR0aGlzLT5saXN0ZW5lcnM7CiRsaXN0ZW5lcnNbJGV2ZW50LT5nZXROYW1lKCldWzBdID0gYXJyYXlfbWVyZ2UoJGxpc3RlbmVyc1skZXZlbnQtPmdldE5hbWUoKV1bMF0sICRzY3JpcHRMaXN0ZW5lcnMpOwoKcmV0dXJuIGFycmF5X21lcmdlKC4uLiRsaXN0ZW5lcnNbJGV2ZW50LT5nZXROYW1lKCldKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc0V2ZW50TGlzdGVuZXJzKEV2ZW50ICRldmVudCk6IGJvb2wKewokbGlzdGVuZXJzID0gJHRoaXMtPmdldExpc3RlbmVycygkZXZlbnQpOwoKcmV0dXJuIGNvdW50KCRsaXN0ZW5lcnMpID4gMDsKfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFNjcmlwdExpc3RlbmVycyhFdmVudCAkZXZlbnQpOiBhcnJheQp7CiRwYWNrYWdlID0gJHRoaXMtPmNvbXBvc2VyLT5nZXRQYWNrYWdlKCk7CiRzY3JpcHRzID0gJHBhY2thZ2UtPmdldFNjcmlwdHMoKTsKCmlmIChlbXB0eSgkc2NyaXB0c1skZXZlbnQtPmdldE5hbWUoKV0pKSB7CnJldHVybiBbXTsKfQoKaWYgKGluX2FycmF5KCRldmVudC0+Z2V0TmFtZSgpLCAkdGhpcy0+c2tpcFNjcmlwdHMsIHRydWUpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignU2tpcHBlZCBzY3JpcHQgbGlzdGVuZXJzIGZvciA8aW5mbz4nLiRldmVudC0+Z2V0TmFtZSgpLic8L2luZm8+IGJlY2F1c2Ugb2YgQ09NUE9TRVJfU0tJUF9TQ1JJUFRTJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUkJPU0UpOwoKcmV0dXJuIFtdOwp9CgpyZXR1cm4gJHNjcmlwdHNbJGV2ZW50LT5nZXROYW1lKCldOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaXNQaHBTY3JpcHQoc3RyaW5nICRjYWxsYWJsZSk6IGJvb2wKewpyZXR1cm4gZmFsc2UgPT09IHN0cnBvcygkY2FsbGFibGUsICcgJykgJiYgZmFsc2UgIT09IHN0cnBvcygkY2FsbGFibGUsICc6OicpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaXNDb21tYW5kQ2xhc3Moc3RyaW5nICRjYWxsYWJsZSk6IGJvb2wKewpyZXR1cm4gc3RyX2NvbnRhaW5zKCRjYWxsYWJsZSwgJ1xcJykgJiYgIXN0cl9jb250YWlucygkY2FsbGFibGUsICcgJykgJiYgc3RyX2VuZHNfd2l0aCgkY2FsbGFibGUsICdDb21tYW5kJyk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpc0NvbXBvc2VyU2NyaXB0KHN0cmluZyAkY2FsbGFibGUpOiBib29sCnsKcmV0dXJuIHN0cl9zdGFydHNfd2l0aCgkY2FsbGFibGUsICdAJykgJiYgIXN0cl9zdGFydHNfd2l0aCgkY2FsbGFibGUsICdAcGhwICcpICYmICFzdHJfc3RhcnRzX3dpdGgoJGNhbGxhYmxlLCAnQHB1dGVudiAnKTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHVzaEV2ZW50KEV2ZW50ICRldmVudCk6IGludAp7CiRldmVudE5hbWUgPSAkZXZlbnQtPmdldE5hbWUoKTsKaWYgKGluX2FycmF5KCRldmVudE5hbWUsICR0aGlzLT5ldmVudFN0YWNrKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZigiQ2lyY3VsYXIgY2FsbCB0byBzY3JpcHQgaGFuZGxlciAnJXMnIGRldGVjdGVkIiwgJGV2ZW50TmFtZSkpOwp9CgpyZXR1cm4gYXJyYXlfcHVzaCgkdGhpcy0+ZXZlbnRTdGFjaywgJGV2ZW50TmFtZSk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwb3BFdmVudCgpOiA/c3RyaW5nCnsKcmV0dXJuIGFycmF5X3BvcCgkdGhpcy0+ZXZlbnRTdGFjayk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZW5zdXJlQmluRGlySXNJblBhdGgoKTogdm9pZAp7CiRwYXRoRW52ID0gJ1BBVEgnOwoKCgoKaWYgKCFpc3NldCgkX1NFUlZFUlskcGF0aEVudl0pICYmIGlzc2V0KCRfU0VSVkVSWydQYXRoJ10pKSB7CiRwYXRoRW52ID0gJ1BhdGgnOwp9CgoKJGJpbkRpciA9ICR0aGlzLT5jb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgnYmluLWRpcicpOwppZiAoaXNfZGlyKCRiaW5EaXIpKSB7CiRiaW5EaXIgPSByZWFscGF0aCgkYmluRGlyKTsKJHBhdGhWYWx1ZSA9IChzdHJpbmcpIFBsYXRmb3JtOjpnZXRFbnYoJHBhdGhFbnYpOwppZiAoIVByZWc6OmlzTWF0Y2goJ3soXnwnLlBBVEhfU0VQQVJBVE9SLicpJy5wcmVnX3F1b3RlKCRiaW5EaXIpLicoJHwnLlBBVEhfU0VQQVJBVE9SLicpfScsICRwYXRoVmFsdWUpKSB7ClBsYXRmb3JtOjpwdXRFbnYoJHBhdGhFbnYsICRiaW5EaXIuUEFUSF9TRVBBUkFUT1IuJHBhdGhWYWx1ZSk7Cn0KfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldENhbGxiYWNrSWRlbnRpZmllcigkY2IpOiBzdHJpbmcKewppZiAoaXNfc3RyaW5nKCRjYikpIHsKcmV0dXJuICdmbjonLiRjYjsKfQppZiAoaXNfb2JqZWN0KCRjYikpIHsKcmV0dXJuICdvYmo6Jy5zcGxfb2JqZWN0X2hhc2goJGNiKTsKfQppZiAoaXNfYXJyYXkoJGNiKSkgewpyZXR1cm4gJ2FycmF5OicuKGlzX3N0cmluZygkY2JbMF0pID8gJGNiWzBdIDogZ2V0X2NsYXNzKCRjYlswXSkgLicjJy5zcGxfb2JqZWN0X2hhc2goJGNiWzBdKSkuJzo6Jy4kY2JbMV07Cn0KCgpyZXR1cm4gJ3Vuc3VwcG9ydGVkJzsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBtYWtlQXV0b2xvYWRlcihFdmVudCAkZXZlbnQsICRjYWxsYWJsZSk6IHZvaWQKewppZiAoISR0aGlzLT5jb21wb3NlciBpbnN0YW5jZW9mIENvbXBvc2VyKSB7CnJldHVybjsKfQoKaWYgKGlzX2FycmF5KCRjYWxsYWJsZSkpIHsKaWYgKGlzX3N0cmluZygkY2FsbGFibGVbMF0pKSB7CiRjYWxsYWJsZUtleSA9ICRjYWxsYWJsZVswXSAuICc6OicgLiAkY2FsbGFibGVbMV07Cn0gZWxzZSB7CiRjYWxsYWJsZUtleSA9IGdldF9jbGFzcygkY2FsbGFibGVbMF0pLic6OicuJGNhbGxhYmxlWzFdOwp9Cn0gZWxzZWlmIChpc19zdHJpbmcoJGNhbGxhYmxlKSkgewokY2FsbGFibGVLZXkgPSAkY2FsbGFibGU7Cn0gZWxzZWlmICgkY2FsbGFibGUgaW5zdGFuY2VvZiBcQ2xvc3VyZSkgewokY2FsbGFibGVLZXkgPSAnY2xvc3VyZSc7Cn0gZWxzZSB7CiRjYWxsYWJsZUtleSA9ICd1bmtub3duJzsKfQppZiAoaXNzZXQoJHRoaXMtPnByZXZpb3VzTGlzdGVuZXJzWyRjYWxsYWJsZUtleV0pKSB7CnJldHVybjsKfQokdGhpcy0+cHJldmlvdXNMaXN0ZW5lcnNbJGNhbGxhYmxlS2V5XSA9IHRydWU7CgokcGFja2FnZSA9ICR0aGlzLT5jb21wb3Nlci0+Z2V0UGFja2FnZSgpOwokcGFja2FnZXMgPSAkdGhpcy0+Y29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpLT5nZXRDYW5vbmljYWxQYWNrYWdlcygpOwokZ2VuZXJhdG9yID0gJHRoaXMtPmNvbXBvc2VyLT5nZXRBdXRvbG9hZEdlbmVyYXRvcigpOwokaGFzaCA9IGltcGxvZGUoJywnLCBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uIChQYWNrYWdlSW50ZXJmYWNlICRwKSB7CnJldHVybiAkcC0+Z2V0TmFtZSgpLicvJy4kcC0+Z2V0VmVyc2lvbigpOwp9LCAkcGFja2FnZXMpKTsKaWYgKCRldmVudCBpbnN0YW5jZW9mIFNjcmlwdEV2ZW50IHx8ICRldmVudCBpbnN0YW5jZW9mIFBhY2thZ2VFdmVudCB8fCAkZXZlbnQgaW5zdGFuY2VvZiBJbnN0YWxsZXJFdmVudCkgewokZ2VuZXJhdG9yLT5zZXREZXZNb2RlKCRldmVudC0+aXNEZXZNb2RlKCkpOwokaGFzaCAuPSAkZXZlbnQtPmlzRGV2TW9kZSgpID8gJy9kZXYnIDogJyc7Cn0KJGhhc2ggPSBoYXNoKCdzaGEyNTYnLCAkaGFzaCk7CgppZiAoJHRoaXMtPnByZXZpb3VzSGFzaCA9PT0gJGhhc2gpIHsKcmV0dXJuOwp9CgokdGhpcy0+cHJldmlvdXNIYXNoID0gJGhhc2g7CgokcGFja2FnZU1hcCA9ICRnZW5lcmF0b3ItPmJ1aWxkUGFja2FnZU1hcCgkdGhpcy0+Y29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKSwgJHBhY2thZ2UsICRwYWNrYWdlcyk7CiRtYXAgPSAkZ2VuZXJhdG9yLT5wYXJzZUF1dG9sb2FkcygkcGFja2FnZU1hcCwgJHBhY2thZ2UpOwoKaWYgKCR0aGlzLT5sb2FkZXIgIT09IG51bGwpIHsKJHRoaXMtPmxvYWRlci0+dW5yZWdpc3RlcigpOwp9CgokdGhpcy0+bG9hZGVyID0gJGdlbmVyYXRvci0+Y3JlYXRlTG9hZGVyKCRtYXAsICR0aGlzLT5jb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgndmVuZG9yLWRpcicpKTsKJHRoaXMtPmxvYWRlci0+cmVnaXN0ZXIoZmFsc2UpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlcjsKCgoKCgoKCgoKCgoKCmludGVyZmFjZSBFdmVudFN1YnNjcmliZXJJbnRlcmZhY2UKewoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFN1YnNjcmliZWRFdmVudHMoKTsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyOwoKCgoKCgpjbGFzcyBTY3JpcHRFeGVjdXRpb25FeGNlcHRpb24gZXh0ZW5kcyBcUnVudGltZUV4Y2VwdGlvbgp7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEV4Y2VwdGlvbjsKCgoKCmNsYXNzIElycmVjb3ZlcmFibGVEb3dubG9hZEV4Y2VwdGlvbiBleHRlbmRzIFxSdW50aW1lRXhjZXB0aW9uCnsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRXhjZXB0aW9uOwoKCgoKCgpjbGFzcyBOb1NzbEV4Y2VwdGlvbiBleHRlbmRzIFxSdW50aW1lRXhjZXB0aW9uCnsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXI7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnXEpzb25Db25maWdTb3VyY2U7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEFyY2hpdmVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25HdWVzc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcRmlsZXN5c3RlbVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlNYW5hZ2VyOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5RmFjdG9yeTsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CnVzZSBDb21wb3NlclxVdGlsXExvb3A7CnVzZSBDb21wb3NlclxVdGlsXFNpbGVuY2VyOwp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudDsKdXNlIFBoYXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXJTdHlsZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVPdXRwdXQ7CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnREaXNwYXRjaGVyOwp1c2UgQ29tcG9zZXJcQXV0b2xvYWRcQXV0b2xvYWRHZW5lcmF0b3I7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uVmFsaWRhdGlvbkV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbjsKdXNlIFppcEFyY2hpdmU7CgoKCgoKCgoKCmNsYXNzIEZhY3RvcnkKewoKCgpwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGdldEhvbWVEaXIoKTogc3RyaW5nCnsKJGhvbWUgPSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9IT01FJyk7CmlmICgkaG9tZSkgewpyZXR1cm4gJGhvbWU7Cn0KCmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKaWYgKCFQbGF0Zm9ybTo6Z2V0RW52KCdBUFBEQVRBJykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgQVBQREFUQSBvciBDT01QT1NFUl9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIG11c3QgYmUgc2V0IGZvciBjb21wb3NlciB0byBydW4gY29ycmVjdGx5Jyk7Cn0KCnJldHVybiBydHJpbShzdHJ0cihQbGF0Zm9ybTo6Z2V0RW52KCdBUFBEQVRBJyksICdcXCcsICcvJyksICcvJykgLiAnL0NvbXBvc2VyJzsKfQoKJHVzZXJEaXIgPSBzZWxmOjpnZXRVc2VyRGlyKCk7CiRkaXJzID0gW107CgppZiAoc2VsZjo6dXNlWGRnKCkpIHsKCiR4ZGdDb25maWcgPSBQbGF0Zm9ybTo6Z2V0RW52KCdYREdfQ09ORklHX0hPTUUnKTsKaWYgKCEkeGRnQ29uZmlnKSB7CiR4ZGdDb25maWcgPSAkdXNlckRpciAuICcvLmNvbmZpZyc7Cn0KCiRkaXJzW10gPSAkeGRnQ29uZmlnIC4gJy9jb21wb3Nlcic7Cn0KCiRkaXJzW10gPSAkdXNlckRpciAuICcvLmNvbXBvc2VyJzsKCgpmb3JlYWNoICgkZGlycyBhcyAkZGlyKSB7CmlmIChTaWxlbmNlcjo6Y2FsbCgnaXNfZGlyJywgJGRpcikpIHsKcmV0dXJuICRkaXI7Cn0KfQoKCnJldHVybiAkZGlyc1swXTsKfQoKcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBnZXRDYWNoZURpcihzdHJpbmcgJGhvbWUpOiBzdHJpbmcKewokY2FjaGVEaXIgPSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9DQUNIRV9ESVInKTsKaWYgKCRjYWNoZURpcikgewpyZXR1cm4gJGNhY2hlRGlyOwp9CgokaG9tZUVudiA9IFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0hPTUUnKTsKaWYgKCRob21lRW52KSB7CnJldHVybiAkaG9tZUVudiAuICcvY2FjaGUnOwp9CgppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CmlmICgkY2FjaGVEaXIgPSBQbGF0Zm9ybTo6Z2V0RW52KCdMT0NBTEFQUERBVEEnKSkgewokY2FjaGVEaXIgLj0gJy9Db21wb3Nlcic7Cn0gZWxzZSB7CiRjYWNoZURpciA9ICRob21lIC4gJy9jYWNoZSc7Cn0KCnJldHVybiBydHJpbShzdHJ0cigkY2FjaGVEaXIsICdcXCcsICcvJyksICcvJyk7Cn0KCiR1c2VyRGlyID0gc2VsZjo6Z2V0VXNlckRpcigpOwppZiAoUEhQX09TID09PSAnRGFyd2luJykgewoKaWYgKGlzX2RpcigkaG9tZSAuICcvY2FjaGUnKSAmJiAhaXNfZGlyKCR1c2VyRGlyIC4gJy9MaWJyYXJ5L0NhY2hlcy9jb21wb3NlcicpKSB7ClNpbGVuY2VyOjpjYWxsKCdyZW5hbWUnLCAkaG9tZSAuICcvY2FjaGUnLCAkdXNlckRpciAuICcvTGlicmFyeS9DYWNoZXMvY29tcG9zZXInKTsKfQoKcmV0dXJuICR1c2VyRGlyIC4gJy9MaWJyYXJ5L0NhY2hlcy9jb21wb3Nlcic7Cn0KCmlmICgkaG9tZSA9PT0gJHVzZXJEaXIgLiAnLy5jb21wb3NlcicgJiYgaXNfZGlyKCRob21lIC4gJy9jYWNoZScpKSB7CnJldHVybiAkaG9tZSAuICcvY2FjaGUnOwp9CgppZiAoc2VsZjo6dXNlWGRnKCkpIHsKJHhkZ0NhY2hlID0gUGxhdGZvcm06OmdldEVudignWERHX0NBQ0hFX0hPTUUnKSA/OiAkdXNlckRpciAuICcvLmNhY2hlJzsKCnJldHVybiAkeGRnQ2FjaGUgLiAnL2NvbXBvc2VyJzsKfQoKcmV0dXJuICRob21lIC4gJy9jYWNoZSc7Cn0KCnByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gZ2V0RGF0YURpcihzdHJpbmcgJGhvbWUpOiBzdHJpbmcKewokaG9tZUVudiA9IFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0hPTUUnKTsKaWYgKCRob21lRW52KSB7CnJldHVybiAkaG9tZUVudjsKfQoKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewpyZXR1cm4gc3RydHIoJGhvbWUsICdcXCcsICcvJyk7Cn0KCiR1c2VyRGlyID0gc2VsZjo6Z2V0VXNlckRpcigpOwppZiAoJGhvbWUgIT09ICR1c2VyRGlyIC4gJy8uY29tcG9zZXInICYmIHNlbGY6OnVzZVhkZygpKSB7CiR4ZGdEYXRhID0gUGxhdGZvcm06OmdldEVudignWERHX0RBVEFfSE9NRScpID86ICR1c2VyRGlyIC4gJy8ubG9jYWwvc2hhcmUnOwoKcmV0dXJuICR4ZGdEYXRhIC4gJy9jb21wb3Nlcic7Cn0KCnJldHVybiAkaG9tZTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVDb25maWcoP0lPSW50ZXJmYWNlICRpbyA9IG51bGwsID9zdHJpbmcgJGN3ZCA9IG51bGwpOiBDb25maWcKewokY3dkID0gJGN3ZCA/PyBQbGF0Zm9ybTo6Z2V0Q3dkKHRydWUpOwoKJGNvbmZpZyA9IG5ldyBDb25maWcodHJ1ZSwgJGN3ZCk7CgoKJGhvbWUgPSBzZWxmOjpnZXRIb21lRGlyKCk7CiRjb25maWctPm1lcmdlKFsKJ2NvbmZpZycgPT4gWwonaG9tZScgPT4gJGhvbWUsCidjYWNoZS1kaXInID0+IHNlbGY6OmdldENhY2hlRGlyKCRob21lKSwKJ2RhdGEtZGlyJyA9PiBzZWxmOjpnZXREYXRhRGlyKCRob21lKSwKXSwKXSwgQ29uZmlnOjpTT1VSQ0VfREVGQVVMVCk7CgoKJGZpbGUgPSBuZXcgSnNvbkZpbGUoJGNvbmZpZy0+Z2V0KCdob21lJykuJy9jb25maWcuanNvbicpOwppZiAoJGZpbGUtPmV4aXN0cygpKSB7CmlmICgkaW8gaW5zdGFuY2VvZiBJT0ludGVyZmFjZSkgewokaW8tPndyaXRlRXJyb3IoJ0xvYWRpbmcgY29uZmlnIGZpbGUgJyAuICRmaWxlLT5nZXRQYXRoKCksIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7Cn0Kc2VsZjo6dmFsaWRhdGVKc29uU2NoZW1hKCRpbywgJGZpbGUpOwokY29uZmlnLT5tZXJnZSgkZmlsZS0+cmVhZCgpLCAkZmlsZS0+Z2V0UGF0aCgpKTsKfQokY29uZmlnLT5zZXRDb25maWdTb3VyY2UobmV3IEpzb25Db25maWdTb3VyY2UoJGZpbGUpKTsKCiRodGFjY2Vzc1Byb3RlY3QgPSAkY29uZmlnLT5nZXQoJ2h0YWNjZXNzLXByb3RlY3QnKTsKaWYgKCRodGFjY2Vzc1Byb3RlY3QpIHsKCgoKJGRpcnMgPSBbJGNvbmZpZy0+Z2V0KCdob21lJyksICRjb25maWctPmdldCgnY2FjaGUtZGlyJyksICRjb25maWctPmdldCgnZGF0YS1kaXInKV07CmZvcmVhY2ggKCRkaXJzIGFzICRkaXIpIHsKaWYgKCFmaWxlX2V4aXN0cygkZGlyIC4gJy8uaHRhY2Nlc3MnKSkgewppZiAoIWlzX2RpcigkZGlyKSkgewpTaWxlbmNlcjo6Y2FsbCgnbWtkaXInLCAkZGlyLCAwNzc3LCB0cnVlKTsKfQpTaWxlbmNlcjo6Y2FsbCgnZmlsZV9wdXRfY29udGVudHMnLCAkZGlyIC4gJy8uaHRhY2Nlc3MnLCAnRGVueSBmcm9tIGFsbCcpOwp9Cn0KfQoKCiRmaWxlID0gbmV3IEpzb25GaWxlKCRjb25maWctPmdldCgnaG9tZScpLicvYXV0aC5qc29uJyk7CmlmICgkZmlsZS0+ZXhpc3RzKCkpIHsKaWYgKCRpbyBpbnN0YW5jZW9mIElPSW50ZXJmYWNlKSB7CiRpby0+d3JpdGVFcnJvcignTG9hZGluZyBjb25maWcgZmlsZSAnIC4gJGZpbGUtPmdldFBhdGgoKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKfQpzZWxmOjp2YWxpZGF0ZUpzb25TY2hlbWEoJGlvLCAkZmlsZSwgSnNvbkZpbGU6OkFVVEhfU0NIRU1BKTsKJGNvbmZpZy0+bWVyZ2UoWydjb25maWcnID0+ICRmaWxlLT5yZWFkKCldLCAkZmlsZS0+Z2V0UGF0aCgpKTsKfQokY29uZmlnLT5zZXRBdXRoQ29uZmlnU291cmNlKG5ldyBKc29uQ29uZmlnU291cmNlKCRmaWxlLCB0cnVlKSk7CgpzZWxmOjpsb2FkQ29tcG9zZXJBdXRoRW52KCRjb25maWcsICRpbyk7CgpyZXR1cm4gJGNvbmZpZzsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRDb21wb3NlckZpbGUoKTogc3RyaW5nCnsKJGVudiA9IFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSJyk7CmlmIChpc19zdHJpbmcoJGVudikpIHsKJGVudiA9IHRyaW0oJGVudik7CmlmICgnJyAhPT0gJGVudikgewppZiAoaXNfZGlyKCRlbnYpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIENPTVBPU0VSIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCB0byAnLiRlbnYuJyB3aGljaCBpcyBhIGRpcmVjdG9yeSwgdGhpcyB2YXJpYWJsZSBzaG91bGQgcG9pbnQgdG8gYSBjb21wb3Nlci5qc29uIG9yIGJlIGxlZnQgdW5zZXQuJyk7Cn0KCnJldHVybiAkZW52Owp9Cn0KCnJldHVybiAnLi9jb21wb3Nlci5qc29uJzsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRMb2NrRmlsZShzdHJpbmcgJGNvbXBvc2VyRmlsZSk6IHN0cmluZwp7CnJldHVybiAianNvbiIgPT09IHBhdGhpbmZvKCRjb21wb3NlckZpbGUsIFBBVEhJTkZPX0VYVEVOU0lPTikKPyBzdWJzdHIoJGNvbXBvc2VyRmlsZSwgMCwgLTQpLidsb2NrJwo6ICRjb21wb3NlckZpbGUgLiAnLmxvY2snOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZUFkZGl0aW9uYWxTdHlsZXMoKTogYXJyYXkKewpyZXR1cm4gWwonaGlnaGxpZ2h0JyA9PiBuZXcgT3V0cHV0Rm9ybWF0dGVyU3R5bGUoJ3JlZCcpLAond2FybmluZycgPT4gbmV3IE91dHB1dEZvcm1hdHRlclN0eWxlKCdibGFjaycsICd5ZWxsb3cnKSwKXTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVPdXRwdXQoKTogQ29uc29sZU91dHB1dAp7CiRzdHlsZXMgPSBzZWxmOjpjcmVhdGVBZGRpdGlvbmFsU3R5bGVzKCk7CiRmb3JtYXR0ZXIgPSBuZXcgT3V0cHV0Rm9ybWF0dGVyKGZhbHNlLCAkc3R5bGVzKTsKCnJldHVybiBuZXcgQ29uc29sZU91dHB1dChDb25zb2xlT3V0cHV0OjpWRVJCT1NJVFlfTk9STUFMLCBudWxsLCAkZm9ybWF0dGVyKTsKfQoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY3JlYXRlQ29tcG9zZXIoSU9JbnRlcmZhY2UgJGlvLCAkbG9jYWxDb25maWcgPSBudWxsLCAkZGlzYWJsZVBsdWdpbnMgPSBmYWxzZSwgP3N0cmluZyAkY3dkID0gbnVsbCwgYm9vbCAkZnVsbExvYWQgPSB0cnVlLCBib29sICRkaXNhYmxlU2NyaXB0cyA9IGZhbHNlKQp7CgppZiAoaXNfc3RyaW5nKCRsb2NhbENvbmZpZykgJiYgaXNfZmlsZSgkbG9jYWxDb25maWcpICYmIG51bGwgPT09ICRjd2QpIHsKJGN3ZCA9IGRpcm5hbWUoJGxvY2FsQ29uZmlnKTsKfQoKJGN3ZCA9ICRjd2QgPz8gUGxhdGZvcm06OmdldEN3ZCh0cnVlKTsKCgppZiAobnVsbCA9PT0gJGxvY2FsQ29uZmlnKSB7CiRsb2NhbENvbmZpZyA9IHN0YXRpYzo6Z2V0Q29tcG9zZXJGaWxlKCk7Cn0KCiRsb2NhbENvbmZpZ1NvdXJjZSA9IENvbmZpZzo6U09VUkNFX1VOS05PV047CmlmIChpc19zdHJpbmcoJGxvY2FsQ29uZmlnKSkgewokY29tcG9zZXJGaWxlID0gJGxvY2FsQ29uZmlnOwoKJGZpbGUgPSBuZXcgSnNvbkZpbGUoJGxvY2FsQ29uZmlnLCBudWxsLCAkaW8pOwoKaWYgKCEkZmlsZS0+ZXhpc3RzKCkpIHsKaWYgKCRsb2NhbENvbmZpZyA9PT0gJy4vY29tcG9zZXIuanNvbicgfHwgJGxvY2FsQ29uZmlnID09PSAnY29tcG9zZXIuanNvbicpIHsKJG1lc3NhZ2UgPSAnQ29tcG9zZXIgY291bGQgbm90IGZpbmQgYSBjb21wb3Nlci5qc29uIGZpbGUgaW4gJy4kY3dkOwp9IGVsc2UgewokbWVzc2FnZSA9ICdDb21wb3NlciBjb3VsZCBub3QgZmluZCB0aGUgY29uZmlnIGZpbGU6ICcuJGxvY2FsQ29uZmlnOwp9CiRpbnN0cnVjdGlvbnMgPSAkZnVsbExvYWQgPyAnVG8gaW5pdGlhbGl6ZSBhIHByb2plY3QsIHBsZWFzZSBjcmVhdGUgYSBjb21wb3Nlci5qc29uIGZpbGUuIFNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9iYXNpYy11c2FnZScgOiAnJzsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJG1lc3NhZ2UuUEhQX0VPTC4kaW5zdHJ1Y3Rpb25zKTsKfQoKaWYgKCFQbGF0Zm9ybTo6aXNJbnB1dENvbXBsZXRpb25Qcm9jZXNzKCkpIHsKdHJ5IHsKJGZpbGUtPnZhbGlkYXRlU2NoZW1hKEpzb25GaWxlOjpMQVhfU0NIRU1BKTsKfSBjYXRjaCAoSnNvblZhbGlkYXRpb25FeGNlcHRpb24gJGUpIHsKJGVycm9ycyA9ICcgLSAnIC4gaW1wbG9kZShQSFBfRU9MIC4gJyAtICcsICRlLT5nZXRFcnJvcnMoKSk7CiRtZXNzYWdlID0gJGUtPmdldE1lc3NhZ2UoKSAuICc6JyAuIFBIUF9FT0wgLiAkZXJyb3JzOwp0aHJvdyBuZXcgSnNvblZhbGlkYXRpb25FeGNlcHRpb24oJG1lc3NhZ2UpOwp9Cn0KCiRsb2NhbENvbmZpZyA9ICRmaWxlLT5yZWFkKCk7CiRsb2NhbENvbmZpZ1NvdXJjZSA9ICRmaWxlLT5nZXRQYXRoKCk7Cn0KCgokY29uZmlnID0gc3RhdGljOjpjcmVhdGVDb25maWcoJGlvLCAkY3dkKTsKJGlzR2xvYmFsID0gJGxvY2FsQ29uZmlnU291cmNlICE9PSBDb25maWc6OlNPVVJDRV9VTktOT1dOICYmIHJlYWxwYXRoKCRjb25maWctPmdldCgnaG9tZScpKSA9PT0gcmVhbHBhdGgoZGlybmFtZSgkbG9jYWxDb25maWdTb3VyY2UpKTsKJGNvbmZpZy0+bWVyZ2UoJGxvY2FsQ29uZmlnLCAkbG9jYWxDb25maWdTb3VyY2UpOwoKaWYgKGlzc2V0KCRjb21wb3NlckZpbGUpKSB7CiRpby0+d3JpdGVFcnJvcignTG9hZGluZyBjb25maWcgZmlsZSAnIC4gJGNvbXBvc2VyRmlsZSAuJyAoJy5yZWFscGF0aCgkY29tcG9zZXJGaWxlKS4nKScsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CiRjb25maWctPnNldENvbmZpZ1NvdXJjZShuZXcgSnNvbkNvbmZpZ1NvdXJjZShuZXcgSnNvbkZpbGUocmVhbHBhdGgoJGNvbXBvc2VyRmlsZSksIG51bGwsICRpbykpKTsKCiRsb2NhbEF1dGhGaWxlID0gbmV3IEpzb25GaWxlKGRpcm5hbWUocmVhbHBhdGgoJGNvbXBvc2VyRmlsZSkpIC4gJy9hdXRoLmpzb24nLCBudWxsLCAkaW8pOwppZiAoJGxvY2FsQXV0aEZpbGUtPmV4aXN0cygpKSB7CiRpby0+d3JpdGVFcnJvcignTG9hZGluZyBjb25maWcgZmlsZSAnIC4gJGxvY2FsQXV0aEZpbGUtPmdldFBhdGgoKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKc2VsZjo6dmFsaWRhdGVKc29uU2NoZW1hKCRpbywgJGxvY2FsQXV0aEZpbGUsIEpzb25GaWxlOjpBVVRIX1NDSEVNQSk7CiRjb25maWctPm1lcmdlKFsnY29uZmlnJyA9PiAkbG9jYWxBdXRoRmlsZS0+cmVhZCgpXSwgJGxvY2FsQXV0aEZpbGUtPmdldFBhdGgoKSk7CiRjb25maWctPnNldExvY2FsQXV0aENvbmZpZ1NvdXJjZShuZXcgSnNvbkNvbmZpZ1NvdXJjZSgkbG9jYWxBdXRoRmlsZSwgdHJ1ZSkpOwp9Cn0KCgpzZWxmOjpsb2FkQ29tcG9zZXJBdXRoRW52KCRjb25maWcsICRpbyk7CgokdmVuZG9yRGlyID0gJGNvbmZpZy0+Z2V0KCd2ZW5kb3ItZGlyJyk7CgoKJGNvbXBvc2VyID0gJGZ1bGxMb2FkID8gbmV3IENvbXBvc2VyKCkgOiBuZXcgUGFydGlhbENvbXBvc2VyKCk7CiRjb21wb3Nlci0+c2V0Q29uZmlnKCRjb25maWcpOwppZiAoJGlzR2xvYmFsKSB7CiRjb21wb3Nlci0+c2V0R2xvYmFsKCk7Cn0KCmlmICgkZnVsbExvYWQpIHsKCiRpby0+bG9hZENvbmZpZ3VyYXRpb24oJGNvbmZpZyk7CgoKCmlmIChmYWxzZSA9PT0gJGRpc2FibGVQbHVnaW5zICYmIGZhbHNlID09PSAkZGlzYWJsZVNjcmlwdHMgJiYgIWNsYXNzX2V4aXN0cygnQ29tcG9zZXJcSW5zdGFsbGVkVmVyc2lvbnMnLCBmYWxzZSkgJiYgZmlsZV9leGlzdHMoJGluc3RhbGxlZFZlcnNpb25zUGF0aCA9ICRjb25maWctPmdldCgndmVuZG9yLWRpcicpLicvY29tcG9zZXIvaW5zdGFsbGVkLnBocCcpKSB7CgoKaWYgKGNsYXNzX2V4aXN0cygnQ29tcG9zZXJcSW5zdGFsbGVkVmVyc2lvbnMnKSkgewpGaWxlc3lzdGVtUmVwb3NpdG9yeTo6c2FmZWx5TG9hZEluc3RhbGxlZFZlcnNpb25zKCRpbnN0YWxsZWRWZXJzaW9uc1BhdGgpOwp9Cn0KfQoKJGh0dHBEb3dubG9hZGVyID0gc2VsZjo6Y3JlYXRlSHR0cERvd25sb2FkZXIoJGlvLCAkY29uZmlnKTsKJHByb2Nlc3MgPSBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7CiRsb29wID0gbmV3IExvb3AoJGh0dHBEb3dubG9hZGVyLCAkcHJvY2Vzcyk7CiRjb21wb3Nlci0+c2V0TG9vcCgkbG9vcCk7CgoKJGRpc3BhdGNoZXIgPSBuZXcgRXZlbnREaXNwYXRjaGVyKCRjb21wb3NlciwgJGlvLCAkcHJvY2Vzcyk7CiRkaXNwYXRjaGVyLT5zZXRSdW5TY3JpcHRzKCEkZGlzYWJsZVNjcmlwdHMpOwokY29tcG9zZXItPnNldEV2ZW50RGlzcGF0Y2hlcigkZGlzcGF0Y2hlcik7CgoKJHJtID0gUmVwb3NpdG9yeUZhY3Rvcnk6Om1hbmFnZXIoJGlvLCAkY29uZmlnLCAkaHR0cERvd25sb2FkZXIsICRkaXNwYXRjaGVyLCAkcHJvY2Vzcyk7CiRjb21wb3Nlci0+c2V0UmVwb3NpdG9yeU1hbmFnZXIoJHJtKTsKCgoKaWYgKCEkZnVsbExvYWQgJiYgIWlzc2V0KCRsb2NhbENvbmZpZ1sndmVyc2lvbiddKSkgewokbG9jYWxDb25maWdbJ3ZlcnNpb24nXSA9ICcxLjAuMCc7Cn0KCgokcGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXI7CiRndWVzc2VyID0gbmV3IFZlcnNpb25HdWVzc2VyKCRjb25maWcsICRwcm9jZXNzLCAkcGFyc2VyLCAkaW8pOwokbG9hZGVyID0gJHRoaXMtPmxvYWRSb290UGFja2FnZSgkcm0sICRjb25maWcsICRwYXJzZXIsICRndWVzc2VyLCAkaW8pOwokcGFja2FnZSA9ICRsb2FkZXItPmxvYWQoJGxvY2FsQ29uZmlnLCAnQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZScsICRjd2QpOwokY29tcG9zZXItPnNldFBhY2thZ2UoJHBhY2thZ2UpOwoKCiR0aGlzLT5hZGRMb2NhbFJlcG9zaXRvcnkoJGlvLCAkcm0sICR2ZW5kb3JEaXIsICRwYWNrYWdlLCAkcHJvY2Vzcyk7CgoKJGltID0gJHRoaXMtPmNyZWF0ZUluc3RhbGxhdGlvbk1hbmFnZXIoJGxvb3AsICRpbywgJGRpc3BhdGNoZXIpOwokY29tcG9zZXItPnNldEluc3RhbGxhdGlvbk1hbmFnZXIoJGltKTsKCmlmICgkY29tcG9zZXIgaW5zdGFuY2VvZiBDb21wb3NlcikgewoKJGRtID0gJHRoaXMtPmNyZWF0ZURvd25sb2FkTWFuYWdlcigkaW8sICRjb25maWcsICRodHRwRG93bmxvYWRlciwgJHByb2Nlc3MsICRkaXNwYXRjaGVyKTsKJGNvbXBvc2VyLT5zZXREb3dubG9hZE1hbmFnZXIoJGRtKTsKCgokZ2VuZXJhdG9yID0gbmV3IEF1dG9sb2FkR2VuZXJhdG9yKCRkaXNwYXRjaGVyLCAkaW8pOwokY29tcG9zZXItPnNldEF1dG9sb2FkR2VuZXJhdG9yKCRnZW5lcmF0b3IpOwoKCiRhbSA9ICR0aGlzLT5jcmVhdGVBcmNoaXZlTWFuYWdlcigkY29uZmlnLCAkZG0sICRsb29wKTsKJGNvbXBvc2VyLT5zZXRBcmNoaXZlTWFuYWdlcigkYW0pOwp9CgoKJHRoaXMtPmNyZWF0ZURlZmF1bHRJbnN0YWxsZXJzKCRpbSwgJGNvbXBvc2VyLCAkaW8sICRwcm9jZXNzKTsKCgppZiAoJGNvbXBvc2VyIGluc3RhbmNlb2YgQ29tcG9zZXIgJiYgaXNzZXQoJGNvbXBvc2VyRmlsZSkpIHsKJGxvY2tGaWxlID0gc2VsZjo6Z2V0TG9ja0ZpbGUoJGNvbXBvc2VyRmlsZSk7CmlmICghJGNvbmZpZy0+Z2V0KCdsb2NrJykgJiYgZmlsZV9leGlzdHMoJGxvY2tGaWxlKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPicuJGxvY2tGaWxlLicgaXMgcHJlc2VudCBidXQgaWdub3JlZCBhcyB0aGUgImxvY2siIGNvbmZpZyBvcHRpb24gaXMgZGlzYWJsZWQuPC93YXJuaW5nPicpOwp9CgokbG9ja2VyID0gbmV3IFBhY2thZ2VcTG9ja2VyKCRpbywgbmV3IEpzb25GaWxlKCRjb25maWctPmdldCgnbG9jaycpID8gJGxvY2tGaWxlIDogUGxhdGZvcm06OmdldERldk51bGwoKSwgbnVsbCwgJGlvKSwgJGltLCBmaWxlX2dldF9jb250ZW50cygkY29tcG9zZXJGaWxlKSwgJHByb2Nlc3MpOwokY29tcG9zZXItPnNldExvY2tlcigkbG9ja2VyKTsKfSBlbHNlaWYgKCRjb21wb3NlciBpbnN0YW5jZW9mIENvbXBvc2VyKSB7CiRsb2NrZXIgPSBuZXcgUGFja2FnZVxMb2NrZXIoJGlvLCBuZXcgSnNvbkZpbGUoUGxhdGZvcm06OmdldERldk51bGwoKSwgbnVsbCwgJGlvKSwgJGltLCBKc29uRmlsZTo6ZW5jb2RlKCRsb2NhbENvbmZpZyksICRwcm9jZXNzKTsKJGNvbXBvc2VyLT5zZXRMb2NrZXIoJGxvY2tlcik7Cn0KCmlmICgkY29tcG9zZXIgaW5zdGFuY2VvZiBDb21wb3NlcikgewokZ2xvYmFsQ29tcG9zZXIgPSBudWxsOwppZiAoISRjb21wb3Nlci0+aXNHbG9iYWwoKSkgewokZ2xvYmFsQ29tcG9zZXIgPSAkdGhpcy0+Y3JlYXRlR2xvYmFsQ29tcG9zZXIoJGlvLCAkY29uZmlnLCAkZGlzYWJsZVBsdWdpbnMsICRkaXNhYmxlU2NyaXB0cyk7Cn0KCiRwbSA9ICR0aGlzLT5jcmVhdGVQbHVnaW5NYW5hZ2VyKCRpbywgJGNvbXBvc2VyLCAkZ2xvYmFsQ29tcG9zZXIsICRkaXNhYmxlUGx1Z2lucyk7CiRjb21wb3Nlci0+c2V0UGx1Z2luTWFuYWdlcigkcG0pOwoKaWYgKCRjb21wb3Nlci0+aXNHbG9iYWwoKSkgewokcG0tPnNldFJ1bm5pbmdJbkdsb2JhbERpcih0cnVlKTsKfQoKJHBtLT5sb2FkSW5zdGFsbGVkUGx1Z2lucygpOwp9CgppZiAoJGZ1bGxMb2FkKSB7CiRpbml0RXZlbnQgPSBuZXcgRXZlbnQoUGx1Z2luRXZlbnRzOjpJTklUKTsKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2goJGluaXRFdmVudC0+Z2V0TmFtZSgpLCAkaW5pdEV2ZW50KTsKCgoKJHRoaXMtPnB1cmdlUGFja2FnZXMoJHJtLT5nZXRMb2NhbFJlcG9zaXRvcnkoKSwgJGltKTsKfQoKcmV0dXJuICRjb21wb3NlcjsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlR2xvYmFsKElPSW50ZXJmYWNlICRpbywgYm9vbCAkZGlzYWJsZVBsdWdpbnMgPSBmYWxzZSwgYm9vbCAkZGlzYWJsZVNjcmlwdHMgPSBmYWxzZSk6ID9Db21wb3Nlcgp7CiRmYWN0b3J5ID0gbmV3IHN0YXRpYygpOwoKcmV0dXJuICRmYWN0b3J5LT5jcmVhdGVHbG9iYWxDb21wb3NlcigkaW8sIHN0YXRpYzo6Y3JlYXRlQ29uZmlnKCRpbyksICRkaXNhYmxlUGx1Z2lucywgJGRpc2FibGVTY3JpcHRzLCB0cnVlKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZExvY2FsUmVwb3NpdG9yeShJT0ludGVyZmFjZSAkaW8sIFJlcG9zaXRvcnlNYW5hZ2VyICRybSwgc3RyaW5nICR2ZW5kb3JEaXIsIFJvb3RQYWNrYWdlSW50ZXJmYWNlICRyb290UGFja2FnZSwgP1Byb2Nlc3NFeGVjdXRvciAkcHJvY2VzcyA9IG51bGwpOiB2b2lkCnsKJGZzID0gbnVsbDsKaWYgKCRwcm9jZXNzKSB7CiRmcyA9IG5ldyBGaWxlc3lzdGVtKCRwcm9jZXNzKTsKfQoKJHJtLT5zZXRMb2NhbFJlcG9zaXRvcnkobmV3IFJlcG9zaXRvcnlcSW5zdGFsbGVkRmlsZXN5c3RlbVJlcG9zaXRvcnkobmV3IEpzb25GaWxlKCR2ZW5kb3JEaXIuJy9jb21wb3Nlci9pbnN0YWxsZWQuanNvbicsIG51bGwsICRpbyksIHRydWUsICRyb290UGFja2FnZSwgJGZzKSk7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNyZWF0ZUdsb2JhbENvbXBvc2VyKElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsICRkaXNhYmxlUGx1Z2lucywgYm9vbCAkZGlzYWJsZVNjcmlwdHMsIGJvb2wgJGZ1bGxMb2FkID0gZmFsc2UpOiA/UGFydGlhbENvbXBvc2VyCnsKCiRkaXNhYmxlUGx1Z2lucyA9ICRkaXNhYmxlUGx1Z2lucyA9PT0gJ2dsb2JhbCcgfHwgJGRpc2FibGVQbHVnaW5zID09PSB0cnVlOwoKJGNvbXBvc2VyID0gbnVsbDsKdHJ5IHsKJGNvbXBvc2VyID0gJHRoaXMtPmNyZWF0ZUNvbXBvc2VyKCRpbywgJGNvbmZpZy0+Z2V0KCdob21lJykgLiAnL2NvbXBvc2VyLmpzb24nLCAkZGlzYWJsZVBsdWdpbnMsICRjb25maWctPmdldCgnaG9tZScpLCAkZnVsbExvYWQsICRkaXNhYmxlU2NyaXB0cyk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJGlvLT53cml0ZUVycm9yKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBnbG9iYWwgY29tcG9zZXI6ICcuJGUtPmdldE1lc3NhZ2UoKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKfQoKcmV0dXJuICRjb21wb3NlcjsKfQoKcHVibGljIGZ1bmN0aW9uIGNyZWF0ZURvd25sb2FkTWFuYWdlcihJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBIdHRwRG93bmxvYWRlciAkaHR0cERvd25sb2FkZXIsIFByb2Nlc3NFeGVjdXRvciAkcHJvY2VzcywgP0V2ZW50RGlzcGF0Y2hlciAkZXZlbnREaXNwYXRjaGVyID0gbnVsbCk6IERvd25sb2FkZXJcRG93bmxvYWRNYW5hZ2VyCnsKJGNhY2hlID0gbnVsbDsKaWYgKCRjb25maWctPmdldCgnY2FjaGUtZmlsZXMtdHRsJykgPiAwKSB7CiRjYWNoZSA9IG5ldyBDYWNoZSgkaW8sICRjb25maWctPmdldCgnY2FjaGUtZmlsZXMtZGlyJyksICdhLXowLTlfLi8nKTsKJGNhY2hlLT5zZXRSZWFkT25seSgkY29uZmlnLT5nZXQoJ2NhY2hlLXJlYWQtb25seScpKTsKfQoKJGZzID0gbmV3IEZpbGVzeXN0ZW0oJHByb2Nlc3MpOwoKJGRtID0gbmV3IERvd25sb2FkZXJcRG93bmxvYWRNYW5hZ2VyKCRpbywgZmFsc2UsICRmcyk7CnN3aXRjaCAoJHByZWZlcnJlZCA9ICRjb25maWctPmdldCgncHJlZmVycmVkLWluc3RhbGwnKSkgewpjYXNlICdkaXN0JzoKJGRtLT5zZXRQcmVmZXJEaXN0KHRydWUpOwpicmVhazsKY2FzZSAnc291cmNlJzoKJGRtLT5zZXRQcmVmZXJTb3VyY2UodHJ1ZSk7CmJyZWFrOwpjYXNlICdhdXRvJzoKZGVmYXVsdDoKCmJyZWFrOwp9CgppZiAoaXNfYXJyYXkoJHByZWZlcnJlZCkpIHsKJGRtLT5zZXRQcmVmZXJlbmNlcygkcHJlZmVycmVkKTsKfQoKJGRtLT5zZXREb3dubG9hZGVyKCdnaXQnLCBuZXcgRG93bmxvYWRlclxHaXREb3dubG9hZGVyKCRpbywgJGNvbmZpZywgJHByb2Nlc3MsICRmcykpOwokZG0tPnNldERvd25sb2FkZXIoJ3N2bicsIG5ldyBEb3dubG9hZGVyXFN2bkRvd25sb2FkZXIoJGlvLCAkY29uZmlnLCAkcHJvY2VzcywgJGZzKSk7CiRkbS0+c2V0RG93bmxvYWRlcignZm9zc2lsJywgbmV3IERvd25sb2FkZXJcRm9zc2lsRG93bmxvYWRlcigkaW8sICRjb25maWcsICRwcm9jZXNzLCAkZnMpKTsKJGRtLT5zZXREb3dubG9hZGVyKCdoZycsIG5ldyBEb3dubG9hZGVyXEhnRG93bmxvYWRlcigkaW8sICRjb25maWcsICRwcm9jZXNzLCAkZnMpKTsKJGRtLT5zZXREb3dubG9hZGVyKCdwZXJmb3JjZScsIG5ldyBEb3dubG9hZGVyXFBlcmZvcmNlRG93bmxvYWRlcigkaW8sICRjb25maWcsICRwcm9jZXNzLCAkZnMpKTsKJGRtLT5zZXREb3dubG9hZGVyKCd6aXAnLCBuZXcgRG93bmxvYWRlclxaaXBEb3dubG9hZGVyKCRpbywgJGNvbmZpZywgJGh0dHBEb3dubG9hZGVyLCAkZXZlbnREaXNwYXRjaGVyLCAkY2FjaGUsICRmcywgJHByb2Nlc3MpKTsKJGRtLT5zZXREb3dubG9hZGVyKCdyYXInLCBuZXcgRG93bmxvYWRlclxSYXJEb3dubG9hZGVyKCRpbywgJGNvbmZpZywgJGh0dHBEb3dubG9hZGVyLCAkZXZlbnREaXNwYXRjaGVyLCAkY2FjaGUsICRmcywgJHByb2Nlc3MpKTsKJGRtLT5zZXREb3dubG9hZGVyKCd0YXInLCBuZXcgRG93bmxvYWRlclxUYXJEb3dubG9hZGVyKCRpbywgJGNvbmZpZywgJGh0dHBEb3dubG9hZGVyLCAkZXZlbnREaXNwYXRjaGVyLCAkY2FjaGUsICRmcywgJHByb2Nlc3MpKTsKJGRtLT5zZXREb3dubG9hZGVyKCdnemlwJywgbmV3IERvd25sb2FkZXJcR3ppcERvd25sb2FkZXIoJGlvLCAkY29uZmlnLCAkaHR0cERvd25sb2FkZXIsICRldmVudERpc3BhdGNoZXIsICRjYWNoZSwgJGZzLCAkcHJvY2VzcykpOwokZG0tPnNldERvd25sb2FkZXIoJ3h6JywgbmV3IERvd25sb2FkZXJcWHpEb3dubG9hZGVyKCRpbywgJGNvbmZpZywgJGh0dHBEb3dubG9hZGVyLCAkZXZlbnREaXNwYXRjaGVyLCAkY2FjaGUsICRmcywgJHByb2Nlc3MpKTsKJGRtLT5zZXREb3dubG9hZGVyKCdwaGFyJywgbmV3IERvd25sb2FkZXJcUGhhckRvd25sb2FkZXIoJGlvLCAkY29uZmlnLCAkaHR0cERvd25sb2FkZXIsICRldmVudERpc3BhdGNoZXIsICRjYWNoZSwgJGZzLCAkcHJvY2VzcykpOwokZG0tPnNldERvd25sb2FkZXIoJ2ZpbGUnLCBuZXcgRG93bmxvYWRlclxGaWxlRG93bmxvYWRlcigkaW8sICRjb25maWcsICRodHRwRG93bmxvYWRlciwgJGV2ZW50RGlzcGF0Y2hlciwgJGNhY2hlLCAkZnMsICRwcm9jZXNzKSk7CiRkbS0+c2V0RG93bmxvYWRlcigncGF0aCcsIG5ldyBEb3dubG9hZGVyXFBhdGhEb3dubG9hZGVyKCRpbywgJGNvbmZpZywgJGh0dHBEb3dubG9hZGVyLCAkZXZlbnREaXNwYXRjaGVyLCAkY2FjaGUsICRmcywgJHByb2Nlc3MpKTsKCnJldHVybiAkZG07Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNyZWF0ZUFyY2hpdmVNYW5hZ2VyKENvbmZpZyAkY29uZmlnLCBEb3dubG9hZGVyXERvd25sb2FkTWFuYWdlciAkZG0sIExvb3AgJGxvb3ApCnsKJGFtID0gbmV3IEFyY2hpdmVyXEFyY2hpdmVNYW5hZ2VyKCRkbSwgJGxvb3ApOwppZiAoY2xhc3NfZXhpc3RzKFppcEFyY2hpdmU6OmNsYXNzKSkgewokYW0tPmFkZEFyY2hpdmVyKG5ldyBBcmNoaXZlclxaaXBBcmNoaXZlcik7Cn0KaWYgKGNsYXNzX2V4aXN0cyhQaGFyOjpjbGFzcykpIHsKJGFtLT5hZGRBcmNoaXZlcihuZXcgQXJjaGl2ZXJcUGhhckFyY2hpdmVyKTsKfQoKcmV0dXJuICRhbTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNyZWF0ZVBsdWdpbk1hbmFnZXIoSU9JbnRlcmZhY2UgJGlvLCBDb21wb3NlciAkY29tcG9zZXIsID9QYXJ0aWFsQ29tcG9zZXIgJGdsb2JhbENvbXBvc2VyID0gbnVsbCwgJGRpc2FibGVQbHVnaW5zID0gZmFsc2UpOiBQbHVnaW5cUGx1Z2luTWFuYWdlcgp7CnJldHVybiBuZXcgUGx1Z2luXFBsdWdpbk1hbmFnZXIoJGlvLCAkY29tcG9zZXIsICRnbG9iYWxDb21wb3NlciwgJGRpc2FibGVQbHVnaW5zKTsKfQoKcHVibGljIGZ1bmN0aW9uIGNyZWF0ZUluc3RhbGxhdGlvbk1hbmFnZXIoTG9vcCAkbG9vcCwgSU9JbnRlcmZhY2UgJGlvLCA/RXZlbnREaXNwYXRjaGVyICRldmVudERpc3BhdGNoZXIgPSBudWxsKTogSW5zdGFsbGVyXEluc3RhbGxhdGlvbk1hbmFnZXIKewpyZXR1cm4gbmV3IEluc3RhbGxlclxJbnN0YWxsYXRpb25NYW5hZ2VyKCRsb29wLCAkaW8sICRldmVudERpc3BhdGNoZXIpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdEluc3RhbGxlcnMoSW5zdGFsbGVyXEluc3RhbGxhdGlvbk1hbmFnZXIgJGltLCBQYXJ0aWFsQ29tcG9zZXIgJGNvbXBvc2VyLCBJT0ludGVyZmFjZSAkaW8sID9Qcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MgPSBudWxsKTogdm9pZAp7CiRmcyA9IG5ldyBGaWxlc3lzdGVtKCRwcm9jZXNzKTsKJGJpbmFyeUluc3RhbGxlciA9IG5ldyBJbnN0YWxsZXJcQmluYXJ5SW5zdGFsbGVyKCRpbywgcnRyaW0oJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdiaW4tZGlyJyksICcvJyksICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgnYmluLWNvbXBhdCcpLCAkZnMsIHJ0cmltKCRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgndmVuZG9yLWRpcicpLCAnLycpKTsKCiRpbS0+YWRkSW5zdGFsbGVyKG5ldyBJbnN0YWxsZXJcTGlicmFyeUluc3RhbGxlcigkaW8sICRjb21wb3NlciwgbnVsbCwgJGZzLCAkYmluYXJ5SW5zdGFsbGVyKSk7CiRpbS0+YWRkSW5zdGFsbGVyKG5ldyBJbnN0YWxsZXJcUGx1Z2luSW5zdGFsbGVyKCRpbywgJGNvbXBvc2VyLCAkZnMsICRiaW5hcnlJbnN0YWxsZXIpKTsKJGltLT5hZGRJbnN0YWxsZXIobmV3IEluc3RhbGxlclxNZXRhcGFja2FnZUluc3RhbGxlcigkaW8pKTsKfQoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwdXJnZVBhY2thZ2VzKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIEluc3RhbGxlclxJbnN0YWxsYXRpb25NYW5hZ2VyICRpbSk6IHZvaWQKewpmb3JlYWNoICgkcmVwby0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoISRpbS0+aXNQYWNrYWdlSW5zdGFsbGVkKCRyZXBvLCAkcGFja2FnZSkpIHsKJHJlcG8tPnJlbW92ZVBhY2thZ2UoJHBhY2thZ2UpOwp9Cn0KfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGxvYWRSb290UGFja2FnZShSZXBvc2l0b3J5TWFuYWdlciAkcm0sIENvbmZpZyAkY29uZmlnLCBWZXJzaW9uUGFyc2VyICRwYXJzZXIsIFZlcnNpb25HdWVzc2VyICRndWVzc2VyLCBJT0ludGVyZmFjZSAkaW8pOiBQYWNrYWdlXExvYWRlclxSb290UGFja2FnZUxvYWRlcgp7CnJldHVybiBuZXcgUGFja2FnZVxMb2FkZXJcUm9vdFBhY2thZ2VMb2FkZXIoJHJtLCAkY29uZmlnLCAkcGFyc2VyLCAkZ3Vlc3NlciwgJGlvKTsKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlKElPSW50ZXJmYWNlICRpbywgJGNvbmZpZyA9IG51bGwsICRkaXNhYmxlUGx1Z2lucyA9IGZhbHNlLCBib29sICRkaXNhYmxlU2NyaXB0cyA9IGZhbHNlKTogQ29tcG9zZXIKewokZmFjdG9yeSA9IG5ldyBzdGF0aWMoKTsKCgoKCgppZiAoJGNvbmZpZyAhPT0gbnVsbCAmJiAkY29uZmlnICE9PSBzZWxmOjpnZXRDb21wb3NlckZpbGUoKSAmJiAkZGlzYWJsZVBsdWdpbnMgPT09IGZhbHNlKSB7CiRkaXNhYmxlUGx1Z2lucyA9ICdsb2NhbCc7Cn0KCnJldHVybiAkZmFjdG9yeS0+Y3JlYXRlQ29tcG9zZXIoJGlvLCAkY29uZmlnLCAkZGlzYWJsZVBsdWdpbnMsIG51bGwsIHRydWUsICRkaXNhYmxlU2NyaXB0cyk7Cn0KCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZUh0dHBEb3dubG9hZGVyKElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIGFycmF5ICRvcHRpb25zID0gW10pOiBIdHRwRG93bmxvYWRlcgp7CnN0YXRpYyAkd2FybmVkID0gZmFsc2U7CiRkaXNhYmxlVGxzID0gZmFsc2U7CgppZiAoaXNzZXQoJF9TRVJWRVJbJ2FyZ3YnXSkgJiYgaW5fYXJyYXkoJ2Rpc2FibGUtdGxzJywgJF9TRVJWRVJbJ2FyZ3YnXSkgJiYgKGluX2FycmF5KCdjb25mJywgJF9TRVJWRVJbJ2FyZ3YnXSkgfHwgaW5fYXJyYXkoJ2NvbmZpZycsICRfU0VSVkVSWydhcmd2J10pKSkgewokd2FybmVkID0gdHJ1ZTsKJGRpc2FibGVUbHMgPSAhZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpOwp9IGVsc2VpZiAoJGNvbmZpZy0+Z2V0KCdkaXNhYmxlLXRscycpID09PSB0cnVlKSB7CmlmICghJHdhcm5lZCkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPllvdSBhcmUgcnVubmluZyBDb21wb3NlciB3aXRoIFNTTC9UTFMgcHJvdGVjdGlvbiBkaXNhYmxlZC48L3dhcm5pbmc+Jyk7Cn0KJHdhcm5lZCA9IHRydWU7CiRkaXNhYmxlVGxzID0gdHJ1ZTsKfSBlbHNlaWYgKCFleHRlbnNpb25fbG9hZGVkKCdvcGVuc3NsJykpIHsKdGhyb3cgbmV3IEV4Y2VwdGlvblxOb1NzbEV4Y2VwdGlvbignVGhlIG9wZW5zc2wgZXh0ZW5zaW9uIGlzIHJlcXVpcmVkIGZvciBTU0wvVExTIHByb3RlY3Rpb24gYnV0IGlzIG5vdCBhdmFpbGFibGUuICcKLiAnSWYgeW91IGNhbiBub3QgZW5hYmxlIHRoZSBvcGVuc3NsIGV4dGVuc2lvbiwgeW91IGNhbiBkaXNhYmxlIHRoaXMgZXJyb3IsIGF0IHlvdXIgb3duIHJpc2ssIGJ5IHNldHRpbmcgdGhlIFwnZGlzYWJsZS10bHNcJyBvcHRpb24gdG8gdHJ1ZS4nKTsKfQokaHR0cERvd25sb2FkZXJPcHRpb25zID0gW107CmlmICgkZGlzYWJsZVRscyA9PT0gZmFsc2UpIHsKaWYgKCcnICE9PSAkY29uZmlnLT5nZXQoJ2NhZmlsZScpKSB7CiRodHRwRG93bmxvYWRlck9wdGlvbnNbJ3NzbCddWydjYWZpbGUnXSA9ICRjb25maWctPmdldCgnY2FmaWxlJyk7Cn0KaWYgKCcnICE9PSAkY29uZmlnLT5nZXQoJ2NhcGF0aCcpKSB7CiRodHRwRG93bmxvYWRlck9wdGlvbnNbJ3NzbCddWydjYXBhdGgnXSA9ICRjb25maWctPmdldCgnY2FwYXRoJyk7Cn0KJGh0dHBEb3dubG9hZGVyT3B0aW9ucyA9IGFycmF5X3JlcGxhY2VfcmVjdXJzaXZlKCRodHRwRG93bmxvYWRlck9wdGlvbnMsICRvcHRpb25zKTsKfQp0cnkgewokaHR0cERvd25sb2FkZXIgPSBuZXcgSHR0cERvd25sb2FkZXIoJGlvLCAkY29uZmlnLCAkaHR0cERvd25sb2FkZXJPcHRpb25zLCAkZGlzYWJsZVRscyk7Cn0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgewppZiAoZmFsc2UgIT09IHN0cnBvcygkZS0+Z2V0TWVzc2FnZSgpLCAnY2FmaWxlJykpIHsKJGlvLT53cml0ZSgnPGVycm9yPlVuYWJsZSB0byBsb2NhdGUgYSB2YWxpZCBDQSBjZXJ0aWZpY2F0ZSBmaWxlLiBZb3UgbXVzdCBzZXQgYSB2YWxpZCBcJ2NhZmlsZVwnIG9wdGlvbi48L2Vycm9yPicpOwokaW8tPndyaXRlKCc8ZXJyb3I+QSB2YWxpZCBDQSBjZXJ0aWZpY2F0ZSBmaWxlIGlzIHJlcXVpcmVkIGZvciBTU0wvVExTIHByb3RlY3Rpb24uPC9lcnJvcj4nKTsKJGlvLT53cml0ZSgnPGVycm9yPllvdSBjYW4gZGlzYWJsZSB0aGlzIGVycm9yLCBhdCB5b3VyIG93biByaXNrLCBieSBzZXR0aW5nIHRoZSBcJ2Rpc2FibGUtdGxzXCcgb3B0aW9uIHRvIHRydWUuPC9lcnJvcj4nKTsKfQp0aHJvdyAkZTsKfQoKcmV0dXJuICRodHRwRG93bmxvYWRlcjsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gbG9hZENvbXBvc2VyQXV0aEVudihDb25maWcgJGNvbmZpZywgP0lPSW50ZXJmYWNlICRpbyk6IHZvaWQKewokY29tcG9zZXJBdXRoRW52ID0gUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfQVVUSCcpOwppZiAoZmFsc2UgPT09ICRjb21wb3NlckF1dGhFbnYgfHwgJycgPT09ICRjb21wb3NlckF1dGhFbnYpIHsKcmV0dXJuOwp9CgokYXV0aERhdGEgPSBqc29uX2RlY29kZSgkY29tcG9zZXJBdXRoRW52KTsKaWYgKG51bGwgPT09ICRhdXRoRGF0YSkgewp0aHJvdyBuZXcgVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdDT01QT1NFUl9BVVRIIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG1hbGZvcm1lZCwgc2hvdWxkIGJlIGEgdmFsaWQgSlNPTiBvYmplY3QnKTsKfQoKaWYgKCRpbyBpbnN0YW5jZW9mIElPSW50ZXJmYWNlKSB7CiRpby0+d3JpdGVFcnJvcignTG9hZGluZyBhdXRoIGNvbmZpZyBmcm9tIENPTVBPU0VSX0FVVEgnLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwp9CnNlbGY6OnZhbGlkYXRlSnNvblNjaGVtYSgkaW8sICRhdXRoRGF0YSwgSnNvbkZpbGU6OkFVVEhfU0NIRU1BLCAnQ09NUE9TRVJfQVVUSCcpOwokYXV0aERhdGEgPSBqc29uX2RlY29kZSgkY29tcG9zZXJBdXRoRW52LCB0cnVlKTsKaWYgKG51bGwgIT09ICRhdXRoRGF0YSkgewokY29uZmlnLT5tZXJnZShbJ2NvbmZpZycgPT4gJGF1dGhEYXRhXSwgJ0NPTVBPU0VSX0FVVEgnKTsKfQp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiB1c2VYZGcoKTogYm9vbAp7CmZvcmVhY2ggKGFycmF5X2tleXMoJF9TRVJWRVIpIGFzICRrZXkpIHsKaWYgKHN0cnBvcygoc3RyaW5nKSAka2V5LCAnWERHXycpID09PSAwKSB7CnJldHVybiB0cnVlOwp9Cn0KCmlmIChTaWxlbmNlcjo6Y2FsbCgnaXNfZGlyJywgJy9ldGMveGRnJykpIHsKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0VXNlckRpcigpOiBzdHJpbmcKewokaG9tZSA9IFBsYXRmb3JtOjpnZXRFbnYoJ0hPTUUnKTsKaWYgKCEkaG9tZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSBIT01FIG9yIENPTVBPU0VSX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgbXVzdCBiZSBzZXQgZm9yIGNvbXBvc2VyIHRvIHJ1biBjb3JyZWN0bHknKTsKfQoKcmV0dXJuIHJ0cmltKHN0cnRyKCRob21lLCAnXFwnLCAnLycpLCAnLycpOwp9CgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gdmFsaWRhdGVKc29uU2NoZW1hKD9JT0ludGVyZmFjZSAkaW8sICRmaWxlT3JEYXRhLCBpbnQgJHNjaGVtYSA9IEpzb25GaWxlOjpMQVhfU0NIRU1BLCA/c3RyaW5nICRzb3VyY2UgPSBudWxsKTogdm9pZAp7CmlmIChQbGF0Zm9ybTo6aXNJbnB1dENvbXBsZXRpb25Qcm9jZXNzKCkpIHsKcmV0dXJuOwp9Cgp0cnkgewppZiAoJGZpbGVPckRhdGEgaW5zdGFuY2VvZiBKc29uRmlsZSkgewokZmlsZU9yRGF0YS0+dmFsaWRhdGVTY2hlbWEoJHNjaGVtYSk7Cn0gZWxzZSB7CmlmIChudWxsID09PSAkc291cmNlKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCckc291cmNlIGlzIHJlcXVpcmVkIHRvIGJlIHByb3ZpZGVkIGlmICRmaWxlT3JEYXRhIGlzIGFyYml0cmFyeSBkYXRhJyk7Cn0KSnNvbkZpbGU6OnZhbGlkYXRlSnNvblNjaGVtYSgkc291cmNlLCAkZmlsZU9yRGF0YSwgJHNjaGVtYSk7Cn0KfSBjYXRjaCAoSnNvblZhbGlkYXRpb25FeGNlcHRpb24gJGUpIHsKJG1zZyA9ICRlLT5nZXRNZXNzYWdlKCkuJywgdGhpcyBtYXkgcmVzdWx0IGluIGVycm9ycyBhbmQgc2hvdWxkIGJlIHJlc29sdmVkOicuUEhQX0VPTC4nIC0gJy5pbXBsb2RlKFBIUF9FT0wuJyAtICcsICRlLT5nZXRFcnJvcnMoKSk7CmlmICgkaW8gaW5zdGFuY2VvZiBJT0ludGVyZmFjZSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPicuJG1zZy4nPC8+Jyk7Cn0gZWxzZSB7CnRocm93IG5ldyBVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJG1zZyk7Cn0KfQp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwoKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5OwoKZmluYWwgY2xhc3MgSWdub3JlQWxsUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciBpbXBsZW1lbnRzIFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UKewpwdWJsaWMgZnVuY3Rpb24gaXNJZ25vcmVkKHN0cmluZyAkcmVxKTogYm9vbAp7CnJldHVybiBQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRyZXEpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNVcHBlckJvdW5kSWdub3JlZChzdHJpbmcgJHJlcSk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmlzSWdub3JlZCgkcmVxKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE1hdGNoQWxsQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE11bHRpQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxJbnRlcnZhbDsKdXNlIENvbXBvc2VyXFNlbXZlclxJbnRlcnZhbHM7CgpmaW5hbCBjbGFzcyBJZ25vcmVMaXN0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciBpbXBsZW1lbnRzIFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UKewoKCgpwcml2YXRlICRpZ25vcmVSZWdleDsKCgoKCnByaXZhdGUgJGlnbm9yZVVwcGVyQm91bmRSZWdleDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkcmVxTGlzdCkKewokaWdub3JlQWxsID0gJGlnbm9yZVVwcGVyQm91bmQgPSBbXTsKZm9yZWFjaCAoJHJlcUxpc3QgYXMgJHJlcSkgewppZiAoc3Vic3RyKCRyZXEsIC0xKSA9PT0gJysnKSB7CiRpZ25vcmVVcHBlckJvdW5kW10gPSBzdWJzdHIoJHJlcSwgMCwgLTEpOwp9IGVsc2UgewokaWdub3JlQWxsW10gPSAkcmVxOwp9Cn0KJHRoaXMtPmlnbm9yZVJlZ2V4ID0gQmFzZVBhY2thZ2U6OnBhY2thZ2VOYW1lc1RvUmVnZXhwKCRpZ25vcmVBbGwpOwokdGhpcy0+aWdub3JlVXBwZXJCb3VuZFJlZ2V4ID0gQmFzZVBhY2thZ2U6OnBhY2thZ2VOYW1lc1RvUmVnZXhwKCRpZ25vcmVVcHBlckJvdW5kKTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzSWdub3JlZChzdHJpbmcgJHJlcSk6IGJvb2wKewppZiAoIVBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJHJlcSkpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gUHJlZzo6aXNNYXRjaCgkdGhpcy0+aWdub3JlUmVnZXgsICRyZXEpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNVcHBlckJvdW5kSWdub3JlZChzdHJpbmcgJHJlcSk6IGJvb2wKewppZiAoIVBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJHJlcSkpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gJHRoaXMtPmlzSWdub3JlZCgkcmVxKSB8fCBQcmVnOjppc01hdGNoKCR0aGlzLT5pZ25vcmVVcHBlckJvdW5kUmVnZXgsICRyZXEpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZmlsdGVyQ29uc3RyYWludChzdHJpbmcgJHJlcSwgQ29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCwgYm9vbCAkYWxsb3dVcHBlckJvdW5kT3ZlcnJpZGUgPSB0cnVlKTogQ29uc3RyYWludEludGVyZmFjZQp7CmlmICghUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcmVxKSkgewpyZXR1cm4gJGNvbnN0cmFpbnQ7Cn0KCmlmICghJGFsbG93VXBwZXJCb3VuZE92ZXJyaWRlIHx8ICFQcmVnOjppc01hdGNoKCR0aGlzLT5pZ25vcmVVcHBlckJvdW5kUmVnZXgsICRyZXEpKSB7CnJldHVybiAkY29uc3RyYWludDsKfQoKaWYgKFByZWc6OmlzTWF0Y2goJHRoaXMtPmlnbm9yZVJlZ2V4LCAkcmVxKSkgewpyZXR1cm4gbmV3IE1hdGNoQWxsQ29uc3RyYWludDsKfQoKJGludGVydmFscyA9IEludGVydmFsczo6Z2V0KCRjb25zdHJhaW50KTsKJGxhc3QgPSBlbmQoJGludGVydmFsc1snbnVtZXJpYyddKTsKaWYgKCRsYXN0ICE9PSBmYWxzZSAmJiAoc3RyaW5nKSAkbGFzdC0+Z2V0RW5kKCkgIT09IChzdHJpbmcpIEludGVydmFsOjp1bnRpbFBvc2l0aXZlSW5maW5pdHkoKSkgewokY29uc3RyYWludCA9IG5ldyBNdWx0aUNvbnN0cmFpbnQoWyRjb25zdHJhaW50LCBuZXcgQ29uc3RyYWludCgnPj0nLCAkbGFzdC0+Z2V0RW5kKCktPmdldFZlcnNpb24oKSldLCBmYWxzZSk7Cn0KCnJldHVybiAkY29uc3RyYWludDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcjsKCmZpbmFsIGNsYXNzIElnbm9yZU5vdGhpbmdQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGltcGxlbWVudHMgUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZQp7CgoKCnB1YmxpYyBmdW5jdGlvbiBpc0lnbm9yZWQoc3RyaW5nICRyZXEpOiBib29sCnsKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNVcHBlckJvdW5kSWdub3JlZChzdHJpbmcgJHJlcSk6IGJvb2wKewpyZXR1cm4gZmFsc2U7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXI7CgpmaW5hbCBjbGFzcyBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeQp7CgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnJvbUJvb2xPckxpc3QoJGJvb2xPckxpc3QpOiBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlCnsKaWYgKGlzX2Jvb2woJGJvb2xPckxpc3QpKSB7CnJldHVybiAkYm9vbE9yTGlzdCA/IHNlbGY6Omlnbm9yZUFsbCgpIDogc2VsZjo6aWdub3JlTm90aGluZygpOwp9CgppZiAoaXNfYXJyYXkoJGJvb2xPckxpc3QpKSB7CnJldHVybiBuZXcgSWdub3JlTGlzdFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoJGJvb2xPckxpc3QpOwp9Cgp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigKc3ByaW50ZigKJ1BsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXI6IFVua25vd24gJGJvb2xPckxpc3QgcGFyYW1ldGVyICVzLiBQbGVhc2UgcmVwb3J0IGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9jb21wb3Nlci9pc3N1ZXMvbmV3LicsCmdldF9kZWJ1Z190eXBlKCRib29sT3JMaXN0KQopCik7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaWdub3JlQWxsKCk6IFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UKewpyZXR1cm4gbmV3IElnbm9yZUFsbFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpZ25vcmVOb3RoaW5nKCk6IFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UKewpyZXR1cm4gbmV3IElnbm9yZU5vdGhpbmdQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKCk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXI7CgppbnRlcmZhY2UgUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZQp7CnB1YmxpYyBmdW5jdGlvbiBpc0lnbm9yZWQoc3RyaW5nICRyZXEpOiBib29sOwoKcHVibGljIGZ1bmN0aW9uIGlzVXBwZXJCb3VuZElnbm9yZWQoc3RyaW5nICRyZXEpOiBib29sOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxJTzsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcU2lsZW5jZXI7CnVzZSBQc3JcTG9nXExvZ0xldmVsOwoKYWJzdHJhY3QgY2xhc3MgQmFzZUlPIGltcGxlbWVudHMgSU9JbnRlcmZhY2UKewoKcHJvdGVjdGVkICRhdXRoZW50aWNhdGlvbnMgPSBbXTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBdXRoZW50aWNhdGlvbnMoKQp7CnJldHVybiAkdGhpcy0+YXV0aGVudGljYXRpb25zOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzZXRBdXRoZW50aWNhdGlvbnMoKQp7CiR0aGlzLT5hdXRoZW50aWNhdGlvbnMgPSBbXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc0F1dGhlbnRpY2F0aW9uKCRyZXBvc2l0b3J5TmFtZSkKewpyZXR1cm4gaXNzZXQoJHRoaXMtPmF1dGhlbnRpY2F0aW9uc1skcmVwb3NpdG9yeU5hbWVdKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEF1dGhlbnRpY2F0aW9uKCRyZXBvc2l0b3J5TmFtZSkKewppZiAoaXNzZXQoJHRoaXMtPmF1dGhlbnRpY2F0aW9uc1skcmVwb3NpdG9yeU5hbWVdKSkgewpyZXR1cm4gJHRoaXMtPmF1dGhlbnRpY2F0aW9uc1skcmVwb3NpdG9yeU5hbWVdOwp9CgpyZXR1cm4gWyd1c2VybmFtZScgPT4gbnVsbCwgJ3Bhc3N3b3JkJyA9PiBudWxsXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEF1dGhlbnRpY2F0aW9uKCRyZXBvc2l0b3J5TmFtZSwgJHVzZXJuYW1lLCAkcGFzc3dvcmQgPSBudWxsKQp7CiR0aGlzLT5hdXRoZW50aWNhdGlvbnNbJHJlcG9zaXRvcnlOYW1lXSA9IFsndXNlcm5hbWUnID0+ICR1c2VybmFtZSwgJ3Bhc3N3b3JkJyA9PiAkcGFzc3dvcmRdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGVSYXcoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gdHJ1ZSwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpCnsKJHRoaXMtPndyaXRlKCRtZXNzYWdlcywgJG5ld2xpbmUsICR2ZXJib3NpdHkpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGVFcnJvclJhdygkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSB0cnVlLCBpbnQgJHZlcmJvc2l0eSA9IHNlbGY6Ok5PUk1BTCkKewokdGhpcy0+d3JpdGVFcnJvcigkbWVzc2FnZXMsICRuZXdsaW5lLCAkdmVyYm9zaXR5KTsKfQoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNoZWNrQW5kU2V0QXV0aGVudGljYXRpb24oc3RyaW5nICRyZXBvc2l0b3J5TmFtZSwgc3RyaW5nICR1c2VybmFtZSwgP3N0cmluZyAkcGFzc3dvcmQgPSBudWxsKQp7CmlmICgkdGhpcy0+aGFzQXV0aGVudGljYXRpb24oJHJlcG9zaXRvcnlOYW1lKSkgewokYXV0aCA9ICR0aGlzLT5nZXRBdXRoZW50aWNhdGlvbigkcmVwb3NpdG9yeU5hbWUpOwppZiAoJGF1dGhbJ3VzZXJuYW1lJ10gPT09ICR1c2VybmFtZSAmJiAkYXV0aFsncGFzc3dvcmQnXSA9PT0gJHBhc3N3b3JkKSB7CnJldHVybjsKfQoKJHRoaXMtPndyaXRlRXJyb3IoCnNwcmludGYoCiI8d2FybmluZz5XYXJuaW5nOiBZb3Ugc2hvdWxkIGF2b2lkIG92ZXJ3cml0aW5nIGFscmVhZHkgZGVmaW5lZCBhdXRoIHNldHRpbmdzIGZvciAlcy48L3dhcm5pbmc+IiwKJHJlcG9zaXRvcnlOYW1lCikKKTsKfQokdGhpcy0+c2V0QXV0aGVudGljYXRpb24oJHJlcG9zaXRvcnlOYW1lLCAkdXNlcm5hbWUsICRwYXNzd29yZCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2FkQ29uZmlndXJhdGlvbihDb25maWcgJGNvbmZpZykKewokYml0YnVja2V0T2F1dGggPSAkY29uZmlnLT5nZXQoJ2JpdGJ1Y2tldC1vYXV0aCcpOwokZ2l0aHViT2F1dGggPSAkY29uZmlnLT5nZXQoJ2dpdGh1Yi1vYXV0aCcpOwokZ2l0bGFiT2F1dGggPSAkY29uZmlnLT5nZXQoJ2dpdGxhYi1vYXV0aCcpOwokZ2l0bGFiVG9rZW4gPSAkY29uZmlnLT5nZXQoJ2dpdGxhYi10b2tlbicpOwokZm9yZ2Vqb1Rva2VuID0gJGNvbmZpZy0+Z2V0KCdmb3JnZWpvLXRva2VuJyk7CiRodHRwQmFzaWMgPSAkY29uZmlnLT5nZXQoJ2h0dHAtYmFzaWMnKTsKJGJlYXJlclRva2VuID0gJGNvbmZpZy0+Z2V0KCdiZWFyZXInKTsKJGN1c3RvbUhlYWRlcnMgPSAkY29uZmlnLT5nZXQoJ2N1c3RvbS1oZWFkZXJzJyk7CiRjbGllbnRDZXJ0aWZpY2F0ZSA9ICRjb25maWctPmdldCgnY2xpZW50LWNlcnRpZmljYXRlJyk7CgoKCmZvcmVhY2ggKCRiaXRidWNrZXRPYXV0aCBhcyAkZG9tYWluID0+ICRjcmVkKSB7CiR0aGlzLT5jaGVja0FuZFNldEF1dGhlbnRpY2F0aW9uKCRkb21haW4sICRjcmVkWydjb25zdW1lci1rZXknXSwgJGNyZWRbJ2NvbnN1bWVyLXNlY3JldCddKTsKfQoKZm9yZWFjaCAoJGdpdGh1Yk9hdXRoIGFzICRkb21haW4gPT4gJHRva2VuKSB7CmlmICgkZG9tYWluICE9PSAnZ2l0aHViLmNvbScgJiYgIWluX2FycmF5KCRkb21haW4sICRjb25maWctPmdldCgnZ2l0aHViLWRvbWFpbnMnKSwgdHJ1ZSkpIHsKJHRoaXMtPmRlYnVnKCRkb21haW4uJyBpcyBub3QgaW4gdGhlIGNvbmZpZ3VyZWQgZ2l0aHViLWRvbWFpbnMsIGFkZGluZyBpdCBpbXBsaWNpdGx5IGFzIGF1dGhlbnRpY2F0aW9uIGlzIGNvbmZpZ3VyZWQgZm9yIHRoaXMgZG9tYWluJyk7CiRjb25maWctPm1lcmdlKFsnY29uZmlnJyA9PiBbJ2dpdGh1Yi1kb21haW5zJyA9PiBhcnJheV9tZXJnZSgkY29uZmlnLT5nZXQoJ2dpdGh1Yi1kb21haW5zJyksIFskZG9tYWluXSldXSwgJ2ltcGxpY2l0LWR1ZS10by1hdXRoJyk7Cn0KCgoKaWYgKCFQcmVnOjppc01hdGNoKCd7XlsuQS1aYS16MC05Xy1dKyR9JywgJHRva2VuKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignWW91ciBnaXRodWIgb2F1dGggdG9rZW4gZm9yICcuJGRvbWFpbi4nIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycy4nKTsKfQoKJHRoaXMtPmNoZWNrQW5kU2V0QXV0aGVudGljYXRpb24oJGRvbWFpbiwgJHRva2VuLCAneC1vYXV0aC1iYXNpYycpOwp9Cgpmb3JlYWNoICgkZ2l0bGFiT2F1dGggYXMgJGRvbWFpbiA9PiAkdG9rZW4pIHsKaWYgKCRkb21haW4gIT09ICdnaXRsYWIuY29tJyAmJiAhaW5fYXJyYXkoJGRvbWFpbiwgJGNvbmZpZy0+Z2V0KCdnaXRsYWItZG9tYWlucycpLCB0cnVlKSkgewokdGhpcy0+ZGVidWcoJGRvbWFpbi4nIGlzIG5vdCBpbiB0aGUgY29uZmlndXJlZCBnaXRsYWItZG9tYWlucywgYWRkaW5nIGl0IGltcGxpY2l0bHkgYXMgYXV0aGVudGljYXRpb24gaXMgY29uZmlndXJlZCBmb3IgdGhpcyBkb21haW4nKTsKJGNvbmZpZy0+bWVyZ2UoWydjb25maWcnID0+IFsnZ2l0bGFiLWRvbWFpbnMnID0+IGFycmF5X21lcmdlKCRjb25maWctPmdldCgnZ2l0bGFiLWRvbWFpbnMnKSwgWyRkb21haW5dKV1dLCAnaW1wbGljaXQtZHVlLXRvLWF1dGgnKTsKfQoKJHRva2VuID0gaXNfYXJyYXkoJHRva2VuKSA/ICR0b2tlblsidG9rZW4iXSA6ICR0b2tlbjsKJHRoaXMtPmNoZWNrQW5kU2V0QXV0aGVudGljYXRpb24oJGRvbWFpbiwgJHRva2VuLCAnb2F1dGgyJyk7Cn0KCmZvcmVhY2ggKCRnaXRsYWJUb2tlbiBhcyAkZG9tYWluID0+ICR0b2tlbikgewppZiAoJGRvbWFpbiAhPT0gJ2dpdGxhYi5jb20nICYmICFpbl9hcnJheSgkZG9tYWluLCAkY29uZmlnLT5nZXQoJ2dpdGxhYi1kb21haW5zJyksIHRydWUpKSB7CiR0aGlzLT5kZWJ1ZygkZG9tYWluLicgaXMgbm90IGluIHRoZSBjb25maWd1cmVkIGdpdGxhYi1kb21haW5zLCBhZGRpbmcgaXQgaW1wbGljaXRseSBhcyBhdXRoZW50aWNhdGlvbiBpcyBjb25maWd1cmVkIGZvciB0aGlzIGRvbWFpbicpOwokY29uZmlnLT5tZXJnZShbJ2NvbmZpZycgPT4gWydnaXRsYWItZG9tYWlucycgPT4gYXJyYXlfbWVyZ2UoJGNvbmZpZy0+Z2V0KCdnaXRsYWItZG9tYWlucycpLCBbJGRvbWFpbl0pXV0sICdpbXBsaWNpdC1kdWUtdG8tYXV0aCcpOwp9CgokdXNlcm5hbWUgPSBpc19hcnJheSgkdG9rZW4pID8gJHRva2VuWyJ1c2VybmFtZSJdIDogJHRva2VuOwokcGFzc3dvcmQgPSBpc19hcnJheSgkdG9rZW4pID8gJHRva2VuWyJ0b2tlbiJdIDogJ3ByaXZhdGUtdG9rZW4nOwokdGhpcy0+Y2hlY2tBbmRTZXRBdXRoZW50aWNhdGlvbigkZG9tYWluLCAkdXNlcm5hbWUsICRwYXNzd29yZCk7Cn0KCmZvcmVhY2ggKCRmb3JnZWpvVG9rZW4gYXMgJGRvbWFpbiA9PiAkY3JlZCkgewppZiAoIWluX2FycmF5KCRkb21haW4sICRjb25maWctPmdldCgnZm9yZ2Vqby1kb21haW5zJyksIHRydWUpKSB7CiR0aGlzLT5kZWJ1ZygkZG9tYWluLicgaXMgbm90IGluIHRoZSBjb25maWd1cmVkIGZvcmdlam8tZG9tYWlucywgYWRkaW5nIGl0IGltcGxpY2l0bHkgYXMgYXV0aGVudGljYXRpb24gaXMgY29uZmlndXJlZCBmb3IgdGhpcyBkb21haW4nKTsKJGNvbmZpZy0+bWVyZ2UoWydjb25maWcnID0+IFsnZm9yZ2Vqby1kb21haW5zJyA9PiBhcnJheV9tZXJnZSgkY29uZmlnLT5nZXQoJ2Zvcmdlam8tZG9tYWlucycpLCBbJGRvbWFpbl0pXV0sICdpbXBsaWNpdC1kdWUtdG8tYXV0aCcpOwp9CgokdGhpcy0+Y2hlY2tBbmRTZXRBdXRoZW50aWNhdGlvbigkZG9tYWluLCAkY3JlZFsndXNlcm5hbWUnXSwgJGNyZWRbJ3Rva2VuJ10pOwp9CgoKZm9yZWFjaCAoJGh0dHBCYXNpYyBhcyAkZG9tYWluID0+ICRjcmVkKSB7CiR0aGlzLT5jaGVja0FuZFNldEF1dGhlbnRpY2F0aW9uKCRkb21haW4sICRjcmVkWyd1c2VybmFtZSddLCAkY3JlZFsncGFzc3dvcmQnXSk7Cn0KCmZvcmVhY2ggKCRiZWFyZXJUb2tlbiBhcyAkZG9tYWluID0+ICR0b2tlbikgewokdGhpcy0+Y2hlY2tBbmRTZXRBdXRoZW50aWNhdGlvbigkZG9tYWluLCAkdG9rZW4sICdiZWFyZXInKTsKfQoKCmZvcmVhY2ggKCRjdXN0b21IZWFkZXJzIGFzICRkb21haW4gPT4gJGhlYWRlcnMpIHsKaWYgKCRoZWFkZXJzICE9PSBudWxsKSB7CiR0aGlzLT5jaGVja0FuZFNldEF1dGhlbnRpY2F0aW9uKCRkb21haW4sIChzdHJpbmcpIGpzb25fZW5jb2RlKCRoZWFkZXJzKSwgJ2N1c3RvbS1oZWFkZXJzJyk7Cn0KfQoKCmZvcmVhY2ggKCRjbGllbnRDZXJ0aWZpY2F0ZSBhcyAkZG9tYWluID0+ICRjcmVkKSB7CiRzc2xPcHRpb25zID0gYXJyYXlfZmlsdGVyKApbCidsb2NhbF9jZXJ0JyA9PiAkY3JlZFsnbG9jYWxfY2VydCddID8/IG51bGwsCidsb2NhbF9waycgPT4gJGNyZWRbJ2xvY2FsX3BrJ10gPz8gbnVsbCwKJ3Bhc3NwaHJhc2UnID0+ICRjcmVkWydwYXNzcGhyYXNlJ10gPz8gbnVsbCwKXSwKc3RhdGljIGZ1bmN0aW9uICg/c3RyaW5nICR2YWx1ZSk6IGJvb2wgeyByZXR1cm4gJHZhbHVlICE9PSBudWxsOyB9Cik7CmlmICghaXNzZXQoJHNzbE9wdGlvbnNbJ2xvY2FsX2NlcnQnXSkpIHsKJHRoaXMtPndyaXRlRXJyb3IoCnNwcmludGYoCic8d2FybmluZz5XYXJuaW5nOiBDbGllbnQgY2VydGlmaWNhdGUgY29uZmlndXJhdGlvbiBpcyBtaXNzaW5nIGtleSBgbG9jYWxfY2VydGAgZm9yICVzLjwvd2FybmluZz4nLAokZG9tYWluCikKKTsKY29udGludWU7Cn0KJHRoaXMtPmNoZWNrQW5kU2V0QXV0aGVudGljYXRpb24oJGRvbWFpbiwgJ2NsaWVudC1jZXJ0aWZpY2F0ZScsIChzdHJpbmcpIGpzb25fZW5jb2RlKCRzc2xPcHRpb25zKSk7Cn0KCgpQcm9jZXNzRXhlY3V0b3I6OnNldFRpbWVvdXQoJGNvbmZpZy0+Z2V0KCdwcm9jZXNzLXRpbWVvdXQnKSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBlbWVyZ2VuY3koJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gW10pOiB2b2lkCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6RU1FUkdFTkNZLCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWxlcnQoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gW10pOiB2b2lkCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6QUxFUlQsICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjcml0aWNhbCgkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBbXSk6IHZvaWQKewokdGhpcy0+bG9nKExvZ0xldmVsOjpDUklUSUNBTCwgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGVycm9yKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IFtdKTogdm9pZAp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OkVSUk9SLCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd2FybmluZygkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBbXSk6IHZvaWQKewokdGhpcy0+bG9nKExvZ0xldmVsOjpXQVJOSU5HLCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbm90aWNlKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IFtdKTogdm9pZAp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6Ok5PVElDRSwgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGluZm8oJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gW10pOiB2b2lkCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6SU5GTywgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGRlYnVnKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IFtdKTogdm9pZAp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OkRFQlVHLCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGxvZygkbGV2ZWwsICRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IFtdKTogdm9pZAp7CiRtZXNzYWdlID0gKHN0cmluZykgJG1lc3NhZ2U7CgppZiAoJGNvbnRleHQgIT09IFtdKSB7CiRqc29uID0gU2lsZW5jZXI6OmNhbGwoJ2pzb25fZW5jb2RlJywgJGNvbnRleHQsIEpTT05fSU5WQUxJRF9VVEY4X0lHTk9SRSB8IEpTT05fVU5FU0NBUEVEX1NMQVNIRVMgfCBKU09OX1VORVNDQVBFRF9VTklDT0RFKTsKaWYgKCRqc29uICE9PSBmYWxzZSkgewokbWVzc2FnZSAuPSAnICcgLiAkanNvbjsKfQp9CgppZiAoaW5fYXJyYXkoJGxldmVsLCBbTG9nTGV2ZWw6OkVNRVJHRU5DWSwgTG9nTGV2ZWw6OkFMRVJULCBMb2dMZXZlbDo6Q1JJVElDQUwsIExvZ0xldmVsOjpFUlJPUl0pKSB7CiR0aGlzLT53cml0ZUVycm9yKCc8ZXJyb3I+Jy4kbWVzc2FnZS4nPC9lcnJvcj4nKTsKfSBlbHNlaWYgKCRsZXZlbCA9PT0gTG9nTGV2ZWw6OldBUk5JTkcpIHsKJHRoaXMtPndyaXRlRXJyb3IoJzx3YXJuaW5nPicuJG1lc3NhZ2UuJzwvd2FybmluZz4nKTsKfSBlbHNlaWYgKCRsZXZlbCA9PT0gTG9nTGV2ZWw6Ok5PVElDRSkgewokdGhpcy0+d3JpdGVFcnJvcignPGluZm8+Jy4kbWVzc2FnZS4nPC9pbmZvPicsIHRydWUsIHNlbGY6OlZFUkJPU0UpOwp9IGVsc2VpZiAoJGxldmVsID09PSBMb2dMZXZlbDo6SU5GTykgewokdGhpcy0+d3JpdGVFcnJvcignPGluZm8+Jy4kbWVzc2FnZS4nPC9pbmZvPicsIHRydWUsIHNlbGY6OlZFUllfVkVSQk9TRSk7Cn0gZWxzZSB7CiR0aGlzLT53cml0ZUVycm9yKCRtZXNzYWdlLCB0cnVlLCBzZWxmOjpERUJVRyk7Cn0KfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxJTzsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxRdWVzdGlvbkhlbHBlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XFN0cmVhbU91dHB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlckludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcU3RyZWFtYWJsZUlucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxTdHJpbmdJbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXEhlbHBlclNldDsKCgoKCmNsYXNzIEJ1ZmZlcklPIGV4dGVuZHMgQ29uc29sZUlPCnsKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkaW5wdXQgPSAnJywgaW50ICR2ZXJib3NpdHkgPSBTdHJlYW1PdXRwdXQ6OlZFUkJPU0lUWV9OT1JNQUwsID9PdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UgJGZvcm1hdHRlciA9IG51bGwpCnsKJGlucHV0ID0gbmV3IFN0cmluZ0lucHV0KCRpbnB1dCk7CiRpbnB1dC0+c2V0SW50ZXJhY3RpdmUoZmFsc2UpOwoKJHN0cmVhbSA9IGZvcGVuKCdwaHA6Ly9tZW1vcnknLCAncncnKTsKaWYgKCRzdHJlYW0gPT09IGZhbHNlKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVW5hYmxlIHRvIG9wZW4gbWVtb3J5IG91dHB1dCBzdHJlYW0nKTsKfQokb3V0cHV0ID0gbmV3IFN0cmVhbU91dHB1dCgkc3RyZWFtLCAkdmVyYm9zaXR5LCAkZm9ybWF0dGVyICE9PSBudWxsID8gJGZvcm1hdHRlci0+aXNEZWNvcmF0ZWQoKSA6IGZhbHNlLCAkZm9ybWF0dGVyKTsKCnBhcmVudDo6X19jb25zdHJ1Y3QoJGlucHV0LCAkb3V0cHV0LCBuZXcgSGVscGVyU2V0KFsKbmV3IFF1ZXN0aW9uSGVscGVyKCksCl0pKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE91dHB1dCgpOiBzdHJpbmcKewphc3NlcnQoJHRoaXMtPm91dHB1dCBpbnN0YW5jZW9mIFN0cmVhbU91dHB1dCk7CmZzZWVrKCR0aGlzLT5vdXRwdXQtPmdldFN0cmVhbSgpLCAwKTsKCiRvdXRwdXQgPSAoc3RyaW5nKSBzdHJlYW1fZ2V0X2NvbnRlbnRzKCR0aGlzLT5vdXRwdXQtPmdldFN0cmVhbSgpKTsKCiRvdXRwdXQgPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soInsoPzw9XnxcbnxceDA4KSguKz8pKFx4MDgrKX0iLCBzdGF0aWMgZnVuY3Rpb24gKCRtYXRjaGVzKTogc3RyaW5nIHsKJHByZSA9IHN0cmlwX3RhZ3MoJG1hdGNoZXNbMV0pOwoKaWYgKHN0cmxlbigkcHJlKSA9PT0gc3RybGVuKCRtYXRjaGVzWzJdKSkgewpyZXR1cm4gJyc7Cn0KCgpyZXR1cm4gcnRyaW0oJG1hdGNoZXNbMV0pLiJcbiI7Cn0sICRvdXRwdXQpOwoKcmV0dXJuICRvdXRwdXQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFVzZXJJbnB1dHMoYXJyYXkgJGlucHV0cyk6IHZvaWQKewppZiAoISR0aGlzLT5pbnB1dCBpbnN0YW5jZW9mIFN0cmVhbWFibGVJbnB1dEludGVyZmFjZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1NldHRpbmcgdGhlIHVzZXIgaW5wdXRzIHJlcXVpcmVzIGF0IGxlYXN0IHRoZSB2ZXJzaW9uIDMuMiBvZiB0aGUgc3ltZm9ueS9jb25zb2xlIGNvbXBvbmVudC4nKTsKfQoKJHRoaXMtPmlucHV0LT5zZXRTdHJlYW0oJHRoaXMtPmNyZWF0ZVN0cmVhbSgkaW5wdXRzKSk7CiR0aGlzLT5pbnB1dC0+c2V0SW50ZXJhY3RpdmUodHJ1ZSk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVTdHJlYW0oYXJyYXkgJGlucHV0cykKewokc3RyZWFtID0gZm9wZW4oJ3BocDovL21lbW9yeScsICdyKycpOwppZiAoJHN0cmVhbSA9PT0gZmFsc2UpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdVbmFibGUgdG8gb3BlbiBtZW1vcnkgb3V0cHV0IHN0cmVhbScpOwp9Cgpmb3JlYWNoICgkaW5wdXRzIGFzICRpbnB1dCkgewpmd3JpdGUoJHN0cmVhbSwgJGlucHV0LlBIUF9FT0wpOwp9CgpyZXdpbmQoJHN0cmVhbSk7CgpyZXR1cm4gJHN0cmVhbTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxJTzsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxRdWVzdGlvblxTdHJpY3RDb25maXJtYXRpb25RdWVzdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXEhlbHBlclNldDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFByb2dyZXNzQmFyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcVGFibGU7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcQ29uc29sZU91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcUXVlc3Rpb25cQ2hvaWNlUXVlc3Rpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFF1ZXN0aW9uXFF1ZXN0aW9uOwoKCgoKCgoKY2xhc3MgQ29uc29sZUlPIGV4dGVuZHMgQmFzZUlPCnsKCnByb3RlY3RlZCAkaW5wdXQ7Cgpwcm90ZWN0ZWQgJG91dHB1dDsKCnByb3RlY3RlZCAkaGVscGVyU2V0OwoKcHJvdGVjdGVkICRsYXN0TWVzc2FnZSA9ICcnOwoKcHJvdGVjdGVkICRsYXN0TWVzc2FnZUVyciA9ICcnOwoKCnByaXZhdGUgJHN0YXJ0VGltZTsKCnByaXZhdGUgJHZlcmJvc2l0eU1hcDsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgSGVscGVyU2V0ICRoZWxwZXJTZXQpCnsKJHRoaXMtPmlucHV0ID0gJGlucHV0OwokdGhpcy0+b3V0cHV0ID0gJG91dHB1dDsKJHRoaXMtPmhlbHBlclNldCA9ICRoZWxwZXJTZXQ7CiR0aGlzLT52ZXJib3NpdHlNYXAgPSBbCnNlbGY6OlFVSUVUID0+IE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1FVSUVULApzZWxmOjpOT1JNQUwgPT4gT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfTk9STUFMLApzZWxmOjpWRVJCT1NFID0+IE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1ZFUkJPU0UsCnNlbGY6OlZFUllfVkVSQk9TRSA9PiBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9WRVJZX1ZFUkJPU0UsCnNlbGY6OkRFQlVHID0+IE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX0RFQlVHLApdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZW5hYmxlRGVidWdnaW5nKGZsb2F0ICRzdGFydFRpbWUpCnsKJHRoaXMtPnN0YXJ0VGltZSA9ICRzdGFydFRpbWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0ludGVyYWN0aXZlKCkKewpyZXR1cm4gJHRoaXMtPmlucHV0LT5pc0ludGVyYWN0aXZlKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlY29yYXRlZCgpCnsKcmV0dXJuICR0aGlzLT5vdXRwdXQtPmlzRGVjb3JhdGVkKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZlcmJvc2UoKQp7CnJldHVybiAkdGhpcy0+b3V0cHV0LT5pc1ZlcmJvc2UoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVmVyeVZlcmJvc2UoKQp7CnJldHVybiAkdGhpcy0+b3V0cHV0LT5pc1ZlcnlWZXJib3NlKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlYnVnKCkKewpyZXR1cm4gJHRoaXMtPm91dHB1dC0+aXNEZWJ1ZygpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gdHJ1ZSwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpCnsKJG1lc3NhZ2VzID0gc2VsZjo6c2FuaXRpemUoJG1lc3NhZ2VzKTsKCiR0aGlzLT5kb1dyaXRlKCRtZXNzYWdlcywgJG5ld2xpbmUsIGZhbHNlLCAkdmVyYm9zaXR5KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlRXJyb3IoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gdHJ1ZSwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpCnsKJG1lc3NhZ2VzID0gc2VsZjo6c2FuaXRpemUoJG1lc3NhZ2VzKTsKCiR0aGlzLT5kb1dyaXRlKCRtZXNzYWdlcywgJG5ld2xpbmUsIHRydWUsICR2ZXJib3NpdHkpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGVSYXcoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gdHJ1ZSwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpCnsKJHRoaXMtPmRvV3JpdGUoJG1lc3NhZ2VzLCAkbmV3bGluZSwgZmFsc2UsICR2ZXJib3NpdHksIHRydWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGVFcnJvclJhdygkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSB0cnVlLCBpbnQgJHZlcmJvc2l0eSA9IHNlbGY6Ok5PUk1BTCkKewokdGhpcy0+ZG9Xcml0ZSgkbWVzc2FnZXMsICRuZXdsaW5lLCB0cnVlLCAkdmVyYm9zaXR5LCB0cnVlKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkb1dyaXRlKCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSwgYm9vbCAkc3RkZXJyLCBpbnQgJHZlcmJvc2l0eSwgYm9vbCAkcmF3ID0gZmFsc2UpOiB2b2lkCnsKJHNmVmVyYm9zaXR5ID0gJHRoaXMtPnZlcmJvc2l0eU1hcFskdmVyYm9zaXR5XTsKaWYgKCRzZlZlcmJvc2l0eSA+ICR0aGlzLT5vdXRwdXQtPmdldFZlcmJvc2l0eSgpKSB7CnJldHVybjsKfQoKaWYgKCRyYXcpIHsKJHNmVmVyYm9zaXR5IHw9IE91dHB1dEludGVyZmFjZTo6T1VUUFVUX1JBVzsKfQoKaWYgKG51bGwgIT09ICR0aGlzLT5zdGFydFRpbWUpIHsKJG1lbW9yeVVzYWdlID0gbWVtb3J5X2dldF91c2FnZSgpIC8gMTAyNCAvIDEwMjQ7CiR0aW1lU3BlbnQgPSBtaWNyb3RpbWUodHJ1ZSkgLSAkdGhpcy0+c3RhcnRUaW1lOwokbWVzc2FnZXMgPSBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkbWVzc2FnZSkgdXNlICgkbWVtb3J5VXNhZ2UsICR0aW1lU3BlbnQpOiBzdHJpbmcgewpyZXR1cm4gc3ByaW50ZignWyUuMWZNaUIvJS4yZnNdICVzJywgJG1lbW9yeVVzYWdlLCAkdGltZVNwZW50LCAkbWVzc2FnZSk7Cn0sIChhcnJheSkgJG1lc3NhZ2VzKTsKfQoKaWYgKHRydWUgPT09ICRzdGRlcnIgJiYgJHRoaXMtPm91dHB1dCBpbnN0YW5jZW9mIENvbnNvbGVPdXRwdXRJbnRlcmZhY2UpIHsKJHRoaXMtPm91dHB1dC0+Z2V0RXJyb3JPdXRwdXQoKS0+d3JpdGUoJG1lc3NhZ2VzLCAkbmV3bGluZSwgJHNmVmVyYm9zaXR5KTsKJHRoaXMtPmxhc3RNZXNzYWdlRXJyID0gaW1wbG9kZSgkbmV3bGluZSA/ICJcbiIgOiAnJywgKGFycmF5KSAkbWVzc2FnZXMpOwoKcmV0dXJuOwp9CgokdGhpcy0+b3V0cHV0LT53cml0ZSgkbWVzc2FnZXMsICRuZXdsaW5lLCAkc2ZWZXJib3NpdHkpOwokdGhpcy0+bGFzdE1lc3NhZ2UgPSBpbXBsb2RlKCRuZXdsaW5lID8gIlxuIiA6ICcnLCAoYXJyYXkpICRtZXNzYWdlcyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBvdmVyd3JpdGUoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gdHJ1ZSwgP2ludCAkc2l6ZSA9IG51bGwsIGludCAkdmVyYm9zaXR5ID0gc2VsZjo6Tk9STUFMKQp7CiR0aGlzLT5kb092ZXJ3cml0ZSgkbWVzc2FnZXMsICRuZXdsaW5lLCAkc2l6ZSwgZmFsc2UsICR2ZXJib3NpdHkpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gb3ZlcndyaXRlRXJyb3IoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gdHJ1ZSwgP2ludCAkc2l6ZSA9IG51bGwsIGludCAkdmVyYm9zaXR5ID0gc2VsZjo6Tk9STUFMKQp7CiR0aGlzLT5kb092ZXJ3cml0ZSgkbWVzc2FnZXMsICRuZXdsaW5lLCAkc2l6ZSwgdHJ1ZSwgJHZlcmJvc2l0eSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9PdmVyd3JpdGUoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lLCA/aW50ICRzaXplLCBib29sICRzdGRlcnIsIGludCAkdmVyYm9zaXR5KTogdm9pZAp7CgokbWVzc2FnZXMgPSBpbXBsb2RlKCRuZXdsaW5lID8gIlxuIiA6ICcnLCAoYXJyYXkpICRtZXNzYWdlcyk7CgoKaWYgKCFpc3NldCgkc2l6ZSkpIHsKCiRzaXplID0gc3RybGVuKHN0cmlwX3RhZ3MoJHN0ZGVyciA/ICR0aGlzLT5sYXN0TWVzc2FnZUVyciA6ICR0aGlzLT5sYXN0TWVzc2FnZSkpOwp9CgokdGhpcy0+ZG9Xcml0ZShzdHJfcmVwZWF0KCJceDA4IiwgJHNpemUpLCBmYWxzZSwgJHN0ZGVyciwgJHZlcmJvc2l0eSk7CgoKJHRoaXMtPmRvV3JpdGUoJG1lc3NhZ2VzLCBmYWxzZSwgJHN0ZGVyciwgJHZlcmJvc2l0eSk7CgoKCgokZmlsbCA9ICRzaXplIC0gc3RybGVuKHN0cmlwX3RhZ3MoJG1lc3NhZ2VzKSk7CmlmICgkZmlsbCA+IDApIHsKCiR0aGlzLT5kb1dyaXRlKHN0cl9yZXBlYXQoJyAnLCAkZmlsbCksIGZhbHNlLCAkc3RkZXJyLCAkdmVyYm9zaXR5KTsKCiR0aGlzLT5kb1dyaXRlKHN0cl9yZXBlYXQoIlx4MDgiLCAkZmlsbCksIGZhbHNlLCAkc3RkZXJyLCAkdmVyYm9zaXR5KTsKfQoKaWYgKCRuZXdsaW5lKSB7CiR0aGlzLT5kb1dyaXRlKCcnLCB0cnVlLCAkc3RkZXJyLCAkdmVyYm9zaXR5KTsKfQoKaWYgKCRzdGRlcnIpIHsKJHRoaXMtPmxhc3RNZXNzYWdlRXJyID0gJG1lc3NhZ2VzOwp9IGVsc2UgewokdGhpcy0+bGFzdE1lc3NhZ2UgPSAkbWVzc2FnZXM7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByb2dyZXNzQmFyKGludCAkbWF4ID0gMCkKewpyZXR1cm4gbmV3IFByb2dyZXNzQmFyKCR0aGlzLT5nZXRFcnJvck91dHB1dCgpLCAkbWF4KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFzaygkcXVlc3Rpb24sICRkZWZhdWx0ID0gbnVsbCkKewoKJGhlbHBlciA9ICR0aGlzLT5oZWxwZXJTZXQtPmdldCgncXVlc3Rpb24nKTsKJHF1ZXN0aW9uID0gbmV3IFF1ZXN0aW9uKHNlbGY6OnNhbml0aXplKCRxdWVzdGlvbiksIGlzX3N0cmluZygkZGVmYXVsdCkgPyBzZWxmOjpzYW5pdGl6ZSgkZGVmYXVsdCkgOiAkZGVmYXVsdCk7CgpyZXR1cm4gJGhlbHBlci0+YXNrKCR0aGlzLT5pbnB1dCwgJHRoaXMtPmdldEVycm9yT3V0cHV0KCksICRxdWVzdGlvbik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhc2tDb25maXJtYXRpb24oJHF1ZXN0aW9uLCAkZGVmYXVsdCA9IHRydWUpCnsKCiRoZWxwZXIgPSAkdGhpcy0+aGVscGVyU2V0LT5nZXQoJ3F1ZXN0aW9uJyk7CiRxdWVzdGlvbiA9IG5ldyBTdHJpY3RDb25maXJtYXRpb25RdWVzdGlvbihzZWxmOjpzYW5pdGl6ZSgkcXVlc3Rpb24pLCBpc19zdHJpbmcoJGRlZmF1bHQpID8gc2VsZjo6c2FuaXRpemUoJGRlZmF1bHQpIDogJGRlZmF1bHQpOwoKcmV0dXJuICRoZWxwZXItPmFzaygkdGhpcy0+aW5wdXQsICR0aGlzLT5nZXRFcnJvck91dHB1dCgpLCAkcXVlc3Rpb24pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYXNrQW5kVmFsaWRhdGUoJHF1ZXN0aW9uLCAkdmFsaWRhdG9yLCAkYXR0ZW1wdHMgPSBudWxsLCAkZGVmYXVsdCA9IG51bGwpCnsKCiRoZWxwZXIgPSAkdGhpcy0+aGVscGVyU2V0LT5nZXQoJ3F1ZXN0aW9uJyk7CiRxdWVzdGlvbiA9IG5ldyBRdWVzdGlvbihzZWxmOjpzYW5pdGl6ZSgkcXVlc3Rpb24pLCBpc19zdHJpbmcoJGRlZmF1bHQpID8gc2VsZjo6c2FuaXRpemUoJGRlZmF1bHQpIDogJGRlZmF1bHQpOwokcXVlc3Rpb24tPnNldFZhbGlkYXRvcigkdmFsaWRhdG9yKTsKJHF1ZXN0aW9uLT5zZXRNYXhBdHRlbXB0cygkYXR0ZW1wdHMpOwoKcmV0dXJuICRoZWxwZXItPmFzaygkdGhpcy0+aW5wdXQsICR0aGlzLT5nZXRFcnJvck91dHB1dCgpLCAkcXVlc3Rpb24pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYXNrQW5kSGlkZUFuc3dlcigkcXVlc3Rpb24pCnsKCiRoZWxwZXIgPSAkdGhpcy0+aGVscGVyU2V0LT5nZXQoJ3F1ZXN0aW9uJyk7CiRxdWVzdGlvbiA9IG5ldyBRdWVzdGlvbihzZWxmOjpzYW5pdGl6ZSgkcXVlc3Rpb24pKTsKJHF1ZXN0aW9uLT5zZXRIaWRkZW4odHJ1ZSk7CgpyZXR1cm4gJGhlbHBlci0+YXNrKCR0aGlzLT5pbnB1dCwgJHRoaXMtPmdldEVycm9yT3V0cHV0KCksICRxdWVzdGlvbik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZWxlY3QoJHF1ZXN0aW9uLCAkY2hvaWNlcywgJGRlZmF1bHQsICRhdHRlbXB0cyA9IGZhbHNlLCAkZXJyb3JNZXNzYWdlID0gJ1ZhbHVlICIlcyIgaXMgaW52YWxpZCcsICRtdWx0aXNlbGVjdCA9IGZhbHNlKQp7CgokaGVscGVyID0gJHRoaXMtPmhlbHBlclNldC0+Z2V0KCdxdWVzdGlvbicpOwokcXVlc3Rpb24gPSBuZXcgQ2hvaWNlUXVlc3Rpb24oc2VsZjo6c2FuaXRpemUoJHF1ZXN0aW9uKSwgc2VsZjo6c2FuaXRpemUoJGNob2ljZXMpLCBpc19zdHJpbmcoJGRlZmF1bHQpID8gc2VsZjo6c2FuaXRpemUoJGRlZmF1bHQpIDogJGRlZmF1bHQpOwokcXVlc3Rpb24tPnNldE1heEF0dGVtcHRzKCRhdHRlbXB0cyA/OiBudWxsKTsgCiRxdWVzdGlvbi0+c2V0RXJyb3JNZXNzYWdlKCRlcnJvck1lc3NhZ2UpOwokcXVlc3Rpb24tPnNldE11bHRpc2VsZWN0KCRtdWx0aXNlbGVjdCk7CgokcmVzdWx0ID0gJGhlbHBlci0+YXNrKCR0aGlzLT5pbnB1dCwgJHRoaXMtPmdldEVycm9yT3V0cHV0KCksICRxdWVzdGlvbik7CgokaXNBc3NvYyA9IChib29sKSBcY291bnQoYXJyYXlfZmlsdGVyKGFycmF5X2tleXMoJGNob2ljZXMpLCAnaXNfc3RyaW5nJykpOwppZiAoJGlzQXNzb2MpIHsKcmV0dXJuICRyZXN1bHQ7Cn0KCmlmICghaXNfYXJyYXkoJHJlc3VsdCkpIHsKcmV0dXJuIChzdHJpbmcpIGFycmF5X3NlYXJjaCgkcmVzdWx0LCAkY2hvaWNlcywgdHJ1ZSk7Cn0KCiRyZXN1bHRzID0gW107CmZvcmVhY2ggKCRjaG9pY2VzIGFzICRpbmRleCA9PiAkY2hvaWNlKSB7CmlmIChpbl9hcnJheSgkY2hvaWNlLCAkcmVzdWx0LCB0cnVlKSkgewokcmVzdWx0c1tdID0gKHN0cmluZykgJGluZGV4Owp9Cn0KCnJldHVybiAkcmVzdWx0czsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFRhYmxlKCk6IFRhYmxlCnsKcmV0dXJuIG5ldyBUYWJsZSgkdGhpcy0+b3V0cHV0KTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRFcnJvck91dHB1dCgpOiBPdXRwdXRJbnRlcmZhY2UKewppZiAoJHRoaXMtPm91dHB1dCBpbnN0YW5jZW9mIENvbnNvbGVPdXRwdXRJbnRlcmZhY2UpIHsKcmV0dXJuICR0aGlzLT5vdXRwdXQtPmdldEVycm9yT3V0cHV0KCk7Cn0KCnJldHVybiAkdGhpcy0+b3V0cHV0Owp9CgoKCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzYW5pdGl6ZSgkbWVzc2FnZXMsIGJvb2wgJGFsbG93TmV3bGluZXMgPSB0cnVlKQp7CgoKCgokZXNjYXBlUGF0dGVybiA9ICdceDFCXFtbXHgzMC1ceDNGXSpbXHgyMC1ceDJGXSpbXHg0MC1ceDdFXXxceDFCXF0uKj8oPzpceDFCXFxcXHxceDA3KXxceDFCLic7CiRwYXR0ZXJuID0gJGFsbG93TmV3bGluZXMgPyAie3skZXNjYXBlUGF0dGVybn18W1x4MDEtXHgwOVx4MEJceDBDXHgwRS1ceDFBXXxccig/IVxuKX11IiA6ICJ7eyRlc2NhcGVQYXR0ZXJufXxbXHgwMS1ceDFBXX11IjsKaWYgKGlzX3N0cmluZygkbWVzc2FnZXMpKSB7CiRtZXNzYWdlcyA9IHNlbGY6OmVuc3VyZVZhbGlkVXRmOCgkbWVzc2FnZXMpOwpyZXR1cm4gUHJlZzo6cmVwbGFjZSgkcGF0dGVybiwgJycsICRtZXNzYWdlcyk7Cn0KCiRzYW5pdGl6ZWQgPSBbXTsKZm9yZWFjaCAoJG1lc3NhZ2VzIGFzICRrZXkgPT4gJG1lc3NhZ2UpIHsKJG1lc3NhZ2UgPSBzZWxmOjplbnN1cmVWYWxpZFV0ZjgoJG1lc3NhZ2UpOwokc2FuaXRpemVkWyRrZXldID0gUHJlZzo6cmVwbGFjZSgkcGF0dGVybiwgJycsICRtZXNzYWdlKTsKfQoKcmV0dXJuICRzYW5pdGl6ZWQ7Cn0KCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGVuc3VyZVZhbGlkVXRmOChzdHJpbmcgJHN0cmluZyk6IHN0cmluZwp7CgppZiAoZnVuY3Rpb25fZXhpc3RzKCdtYl9jaGVja19lbmNvZGluZycpICYmIG1iX2NoZWNrX2VuY29kaW5nKCRzdHJpbmcsICdVVEYtOCcpKSB7CnJldHVybiAkc3RyaW5nOwp9CgoKCmlmIChmdW5jdGlvbl9leGlzdHMoJ21iX2NvbnZlcnRfZW5jb2RpbmcnKSkgewpyZXR1cm4gKHN0cmluZykgbWJfY29udmVydF9lbmNvZGluZygkc3RyaW5nLCAnVVRGLTgnLCAnVVRGLTgnKTsKfQoKCmlmIChmdW5jdGlvbl9leGlzdHMoJ2ljb252JykpIHsKJGNsZWFuZWQgPSBAaWNvbnYoJ1VURi04JywgJ1VURi04Ly9UUkFOU0xJVCcsICRzdHJpbmcpOwppZiAoJGNsZWFuZWQgIT09IGZhbHNlKSB7CnJldHVybiAkY2xlYW5lZDsKfQp9CgoKcmV0dXJuICRzdHJpbmc7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSU87Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgUHNyXExvZ1xMb2dnZXJJbnRlcmZhY2U7CgoKCgoKCmludGVyZmFjZSBJT0ludGVyZmFjZSBleHRlbmRzIExvZ2dlckludGVyZmFjZQp7CnB1YmxpYyBjb25zdCBRVUlFVCA9IDE7CnB1YmxpYyBjb25zdCBOT1JNQUwgPSAyOwpwdWJsaWMgY29uc3QgVkVSQk9TRSA9IDQ7CnB1YmxpYyBjb25zdCBWRVJZX1ZFUkJPU0UgPSA4OwpwdWJsaWMgY29uc3QgREVCVUcgPSAxNjsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzSW50ZXJhY3RpdmUoKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVmVyYm9zZSgpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWZXJ5VmVyYm9zZSgpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZWJ1ZygpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZWNvcmF0ZWQoKTsKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSB0cnVlLCBpbnQgJHZlcmJvc2l0eSA9IHNlbGY6Ok5PUk1BTCk7CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGVFcnJvcigkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSB0cnVlLCBpbnQgJHZlcmJvc2l0eSA9IHNlbGY6Ok5PUk1BTCk7CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGVSYXcoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gdHJ1ZSwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpOwoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlRXJyb3JSYXcoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gdHJ1ZSwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpOwoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBvdmVyd3JpdGUoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gdHJ1ZSwgP2ludCAkc2l6ZSA9IG51bGwsIGludCAkdmVyYm9zaXR5ID0gc2VsZjo6Tk9STUFMKTsKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gb3ZlcndyaXRlRXJyb3IoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gdHJ1ZSwgP2ludCAkc2l6ZSA9IG51bGwsIGludCAkdmVyYm9zaXR5ID0gc2VsZjo6Tk9STUFMKTsKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhc2soc3RyaW5nICRxdWVzdGlvbiwgJGRlZmF1bHQgPSBudWxsKTsKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXNrQ29uZmlybWF0aW9uKHN0cmluZyAkcXVlc3Rpb24sIGJvb2wgJGRlZmF1bHQgPSB0cnVlKTsKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhc2tBbmRWYWxpZGF0ZShzdHJpbmcgJHF1ZXN0aW9uLCBjYWxsYWJsZSAkdmFsaWRhdG9yLCA/aW50ICRhdHRlbXB0cyA9IG51bGwsICRkZWZhdWx0ID0gbnVsbCk7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFza0FuZEhpZGVBbnN3ZXIoc3RyaW5nICRxdWVzdGlvbik7CgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2VsZWN0KHN0cmluZyAkcXVlc3Rpb24sIGFycmF5ICRjaG9pY2VzLCAkZGVmYXVsdCwgJGF0dGVtcHRzID0gZmFsc2UsIHN0cmluZyAkZXJyb3JNZXNzYWdlID0gJ1ZhbHVlICIlcyIgaXMgaW52YWxpZCcsIGJvb2wgJG11bHRpc2VsZWN0ID0gZmFsc2UpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXV0aGVudGljYXRpb25zKCk7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc0F1dGhlbnRpY2F0aW9uKHN0cmluZyAkcmVwb3NpdG9yeU5hbWUpOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBdXRoZW50aWNhdGlvbihzdHJpbmcgJHJlcG9zaXRvcnlOYW1lKTsKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBdXRoZW50aWNhdGlvbihzdHJpbmcgJHJlcG9zaXRvcnlOYW1lLCBzdHJpbmcgJHVzZXJuYW1lLCA/c3RyaW5nICRwYXNzd29yZCA9IG51bGwpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbG9hZENvbmZpZ3VyYXRpb24oQ29uZmlnICRjb25maWcpOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxJTzsKCgoKCgoKY2xhc3MgTnVsbElPIGV4dGVuZHMgQmFzZUlPCnsKCgoKcHVibGljIGZ1bmN0aW9uIGlzSW50ZXJhY3RpdmUoKTogYm9vbAp7CnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVmVyYm9zZSgpOiBib29sCnsKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWZXJ5VmVyYm9zZSgpOiBib29sCnsKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZWJ1ZygpOiBib29sCnsKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZWNvcmF0ZWQoKTogYm9vbAp7CnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IHRydWUsIGludCAkdmVyYm9zaXR5ID0gc2VsZjo6Tk9STUFMKTogdm9pZAp7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZUVycm9yKCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IHRydWUsIGludCAkdmVyYm9zaXR5ID0gc2VsZjo6Tk9STUFMKTogdm9pZAp7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBvdmVyd3JpdGUoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gdHJ1ZSwgP2ludCAkc2l6ZSA9IG51bGwsIGludCAkdmVyYm9zaXR5ID0gc2VsZjo6Tk9STUFMKTogdm9pZAp7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBvdmVyd3JpdGVFcnJvcigkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSB0cnVlLCA/aW50ICRzaXplID0gbnVsbCwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpOiB2b2lkCnsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFzaygkcXVlc3Rpb24sICRkZWZhdWx0ID0gbnVsbCkKewpyZXR1cm4gJGRlZmF1bHQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhc2tDb25maXJtYXRpb24oJHF1ZXN0aW9uLCAkZGVmYXVsdCA9IHRydWUpOiBib29sCnsKcmV0dXJuICRkZWZhdWx0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYXNrQW5kVmFsaWRhdGUoJHF1ZXN0aW9uLCAkdmFsaWRhdG9yLCAkYXR0ZW1wdHMgPSBudWxsLCAkZGVmYXVsdCA9IG51bGwpCnsKcmV0dXJuICRkZWZhdWx0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYXNrQW5kSGlkZUFuc3dlcigkcXVlc3Rpb24pOiA/c3RyaW5nCnsKcmV0dXJuIG51bGw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZWxlY3QoJHF1ZXN0aW9uLCAkY2hvaWNlcywgJGRlZmF1bHQsICRhdHRlbXB0cyA9IGZhbHNlLCAkZXJyb3JNZXNzYWdlID0gJ1ZhbHVlICIlcyIgaXMgaW52YWxpZCcsICRtdWx0aXNlbGVjdCA9IGZhbHNlKQp7CnJldHVybiAkZGVmYXVsdDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlcjsKCnVzZSBDb21wb3NlclxBZHZpc29yeVxBdWRpdENvbmZpZzsKdXNlIENvbXBvc2VyXEF1dG9sb2FkXEF1dG9sb2FkR2VuZXJhdG9yOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxHaXRodWJBY3Rpb25FcnJvcjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxEZWZhdWx0UG9saWN5Owp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXExvY2FsUmVwb1RyYW5zYWN0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXExvY2tUcmFuc2FjdGlvbjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cVXBkYXRlT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxJbnN0YWxsT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxVbmluc3RhbGxPcGVyYXRpb247CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcUG9vbE9wdGltaXplcjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxQb29sOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFJlcXVlc3Q7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcU2VjdXJpdHlBZHZpc29yeVBvb2xGaWx0ZXI7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcU29sdmVyOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFNvbHZlclByb2JsZW1zRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFBvbGljeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcRG93bmxvYWRNYW5hZ2VyOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnREaXNwYXRjaGVyOwp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcSWdub3JlTGlzdFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXI7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJbnN0YWxsZXJcSW5zdGFsbGF0aW9uTWFuYWdlcjsKdXNlIENvbXBvc2VyXEluc3RhbGxlclxJbnN0YWxsZXJFdmVudHM7CnVzZSBDb21wb3NlclxJbnN0YWxsZXJcU3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlcjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTGluazsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXEFycmF5TG9hZGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxEdW1wZXJcQXJyYXlEdW1wZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcQXJyYXlSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5U2V0Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxDb21wb3NpdGVSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9ja2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkQXJyYXlSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSb290UGFja2FnZVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeU1hbmFnZXI7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XExvY2tBcnJheVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxTY3JpcHRcU2NyaXB0RXZlbnRzOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIENvbXBvc2VyXEFkdmlzb3J5XEF1ZGl0b3I7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwoKCgoKCgoKY2xhc3MgSW5zdGFsbGVyCnsKcHVibGljIGNvbnN0IEVSUk9SX05PTkUgPSAwOyAKcHVibGljIGNvbnN0IEVSUk9SX0dFTkVSSUNfRkFJTFVSRSA9IDE7CnB1YmxpYyBjb25zdCBFUlJPUl9OT19MT0NLX0ZJTEVfRk9SX1BBUlRJQUxfVVBEQVRFID0gMzsKcHVibGljIGNvbnN0IEVSUk9SX0xPQ0tfRklMRV9JTlZBTElEID0gNDsKCnB1YmxpYyBjb25zdCBFUlJPUl9ERVBFTkRFTkNZX1JFU09MVVRJT05fRkFJTEVEID0gMjsKcHVibGljIGNvbnN0IEVSUk9SX0FVRElUX0ZBSUxFRCA9IDU7CgpwdWJsaWMgY29uc3QgRVJST1JfVFJBTlNQT1JUX0VYQ0VQVElPTiA9IDEwMDsKCgoKCnByb3RlY3RlZCAkaW87CgoKCgpwcm90ZWN0ZWQgJGNvbmZpZzsKCgoKCnByb3RlY3RlZCAkcGFja2FnZTsKCgoKCgpwcm90ZWN0ZWQgJGZpeGVkUm9vdFBhY2thZ2U7CgoKCgpwcm90ZWN0ZWQgJGRvd25sb2FkTWFuYWdlcjsKCgoKCnByb3RlY3RlZCAkcmVwb3NpdG9yeU1hbmFnZXI7CgoKCgpwcm90ZWN0ZWQgJGxvY2tlcjsKCgoKCnByb3RlY3RlZCAkaW5zdGFsbGF0aW9uTWFuYWdlcjsKCgoKCnByb3RlY3RlZCAkZXZlbnREaXNwYXRjaGVyOwoKCgoKcHJvdGVjdGVkICRhdXRvbG9hZEdlbmVyYXRvcjsKCgpwcm90ZWN0ZWQgJHByZWZlclNvdXJjZSA9IGZhbHNlOwoKcHJvdGVjdGVkICRwcmVmZXJEaXN0ID0gZmFsc2U7Cgpwcm90ZWN0ZWQgJG9wdGltaXplQXV0b2xvYWRlciA9IGZhbHNlOwoKcHJvdGVjdGVkICRjbGFzc01hcEF1dGhvcml0YXRpdmUgPSBmYWxzZTsKCnByb3RlY3RlZCAkYXBjdUF1dG9sb2FkZXIgPSBmYWxzZTsKCnByb3RlY3RlZCAkYXBjdUF1dG9sb2FkZXJQcmVmaXggPSBudWxsOwoKcHJvdGVjdGVkICRkZXZNb2RlID0gZmFsc2U7Cgpwcm90ZWN0ZWQgJGRyeVJ1biA9IGZhbHNlOwoKcHJvdGVjdGVkICRkb3dubG9hZE9ubHkgPSBmYWxzZTsKCnByb3RlY3RlZCAkdmVyYm9zZSA9IGZhbHNlOwoKcHJvdGVjdGVkICR1cGRhdGUgPSBmYWxzZTsKCnByb3RlY3RlZCAkaW5zdGFsbCA9IHRydWU7Cgpwcm90ZWN0ZWQgJGR1bXBBdXRvbG9hZGVyID0gdHJ1ZTsKCnByb3RlY3RlZCAkcnVuU2NyaXB0cyA9IHRydWU7Cgpwcm90ZWN0ZWQgJHByZWZlclN0YWJsZSA9IGZhbHNlOwoKcHJvdGVjdGVkICRwcmVmZXJMb3dlc3QgPSBmYWxzZTsKCnByb3RlY3RlZCAkbWluaW1hbFVwZGF0ZSA9IGZhbHNlOwoKcHJvdGVjdGVkICR3cml0ZUxvY2s7Cgpwcm90ZWN0ZWQgJGV4ZWN1dGVPcGVyYXRpb25zID0gdHJ1ZTsKCnByb3RlY3RlZCAkYXVkaXQgPSB0cnVlOwoKcHJvdGVjdGVkICRlcnJvck9uQXVkaXQgPSBmYWxzZTsKCnByb3RlY3RlZCAkYXVkaXRGb3JtYXQgPSBBdWRpdG9yOjpGT1JNQVRfU1VNTUFSWTsKCnByaXZhdGUgJGF1ZGl0Q29uZmlnID0gbnVsbDsKCnByaXZhdGUgJGlnbm9yZWRUeXBlcyA9IFsncGhwLWV4dCcsICdwaHAtZXh0LXplbmQnXTsKCnByaXZhdGUgJGFsbG93ZWRUeXBlcyA9IG51bGw7CgoKcHJvdGVjdGVkICR1cGRhdGVNaXJyb3JzID0gZmFsc2U7CgoKCgoKcHJvdGVjdGVkICR1cGRhdGVBbGxvd0xpc3QgPSBudWxsOwoKcHJvdGVjdGVkICR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMgPSBSZXF1ZXN0OjpVUERBVEVfT05MWV9MSVNURUQ7CgoKCgpwcm90ZWN0ZWQgJHN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXI7CgoKCgpwcm90ZWN0ZWQgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXI7CgoKCgpwcm90ZWN0ZWQgJGFkZGl0aW9uYWxGaXhlZFJlcG9zaXRvcnk7CgoKcHJvdGVjdGVkICR0ZW1wb3JhcnlDb25zdHJhaW50cyA9IFtdOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgUm9vdFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIERvd25sb2FkTWFuYWdlciAkZG93bmxvYWRNYW5hZ2VyLCBSZXBvc2l0b3J5TWFuYWdlciAkcmVwb3NpdG9yeU1hbmFnZXIsIExvY2tlciAkbG9ja2VyLCBJbnN0YWxsYXRpb25NYW5hZ2VyICRpbnN0YWxsYXRpb25NYW5hZ2VyLCBFdmVudERpc3BhdGNoZXIgJGV2ZW50RGlzcGF0Y2hlciwgQXV0b2xvYWRHZW5lcmF0b3IgJGF1dG9sb2FkR2VuZXJhdG9yKQp7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7CiR0aGlzLT5wYWNrYWdlID0gJHBhY2thZ2U7CiR0aGlzLT5kb3dubG9hZE1hbmFnZXIgPSAkZG93bmxvYWRNYW5hZ2VyOwokdGhpcy0+cmVwb3NpdG9yeU1hbmFnZXIgPSAkcmVwb3NpdG9yeU1hbmFnZXI7CiR0aGlzLT5sb2NrZXIgPSAkbG9ja2VyOwokdGhpcy0+aW5zdGFsbGF0aW9uTWFuYWdlciA9ICRpbnN0YWxsYXRpb25NYW5hZ2VyOwokdGhpcy0+ZXZlbnREaXNwYXRjaGVyID0gJGV2ZW50RGlzcGF0Y2hlcjsKJHRoaXMtPmF1dG9sb2FkR2VuZXJhdG9yID0gJGF1dG9sb2FkR2VuZXJhdG9yOwokdGhpcy0+c3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlciA9IG5ldyBTdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyKCR0aGlzLT5pbyk7CiR0aGlzLT5wbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyID0gUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk6Omlnbm9yZU5vdGhpbmcoKTsKCiR0aGlzLT53cml0ZUxvY2sgPSAkY29uZmlnLT5nZXQoJ2xvY2snKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBydW4oKTogaW50CnsKCgoKCmdjX2NvbGxlY3RfY3ljbGVzKCk7CmdjX2Rpc2FibGUoKTsKCmlmICgkdGhpcy0+dXBkYXRlQWxsb3dMaXN0ICE9PSBudWxsICYmICR0aGlzLT51cGRhdGVNaXJyb3JzKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigiVGhlIGluc3RhbGxlciBvcHRpb25zIHVwZGF0ZU1pcnJvcnMgYW5kIHVwZGF0ZUFsbG93TGlzdCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiIpOwp9CgokaXNGcmVzaEluc3RhbGwgPSAkdGhpcy0+cmVwb3NpdG9yeU1hbmFnZXItPmdldExvY2FsUmVwb3NpdG9yeSgpLT5pc0ZyZXNoKCk7CgoKaWYgKCEkdGhpcy0+dXBkYXRlICYmICEkdGhpcy0+bG9ja2VyLT5pc0xvY2tlZCgpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Tm8gY29tcG9zZXIubG9jayBmaWxlIHByZXNlbnQuIFVwZGF0aW5nIGRlcGVuZGVuY2llcyB0byBsYXRlc3QgaW5zdGVhZCBvZiBpbnN0YWxsaW5nIGZyb20gbG9jayBmaWxlLiBTZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvaW5zdGFsbCBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3dhcm5pbmc+Jyk7CiR0aGlzLT51cGRhdGUgPSB0cnVlOwp9CgppZiAoJHRoaXMtPmRyeVJ1bikgewokdGhpcy0+dmVyYm9zZSA9IHRydWU7CiR0aGlzLT5ydW5TY3JpcHRzID0gZmFsc2U7CiR0aGlzLT5leGVjdXRlT3BlcmF0aW9ucyA9IGZhbHNlOwokdGhpcy0+d3JpdGVMb2NrID0gZmFsc2U7CiR0aGlzLT5kdW1wQXV0b2xvYWRlciA9IGZhbHNlOwokdGhpcy0+bW9ja0xvY2FsUmVwb3NpdG9yaWVzKCR0aGlzLT5yZXBvc2l0b3J5TWFuYWdlcik7Cn0KCmlmICgkdGhpcy0+ZG93bmxvYWRPbmx5KSB7CiR0aGlzLT5kdW1wQXV0b2xvYWRlciA9IGZhbHNlOwp9CgppZiAoJHRoaXMtPnVwZGF0ZSAmJiAhJHRoaXMtPmluc3RhbGwpIHsKJHRoaXMtPmR1bXBBdXRvbG9hZGVyID0gZmFsc2U7Cn0KCmlmICgkdGhpcy0+cnVuU2NyaXB0cykgewpQbGF0Zm9ybTo6cHV0RW52KCdDT01QT1NFUl9ERVZfTU9ERScsICR0aGlzLT5kZXZNb2RlID8gJzEnIDogJzAnKTsKCgoKJGV2ZW50TmFtZSA9ICR0aGlzLT51cGRhdGUgPyBTY3JpcHRFdmVudHM6OlBSRV9VUERBVEVfQ01EIDogU2NyaXB0RXZlbnRzOjpQUkVfSU5TVEFMTF9DTUQ7CiR0aGlzLT5ldmVudERpc3BhdGNoZXItPmRpc3BhdGNoU2NyaXB0KCRldmVudE5hbWUsICR0aGlzLT5kZXZNb2RlKTsKfQoKJHRoaXMtPmRvd25sb2FkTWFuYWdlci0+c2V0UHJlZmVyU291cmNlKCR0aGlzLT5wcmVmZXJTb3VyY2UpOwokdGhpcy0+ZG93bmxvYWRNYW5hZ2VyLT5zZXRQcmVmZXJEaXN0KCR0aGlzLT5wcmVmZXJEaXN0KTsKCiRsb2NhbFJlcG8gPSAkdGhpcy0+cmVwb3NpdG9yeU1hbmFnZXItPmdldExvY2FsUmVwb3NpdG9yeSgpOwoKdHJ5IHsKaWYgKCR0aGlzLT51cGRhdGUpIHsKJHJlcyA9ICR0aGlzLT5kb1VwZGF0ZSgkbG9jYWxSZXBvLCAkdGhpcy0+aW5zdGFsbCk7Cn0gZWxzZSB7CiRyZXMgPSAkdGhpcy0+ZG9JbnN0YWxsKCRsb2NhbFJlcG8pOwp9CmlmICgkcmVzICE9PSAwKSB7CnJldHVybiAkcmVzOwp9Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKaWYgKCR0aGlzLT5leGVjdXRlT3BlcmF0aW9ucyAmJiAkdGhpcy0+aW5zdGFsbCAmJiAkdGhpcy0+Y29uZmlnLT5nZXQoJ25vdGlmeS1vbi1pbnN0YWxsJykpIHsKJHRoaXMtPmluc3RhbGxhdGlvbk1hbmFnZXItPm5vdGlmeUluc3RhbGxzKCR0aGlzLT5pbyk7Cn0KCnRocm93ICRlOwp9CmlmICgkdGhpcy0+ZXhlY3V0ZU9wZXJhdGlvbnMgJiYgJHRoaXMtPmluc3RhbGwgJiYgJHRoaXMtPmNvbmZpZy0+Z2V0KCdub3RpZnktb24taW5zdGFsbCcpKSB7CiR0aGlzLT5pbnN0YWxsYXRpb25NYW5hZ2VyLT5ub3RpZnlJbnN0YWxscygkdGhpcy0+aW8pOwp9CgppZiAoJHRoaXMtPnVwZGF0ZSkgewokaW5zdGFsbGVkUmVwbyA9IG5ldyBJbnN0YWxsZWRSZXBvc2l0b3J5KFsKJHRoaXMtPmxvY2tlci0+Z2V0TG9ja2VkUmVwb3NpdG9yeSgkdGhpcy0+ZGV2TW9kZSksCiR0aGlzLT5jcmVhdGVQbGF0Zm9ybVJlcG8oZmFsc2UpLApuZXcgUm9vdFBhY2thZ2VSZXBvc2l0b3J5KGNsb25lICR0aGlzLT5wYWNrYWdlKSwKXSk7CmlmICgkaXNGcmVzaEluc3RhbGwpIHsKJHRoaXMtPnN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXItPmFkZFN1Z2dlc3Rpb25zRnJvbVBhY2thZ2UoJHRoaXMtPnBhY2thZ2UpOwp9CiR0aGlzLT5zdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyLT5vdXRwdXRNaW5pbWFsaXN0aWMoJGluc3RhbGxlZFJlcG8pOwp9CgoKJGxvY2tlZFJlcG9zaXRvcnkgPSAkdGhpcy0+bG9ja2VyLT5nZXRMb2NrZWRSZXBvc2l0b3J5KHRydWUpOwpmb3JlYWNoICgkbG9ja2VkUmVwb3NpdG9yeS0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoISRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlIHx8ICEkcGFja2FnZS0+aXNBYmFuZG9uZWQoKSkgewpjb250aW51ZTsKfQoKJHJlcGxhY2VtZW50ID0gaXNfc3RyaW5nKCRwYWNrYWdlLT5nZXRSZXBsYWNlbWVudFBhY2thZ2UoKSkKPyAnVXNlICcgLiAkcGFja2FnZS0+Z2V0UmVwbGFjZW1lbnRQYWNrYWdlKCkgLiAnIGluc3RlYWQnCjogJ05vIHJlcGxhY2VtZW50IHdhcyBzdWdnZXN0ZWQnOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKApzcHJpbnRmKAoiPHdhcm5pbmc+UGFja2FnZSAlcyBpcyBhYmFuZG9uZWQsIHlvdSBzaG91bGQgYXZvaWQgdXNpbmcgaXQuICVzLjwvd2FybmluZz4iLAokcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLAokcmVwbGFjZW1lbnQKKQopOwp9CgppZiAoJHRoaXMtPmR1bXBBdXRvbG9hZGVyKSB7CgppZiAoJHRoaXMtPm9wdGltaXplQXV0b2xvYWRlcikgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxpbmZvPkdlbmVyYXRpbmcgb3B0aW1pemVkIGF1dG9sb2FkIGZpbGVzPC9pbmZvPicpOwp9IGVsc2UgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxpbmZvPkdlbmVyYXRpbmcgYXV0b2xvYWQgZmlsZXM8L2luZm8+Jyk7Cn0KCiR0aGlzLT5hdXRvbG9hZEdlbmVyYXRvci0+c2V0Q2xhc3NNYXBBdXRob3JpdGF0aXZlKCR0aGlzLT5jbGFzc01hcEF1dGhvcml0YXRpdmUpOwokdGhpcy0+YXV0b2xvYWRHZW5lcmF0b3ItPnNldEFwY3UoJHRoaXMtPmFwY3VBdXRvbG9hZGVyLCAkdGhpcy0+YXBjdUF1dG9sb2FkZXJQcmVmaXgpOwokdGhpcy0+YXV0b2xvYWRHZW5lcmF0b3ItPnNldFJ1blNjcmlwdHMoJHRoaXMtPnJ1blNjcmlwdHMpOwokdGhpcy0+YXV0b2xvYWRHZW5lcmF0b3ItPnNldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoJHRoaXMtPnBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpOwokdGhpcwotPmF1dG9sb2FkR2VuZXJhdG9yCi0+ZHVtcCgKJHRoaXMtPmNvbmZpZywKJGxvY2FsUmVwbywKJHRoaXMtPnBhY2thZ2UsCiR0aGlzLT5pbnN0YWxsYXRpb25NYW5hZ2VyLAonY29tcG9zZXInLAokdGhpcy0+b3B0aW1pemVBdXRvbG9hZGVyLApudWxsLAokdGhpcy0+bG9ja2VyCik7Cn0KCmlmICgkdGhpcy0+aW5zdGFsbCAmJiAkdGhpcy0+ZXhlY3V0ZU9wZXJhdGlvbnMpIHsKCmZvcmVhY2ggKCRsb2NhbFJlcG8tPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKJHRoaXMtPmluc3RhbGxhdGlvbk1hbmFnZXItPmVuc3VyZUJpbmFyaWVzUHJlc2VuY2UoJHBhY2thZ2UpOwp9Cn0KCiRmdW5kRW52ID0gUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfRlVORCcpOwokc2hvd0Z1bmRpbmcgPSB0cnVlOwppZiAoaXNfbnVtZXJpYygkZnVuZEVudikpIHsKJHNob3dGdW5kaW5nID0gaW50dmFsKCRmdW5kRW52KSAhPT0gMDsKfQoKaWYgKCRzaG93RnVuZGluZykgewokZnVuZGluZ0NvdW50ID0gMDsKZm9yZWFjaCAoJGxvY2FsUmVwby0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJiYgISRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICYmICRwYWNrYWdlLT5nZXRGdW5kaW5nKCkpIHsKJGZ1bmRpbmdDb3VudCsrOwp9Cn0KaWYgKCRmdW5kaW5nQ291bnQgPiAwKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihbCnNwcmludGYoCiI8aW5mbz4lZCBwYWNrYWdlJXMgeW91IGFyZSB1c2luZyAlcyBsb29raW5nIGZvciBmdW5kaW5nLjwvaW5mbz4iLAokZnVuZGluZ0NvdW50LAoxID09PSAkZnVuZGluZ0NvdW50ID8gJycgOiAncycsCjEgPT09ICRmdW5kaW5nQ291bnQgPyAnaXMnIDogJ2FyZScKKSwKJzxpbmZvPlVzZSB0aGUgYGNvbXBvc2VyIGZ1bmRgIGNvbW1hbmQgdG8gZmluZCBvdXQgbW9yZSE8L2luZm8+JywKXSk7Cn0KfQoKaWYgKCR0aGlzLT5ydW5TY3JpcHRzKSB7CgokZXZlbnROYW1lID0gJHRoaXMtPnVwZGF0ZSA/IFNjcmlwdEV2ZW50czo6UE9TVF9VUERBVEVfQ01EIDogU2NyaXB0RXZlbnRzOjpQT1NUX0lOU1RBTExfQ01EOwokdGhpcy0+ZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaFNjcmlwdCgkZXZlbnROYW1lLCAkdGhpcy0+ZGV2TW9kZSk7Cn0KCgppZiAoIWRlZmluZWQoJ0hIVk1fVkVSU0lPTicpKSB7CmdjX2VuYWJsZSgpOwp9CgokYXVkaXRDb25maWcgPSAkdGhpcy0+Z2V0QXVkaXRDb25maWcoKTsKCmlmICgkYXVkaXRDb25maWctPmF1ZGl0KSB7CmlmICgkdGhpcy0+dXBkYXRlICYmICEkdGhpcy0+aW5zdGFsbCkgewokcGFja2FnZXMgPSAkbG9ja2VkUmVwb3NpdG9yeS0+Z2V0Q2Fub25pY2FsUGFja2FnZXMoKTsKJHRhcmdldCA9ICdsb2NrZWQnOwp9IGVsc2UgewokcGFja2FnZXMgPSAkbG9jYWxSZXBvLT5nZXRDYW5vbmljYWxQYWNrYWdlcygpOwokdGFyZ2V0ID0gJ2luc3RhbGxlZCc7Cn0KaWYgKGNvdW50KCRwYWNrYWdlcykgPiAwKSB7CnRyeSB7CiRhdWRpdG9yID0gbmV3IEF1ZGl0b3IoKTsKJHJlcG9TZXQgPSBuZXcgUmVwb3NpdG9yeVNldCgpOwpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yeU1hbmFnZXItPmdldFJlcG9zaXRvcmllcygpIGFzICRyZXBvKSB7CiRyZXBvU2V0LT5hZGRSZXBvc2l0b3J5KCRyZXBvKTsKfQoKcmV0dXJuICRhdWRpdG9yLT5hdWRpdCgkdGhpcy0+aW8sICRyZXBvU2V0LCAkcGFja2FnZXMsICRhdWRpdENvbmZpZy0+YXVkaXRGb3JtYXQsIHRydWUsICRhdWRpdENvbmZpZy0+aWdub3JlTGlzdEZvckF1ZGl0LCAkYXVkaXRDb25maWctPmF1ZGl0QWJhbmRvbmVkLCAkYXVkaXRDb25maWctPmlnbm9yZVNldmVyaXR5Rm9yQXVkaXQsICRhdWRpdENvbmZpZy0+aWdub3JlVW5yZWFjaGFibGUsICRhdWRpdENvbmZpZy0+aWdub3JlQWJhbmRvbmVkRm9yQXVkaXQpID4gMCAmJiAkdGhpcy0+ZXJyb3JPbkF1ZGl0ID8gc2VsZjo6RVJST1JfQVVESVRfRkFJTEVEIDogMDsKfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CiR0aGlzLT5pby0+ZXJyb3IoJ0ZhaWxlZCB0byBhdWRpdCAnLiR0YXJnZXQuJyBwYWNrYWdlcy4nKTsKaWYgKCR0aGlzLT5pby0+aXNWZXJib3NlKCkpIHsKJHRoaXMtPmlvLT5lcnJvcignWycuZ2V0X2NsYXNzKCRlKS4nXSAnLiRlLT5nZXRNZXNzYWdlKCkpOwp9Cn0KfSBlbHNlIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdObyAnLiR0YXJnZXQuJyBwYWNrYWdlcyAtIHNraXBwaW5nIGF1ZGl0LicpOwp9Cn0KCnJldHVybiAwOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9VcGRhdGUoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkbG9jYWxSZXBvLCBib29sICRkb0luc3RhbGwpOiBpbnQKewokcGxhdGZvcm1SZXBvID0gJHRoaXMtPmNyZWF0ZVBsYXRmb3JtUmVwbyh0cnVlKTsKJGFsaWFzZXMgPSAkdGhpcy0+Z2V0Um9vdEFsaWFzZXModHJ1ZSk7CgokbG9ja2VkUmVwb3NpdG9yeSA9IG51bGw7Cgp0cnkgewppZiAoJHRoaXMtPmxvY2tlci0+aXNMb2NrZWQoKSkgewokbG9ja2VkUmVwb3NpdG9yeSA9ICR0aGlzLT5sb2NrZXItPmdldExvY2tlZFJlcG9zaXRvcnkodHJ1ZSk7Cn0KfSBjYXRjaCAoXFNlbGRcSnNvbkxpbnRcUGFyc2luZ0V4Y2VwdGlvbiAkZSkgewppZiAoJHRoaXMtPnVwZGF0ZUFsbG93TGlzdCAhPT0gbnVsbCB8fCAkdGhpcy0+dXBkYXRlTWlycm9ycykgewoKdGhyb3cgJGU7Cn0KCgp9CgppZiAoKCR0aGlzLT51cGRhdGVBbGxvd0xpc3QgIT09IG51bGwgfHwgJHRoaXMtPnVwZGF0ZU1pcnJvcnMpICYmICEkbG9ja2VkUmVwb3NpdG9yeSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj5DYW5ub3QgdXBkYXRlICcgLiAoJHRoaXMtPnVwZGF0ZU1pcnJvcnMgPyAnbG9jayBmaWxlIGluZm9ybWF0aW9uJyA6ICdvbmx5IGEgcGFydGlhbCBzZXQgb2YgcGFja2FnZXMnKSAuICcgd2l0aG91dCBhIGxvY2sgZmlsZSBwcmVzZW50LiBSdW4gYGNvbXBvc2VyIHVwZGF0ZWAgdG8gZ2VuZXJhdGUgYSBsb2NrIGZpbGUuPC9lcnJvcj4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwoKcmV0dXJuIHNlbGY6OkVSUk9SX05PX0xPQ0tfRklMRV9GT1JfUEFSVElBTF9VUERBVEU7Cn0KCiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGluZm8+TG9hZGluZyBjb21wb3NlciByZXBvc2l0b3JpZXMgd2l0aCBwYWNrYWdlIGluZm9ybWF0aW9uPC9pbmZvPicpOwoKCiRwb2xpY3kgPSAkdGhpcy0+Y3JlYXRlUG9saWN5KHRydWUsICRsb2NrZWRSZXBvc2l0b3J5KTsKJHJlcG9zaXRvcnlTZXQgPSAkdGhpcy0+Y3JlYXRlUmVwb3NpdG9yeVNldCh0cnVlLCAkcGxhdGZvcm1SZXBvLCAkYWxpYXNlcyk7CiRyZXBvc2l0b3JpZXMgPSAkdGhpcy0+cmVwb3NpdG9yeU1hbmFnZXItPmdldFJlcG9zaXRvcmllcygpOwpmb3JlYWNoICgkcmVwb3NpdG9yaWVzIGFzICRyZXBvc2l0b3J5KSB7CiRyZXBvc2l0b3J5U2V0LT5hZGRSZXBvc2l0b3J5KCRyZXBvc2l0b3J5KTsKfQppZiAoJGxvY2tlZFJlcG9zaXRvcnkpIHsKJHJlcG9zaXRvcnlTZXQtPmFkZFJlcG9zaXRvcnkoJGxvY2tlZFJlcG9zaXRvcnkpOwp9CgokcmVxdWVzdCA9ICR0aGlzLT5jcmVhdGVSZXF1ZXN0KCR0aGlzLT5maXhlZFJvb3RQYWNrYWdlLCAkcGxhdGZvcm1SZXBvLCAkbG9ja2VkUmVwb3NpdG9yeSk7CiR0aGlzLT5yZXF1aXJlUGFja2FnZXNGb3JVcGRhdGUoJHJlcXVlc3QsICRsb2NrZWRSZXBvc2l0b3J5LCB0cnVlKTsKCgppZiAoJHRoaXMtPnVwZGF0ZUFsbG93TGlzdCAhPT0gbnVsbCkgewokcmVxdWVzdC0+c2V0VXBkYXRlQWxsb3dMaXN0KCR0aGlzLT51cGRhdGVBbGxvd0xpc3QsICR0aGlzLT51cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMpOwp9CgokcG9vbCA9ICRyZXBvc2l0b3J5U2V0LT5jcmVhdGVQb29sKCRyZXF1ZXN0LCAkdGhpcy0+aW8sICR0aGlzLT5ldmVudERpc3BhdGNoZXIsICR0aGlzLT5jcmVhdGVQb29sT3B0aW1pemVyKCRwb2xpY3kpLCAkdGhpcy0+aWdub3JlZFR5cGVzLCAkdGhpcy0+YWxsb3dlZFR5cGVzLCAkdGhpcy0+Y3JlYXRlU2VjdXJpdHlBdWRpdFBvb2xGaWx0ZXIoKSk7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxpbmZvPlVwZGF0aW5nIGRlcGVuZGVuY2llczwvaW5mbz4nKTsKCgokc29sdmVyID0gbmV3IFNvbHZlcigkcG9saWN5LCAkcG9vbCwgJHRoaXMtPmlvKTsKdHJ5IHsKJGxvY2tUcmFuc2FjdGlvbiA9ICRzb2x2ZXItPnNvbHZlKCRyZXF1ZXN0LCAkdGhpcy0+cGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik7CiRydWxlU2V0U2l6ZSA9ICRzb2x2ZXItPmdldFJ1bGVTZXRTaXplKCk7CiRzb2x2ZXIgPSBudWxsOwp9IGNhdGNoIChTb2x2ZXJQcm9ibGVtc0V4Y2VwdGlvbiAkZSkgewokZXJyID0gJ1lvdXIgcmVxdWlyZW1lbnRzIGNvdWxkIG5vdCBiZSByZXNvbHZlZCB0byBhbiBpbnN0YWxsYWJsZSBzZXQgb2YgcGFja2FnZXMuJzsKJHByZXR0eVByb2JsZW0gPSAkZS0+Z2V0UHJldHR5U3RyaW5nKCRyZXBvc2l0b3J5U2V0LCAkcmVxdWVzdCwgJHBvb2wsICR0aGlzLT5pby0+aXNWZXJib3NlKCkpOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Jy4gJGVyciAuJzwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRwcmV0dHlQcm9ibGVtKTsKaWYgKCEkdGhpcy0+ZGV2TW9kZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlJ1bm5pbmcgdXBkYXRlIHdpdGggLS1uby1kZXYgZG9lcyBub3QgbWVhbiByZXF1aXJlLWRldiBpcyBpZ25vcmVkLCBpdCBqdXN0IG1lYW5zIHRoZSBwYWNrYWdlcyB3aWxsIG5vdCBiZSBpbnN0YWxsZWQuIElmIGRldiByZXF1aXJlbWVudHMgYXJlIGJsb2NraW5nIHRoZSB1cGRhdGUgeW91IGhhdmUgdG8gcmVzb2x2ZSB0aG9zZSBwcm9ibGVtcy48L3dhcm5pbmc+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKfQoKJGdoZSA9IG5ldyBHaXRodWJBY3Rpb25FcnJvcigkdGhpcy0+aW8pOwokZ2hlLT5lbWl0KCRlcnIuIlxuIi4kcHJldHR5UHJvYmxlbSk7CgpyZXR1cm4gbWF4KHNlbGY6OkVSUk9SX0dFTkVSSUNfRkFJTFVSRSwgJGUtPmdldENvZGUoKSk7Cn0KCiR0aGlzLT5pby0+d3JpdGVFcnJvcigiQW5hbHl6ZWQgIi5jb3VudCgkcG9vbCkuIiBwYWNrYWdlcyB0byByZXNvbHZlIGRlcGVuZGVuY2llcyIsIHRydWUsIElPSW50ZXJmYWNlOjpWRVJCT1NFKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCJBbmFseXplZCAiLiRydWxlU2V0U2l6ZS4iIHJ1bGVzIHRvIHJlc29sdmUgZGVwZW5kZW5jaWVzIiwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUkJPU0UpOwoKJHBvb2wgPSBudWxsOwoKaWYgKCEkbG9ja1RyYW5zYWN0aW9uLT5nZXRPcGVyYXRpb25zKCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdOb3RoaW5nIHRvIG1vZGlmeSBpbiBsb2NrIGZpbGUnKTsKCmlmICgkdGhpcy0+bWluaW1hbFVwZGF0ZSAmJiAkdGhpcy0+dXBkYXRlQWxsb3dMaXN0ID09PSBudWxsICYmICR0aGlzLT5sb2NrZXItPmlzRnJlc2goKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlRoZSAtLW1pbmltYWwtY2hhbmdlcyBvcHRpb24gc2hvdWxkIGJlIHVzZWQgd2l0aCBwYWNrYWdlIGFyZ3VtZW50cyBvciBhZnRlciBtb2RpZnlpbmcgY29tcG9zZXIuanNvbiByZXF1aXJlbWVudHMsIG90aGVyd2lzZSBpdCB3aWxsIGxpa2VseSBub3QgeWllbGQgYW55IGRlcGVuZGVuY3kgY2hhbmdlcy48L3dhcm5pbmc+Jyk7Cn0KfQoKJGV4aXRDb2RlID0gJHRoaXMtPmV4dHJhY3REZXZQYWNrYWdlcygkbG9ja1RyYW5zYWN0aW9uLCAkcGxhdGZvcm1SZXBvLCAkYWxpYXNlcywgJHBvbGljeSwgJGxvY2tlZFJlcG9zaXRvcnkpOwppZiAoJGV4aXRDb2RlICE9PSAwKSB7CnJldHVybiAkZXhpdENvZGU7Cn0KClNlbXZlclxDb21waWxpbmdNYXRjaGVyOjpjbGVhcigpOwoKCiRwbGF0Zm9ybVJlcXMgPSAkdGhpcy0+ZXh0cmFjdFBsYXRmb3JtUmVxdWlyZW1lbnRzKCR0aGlzLT5wYWNrYWdlLT5nZXRSZXF1aXJlcygpKTsKJHBsYXRmb3JtRGV2UmVxcyA9ICR0aGlzLT5leHRyYWN0UGxhdGZvcm1SZXF1aXJlbWVudHMoJHRoaXMtPnBhY2thZ2UtPmdldERldlJlcXVpcmVzKCkpOwoKJGluc3RhbGxzVXBkYXRlcyA9ICR1bmluc3RhbGxzID0gW107CmlmICgkbG9ja1RyYW5zYWN0aW9uLT5nZXRPcGVyYXRpb25zKCkpIHsKJGluc3RhbGxOYW1lcyA9ICR1cGRhdGVOYW1lcyA9ICR1bmluc3RhbGxOYW1lcyA9IFtdOwpmb3JlYWNoICgkbG9ja1RyYW5zYWN0aW9uLT5nZXRPcGVyYXRpb25zKCkgYXMgJG9wZXJhdGlvbikgewppZiAoJG9wZXJhdGlvbiBpbnN0YW5jZW9mIEluc3RhbGxPcGVyYXRpb24pIHsKJGluc3RhbGxzVXBkYXRlc1tdID0gJG9wZXJhdGlvbjsKJGluc3RhbGxOYW1lc1tdID0gJG9wZXJhdGlvbi0+Z2V0UGFja2FnZSgpLT5nZXRQcmV0dHlOYW1lKCkuJzonLiRvcGVyYXRpb24tPmdldFBhY2thZ2UoKS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKTsKfSBlbHNlaWYgKCRvcGVyYXRpb24gaW5zdGFuY2VvZiBVcGRhdGVPcGVyYXRpb24pIHsKCgppZiAoJHRoaXMtPnVwZGF0ZU1pcnJvcnMKJiYgJG9wZXJhdGlvbi0+Z2V0SW5pdGlhbFBhY2thZ2UoKS0+Z2V0TmFtZSgpID09PSAkb3BlcmF0aW9uLT5nZXRUYXJnZXRQYWNrYWdlKCktPmdldE5hbWUoKQomJiAkb3BlcmF0aW9uLT5nZXRJbml0aWFsUGFja2FnZSgpLT5nZXRWZXJzaW9uKCkgPT09ICRvcGVyYXRpb24tPmdldFRhcmdldFBhY2thZ2UoKS0+Z2V0VmVyc2lvbigpCikgewpjb250aW51ZTsKfQoKJGluc3RhbGxzVXBkYXRlc1tdID0gJG9wZXJhdGlvbjsKJHVwZGF0ZU5hbWVzW10gPSAkb3BlcmF0aW9uLT5nZXRUYXJnZXRQYWNrYWdlKCktPmdldFByZXR0eU5hbWUoKS4nOicuJG9wZXJhdGlvbi0+Z2V0VGFyZ2V0UGFja2FnZSgpLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpOwp9IGVsc2VpZiAoJG9wZXJhdGlvbiBpbnN0YW5jZW9mIFVuaW5zdGFsbE9wZXJhdGlvbikgewokdW5pbnN0YWxsc1tdID0gJG9wZXJhdGlvbjsKJHVuaW5zdGFsbE5hbWVzW10gPSAkb3BlcmF0aW9uLT5nZXRQYWNrYWdlKCktPmdldFByZXR0eU5hbWUoKTsKfQp9CgppZiAoJHRoaXMtPmNvbmZpZy0+Z2V0KCdsb2NrJykpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoCiI8aW5mbz5Mb2NrIGZpbGUgb3BlcmF0aW9uczogJWQgaW5zdGFsbCVzLCAlZCB1cGRhdGUlcywgJWQgcmVtb3ZhbCVzPC9pbmZvPiIsCmNvdW50KCRpbnN0YWxsTmFtZXMpLAoxID09PSBjb3VudCgkaW5zdGFsbE5hbWVzKSA/ICcnIDogJ3MnLApjb3VudCgkdXBkYXRlTmFtZXMpLAoxID09PSBjb3VudCgkdXBkYXRlTmFtZXMpID8gJycgOiAncycsCmNvdW50KCR1bmluc3RhbGxzKSwKMSA9PT0gY291bnQoJHVuaW5zdGFsbHMpID8gJycgOiAncycKKSk7CmlmICgkaW5zdGFsbE5hbWVzKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiSW5zdGFsbHM6ICIuaW1wbG9kZSgnLCAnLCAkaW5zdGFsbE5hbWVzKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUkJPU0UpOwp9CmlmICgkdXBkYXRlTmFtZXMpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCJVcGRhdGVzOiAiLmltcGxvZGUoJywgJywgJHVwZGF0ZU5hbWVzKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUkJPU0UpOwp9CmlmICgkdW5pbnN0YWxscykgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIlJlbW92YWxzOiAiLmltcGxvZGUoJywgJywgJHVuaW5zdGFsbE5hbWVzKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUkJPU0UpOwp9Cn0KfQoKJHNvcnRCeU5hbWUgPSBzdGF0aWMgZnVuY3Rpb24gKCRhLCAkYik6IGludCB7CmlmICgkYSBpbnN0YW5jZW9mIFVwZGF0ZU9wZXJhdGlvbikgewokYSA9ICRhLT5nZXRUYXJnZXRQYWNrYWdlKCktPmdldE5hbWUoKTsKfSBlbHNlIHsKJGEgPSAkYS0+Z2V0UGFja2FnZSgpLT5nZXROYW1lKCk7Cn0KaWYgKCRiIGluc3RhbmNlb2YgVXBkYXRlT3BlcmF0aW9uKSB7CiRiID0gJGItPmdldFRhcmdldFBhY2thZ2UoKS0+Z2V0TmFtZSgpOwp9IGVsc2UgewokYiA9ICRiLT5nZXRQYWNrYWdlKCktPmdldE5hbWUoKTsKfQoKcmV0dXJuIHN0cmNtcCgkYSwgJGIpOwp9Owp1c29ydCgkdW5pbnN0YWxscywgJHNvcnRCeU5hbWUpOwp1c29ydCgkaW5zdGFsbHNVcGRhdGVzLCAkc29ydEJ5TmFtZSk7Cgpmb3JlYWNoIChhcnJheV9tZXJnZSgkdW5pbnN0YWxscywgJGluc3RhbGxzVXBkYXRlcykgYXMgJG9wZXJhdGlvbikgewoKaWYgKCRvcGVyYXRpb24gaW5zdGFuY2VvZiBJbnN0YWxsT3BlcmF0aW9uKSB7CiR0aGlzLT5zdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyLT5hZGRTdWdnZXN0aW9uc0Zyb21QYWNrYWdlKCRvcGVyYXRpb24tPmdldFBhY2thZ2UoKSk7Cn0KCgppZiAoJHRoaXMtPmNvbmZpZy0+Z2V0KCdsb2NrJykgJiYgKGZhbHNlID09PSBzdHJwb3MoJG9wZXJhdGlvbi0+Z2V0T3BlcmF0aW9uVHlwZSgpLCAnQWxpYXMnKSB8fCAkdGhpcy0+aW8tPmlzRGVidWcoKSkpIHsKJHNvdXJjZVJlcG8gPSAnJzsKaWYgKCR0aGlzLT5pby0+aXNWZXJ5VmVyYm9zZSgpICYmIGZhbHNlID09PSBzdHJwb3MoJG9wZXJhdGlvbi0+Z2V0T3BlcmF0aW9uVHlwZSgpLCAnQWxpYXMnKSkgewokb3BlcmF0aW9uUGtnID0gKCRvcGVyYXRpb24gaW5zdGFuY2VvZiBVcGRhdGVPcGVyYXRpb24gPyAkb3BlcmF0aW9uLT5nZXRUYXJnZXRQYWNrYWdlKCkgOiAkb3BlcmF0aW9uLT5nZXRQYWNrYWdlKCkpOwppZiAoJG9wZXJhdGlvblBrZy0+Z2V0UmVwb3NpdG9yeSgpICE9PSBudWxsKSB7CiRzb3VyY2VSZXBvID0gJyBmcm9tICcgLiAkb3BlcmF0aW9uUGtnLT5nZXRSZXBvc2l0b3J5KCktPmdldFJlcG9OYW1lKCk7Cn0KfQokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgLSAnIC4gJG9wZXJhdGlvbi0+c2hvdyh0cnVlKSAuICRzb3VyY2VSZXBvKTsKfQp9CgokdXBkYXRlZExvY2sgPSAkdGhpcy0+bG9ja2VyLT5zZXRMb2NrRGF0YSgKJGxvY2tUcmFuc2FjdGlvbi0+Z2V0TmV3TG9ja1BhY2thZ2VzKGZhbHNlLCAkdGhpcy0+dXBkYXRlTWlycm9ycyksCiRsb2NrVHJhbnNhY3Rpb24tPmdldE5ld0xvY2tQYWNrYWdlcyh0cnVlLCAkdGhpcy0+dXBkYXRlTWlycm9ycyksCiRwbGF0Zm9ybVJlcXMsCiRwbGF0Zm9ybURldlJlcXMsCiRsb2NrVHJhbnNhY3Rpb24tPmdldEFsaWFzZXMoJGFsaWFzZXMpLAokdGhpcy0+cGFja2FnZS0+Z2V0TWluaW11bVN0YWJpbGl0eSgpLAokdGhpcy0+cGFja2FnZS0+Z2V0U3RhYmlsaXR5RmxhZ3MoKSwKJHRoaXMtPnByZWZlclN0YWJsZSB8fCAkdGhpcy0+cGFja2FnZS0+Z2V0UHJlZmVyU3RhYmxlKCksCiR0aGlzLT5wcmVmZXJMb3dlc3QsCiR0aGlzLT5jb25maWctPmdldCgncGxhdGZvcm0nKSA/OiBbXSwKJHRoaXMtPndyaXRlTG9jayAmJiAkdGhpcy0+ZXhlY3V0ZU9wZXJhdGlvbnMKKTsKaWYgKCR1cGRhdGVkTG9jayAmJiAkdGhpcy0+d3JpdGVMb2NrICYmICR0aGlzLT5leGVjdXRlT3BlcmF0aW9ucykgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxpbmZvPldyaXRpbmcgbG9jayBmaWxlPC9pbmZvPicpOwp9CgppZiAoJGRvSW5zdGFsbCkgewoKcmV0dXJuICR0aGlzLT5kb0luc3RhbGwoJGxvY2FsUmVwbywgdHJ1ZSk7Cn0KCnJldHVybiAwOwp9CgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXh0cmFjdERldlBhY2thZ2VzKExvY2tUcmFuc2FjdGlvbiAkbG9ja1RyYW5zYWN0aW9uLCBQbGF0Zm9ybVJlcG9zaXRvcnkgJHBsYXRmb3JtUmVwbywgYXJyYXkgJGFsaWFzZXMsIFBvbGljeUludGVyZmFjZSAkcG9saWN5LCA/TG9ja0FycmF5UmVwb3NpdG9yeSAkbG9ja2VkUmVwb3NpdG9yeSA9IG51bGwpOiBpbnQKewppZiAoISR0aGlzLT5wYWNrYWdlLT5nZXREZXZSZXF1aXJlcygpKSB7CnJldHVybiAwOwp9CgokcmVzdWx0UmVwbyA9IG5ldyBBcnJheVJlcG9zaXRvcnkoW10pOwokbG9hZGVyID0gbmV3IEFycmF5TG9hZGVyKG51bGwsIHRydWUpOwokZHVtcGVyID0gbmV3IEFycmF5RHVtcGVyKCk7CmZvcmVhY2ggKCRsb2NrVHJhbnNhY3Rpb24tPmdldE5ld0xvY2tQYWNrYWdlcyhmYWxzZSkgYXMgJHBrZykgewokcmVzdWx0UmVwby0+YWRkUGFja2FnZSgkbG9hZGVyLT5sb2FkKCRkdW1wZXItPmR1bXAoJHBrZykpKTsKfQoKJHJlcG9zaXRvcnlTZXQgPSAkdGhpcy0+Y3JlYXRlUmVwb3NpdG9yeVNldCh0cnVlLCAkcGxhdGZvcm1SZXBvLCAkYWxpYXNlcyk7CiRyZXBvc2l0b3J5U2V0LT5hZGRSZXBvc2l0b3J5KCRyZXN1bHRSZXBvKTsKCiRyZXF1ZXN0ID0gJHRoaXMtPmNyZWF0ZVJlcXVlc3QoJHRoaXMtPmZpeGVkUm9vdFBhY2thZ2UsICRwbGF0Zm9ybVJlcG8pOwokdGhpcy0+cmVxdWlyZVBhY2thZ2VzRm9yVXBkYXRlKCRyZXF1ZXN0LCAkbG9ja2VkUmVwb3NpdG9yeSwgZmFsc2UpOwoKJHBvb2wgPSAkcmVwb3NpdG9yeVNldC0+Y3JlYXRlUG9vbFdpdGhBbGxQYWNrYWdlcygpOwoKJHNvbHZlciA9IG5ldyBTb2x2ZXIoJHBvbGljeSwgJHBvb2wsICR0aGlzLT5pbyk7CnRyeSB7CiRub25EZXZMb2NrVHJhbnNhY3Rpb24gPSAkc29sdmVyLT5zb2x2ZSgkcmVxdWVzdCwgJHRoaXMtPnBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpOwokc29sdmVyID0gbnVsbDsKfSBjYXRjaCAoU29sdmVyUHJvYmxlbXNFeGNlcHRpb24gJGUpIHsKJGVyciA9ICdVbmFibGUgdG8gZmluZCBhIGNvbXBhdGlibGUgc2V0IG9mIHBhY2thZ2VzIGJhc2VkIG9uIHlvdXIgbm9uLWRldiByZXF1aXJlbWVudHMgYWxvbmUuJzsKJHByZXR0eVByb2JsZW0gPSAkZS0+Z2V0UHJldHR5U3RyaW5nKCRyZXBvc2l0b3J5U2V0LCAkcmVxdWVzdCwgJHBvb2wsICR0aGlzLT5pby0+aXNWZXJib3NlKCksIHRydWUpOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Jy4gJGVyciAuJzwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdZb3VyIHJlcXVpcmVtZW50cyBjYW4gYmUgcmVzb2x2ZWQgc3VjY2Vzc2Z1bGx5IHdoZW4gcmVxdWlyZS1kZXYgcGFja2FnZXMgYXJlIHByZXNlbnQuJyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignWW91IG1heSBuZWVkIHRvIG1vdmUgcGFja2FnZXMgZnJvbSByZXF1aXJlLWRldiBvciBzb21lIG9mIHRoZWlyIGRlcGVuZGVuY2llcyB0byByZXF1aXJlLicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJHByZXR0eVByb2JsZW0pOwoKJGdoZSA9IG5ldyBHaXRodWJBY3Rpb25FcnJvcigkdGhpcy0+aW8pOwokZ2hlLT5lbWl0KCRlcnIuIlxuIi4kcHJldHR5UHJvYmxlbSk7CgpyZXR1cm4gJGUtPmdldENvZGUoKTsKfQoKJGxvY2tUcmFuc2FjdGlvbi0+c2V0Tm9uRGV2UGFja2FnZXMoJG5vbkRldkxvY2tUcmFuc2FjdGlvbik7CgpyZXR1cm4gMDsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9JbnN0YWxsKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJGxvY2FsUmVwbywgYm9vbCAkYWxyZWFkeVNvbHZlZCA9IGZhbHNlKTogaW50CnsKaWYgKCR0aGlzLT5jb25maWctPmdldCgnbG9jaycpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGluZm8+SW5zdGFsbGluZyBkZXBlbmRlbmNpZXMgZnJvbSBsb2NrIGZpbGUnLigkdGhpcy0+ZGV2TW9kZSA/ICcgKGluY2x1ZGluZyByZXF1aXJlLWRldiknIDogJycpLic8L2luZm8+Jyk7Cn0KCiRsb2NrZWRSZXBvc2l0b3J5ID0gJHRoaXMtPmxvY2tlci0+Z2V0TG9ja2VkUmVwb3NpdG9yeSgkdGhpcy0+ZGV2TW9kZSk7CgoKCmlmICghJGFscmVhZHlTb2x2ZWQpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8aW5mbz5WZXJpZnlpbmcgbG9jayBmaWxlIGNvbnRlbnRzIGNhbiBiZSBpbnN0YWxsZWQgb24gY3VycmVudCBwbGF0Zm9ybS48L2luZm8+Jyk7CgokcGxhdGZvcm1SZXBvID0gJHRoaXMtPmNyZWF0ZVBsYXRmb3JtUmVwbyhmYWxzZSk7CgokcG9saWN5ID0gJHRoaXMtPmNyZWF0ZVBvbGljeShmYWxzZSk7CgokcmVwb3NpdG9yeVNldCA9ICR0aGlzLT5jcmVhdGVSZXBvc2l0b3J5U2V0KGZhbHNlLCAkcGxhdGZvcm1SZXBvLCBbXSwgJGxvY2tlZFJlcG9zaXRvcnkpOwokcmVwb3NpdG9yeVNldC0+YWRkUmVwb3NpdG9yeSgkbG9ja2VkUmVwb3NpdG9yeSk7CgoKJHJlcXVlc3QgPSAkdGhpcy0+Y3JlYXRlUmVxdWVzdCgkdGhpcy0+Zml4ZWRSb290UGFja2FnZSwgJHBsYXRmb3JtUmVwbywgJGxvY2tlZFJlcG9zaXRvcnkpOwoKaWYgKCEkdGhpcy0+bG9ja2VyLT5pc0ZyZXNoKCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5XYXJuaW5nOiBUaGUgbG9jayBmaWxlIGlzIG5vdCB1cCB0byBkYXRlIHdpdGggdGhlIGxhdGVzdCBjaGFuZ2VzIGluIGNvbXBvc2VyLmpzb24uIFlvdSBtYXkgYmUgZ2V0dGluZyBvdXRkYXRlZCBkZXBlbmRlbmNpZXMuIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IHJ1biBgY29tcG9zZXIgdXBkYXRlYCBvciBgY29tcG9zZXIgdXBkYXRlIDxwYWNrYWdlIG5hbWU+YC48L3dhcm5pbmc+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKfQoKJG1pc3NpbmdSZXF1aXJlbWVudEluZm8gPSAkdGhpcy0+bG9ja2VyLT5nZXRNaXNzaW5nUmVxdWlyZW1lbnRJbmZvKCR0aGlzLT5wYWNrYWdlLCAkdGhpcy0+ZGV2TW9kZSk7CmlmICgkbWlzc2luZ1JlcXVpcmVtZW50SW5mbyAhPT0gW10pIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRtaXNzaW5nUmVxdWlyZW1lbnRJbmZvKTsKCmlmICghJHRoaXMtPmNvbmZpZy0+Z2V0KCdhbGxvdy1taXNzaW5nLXJlcXVpcmVtZW50cycpKSB7CnJldHVybiBzZWxmOjpFUlJPUl9MT0NLX0ZJTEVfSU5WQUxJRDsKfQp9Cgpmb3JlYWNoICgkbG9ja2VkUmVwb3NpdG9yeS0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewokcmVxdWVzdC0+Zml4TG9ja2VkUGFja2FnZSgkcGFja2FnZSk7Cn0KCiRyb290UmVxdWlyZXMgPSAkdGhpcy0+cGFja2FnZS0+Z2V0UmVxdWlyZXMoKTsKaWYgKCR0aGlzLT5kZXZNb2RlKSB7CiRyb290UmVxdWlyZXMgPSBhcnJheV9tZXJnZSgkcm9vdFJlcXVpcmVzLCAkdGhpcy0+cGFja2FnZS0+Z2V0RGV2UmVxdWlyZXMoKSk7Cn0KZm9yZWFjaCAoJHJvb3RSZXF1aXJlcyBhcyAkbGluaykgewppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkbGluay0+Z2V0VGFyZ2V0KCkpKSB7CiRyZXF1ZXN0LT5yZXF1aXJlTmFtZSgkbGluay0+Z2V0VGFyZ2V0KCksICRsaW5rLT5nZXRDb25zdHJhaW50KCkpOwp9Cn0KCmZvcmVhY2ggKCR0aGlzLT5sb2NrZXItPmdldFBsYXRmb3JtUmVxdWlyZW1lbnRzKCR0aGlzLT5kZXZNb2RlKSBhcyAkbGluaykgewppZiAoIWlzc2V0KCRyb290UmVxdWlyZXNbJGxpbmstPmdldFRhcmdldCgpXSkpIHsKJHJlcXVlc3QtPnJlcXVpcmVOYW1lKCRsaW5rLT5nZXRUYXJnZXQoKSwgJGxpbmstPmdldENvbnN0cmFpbnQoKSk7Cn0KfQp1bnNldCgkcm9vdFJlcXVpcmVzLCAkbGluayk7CgokcG9vbCA9ICRyZXBvc2l0b3J5U2V0LT5jcmVhdGVQb29sKCRyZXF1ZXN0LCAkdGhpcy0+aW8sICR0aGlzLT5ldmVudERpc3BhdGNoZXIsIG51bGwsICR0aGlzLT5pZ25vcmVkVHlwZXMsICR0aGlzLT5hbGxvd2VkVHlwZXMsIG51bGwpOwoKCiRzb2x2ZXIgPSBuZXcgU29sdmVyKCRwb2xpY3ksICRwb29sLCAkdGhpcy0+aW8pOwp0cnkgewokbG9ja1RyYW5zYWN0aW9uID0gJHNvbHZlci0+c29sdmUoJHJlcXVlc3QsICR0aGlzLT5wbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKTsKJHNvbHZlciA9IG51bGw7CgoKaWYgKDAgIT09IGNvdW50KCRsb2NrVHJhbnNhY3Rpb24tPmdldE9wZXJhdGlvbnMoKSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+WW91ciBsb2NrIGZpbGUgY2Fubm90IGJlIGluc3RhbGxlZCBvbiB0aGlzIHN5c3RlbSB3aXRob3V0IGNoYW5nZXMuIFBsZWFzZSBydW4gY29tcG9zZXIgdXBkYXRlLjwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKCnJldHVybiBzZWxmOjpFUlJPUl9MT0NLX0ZJTEVfSU5WQUxJRDsKfQp9IGNhdGNoIChTb2x2ZXJQcm9ibGVtc0V4Y2VwdGlvbiAkZSkgewokZXJyID0gJ1lvdXIgbG9jayBmaWxlIGRvZXMgbm90IGNvbnRhaW4gYSBjb21wYXRpYmxlIHNldCBvZiBwYWNrYWdlcy4gUGxlYXNlIHJ1biBjb21wb3NlciB1cGRhdGUuJzsKJHByZXR0eVByb2JsZW0gPSAkZS0+Z2V0UHJldHR5U3RyaW5nKCRyZXBvc2l0b3J5U2V0LCAkcmVxdWVzdCwgJHBvb2wsICR0aGlzLT5pby0+aXNWZXJib3NlKCkpOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Jy4gJGVyciAuJzwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRwcmV0dHlQcm9ibGVtKTsKCiRnaGUgPSBuZXcgR2l0aHViQWN0aW9uRXJyb3IoJHRoaXMtPmlvKTsKJGdoZS0+ZW1pdCgkZXJyLiJcbiIuJHByZXR0eVByb2JsZW0pOwoKcmV0dXJuIG1heChzZWxmOjpFUlJPUl9HRU5FUklDX0ZBSUxVUkUsICRlLT5nZXRDb2RlKCkpOwp9Cn0KCgokbG9jYWxSZXBvVHJhbnNhY3Rpb24gPSBuZXcgTG9jYWxSZXBvVHJhbnNhY3Rpb24oJGxvY2tlZFJlcG9zaXRvcnksICRsb2NhbFJlcG8pOwokdGhpcy0+ZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaEluc3RhbGxlckV2ZW50KEluc3RhbGxlckV2ZW50czo6UFJFX09QRVJBVElPTlNfRVhFQywgJHRoaXMtPmRldk1vZGUsICR0aGlzLT5leGVjdXRlT3BlcmF0aW9ucywgJGxvY2FsUmVwb1RyYW5zYWN0aW9uKTsKCiRpbnN0YWxscyA9ICR1cGRhdGVzID0gJHVuaW5zdGFsbHMgPSBbXTsKZm9yZWFjaCAoJGxvY2FsUmVwb1RyYW5zYWN0aW9uLT5nZXRPcGVyYXRpb25zKCkgYXMgJG9wZXJhdGlvbikgewppZiAoJG9wZXJhdGlvbiBpbnN0YW5jZW9mIEluc3RhbGxPcGVyYXRpb24pIHsKJGluc3RhbGxzW10gPSAkb3BlcmF0aW9uLT5nZXRQYWNrYWdlKCktPmdldFByZXR0eU5hbWUoKS4nOicuJG9wZXJhdGlvbi0+Z2V0UGFja2FnZSgpLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpOwp9IGVsc2VpZiAoJG9wZXJhdGlvbiBpbnN0YW5jZW9mIFVwZGF0ZU9wZXJhdGlvbikgewokdXBkYXRlc1tdID0gJG9wZXJhdGlvbi0+Z2V0VGFyZ2V0UGFja2FnZSgpLT5nZXRQcmV0dHlOYW1lKCkuJzonLiRvcGVyYXRpb24tPmdldFRhcmdldFBhY2thZ2UoKS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKTsKfSBlbHNlaWYgKCRvcGVyYXRpb24gaW5zdGFuY2VvZiBVbmluc3RhbGxPcGVyYXRpb24pIHsKJHVuaW5zdGFsbHNbXSA9ICRvcGVyYXRpb24tPmdldFBhY2thZ2UoKS0+Z2V0UHJldHR5TmFtZSgpOwp9Cn0KCmlmICgkaW5zdGFsbHMgPT09IFtdICYmICR1cGRhdGVzID09PSBbXSAmJiAkdW5pbnN0YWxscyA9PT0gW10pIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdOb3RoaW5nIHRvIGluc3RhbGwsIHVwZGF0ZSBvciByZW1vdmUnKTsKfSBlbHNlIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoCiI8aW5mbz5QYWNrYWdlIG9wZXJhdGlvbnM6ICVkIGluc3RhbGwlcywgJWQgdXBkYXRlJXMsICVkIHJlbW92YWwlczwvaW5mbz4iLApjb3VudCgkaW5zdGFsbHMpLAoxID09PSBjb3VudCgkaW5zdGFsbHMpID8gJycgOiAncycsCmNvdW50KCR1cGRhdGVzKSwKMSA9PT0gY291bnQoJHVwZGF0ZXMpID8gJycgOiAncycsCmNvdW50KCR1bmluc3RhbGxzKSwKMSA9PT0gY291bnQoJHVuaW5zdGFsbHMpID8gJycgOiAncycKKSk7CmlmICgkaW5zdGFsbHMpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCJJbnN0YWxsczogIi5pbXBsb2RlKCcsICcsICRpbnN0YWxscyksIHRydWUsIElPSW50ZXJmYWNlOjpWRVJCT1NFKTsKfQppZiAoJHVwZGF0ZXMpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCJVcGRhdGVzOiAiLmltcGxvZGUoJywgJywgJHVwZGF0ZXMpLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7Cn0KaWYgKCR1bmluc3RhbGxzKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiUmVtb3ZhbHM6ICIuaW1wbG9kZSgnLCAnLCAkdW5pbnN0YWxscyksIHRydWUsIElPSW50ZXJmYWNlOjpWRVJCT1NFKTsKfQp9CgppZiAoJHRoaXMtPmV4ZWN1dGVPcGVyYXRpb25zKSB7CiRsb2NhbFJlcG8tPnNldERldlBhY2thZ2VOYW1lcygkdGhpcy0+bG9ja2VyLT5nZXREZXZQYWNrYWdlTmFtZXMoKSk7CiR0aGlzLT5pbnN0YWxsYXRpb25NYW5hZ2VyLT5leGVjdXRlKCRsb2NhbFJlcG8sICRsb2NhbFJlcG9UcmFuc2FjdGlvbi0+Z2V0T3BlcmF0aW9ucygpLCAkdGhpcy0+ZGV2TW9kZSwgJHRoaXMtPnJ1blNjcmlwdHMsICR0aGlzLT5kb3dubG9hZE9ubHkpOwoKCmlmIChjb3VudCgkbG9jYWxSZXBvVHJhbnNhY3Rpb24tPmdldE9wZXJhdGlvbnMoKSkgPiAwKSB7CiR2ZW5kb3JEaXIgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ3ZlbmRvci1kaXInKTsKaWYgKGlzX2RpcigkdmVuZG9yRGlyKSkgewoKCkB0b3VjaCgkdmVuZG9yRGlyKTsKfQp9Cn0gZWxzZSB7CmZvcmVhY2ggKCRsb2NhbFJlcG9UcmFuc2FjdGlvbi0+Z2V0T3BlcmF0aW9ucygpIGFzICRvcGVyYXRpb24pIHsKCmlmIChmYWxzZSA9PT0gc3RycG9zKCRvcGVyYXRpb24tPmdldE9wZXJhdGlvblR5cGUoKSwgJ0FsaWFzJykgfHwgJHRoaXMtPmlvLT5pc0RlYnVnKCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgIC0gJyAuICRvcGVyYXRpb24tPnNob3coZmFsc2UpKTsKfQp9Cn0KCnJldHVybiAwOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY3JlYXRlUGxhdGZvcm1SZXBvKGJvb2wgJGZvclVwZGF0ZSk6IFBsYXRmb3JtUmVwb3NpdG9yeQp7CmlmICgkZm9yVXBkYXRlKSB7CiRwbGF0Zm9ybU92ZXJyaWRlcyA9ICR0aGlzLT5jb25maWctPmdldCgncGxhdGZvcm0nKSA/OiBbXTsKfSBlbHNlIHsKJHBsYXRmb3JtT3ZlcnJpZGVzID0gJHRoaXMtPmxvY2tlci0+Z2V0UGxhdGZvcm1PdmVycmlkZXMoKTsKfQoKcmV0dXJuIG5ldyBQbGF0Zm9ybVJlcG9zaXRvcnkoW10sICRwbGF0Zm9ybU92ZXJyaWRlcyk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVSZXBvc2l0b3J5U2V0KGJvb2wgJGZvclVwZGF0ZSwgUGxhdGZvcm1SZXBvc2l0b3J5ICRwbGF0Zm9ybVJlcG8sIGFycmF5ICRyb290QWxpYXNlcyA9IFtdLCA/UmVwb3NpdG9yeUludGVyZmFjZSAkbG9ja2VkUmVwb3NpdG9yeSA9IG51bGwpOiBSZXBvc2l0b3J5U2V0CnsKaWYgKCRmb3JVcGRhdGUpIHsKJG1pbmltdW1TdGFiaWxpdHkgPSAkdGhpcy0+cGFja2FnZS0+Z2V0TWluaW11bVN0YWJpbGl0eSgpOwokc3RhYmlsaXR5RmxhZ3MgPSAkdGhpcy0+cGFja2FnZS0+Z2V0U3RhYmlsaXR5RmxhZ3MoKTsKCiRyZXF1aXJlcyA9IGFycmF5X21lcmdlKCR0aGlzLT5wYWNrYWdlLT5nZXRSZXF1aXJlcygpLCAkdGhpcy0+cGFja2FnZS0+Z2V0RGV2UmVxdWlyZXMoKSk7Cn0gZWxzZSB7CiRtaW5pbXVtU3RhYmlsaXR5ID0gJHRoaXMtPmxvY2tlci0+Z2V0TWluaW11bVN0YWJpbGl0eSgpOwokc3RhYmlsaXR5RmxhZ3MgPSAkdGhpcy0+bG9ja2VyLT5nZXRTdGFiaWxpdHlGbGFncygpOwoKJHJlcXVpcmVzID0gW107CmZvcmVhY2ggKCRsb2NrZWRSZXBvc2l0b3J5LT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiRjb25zdHJhaW50ID0gbmV3IENvbnN0cmFpbnQoJz0nLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKTsKJGNvbnN0cmFpbnQtPnNldFByZXR0eVN0cmluZygkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpKTsKJHJlcXVpcmVzWyRwYWNrYWdlLT5nZXROYW1lKCldID0gJGNvbnN0cmFpbnQ7Cn0KfQoKJHJvb3RSZXF1aXJlcyA9IFtdOwpmb3JlYWNoICgkcmVxdWlyZXMgYXMgJHJlcSA9PiAkY29uc3RyYWludCkgewppZiAoJGNvbnN0cmFpbnQgaW5zdGFuY2VvZiBMaW5rKSB7CiRjb25zdHJhaW50ID0gJGNvbnN0cmFpbnQtPmdldENvbnN0cmFpbnQoKTsKfQoKaWYgKCR0aGlzLT5wbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLT5pc0lnbm9yZWQoJHJlcSkpIHsKY29udGludWU7Cn0gZWxzZWlmICgkdGhpcy0+cGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciBpbnN0YW5jZW9mIElnbm9yZUxpc3RQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKSB7CiRjb25zdHJhaW50ID0gJHRoaXMtPnBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXItPmZpbHRlckNvbnN0cmFpbnQoJHJlcSwgJGNvbnN0cmFpbnQpOwp9CiRyb290UmVxdWlyZXNbJHJlcV0gPSAkY29uc3RyYWludDsKfQoKJHRoaXMtPmZpeGVkUm9vdFBhY2thZ2UgPSBjbG9uZSAkdGhpcy0+cGFja2FnZTsKJHRoaXMtPmZpeGVkUm9vdFBhY2thZ2UtPnNldFJlcXVpcmVzKFtdKTsKJHRoaXMtPmZpeGVkUm9vdFBhY2thZ2UtPnNldERldlJlcXVpcmVzKFtdKTsKCiRzdGFiaWxpdHlGbGFnc1skdGhpcy0+cGFja2FnZS0+Z2V0TmFtZSgpXSA9IEJhc2VQYWNrYWdlOjpTVEFCSUxJVElFU1tWZXJzaW9uUGFyc2VyOjpwYXJzZVN0YWJpbGl0eSgkdGhpcy0+cGFja2FnZS0+Z2V0VmVyc2lvbigpKV07CgokcmVwb3NpdG9yeVNldCA9IG5ldyBSZXBvc2l0b3J5U2V0KCRtaW5pbXVtU3RhYmlsaXR5LCAkc3RhYmlsaXR5RmxhZ3MsICRyb290QWxpYXNlcywgJHRoaXMtPnBhY2thZ2UtPmdldFJlZmVyZW5jZXMoKSwgJHJvb3RSZXF1aXJlcywgJHRoaXMtPnRlbXBvcmFyeUNvbnN0cmFpbnRzKTsKJHJlcG9zaXRvcnlTZXQtPmFkZFJlcG9zaXRvcnkobmV3IFJvb3RQYWNrYWdlUmVwb3NpdG9yeSgkdGhpcy0+Zml4ZWRSb290UGFja2FnZSkpOwokcmVwb3NpdG9yeVNldC0+YWRkUmVwb3NpdG9yeSgkcGxhdGZvcm1SZXBvKTsKaWYgKCR0aGlzLT5hZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3J5KSB7CgoKJGFkZGl0aW9uYWxGaXhlZFJlcG9zaXRvcmllcyA9ICR0aGlzLT5hZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3J5OwppZiAoJGFkZGl0aW9uYWxGaXhlZFJlcG9zaXRvcmllcyBpbnN0YW5jZW9mIENvbXBvc2l0ZVJlcG9zaXRvcnkpIHsKJGFkZGl0aW9uYWxGaXhlZFJlcG9zaXRvcmllcyA9ICRhZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3JpZXMtPmdldFJlcG9zaXRvcmllcygpOwp9IGVsc2UgewokYWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yaWVzID0gWyRhZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3JpZXNdOwp9CmZvcmVhY2ggKCRhZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3JpZXMgYXMgJGFkZGl0aW9uYWxGaXhlZFJlcG9zaXRvcnkpIHsKaWYgKCRhZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3J5IGluc3RhbmNlb2YgSW5zdGFsbGVkUmVwb3NpdG9yeSB8fCAkYWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yeSBpbnN0YW5jZW9mIEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UpIHsKJHJlcG9zaXRvcnlTZXQtPmFsbG93SW5zdGFsbGVkUmVwb3NpdG9yaWVzKCk7CmJyZWFrOwp9Cn0KCiRyZXBvc2l0b3J5U2V0LT5hZGRSZXBvc2l0b3J5KCR0aGlzLT5hZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3J5KTsKfQoKcmV0dXJuICRyZXBvc2l0b3J5U2V0Owp9Cgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZVBvbGljeShib29sICRmb3JVcGRhdGUsID9Mb2NrQXJyYXlSZXBvc2l0b3J5ICRsb2NrZWRSZXBvID0gbnVsbCk6IERlZmF1bHRQb2xpY3kKewokcHJlZmVyU3RhYmxlID0gbnVsbDsKJHByZWZlckxvd2VzdCA9IG51bGw7CmlmICghJGZvclVwZGF0ZSkgewokcHJlZmVyU3RhYmxlID0gJHRoaXMtPmxvY2tlci0+Z2V0UHJlZmVyU3RhYmxlKCk7CiRwcmVmZXJMb3dlc3QgPSAkdGhpcy0+bG9ja2VyLT5nZXRQcmVmZXJMb3dlc3QoKTsKfQoKCmlmIChudWxsID09PSAkcHJlZmVyU3RhYmxlKSB7CiRwcmVmZXJTdGFibGUgPSAkdGhpcy0+cHJlZmVyU3RhYmxlIHx8ICR0aGlzLT5wYWNrYWdlLT5nZXRQcmVmZXJTdGFibGUoKTsKfQppZiAobnVsbCA9PT0gJHByZWZlckxvd2VzdCkgewokcHJlZmVyTG93ZXN0ID0gJHRoaXMtPnByZWZlckxvd2VzdDsKfQoKJHByZWZlcnJlZFZlcnNpb25zID0gbnVsbDsKaWYgKCRmb3JVcGRhdGUgJiYgJHRoaXMtPm1pbmltYWxVcGRhdGUgJiYgJGxvY2tlZFJlcG8gIT09IG51bGwpIHsKJHByZWZlcnJlZFZlcnNpb25zID0gW107CmZvcmVhY2ggKCRsb2NrZWRSZXBvLT5nZXRQYWNrYWdlcygpIGFzICRwa2cpIHsKaWYgKCRwa2cgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UgfHwgKCR0aGlzLT51cGRhdGVBbGxvd0xpc3QgIT09IG51bGwgJiYgaW5fYXJyYXkoJHBrZy0+Z2V0TmFtZSgpLCAkdGhpcy0+dXBkYXRlQWxsb3dMaXN0LCB0cnVlKSkpIHsKY29udGludWU7Cn0KJHByZWZlcnJlZFZlcnNpb25zWyRwa2ctPmdldE5hbWUoKV0gPSAkcGtnLT5nZXRWZXJzaW9uKCk7Cn0KfQoKcmV0dXJuIG5ldyBEZWZhdWx0UG9saWN5KCRwcmVmZXJTdGFibGUsICRwcmVmZXJMb3dlc3QsICRwcmVmZXJyZWRWZXJzaW9ucyk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY3JlYXRlUmVxdWVzdChSb290UGFja2FnZUludGVyZmFjZSAkcm9vdFBhY2thZ2UsIFBsYXRmb3JtUmVwb3NpdG9yeSAkcGxhdGZvcm1SZXBvLCA/TG9ja0FycmF5UmVwb3NpdG9yeSAkbG9ja2VkUmVwb3NpdG9yeSA9IG51bGwpOiBSZXF1ZXN0CnsKJHJlcXVlc3QgPSBuZXcgUmVxdWVzdCgkbG9ja2VkUmVwb3NpdG9yeSk7CgokcmVxdWVzdC0+Zml4UGFja2FnZSgkcm9vdFBhY2thZ2UpOwppZiAoJHJvb3RQYWNrYWdlIGluc3RhbmNlb2YgUm9vdEFsaWFzUGFja2FnZSkgewokcmVxdWVzdC0+Zml4UGFja2FnZSgkcm9vdFBhY2thZ2UtPmdldEFsaWFzT2YoKSk7Cn0KCiRmaXhlZFBhY2thZ2VzID0gJHBsYXRmb3JtUmVwby0+Z2V0UGFja2FnZXMoKTsKaWYgKCR0aGlzLT5hZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3J5KSB7CiRmaXhlZFBhY2thZ2VzID0gYXJyYXlfbWVyZ2UoJGZpeGVkUGFja2FnZXMsICR0aGlzLT5hZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3J5LT5nZXRQYWNrYWdlcygpKTsKfQoKCgoKJHByb3ZpZGVkID0gJHJvb3RQYWNrYWdlLT5nZXRQcm92aWRlcygpOwpmb3JlYWNoICgkZml4ZWRQYWNrYWdlcyBhcyAkcGFja2FnZSkgewoKaWYgKCRwYWNrYWdlLT5nZXRSZXBvc2l0b3J5KCkgIT09ICRwbGF0Zm9ybVJlcG8KfHwgIWlzc2V0KCRwcm92aWRlZFskcGFja2FnZS0+Z2V0TmFtZSgpXSkKfHwgISRwcm92aWRlZFskcGFja2FnZS0+Z2V0TmFtZSgpXS0+Z2V0Q29uc3RyYWludCgpLT5tYXRjaGVzKG5ldyBDb25zdHJhaW50KCc9JywgJHBhY2thZ2UtPmdldFZlcnNpb24oKSkpCikgewokcmVxdWVzdC0+Zml4UGFja2FnZSgkcGFja2FnZSk7Cn0KfQoKcmV0dXJuICRyZXF1ZXN0Owp9Cgpwcml2YXRlIGZ1bmN0aW9uIHJlcXVpcmVQYWNrYWdlc0ZvclVwZGF0ZShSZXF1ZXN0ICRyZXF1ZXN0LCA/TG9ja0FycmF5UmVwb3NpdG9yeSAkbG9ja2VkUmVwb3NpdG9yeSA9IG51bGwsIGJvb2wgJGluY2x1ZGVEZXZSZXF1aXJlcyA9IHRydWUpOiB2b2lkCnsKCmlmICgkdGhpcy0+dXBkYXRlTWlycm9ycykgewokZXhjbHVkZWRQYWNrYWdlcyA9IFtdOwppZiAoISRpbmNsdWRlRGV2UmVxdWlyZXMpIHsKJGV4Y2x1ZGVkUGFja2FnZXMgPSBhcnJheV9mbGlwKCR0aGlzLT5sb2NrZXItPmdldERldlBhY2thZ2VOYW1lcygpKTsKfQoKZm9yZWFjaCAoJGxvY2tlZFJlcG9zaXRvcnktPmdldFBhY2thZ2VzKCkgYXMgJGxvY2tlZFBhY2thZ2UpIHsKCgppZiAoISRsb2NrZWRQYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICYmICFpc3NldCgkZXhjbHVkZWRQYWNrYWdlc1skbG9ja2VkUGFja2FnZS0+Z2V0TmFtZSgpXSkpIHsKJHJlcXVlc3QtPnJlcXVpcmVOYW1lKCRsb2NrZWRQYWNrYWdlLT5nZXROYW1lKCksIG5ldyBDb25zdHJhaW50KCc9PScsICRsb2NrZWRQYWNrYWdlLT5nZXRWZXJzaW9uKCkpKTsKfQp9Cn0gZWxzZSB7CiRsaW5rcyA9ICR0aGlzLT5wYWNrYWdlLT5nZXRSZXF1aXJlcygpOwppZiAoJGluY2x1ZGVEZXZSZXF1aXJlcykgewokbGlua3MgPSBhcnJheV9tZXJnZSgkbGlua3MsICR0aGlzLT5wYWNrYWdlLT5nZXREZXZSZXF1aXJlcygpKTsKfQpmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspIHsKJHJlcXVlc3QtPnJlcXVpcmVOYW1lKCRsaW5rLT5nZXRUYXJnZXQoKSwgJGxpbmstPmdldENvbnN0cmFpbnQoKSk7Cn0KfQp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0Um9vdEFsaWFzZXMoYm9vbCAkZm9yVXBkYXRlKTogYXJyYXkKewppZiAoJGZvclVwZGF0ZSkgewokYWxpYXNlcyA9ICR0aGlzLT5wYWNrYWdlLT5nZXRBbGlhc2VzKCk7Cn0gZWxzZSB7CiRhbGlhc2VzID0gJHRoaXMtPmxvY2tlci0+Z2V0QWxpYXNlcygpOwp9CgpyZXR1cm4gJGFsaWFzZXM7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBleHRyYWN0UGxhdGZvcm1SZXF1aXJlbWVudHMoYXJyYXkgJGxpbmtzKTogYXJyYXkKewokcGxhdGZvcm1SZXFzID0gW107CmZvcmVhY2ggKCRsaW5rcyBhcyAkbGluaykgewppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkbGluay0+Z2V0VGFyZ2V0KCkpKSB7CiRwbGF0Zm9ybVJlcXNbJGxpbmstPmdldFRhcmdldCgpXSA9ICRsaW5rLT5nZXRQcmV0dHlDb25zdHJhaW50KCk7Cn0KfQoKcmV0dXJuICRwbGF0Zm9ybVJlcXM7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBtb2NrTG9jYWxSZXBvc2l0b3JpZXMoUmVwb3NpdG9yeU1hbmFnZXIgJHJtKTogdm9pZAp7CiRwYWNrYWdlcyA9IFtdOwpmb3JlYWNoICgkcm0tPmdldExvY2FsUmVwb3NpdG9yeSgpLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiRwYWNrYWdlc1soc3RyaW5nKSAkcGFja2FnZV0gPSBjbG9uZSAkcGFja2FnZTsKfQpmb3JlYWNoICgkcGFja2FnZXMgYXMgJGtleSA9PiAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJGFsaWFzID0gKHN0cmluZykgJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKJGNsYXNzTmFtZSA9IGdldF9jbGFzcygkcGFja2FnZSk7CiRwYWNrYWdlc1ska2V5XSA9IG5ldyAkY2xhc3NOYW1lKCRwYWNrYWdlc1skYWxpYXNdLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpLCAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpKTsKfQp9CiRybS0+c2V0TG9jYWxSZXBvc2l0b3J5KApuZXcgSW5zdGFsbGVkQXJyYXlSZXBvc2l0b3J5KCRwYWNrYWdlcykKKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVQb29sT3B0aW1pemVyKFBvbGljeUludGVyZmFjZSAkcG9saWN5KTogP1Bvb2xPcHRpbWl6ZXIKewoKCgppZiAoJzAnID09PSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9QT09MX09QVElNSVpFUicpKSB7CiR0aGlzLT5pby0+d3JpdGUoJ1Bvb2wgT3B0aW1pemVyIHdhcyBkaXNhYmxlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLicsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CgpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuIG5ldyBQb29sT3B0aW1pemVyKCRwb2xpY3kpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldEF1ZGl0Q29uZmlnKCk6IEF1ZGl0Q29uZmlnCnsKaWYgKG51bGwgPT09ICR0aGlzLT5hdWRpdENvbmZpZykgewokdGhpcy0+YXVkaXRDb25maWcgPSBBdWRpdENvbmZpZzo6ZnJvbUNvbmZpZygkdGhpcy0+Y29uZmlnLCAkdGhpcy0+YXVkaXQsICR0aGlzLT5hdWRpdEZvcm1hdCk7Cn0KCnJldHVybiAkdGhpcy0+YXVkaXRDb25maWc7Cn0KCnByaXZhdGUgZnVuY3Rpb24gY3JlYXRlU2VjdXJpdHlBdWRpdFBvb2xGaWx0ZXIoKTogP1NlY3VyaXR5QWR2aXNvcnlQb29sRmlsdGVyCnsKJGF1ZGl0Q29uZmlnID0gJHRoaXMtPmdldEF1ZGl0Q29uZmlnKCk7CgppZiAoJGF1ZGl0Q29uZmlnLT5ibG9ja0luc2VjdXJlICYmICEkdGhpcy0+dXBkYXRlTWlycm9ycykgewpyZXR1cm4gbmV3IFNlY3VyaXR5QWR2aXNvcnlQb29sRmlsdGVyKG5ldyBBdWRpdG9yKCksICRhdWRpdENvbmZpZyk7Cn0KCnJldHVybiBudWxsOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZShJT0ludGVyZmFjZSAkaW8sIENvbXBvc2VyICRjb21wb3Nlcik6IHNlbGYKewpyZXR1cm4gbmV3IHN0YXRpYygKJGlvLAokY29tcG9zZXItPmdldENvbmZpZygpLAokY29tcG9zZXItPmdldFBhY2thZ2UoKSwKJGNvbXBvc2VyLT5nZXREb3dubG9hZE1hbmFnZXIoKSwKJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLAokY29tcG9zZXItPmdldExvY2tlcigpLAokY29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKSwKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKSwKJGNvbXBvc2VyLT5nZXRBdXRvbG9hZEdlbmVyYXRvcigpCik7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRJZ25vcmVkVHlwZXMoYXJyYXkgJHR5cGVzKTogc2VsZgp7CiR0aGlzLT5pZ25vcmVkVHlwZXMgPSAkdHlwZXM7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBbGxvd2VkVHlwZXMoP2FycmF5ICR0eXBlcyk6IHNlbGYKewokdGhpcy0+YWxsb3dlZFR5cGVzID0gJHR5cGVzOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yeShSZXBvc2l0b3J5SW50ZXJmYWNlICRhZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3J5KTogc2VsZgp7CiR0aGlzLT5hZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3J5ID0gJGFkZGl0aW9uYWxGaXhlZFJlcG9zaXRvcnk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRUZW1wb3JhcnlDb25zdHJhaW50cyhhcnJheSAkY29uc3RyYWludHMpOiBzZWxmCnsKJHRoaXMtPnRlbXBvcmFyeUNvbnN0cmFpbnRzID0gJGNvbnN0cmFpbnRzOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RHJ5UnVuKGJvb2wgJGRyeVJ1biA9IHRydWUpOiBzZWxmCnsKJHRoaXMtPmRyeVJ1biA9ICRkcnlSdW47CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RyeVJ1bigpOiBib29sCnsKcmV0dXJuICR0aGlzLT5kcnlSdW47Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREb3dubG9hZE9ubHkoYm9vbCAkZG93bmxvYWRPbmx5ID0gdHJ1ZSk6IHNlbGYKewokdGhpcy0+ZG93bmxvYWRPbmx5ID0gJGRvd25sb2FkT25seTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByZWZlclNvdXJjZShib29sICRwcmVmZXJTb3VyY2UgPSB0cnVlKTogc2VsZgp7CiR0aGlzLT5wcmVmZXJTb3VyY2UgPSAkcHJlZmVyU291cmNlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJlZmVyRGlzdChib29sICRwcmVmZXJEaXN0ID0gdHJ1ZSk6IHNlbGYKewokdGhpcy0+cHJlZmVyRGlzdCA9ICRwcmVmZXJEaXN0OwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0T3B0aW1pemVBdXRvbG9hZGVyKGJvb2wgJG9wdGltaXplQXV0b2xvYWRlcik6IHNlbGYKewokdGhpcy0+b3B0aW1pemVBdXRvbG9hZGVyID0gJG9wdGltaXplQXV0b2xvYWRlcjsKaWYgKCEkdGhpcy0+b3B0aW1pemVBdXRvbG9hZGVyKSB7CgoKJHRoaXMtPnNldENsYXNzTWFwQXV0aG9yaXRhdGl2ZShmYWxzZSk7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDbGFzc01hcEF1dGhvcml0YXRpdmUoYm9vbCAkY2xhc3NNYXBBdXRob3JpdGF0aXZlKTogc2VsZgp7CiR0aGlzLT5jbGFzc01hcEF1dGhvcml0YXRpdmUgPSAkY2xhc3NNYXBBdXRob3JpdGF0aXZlOwppZiAoJHRoaXMtPmNsYXNzTWFwQXV0aG9yaXRhdGl2ZSkgewoKJHRoaXMtPnNldE9wdGltaXplQXV0b2xvYWRlcih0cnVlKTsKfQoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXBjdUF1dG9sb2FkZXIoYm9vbCAkYXBjdUF1dG9sb2FkZXIsID9zdHJpbmcgJGFwY3VBdXRvbG9hZGVyUHJlZml4ID0gbnVsbCk6IHNlbGYKewokdGhpcy0+YXBjdUF1dG9sb2FkZXIgPSAkYXBjdUF1dG9sb2FkZXI7CiR0aGlzLT5hcGN1QXV0b2xvYWRlclByZWZpeCA9ICRhcGN1QXV0b2xvYWRlclByZWZpeDsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFVwZGF0ZShib29sICR1cGRhdGUpOiBzZWxmCnsKJHRoaXMtPnVwZGF0ZSA9ICR1cGRhdGU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRJbnN0YWxsKGJvb2wgJGluc3RhbGwpOiBzZWxmCnsKJHRoaXMtPmluc3RhbGwgPSAkaW5zdGFsbDsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERldk1vZGUoYm9vbCAkZGV2TW9kZSA9IHRydWUpOiBzZWxmCnsKJHRoaXMtPmRldk1vZGUgPSAkZGV2TW9kZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RHVtcEF1dG9sb2FkZXIoYm9vbCAkZHVtcEF1dG9sb2FkZXIgPSB0cnVlKTogc2VsZgp7CiR0aGlzLT5kdW1wQXV0b2xvYWRlciA9ICRkdW1wQXV0b2xvYWRlcjsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSdW5TY3JpcHRzKGJvb2wgJHJ1blNjcmlwdHMgPSB0cnVlKTogc2VsZgp7CiR0aGlzLT5ydW5TY3JpcHRzID0gJHJ1blNjcmlwdHM7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDb25maWcoQ29uZmlnICRjb25maWcpOiBzZWxmCnsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRWZXJib3NlKGJvb2wgJHZlcmJvc2UgPSB0cnVlKTogc2VsZgp7CiR0aGlzLT52ZXJib3NlID0gJHZlcmJvc2U7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZlcmJvc2UoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+dmVyYm9zZTsKfQoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldElnbm9yZVBsYXRmb3JtUmVxdWlyZW1lbnRzKCRpZ25vcmVQbGF0Zm9ybVJlcXMpOiBzZWxmCnsKdHJpZ2dlcl9lcnJvcignSW5zdGFsbGVyOjpzZXRJZ25vcmVQbGF0Zm9ybVJlcXVpcmVtZW50cyBpcyBkZXByZWNhdGVkIHNpbmNlIENvbXBvc2VyIDIuMiwgdXNlIHNldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgaW5zdGVhZC4nLCBFX1VTRVJfREVQUkVDQVRFRCk7CgpyZXR1cm4gJHRoaXMtPnNldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk6OmZyb21Cb29sT3JMaXN0KCRpZ25vcmVQbGF0Zm9ybVJlcXMpKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik6IHNlbGYKewokdGhpcy0+cGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciA9ICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VXBkYXRlTWlycm9ycyhib29sICR1cGRhdGVNaXJyb3JzKTogc2VsZgp7CiR0aGlzLT51cGRhdGVNaXJyb3JzID0gJHVwZGF0ZU1pcnJvcnM7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRVcGRhdGVBbGxvd0xpc3QoYXJyYXkgJHBhY2thZ2VzKTogc2VsZgp7CmlmIChjb3VudCgkcGFja2FnZXMpID09PSAwKSB7CiR0aGlzLT51cGRhdGVBbGxvd0xpc3QgPSBudWxsOwp9IGVsc2UgewokdGhpcy0+dXBkYXRlQWxsb3dMaXN0ID0gYXJyYXlfdmFsdWVzKGFycmF5X3VuaXF1ZShhcnJheV9tYXAoJ3N0cnRvbG93ZXInLCAkcGFja2FnZXMpKSk7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKGludCAkdXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKTogc2VsZgp7CmlmICghaW5fYXJyYXkoJHVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcywgW1JlcXVlc3Q6OlVQREFURV9PTkxZX0xJU1RFRCwgUmVxdWVzdDo6VVBEQVRFX0xJU1RFRF9XSVRIX1RSQU5TSVRJVkVfREVQU19OT19ST09UX1JFUVVJUkUsIFJlcXVlc3Q6OlVQREFURV9MSVNURURfV0lUSF9UUkFOU0lUSVZFX0RFUFNdLCB0cnVlKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgdmFsdWUgZm9yIHVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyBzdXBwbGllZCIpOwp9CgokdGhpcy0+dXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzID0gJHVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llczsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByZWZlclN0YWJsZShib29sICRwcmVmZXJTdGFibGUgPSB0cnVlKTogc2VsZgp7CiR0aGlzLT5wcmVmZXJTdGFibGUgPSAkcHJlZmVyU3RhYmxlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJlZmVyTG93ZXN0KGJvb2wgJHByZWZlckxvd2VzdCA9IHRydWUpOiBzZWxmCnsKJHRoaXMtPnByZWZlckxvd2VzdCA9ICRwcmVmZXJMb3dlc3Q7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE1pbmltYWxVcGRhdGUoYm9vbCAkbWluaW1hbFVwZGF0ZSA9IHRydWUpOiBzZWxmCnsKJHRoaXMtPm1pbmltYWxVcGRhdGUgPSAkbWluaW1hbFVwZGF0ZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0V3JpdGVMb2NrKGJvb2wgJHdyaXRlTG9jayA9IHRydWUpOiBzZWxmCnsKJHRoaXMtPndyaXRlTG9jayA9ICR3cml0ZUxvY2s7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEV4ZWN1dGVPcGVyYXRpb25zKGJvb2wgJGV4ZWN1dGVPcGVyYXRpb25zID0gdHJ1ZSk6IHNlbGYKewokdGhpcy0+ZXhlY3V0ZU9wZXJhdGlvbnMgPSAkZXhlY3V0ZU9wZXJhdGlvbnM7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEF1ZGl0KGJvb2wgJGF1ZGl0KTogc2VsZgp7CiR0aGlzLT5hdWRpdCA9ICRhdWRpdDsKJHRoaXMtPmF1ZGl0Q29uZmlnID0gbnVsbDsgCgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRFcnJvck9uQXVkaXQoYm9vbCAkZXJyb3JPbkF1ZGl0KTogc2VsZgp7CiR0aGlzLT5lcnJvck9uQXVkaXQgPSAkZXJyb3JPbkF1ZGl0OwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEF1ZGl0Rm9ybWF0KHN0cmluZyAkYXVkaXRGb3JtYXQpOiBzZWxmCnsKJHRoaXMtPmF1ZGl0Rm9ybWF0ID0gJGF1ZGl0Rm9ybWF0OwokdGhpcy0+YXVkaXRDb25maWcgPSBudWxsOyAKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEF1ZGl0Q29uZmlnKEF1ZGl0Q29uZmlnICRhdWRpdENvbmZpZyk6IHNlbGYKewokdGhpcy0+YXVkaXRDb25maWcgPSAkYXVkaXRDb25maWc7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGlzYWJsZVBsdWdpbnMoKTogc2VsZgp7CiR0aGlzLT5pbnN0YWxsYXRpb25NYW5hZ2VyLT5kaXNhYmxlUGx1Z2lucygpOwoKcmV0dXJuICR0aGlzOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0U3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlcihTdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyICRzdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyKTogc2VsZgp7CiR0aGlzLT5zdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyID0gJHN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXI7CgpyZXR1cm4gJHRoaXM7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSW5zdGFsbGVyOwoKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwp1c2UgQ29tcG9zZXJcVXRpbFxTaWxlbmNlcjsKCgoKCgoKCgpjbGFzcyBCaW5hcnlJbnN0YWxsZXIKewoKcHJvdGVjdGVkICRiaW5EaXI7Cgpwcm90ZWN0ZWQgJGJpbkNvbXBhdDsKCnByb3RlY3RlZCAkaW87Cgpwcm90ZWN0ZWQgJGZpbGVzeXN0ZW07Cgpwcml2YXRlICR2ZW5kb3JEaXI7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBzdHJpbmcgJGJpbkRpciwgc3RyaW5nICRiaW5Db21wYXQsID9GaWxlc3lzdGVtICRmaWxlc3lzdGVtID0gbnVsbCwgP3N0cmluZyAkdmVuZG9yRGlyID0gbnVsbCkKewokdGhpcy0+YmluRGlyID0gJGJpbkRpcjsKJHRoaXMtPmJpbkNvbXBhdCA9ICRiaW5Db21wYXQ7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmZpbGVzeXN0ZW0gPSAkZmlsZXN5c3RlbSA/OiBuZXcgRmlsZXN5c3RlbSgpOwokdGhpcy0+dmVuZG9yRGlyID0gJHZlbmRvckRpcjsKfQoKcHVibGljIGZ1bmN0aW9uIGluc3RhbGxCaW5hcmllcyhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJGluc3RhbGxQYXRoLCBib29sICR3YXJuT25PdmVyd3JpdGUgPSB0cnVlKTogdm9pZAp7CiRiaW5hcmllcyA9ICR0aGlzLT5nZXRCaW5hcmllcygkcGFja2FnZSk7CmlmICghJGJpbmFyaWVzKSB7CnJldHVybjsKfQoKUGxhdGZvcm06Ondvcmthcm91bmRGaWxlc3lzdGVtSXNzdWVzKCk7Cgpmb3JlYWNoICgkYmluYXJpZXMgYXMgJGJpbikgewokYmluUGF0aCA9ICRpbnN0YWxsUGF0aC4nLycuJGJpbjsKaWYgKCFmaWxlX2V4aXN0cygkYmluUGF0aCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgPHdhcm5pbmc+U2tpcHBlZCBpbnN0YWxsYXRpb24gb2YgYmluICcuJGJpbi4nIGZvciBwYWNrYWdlICcuJHBhY2thZ2UtPmdldE5hbWUoKS4nOiBmaWxlIG5vdCBmb3VuZCBpbiBwYWNrYWdlPC93YXJuaW5nPicpOwpjb250aW51ZTsKfQppZiAoaXNfZGlyKCRiaW5QYXRoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICA8d2FybmluZz5Ta2lwcGVkIGluc3RhbGxhdGlvbiBvZiBiaW4gJy4kYmluLicgZm9yIHBhY2thZ2UgJy4kcGFja2FnZS0+Z2V0TmFtZSgpLic6IGZvdW5kIGEgZGlyZWN0b3J5IGF0IHRoYXQgcGF0aDwvd2FybmluZz4nKTsKY29udGludWU7Cn0KaWYgKCEkdGhpcy0+ZmlsZXN5c3RlbS0+aXNBYnNvbHV0ZVBhdGgoJGJpblBhdGgpKSB7CgoKCgokYmluUGF0aCA9IHJlYWxwYXRoKCRiaW5QYXRoKTsKfQokdGhpcy0+aW5pdGlhbGl6ZUJpbkRpcigpOwokbGluayA9ICR0aGlzLT5iaW5EaXIuJy8nLmJhc2VuYW1lKCRiaW4pOwppZiAoZmlsZV9leGlzdHMoJGxpbmspKSB7CmlmICghaXNfbGluaygkbGluaykpIHsKaWYgKCR3YXJuT25PdmVyd3JpdGUpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgU2tpcHBlZCBpbnN0YWxsYXRpb24gb2YgYmluICcuJGJpbi4nIGZvciBwYWNrYWdlICcuJHBhY2thZ2UtPmdldE5hbWUoKS4nOiBuYW1lIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIGZpbGUnKTsKfQpjb250aW51ZTsKfQppZiAocmVhbHBhdGgoJGxpbmspID09PSByZWFscGF0aCgkYmluUGF0aCkpIHsKCiR0aGlzLT5maWxlc3lzdGVtLT51bmxpbmsoJGxpbmspOwp9Cn0KCiRiaW5Db21wYXQgPSAkdGhpcy0+YmluQ29tcGF0OwppZiAoJGJpbkNvbXBhdCA9PT0gImF1dG8iICYmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkgfHwgUGxhdGZvcm06OmlzV2luZG93c1N1YnN5c3RlbUZvckxpbnV4KCkpKSB7CiRiaW5Db21wYXQgPSAnZnVsbCc7Cn0KCmlmICgkYmluQ29tcGF0ID09PSAiZnVsbCIpIHsKJHRoaXMtPmluc3RhbGxGdWxsQmluYXJpZXMoJGJpblBhdGgsICRsaW5rLCAkYmluLCAkcGFja2FnZSk7Cn0gZWxzZSB7CiR0aGlzLT5pbnN0YWxsVW5peHlQcm94eUJpbmFyaWVzKCRiaW5QYXRoLCAkbGluayk7Cn0KU2lsZW5jZXI6OmNhbGwoJ2NobW9kJywgJGJpblBhdGgsIDA3NzcgJiB+dW1hc2soKSk7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZUJpbmFyaWVzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiB2b2lkCnsKJHRoaXMtPmluaXRpYWxpemVCaW5EaXIoKTsKCiRiaW5hcmllcyA9ICR0aGlzLT5nZXRCaW5hcmllcygkcGFja2FnZSk7CmlmICghJGJpbmFyaWVzKSB7CnJldHVybjsKfQpmb3JlYWNoICgkYmluYXJpZXMgYXMgJGJpbikgewokbGluayA9ICR0aGlzLT5iaW5EaXIuJy8nLmJhc2VuYW1lKCRiaW4pOwppZiAoaXNfbGluaygkbGluaykgfHwgZmlsZV9leGlzdHMoJGxpbmspKSB7IAokdGhpcy0+ZmlsZXN5c3RlbS0+dW5saW5rKCRsaW5rKTsKfQppZiAoaXNfZmlsZSgkbGluay4nLmJhdCcpKSB7CiR0aGlzLT5maWxlc3lzdGVtLT51bmxpbmsoJGxpbmsuJy5iYXQnKTsKfQp9CgoKaWYgKGlzX2RpcigkdGhpcy0+YmluRGlyKSAmJiAkdGhpcy0+ZmlsZXN5c3RlbS0+aXNEaXJFbXB0eSgkdGhpcy0+YmluRGlyKSkgewpTaWxlbmNlcjo6Y2FsbCgncm1kaXInLCAkdGhpcy0+YmluRGlyKTsKfQp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRldGVybWluZUJpbmFyeUNhbGxlcihzdHJpbmcgJGJpbik6IHN0cmluZwp7CmlmICgnLmJhdCcgPT09IHN1YnN0cigkYmluLCAtNCkgfHwgJy5leGUnID09PSBzdWJzdHIoJGJpbiwgLTQpKSB7CnJldHVybiAnY2FsbCc7Cn0KCiRoYW5kbGUgPSBmb3BlbigkYmluLCAncicpOwokbGluZSA9IGZnZXRzKCRoYW5kbGUpOwpmY2xvc2UoJGhhbmRsZSk7CmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XiMhLyg/OnVzci9iaW4vZW52ICk/KD86W14vXSsvKSooLispJH1tJywgKHN0cmluZykgJGxpbmUsICRtYXRjaCkpIHsKcmV0dXJuIHRyaW0oJG1hdGNoWzFdKTsKfQoKcmV0dXJuICdwaHAnOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0QmluYXJpZXMoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IGFycmF5CnsKcmV0dXJuICRwYWNrYWdlLT5nZXRCaW5hcmllcygpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5zdGFsbEZ1bGxCaW5hcmllcyhzdHJpbmcgJGJpblBhdGgsIHN0cmluZyAkbGluaywgc3RyaW5nICRiaW4sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiB2b2lkCnsKCmlmICgnLmJhdCcgIT09IHN1YnN0cigkYmluUGF0aCwgLTQpKSB7CiR0aGlzLT5pbnN0YWxsVW5peHlQcm94eUJpbmFyaWVzKCRiaW5QYXRoLCAkbGluayk7CiRsaW5rIC49ICcuYmF0JzsKaWYgKGZpbGVfZXhpc3RzKCRsaW5rKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICBTa2lwcGVkIGluc3RhbGxhdGlvbiBvZiBiaW4gJy4kYmluLicuYmF0IHByb3h5IGZvciBwYWNrYWdlICcuJHBhY2thZ2UtPmdldE5hbWUoKS4nOiBhIC5iYXQgcHJveHkgd2FzIGFscmVhZHkgaW5zdGFsbGVkJyk7Cn0KfQppZiAoIWZpbGVfZXhpc3RzKCRsaW5rKSkgewpmaWxlX3B1dF9jb250ZW50cygkbGluaywgJHRoaXMtPmdlbmVyYXRlV2luZG93c1Byb3h5Q29kZSgkYmluUGF0aCwgJGxpbmspKTsKU2lsZW5jZXI6OmNhbGwoJ2NobW9kJywgJGxpbmssIDA3NzcgJiB+dW1hc2soKSk7Cn0KfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluc3RhbGxVbml4eVByb3h5QmluYXJpZXMoc3RyaW5nICRiaW5QYXRoLCBzdHJpbmcgJGxpbmspOiB2b2lkCnsKZmlsZV9wdXRfY29udGVudHMoJGxpbmssICR0aGlzLT5nZW5lcmF0ZVVuaXh5UHJveHlDb2RlKCRiaW5QYXRoLCAkbGluaykpOwpTaWxlbmNlcjo6Y2FsbCgnY2htb2QnLCAkbGluaywgMDc3NyAmIH51bWFzaygpKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluaXRpYWxpemVCaW5EaXIoKTogdm9pZAp7CiR0aGlzLT5maWxlc3lzdGVtLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoJHRoaXMtPmJpbkRpcik7CiR0aGlzLT5iaW5EaXIgPSByZWFscGF0aCgkdGhpcy0+YmluRGlyKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdlbmVyYXRlV2luZG93c1Byb3h5Q29kZShzdHJpbmcgJGJpbiwgc3RyaW5nICRsaW5rKTogc3RyaW5nCnsKJGJpblBhdGggPSAkdGhpcy0+ZmlsZXN5c3RlbS0+ZmluZFNob3J0ZXN0UGF0aCgkbGluaywgJGJpbik7CiRjYWxsZXIgPSBzZWxmOjpkZXRlcm1pbmVCaW5hcnlDYWxsZXIoJGJpbik7CgoKCgppZiAoJGNhbGxlciA9PT0gJ3BocCcpIHsKcmV0dXJuICJARUNITyBPRkZcclxuIi4KInNldGxvY2FsIERJU0FCTEVERUxBWUVERVhQQU5TSU9OXHJcbiIuCiJTRVQgQklOX1RBUkdFVD0lfmRwMC8iLnRyaW0oUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoYmFzZW5hbWUoJGxpbmssICcuYmF0JykpLCAnIlwnJykuIlxyXG4iLgoiU0VUIENPTVBPU0VSX1JVTlRJTUVfQklOX0RJUj0lfmRwMFxyXG4iLgoieyRjYWxsZXJ9IFwiJUJJTl9UQVJHRVQlXCIgJSpcclxuIjsKfQoKcmV0dXJuICJARUNITyBPRkZcclxuIi4KInNldGxvY2FsIERJU0FCTEVERUxBWUVERVhQQU5TSU9OXHJcbiIuCiJTRVQgQklOX1RBUkdFVD0lfmRwMC8iLnRyaW0oUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJGJpblBhdGgpLCAnIlwnJykuIlxyXG4iLgoiU0VUIENPTVBPU0VSX1JVTlRJTUVfQklOX0RJUj0lfmRwMFxyXG4iLgoieyRjYWxsZXJ9IFwiJUJJTl9UQVJHRVQlXCIgJSpcclxuIjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdlbmVyYXRlVW5peHlQcm94eUNvZGUoc3RyaW5nICRiaW4sIHN0cmluZyAkbGluayk6IHN0cmluZwp7CiRiaW5QYXRoID0gJHRoaXMtPmZpbGVzeXN0ZW0tPmZpbmRTaG9ydGVzdFBhdGgoJGxpbmssICRiaW4pOwoKJGJpbkRpciA9IFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKGRpcm5hbWUoJGJpblBhdGgpKTsKJGJpbkZpbGUgPSBiYXNlbmFtZSgkYmluUGF0aCk7CgokYmluQ29udGVudHMgPSAoc3RyaW5nKSBmaWxlX2dldF9jb250ZW50cygkYmluLCBmYWxzZSwgbnVsbCwgMCwgNTAwKTsKCgppZiAoUHJlZzo6aXNNYXRjaCgne14oIyEuKlxyP1xuKT9bXHJcblx0IF0qPFw/cGhwfScsICRiaW5Db250ZW50cywgJG1hdGNoKSkgewoKJHByb3h5Q29kZSA9ICRtYXRjaFsxXSA9PT0gbnVsbCA/ICcjIS91c3IvYmluL2VudiBwaHAnIDogdHJpbSgkbWF0Y2hbMV0pOwokYmluUGF0aEV4cG9ydGVkID0gJHRoaXMtPmZpbGVzeXN0ZW0tPmZpbmRTaG9ydGVzdFBhdGhDb2RlKCRsaW5rLCAkYmluLCBmYWxzZSwgdHJ1ZSk7CiRzdHJlYW1Qcm94eUNvZGUgPSAkc3RyZWFtSGludCA9ICcnOwokZ2xvYmFsc0NvZGUgPSAnJEdMT0JBTFNbXCdfY29tcG9zZXJfYmluX2RpclwnXSA9IF9fRElSX187Jy4iXG4iOwokcGhwdW5pdEhhY2sxID0gJHBocHVuaXRIYWNrMiA9ICcnOwoKaWYgKCR0aGlzLT52ZW5kb3JEaXIgIT09IG51bGwpIHsKCiR2ZW5kb3JEaXJSZWFsID0gcmVhbHBhdGgoJHRoaXMtPnZlbmRvckRpcik7CmlmICgkdmVuZG9yRGlyUmVhbCA9PT0gZmFsc2UpIHsKJHZlbmRvckRpclJlYWwgPSAkdGhpcy0+dmVuZG9yRGlyOwp9CiRnbG9iYWxzQ29kZSAuPSAnJEdMT0JBTFNbXCdfY29tcG9zZXJfYXV0b2xvYWRfcGF0aFwnXSA9ICcgLiAkdGhpcy0+ZmlsZXN5c3RlbS0+ZmluZFNob3J0ZXN0UGF0aENvZGUoJGxpbmssICR2ZW5kb3JEaXJSZWFsIC4gJy9hdXRvbG9hZC5waHAnLCBmYWxzZSwgdHJ1ZSkuIjtcbiI7Cn0KCmlmICgkdGhpcy0+ZmlsZXN5c3RlbS0+bm9ybWFsaXplUGF0aCgkYmluKSA9PT0gJHRoaXMtPmZpbGVzeXN0ZW0tPm5vcm1hbGl6ZVBhdGgoJHRoaXMtPnZlbmRvckRpci4nL3BocHVuaXQvcGhwdW5pdC9waHB1bml0JykpIHsKCiRnbG9iYWxzQ29kZSAuPSAnJEdMT0JBTFNbXCdfX1BIUFVOSVRfSVNPTEFUSU9OX0VYQ0xVREVfTElTVFwnXSA9ICRHTE9CQUxTW1wnX19QSFBVTklUX0lTT0xBVElPTl9CTEFDS0xJU1RcJ10gPSBhcnJheShyZWFscGF0aCgnLiRiaW5QYXRoRXhwb3J0ZWQuJykpOycuIlxuIjsKCiRwaHB1bml0SGFjazEgPSAiJ3BocHZmc2NvbXBvc2VyOi8vJy4iOwokcGhwdW5pdEhhY2syID0gJwogICAgICAgICAgICAgICAgJGRhdGEgPSBzdHJfcmVwbGFjZShcJ19fRElSX19cJywgdmFyX2V4cG9ydChkaXJuYW1lKCR0aGlzLT5yZWFscGF0aCksIHRydWUpLCAkZGF0YSk7CiAgICAgICAgICAgICAgICAkZGF0YSA9IHN0cl9yZXBsYWNlKFwnX19GSUxFX19cJywgdmFyX2V4cG9ydCgkdGhpcy0+cmVhbHBhdGgsIHRydWUpLCAkZGF0YSk7JzsKfQppZiAodHJpbSgkbWF0Y2hbMF0pICE9PSAnPD9waHAnKSB7CiRzdHJlYW1IaW50ID0gJyB1c2luZyBhIHN0cmVhbSB3cmFwcGVyIHRvIHByZXZlbnQgdGhlIHNoZWJhbmcgZnJvbSBiZWluZyBvdXRwdXQgb24gUEhQPDgnLiJcbiAqIjsKJHN0cmVhbVByb3h5Q29kZSA9IDw8PFNUUkVBTVBST1hZCmlmIChQSFBfVkVSU0lPTl9JRCA8IDgwMDAwKSB7CiAgICBpZiAoIWNsYXNzX2V4aXN0cygnQ29tcG9zZXJcQmluUHJveHlXcmFwcGVyJykpIHsKICAgICAgICAvKioKICAgICAgICAgKiBAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICBmaW5hbCBjbGFzcyBCaW5Qcm94eVdyYXBwZXIKICAgICAgICB7CiAgICAgICAgICAgIHByaXZhdGUgXCRoYW5kbGU7CiAgICAgICAgICAgIHByaXZhdGUgXCRwb3NpdGlvbjsKICAgICAgICAgICAgcHJpdmF0ZSBcJHJlYWxwYXRoOwoKICAgICAgICAgICAgcHVibGljIGZ1bmN0aW9uIHN0cmVhbV9vcGVuKFwkcGF0aCwgXCRtb2RlLCBcJG9wdGlvbnMsICZcJG9wZW5lZF9wYXRoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBnZXQgcmlkIG9mIHBocHZmc2NvbXBvc2VyOi8vIHByZWZpeCBmb3IgX19GSUxFX18gJiBfX0RJUl9fIHJlc29sdXRpb24KICAgICAgICAgICAgICAgIFwkb3BlbmVkX3BhdGggPSBzdWJzdHIoXCRwYXRoLCAxNyk7CiAgICAgICAgICAgICAgICBcJHRoaXMtPnJlYWxwYXRoID0gcmVhbHBhdGgoXCRvcGVuZWRfcGF0aCkgPzogXCRvcGVuZWRfcGF0aDsKICAgICAgICAgICAgICAgIFwkb3BlbmVkX3BhdGggPSAkcGhwdW5pdEhhY2sxXCR0aGlzLT5yZWFscGF0aDsKICAgICAgICAgICAgICAgIFwkdGhpcy0+aGFuZGxlID0gZm9wZW4oXCR0aGlzLT5yZWFscGF0aCwgXCRtb2RlKTsKICAgICAgICAgICAgICAgIFwkdGhpcy0+cG9zaXRpb24gPSAwOwoKICAgICAgICAgICAgICAgIHJldHVybiAoYm9vbCkgXCR0aGlzLT5oYW5kbGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBzdHJlYW1fcmVhZChcJGNvdW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBcJGRhdGEgPSBmcmVhZChcJHRoaXMtPmhhbmRsZSwgXCRjb3VudCk7CgogICAgICAgICAgICAgICAgaWYgKFwkdGhpcy0+cG9zaXRpb24gPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBcJGRhdGEgPSBwcmVnX3JlcGxhY2UoJ3teIyEuKlxccj9cXG59JywgJycsIFwkZGF0YSk7CiAgICAgICAgICAgICAgICB9JHBocHVuaXRIYWNrMgoKICAgICAgICAgICAgICAgIFwkdGhpcy0+cG9zaXRpb24gKz0gc3RybGVuKFwkZGF0YSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIFwkZGF0YTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVibGljIGZ1bmN0aW9uIHN0cmVhbV9jYXN0KFwkY2FzdEFzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gXCR0aGlzLT5oYW5kbGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBzdHJlYW1fY2xvc2UoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmY2xvc2UoXCR0aGlzLT5oYW5kbGUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdWJsaWMgZnVuY3Rpb24gc3RyZWFtX2xvY2soXCRvcGVyYXRpb24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBcJG9wZXJhdGlvbiA/IGZsb2NrKFwkdGhpcy0+aGFuZGxlLCBcJG9wZXJhdGlvbikgOiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdWJsaWMgZnVuY3Rpb24gc3RyZWFtX3NlZWsoXCRvZmZzZXQsIFwkd2hlbmNlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoMCA9PT0gZnNlZWsoXCR0aGlzLT5oYW5kbGUsIFwkb2Zmc2V0LCBcJHdoZW5jZSkpIHsKICAgICAgICAgICAgICAgICAgICBcJHRoaXMtPnBvc2l0aW9uID0gZnRlbGwoXCR0aGlzLT5oYW5kbGUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVibGljIGZ1bmN0aW9uIHN0cmVhbV90ZWxsKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIFwkdGhpcy0+cG9zaXRpb247CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBzdHJlYW1fZW9mKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIGZlb2YoXCR0aGlzLT5oYW5kbGUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdWJsaWMgZnVuY3Rpb24gc3RyZWFtX3N0YXQoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVibGljIGZ1bmN0aW9uIHN0cmVhbV9zZXRfb3B0aW9uKFwkb3B0aW9uLCBcJGFyZzEsIFwkYXJnMikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1YmxpYyBmdW5jdGlvbiB1cmxfc3RhdChcJHBhdGgsIFwkZmxhZ3MpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFwkcGF0aCA9IHN1YnN0cihcJHBhdGgsIDE3KTsKICAgICAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cyhcJHBhdGgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXQoXCRwYXRoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKAogICAgICAgIChmdW5jdGlvbl9leGlzdHMoJ3N0cmVhbV9nZXRfd3JhcHBlcnMnKSAmJiBpbl9hcnJheSgncGhwdmZzY29tcG9zZXInLCBzdHJlYW1fZ2V0X3dyYXBwZXJzKCksIHRydWUpKQogICAgICAgIHx8IChmdW5jdGlvbl9leGlzdHMoJ3N0cmVhbV93cmFwcGVyX3JlZ2lzdGVyJykgJiYgc3RyZWFtX3dyYXBwZXJfcmVnaXN0ZXIoJ3BocHZmc2NvbXBvc2VyJywgJ0NvbXBvc2VyXEJpblByb3h5V3JhcHBlcicpKQogICAgKSB7CiAgICAgICAgcmV0dXJuIGluY2x1ZGUoInBocHZmc2NvbXBvc2VyOi8vIiAuICRiaW5QYXRoRXhwb3J0ZWQpOwogICAgfQp9CgpTVFJFQU1QUk9YWTsKfQoKcmV0dXJuICRwcm94eUNvZGUgLiAiXG4iIC4gPDw8UFJPWFkKPD9waHAKCi8qKgogKiBQcm94eSBQSFAgZmlsZSBnZW5lcmF0ZWQgYnkgQ29tcG9zZXIKICoKICogVGhpcyBmaWxlIGluY2x1ZGVzIHRoZSByZWZlcmVuY2VkIGJpbiBwYXRoICgkYmluUGF0aCkKICokc3RyZWFtSGludAogKiBAZ2VuZXJhdGVkCiAqLwoKbmFtZXNwYWNlIENvbXBvc2VyOwoKJGdsb2JhbHNDb2RlCiRzdHJlYW1Qcm94eUNvZGUKcmV0dXJuIGluY2x1ZGUgJGJpblBhdGhFeHBvcnRlZDsKClBST1hZOwp9CgpyZXR1cm4gPDw8UFJPWFkKIyEvdXNyL2Jpbi9lbnYgc2gKCiMgU3VwcG9ydCBiYXNoIHRvIHN1cHBvcnQgYHNvdXJjZWAgd2l0aCBmYWxsYmFjayBvbiAkMCBpZiB0aGlzIGRvZXMgbm90IHJ1biB3aXRoIGJhc2gKIyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzUwMDY1MDUvNjUxMgpzZWxmQXJnPSJcJEJBU0hfU09VUkNFIgppZiBbIC16ICJcJHNlbGZBcmciIF07IHRoZW4KICAgIHNlbGZBcmc9IlwkMCIKZmkKCnNlbGY9XCQocmVhbHBhdGggIlwkc2VsZkFyZyIgMj4gL2Rldi9udWxsKQppZiBbIC16ICJcJHNlbGYiIF07IHRoZW4KICAgIHNlbGY9Ilwkc2VsZkFyZyIKZmkKCmRpcj1cJChjZCAiXCR7c2VsZiVbL1xcXFxdKn0iID4gL2Rldi9udWxsOyBjZCAkYmluRGlyICYmIHB3ZCkKCmlmIFsgLWQgL3Byb2MvY3lnZHJpdmUgXTsgdGhlbgogICAgY2FzZSBcJCh3aGljaCBwaHApIGluCiAgICAgICAgXCQocmVhZGxpbmsgLW4gL3Byb2MvY3lnZHJpdmUpLyopCiAgICAgICAgICAgICMgV2UgYXJlIGluIEN5Z3dpbiB1c2luZyBXaW5kb3dzIHBocCwgc28gdGhlIHBhdGggbXVzdCBiZSB0cmFuc2xhdGVkCiAgICAgICAgICAgIGRpcj1cJChjeWdwYXRoIC1tICJcJGRpciIpOwogICAgICAgICAgICA7OwogICAgZXNhYwpmaQoKZXhwb3J0IENPTVBPU0VSX1JVTlRJTUVfQklOX0RJUj0iXCQoY2QgIlwke3NlbGYlWy9cXFxcXSp9IiA+IC9kZXYvbnVsbDsgcHdkKSIKCiMgSWYgYmFzaCBpcyBzb3VyY2luZyB0aGlzIGZpbGUsIHdlIGhhdmUgdG8gc291cmNlIHRoZSB0YXJnZXQgYXMgd2VsbApiYXNoU291cmNlPSJcJEJBU0hfU09VUkNFIgppZiBbIC1uICJcJGJhc2hTb3VyY2UiIF07IHRoZW4KICAgIGlmIFsgIlwkYmFzaFNvdXJjZSIgIT0gIlwkMCIgXTsgdGhlbgogICAgICAgIHNvdXJjZSAiXCR7ZGlyfS8kYmluRmlsZSIgIlwkQCIKICAgICAgICByZXR1cm4KICAgIGZpCmZpCgpleGVjICJcJHtkaXJ9LyRiaW5GaWxlIiAiXCRAIgoKUFJPWFk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSW5zdGFsbGVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKCgoKCgoKaW50ZXJmYWNlIEJpbmFyeVByZXNlbmNlSW50ZXJmYWNlCnsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBlbnN1cmVCaW5hcmllc1ByZXNlbmNlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxJbnN0YWxsZXI7Cgp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJT1xDb25zb2xlSU87CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cT3BlcmF0aW9uSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxJbnN0YWxsT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxVcGRhdGVPcGVyYXRpb247CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXFVuaW5zdGFsbE9wZXJhdGlvbjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cTWFya0FsaWFzSW5zdGFsbGVkT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxNYXJrQWxpYXNVbmluc3RhbGxlZE9wZXJhdGlvbjsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcRmlsZURvd25sb2FkZXI7CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnREaXNwYXRjaGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxMb29wOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKdXNlIFNlbGRcU2lnbmFsXFNpZ25hbEhhbmRsZXI7CgoKCgoKCgoKY2xhc3MgSW5zdGFsbGF0aW9uTWFuYWdlcgp7Cgpwcml2YXRlICRpbnN0YWxsZXJzID0gW107Cgpwcml2YXRlICRjYWNoZSA9IFtdOwoKcHJpdmF0ZSAkbm90aWZpYWJsZVBhY2thZ2VzID0gW107Cgpwcml2YXRlICRsb29wOwoKcHJpdmF0ZSAkaW87Cgpwcml2YXRlICRldmVudERpc3BhdGNoZXI7Cgpwcml2YXRlICRvdXRwdXRQcm9ncmVzczsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChMb29wICRsb29wLCBJT0ludGVyZmFjZSAkaW8sID9FdmVudERpc3BhdGNoZXIgJGV2ZW50RGlzcGF0Y2hlciA9IG51bGwpCnsKJHRoaXMtPmxvb3AgPSAkbG9vcDsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+ZXZlbnREaXNwYXRjaGVyID0gJGV2ZW50RGlzcGF0Y2hlcjsKfQoKcHVibGljIGZ1bmN0aW9uIHJlc2V0KCk6IHZvaWQKewokdGhpcy0+bm90aWZpYWJsZVBhY2thZ2VzID0gW107CkZpbGVEb3dubG9hZGVyOjokZG93bmxvYWRNZXRhZGF0YSA9IFtdOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRJbnN0YWxsZXIoSW5zdGFsbGVySW50ZXJmYWNlICRpbnN0YWxsZXIpOiB2b2lkCnsKYXJyYXlfdW5zaGlmdCgkdGhpcy0+aW5zdGFsbGVycywgJGluc3RhbGxlcik7CiR0aGlzLT5jYWNoZSA9IFtdOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVJbnN0YWxsZXIoSW5zdGFsbGVySW50ZXJmYWNlICRpbnN0YWxsZXIpOiB2b2lkCnsKaWYgKGZhbHNlICE9PSAoJGtleSA9IGFycmF5X3NlYXJjaCgkaW5zdGFsbGVyLCAkdGhpcy0+aW5zdGFsbGVycywgdHJ1ZSkpKSB7CmFycmF5X3NwbGljZSgkdGhpcy0+aW5zdGFsbGVycywgJGtleSwgMSk7CiR0aGlzLT5jYWNoZSA9IFtdOwp9Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGlzYWJsZVBsdWdpbnMoKTogdm9pZAp7CmZvcmVhY2ggKCR0aGlzLT5pbnN0YWxsZXJzIGFzICRpID0+ICRpbnN0YWxsZXIpIHsKaWYgKCEkaW5zdGFsbGVyIGluc3RhbmNlb2YgUGx1Z2luSW5zdGFsbGVyKSB7CmNvbnRpbnVlOwp9CgokaW5zdGFsbGVyLT5kaXNhYmxlUGx1Z2lucygpOwp9Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5zdGFsbGVyKHN0cmluZyAkdHlwZSk6IEluc3RhbGxlckludGVyZmFjZQp7CiR0eXBlID0gc3RydG9sb3dlcigkdHlwZSk7CgppZiAoaXNzZXQoJHRoaXMtPmNhY2hlWyR0eXBlXSkpIHsKcmV0dXJuICR0aGlzLT5jYWNoZVskdHlwZV07Cn0KCmZvcmVhY2ggKCR0aGlzLT5pbnN0YWxsZXJzIGFzICRpbnN0YWxsZXIpIHsKaWYgKCRpbnN0YWxsZXItPnN1cHBvcnRzKCR0eXBlKSkgewpyZXR1cm4gJHRoaXMtPmNhY2hlWyR0eXBlXSA9ICRpbnN0YWxsZXI7Cn0KfQoKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1Vua25vd24gaW5zdGFsbGVyIHR5cGU6ICcuJHR5cGUpOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNQYWNrYWdlSW5zdGFsbGVkKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBib29sCnsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CnJldHVybiAkcmVwby0+aGFzUGFja2FnZSgkcGFja2FnZSkgJiYgJHRoaXMtPmlzUGFja2FnZUluc3RhbGxlZCgkcmVwbywgJHBhY2thZ2UtPmdldEFsaWFzT2YoKSk7Cn0KCnJldHVybiAkdGhpcy0+Z2V0SW5zdGFsbGVyKCRwYWNrYWdlLT5nZXRUeXBlKCkpLT5pc0luc3RhbGxlZCgkcmVwbywgJHBhY2thZ2UpOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZW5zdXJlQmluYXJpZXNQcmVzZW5jZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogdm9pZAp7CnRyeSB7CiRpbnN0YWxsZXIgPSAkdGhpcy0+Z2V0SW5zdGFsbGVyKCRwYWNrYWdlLT5nZXRUeXBlKCkpOwp9IGNhdGNoIChcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uICRlKSB7CgpyZXR1cm47Cn0KCgppZiAoJGluc3RhbGxlciBpbnN0YW5jZW9mIEJpbmFyeVByZXNlbmNlSW50ZXJmYWNlKSB7CiRpbnN0YWxsZXItPmVuc3VyZUJpbmFyaWVzUHJlc2VuY2UoJHBhY2thZ2UpOwp9Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBleGVjdXRlKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIGFycmF5ICRvcGVyYXRpb25zLCBib29sICRkZXZNb2RlID0gdHJ1ZSwgYm9vbCAkcnVuU2NyaXB0cyA9IHRydWUsIGJvb2wgJGRvd25sb2FkT25seSA9IGZhbHNlKTogdm9pZAp7CgokY2xlYW51cFByb21pc2VzID0gW107Cgokc2lnbmFsSGFuZGxlciA9IFNpZ25hbEhhbmRsZXI6OmNyZWF0ZShbU2lnbmFsSGFuZGxlcjo6U0lHSU5ULCBTaWduYWxIYW5kbGVyOjpTSUdURVJNLCBTaWduYWxIYW5kbGVyOjpTSUdIVVBdLCBmdW5jdGlvbiAoc3RyaW5nICRzaWduYWwsIFNpZ25hbEhhbmRsZXIgJGhhbmRsZXIpIHVzZSAoJiRjbGVhbnVwUHJvbWlzZXMpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdSZWNlaXZlZCAnLiRzaWduYWwuJywgYWJvcnRpbmcnLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwokdGhpcy0+cnVuQ2xlYW51cCgkY2xlYW51cFByb21pc2VzKTsKJGhhbmRsZXItPmV4aXRXaXRoTGFzdFNpZ25hbCgpOwp9KTsKCnRyeSB7CgoKJGJhdGNoZXMgPSBbXTsKJGJhdGNoID0gW107CmZvcmVhY2ggKCRvcGVyYXRpb25zIGFzICRpbmRleCA9PiAkb3BlcmF0aW9uKSB7CmlmICgkb3BlcmF0aW9uIGluc3RhbmNlb2YgVXBkYXRlT3BlcmF0aW9uIHx8ICRvcGVyYXRpb24gaW5zdGFuY2VvZiBJbnN0YWxsT3BlcmF0aW9uKSB7CiRwYWNrYWdlID0gJG9wZXJhdGlvbiBpbnN0YW5jZW9mIFVwZGF0ZU9wZXJhdGlvbiA/ICRvcGVyYXRpb24tPmdldFRhcmdldFBhY2thZ2UoKSA6ICRvcGVyYXRpb24tPmdldFBhY2thZ2UoKTsKaWYgKCRwYWNrYWdlLT5nZXRUeXBlKCkgPT09ICdjb21wb3Nlci1wbHVnaW4nKSB7CiRleHRyYSA9ICRwYWNrYWdlLT5nZXRFeHRyYSgpOwppZiAoaXNzZXQoJGV4dHJhWydwbHVnaW4tbW9kaWZpZXMtZG93bmxvYWRzJ10pICYmICRleHRyYVsncGx1Z2luLW1vZGlmaWVzLWRvd25sb2FkcyddID09PSB0cnVlKSB7CmlmIChjb3VudCgkYmF0Y2gpID4gMCkgewokYmF0Y2hlc1tdID0gJGJhdGNoOwp9CiRiYXRjaGVzW10gPSBbJGluZGV4ID0+ICRvcGVyYXRpb25dOwokYmF0Y2ggPSBbXTsKCmNvbnRpbnVlOwp9Cn0KfQokYmF0Y2hbJGluZGV4XSA9ICRvcGVyYXRpb247Cn0KCmlmIChjb3VudCgkYmF0Y2gpID4gMCkgewokYmF0Y2hlc1tdID0gJGJhdGNoOwp9Cgpmb3JlYWNoICgkYmF0Y2hlcyBhcyAkYmF0Y2hUb0V4ZWN1dGUpIHsKJHRoaXMtPmRvd25sb2FkQW5kRXhlY3V0ZUJhdGNoKCRyZXBvLCAkYmF0Y2hUb0V4ZWN1dGUsICRjbGVhbnVwUHJvbWlzZXMsICRkZXZNb2RlLCAkcnVuU2NyaXB0cywgJGRvd25sb2FkT25seSwgJG9wZXJhdGlvbnMpOwp9Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJHRoaXMtPnJ1bkNsZWFudXAoJGNsZWFudXBQcm9taXNlcyk7Cgp0aHJvdyAkZTsKfSBmaW5hbGx5IHsKJHNpZ25hbEhhbmRsZXItPnVucmVnaXN0ZXIoKTsKfQoKaWYgKCRkb3dubG9hZE9ubHkpIHsKcmV0dXJuOwp9CgoKCgokcmVwby0+d3JpdGUoJGRldk1vZGUsICR0aGlzKTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRvd25sb2FkQW5kRXhlY3V0ZUJhdGNoKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIGFycmF5ICRvcGVyYXRpb25zLCBhcnJheSAmJGNsZWFudXBQcm9taXNlcywgYm9vbCAkZGV2TW9kZSwgYm9vbCAkcnVuU2NyaXB0cywgYm9vbCAkZG93bmxvYWRPbmx5LCBhcnJheSAkYWxsT3BlcmF0aW9ucyk6IHZvaWQKewokcHJvbWlzZXMgPSBbXTsKCmZvcmVhY2ggKCRvcGVyYXRpb25zIGFzICRpbmRleCA9PiAkb3BlcmF0aW9uKSB7CiRvcFR5cGUgPSAkb3BlcmF0aW9uLT5nZXRPcGVyYXRpb25UeXBlKCk7CgoKaWYgKCFpbl9hcnJheSgkb3BUeXBlLCBbJ3VwZGF0ZScsICdpbnN0YWxsJywgJ3VuaW5zdGFsbCddLCB0cnVlKSkgewpjb250aW51ZTsKfQoKaWYgKCRvcFR5cGUgPT09ICd1cGRhdGUnKSB7CgokcGFja2FnZSA9ICRvcGVyYXRpb24tPmdldFRhcmdldFBhY2thZ2UoKTsKJGluaXRpYWxQYWNrYWdlID0gJG9wZXJhdGlvbi0+Z2V0SW5pdGlhbFBhY2thZ2UoKTsKfSBlbHNlIHsKCiRwYWNrYWdlID0gJG9wZXJhdGlvbi0+Z2V0UGFja2FnZSgpOwokaW5pdGlhbFBhY2thZ2UgPSBudWxsOwp9CiRpbnN0YWxsZXIgPSAkdGhpcy0+Z2V0SW5zdGFsbGVyKCRwYWNrYWdlLT5nZXRUeXBlKCkpOwoKJGNsZWFudXBQcm9taXNlc1skaW5kZXhdID0gc3RhdGljIGZ1bmN0aW9uICgpIHVzZSAoJG9wVHlwZSwgJGluc3RhbGxlciwgJHBhY2thZ2UsICRpbml0aWFsUGFja2FnZSk6ID9Qcm9taXNlSW50ZXJmYWNlIHsKCgppZiAobnVsbCA9PT0gJHBhY2thZ2UtPmdldEluc3RhbGxhdGlvblNvdXJjZSgpKSB7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgpyZXR1cm4gJGluc3RhbGxlci0+Y2xlYW51cCgkb3BUeXBlLCAkcGFja2FnZSwgJGluaXRpYWxQYWNrYWdlKTsKfTsKCmlmICgkb3BUeXBlICE9PSAndW5pbnN0YWxsJykgewokcHJvbWlzZSA9ICRpbnN0YWxsZXItPmRvd25sb2FkKCRwYWNrYWdlLCAkaW5pdGlhbFBhY2thZ2UpOwppZiAobnVsbCAhPT0gJHByb21pc2UpIHsKJHByb21pc2VzW10gPSAkcHJvbWlzZTsKfQp9Cn0KCgppZiAoY291bnQoJHByb21pc2VzKSA+IDApIHsKJHRoaXMtPndhaXRPblByb21pc2VzKCRwcm9taXNlcyk7Cn0KCmlmICgkZG93bmxvYWRPbmx5KSB7CiR0aGlzLT5ydW5DbGVhbnVwKCRjbGVhbnVwUHJvbWlzZXMpOwoKcmV0dXJuOwp9CgoKCiRiYXRjaGVzID0gW107CiRiYXRjaCA9IFtdOwpmb3JlYWNoICgkb3BlcmF0aW9ucyBhcyAkaW5kZXggPT4gJG9wZXJhdGlvbikgewppZiAoJG9wZXJhdGlvbiBpbnN0YW5jZW9mIEluc3RhbGxPcGVyYXRpb24gfHwgJG9wZXJhdGlvbiBpbnN0YW5jZW9mIFVwZGF0ZU9wZXJhdGlvbikgewokcGFja2FnZSA9ICRvcGVyYXRpb24gaW5zdGFuY2VvZiBVcGRhdGVPcGVyYXRpb24gPyAkb3BlcmF0aW9uLT5nZXRUYXJnZXRQYWNrYWdlKCkgOiAkb3BlcmF0aW9uLT5nZXRQYWNrYWdlKCk7CmlmICgkcGFja2FnZS0+Z2V0VHlwZSgpID09PSAnY29tcG9zZXItcGx1Z2luJyB8fCAkcGFja2FnZS0+Z2V0VHlwZSgpID09PSAnY29tcG9zZXItaW5zdGFsbGVyJykgewppZiAoY291bnQoJGJhdGNoKSA+IDApIHsKJGJhdGNoZXNbXSA9ICRiYXRjaDsKfQokYmF0Y2hlc1tdID0gWyRpbmRleCA9PiAkb3BlcmF0aW9uXTsKJGJhdGNoID0gW107Cgpjb250aW51ZTsKfQp9CiRiYXRjaFskaW5kZXhdID0gJG9wZXJhdGlvbjsKfQoKaWYgKGNvdW50KCRiYXRjaCkgPiAwKSB7CiRiYXRjaGVzW10gPSAkYmF0Y2g7Cn0KCmZvcmVhY2ggKCRiYXRjaGVzIGFzICRiYXRjaFRvRXhlY3V0ZSkgewokdGhpcy0+ZXhlY3V0ZUJhdGNoKCRyZXBvLCAkYmF0Y2hUb0V4ZWN1dGUsICRjbGVhbnVwUHJvbWlzZXMsICRkZXZNb2RlLCAkcnVuU2NyaXB0cywgJGFsbE9wZXJhdGlvbnMpOwp9Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBleGVjdXRlQmF0Y2goSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgYXJyYXkgJG9wZXJhdGlvbnMsIGFycmF5ICRjbGVhbnVwUHJvbWlzZXMsIGJvb2wgJGRldk1vZGUsIGJvb2wgJHJ1blNjcmlwdHMsIGFycmF5ICRhbGxPcGVyYXRpb25zKTogdm9pZAp7CiRwcm9taXNlcyA9IFtdOwokcG9zdEV4ZWNDYWxsYmFja3MgPSBbXTsKCmZvcmVhY2ggKCRvcGVyYXRpb25zIGFzICRpbmRleCA9PiAkb3BlcmF0aW9uKSB7CiRvcFR5cGUgPSAkb3BlcmF0aW9uLT5nZXRPcGVyYXRpb25UeXBlKCk7CgoKaWYgKCFpbl9hcnJheSgkb3BUeXBlLCBbJ3VwZGF0ZScsICdpbnN0YWxsJywgJ3VuaW5zdGFsbCddLCB0cnVlKSkgewoKaWYgKCR0aGlzLT5pby0+aXNEZWJ1ZygpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignICAtICcgLiAkb3BlcmF0aW9uLT5zaG93KGZhbHNlKSk7Cn0KJHRoaXMtPnskb3BUeXBlfSgkcmVwbywgJG9wZXJhdGlvbik7Cgpjb250aW51ZTsKfQoKaWYgKCRvcFR5cGUgPT09ICd1cGRhdGUnKSB7CgokcGFja2FnZSA9ICRvcGVyYXRpb24tPmdldFRhcmdldFBhY2thZ2UoKTsKJGluaXRpYWxQYWNrYWdlID0gJG9wZXJhdGlvbi0+Z2V0SW5pdGlhbFBhY2thZ2UoKTsKfSBlbHNlIHsKCiRwYWNrYWdlID0gJG9wZXJhdGlvbi0+Z2V0UGFja2FnZSgpOwokaW5pdGlhbFBhY2thZ2UgPSBudWxsOwp9CgokaW5zdGFsbGVyID0gJHRoaXMtPmdldEluc3RhbGxlcigkcGFja2FnZS0+Z2V0VHlwZSgpKTsKCiRldmVudE5hbWUgPSBbCidpbnN0YWxsJyA9PiBQYWNrYWdlRXZlbnRzOjpQUkVfUEFDS0FHRV9JTlNUQUxMLAondXBkYXRlJyA9PiBQYWNrYWdlRXZlbnRzOjpQUkVfUEFDS0FHRV9VUERBVEUsCid1bmluc3RhbGwnID0+IFBhY2thZ2VFdmVudHM6OlBSRV9QQUNLQUdFX1VOSU5TVEFMTCwKXVskb3BUeXBlXTsKCmlmICgkcnVuU2NyaXB0cyAmJiAkdGhpcy0+ZXZlbnREaXNwYXRjaGVyICE9PSBudWxsKSB7CiR0aGlzLT5ldmVudERpc3BhdGNoZXItPmRpc3BhdGNoUGFja2FnZUV2ZW50KCRldmVudE5hbWUsICRkZXZNb2RlLCAkcmVwbywgJGFsbE9wZXJhdGlvbnMsICRvcGVyYXRpb24pOwp9CgokZGlzcGF0Y2hlciA9ICR0aGlzLT5ldmVudERpc3BhdGNoZXI7CiRpbyA9ICR0aGlzLT5pbzsKCiRwcm9taXNlID0gJGluc3RhbGxlci0+cHJlcGFyZSgkb3BUeXBlLCAkcGFja2FnZSwgJGluaXRpYWxQYWNrYWdlKTsKaWYgKCEkcHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2VJbnRlcmZhY2UpIHsKJHByb21pc2UgPSBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgokcHJvbWlzZSA9ICRwcm9taXNlLT50aGVuKGZ1bmN0aW9uICgpIHVzZSAoJG9wVHlwZSwgJHJlcG8sICRvcGVyYXRpb24pIHsKcmV0dXJuICR0aGlzLT57JG9wVHlwZX0oJHJlcG8sICRvcGVyYXRpb24pOwp9KS0+dGhlbigkY2xlYW51cFByb21pc2VzWyRpbmRleF0pCi0+dGhlbihmdW5jdGlvbiAoKSB1c2UgKCRkZXZNb2RlLCAkcmVwbyk6IHZvaWQgewokcmVwby0+d3JpdGUoJGRldk1vZGUsICR0aGlzKTsKfSwgc3RhdGljIGZ1bmN0aW9uICgkZSkgdXNlICgkb3BUeXBlLCAkcGFja2FnZSwgJGlvKTogdm9pZCB7CiRpby0+d3JpdGVFcnJvcignICAgIDxlcnJvcj4nIC4gdWNmaXJzdCgkb3BUeXBlKSAuJyBvZiAnLiRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuJyBmYWlsZWQ8L2Vycm9yPicpOwoKdGhyb3cgJGU7Cn0pOwoKJGV2ZW50TmFtZSA9IFsKJ2luc3RhbGwnID0+IFBhY2thZ2VFdmVudHM6OlBPU1RfUEFDS0FHRV9JTlNUQUxMLAondXBkYXRlJyA9PiBQYWNrYWdlRXZlbnRzOjpQT1NUX1BBQ0tBR0VfVVBEQVRFLAondW5pbnN0YWxsJyA9PiBQYWNrYWdlRXZlbnRzOjpQT1NUX1BBQ0tBR0VfVU5JTlNUQUxMLApdWyRvcFR5cGVdOwoKaWYgKCRydW5TY3JpcHRzICYmICRkaXNwYXRjaGVyICE9PSBudWxsKSB7CiRwb3N0RXhlY0NhbGxiYWNrc1tdID0gc3RhdGljIGZ1bmN0aW9uICgpIHVzZSAoJGRpc3BhdGNoZXIsICRldmVudE5hbWUsICRkZXZNb2RlLCAkcmVwbywgJGFsbE9wZXJhdGlvbnMsICRvcGVyYXRpb24pOiB2b2lkIHsKJGRpc3BhdGNoZXItPmRpc3BhdGNoUGFja2FnZUV2ZW50KCRldmVudE5hbWUsICRkZXZNb2RlLCAkcmVwbywgJGFsbE9wZXJhdGlvbnMsICRvcGVyYXRpb24pOwp9Owp9CgokcHJvbWlzZXNbXSA9ICRwcm9taXNlOwp9CgoKaWYgKGNvdW50KCRwcm9taXNlcykgPiAwKSB7CiR0aGlzLT53YWl0T25Qcm9taXNlcygkcHJvbWlzZXMpOwp9CgpQbGF0Zm9ybTo6d29ya2Fyb3VuZEZpbGVzeXN0ZW1Jc3N1ZXMoKTsKCmZvcmVhY2ggKCRwb3N0RXhlY0NhbGxiYWNrcyBhcyAkY2IpIHsKJGNiKCk7Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB3YWl0T25Qcm9taXNlcyhhcnJheSAkcHJvbWlzZXMpOiB2b2lkCnsKJHByb2dyZXNzID0gbnVsbDsKaWYgKAokdGhpcy0+b3V0cHV0UHJvZ3Jlc3MKJiYgJHRoaXMtPmlvIGluc3RhbmNlb2YgQ29uc29sZUlPCiYmICEoKGJvb2wpIFBsYXRmb3JtOjpnZXRFbnYoJ0NJJykpCiYmICEkdGhpcy0+aW8tPmlzRGVidWcoKQomJiBjb3VudCgkcHJvbWlzZXMpID4gMQopIHsKJHByb2dyZXNzID0gJHRoaXMtPmlvLT5nZXRQcm9ncmVzc0JhcigpOwp9CiR0aGlzLT5sb29wLT53YWl0KCRwcm9taXNlcywgJHByb2dyZXNzKTsKaWYgKCRwcm9ncmVzcyAhPT0gbnVsbCkgewokcHJvZ3Jlc3MtPmNsZWFyKCk7CgppZiAoISR0aGlzLT5pby0+aXNEZWNvcmF0ZWQoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJycpOwp9Cn0KfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6ID9Qcm9taXNlSW50ZXJmYWNlCnsKJGluc3RhbGxlciA9ICR0aGlzLT5nZXRJbnN0YWxsZXIoJHBhY2thZ2UtPmdldFR5cGUoKSk7CiRwcm9taXNlID0gJGluc3RhbGxlci0+Y2xlYW51cCgiaW5zdGFsbCIsICRwYWNrYWdlKTsKCnJldHVybiAkcHJvbWlzZTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbnN0YWxsKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIEluc3RhbGxPcGVyYXRpb24gJG9wZXJhdGlvbik6ID9Qcm9taXNlSW50ZXJmYWNlCnsKJHBhY2thZ2UgPSAkb3BlcmF0aW9uLT5nZXRQYWNrYWdlKCk7CiRpbnN0YWxsZXIgPSAkdGhpcy0+Z2V0SW5zdGFsbGVyKCRwYWNrYWdlLT5nZXRUeXBlKCkpOwokcHJvbWlzZSA9ICRpbnN0YWxsZXItPmluc3RhbGwoJHJlcG8sICRwYWNrYWdlKTsKJHRoaXMtPm1hcmtGb3JOb3RpZmljYXRpb24oJHBhY2thZ2UpOwoKcmV0dXJuICRwcm9taXNlOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHVwZGF0ZShJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBVcGRhdGVPcGVyYXRpb24gJG9wZXJhdGlvbik6ID9Qcm9taXNlSW50ZXJmYWNlCnsKJGluaXRpYWwgPSAkb3BlcmF0aW9uLT5nZXRJbml0aWFsUGFja2FnZSgpOwokdGFyZ2V0ID0gJG9wZXJhdGlvbi0+Z2V0VGFyZ2V0UGFja2FnZSgpOwoKJGluaXRpYWxUeXBlID0gJGluaXRpYWwtPmdldFR5cGUoKTsKJHRhcmdldFR5cGUgPSAkdGFyZ2V0LT5nZXRUeXBlKCk7CgppZiAoJGluaXRpYWxUeXBlID09PSAkdGFyZ2V0VHlwZSkgewokaW5zdGFsbGVyID0gJHRoaXMtPmdldEluc3RhbGxlcigkaW5pdGlhbFR5cGUpOwokcHJvbWlzZSA9ICRpbnN0YWxsZXItPnVwZGF0ZSgkcmVwbywgJGluaXRpYWwsICR0YXJnZXQpOwokdGhpcy0+bWFya0Zvck5vdGlmaWNhdGlvbigkdGFyZ2V0KTsKfSBlbHNlIHsKJHByb21pc2UgPSAkdGhpcy0+Z2V0SW5zdGFsbGVyKCRpbml0aWFsVHlwZSktPnVuaW5zdGFsbCgkcmVwbywgJGluaXRpYWwpOwppZiAoISRwcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZUludGVyZmFjZSkgewokcHJvbWlzZSA9IFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCiRpbnN0YWxsZXIgPSAkdGhpcy0+Z2V0SW5zdGFsbGVyKCR0YXJnZXRUeXBlKTsKJHByb21pc2UgPSAkcHJvbWlzZS0+dGhlbihzdGF0aWMgZnVuY3Rpb24gKCkgdXNlICgkaW5zdGFsbGVyLCAkcmVwbywgJHRhcmdldCk6IFByb21pc2VJbnRlcmZhY2UgewokcHJvbWlzZSA9ICRpbnN0YWxsZXItPmluc3RhbGwoJHJlcG8sICR0YXJnZXQpOwppZiAoJHByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlSW50ZXJmYWNlKSB7CnJldHVybiAkcHJvbWlzZTsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0pOwp9CgpyZXR1cm4gJHByb21pc2U7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdW5pbnN0YWxsKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFVuaW5zdGFsbE9wZXJhdGlvbiAkb3BlcmF0aW9uKTogP1Byb21pc2VJbnRlcmZhY2UKewokcGFja2FnZSA9ICRvcGVyYXRpb24tPmdldFBhY2thZ2UoKTsKJGluc3RhbGxlciA9ICR0aGlzLT5nZXRJbnN0YWxsZXIoJHBhY2thZ2UtPmdldFR5cGUoKSk7CgpyZXR1cm4gJGluc3RhbGxlci0+dW5pbnN0YWxsKCRyZXBvLCAkcGFja2FnZSk7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBtYXJrQWxpYXNJbnN0YWxsZWQoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgTWFya0FsaWFzSW5zdGFsbGVkT3BlcmF0aW9uICRvcGVyYXRpb24pOiB2b2lkCnsKJHBhY2thZ2UgPSAkb3BlcmF0aW9uLT5nZXRQYWNrYWdlKCk7CgppZiAoISRyZXBvLT5oYXNQYWNrYWdlKCRwYWNrYWdlKSkgewokcmVwby0+YWRkUGFja2FnZShjbG9uZSAkcGFja2FnZSk7Cn0KfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG1hcmtBbGlhc1VuaW5zdGFsbGVkKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIE1hcmtBbGlhc1VuaW5zdGFsbGVkT3BlcmF0aW9uICRvcGVyYXRpb24pOiB2b2lkCnsKJHBhY2thZ2UgPSAkb3BlcmF0aW9uLT5nZXRQYWNrYWdlKCk7CgokcmVwby0+cmVtb3ZlUGFja2FnZSgkcGFja2FnZSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEluc3RhbGxQYXRoKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiA/c3RyaW5nCnsKJGluc3RhbGxlciA9ICR0aGlzLT5nZXRJbnN0YWxsZXIoJHBhY2thZ2UtPmdldFR5cGUoKSk7CgpyZXR1cm4gJGluc3RhbGxlci0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0T3V0cHV0UHJvZ3Jlc3MoYm9vbCAkb3V0cHV0UHJvZ3Jlc3MpOiB2b2lkCnsKJHRoaXMtPm91dHB1dFByb2dyZXNzID0gJG91dHB1dFByb2dyZXNzOwp9CgpwdWJsaWMgZnVuY3Rpb24gbm90aWZ5SW5zdGFsbHMoSU9JbnRlcmZhY2UgJGlvKTogdm9pZAp7CiRwcm9taXNlcyA9IFtdOwoKdHJ5IHsKZm9yZWFjaCAoJHRoaXMtPm5vdGlmaWFibGVQYWNrYWdlcyBhcyAkcmVwb1VybCA9PiAkcGFja2FnZXMpIHsKCmlmIChzdHJfY29udGFpbnMoJHJlcG9VcmwsICclcGFja2FnZSUnKSkgewpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJHVybCA9IHN0cl9yZXBsYWNlKCclcGFja2FnZSUnLCAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLCAkcmVwb1VybCk7CgokcGFyYW1zID0gWwondmVyc2lvbicgPT4gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKSwKJ3ZlcnNpb25fbm9ybWFsaXplZCcgPT4gJHBhY2thZ2UtPmdldFZlcnNpb24oKSwKXTsKJG9wdHMgPSBbCidyZXRyeS1hdXRoLWZhaWx1cmUnID0+IGZhbHNlLAonaHR0cCcgPT4gWwonbWV0aG9kJyA9PiAnUE9TVCcsCidoZWFkZXInID0+IFsnQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXSwKJ2NvbnRlbnQnID0+IGh0dHBfYnVpbGRfcXVlcnkoJHBhcmFtcywgJycsICcmJyksCid0aW1lb3V0JyA9PiAzLApdLApdOwoKJHByb21pc2VzW10gPSAkdGhpcy0+bG9vcC0+Z2V0SHR0cERvd25sb2FkZXIoKS0+YWRkKCR1cmwsICRvcHRzKTsKfQoKY29udGludWU7Cn0KCiRwb3N0RGF0YSA9IFsnZG93bmxvYWRzJyA9PiBbXV07CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewokcGFja2FnZU5vdGlmaWNhdGlvbiA9IFsKJ25hbWUnID0+ICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCksCid2ZXJzaW9uJyA9PiAkcGFja2FnZS0+Z2V0VmVyc2lvbigpLApdOwppZiAoc3RycG9zKCRyZXBvVXJsLCAncGFja2FnaXN0Lm9yZy8nKSAhPT0gZmFsc2UpIHsKaWYgKGlzc2V0KEZpbGVEb3dubG9hZGVyOjokZG93bmxvYWRNZXRhZGF0YVskcGFja2FnZS0+Z2V0TmFtZSgpXSkpIHsKJHBhY2thZ2VOb3RpZmljYXRpb25bJ2Rvd25sb2FkZWQnXSA9IEZpbGVEb3dubG9hZGVyOjokZG93bmxvYWRNZXRhZGF0YVskcGFja2FnZS0+Z2V0TmFtZSgpXTsKfSBlbHNlIHsKJHBhY2thZ2VOb3RpZmljYXRpb25bJ2Rvd25sb2FkZWQnXSA9IGZhbHNlOwp9Cn0KJHBvc3REYXRhWydkb3dubG9hZHMnXVtdID0gJHBhY2thZ2VOb3RpZmljYXRpb247Cn0KCiRvcHRzID0gWwoncmV0cnktYXV0aC1mYWlsdXJlJyA9PiBmYWxzZSwKJ2h0dHAnID0+IFsKJ21ldGhvZCcgPT4gJ1BPU1QnLAonaGVhZGVyJyA9PiBbJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbiddLAonY29udGVudCcgPT4ganNvbl9lbmNvZGUoJHBvc3REYXRhKSwKJ3RpbWVvdXQnID0+IDYsCl0sCl07CgokcHJvbWlzZXNbXSA9ICR0aGlzLT5sb29wLT5nZXRIdHRwRG93bmxvYWRlcigpLT5hZGQoJHJlcG9VcmwsICRvcHRzKTsKfQoKJHRoaXMtPmxvb3AtPndhaXQoJHByb21pc2VzKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewp9CgokdGhpcy0+cmVzZXQoKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBtYXJrRm9yTm90aWZpY2F0aW9uKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiB2b2lkCnsKaWYgKCRwYWNrYWdlLT5nZXROb3RpZmljYXRpb25VcmwoKSAhPT0gbnVsbCkgewokdGhpcy0+bm90aWZpYWJsZVBhY2thZ2VzWyRwYWNrYWdlLT5nZXROb3RpZmljYXRpb25VcmwoKV1bJHBhY2thZ2UtPmdldE5hbWUoKV0gPSAkcGFja2FnZTsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJ1bkNsZWFudXAoYXJyYXkgJGNsZWFudXBQcm9taXNlcyk6IHZvaWQKewokcHJvbWlzZXMgPSBbXTsKCiR0aGlzLT5sb29wLT5hYm9ydEpvYnMoKTsKCmZvcmVhY2ggKCRjbGVhbnVwUHJvbWlzZXMgYXMgJGNsZWFudXApIHsKJHByb21pc2VzW10gPSBuZXcgXFJlYWN0XFByb21pc2VcUHJvbWlzZShzdGF0aWMgZnVuY3Rpb24gKCRyZXNvbHZlKSB1c2UgKCRjbGVhbnVwKTogdm9pZCB7CiRwcm9taXNlID0gJGNsZWFudXAoKTsKaWYgKCEkcHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2VJbnRlcmZhY2UpIHsKJHJlc29sdmUobnVsbCk7Cn0gZWxzZSB7CiRwcm9taXNlLT50aGVuKHN0YXRpYyBmdW5jdGlvbiAoKSB1c2UgKCRyZXNvbHZlKTogdm9pZCB7CiRyZXNvbHZlKG51bGwpOwp9KTsKfQp9KTsKfQoKaWYgKGNvdW50KCRwcm9taXNlcykgPiAwKSB7CiR0aGlzLT5sb29wLT53YWl0KCRwcm9taXNlcyk7Cn0KfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxJbnN0YWxsZXI7Cgp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcVHJhbnNhY3Rpb247CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnQ7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKCmNsYXNzIEluc3RhbGxlckV2ZW50IGV4dGVuZHMgRXZlbnQKewoKCgpwcml2YXRlICRjb21wb3NlcjsKCgoKCnByaXZhdGUgJGlvOwoKCgoKcHJpdmF0ZSAkZGV2TW9kZTsKCgoKCnByaXZhdGUgJGV4ZWN1dGVPcGVyYXRpb25zOwoKCgoKcHJpdmF0ZSAkdHJhbnNhY3Rpb247CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRldmVudE5hbWUsIENvbXBvc2VyICRjb21wb3NlciwgSU9JbnRlcmZhY2UgJGlvLCBib29sICRkZXZNb2RlLCBib29sICRleGVjdXRlT3BlcmF0aW9ucywgVHJhbnNhY3Rpb24gJHRyYW5zYWN0aW9uKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJGV2ZW50TmFtZSk7CgokdGhpcy0+Y29tcG9zZXIgPSAkY29tcG9zZXI7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmRldk1vZGUgPSAkZGV2TW9kZTsKJHRoaXMtPmV4ZWN1dGVPcGVyYXRpb25zID0gJGV4ZWN1dGVPcGVyYXRpb25zOwokdGhpcy0+dHJhbnNhY3Rpb24gPSAkdHJhbnNhY3Rpb247Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21wb3NlcigpOiBDb21wb3Nlcgp7CnJldHVybiAkdGhpcy0+Y29tcG9zZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRJTygpOiBJT0ludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+aW87Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0Rldk1vZGUoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+ZGV2TW9kZTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzRXhlY3V0aW5nT3BlcmF0aW9ucygpOiBib29sCnsKcmV0dXJuICR0aGlzLT5leGVjdXRlT3BlcmF0aW9uczsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uKCk6ID9UcmFuc2FjdGlvbgp7CnJldHVybiAkdGhpcy0+dHJhbnNhY3Rpb247Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSW5zdGFsbGVyOwoKY2xhc3MgSW5zdGFsbGVyRXZlbnRzCnsKCgoKCgoKCgpwdWJsaWMgY29uc3QgUFJFX09QRVJBVElPTlNfRVhFQyA9ICdwcmUtb3BlcmF0aW9ucy1leGVjJzsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSW5zdGFsbGVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKCmludGVyZmFjZSBJbnN0YWxsZXJJbnRlcmZhY2UKewoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzdXBwb3J0cyhzdHJpbmcgJHBhY2thZ2VUeXBlKTsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzSW5zdGFsbGVkKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk7CgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwcmVwYXJlKHN0cmluZyAkdHlwZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk7CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbnN0YWxsKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOwoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB1cGRhdGUoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0KTsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHVuaW5zdGFsbChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTsKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYW51cChzdHJpbmcgJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5zdGFsbFBhdGgoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEluc3RhbGxlcjsKCnVzZSBDb21wb3NlclxDb21wb3NlcjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFydGlhbENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxTaWxlbmNlcjsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXERvd25sb2FkTWFuYWdlcjsKCgoKCgoKCmNsYXNzIExpYnJhcnlJbnN0YWxsZXIgaW1wbGVtZW50cyBJbnN0YWxsZXJJbnRlcmZhY2UsIEJpbmFyeVByZXNlbmNlSW50ZXJmYWNlCnsKCnByb3RlY3RlZCAkY29tcG9zZXI7Cgpwcm90ZWN0ZWQgJHZlbmRvckRpcjsKCnByb3RlY3RlZCAkZG93bmxvYWRNYW5hZ2VyOwoKcHJvdGVjdGVkICRpbzsKCnByb3RlY3RlZCAkdHlwZTsKCnByb3RlY3RlZCAkZmlsZXN5c3RlbTsKCnByb3RlY3RlZCAkYmluYXJ5SW5zdGFsbGVyOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgUGFydGlhbENvbXBvc2VyICRjb21wb3NlciwgP3N0cmluZyAkdHlwZSA9ICdsaWJyYXJ5JywgP0ZpbGVzeXN0ZW0gJGZpbGVzeXN0ZW0gPSBudWxsLCA/QmluYXJ5SW5zdGFsbGVyICRiaW5hcnlJbnN0YWxsZXIgPSBudWxsKQp7CiR0aGlzLT5jb21wb3NlciA9ICRjb21wb3NlcjsKJHRoaXMtPmRvd25sb2FkTWFuYWdlciA9ICRjb21wb3NlciBpbnN0YW5jZW9mIENvbXBvc2VyID8gJGNvbXBvc2VyLT5nZXREb3dubG9hZE1hbmFnZXIoKSA6IG51bGw7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPnR5cGUgPSAkdHlwZTsKCiR0aGlzLT5maWxlc3lzdGVtID0gJGZpbGVzeXN0ZW0gPzogbmV3IEZpbGVzeXN0ZW0oKTsKJHRoaXMtPnZlbmRvckRpciA9IHJ0cmltKCRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgndmVuZG9yLWRpcicpLCAnLycpOwokdGhpcy0+YmluYXJ5SW5zdGFsbGVyID0gJGJpbmFyeUluc3RhbGxlciA/OiBuZXcgQmluYXJ5SW5zdGFsbGVyKCR0aGlzLT5pbywgcnRyaW0oJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdiaW4tZGlyJyksICcvJyksICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgnYmluLWNvbXBhdCcpLCAkdGhpcy0+ZmlsZXN5c3RlbSwgJHRoaXMtPnZlbmRvckRpcik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzdXBwb3J0cyhzdHJpbmcgJHBhY2thZ2VUeXBlKQp7CnJldHVybiAkcGFja2FnZVR5cGUgPT09ICR0aGlzLT50eXBlIHx8IG51bGwgPT09ICR0aGlzLT50eXBlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNJbnN0YWxsZWQoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewppZiAoISRyZXBvLT5oYXNQYWNrYWdlKCRwYWNrYWdlKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRpbnN0YWxsUGF0aCA9ICR0aGlzLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CgppZiAoRmlsZXN5c3RlbTo6aXNSZWFkYWJsZSgkaW5zdGFsbFBhdGgpKSB7CnJldHVybiB0cnVlOwp9CgppZiAoUGxhdGZvcm06OmlzV2luZG93cygpICYmICR0aGlzLT5maWxlc3lzdGVtLT5pc0p1bmN0aW9uKCRpbnN0YWxsUGF0aCkpIHsKcmV0dXJuIHRydWU7Cn0KCmlmIChpc19saW5rKCRpbnN0YWxsUGF0aCkpIHsKaWYgKHJlYWxwYXRoKCRpbnN0YWxsUGF0aCkgPT09IGZhbHNlKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGRvd25sb2FkKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpCnsKJHRoaXMtPmluaXRpYWxpemVWZW5kb3JEaXIoKTsKJGRvd25sb2FkUGF0aCA9ICR0aGlzLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CgpyZXR1cm4gJHRoaXMtPmdldERvd25sb2FkTWFuYWdlcigpLT5kb3dubG9hZCgkcGFja2FnZSwgJGRvd25sb2FkUGF0aCwgJHByZXZQYWNrYWdlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHByZXBhcmUoJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpCnsKJHRoaXMtPmluaXRpYWxpemVWZW5kb3JEaXIoKTsKJGRvd25sb2FkUGF0aCA9ICR0aGlzLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CgpyZXR1cm4gJHRoaXMtPmdldERvd25sb2FkTWFuYWdlcigpLT5wcmVwYXJlKCR0eXBlLCAkcGFja2FnZSwgJGRvd25sb2FkUGF0aCwgJHByZXZQYWNrYWdlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNsZWFudXAoJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpCnsKJHRoaXMtPmluaXRpYWxpemVWZW5kb3JEaXIoKTsKJGRvd25sb2FkUGF0aCA9ICR0aGlzLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CgpyZXR1cm4gJHRoaXMtPmdldERvd25sb2FkTWFuYWdlcigpLT5jbGVhbnVwKCR0eXBlLCAkcGFja2FnZSwgJGRvd25sb2FkUGF0aCwgJHByZXZQYWNrYWdlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGluc3RhbGwoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewokdGhpcy0+aW5pdGlhbGl6ZVZlbmRvckRpcigpOwokZG93bmxvYWRQYXRoID0gJHRoaXMtPmdldEluc3RhbGxQYXRoKCRwYWNrYWdlKTsKCgppZiAoIUZpbGVzeXN0ZW06OmlzUmVhZGFibGUoJGRvd25sb2FkUGF0aCkgJiYgJHJlcG8tPmhhc1BhY2thZ2UoJHBhY2thZ2UpKSB7CiR0aGlzLT5iaW5hcnlJbnN0YWxsZXItPnJlbW92ZUJpbmFyaWVzKCRwYWNrYWdlKTsKfQoKJHByb21pc2UgPSAkdGhpcy0+aW5zdGFsbENvZGUoJHBhY2thZ2UpOwppZiAoISRwcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZUludGVyZmFjZSkgewokcHJvbWlzZSA9IFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCiRiaW5hcnlJbnN0YWxsZXIgPSAkdGhpcy0+YmluYXJ5SW5zdGFsbGVyOwokaW5zdGFsbFBhdGggPSAkdGhpcy0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwoKcmV0dXJuICRwcm9taXNlLT50aGVuKHN0YXRpYyBmdW5jdGlvbiAoKSB1c2UgKCRiaW5hcnlJbnN0YWxsZXIsICRpbnN0YWxsUGF0aCwgJHBhY2thZ2UsICRyZXBvKTogdm9pZCB7CiRiaW5hcnlJbnN0YWxsZXItPmluc3RhbGxCaW5hcmllcygkcGFja2FnZSwgJGluc3RhbGxQYXRoKTsKaWYgKCEkcmVwby0+aGFzUGFja2FnZSgkcGFja2FnZSkpIHsKJHJlcG8tPmFkZFBhY2thZ2UoY2xvbmUgJHBhY2thZ2UpOwp9Cn0pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdXBkYXRlKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJGluaXRpYWwsIFBhY2thZ2VJbnRlcmZhY2UgJHRhcmdldCkKewppZiAoISRyZXBvLT5oYXNQYWNrYWdlKCRpbml0aWFsKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUGFja2FnZSBpcyBub3QgaW5zdGFsbGVkOiAnLiRpbml0aWFsKTsKfQoKJHRoaXMtPmluaXRpYWxpemVWZW5kb3JEaXIoKTsKCiR0aGlzLT5iaW5hcnlJbnN0YWxsZXItPnJlbW92ZUJpbmFyaWVzKCRpbml0aWFsKTsKJHByb21pc2UgPSAkdGhpcy0+dXBkYXRlQ29kZSgkaW5pdGlhbCwgJHRhcmdldCk7CmlmICghJHByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlSW50ZXJmYWNlKSB7CiRwcm9taXNlID0gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKJGJpbmFyeUluc3RhbGxlciA9ICR0aGlzLT5iaW5hcnlJbnN0YWxsZXI7CiRpbnN0YWxsUGF0aCA9ICR0aGlzLT5nZXRJbnN0YWxsUGF0aCgkdGFyZ2V0KTsKCnJldHVybiAkcHJvbWlzZS0+dGhlbihzdGF0aWMgZnVuY3Rpb24gKCkgdXNlICgkYmluYXJ5SW5zdGFsbGVyLCAkaW5zdGFsbFBhdGgsICR0YXJnZXQsICRpbml0aWFsLCAkcmVwbyk6IHZvaWQgewokYmluYXJ5SW5zdGFsbGVyLT5pbnN0YWxsQmluYXJpZXMoJHRhcmdldCwgJGluc3RhbGxQYXRoKTsKJHJlcG8tPnJlbW92ZVBhY2thZ2UoJGluaXRpYWwpOwppZiAoISRyZXBvLT5oYXNQYWNrYWdlKCR0YXJnZXQpKSB7CiRyZXBvLT5hZGRQYWNrYWdlKGNsb25lICR0YXJnZXQpOwp9Cn0pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdW5pbnN0YWxsKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKaWYgKCEkcmVwby0+aGFzUGFja2FnZSgkcGFja2FnZSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1BhY2thZ2UgaXMgbm90IGluc3RhbGxlZDogJy4kcGFja2FnZSk7Cn0KCiRwcm9taXNlID0gJHRoaXMtPnJlbW92ZUNvZGUoJHBhY2thZ2UpOwppZiAoISRwcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZUludGVyZmFjZSkgewokcHJvbWlzZSA9IFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCiRiaW5hcnlJbnN0YWxsZXIgPSAkdGhpcy0+YmluYXJ5SW5zdGFsbGVyOwokZG93bmxvYWRQYXRoID0gJHRoaXMtPmdldFBhY2thZ2VCYXNlUGF0aCgkcGFja2FnZSk7CiRmaWxlc3lzdGVtID0gJHRoaXMtPmZpbGVzeXN0ZW07CgpyZXR1cm4gJHByb21pc2UtPnRoZW4oc3RhdGljIGZ1bmN0aW9uICgpIHVzZSAoJGJpbmFyeUluc3RhbGxlciwgJGZpbGVzeXN0ZW0sICRkb3dubG9hZFBhdGgsICRwYWNrYWdlLCAkcmVwbyk6IHZvaWQgewokYmluYXJ5SW5zdGFsbGVyLT5yZW1vdmVCaW5hcmllcygkcGFja2FnZSk7CiRyZXBvLT5yZW1vdmVQYWNrYWdlKCRwYWNrYWdlKTsKCmlmIChzdHJwb3MoJHBhY2thZ2UtPmdldE5hbWUoKSwgJy8nKSkgewokcGFja2FnZVZlbmRvckRpciA9IGRpcm5hbWUoJGRvd25sb2FkUGF0aCk7CmlmIChpc19kaXIoJHBhY2thZ2VWZW5kb3JEaXIpICYmICRmaWxlc3lzdGVtLT5pc0RpckVtcHR5KCRwYWNrYWdlVmVuZG9yRGlyKSkgewpTaWxlbmNlcjo6Y2FsbCgncm1kaXInLCAkcGFja2FnZVZlbmRvckRpcik7Cn0KfQp9KTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5zdGFsbFBhdGgoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewokdGhpcy0+aW5pdGlhbGl6ZVZlbmRvckRpcigpOwoKJGJhc2VQYXRoID0gKCR0aGlzLT52ZW5kb3JEaXIgPyAkdGhpcy0+dmVuZG9yRGlyLicvJyA6ICcnKSAuICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCk7CiR0YXJnZXREaXIgPSAkcGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCk7CgpyZXR1cm4gJGJhc2VQYXRoIC4gKCR0YXJnZXREaXIgPyAnLycuJHRhcmdldERpciA6ICcnKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZW5zdXJlQmluYXJpZXNQcmVzZW5jZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CiR0aGlzLT5iaW5hcnlJbnN0YWxsZXItPmluc3RhbGxCaW5hcmllcygkcGFja2FnZSwgJHRoaXMtPmdldEluc3RhbGxQYXRoKCRwYWNrYWdlKSwgZmFsc2UpOwp9CgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRQYWNrYWdlQmFzZVBhdGgoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewokaW5zdGFsbFBhdGggPSAkdGhpcy0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwokdGFyZ2V0RGlyID0gJHBhY2thZ2UtPmdldFRhcmdldERpcigpOwoKaWYgKCR0YXJnZXREaXIpIHsKcmV0dXJuIFByZWc6OnJlcGxhY2UoJ3svKicuc3RyX3JlcGxhY2UoJy8nLCAnLysnLCBwcmVnX3F1b3RlKCR0YXJnZXREaXIpKS4nLz8kfScsICcnLCAkaW5zdGFsbFBhdGgpOwp9CgpyZXR1cm4gJGluc3RhbGxQYXRoOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluc3RhbGxDb2RlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKJGRvd25sb2FkUGF0aCA9ICR0aGlzLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CgpyZXR1cm4gJHRoaXMtPmdldERvd25sb2FkTWFuYWdlcigpLT5pbnN0YWxsKCRwYWNrYWdlLCAkZG93bmxvYWRQYXRoKTsKfQoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB1cGRhdGVDb2RlKFBhY2thZ2VJbnRlcmZhY2UgJGluaXRpYWwsIFBhY2thZ2VJbnRlcmZhY2UgJHRhcmdldCkKewokaW5pdGlhbERvd25sb2FkUGF0aCA9ICR0aGlzLT5nZXRJbnN0YWxsUGF0aCgkaW5pdGlhbCk7CiR0YXJnZXREb3dubG9hZFBhdGggPSAkdGhpcy0+Z2V0SW5zdGFsbFBhdGgoJHRhcmdldCk7CmlmICgkdGFyZ2V0RG93bmxvYWRQYXRoICE9PSAkaW5pdGlhbERvd25sb2FkUGF0aCkgewoKCmlmIChzdHJwb3MoJGluaXRpYWxEb3dubG9hZFBhdGgsICR0YXJnZXREb3dubG9hZFBhdGgpID09PSAwCnx8IHN0cnBvcygkdGFyZ2V0RG93bmxvYWRQYXRoLCAkaW5pdGlhbERvd25sb2FkUGF0aCkgPT09IDAKKSB7CiRwcm9taXNlID0gJHRoaXMtPnJlbW92ZUNvZGUoJGluaXRpYWwpOwppZiAoISRwcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZUludGVyZmFjZSkgewokcHJvbWlzZSA9IFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCnJldHVybiAkcHJvbWlzZS0+dGhlbihmdW5jdGlvbiAoKSB1c2UgKCR0YXJnZXQpOiBQcm9taXNlSW50ZXJmYWNlIHsKJHByb21pc2UgPSAkdGhpcy0+aW5zdGFsbENvZGUoJHRhcmdldCk7CmlmICgkcHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2VJbnRlcmZhY2UpIHsKcmV0dXJuICRwcm9taXNlOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfSk7Cn0KCiR0aGlzLT5maWxlc3lzdGVtLT5yZW5hbWUoJGluaXRpYWxEb3dubG9hZFBhdGgsICR0YXJnZXREb3dubG9hZFBhdGgpOwp9CgpyZXR1cm4gJHRoaXMtPmdldERvd25sb2FkTWFuYWdlcigpLT51cGRhdGUoJGluaXRpYWwsICR0YXJnZXQsICR0YXJnZXREb3dubG9hZFBhdGgpOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHJlbW92ZUNvZGUoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewokZG93bmxvYWRQYXRoID0gJHRoaXMtPmdldFBhY2thZ2VCYXNlUGF0aCgkcGFja2FnZSk7CgpyZXR1cm4gJHRoaXMtPmdldERvd25sb2FkTWFuYWdlcigpLT5yZW1vdmUoJHBhY2thZ2UsICRkb3dubG9hZFBhdGgpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdGlhbGl6ZVZlbmRvckRpcigpCnsKJHRoaXMtPmZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkdGhpcy0+dmVuZG9yRGlyKTsKJHRoaXMtPnZlbmRvckRpciA9IHJlYWxwYXRoKCR0aGlzLT52ZW5kb3JEaXIpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0RG93bmxvYWRNYW5hZ2VyKCk6IERvd25sb2FkTWFuYWdlcgp7CmFzc2VydCgkdGhpcy0+ZG93bmxvYWRNYW5hZ2VyIGluc3RhbmNlb2YgRG93bmxvYWRNYW5hZ2VyLCBuZXcgXExvZ2ljRXhjZXB0aW9uKHNlbGY6OmNsYXNzLicgc2hvdWxkIGJlIGluaXRpYWxpemVkIHdpdGggYSBmdWxseSBsb2FkZWQgQ29tcG9zZXIgaW5zdGFuY2UgdG8gYmUgYWJsZSB0byBpbnN0YWxsLy4uLiBwYWNrYWdlcycpKTsKCnJldHVybiAkdGhpcy0+ZG93bmxvYWRNYW5hZ2VyOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEluc3RhbGxlcjsKCnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cVXBkYXRlT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxJbnN0YWxsT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxVbmluc3RhbGxPcGVyYXRpb247CgoKCgoKCmNsYXNzIE1ldGFwYWNrYWdlSW5zdGFsbGVyIGltcGxlbWVudHMgSW5zdGFsbGVySW50ZXJmYWNlCnsKCnByaXZhdGUgJGlvOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbykKewokdGhpcy0+aW8gPSAkaW87Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzdXBwb3J0cyhzdHJpbmcgJHBhY2thZ2VUeXBlKQp7CnJldHVybiAkcGFja2FnZVR5cGUgPT09ICdtZXRhcGFja2FnZSc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0luc3RhbGxlZChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CnJldHVybiAkcmVwby0+aGFzUGFja2FnZSgkcGFja2FnZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBkb3dubG9hZChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKQp7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHByZXBhcmUoJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpCnsKCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYW51cCgkdHlwZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCkKewoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpbnN0YWxsKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgIC0gIiAuIEluc3RhbGxPcGVyYXRpb246OmZvcm1hdCgkcGFja2FnZSkpOwoKJHJlcG8tPmFkZFBhY2thZ2UoY2xvbmUgJHBhY2thZ2UpOwoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB1cGRhdGUoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0KQp7CmlmICghJHJlcG8tPmhhc1BhY2thZ2UoJGluaXRpYWwpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQ6ICcuJGluaXRpYWwpOwp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiAgLSAiIC4gVXBkYXRlT3BlcmF0aW9uOjpmb3JtYXQoJGluaXRpYWwsICR0YXJnZXQpKTsKCiRyZXBvLT5yZW1vdmVQYWNrYWdlKCRpbml0aWFsKTsKJHJlcG8tPmFkZFBhY2thZ2UoY2xvbmUgJHRhcmdldCk7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHVuaW5zdGFsbChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CmlmICghJHJlcG8tPmhhc1BhY2thZ2UoJHBhY2thZ2UpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQ6ICcuJHBhY2thZ2UpOwp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiAgLSAiIC4gVW5pbnN0YWxsT3BlcmF0aW9uOjpmb3JtYXQoJHBhY2thZ2UpKTsKCiRyZXBvLT5yZW1vdmVQYWNrYWdlKCRwYWNrYWdlKTsKCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJbnN0YWxsUGF0aChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CnJldHVybiBudWxsOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEluc3RhbGxlcjsKCnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CgoKCgoKCgoKY2xhc3MgTm9vcEluc3RhbGxlciBpbXBsZW1lbnRzIEluc3RhbGxlckludGVyZmFjZQp7CgoKCnB1YmxpYyBmdW5jdGlvbiBzdXBwb3J0cyhzdHJpbmcgJHBhY2thZ2VUeXBlKQp7CnJldHVybiB0cnVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNJbnN0YWxsZWQoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewpyZXR1cm4gJHJlcG8tPmhhc1BhY2thZ2UoJHBhY2thZ2UpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCkKewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHByZXBhcmUoJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpCnsKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjbGVhbnVwKCR0eXBlLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKQp7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5zdGFsbChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CmlmICghJHJlcG8tPmhhc1BhY2thZ2UoJHBhY2thZ2UpKSB7CiRyZXBvLT5hZGRQYWNrYWdlKGNsb25lICRwYWNrYWdlKTsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB1cGRhdGUoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0KQp7CmlmICghJHJlcG8tPmhhc1BhY2thZ2UoJGluaXRpYWwpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQ6ICcuJGluaXRpYWwpOwp9CgokcmVwby0+cmVtb3ZlUGFja2FnZSgkaW5pdGlhbCk7CmlmICghJHJlcG8tPmhhc1BhY2thZ2UoJHRhcmdldCkpIHsKJHJlcG8tPmFkZFBhY2thZ2UoY2xvbmUgJHRhcmdldCk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdW5pbnN0YWxsKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKaWYgKCEkcmVwby0+aGFzUGFja2FnZSgkcGFja2FnZSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1BhY2thZ2UgaXMgbm90IGluc3RhbGxlZDogJy4kcGFja2FnZSk7Cn0KJHJlcG8tPnJlbW92ZVBhY2thZ2UoJHBhY2thZ2UpOwoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJbnN0YWxsUGF0aChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CiR0YXJnZXREaXIgPSAkcGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCk7CgpyZXR1cm4gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKSAuICgkdGFyZ2V0RGlyID8gJy8nLiR0YXJnZXREaXIgOiAnJyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSW5zdGFsbGVyOwoKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXE9wZXJhdGlvbkludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudDsKCgoKCgoKY2xhc3MgUGFja2FnZUV2ZW50IGV4dGVuZHMgRXZlbnQKewoKCgpwcml2YXRlICRjb21wb3NlcjsKCgoKCnByaXZhdGUgJGlvOwoKCgoKcHJpdmF0ZSAkZGV2TW9kZTsKCgoKCnByaXZhdGUgJGxvY2FsUmVwbzsKCgoKCnByaXZhdGUgJG9wZXJhdGlvbnM7CgoKCgpwcml2YXRlICRvcGVyYXRpb247CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJGV2ZW50TmFtZSwgQ29tcG9zZXIgJGNvbXBvc2VyLCBJT0ludGVyZmFjZSAkaW8sIGJvb2wgJGRldk1vZGUsIFJlcG9zaXRvcnlJbnRlcmZhY2UgJGxvY2FsUmVwbywgYXJyYXkgJG9wZXJhdGlvbnMsIE9wZXJhdGlvbkludGVyZmFjZSAkb3BlcmF0aW9uKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJGV2ZW50TmFtZSk7CgokdGhpcy0+Y29tcG9zZXIgPSAkY29tcG9zZXI7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmRldk1vZGUgPSAkZGV2TW9kZTsKJHRoaXMtPmxvY2FsUmVwbyA9ICRsb2NhbFJlcG87CiR0aGlzLT5vcGVyYXRpb25zID0gJG9wZXJhdGlvbnM7CiR0aGlzLT5vcGVyYXRpb24gPSAkb3BlcmF0aW9uOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tcG9zZXIoKTogQ29tcG9zZXIKewpyZXR1cm4gJHRoaXMtPmNvbXBvc2VyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SU8oKTogSU9JbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmlvOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNEZXZNb2RlKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmRldk1vZGU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRMb2NhbFJlcG8oKTogUmVwb3NpdG9yeUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+bG9jYWxSZXBvOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3BlcmF0aW9ucygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+b3BlcmF0aW9uczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE9wZXJhdGlvbigpOiBPcGVyYXRpb25JbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPm9wZXJhdGlvbjsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxJbnN0YWxsZXI7CgoKCgoKCmNsYXNzIFBhY2thZ2VFdmVudHMKewoKCgoKCgoKcHVibGljIGNvbnN0IFBSRV9QQUNLQUdFX0lOU1RBTEwgPSAncHJlLXBhY2thZ2UtaW5zdGFsbCc7CgoKCgoKCgoKcHVibGljIGNvbnN0IFBPU1RfUEFDS0FHRV9JTlNUQUxMID0gJ3Bvc3QtcGFja2FnZS1pbnN0YWxsJzsKCgoKCgoKCgpwdWJsaWMgY29uc3QgUFJFX1BBQ0tBR0VfVVBEQVRFID0gJ3ByZS1wYWNrYWdlLXVwZGF0ZSc7CgoKCgoKCgoKcHVibGljIGNvbnN0IFBPU1RfUEFDS0FHRV9VUERBVEUgPSAncG9zdC1wYWNrYWdlLXVwZGF0ZSc7CgoKCgoKCgoKcHVibGljIGNvbnN0IFBSRV9QQUNLQUdFX1VOSU5TVEFMTCA9ICdwcmUtcGFja2FnZS11bmluc3RhbGwnOwoKCgoKCgoKCnB1YmxpYyBjb25zdCBQT1NUX1BBQ0tBR0VfVU5JTlNUQUxMID0gJ3Bvc3QtcGFja2FnZS11bmluc3RhbGwnOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxJbnN0YWxsZXI7Cgp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhcnRpYWxDb21wb3NlcjsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5NYW5hZ2VyOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKCmNsYXNzIFBsdWdpbkluc3RhbGxlciBleHRlbmRzIExpYnJhcnlJbnN0YWxsZXIKewpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBQYXJ0aWFsQ29tcG9zZXIgJGNvbXBvc2VyLCA/RmlsZXN5c3RlbSAkZnMgPSBudWxsLCA/QmluYXJ5SW5zdGFsbGVyICRiaW5hcnlJbnN0YWxsZXIgPSBudWxsKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJGlvLCAkY29tcG9zZXIsICdjb21wb3Nlci1wbHVnaW4nLCAkZnMsICRiaW5hcnlJbnN0YWxsZXIpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc3VwcG9ydHMoc3RyaW5nICRwYWNrYWdlVHlwZSkKewpyZXR1cm4gJHBhY2thZ2VUeXBlID09PSAnY29tcG9zZXItcGx1Z2luJyB8fCAkcGFja2FnZVR5cGUgPT09ICdjb21wb3Nlci1pbnN0YWxsZXInOwp9CgpwdWJsaWMgZnVuY3Rpb24gZGlzYWJsZVBsdWdpbnMoKTogdm9pZAp7CiR0aGlzLT5nZXRQbHVnaW5NYW5hZ2VyKCktPmRpc2FibGVQbHVnaW5zKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBwcmVwYXJlKCR0eXBlLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKQp7CgppZiAoKCR0eXBlID09PSAnaW5zdGFsbCcgfHwgJHR5cGUgPT09ICd1cGRhdGUnKSAmJiAhJHRoaXMtPmdldFBsdWdpbk1hbmFnZXIoKS0+YXJlUGx1Z2luc0Rpc2FibGVkKCdsb2NhbCcpKSB7CiR0aGlzLT5nZXRQbHVnaW5NYW5hZ2VyKCktPmlzUGx1Z2luQWxsb3dlZCgkcGFja2FnZS0+Z2V0TmFtZSgpLCBmYWxzZSwgdHJ1ZSA9PT0gKCRwYWNrYWdlLT5nZXRFeHRyYSgpWydwbHVnaW4tb3B0aW9uYWwnXSA/PyBmYWxzZSkpOwp9CgpyZXR1cm4gcGFyZW50OjpwcmVwYXJlKCR0eXBlLCAkcGFja2FnZSwgJHByZXZQYWNrYWdlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGRvd25sb2FkKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpCnsKJGV4dHJhID0gJHBhY2thZ2UtPmdldEV4dHJhKCk7CmlmIChlbXB0eSgkZXh0cmFbJ2NsYXNzJ10pKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdFcnJvciB3aGlsZSBpbnN0YWxsaW5nICcuJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nLCBjb21wb3Nlci1wbHVnaW4gcGFja2FnZXMgc2hvdWxkIGhhdmUgYSBjbGFzcyBkZWZpbmVkIGluIHRoZWlyIGV4dHJhIGtleSB0byBiZSB1c2FibGUuJyk7Cn0KCnJldHVybiBwYXJlbnQ6OmRvd25sb2FkKCRwYWNrYWdlLCAkcHJldlBhY2thZ2UpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5zdGFsbChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CiRwcm9taXNlID0gcGFyZW50OjppbnN0YWxsKCRyZXBvLCAkcGFja2FnZSk7CmlmICghJHByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlSW50ZXJmYWNlKSB7CiRwcm9taXNlID0gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKcmV0dXJuICRwcm9taXNlLT50aGVuKGZ1bmN0aW9uICgpIHVzZSAoJHBhY2thZ2UsICRyZXBvKTogdm9pZCB7CnRyeSB7ClBsYXRmb3JtOjp3b3JrYXJvdW5kRmlsZXN5c3RlbUlzc3VlcygpOwokdGhpcy0+Z2V0UGx1Z2luTWFuYWdlcigpLT5yZWdpc3RlclBhY2thZ2UoJHBhY2thZ2UsIHRydWUpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5yb2xsYmFja0luc3RhbGwoJGUsICRyZXBvLCAkcGFja2FnZSk7Cn0KfSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB1cGRhdGUoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0KQp7CiRwcm9taXNlID0gcGFyZW50Ojp1cGRhdGUoJHJlcG8sICRpbml0aWFsLCAkdGFyZ2V0KTsKaWYgKCEkcHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2VJbnRlcmZhY2UpIHsKJHByb21pc2UgPSBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgpyZXR1cm4gJHByb21pc2UtPnRoZW4oZnVuY3Rpb24gKCkgdXNlICgkaW5pdGlhbCwgJHRhcmdldCwgJHJlcG8pOiB2b2lkIHsKdHJ5IHsKUGxhdGZvcm06Ondvcmthcm91bmRGaWxlc3lzdGVtSXNzdWVzKCk7CiR0aGlzLT5nZXRQbHVnaW5NYW5hZ2VyKCktPmRlYWN0aXZhdGVQYWNrYWdlKCRpbml0aWFsKTsKJHRoaXMtPmdldFBsdWdpbk1hbmFnZXIoKS0+cmVnaXN0ZXJQYWNrYWdlKCR0YXJnZXQsIHRydWUpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5yb2xsYmFja0luc3RhbGwoJGUsICRyZXBvLCAkdGFyZ2V0KTsKfQp9KTsKfQoKcHVibGljIGZ1bmN0aW9uIHVuaW5zdGFsbChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CiR0aGlzLT5nZXRQbHVnaW5NYW5hZ2VyKCktPnVuaW5zdGFsbFBhY2thZ2UoJHBhY2thZ2UpOwoKcmV0dXJuIHBhcmVudDo6dW5pbnN0YWxsKCRyZXBvLCAkcGFja2FnZSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gcm9sbGJhY2tJbnN0YWxsKFxFeGNlcHRpb24gJGUsIEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiB2b2lkCnsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdQbHVnaW4gaW5pdGlhbGl6YXRpb24gZmFpbGVkICgnLiRlLT5nZXRNZXNzYWdlKCkuJyksIHVuaW5zdGFsbGluZyBwbHVnaW4nKTsKcGFyZW50Ojp1bmluc3RhbGwoJHJlcG8sICRwYWNrYWdlKTsKdGhyb3cgJGU7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRQbHVnaW5NYW5hZ2VyKCk6IFBsdWdpbk1hbmFnZXIKewphc3NlcnQoJHRoaXMtPmNvbXBvc2VyIGluc3RhbmNlb2YgQ29tcG9zZXIsIG5ldyBcTG9naWNFeGNlcHRpb24oc2VsZjo6Y2xhc3MuJyBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIGZ1bGx5IGxvYWRlZCBDb21wb3NlciBpbnN0YW5jZS4nKSk7CiRwbHVnaW5NYW5hZ2VyID0gJHRoaXMtPmNvbXBvc2VyLT5nZXRQbHVnaW5NYW5hZ2VyKCk7CgpyZXR1cm4gJHBsdWdpbk1hbmFnZXI7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSW5zdGFsbGVyOwoKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcRG93bmxvYWRNYW5hZ2VyOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwoKCgoKCgoKY2xhc3MgUHJvamVjdEluc3RhbGxlciBpbXBsZW1lbnRzIEluc3RhbGxlckludGVyZmFjZQp7Cgpwcml2YXRlICRpbnN0YWxsUGF0aDsKCnByaXZhdGUgJGRvd25sb2FkTWFuYWdlcjsKCnByaXZhdGUgJGZpbGVzeXN0ZW07CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRpbnN0YWxsUGF0aCwgRG93bmxvYWRNYW5hZ2VyICRkbSwgRmlsZXN5c3RlbSAkZnMpCnsKJHRoaXMtPmluc3RhbGxQYXRoID0gcnRyaW0oc3RydHIoJGluc3RhbGxQYXRoLCAnXFwnLCAnLycpLCAnLycpLicvJzsKJHRoaXMtPmRvd25sb2FkTWFuYWdlciA9ICRkbTsKJHRoaXMtPmZpbGVzeXN0ZW0gPSAkZnM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzdXBwb3J0cyhzdHJpbmcgJHBhY2thZ2VUeXBlKTogYm9vbAp7CnJldHVybiB0cnVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNJbnN0YWxsZWQoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IGJvb2wKewpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBkb3dubG9hZChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogP1Byb21pc2VJbnRlcmZhY2UKewokaW5zdGFsbFBhdGggPSAkdGhpcy0+aW5zdGFsbFBhdGg7CmlmIChmaWxlX2V4aXN0cygkaW5zdGFsbFBhdGgpICYmICEkdGhpcy0+ZmlsZXN5c3RlbS0+aXNEaXJFbXB0eSgkaW5zdGFsbFBhdGgpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9qZWN0IGRpcmVjdG9yeSAkaW5zdGFsbFBhdGggaXMgbm90IGVtcHR5LiIpOwp9CmlmICghaXNfZGlyKCRpbnN0YWxsUGF0aCkpIHsKbWtkaXIoJGluc3RhbGxQYXRoLCAwNzc3LCB0cnVlKTsKfQoKcmV0dXJuICR0aGlzLT5kb3dubG9hZE1hbmFnZXItPmRvd25sb2FkKCRwYWNrYWdlLCAkaW5zdGFsbFBhdGgsICRwcmV2UGFja2FnZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBwcmVwYXJlKCR0eXBlLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogP1Byb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmRvd25sb2FkTWFuYWdlci0+cHJlcGFyZSgkdHlwZSwgJHBhY2thZ2UsICR0aGlzLT5pbnN0YWxsUGF0aCwgJHByZXZQYWNrYWdlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNsZWFudXAoJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiA/UHJvbWlzZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+ZG93bmxvYWRNYW5hZ2VyLT5jbGVhbnVwKCR0eXBlLCAkcGFja2FnZSwgJHRoaXMtPmluc3RhbGxQYXRoLCAkcHJldlBhY2thZ2UpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5zdGFsbChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogP1Byb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmRvd25sb2FkTWFuYWdlci0+aW5zdGFsbCgkcGFja2FnZSwgJHRoaXMtPmluc3RhbGxQYXRoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHVwZGF0ZShJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRpbml0aWFsLCBQYWNrYWdlSW50ZXJmYWNlICR0YXJnZXQpOiA/UHJvbWlzZUludGVyZmFjZQp7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJub3Qgc3VwcG9ydGVkIik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB1bmluc3RhbGwoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6ID9Qcm9taXNlSW50ZXJmYWNlCnsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIm5vdCBzdXBwb3J0ZWQiKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5zdGFsbFBhdGgoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+aW5zdGFsbFBhdGg7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSW5zdGFsbGVyOwoKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyOwoKCgoKCgpjbGFzcyBTdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyCnsKcHVibGljIGNvbnN0IE1PREVfTElTVCA9IDE7CnB1YmxpYyBjb25zdCBNT0RFX0JZX1BBQ0tBR0UgPSAyOwpwdWJsaWMgY29uc3QgTU9ERV9CWV9TVUdHRVNUSU9OID0gNDsKCgoKCnByb3RlY3RlZCAkc3VnZ2VzdGVkUGFja2FnZXMgPSBbXTsKCgoKCnByaXZhdGUgJGlvOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbykKewokdGhpcy0+aW8gPSAkaW87Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWNrYWdlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+c3VnZ2VzdGVkUGFja2FnZXM7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkUGFja2FnZShzdHJpbmcgJHNvdXJjZSwgc3RyaW5nICR0YXJnZXQsIHN0cmluZyAkcmVhc29uKTogU3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlcgp7CiR0aGlzLT5zdWdnZXN0ZWRQYWNrYWdlc1tdID0gWwonc291cmNlJyA9PiAkc291cmNlLAondGFyZ2V0JyA9PiAkdGFyZ2V0LAoncmVhc29uJyA9PiAkcmVhc29uLApdOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkU3VnZ2VzdGlvbnNGcm9tUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogU3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlcgp7CiRzb3VyY2UgPSAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpOwpmb3JlYWNoICgkcGFja2FnZS0+Z2V0U3VnZ2VzdHMoKSBhcyAkdGFyZ2V0ID0+ICRyZWFzb24pIHsKJHRoaXMtPmFkZFBhY2thZ2UoCiRzb3VyY2UsCiR0YXJnZXQsCiRyZWFzb24KKTsKfQoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gb3V0cHV0KGludCAkbW9kZSwgP0luc3RhbGxlZFJlcG9zaXRvcnkgJGluc3RhbGxlZFJlcG8gPSBudWxsLCA/UGFja2FnZUludGVyZmFjZSAkb25seURlcGVuZGVudHNPZiA9IG51bGwpOiB2b2lkCnsKJHN1Z2dlc3RlZFBhY2thZ2VzID0gJHRoaXMtPmdldEZpbHRlcmVkU3VnZ2VzdGlvbnMoJGluc3RhbGxlZFJlcG8sICRvbmx5RGVwZW5kZW50c09mKTsKCiRzdWdnZXN0ZXJzID0gW107CiRzdWdnZXN0ZWQgPSBbXTsKZm9yZWFjaCAoJHN1Z2dlc3RlZFBhY2thZ2VzIGFzICRzdWdnZXN0aW9uKSB7CiRzdWdnZXN0ZXJzWyRzdWdnZXN0aW9uWydzb3VyY2UnXV1bJHN1Z2dlc3Rpb25bJ3RhcmdldCddXSA9ICRzdWdnZXN0aW9uWydyZWFzb24nXTsKJHN1Z2dlc3RlZFskc3VnZ2VzdGlvblsndGFyZ2V0J11dWyRzdWdnZXN0aW9uWydzb3VyY2UnXV0gPSAkc3VnZ2VzdGlvblsncmVhc29uJ107Cn0Ka3NvcnQoJHN1Z2dlc3RlcnMpOwprc29ydCgkc3VnZ2VzdGVkKTsKCgppZiAoJG1vZGUgJiBzZWxmOjpNT0RFX0xJU1QpIHsKZm9yZWFjaCAoYXJyYXlfa2V5cygkc3VnZ2VzdGVkKSBhcyAkbmFtZSkgewokdGhpcy0+aW8tPndyaXRlKHNwcmludGYoJzxpbmZvPiVzPC9pbmZvPicsICRuYW1lKSk7Cn0KCnJldHVybjsKfQoKCmlmICgkbW9kZSAmIHNlbGY6Ok1PREVfQllfUEFDS0FHRSkgewpmb3JlYWNoICgkc3VnZ2VzdGVycyBhcyAkc3VnZ2VzdGVyID0+ICRzdWdnZXN0aW9ucykgewokdGhpcy0+aW8tPndyaXRlKHNwcmludGYoJzxjb21tZW50PiVzPC9jb21tZW50PiBzdWdnZXN0czonLCAkc3VnZ2VzdGVyKSk7Cgpmb3JlYWNoICgkc3VnZ2VzdGlvbnMgYXMgJHN1Z2dlc3Rpb24gPT4gJHJlYXNvbikgewokdGhpcy0+aW8tPndyaXRlKHNwcmludGYoJyAtIDxpbmZvPiVzPC9pbmZvPicgLiAoJHJlYXNvbiA/ICc6ICVzJyA6ICcnKSwgJHN1Z2dlc3Rpb24sICR0aGlzLT5lc2NhcGVPdXRwdXQoJHJlYXNvbikpKTsKfQokdGhpcy0+aW8tPndyaXRlKCcnKTsKfQp9CgoKaWYgKCRtb2RlICYgc2VsZjo6TU9ERV9CWV9TVUdHRVNUSU9OKSB7CgppZiAoJG1vZGUgJiBzZWxmOjpNT0RFX0JZX1BBQ0tBR0UpIHsKJHRoaXMtPmlvLT53cml0ZShzdHJfcmVwZWF0KCctJywgNzgpKTsKfQpmb3JlYWNoICgkc3VnZ2VzdGVkIGFzICRzdWdnZXN0aW9uID0+ICRzdWdnZXN0ZXJzKSB7CiR0aGlzLT5pby0+d3JpdGUoc3ByaW50ZignPGNvbW1lbnQ+JXM8L2NvbW1lbnQ+IGlzIHN1Z2dlc3RlZCBieTonLCAkc3VnZ2VzdGlvbikpOwoKZm9yZWFjaCAoJHN1Z2dlc3RlcnMgYXMgJHN1Z2dlc3RlciA9PiAkcmVhc29uKSB7CiR0aGlzLT5pby0+d3JpdGUoc3ByaW50ZignIC0gPGluZm8+JXM8L2luZm8+JyAuICgkcmVhc29uID8gJzogJXMnIDogJycpLCAkc3VnZ2VzdGVyLCAkdGhpcy0+ZXNjYXBlT3V0cHV0KCRyZWFzb24pKSk7Cn0KJHRoaXMtPmlvLT53cml0ZSgnJyk7Cn0KfQoKaWYgKCRvbmx5RGVwZW5kZW50c09mKSB7CiRhbGxTdWdnZXN0ZWRQYWNrYWdlcyA9ICR0aGlzLT5nZXRGaWx0ZXJlZFN1Z2dlc3Rpb25zKCRpbnN0YWxsZWRSZXBvKTsKJGRpZmYgPSBjb3VudCgkYWxsU3VnZ2VzdGVkUGFja2FnZXMpIC0gY291bnQoJHN1Z2dlc3RlZFBhY2thZ2VzKTsKaWYgKCRkaWZmKSB7CiR0aGlzLT5pby0+d3JpdGUoJzxpbmZvPicuJGRpZmYuJyBhZGRpdGlvbmFsIHN1Z2dlc3Rpb25zPC9pbmZvPiBieSB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcyBjYW4gYmUgc2hvd24gd2l0aCA8aW5mbz4tLWFsbDwvaW5mbz4nKTsKfQp9Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBvdXRwdXRNaW5pbWFsaXN0aWMoP0luc3RhbGxlZFJlcG9zaXRvcnkgJGluc3RhbGxlZFJlcG8gPSBudWxsLCA/UGFja2FnZUludGVyZmFjZSAkb25seURlcGVuZGVudHNPZiA9IG51bGwpOiB2b2lkCnsKJHN1Z2dlc3RlZFBhY2thZ2VzID0gJHRoaXMtPmdldEZpbHRlcmVkU3VnZ2VzdGlvbnMoJGluc3RhbGxlZFJlcG8sICRvbmx5RGVwZW5kZW50c09mKTsKaWYgKCRzdWdnZXN0ZWRQYWNrYWdlcykgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxpbmZvPicuY291bnQoJHN1Z2dlc3RlZFBhY2thZ2VzKS4nIHBhY2thZ2Ugc3VnZ2VzdGlvbnMgd2VyZSBhZGRlZCBieSBuZXcgZGVwZW5kZW5jaWVzLCB1c2UgYGNvbXBvc2VyIHN1Z2dlc3RgIHRvIHNlZSBkZXRhaWxzLjwvaW5mbz4nKTsKfQp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0RmlsdGVyZWRTdWdnZXN0aW9ucyg/SW5zdGFsbGVkUmVwb3NpdG9yeSAkaW5zdGFsbGVkUmVwbyA9IG51bGwsID9QYWNrYWdlSW50ZXJmYWNlICRvbmx5RGVwZW5kZW50c09mID0gbnVsbCk6IGFycmF5CnsKJHN1Z2dlc3RlZFBhY2thZ2VzID0gJHRoaXMtPmdldFBhY2thZ2VzKCk7CiRpbnN0YWxsZWROYW1lcyA9IFtdOwppZiAobnVsbCAhPT0gJGluc3RhbGxlZFJlcG8gJiYgIWVtcHR5KCRzdWdnZXN0ZWRQYWNrYWdlcykpIHsKZm9yZWFjaCAoJGluc3RhbGxlZFJlcG8tPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKJGluc3RhbGxlZE5hbWVzID0gYXJyYXlfbWVyZ2UoCiRpbnN0YWxsZWROYW1lcywKJHBhY2thZ2UtPmdldE5hbWVzKCkKKTsKfQp9Cgokc291cmNlRmlsdGVyID0gW107CmlmICgkb25seURlcGVuZGVudHNPZikgewokc291cmNlRmlsdGVyID0gYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGxpbmspOiBzdHJpbmcgewpyZXR1cm4gJGxpbmstPmdldFRhcmdldCgpOwp9LCBhcnJheV9tZXJnZSgkb25seURlcGVuZGVudHNPZi0+Z2V0UmVxdWlyZXMoKSwgJG9ubHlEZXBlbmRlbnRzT2YtPmdldERldlJlcXVpcmVzKCkpKTsKJHNvdXJjZUZpbHRlcltdID0gJG9ubHlEZXBlbmRlbnRzT2YtPmdldE5hbWUoKTsKfQoKJHN1Z2dlc3Rpb25zID0gW107CmZvcmVhY2ggKCRzdWdnZXN0ZWRQYWNrYWdlcyBhcyAkc3VnZ2VzdGlvbikgewppZiAoaW5fYXJyYXkoJHN1Z2dlc3Rpb25bJ3RhcmdldCddLCAkaW5zdGFsbGVkTmFtZXMpIHx8IChcY291bnQoJHNvdXJjZUZpbHRlcikgPiAwICYmICFpbl9hcnJheSgkc3VnZ2VzdGlvblsnc291cmNlJ10sICRzb3VyY2VGaWx0ZXIpKSkgewpjb250aW51ZTsKfQoKJHN1Z2dlc3Rpb25zW10gPSAkc3VnZ2VzdGlvbjsKfQoKcmV0dXJuICRzdWdnZXN0aW9uczsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBlc2NhcGVPdXRwdXQoc3RyaW5nICRzdHJpbmcpOiBzdHJpbmcKewpyZXR1cm4gT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoCiR0aGlzLT5yZW1vdmVDb250cm9sQ2hhcmFjdGVycygkc3RyaW5nKQopOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHJlbW92ZUNvbnRyb2xDaGFyYWN0ZXJzKHN0cmluZyAkc3RyaW5nKTogc3RyaW5nCnsKcmV0dXJuIFByZWc6OnJlcGxhY2UoCicvW1s6Y250cmw6XV0vJywKJycsCnN0cl9yZXBsYWNlKCJcbiIsICcgJywgJHN0cmluZykKKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxKc29uOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIEpzb25TY2hlbWFcVmFsaWRhdG9yOwp1c2UgU2VsZFxKc29uTGludFxKc29uUGFyc2VyOwp1c2UgU2VsZFxKc29uTGludFxQYXJzaW5nRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwRG93bmxvYWRlcjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CgoKCgoKCgpjbGFzcyBKc29uRmlsZQp7CnB1YmxpYyBjb25zdCBMQVhfU0NIRU1BID0gMTsKcHVibGljIGNvbnN0IFNUUklDVF9TQ0hFTUEgPSAyOwpwdWJsaWMgY29uc3QgQVVUSF9TQ0hFTUEgPSAzOwpwdWJsaWMgY29uc3QgTE9DS19TQ0hFTUEgPSA0OwoKCnB1YmxpYyBjb25zdCBKU09OX1VORVNDQVBFRF9TTEFTSEVTID0gNjQ7CgpwdWJsaWMgY29uc3QgSlNPTl9QUkVUVFlfUFJJTlQgPSAxMjg7CgpwdWJsaWMgY29uc3QgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSA9IDI1NjsKCnB1YmxpYyBjb25zdCBDT01QT1NFUl9TQ0hFTUFfUEFUSCA9IF9fRElSX18gLiAnLy4uLy4uLy4uL3Jlcy9jb21wb3Nlci1zY2hlbWEuanNvbic7CnB1YmxpYyBjb25zdCBMT0NLX1NDSEVNQV9QQVRIID0gX19ESVJfXyAuICcvLi4vLi4vLi4vcmVzL2NvbXBvc2VyLWxvY2stc2NoZW1hLmpzb24nOwoKcHVibGljIGNvbnN0IElOREVOVF9ERUZBVUxUID0gJyAgICAnOwoKCnByaXZhdGUgJHBhdGg7Cgpwcml2YXRlICRodHRwRG93bmxvYWRlcjsKCnByaXZhdGUgJGlvOwoKcHJpdmF0ZSAkaW5kZW50ID0gc2VsZjo6SU5ERU5UX0RFRkFVTFQ7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkcGF0aCwgP0h0dHBEb3dubG9hZGVyICRodHRwRG93bmxvYWRlciA9IG51bGwsID9JT0ludGVyZmFjZSAkaW8gPSBudWxsKQp7CiR0aGlzLT5wYXRoID0gJHBhdGg7CgppZiAobnVsbCA9PT0gJGh0dHBEb3dubG9hZGVyICYmIFByZWc6OmlzTWF0Y2goJ3teaHR0cHM/Oi8vfWknLCAkcGF0aCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ2h0dHAgdXJscyByZXF1aXJlIGEgSHR0cERvd25sb2FkZXIgaW5zdGFuY2UgdG8gYmUgcGFzc2VkJyk7Cn0KJHRoaXMtPmh0dHBEb3dubG9hZGVyID0gJGh0dHBEb3dubG9hZGVyOwokdGhpcy0+aW8gPSAkaW87Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRQYXRoKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+cGF0aDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGV4aXN0cygpOiBib29sCnsKcmV0dXJuIGlzX2ZpbGUoJHRoaXMtPnBhdGgpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlYWQoKQp7CnRyeSB7CmlmICgkdGhpcy0+aHR0cERvd25sb2FkZXIpIHsKJGpzb24gPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkdGhpcy0+cGF0aCktPmdldEJvZHkoKTsKfSBlbHNlIHsKaWYgKCFGaWxlc3lzdGVtOjppc1JlYWRhYmxlKCR0aGlzLT5wYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSBmaWxlICInLiR0aGlzLT5wYXRoLiciIGlzIG5vdCByZWFkYWJsZS4nKTsKfQppZiAoJHRoaXMtPmlvICYmICR0aGlzLT5pby0+aXNEZWJ1ZygpKSB7CiRyZWFscGF0aEluZm8gPSAnJzsKJHJlYWxwYXRoID0gcmVhbHBhdGgoJHRoaXMtPnBhdGgpOwppZiAoZmFsc2UgIT09ICRyZWFscGF0aCAmJiAkcmVhbHBhdGggIT09ICR0aGlzLT5wYXRoKSB7CiRyZWFscGF0aEluZm8gPSAnICgnIC4gJHJlYWxwYXRoIC4gJyknOwp9CiR0aGlzLT5pby0+d3JpdGVFcnJvcignUmVhZGluZyAnIC4gJHRoaXMtPnBhdGggLiAkcmVhbHBhdGhJbmZvKTsKfQokanNvbiA9IGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5wYXRoKTsKfQp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRlLT5nZXRNZXNzYWdlKCksIDAsICRlKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCByZWFkICcuJHRoaXMtPnBhdGguIlxuXG4iLiRlLT5nZXRNZXNzYWdlKCkpOwp9CgppZiAoJGpzb24gPT09IGZhbHNlKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IHJlYWQgJy4kdGhpcy0+cGF0aCk7Cn0KCiR0aGlzLT5pbmRlbnQgPSBzZWxmOjpkZXRlY3RJbmRlbnRpbmcoJGpzb24pOwoKcmV0dXJuIHN0YXRpYzo6cGFyc2VKc29uKCRqc29uLCAkdGhpcy0+cGF0aCk7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlKGFycmF5ICRoYXNoLCBpbnQgJG9wdGlvbnMgPSBKU09OX1VORVNDQVBFRF9TTEFTSEVTIHwgSlNPTl9QUkVUVFlfUFJJTlQgfCBKU09OX1VORVNDQVBFRF9VTklDT0RFKQp7CmlmICgkdGhpcy0+cGF0aCA9PT0gJ3BocDovL21lbW9yeScpIHsKZmlsZV9wdXRfY29udGVudHMoJHRoaXMtPnBhdGgsIHN0YXRpYzo6ZW5jb2RlKCRoYXNoLCAkb3B0aW9ucywgJHRoaXMtPmluZGVudCkpOwoKcmV0dXJuOwp9CgokZGlyID0gZGlybmFtZSgkdGhpcy0+cGF0aCk7CmlmICghaXNfZGlyKCRkaXIpKSB7CmlmIChmaWxlX2V4aXN0cygkZGlyKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbigKcmVhbHBhdGgoJGRpcikuJyBleGlzdHMgYW5kIGlzIG5vdCBhIGRpcmVjdG9yeS4nCik7Cn0KaWYgKCFAbWtkaXIoJGRpciwgMDc3NywgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oCiRkaXIuJyBkb2VzIG5vdCBleGlzdCBhbmQgY291bGQgbm90IGJlIGNyZWF0ZWQuJwopOwp9Cn0KCiRyZXRyaWVzID0gMzsKd2hpbGUgKCRyZXRyaWVzLS0pIHsKdHJ5IHsKJHRoaXMtPmZpbGVQdXRDb250ZW50c0lmTW9kaWZpZWQoJHRoaXMtPnBhdGgsIHN0YXRpYzo6ZW5jb2RlKCRoYXNoLCAkb3B0aW9ucywgJHRoaXMtPmluZGVudCkuICgkb3B0aW9ucyAmIEpTT05fUFJFVFRZX1BSSU5UID8gIlxuIiA6ICcnKSk7CmJyZWFrOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmlmICgkcmV0cmllcyA+IDApIHsKdXNsZWVwKDUwMDAwMCk7CmNvbnRpbnVlOwp9Cgp0aHJvdyAkZTsKfQp9Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBmaWxlUHV0Q29udGVudHNJZk1vZGlmaWVkKHN0cmluZyAkcGF0aCwgc3RyaW5nICRjb250ZW50KQp7CiRjdXJyZW50Q29udGVudCA9IEBmaWxlX2dldF9jb250ZW50cygkcGF0aCk7CmlmIChmYWxzZSA9PT0gJGN1cnJlbnRDb250ZW50IHx8ICRjdXJyZW50Q29udGVudCAhPT0gJGNvbnRlbnQpIHsKcmV0dXJuIGZpbGVfcHV0X2NvbnRlbnRzKCRwYXRoLCAkY29udGVudCk7Cn0KCnJldHVybiAwOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZVNjaGVtYShpbnQgJHNjaGVtYSA9IHNlbGY6OlNUUklDVF9TQ0hFTUEsID9zdHJpbmcgJHNjaGVtYUZpbGUgPSBudWxsKTogYm9vbAp7CmlmICghRmlsZXN5c3RlbTo6aXNSZWFkYWJsZSgkdGhpcy0+cGF0aCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgZmlsZSAiJy4kdGhpcy0+cGF0aC4nIiBpcyBub3QgcmVhZGFibGUuJyk7Cn0KJGNvbnRlbnQgPSBmaWxlX2dldF9jb250ZW50cygkdGhpcy0+cGF0aCk7CiRkYXRhID0ganNvbl9kZWNvZGUoJGNvbnRlbnQpOwoKaWYgKG51bGwgPT09ICRkYXRhICYmICdudWxsJyAhPT0gJGNvbnRlbnQpIHsKc2VsZjo6dmFsaWRhdGVTeW50YXgoJGNvbnRlbnQsICR0aGlzLT5wYXRoKTsKfQoKcmV0dXJuIHNlbGY6OnZhbGlkYXRlSnNvblNjaGVtYSgkdGhpcy0+cGF0aCwgJGRhdGEsICRzY2hlbWEsICRzY2hlbWFGaWxlKTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHZhbGlkYXRlSnNvblNjaGVtYShzdHJpbmcgJHNvdXJjZSwgJGRhdGEsIGludCAkc2NoZW1hLCA/c3RyaW5nICRzY2hlbWFGaWxlID0gbnVsbCk6IGJvb2wKewokaXNDb21wb3NlclNjaGVtYUZpbGUgPSBmYWxzZTsKaWYgKG51bGwgPT09ICRzY2hlbWFGaWxlKSB7CmlmICgkc2NoZW1hID09PSBzZWxmOjpMT0NLX1NDSEVNQSkgewokc2NoZW1hRmlsZSA9IHNlbGY6OkxPQ0tfU0NIRU1BX1BBVEg7Cn0gZWxzZSB7CiRpc0NvbXBvc2VyU2NoZW1hRmlsZSA9IHRydWU7CiRzY2hlbWFGaWxlID0gc2VsZjo6Q09NUE9TRVJfU0NIRU1BX1BBVEg7Cn0KfQoKCmlmIChmYWxzZSA9PT0gc3RycG9zKCRzY2hlbWFGaWxlLCAnOi8vJykpIHsKJHNjaGVtYUZpbGUgPSAnZmlsZTovLycgLiAkc2NoZW1hRmlsZTsKfQoKJHNjaGVtYURhdGEgPSAob2JqZWN0KSBbJyRyZWYnID0+ICRzY2hlbWFGaWxlLCAnJHNjaGVtYScgPT4gImh0dHBzOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiXTsKCmlmICgkc2NoZW1hID09PSBzZWxmOjpTVFJJQ1RfU0NIRU1BICYmICRpc0NvbXBvc2VyU2NoZW1hRmlsZSkgewokc2NoZW1hRGF0YSA9IGpzb25fZGVjb2RlKChzdHJpbmcpIGZpbGVfZ2V0X2NvbnRlbnRzKCRzY2hlbWFGaWxlKSk7CiRzY2hlbWFEYXRhLT5hZGRpdGlvbmFsUHJvcGVydGllcyA9IGZhbHNlOwokc2NoZW1hRGF0YS0+cmVxdWlyZWQgPSBbJ25hbWUnLCAnZGVzY3JpcHRpb24nXTsKfSBlbHNlaWYgKCRzY2hlbWEgPT09IHNlbGY6OkFVVEhfU0NIRU1BICYmICRpc0NvbXBvc2VyU2NoZW1hRmlsZSkgewokc2NoZW1hRGF0YSA9IChvYmplY3QpIFsnJHJlZicgPT4gJHNjaGVtYUZpbGUuJyMvcHJvcGVydGllcy9jb25maWcnLCAnJHNjaGVtYScgPT4gImh0dHBzOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiXTsKfQoKJHZhbGlkYXRvciA9IG5ldyBWYWxpZGF0b3IoKTsKCiRkYXRhID0ganNvbl9kZWNvZGUoKHN0cmluZykganNvbl9lbmNvZGUoJGRhdGEpKTsKJHZhbGlkYXRvci0+dmFsaWRhdGUoJGRhdGEsICRzY2hlbWFEYXRhKTsKCmlmICghJHZhbGlkYXRvci0+aXNWYWxpZCgpKSB7CiRlcnJvcnMgPSBbXTsKZm9yZWFjaCAoJHZhbGlkYXRvci0+Z2V0RXJyb3JzKCkgYXMgJGVycm9yKSB7CiRlcnJvcnNbXSA9ICgkZXJyb3JbJ3Byb3BlcnR5J10gPyAkZXJyb3JbJ3Byb3BlcnR5J10uJyA6ICcgOiAnJykuJGVycm9yWydtZXNzYWdlJ107Cn0KdGhyb3cgbmV3IEpzb25WYWxpZGF0aW9uRXhjZXB0aW9uKCciJy4kc291cmNlLiciIGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCBKU09OIHNjaGVtYScsICRlcnJvcnMpOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGVuY29kZSgkZGF0YSwgaW50ICRvcHRpb25zID0gXEpTT05fVU5FU0NBUEVEX1NMQVNIRVMgfCBcSlNPTl9QUkVUVFlfUFJJTlQgfCBcSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSwgc3RyaW5nICRpbmRlbnQgPSBzZWxmOjpJTkRFTlRfREVGQVVMVCk6IHN0cmluZwp7CiRqc29uID0ganNvbl9lbmNvZGUoJGRhdGEsICRvcHRpb25zKTsKCmlmIChmYWxzZSA9PT0gJGpzb24pIHsKc2VsZjo6dGhyb3dFbmNvZGVFcnJvcihqc29uX2xhc3RfZXJyb3IoKSk7Cn0KCmlmICgoJG9wdGlvbnMgJiBKU09OX1BSRVRUWV9QUklOVCkgPiAwICYmICRpbmRlbnQgIT09IHNlbGY6OklOREVOVF9ERUZBVUxUKSB7CgpyZXR1cm4gUHJlZzo6cmVwbGFjZUNhbGxiYWNrKAonI14gezQsfSNtJywKc3RhdGljIGZ1bmN0aW9uICgkbWF0Y2gpIHVzZSAoJGluZGVudCk6IHN0cmluZyB7CnJldHVybiBzdHJfcmVwZWF0KCRpbmRlbnQsIChpbnQpIChzdHJsZW4oJG1hdGNoWzBdKSAvIDQpKTsKfSwKJGpzb24KKTsKfQoKcmV0dXJuICRqc29uOwp9CgoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gdGhyb3dFbmNvZGVFcnJvcihpbnQgJGNvZGUpOiB2b2lkCnsKc3dpdGNoICgkY29kZSkgewpjYXNlIEpTT05fRVJST1JfREVQVEg6CiRtc2cgPSAnTWF4aW11bSBzdGFjayBkZXB0aCBleGNlZWRlZCc7CmJyZWFrOwpjYXNlIEpTT05fRVJST1JfU1RBVEVfTUlTTUFUQ0g6CiRtc2cgPSAnVW5kZXJmbG93IG9yIHRoZSBtb2RlcyBtaXNtYXRjaCc7CmJyZWFrOwpjYXNlIEpTT05fRVJST1JfQ1RSTF9DSEFSOgokbXNnID0gJ1VuZXhwZWN0ZWQgY29udHJvbCBjaGFyYWN0ZXIgZm91bmQnOwpicmVhazsKY2FzZSBKU09OX0VSUk9SX1VURjg6CiRtc2cgPSAnTWFsZm9ybWVkIFVURi04IGNoYXJhY3RlcnMsIHBvc3NpYmx5IGluY29ycmVjdGx5IGVuY29kZWQnOwpicmVhazsKZGVmYXVsdDoKJG1zZyA9ICdVbmtub3duIGVycm9yJzsKfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdKU09OIGVuY29kaW5nIGZhaWxlZDogJy4kbXNnKTsKfQoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwYXJzZUpzb24oP3N0cmluZyAkanNvbiwgP3N0cmluZyAkZmlsZSA9IG51bGwpCnsKaWYgKG51bGwgPT09ICRqc29uKSB7CnJldHVybiBudWxsOwp9CiRkYXRhID0ganNvbl9kZWNvZGUoJGpzb24sIHRydWUpOwppZiAobnVsbCA9PT0gJGRhdGEgJiYgSlNPTl9FUlJPUl9OT05FICE9PSBqc29uX2xhc3RfZXJyb3IoKSkgewoKaWYgKCRmaWxlICE9PSBudWxsICYmIHN0cl9lbmRzX3dpdGgoJGZpbGUsICcubG9jaycpICYmIHN0cl9jb250YWlucygkanNvbiwgJyJjb250ZW50LWhhc2giJykpIHsKJHJlcGxhY2VkID0gUHJlZzo6cmVwbGFjZSgKJ3tccj9cbjw8PDw8PDwgW15cclxuXStccj9cblxzKyJjb250ZW50LWhhc2giOiAqIlswLTlhLWZdKyIsICpccj9cbig/Olx8ezd9IFteXHJcbl0rXHI/XG5ccysiY29udGVudC1oYXNoIjogKiJbMC05YS1mXSsiLCAqXHI/XG4pPz09PT09PT1ccj9cblxzKyJjb250ZW50LWhhc2giOiAqIlswLTlhLWZdKyIsICpccj9cbj4+Pj4+Pj4gW15cclxuXSsoXHI/XG4pfScsCicgICAgImNvbnRlbnQtaGFzaCI6ICJWQ1MgbWVyZ2UgY29uZmxpY3QgZGV0ZWN0ZWQuIFBsZWFzZSBydW4gYGNvbXBvc2VyIHVwZGF0ZSAtLWxvY2tgLiIsJDEnLAokanNvbiwKMSwKJGNvdW50Cik7CmlmICgkY291bnQgPT09IDEpIHsKJGRhdGEgPSBqc29uX2RlY29kZSgkcmVwbGFjZWQsIHRydWUpOwppZiAoJGRhdGEgIT09IG51bGwpIHsKcmV0dXJuICRkYXRhOwp9Cn0KfQoKc2VsZjo6dmFsaWRhdGVTeW50YXgoJGpzb24sICRmaWxlKTsKfQoKcmV0dXJuICRkYXRhOwp9CgoKCgoKCgoKcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiB2YWxpZGF0ZVN5bnRheChzdHJpbmcgJGpzb24sID9zdHJpbmcgJGZpbGUgPSBudWxsKTogYm9vbAp7CiRwYXJzZXIgPSBuZXcgSnNvblBhcnNlcigpOwokcmVzdWx0ID0gJHBhcnNlci0+bGludCgkanNvbik7CmlmIChudWxsID09PSAkcmVzdWx0KSB7CmlmIChkZWZpbmVkKCdKU09OX0VSUk9SX1VURjgnKSAmJiBKU09OX0VSUk9SX1VURjggPT09IGpzb25fbGFzdF9lcnJvcigpKSB7CmlmICgkZmlsZSA9PT0gbnVsbCkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignVGhlIGlucHV0IGlzIG5vdCBVVEYtOCwgY291bGQgbm90IHBhcnNlIGFzIEpTT04nKTsKfSBlbHNlIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJyInIC4gJGZpbGUgLiAnIiBpcyBub3QgVVRGLTgsIGNvdWxkIG5vdCBwYXJzZSBhcyBKU09OJyk7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KCmlmICgkZmlsZSA9PT0gbnVsbCkgewp0aHJvdyBuZXcgUGFyc2luZ0V4Y2VwdGlvbigKJ1RoZSBpbnB1dCBkb2VzIG5vdCBjb250YWluIHZhbGlkIEpTT04nIC4gIlxuIiAuICRyZXN1bHQtPmdldE1lc3NhZ2UoKSwKJHJlc3VsdC0+Z2V0RGV0YWlscygpCik7Cn0gZWxzZSB7CnRocm93IG5ldyBQYXJzaW5nRXhjZXB0aW9uKAonIicgLiAkZmlsZSAuICciIGRvZXMgbm90IGNvbnRhaW4gdmFsaWQgSlNPTicgLiAiXG4iIC4gJHJlc3VsdC0+Z2V0TWVzc2FnZSgpLAokcmVzdWx0LT5nZXREZXRhaWxzKCkKKTsKfQp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRldGVjdEluZGVudGluZyg/c3RyaW5nICRqc29uKTogc3RyaW5nCnsKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJyNeKFsgXHRdKykiI20nLCAkanNvbiA/PyAnJywgJG1hdGNoKSkgewpyZXR1cm4gJG1hdGNoWzFdOwp9CgpyZXR1cm4gc2VsZjo6SU5ERU5UX0RFRkFVTFQ7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSnNvbjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgoKCgoKCgoKY2xhc3MgSnNvbkZvcm1hdHRlcgp7CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZm9ybWF0KHN0cmluZyAkanNvbiwgYm9vbCAkdW5lc2NhcGVVbmljb2RlLCBib29sICR1bmVzY2FwZVNsYXNoZXMpOiBzdHJpbmcKewokcmVzdWx0ID0gJyc7CiRwb3MgPSAwOwokc3RyTGVuID0gc3RybGVuKCRqc29uKTsKJGluZGVudFN0ciA9ICcgICAgJzsKJG5ld0xpbmUgPSAiXG4iOwokb3V0T2ZRdW90ZXMgPSB0cnVlOwokYnVmZmVyID0gJyc7CiRub2VzY2FwZSA9IHRydWU7Cgpmb3IgKCRpID0gMDsgJGkgPCAkc3RyTGVuOyAkaSsrKSB7CgokY2hhciA9IHN1YnN0cigkanNvbiwgJGksIDEpOwoKCmlmICgnIicgPT09ICRjaGFyICYmICRub2VzY2FwZSkgewokb3V0T2ZRdW90ZXMgPSAhJG91dE9mUXVvdGVzOwp9CgppZiAoISRvdXRPZlF1b3RlcykgewokYnVmZmVyIC49ICRjaGFyOwokbm9lc2NhcGUgPSAnXFwnID09PSAkY2hhciA/ICEkbm9lc2NhcGUgOiB0cnVlOwpjb250aW51ZTsKfQppZiAoJycgIT09ICRidWZmZXIpIHsKaWYgKCR1bmVzY2FwZVNsYXNoZXMpIHsKJGJ1ZmZlciA9IHN0cl9yZXBsYWNlKCdcXC8nLCAnLycsICRidWZmZXIpOwp9CgppZiAoJHVuZXNjYXBlVW5pY29kZSAmJiBmdW5jdGlvbl9leGlzdHMoJ21iX2NvbnZlcnRfZW5jb2RpbmcnKSkgewoKJGJ1ZmZlciA9IFByZWc6OnJlcGxhY2VDYWxsYmFjaygnLyhcXFxcKyl1KFswLTlhLWZdezR9KS9pJywgc3RhdGljIGZ1bmN0aW9uICgkbWF0Y2gpOiBzdHJpbmcgewokbCA9IHN0cmxlbigkbWF0Y2hbMV0pOwoKaWYgKCRsICUgMikgewokY29kZSA9IGhleGRlYygkbWF0Y2hbMl0pOwoKCmlmICgweEQ4MDAgPD0gJGNvZGUgJiYgMHhERkZGID49ICRjb2RlKSB7CnJldHVybiAkbWF0Y2hbMF07Cn0KCnJldHVybiBzdHJfcmVwZWF0KCdcXCcsICRsIC0gMSkgLiBtYl9jb252ZXJ0X2VuY29kaW5nKApwYWNrKCdIKicsICRtYXRjaFsyXSksCidVVEYtOCcsCidVQ1MtMkJFJwopOwp9CgpyZXR1cm4gJG1hdGNoWzBdOwp9LCAkYnVmZmVyKTsKfQoKJHJlc3VsdCAuPSAkYnVmZmVyLiRjaGFyOwokYnVmZmVyID0gJyc7CmNvbnRpbnVlOwp9CgppZiAoJzonID09PSAkY2hhcikgewoKJGNoYXIgLj0gJyAnOwp9IGVsc2VpZiAoJ30nID09PSAkY2hhciB8fCAnXScgPT09ICRjaGFyKSB7CiRwb3MtLTsKJHByZXZDaGFyID0gc3Vic3RyKCRqc29uLCAkaSAtIDEsIDEpOwoKaWYgKCd7JyAhPT0gJHByZXZDaGFyICYmICdbJyAhPT0gJHByZXZDaGFyKSB7CgoKJHJlc3VsdCAuPSAkbmV3TGluZTsKJHJlc3VsdCAuPSBzdHJfcmVwZWF0KCRpbmRlbnRTdHIsICRwb3MpOwp9IGVsc2UgewoKJHJlc3VsdCA9IHJ0cmltKCRyZXN1bHQpOwp9Cn0KCiRyZXN1bHQgLj0gJGNoYXI7CgoKCmlmICgnLCcgPT09ICRjaGFyIHx8ICd7JyA9PT0gJGNoYXIgfHwgJ1snID09PSAkY2hhcikgewokcmVzdWx0IC49ICRuZXdMaW5lOwoKaWYgKCd7JyA9PT0gJGNoYXIgfHwgJ1snID09PSAkY2hhcikgewokcG9zKys7Cn0KCiRyZXN1bHQgLj0gc3RyX3JlcGVhdCgkaW5kZW50U3RyLCAkcG9zKTsKfQp9CgpyZXR1cm4gJHJlc3VsdDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxKc29uOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5OwoKCgoKY2xhc3MgSnNvbk1hbmlwdWxhdG9yCnsKCnByaXZhdGUgY29uc3QgREVGSU5FUyA9ICcoPyhERUZJTkUpCiAgICAgICAoPzxudW1iZXI+ICAgIC0/ICg/PSBbMS05XXwwKD8hXGQpICkgXGQrKyAoPzpcLlxkKyspPyAoPzpbZUVdIFsrLV0/KyBcZCsrKT8gKQogICAgICAgKD88Ym9vbGVhbj4gICB0cnVlIHwgZmFsc2UgfCBudWxsICkKICAgICAgICg/PHN0cmluZz4gICAgIiAoPzpbXiJcXFxcXSorIHwgXFxcXCBbIlxcXFxiZm5ydFwvXSB8IFxcXFwgdSBbMC05QS1GYS1mXXs0fSApKiAiICkKICAgICAgICg/PGFycmF5PiAgICAgXFsgICg/OiAgKD8manNvbikgXHMqKyAoPzogLCAoPyZqc29uKSBccyorICkqKyAgKT8rICBccyorIFxdICkKICAgICAgICg/PHBhaXI+ICAgICAgXHMqKyAoPyZzdHJpbmcpIFxzKisgOiAoPyZqc29uKSBccyorICkKICAgICAgICg/PG9iamVjdD4gICAgXHsgICg/OiAgKD8mcGFpcikgICg/OiAsICg/JnBhaXIpICApKisgICk/KyAgXHMqKyBcfSApCiAgICAgICAoPzxqc29uPiAgICAgIFxzKisgKD86ICg/Jm51bWJlcikgfCAoPyZib29sZWFuKSB8ICg/JnN0cmluZykgfCAoPyZhcnJheSkgfCAoPyZvYmplY3QpICkgKQogICAgKSc7CgoKcHJpdmF0ZSAkY29udGVudHM7Cgpwcml2YXRlICRuZXdsaW5lOwoKcHJpdmF0ZSAkaW5kZW50OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkY29udGVudHMpCnsKJGNvbnRlbnRzID0gdHJpbSgkY29udGVudHMpOwppZiAoJGNvbnRlbnRzID09PSAnJykgewokY29udGVudHMgPSAne30nOwp9CmlmICghUHJlZzo6aXNNYXRjaCgnI15ceyguKilcfSQjcycsICRjb250ZW50cykpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSBqc29uIGZpbGUgbXVzdCBiZSBhbiBvYmplY3QgKHt9KScpOwp9CiR0aGlzLT5uZXdsaW5lID0gZmFsc2UgIT09IHN0cnBvcygkY29udGVudHMsICJcclxuIikgPyAiXHJcbiIgOiAiXG4iOwokdGhpcy0+Y29udGVudHMgPSAkY29udGVudHMgPT09ICd7fScgPyAneycgLiAkdGhpcy0+bmV3bGluZSAuICd9JyA6ICRjb250ZW50czsKJHRoaXMtPmRldGVjdEluZGVudGluZygpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29udGVudHMoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5jb250ZW50cyAuICR0aGlzLT5uZXdsaW5lOwp9CgpwdWJsaWMgZnVuY3Rpb24gYWRkTGluayhzdHJpbmcgJHR5cGUsIHN0cmluZyAkcGFja2FnZSwgc3RyaW5nICRjb25zdHJhaW50LCBib29sICRzb3J0UGFja2FnZXMgPSBmYWxzZSk6IGJvb2wKewokZGVjb2RlZCA9IEpzb25GaWxlOjpwYXJzZUpzb24oJHRoaXMtPmNvbnRlbnRzKTsKCgppZiAoIWlzc2V0KCRkZWNvZGVkWyR0eXBlXSkpIHsKcmV0dXJuICR0aGlzLT5hZGRNYWluS2V5KCR0eXBlLCBbJHBhY2thZ2UgPT4gJGNvbnN0cmFpbnRdKTsKfQoKJHJlZ2V4ID0gJ3snLnNlbGY6OkRFRklORVMuJ14oP1A8c3RhcnQ+XHMqXHtccyooPzooPyZzdHJpbmcpXHMqOlxzKig/Jmpzb24pXHMqLFxzKikqPyknLgonKD9QPHByb3BlcnR5PicucHJlZ19xdW90ZShKc29uRmlsZTo6ZW5jb2RlKCR0eXBlKSkuJ1xzKjpccyopKD9QPHZhbHVlPig/Jmpzb24pKSg/UDxlbmQ+LiopfXN4JzsKaWYgKCFQcmVnOjppc01hdGNoKCRyZWdleCwgJHRoaXMtPmNvbnRlbnRzLCAkbWF0Y2hlcykpIHsKcmV0dXJuIGZhbHNlOwp9CmFzc2VydChpc19zdHJpbmcoJG1hdGNoZXNbJ3N0YXJ0J10pKTsKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hlc1sndmFsdWUnXSkpOwphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaGVzWydlbmQnXSkpOwoKJGxpbmtzID0gJG1hdGNoZXNbJ3ZhbHVlJ107CgoKJHBhY2thZ2VSZWdleCA9IHN0cl9yZXBsYWNlKCcvJywgJ1xcXFw/LycsIHByZWdfcXVvdGUoJHBhY2thZ2UpKTsKJHJlZ2V4ID0gJ3snLnNlbGY6OkRFRklORVMuJyIoP1A8cGFja2FnZT4nLiRwYWNrYWdlUmVnZXguJykiKFxzKjpccyopKD8mc3RyaW5nKX1peCc7CmlmIChQcmVnOjppc01hdGNoKCRyZWdleCwgJGxpbmtzLCAkcGFja2FnZU1hdGNoZXMpKSB7CmFzc2VydChpc19zdHJpbmcoJHBhY2thZ2VNYXRjaGVzWydwYWNrYWdlJ10pKTsKCiRleGlzdGluZ1BhY2thZ2UgPSAkcGFja2FnZU1hdGNoZXNbJ3BhY2thZ2UnXTsKJHBhY2thZ2VSZWdleCA9IHN0cl9yZXBsYWNlKCcvJywgJ1xcXFw/LycsIHByZWdfcXVvdGUoJGV4aXN0aW5nUGFja2FnZSkpOwokbGlua3MgPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJ3snLnNlbGY6OkRFRklORVMuJyInLiRwYWNrYWdlUmVnZXguJyIoP1A8c2VwYXJhdG9yPlxzKjpccyopKD8mc3RyaW5nKX1peCcsIHN0YXRpYyBmdW5jdGlvbiAoJG0pIHVzZSAoJGV4aXN0aW5nUGFja2FnZSwgJGNvbnN0cmFpbnQpOiBzdHJpbmcgewpyZXR1cm4gSnNvbkZpbGU6OmVuY29kZShzdHJfcmVwbGFjZSgnXFwvJywgJy8nLCAkZXhpc3RpbmdQYWNrYWdlKSkgLiAkbVsnc2VwYXJhdG9yJ10gLiAnIicgLiAkY29uc3RyYWludCAuICciJzsKfSwgJGxpbmtzKTsKfSBlbHNlIHsKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJyNeXHMqXHtccypcUysuKj8oXHMqXH1ccyopJCNzJywgJGxpbmtzLCAkbWF0Y2gpKSB7CgokbGlua3MgPSBQcmVnOjpyZXBsYWNlKAoneycucHJlZ19xdW90ZSgkbWF0Y2hbMV0pLickfScsCgphZGRjc2xhc2hlcygnLCcgLiAkdGhpcy0+bmV3bGluZSAuICR0aGlzLT5pbmRlbnQgLiAkdGhpcy0+aW5kZW50IC4gSnNvbkZpbGU6OmVuY29kZSgkcGFja2FnZSkuJzogJy5Kc29uRmlsZTo6ZW5jb2RlKCRjb25zdHJhaW50KSAuICRtYXRjaFsxXSwgJ1xcJCcpLAokbGlua3MKKTsKfSBlbHNlIHsKCiRsaW5rcyA9ICd7JyAuICR0aGlzLT5uZXdsaW5lIC4KJHRoaXMtPmluZGVudCAuICR0aGlzLT5pbmRlbnQgLiBKc29uRmlsZTo6ZW5jb2RlKCRwYWNrYWdlKS4nOiAnLkpzb25GaWxlOjplbmNvZGUoJGNvbnN0cmFpbnQpIC4gJHRoaXMtPm5ld2xpbmUgLgokdGhpcy0+aW5kZW50IC4gJ30nOwp9Cn0KCmlmICh0cnVlID09PSAkc29ydFBhY2thZ2VzKSB7CiRyZXF1aXJlbWVudHMgPSBqc29uX2RlY29kZSgkbGlua3MsIHRydWUpOwokdGhpcy0+c29ydFBhY2thZ2VzKCRyZXF1aXJlbWVudHMpOwokbGlua3MgPSAkdGhpcy0+Zm9ybWF0KCRyZXF1aXJlbWVudHMpOwp9CgokdGhpcy0+Y29udGVudHMgPSAkbWF0Y2hlc1snc3RhcnQnXSAuICRtYXRjaGVzWydwcm9wZXJ0eSddIC4gJGxpbmtzIC4gJG1hdGNoZXNbJ2VuZCddOwoKcmV0dXJuIHRydWU7Cn0KCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHNvcnRQYWNrYWdlcyhhcnJheSAmJHBhY2thZ2VzID0gW10pOiB2b2lkCnsKJHByZWZpeCA9IHN0YXRpYyBmdW5jdGlvbiAoJHJlcXVpcmVtZW50KTogc3RyaW5nIHsKaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJHJlcXVpcmVtZW50KSkgewpyZXR1cm4gUHJlZzo6cmVwbGFjZSgKWwonL15waHAvJywKJy9eaGh2bS8nLAonL15leHQvJywKJy9ebGliLycsCicvXlxELycsCl0sClsKJzAtJDAnLAonMS0kMCcsCicyLSQwJywKJzMtJDAnLAonNC0kMCcsCl0sCiRyZXF1aXJlbWVudAopOwp9CgpyZXR1cm4gJzUtJy4kcmVxdWlyZW1lbnQ7Cn07Cgp1a3NvcnQoJHBhY2thZ2VzLCBzdGF0aWMgZnVuY3Rpb24gKCRhLCAkYikgdXNlICgkcHJlZml4KTogaW50IHsKcmV0dXJuIHN0cm5hdGNtcCgkcHJlZml4KCRhKSwgJHByZWZpeCgkYikpOwp9KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFJlcG9zaXRvcnkoc3RyaW5nICRuYW1lLCAkY29uZmlnLCBib29sICRhcHBlbmQgPSB0cnVlKTogYm9vbAp7CmlmICgiIiAhPT0gJG5hbWUgJiYgISR0aGlzLT5kb1JlbW92ZVJlcG9zaXRvcnkoJG5hbWUpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCEkdGhpcy0+ZG9Db252ZXJ0UmVwb3NpdG9yaWVzRnJvbUFzc29jVG9MaXN0KCkpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoaXNfYXJyYXkoJGNvbmZpZykgJiYgIWlzX251bWVyaWMoJG5hbWUpICYmICcnICE9PSAkbmFtZSkgewokY29uZmlnID0gWyduYW1lJyA9PiAkbmFtZV0gKyAkY29uZmlnOwp9IGVsc2VpZiAoJGNvbmZpZyA9PT0gZmFsc2UpIHsKJGNvbmZpZyA9IFskbmFtZSA9PiAkY29uZmlnXTsKfQoKcmV0dXJuICR0aGlzLT5hZGRMaXN0SXRlbSgncmVwb3NpdG9yaWVzJywgJGNvbmZpZywgJGFwcGVuZCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZG9Db252ZXJ0UmVwb3NpdG9yaWVzRnJvbUFzc29jVG9MaXN0KCk6IGJvb2wKewokZGVjb2RlZCA9IGpzb25fZGVjb2RlKCR0aGlzLT5jb250ZW50cywgZmFsc2UpOwoKaWYgKCgkZGVjb2RlZC0+cmVwb3NpdG9yaWVzID8/IG51bGwpIGluc3RhbmNlb2YgXHN0ZENsYXNzKSB7CgokZW50cmllc1RvUmV2ZXJ0ID0gYXJyYXlfcmV2ZXJzZShhcnJheV9rZXlzKChhcnJheSkgJGRlY29kZWQtPnJlcG9zaXRvcmllcykpOwoKZm9yZWFjaCAoJGVudHJpZXNUb1JldmVydCBhcyAkZW50cnlLZXkpIHsKaWYgKCEkdGhpcy0+cmVtb3ZlU3ViTm9kZSgncmVwb3NpdG9yaWVzJywgKHN0cmluZykgJGVudHJ5S2V5KSkgewpyZXR1cm4gZmFsc2U7Cn0KfQoKJHRoaXMtPmNoYW5nZUVtcHR5TWFpbktleUZyb21Bc3NvY1RvTGlzdCgncmVwb3NpdG9yaWVzJyk7CgoKZm9yZWFjaCAoKChhcnJheSkgJGRlY29kZWQtPnJlcG9zaXRvcmllcykgYXMgJHJlcG9zaXRvcnlOYW1lID0+ICRyZXBvc2l0b3J5KSB7CmlmICghJHJlcG9zaXRvcnkgaW5zdGFuY2VvZiBcc3RkQ2xhc3MpIHsKaWYgKCEkdGhpcy0+YWRkTGlzdEl0ZW0oJ3JlcG9zaXRvcmllcycsIFskcmVwb3NpdG9yeU5hbWUgPT4gJHJlcG9zaXRvcnldLCB0cnVlKSkgewpyZXR1cm4gZmFsc2U7Cn0KfSBlbHNlaWYgKGlzX251bWVyaWMoJHJlcG9zaXRvcnlOYW1lKSkgewppZiAoISR0aGlzLT5hZGRMaXN0SXRlbSgncmVwb3NpdG9yaWVzJywgJHJlcG9zaXRvcnksIHRydWUpKSB7CnJldHVybiBmYWxzZTsKfQp9IGVsc2UgewokcmVwb3NpdG9yeSA9IChhcnJheSkgJHJlcG9zaXRvcnk7CgokcmVwb3NpdG9yeSA9IFsnbmFtZScgPT4gJHJlcG9zaXRvcnlOYW1lXSArICRyZXBvc2l0b3J5OwppZiAoISR0aGlzLT5hZGRMaXN0SXRlbSgncmVwb3NpdG9yaWVzJywgJHJlcG9zaXRvcnksIHRydWUpKSB7CnJldHVybiBmYWxzZTsKfQp9Cn0KfQoKcmV0dXJuIHRydWU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRSZXBvc2l0b3J5VXJsKHN0cmluZyAkbmFtZSwgc3RyaW5nICR1cmwpOiBib29sCnsKJGRlY29kZWQgPSBKc29uRmlsZTo6cGFyc2VKc29uKCR0aGlzLT5jb250ZW50cyk7CiRyZXBvc2l0b3J5SW5kZXggPSBudWxsOwoKZm9yZWFjaCAoJGRlY29kZWRbJ3JlcG9zaXRvcmllcyddID8/IFtdIGFzICRpbmRleCA9PiAkcmVwb3NpdG9yeSkgewppZiAoJG5hbWUgPT09ICRpbmRleCkgewokcmVwb3NpdG9yeUluZGV4ID0gJGluZGV4OwpicmVhazsKfQoKaWYgKCRuYW1lID09PSAoJHJlcG9zaXRvcnlbJ25hbWUnXSA/PyBudWxsKSkgewokcmVwb3NpdG9yeUluZGV4ID0gJGluZGV4OwpicmVhazsKfQp9CgppZiAobnVsbCA9PT0gJHJlcG9zaXRvcnlJbmRleCkgewpyZXR1cm4gZmFsc2U7Cn0KCiRsaXN0UmVnZXggPSBudWxsOwoKaWYgKGlzX2ludCgkcmVwb3NpdG9yeUluZGV4KSkgewokbGlzdFJlZ2V4ID0gJ3snLnNlbGY6OkRFRklORVMuJ14oP1A8c3RhcnQ+XHMqXHtccyooPzooPyZzdHJpbmcpXHMqOlxzKig/Jmpzb24pXHMqLFxzKikqPyJyZXBvc2l0b3JpZXMiXHMqOlxzKlxbXHMqKCg/Jmpzb24pXHMqKyxccyorKXsnIC4gbWF4KDAsICRyZXBvc2l0b3J5SW5kZXgpIC4gJ30pKD9QPHJlcG9zaXRvcnk+KD8mb2JqZWN0KSkoP1A8ZW5kPi4qKX1zeCc7Cn0KCiRvYmplY3RSZWdleCA9ICd7Jy5zZWxmOjpERUZJTkVTLideKD9QPHN0YXJ0PlxzKlx7XHMqKD86KD8mc3RyaW5nKVxzKjpccyooPyZqc29uKVxzKixccyopKj8icmVwb3NpdG9yaWVzIlxzKjpccypce1xzKig/Oig/JnN0cmluZylccyo6XHMqKD8manNvbilccyosXHMqKSo/JyAuIHByZWdfcXVvdGUoSnNvbkZpbGU6OmVuY29kZSgkcmVwb3NpdG9yeUluZGV4KSkgLiAnXHMqOlxzKikoP1A8cmVwb3NpdG9yeT4oPyZvYmplY3QpKSg/UDxlbmQ+LiopfXN4JzsKJG1hdGNoZXMgPSBudWxsOwoKaWYgKCgkbGlzdFJlZ2V4ICE9PSBudWxsICYmIFByZWc6OmlzTWF0Y2goJGxpc3RSZWdleCwgJHRoaXMtPmNvbnRlbnRzLCAkbWF0Y2hlcykpIHx8IFByZWc6OmlzTWF0Y2goJG9iamVjdFJlZ2V4LCAkdGhpcy0+Y29udGVudHMsICRtYXRjaGVzKSkgewphc3NlcnQoaXNzZXQoJG1hdGNoZXNbJ3N0YXJ0J10pICYmIGlzX3N0cmluZygkbWF0Y2hlc1snc3RhcnQnXSkpOwphc3NlcnQoaXNzZXQoJG1hdGNoZXNbJ3JlcG9zaXRvcnknXSkgJiYgaXNfc3RyaW5nKCRtYXRjaGVzWydyZXBvc2l0b3J5J10pKTsKYXNzZXJ0KGlzc2V0KCRtYXRjaGVzWydlbmQnXSkgJiYgaXNfc3RyaW5nKCRtYXRjaGVzWydlbmQnXSkpOwoKCmlmIChmYWxzZSA9PT0gQGpzb25fZGVjb2RlKCRtYXRjaGVzWydyZXBvc2l0b3J5J10pKSB7CnJldHVybiBmYWxzZTsKfQoKJHJlcG9zaXRvcnlSZWdleCA9ICd7Jy5zZWxmOjpERUZJTkVTLideKD9QPHN0YXJ0PlxzKlx7XHMqKD86KD8mc3RyaW5nKVxzKjpccyooPyZqc29uKVxzKixccyopKj8idXJsIlxzKjpccyopKD9QPHVybD4oPyZzdHJpbmcpKSg/UDxlbmQ+LiopfXN4JzsKCiR0aGlzLT5jb250ZW50cyA9ICRtYXRjaGVzWydzdGFydCddIC4gUHJlZzo6cmVwbGFjZUNhbGxiYWNrKCRyZXBvc2l0b3J5UmVnZXgsIHN0YXRpYyBmdW5jdGlvbiAoYXJyYXkgJHJlcG9zaXRvcnlNYXRjaGVzKSB1c2UgKCR1cmwpOiBzdHJpbmcgewpyZXR1cm4gJHJlcG9zaXRvcnlNYXRjaGVzWydzdGFydCddIC4gSnNvbkZpbGU6OmVuY29kZSgkdXJsKSAuICRyZXBvc2l0b3J5TWF0Y2hlc1snZW5kJ107Cn0sICRtYXRjaGVzWydyZXBvc2l0b3J5J10pIC4gJG1hdGNoZXNbJ2VuZCddOwoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGluc2VydFJlcG9zaXRvcnkoc3RyaW5nICRuYW1lLCAkY29uZmlnLCBzdHJpbmcgJHJlZmVyZW5jZU5hbWUsIGludCAkb2Zmc2V0ID0gMCk6IGJvb2wKewppZiAoIiIgIT09ICRuYW1lICYmICEkdGhpcy0+ZG9SZW1vdmVSZXBvc2l0b3J5KCRuYW1lKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICghJHRoaXMtPmRvQ29udmVydFJlcG9zaXRvcmllc0Zyb21Bc3NvY1RvTGlzdCgpKSB7CnJldHVybiBmYWxzZTsKfQoKJGluZGV4VG9JbnNlcnQgPSBudWxsOwokZGVjb2RlZCA9IEpzb25GaWxlOjpwYXJzZUpzb24oJHRoaXMtPmNvbnRlbnRzKTsKCmZvcmVhY2ggKCRkZWNvZGVkWydyZXBvc2l0b3JpZXMnXSBhcyAkcmVwb3NpdG9yeUluZGV4ID0+ICRyZXBvc2l0b3J5KSB7CmlmICgoJHJlcG9zaXRvcnlbJ25hbWUnXSA/PyBudWxsKSA9PT0gJHJlZmVyZW5jZU5hbWUpIHsKJGluZGV4VG9JbnNlcnQgPSAkcmVwb3NpdG9yeUluZGV4OwpicmVhazsKfQoKaWYgKCRyZXBvc2l0b3J5SW5kZXggPT09ICRyZWZlcmVuY2VOYW1lKSB7CiRpbmRleFRvSW5zZXJ0ID0gJHJlcG9zaXRvcnlJbmRleDsKYnJlYWs7Cn0KCmlmIChbJHJlZmVyZW5jZU5hbWUgPT4gZmFsc2VdID09PSAkcmVwb3NpdG9yeSkgewokaW5kZXhUb0luc2VydCA9ICRyZXBvc2l0b3J5SW5kZXg7CmJyZWFrOwp9Cn0KCmlmICgkaW5kZXhUb0luc2VydCA9PT0gbnVsbCkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmIChpc19hcnJheSgkY29uZmlnKSAmJiAhaXNfbnVtZXJpYygkbmFtZSkgJiYgJycgIT09ICRuYW1lKSB7CiRjb25maWcgPSBbJ25hbWUnID0+ICRuYW1lXSArICRjb25maWc7Cn0gZWxzZWlmICgkY29uZmlnID09PSBmYWxzZSkgewokY29uZmlnID0gWyduYW1lJyA9PiAkY29uZmlnXTsKfQoKcmV0dXJuICR0aGlzLT5pbnNlcnRMaXN0SXRlbSgncmVwb3NpdG9yaWVzJywgJGNvbmZpZywgJGluZGV4VG9JbnNlcnQgKyAkb2Zmc2V0KTsKfQoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZVJlcG9zaXRvcnkoc3RyaW5nICRuYW1lKTogYm9vbAp7CnJldHVybiAkdGhpcy0+ZG9SZW1vdmVSZXBvc2l0b3J5KCRuYW1lKSAmJiAkdGhpcy0+cmVtb3ZlTWFpbktleUlmRW1wdHkoJ3JlcG9zaXRvcmllcycpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGRvUmVtb3ZlUmVwb3NpdG9yeShzdHJpbmcgJG5hbWUpOiBib29sCnsKJGRlY29kZWQgPSBqc29uX2RlY29kZSgkdGhpcy0+Y29udGVudHMsIGZhbHNlKTsKJGlzQXNzb2MgPSAoJGRlY29kZWQtPnJlcG9zaXRvcmllcyA/PyBudWxsKSBpbnN0YW5jZW9mIFxzdGRDbGFzczsKCmZvcmVhY2ggKChhcnJheSkgKCRkZWNvZGVkLT5yZXBvc2l0b3JpZXMgPz8gW10pIGFzICRyZXBvc2l0b3J5SW5kZXggPT4gJHJlcG9zaXRvcnkpIHsKaWYgKCRyZXBvc2l0b3J5SW5kZXggPT09ICRuYW1lICYmICRpc0Fzc29jKSB7CmlmICghJHRoaXMtPnJlbW92ZVN1Yk5vZGUoJ3JlcG9zaXRvcmllcycsICRyZXBvc2l0b3J5SW5kZXgpKSB7CnJldHVybiBmYWxzZTsKfQoKYnJlYWs7Cn0KCmlmICgoJHJlcG9zaXRvcnktPm5hbWUgPz8gbnVsbCkgPT09ICRuYW1lKSB7CmlmICgkaXNBc3NvYykgewppZiAoISR0aGlzLT5yZW1vdmVTdWJOb2RlKCdyZXBvc2l0b3JpZXMnLCAoc3RyaW5nKSAkcmVwb3NpdG9yeUluZGV4KSkgewpyZXR1cm4gZmFsc2U7Cn0KfSBlbHNlIHsKaWYgKCEkdGhpcy0+cmVtb3ZlTGlzdEl0ZW0oJ3JlcG9zaXRvcmllcycsIChpbnQpICRyZXBvc2l0b3J5SW5kZXgpKSB7CnJldHVybiBmYWxzZTsKfQp9CgpicmVhazsKfQoKaWYgKCRpc0Fzc29jKSB7CmlmICgkbmFtZSA9PT0gJHJlcG9zaXRvcnlJbmRleCAmJiBmYWxzZSA9PT0gJHJlcG9zaXRvcnkpIHsKaWYgKCEkdGhpcy0+cmVtb3ZlU3ViTm9kZSgncmVwb3NpdG9yaWVzJywgJHJlcG9zaXRvcnlJbmRleCkpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQp9IGVsc2UgewokcmVwb3NpdG9yeUFzQXJyYXkgPSAoYXJyYXkpICRyZXBvc2l0b3J5OwoKaWYgKGZhbHNlID09PSAoJHJlcG9zaXRvcnlBc0FycmF5WyRuYW1lXSA/PyBudWxsKSAmJiAxID09PSBjb3VudCgkcmVwb3NpdG9yeUFzQXJyYXkpKSB7CmlmICghJHRoaXMtPnJlbW92ZUxpc3RJdGVtKCdyZXBvc2l0b3JpZXMnLCAoaW50KSAkcmVwb3NpdG9yeUluZGV4KSkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiB0cnVlOwp9Cn0KfQoKcmV0dXJuIHRydWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRDb25maWdTZXR0aW5nKHN0cmluZyAkbmFtZSwgJHZhbHVlKTogYm9vbAp7CnJldHVybiAkdGhpcy0+YWRkU3ViTm9kZSgnY29uZmlnJywgJG5hbWUsICR2YWx1ZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVDb25maWdTZXR0aW5nKHN0cmluZyAkbmFtZSk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPnJlbW92ZVN1Yk5vZGUoJ2NvbmZpZycsICRuYW1lKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFByb3BlcnR5KHN0cmluZyAkbmFtZSwgJHZhbHVlKTogYm9vbAp7CmlmIChzdHJwb3MoJG5hbWUsICdzdWdnZXN0LicpID09PSAwKSB7CnJldHVybiAkdGhpcy0+YWRkU3ViTm9kZSgnc3VnZ2VzdCcsIHN1YnN0cigkbmFtZSwgOCksICR2YWx1ZSk7Cn0KCmlmIChzdHJwb3MoJG5hbWUsICdleHRyYS4nKSA9PT0gMCkgewpyZXR1cm4gJHRoaXMtPmFkZFN1Yk5vZGUoJ2V4dHJhJywgc3Vic3RyKCRuYW1lLCA2KSwgJHZhbHVlKTsKfQoKaWYgKHN0cnBvcygkbmFtZSwgJ3NjcmlwdHMuJykgPT09IDApIHsKcmV0dXJuICR0aGlzLT5hZGRTdWJOb2RlKCdzY3JpcHRzJywgc3Vic3RyKCRuYW1lLCA4KSwgJHZhbHVlKTsKfQoKcmV0dXJuICR0aGlzLT5hZGRNYWluS2V5KCRuYW1lLCAkdmFsdWUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlUHJvcGVydHkoc3RyaW5nICRuYW1lKTogYm9vbAp7CmlmIChzdHJwb3MoJG5hbWUsICdzdWdnZXN0LicpID09PSAwKSB7CnJldHVybiAkdGhpcy0+cmVtb3ZlU3ViTm9kZSgnc3VnZ2VzdCcsIHN1YnN0cigkbmFtZSwgOCkpOwp9CgppZiAoc3RycG9zKCRuYW1lLCAnZXh0cmEuJykgPT09IDApIHsKcmV0dXJuICR0aGlzLT5yZW1vdmVTdWJOb2RlKCdleHRyYScsIHN1YnN0cigkbmFtZSwgNikpOwp9CgppZiAoc3RycG9zKCRuYW1lLCAnc2NyaXB0cy4nKSA9PT0gMCkgewpyZXR1cm4gJHRoaXMtPnJlbW92ZVN1Yk5vZGUoJ3NjcmlwdHMnLCBzdWJzdHIoJG5hbWUsIDgpKTsKfQoKaWYgKHN0cnBvcygkbmFtZSwgJ2F1dG9sb2FkLicpID09PSAwKSB7CnJldHVybiAkdGhpcy0+cmVtb3ZlU3ViTm9kZSgnYXV0b2xvYWQnLCBzdWJzdHIoJG5hbWUsIDkpKTsKfQoKaWYgKHN0cnBvcygkbmFtZSwgJ2F1dG9sb2FkLWRldi4nKSA9PT0gMCkgewpyZXR1cm4gJHRoaXMtPnJlbW92ZVN1Yk5vZGUoJ2F1dG9sb2FkLWRldicsIHN1YnN0cigkbmFtZSwgMTMpKTsKfQoKcmV0dXJuICR0aGlzLT5yZW1vdmVNYWluS2V5KCRuYW1lKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFN1Yk5vZGUoc3RyaW5nICRtYWluTm9kZSwgc3RyaW5nICRuYW1lLCAkdmFsdWUsIGJvb2wgJGFwcGVuZCA9IHRydWUpOiBib29sCnsKJGRlY29kZWQgPSBKc29uRmlsZTo6cGFyc2VKc29uKCR0aGlzLT5jb250ZW50cyk7Cgokc3ViTmFtZSA9IG51bGw7CmlmIChpbl9hcnJheSgkbWFpbk5vZGUsIFsnY29uZmlnJywgJ2V4dHJhJywgJ3NjcmlwdHMnXSkgJiYgZmFsc2UgIT09IHN0cnBvcygkbmFtZSwgJy4nKSkgewpbJG5hbWUsICRzdWJOYW1lXSA9IGV4cGxvZGUoJy4nLCAkbmFtZSwgMik7Cn0KCgppZiAoIWlzc2V0KCRkZWNvZGVkWyRtYWluTm9kZV0pKSB7CmlmICgkc3ViTmFtZSAhPT0gbnVsbCkgewokdGhpcy0+YWRkTWFpbktleSgkbWFpbk5vZGUsIFskbmFtZSA9PiBbJHN1Yk5hbWUgPT4gJHZhbHVlXV0pOwp9IGVsc2UgewokdGhpcy0+YWRkTWFpbktleSgkbWFpbk5vZGUsIFskbmFtZSA9PiAkdmFsdWVdKTsKfQoKcmV0dXJuIHRydWU7Cn0KCgokbm9kZVJlZ2V4ID0gJ3snLnNlbGY6OkRFRklORVMuJ14oP1A8c3RhcnQ+IFxzKiBceyBccyogKD86ICg/JnN0cmluZykgXHMqIDogKD8manNvbikgXHMqICwgXHMqICkqPycuCnByZWdfcXVvdGUoSnNvbkZpbGU6OmVuY29kZSgkbWFpbk5vZGUpKS4nXHMqOlxzKikoP1A8Y29udGVudD4oPyZvYmplY3QpKSg/UDxlbmQ+LiopfXN4JzsKCnRyeSB7CmlmICghUHJlZzo6aXNNYXRjaCgkbm9kZVJlZ2V4LCAkdGhpcy0+Y29udGVudHMsICRtYXRjaCkpIHsKcmV0dXJuIGZhbHNlOwp9Cn0gY2F0Y2ggKFxSdW50aW1lRXhjZXB0aW9uICRlKSB7CmlmICgkZS0+Z2V0Q29kZSgpID09PSBQUkVHX0JBQ0tUUkFDS19MSU1JVF9FUlJPUikgewpyZXR1cm4gZmFsc2U7Cn0KdGhyb3cgJGU7Cn0KCmFzc2VydChpc19zdHJpbmcoJG1hdGNoWydzdGFydCddKSk7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoWydjb250ZW50J10pKTsKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hbJ2VuZCddKSk7CgokY2hpbGRyZW4gPSAkbWF0Y2hbJ2NvbnRlbnQnXTsKCmlmICghQGpzb25fZGVjb2RlKCRjaGlsZHJlbikpIHsKcmV0dXJuIGZhbHNlOwp9CgoKJGNoaWxkUmVnZXggPSAneycuc2VsZjo6REVGSU5FUy4nKD9QPHN0YXJ0PiInLnByZWdfcXVvdGUoJG5hbWUpLiciXHMqOlxzKikoP1A8Y29udGVudD4oPyZqc29uKSkoP1A8ZW5kPiw/KX14JzsKaWYgKFByZWc6OmlzTWF0Y2goJGNoaWxkUmVnZXgsICRjaGlsZHJlbiwgJG1hdGNoZXMpKSB7CiRjaGlsZHJlbiA9IFByZWc6OnJlcGxhY2VDYWxsYmFjaygkY2hpbGRSZWdleCwgZnVuY3Rpb24gKCRtYXRjaGVzKSB1c2UgKCRzdWJOYW1lLCAkdmFsdWUpOiBzdHJpbmcgewppZiAoJHN1Yk5hbWUgIT09IG51bGwgJiYgaXNfc3RyaW5nKCRtYXRjaGVzWydjb250ZW50J10pKSB7CiRjdXJWYWwgPSBqc29uX2RlY29kZSgkbWF0Y2hlc1snY29udGVudCddLCB0cnVlKTsKaWYgKCFpc19hcnJheSgkY3VyVmFsKSkgewokY3VyVmFsID0gW107Cn0KJGN1clZhbFskc3ViTmFtZV0gPSAkdmFsdWU7CiR2YWx1ZSA9ICRjdXJWYWw7Cn0KCnJldHVybiAkbWF0Y2hlc1snc3RhcnQnXSAuICR0aGlzLT5mb3JtYXQoJHZhbHVlLCAxKSAuICRtYXRjaGVzWydlbmQnXTsKfSwgJGNoaWxkcmVuKTsKfSBlbHNlaWYgKFByZWc6OmlzTWF0Y2goJyNeXHsoP1A8bGVhZGluZ3NwYWNlPlxzKj8pKD9QPGNvbnRlbnQ+XFMrLio/KT8oP1A8dHJhaWxpbmdzcGFjZT5ccyopXH0kI3MnLCAkY2hpbGRyZW4sICRtYXRjaCkpIHsKJHdoaXRlc3BhY2UgPSAkbWF0Y2hbJ3RyYWlsaW5nc3BhY2UnXTsKaWYgKG51bGwgIT09ICRtYXRjaFsnY29udGVudCddKSB7CmlmICgkc3ViTmFtZSAhPT0gbnVsbCkgewokdmFsdWUgPSBbJHN1Yk5hbWUgPT4gJHZhbHVlXTsKfQoKCmlmICgkYXBwZW5kKSB7CiRjaGlsZHJlbiA9IFByZWc6OnJlcGxhY2UoCicjJy4kd2hpdGVzcGFjZS4nfSQjJywKYWRkY3NsYXNoZXMoJywnIC4gJHRoaXMtPm5ld2xpbmUgLiAkdGhpcy0+aW5kZW50IC4gJHRoaXMtPmluZGVudCAuIEpzb25GaWxlOjplbmNvZGUoJG5hbWUpLic6ICcuJHRoaXMtPmZvcm1hdCgkdmFsdWUsIDEpIC4gJHdoaXRlc3BhY2UgLiAnfScsICdcXCQnKSwKJGNoaWxkcmVuCik7Cn0gZWxzZSB7CiR3aGl0ZXNwYWNlID0gJG1hdGNoWydsZWFkaW5nc3BhY2UnXTsKJGNoaWxkcmVuID0gUHJlZzo6cmVwbGFjZSgKJyNeeycuJHdoaXRlc3BhY2UuJyMnLAphZGRjc2xhc2hlcygneycgLiAkd2hpdGVzcGFjZSAuIEpzb25GaWxlOjplbmNvZGUoJG5hbWUpLic6ICcuJHRoaXMtPmZvcm1hdCgkdmFsdWUsIDEpIC4gJywnIC4gJHRoaXMtPm5ld2xpbmUgLiAkdGhpcy0+aW5kZW50IC4gJHRoaXMtPmluZGVudCwgJ1xcJCcpLAokY2hpbGRyZW4KKTsKfQp9IGVsc2UgewppZiAoJHN1Yk5hbWUgIT09IG51bGwpIHsKJHZhbHVlID0gWyRzdWJOYW1lID0+ICR2YWx1ZV07Cn0KCgokY2hpbGRyZW4gPSAneycgLiAkdGhpcy0+bmV3bGluZSAuICR0aGlzLT5pbmRlbnQgLiAkdGhpcy0+aW5kZW50IC4gSnNvbkZpbGU6OmVuY29kZSgkbmFtZSkuJzogJy4kdGhpcy0+Zm9ybWF0KCR2YWx1ZSwgMSkgLiAkd2hpdGVzcGFjZSAuICd9JzsKfQp9IGVsc2Ugewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdOb3RoaW5nIG1hdGNoZWQgYWJvdmUgZm9yOiAnLiRjaGlsZHJlbik7Cn0KCiR0aGlzLT5jb250ZW50cyA9IFByZWc6OnJlcGxhY2VDYWxsYmFjaygkbm9kZVJlZ2V4LCBzdGF0aWMgZnVuY3Rpb24gKCRtKSB1c2UgKCRjaGlsZHJlbik6IHN0cmluZyB7CnJldHVybiAkbVsnc3RhcnQnXSAuICRjaGlsZHJlbiAuICRtWydlbmQnXTsKfSwgJHRoaXMtPmNvbnRlbnRzKTsKCnJldHVybiB0cnVlOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlU3ViTm9kZShzdHJpbmcgJG1haW5Ob2RlLCBzdHJpbmcgJG5hbWUpOiBib29sCnsKJGRlY29kZWQgPSBKc29uRmlsZTo6cGFyc2VKc29uKCR0aGlzLT5jb250ZW50cyk7CgoKaWYgKGVtcHR5KCRkZWNvZGVkWyRtYWluTm9kZV0pKSB7CnJldHVybiB0cnVlOwp9CgoKJG5vZGVSZWdleCA9ICd7Jy5zZWxmOjpERUZJTkVTLideKD9QPHN0YXJ0PiBccyogXHsgXHMqICg/OiAoPyZzdHJpbmcpIFxzKiA6ICg/Jmpzb24pIFxzKiAsIFxzKiApKj8nLgpwcmVnX3F1b3RlKEpzb25GaWxlOjplbmNvZGUoJG1haW5Ob2RlKSkuJ1xzKjpccyopKD9QPGNvbnRlbnQ+KD8mb2JqZWN0KSkoP1A8ZW5kPi4qKX1zeCc7CnRyeSB7CmlmICghUHJlZzo6aXNNYXRjaCgkbm9kZVJlZ2V4LCAkdGhpcy0+Y29udGVudHMsICRtYXRjaCkpIHsKcmV0dXJuIGZhbHNlOwp9Cn0gY2F0Y2ggKFxSdW50aW1lRXhjZXB0aW9uICRlKSB7CmlmICgkZS0+Z2V0Q29kZSgpID09PSBQUkVHX0JBQ0tUUkFDS19MSU1JVF9FUlJPUikgewpyZXR1cm4gZmFsc2U7Cn0KdGhyb3cgJGU7Cn0KCmFzc2VydChpc19zdHJpbmcoJG1hdGNoWydzdGFydCddKSk7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoWydjb250ZW50J10pKTsKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hbJ2VuZCddKSk7CgokY2hpbGRyZW4gPSAkbWF0Y2hbJ2NvbnRlbnQnXTsKCgppZiAoIUBqc29uX2RlY29kZSgkY2hpbGRyZW4sIHRydWUpKSB7CnJldHVybiBmYWxzZTsKfQoKJHN1Yk5hbWUgPSBudWxsOwppZiAoaW5fYXJyYXkoJG1haW5Ob2RlLCBbJ2NvbmZpZycsICdleHRyYScsICdzY3JpcHRzJ10pICYmIGZhbHNlICE9PSBzdHJwb3MoJG5hbWUsICcuJykpIHsKWyRuYW1lLCAkc3ViTmFtZV0gPSBleHBsb2RlKCcuJywgJG5hbWUsIDIpOwp9CgoKaWYgKCFpc3NldCgkZGVjb2RlZFskbWFpbk5vZGVdWyRuYW1lXSkgfHwgKCRzdWJOYW1lICYmICFpc3NldCgkZGVjb2RlZFskbWFpbk5vZGVdWyRuYW1lXVskc3ViTmFtZV0pKSkgewpyZXR1cm4gdHJ1ZTsKfQoKCiRrZXlSZWdleCA9IHN0cl9yZXBsYWNlKCcvJywgJ1xcXFw/LycsIHByZWdfcXVvdGUoJG5hbWUpKTsKaWYgKFByZWc6OmlzTWF0Y2goJ3siJy4ka2V5UmVnZXguJyJccyo6fWknLCAkY2hpbGRyZW4pKSB7CgppZiAoUHJlZzo6aXNNYXRjaEFsbCgneycuc2VsZjo6REVGSU5FUy4nIicuJGtleVJlZ2V4LiciXHMqOlxzKig/Oig/Jmpzb24pKX14JywgJGNoaWxkcmVuLCAkbWF0Y2hlcykpIHsKJGJlc3RNYXRjaCA9ICcnOwpmb3JlYWNoICgkbWF0Y2hlc1swXSBhcyAkbWF0Y2gpIHsKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2gpKTsKaWYgKHN0cmxlbigkYmVzdE1hdGNoKSA8IHN0cmxlbigkbWF0Y2gpKSB7CiRiZXN0TWF0Y2ggPSAkbWF0Y2g7Cn0KfQokY2hpbGRyZW5DbGVhbiA9IFByZWc6OnJlcGxhY2UoJ3ssXHMqJy5wcmVnX3F1b3RlKCRiZXN0TWF0Y2gpLid9aScsICcnLCAkY2hpbGRyZW4sIC0xLCAkY291bnQpOwppZiAoMSAhPT0gJGNvdW50KSB7CiRjaGlsZHJlbkNsZWFuID0gUHJlZzo6cmVwbGFjZSgneycucHJlZ19xdW90ZSgkYmVzdE1hdGNoKS4nXHMqLD9ccyp9aScsICcnLCAkY2hpbGRyZW5DbGVhbiwgLTEsICRjb3VudCk7CmlmICgxICE9PSAkY291bnQpIHsKcmV0dXJuIGZhbHNlOwp9Cn0KfQp9IGVsc2UgewokY2hpbGRyZW5DbGVhbiA9ICRjaGlsZHJlbjsKfQoKaWYgKCFpc3NldCgkY2hpbGRyZW5DbGVhbikpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkpzb25NYW5pcHVsYXRvcjogXCRjaGlsZHJlbkNsZWFuIGlzIG5vdCBkZWZpbmVkLiBQbGVhc2UgcmVwb3J0IGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9jb21wb3Nlci9pc3N1ZXMvbmV3LiIpOwp9CgoKdW5zZXQoJG1hdGNoKTsKaWYgKFByZWc6OmlzTWF0Y2goJyNeXHtccyo/KD9QPGNvbnRlbnQ+XFMrLio/KT8oP1A8dHJhaWxpbmdzcGFjZT5ccyopXH0kI3MnLCAkY2hpbGRyZW5DbGVhbiwgJG1hdGNoKSkgewppZiAobnVsbCA9PT0gJG1hdGNoWydjb250ZW50J10pIHsKJG5ld2xpbmUgPSAkdGhpcy0+bmV3bGluZTsKJGluZGVudCA9ICR0aGlzLT5pbmRlbnQ7CgokdGhpcy0+Y29udGVudHMgPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJG5vZGVSZWdleCwgc3RhdGljIGZ1bmN0aW9uICgkbWF0Y2hlcykgdXNlICgkaW5kZW50LCAkbmV3bGluZSk6IHN0cmluZyB7CnJldHVybiAkbWF0Y2hlc1snc3RhcnQnXSAuICd7JyAuICRuZXdsaW5lIC4gJGluZGVudCAuICd9JyAuICRtYXRjaGVzWydlbmQnXTsKfSwgJHRoaXMtPmNvbnRlbnRzKTsKCgppZiAoJHN1Yk5hbWUgIT09IG51bGwpIHsKJGN1clZhbCA9IGpzb25fZGVjb2RlKCRjaGlsZHJlbiwgdHJ1ZSk7CnVuc2V0KCRjdXJWYWxbJG5hbWVdWyRzdWJOYW1lXSk7CmlmICgkY3VyVmFsWyRuYW1lXSA9PT0gW10pIHsKJGN1clZhbFskbmFtZV0gPSBuZXcgXEFycmF5T2JqZWN0KCk7Cn0KJHRoaXMtPmFkZFN1Yk5vZGUoJG1haW5Ob2RlLCAkbmFtZSwgJGN1clZhbFskbmFtZV0pOwp9CgpyZXR1cm4gdHJ1ZTsKfQp9CgokdGhpcy0+Y29udGVudHMgPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJG5vZGVSZWdleCwgZnVuY3Rpb24gKCRtYXRjaGVzKSB1c2UgKCRuYW1lLCAkc3ViTmFtZSwgJGNoaWxkcmVuQ2xlYW4pOiBzdHJpbmcgewphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaGVzWydjb250ZW50J10pKTsKaWYgKCRzdWJOYW1lICE9PSBudWxsKSB7CiRjdXJWYWwgPSBqc29uX2RlY29kZSgkbWF0Y2hlc1snY29udGVudCddLCB0cnVlKTsKdW5zZXQoJGN1clZhbFskbmFtZV1bJHN1Yk5hbWVdKTsKaWYgKCRjdXJWYWxbJG5hbWVdID09PSBbXSkgewokY3VyVmFsWyRuYW1lXSA9IG5ldyBcQXJyYXlPYmplY3QoKTsKfQokY2hpbGRyZW5DbGVhbiA9ICR0aGlzLT5mb3JtYXQoJGN1clZhbCwgMCwgdHJ1ZSk7Cn0KCnJldHVybiAkbWF0Y2hlc1snc3RhcnQnXSAuICRjaGlsZHJlbkNsZWFuIC4gJG1hdGNoZXNbJ2VuZCddOwp9LCAkdGhpcy0+Y29udGVudHMpOwoKcmV0dXJuIHRydWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRMaXN0SXRlbShzdHJpbmcgJG1haW5Ob2RlLCAkdmFsdWUsIGJvb2wgJGFwcGVuZCA9IHRydWUpOiBib29sCnsKJGRlY29kZWQgPSBKc29uRmlsZTo6cGFyc2VKc29uKCR0aGlzLT5jb250ZW50cyk7CgoKaWYgKCFpc3NldCgkZGVjb2RlZFskbWFpbk5vZGVdKSkgewppZiAoISR0aGlzLT5hZGRNYWluS2V5KCRtYWluTm9kZSwgW10pKSB7CnJldHVybiBmYWxzZTsKfQp9CgoKJG5vZGVSZWdleCA9ICd7Jy5zZWxmOjpERUZJTkVTLideKD9QPHN0YXJ0PiBccyogXHsgXHMqICg/OiAoPyZzdHJpbmcpIFxzKiA6ICg/Jmpzb24pIFxzKiAsIFxzKiApKj8nLgpwcmVnX3F1b3RlKEpzb25GaWxlOjplbmNvZGUoJG1haW5Ob2RlKSkuJ1xzKjpccyopKD9QPGNvbnRlbnQ+KD8mYXJyYXkpKSg/UDxlbmQ+LiopfXN4JzsKCnRyeSB7CmlmICghUHJlZzo6aXNNYXRjaCgkbm9kZVJlZ2V4LCAkdGhpcy0+Y29udGVudHMsICRtYXRjaCkpIHsKcmV0dXJuIGZhbHNlOwp9Cn0gY2F0Y2ggKFxSdW50aW1lRXhjZXB0aW9uICRlKSB7CmlmICgkZS0+Z2V0Q29kZSgpID09PSBQUkVHX0JBQ0tUUkFDS19MSU1JVF9FUlJPUikgewpyZXR1cm4gZmFsc2U7Cn0KdGhyb3cgJGU7Cn0KCmFzc2VydChpc19zdHJpbmcoJG1hdGNoWydzdGFydCddKSk7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoWydjb250ZW50J10pKTsKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hbJ2VuZCddKSk7CgokY2hpbGRyZW4gPSAkbWF0Y2hbJ2NvbnRlbnQnXTsKCmlmIChmYWxzZSA9PT0gQGpzb25fZGVjb2RlKCRjaGlsZHJlbikpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoUHJlZzo6aXNNYXRjaCgnI15cWyg/UDxsZWFkaW5nc3BhY2U+XHMqPykoP1A8Y29udGVudD5cUysuKj8pPyg/UDx0cmFpbGluZ3NwYWNlPlxzKilcXSQjcycsICRjaGlsZHJlbiwgJG1hdGNoKSkgewokbGVhZGluZ1doaXRlc3BhY2UgPSAkbWF0Y2hbJ2xlYWRpbmdzcGFjZSddOwokd2hpdGVzcGFjZSA9ICRtYXRjaFsndHJhaWxpbmdzcGFjZSddOwokbGVhZGluZ0l0ZW1XaGl0ZXNwYWNlID0gJHRoaXMtPm5ld2xpbmUgLiAkdGhpcy0+aW5kZW50IC4gJHRoaXMtPmluZGVudDsKJHRyYWlsaW5nSXRlbVdoaXRlc3BhY2UgPSAkd2hpdGVzcGFjZTsKJGl0ZW1EZXB0aCA9IDE7CgoKaWYgKCFzdHJfY29udGFpbnMoJHdoaXRlc3BhY2UsICR0aGlzLT5uZXdsaW5lKSkgewokbGVhZGluZ0l0ZW1XaGl0ZXNwYWNlID0gJGxlYWRpbmdXaGl0ZXNwYWNlOwokdHJhaWxpbmdJdGVtV2hpdGVzcGFjZSA9ICRsZWFkaW5nV2hpdGVzcGFjZTsKJGl0ZW1EZXB0aCA9IDA7Cn0KCmlmIChudWxsICE9PSAkbWF0Y2hbJ2NvbnRlbnQnXSkgewoKaWYgKCRhcHBlbmQpIHsKJGNoaWxkcmVuID0gUHJlZzo6cmVwbGFjZSgKJyMnLiR3aGl0ZXNwYWNlLiddJCMnLAphZGRjc2xhc2hlcygnLCcgLiAkbGVhZGluZ0l0ZW1XaGl0ZXNwYWNlIC4gJHRoaXMtPmZvcm1hdCgkdmFsdWUsICRpdGVtRGVwdGgpIC4gJHRyYWlsaW5nSXRlbVdoaXRlc3BhY2UgLiAnXScsICdcXCQnKSwKJGNoaWxkcmVuCik7Cn0gZWxzZSB7CiR3aGl0ZXNwYWNlID0gJG1hdGNoWydsZWFkaW5nc3BhY2UnXTsKJGNoaWxkcmVuID0gUHJlZzo6cmVwbGFjZSgKJyNeXFsnLiR3aGl0ZXNwYWNlLicjJywKYWRkY3NsYXNoZXMoJ1snIC4gJHdoaXRlc3BhY2UgLiAkdGhpcy0+Zm9ybWF0KCR2YWx1ZSwgJGl0ZW1EZXB0aCkgLiAnLCcgLiAkbGVhZGluZ0l0ZW1XaGl0ZXNwYWNlLCAnXFwkJyksCiRjaGlsZHJlbgopOwp9Cn0gZWxzZSB7CgokY2hpbGRyZW4gPSAnWycgLiAkbGVhZGluZ0l0ZW1XaGl0ZXNwYWNlIC4gJHRoaXMtPmZvcm1hdCgkdmFsdWUsICRpdGVtRGVwdGgpIC4gJHRyYWlsaW5nSXRlbVdoaXRlc3BhY2UgLiAnXSc7Cn0KfSBlbHNlIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignTm90aGluZyBtYXRjaGVkIGFib3ZlIGZvcjogJy4kY2hpbGRyZW4pOwp9CgokdGhpcy0+Y29udGVudHMgPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJG5vZGVSZWdleCwgc3RhdGljIGZ1bmN0aW9uICgkbSkgdXNlICgkY2hpbGRyZW4pOiBzdHJpbmcgewpyZXR1cm4gJG1bJ3N0YXJ0J10gLiAkY2hpbGRyZW4gLiAkbVsnZW5kJ107Cn0sICR0aGlzLT5jb250ZW50cyk7CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGluc2VydExpc3RJdGVtKHN0cmluZyAkbWFpbk5vZGUsICR2YWx1ZSwgaW50ICRpbmRleCk6IGJvb2wKewppZiAoJGluZGV4IDwgMCkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW5kZXggY2FuIG9ubHkgYmUgcG9zaXRpdmUgaW50ZWdlcicpOwp9CgppZiAoJGluZGV4ID09PSAwKSB7CnJldHVybiAkdGhpcy0+YWRkTGlzdEl0ZW0oJG1haW5Ob2RlLCAkdmFsdWUsIGZhbHNlKTsKfQoKJGRlY29kZWQgPSBKc29uRmlsZTo6cGFyc2VKc29uKCR0aGlzLT5jb250ZW50cyk7CgoKaWYgKCFpc3NldCgkZGVjb2RlZFskbWFpbk5vZGVdKSkgewppZiAoISR0aGlzLT5hZGRNYWluS2V5KCRtYWluTm9kZSwgW10pKSB7CnJldHVybiBmYWxzZTsKfQp9CgppZiAoY291bnQoJGRlY29kZWRbJG1haW5Ob2RlXSkgPT09ICRpbmRleCkgewpyZXR1cm4gJHRoaXMtPmFkZExpc3RJdGVtKCRtYWluTm9kZSwgJHZhbHVlLCB0cnVlKTsKfQoKCiRub2RlUmVnZXggPSAneycuc2VsZjo6REVGSU5FUy4nXig/UDxzdGFydD4gXHMqIFx7IFxzKiAoPzogKD8mc3RyaW5nKSBccyogOiAoPyZqc29uKSBccyogLCBccyogKSo/Jy4KcHJlZ19xdW90ZShKc29uRmlsZTo6ZW5jb2RlKCRtYWluTm9kZSkpLidccyo6XHMqKSg/UDxjb250ZW50Pig/JmFycmF5KSkoP1A8ZW5kPi4qKX1zeCc7Cgp0cnkgewppZiAoIVByZWc6OmlzTWF0Y2goJG5vZGVSZWdleCwgJHRoaXMtPmNvbnRlbnRzLCAkbWF0Y2gpKSB7CnJldHVybiBmYWxzZTsKfQp9IGNhdGNoIChcUnVudGltZUV4Y2VwdGlvbiAkZSkgewppZiAoJGUtPmdldENvZGUoKSA9PT0gUFJFR19CQUNLVFJBQ0tfTElNSVRfRVJST1IpIHsKcmV0dXJuIGZhbHNlOwp9CnRocm93ICRlOwp9Cgphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaFsnc3RhcnQnXSkpOwphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaFsnY29udGVudCddKSk7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoWydlbmQnXSkpOwoKJGNoaWxkcmVuID0gJG1hdGNoWydjb250ZW50J107CgppZiAoZmFsc2UgPT09IEBqc29uX2RlY29kZSgkY2hpbGRyZW4pKSB7CnJldHVybiBmYWxzZTsKfQoKJGxpc3RTa2lwVG9JdGVtUmVnZXggPSAneycuc2VsZjo6REVGSU5FUy4nXig/UDxzdGFydD5cW1xzKigoPyZqc29uKVxzKissXHMqPyl7JyAuIG1heCgwLCAkaW5kZXgpIC4gJ30pKD9QPHNwYWNlX2JlZm9yZV9pdGVtPihccyopKSg/UDxlbmQ+LiopfXN4JzsKCiRjaGlsZHJlbiA9IFByZWc6OnJlcGxhY2VDYWxsYmFjaygkbGlzdFNraXBUb0l0ZW1SZWdleCwgZnVuY3Rpb24gKCRtKSB1c2UgKCR2YWx1ZSk6IHN0cmluZyB7CnJldHVybiAkbVsnc3RhcnQnXSAuICRtWydzcGFjZV9iZWZvcmVfaXRlbSddIC4gJHRoaXMtPmZvcm1hdCgkdmFsdWUsIDEpIC4gJywnIC4gJG1bJ3NwYWNlX2JlZm9yZV9pdGVtJ10gLiAkbVsnZW5kJ107Cn0sICRjaGlsZHJlbik7CgokdGhpcy0+Y29udGVudHMgPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJG5vZGVSZWdleCwgc3RhdGljIGZ1bmN0aW9uICgkbSkgdXNlICgkY2hpbGRyZW4pOiBzdHJpbmcgewpyZXR1cm4gJG1bJ3N0YXJ0J10gLiAkY2hpbGRyZW4gLiAkbVsnZW5kJ107Cn0sICR0aGlzLT5jb250ZW50cyk7CgpyZXR1cm4gdHJ1ZTsKfQoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZUxpc3RJdGVtKHN0cmluZyAkbWFpbk5vZGUsIGludCAkbm9kZUluZGV4KTogYm9vbAp7CgppZiAoJG5vZGVJbmRleCA8IDApIHsKcmV0dXJuIHRydWU7Cn0KCiRkZWNvZGVkID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkdGhpcy0+Y29udGVudHMpOwoKCmlmIChbXSA9PT0gJGRlY29kZWRbJG1haW5Ob2RlXSkgewpyZXR1cm4gdHJ1ZTsKfQoKCiRub2RlUmVnZXggPSAneycuc2VsZjo6REVGSU5FUy4nXig/UDxzdGFydD4gXHMqIFx7IFxzKiAoPzogKD8mc3RyaW5nKSBccyogOiAoPyZqc29uKSBccyogLCBccyogKSo/Jy4KcHJlZ19xdW90ZShKc29uRmlsZTo6ZW5jb2RlKCRtYWluTm9kZSkpLidccyo6XHMqKSg/UDxjb250ZW50Pig/JmFycmF5KSkoP1A8ZW5kPi4qKX1zeCc7CnRyeSB7CmlmICghUHJlZzo6aXNNYXRjaCgkbm9kZVJlZ2V4LCAkdGhpcy0+Y29udGVudHMsICRtYXRjaCkpIHsKcmV0dXJuIGZhbHNlOwp9Cn0gY2F0Y2ggKFxSdW50aW1lRXhjZXB0aW9uICRlKSB7CmlmICgkZS0+Z2V0Q29kZSgpID09PSBQUkVHX0JBQ0tUUkFDS19MSU1JVF9FUlJPUikgewpyZXR1cm4gZmFsc2U7Cn0KdGhyb3cgJGU7Cn0KCmFzc2VydChpc19zdHJpbmcoJG1hdGNoWydzdGFydCddKSk7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoWydjb250ZW50J10pKTsKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hbJ2VuZCddKSk7CgokY2hpbGRyZW4gPSAkbWF0Y2hbJ2NvbnRlbnQnXTsKCgppZiAoZmFsc2UgPT09IEBqc29uX2RlY29kZSgkY2hpbGRyZW4sIHRydWUpKSB7CnJldHVybiBmYWxzZTsKfQoKCmlmICghaXNzZXQoJGRlY29kZWRbJG1haW5Ob2RlXVskbm9kZUluZGV4XSkpIHsKcmV0dXJuIHRydWU7Cn0KCiRjb250ZW50UmVnZXggPSAnKD8manNvbiknOwoKaWYgKCRub2RlSW5kZXggPiAxKSB7CiRzdGFydFJlZ2V4ID0gJyg/Jmpzb24pXHMqKyg/OiwoPyZqc29uKVxzKispeycgLiAoJG5vZGVJbmRleCAtIDEpIC4gJ30nOwoKJGNvbnRlbnRSZWdleCA9ICdccyorLD9ccyorJyAuICRjb250ZW50UmVnZXg7CiRlbmRSZWdleCA9ICcoPzooXHMqKyxccyorKD8manNvbikpKig/OlxzKisoPyZqc29uKSk/KVxzKisnOwp9IGVsc2VpZiAoJG5vZGVJbmRleCA+IDApIHsKJHN0YXJ0UmVnZXggPSAnKD8manNvbilccyorJzsKCiRjb250ZW50UmVnZXggPSAnXHMqKyw/XHMqKycgLiAkY29udGVudFJlZ2V4OwokZW5kUmVnZXggPSAnKD86KFxzKissXHMqKyg/Jmpzb24pKSooPzpccyorKD8manNvbikpPylccyorJzsKfSBlbHNlIHsKJHN0YXJ0UmVnZXggPSAnXHMqKyc7CgokY29udGVudFJlZ2V4ID0gJGNvbnRlbnRSZWdleCAuICdccyorLD9ccyorJzsKJGVuZFJlZ2V4ID0gJyg/OigoPyZqc29uKVxzKissXHMqKykqKD86XHMqKyg/Jmpzb24pKT8pXHMqKyc7Cn0KCmlmIChQcmVnOjppc01hdGNoKCd7Jy5zZWxmOjpERUZJTkVTLicoP1A8c3RhcnQ+XFsnIC4gJHN0YXJ0UmVnZXggLiAnKSg/UDxjb250ZW50PicgLiAkY29udGVudFJlZ2V4IC4gJykoP1A8ZW5kPicgLiAkZW5kUmVnZXggLiAnXF0pfXN4JywgJGNoaWxkcmVuLCAkY2hpbGRNYXRjaCkpIHsKJHRoaXMtPmNvbnRlbnRzID0gJG1hdGNoWydzdGFydCddIC4gJGNoaWxkTWF0Y2hbJ3N0YXJ0J10gLiAkY2hpbGRNYXRjaFsnZW5kJ10gLiAkbWF0Y2hbJ2VuZCddOwoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZE1haW5LZXkoc3RyaW5nICRrZXksICRjb250ZW50KTogYm9vbAp7CiRkZWNvZGVkID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkdGhpcy0+Y29udGVudHMpOwokY29udGVudCA9ICR0aGlzLT5mb3JtYXQoJGNvbnRlbnQpOwoKCiRyZWdleCA9ICd7Jy5zZWxmOjpERUZJTkVTLideKD9QPHN0YXJ0PlxzKlx7XHMqKD86KD8mc3RyaW5nKVxzKjpccyooPyZqc29uKVxzKixccyopKj8pJy4KJyg/UDxrZXk+Jy5wcmVnX3F1b3RlKEpzb25GaWxlOjplbmNvZGUoJGtleSkpLidccyo6XHMqKD8manNvbikpKD9QPGVuZD4uKil9c3gnOwppZiAoaXNzZXQoJGRlY29kZWRbJGtleV0pICYmIFByZWc6OmlzTWF0Y2goJHJlZ2V4LCAkdGhpcy0+Y29udGVudHMsICRtYXRjaGVzKSkgewoKaWYgKCFAanNvbl9kZWNvZGUoJ3snLiRtYXRjaGVzWydrZXknXS4nfScpKSB7CnJldHVybiBmYWxzZTsKfQoKJHRoaXMtPmNvbnRlbnRzID0gJG1hdGNoZXNbJ3N0YXJ0J10gLiBKc29uRmlsZTo6ZW5jb2RlKCRrZXkpLic6ICcuJGNvbnRlbnQgLiAkbWF0Y2hlc1snZW5kJ107CgpyZXR1cm4gdHJ1ZTsKfQoKCmlmIChQcmVnOjppc01hdGNoKCcjW157XHNdKFxzKilcfSQjJywgJHRoaXMtPmNvbnRlbnRzLCAkbWF0Y2gpKSB7CiR0aGlzLT5jb250ZW50cyA9IFByZWc6OnJlcGxhY2UoCicjJy4kbWF0Y2hbMV0uJ1x9JCMnLAphZGRjc2xhc2hlcygnLCcgLiAkdGhpcy0+bmV3bGluZSAuICR0aGlzLT5pbmRlbnQgLiBKc29uRmlsZTo6ZW5jb2RlKCRrZXkpLiAnOiAnLiAkY29udGVudCAuICR0aGlzLT5uZXdsaW5lIC4gJ30nLCAnXFwkJyksCiR0aGlzLT5jb250ZW50cwopOwoKcmV0dXJuIHRydWU7Cn0KCgokdGhpcy0+Y29udGVudHMgPSBQcmVnOjpyZXBsYWNlKAonI1x9JCMnLAphZGRjc2xhc2hlcygkdGhpcy0+aW5kZW50IC4gSnNvbkZpbGU6OmVuY29kZSgka2V5KS4gJzogJy4kY29udGVudCAuICR0aGlzLT5uZXdsaW5lIC4gJ30nLCAnXFwkJyksCiR0aGlzLT5jb250ZW50cwopOwoKcmV0dXJuIHRydWU7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVNYWluS2V5KHN0cmluZyAka2V5KTogYm9vbAp7CiRkZWNvZGVkID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkdGhpcy0+Y29udGVudHMpOwoKaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRrZXksICRkZWNvZGVkKSkgewpyZXR1cm4gdHJ1ZTsKfQoKCiRyZWdleCA9ICd7Jy5zZWxmOjpERUZJTkVTLideKD9QPHN0YXJ0PlxzKlx7XHMqKD86KD8mc3RyaW5nKVxzKjpccyooPyZqc29uKVxzKixccyopKj8pJy4KJyg/UDxyZW1vdmFsPicucHJlZ19xdW90ZShKc29uRmlsZTo6ZW5jb2RlKCRrZXkpKS4nXHMqOlxzKig/Jmpzb24pKVxzKiw/XHMqKD9QPGVuZD4uKil9c3gnOwppZiAoUHJlZzo6aXNNYXRjaCgkcmVnZXgsICR0aGlzLT5jb250ZW50cywgJG1hdGNoZXMpKSB7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoZXNbJ3N0YXJ0J10pKTsKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hlc1sncmVtb3ZhbCddKSk7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoZXNbJ2VuZCddKSk7CgoKaWYgKCFAanNvbl9kZWNvZGUoJ3snLiRtYXRjaGVzWydyZW1vdmFsJ10uJ30nKSkgewpyZXR1cm4gZmFsc2U7Cn0KCgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnIyxccyokIycsICRtYXRjaGVzWydzdGFydCddKSAmJiBQcmVnOjppc01hdGNoKCcjXlx9JCMnLCAkbWF0Y2hlc1snZW5kJ10pKSB7CiRtYXRjaGVzWydzdGFydCddID0gcnRyaW0oUHJlZzo6cmVwbGFjZSgnIywoXHMqKSQjJywgJyQxJywgJG1hdGNoZXNbJ3N0YXJ0J10pLCAkdGhpcy0+aW5kZW50KTsKfQoKJHRoaXMtPmNvbnRlbnRzID0gJG1hdGNoZXNbJ3N0YXJ0J10gLiAkbWF0Y2hlc1snZW5kJ107CmlmIChQcmVnOjppc01hdGNoKCcjXlx7XHMqXH1ccyokIycsICR0aGlzLT5jb250ZW50cykpIHsKJHRoaXMtPmNvbnRlbnRzID0gIntcbn0iOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIGZhbHNlOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hhbmdlRW1wdHlNYWluS2V5RnJvbUFzc29jVG9MaXN0KHN0cmluZyAka2V5KTogYm9vbAp7CiRkZWNvZGVkID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkdGhpcy0+Y29udGVudHMpOwoKaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRrZXksICRkZWNvZGVkKSkgewpyZXR1cm4gdHJ1ZTsKfQoKJHJlZ2V4ID0gJ3snLnNlbGY6OkRFRklORVMuJ14oP1A8c3RhcnQ+XHMqXHtccyooPzooPyZzdHJpbmcpXHMqOlxzKig/Jmpzb24pXHMqLFxzKikqPycucHJlZ19xdW90ZShKc29uRmlsZTo6ZW5jb2RlKCRrZXkpKS4nXHMqOlxzKikoP1A8cmVtb3ZhbD5ceyg/UDxyZW1vdmFsX3NwYWNlPlxzKispXH0pKD9QPGVuZD5ccyosP1xzKi4qKX1zeCc7CmlmIChQcmVnOjppc01hdGNoKCRyZWdleCwgJHRoaXMtPmNvbnRlbnRzLCAkbWF0Y2hlcykpIHsKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hlc1snc3RhcnQnXSkpOwphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaGVzWydyZW1vdmFsJ10pKTsKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hlc1snZW5kJ10pKTsKCgppZiAoZmFsc2UgPT09IEBqc29uX2RlY29kZSgkbWF0Y2hlc1sncmVtb3ZhbCddKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiR0aGlzLT5jb250ZW50cyA9ICRtYXRjaGVzWydzdGFydCddIC4gJ1snIC4gJG1hdGNoZXNbJ3JlbW92YWxfc3BhY2UnXSAuICddJyAuICRtYXRjaGVzWydlbmQnXTsKCnJldHVybiB0cnVlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVNYWluS2V5SWZFbXB0eShzdHJpbmcgJGtleSk6IGJvb2wKewokZGVjb2RlZCA9IEpzb25GaWxlOjpwYXJzZUpzb24oJHRoaXMtPmNvbnRlbnRzKTsKCmlmICghYXJyYXlfa2V5X2V4aXN0cygka2V5LCAkZGVjb2RlZCkpIHsKcmV0dXJuIHRydWU7Cn0KCmlmIChpc19hcnJheSgkZGVjb2RlZFska2V5XSkgJiYgY291bnQoJGRlY29kZWRbJGtleV0pID09PSAwKSB7CnJldHVybiAkdGhpcy0+cmVtb3ZlTWFpbktleSgka2V5KTsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBmb3JtYXQoJGRhdGEsIGludCAkZGVwdGggPSAwLCBib29sICR3YXNPYmplY3QgPSBmYWxzZSk6IHN0cmluZwp7CmlmICgkZGF0YSBpbnN0YW5jZW9mIFxzdGRDbGFzcyB8fCAkZGF0YSBpbnN0YW5jZW9mIFxBcnJheU9iamVjdCkgewokZGF0YSA9IChhcnJheSkgJGRhdGE7CiR3YXNPYmplY3QgPSB0cnVlOwp9CgppZiAoaXNfYXJyYXkoJGRhdGEpKSB7CmlmIChcY291bnQoJGRhdGEpID09PSAwKSB7CnJldHVybiAkd2FzT2JqZWN0ID8gJ3snIC4gJHRoaXMtPm5ld2xpbmUgLiBzdHJfcmVwZWF0KCR0aGlzLT5pbmRlbnQsICRkZXB0aCArIDEpIC4gJ30nIDogJ1tdJzsKfQoKaWYgKGFycmF5X2lzX2xpc3QoJGRhdGEpKSB7CmZvcmVhY2ggKCRkYXRhIGFzICRrZXkgPT4gJHZhbCkgewokZGF0YVska2V5XSA9ICR0aGlzLT5mb3JtYXQoJHZhbCwgJGRlcHRoICsgMSk7Cn0KCnJldHVybiAnWycuaW1wbG9kZSgnLCAnLCAkZGF0YSkuJ10nOwp9Cgokb3V0ID0gJ3snIC4gJHRoaXMtPm5ld2xpbmU7CiRlbGVtcyA9IFtdOwpmb3JlYWNoICgkZGF0YSBhcyAka2V5ID0+ICR2YWwpIHsKJGVsZW1zW10gPSBzdHJfcmVwZWF0KCR0aGlzLT5pbmRlbnQsICRkZXB0aCArIDIpIC4gSnNvbkZpbGU6OmVuY29kZSgoc3RyaW5nKSAka2V5KS4gJzogJy4kdGhpcy0+Zm9ybWF0KCR2YWwsICRkZXB0aCArIDEpOwp9CgpyZXR1cm4gJG91dCAuIGltcGxvZGUoJywnLiR0aGlzLT5uZXdsaW5lLCAkZWxlbXMpIC4gJHRoaXMtPm5ld2xpbmUgLiBzdHJfcmVwZWF0KCR0aGlzLT5pbmRlbnQsICRkZXB0aCArIDEpIC4gJ30nOwp9CgpyZXR1cm4gSnNvbkZpbGU6OmVuY29kZSgkZGF0YSk7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBkZXRlY3RJbmRlbnRpbmcoKTogdm9pZAp7CiR0aGlzLT5pbmRlbnQgPSBKc29uRmlsZTo6ZGV0ZWN0SW5kZW50aW5nKCR0aGlzLT5jb250ZW50cyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSnNvbjsKCnVzZSBFeGNlcHRpb247CgoKCgpjbGFzcyBKc29uVmFsaWRhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgp7CgoKCnByb3RlY3RlZCAkZXJyb3JzOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbWVzc2FnZSwgYXJyYXkgJGVycm9ycyA9IFtdLCA/RXhjZXB0aW9uICRwcmV2aW91cyA9IG51bGwpCnsKJHRoaXMtPmVycm9ycyA9ICRlcnJvcnM7CnBhcmVudDo6X19jb25zdHJ1Y3QoKHN0cmluZykgJG1lc3NhZ2UsIDAsICRwcmV2aW91cyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFcnJvcnMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmVycm9yczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQSFBTdGFuOwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBQaHBQYXJzZXJcTm9kZVxFeHByXE1ldGhvZENhbGw7CnVzZSBQSFBTdGFuXEFuYWx5c2VyXFNjb3BlOwp1c2UgUEhQU3RhblxSZWZsZWN0aW9uXE1ldGhvZFJlZmxlY3Rpb247CnVzZSBQSFBTdGFuXFR5cGVcQXJyYXlUeXBlOwp1c2UgUEhQU3RhblxUeXBlXEJvb2xlYW5UeXBlOwp1c2UgUEhQU3RhblxUeXBlXENvbnN0YW50XENvbnN0YW50QXJyYXlUeXBlOwp1c2UgUEhQU3RhblxUeXBlXENvbnN0YW50XENvbnN0YW50Qm9vbGVhblR5cGU7CnVzZSBQSFBTdGFuXFR5cGVcQ29uc3RhbnRcQ29uc3RhbnRTdHJpbmdUeXBlOwp1c2UgUEhQU3RhblxUeXBlXER5bmFtaWNNZXRob2RSZXR1cm5UeXBlRXh0ZW5zaW9uOwp1c2UgUEhQU3RhblxUeXBlXEludGVnZXJSYW5nZVR5cGU7CnVzZSBQSFBTdGFuXFR5cGVcSW50ZWdlclR5cGU7CnVzZSBQSFBTdGFuXFR5cGVcTWl4ZWRUeXBlOwp1c2UgUEhQU3RhblxUeXBlXFN0cmluZ1R5cGU7CnVzZSBQSFBTdGFuXFR5cGVcVHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxUeXBlQ29tYmluYXRvcjsKdXNlIFBIUFN0YW5cVHlwZVxUeXBlVXRpbHM7CnVzZSBQSFBTdGFuXFR5cGVcVW5pb25UeXBlOwoKZmluYWwgY2xhc3MgQ29uZmlnUmV0dXJuVHlwZUV4dGVuc2lvbiBpbXBsZW1lbnRzIER5bmFtaWNNZXRob2RSZXR1cm5UeXBlRXh0ZW5zaW9uCnsKCnByaXZhdGUgJHByb3BlcnRpZXMgPSBbXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCnsKJHNjaGVtYSA9IEpzb25GaWxlOjpwYXJzZUpzb24oKHN0cmluZykgZmlsZV9nZXRfY29udGVudHMoSnNvbkZpbGU6OkNPTVBPU0VSX1NDSEVNQV9QQVRIKSk7CgoKCmZvcmVhY2ggKCRzY2hlbWFbJ3Byb3BlcnRpZXMnXVsnY29uZmlnJ11bJ3Byb3BlcnRpZXMnXSBhcyAkcHJvcCA9PiAkY29uZikgewokdHlwZSA9ICR0aGlzLT5wYXJzZVR5cGUoJGNvbmYsICRwcm9wKTsKCiR0aGlzLT5wcm9wZXJ0aWVzWyRwcm9wXSA9ICR0eXBlOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRDbGFzcygpOiBzdHJpbmcKewpyZXR1cm4gQ29uZmlnOjpjbGFzczsKfQoKcHVibGljIGZ1bmN0aW9uIGlzTWV0aG9kU3VwcG9ydGVkKE1ldGhvZFJlZmxlY3Rpb24gJG1ldGhvZFJlZmxlY3Rpb24pOiBib29sCnsKcmV0dXJuIHN0cnRvbG93ZXIoJG1ldGhvZFJlZmxlY3Rpb24tPmdldE5hbWUoKSkgPT09ICdnZXQnOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0VHlwZUZyb21NZXRob2RDYWxsKE1ldGhvZFJlZmxlY3Rpb24gJG1ldGhvZFJlZmxlY3Rpb24sIE1ldGhvZENhbGwgJG1ldGhvZENhbGwsIFNjb3BlICRzY29wZSk6ID9UeXBlCnsKJGFyZ3MgPSAkbWV0aG9kQ2FsbC0+Z2V0QXJncygpOwoKaWYgKGNvdW50KCRhcmdzKSA8IDEpIHsKcmV0dXJuIG51bGw7Cn0KCiRrZXlUeXBlID0gJHNjb3BlLT5nZXRUeXBlKCRhcmdzWzBdLT52YWx1ZSk7CmlmIChtZXRob2RfZXhpc3RzKCRrZXlUeXBlLCAnZ2V0Q29uc3RhbnRTdHJpbmdzJykpIHsgCiRzdHJpbmdzID0gJGtleVR5cGUtPmdldENvbnN0YW50U3RyaW5ncygpOwp9IGVsc2UgewoKJHN0cmluZ3MgPSBUeXBlVXRpbHM6OmdldENvbnN0YW50U3RyaW5ncygka2V5VHlwZSk7IAp9CmlmICgkc3RyaW5ncyAhPT0gW10pIHsKJHR5cGVzID0gW107CmZvcmVhY2ggKCRzdHJpbmdzIGFzICRzdHJpbmcpIHsKaWYgKCFpc3NldCgkdGhpcy0+cHJvcGVydGllc1skc3RyaW5nLT5nZXRWYWx1ZSgpXSkpIHsKcmV0dXJuIG51bGw7Cn0KJHR5cGVzW10gPSAkdGhpcy0+cHJvcGVydGllc1skc3RyaW5nLT5nZXRWYWx1ZSgpXTsKfQoKcmV0dXJuIFR5cGVDb21iaW5hdG9yOjp1bmlvbiguLi4kdHlwZXMpOwp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZVR5cGUoYXJyYXkgJGRlZiwgc3RyaW5nICRwYXRoKTogVHlwZQp7CmlmIChpc3NldCgkZGVmWyd0eXBlJ10pKSB7CiR0eXBlcyA9IFtdOwpmb3JlYWNoICgoYXJyYXkpICRkZWZbJ3R5cGUnXSBhcyAkdHlwZSkgewpzd2l0Y2ggKCR0eXBlKSB7CmNhc2UgJ2ludGVnZXInOgppZiAoaW5fYXJyYXkoJHBhdGgsIFsncHJvY2Vzcy10aW1lb3V0JywgJ2NhY2hlLXR0bCcsICdjYWNoZS1maWxlcy10dGwnLCAnY2FjaGUtZmlsZXMtbWF4c2l6ZSddLCB0cnVlKSkgewokdHlwZXNbXSA9IEludGVnZXJSYW5nZVR5cGU6OmNyZWF0ZUFsbEdyZWF0ZXJUaGFuT3JFcXVhbFRvKDApOwp9IGVsc2UgewokdHlwZXNbXSA9IG5ldyBJbnRlZ2VyVHlwZSgpOwp9CmJyZWFrOwoKY2FzZSAnc3RyaW5nJzoKaWYgKCRwYXRoID09PSAnY2FjaGUtZmlsZXMtbWF4c2l6ZScpIHsKCn0gZWxzZWlmICgkcGF0aCA9PT0gJ2Rpc2NhcmQtY2hhbmdlcycpIHsKJHR5cGVzW10gPSBuZXcgQ29uc3RhbnRTdHJpbmdUeXBlKCdzdGFzaCcpOwp9IGVsc2VpZiAoJHBhdGggPT09ICd1c2UtcGFyZW50LWRpcicpIHsKJHR5cGVzW10gPSBuZXcgQ29uc3RhbnRTdHJpbmdUeXBlKCdwcm9tcHQnKTsKfSBlbHNlaWYgKCRwYXRoID09PSAnc3RvcmUtYXV0aHMnKSB7CiR0eXBlc1tdID0gbmV3IENvbnN0YW50U3RyaW5nVHlwZSgncHJvbXB0Jyk7Cn0gZWxzZWlmICgkcGF0aCA9PT0gJ3BsYXRmb3JtLWNoZWNrJykgewokdHlwZXNbXSA9IG5ldyBDb25zdGFudFN0cmluZ1R5cGUoJ3BocC1vbmx5Jyk7Cn0gZWxzZWlmICgkcGF0aCA9PT0gJ2dpdGh1Yi1wcm90b2NvbHMnKSB7CiR0eXBlc1tdID0gbmV3IFVuaW9uVHlwZShbbmV3IENvbnN0YW50U3RyaW5nVHlwZSgnZ2l0JyksIG5ldyBDb25zdGFudFN0cmluZ1R5cGUoJ2h0dHBzJyksIG5ldyBDb25zdGFudFN0cmluZ1R5cGUoJ3NzaCcpLCBuZXcgQ29uc3RhbnRTdHJpbmdUeXBlKCdodHRwJyldKTsKfSBlbHNlaWYgKHN0cl9zdGFydHNfd2l0aCgkcGF0aCwgJ3ByZWZlcnJlZC1pbnN0YWxsJykpIHsKJHR5cGVzW10gPSBuZXcgVW5pb25UeXBlKFtuZXcgQ29uc3RhbnRTdHJpbmdUeXBlKCdzb3VyY2UnKSwgbmV3IENvbnN0YW50U3RyaW5nVHlwZSgnZGlzdCcpLCBuZXcgQ29uc3RhbnRTdHJpbmdUeXBlKCdhdXRvJyldKTsKfSBlbHNlIHsKJHR5cGVzW10gPSBuZXcgU3RyaW5nVHlwZSgpOwp9CmJyZWFrOwoKY2FzZSAnYm9vbGVhbic6CmlmICgkcGF0aCA9PT0gJ3BsYXRmb3JtLmFkZGl0aW9uYWxQcm9wZXJ0aWVzJykgewokdHlwZXNbXSA9IG5ldyBDb25zdGFudEJvb2xlYW5UeXBlKGZhbHNlKTsKfSBlbHNlIHsKJHR5cGVzW10gPSBuZXcgQm9vbGVhblR5cGUoKTsKfQpicmVhazsKCmNhc2UgJ29iamVjdCc6CiRhZGRsUHJvcFR5cGUgPSBudWxsOwppZiAoaXNzZXQoJGRlZlsnYWRkaXRpb25hbFByb3BlcnRpZXMnXSkpIHsKJGFkZGxQcm9wVHlwZSA9ICR0aGlzLT5wYXJzZVR5cGUoJGRlZlsnYWRkaXRpb25hbFByb3BlcnRpZXMnXSwgJHBhdGguJy5hZGRpdGlvbmFsUHJvcGVydGllcycpOwp9CgppZiAoaXNzZXQoJGRlZlsncHJvcGVydGllcyddKSkgewoka2V5TmFtZXMgPSBbXTsKJHZhbFR5cGVzID0gW107CiRvcHRpb25hbEtleXMgPSBbXTsKJHByb3BJbmRleCA9IDA7CmZvcmVhY2ggKCRkZWZbJ3Byb3BlcnRpZXMnXSBhcyAkcHJvcE5hbWUgPT4gJHByb3BkZWYpIHsKJGtleU5hbWVzW10gPSBuZXcgQ29uc3RhbnRTdHJpbmdUeXBlKCRwcm9wTmFtZSk7CiR2YWxUeXBlID0gJHRoaXMtPnBhcnNlVHlwZSgkcHJvcGRlZiwgJHBhdGguJy4nLiRwcm9wTmFtZSk7CmlmICghaXNzZXQoJGRlZlsncmVxdWlyZWQnXSkgfHwgIWluX2FycmF5KCRwcm9wTmFtZSwgJGRlZlsncmVxdWlyZWQnXSwgdHJ1ZSkpIHsKJHZhbFR5cGUgPSBUeXBlQ29tYmluYXRvcjo6YWRkTnVsbCgkdmFsVHlwZSk7CiRvcHRpb25hbEtleXNbXSA9ICRwcm9wSW5kZXg7Cn0KJHZhbFR5cGVzW10gPSAkdmFsVHlwZTsKJHByb3BJbmRleCsrOwp9CgppZiAoJGFkZGxQcm9wVHlwZSAhPT0gbnVsbCkgewokdHlwZXNbXSA9IG5ldyBBcnJheVR5cGUoVHlwZUNvbWJpbmF0b3I6OnVuaW9uKG5ldyBTdHJpbmdUeXBlKCksIC4uLiRrZXlOYW1lcyksIFR5cGVDb21iaW5hdG9yOjp1bmlvbigkYWRkbFByb3BUeXBlLCAuLi4kdmFsVHlwZXMpKTsKfSBlbHNlIHsKJHR5cGVzW10gPSBuZXcgQ29uc3RhbnRBcnJheVR5cGUoJGtleU5hbWVzLCAkdmFsVHlwZXMsIFswXSwgJG9wdGlvbmFsS2V5cyk7Cn0KfSBlbHNlIHsKJHR5cGVzW10gPSBuZXcgQXJyYXlUeXBlKG5ldyBTdHJpbmdUeXBlKCksICRhZGRsUHJvcFR5cGUgPz8gbmV3IE1peGVkVHlwZSgpKTsKfQpicmVhazsKCmNhc2UgJ2FycmF5JzoKaWYgKGlzc2V0KCRkZWZbJ2l0ZW1zJ10pKSB7CiR2YWxUeXBlID0gJHRoaXMtPnBhcnNlVHlwZSgkZGVmWydpdGVtcyddLCAkcGF0aC4nLml0ZW1zJyk7Cn0gZWxzZSB7CiR2YWxUeXBlID0gbmV3IE1peGVkVHlwZSgpOwp9CgokdHlwZXNbXSA9IG5ldyBBcnJheVR5cGUobmV3IEludGVnZXJUeXBlKCksICR2YWxUeXBlKTsKYnJlYWs7CgpkZWZhdWx0OgokdHlwZXNbXSA9IG5ldyBNaXhlZFR5cGUoKTsKfQp9CgokdHlwZSA9IFR5cGVDb21iaW5hdG9yOjp1bmlvbiguLi4kdHlwZXMpOwp9IGVsc2VpZiAoaXNzZXQoJGRlZlsnZW51bSddKSkgewokdHlwZSA9IFR5cGVDb21iaW5hdG9yOjp1bmlvbiguLi5hcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uIChzdHJpbmcgJHZhbHVlKTogQ29uc3RhbnRTdHJpbmdUeXBlIHsKcmV0dXJuIG5ldyBDb25zdGFudFN0cmluZ1R5cGUoJHZhbHVlKTsKfSwgJGRlZlsnZW51bSddKSk7Cn0gZWxzZSB7CiR0eXBlID0gbmV3IE1peGVkVHlwZSgpOwp9CgoKaWYgKCRwYXRoID09PSAnYWxsb3ctcGx1Z2lucycgJiYgdGltZSgpIDwgc3RydG90aW1lKCcyMDIyLTA3LTAxJykpIHsKJHR5cGUgPSBUeXBlQ29tYmluYXRvcjo6YWRkTnVsbCgkdHlwZSk7Cn0KCgppZiAoaW5fYXJyYXkoJHBhdGgsIFsnYXV0b2xvYWRlci1zdWZmaXgnLCAnZ2l0bGFiLXByb3RvY29sJ10sIHRydWUpKSB7CiR0eXBlID0gVHlwZUNvbWJpbmF0b3I6OmFkZE51bGwoJHR5cGUpOwp9CgpyZXR1cm4gJHR5cGU7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUEhQU3RhbjsKCnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcUnVsZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXExpbms7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgUGhwUGFyc2VyXE5vZGVcRXhwclxNZXRob2RDYWxsOwp1c2UgUEhQU3RhblxBbmFseXNlclxTY29wZTsKdXNlIFBIUFN0YW5cUmVmbGVjdGlvblxNZXRob2RSZWZsZWN0aW9uOwp1c2UgUEhQU3RhblxUeXBlXEFjY2Vzc29yeVxBY2Nlc3NvcnlOb25FbXB0eVN0cmluZ1R5cGU7CnVzZSBQSFBTdGFuXFR5cGVcQ29uc3RhbnRcQ29uc3RhbnRBcnJheVR5cGU7CnVzZSBQSFBTdGFuXFR5cGVcQ29uc3RhbnRcQ29uc3RhbnRTdHJpbmdUeXBlOwp1c2UgUEhQU3RhblxUeXBlXENvbnN0YW50XENvbnN0YW50SW50ZWdlclR5cGU7CnVzZSBQSFBTdGFuXFR5cGVcRHluYW1pY01ldGhvZFJldHVyblR5cGVFeHRlbnNpb247CnVzZSBQSFBTdGFuXFR5cGVcSW50ZWdlclR5cGU7CnVzZSBQSFBTdGFuXFR5cGVcU3RyaW5nVHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxUeXBlOwp1c2UgUEhQU3RhblxUeXBlXE9iamVjdFR5cGU7CnVzZSBQSFBTdGFuXFR5cGVcVHlwZUNvbWJpbmF0b3I7CnVzZSBQaHBQYXJzZXJcTm9kZVxJZGVudGlmaWVyOwoKZmluYWwgY2xhc3MgUnVsZVJlYXNvbkRhdGFSZXR1cm5UeXBlRXh0ZW5zaW9uIGltcGxlbWVudHMgRHluYW1pY01ldGhvZFJldHVyblR5cGVFeHRlbnNpb24KewpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2xhc3MoKTogc3RyaW5nCnsKcmV0dXJuIFJ1bGU6OmNsYXNzOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNNZXRob2RTdXBwb3J0ZWQoTWV0aG9kUmVmbGVjdGlvbiAkbWV0aG9kUmVmbGVjdGlvbik6IGJvb2wKewpyZXR1cm4gc3RydG9sb3dlcigkbWV0aG9kUmVmbGVjdGlvbi0+Z2V0TmFtZSgpKSA9PT0gJ2dldHJlYXNvbmRhdGEnOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0VHlwZUZyb21NZXRob2RDYWxsKE1ldGhvZFJlZmxlY3Rpb24gJG1ldGhvZFJlZmxlY3Rpb24sIE1ldGhvZENhbGwgJG1ldGhvZENhbGwsIFNjb3BlICRzY29wZSk6IFR5cGUKewokcmVhc29uVHlwZSA9ICRzY29wZS0+Z2V0VHlwZShuZXcgTWV0aG9kQ2FsbCgkbWV0aG9kQ2FsbC0+dmFyLCBuZXcgSWRlbnRpZmllcignZ2V0UmVhc29uJykpKTsKCiR0eXBlcyA9IFsKUnVsZTo6UlVMRV9ST09UX1JFUVVJUkUgPT4gbmV3IENvbnN0YW50QXJyYXlUeXBlKFtuZXcgQ29uc3RhbnRTdHJpbmdUeXBlKCdwYWNrYWdlTmFtZScpLCBuZXcgQ29uc3RhbnRTdHJpbmdUeXBlKCdjb25zdHJhaW50JyldLCBbbmV3IFN0cmluZ1R5cGUsIG5ldyBPYmplY3RUeXBlKENvbnN0cmFpbnRJbnRlcmZhY2U6OmNsYXNzKV0pLApSdWxlOjpSVUxFX0ZJWEVEID0+IG5ldyBDb25zdGFudEFycmF5VHlwZShbbmV3IENvbnN0YW50U3RyaW5nVHlwZSgncGFja2FnZScpXSwgW25ldyBPYmplY3RUeXBlKEJhc2VQYWNrYWdlOjpjbGFzcyldKSwKUnVsZTo6UlVMRV9QQUNLQUdFX0NPTkZMSUNUID0+IG5ldyBPYmplY3RUeXBlKExpbms6OmNsYXNzKSwKUnVsZTo6UlVMRV9QQUNLQUdFX1JFUVVJUkVTID0+IG5ldyBPYmplY3RUeXBlKExpbms6OmNsYXNzKSwKUnVsZTo6UlVMRV9QQUNLQUdFX1NBTUVfTkFNRSA9PiBUeXBlQ29tYmluYXRvcjo6aW50ZXJzZWN0KG5ldyBTdHJpbmdUeXBlLCBuZXcgQWNjZXNzb3J5Tm9uRW1wdHlTdHJpbmdUeXBlKCkpLApSdWxlOjpSVUxFX0xFQVJORUQgPT4gbmV3IEludGVnZXJUeXBlKCksClJ1bGU6OlJVTEVfUEFDS0FHRV9BTElBUyA9PiBuZXcgT2JqZWN0VHlwZShCYXNlUGFja2FnZTo6Y2xhc3MpLApSdWxlOjpSVUxFX1BBQ0tBR0VfSU5WRVJTRV9BTElBUyA9PiBuZXcgT2JqZWN0VHlwZShCYXNlUGFja2FnZTo6Y2xhc3MpLApdOwoKZm9yZWFjaCAoJHR5cGVzIGFzICRjb25zdCA9PiAkdHlwZSkgewppZiAoKG5ldyBDb25zdGFudEludGVnZXJUeXBlKCRjb25zdCkpLT5pc1N1cGVyVHlwZU9mKCRyZWFzb25UeXBlKS0+eWVzKCkpIHsKcmV0dXJuICR0eXBlOwp9Cn0KCnJldHVybiBUeXBlQ29tYmluYXRvcjo6dW5pb24oLi4uJHR5cGVzKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlOwoKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKCgoKCmNsYXNzIEFsaWFzUGFja2FnZSBleHRlbmRzIEJhc2VQYWNrYWdlCnsKCnByb3RlY3RlZCAkdmVyc2lvbjsKCnByb3RlY3RlZCAkcHJldHR5VmVyc2lvbjsKCnByb3RlY3RlZCAkZGV2OwoKcHJvdGVjdGVkICRyb290UGFja2FnZUFsaWFzID0gZmFsc2U7CgoKCgpwcm90ZWN0ZWQgJHN0YWJpbGl0eTsKCnByb3RlY3RlZCAkaGFzU2VsZlZlcnNpb25SZXF1aXJlcyA9IGZhbHNlOwoKCnByb3RlY3RlZCAkYWxpYXNPZjsKCnByb3RlY3RlZCAkcmVxdWlyZXM7Cgpwcm90ZWN0ZWQgJGRldlJlcXVpcmVzOwoKcHJvdGVjdGVkICRjb25mbGljdHM7Cgpwcm90ZWN0ZWQgJHByb3ZpZGVzOwoKcHJvdGVjdGVkICRyZXBsYWNlczsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoQmFzZVBhY2thZ2UgJGFsaWFzT2YsIHN0cmluZyAkdmVyc2lvbiwgc3RyaW5nICRwcmV0dHlWZXJzaW9uKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJGFsaWFzT2YtPmdldE5hbWUoKSk7CgokdGhpcy0+dmVyc2lvbiA9ICR2ZXJzaW9uOwokdGhpcy0+cHJldHR5VmVyc2lvbiA9ICRwcmV0dHlWZXJzaW9uOwokdGhpcy0+YWxpYXNPZiA9ICRhbGlhc09mOwokdGhpcy0+c3RhYmlsaXR5ID0gVmVyc2lvblBhcnNlcjo6cGFyc2VTdGFiaWxpdHkoJHZlcnNpb24pOwokdGhpcy0+ZGV2ID0gJHRoaXMtPnN0YWJpbGl0eSA9PT0gJ2Rldic7Cgpmb3JlYWNoIChMaW5rOjokVFlQRVMgYXMgJHR5cGUpIHsKJGxpbmtzID0gJGFsaWFzT2YtPnsnZ2V0JyAuIHVjZmlyc3QoJHR5cGUpfSgpOwokdGhpcy0+eyR0eXBlfSA9ICR0aGlzLT5yZXBsYWNlU2VsZlZlcnNpb25EZXBlbmRlbmNpZXMoJGxpbmtzLCAkdHlwZSk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFsaWFzT2YoKQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT52ZXJzaW9uOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhYmlsaXR5KCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+c3RhYmlsaXR5Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJldHR5VmVyc2lvbigpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnByZXR0eVZlcnNpb247Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RldigpOiBib29sCnsKcmV0dXJuICR0aGlzLT5kZXY7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXF1aXJlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cmVxdWlyZXM7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29uZmxpY3RzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5jb25mbGljdHM7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdmlkZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnByb3ZpZGVzOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlcGxhY2VzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yZXBsYWNlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERldlJlcXVpcmVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5kZXZSZXF1aXJlczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Um9vdFBhY2thZ2VBbGlhcyhib29sICR2YWx1ZSk6IHZvaWQKewokdGhpcy0+cm9vdFBhY2thZ2VBbGlhcyA9ICR2YWx1ZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUm9vdFBhY2thZ2VBbGlhcygpOiBib29sCnsKcmV0dXJuICR0aGlzLT5yb290UGFja2FnZUFsaWFzOwp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcmVwbGFjZVNlbGZWZXJzaW9uRGVwZW5kZW5jaWVzKGFycmF5ICRsaW5rcywgJGxpbmtUeXBlKTogYXJyYXkKewoKJHByZXR0eVZlcnNpb24gPSAkdGhpcy0+cHJldHR5VmVyc2lvbjsKaWYgKCRwcmV0dHlWZXJzaW9uID09PSBWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBUykgewokcHJldHR5VmVyc2lvbiA9ICR0aGlzLT5hbGlhc09mLT5nZXRQcmV0dHlWZXJzaW9uKCk7Cn0KCmlmIChcaW5fYXJyYXkoJGxpbmtUeXBlLCBbTGluazo6VFlQRV9DT05GTElDVCwgTGluazo6VFlQRV9QUk9WSURFLCBMaW5rOjpUWVBFX1JFUExBQ0VdLCB0cnVlKSkgewokbmV3TGlua3MgPSBbXTsKZm9yZWFjaCAoJGxpbmtzIGFzICRsaW5rKSB7CgppZiAoJ3NlbGYudmVyc2lvbicgPT09ICRsaW5rLT5nZXRQcmV0dHlDb25zdHJhaW50KCkpIHsKJG5ld0xpbmtzW10gPSBuZXcgTGluaygkbGluay0+Z2V0U291cmNlKCksICRsaW5rLT5nZXRUYXJnZXQoKSwgJGNvbnN0cmFpbnQgPSBuZXcgQ29uc3RyYWludCgnPScsICR0aGlzLT52ZXJzaW9uKSwgJGxpbmtUeXBlLCAkcHJldHR5VmVyc2lvbik7CiRjb25zdHJhaW50LT5zZXRQcmV0dHlTdHJpbmcoJHByZXR0eVZlcnNpb24pOwp9Cn0KJGxpbmtzID0gYXJyYXlfbWVyZ2UoJGxpbmtzLCAkbmV3TGlua3MpOwp9IGVsc2Ugewpmb3JlYWNoICgkbGlua3MgYXMgJGluZGV4ID0+ICRsaW5rKSB7CmlmICgnc2VsZi52ZXJzaW9uJyA9PT0gJGxpbmstPmdldFByZXR0eUNvbnN0cmFpbnQoKSkgewppZiAoJGxpbmtUeXBlID09PSBMaW5rOjpUWVBFX1JFUVVJUkUpIHsKJHRoaXMtPmhhc1NlbGZWZXJzaW9uUmVxdWlyZXMgPSB0cnVlOwp9CiRsaW5rc1skaW5kZXhdID0gbmV3IExpbmsoJGxpbmstPmdldFNvdXJjZSgpLCAkbGluay0+Z2V0VGFyZ2V0KCksICRjb25zdHJhaW50ID0gbmV3IENvbnN0cmFpbnQoJz0nLCAkdGhpcy0+dmVyc2lvbiksICRsaW5rVHlwZSwgJHByZXR0eVZlcnNpb24pOwokY29uc3RyYWludC0+c2V0UHJldHR5U3RyaW5nKCRwcmV0dHlWZXJzaW9uKTsKfQp9Cn0KCnJldHVybiAkbGlua3M7Cn0KCnB1YmxpYyBmdW5jdGlvbiBoYXNTZWxmVmVyc2lvblJlcXVpcmVzKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmhhc1NlbGZWZXJzaW9uUmVxdWlyZXM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwp7CnJldHVybiBwYXJlbnQ6Ol9fdG9TdHJpbmcoKS4nICgnLigkdGhpcy0+cm9vdFBhY2thZ2VBbGlhcyA/ICdyb290ICcgOiAnJykuICdhbGlhcyBvZiAnLiR0aGlzLT5hbGlhc09mLT5nZXRWZXJzaW9uKCkuJyknOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFR5cGUoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRUeXBlKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRUYXJnZXREaXIoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0VGFyZ2V0RGlyKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRFeHRyYSgpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0RXh0cmEoKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEluc3RhbGxhdGlvblNvdXJjZSg/c3RyaW5nICR0eXBlKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRJbnN0YWxsYXRpb25Tb3VyY2UoJHR5cGUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5zdGFsbGF0aW9uU291cmNlKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldEluc3RhbGxhdGlvblNvdXJjZSgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlVHlwZSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRTb3VyY2VUeXBlKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VVcmwoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0U291cmNlVXJsKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VVcmxzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRTb3VyY2VVcmxzKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VSZWZlcmVuY2UoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0U291cmNlUmVmZXJlbmNlKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRTb3VyY2VSZWZlcmVuY2UoP3N0cmluZyAkcmVmZXJlbmNlKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRTb3VyY2VSZWZlcmVuY2UoJHJlZmVyZW5jZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRTb3VyY2VNaXJyb3JzKD9hcnJheSAkbWlycm9ycyk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0U291cmNlTWlycm9ycygkbWlycm9ycyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VNaXJyb3JzKCk6ID9hcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0U291cmNlTWlycm9ycygpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdFR5cGUoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0RGlzdFR5cGUoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldERpc3RVcmwoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0RGlzdFVybCgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdFVybHMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldERpc3RVcmxzKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0UmVmZXJlbmNlKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldERpc3RSZWZlcmVuY2UoKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldERpc3RSZWZlcmVuY2UoP3N0cmluZyAkcmVmZXJlbmNlKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXREaXN0UmVmZXJlbmNlKCRyZWZlcmVuY2UpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdFNoYTFDaGVja3N1bSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXREaXN0U2hhMUNoZWNrc3VtKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRUcmFuc3BvcnRPcHRpb25zKGFycmF5ICRvcHRpb25zKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRUcmFuc3BvcnRPcHRpb25zKCRvcHRpb25zKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydE9wdGlvbnMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldFRyYW5zcG9ydE9wdGlvbnMoKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldERpc3RNaXJyb3JzKD9hcnJheSAkbWlycm9ycyk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0RGlzdE1pcnJvcnMoJG1pcnJvcnMpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdE1pcnJvcnMoKTogP2FycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXREaXN0TWlycm9ycygpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXV0b2xvYWQoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldEF1dG9sb2FkKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXREZXZBdXRvbG9hZCgpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0RGV2QXV0b2xvYWQoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEluY2x1ZGVQYXRocygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0SW5jbHVkZVBhdGhzKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRQaHBFeHQoKTogP2FycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRQaHBFeHQoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlbGVhc2VEYXRlKCk6ID9cRGF0ZVRpbWVJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldFJlbGVhc2VEYXRlKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRCaW5hcmllcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0QmluYXJpZXMoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFN1Z2dlc3RzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRTdWdnZXN0cygpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Tm90aWZpY2F0aW9uVXJsKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldE5vdGlmaWNhdGlvblVybCgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNEZWZhdWx0QnJhbmNoKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmlzRGVmYXVsdEJyYW5jaCgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0RGlzdFVybCg/c3RyaW5nICR1cmwpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldERpc3RVcmwoJHVybCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXREaXN0VHlwZSg/c3RyaW5nICR0eXBlKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXREaXN0VHlwZSgkdHlwZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRTb3VyY2VEaXN0UmVmZXJlbmNlcyhzdHJpbmcgJHJlZmVyZW5jZSk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0U291cmNlRGlzdFJlZmVyZW5jZXMoJHJlZmVyZW5jZSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxBcmNoaXZlcjsKCnVzZSBGaWx0ZXJJdGVyYXRvcjsKdXNlIEl0ZXJhdG9yOwp1c2UgUGhhckRhdGE7CnVzZSBTcGxGaWxlSW5mbzsKCgoKCmNsYXNzIEFyY2hpdmFibGVGaWxlc0ZpbHRlciBleHRlbmRzIEZpbHRlckl0ZXJhdG9yCnsKCnByaXZhdGUgJGRpcnMgPSBbXTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoKTogYm9vbAp7CiRmaWxlID0gJHRoaXMtPmdldElubmVySXRlcmF0b3IoKS0+Y3VycmVudCgpOwppZiAoJGZpbGUtPmlzRGlyKCkpIHsKJHRoaXMtPmRpcnNbXSA9IChzdHJpbmcpICRmaWxlOwoKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKcHVibGljIGZ1bmN0aW9uIGFkZEVtcHR5RGlyKFBoYXJEYXRhICRwaGFyLCBzdHJpbmcgJHNvdXJjZXMpOiB2b2lkCnsKZm9yZWFjaCAoJHRoaXMtPmRpcnMgYXMgJGZpbGVwYXRoKSB7CiRsb2NhbG5hbWUgPSBzdHJfcmVwbGFjZSgkc291cmNlcyAuICIvIiwgJycsICRmaWxlcGF0aCk7CiRwaGFyLT5hZGRFbXB0eURpcigkbG9jYWxuYW1lKTsKfQp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2VcQXJjaGl2ZXI7Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgRmlsZXN5c3RlbUl0ZXJhdG9yOwp1c2UgRmlsdGVySXRlcmF0b3I7CnVzZSBJdGVyYXRvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxGaW5kZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcU3BsRmlsZUluZm87CgoKCgoKCgoKCgpjbGFzcyBBcmNoaXZhYmxlRmlsZXNGaW5kZXIgZXh0ZW5kcyBGaWx0ZXJJdGVyYXRvcgp7CgoKCnByb3RlY3RlZCAkZmluZGVyOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHNvdXJjZXMsIGFycmF5ICRleGNsdWRlcywgYm9vbCAkaWdub3JlRmlsdGVycyA9IGZhbHNlKQp7CiRmcyA9IG5ldyBGaWxlc3lzdGVtKCk7Cgokc291cmNlc1JlYWxQYXRoID0gcmVhbHBhdGgoJHNvdXJjZXMpOwppZiAoJHNvdXJjZXNSZWFsUGF0aCA9PT0gZmFsc2UpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgcmVhbHBhdGgoKSB0aGUgc291cmNlIGRpcmVjdG9yeSAiJy4kc291cmNlcy4nIicpOwp9CiRzb3VyY2VzID0gJGZzLT5ub3JtYWxpemVQYXRoKCRzb3VyY2VzUmVhbFBhdGgpOwoKaWYgKCRpZ25vcmVGaWx0ZXJzKSB7CiRmaWx0ZXJzID0gW107Cn0gZWxzZSB7CiRmaWx0ZXJzID0gWwpuZXcgR2l0RXhjbHVkZUZpbHRlcigkc291cmNlcyksCm5ldyBDb21wb3NlckV4Y2x1ZGVGaWx0ZXIoJHNvdXJjZXMsICRleGNsdWRlcyksCl07Cn0KCiR0aGlzLT5maW5kZXIgPSBuZXcgRmluZGVyKCk7CgokZmlsdGVyID0gc3RhdGljIGZ1bmN0aW9uIChcU3BsRmlsZUluZm8gJGZpbGUpIHVzZSAoJHNvdXJjZXMsICRmaWx0ZXJzLCAkZnMpOiBib29sIHsKJHJlYWxwYXRoID0gJGZpbGUtPmdldFJlYWxQYXRoKCk7CmlmICgkcmVhbHBhdGggPT09IGZhbHNlKSB7CnJldHVybiBmYWxzZTsKfQppZiAoJGZpbGUtPmlzTGluaygpICYmIHN0cnBvcygkcmVhbHBhdGgsICRzb3VyY2VzKSAhPT0gMCkgewpyZXR1cm4gZmFsc2U7Cn0KCiRyZWxhdGl2ZVBhdGggPSBQcmVnOjpyZXBsYWNlKAonI14nLnByZWdfcXVvdGUoJHNvdXJjZXMsICcjJykuJyMnLAonJywKJGZzLT5ub3JtYWxpemVQYXRoKCRyZWFscGF0aCkKKTsKCiRleGNsdWRlID0gZmFsc2U7CmZvcmVhY2ggKCRmaWx0ZXJzIGFzICRmaWx0ZXIpIHsKJGV4Y2x1ZGUgPSAkZmlsdGVyLT5maWx0ZXIoJHJlbGF0aXZlUGF0aCwgJGV4Y2x1ZGUpOwp9CgpyZXR1cm4gISRleGNsdWRlOwp9OwoKJHRoaXMtPmZpbmRlcgotPmluKCRzb3VyY2VzKQotPmZpbHRlcigkZmlsdGVyKQotPmlnbm9yZVZDUyh0cnVlKQotPmlnbm9yZURvdEZpbGVzKGZhbHNlKQotPnNvcnRCeU5hbWUoKTsKCnBhcmVudDo6X19jb25zdHJ1Y3QoJHRoaXMtPmZpbmRlci0+Z2V0SXRlcmF0b3IoKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoKTogYm9vbAp7CgokY3VycmVudCA9ICR0aGlzLT5nZXRJbm5lckl0ZXJhdG9yKCktPmN1cnJlbnQoKTsKCmlmICghJGN1cnJlbnQtPmlzRGlyKCkpIHsKcmV0dXJuIHRydWU7Cn0KCiRpdGVyYXRvciA9IG5ldyBGaWxlc3lzdGVtSXRlcmF0b3IoKHN0cmluZykgJGN1cnJlbnQsIEZpbGVzeXN0ZW1JdGVyYXRvcjo6U0tJUF9ET1RTKTsKCnJldHVybiAhJGl0ZXJhdG9yLT52YWxpZCgpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2VcQXJjaGl2ZXI7Cgp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxEb3dubG9hZE1hbmFnZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxMb29wOwp1c2UgQ29tcG9zZXJcVXRpbFxTeW5jSGVscGVyOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlOwoKCgoKCmNsYXNzIEFyY2hpdmVNYW5hZ2VyCnsKCnByb3RlY3RlZCAkZG93bmxvYWRNYW5hZ2VyOwoKcHJvdGVjdGVkICRsb29wOwoKCgoKcHJvdGVjdGVkICRhcmNoaXZlcnMgPSBbXTsKCgoKCnByb3RlY3RlZCAkb3ZlcndyaXRlRmlsZXMgPSB0cnVlOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KERvd25sb2FkTWFuYWdlciAkZG93bmxvYWRNYW5hZ2VyLCBMb29wICRsb29wKQp7CiR0aGlzLT5kb3dubG9hZE1hbmFnZXIgPSAkZG93bmxvYWRNYW5hZ2VyOwokdGhpcy0+bG9vcCA9ICRsb29wOwp9CgpwdWJsaWMgZnVuY3Rpb24gYWRkQXJjaGl2ZXIoQXJjaGl2ZXJJbnRlcmZhY2UgJGFyY2hpdmVyKTogdm9pZAp7CiR0aGlzLT5hcmNoaXZlcnNbXSA9ICRhcmNoaXZlcjsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRPdmVyd3JpdGVGaWxlcyhib29sICRvdmVyd3JpdGVGaWxlcyk6IHNlbGYKewokdGhpcy0+b3ZlcndyaXRlRmlsZXMgPSAkb3ZlcndyaXRlRmlsZXM7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFja2FnZUZpbGVuYW1lUGFydHMoQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogYXJyYXkKewokYmFzZU5hbWUgPSAkcGFja2FnZS0+Z2V0QXJjaGl2ZU5hbWUoKTsKaWYgKG51bGwgPT09ICRiYXNlTmFtZSkgewokYmFzZU5hbWUgPSBQcmVnOjpyZXBsYWNlKCcjW15hLXowLTktX10jaScsICctJywgJHBhY2thZ2UtPmdldE5hbWUoKSk7Cn0KCiRwYXJ0cyA9IFsKJ2Jhc2UnID0+ICRiYXNlTmFtZSwKXTsKCiRkaXN0UmVmZXJlbmNlID0gJHBhY2thZ2UtPmdldERpc3RSZWZlcmVuY2UoKTsKaWYgKG51bGwgIT09ICRkaXN0UmVmZXJlbmNlICYmIFByZWc6OmlzTWF0Y2goJ3teW2EtZjAtOV17NDB9JH0nLCAkZGlzdFJlZmVyZW5jZSkpIHsKJHBhcnRzWydkaXN0X3JlZmVyZW5jZSddID0gJGRpc3RSZWZlcmVuY2U7CiRwYXJ0c1snZGlzdF90eXBlJ10gPSAkcGFja2FnZS0+Z2V0RGlzdFR5cGUoKTsKfSBlbHNlIHsKJHBhcnRzWyd2ZXJzaW9uJ10gPSAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwokcGFydHNbJ2Rpc3RfcmVmZXJlbmNlJ10gPSAkZGlzdFJlZmVyZW5jZTsKfQoKJHNvdXJjZVJlZmVyZW5jZSA9ICRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKTsKaWYgKG51bGwgIT09ICRzb3VyY2VSZWZlcmVuY2UpIHsKJHBhcnRzWydzb3VyY2VfcmVmZXJlbmNlJ10gPSBzdWJzdHIoaGFzaCgnc2hhMScsICRzb3VyY2VSZWZlcmVuY2UpLCAwLCA2KTsKfQoKJHBhcnRzID0gYXJyYXlfZmlsdGVyKCRwYXJ0cywgc3RhdGljIGZ1bmN0aW9uICg/c3RyaW5nICRwYXJ0KSB7CnJldHVybiAkcGFydCAhPT0gbnVsbDsKfSk7CmZvcmVhY2ggKCRwYXJ0cyBhcyAka2V5ID0+ICRwYXJ0KSB7CiRwYXJ0c1ska2V5XSA9IHN0cl9yZXBsYWNlKCcvJywgJy0nLCAkcGFydCk7Cn0KCnJldHVybiAkcGFydHM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhY2thZ2VGaWxlbmFtZUZyb21QYXJ0cyhhcnJheSAkcGFydHMpOiBzdHJpbmcKewpyZXR1cm4gaW1wbG9kZSgnLScsICRwYXJ0cyk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFja2FnZUZpbGVuYW1lKENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+Z2V0UGFja2FnZUZpbGVuYW1lRnJvbVBhcnRzKCR0aGlzLT5nZXRQYWNrYWdlRmlsZW5hbWVQYXJ0cygkcGFja2FnZSkpOwp9CgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFyY2hpdmUoQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJGZvcm1hdCwgc3RyaW5nICR0YXJnZXREaXIsID9zdHJpbmcgJGZpbGVOYW1lID0gbnVsbCwgYm9vbCAkaWdub3JlRmlsdGVycyA9IGZhbHNlKTogc3RyaW5nCnsKaWYgKGVtcHR5KCRmb3JtYXQpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdGb3JtYXQgbXVzdCBiZSBzcGVjaWZpZWQnKTsKfQoKCiR1c2FibGVBcmNoaXZlciA9IG51bGw7CmZvcmVhY2ggKCR0aGlzLT5hcmNoaXZlcnMgYXMgJGFyY2hpdmVyKSB7CmlmICgkYXJjaGl2ZXItPnN1cHBvcnRzKCRmb3JtYXQsICRwYWNrYWdlLT5nZXRTb3VyY2VUeXBlKCkpKSB7CiR1c2FibGVBcmNoaXZlciA9ICRhcmNoaXZlcjsKYnJlYWs7Cn0KfQoKCmlmIChudWxsID09PSAkdXNhYmxlQXJjaGl2ZXIpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJ05vIGFyY2hpdmVyIGZvdW5kIHRvIHN1cHBvcnQgJXMgZm9ybWF0JywgJGZvcm1hdCkpOwp9CgokZmlsZXN5c3RlbSA9IG5ldyBGaWxlc3lzdGVtKCk7CgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBSb290UGFja2FnZUludGVyZmFjZSkgewokc291cmNlUGF0aCA9IHJlYWxwYXRoKCcuJyk7Cn0gZWxzZSB7Cgokc291cmNlUGF0aCA9IHN5c19nZXRfdGVtcF9kaXIoKS4nL2NvbXBvc2VyX2FyY2hpdmUnLmJpbjJoZXgocmFuZG9tX2J5dGVzKDUpKTsKJGZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkc291cmNlUGF0aCk7Cgp0cnkgewoKJHByb21pc2UgPSAkdGhpcy0+ZG93bmxvYWRNYW5hZ2VyLT5kb3dubG9hZCgkcGFja2FnZSwgJHNvdXJjZVBhdGgpOwpTeW5jSGVscGVyOjphd2FpdCgkdGhpcy0+bG9vcCwgJHByb21pc2UpOwokcHJvbWlzZSA9ICR0aGlzLT5kb3dubG9hZE1hbmFnZXItPmluc3RhbGwoJHBhY2thZ2UsICRzb3VyY2VQYXRoKTsKU3luY0hlbHBlcjo6YXdhaXQoJHRoaXMtPmxvb3AsICRwcm9taXNlKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewokZmlsZXN5c3RlbS0+cmVtb3ZlRGlyZWN0b3J5KCRzb3VyY2VQYXRoKTsKdGhyb3cgJGU7Cn0KCgppZiAoZmlsZV9leGlzdHMoJGNvbXBvc2VySnNvblBhdGggPSAkc291cmNlUGF0aC4nL2NvbXBvc2VyLmpzb24nKSkgewokanNvbkZpbGUgPSBuZXcgSnNvbkZpbGUoJGNvbXBvc2VySnNvblBhdGgpOwokanNvbkRhdGEgPSAkanNvbkZpbGUtPnJlYWQoKTsKaWYgKCFlbXB0eSgkanNvbkRhdGFbJ2FyY2hpdmUnXVsnbmFtZSddKSkgewokcGFja2FnZS0+c2V0QXJjaGl2ZU5hbWUoJGpzb25EYXRhWydhcmNoaXZlJ11bJ25hbWUnXSk7Cn0KaWYgKCFlbXB0eSgkanNvbkRhdGFbJ2FyY2hpdmUnXVsnZXhjbHVkZSddKSkgewokcGFja2FnZS0+c2V0QXJjaGl2ZUV4Y2x1ZGVzKCRqc29uRGF0YVsnYXJjaGl2ZSddWydleGNsdWRlJ10pOwp9Cn0KfQoKJHN1cHBvcnRlZEZvcm1hdHMgPSAkdGhpcy0+Z2V0U3VwcG9ydGVkRm9ybWF0cygpOwokcGFja2FnZU5hbWVQYXJ0cyA9IG51bGwgPT09ICRmaWxlTmFtZSA/CiR0aGlzLT5nZXRQYWNrYWdlRmlsZW5hbWVQYXJ0cygkcGFja2FnZSkKOiBbJ2Jhc2UnID0+ICRmaWxlTmFtZV07CgokcGFja2FnZU5hbWUgPSAkdGhpcy0+Z2V0UGFja2FnZUZpbGVuYW1lRnJvbVBhcnRzKCRwYWNrYWdlTmFtZVBhcnRzKTsKJGV4Y2x1ZGVQYXR0ZXJucyA9ICR0aGlzLT5idWlsZEV4Y2x1ZGVQYXR0ZXJucygkcGFja2FnZU5hbWVQYXJ0cywgJHN1cHBvcnRlZEZvcm1hdHMpOwoKCiRmaWxlc3lzdGVtLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoJHRhcmdldERpcik7CiR0YXJnZXQgPSByZWFscGF0aCgkdGFyZ2V0RGlyKS4nLycuJHBhY2thZ2VOYW1lLicuJy4kZm9ybWF0OwokZmlsZXN5c3RlbS0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKGRpcm5hbWUoJHRhcmdldCkpOwoKaWYgKCEkdGhpcy0+b3ZlcndyaXRlRmlsZXMgJiYgZmlsZV9leGlzdHMoJHRhcmdldCkpIHsKcmV0dXJuICR0YXJnZXQ7Cn0KCgokdGVtcFRhcmdldCA9IHN5c19nZXRfdGVtcF9kaXIoKS4nL2NvbXBvc2VyX2FyY2hpdmUnLmJpbjJoZXgocmFuZG9tX2J5dGVzKDUpKS4nLicuJGZvcm1hdDsKJGZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cyhkaXJuYW1lKCR0ZW1wVGFyZ2V0KSk7CgokYXJjaGl2ZVBhdGggPSAkdXNhYmxlQXJjaGl2ZXItPmFyY2hpdmUoCiRzb3VyY2VQYXRoLAokdGVtcFRhcmdldCwKJGZvcm1hdCwKYXJyYXlfbWVyZ2UoJGV4Y2x1ZGVQYXR0ZXJucywgJHBhY2thZ2UtPmdldEFyY2hpdmVFeGNsdWRlcygpKSwKJGlnbm9yZUZpbHRlcnMKKTsKJGZpbGVzeXN0ZW0tPnJlbmFtZSgkYXJjaGl2ZVBhdGgsICR0YXJnZXQpOwoKCmlmICghJHBhY2thZ2UgaW5zdGFuY2VvZiBSb290UGFja2FnZUludGVyZmFjZSkgewokZmlsZXN5c3RlbS0+cmVtb3ZlRGlyZWN0b3J5KCRzb3VyY2VQYXRoKTsKfQokZmlsZXN5c3RlbS0+cmVtb3ZlKCR0ZW1wVGFyZ2V0KTsKCnJldHVybiAkdGFyZ2V0Owp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGJ1aWxkRXhjbHVkZVBhdHRlcm5zKGFycmF5ICRwYXJ0cywgYXJyYXkgJGZvcm1hdHMpOiBhcnJheQp7CiRiYXNlID0gJHBhcnRzWydiYXNlJ107CmlmIChjb3VudCgkcGFydHMpID4gMSkgewokYmFzZSAuPSAnLSonOwp9CgokcGF0dGVybnMgPSBbXTsKZm9yZWFjaCAoJGZvcm1hdHMgYXMgJGZvcm1hdCkgewokcGF0dGVybnNbXSA9ICIkYmFzZS4kZm9ybWF0IjsKfQoKcmV0dXJuICRwYXR0ZXJuczsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRTdXBwb3J0ZWRGb3JtYXRzKCk6IGFycmF5CnsKCgoKCgokZm9ybWF0cyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+YXJjaGl2ZXJzIGFzICRhcmNoaXZlcikgewokaXRlbXMgPSBbXTsKc3dpdGNoIChnZXRfY2xhc3MoJGFyY2hpdmVyKSkgewpjYXNlIFppcEFyY2hpdmVyOjpjbGFzczoKJGl0ZW1zID0gWyd6aXAnXTsKYnJlYWs7CgpjYXNlIFBoYXJBcmNoaXZlcjo6Y2xhc3M6CiRpdGVtcyA9IFsnemlwJywgJ3RhcicsICd0YXIuZ3onLCAndGFyLmJ6MiddOwpicmVhazsKfQoKJGZvcm1hdHMgPSBhcnJheV9tZXJnZSgkZm9ybWF0cywgJGl0ZW1zKTsKfQoKcmV0dXJuIGFycmF5X3VuaXF1ZSgkZm9ybWF0cyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxBcmNoaXZlcjsKCgoKCgoKaW50ZXJmYWNlIEFyY2hpdmVySW50ZXJmYWNlCnsKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXJjaGl2ZShzdHJpbmcgJHNvdXJjZXMsIHN0cmluZyAkdGFyZ2V0LCBzdHJpbmcgJGZvcm1hdCwgYXJyYXkgJGV4Y2x1ZGVzID0gW10sIGJvb2wgJGlnbm9yZUZpbHRlcnMgPSBmYWxzZSk6IHN0cmluZzsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHN1cHBvcnRzKHN0cmluZyAkZm9ybWF0LCA/c3RyaW5nICRzb3VyY2VUeXBlKTogYm9vbDsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxBcmNoaXZlcjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXI7CgoKCgphYnN0cmFjdCBjbGFzcyBCYXNlRXhjbHVkZUZpbHRlcgp7CgoKCnByb3RlY3RlZCAkc291cmNlUGF0aDsKCgoKCnByb3RlY3RlZCAkZXhjbHVkZVBhdHRlcm5zOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkc291cmNlUGF0aCkKewokdGhpcy0+c291cmNlUGF0aCA9ICRzb3VyY2VQYXRoOwokdGhpcy0+ZXhjbHVkZVBhdHRlcm5zID0gW107Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmlsdGVyKHN0cmluZyAkcmVsYXRpdmVQYXRoLCBib29sICRleGNsdWRlKTogYm9vbAp7CmZvcmVhY2ggKCR0aGlzLT5leGNsdWRlUGF0dGVybnMgYXMgJHBhdHRlcm5EYXRhKSB7ClskcGF0dGVybiwgJG5lZ2F0ZSwgJHN0cmlwTGVhZGluZ1NsYXNoXSA9ICRwYXR0ZXJuRGF0YTsKCmlmICgkc3RyaXBMZWFkaW5nU2xhc2gpIHsKJHBhdGggPSBzdWJzdHIoJHJlbGF0aXZlUGF0aCwgMSk7Cn0gZWxzZSB7CiRwYXRoID0gJHJlbGF0aXZlUGF0aDsKfQoKdHJ5IHsKaWYgKFByZWc6OmlzTWF0Y2goJHBhdHRlcm4sICRwYXRoKSkgewokZXhjbHVkZSA9ICEkbmVnYXRlOwp9Cn0gY2F0Y2ggKFxSdW50aW1lRXhjZXB0aW9uICRlKSB7Cgp9Cn0KCnJldHVybiAkZXhjbHVkZTsKfQoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcGFyc2VMaW5lcyhhcnJheSAkbGluZXMsIGNhbGxhYmxlICRsaW5lUGFyc2VyKTogYXJyYXkKewpyZXR1cm4gYXJyYXlfZmlsdGVyKAphcnJheV9tYXAoCnN0YXRpYyBmdW5jdGlvbiAoJGxpbmUpIHVzZSAoJGxpbmVQYXJzZXIpIHsKJGxpbmUgPSB0cmltKCRsaW5lKTsKCmlmICghJGxpbmUgfHwgMCA9PT0gc3RycG9zKCRsaW5lLCAnIycpKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gJGxpbmVQYXJzZXIoJGxpbmUpOwp9LAokbGluZXMKKSwKc3RhdGljIGZ1bmN0aW9uICgkcGF0dGVybik6IGJvb2wgewpyZXR1cm4gJHBhdHRlcm4gIT09IG51bGw7Cn0KKTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZW5lcmF0ZVBhdHRlcm5zKGFycmF5ICRydWxlcyk6IGFycmF5CnsKJHBhdHRlcm5zID0gW107CmZvcmVhY2ggKCRydWxlcyBhcyAkcnVsZSkgewokcGF0dGVybnNbXSA9ICR0aGlzLT5nZW5lcmF0ZVBhdHRlcm4oJHJ1bGUpOwp9CgpyZXR1cm4gJHBhdHRlcm5zOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdlbmVyYXRlUGF0dGVybihzdHJpbmcgJHJ1bGUpOiBhcnJheQp7CiRuZWdhdGUgPSBmYWxzZTsKJHBhdHRlcm4gPSAnJzsKCmlmICgkcnVsZSAhPT0gJycgJiYgJHJ1bGVbMF0gPT09ICchJykgewokbmVnYXRlID0gdHJ1ZTsKJHJ1bGUgPSBsdHJpbSgkcnVsZSwgJyEnKTsKfQoKJGZpcnN0U2xhc2hQb3NpdGlvbiA9IHN0cnBvcygkcnVsZSwgJy8nKTsKaWYgKDAgPT09ICRmaXJzdFNsYXNoUG9zaXRpb24pIHsKJHBhdHRlcm4gPSAnXi8nOwp9IGVsc2VpZiAoZmFsc2UgPT09ICRmaXJzdFNsYXNoUG9zaXRpb24gfHwgc3RybGVuKCRydWxlKSAtIDEgPT09ICRmaXJzdFNsYXNoUG9zaXRpb24pIHsKJHBhdHRlcm4gPSAnLyc7Cn0KCiRydWxlID0gdHJpbSgkcnVsZSwgJy8nKTsKCgokcnVsZSA9IHN1YnN0cihGaW5kZXJcR2xvYjo6dG9SZWdleCgkcnVsZSksIDIsIC0yKTsKCnJldHVybiBbJ3snLiRwYXR0ZXJuLiRydWxlLicoPz0kfC8pfScsICRuZWdhdGUsIGZhbHNlXTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXEFyY2hpdmVyOwoKCgoKCgpjbGFzcyBDb21wb3NlckV4Y2x1ZGVGaWx0ZXIgZXh0ZW5kcyBCYXNlRXhjbHVkZUZpbHRlcgp7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRzb3VyY2VQYXRoLCBhcnJheSAkZXhjbHVkZVJ1bGVzKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJHNvdXJjZVBhdGgpOwokdGhpcy0+ZXhjbHVkZVBhdHRlcm5zID0gJHRoaXMtPmdlbmVyYXRlUGF0dGVybnMoJGV4Y2x1ZGVSdWxlcyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxBcmNoaXZlcjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgoKCgoKY2xhc3MgR2l0RXhjbHVkZUZpbHRlciBleHRlbmRzIEJhc2VFeGNsdWRlRmlsdGVyCnsKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkc291cmNlUGF0aCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRzb3VyY2VQYXRoKTsKCmlmIChmaWxlX2V4aXN0cygkc291cmNlUGF0aC4nLy5naXRhdHRyaWJ1dGVzJykpIHsKJHRoaXMtPmV4Y2x1ZGVQYXR0ZXJucyA9IGFycmF5X21lcmdlKAokdGhpcy0+ZXhjbHVkZVBhdHRlcm5zLAokdGhpcy0+cGFyc2VMaW5lcygKZmlsZSgkc291cmNlUGF0aC4nLy5naXRhdHRyaWJ1dGVzJyksClskdGhpcywgJ3BhcnNlR2l0QXR0cmlidXRlc0xpbmUnXQopCik7Cn0KfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwYXJzZUdpdEF0dHJpYnV0ZXNMaW5lKHN0cmluZyAkbGluZSk6ID9hcnJheQp7CiRwYXJ0cyA9IFByZWc6OnNwbGl0KCcjXHMrIycsICRsaW5lKTsKCmlmIChjb3VudCgkcGFydHMpID09PSAyICYmICRwYXJ0c1sxXSA9PT0gJ2V4cG9ydC1pZ25vcmUnKSB7CnJldHVybiAkdGhpcy0+Z2VuZXJhdGVQYXR0ZXJuKCRwYXJ0c1swXSk7Cn0KCmlmIChjb3VudCgkcGFydHMpID09PSAyICYmICRwYXJ0c1sxXSA9PT0gJy1leHBvcnQtaWdub3JlJykgewpyZXR1cm4gJHRoaXMtPmdlbmVyYXRlUGF0dGVybignIScuJHBhcnRzWzBdKTsKfQoKcmV0dXJuIG51bGw7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxBcmNoaXZlcjsKCnVzZSBQaGFyRGF0YTsKCgoKCgoKY2xhc3MgUGhhckFyY2hpdmVyIGltcGxlbWVudHMgQXJjaGl2ZXJJbnRlcmZhY2UKewoKcHJvdGVjdGVkIHN0YXRpYyAkZm9ybWF0cyA9IFsKJ3ppcCcgPT4gXFBoYXI6OlpJUCwKJ3RhcicgPT4gXFBoYXI6OlRBUiwKJ3Rhci5neicgPT4gXFBoYXI6OlRBUiwKJ3Rhci5iejInID0+IFxQaGFyOjpUQVIsCl07CgoKcHJvdGVjdGVkIHN0YXRpYyAkY29tcHJlc3NGb3JtYXRzID0gWwondGFyLmd6JyA9PiBcUGhhcjo6R1osCid0YXIuYnoyJyA9PiBcUGhhcjo6QloyLApdOwoKCgoKcHVibGljIGZ1bmN0aW9uIGFyY2hpdmUoc3RyaW5nICRzb3VyY2VzLCBzdHJpbmcgJHRhcmdldCwgc3RyaW5nICRmb3JtYXQsIGFycmF5ICRleGNsdWRlcyA9IFtdLCBib29sICRpZ25vcmVGaWx0ZXJzID0gZmFsc2UpOiBzdHJpbmcKewokc291cmNlcyA9IHJlYWxwYXRoKCRzb3VyY2VzKTsKCgppZiAoZmlsZV9leGlzdHMoJHRhcmdldCkpIHsKdW5saW5rKCR0YXJnZXQpOwp9Cgp0cnkgewokZmlsZW5hbWUgPSBzdWJzdHIoJHRhcmdldCwgMCwgc3RycnBvcygkdGFyZ2V0LCAkZm9ybWF0KSAtIDEpOwoKCmlmIChpc3NldChzdGF0aWM6OiRjb21wcmVzc0Zvcm1hdHNbJGZvcm1hdF0pKSB7CgokdGFyZ2V0ID0gJGZpbGVuYW1lIC4gJy50YXInOwp9CgokcGhhciA9IG5ldyBQaGFyRGF0YSgKJHRhcmdldCwKXEZpbGVzeXN0ZW1JdGVyYXRvcjo6S0VZX0FTX1BBVEhOQU1FIHwgXEZpbGVzeXN0ZW1JdGVyYXRvcjo6Q1VSUkVOVF9BU19GSUxFSU5GTywKJycsCnN0YXRpYzo6JGZvcm1hdHNbJGZvcm1hdF0KKTsKJGZpbGVzID0gbmV3IEFyY2hpdmFibGVGaWxlc0ZpbmRlcigkc291cmNlcywgJGV4Y2x1ZGVzLCAkaWdub3JlRmlsdGVycyk7CiRmaWxlc09ubHkgPSBuZXcgQXJjaGl2YWJsZUZpbGVzRmlsdGVyKCRmaWxlcyk7CiRwaGFyLT5idWlsZEZyb21JdGVyYXRvcigkZmlsZXNPbmx5LCAkc291cmNlcyk7CiRmaWxlc09ubHktPmFkZEVtcHR5RGlyKCRwaGFyLCAkc291cmNlcyk7CgppZiAoIWZpbGVfZXhpc3RzKCR0YXJnZXQpKSB7CiR0YXJnZXQgPSAkZmlsZW5hbWUgLiAnLicgLiAkZm9ybWF0Owp1bnNldCgkcGhhcik7CgppZiAoJGZvcm1hdCA9PT0gJ3RhcicpIHsKCmZpbGVfcHV0X2NvbnRlbnRzKCR0YXJnZXQsIHN0cl9yZXBlYXQoIlwwIiwgMTAyNDApKTsKfSBlbHNlaWYgKCRmb3JtYXQgPT09ICd6aXAnKSB7CgokZW9jZCA9IHBhY2soCidWdnZ2dlZWdicsCjB4MDYwNTRiNTAsIAowLCAKMCwgCjAsIAowLCAKMCwgCjAsIAowIAopOwoKZmlsZV9wdXRfY29udGVudHMoJHRhcmdldCwgJGVvY2QpOwp9IGVsc2VpZiAoJGZvcm1hdCA9PT0gJ3Rhci5neicgfHwgJGZvcm1hdCA9PT0gJ3Rhci5iejInKSB7CmlmICghUGhhckRhdGE6OmNhbkNvbXByZXNzKHN0YXRpYzo6JGNvbXByZXNzRm9ybWF0c1skZm9ybWF0XSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJ0NhbiBub3QgY29tcHJlc3MgdG8gJXMgZm9ybWF0JywgJGZvcm1hdCkpOwp9CmlmICgkZm9ybWF0ID09PSAndGFyLmd6JyAmJiBmdW5jdGlvbl9leGlzdHMoJ2d6Y29tcHJlc3MnKSkgewpmaWxlX3B1dF9jb250ZW50cygkdGFyZ2V0LCBnemNvbXByZXNzKHN0cl9yZXBlYXQoIlwwIiwgMTAyNDApKSk7Cn0gZWxzZWlmICgkZm9ybWF0ID09PSAndGFyLmJ6MicgJiYgZnVuY3Rpb25fZXhpc3RzKCdiemNvbXByZXNzJykpIHsKZmlsZV9wdXRfY29udGVudHMoJHRhcmdldCwgYnpjb21wcmVzcyhzdHJfcmVwZWF0KCJcMCIsIDEwMjQwKSkpOwp9Cn0KCnJldHVybiAkdGFyZ2V0Owp9CgppZiAoaXNzZXQoc3RhdGljOjokY29tcHJlc3NGb3JtYXRzWyRmb3JtYXRdKSkgewoKaWYgKCFQaGFyRGF0YTo6Y2FuQ29tcHJlc3Moc3RhdGljOjokY29tcHJlc3NGb3JtYXRzWyRmb3JtYXRdKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZignQ2FuIG5vdCBjb21wcmVzcyB0byAlcyBmb3JtYXQnLCAkZm9ybWF0KSk7Cn0KCgp1bmxpbmsoJHRhcmdldCk7CgoKJHBoYXItPmNvbXByZXNzKHN0YXRpYzo6JGNvbXByZXNzRm9ybWF0c1skZm9ybWF0XSk7CgoKJHRhcmdldCA9ICRmaWxlbmFtZSAuICcuJyAuICRmb3JtYXQ7Cn0KCnJldHVybiAkdGFyZ2V0Owp9IGNhdGNoIChcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uICRlKSB7CiRtZXNzYWdlID0gc3ByaW50ZigKIkNvdWxkIG5vdCBjcmVhdGUgYXJjaGl2ZSAnJXMnIGZyb20gJyVzJzogJXMiLAokdGFyZ2V0LAokc291cmNlcywKJGUtPmdldE1lc3NhZ2UoKQopOwoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRtZXNzYWdlLCAkZS0+Z2V0Q29kZSgpLCAkZSk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIHN1cHBvcnRzKHN0cmluZyAkZm9ybWF0LCA/c3RyaW5nICRzb3VyY2VUeXBlKTogYm9vbAp7CnJldHVybiBpc3NldChzdGF0aWM6OiRmb3JtYXRzWyRmb3JtYXRdKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXEFyY2hpdmVyOwoKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBaaXBBcmNoaXZlOwoKCgoKY2xhc3MgWmlwQXJjaGl2ZXIgaW1wbGVtZW50cyBBcmNoaXZlckludGVyZmFjZQp7Cgpwcm90ZWN0ZWQgc3RhdGljICRmb3JtYXRzID0gWwonemlwJyA9PiB0cnVlLApdOwoKCgoKcHVibGljIGZ1bmN0aW9uIGFyY2hpdmUoc3RyaW5nICRzb3VyY2VzLCBzdHJpbmcgJHRhcmdldCwgc3RyaW5nICRmb3JtYXQsIGFycmF5ICRleGNsdWRlcyA9IFtdLCBib29sICRpZ25vcmVGaWx0ZXJzID0gZmFsc2UpOiBzdHJpbmcKewokZnMgPSBuZXcgRmlsZXN5c3RlbSgpOwokc291cmNlc1JlYWxwYXRoID0gcmVhbHBhdGgoJHNvdXJjZXMpOwppZiAoZmFsc2UgIT09ICRzb3VyY2VzUmVhbHBhdGgpIHsKJHNvdXJjZXMgPSAkc291cmNlc1JlYWxwYXRoOwp9CnVuc2V0KCRzb3VyY2VzUmVhbHBhdGgpOwokc291cmNlcyA9ICRmcy0+bm9ybWFsaXplUGF0aCgkc291cmNlcyk7CgokemlwID0gbmV3IFppcEFyY2hpdmUoKTsKJHJlcyA9ICR6aXAtPm9wZW4oJHRhcmdldCwgWmlwQXJjaGl2ZTo6Q1JFQVRFKTsKaWYgKCRyZXMgPT09IHRydWUpIHsKJGZpbGVzID0gbmV3IEFyY2hpdmFibGVGaWxlc0ZpbmRlcigkc291cmNlcywgJGV4Y2x1ZGVzLCAkaWdub3JlRmlsdGVycyk7CmZvcmVhY2ggKCRmaWxlcyBhcyAkZmlsZSkgewoKJGZpbGVwYXRoID0gJGZpbGUtPmdldFBhdGhuYW1lKCk7CiRyZWxhdGl2ZVBhdGggPSAkZmlsZS0+Z2V0UmVsYXRpdmVQYXRobmFtZSgpOwoKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewokcmVsYXRpdmVQYXRoID0gc3RydHIoJHJlbGF0aXZlUGF0aCwgJ1xcJywgJy8nKTsKfQoKaWYgKCRmaWxlLT5pc0RpcigpKSB7CiR6aXAtPmFkZEVtcHR5RGlyKCRyZWxhdGl2ZVBhdGgpOwp9IGVsc2UgewokemlwLT5hZGRGaWxlKCRmaWxlcGF0aCwgJHJlbGF0aXZlUGF0aCk7Cn0KCgoKCmlmIChtZXRob2RfZXhpc3RzKCR6aXAsICdzZXRFeHRlcm5hbEF0dHJpYnV0ZXNOYW1lJykpIHsKJHBlcm1zID0gZmlsZXBlcm1zKCRmaWxlcGF0aCk7CgoKCgokemlwLT5zZXRFeHRlcm5hbEF0dHJpYnV0ZXNOYW1lKCRyZWxhdGl2ZVBhdGgsIFppcEFyY2hpdmU6Ok9QU1lTX1VOSVgsICRwZXJtcyA8PCAxNik7Cn0KfQppZiAoJHppcC0+Y2xvc2UoKSkgewppZiAoIWZpbGVfZXhpc3RzKCR0YXJnZXQpKSB7CgokZW9jZCA9IHBhY2soCidWdnZ2dlZWdicsCjB4MDYwNTRiNTAsIAowLCAKMCwgCjAsIAowLCAKMCwgCjAsIAowIAopOwpmaWxlX3B1dF9jb250ZW50cygkdGFyZ2V0LCAkZW9jZCk7Cn0KCnJldHVybiAkdGFyZ2V0Owp9Cn0KJG1lc3NhZ2UgPSBzcHJpbnRmKAoiQ291bGQgbm90IGNyZWF0ZSBhcmNoaXZlICclcycgZnJvbSAnJXMnOiAlcyIsCiR0YXJnZXQsCiRzb3VyY2VzLAokemlwLT5nZXRTdGF0dXNTdHJpbmcoKQopOwp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJG1lc3NhZ2UpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc3VwcG9ydHMoc3RyaW5nICRmb3JtYXQsID9zdHJpbmcgJHNvdXJjZVR5cGUpOiBib29sCnsKcmV0dXJuIGlzc2V0KHN0YXRpYzo6JGZvcm1hdHNbJGZvcm1hdF0pICYmICR0aGlzLT5jb21wcmVzc2lvbkF2YWlsYWJsZSgpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGNvbXByZXNzaW9uQXZhaWxhYmxlKCk6IGJvb2wKewpyZXR1cm4gY2xhc3NfZXhpc3RzKCdaaXBBcmNoaXZlJyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZTsKCnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKCgoKCgoKYWJzdHJhY3QgY2xhc3MgQmFzZVBhY2thZ2UgaW1wbGVtZW50cyBQYWNrYWdlSW50ZXJmYWNlCnsKCgoKCnB1YmxpYyBzdGF0aWMgJHN1cHBvcnRlZExpbmtUeXBlcyA9IFsKJ3JlcXVpcmUnID0+IFsnZGVzY3JpcHRpb24nID0+ICdyZXF1aXJlcycsICdtZXRob2QnID0+IExpbms6OlRZUEVfUkVRVUlSRV0sCidjb25mbGljdCcgPT4gWydkZXNjcmlwdGlvbicgPT4gJ2NvbmZsaWN0cycsICdtZXRob2QnID0+IExpbms6OlRZUEVfQ09ORkxJQ1RdLAoncHJvdmlkZScgPT4gWydkZXNjcmlwdGlvbicgPT4gJ3Byb3ZpZGVzJywgJ21ldGhvZCcgPT4gTGluazo6VFlQRV9QUk9WSURFXSwKJ3JlcGxhY2UnID0+IFsnZGVzY3JpcHRpb24nID0+ICdyZXBsYWNlcycsICdtZXRob2QnID0+IExpbms6OlRZUEVfUkVQTEFDRV0sCidyZXF1aXJlLWRldicgPT4gWydkZXNjcmlwdGlvbicgPT4gJ3JlcXVpcmVzIChmb3IgZGV2ZWxvcG1lbnQpJywgJ21ldGhvZCcgPT4gTGluazo6VFlQRV9ERVZfUkVRVUlSRV0sCl07CgpwdWJsaWMgY29uc3QgU1RBQklMSVRZX1NUQUJMRSA9IDA7CnB1YmxpYyBjb25zdCBTVEFCSUxJVFlfUkMgPSA1OwpwdWJsaWMgY29uc3QgU1RBQklMSVRZX0JFVEEgPSAxMDsKcHVibGljIGNvbnN0IFNUQUJJTElUWV9BTFBIQSA9IDE1OwpwdWJsaWMgY29uc3QgU1RBQklMSVRZX0RFViA9IDIwOwoKcHVibGljIGNvbnN0IFNUQUJJTElUSUVTID0gWwonc3RhYmxlJyA9PiBzZWxmOjpTVEFCSUxJVFlfU1RBQkxFLAonUkMnID0+IHNlbGY6OlNUQUJJTElUWV9SQywKJ2JldGEnID0+IHNlbGY6OlNUQUJJTElUWV9CRVRBLAonYWxwaGEnID0+IHNlbGY6OlNUQUJJTElUWV9BTFBIQSwKJ2RldicgPT4gc2VsZjo6U1RBQklMSVRZX0RFViwKXTsKCgoKCgoKCnB1YmxpYyBzdGF0aWMgJHN0YWJpbGl0aWVzID0gc2VsZjo6U1RBQklMSVRJRVM7CgoKCgoKCnB1YmxpYyAkaWQ7Cgpwcm90ZWN0ZWQgJG5hbWU7Cgpwcm90ZWN0ZWQgJHByZXR0eU5hbWU7Cgpwcm90ZWN0ZWQgJHJlcG9zaXRvcnkgPSBudWxsOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lKQp7CiR0aGlzLT5wcmV0dHlOYW1lID0gJG5hbWU7CiR0aGlzLT5uYW1lID0gc3RydG9sb3dlcigkbmFtZSk7CiR0aGlzLT5pZCA9IC0xOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPm5hbWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmV0dHlOYW1lKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+cHJldHR5TmFtZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWVzKCRwcm92aWRlcyA9IHRydWUpOiBhcnJheQp7CiRuYW1lcyA9IFsKJHRoaXMtPmdldE5hbWUoKSA9PiB0cnVlLApdOwoKaWYgKCRwcm92aWRlcykgewpmb3JlYWNoICgkdGhpcy0+Z2V0UHJvdmlkZXMoKSBhcyAkbGluaykgewokbmFtZXNbJGxpbmstPmdldFRhcmdldCgpXSA9IHRydWU7Cn0KfQoKZm9yZWFjaCAoJHRoaXMtPmdldFJlcGxhY2VzKCkgYXMgJGxpbmspIHsKJG5hbWVzWyRsaW5rLT5nZXRUYXJnZXQoKV0gPSB0cnVlOwp9CgpyZXR1cm4gYXJyYXlfa2V5cygkbmFtZXMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SWQoaW50ICRpZCk6IHZvaWQKewokdGhpcy0+aWQgPSAkaWQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJZCgpOiBpbnQKewpyZXR1cm4gJHRoaXMtPmlkOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVwb3NpdG9yeShSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvc2l0b3J5KTogdm9pZAp7CmlmICgkdGhpcy0+cmVwb3NpdG9yeSAmJiAkcmVwb3NpdG9yeSAhPT0gJHRoaXMtPnJlcG9zaXRvcnkpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKAonUGFja2FnZSAiJXMiIGNhbm5vdCBiZSBhZGRlZCB0byByZXBvc2l0b3J5ICIlcyIgYXMgaXQgaXMgYWxyZWFkeSBpbiByZXBvc2l0b3J5ICIlcyIuJywKJHRoaXMtPmdldFByZXR0eU5hbWUoKSwKJHJlcG9zaXRvcnktPmdldFJlcG9OYW1lKCksCiR0aGlzLT5yZXBvc2l0b3J5LT5nZXRSZXBvTmFtZSgpCikpOwp9CiR0aGlzLT5yZXBvc2l0b3J5ID0gJHJlcG9zaXRvcnk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvc2l0b3J5KCk6ID9SZXBvc2l0b3J5SW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5yZXBvc2l0b3J5Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNQbGF0Zm9ybSgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5nZXRSZXBvc2l0b3J5KCkgaW5zdGFuY2VvZiBQbGF0Zm9ybVJlcG9zaXRvcnk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVbmlxdWVOYW1lKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+Z2V0TmFtZSgpLictJy4kdGhpcy0+Z2V0VmVyc2lvbigpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBib29sCnsKJHNlbGYgPSAkdGhpczsKaWYgKCR0aGlzIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiRzZWxmID0gJHRoaXMtPmdldEFsaWFzT2YoKTsKfQppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJHBhY2thZ2UgPSAkcGFja2FnZS0+Z2V0QWxpYXNPZigpOwp9CgpyZXR1cm4gJHBhY2thZ2UgPT09ICRzZWxmOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmdldFVuaXF1ZU5hbWUoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFByZXR0eVN0cmluZygpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmdldFByZXR0eU5hbWUoKS4nICcuJHRoaXMtPmdldFByZXR0eVZlcnNpb24oKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZ1bGxQcmV0dHlWZXJzaW9uKGJvb2wgJHRydW5jYXRlID0gdHJ1ZSwgaW50ICRkaXNwbGF5TW9kZSA9IFBhY2thZ2VJbnRlcmZhY2U6OkRJU1BMQVlfU09VUkNFX1JFRl9JRl9ERVYpOiBzdHJpbmcKewppZiAoCiRkaXNwbGF5TW9kZSA9PT0gUGFja2FnZUludGVyZmFjZTo6RElTUExBWV9TT1VSQ0VfUkVGX0lGX0RFVgomJiAoCiEkdGhpcy0+aXNEZXYoKQp8fCAoCiFcaW5fYXJyYXkoJHRoaXMtPmdldFNvdXJjZVR5cGUoKSwgWydoZycsICdnaXQnXSkKJiYgKChzdHJpbmcpICR0aGlzLT5nZXRTb3VyY2VUeXBlKCkgIT09ICcnIHx8IChzdHJpbmcpICR0aGlzLT5nZXREaXN0UmVmZXJlbmNlKCkgPT09ICcnKQopCikKKSB7CnJldHVybiAkdGhpcy0+Z2V0UHJldHR5VmVyc2lvbigpOwp9Cgpzd2l0Y2ggKCRkaXNwbGF5TW9kZSkgewpjYXNlIFBhY2thZ2VJbnRlcmZhY2U6OkRJU1BMQVlfU09VUkNFX1JFRl9JRl9ERVY6CiRyZWZlcmVuY2UgPSAoc3RyaW5nKSAkdGhpcy0+Z2V0U291cmNlUmVmZXJlbmNlKCkgIT09ICcnID8gJHRoaXMtPmdldFNvdXJjZVJlZmVyZW5jZSgpIDogJHRoaXMtPmdldERpc3RSZWZlcmVuY2UoKTsKYnJlYWs7CmNhc2UgUGFja2FnZUludGVyZmFjZTo6RElTUExBWV9TT1VSQ0VfUkVGOgokcmVmZXJlbmNlID0gJHRoaXMtPmdldFNvdXJjZVJlZmVyZW5jZSgpOwpicmVhazsKY2FzZSBQYWNrYWdlSW50ZXJmYWNlOjpESVNQTEFZX0RJU1RfUkVGOgokcmVmZXJlbmNlID0gJHRoaXMtPmdldERpc3RSZWZlcmVuY2UoKTsKYnJlYWs7CmRlZmF1bHQ6CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdEaXNwbGF5IG1vZGUgJy4kZGlzcGxheU1vZGUuJyBpcyBub3Qgc3VwcG9ydGVkJyk7Cn0KCmlmIChudWxsID09PSAkcmVmZXJlbmNlKSB7CnJldHVybiAkdGhpcy0+Z2V0UHJldHR5VmVyc2lvbigpOwp9CgoKaWYgKCR0cnVuY2F0ZSAmJiBcc3RybGVuKCRyZWZlcmVuY2UpID09PSA0MCAmJiAkdGhpcy0+Z2V0U291cmNlVHlwZSgpICE9PSAnc3ZuJykgewpyZXR1cm4gJHRoaXMtPmdldFByZXR0eVZlcnNpb24oKSAuICcgJyAuIHN1YnN0cigkcmVmZXJlbmNlLCAwLCA3KTsKfQoKcmV0dXJuICR0aGlzLT5nZXRQcmV0dHlWZXJzaW9uKCkgLiAnICcgLiAkcmVmZXJlbmNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhYmlsaXR5UHJpb3JpdHkoKTogaW50CnsKcmV0dXJuIHNlbGY6OlNUQUJJTElUSUVTWyR0aGlzLT5nZXRTdGFiaWxpdHkoKV07Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX2Nsb25lKCkKewokdGhpcy0+cmVwb3NpdG9yeSA9IG51bGw7CiR0aGlzLT5pZCA9IC0xOwp9CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhY2thZ2VOYW1lVG9SZWdleHAoc3RyaW5nICRhbGxvd1BhdHRlcm4sIHN0cmluZyAkd3JhcCA9ICd7XiVzJH1pJyk6IHN0cmluZwp7CiRjbGVhbmVkQWxsb3dQYXR0ZXJuID0gc3RyX3JlcGxhY2UoJ1xcKicsICcuKicsIHByZWdfcXVvdGUoJGFsbG93UGF0dGVybikpOwoKcmV0dXJuIHNwcmludGYoJHdyYXAsICRjbGVhbmVkQWxsb3dQYXR0ZXJuKTsKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcGFja2FnZU5hbWVzVG9SZWdleHAoYXJyYXkgJHBhY2thZ2VOYW1lcywgc3RyaW5nICR3cmFwID0gJ3teKD86JXMpJH1pRCcpOiBzdHJpbmcKewokcGFja2FnZU5hbWVzID0gYXJyYXlfbWFwKApzdGF0aWMgZnVuY3Rpb24gKCRwYWNrYWdlTmFtZSk6IHN0cmluZyB7CnJldHVybiBCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVUb1JlZ2V4cCgkcGFja2FnZU5hbWUsICclcycpOwp9LAokcGFja2FnZU5hbWVzCik7CgpyZXR1cm4gc3ByaW50Zigkd3JhcCwgaW1wbG9kZSgnfCcsICRwYWNrYWdlTmFtZXMpKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXENvbXBhcmVyOwoKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CgoKCgoKCmNsYXNzIENvbXBhcmVyCnsKCnByaXZhdGUgJHNvdXJjZTsKCnByaXZhdGUgJHVwZGF0ZTsKCnByaXZhdGUgJGNoYW5nZWQ7CgpwdWJsaWMgZnVuY3Rpb24gc2V0U291cmNlKHN0cmluZyAkc291cmNlKTogdm9pZAp7CiR0aGlzLT5zb3VyY2UgPSAkc291cmNlOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0VXBkYXRlKHN0cmluZyAkdXBkYXRlKTogdm9pZAp7CiR0aGlzLT51cGRhdGUgPSAkdXBkYXRlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hhbmdlZChib29sICRleHBsaWNhdGVkID0gZmFsc2UpCnsKJGNoYW5nZWQgPSAkdGhpcy0+Y2hhbmdlZDsKaWYgKCFjb3VudCgkY2hhbmdlZCkpIHsKcmV0dXJuIGZhbHNlOwp9CmlmICgkZXhwbGljYXRlZCkgewpmb3JlYWNoICgkY2hhbmdlZCBhcyAkc2VjdGlvbktleSA9PiAkaXRlbVNlY3Rpb24pIHsKZm9yZWFjaCAoJGl0ZW1TZWN0aW9uIGFzICRpdGVtS2V5ID0+ICRpdGVtKSB7CiRjaGFuZ2VkWyRzZWN0aW9uS2V5XVskaXRlbUtleV0gPSAkaXRlbS4nICgnLiRzZWN0aW9uS2V5LicpJzsKfQp9Cn0KCnJldHVybiAkY2hhbmdlZDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENoYW5nZWRBc1N0cmluZyhib29sICR0b1N0cmluZyA9IGZhbHNlLCBib29sICRleHBsaWNhdGVkID0gZmFsc2UpOiBzdHJpbmcKewokY2hhbmdlZCA9ICR0aGlzLT5nZXRDaGFuZ2VkKCRleHBsaWNhdGVkKTsKaWYgKGZhbHNlID09PSAkY2hhbmdlZCkgewpyZXR1cm4gJyc7Cn0KCiRzdHJpbmdzID0gW107CmZvcmVhY2ggKCRjaGFuZ2VkIGFzICRzZWN0aW9uS2V5ID0+ICRpdGVtU2VjdGlvbikgewpmb3JlYWNoICgkaXRlbVNlY3Rpb24gYXMgJGl0ZW1LZXkgPT4gJGl0ZW0pIHsKJHN0cmluZ3NbXSA9ICRpdGVtLiJcclxuIjsKfQp9CgpyZXR1cm4gdHJpbShpbXBsb2RlKCJcclxuIiwgJHN0cmluZ3MpKTsKfQoKcHVibGljIGZ1bmN0aW9uIGRvQ29tcGFyZSgpOiB2b2lkCnsKJHNvdXJjZSA9IFtdOwokZGVzdGluYXRpb24gPSBbXTsKJHRoaXMtPmNoYW5nZWQgPSBbXTsKJGN1cnJlbnREaXJlY3RvcnkgPSBQbGF0Zm9ybTo6Z2V0Q3dkKCk7CmNoZGlyKCR0aGlzLT5zb3VyY2UpOwokc291cmNlID0gJHRoaXMtPmRvVHJlZSgnLicsICRzb3VyY2UpOwppZiAoIWlzX2FycmF5KCRzb3VyY2UpKSB7CnJldHVybjsKfQpjaGRpcigkY3VycmVudERpcmVjdG9yeSk7CmNoZGlyKCR0aGlzLT51cGRhdGUpOwokZGVzdGluYXRpb24gPSAkdGhpcy0+ZG9UcmVlKCcuJywgJGRlc3RpbmF0aW9uKTsKaWYgKCFpc19hcnJheSgkZGVzdGluYXRpb24pKSB7CmV4aXQ7Cn0KY2hkaXIoJGN1cnJlbnREaXJlY3RvcnkpOwpmb3JlYWNoICgkc291cmNlIGFzICRkaXIgPT4gJHZhbHVlKSB7CmZvcmVhY2ggKCR2YWx1ZSBhcyAkZmlsZSA9PiAkaGFzaCkgewppZiAoaXNzZXQoJGRlc3RpbmF0aW9uWyRkaXJdWyRmaWxlXSkpIHsKaWYgKCRoYXNoICE9PSAkZGVzdGluYXRpb25bJGRpcl1bJGZpbGVdKSB7CiR0aGlzLT5jaGFuZ2VkWydjaGFuZ2VkJ11bXSA9ICRkaXIuJy8nLiRmaWxlOwp9Cn0gZWxzZSB7CiR0aGlzLT5jaGFuZ2VkWydyZW1vdmVkJ11bXSA9ICRkaXIuJy8nLiRmaWxlOwp9Cn0KfQpmb3JlYWNoICgkZGVzdGluYXRpb24gYXMgJGRpciA9PiAkdmFsdWUpIHsKZm9yZWFjaCAoJHZhbHVlIGFzICRmaWxlID0+ICRoYXNoKSB7CmlmICghaXNzZXQoJHNvdXJjZVskZGlyXVskZmlsZV0pKSB7CiR0aGlzLT5jaGFuZ2VkWydhZGRlZCddW10gPSAkZGlyLicvJy4kZmlsZTsKfQp9Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRvVHJlZShzdHJpbmcgJGRpciwgYXJyYXkgJiRhcnJheSkKewppZiAoJGRoID0gb3BlbmRpcigkZGlyKSkgewp3aGlsZSAoJGZpbGUgPSByZWFkZGlyKCRkaCkpIHsKaWYgKCRmaWxlICE9PSAnLicgJiYgJGZpbGUgIT09ICcuLicpIHsKaWYgKGlzX2xpbmsoJGRpci4nLycuJGZpbGUpKSB7CiRhcnJheVskZGlyXVskZmlsZV0gPSByZWFkbGluaygkZGlyLicvJy4kZmlsZSk7Cn0gZWxzZWlmIChpc19kaXIoJGRpci4nLycuJGZpbGUpKSB7CmlmICghY291bnQoJGFycmF5KSkgewokYXJyYXlbMF0gPSAnVGVtcCc7Cn0KaWYgKCEkdGhpcy0+ZG9UcmVlKCRkaXIuJy8nLiRmaWxlLCAkYXJyYXkpKSB7CnJldHVybiBmYWxzZTsKfQp9IGVsc2VpZiAoaXNfZmlsZSgkZGlyLicvJy4kZmlsZSkgJiYgZmlsZXNpemUoJGRpci4nLycuJGZpbGUpKSB7CiRhcnJheVskZGlyXVskZmlsZV0gPSBoYXNoX2ZpbGUoXFBIUF9WRVJTSU9OX0lEID4gODAxMDAgPyAneHhoMycgOiAnc2hhMScsICRkaXIuJy8nLiRmaWxlKTsKfQp9Cn0KaWYgKGNvdW50KCRhcnJheSkgPiAxICYmIGlzc2V0KCRhcnJheVsnMCddKSkgewp1bnNldCgkYXJyYXlbJzAnXSk7Cn0KCnJldHVybiAkYXJyYXk7Cn0KCnJldHVybiBmYWxzZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlOwoKCgoKY2xhc3MgQ29tcGxldGVBbGlhc1BhY2thZ2UgZXh0ZW5kcyBBbGlhc1BhY2thZ2UgaW1wbGVtZW50cyBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UKewoKcHJvdGVjdGVkICRhbGlhc09mOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChDb21wbGV0ZVBhY2thZ2UgJGFsaWFzT2YsIHN0cmluZyAkdmVyc2lvbiwgc3RyaW5nICRwcmV0dHlWZXJzaW9uKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJGFsaWFzT2YsICR2ZXJzaW9uLCAkcHJldHR5VmVyc2lvbik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBbGlhc09mKCkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2Y7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTY3JpcHRzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRTY3JpcHRzKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRTY3JpcHRzKGFycmF5ICRzY3JpcHRzKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRTY3JpcHRzKCRzY3JpcHRzKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9zaXRvcmllcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0UmVwb3NpdG9yaWVzKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRSZXBvc2l0b3JpZXMoYXJyYXkgJHJlcG9zaXRvcmllcyk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0UmVwb3NpdG9yaWVzKCRyZXBvc2l0b3JpZXMpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0TGljZW5zZSgpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0TGljZW5zZSgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0TGljZW5zZShhcnJheSAkbGljZW5zZSk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0TGljZW5zZSgkbGljZW5zZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRLZXl3b3JkcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0S2V5d29yZHMoKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEtleXdvcmRzKGFycmF5ICRrZXl3b3Jkcyk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0S2V5d29yZHMoJGtleXdvcmRzKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldERlc2NyaXB0aW9uKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldERlc2NyaXB0aW9uKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXREZXNjcmlwdGlvbig/c3RyaW5nICRkZXNjcmlwdGlvbik6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0RGVzY3JpcHRpb24oJGRlc2NyaXB0aW9uKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEhvbWVwYWdlKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldEhvbWVwYWdlKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRIb21lcGFnZSg/c3RyaW5nICRob21lcGFnZSk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0SG9tZXBhZ2UoJGhvbWVwYWdlKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEF1dGhvcnMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldEF1dGhvcnMoKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEF1dGhvcnMoYXJyYXkgJGF1dGhvcnMpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldEF1dGhvcnMoJGF1dGhvcnMpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3VwcG9ydCgpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0U3VwcG9ydCgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0U3VwcG9ydChhcnJheSAkc3VwcG9ydCk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0U3VwcG9ydCgkc3VwcG9ydCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRGdW5kaW5nKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRGdW5kaW5nKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRGdW5kaW5nKGFycmF5ICRmdW5kaW5nKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRGdW5kaW5nKCRmdW5kaW5nKTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzQWJhbmRvbmVkKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmlzQWJhbmRvbmVkKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBsYWNlbWVudFBhY2thZ2UoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0UmVwbGFjZW1lbnRQYWNrYWdlKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRBYmFuZG9uZWQoJGFiYW5kb25lZCk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0QWJhbmRvbmVkKCRhYmFuZG9uZWQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXJjaGl2ZU5hbWUoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0QXJjaGl2ZU5hbWUoKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEFyY2hpdmVOYW1lKD9zdHJpbmcgJG5hbWUpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldEFyY2hpdmVOYW1lKCRuYW1lKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEFyY2hpdmVFeGNsdWRlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0QXJjaGl2ZUV4Y2x1ZGVzKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRBcmNoaXZlRXhjbHVkZXMoYXJyYXkgJGV4Y2x1ZGVzKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRBcmNoaXZlRXhjbHVkZXMoJGV4Y2x1ZGVzKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlOwoKCgoKCgpjbGFzcyBDb21wbGV0ZVBhY2thZ2UgZXh0ZW5kcyBQYWNrYWdlIGltcGxlbWVudHMgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlCnsKCnByb3RlY3RlZCAkcmVwb3NpdG9yaWVzID0gW107Cgpwcm90ZWN0ZWQgJGxpY2Vuc2UgPSBbXTsKCnByb3RlY3RlZCAka2V5d29yZHMgPSBbXTsKCnByb3RlY3RlZCAkYXV0aG9ycyA9IFtdOwoKcHJvdGVjdGVkICRkZXNjcmlwdGlvbiA9IG51bGw7Cgpwcm90ZWN0ZWQgJGhvbWVwYWdlID0gbnVsbDsKCnByb3RlY3RlZCAkc2NyaXB0cyA9IFtdOwoKcHJvdGVjdGVkICRzdXBwb3J0ID0gW107Cgpwcm90ZWN0ZWQgJGZ1bmRpbmcgPSBbXTsKCnByb3RlY3RlZCAkYWJhbmRvbmVkID0gZmFsc2U7Cgpwcm90ZWN0ZWQgJGFyY2hpdmVOYW1lID0gbnVsbDsKCnByb3RlY3RlZCAkYXJjaGl2ZUV4Y2x1ZGVzID0gW107CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U2NyaXB0cyhhcnJheSAkc2NyaXB0cyk6IHZvaWQKewokdGhpcy0+c2NyaXB0cyA9ICRzY3JpcHRzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U2NyaXB0cygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+c2NyaXB0czsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJlcG9zaXRvcmllcyhhcnJheSAkcmVwb3NpdG9yaWVzKTogdm9pZAp7CiR0aGlzLT5yZXBvc2l0b3JpZXMgPSAkcmVwb3NpdG9yaWVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb3NpdG9yaWVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yZXBvc2l0b3JpZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRMaWNlbnNlKGFycmF5ICRsaWNlbnNlKTogdm9pZAp7CiR0aGlzLT5saWNlbnNlID0gJGxpY2Vuc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMaWNlbnNlKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5saWNlbnNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0S2V5d29yZHMoYXJyYXkgJGtleXdvcmRzKTogdm9pZAp7CiR0aGlzLT5rZXl3b3JkcyA9ICRrZXl3b3JkczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEtleXdvcmRzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5rZXl3b3JkczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEF1dGhvcnMoYXJyYXkgJGF1dGhvcnMpOiB2b2lkCnsKJHRoaXMtPmF1dGhvcnMgPSAkYXV0aG9yczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEF1dGhvcnMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmF1dGhvcnM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZXNjcmlwdGlvbig/c3RyaW5nICRkZXNjcmlwdGlvbik6IHZvaWQKewokdGhpcy0+ZGVzY3JpcHRpb24gPSAkZGVzY3JpcHRpb247Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXNjcmlwdGlvbigpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5kZXNjcmlwdGlvbjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEhvbWVwYWdlKD9zdHJpbmcgJGhvbWVwYWdlKTogdm9pZAp7CiR0aGlzLT5ob21lcGFnZSA9ICRob21lcGFnZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEhvbWVwYWdlKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmhvbWVwYWdlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U3VwcG9ydChhcnJheSAkc3VwcG9ydCk6IHZvaWQKewokdGhpcy0+c3VwcG9ydCA9ICRzdXBwb3J0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3VwcG9ydCgpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+c3VwcG9ydDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEZ1bmRpbmcoYXJyYXkgJGZ1bmRpbmcpOiB2b2lkCnsKJHRoaXMtPmZ1bmRpbmcgPSAkZnVuZGluZzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZ1bmRpbmcoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmZ1bmRpbmc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0FiYW5kb25lZCgpOiBib29sCnsKcmV0dXJuIChib29sKSAkdGhpcy0+YWJhbmRvbmVkOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QWJhbmRvbmVkKCRhYmFuZG9uZWQpOiB2b2lkCnsKJHRoaXMtPmFiYW5kb25lZCA9ICRhYmFuZG9uZWQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBsYWNlbWVudFBhY2thZ2UoKTogP3N0cmluZwp7CnJldHVybiBcaXNfc3RyaW5nKCR0aGlzLT5hYmFuZG9uZWQpID8gJHRoaXMtPmFiYW5kb25lZCA6IG51bGw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBcmNoaXZlTmFtZSg/c3RyaW5nICRuYW1lKTogdm9pZAp7CiR0aGlzLT5hcmNoaXZlTmFtZSA9ICRuYW1lOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXJjaGl2ZU5hbWUoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+YXJjaGl2ZU5hbWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBcmNoaXZlRXhjbHVkZXMoYXJyYXkgJGV4Y2x1ZGVzKTogdm9pZAp7CiR0aGlzLT5hcmNoaXZlRXhjbHVkZXMgPSAkZXhjbHVkZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBcmNoaXZlRXhjbHVkZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFyY2hpdmVFeGNsdWRlczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlOwoKCgoKCgoKCmludGVyZmFjZSBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgZXh0ZW5kcyBQYWNrYWdlSW50ZXJmYWNlCnsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U2NyaXB0cygpOiBhcnJheTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRTY3JpcHRzKGFycmF5ICRzY3JpcHRzKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9zaXRvcmllcygpOiBhcnJheTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJlcG9zaXRvcmllcyhhcnJheSAkcmVwb3NpdG9yaWVzKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExpY2Vuc2UoKTogYXJyYXk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRMaWNlbnNlKGFycmF5ICRsaWNlbnNlKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEtleXdvcmRzKCk6IGFycmF5OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0S2V5d29yZHMoYXJyYXkgJGtleXdvcmRzKTogdm9pZDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXNjcmlwdGlvbigpOiA/c3RyaW5nOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERlc2NyaXB0aW9uKHN0cmluZyAkZGVzY3JpcHRpb24pOiB2b2lkOwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEhvbWVwYWdlKCk6ID9zdHJpbmc7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SG9tZXBhZ2Uoc3RyaW5nICRob21lcGFnZSk6IHZvaWQ7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEF1dGhvcnMoKTogYXJyYXk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBdXRob3JzKGFycmF5ICRhdXRob3JzKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN1cHBvcnQoKTogYXJyYXk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRTdXBwb3J0KGFycmF5ICRzdXBwb3J0KTogdm9pZDsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RnVuZGluZygpOiBhcnJheTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEZ1bmRpbmcoYXJyYXkgJGZ1bmRpbmcpOiB2b2lkOwoKCgoKcHVibGljIGZ1bmN0aW9uIGlzQWJhbmRvbmVkKCk6IGJvb2w7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwbGFjZW1lbnRQYWNrYWdlKCk6ID9zdHJpbmc7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QWJhbmRvbmVkKCRhYmFuZG9uZWQpOiB2b2lkOwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFyY2hpdmVOYW1lKCk6ID9zdHJpbmc7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXJjaGl2ZU5hbWUoc3RyaW5nICRuYW1lKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFyY2hpdmVFeGNsdWRlcygpOiBhcnJheTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFyY2hpdmVFeGNsdWRlcyhhcnJheSAkZXhjbHVkZXMpOiB2b2lkOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXER1bXBlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlSW50ZXJmYWNlOwoKCgoKCmNsYXNzIEFycmF5RHVtcGVyCnsKCgoKcHVibGljIGZ1bmN0aW9uIGR1bXAoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IGFycmF5CnsKJGtleXMgPSBbCidiaW5hcmllcycgPT4gJ2JpbicsCid0eXBlJywKJ2V4dHJhJywKJ2luc3RhbGxhdGlvblNvdXJjZScgPT4gJ2luc3RhbGxhdGlvbi1zb3VyY2UnLAonYXV0b2xvYWQnLAonZGV2QXV0b2xvYWQnID0+ICdhdXRvbG9hZC1kZXYnLAonbm90aWZpY2F0aW9uVXJsJyA9PiAnbm90aWZpY2F0aW9uLXVybCcsCidpbmNsdWRlUGF0aHMnID0+ICdpbmNsdWRlLXBhdGgnLAoncGhwRXh0JyA9PiAncGhwLWV4dCcsCl07CgokZGF0YSA9IFtdOwokZGF0YVsnbmFtZSddID0gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKTsKJGRhdGFbJ3ZlcnNpb24nXSA9ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCk7CiRkYXRhWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXSA9ICRwYWNrYWdlLT5nZXRWZXJzaW9uKCk7CgppZiAoJHBhY2thZ2UtPmdldFRhcmdldERpcigpICE9PSBudWxsKSB7CiRkYXRhWyd0YXJnZXQtZGlyJ10gPSAkcGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCk7Cn0KCmlmICgkcGFja2FnZS0+Z2V0U291cmNlVHlwZSgpICE9PSBudWxsKSB7CiRkYXRhWydzb3VyY2UnXVsndHlwZSddID0gJHBhY2thZ2UtPmdldFNvdXJjZVR5cGUoKTsKJGRhdGFbJ3NvdXJjZSddWyd1cmwnXSA9ICRwYWNrYWdlLT5nZXRTb3VyY2VVcmwoKTsKaWYgKG51bGwgIT09ICgkdmFsdWUgPSAkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCkpKSB7CiRkYXRhWydzb3VyY2UnXVsncmVmZXJlbmNlJ10gPSAkdmFsdWU7Cn0KaWYgKCRtaXJyb3JzID0gJHBhY2thZ2UtPmdldFNvdXJjZU1pcnJvcnMoKSkgewokZGF0YVsnc291cmNlJ11bJ21pcnJvcnMnXSA9ICRtaXJyb3JzOwp9Cn0KCmlmICgkcGFja2FnZS0+Z2V0RGlzdFR5cGUoKSAhPT0gbnVsbCkgewokZGF0YVsnZGlzdCddWyd0eXBlJ10gPSAkcGFja2FnZS0+Z2V0RGlzdFR5cGUoKTsKJGRhdGFbJ2Rpc3QnXVsndXJsJ10gPSAkcGFja2FnZS0+Z2V0RGlzdFVybCgpOwppZiAobnVsbCAhPT0gKCR2YWx1ZSA9ICRwYWNrYWdlLT5nZXREaXN0UmVmZXJlbmNlKCkpKSB7CiRkYXRhWydkaXN0J11bJ3JlZmVyZW5jZSddID0gJHZhbHVlOwp9CmlmIChudWxsICE9PSAoJHZhbHVlID0gJHBhY2thZ2UtPmdldERpc3RTaGExQ2hlY2tzdW0oKSkpIHsKJGRhdGFbJ2Rpc3QnXVsnc2hhc3VtJ10gPSAkdmFsdWU7Cn0KaWYgKCRtaXJyb3JzID0gJHBhY2thZ2UtPmdldERpc3RNaXJyb3JzKCkpIHsKJGRhdGFbJ2Rpc3QnXVsnbWlycm9ycyddID0gJG1pcnJvcnM7Cn0KfQoKZm9yZWFjaCAoQmFzZVBhY2thZ2U6OiRzdXBwb3J0ZWRMaW5rVHlwZXMgYXMgJHR5cGUgPT4gJG9wdHMpIHsKJGxpbmtzID0gJHBhY2thZ2UtPnsnZ2V0Jy51Y2ZpcnN0KCRvcHRzWydtZXRob2QnXSl9KCk7CmlmIChcY291bnQoJGxpbmtzKSA9PT0gMCkgewpjb250aW51ZTsKfQpmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspIHsKJGRhdGFbJHR5cGVdWyRsaW5rLT5nZXRUYXJnZXQoKV0gPSAkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpOwp9Cmtzb3J0KCRkYXRhWyR0eXBlXSk7Cn0KCiRwYWNrYWdlcyA9ICRwYWNrYWdlLT5nZXRTdWdnZXN0cygpOwppZiAoXGNvdW50KCRwYWNrYWdlcykgPiAwKSB7Cmtzb3J0KCRwYWNrYWdlcyk7CiRkYXRhWydzdWdnZXN0J10gPSAkcGFja2FnZXM7Cn0KCmlmICgkcGFja2FnZS0+Z2V0UmVsZWFzZURhdGUoKSBpbnN0YW5jZW9mIFxEYXRlVGltZUludGVyZmFjZSkgewokZGF0YVsndGltZSddID0gJHBhY2thZ2UtPmdldFJlbGVhc2VEYXRlKCktPmZvcm1hdChEQVRFX1JGQzMzMzkpOwp9CgppZiAoJHBhY2thZ2UtPmlzRGVmYXVsdEJyYW5jaCgpKSB7CiRkYXRhWydkZWZhdWx0LWJyYW5jaCddID0gdHJ1ZTsKfQoKJGRhdGEgPSAkdGhpcy0+ZHVtcFZhbHVlcygkcGFja2FnZSwgJGtleXMsICRkYXRhKTsKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSkgewppZiAoJHBhY2thZ2UtPmdldEFyY2hpdmVOYW1lKCkpIHsKJGRhdGFbJ2FyY2hpdmUnXVsnbmFtZSddID0gJHBhY2thZ2UtPmdldEFyY2hpdmVOYW1lKCk7Cn0KaWYgKCRwYWNrYWdlLT5nZXRBcmNoaXZlRXhjbHVkZXMoKSkgewokZGF0YVsnYXJjaGl2ZSddWydleGNsdWRlJ10gPSAkcGFja2FnZS0+Z2V0QXJjaGl2ZUV4Y2x1ZGVzKCk7Cn0KCiRrZXlzID0gWwonc2NyaXB0cycsCidsaWNlbnNlJywKJ2F1dGhvcnMnLAonZGVzY3JpcHRpb24nLAonaG9tZXBhZ2UnLAona2V5d29yZHMnLAoncmVwb3NpdG9yaWVzJywKJ3N1cHBvcnQnLAonZnVuZGluZycsCl07CgokZGF0YSA9ICR0aGlzLT5kdW1wVmFsdWVzKCRwYWNrYWdlLCAka2V5cywgJGRhdGEpOwoKaWYgKGlzc2V0KCRkYXRhWydrZXl3b3JkcyddKSAmJiBcaXNfYXJyYXkoJGRhdGFbJ2tleXdvcmRzJ10pKSB7CnNvcnQoJGRhdGFbJ2tleXdvcmRzJ10pOwp9CgppZiAoJHBhY2thZ2UtPmlzQWJhbmRvbmVkKCkpIHsKJGRhdGFbJ2FiYW5kb25lZCddID0gJHBhY2thZ2UtPmdldFJlcGxhY2VtZW50UGFja2FnZSgpID86IHRydWU7Cn0KfQoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgUm9vdFBhY2thZ2VJbnRlcmZhY2UpIHsKJG1pbmltdW1TdGFiaWxpdHkgPSAkcGFja2FnZS0+Z2V0TWluaW11bVN0YWJpbGl0eSgpOwppZiAoJG1pbmltdW1TdGFiaWxpdHkgIT09ICcnKSB7CiRkYXRhWydtaW5pbXVtLXN0YWJpbGl0eSddID0gJG1pbmltdW1TdGFiaWxpdHk7Cn0KfQoKaWYgKFxjb3VudCgkcGFja2FnZS0+Z2V0VHJhbnNwb3J0T3B0aW9ucygpKSA+IDApIHsKJGRhdGFbJ3RyYW5zcG9ydC1vcHRpb25zJ10gPSAkcGFja2FnZS0+Z2V0VHJhbnNwb3J0T3B0aW9ucygpOwp9CgpyZXR1cm4gJGRhdGE7Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZHVtcFZhbHVlcyhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBhcnJheSAka2V5cywgYXJyYXkgJGRhdGEpOiBhcnJheQp7CmZvcmVhY2ggKCRrZXlzIGFzICRtZXRob2QgPT4gJGtleSkgewppZiAoaXNfbnVtZXJpYygkbWV0aG9kKSkgewokbWV0aG9kID0gJGtleTsKfQoKJGdldHRlciA9ICdnZXQnLnVjZmlyc3QoJG1ldGhvZCk7CiR2YWx1ZSA9ICRwYWNrYWdlLT57JGdldHRlcn0oKTsKCmlmIChudWxsICE9PSAkdmFsdWUgJiYgIShcaXNfYXJyYXkoJHZhbHVlKSAmJiAwID09PSBcY291bnQoJHZhbHVlKSkpIHsKJGRhdGFbJGtleV0gPSAkdmFsdWU7Cn0KfQoKcmV0dXJuICRkYXRhOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2U7Cgp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKCgoKCgoKY2xhc3MgTGluawp7CnB1YmxpYyBjb25zdCBUWVBFX1JFUVVJUkUgPSAncmVxdWlyZXMnOwpwdWJsaWMgY29uc3QgVFlQRV9ERVZfUkVRVUlSRSA9ICdkZXZSZXF1aXJlcyc7CnB1YmxpYyBjb25zdCBUWVBFX1BST1ZJREUgPSAncHJvdmlkZXMnOwpwdWJsaWMgY29uc3QgVFlQRV9DT05GTElDVCA9ICdjb25mbGljdHMnOwpwdWJsaWMgY29uc3QgVFlQRV9SRVBMQUNFID0gJ3JlcGxhY2VzJzsKCgoKCgpwdWJsaWMgY29uc3QgVFlQRV9ET0VTX05PVF9SRVFVSVJFID0gJ2RvZXMgbm90IHJlcXVpcmUnOwoKcHJpdmF0ZSBjb25zdCBUWVBFX1VOS05PV04gPSAncmVsYXRlcyB0byc7CgoKCgoKCgoKcHVibGljIHN0YXRpYyAkVFlQRVMgPSBbCnNlbGY6OlRZUEVfUkVRVUlSRSwKc2VsZjo6VFlQRV9ERVZfUkVRVUlSRSwKc2VsZjo6VFlQRV9QUk9WSURFLApzZWxmOjpUWVBFX0NPTkZMSUNULApzZWxmOjpUWVBFX1JFUExBQ0UsCl07CgoKCgpwcm90ZWN0ZWQgJHNvdXJjZTsKCgoKCnByb3RlY3RlZCAkdGFyZ2V0OwoKCgoKcHJvdGVjdGVkICRjb25zdHJhaW50OwoKCgoKCnByb3RlY3RlZCAkZGVzY3JpcHRpb247CgoKCgpwcm90ZWN0ZWQgJHByZXR0eUNvbnN0cmFpbnQ7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCnN0cmluZyAkc291cmNlLApzdHJpbmcgJHRhcmdldCwKQ29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCwKJGRlc2NyaXB0aW9uID0gc2VsZjo6VFlQRV9VTktOT1dOLAo/c3RyaW5nICRwcmV0dHlDb25zdHJhaW50ID0gbnVsbAopIHsKJHRoaXMtPnNvdXJjZSA9IHN0cnRvbG93ZXIoJHNvdXJjZSk7CiR0aGlzLT50YXJnZXQgPSBzdHJ0b2xvd2VyKCR0YXJnZXQpOwokdGhpcy0+Y29uc3RyYWludCA9ICRjb25zdHJhaW50OwokdGhpcy0+ZGVzY3JpcHRpb24gPSBzZWxmOjpUWVBFX0RFVl9SRVFVSVJFID09PSAkZGVzY3JpcHRpb24gPyAncmVxdWlyZXMgKGZvciBkZXZlbG9wbWVudCknIDogJGRlc2NyaXB0aW9uOwokdGhpcy0+cHJldHR5Q29uc3RyYWludCA9ICRwcmV0dHlDb25zdHJhaW50Owp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGVzY3JpcHRpb24oKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5kZXNjcmlwdGlvbjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnNvdXJjZTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFRhcmdldCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnRhcmdldDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldENvbnN0cmFpbnQoKTogQ29uc3RyYWludEludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+Y29uc3RyYWludDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByZXR0eUNvbnN0cmFpbnQoKTogc3RyaW5nCnsKaWYgKG51bGwgPT09ICR0aGlzLT5wcmV0dHlDb25zdHJhaW50KSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKHNwcmludGYoJ0xpbmsgJXMgaGFzIGJlZW4gbWlzY29uZmlndXJlZCBhbmQgaGFkIG5vIHByZXR0eUNvbnN0cmFpbnQgZ2l2ZW4uJywgJHRoaXMpKTsKfQoKcmV0dXJuICR0aGlzLT5wcmV0dHlDb25zdHJhaW50Owp9CgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnNvdXJjZS4nICcuJHRoaXMtPmRlc2NyaXB0aW9uLicgJy4kdGhpcy0+dGFyZ2V0LicgKCcuJHRoaXMtPmNvbnN0cmFpbnQuJyknOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJldHR5U3RyaW5nKFBhY2thZ2VJbnRlcmZhY2UgJHNvdXJjZVBhY2thZ2UpOiBzdHJpbmcKewpyZXR1cm4gJHNvdXJjZVBhY2thZ2UtPmdldFByZXR0eVN0cmluZygpLicgJy4kdGhpcy0+ZGVzY3JpcHRpb24uJyAnLiR0aGlzLT50YXJnZXQuJyAnLiR0aGlzLT5jb25zdHJhaW50LT5nZXRQcmV0dHlTdHJpbmcoKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXExvYWRlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZUFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMaW5rOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290QWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgoKY2xhc3MgQXJyYXlMb2FkZXIgaW1wbGVtZW50cyBMb2FkZXJJbnRlcmZhY2UKewoKcHJvdGVjdGVkICR2ZXJzaW9uUGFyc2VyOwoKcHJvdGVjdGVkICRsb2FkT3B0aW9uczsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/VmVyc2lvblBhcnNlciAkcGFyc2VyID0gbnVsbCwgYm9vbCAkbG9hZE9wdGlvbnMgPSBmYWxzZSkKewppZiAoISRwYXJzZXIpIHsKJHBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyOwp9CiR0aGlzLT52ZXJzaW9uUGFyc2VyID0gJHBhcnNlcjsKJHRoaXMtPmxvYWRPcHRpb25zID0gJGxvYWRPcHRpb25zOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbG9hZChhcnJheSAkY29uZmlnLCBzdHJpbmcgJGNsYXNzID0gJ0NvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlJyk6IEJhc2VQYWNrYWdlCnsKaWYgKCRjbGFzcyAhPT0gJ0NvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlJyAmJiAkY2xhc3MgIT09ICdDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlJykgewp0cmlnZ2VyX2Vycm9yKCdUaGUgJGNsYXNzIGFyZyBpcyBkZXByZWNhdGVkLCBwbGVhc2UgcmVhY2ggb3V0IHRvIENvbXBvc2VyIG1haW50YWluZXJzIEFTQVAgaWYgeW91IHN0aWxsIG5lZWQgdGhpcy4nLCBFX1VTRVJfREVQUkVDQVRFRCk7Cn0KCiRwYWNrYWdlID0gJHRoaXMtPmNyZWF0ZU9iamVjdCgkY29uZmlnLCAkY2xhc3MpOwoKZm9yZWFjaCAoQmFzZVBhY2thZ2U6OiRzdXBwb3J0ZWRMaW5rVHlwZXMgYXMgJHR5cGUgPT4gJG9wdHMpIHsKaWYgKCFpc3NldCgkY29uZmlnWyR0eXBlXSkgfHwgIWlzX2FycmF5KCRjb25maWdbJHR5cGVdKSkgewpjb250aW51ZTsKfQokbWV0aG9kID0gJ3NldCcudWNmaXJzdCgkb3B0c1snbWV0aG9kJ10pOwokcGFja2FnZS0+eyRtZXRob2R9KAokdGhpcy0+cGFyc2VMaW5rcygKJHBhY2thZ2UtPmdldE5hbWUoKSwKJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKSwKJG9wdHNbJ21ldGhvZCddLAokY29uZmlnWyR0eXBlXQopCik7Cn0KCiRwYWNrYWdlID0gJHRoaXMtPmNvbmZpZ3VyZU9iamVjdCgkcGFja2FnZSwgJGNvbmZpZyk7CgpyZXR1cm4gJHBhY2thZ2U7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGxvYWRQYWNrYWdlcyhhcnJheSAkdmVyc2lvbnMpOiBhcnJheQp7CiRwYWNrYWdlcyA9IFtdOwokbGlua0NhY2hlID0gW107Cgpmb3JlYWNoICgkdmVyc2lvbnMgYXMgJHZlcnNpb24pIHsKJHBhY2thZ2UgPSAkdGhpcy0+Y3JlYXRlT2JqZWN0KCR2ZXJzaW9uLCAnQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2UnKTsKCiR0aGlzLT5jb25maWd1cmVDYWNoZWRMaW5rcygkbGlua0NhY2hlLCAkcGFja2FnZSwgJHZlcnNpb24pOwokcGFja2FnZSA9ICR0aGlzLT5jb25maWd1cmVPYmplY3QoJHBhY2thZ2UsICR2ZXJzaW9uKTsKCiRwYWNrYWdlc1tdID0gJHBhY2thZ2U7Cn0KCnJldHVybiAkcGFja2FnZXM7Cn0KCgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdChhcnJheSAkY29uZmlnLCBzdHJpbmcgJGNsYXNzKTogQ29tcGxldGVQYWNrYWdlCnsKaWYgKCFpc3NldCgkY29uZmlnWyduYW1lJ10pKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdVbmtub3duIHBhY2thZ2UgaGFzIG5vIG5hbWUgZGVmaW5lZCAoJy5qc29uX2VuY29kZSgkY29uZmlnKS4nKS4nKTsKfQppZiAoIWlzc2V0KCRjb25maWdbJ3ZlcnNpb24nXSkgfHwgIWlzX3NjYWxhcigkY29uZmlnWyd2ZXJzaW9uJ10pKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdQYWNrYWdlICcuJGNvbmZpZ1snbmFtZSddLicgaGFzIG5vIHZlcnNpb24gZGVmaW5lZC4nKTsKfQppZiAoIWlzX3N0cmluZygkY29uZmlnWyd2ZXJzaW9uJ10pKSB7CiRjb25maWdbJ3ZlcnNpb24nXSA9IChzdHJpbmcpICRjb25maWdbJ3ZlcnNpb24nXTsKfQoKCmlmIChpc3NldCgkY29uZmlnWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXSkgJiYgaXNfc3RyaW5nKCRjb25maWdbJ3ZlcnNpb25fbm9ybWFsaXplZCddKSkgewokdmVyc2lvbiA9ICRjb25maWdbJ3ZlcnNpb25fbm9ybWFsaXplZCddOwoKCmlmICgkdmVyc2lvbiA9PT0gVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVMpIHsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRjb25maWdbJ3ZlcnNpb24nXSk7Cn0KfSBlbHNlIHsKdHJ5IHsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRjb25maWdbJ3ZlcnNpb24nXSk7Cn0gY2F0Y2ggKFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24gJGUpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oCidGYWlsZWQgdG8gbm9ybWFsaXplIHZlcnNpb24gZm9yIHBhY2thZ2UgIicuJGNvbmZpZ1snbmFtZSddLiciOiAnLiRlLT5nZXRNZXNzYWdlKCksCiRlLT5nZXRDb2RlKCksCiRlCik7Cn0KfQoKcmV0dXJuIG5ldyAkY2xhc3MoJGNvbmZpZ1snbmFtZSddLCAkdmVyc2lvbiwgJGNvbmZpZ1sndmVyc2lvbiddKTsKfQoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjb25maWd1cmVPYmplY3QoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgYXJyYXkgJGNvbmZpZyk6IEJhc2VQYWNrYWdlCnsKaWYgKCEkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdBcnJheUxvYWRlciBleHBlY3RzIGluc3RhbmNlcyBvZiB0aGUgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2UgY2xhc3MgdG8gZnVuY3Rpb24gY29ycmVjdGx5Jyk7Cn0KCiRwYWNrYWdlLT5zZXRUeXBlKGlzc2V0KCRjb25maWdbJ3R5cGUnXSkgPyBzdHJ0b2xvd2VyKCRjb25maWdbJ3R5cGUnXSkgOiAnbGlicmFyeScpOwoKaWYgKGlzc2V0KCRjb25maWdbJ3RhcmdldC1kaXInXSkpIHsKJHBhY2thZ2UtPnNldFRhcmdldERpcigkY29uZmlnWyd0YXJnZXQtZGlyJ10pOwp9CgppZiAoaXNzZXQoJGNvbmZpZ1snZXh0cmEnXSkgJiYgXGlzX2FycmF5KCRjb25maWdbJ2V4dHJhJ10pKSB7CiRwYWNrYWdlLT5zZXRFeHRyYSgkY29uZmlnWydleHRyYSddKTsKfQoKaWYgKGlzc2V0KCRjb25maWdbJ2JpbiddKSkgewppZiAoIVxpc19hcnJheSgkY29uZmlnWydiaW4nXSkpIHsKJGNvbmZpZ1snYmluJ10gPSBbJGNvbmZpZ1snYmluJ11dOwp9CmZvcmVhY2ggKCRjb25maWdbJ2JpbiddIGFzICRrZXkgPT4gJGJpbikgewokY29uZmlnWydiaW4nXVska2V5XSA9IGx0cmltKCRiaW4sICcvJyk7Cn0KJHBhY2thZ2UtPnNldEJpbmFyaWVzKCRjb25maWdbJ2JpbiddKTsKfQoKaWYgKGlzc2V0KCRjb25maWdbJ2luc3RhbGxhdGlvbi1zb3VyY2UnXSkpIHsKJHBhY2thZ2UtPnNldEluc3RhbGxhdGlvblNvdXJjZSgkY29uZmlnWydpbnN0YWxsYXRpb24tc291cmNlJ10pOwp9CgppZiAoaXNzZXQoJGNvbmZpZ1snZGVmYXVsdC1icmFuY2gnXSkgJiYgJGNvbmZpZ1snZGVmYXVsdC1icmFuY2gnXSA9PT0gdHJ1ZSkgewokcGFja2FnZS0+c2V0SXNEZWZhdWx0QnJhbmNoKHRydWUpOwp9CgppZiAoaXNzZXQoJGNvbmZpZ1snc291cmNlJ10pKSB7CmlmICghaXNzZXQoJGNvbmZpZ1snc291cmNlJ11bJ3R5cGUnXSwgJGNvbmZpZ1snc291cmNlJ11bJ3VybCddLCAkY29uZmlnWydzb3VyY2UnXVsncmVmZXJlbmNlJ10pKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKHNwcmludGYoCiJQYWNrYWdlICVzJ3Mgc291cmNlIGtleSBzaG91bGQgYmUgc3BlY2lmaWVkIGFzIHtcInR5cGVcIjogLi4uLCBcInVybFwiOiAuLi4sIFwicmVmZXJlbmNlXCI6IC4uLn0sXG4lcyBnaXZlbi4iLAokY29uZmlnWyduYW1lJ10sCmpzb25fZW5jb2RlKCRjb25maWdbJ3NvdXJjZSddKQopKTsKfQokcGFja2FnZS0+c2V0U291cmNlVHlwZSgkY29uZmlnWydzb3VyY2UnXVsndHlwZSddKTsKJHBhY2thZ2UtPnNldFNvdXJjZVVybCgkY29uZmlnWydzb3VyY2UnXVsndXJsJ10pOwokcGFja2FnZS0+c2V0U291cmNlUmVmZXJlbmNlKGlzc2V0KCRjb25maWdbJ3NvdXJjZSddWydyZWZlcmVuY2UnXSkgPyAoc3RyaW5nKSAkY29uZmlnWydzb3VyY2UnXVsncmVmZXJlbmNlJ10gOiBudWxsKTsKaWYgKGlzc2V0KCRjb25maWdbJ3NvdXJjZSddWydtaXJyb3JzJ10pKSB7CiRwYWNrYWdlLT5zZXRTb3VyY2VNaXJyb3JzKCRjb25maWdbJ3NvdXJjZSddWydtaXJyb3JzJ10pOwp9Cn0KCmlmIChpc3NldCgkY29uZmlnWydkaXN0J10pKSB7CmlmICghaXNzZXQoJGNvbmZpZ1snZGlzdCddWyd0eXBlJ10sICRjb25maWdbJ2Rpc3QnXVsndXJsJ10pKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKHNwcmludGYoCiJQYWNrYWdlICVzJ3MgZGlzdCBrZXkgc2hvdWxkIGJlIHNwZWNpZmllZCBhcyAiLgoie1widHlwZVwiOiAuLi4sIFwidXJsXCI6IC4uLiwgXCJyZWZlcmVuY2VcIjogLi4uLCBcInNoYXN1bVwiOiAuLi59LFxuJXMgZ2l2ZW4uIiwKJGNvbmZpZ1snbmFtZSddLApqc29uX2VuY29kZSgkY29uZmlnWydkaXN0J10pCikpOwp9CiRwYWNrYWdlLT5zZXREaXN0VHlwZSgkY29uZmlnWydkaXN0J11bJ3R5cGUnXSk7CiRwYWNrYWdlLT5zZXREaXN0VXJsKCRjb25maWdbJ2Rpc3QnXVsndXJsJ10pOwokcGFja2FnZS0+c2V0RGlzdFJlZmVyZW5jZShpc3NldCgkY29uZmlnWydkaXN0J11bJ3JlZmVyZW5jZSddKSA/IChzdHJpbmcpICRjb25maWdbJ2Rpc3QnXVsncmVmZXJlbmNlJ10gOiBudWxsKTsKJHBhY2thZ2UtPnNldERpc3RTaGExQ2hlY2tzdW0oJGNvbmZpZ1snZGlzdCddWydzaGFzdW0nXSA/PyBudWxsKTsKaWYgKGlzc2V0KCRjb25maWdbJ2Rpc3QnXVsnbWlycm9ycyddKSkgewokcGFja2FnZS0+c2V0RGlzdE1pcnJvcnMoJGNvbmZpZ1snZGlzdCddWydtaXJyb3JzJ10pOwp9Cn0KCmlmIChpc3NldCgkY29uZmlnWydzdWdnZXN0J10pICYmIFxpc19hcnJheSgkY29uZmlnWydzdWdnZXN0J10pKSB7CmZvcmVhY2ggKCRjb25maWdbJ3N1Z2dlc3QnXSBhcyAkdGFyZ2V0ID0+ICRyZWFzb24pIHsKaWYgKCdzZWxmLnZlcnNpb24nID09PSB0cmltKCRyZWFzb24pKSB7CiRjb25maWdbJ3N1Z2dlc3QnXVskdGFyZ2V0XSA9ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCk7Cn0KfQokcGFja2FnZS0+c2V0U3VnZ2VzdHMoJGNvbmZpZ1snc3VnZ2VzdCddKTsKfQoKaWYgKGlzc2V0KCRjb25maWdbJ2F1dG9sb2FkJ10pKSB7CiRwYWNrYWdlLT5zZXRBdXRvbG9hZCgkY29uZmlnWydhdXRvbG9hZCddKTsKfQoKaWYgKGlzc2V0KCRjb25maWdbJ2F1dG9sb2FkLWRldiddKSkgewokcGFja2FnZS0+c2V0RGV2QXV0b2xvYWQoJGNvbmZpZ1snYXV0b2xvYWQtZGV2J10pOwp9CgppZiAoaXNzZXQoJGNvbmZpZ1snaW5jbHVkZS1wYXRoJ10pKSB7CiRwYWNrYWdlLT5zZXRJbmNsdWRlUGF0aHMoJGNvbmZpZ1snaW5jbHVkZS1wYXRoJ10pOwp9CgppZiAoaXNzZXQoJGNvbmZpZ1sncGhwLWV4dCddKSkgewokcGFja2FnZS0+c2V0UGhwRXh0KCRjb25maWdbJ3BocC1leHQnXSk7Cn0KCmlmICghZW1wdHkoJGNvbmZpZ1sndGltZSddKSkgewokdGltZSA9IFByZWc6OmlzTWF0Y2goJy9eXGQrKyQvRCcsICRjb25maWdbJ3RpbWUnXSkgPyAnQCcuJGNvbmZpZ1sndGltZSddIDogJGNvbmZpZ1sndGltZSddOwoKdHJ5IHsKJGRhdGUgPSBuZXcgXERhdGVUaW1lKCR0aW1lLCBuZXcgXERhdGVUaW1lWm9uZSgnVVRDJykpOwokcGFja2FnZS0+c2V0UmVsZWFzZURhdGUoJGRhdGUpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7Cn0KfQoKaWYgKCFlbXB0eSgkY29uZmlnWydub3RpZmljYXRpb24tdXJsJ10pKSB7CiRwYWNrYWdlLT5zZXROb3RpZmljYXRpb25VcmwoJGNvbmZpZ1snbm90aWZpY2F0aW9uLXVybCddKTsKfQoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlKSB7CmlmICghZW1wdHkoJGNvbmZpZ1snYXJjaGl2ZSddWyduYW1lJ10pKSB7CiRwYWNrYWdlLT5zZXRBcmNoaXZlTmFtZSgkY29uZmlnWydhcmNoaXZlJ11bJ25hbWUnXSk7Cn0KaWYgKCFlbXB0eSgkY29uZmlnWydhcmNoaXZlJ11bJ2V4Y2x1ZGUnXSkpIHsKJHBhY2thZ2UtPnNldEFyY2hpdmVFeGNsdWRlcygkY29uZmlnWydhcmNoaXZlJ11bJ2V4Y2x1ZGUnXSk7Cn0KCmlmIChpc3NldCgkY29uZmlnWydzY3JpcHRzJ10pICYmIFxpc19hcnJheSgkY29uZmlnWydzY3JpcHRzJ10pKSB7CmZvcmVhY2ggKCRjb25maWdbJ3NjcmlwdHMnXSBhcyAkZXZlbnQgPT4gJGxpc3RlbmVycykgewokY29uZmlnWydzY3JpcHRzJ11bJGV2ZW50XSA9IChhcnJheSkgJGxpc3RlbmVyczsKfQpmb3JlYWNoIChbJ2NvbXBvc2VyJywgJ3BocCcsICdwdXRlbnYnXSBhcyAkcmVzZXJ2ZWQpIHsKaWYgKGlzc2V0KCRjb25maWdbJ3NjcmlwdHMnXVskcmVzZXJ2ZWRdKSkgewp0cmlnZ2VyX2Vycm9yKCdUaGUgYCcuJHJlc2VydmVkLidgIHNjcmlwdCBuYW1lIGlzIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UsIHBsZWFzZSBhdm9pZCBkZWZpbmluZyBpdCcsIEVfVVNFUl9ERVBSRUNBVEVEKTsKfQp9CiRwYWNrYWdlLT5zZXRTY3JpcHRzKCRjb25maWdbJ3NjcmlwdHMnXSk7Cn0KCmlmICghZW1wdHkoJGNvbmZpZ1snZGVzY3JpcHRpb24nXSkgJiYgXGlzX3N0cmluZygkY29uZmlnWydkZXNjcmlwdGlvbiddKSkgewokcGFja2FnZS0+c2V0RGVzY3JpcHRpb24oJGNvbmZpZ1snZGVzY3JpcHRpb24nXSk7Cn0KCmlmICghZW1wdHkoJGNvbmZpZ1snaG9tZXBhZ2UnXSkgJiYgXGlzX3N0cmluZygkY29uZmlnWydob21lcGFnZSddKSkgewokcGFja2FnZS0+c2V0SG9tZXBhZ2UoJGNvbmZpZ1snaG9tZXBhZ2UnXSk7Cn0KCmlmICghZW1wdHkoJGNvbmZpZ1sna2V5d29yZHMnXSkgJiYgXGlzX2FycmF5KCRjb25maWdbJ2tleXdvcmRzJ10pKSB7CiRwYWNrYWdlLT5zZXRLZXl3b3JkcyhhcnJheV9tYXAoJ3N0cnZhbCcsICRjb25maWdbJ2tleXdvcmRzJ10pKTsKfQoKaWYgKCFlbXB0eSgkY29uZmlnWydsaWNlbnNlJ10pKSB7CiRwYWNrYWdlLT5zZXRMaWNlbnNlKFxpc19hcnJheSgkY29uZmlnWydsaWNlbnNlJ10pID8gJGNvbmZpZ1snbGljZW5zZSddIDogWyRjb25maWdbJ2xpY2Vuc2UnXV0pOwp9CgppZiAoIWVtcHR5KCRjb25maWdbJ2F1dGhvcnMnXSkgJiYgXGlzX2FycmF5KCRjb25maWdbJ2F1dGhvcnMnXSkpIHsKJHBhY2thZ2UtPnNldEF1dGhvcnMoJGNvbmZpZ1snYXV0aG9ycyddKTsKfQoKaWYgKGlzc2V0KCRjb25maWdbJ3N1cHBvcnQnXSkgJiYgXGlzX2FycmF5KCRjb25maWdbJ3N1cHBvcnQnXSkpIHsKJHBhY2thZ2UtPnNldFN1cHBvcnQoJGNvbmZpZ1snc3VwcG9ydCddKTsKfQoKaWYgKCFlbXB0eSgkY29uZmlnWydmdW5kaW5nJ10pICYmIFxpc19hcnJheSgkY29uZmlnWydmdW5kaW5nJ10pKSB7CiRwYWNrYWdlLT5zZXRGdW5kaW5nKCRjb25maWdbJ2Z1bmRpbmcnXSk7Cn0KCmlmIChpc3NldCgkY29uZmlnWydhYmFuZG9uZWQnXSkpIHsKJHBhY2thZ2UtPnNldEFiYW5kb25lZCgkY29uZmlnWydhYmFuZG9uZWQnXSk7Cn0KfQoKaWYgKCR0aGlzLT5sb2FkT3B0aW9ucyAmJiBpc3NldCgkY29uZmlnWyd0cmFuc3BvcnQtb3B0aW9ucyddKSkgewokcGFja2FnZS0+c2V0VHJhbnNwb3J0T3B0aW9ucygkY29uZmlnWyd0cmFuc3BvcnQtb3B0aW9ucyddKTsKfQoKaWYgKCRhbGlhc05vcm1hbGl6ZWQgPSAkdGhpcy0+Z2V0QnJhbmNoQWxpYXMoJGNvbmZpZykpIHsKJHByZXR0eUFsaWFzID0gUHJlZzo6cmVwbGFjZSgneyhcLjl7N30pK30nLCAnLngnLCAkYWxpYXNOb3JtYWxpemVkKTsKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIFJvb3RQYWNrYWdlKSB7CnJldHVybiBuZXcgUm9vdEFsaWFzUGFja2FnZSgkcGFja2FnZSwgJGFsaWFzTm9ybWFsaXplZCwgJHByZXR0eUFsaWFzKTsKfQoKcmV0dXJuIG5ldyBDb21wbGV0ZUFsaWFzUGFja2FnZSgkcGFja2FnZSwgJGFsaWFzTm9ybWFsaXplZCwgJHByZXR0eUFsaWFzKTsKfQoKcmV0dXJuICRwYWNrYWdlOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjb25maWd1cmVDYWNoZWRMaW5rcyhhcnJheSAmJGxpbmtDYWNoZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgYXJyYXkgJGNvbmZpZyk6IHZvaWQKewokbmFtZSA9ICRwYWNrYWdlLT5nZXROYW1lKCk7CiRwcmV0dHlWZXJzaW9uID0gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKCmZvcmVhY2ggKEJhc2VQYWNrYWdlOjokc3VwcG9ydGVkTGlua1R5cGVzIGFzICR0eXBlID0+ICRvcHRzKSB7CmlmIChpc3NldCgkY29uZmlnWyR0eXBlXSkpIHsKJG1ldGhvZCA9ICdzZXQnLnVjZmlyc3QoJG9wdHNbJ21ldGhvZCddKTsKCiRsaW5rcyA9IFtdOwpmb3JlYWNoICgkY29uZmlnWyR0eXBlXSBhcyAkcHJldHR5VGFyZ2V0ID0+ICRjb25zdHJhaW50KSB7CiR0YXJnZXQgPSBzdHJ0b2xvd2VyKCRwcmV0dHlUYXJnZXQpOwoKCmlmICgkdGFyZ2V0ID09PSAkbmFtZSkgewpjb250aW51ZTsKfQoKaWYgKCRjb25zdHJhaW50ID09PSAnc2VsZi52ZXJzaW9uJykgewokbGlua3NbJHRhcmdldF0gPSAkdGhpcy0+Y3JlYXRlTGluaygkbmFtZSwgJHByZXR0eVZlcnNpb24sICRvcHRzWydtZXRob2QnXSwgJHRhcmdldCwgJGNvbnN0cmFpbnQpOwp9IGVsc2UgewppZiAoIWlzc2V0KCRsaW5rQ2FjaGVbJG5hbWVdWyR0eXBlXVskdGFyZ2V0XVskY29uc3RyYWludF0pKSB7CiRsaW5rQ2FjaGVbJG5hbWVdWyR0eXBlXVskdGFyZ2V0XVskY29uc3RyYWludF0gPSBbJHRhcmdldCwgJHRoaXMtPmNyZWF0ZUxpbmsoJG5hbWUsICRwcmV0dHlWZXJzaW9uLCAkb3B0c1snbWV0aG9kJ10sICR0YXJnZXQsICRjb25zdHJhaW50KV07Cn0KClskdGFyZ2V0LCAkbGlua10gPSAkbGlua0NhY2hlWyRuYW1lXVskdHlwZV1bJHRhcmdldF1bJGNvbnN0cmFpbnRdOwokbGlua3NbJHRhcmdldF0gPSAkbGluazsKfQp9CgokcGFja2FnZS0+eyRtZXRob2R9KCRsaW5rcyk7Cn0KfQp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHBhcnNlTGlua3Moc3RyaW5nICRzb3VyY2UsIHN0cmluZyAkc291cmNlVmVyc2lvbiwgc3RyaW5nICRkZXNjcmlwdGlvbiwgYXJyYXkgJGxpbmtzKTogYXJyYXkKewokcmVzID0gW107CmZvcmVhY2ggKCRsaW5rcyBhcyAkdGFyZ2V0ID0+ICRjb25zdHJhaW50KSB7CmlmICghaXNfc3RyaW5nKCRjb25zdHJhaW50KSkgewpjb250aW51ZTsKfQokdGFyZ2V0ID0gc3RydG9sb3dlcigoc3RyaW5nKSAkdGFyZ2V0KTsKJHJlc1skdGFyZ2V0XSA9ICR0aGlzLT5jcmVhdGVMaW5rKCRzb3VyY2UsICRzb3VyY2VWZXJzaW9uLCAkZGVzY3JpcHRpb24sICR0YXJnZXQsICRjb25zdHJhaW50KTsKfQoKcmV0dXJuICRyZXM7Cn0KCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZUxpbmsoc3RyaW5nICRzb3VyY2UsIHN0cmluZyAkc291cmNlVmVyc2lvbiwgc3RyaW5nICRkZXNjcmlwdGlvbiwgc3RyaW5nICR0YXJnZXQsIHN0cmluZyAkcHJldHR5Q29uc3RyYWludCk6IExpbmsKewppZiAoIVxpc19zdHJpbmcoJHByZXR0eUNvbnN0cmFpbnQpKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdMaW5rIGNvbnN0cmFpbnQgaW4gJy4kc291cmNlLicgJy4kZGVzY3JpcHRpb24uJyA+ICcuJHRhcmdldC4nIHNob3VsZCBiZSBhIHN0cmluZywgZ290ICcuXGdldF9kZWJ1Z190eXBlKCRwcmV0dHlDb25zdHJhaW50KSAuICcgKCcgLiB2YXJfZXhwb3J0KCRwcmV0dHlDb25zdHJhaW50LCB0cnVlKSAuICcpJyk7Cn0KCmlmICgnc2VsZi52ZXJzaW9uJyA9PT0gJHByZXR0eUNvbnN0cmFpbnQpIHsKJGNvbnN0cmFpbnQgPSAkc291cmNlVmVyc2lvbjsKfSBlbHNlIHsKJGNvbnN0cmFpbnQgPSAkcHJldHR5Q29uc3RyYWludDsKfQoKdHJ5IHsKJHBhcnNlZENvbnN0cmFpbnQgPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+cGFyc2VDb25zdHJhaW50cygkY29uc3RyYWludCk7Cn0gY2F0Y2ggKFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24gJGUpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0xpbmsgY29uc3RyYWludCBpbiAnLiRzb3VyY2UuJyAnLiRkZXNjcmlwdGlvbi4nID4gJy4kdGFyZ2V0Licgc2hvdWxkIGJlIGEgdmFsaWQgdmVyc2lvbiBjb25zdHJhaW50LCBnb3QgIicuJGNvbnN0cmFpbnQuJyInLAokZS0+Z2V0Q29kZSgpLAokZQopOwp9CgpyZXR1cm4gbmV3IExpbmsoJHNvdXJjZSwgJHRhcmdldCwgJHBhcnNlZENvbnN0cmFpbnQsICRkZXNjcmlwdGlvbiwgJHByZXR0eUNvbnN0cmFpbnQpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEJyYW5jaEFsaWFzKGFycmF5ICRjb25maWcpOiA/c3RyaW5nCnsKaWYgKCFpc3NldCgkY29uZmlnWyd2ZXJzaW9uJ10pIHx8ICFpc19zY2FsYXIoJGNvbmZpZ1sndmVyc2lvbiddKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignbm8vaW52YWxpZCB2ZXJzaW9uIGRlZmluZWQnKTsKfQppZiAoIWlzX3N0cmluZygkY29uZmlnWyd2ZXJzaW9uJ10pKSB7CiRjb25maWdbJ3ZlcnNpb24nXSA9IChzdHJpbmcpICRjb25maWdbJ3ZlcnNpb24nXTsKfQoKaWYgKHN0cnBvcygkY29uZmlnWyd2ZXJzaW9uJ10sICdkZXYtJykgIT09IDAgJiYgJy1kZXYnICE9PSBzdWJzdHIoJGNvbmZpZ1sndmVyc2lvbiddLCAtNCkpIHsKcmV0dXJuIG51bGw7Cn0KCmlmIChpc3NldCgkY29uZmlnWydleHRyYSddWydicmFuY2gtYWxpYXMnXSkgJiYgXGlzX2FycmF5KCRjb25maWdbJ2V4dHJhJ11bJ2JyYW5jaC1hbGlhcyddKSkgewpmb3JlYWNoICgkY29uZmlnWydleHRyYSddWydicmFuY2gtYWxpYXMnXSBhcyAkc291cmNlQnJhbmNoID0+ICR0YXJnZXRCcmFuY2gpIHsKJHNvdXJjZUJyYW5jaCA9IChzdHJpbmcpICRzb3VyY2VCcmFuY2g7CgoKaWYgKCctZGV2JyAhPT0gc3Vic3RyKCR0YXJnZXRCcmFuY2gsIC00KSkgewpjb250aW51ZTsKfQoKCmlmICgkdGFyZ2V0QnJhbmNoID09PSBWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBUykgewokdmFsaWRhdGVkVGFyZ2V0QnJhbmNoID0gVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVM7Cn0gZWxzZSB7CiR2YWxpZGF0ZWRUYXJnZXRCcmFuY2ggPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplQnJhbmNoKHN1YnN0cigkdGFyZ2V0QnJhbmNoLCAwLCAtNCkpOwp9CmlmICgnLWRldicgIT09IHN1YnN0cigkdmFsaWRhdGVkVGFyZ2V0QnJhbmNoLCAtNCkpIHsKY29udGludWU7Cn0KCgppZiAoc3RydG9sb3dlcigkY29uZmlnWyd2ZXJzaW9uJ10pICE9PSBzdHJ0b2xvd2VyKCRzb3VyY2VCcmFuY2gpKSB7CmNvbnRpbnVlOwp9CgoKaWYgKCgkc291cmNlUHJlZml4ID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPnBhcnNlTnVtZXJpY0FsaWFzUHJlZml4KCRzb3VyY2VCcmFuY2gpKQomJiAoJHRhcmdldFByZWZpeCA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5wYXJzZU51bWVyaWNBbGlhc1ByZWZpeCgkdGFyZ2V0QnJhbmNoKSkKJiYgKHN0cmlwb3MoJHRhcmdldFByZWZpeCwgJHNvdXJjZVByZWZpeCkgIT09IDApCikgewpjb250aW51ZTsKfQoKcmV0dXJuICR2YWxpZGF0ZWRUYXJnZXRCcmFuY2g7Cn0KfQoKaWYgKAppc3NldCgkY29uZmlnWydkZWZhdWx0LWJyYW5jaCddKQomJiAkY29uZmlnWydkZWZhdWx0LWJyYW5jaCddID09PSB0cnVlCiYmIGZhbHNlID09PSAkdGhpcy0+dmVyc2lvblBhcnNlci0+cGFyc2VOdW1lcmljQWxpYXNQcmVmaXgoUHJlZzo6cmVwbGFjZSgne152fScsICcnLCAkY29uZmlnWyd2ZXJzaW9uJ10pKQopIHsKcmV0dXJuIFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTOwp9CgpyZXR1cm4gbnVsbDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXExvYWRlcjsKCgoKCmNsYXNzIEludmFsaWRQYWNrYWdlRXhjZXB0aW9uIGV4dGVuZHMgXEV4Y2VwdGlvbgp7Cgpwcml2YXRlICRlcnJvcnM7Cgpwcml2YXRlICR3YXJuaW5nczsKCnByaXZhdGUgJGRhdGE7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkZXJyb3JzLCBhcnJheSAkd2FybmluZ3MsIGFycmF5ICRkYXRhKQp7CiR0aGlzLT5lcnJvcnMgPSAkZXJyb3JzOwokdGhpcy0+d2FybmluZ3MgPSAkd2FybmluZ3M7CiR0aGlzLT5kYXRhID0gJGRhdGE7CnBhcmVudDo6X19jb25zdHJ1Y3QoIkludmFsaWQgcGFja2FnZSBpbmZvcm1hdGlvbjogXG4iLmltcGxvZGUoIlxuIiwgYXJyYXlfbWVyZ2UoJGVycm9ycywgJHdhcm5pbmdzKSkpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGF0YSgpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+ZGF0YTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEVycm9ycygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+ZXJyb3JzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0V2FybmluZ3MoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPndhcm5pbmdzOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyOwoKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUm9vdEFsaWFzUGFja2FnZTsKCgoKCmNsYXNzIEpzb25Mb2FkZXIKewoKcHJpdmF0ZSAkbG9hZGVyOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KExvYWRlckludGVyZmFjZSAkbG9hZGVyKQp7CiR0aGlzLT5sb2FkZXIgPSAkbG9hZGVyOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGxvYWQoJGpzb24pOiBCYXNlUGFja2FnZQp7CmlmICgkanNvbiBpbnN0YW5jZW9mIEpzb25GaWxlKSB7CiRjb25maWcgPSAkanNvbi0+cmVhZCgpOwp9IGVsc2VpZiAoZmlsZV9leGlzdHMoJGpzb24pKSB7CiRjb25maWcgPSBKc29uRmlsZTo6cGFyc2VKc29uKGZpbGVfZ2V0X2NvbnRlbnRzKCRqc29uKSwgJGpzb24pOwp9IGVsc2VpZiAoaXNfc3RyaW5nKCRqc29uKSkgewokY29uZmlnID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkanNvbik7Cn0gZWxzZSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoCiJKc29uTG9hZGVyOiBVbmtub3duIFwkanNvbiBwYXJhbWV0ZXIgJXMuIFBsZWFzZSByZXBvcnQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NvbXBvc2VyL2lzc3Vlcy9uZXcuIiwKZ2V0X2RlYnVnX3R5cGUoJGpzb24pCikpOwp9CgpyZXR1cm4gJHRoaXMtPmxvYWRlci0+bG9hZCgkY29uZmlnKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXExvYWRlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKCgoKCgoKaW50ZXJmYWNlIExvYWRlckludGVyZmFjZQp7CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbG9hZChhcnJheSAkY29uZmlnLCBzdHJpbmcgJGNsYXNzID0gJ0NvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlJyk6IEJhc2VQYWNrYWdlOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXExvYWRlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlGYWN0b3J5Owp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25HdWVzc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5TWFuYWdlcjsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKCgoKCgoKCgpjbGFzcyBSb290UGFja2FnZUxvYWRlciBleHRlbmRzIEFycmF5TG9hZGVyCnsKCgoKcHJpdmF0ZSAkbWFuYWdlcjsKCgoKCnByaXZhdGUgJGNvbmZpZzsKCgoKCnByaXZhdGUgJHZlcnNpb25HdWVzc2VyOwoKCgoKcHJpdmF0ZSAkaW87CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUmVwb3NpdG9yeU1hbmFnZXIgJG1hbmFnZXIsIENvbmZpZyAkY29uZmlnLCA/VmVyc2lvblBhcnNlciAkcGFyc2VyID0gbnVsbCwgP1ZlcnNpb25HdWVzc2VyICR2ZXJzaW9uR3Vlc3NlciA9IG51bGwsID9JT0ludGVyZmFjZSAkaW8gPSBudWxsKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJHBhcnNlcik7CgokdGhpcy0+bWFuYWdlciA9ICRtYW5hZ2VyOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKaWYgKG51bGwgPT09ICR2ZXJzaW9uR3Vlc3NlcikgewokcHJvY2Vzc0V4ZWN1dG9yID0gbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwokcHJvY2Vzc0V4ZWN1dG9yLT5lbmFibGVBc3luYygpOwokdmVyc2lvbkd1ZXNzZXIgPSBuZXcgVmVyc2lvbkd1ZXNzZXIoJGNvbmZpZywgJHByb2Nlc3NFeGVjdXRvciwgJHRoaXMtPnZlcnNpb25QYXJzZXIpOwp9CiR0aGlzLT52ZXJzaW9uR3Vlc3NlciA9ICR2ZXJzaW9uR3Vlc3NlcjsKJHRoaXMtPmlvID0gJGlvOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGxvYWQoYXJyYXkgJGNvbmZpZywgc3RyaW5nICRjbGFzcyA9ICdDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlJywgP3N0cmluZyAkY3dkID0gbnVsbCk6IEJhc2VQYWNrYWdlCnsKaWYgKCRjbGFzcyAhPT0gJ0NvbXBvc2VyXFBhY2thZ2VcUm9vdFBhY2thZ2UnKSB7CnRyaWdnZXJfZXJyb3IoJ1RoZSAkY2xhc3MgYXJnIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSByZWFjaCBvdXQgdG8gQ29tcG9zZXIgbWFpbnRhaW5lcnMgQVNBUCBpZiB5b3Ugc3RpbGwgbmVlZCB0aGlzLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKfQoKaWYgKCFpc3NldCgkY29uZmlnWyduYW1lJ10pKSB7CiRjb25maWdbJ25hbWUnXSA9ICdfX3Jvb3RfXyc7Cn0gZWxzZWlmICgkZXJyID0gVmFsaWRhdGluZ0FycmF5TG9hZGVyOjpoYXNQYWNrYWdlTmFtaW5nRXJyb3IoJGNvbmZpZ1snbmFtZSddKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1lvdXIgcGFja2FnZSBuYW1lICcuJGVycik7Cn0KJGF1dG9WZXJzaW9uZWQgPSBmYWxzZTsKaWYgKCFpc3NldCgkY29uZmlnWyd2ZXJzaW9uJ10pKSB7CiRjb21taXQgPSBudWxsOwoKCmlmIChQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9ST09UX1ZFUlNJT04nKSkgewokY29uZmlnWyd2ZXJzaW9uJ10gPSAkdGhpcy0+dmVyc2lvbkd1ZXNzZXItPmdldFJvb3RWZXJzaW9uRnJvbUVudigpOwp9IGVsc2UgewokdmVyc2lvbkRhdGEgPSAkdGhpcy0+dmVyc2lvbkd1ZXNzZXItPmd1ZXNzVmVyc2lvbigkY29uZmlnLCAkY3dkID8/IFBsYXRmb3JtOjpnZXRDd2QodHJ1ZSkpOwppZiAoJHZlcnNpb25EYXRhKSB7CiRjb25maWdbJ3ZlcnNpb24nXSA9ICR2ZXJzaW9uRGF0YVsncHJldHR5X3ZlcnNpb24nXTsKJGNvbmZpZ1sndmVyc2lvbl9ub3JtYWxpemVkJ10gPSAkdmVyc2lvbkRhdGFbJ3ZlcnNpb24nXTsKJGNvbW1pdCA9ICR2ZXJzaW9uRGF0YVsnY29tbWl0J107Cn0KfQoKaWYgKCFpc3NldCgkY29uZmlnWyd2ZXJzaW9uJ10pKSB7CmlmICgkdGhpcy0+aW8gIT09IG51bGwgJiYgJGNvbmZpZ1snbmFtZSddICE9PSAnX19yb290X18nICYmICdwcm9qZWN0JyAhPT0gKCRjb25maWdbJ3R5cGUnXSA/PyAnJykpIHsKJHRoaXMtPmlvLT53YXJuaW5nKApzcHJpbnRmKAoiQ29tcG9zZXIgY291bGQgbm90IGRldGVjdCB0aGUgcm9vdCBwYWNrYWdlICglcykgdmVyc2lvbiwgZGVmYXVsdGluZyB0byAnMS4wLjAnLiBTZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvcm9vdC12ZXJzaW9uIiwKJGNvbmZpZ1snbmFtZSddCikKKTsKfQokY29uZmlnWyd2ZXJzaW9uJ10gPSAnMS4wLjAnOwokYXV0b1ZlcnNpb25lZCA9IHRydWU7Cn0KCmlmICgkY29tbWl0KSB7CiRjb25maWdbJ3NvdXJjZSddID0gWwondHlwZScgPT4gJycsCid1cmwnID0+ICcnLAoncmVmZXJlbmNlJyA9PiAkY29tbWl0LApdOwokY29uZmlnWydkaXN0J10gPSBbCid0eXBlJyA9PiAnJywKJ3VybCcgPT4gJycsCidyZWZlcmVuY2UnID0+ICRjb21taXQsCl07Cn0KfQoKCiRwYWNrYWdlID0gcGFyZW50Ojpsb2FkKCRjb25maWcsICRjbGFzcyk7CmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIFJvb3RBbGlhc1BhY2thZ2UpIHsKJHJlYWxQYWNrYWdlID0gJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKfSBlbHNlIHsKJHJlYWxQYWNrYWdlID0gJHBhY2thZ2U7Cn0KCmlmICghJHJlYWxQYWNrYWdlIGluc3RhbmNlb2YgUm9vdFBhY2thZ2UpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignRXhwZWN0aW5nIGEgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZSBhdCB0aGlzIHBvaW50Jyk7Cn0KCmlmICgkYXV0b1ZlcnNpb25lZCkgewokcmVhbFBhY2thZ2UtPnJlcGxhY2VWZXJzaW9uKCRyZWFsUGFja2FnZS0+Z2V0VmVyc2lvbigpLCBSb290UGFja2FnZTo6REVGQVVMVF9QUkVUVFlfVkVSU0lPTik7Cn0KCmlmIChpc3NldCgkY29uZmlnWydtaW5pbXVtLXN0YWJpbGl0eSddKSkgewokcmVhbFBhY2thZ2UtPnNldE1pbmltdW1TdGFiaWxpdHkoVmVyc2lvblBhcnNlcjo6bm9ybWFsaXplU3RhYmlsaXR5KCRjb25maWdbJ21pbmltdW0tc3RhYmlsaXR5J10pKTsKfQoKJGFsaWFzZXMgPSBbXTsKJHN0YWJpbGl0eUZsYWdzID0gW107CiRyZWZlcmVuY2VzID0gW107CmZvcmVhY2ggKFsncmVxdWlyZScsICdyZXF1aXJlLWRldiddIGFzICRsaW5rVHlwZSkgewppZiAoaXNzZXQoJGNvbmZpZ1skbGlua1R5cGVdKSkgewokbGlua0luZm8gPSBCYXNlUGFja2FnZTo6JHN1cHBvcnRlZExpbmtUeXBlc1skbGlua1R5cGVdOwokbWV0aG9kID0gJ2dldCcudWNmaXJzdCgkbGlua0luZm9bJ21ldGhvZCddKTsKJGxpbmtzID0gW107CmZvcmVhY2ggKCRyZWFsUGFja2FnZS0+eyRtZXRob2R9KCkgYXMgJGxpbmspIHsKJGxpbmtzWyRsaW5rLT5nZXRUYXJnZXQoKV0gPSAkbGluay0+Z2V0Q29uc3RyYWludCgpLT5nZXRQcmV0dHlTdHJpbmcoKTsKfQokYWxpYXNlcyA9ICR0aGlzLT5leHRyYWN0QWxpYXNlcygkbGlua3MsICRhbGlhc2VzKTsKJHN0YWJpbGl0eUZsYWdzID0gc2VsZjo6ZXh0cmFjdFN0YWJpbGl0eUZsYWdzKCRsaW5rcywgJHJlYWxQYWNrYWdlLT5nZXRNaW5pbXVtU3RhYmlsaXR5KCksICRzdGFiaWxpdHlGbGFncyk7CiRyZWZlcmVuY2VzID0gc2VsZjo6ZXh0cmFjdFJlZmVyZW5jZXMoJGxpbmtzLCAkcmVmZXJlbmNlcyk7CgppZiAoaXNzZXQoJGxpbmtzWyRjb25maWdbJ25hbWUnXV0pKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdSb290IHBhY2thZ2UgXCclc1wnIGNhbm5vdCByZXF1aXJlIGl0c2VsZiBpbiBpdHMgY29tcG9zZXIuanNvbicgLiBQSFBfRU9MIC4KJ0RpZCB5b3UgYWNjaWRlbnRhbGx5IG5hbWUgeW91ciByb290IHBhY2thZ2UgYWZ0ZXIgYW4gZXh0ZXJuYWwgcGFja2FnZT8nLCAkY29uZmlnWyduYW1lJ10pKTsKfQp9Cn0KCmZvcmVhY2ggKGFycmF5X2tleXMoQmFzZVBhY2thZ2U6OiRzdXBwb3J0ZWRMaW5rVHlwZXMpIGFzICRsaW5rVHlwZSkgewppZiAoaXNzZXQoJGNvbmZpZ1skbGlua1R5cGVdKSkgewpmb3JlYWNoICgkY29uZmlnWyRsaW5rVHlwZV0gYXMgJGxpbmtOYW1lID0+ICRjb25zdHJhaW50KSB7CmlmICgkZXJyID0gVmFsaWRhdGluZ0FycmF5TG9hZGVyOjpoYXNQYWNrYWdlTmFtaW5nRXJyb3IoJGxpbmtOYW1lLCB0cnVlKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJGxpbmtUeXBlLicuJy4kZXJyKTsKfQp9Cn0KfQoKJHJlYWxQYWNrYWdlLT5zZXRBbGlhc2VzKCRhbGlhc2VzKTsKJHJlYWxQYWNrYWdlLT5zZXRTdGFiaWxpdHlGbGFncygkc3RhYmlsaXR5RmxhZ3MpOwokcmVhbFBhY2thZ2UtPnNldFJlZmVyZW5jZXMoJHJlZmVyZW5jZXMpOwoKaWYgKGlzc2V0KCRjb25maWdbJ3ByZWZlci1zdGFibGUnXSkpIHsKJHJlYWxQYWNrYWdlLT5zZXRQcmVmZXJTdGFibGUoKGJvb2wpICRjb25maWdbJ3ByZWZlci1zdGFibGUnXSk7Cn0KCmlmIChpc3NldCgkY29uZmlnWydjb25maWcnXSkpIHsKJHJlYWxQYWNrYWdlLT5zZXRDb25maWcoJGNvbmZpZ1snY29uZmlnJ10pOwp9CgokcmVwb3MgPSBSZXBvc2l0b3J5RmFjdG9yeTo6ZGVmYXVsdFJlcG9zKG51bGwsICR0aGlzLT5jb25maWcsICR0aGlzLT5tYW5hZ2VyKTsKZm9yZWFjaCAoJHJlcG9zIGFzICRyZXBvKSB7CiR0aGlzLT5tYW5hZ2VyLT5hZGRSZXBvc2l0b3J5KCRyZXBvKTsKfQokcmVhbFBhY2thZ2UtPnNldFJlcG9zaXRvcmllcygkdGhpcy0+Y29uZmlnLT5nZXRSZXBvc2l0b3JpZXMoKSk7CgpyZXR1cm4gJHBhY2thZ2U7Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZXh0cmFjdEFsaWFzZXMoYXJyYXkgJHJlcXVpcmVzLCBhcnJheSAkYWxpYXNlcyk6IGFycmF5CnsKZm9yZWFjaCAoJHJlcXVpcmVzIGFzICRyZXFOYW1lID0+ICRyZXFWZXJzaW9uKSB7CmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7KD86XnxcfCAqfCwgKikoW14sXHMjfF0rKSg/OiNbXiBdKyk/ICthcyArKFteLFxzfF0rKSg/OiR8ICpcfHwgKiwpfScsICRyZXFWZXJzaW9uLCAkbWF0Y2gpKSB7CiRhbGlhc2VzW10gPSBbCidwYWNrYWdlJyA9PiBzdHJ0b2xvd2VyKCRyZXFOYW1lKSwKJ3ZlcnNpb24nID0+ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJG1hdGNoWzFdLCAkcmVxVmVyc2lvbiksCidhbGlhcycgPT4gJG1hdGNoWzJdLAonYWxpYXNfbm9ybWFsaXplZCcgPT4gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkbWF0Y2hbMl0sICRyZXFWZXJzaW9uKSwKXTsKfSBlbHNlaWYgKHN0cnBvcygkcmVxVmVyc2lvbiwgJyBhcyAnKSAhPT0gZmFsc2UpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0ludmFsaWQgYWxpYXMgZGVmaW5pdGlvbiBpbiAiJy4kcmVxTmFtZS4nIjogIicuJHJlcVZlcnNpb24uJyIuIEFsaWFzZXMgc2hvdWxkIGJlIGluIHRoZSBmb3JtICJleGFjdC12ZXJzaW9uIGFzIG90aGVyLWV4YWN0LXZlcnNpb24iLicpOwp9Cn0KCnJldHVybiAkYWxpYXNlczsKfQoKCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBleHRyYWN0U3RhYmlsaXR5RmxhZ3MoYXJyYXkgJHJlcXVpcmVzLCBzdHJpbmcgJG1pbmltdW1TdGFiaWxpdHksIGFycmF5ICRzdGFiaWxpdHlGbGFncyk6IGFycmF5CnsKJHN0YWJpbGl0aWVzID0gQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTOwokbWluaW11bVN0YWJpbGl0eSA9ICRzdGFiaWxpdGllc1skbWluaW11bVN0YWJpbGl0eV07CmZvcmVhY2ggKCRyZXF1aXJlcyBhcyAkcmVxTmFtZSA9PiAkcmVxVmVyc2lvbikgewokY29uc3RyYWludHMgPSBbXTsKCgokb3JTcGxpdCA9IFByZWc6OnNwbGl0KCd7XHMqXHxcfD9ccyp9JywgdHJpbSgkcmVxVmVyc2lvbikpOwpmb3JlYWNoICgkb3JTcGxpdCBhcyAkb3JDb25zdHJhaW50KSB7CiRhbmRTcGxpdCA9IFByZWc6OnNwbGl0KCd7KD88IV58YXN8Wz0+PCAsXSkgKig/PCEtKVssIF0oPyEtKSAqKD8hLHxhc3wkKX0nLCAkb3JDb25zdHJhaW50KTsKZm9yZWFjaCAoJGFuZFNwbGl0IGFzICRhbmRDb25zdHJhaW50KSB7CiRjb25zdHJhaW50c1tdID0gJGFuZENvbnN0cmFpbnQ7Cn0KfQoKCiRtYXRjaGVkID0gZmFsc2U7CmZvcmVhY2ggKCRjb25zdHJhaW50cyBhcyAkY29uc3RyYWludCkgewppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne15bXkBdKj9AKCcuaW1wbG9kZSgnfCcsIGFycmF5X2tleXMoJHN0YWJpbGl0aWVzKSkuJykkfWknLCAkY29uc3RyYWludCwgJG1hdGNoKSkgewokbmFtZSA9IHN0cnRvbG93ZXIoJHJlcU5hbWUpOwokc3RhYmlsaXR5ID0gJHN0YWJpbGl0aWVzW1ZlcnNpb25QYXJzZXI6Om5vcm1hbGl6ZVN0YWJpbGl0eSgkbWF0Y2hbMV0pXTsKCmlmIChpc3NldCgkc3RhYmlsaXR5RmxhZ3NbJG5hbWVdKSAmJiAkc3RhYmlsaXR5RmxhZ3NbJG5hbWVdID4gJHN0YWJpbGl0eSkgewpjb250aW51ZTsKfQokc3RhYmlsaXR5RmxhZ3NbJG5hbWVdID0gJHN0YWJpbGl0eTsKJG1hdGNoZWQgPSB0cnVlOwp9Cn0KCmlmICgkbWF0Y2hlZCkgewpjb250aW51ZTsKfQoKZm9yZWFjaCAoJGNvbnN0cmFpbnRzIGFzICRjb25zdHJhaW50KSB7CgoKJHJlcVZlcnNpb24gPSBQcmVnOjpyZXBsYWNlKCd7XihbXixcc0BdKykgYXMgLiskfScsICckMScsICRjb25zdHJhaW50KTsKaWYgKFByZWc6OmlzTWF0Y2goJ3teW14sXHNAXSskfScsICRyZXFWZXJzaW9uKSAmJiAnc3RhYmxlJyAhPT0gKCRzdGFiaWxpdHlOYW1lID0gVmVyc2lvblBhcnNlcjo6cGFyc2VTdGFiaWxpdHkoJHJlcVZlcnNpb24pKSkgewokbmFtZSA9IHN0cnRvbG93ZXIoJHJlcU5hbWUpOwokc3RhYmlsaXR5ID0gJHN0YWJpbGl0aWVzWyRzdGFiaWxpdHlOYW1lXTsKaWYgKChpc3NldCgkc3RhYmlsaXR5RmxhZ3NbJG5hbWVdKSAmJiAkc3RhYmlsaXR5RmxhZ3NbJG5hbWVdID4gJHN0YWJpbGl0eSkgfHwgKCRtaW5pbXVtU3RhYmlsaXR5ID4gJHN0YWJpbGl0eSkpIHsKY29udGludWU7Cn0KJHN0YWJpbGl0eUZsYWdzWyRuYW1lXSA9ICRzdGFiaWxpdHk7Cn0KfQp9CgpyZXR1cm4gJHN0YWJpbGl0eUZsYWdzOwp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZXh0cmFjdFJlZmVyZW5jZXMoYXJyYXkgJHJlcXVpcmVzLCBhcnJheSAkcmVmZXJlbmNlcyk6IGFycmF5CnsKZm9yZWFjaCAoJHJlcXVpcmVzIGFzICRyZXFOYW1lID0+ICRyZXFWZXJzaW9uKSB7CiRyZXFWZXJzaW9uID0gUHJlZzo6cmVwbGFjZSgne14oW14sXHNAXSspIGFzIC4rJH0nLCAnJDEnLCAkcmVxVmVyc2lvbik7CmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XlteLFxzQF0rPyMoW2EtZjAtOV0rKSR9JywgJHJlcVZlcnNpb24sICRtYXRjaCkgJiYgJ2RldicgPT09IFZlcnNpb25QYXJzZXI6OnBhcnNlU3RhYmlsaXR5KCRyZXFWZXJzaW9uKSkgewokbmFtZSA9IHN0cnRvbG93ZXIoJHJlcU5hbWUpOwokcmVmZXJlbmNlc1skbmFtZV0gPSAkbWF0Y2hbMV07Cn0KfQoKcmV0dXJuICRyZWZlcmVuY2VzOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE1hdGNoTm9uZUNvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxTZW12ZXJcSW50ZXJ2YWxzOwp1c2UgQ29tcG9zZXJcU3BkeFxTcGR4TGljZW5zZXM7CgoKCgpjbGFzcyBWYWxpZGF0aW5nQXJyYXlMb2FkZXIgaW1wbGVtZW50cyBMb2FkZXJJbnRlcmZhY2UKewpwdWJsaWMgY29uc3QgQ0hFQ0tfQUxMID0gMzsKcHVibGljIGNvbnN0IENIRUNLX1VOQk9VTkRfQ09OU1RSQUlOVFMgPSAxOwpwdWJsaWMgY29uc3QgQ0hFQ0tfU1RSSUNUX0NPTlNUUkFJTlRTID0gMjsKCgpwcml2YXRlICRsb2FkZXI7Cgpwcml2YXRlICR2ZXJzaW9uUGFyc2VyOwoKcHJpdmF0ZSAkZXJyb3JzOwoKcHJpdmF0ZSAkd2FybmluZ3M7Cgpwcml2YXRlICRjb25maWc7Cgpwcml2YXRlICRmbGFnczsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChMb2FkZXJJbnRlcmZhY2UgJGxvYWRlciwgYm9vbCAkc3RyaWN0TmFtZSA9IHRydWUsID9WZXJzaW9uUGFyc2VyICRwYXJzZXIgPSBudWxsLCBpbnQgJGZsYWdzID0gMCkKewokdGhpcy0+bG9hZGVyID0gJGxvYWRlcjsKJHRoaXMtPnZlcnNpb25QYXJzZXIgPSAkcGFyc2VyID8/IG5ldyBWZXJzaW9uUGFyc2VyKCk7CiR0aGlzLT5mbGFncyA9ICRmbGFnczsKCmlmICgkc3RyaWN0TmFtZSAhPT0gdHJ1ZSkgeyAKdHJpZ2dlcl9lcnJvcignJHN0cmljdE5hbWUgbXVzdCBiZSBzZXQgdG8gdHJ1ZSBpbiBWYWxpZGF0aW5nQXJyYXlMb2FkZXJcJ3MgY29uc3RydWN0b3IgYXMgb2YgMi4yLCBhbmQgaXQgd2lsbCBiZSByZW1vdmVkIGluIDMuMCcsIEVfVVNFUl9ERVBSRUNBVEVEKTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbG9hZChhcnJheSAkY29uZmlnLCBzdHJpbmcgJGNsYXNzID0gJ0NvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlJyk6IEJhc2VQYWNrYWdlCnsKJHRoaXMtPmVycm9ycyA9IFtdOwokdGhpcy0+d2FybmluZ3MgPSBbXTsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7CgokdGhpcy0+dmFsaWRhdGVTdHJpbmcoJ25hbWUnLCB0cnVlKTsKaWYgKGlzc2V0KCRjb25maWdbJ25hbWUnXSkgJiYgbnVsbCAhPT0gKCRlcnIgPSBzZWxmOjpoYXNQYWNrYWdlTmFtaW5nRXJyb3IoJGNvbmZpZ1snbmFtZSddKSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJ25hbWUgOiAnLiRlcnI7Cn0KCmlmIChpc3NldCgkdGhpcy0+Y29uZmlnWyd2ZXJzaW9uJ10pKSB7CmlmICghaXNfc2NhbGFyKCR0aGlzLT5jb25maWdbJ3ZlcnNpb24nXSkpIHsKJHRoaXMtPnZhbGlkYXRlU3RyaW5nKCd2ZXJzaW9uJyk7Cn0gZWxzZSB7CmlmICghaXNfc3RyaW5nKCR0aGlzLT5jb25maWdbJ3ZlcnNpb24nXSkpIHsKJHRoaXMtPmNvbmZpZ1sndmVyc2lvbiddID0gKHN0cmluZykgJHRoaXMtPmNvbmZpZ1sndmVyc2lvbiddOwp9CnRyeSB7CiR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHRoaXMtPmNvbmZpZ1sndmVyc2lvbiddKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewokdGhpcy0+ZXJyb3JzW10gPSAndmVyc2lvbiA6IGludmFsaWQgdmFsdWUgKCcuJHRoaXMtPmNvbmZpZ1sndmVyc2lvbiddLicpOiAnLiRlLT5nZXRNZXNzYWdlKCk7CnVuc2V0KCR0aGlzLT5jb25maWdbJ3ZlcnNpb24nXSk7Cn0KfQp9CgppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1snY29uZmlnJ11bJ3BsYXRmb3JtJ10pKSB7CmZvcmVhY2ggKChhcnJheSkgJHRoaXMtPmNvbmZpZ1snY29uZmlnJ11bJ3BsYXRmb3JtJ10gYXMgJGtleSA9PiAkcGxhdGZvcm0pIHsKaWYgKGZhbHNlID09PSAkcGxhdGZvcm0pIHsKY29udGludWU7Cn0KaWYgKCFpc19zdHJpbmcoJHBsYXRmb3JtKSkgewokdGhpcy0+ZXJyb3JzW10gPSAnY29uZmlnLnBsYXRmb3JtLicgLiAka2V5IC4gJyA6IGludmFsaWQgdmFsdWUgKCcuZ2V0X2RlYnVnX3R5cGUoJHBsYXRmb3JtKS4nICcudmFyX2V4cG9ydCgkcGxhdGZvcm0sIHRydWUpLicpOiBleHBlY3RlZCBzdHJpbmcgb3IgZmFsc2UnOwpjb250aW51ZTsKfQp0cnkgewokdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRwbGF0Zm9ybSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJHRoaXMtPmVycm9yc1tdID0gJ2NvbmZpZy5wbGF0Zm9ybS4nIC4gJGtleSAuICcgOiBpbnZhbGlkIHZhbHVlICgnLiRwbGF0Zm9ybS4nKTogJy4kZS0+Z2V0TWVzc2FnZSgpOwp9Cn0KfQoKJHRoaXMtPnZhbGlkYXRlUmVnZXgoJ3R5cGUnLCAnW0EtWmEtejAtOS1dKycpOwokdGhpcy0+dmFsaWRhdGVTdHJpbmcoJ3RhcmdldC1kaXInKTsKJHRoaXMtPnZhbGlkYXRlQXJyYXkoJ2V4dHJhJyk7CgppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1snYmluJ10pKSB7CmlmIChpc19zdHJpbmcoJHRoaXMtPmNvbmZpZ1snYmluJ10pKSB7CiR0aGlzLT52YWxpZGF0ZVN0cmluZygnYmluJyk7Cn0gZWxzZSB7CiR0aGlzLT52YWxpZGF0ZUZsYXRBcnJheSgnYmluJyk7Cn0KfQoKJHRoaXMtPnZhbGlkYXRlQXJyYXkoJ3NjcmlwdHMnKTsgCiR0aGlzLT52YWxpZGF0ZVN0cmluZygnZGVzY3JpcHRpb24nKTsKJHRoaXMtPnZhbGlkYXRlVXJsKCdob21lcGFnZScpOwokdGhpcy0+dmFsaWRhdGVGbGF0QXJyYXkoJ2tleXdvcmRzJywgJ1tccHtOfVxwe0x9IC5fLV0rJyk7CgokcmVsZWFzZURhdGUgPSBudWxsOwokdGhpcy0+dmFsaWRhdGVTdHJpbmcoJ3RpbWUnKTsKaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJ3RpbWUnXSkpIHsKdHJ5IHsKJHJlbGVhc2VEYXRlID0gbmV3IFxEYXRlVGltZSgkdGhpcy0+Y29uZmlnWyd0aW1lJ10sIG5ldyBcRGF0ZVRpbWVab25lKCdVVEMnKSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJHRoaXMtPmVycm9yc1tdID0gJ3RpbWUgOiBpbnZhbGlkIHZhbHVlICgnLiR0aGlzLT5jb25maWdbJ3RpbWUnXS4nKTogJy4kZS0+Z2V0TWVzc2FnZSgpOwp1bnNldCgkdGhpcy0+Y29uZmlnWyd0aW1lJ10pOwp9Cn0KCmlmIChpc3NldCgkdGhpcy0+Y29uZmlnWydsaWNlbnNlJ10pKSB7CgppZiAoaXNfYXJyYXkoJHRoaXMtPmNvbmZpZ1snbGljZW5zZSddKSB8fCBpc19zdHJpbmcoJHRoaXMtPmNvbmZpZ1snbGljZW5zZSddKSkgewokbGljZW5zZXMgPSAoYXJyYXkpICR0aGlzLT5jb25maWdbJ2xpY2Vuc2UnXTsKCmZvcmVhY2ggKCRsaWNlbnNlcyBhcyAkaW5kZXggPT4gJGxpY2Vuc2UpIHsKaWYgKCFpc19zdHJpbmcoJGxpY2Vuc2UpKSB7CiR0aGlzLT53YXJuaW5nc1tdID0gc3ByaW50ZigKJ0xpY2Vuc2UgJXMgc2hvdWxkIGJlIGEgc3RyaW5nLicsCmpzb25fZW5jb2RlKCRsaWNlbnNlKQopOwp1bnNldCgkbGljZW5zZXNbJGluZGV4XSk7Cn0KfQoKCmlmIChudWxsID09PSAkcmVsZWFzZURhdGUgfHwgJHJlbGVhc2VEYXRlLT5nZXRUaW1lc3RhbXAoKSA+PSBzdHJ0b3RpbWUoJy04ZGF5cycpKSB7CiRsaWNlbnNlVmFsaWRhdG9yID0gbmV3IFNwZHhMaWNlbnNlcygpOwpmb3JlYWNoICgkbGljZW5zZXMgYXMgJGxpY2Vuc2UpIHsKCmlmICgncHJvcHJpZXRhcnknID09PSAkbGljZW5zZSkgewpjb250aW51ZTsKfQokbGljZW5zZVRvVmFsaWRhdGUgPSBzdHJfcmVwbGFjZSgncHJvcHJpZXRhcnknLCAnTUlUJywgJGxpY2Vuc2UpOwppZiAoISRsaWNlbnNlVmFsaWRhdG9yLT52YWxpZGF0ZSgkbGljZW5zZVRvVmFsaWRhdGUpKSB7CmlmICgkbGljZW5zZVZhbGlkYXRvci0+dmFsaWRhdGUodHJpbSgkbGljZW5zZVRvVmFsaWRhdGUpKSkgewokdGhpcy0+d2FybmluZ3NbXSA9IHNwcmludGYoCidMaWNlbnNlICVzIG11c3Qgbm90IGNvbnRhaW4gZXh0cmEgc3BhY2VzLCBtYWtlIHN1cmUgdG8gdHJpbSBpdC4nLApqc29uX2VuY29kZSgkbGljZW5zZSkKKTsKfSBlbHNlIHsKJHRoaXMtPndhcm5pbmdzW10gPSBzcHJpbnRmKAonTGljZW5zZSAlcyBpcyBub3QgYSB2YWxpZCBTUERYIGxpY2Vuc2UgaWRlbnRpZmllciwgc2VlIGh0dHBzOi8vc3BkeC5vcmcvbGljZW5zZXMvIGlmIHlvdSB1c2UgYW4gb3BlbiBsaWNlbnNlLicgLiBQSFBfRU9MIC4KJ0lmIHRoZSBzb2Z0d2FyZSBpcyBjbG9zZWQtc291cmNlLCB5b3UgbWF5IHVzZSAicHJvcHJpZXRhcnkiIGFzIGxpY2Vuc2UuJywKanNvbl9lbmNvZGUoJGxpY2Vuc2UpCik7Cn0KfQp9Cn0KCiR0aGlzLT5jb25maWdbJ2xpY2Vuc2UnXSA9IGFycmF5X3ZhbHVlcygkbGljZW5zZXMpOwp9IGVsc2UgewokdGhpcy0+d2FybmluZ3NbXSA9IHNwcmludGYoCidMaWNlbnNlIG11c3QgYmUgYSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncywgZ290ICVzLicsCmpzb25fZW5jb2RlKCR0aGlzLT5jb25maWdbJ2xpY2Vuc2UnXSkKKTsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snbGljZW5zZSddKTsKfQp9CgppZiAoJHRoaXMtPnZhbGlkYXRlQXJyYXkoJ2F1dGhvcnMnKSkgewpmb3JlYWNoICgkdGhpcy0+Y29uZmlnWydhdXRob3JzJ10gYXMgJGtleSA9PiAkYXV0aG9yKSB7CmlmICghaXNfYXJyYXkoJGF1dGhvcikpIHsKJHRoaXMtPmVycm9yc1tdID0gJ2F1dGhvcnMuJy4ka2V5LicgOiBzaG91bGQgYmUgYW4gYXJyYXksICcuZ2V0X2RlYnVnX3R5cGUoJGF1dGhvcikuJyBnaXZlbic7CnVuc2V0KCR0aGlzLT5jb25maWdbJ2F1dGhvcnMnXVska2V5XSk7CmNvbnRpbnVlOwp9CmZvcmVhY2ggKFsnaG9tZXBhZ2UnLCAnZW1haWwnLCAnbmFtZScsICdyb2xlJ10gYXMgJGF1dGhvckRhdGEpIHsKaWYgKGlzc2V0KCRhdXRob3JbJGF1dGhvckRhdGFdKSAmJiAhaXNfc3RyaW5nKCRhdXRob3JbJGF1dGhvckRhdGFdKSkgewokdGhpcy0+ZXJyb3JzW10gPSAnYXV0aG9ycy4nLiRrZXkuJy4nLiRhdXRob3JEYXRhLicgOiBpbnZhbGlkIHZhbHVlLCBtdXN0IGJlIGEgc3RyaW5nJzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snYXV0aG9ycyddWyRrZXldWyRhdXRob3JEYXRhXSk7Cn0KfQppZiAoaXNzZXQoJGF1dGhvclsnaG9tZXBhZ2UnXSkgJiYgISR0aGlzLT5maWx0ZXJVcmwoJGF1dGhvclsnaG9tZXBhZ2UnXSkpIHsKJHRoaXMtPndhcm5pbmdzW10gPSAnYXV0aG9ycy4nLiRrZXkuJy5ob21lcGFnZSA6IGludmFsaWQgdmFsdWUgKCcuJGF1dGhvclsnaG9tZXBhZ2UnXS4nKSwgbXVzdCBiZSBhbiBodHRwL2h0dHBzIFVSTCc7CnVuc2V0KCR0aGlzLT5jb25maWdbJ2F1dGhvcnMnXVska2V5XVsnaG9tZXBhZ2UnXSk7Cn0KaWYgKGlzc2V0KCRhdXRob3JbJ2VtYWlsJ10pICYmIGZhbHNlID09PSBmaWx0ZXJfdmFyKCRhdXRob3JbJ2VtYWlsJ10sIEZJTFRFUl9WQUxJREFURV9FTUFJTCkpIHsKJHRoaXMtPndhcm5pbmdzW10gPSAnYXV0aG9ycy4nLiRrZXkuJy5lbWFpbCA6IGludmFsaWQgdmFsdWUgKCcuJGF1dGhvclsnZW1haWwnXS4nKSwgbXVzdCBiZSBhIHZhbGlkIGVtYWlsIGFkZHJlc3MnOwp1bnNldCgkdGhpcy0+Y29uZmlnWydhdXRob3JzJ11bJGtleV1bJ2VtYWlsJ10pOwp9CmlmIChcY291bnQoJHRoaXMtPmNvbmZpZ1snYXV0aG9ycyddWyRrZXldKSA9PT0gMCkgewp1bnNldCgkdGhpcy0+Y29uZmlnWydhdXRob3JzJ11bJGtleV0pOwp9Cn0KaWYgKFxjb3VudCgkdGhpcy0+Y29uZmlnWydhdXRob3JzJ10pID09PSAwKSB7CnVuc2V0KCR0aGlzLT5jb25maWdbJ2F1dGhvcnMnXSk7Cn0KfQoKaWYgKCR0aGlzLT52YWxpZGF0ZUFycmF5KCdzdXBwb3J0JykgJiYgIWVtcHR5KCR0aGlzLT5jb25maWdbJ3N1cHBvcnQnXSkpIHsKZm9yZWFjaCAoWydpc3N1ZXMnLCAnZm9ydW0nLCAnd2lraScsICdzb3VyY2UnLCAnZW1haWwnLCAnaXJjJywgJ2RvY3MnLCAncnNzJywgJ2NoYXQnLCAnc2VjdXJpdHknXSBhcyAka2V5KSB7CmlmIChpc3NldCgkdGhpcy0+Y29uZmlnWydzdXBwb3J0J11bJGtleV0pICYmICFpc19zdHJpbmcoJHRoaXMtPmNvbmZpZ1snc3VwcG9ydCddWyRrZXldKSkgewokdGhpcy0+ZXJyb3JzW10gPSAnc3VwcG9ydC4nLiRrZXkuJyA6IGludmFsaWQgdmFsdWUsIG11c3QgYmUgYSBzdHJpbmcnOwp1bnNldCgkdGhpcy0+Y29uZmlnWydzdXBwb3J0J11bJGtleV0pOwp9Cn0KCmlmIChpc3NldCgkdGhpcy0+Y29uZmlnWydzdXBwb3J0J11bJ2VtYWlsJ10pICYmICFmaWx0ZXJfdmFyKCR0aGlzLT5jb25maWdbJ3N1cHBvcnQnXVsnZW1haWwnXSwgRklMVEVSX1ZBTElEQVRFX0VNQUlMKSkgewokdGhpcy0+d2FybmluZ3NbXSA9ICdzdXBwb3J0LmVtYWlsIDogaW52YWxpZCB2YWx1ZSAoJy4kdGhpcy0+Y29uZmlnWydzdXBwb3J0J11bJ2VtYWlsJ10uJyksIG11c3QgYmUgYSB2YWxpZCBlbWFpbCBhZGRyZXNzJzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snc3VwcG9ydCddWydlbWFpbCddKTsKfQoKaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJ3N1cHBvcnQnXVsnaXJjJ10pICYmICEkdGhpcy0+ZmlsdGVyVXJsKCR0aGlzLT5jb25maWdbJ3N1cHBvcnQnXVsnaXJjJ10sIFsnaXJjJywgJ2lyY3MnXSkpIHsKJHRoaXMtPndhcm5pbmdzW10gPSAnc3VwcG9ydC5pcmMgOiBpbnZhbGlkIHZhbHVlICgnLiR0aGlzLT5jb25maWdbJ3N1cHBvcnQnXVsnaXJjJ10uJyksIG11c3QgYmUgYSBpcmM6Ly88c2VydmVyPi88Y2hhbm5lbD4gb3IgaXJjczovLyBVUkwnOwp1bnNldCgkdGhpcy0+Y29uZmlnWydzdXBwb3J0J11bJ2lyYyddKTsKfQoKZm9yZWFjaCAoWydpc3N1ZXMnLCAnZm9ydW0nLCAnd2lraScsICdzb3VyY2UnLCAnZG9jcycsICdjaGF0JywgJ3NlY3VyaXR5J10gYXMgJGtleSkgewppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1snc3VwcG9ydCddWyRrZXldKSAmJiAhJHRoaXMtPmZpbHRlclVybCgkdGhpcy0+Y29uZmlnWydzdXBwb3J0J11bJGtleV0pKSB7CiR0aGlzLT53YXJuaW5nc1tdID0gJ3N1cHBvcnQuJy4ka2V5LicgOiBpbnZhbGlkIHZhbHVlICgnLiR0aGlzLT5jb25maWdbJ3N1cHBvcnQnXVska2V5XS4nKSwgbXVzdCBiZSBhbiBodHRwL2h0dHBzIFVSTCc7CnVuc2V0KCR0aGlzLT5jb25maWdbJ3N1cHBvcnQnXVska2V5XSk7Cn0KfQppZiAoZW1wdHkoJHRoaXMtPmNvbmZpZ1snc3VwcG9ydCddKSkgewp1bnNldCgkdGhpcy0+Y29uZmlnWydzdXBwb3J0J10pOwp9Cn0KCmlmICgkdGhpcy0+dmFsaWRhdGVBcnJheSgnZnVuZGluZycpICYmICFlbXB0eSgkdGhpcy0+Y29uZmlnWydmdW5kaW5nJ10pKSB7CmZvcmVhY2ggKCR0aGlzLT5jb25maWdbJ2Z1bmRpbmcnXSBhcyAka2V5ID0+ICRmdW5kaW5nT3B0aW9uKSB7CmlmICghaXNfYXJyYXkoJGZ1bmRpbmdPcHRpb24pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdmdW5kaW5nLicuJGtleS4nIDogc2hvdWxkIGJlIGFuIGFycmF5LCAnLmdldF9kZWJ1Z190eXBlKCRmdW5kaW5nT3B0aW9uKS4nIGdpdmVuJzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snZnVuZGluZyddWyRrZXldKTsKY29udGludWU7Cn0KZm9yZWFjaCAoWyd0eXBlJywgJ3VybCddIGFzICRmdW5kaW5nRGF0YSkgewppZiAoaXNzZXQoJGZ1bmRpbmdPcHRpb25bJGZ1bmRpbmdEYXRhXSkgJiYgIWlzX3N0cmluZygkZnVuZGluZ09wdGlvblskZnVuZGluZ0RhdGFdKSkgewokdGhpcy0+ZXJyb3JzW10gPSAnZnVuZGluZy4nLiRrZXkuJy4nLiRmdW5kaW5nRGF0YS4nIDogaW52YWxpZCB2YWx1ZSwgbXVzdCBiZSBhIHN0cmluZyc7CnVuc2V0KCR0aGlzLT5jb25maWdbJ2Z1bmRpbmcnXVska2V5XVskZnVuZGluZ0RhdGFdKTsKfQp9CmlmIChpc3NldCgkZnVuZGluZ09wdGlvblsndXJsJ10pICYmICEkdGhpcy0+ZmlsdGVyVXJsKCRmdW5kaW5nT3B0aW9uWyd1cmwnXSkpIHsKJHRoaXMtPndhcm5pbmdzW10gPSAnZnVuZGluZy4nLiRrZXkuJy51cmwgOiBpbnZhbGlkIHZhbHVlICgnLiRmdW5kaW5nT3B0aW9uWyd1cmwnXS4nKSwgbXVzdCBiZSBhbiBodHRwL2h0dHBzIFVSTCc7CnVuc2V0KCR0aGlzLT5jb25maWdbJ2Z1bmRpbmcnXVska2V5XVsndXJsJ10pOwp9CmlmIChlbXB0eSgkdGhpcy0+Y29uZmlnWydmdW5kaW5nJ11bJGtleV0pKSB7CnVuc2V0KCR0aGlzLT5jb25maWdbJ2Z1bmRpbmcnXVska2V5XSk7Cn0KfQppZiAoZW1wdHkoJHRoaXMtPmNvbmZpZ1snZnVuZGluZyddKSkgewp1bnNldCgkdGhpcy0+Y29uZmlnWydmdW5kaW5nJ10pOwp9Cn0KCmlmIChpc3NldCgkdGhpcy0+Y29uZmlnWydwaHAtZXh0J10pICYmICR0aGlzLT52YWxpZGF0ZUFycmF5KCdwaHAtZXh0JykpIHsKaWYgKCFpbl9hcnJheSgkdGhpcy0+Y29uZmlnWyd0eXBlJ10gPz8gJycsIFsncGhwLWV4dCcsICdwaHAtZXh0LXplbmQnXSwgdHJ1ZSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJ3BocC1leHQgY2FuIG9ubHkgYmUgc2V0IGJ5IHBhY2thZ2VzIG9mIHR5cGUgInBocC1leHQiIG9yICJwaHAtZXh0LXplbmQiIHdoaWNoIG11c3QgYmUgQyBleHRlbnNpb25zJzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1sncGhwLWV4dCddKTsKfQoKJHBocEV4dCA9ICYkdGhpcy0+Y29uZmlnWydwaHAtZXh0J107CgppZiAoaXNzZXQoJHBocEV4dFsnZXh0ZW5zaW9uLW5hbWUnXSkgJiYgIWlzX3N0cmluZygkcGhwRXh0WydleHRlbnNpb24tbmFtZSddKSkgewokdGhpcy0+ZXJyb3JzW10gPSAncGhwLWV4dC5leHRlbnNpb24tbmFtZSA6IHNob3VsZCBiZSBhIHN0cmluZywgJy5nZXRfZGVidWdfdHlwZSgkcGhwRXh0WydleHRlbnNpb24tbmFtZSddKS4nIGdpdmVuJzsKdW5zZXQoJHBocEV4dFsnZXh0ZW5zaW9uLW5hbWUnXSk7Cn0KCmlmIChpc3NldCgkcGhwRXh0Wydwcmlvcml0eSddKSAmJiAhaXNfaW50KCRwaHBFeHRbJ3ByaW9yaXR5J10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdwaHAtZXh0LnByaW9yaXR5IDogc2hvdWxkIGJlIGFuIGludGVnZXIsICcuZ2V0X2RlYnVnX3R5cGUoJHBocEV4dFsncHJpb3JpdHknXSkuJyBnaXZlbic7CnVuc2V0KCRwaHBFeHRbJ3ByaW9yaXR5J10pOwp9CgppZiAoaXNzZXQoJHBocEV4dFsnc3VwcG9ydC16dHMnXSkgJiYgIWlzX2Jvb2woJHBocEV4dFsnc3VwcG9ydC16dHMnXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJ3BocC1leHQuc3VwcG9ydC16dHMgOiBzaG91bGQgYmUgYSBib29sZWFuLCAnLmdldF9kZWJ1Z190eXBlKCRwaHBFeHRbJ3N1cHBvcnQtenRzJ10pLicgZ2l2ZW4nOwp1bnNldCgkcGhwRXh0WydzdXBwb3J0LXp0cyddKTsKfQoKaWYgKGlzc2V0KCRwaHBFeHRbJ3N1cHBvcnQtbnRzJ10pICYmICFpc19ib29sKCRwaHBFeHRbJ3N1cHBvcnQtbnRzJ10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdwaHAtZXh0LnN1cHBvcnQtbnRzIDogc2hvdWxkIGJlIGEgYm9vbGVhbiwgJy5nZXRfZGVidWdfdHlwZSgkcGhwRXh0WydzdXBwb3J0LW50cyddKS4nIGdpdmVuJzsKdW5zZXQoJHBocEV4dFsnc3VwcG9ydC1udHMnXSk7Cn0KCmlmIChpc3NldCgkcGhwRXh0WydidWlsZC1wYXRoJ10pICYmICFpc19zdHJpbmcoJHBocEV4dFsnYnVpbGQtcGF0aCddKSAmJiAhaXNfbnVsbCgkcGhwRXh0WydidWlsZC1wYXRoJ10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdwaHAtZXh0LmJ1aWxkLXBhdGggOiBzaG91bGQgYmUgYSBzdHJpbmcgb3IgbnVsbCwgJy5nZXRfZGVidWdfdHlwZSgkcGhwRXh0WydidWlsZC1wYXRoJ10pLicgZ2l2ZW4nOwp1bnNldCgkcGhwRXh0WydidWlsZC1wYXRoJ10pOwp9CgppZiAoaXNzZXQoJHBocEV4dFsnZG93bmxvYWQtdXJsLW1ldGhvZCddKSkgewppZiAoIWlzX2FycmF5KCRwaHBFeHRbJ2Rvd25sb2FkLXVybC1tZXRob2QnXSkgJiYgIWlzX3N0cmluZygkcGhwRXh0Wydkb3dubG9hZC11cmwtbWV0aG9kJ10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdwaHAtZXh0LmRvd25sb2FkLXVybC1tZXRob2QgOiBzaG91bGQgYmUgYW4gYXJyYXkgb3IgYSBzdHJpbmcsICcuZ2V0X2RlYnVnX3R5cGUoJHBocEV4dFsnZG93bmxvYWQtdXJsLW1ldGhvZCddKS4nIGdpdmVuJzsKdW5zZXQoJHBocEV4dFsnZG93bmxvYWQtdXJsLW1ldGhvZCddKTsKfSBlbHNlIHsKJHZhbGlkRG93bmxvYWRVcmxNZXRob2RzID0gWydjb21wb3Nlci1kZWZhdWx0JywgJ3ByZS1wYWNrYWdlZC1zb3VyY2UnLCAncHJlLXBhY2thZ2VkLWJpbmFyeSddOwokZGVmaW5lZERvd25sb2FkVXJsTWV0aG9kcyA9IGlzX2FycmF5KCRwaHBFeHRbJ2Rvd25sb2FkLXVybC1tZXRob2QnXSkgPyAkcGhwRXh0Wydkb3dubG9hZC11cmwtbWV0aG9kJ10gOiBbJHBocEV4dFsnZG93bmxvYWQtdXJsLW1ldGhvZCddXTsKCmlmIChbXSA9PT0gJGRlZmluZWREb3dubG9hZFVybE1ldGhvZHMpIHsKJHRoaXMtPmVycm9yc1tdID0gJ3BocC1leHQuZG93bmxvYWQtdXJsLW1ldGhvZCA6IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgZWxlbWVudCc7CnVuc2V0KCRwaHBFeHRbJ2Rvd25sb2FkLXVybC1tZXRob2QnXSk7Cn0gZWxzZSB7CmZvcmVhY2ggKCRkZWZpbmVkRG93bmxvYWRVcmxNZXRob2RzIGFzICRrZXkgPT4gJGRvd25sb2FkVXJsTWV0aG9kKSB7CmlmICghaXNfc3RyaW5nKCRkb3dubG9hZFVybE1ldGhvZCkpIHsKJHRoaXMtPmVycm9yc1tdID0gJ3BocC1leHQuZG93bmxvYWQtdXJsLW1ldGhvZC4nLiRrZXkuJyA6IHNob3VsZCBiZSBhIHN0cmluZywgJy5nZXRfZGVidWdfdHlwZSgkZG93bmxvYWRVcmxNZXRob2QpLicgZ2l2ZW4nOwp1bnNldCgkcGhwRXh0Wydkb3dubG9hZC11cmwtbWV0aG9kJ10pOwp9IGVsc2VpZiAoIWluX2FycmF5KCRkb3dubG9hZFVybE1ldGhvZCwgJHZhbGlkRG93bmxvYWRVcmxNZXRob2RzLCB0cnVlKSkgewokdGhpcy0+ZXJyb3JzW10gPSAncGhwLWV4dC5kb3dubG9hZC11cmwtbWV0aG9kLicuJGtleS4nIDogaW52YWxpZCB2YWx1ZSAoJy4kZG93bmxvYWRVcmxNZXRob2QuJyksIG11c3QgYmUgb25lIG9mICcgLiBpbXBsb2RlKCcsICcsICR2YWxpZERvd25sb2FkVXJsTWV0aG9kcyk7CnVuc2V0KCRwaHBFeHRbJ2Rvd25sb2FkLXVybC1tZXRob2QnXSk7Cn0KfQp9Cn0KfQoKaWYgKGlzc2V0KCRwaHBFeHRbJ29zLWZhbWlsaWVzJ10pICYmIGlzc2V0KCRwaHBFeHRbJ29zLWZhbWlsaWVzLWV4Y2x1ZGUnXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJ3BocC1leHQgOiBvcy1mYW1pbGllcyBhbmQgb3MtZmFtaWxpZXMtZXhjbHVkZSBjYW5ub3QgYm90aCBiZSBzcGVjaWZpZWQnOwp1bnNldCgkcGhwRXh0Wydvcy1mYW1pbGllcyddLCAkcGhwRXh0Wydvcy1mYW1pbGllcy1leGNsdWRlJ10pOwp9IGVsc2UgewokdmFsaWRPc0ZhbWlsaWVzID0gWyd3aW5kb3dzJywgJ2JzZCcsICdkYXJ3aW4nLCAnc29sYXJpcycsICdsaW51eCcsICd1bmtub3duJ107Cgpmb3JlYWNoIChbJ29zLWZhbWlsaWVzJywgJ29zLWZhbWlsaWVzLWV4Y2x1ZGUnXSBhcyAkZmllbGROYW1lKSB7CmlmIChpc3NldCgkcGhwRXh0WyRmaWVsZE5hbWVdKSkgewppZiAoIWlzX2FycmF5KCRwaHBFeHRbJGZpZWxkTmFtZV0pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdwaHAtZXh0LicuJGZpZWxkTmFtZS4nIDogc2hvdWxkIGJlIGFuIGFycmF5LCAnLmdldF9kZWJ1Z190eXBlKCRwaHBFeHRbJGZpZWxkTmFtZV0pLicgZ2l2ZW4nOwp1bnNldCgkcGhwRXh0WyRmaWVsZE5hbWVdKTsKfSBlbHNlaWYgKFtdID09PSAkcGhwRXh0WyRmaWVsZE5hbWVdKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdwaHAtZXh0LicuJGZpZWxkTmFtZS4nIDogbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBlbGVtZW50JzsKdW5zZXQoJHBocEV4dFskZmllbGROYW1lXSk7Cn0gZWxzZSB7CmZvcmVhY2ggKCRwaHBFeHRbJGZpZWxkTmFtZV0gYXMgJGtleSA9PiAkb3NGYW1pbHkpIHsKaWYgKCFpc19zdHJpbmcoJG9zRmFtaWx5KSkgewokdGhpcy0+ZXJyb3JzW10gPSAncGhwLWV4dC4nLiRmaWVsZE5hbWUuJy4nLiRrZXkuJyA6IHNob3VsZCBiZSBhIHN0cmluZywgJy5nZXRfZGVidWdfdHlwZSgkb3NGYW1pbHkpLicgZ2l2ZW4nOwp1bnNldCgkcGhwRXh0WyRmaWVsZE5hbWVdWyRrZXldKTsKfSBlbHNlaWYgKCFpbl9hcnJheSgkb3NGYW1pbHksICR2YWxpZE9zRmFtaWxpZXMsIHRydWUpKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdwaHAtZXh0LicuJGZpZWxkTmFtZS4nLicuJGtleS4nIDogaW52YWxpZCB2YWx1ZSAoJy4kb3NGYW1pbHkuJyksIG11c3QgYmUgb25lIG9mICcuaW1wbG9kZSgnLCAnLCAkdmFsaWRPc0ZhbWlsaWVzKTsKdW5zZXQoJHBocEV4dFskZmllbGROYW1lXVska2V5XSk7Cn0KfQppZiAoW10gPT09ICRwaHBFeHRbJGZpZWxkTmFtZV0pIHsKdW5zZXQoJHBocEV4dFskZmllbGROYW1lXSk7Cn0KfQp9Cn0KfQoKaWYgKGlzc2V0KCRwaHBFeHRbJ2NvbmZpZ3VyZS1vcHRpb25zJ10pKSB7CmlmICghaXNfYXJyYXkoJHBocEV4dFsnY29uZmlndXJlLW9wdGlvbnMnXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJ3BocC1leHQuY29uZmlndXJlLW9wdGlvbnMgOiBzaG91bGQgYmUgYW4gYXJyYXksICcuZ2V0X2RlYnVnX3R5cGUoJHBocEV4dFsnY29uZmlndXJlLW9wdGlvbnMnXSkuJyBnaXZlbic7CnVuc2V0KCRwaHBFeHRbJ2NvbmZpZ3VyZS1vcHRpb25zJ10pOwp9IGVsc2Ugewpmb3JlYWNoICgkcGhwRXh0Wydjb25maWd1cmUtb3B0aW9ucyddIGFzICRrZXkgPT4gJG9wdGlvbikgewppZiAoIWlzX2FycmF5KCRvcHRpb24pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdwaHAtZXh0LmNvbmZpZ3VyZS1vcHRpb25zLicuJGtleS4nIDogc2hvdWxkIGJlIGFuIGFycmF5LCAnLmdldF9kZWJ1Z190eXBlKCRvcHRpb24pLicgZ2l2ZW4nOwp1bnNldCgkcGhwRXh0Wydjb25maWd1cmUtb3B0aW9ucyddWyRrZXldKTsKY29udGludWU7Cn0KCmlmICghaXNzZXQoJG9wdGlvblsnbmFtZSddKSkgewokdGhpcy0+ZXJyb3JzW10gPSAncGhwLWV4dC5jb25maWd1cmUtb3B0aW9ucy4nLiRrZXkuJy5uYW1lIDogbXVzdCBiZSBwcmVzZW50JzsKdW5zZXQoJHBocEV4dFsnY29uZmlndXJlLW9wdGlvbnMnXVska2V5XSk7CmNvbnRpbnVlOwp9CgppZiAoIWlzX3N0cmluZygkb3B0aW9uWyduYW1lJ10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdwaHAtZXh0LmNvbmZpZ3VyZS1vcHRpb25zLicuJGtleS4nLm5hbWUgOiBzaG91bGQgYmUgYSBzdHJpbmcsICcuZ2V0X2RlYnVnX3R5cGUoJG9wdGlvblsnbmFtZSddKS4nIGdpdmVuJzsKdW5zZXQoJHBocEV4dFsnY29uZmlndXJlLW9wdGlvbnMnXVska2V5XSk7CmNvbnRpbnVlOwp9CgppZiAoaXNzZXQoJG9wdGlvblsnbmVlZHMtdmFsdWUnXSkgJiYgIWlzX2Jvb2woJG9wdGlvblsnbmVlZHMtdmFsdWUnXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJ3BocC1leHQuY29uZmlndXJlLW9wdGlvbnMuJy4ka2V5LicubmVlZHMtdmFsdWUgOiBzaG91bGQgYmUgYSBib29sZWFuLCAnLmdldF9kZWJ1Z190eXBlKCRvcHRpb25bJ25lZWRzLXZhbHVlJ10pLicgZ2l2ZW4nOwp1bnNldCgkcGhwRXh0Wydjb25maWd1cmUtb3B0aW9ucyddWyRrZXldWyduZWVkcy12YWx1ZSddKTsKfQoKaWYgKGlzc2V0KCRvcHRpb25bJ2Rlc2NyaXB0aW9uJ10pICYmICFpc19zdHJpbmcoJG9wdGlvblsnZGVzY3JpcHRpb24nXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJ3BocC1leHQuY29uZmlndXJlLW9wdGlvbnMuJy4ka2V5LicuZGVzY3JpcHRpb24gOiBzaG91bGQgYmUgYSBzdHJpbmcsICcuZ2V0X2RlYnVnX3R5cGUoJG9wdGlvblsnZGVzY3JpcHRpb24nXSkuJyBnaXZlbic7CnVuc2V0KCRwaHBFeHRbJ2NvbmZpZ3VyZS1vcHRpb25zJ11bJGtleV1bJ2Rlc2NyaXB0aW9uJ10pOwp9Cn0KCmlmIChbXSA9PT0gJHBocEV4dFsnY29uZmlndXJlLW9wdGlvbnMnXSkgewp1bnNldCgkcGhwRXh0Wydjb25maWd1cmUtb3B0aW9ucyddKTsKfQp9Cn0KCgppZiAoW10gPT09ICRwaHBFeHQpIHsKdW5zZXQoJHRoaXMtPmNvbmZpZ1sncGhwLWV4dCddKTsKfQoKdW5zZXQoJHBocEV4dCk7Cn0KCiR1bmJvdW5kQ29uc3RyYWludCA9IG5ldyBDb25zdHJhaW50KCc9JywgJzEwMDAwMDAwLWRldicpOwoKZm9yZWFjaCAoYXJyYXlfa2V5cyhCYXNlUGFja2FnZTo6JHN1cHBvcnRlZExpbmtUeXBlcykgYXMgJGxpbmtUeXBlKSB7CmlmICgkdGhpcy0+dmFsaWRhdGVBcnJheSgkbGlua1R5cGUpICYmIGlzc2V0KCR0aGlzLT5jb25maWdbJGxpbmtUeXBlXSkpIHsKZm9yZWFjaCAoJHRoaXMtPmNvbmZpZ1skbGlua1R5cGVdIGFzICRwYWNrYWdlID0+ICRjb25zdHJhaW50KSB7CiRwYWNrYWdlID0gKHN0cmluZykgJHBhY2thZ2U7CmlmIChpc3NldCgkdGhpcy0+Y29uZmlnWyduYW1lJ10pICYmIDAgPT09IHN0cmNhc2VjbXAoJHBhY2thZ2UsICR0aGlzLT5jb25maWdbJ25hbWUnXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJGxpbmtUeXBlLicuJy4kcGFja2FnZS4nIDogYSBwYWNrYWdlIGNhbm5vdCBzZXQgYSAnLiRsaW5rVHlwZS4nIG9uIGl0c2VsZic7CnVuc2V0KCR0aGlzLT5jb25maWdbJGxpbmtUeXBlXVskcGFja2FnZV0pOwpjb250aW51ZTsKfQppZiAoJGVyciA9IHNlbGY6Omhhc1BhY2thZ2VOYW1pbmdFcnJvcigkcGFja2FnZSwgdHJ1ZSkpIHsKJHRoaXMtPndhcm5pbmdzW10gPSAkbGlua1R5cGUuJy4nLiRlcnI7Cn0gZWxzZWlmICghUHJlZzo6aXNNYXRjaCgne15bQS1aYS16MC05Xy4vLV0rJH0nLCAkcGFja2FnZSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJGxpbmtUeXBlLicuJy4kcGFja2FnZS4nIDogaW52YWxpZCBrZXksIHBhY2thZ2UgbmFtZXMgbXVzdCBiZSBzdHJpbmdzIGNvbnRhaW5pbmcgb25seSBbQS1aYS16MC05Xy4vLV0nOwp9CmlmICghaXNfc3RyaW5nKCRjb25zdHJhaW50KSkgewokdGhpcy0+ZXJyb3JzW10gPSAkbGlua1R5cGUuJy4nLiRwYWNrYWdlLicgOiBpbnZhbGlkIHZhbHVlLCBtdXN0IGJlIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSB2ZXJzaW9uIGNvbnN0cmFpbnQnOwp1bnNldCgkdGhpcy0+Y29uZmlnWyRsaW5rVHlwZV1bJHBhY2thZ2VdKTsKfSBlbHNlaWYgKCdzZWxmLnZlcnNpb24nICE9PSAkY29uc3RyYWludCkgewp0cnkgewokbGlua0NvbnN0cmFpbnQgPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+cGFyc2VDb25zdHJhaW50cygkY29uc3RyYWludCk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJHRoaXMtPmVycm9yc1tdID0gJGxpbmtUeXBlLicuJy4kcGFja2FnZS4nIDogaW52YWxpZCB2ZXJzaW9uIGNvbnN0cmFpbnQgKCcuJGUtPmdldE1lc3NhZ2UoKS4nKSc7CnVuc2V0KCR0aGlzLT5jb25maWdbJGxpbmtUeXBlXVskcGFja2FnZV0pOwpjb250aW51ZTsKfQoKCmlmICgKKCR0aGlzLT5mbGFncyAmIHNlbGY6OkNIRUNLX1VOQk9VTkRfQ09OU1RSQUlOVFMpCiYmICdyZXF1aXJlJyA9PT0gJGxpbmtUeXBlCiYmICRsaW5rQ29uc3RyYWludC0+bWF0Y2hlcygkdW5ib3VuZENvbnN0cmFpbnQpCiYmICFQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRwYWNrYWdlKQopIHsKJHRoaXMtPndhcm5pbmdzW10gPSAkbGlua1R5cGUuJy4nLiRwYWNrYWdlLicgOiB1bmJvdW5kIHZlcnNpb24gY29uc3RyYWludHMgKCcuJGNvbnN0cmFpbnQuJykgc2hvdWxkIGJlIGF2b2lkZWQnOwp9IGVsc2VpZiAoCgooJHRoaXMtPmZsYWdzICYgc2VsZjo6Q0hFQ0tfU1RSSUNUX0NPTlNUUkFJTlRTKQomJiAncmVxdWlyZScgPT09ICRsaW5rVHlwZQomJiAkbGlua0NvbnN0cmFpbnQgaW5zdGFuY2VvZiBDb25zdHJhaW50ICYmIGluX2FycmF5KCRsaW5rQ29uc3RyYWludC0+Z2V0T3BlcmF0b3IoKSwgWyc9PScsICc9J10sIHRydWUpCiYmIChuZXcgQ29uc3RyYWludCgnPj0nLCAnMS4wLjAuMC1kZXYnKSktPm1hdGNoZXMoJGxpbmtDb25zdHJhaW50KQopIHsKJHRoaXMtPndhcm5pbmdzW10gPSAkbGlua1R5cGUuJy4nLiRwYWNrYWdlLicgOiBleGFjdCB2ZXJzaW9uIGNvbnN0cmFpbnRzICgnLiRjb25zdHJhaW50LicpIHNob3VsZCBiZSBhdm9pZGVkIGlmIHRoZSBwYWNrYWdlIGZvbGxvd3Mgc2VtYW50aWMgdmVyc2lvbmluZyc7Cn0KCiRjb21wYWN0ZWQgPSBJbnRlcnZhbHM6OmNvbXBhY3RDb25zdHJhaW50KCRsaW5rQ29uc3RyYWludCk7CmlmICgkY29tcGFjdGVkIGluc3RhbmNlb2YgTWF0Y2hOb25lQ29uc3RyYWludCkgewokdGhpcy0+d2FybmluZ3NbXSA9ICRsaW5rVHlwZS4nLicuJHBhY2thZ2UuJyA6IHRoaXMgdmVyc2lvbiBjb25zdHJhaW50IGNhbm5vdCBwb3NzaWJseSBtYXRjaCBhbnl0aGluZyAoJy4kY29uc3RyYWludC4nKSc7Cn0KfQoKaWYgKCRsaW5rVHlwZSA9PT0gJ2NvbmZsaWN0JyAmJiBpc3NldCgkdGhpcy0+Y29uZmlnWydyZXBsYWNlJ10pICYmICRrZXlzID0gYXJyYXlfaW50ZXJzZWN0X2tleSgkdGhpcy0+Y29uZmlnWydyZXBsYWNlJ10sICR0aGlzLT5jb25maWdbJ2NvbmZsaWN0J10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICRsaW5rVHlwZS4nLicuJHBhY2thZ2UuJyA6IHlvdSBjYW5ub3QgY29uZmxpY3Qgd2l0aCBhIHBhY2thZ2UgdGhhdCBpcyBhbHNvIHJlcGxhY2VkLCBhcyByZXBsYWNlIGFscmVhZHkgY3JlYXRlcyBhbiBpbXBsaWNpdCBjb25mbGljdCBydWxlJzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1skbGlua1R5cGVdWyRwYWNrYWdlXSk7Cn0KfQp9Cn0KCmlmICgkdGhpcy0+dmFsaWRhdGVBcnJheSgnc3VnZ2VzdCcpICYmIGlzc2V0KCR0aGlzLT5jb25maWdbJ3N1Z2dlc3QnXSkpIHsKZm9yZWFjaCAoJHRoaXMtPmNvbmZpZ1snc3VnZ2VzdCddIGFzICRwYWNrYWdlID0+ICRkZXNjcmlwdGlvbikgewppZiAoIWlzX3N0cmluZygkZGVzY3JpcHRpb24pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdzdWdnZXN0LicuJHBhY2thZ2UuJyA6IGludmFsaWQgdmFsdWUsIG11c3QgYmUgYSBzdHJpbmcgZGVzY3JpYmluZyB3aHkgdGhlIHBhY2thZ2UgaXMgc3VnZ2VzdGVkJzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snc3VnZ2VzdCddWyRwYWNrYWdlXSk7Cn0KfQp9CgppZiAoJHRoaXMtPnZhbGlkYXRlU3RyaW5nKCdtaW5pbXVtLXN0YWJpbGl0eScpICYmIGlzc2V0KCR0aGlzLT5jb25maWdbJ21pbmltdW0tc3RhYmlsaXR5J10pKSB7CmlmICghaXNzZXQoQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTW3N0cnRvbG93ZXIoJHRoaXMtPmNvbmZpZ1snbWluaW11bS1zdGFiaWxpdHknXSldKSAmJiAkdGhpcy0+Y29uZmlnWydtaW5pbXVtLXN0YWJpbGl0eSddICE9PSAnUkMnKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdtaW5pbXVtLXN0YWJpbGl0eSA6IGludmFsaWQgdmFsdWUgKCcuJHRoaXMtPmNvbmZpZ1snbWluaW11bS1zdGFiaWxpdHknXS4nKSwgbXVzdCBiZSBvbmUgb2YgJy5pbXBsb2RlKCcsICcsIGFycmF5X2tleXMoQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTKSk7CnVuc2V0KCR0aGlzLT5jb25maWdbJ21pbmltdW0tc3RhYmlsaXR5J10pOwp9Cn0KCmlmICgkdGhpcy0+dmFsaWRhdGVBcnJheSgnYXV0b2xvYWQnKSAmJiBpc3NldCgkdGhpcy0+Y29uZmlnWydhdXRvbG9hZCddKSkgewokdHlwZXMgPSBbJ3Bzci0wJywgJ3Bzci00JywgJ2NsYXNzbWFwJywgJ2ZpbGVzJywgJ2V4Y2x1ZGUtZnJvbS1jbGFzc21hcCddOwpmb3JlYWNoICgkdGhpcy0+Y29uZmlnWydhdXRvbG9hZCddIGFzICR0eXBlID0+ICR0eXBlQ29uZmlnKSB7CmlmICghaW5fYXJyYXkoJHR5cGUsICR0eXBlcykpIHsKJHRoaXMtPmVycm9yc1tdID0gJ2F1dG9sb2FkIDogaW52YWxpZCB2YWx1ZSAoJy4kdHlwZS4nKSwgbXVzdCBiZSBvbmUgb2YgJy5pbXBsb2RlKCcsICcsICR0eXBlcyk7CnVuc2V0KCR0aGlzLT5jb25maWdbJ2F1dG9sb2FkJ11bJHR5cGVdKTsKfQppZiAoJHR5cGUgPT09ICdwc3ItNCcpIHsKZm9yZWFjaCAoJHR5cGVDb25maWcgYXMgJG5hbWVzcGFjZSA9PiAkZGlycykgewppZiAoJG5hbWVzcGFjZSAhPT0gJycgJiYgJ1xcJyAhPT0gc3Vic3RyKChzdHJpbmcpICRuYW1lc3BhY2UsIC0xKSkgewokdGhpcy0+ZXJyb3JzW10gPSAnYXV0b2xvYWQucHNyLTQgOiBpbnZhbGlkIHZhbHVlICgnLiRuYW1lc3BhY2UuJyksIG5hbWVzcGFjZXMgbXVzdCBlbmQgd2l0aCBhIG5hbWVzcGFjZSBzZXBhcmF0b3IsIHNob3VsZCBiZSAnLiRuYW1lc3BhY2UuJ1xcXFwnOwp9Cn0KfQp9Cn0KCmlmIChpc3NldCgkdGhpcy0+Y29uZmlnWydhdXRvbG9hZCddWydwc3ItNCddKSAmJiBpc3NldCgkdGhpcy0+Y29uZmlnWyd0YXJnZXQtZGlyJ10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICd0YXJnZXQtZGlyIDogdGhpcyBjYW4gbm90IGJlIHVzZWQgdG9nZXRoZXIgd2l0aCB0aGUgYXV0b2xvYWQucHNyLTQgc2V0dGluZywgcmVtb3ZlIHRhcmdldC1kaXIgdG8gdXBncmFkZSB0byBwc3ItNCc7CgoKdW5zZXQoJHRoaXMtPmNvbmZpZ1snYXV0b2xvYWQnXVsncHNyLTQnXSk7Cn0KCmZvcmVhY2ggKFsnc291cmNlJywgJ2Rpc3QnXSBhcyAkc3JjVHlwZSkgewppZiAoJHRoaXMtPnZhbGlkYXRlQXJyYXkoJHNyY1R5cGUpICYmICFlbXB0eSgkdGhpcy0+Y29uZmlnWyRzcmNUeXBlXSkpIHsKaWYgKCFpc3NldCgkdGhpcy0+Y29uZmlnWyRzcmNUeXBlXVsndHlwZSddKSkgewokdGhpcy0+ZXJyb3JzW10gPSAkc3JjVHlwZSAuICcudHlwZSA6IG11c3QgYmUgcHJlc2VudCc7Cn0KaWYgKCFpc3NldCgkdGhpcy0+Y29uZmlnWyRzcmNUeXBlXVsndXJsJ10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICRzcmNUeXBlIC4gJy51cmwgOiBtdXN0IGJlIHByZXNlbnQnOwp9CmlmICgkc3JjVHlwZSA9PT0gJ3NvdXJjZScgJiYgIWlzc2V0KCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWydyZWZlcmVuY2UnXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJHNyY1R5cGUgLiAnLnJlZmVyZW5jZSA6IG11c3QgYmUgcHJlc2VudCc7Cn0KaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWyd0eXBlJ10pICYmICFpc19zdHJpbmcoJHRoaXMtPmNvbmZpZ1skc3JjVHlwZV1bJ3R5cGUnXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJHNyY1R5cGUgLiAnLnR5cGUgOiBzaG91bGQgYmUgYSBzdHJpbmcsICcuZ2V0X2RlYnVnX3R5cGUoJHRoaXMtPmNvbmZpZ1skc3JjVHlwZV1bJ3R5cGUnXSkuJyBnaXZlbic7Cn0KaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWyd1cmwnXSkgJiYgIWlzX3N0cmluZygkdGhpcy0+Y29uZmlnWyRzcmNUeXBlXVsndXJsJ10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICRzcmNUeXBlIC4gJy51cmwgOiBzaG91bGQgYmUgYSBzdHJpbmcsICcuZ2V0X2RlYnVnX3R5cGUoJHRoaXMtPmNvbmZpZ1skc3JjVHlwZV1bJ3VybCddKS4nIGdpdmVuJzsKfQppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1skc3JjVHlwZV1bJ3JlZmVyZW5jZSddKSAmJiAhaXNfc3RyaW5nKCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWydyZWZlcmVuY2UnXSkgJiYgIWlzX2ludCgkdGhpcy0+Y29uZmlnWyRzcmNUeXBlXVsncmVmZXJlbmNlJ10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICRzcmNUeXBlIC4gJy5yZWZlcmVuY2UgOiBzaG91bGQgYmUgYSBzdHJpbmcgb3IgaW50LCAnLmdldF9kZWJ1Z190eXBlKCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWydyZWZlcmVuY2UnXSkuJyBnaXZlbic7Cn0KaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWydyZWZlcmVuY2UnXSkgJiYgUHJlZzo6aXNNYXRjaCgne15ccyotfScsIChzdHJpbmcpICR0aGlzLT5jb25maWdbJHNyY1R5cGVdWydyZWZlcmVuY2UnXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJHNyY1R5cGUgLiAnLnJlZmVyZW5jZSA6IG11c3Qgbm90IHN0YXJ0IHdpdGggYSAiLSIsICInLiR0aGlzLT5jb25maWdbJHNyY1R5cGVdWydyZWZlcmVuY2UnXS4nIiBnaXZlbic7Cn0KaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWyd1cmwnXSkgJiYgUHJlZzo6aXNNYXRjaCgne15ccyotfScsIChzdHJpbmcpICR0aGlzLT5jb25maWdbJHNyY1R5cGVdWyd1cmwnXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJHNyY1R5cGUgLiAnLnVybCA6IG11c3Qgbm90IHN0YXJ0IHdpdGggYSAiLSIsICInLiR0aGlzLT5jb25maWdbJHNyY1R5cGVdWyd1cmwnXS4nIiBnaXZlbic7Cn0KfQp9CgoKCgokdGhpcy0+dmFsaWRhdGVGbGF0QXJyYXkoJ2luY2x1ZGUtcGF0aCcpOwokdGhpcy0+dmFsaWRhdGVBcnJheSgndHJhbnNwb3J0LW9wdGlvbnMnKTsKCgppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1snZXh0cmEnXVsnYnJhbmNoLWFsaWFzJ10pKSB7CmlmICghaXNfYXJyYXkoJHRoaXMtPmNvbmZpZ1snZXh0cmEnXVsnYnJhbmNoLWFsaWFzJ10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdleHRyYS5icmFuY2gtYWxpYXMgOiBtdXN0IGJlIGFuIGFycmF5IG9mIHZlcnNpb25zID0+IGFsaWFzZXMnOwp9IGVsc2Ugewpmb3JlYWNoICgkdGhpcy0+Y29uZmlnWydleHRyYSddWydicmFuY2gtYWxpYXMnXSBhcyAkc291cmNlQnJhbmNoID0+ICR0YXJnZXRCcmFuY2gpIHsKaWYgKCFpc19zdHJpbmcoJHRhcmdldEJyYW5jaCkpIHsKJHRoaXMtPndhcm5pbmdzW10gPSAnZXh0cmEuYnJhbmNoLWFsaWFzLicuJHNvdXJjZUJyYW5jaC4nIDogdGhlIHRhcmdldCBicmFuY2ggKCcuanNvbl9lbmNvZGUoJHRhcmdldEJyYW5jaCkuJykgbXVzdCBiZSBhIHN0cmluZywgIicuZ2V0X2RlYnVnX3R5cGUoJHRhcmdldEJyYW5jaCkuJyIgcmVjZWl2ZWQuJzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snZXh0cmEnXVsnYnJhbmNoLWFsaWFzJ11bJHNvdXJjZUJyYW5jaF0pOwoKY29udGludWU7Cn0KCgppZiAoJy1kZXYnICE9PSBzdWJzdHIoJHRhcmdldEJyYW5jaCwgLTQpKSB7CiR0aGlzLT53YXJuaW5nc1tdID0gJ2V4dHJhLmJyYW5jaC1hbGlhcy4nLiRzb3VyY2VCcmFuY2guJyA6IHRoZSB0YXJnZXQgYnJhbmNoICgnLiR0YXJnZXRCcmFuY2guJykgbXVzdCBlbmQgaW4gLWRldic7CnVuc2V0KCR0aGlzLT5jb25maWdbJ2V4dHJhJ11bJ2JyYW5jaC1hbGlhcyddWyRzb3VyY2VCcmFuY2hdKTsKCmNvbnRpbnVlOwp9CgoKJHZhbGlkYXRlZFRhcmdldEJyYW5jaCA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemVCcmFuY2goc3Vic3RyKCR0YXJnZXRCcmFuY2gsIDAsIC00KSk7CmlmICgnLWRldicgIT09IHN1YnN0cigkdmFsaWRhdGVkVGFyZ2V0QnJhbmNoLCAtNCkpIHsKJHRoaXMtPndhcm5pbmdzW10gPSAnZXh0cmEuYnJhbmNoLWFsaWFzLicuJHNvdXJjZUJyYW5jaC4nIDogdGhlIHRhcmdldCBicmFuY2ggKCcuJHRhcmdldEJyYW5jaC4nKSBtdXN0IGJlIGEgcGFyc2VhYmxlIG51bWJlciBsaWtlIDIuMC1kZXYnOwp1bnNldCgkdGhpcy0+Y29uZmlnWydleHRyYSddWydicmFuY2gtYWxpYXMnXVskc291cmNlQnJhbmNoXSk7Cgpjb250aW51ZTsKfQoKCmlmICgoJHNvdXJjZVByZWZpeCA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5wYXJzZU51bWVyaWNBbGlhc1ByZWZpeCgkc291cmNlQnJhbmNoKSkKJiYgKCR0YXJnZXRQcmVmaXggPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+cGFyc2VOdW1lcmljQWxpYXNQcmVmaXgoJHRhcmdldEJyYW5jaCkpCiYmIChzdHJpcG9zKCR0YXJnZXRQcmVmaXgsICRzb3VyY2VQcmVmaXgpICE9PSAwKQopIHsKJHRoaXMtPndhcm5pbmdzW10gPSAnZXh0cmEuYnJhbmNoLWFsaWFzLicuJHNvdXJjZUJyYW5jaC4nIDogdGhlIHRhcmdldCBicmFuY2ggKCcuJHRhcmdldEJyYW5jaC4nKSBpcyBub3QgYSB2YWxpZCBudW1lcmljIGFsaWFzIGZvciB0aGlzIHZlcnNpb24nOwp1bnNldCgkdGhpcy0+Y29uZmlnWydleHRyYSddWydicmFuY2gtYWxpYXMnXVskc291cmNlQnJhbmNoXSk7Cn0KfQp9Cn0KCmlmICgkdGhpcy0+ZXJyb3JzKSB7CnRocm93IG5ldyBJbnZhbGlkUGFja2FnZUV4Y2VwdGlvbigkdGhpcy0+ZXJyb3JzLCAkdGhpcy0+d2FybmluZ3MsICRjb25maWcpOwp9CgokcGFja2FnZSA9ICR0aGlzLT5sb2FkZXItPmxvYWQoJHRoaXMtPmNvbmZpZywgJGNsYXNzKTsKJHRoaXMtPmNvbmZpZyA9IFtdOwoKcmV0dXJuICRwYWNrYWdlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0V2FybmluZ3MoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPndhcm5pbmdzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXJyb3JzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5lcnJvcnM7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaGFzUGFja2FnZU5hbWluZ0Vycm9yKHN0cmluZyAkbmFtZSwgYm9vbCAkaXNMaW5rID0gZmFsc2UpOiA/c3RyaW5nCnsKaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJG5hbWUpKSB7CnJldHVybiBudWxsOwp9CgppZiAoIVByZWc6OmlzTWF0Y2goJ3teW2EtejAtOV0oPzpbXy4tXT9bYS16MC05XSsrKSorL1thLXowLTldKD86KD86W18uXXwtezEsMn0pP1thLXowLTldKyspKiskfWlEJywgJG5hbWUpKSB7CnJldHVybiAkbmFtZS4nIGlzIGludmFsaWQsIGl0IHNob3VsZCBoYXZlIGEgdmVuZG9yIG5hbWUsIGEgZm9yd2FyZCBzbGFzaCwgYW5kIGEgcGFja2FnZSBuYW1lLiBUaGUgdmVuZG9yIGFuZCBwYWNrYWdlIG5hbWUgY2FuIGJlIHdvcmRzIHNlcGFyYXRlZCBieSAtLCAuIG9yIF8uIFRoZSBjb21wbGV0ZSBuYW1lIHNob3VsZCBtYXRjaCAiXlthLXowLTldKFtfLi1dP1thLXowLTldKykqL1thLXowLTldKChbXy5dP3wtezAsMn0pW2EtejAtOV0rKSokIi4nOwp9CgokcmVzZXJ2ZWROYW1lcyA9IFsnbnVsJywgJ2NvbicsICdwcm4nLCAnYXV4JywgJ2NvbTEnLCAnY29tMicsICdjb20zJywgJ2NvbTQnLCAnY29tNScsICdjb202JywgJ2NvbTcnLCAnY29tOCcsICdjb205JywgJ2xwdDEnLCAnbHB0MicsICdscHQzJywgJ2xwdDQnLCAnbHB0NScsICdscHQ2JywgJ2xwdDcnLCAnbHB0OCcsICdscHQ5J107CiRiaXRzID0gZXhwbG9kZSgnLycsIHN0cnRvbG93ZXIoJG5hbWUpKTsKaWYgKGluX2FycmF5KCRiaXRzWzBdLCAkcmVzZXJ2ZWROYW1lcywgdHJ1ZSkgfHwgaW5fYXJyYXkoJGJpdHNbMV0sICRyZXNlcnZlZE5hbWVzLCB0cnVlKSkgewpyZXR1cm4gJG5hbWUuJyBpcyByZXNlcnZlZCwgcGFja2FnZSBhbmQgdmVuZG9yIG5hbWVzIGNhbiBub3QgbWF0Y2ggYW55IG9mOiAnLmltcGxvZGUoJywgJywgJHJlc2VydmVkTmFtZXMpLicuJzsKfQoKaWYgKFByZWc6OmlzTWF0Y2goJ3tcLmpzb24kfScsICRuYW1lKSkgewpyZXR1cm4gJG5hbWUuJyBpcyBpbnZhbGlkLCBwYWNrYWdlIG5hbWVzIGNhbiBub3QgZW5kIGluIC5qc29uLCBjb25zaWRlciByZW5hbWluZyBpdCBvciBwZXJoYXBzIHVzaW5nIGEgLWpzb24gc3VmZml4IGluc3RlYWQuJzsKfQoKaWYgKFByZWc6OmlzTWF0Y2goJ3tbQS1aXX0nLCAkbmFtZSkpIHsKaWYgKCRpc0xpbmspIHsKcmV0dXJuICRuYW1lLicgaXMgaW52YWxpZCwgaXQgc2hvdWxkIG5vdCBjb250YWluIHVwcGVyY2FzZSBjaGFyYWN0ZXJzLiBQbGVhc2UgdXNlICcuc3RydG9sb3dlcigkbmFtZSkuJyBpbnN0ZWFkLic7Cn0KCiRzdWdnZXN0TmFtZSA9IFByZWc6OnJlcGxhY2UoJ3soPzooW2Etel0pKFtBLVpdKXwoW0EtWl0pKFtBLVpdW2Etel0pKX0nLCAnXFwxXFwzLVxcMlxcNCcsICRuYW1lKTsKJHN1Z2dlc3ROYW1lID0gc3RydG9sb3dlcigkc3VnZ2VzdE5hbWUpOwoKcmV0dXJuICRuYW1lLicgaXMgaW52YWxpZCwgaXQgc2hvdWxkIG5vdCBjb250YWluIHVwcGVyY2FzZSBjaGFyYWN0ZXJzLiBXZSBzdWdnZXN0IHVzaW5nICcuJHN1Z2dlc3ROYW1lLicgaW5zdGVhZC4nOwp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gdmFsaWRhdGVSZWdleChzdHJpbmcgJHByb3BlcnR5LCBzdHJpbmcgJHJlZ2V4LCBib29sICRtYW5kYXRvcnkgPSBmYWxzZSk6IGJvb2wKewppZiAoISR0aGlzLT52YWxpZGF0ZVN0cmluZygkcHJvcGVydHksICRtYW5kYXRvcnkpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCFQcmVnOjppc01hdGNoKCd7XicuJHJlZ2V4LickfXUnLCAkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV0pKSB7CiRtZXNzYWdlID0gJHByb3BlcnR5LicgOiBpbnZhbGlkIHZhbHVlICgnLiR0aGlzLT5jb25maWdbJHByb3BlcnR5XS4nKSwgbXVzdCBtYXRjaCAnLiRyZWdleDsKaWYgKCRtYW5kYXRvcnkpIHsKJHRoaXMtPmVycm9yc1tdID0gJG1lc3NhZ2U7Cn0gZWxzZSB7CiR0aGlzLT53YXJuaW5nc1tdID0gJG1lc3NhZ2U7Cn0KdW5zZXQoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKTsKCnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gdmFsaWRhdGVTdHJpbmcoc3RyaW5nICRwcm9wZXJ0eSwgYm9vbCAkbWFuZGF0b3J5ID0gZmFsc2UpOiBib29sCnsKaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJHByb3BlcnR5XSkgJiYgIWlzX3N0cmluZygkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV0pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICRwcm9wZXJ0eS4nIDogc2hvdWxkIGJlIGEgc3RyaW5nLCAnLmdldF9kZWJ1Z190eXBlKCR0aGlzLT5jb25maWdbJHByb3BlcnR5XSkuJyBnaXZlbic7CnVuc2V0KCR0aGlzLT5jb25maWdbJHByb3BlcnR5XSk7CgpyZXR1cm4gZmFsc2U7Cn0KCmlmICghaXNzZXQoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKSB8fCB0cmltKCR0aGlzLT5jb25maWdbJHByb3BlcnR5XSkgPT09ICcnKSB7CmlmICgkbWFuZGF0b3J5KSB7CiR0aGlzLT5lcnJvcnNbXSA9ICRwcm9wZXJ0eS4nIDogbXVzdCBiZSBwcmVzZW50JzsKfQp1bnNldCgkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV0pOwoKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZUFycmF5KHN0cmluZyAkcHJvcGVydHksIGJvb2wgJG1hbmRhdG9yeSA9IGZhbHNlKTogYm9vbAp7CmlmIChpc3NldCgkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV0pICYmICFpc19hcnJheSgkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV0pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICRwcm9wZXJ0eS4nIDogc2hvdWxkIGJlIGFuIGFycmF5LCAnLmdldF9kZWJ1Z190eXBlKCR0aGlzLT5jb25maWdbJHByb3BlcnR5XSkuJyBnaXZlbic7CnVuc2V0KCR0aGlzLT5jb25maWdbJHByb3BlcnR5XSk7CgpyZXR1cm4gZmFsc2U7Cn0KCmlmICghaXNzZXQoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKSB8fCAhY291bnQoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKSkgewppZiAoJG1hbmRhdG9yeSkgewokdGhpcy0+ZXJyb3JzW10gPSAkcHJvcGVydHkuJyA6IG11c3QgYmUgcHJlc2VudCBhbmQgY29udGFpbiBhdCBsZWFzdCBvbmUgZWxlbWVudCc7Cn0KdW5zZXQoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKTsKCnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHZhbGlkYXRlRmxhdEFycmF5KHN0cmluZyAkcHJvcGVydHksID9zdHJpbmcgJHJlZ2V4ID0gbnVsbCwgYm9vbCAkbWFuZGF0b3J5ID0gZmFsc2UpOiBib29sCnsKaWYgKCEkdGhpcy0+dmFsaWRhdGVBcnJheSgkcHJvcGVydHksICRtYW5kYXRvcnkpKSB7CnJldHVybiBmYWxzZTsKfQoKJHBhc3MgPSB0cnVlOwpmb3JlYWNoICgkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV0gYXMgJGtleSA9PiAkdmFsdWUpIHsKaWYgKCFpc19zdHJpbmcoJHZhbHVlKSAmJiAhaXNfbnVtZXJpYygkdmFsdWUpKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICRwcm9wZXJ0eS4nLicuJGtleS4nIDogbXVzdCBiZSBhIHN0cmluZyBvciBpbnQsICcuZ2V0X2RlYnVnX3R5cGUoJHZhbHVlKS4nIGdpdmVuJzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldWyRrZXldKTsKJHBhc3MgPSBmYWxzZTsKCmNvbnRpbnVlOwp9CgppZiAoJHJlZ2V4ICYmICFQcmVnOjppc01hdGNoKCd7XicuJHJlZ2V4LickfXUnLCAoc3RyaW5nKSAkdmFsdWUpKSB7CiR0aGlzLT53YXJuaW5nc1tdID0gJHByb3BlcnR5LicuJy4ka2V5LicgOiBpbnZhbGlkIHZhbHVlICgnLiR2YWx1ZS4nKSwgbXVzdCBtYXRjaCAnLiRyZWdleDsKdW5zZXQoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldWyRrZXldKTsKJHBhc3MgPSBmYWxzZTsKfQp9CgpyZXR1cm4gJHBhc3M7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gdmFsaWRhdGVVcmwoc3RyaW5nICRwcm9wZXJ0eSwgYm9vbCAkbWFuZGF0b3J5ID0gZmFsc2UpOiBib29sCnsKaWYgKCEkdGhpcy0+dmFsaWRhdGVTdHJpbmcoJHByb3BlcnR5LCAkbWFuZGF0b3J5KSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICghJHRoaXMtPmZpbHRlclVybCgkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV0pKSB7CiR0aGlzLT53YXJuaW5nc1tdID0gJHByb3BlcnR5LicgOiBpbnZhbGlkIHZhbHVlICgnLiR0aGlzLT5jb25maWdbJHByb3BlcnR5XS4nKSwgbXVzdCBiZSBhbiBodHRwL2h0dHBzIFVSTCc7CnVuc2V0KCR0aGlzLT5jb25maWdbJHByb3BlcnR5XSk7CgpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiB0cnVlOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBmaWx0ZXJVcmwoJHZhbHVlLCBhcnJheSAkc2NoZW1lcyA9IFsnaHR0cCcsICdodHRwcyddKTogYm9vbAp7CmlmICgkdmFsdWUgPT09ICcnKSB7CnJldHVybiB0cnVlOwp9CgokYml0cyA9IHBhcnNlX3VybCgkdmFsdWUpOwppZiAoZW1wdHkoJGJpdHNbJ3NjaGVtZSddKSB8fCBlbXB0eSgkYml0c1snaG9zdCddKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICghaW5fYXJyYXkoJGJpdHNbJ3NjaGVtZSddLCAkc2NoZW1lcywgdHJ1ZSkpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlOwoKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxJbnN0YWxsZXJcSW5zdGFsbGF0aW9uTWFuYWdlcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcTG9ja0FycmF5UmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSb290UGFja2FnZVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcRHVtcGVyXEFycmF5RHVtcGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcQXJyYXlMb2FkZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxVdGlsXEdpdCBhcyBHaXRVdGlsOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBTZWxkXEpzb25MaW50XFBhcnNpbmdFeGNlcHRpb247CgoKCgoKCgpjbGFzcyBMb2NrZXIKewoKcHJpdmF0ZSAkbG9ja0ZpbGU7Cgpwcml2YXRlICRpbnN0YWxsYXRpb25NYW5hZ2VyOwoKcHJpdmF0ZSAkaGFzaDsKCnByaXZhdGUgJGNvbnRlbnRIYXNoOwoKcHJpdmF0ZSAkbG9hZGVyOwoKcHJpdmF0ZSAkZHVtcGVyOwoKcHJpdmF0ZSAkcHJvY2VzczsKCnByaXZhdGUgJGxvY2tEYXRhQ2FjaGUgPSBudWxsOwoKcHJpdmF0ZSAkdmlydHVhbEZpbGVXcml0dGVuID0gZmFsc2U7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgSnNvbkZpbGUgJGxvY2tGaWxlLCBJbnN0YWxsYXRpb25NYW5hZ2VyICRpbnN0YWxsYXRpb25NYW5hZ2VyLCBzdHJpbmcgJGNvbXBvc2VyRmlsZUNvbnRlbnRzLCA/UHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzID0gbnVsbCkKewokdGhpcy0+bG9ja0ZpbGUgPSAkbG9ja0ZpbGU7CiR0aGlzLT5pbnN0YWxsYXRpb25NYW5hZ2VyID0gJGluc3RhbGxhdGlvbk1hbmFnZXI7CiR0aGlzLT5oYXNoID0gaGFzaCgnbWQ1JywgJGNvbXBvc2VyRmlsZUNvbnRlbnRzKTsKJHRoaXMtPmNvbnRlbnRIYXNoID0gc2VsZjo6Z2V0Q29udGVudEhhc2goJGNvbXBvc2VyRmlsZUNvbnRlbnRzKTsKJHRoaXMtPmxvYWRlciA9IG5ldyBBcnJheUxvYWRlcihudWxsLCB0cnVlKTsKJHRoaXMtPmR1bXBlciA9IG5ldyBBcnJheUR1bXBlcigpOwokdGhpcy0+cHJvY2VzcyA9ICRwcm9jZXNzID8/IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEpzb25GaWxlKCk6IEpzb25GaWxlCnsKcmV0dXJuICR0aGlzLT5sb2NrRmlsZTsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldENvbnRlbnRIYXNoKHN0cmluZyAkY29tcG9zZXJGaWxlQ29udGVudHMpOiBzdHJpbmcKewokY29udGVudCA9IEpzb25GaWxlOjpwYXJzZUpzb24oJGNvbXBvc2VyRmlsZUNvbnRlbnRzLCAnY29tcG9zZXIuanNvbicpOwoKJHJlbGV2YW50S2V5cyA9IFsKJ25hbWUnLAondmVyc2lvbicsCidyZXF1aXJlJywKJ3JlcXVpcmUtZGV2JywKJ2NvbmZsaWN0JywKJ3JlcGxhY2UnLAoncHJvdmlkZScsCidtaW5pbXVtLXN0YWJpbGl0eScsCidwcmVmZXItc3RhYmxlJywKJ3JlcG9zaXRvcmllcycsCidleHRyYScsCl07CgokcmVsZXZhbnRDb250ZW50ID0gW107Cgpmb3JlYWNoIChhcnJheV9pbnRlcnNlY3QoJHJlbGV2YW50S2V5cywgYXJyYXlfa2V5cygkY29udGVudCkpIGFzICRrZXkpIHsKJHJlbGV2YW50Q29udGVudFska2V5XSA9ICRjb250ZW50WyRrZXldOwp9CmlmIChpc3NldCgkY29udGVudFsnY29uZmlnJ11bJ3BsYXRmb3JtJ10pKSB7CiRyZWxldmFudENvbnRlbnRbJ2NvbmZpZyddWydwbGF0Zm9ybSddID0gJGNvbnRlbnRbJ2NvbmZpZyddWydwbGF0Zm9ybSddOwp9Cgprc29ydCgkcmVsZXZhbnRDb250ZW50KTsKCnJldHVybiBoYXNoKCdtZDUnLCBKc29uRmlsZTo6ZW5jb2RlKCRyZWxldmFudENvbnRlbnQsIDApKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzTG9ja2VkKCk6IGJvb2wKewppZiAoISR0aGlzLT52aXJ0dWFsRmlsZVdyaXR0ZW4gJiYgISR0aGlzLT5sb2NrRmlsZS0+ZXhpc3RzKCkpIHsKcmV0dXJuIGZhbHNlOwp9CgokZGF0YSA9ICR0aGlzLT5nZXRMb2NrRGF0YSgpOwoKcmV0dXJuIGlzc2V0KCRkYXRhWydwYWNrYWdlcyddKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRnJlc2goKTogYm9vbAp7CiRsb2NrID0gJHRoaXMtPmxvY2tGaWxlLT5yZWFkKCk7CgppZiAoIWVtcHR5KCRsb2NrWydjb250ZW50LWhhc2gnXSkpIHsKCnJldHVybiAkdGhpcy0+Y29udGVudEhhc2ggPT09ICRsb2NrWydjb250ZW50LWhhc2gnXTsKfQoKCmlmICghZW1wdHkoJGxvY2tbJ2hhc2gnXSkpIHsKcmV0dXJuICR0aGlzLT5oYXNoID09PSAkbG9ja1snaGFzaCddOwp9CgoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG9ja2VkUmVwb3NpdG9yeShib29sICR3aXRoRGV2UmVxcyA9IGZhbHNlKTogTG9ja0FycmF5UmVwb3NpdG9yeQp7CiRsb2NrRGF0YSA9ICR0aGlzLT5nZXRMb2NrRGF0YSgpOwokcGFja2FnZXMgPSBuZXcgTG9ja0FycmF5UmVwb3NpdG9yeSgpOwoKJGxvY2tlZFBhY2thZ2VzID0gJGxvY2tEYXRhWydwYWNrYWdlcyddOwppZiAoJHdpdGhEZXZSZXFzKSB7CmlmIChpc3NldCgkbG9ja0RhdGFbJ3BhY2thZ2VzLWRldiddKSkgewokbG9ja2VkUGFja2FnZXMgPSBhcnJheV9tZXJnZSgkbG9ja2VkUGFja2FnZXMsICRsb2NrRGF0YVsncGFja2FnZXMtZGV2J10pOwp9IGVsc2Ugewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSBsb2NrIGZpbGUgZG9lcyBub3QgY29udGFpbiByZXF1aXJlLWRldiBpbmZvcm1hdGlvbiwgcnVuIGluc3RhbGwgd2l0aCB0aGUgLS1uby1kZXYgb3B0aW9uIG9yIGRlbGV0ZSBpdCBhbmQgcnVuIGNvbXBvc2VyIHVwZGF0ZSB0byBnZW5lcmF0ZSBhIG5ldyBsb2NrIGZpbGUuJyk7Cn0KfQoKaWYgKGVtcHR5KCRsb2NrZWRQYWNrYWdlcykpIHsKcmV0dXJuICRwYWNrYWdlczsKfQoKaWYgKGlzc2V0KCRsb2NrZWRQYWNrYWdlc1swXVsnbmFtZSddKSkgewokcGFja2FnZUJ5TmFtZSA9IFtdOwpmb3JlYWNoICgkbG9ja2VkUGFja2FnZXMgYXMgJGluZm8pIHsKJHBhY2thZ2UgPSAkdGhpcy0+bG9hZGVyLT5sb2FkKCRpbmZvKTsKJHBhY2thZ2VzLT5hZGRQYWNrYWdlKCRwYWNrYWdlKTsKJHBhY2thZ2VCeU5hbWVbJHBhY2thZ2UtPmdldE5hbWUoKV0gPSAkcGFja2FnZTsKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokcGFja2FnZUJ5TmFtZVskcGFja2FnZS0+Z2V0QWxpYXNPZigpLT5nZXROYW1lKCldID0gJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKfQp9CgppZiAoaXNzZXQoJGxvY2tEYXRhWydhbGlhc2VzJ10pKSB7CmZvcmVhY2ggKCRsb2NrRGF0YVsnYWxpYXNlcyddIGFzICRhbGlhcykgewppZiAoaXNzZXQoJHBhY2thZ2VCeU5hbWVbJGFsaWFzWydwYWNrYWdlJ11dKSkgewokYWxpYXNQa2cgPSBuZXcgQ29tcGxldGVBbGlhc1BhY2thZ2UoJHBhY2thZ2VCeU5hbWVbJGFsaWFzWydwYWNrYWdlJ11dLCAkYWxpYXNbJ2FsaWFzX25vcm1hbGl6ZWQnXSwgJGFsaWFzWydhbGlhcyddKTsKJGFsaWFzUGtnLT5zZXRSb290UGFja2FnZUFsaWFzKHRydWUpOwokcGFja2FnZXMtPmFkZFBhY2thZ2UoJGFsaWFzUGtnKTsKfQp9Cn0KCnJldHVybiAkcGFja2FnZXM7Cn0KCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignWW91ciBjb21wb3Nlci5sb2NrIGlzIGludmFsaWQuIFJ1biAiY29tcG9zZXIgdXBkYXRlIiB0byBnZW5lcmF0ZSBhIG5ldyBvbmUuJyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXZQYWNrYWdlTmFtZXMoKTogYXJyYXkKewokbmFtZXMgPSBbXTsKJGxvY2tEYXRhID0gJHRoaXMtPmdldExvY2tEYXRhKCk7CmlmIChpc3NldCgkbG9ja0RhdGFbJ3BhY2thZ2VzLWRldiddKSkgewpmb3JlYWNoICgkbG9ja0RhdGFbJ3BhY2thZ2VzLWRldiddIGFzICRwYWNrYWdlKSB7CiRuYW1lc1tdID0gc3RydG9sb3dlcigkcGFja2FnZVsnbmFtZSddKTsKfQp9CgpyZXR1cm4gJG5hbWVzOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGxhdGZvcm1SZXF1aXJlbWVudHMoYm9vbCAkd2l0aERldlJlcXMgPSBmYWxzZSk6IGFycmF5CnsKJGxvY2tEYXRhID0gJHRoaXMtPmdldExvY2tEYXRhKCk7CiRyZXF1aXJlbWVudHMgPSBbXTsKCmlmICghZW1wdHkoJGxvY2tEYXRhWydwbGF0Zm9ybSddKSkgewokcmVxdWlyZW1lbnRzID0gJHRoaXMtPmxvYWRlci0+cGFyc2VMaW5rcygKJ19fcm9vdF9fJywKJzEuMC4wJywKTGluazo6VFlQRV9SRVFVSVJFLAokbG9ja0RhdGFbJ3BsYXRmb3JtJ10gPz8gW10KKTsKfQoKaWYgKCR3aXRoRGV2UmVxcyAmJiAhZW1wdHkoJGxvY2tEYXRhWydwbGF0Zm9ybS1kZXYnXSkpIHsKJGRldlJlcXVpcmVtZW50cyA9ICR0aGlzLT5sb2FkZXItPnBhcnNlTGlua3MoCidfX3Jvb3RfXycsCicxLjAuMCcsCkxpbms6OlRZUEVfUkVRVUlSRSwKJGxvY2tEYXRhWydwbGF0Zm9ybS1kZXYnXSA/PyBbXQopOwoKJHJlcXVpcmVtZW50cyA9IGFycmF5X21lcmdlKCRyZXF1aXJlbWVudHMsICRkZXZSZXF1aXJlbWVudHMpOwp9CgpyZXR1cm4gJHJlcXVpcmVtZW50czsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE1pbmltdW1TdGFiaWxpdHkoKTogc3RyaW5nCnsKJGxvY2tEYXRhID0gJHRoaXMtPmdldExvY2tEYXRhKCk7CgpyZXR1cm4gJGxvY2tEYXRhWydtaW5pbXVtLXN0YWJpbGl0eSddID8/ICdzdGFibGUnOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhYmlsaXR5RmxhZ3MoKTogYXJyYXkKewokbG9ja0RhdGEgPSAkdGhpcy0+Z2V0TG9ja0RhdGEoKTsKCnJldHVybiAkbG9ja0RhdGFbJ3N0YWJpbGl0eS1mbGFncyddID8/IFtdOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJlZmVyU3RhYmxlKCk6ID9ib29sCnsKJGxvY2tEYXRhID0gJHRoaXMtPmdldExvY2tEYXRhKCk7CgoKCnJldHVybiAkbG9ja0RhdGFbJ3ByZWZlci1zdGFibGUnXSA/PyBudWxsOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJlZmVyTG93ZXN0KCk6ID9ib29sCnsKJGxvY2tEYXRhID0gJHRoaXMtPmdldExvY2tEYXRhKCk7CgoKCnJldHVybiAkbG9ja0RhdGFbJ3ByZWZlci1sb3dlc3QnXSA/PyBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGxhdGZvcm1PdmVycmlkZXMoKTogYXJyYXkKewokbG9ja0RhdGEgPSAkdGhpcy0+Z2V0TG9ja0RhdGEoKTsKCnJldHVybiAkbG9ja0RhdGFbJ3BsYXRmb3JtLW92ZXJyaWRlcyddID8/IFtdOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBbGlhc2VzKCk6IGFycmF5CnsKJGxvY2tEYXRhID0gJHRoaXMtPmdldExvY2tEYXRhKCk7CgpyZXR1cm4gJGxvY2tEYXRhWydhbGlhc2VzJ10gPz8gW107Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQbHVnaW5BcGkoKQp7CiRsb2NrRGF0YSA9ICR0aGlzLT5nZXRMb2NrRGF0YSgpOwoKcmV0dXJuICRsb2NrRGF0YVsncGx1Z2luLWFwaS12ZXJzaW9uJ10gPz8gJzEuMS4wJzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExvY2tEYXRhKCk6IGFycmF5CnsKaWYgKG51bGwgIT09ICR0aGlzLT5sb2NrRGF0YUNhY2hlKSB7CnJldHVybiAkdGhpcy0+bG9ja0RhdGFDYWNoZTsKfQoKaWYgKCEkdGhpcy0+bG9ja0ZpbGUtPmV4aXN0cygpKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ05vIGxvY2tmaWxlIGZvdW5kLiBVbmFibGUgdG8gcmVhZCBsb2NrZWQgcGFja2FnZXMnKTsKfQoKcmV0dXJuICR0aGlzLT5sb2NrRGF0YUNhY2hlID0gJHRoaXMtPmxvY2tGaWxlLT5yZWFkKCk7Cn0KCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldExvY2tEYXRhKGFycmF5ICRwYWNrYWdlcywgP2FycmF5ICRkZXZQYWNrYWdlcywgYXJyYXkgJHBsYXRmb3JtUmVxcywgYXJyYXkgJHBsYXRmb3JtRGV2UmVxcywgYXJyYXkgJGFsaWFzZXMsIHN0cmluZyAkbWluaW11bVN0YWJpbGl0eSwgYXJyYXkgJHN0YWJpbGl0eUZsYWdzLCBib29sICRwcmVmZXJTdGFibGUsIGJvb2wgJHByZWZlckxvd2VzdCwgYXJyYXkgJHBsYXRmb3JtT3ZlcnJpZGVzLCBib29sICR3cml0ZSA9IHRydWUpOiBib29sCnsKCgokYWxpYXNlcyA9IGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRhbGlhcyk6IGFycmF5IHsKaWYgKGluX2FycmF5KCRhbGlhc1sndmVyc2lvbiddLCBbJ2Rldi1tYXN0ZXInLCAnZGV2LXRydW5rJywgJ2Rldi1kZWZhdWx0J10sIHRydWUpKSB7CiRhbGlhc1sndmVyc2lvbiddID0gVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVM7Cn0KCnJldHVybiAkYWxpYXM7Cn0sICRhbGlhc2VzKTsKCiRsb2NrID0gWwonX3JlYWRtZScgPT4gWydUaGlzIGZpbGUgbG9ja3MgdGhlIGRlcGVuZGVuY2llcyBvZiB5b3VyIHByb2plY3QgdG8gYSBrbm93biBzdGF0ZScsCidSZWFkIG1vcmUgYWJvdXQgaXQgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAxLWJhc2ljLXVzYWdlLm1kI2luc3RhbGxpbmctZGVwZW5kZW5jaWVzJywKJ1RoaXMgZmlsZSBpcyBAZ2VuZXInLidhdGVkIGF1dG9tYXRpY2FsbHknLCBdLAonY29udGVudC1oYXNoJyA9PiAkdGhpcy0+Y29udGVudEhhc2gsCidwYWNrYWdlcycgPT4gJHRoaXMtPmxvY2tQYWNrYWdlcygkcGFja2FnZXMpLAoncGFja2FnZXMtZGV2JyA9PiBudWxsLAonYWxpYXNlcycgPT4gJGFsaWFzZXMsCidtaW5pbXVtLXN0YWJpbGl0eScgPT4gJG1pbmltdW1TdGFiaWxpdHksCidzdGFiaWxpdHktZmxhZ3MnID0+ICRzdGFiaWxpdHlGbGFncywKJ3ByZWZlci1zdGFibGUnID0+ICRwcmVmZXJTdGFibGUsCidwcmVmZXItbG93ZXN0JyA9PiAkcHJlZmVyTG93ZXN0LApdOwoKaWYgKG51bGwgIT09ICRkZXZQYWNrYWdlcykgewokbG9ja1sncGFja2FnZXMtZGV2J10gPSAkdGhpcy0+bG9ja1BhY2thZ2VzKCRkZXZQYWNrYWdlcyk7Cn0KCiRsb2NrWydwbGF0Zm9ybSddID0gJHBsYXRmb3JtUmVxczsKJGxvY2tbJ3BsYXRmb3JtLWRldiddID0gJHBsYXRmb3JtRGV2UmVxczsKaWYgKFxjb3VudCgkcGxhdGZvcm1PdmVycmlkZXMpID4gMCkgewokbG9ja1sncGxhdGZvcm0tb3ZlcnJpZGVzJ10gPSAkcGxhdGZvcm1PdmVycmlkZXM7Cn0KJGxvY2tbJ3BsdWdpbi1hcGktdmVyc2lvbiddID0gUGx1Z2luSW50ZXJmYWNlOjpQTFVHSU5fQVBJX1ZFUlNJT047CgokbG9jayA9ICR0aGlzLT5maXh1cEpzb25EYXRhVHlwZSgkbG9jayk7Cgp0cnkgewokaXNMb2NrZWQgPSAkdGhpcy0+aXNMb2NrZWQoKTsKfSBjYXRjaCAoUGFyc2luZ0V4Y2VwdGlvbiAkZSkgewokaXNMb2NrZWQgPSBmYWxzZTsKfQppZiAoISRpc0xvY2tlZCB8fCAkbG9jayAhPT0gJHRoaXMtPmdldExvY2tEYXRhKCkpIHsKaWYgKCR3cml0ZSkgewokdGhpcy0+bG9ja0ZpbGUtPndyaXRlKCRsb2NrKTsKJHRoaXMtPmxvY2tEYXRhQ2FjaGUgPSBudWxsOwokdGhpcy0+dmlydHVhbEZpbGVXcml0dGVuID0gZmFsc2U7Cn0gZWxzZSB7CiR0aGlzLT52aXJ0dWFsRmlsZVdyaXR0ZW4gPSB0cnVlOwokdGhpcy0+bG9ja0RhdGFDYWNoZSA9IEpzb25GaWxlOjpwYXJzZUpzb24oSnNvbkZpbGU6OmVuY29kZSgkbG9jaykpOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB1cGRhdGVIYXNoKEpzb25GaWxlICRjb21wb3Nlckpzb24sID9jYWxsYWJsZSAkZGF0YVByb2Nlc3NvciA9IG51bGwpOiB2b2lkCnsKJGNvbnRlbnRzID0gZmlsZV9nZXRfY29udGVudHMoJGNvbXBvc2VySnNvbi0+Z2V0UGF0aCgpKTsKaWYgKGZhbHNlID09PSAkY29udGVudHMpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdVbmFibGUgdG8gcmVhZCAnLiRjb21wb3Nlckpzb24tPmdldFBhdGgoKS4nIGNvbnRlbnRzIHRvIHVwZGF0ZSB0aGUgbG9jayBmaWxlIGhhc2guJyk7Cn0KCiRsb2NrTXRpbWUgPSBmaWxlbXRpbWUoJHRoaXMtPmxvY2tGaWxlLT5nZXRQYXRoKCkpOwokbG9ja0RhdGEgPSAkdGhpcy0+bG9ja0ZpbGUtPnJlYWQoKTsKJGxvY2tEYXRhWydjb250ZW50LWhhc2gnXSA9IExvY2tlcjo6Z2V0Q29udGVudEhhc2goJGNvbnRlbnRzKTsKaWYgKCRkYXRhUHJvY2Vzc29yICE9PSBudWxsKSB7CiRsb2NrRGF0YSA9ICRkYXRhUHJvY2Vzc29yKCRsb2NrRGF0YSk7Cn0KCiR0aGlzLT5sb2NrRmlsZS0+d3JpdGUoJHRoaXMtPmZpeHVwSnNvbkRhdGFUeXBlKCRsb2NrRGF0YSkpOwokdGhpcy0+bG9ja0RhdGFDYWNoZSA9IG51bGw7CiR0aGlzLT52aXJ0dWFsRmlsZVdyaXR0ZW4gPSBmYWxzZTsKaWYgKGlzX2ludCgkbG9ja010aW1lKSkgewpAdG91Y2goJHRoaXMtPmxvY2tGaWxlLT5nZXRQYXRoKCksICRsb2NrTXRpbWUpOwp9Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZml4dXBKc29uRGF0YVR5cGUoYXJyYXkgJGxvY2tEYXRhKTogYXJyYXkKewpmb3JlYWNoIChbJ3N0YWJpbGl0eS1mbGFncycsICdwbGF0Zm9ybScsICdwbGF0Zm9ybS1kZXYnXSBhcyAka2V5KSB7CmlmIChpc3NldCgkbG9ja0RhdGFbJGtleV0pICYmIGlzX2FycmF5KCRsb2NrRGF0YVska2V5XSkgJiYgXGNvdW50KCRsb2NrRGF0YVska2V5XSkgPT09IDApIHsKJGxvY2tEYXRhWyRrZXldID0gbmV3IFxzdGRDbGFzcygpOwp9Cn0KCmlmIChpc19hcnJheSgkbG9ja0RhdGFbJ3N0YWJpbGl0eS1mbGFncyddKSkgewprc29ydCgkbG9ja0RhdGFbJ3N0YWJpbGl0eS1mbGFncyddKTsKfQoKcmV0dXJuICRsb2NrRGF0YTsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gbG9ja1BhY2thZ2VzKGFycmF5ICRwYWNrYWdlcyk6IGFycmF5CnsKJGxvY2tlZCA9IFtdOwoKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewpjb250aW51ZTsKfQoKJG5hbWUgPSAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpOwokdmVyc2lvbiA9ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCk7CgppZiAoISRuYW1lIHx8ICEkdmVyc2lvbikgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKHNwcmludGYoCidQYWNrYWdlICIlcyIgaGFzIG5vIHZlcnNpb24gb3IgbmFtZSBhbmQgY2FuIG5vdCBiZSBsb2NrZWQnLAokcGFja2FnZQopKTsKfQoKJHNwZWMgPSAkdGhpcy0+ZHVtcGVyLT5kdW1wKCRwYWNrYWdlKTsKdW5zZXQoJHNwZWNbJ3ZlcnNpb25fbm9ybWFsaXplZCddKTsKCgokdGltZSA9ICRzcGVjWyd0aW1lJ10gPz8gbnVsbDsKdW5zZXQoJHNwZWNbJ3RpbWUnXSk7CmlmICgkcGFja2FnZS0+aXNEZXYoKSAmJiAkcGFja2FnZS0+Z2V0SW5zdGFsbGF0aW9uU291cmNlKCkgPT09ICdzb3VyY2UnKSB7CgokdGltZSA9ICR0aGlzLT5nZXRQYWNrYWdlVGltZSgkcGFja2FnZSkgPzogJHRpbWU7Cn0KaWYgKG51bGwgIT09ICR0aW1lKSB7CiRzcGVjWyd0aW1lJ10gPSAkdGltZTsKfQoKdW5zZXQoJHNwZWNbJ2luc3RhbGxhdGlvbi1zb3VyY2UnXSk7CgokbG9ja2VkW10gPSAkc3BlYzsKfQoKdXNvcnQoJGxvY2tlZCwgc3RhdGljIGZ1bmN0aW9uICgkYSwgJGIpIHsKJGNvbXBhcmlzb24gPSBzdHJjbXAoJGFbJ25hbWUnXSwgJGJbJ25hbWUnXSk7CgppZiAoMCAhPT0gJGNvbXBhcmlzb24pIHsKcmV0dXJuICRjb21wYXJpc29uOwp9CgoKcmV0dXJuIHN0cmNtcCgkYVsndmVyc2lvbiddLCAkYlsndmVyc2lvbiddKTsKfSk7CgpyZXR1cm4gJGxvY2tlZDsKfQoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRQYWNrYWdlVGltZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogP3N0cmluZwp7CmlmICghZnVuY3Rpb25fZXhpc3RzKCdwcm9jX29wZW4nKSkgewpyZXR1cm4gbnVsbDsKfQoKJHBhdGggPSAkdGhpcy0+aW5zdGFsbGF0aW9uTWFuYWdlci0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwppZiAoJHBhdGggPT09IG51bGwpIHsKcmV0dXJuIG51bGw7Cn0KJHBhdGggPSByZWFscGF0aCgkcGF0aCk7CiRzb3VyY2VUeXBlID0gJHBhY2thZ2UtPmdldFNvdXJjZVR5cGUoKTsKJGRhdGV0aW1lID0gbnVsbDsKCmlmICgkcGF0aCAmJiBpbl9hcnJheSgkc291cmNlVHlwZSwgWydnaXQnLCAnaGcnXSkpIHsKJHNvdXJjZVJlZiA9ICRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKSA/OiAkcGFja2FnZS0+Z2V0RGlzdFJlZmVyZW5jZSgpOwpzd2l0Y2ggKCRzb3VyY2VUeXBlKSB7CmNhc2UgJ2dpdCc6CkdpdFV0aWw6OmNsZWFuRW52KCR0aGlzLT5wcm9jZXNzKTsKCiRjb21tYW5kID0gR2l0VXRpbDo6YnVpbGRSZXZMaXN0Q29tbWFuZCgkdGhpcy0+cHJvY2VzcywgYXJyYXlfbWVyZ2UoWyctbjEnLCAnLS1mb3JtYXQ9JWN0JywgKHN0cmluZykgJHNvdXJjZVJlZl0sIEdpdFV0aWw6OmdldE5vU2hvd1NpZ25hdHVyZUZsYWdzKCR0aGlzLT5wcm9jZXNzKSkpOwppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRvdXRwdXQsICRwYXRoKSkgewokb3V0cHV0ID0gdHJpbShHaXRVdGlsOjpwYXJzZVJldkxpc3RPdXRwdXQoJG91dHB1dCwgJHRoaXMtPnByb2Nlc3MpKTsKaWYgKFByZWc6OmlzTWF0Y2goJ3teXHMqXGQrXHMqJH0nLCAkb3V0cHV0KSkgewokZGF0ZXRpbWUgPSBuZXcgXERhdGVUaW1lKCdAJy50cmltKCRvdXRwdXQpLCBuZXcgXERhdGVUaW1lWm9uZSgnVVRDJykpOwp9Cn0KYnJlYWs7CgpjYXNlICdoZyc6CmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2hnJywgJ2xvZycsICctLXRlbXBsYXRlJywgJ3tkYXRlfGhnZGF0ZX0nLCAnLXInLCAoc3RyaW5nKSAkc291cmNlUmVmXSwgJG91dHB1dCwgJHBhdGgpICYmIFByZWc6OmlzTWF0Y2goJ3teXHMqKFxkKylccyp9JywgJG91dHB1dCwgJG1hdGNoKSkgewokZGF0ZXRpbWUgPSBuZXcgXERhdGVUaW1lKCdAJy4kbWF0Y2hbMV0sIG5ldyBcRGF0ZVRpbWVab25lKCdVVEMnKSk7Cn0KYnJlYWs7Cn0KfQoKcmV0dXJuICRkYXRldGltZSA/ICRkYXRldGltZS0+Zm9ybWF0KERBVEVfUkZDMzMzOSkgOiBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TWlzc2luZ1JlcXVpcmVtZW50SW5mbyhSb290UGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgYm9vbCAkaW5jbHVkZURldik6IGFycmF5CnsKJG1pc3NpbmdSZXF1aXJlbWVudEluZm8gPSBbXTsKJG1pc3NpbmdSZXF1aXJlbWVudHMgPSBmYWxzZTsKJHNldHMgPSBbWydyZXBvJyA9PiAkdGhpcy0+Z2V0TG9ja2VkUmVwb3NpdG9yeShmYWxzZSksICdtZXRob2QnID0+ICdnZXRSZXF1aXJlcycsICdkZXNjcmlwdGlvbicgPT4gJ1JlcXVpcmVkJ11dOwppZiAoJGluY2x1ZGVEZXYgPT09IHRydWUpIHsKJHNldHNbXSA9IFsncmVwbycgPT4gJHRoaXMtPmdldExvY2tlZFJlcG9zaXRvcnkodHJ1ZSksICdtZXRob2QnID0+ICdnZXREZXZSZXF1aXJlcycsICdkZXNjcmlwdGlvbicgPT4gJ1JlcXVpcmVkIChpbiByZXF1aXJlLWRldiknXTsKfQokcm9vdFJlcG8gPSBuZXcgUm9vdFBhY2thZ2VSZXBvc2l0b3J5KGNsb25lICRwYWNrYWdlKTsKCmZvcmVhY2ggKCRzZXRzIGFzICRzZXQpIHsKJGluc3RhbGxlZFJlcG8gPSBuZXcgSW5zdGFsbGVkUmVwb3NpdG9yeShbJHNldFsncmVwbyddLCAkcm9vdFJlcG9dKTsKCmZvcmVhY2ggKGNhbGxfdXNlcl9mdW5jKFskcGFja2FnZSwgJHNldFsnbWV0aG9kJ11dKSBhcyAkbGluaykgewppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkbGluay0+Z2V0VGFyZ2V0KCkpKSB7CmNvbnRpbnVlOwp9CmlmICgkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpID09PSAnc2VsZi52ZXJzaW9uJykgewpjb250aW51ZTsKfQppZiAoJGluc3RhbGxlZFJlcG8tPmZpbmRQYWNrYWdlc1dpdGhSZXBsYWNlcnNBbmRQcm92aWRlcnMoJGxpbmstPmdldFRhcmdldCgpLCAkbGluay0+Z2V0Q29uc3RyYWludCgpKSA9PT0gW10pIHsKJHJlc3VsdHMgPSAkaW5zdGFsbGVkUmVwby0+ZmluZFBhY2thZ2VzV2l0aFJlcGxhY2Vyc0FuZFByb3ZpZGVycygkbGluay0+Z2V0VGFyZ2V0KCkpOwoKaWYgKCRyZXN1bHRzICE9PSBbXSkgewokcHJvdmlkZXIgPSByZXNldCgkcmVzdWx0cyk7CiRkZXNjcmlwdGlvbiA9ICRwcm92aWRlci0+Z2V0UHJldHR5VmVyc2lvbigpOwppZiAoJHByb3ZpZGVyLT5nZXROYW1lKCkgIT09ICRsaW5rLT5nZXRUYXJnZXQoKSkgewpmb3JlYWNoIChbJ2dldFJlcGxhY2VzJyA9PiAncmVwbGFjZWQgYXMgJXMgYnkgJXMnLCAnZ2V0UHJvdmlkZXMnID0+ICdwcm92aWRlZCBhcyAlcyBieSAlcyddIGFzICRtZXRob2QgPT4gJHRleHQpIHsKZm9yZWFjaCAoY2FsbF91c2VyX2Z1bmMoWyRwcm92aWRlciwgJG1ldGhvZF0pIGFzICRwcm92aWRlckxpbmspIHsKaWYgKCRwcm92aWRlckxpbmstPmdldFRhcmdldCgpID09PSAkbGluay0+Z2V0VGFyZ2V0KCkpIHsKJGRlc2NyaXB0aW9uID0gc3ByaW50ZigkdGV4dCwgJHByb3ZpZGVyTGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpLCAkcHJvdmlkZXItPmdldFByZXR0eU5hbWUoKS4nICcuJHByb3ZpZGVyLT5nZXRQcmV0dHlWZXJzaW9uKCkpOwpicmVhayAyOwp9Cn0KfQp9CiRtaXNzaW5nUmVxdWlyZW1lbnRJbmZvW10gPSAnLSAnIC4gJHNldFsnZGVzY3JpcHRpb24nXS4nIHBhY2thZ2UgIicgLiAkbGluay0+Z2V0VGFyZ2V0KCkgLiAnIiBpcyBpbiB0aGUgbG9jayBmaWxlIGFzICInLiRkZXNjcmlwdGlvbi4nIiBidXQgdGhhdCBkb2VzIG5vdCBzYXRpc2Z5IHlvdXIgY29uc3RyYWludCAiJy4kbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpLiciLic7Cn0gZWxzZSB7CiRtaXNzaW5nUmVxdWlyZW1lbnRJbmZvW10gPSAnLSAnIC4gJHNldFsnZGVzY3JpcHRpb24nXS4nIHBhY2thZ2UgIicgLiAkbGluay0+Z2V0VGFyZ2V0KCkgLiAnIiBpcyBub3QgcHJlc2VudCBpbiB0aGUgbG9jayBmaWxlLic7Cn0KJG1pc3NpbmdSZXF1aXJlbWVudHMgPSB0cnVlOwp9Cn0KfQoKaWYgKCRtaXNzaW5nUmVxdWlyZW1lbnRzKSB7CiRtaXNzaW5nUmVxdWlyZW1lbnRJbmZvW10gPSAnVGhpcyB1c3VhbGx5IGhhcHBlbnMgd2hlbiBjb21wb3NlciBmaWxlcyBhcmUgaW5jb3JyZWN0bHkgbWVyZ2VkIG9yIHRoZSBjb21wb3Nlci5qc29uIGZpbGUgaXMgbWFudWFsbHkgZWRpdGVkLic7CiRtaXNzaW5nUmVxdWlyZW1lbnRJbmZvW10gPSAnUmVhZCBtb3JlIGFib3V0IGNvcnJlY3RseSByZXNvbHZpbmcgbWVyZ2UgY29uZmxpY3RzIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy9hcnRpY2xlcy9yZXNvbHZpbmctbWVyZ2UtY29uZmxpY3RzLm1kJzsKJG1pc3NpbmdSZXF1aXJlbWVudEluZm9bXSA9ICdhbmQgcHJlZmVyIHVzaW5nIHRoZSAicmVxdWlyZSIgY29tbWFuZCBvdmVyIGVkaXRpbmcgdGhlIGNvbXBvc2VyLmpzb24gZmlsZSBkaXJlY3RseSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI3JlcXVpcmUtcic7Cn0KCnJldHVybiAkbWlzc2luZ1JlcXVpcmVtZW50SW5mbzsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxDb21wb3Nlck1pcnJvcjsKCgoKCgoKCgoKCmNsYXNzIFBhY2thZ2UgZXh0ZW5kcyBCYXNlUGFja2FnZQp7Cgpwcm90ZWN0ZWQgJHR5cGU7Cgpwcm90ZWN0ZWQgJHRhcmdldERpcjsKCnByb3RlY3RlZCAkaW5zdGFsbGF0aW9uU291cmNlOwoKcHJvdGVjdGVkICRzb3VyY2VUeXBlOwoKcHJvdGVjdGVkICRzb3VyY2VVcmw7Cgpwcm90ZWN0ZWQgJHNvdXJjZVJlZmVyZW5jZTsKCnByb3RlY3RlZCAkc291cmNlTWlycm9yczsKCnByb3RlY3RlZCAkZGlzdFR5cGU7Cgpwcm90ZWN0ZWQgJGRpc3RVcmw7Cgpwcm90ZWN0ZWQgJGRpc3RSZWZlcmVuY2U7Cgpwcm90ZWN0ZWQgJGRpc3RTaGExQ2hlY2tzdW07Cgpwcm90ZWN0ZWQgJGRpc3RNaXJyb3JzOwoKcHJvdGVjdGVkICR2ZXJzaW9uOwoKcHJvdGVjdGVkICRwcmV0dHlWZXJzaW9uOwoKcHJvdGVjdGVkICRyZWxlYXNlRGF0ZTsKCnByb3RlY3RlZCAkZXh0cmEgPSBbXTsKCnByb3RlY3RlZCAkYmluYXJpZXMgPSBbXTsKCnByb3RlY3RlZCAkZGV2OwoKCgoKcHJvdGVjdGVkICRzdGFiaWxpdHk7Cgpwcm90ZWN0ZWQgJG5vdGlmaWNhdGlvblVybDsKCgpwcm90ZWN0ZWQgJHJlcXVpcmVzID0gW107Cgpwcm90ZWN0ZWQgJGNvbmZsaWN0cyA9IFtdOwoKcHJvdGVjdGVkICRwcm92aWRlcyA9IFtdOwoKcHJvdGVjdGVkICRyZXBsYWNlcyA9IFtdOwoKcHJvdGVjdGVkICRkZXZSZXF1aXJlcyA9IFtdOwoKcHJvdGVjdGVkICRzdWdnZXN0cyA9IFtdOwoKCgoKcHJvdGVjdGVkICRhdXRvbG9hZCA9IFtdOwoKCgoKcHJvdGVjdGVkICRkZXZBdXRvbG9hZCA9IFtdOwoKcHJvdGVjdGVkICRpbmNsdWRlUGF0aHMgPSBbXTsKCnByb3RlY3RlZCAkaXNEZWZhdWx0QnJhbmNoID0gZmFsc2U7Cgpwcm90ZWN0ZWQgJHRyYW5zcG9ydE9wdGlvbnMgPSBbXTsKCgoKCnByb3RlY3RlZCAkcGhwRXh0ID0gbnVsbDsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lLCBzdHJpbmcgJHZlcnNpb24sIHN0cmluZyAkcHJldHR5VmVyc2lvbikKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRuYW1lKTsKCiR0aGlzLT52ZXJzaW9uID0gJHZlcnNpb247CiR0aGlzLT5wcmV0dHlWZXJzaW9uID0gJHByZXR0eVZlcnNpb247CgokdGhpcy0+c3RhYmlsaXR5ID0gVmVyc2lvblBhcnNlcjo6cGFyc2VTdGFiaWxpdHkoJHZlcnNpb24pOwokdGhpcy0+ZGV2ID0gJHRoaXMtPnN0YWJpbGl0eSA9PT0gJ2Rldic7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RldigpOiBib29sCnsKcmV0dXJuICR0aGlzLT5kZXY7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRUeXBlKHN0cmluZyAkdHlwZSk6IHZvaWQKewokdGhpcy0+dHlwZSA9ICR0eXBlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VHlwZSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnR5cGUgPzogJ2xpYnJhcnknOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhYmlsaXR5KCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+c3RhYmlsaXR5Owp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0VGFyZ2V0RGlyKD9zdHJpbmcgJHRhcmdldERpcik6IHZvaWQKewokdGhpcy0+dGFyZ2V0RGlyID0gJHRhcmdldERpcjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRhcmdldERpcigpOiA/c3RyaW5nCnsKaWYgKG51bGwgPT09ICR0aGlzLT50YXJnZXREaXIpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiBsdHJpbShQcmVnOjpyZXBsYWNlKCd7ICg/Ol58W1xcXFwvXSspIFwuXC4/ICg/OltcXFxcL10rfCQpICg/OlwuXC4/ICg/OltcXFxcL10rfCQpICkqfXgnLCAnLycsICR0aGlzLT50YXJnZXREaXIpLCAnLycpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RXh0cmEoYXJyYXkgJGV4dHJhKTogdm9pZAp7CiR0aGlzLT5leHRyYSA9ICRleHRyYTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEV4dHJhKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5leHRyYTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEJpbmFyaWVzKGFycmF5ICRiaW5hcmllcyk6IHZvaWQKewokdGhpcy0+YmluYXJpZXMgPSAkYmluYXJpZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRCaW5hcmllcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YmluYXJpZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRJbnN0YWxsYXRpb25Tb3VyY2UoP3N0cmluZyAkdHlwZSk6IHZvaWQKewokdGhpcy0+aW5zdGFsbGF0aW9uU291cmNlID0gJHR5cGU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJbnN0YWxsYXRpb25Tb3VyY2UoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+aW5zdGFsbGF0aW9uU291cmNlOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0U291cmNlVHlwZSg/c3RyaW5nICR0eXBlKTogdm9pZAp7CiR0aGlzLT5zb3VyY2VUeXBlID0gJHR5cGU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VUeXBlKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPnNvdXJjZVR5cGU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRTb3VyY2VVcmwoP3N0cmluZyAkdXJsKTogdm9pZAp7CiR0aGlzLT5zb3VyY2VVcmwgPSAkdXJsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlVXJsKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPnNvdXJjZVVybDsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFNvdXJjZVJlZmVyZW5jZSg/c3RyaW5nICRyZWZlcmVuY2UpOiB2b2lkCnsKJHRoaXMtPnNvdXJjZVJlZmVyZW5jZSA9ICRyZWZlcmVuY2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VSZWZlcmVuY2UoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+c291cmNlUmVmZXJlbmNlOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0U291cmNlTWlycm9ycyg/YXJyYXkgJG1pcnJvcnMpOiB2b2lkCnsKJHRoaXMtPnNvdXJjZU1pcnJvcnMgPSAkbWlycm9yczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZU1pcnJvcnMoKTogP2FycmF5CnsKcmV0dXJuICR0aGlzLT5zb3VyY2VNaXJyb3JzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlVXJscygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+Z2V0VXJscygkdGhpcy0+c291cmNlVXJsLCAkdGhpcy0+c291cmNlTWlycm9ycywgJHRoaXMtPnNvdXJjZVJlZmVyZW5jZSwgJHRoaXMtPnNvdXJjZVR5cGUsICdzb3VyY2UnKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldERpc3RUeXBlKD9zdHJpbmcgJHR5cGUpOiB2b2lkCnsKJHRoaXMtPmRpc3RUeXBlID0gJHR5cGUgPT09ICcnID8gbnVsbCA6ICR0eXBlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdFR5cGUoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+ZGlzdFR5cGU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXREaXN0VXJsKD9zdHJpbmcgJHVybCk6IHZvaWQKewokdGhpcy0+ZGlzdFVybCA9ICR1cmwgPT09ICcnID8gbnVsbCA6ICR1cmw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0VXJsKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmRpc3RVcmw7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXREaXN0UmVmZXJlbmNlKD9zdHJpbmcgJHJlZmVyZW5jZSk6IHZvaWQKewokdGhpcy0+ZGlzdFJlZmVyZW5jZSA9ICRyZWZlcmVuY2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0UmVmZXJlbmNlKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmRpc3RSZWZlcmVuY2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXREaXN0U2hhMUNoZWNrc3VtKD9zdHJpbmcgJHNoYTFjaGVja3N1bSk6IHZvaWQKewokdGhpcy0+ZGlzdFNoYTFDaGVja3N1bSA9ICRzaGExY2hlY2tzdW07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0U2hhMUNoZWNrc3VtKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmRpc3RTaGExQ2hlY2tzdW07Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXREaXN0TWlycm9ycyg/YXJyYXkgJG1pcnJvcnMpOiB2b2lkCnsKJHRoaXMtPmRpc3RNaXJyb3JzID0gJG1pcnJvcnM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0TWlycm9ycygpOiA/YXJyYXkKewpyZXR1cm4gJHRoaXMtPmRpc3RNaXJyb3JzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdFVybHMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmdldFVybHMoJHRoaXMtPmRpc3RVcmwsICR0aGlzLT5kaXN0TWlycm9ycywgJHRoaXMtPmRpc3RSZWZlcmVuY2UsICR0aGlzLT5kaXN0VHlwZSwgJ2Rpc3QnKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydE9wdGlvbnMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnRyYW5zcG9ydE9wdGlvbnM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRUcmFuc3BvcnRPcHRpb25zKGFycmF5ICRvcHRpb25zKTogdm9pZAp7CiR0aGlzLT50cmFuc3BvcnRPcHRpb25zID0gJG9wdGlvbnM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+dmVyc2lvbjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByZXR0eVZlcnNpb24oKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5wcmV0dHlWZXJzaW9uOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVsZWFzZURhdGUoP1xEYXRlVGltZUludGVyZmFjZSAkcmVsZWFzZURhdGUpOiB2b2lkCnsKJHRoaXMtPnJlbGVhc2VEYXRlID0gJHJlbGVhc2VEYXRlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVsZWFzZURhdGUoKTogP1xEYXRlVGltZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+cmVsZWFzZURhdGU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJlcXVpcmVzKGFycmF5ICRyZXF1aXJlcyk6IHZvaWQKewppZiAoaXNzZXQoJHJlcXVpcmVzWzBdKSkgeyAKJHJlcXVpcmVzID0gJHRoaXMtPmNvbnZlcnRMaW5rc1RvTWFwKCRyZXF1aXJlcywgJ3NldFJlcXVpcmVzJyk7Cn0KCiR0aGlzLT5yZXF1aXJlcyA9ICRyZXF1aXJlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlcXVpcmVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yZXF1aXJlczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29uZmxpY3RzKGFycmF5ICRjb25mbGljdHMpOiB2b2lkCnsKaWYgKGlzc2V0KCRjb25mbGljdHNbMF0pKSB7IAokY29uZmxpY3RzID0gJHRoaXMtPmNvbnZlcnRMaW5rc1RvTWFwKCRjb25mbGljdHMsICdzZXRDb25mbGljdHMnKTsKfQoKJHRoaXMtPmNvbmZsaWN0cyA9ICRjb25mbGljdHM7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29uZmxpY3RzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5jb25mbGljdHM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByb3ZpZGVzKGFycmF5ICRwcm92aWRlcyk6IHZvaWQKewppZiAoaXNzZXQoJHByb3ZpZGVzWzBdKSkgeyAKJHByb3ZpZGVzID0gJHRoaXMtPmNvbnZlcnRMaW5rc1RvTWFwKCRwcm92aWRlcywgJ3NldFByb3ZpZGVzJyk7Cn0KCiR0aGlzLT5wcm92aWRlcyA9ICRwcm92aWRlczsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm92aWRlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cHJvdmlkZXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJlcGxhY2VzKGFycmF5ICRyZXBsYWNlcyk6IHZvaWQKewppZiAoaXNzZXQoJHJlcGxhY2VzWzBdKSkgeyAKJHJlcGxhY2VzID0gJHRoaXMtPmNvbnZlcnRMaW5rc1RvTWFwKCRyZXBsYWNlcywgJ3NldFJlcGxhY2VzJyk7Cn0KCiR0aGlzLT5yZXBsYWNlcyA9ICRyZXBsYWNlczsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBsYWNlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cmVwbGFjZXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERldlJlcXVpcmVzKGFycmF5ICRkZXZSZXF1aXJlcyk6IHZvaWQKewppZiAoaXNzZXQoJGRldlJlcXVpcmVzWzBdKSkgeyAKJGRldlJlcXVpcmVzID0gJHRoaXMtPmNvbnZlcnRMaW5rc1RvTWFwKCRkZXZSZXF1aXJlcywgJ3NldERldlJlcXVpcmVzJyk7Cn0KCiR0aGlzLT5kZXZSZXF1aXJlcyA9ICRkZXZSZXF1aXJlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERldlJlcXVpcmVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5kZXZSZXF1aXJlczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U3VnZ2VzdHMoYXJyYXkgJHN1Z2dlc3RzKTogdm9pZAp7CiR0aGlzLT5zdWdnZXN0cyA9ICRzdWdnZXN0czsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN1Z2dlc3RzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5zdWdnZXN0czsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBdXRvbG9hZChhcnJheSAkYXV0b2xvYWQpOiB2b2lkCnsKJHRoaXMtPmF1dG9sb2FkID0gJGF1dG9sb2FkOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXV0b2xvYWQoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmF1dG9sb2FkOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERldkF1dG9sb2FkKGFycmF5ICRkZXZBdXRvbG9hZCk6IHZvaWQKewokdGhpcy0+ZGV2QXV0b2xvYWQgPSAkZGV2QXV0b2xvYWQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXZBdXRvbG9hZCgpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+ZGV2QXV0b2xvYWQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEluY2x1ZGVQYXRocyhhcnJheSAkaW5jbHVkZVBhdGhzKTogdm9pZAp7CiR0aGlzLT5pbmNsdWRlUGF0aHMgPSAkaW5jbHVkZVBhdGhzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5jbHVkZVBhdGhzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5pbmNsdWRlUGF0aHM7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQaHBFeHQoP2FycmF5ICRwaHBFeHQpOiB2b2lkCnsKJHRoaXMtPnBocEV4dCA9ICRwaHBFeHQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQaHBFeHQoKTogP2FycmF5CnsKcmV0dXJuICR0aGlzLT5waHBFeHQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXROb3RpZmljYXRpb25Vcmwoc3RyaW5nICRub3RpZmljYXRpb25VcmwpOiB2b2lkCnsKJHRoaXMtPm5vdGlmaWNhdGlvblVybCA9ICRub3RpZmljYXRpb25Vcmw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROb3RpZmljYXRpb25VcmwoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+bm90aWZpY2F0aW9uVXJsOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0SXNEZWZhdWx0QnJhbmNoKGJvb2wgJGRlZmF1bHRCcmFuY2gpOiB2b2lkCnsKJHRoaXMtPmlzRGVmYXVsdEJyYW5jaCA9ICRkZWZhdWx0QnJhbmNoOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZWZhdWx0QnJhbmNoKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmlzRGVmYXVsdEJyYW5jaDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFNvdXJjZURpc3RSZWZlcmVuY2VzKHN0cmluZyAkcmVmZXJlbmNlKTogdm9pZAp7CiR0aGlzLT5zZXRTb3VyY2VSZWZlcmVuY2UoJHJlZmVyZW5jZSk7CgoKCmlmICgKJHRoaXMtPmdldERpc3RVcmwoKSAhPT0gbnVsbAomJiBQcmVnOjppc01hdGNoKCd7Xmh0dHBzPzovLyg/Oig/Ond3d1wuKT9iaXRidWNrZXRcLm9yZ3woYXBpXC4pP2dpdGh1YlwuY29tfCg/Ond3d1wuKT9naXRsYWJcLmNvbSkvfWknLCAkdGhpcy0+Z2V0RGlzdFVybCgpKQopIHsKJHRoaXMtPnNldERpc3RSZWZlcmVuY2UoJHJlZmVyZW5jZSk7CiR0aGlzLT5zZXREaXN0VXJsKFByZWc6OnJlcGxhY2UoJ3soPzw9L3xzaGE9KVthLWYwLTldezQwfSg/PS98JCl9aScsICRyZWZlcmVuY2UsICR0aGlzLT5nZXREaXN0VXJsKCkpKTsKfSBlbHNlaWYgKCR0aGlzLT5nZXREaXN0UmVmZXJlbmNlKCkpIHsgCiR0aGlzLT5zZXREaXN0UmVmZXJlbmNlKCRyZWZlcmVuY2UpOwp9Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVwbGFjZVZlcnNpb24oc3RyaW5nICR2ZXJzaW9uLCBzdHJpbmcgJHByZXR0eVZlcnNpb24pOiB2b2lkCnsKJHRoaXMtPnZlcnNpb24gPSAkdmVyc2lvbjsKJHRoaXMtPnByZXR0eVZlcnNpb24gPSAkcHJldHR5VmVyc2lvbjsKCiR0aGlzLT5zdGFiaWxpdHkgPSBWZXJzaW9uUGFyc2VyOjpwYXJzZVN0YWJpbGl0eSgkdmVyc2lvbik7CiR0aGlzLT5kZXYgPSAkdGhpcy0+c3RhYmlsaXR5ID09PSAnZGV2JzsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRVcmxzKD9zdHJpbmcgJHVybCwgP2FycmF5ICRtaXJyb3JzLCA/c3RyaW5nICRyZWYsID9zdHJpbmcgJHR5cGUsIHN0cmluZyAkdXJsVHlwZSk6IGFycmF5CnsKaWYgKCEkdXJsKSB7CnJldHVybiBbXTsKfQoKaWYgKCR1cmxUeXBlID09PSAnZGlzdCcgJiYgZmFsc2UgIT09IHN0cnBvcygkdXJsLCAnJScpKSB7CiR1cmwgPSBDb21wb3Nlck1pcnJvcjo6cHJvY2Vzc1VybCgkdXJsLCAkdGhpcy0+bmFtZSwgJHRoaXMtPnZlcnNpb24sICRyZWYsICR0eXBlLCAkdGhpcy0+cHJldHR5VmVyc2lvbik7Cn0KCiR1cmxzID0gWyR1cmxdOwppZiAoJG1pcnJvcnMpIHsKZm9yZWFjaCAoJG1pcnJvcnMgYXMgJG1pcnJvcikgewppZiAoJHVybFR5cGUgPT09ICdkaXN0JykgewokbWlycm9yVXJsID0gQ29tcG9zZXJNaXJyb3I6OnByb2Nlc3NVcmwoJG1pcnJvclsndXJsJ10sICR0aGlzLT5uYW1lLCAkdGhpcy0+dmVyc2lvbiwgJHJlZiwgJHR5cGUsICR0aGlzLT5wcmV0dHlWZXJzaW9uKTsKfSBlbHNlaWYgKCR1cmxUeXBlID09PSAnc291cmNlJyAmJiAkdHlwZSA9PT0gJ2dpdCcpIHsKJG1pcnJvclVybCA9IENvbXBvc2VyTWlycm9yOjpwcm9jZXNzR2l0VXJsKCRtaXJyb3JbJ3VybCddLCAkdGhpcy0+bmFtZSwgJHVybCwgJHR5cGUpOwp9IGVsc2VpZiAoJHVybFR5cGUgPT09ICdzb3VyY2UnICYmICR0eXBlID09PSAnaGcnKSB7CiRtaXJyb3JVcmwgPSBDb21wb3Nlck1pcnJvcjo6cHJvY2Vzc0hnVXJsKCRtaXJyb3JbJ3VybCddLCAkdGhpcy0+bmFtZSwgJHVybCwgJHR5cGUpOwp9IGVsc2Ugewpjb250aW51ZTsKfQppZiAoIVxpbl9hcnJheSgkbWlycm9yVXJsLCAkdXJscykpIHsKJGZ1bmMgPSAkbWlycm9yWydwcmVmZXJyZWQnXSA/ICdhcnJheV91bnNoaWZ0JyA6ICdhcnJheV9wdXNoJzsKJGZ1bmMoJHVybHMsICRtaXJyb3JVcmwpOwp9Cn0KfQoKcmV0dXJuICR1cmxzOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjb252ZXJ0TGlua3NUb01hcChhcnJheSAkbGlua3MsIHN0cmluZyAkc291cmNlKTogYXJyYXkKewp0cmlnZ2VyX2Vycm9yKCdQYWNrYWdlOjonLiRzb3VyY2UuJyBtdXN0IGJlIGNhbGxlZCB3aXRoIGEgbWFwIG9mIGxvd2VyY2FzZWQgcGFja2FnZSBuYW1lID0+IExpbmsgb2JqZWN0LCBnb3QgYSBpbmRleGVkIGFycmF5LCB0aGlzIGlzIGRlcHJlY2F0ZWQgYW5kIHlvdSBzaG91bGQgZml4IHlvdXIgdXNhZ2UuJyk7CiRuZXdMaW5rcyA9IFtdOwpmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspIHsKJG5ld0xpbmtzWyRsaW5rLT5nZXRUYXJnZXQoKV0gPSAkbGluazsKfQoKcmV0dXJuICRuZXdMaW5rczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlOwoKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUludGVyZmFjZTsKCgoKCgoKCgoKCgoKaW50ZXJmYWNlIFBhY2thZ2VJbnRlcmZhY2UKewpwdWJsaWMgY29uc3QgRElTUExBWV9TT1VSQ0VfUkVGX0lGX0RFViA9IDA7CnB1YmxpYyBjb25zdCBESVNQTEFZX1NPVVJDRV9SRUYgPSAxOwpwdWJsaWMgY29uc3QgRElTUExBWV9ESVNUX1JFRiA9IDI7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCk6IHN0cmluZzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByZXR0eU5hbWUoKTogc3RyaW5nOwoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lcyhib29sICRwcm92aWRlcyA9IHRydWUpOiBhcnJheTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRJZChpbnQgJGlkKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldElkKCk6IGludDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RldigpOiBib29sOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VHlwZSgpOiBzdHJpbmc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUYXJnZXREaXIoKTogP3N0cmluZzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEV4dHJhKCk6IGFycmF5OwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEluc3RhbGxhdGlvblNvdXJjZSg/c3RyaW5nICR0eXBlKTogdm9pZDsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJbnN0YWxsYXRpb25Tb3VyY2UoKTogP3N0cmluZzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZVR5cGUoKTogP3N0cmluZzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZVVybCgpOiA/c3RyaW5nOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlVXJscygpOiBhcnJheTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZVJlZmVyZW5jZSgpOiA/c3RyaW5nOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlTWlycm9ycygpOiA/YXJyYXk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U291cmNlTWlycm9ycyg/YXJyYXkgJG1pcnJvcnMpOiB2b2lkOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdFR5cGUoKTogP3N0cmluZzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3RVcmwoKTogP3N0cmluZzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3RVcmxzKCk6IGFycmF5OwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3RSZWZlcmVuY2UoKTogP3N0cmluZzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3RTaGExQ2hlY2tzdW0oKTogP3N0cmluZzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3RNaXJyb3JzKCk6ID9hcnJheTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREaXN0TWlycm9ycyg/YXJyYXkgJG1pcnJvcnMpOiB2b2lkOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmV0dHlWZXJzaW9uKCk6IHN0cmluZzsKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZ1bGxQcmV0dHlWZXJzaW9uKGJvb2wgJHRydW5jYXRlID0gdHJ1ZSwgaW50ICRkaXNwbGF5TW9kZSA9IHNlbGY6OkRJU1BMQVlfU09VUkNFX1JFRl9JRl9ERVYpOiBzdHJpbmc7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVsZWFzZURhdGUoKTogP1xEYXRlVGltZUludGVyZmFjZTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0YWJpbGl0eSgpOiBzdHJpbmc7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVxdWlyZXMoKTogYXJyYXk7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29uZmxpY3RzKCk6IGFycmF5OwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByb3ZpZGVzKCk6IGFycmF5OwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlcGxhY2VzKCk6IGFycmF5OwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERldlJlcXVpcmVzKCk6IGFycmF5OwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdWdnZXN0cygpOiBhcnJheTsKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEF1dG9sb2FkKCk6IGFycmF5OwoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGV2QXV0b2xvYWQoKTogYXJyYXk7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5jbHVkZVBhdGhzKCk6IGFycmF5OwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBocEV4dCgpOiA/YXJyYXk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVwb3NpdG9yeShSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvc2l0b3J5KTogdm9pZDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvc2l0b3J5KCk6ID9SZXBvc2l0b3J5SW50ZXJmYWNlOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QmluYXJpZXMoKTogYXJyYXk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VW5pcXVlTmFtZSgpOiBzdHJpbmc7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Tm90aWZpY2F0aW9uVXJsKCk6ID9zdHJpbmc7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmc7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJldHR5U3RyaW5nKCk6IHN0cmluZzsKCnB1YmxpYyBmdW5jdGlvbiBpc0RlZmF1bHRCcmFuY2goKTogYm9vbDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydE9wdGlvbnMoKTogYXJyYXk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRUcmFuc3BvcnRPcHRpb25zKGFycmF5ICRvcHRpb25zKTogdm9pZDsKCnB1YmxpYyBmdW5jdGlvbiBzZXRTb3VyY2VSZWZlcmVuY2UoP3N0cmluZyAkcmVmZXJlbmNlKTogdm9pZDsKCnB1YmxpYyBmdW5jdGlvbiBzZXREaXN0VXJsKD9zdHJpbmcgJHVybCk6IHZvaWQ7CgpwdWJsaWMgZnVuY3Rpb24gc2V0RGlzdFR5cGUoP3N0cmluZyAkdHlwZSk6IHZvaWQ7CgpwdWJsaWMgZnVuY3Rpb24gc2V0RGlzdFJlZmVyZW5jZSg/c3RyaW5nICRyZWZlcmVuY2UpOiB2b2lkOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFNvdXJjZURpc3RSZWZlcmVuY2VzKHN0cmluZyAkcmVmZXJlbmNlKTogdm9pZDsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZTsKCgoKCmNsYXNzIFJvb3RBbGlhc1BhY2thZ2UgZXh0ZW5kcyBDb21wbGV0ZUFsaWFzUGFja2FnZSBpbXBsZW1lbnRzIFJvb3RQYWNrYWdlSW50ZXJmYWNlCnsKCnByb3RlY3RlZCAkYWxpYXNPZjsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUm9vdFBhY2thZ2UgJGFsaWFzT2YsIHN0cmluZyAkdmVyc2lvbiwgc3RyaW5nICRwcmV0dHlWZXJzaW9uKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJGFsaWFzT2YsICR2ZXJzaW9uLCAkcHJldHR5VmVyc2lvbik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBbGlhc09mKCkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2Y7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBbGlhc2VzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRBbGlhc2VzKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRNaW5pbXVtU3RhYmlsaXR5KCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0TWluaW11bVN0YWJpbGl0eSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhYmlsaXR5RmxhZ3MoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldFN0YWJpbGl0eUZsYWdzKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZWZlcmVuY2VzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRSZWZlcmVuY2VzKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmVmZXJTdGFibGUoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0UHJlZmVyU3RhYmxlKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb25maWcoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldENvbmZpZygpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVxdWlyZXMoYXJyYXkgJHJlcXVpcmVzKTogdm9pZAp7CiR0aGlzLT5yZXF1aXJlcyA9ICR0aGlzLT5yZXBsYWNlU2VsZlZlcnNpb25EZXBlbmRlbmNpZXMoJHJlcXVpcmVzLCBMaW5rOjpUWVBFX1JFUVVJUkUpOwoKJHRoaXMtPmFsaWFzT2YtPnNldFJlcXVpcmVzKCRyZXF1aXJlcyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZXZSZXF1aXJlcyhhcnJheSAkZGV2UmVxdWlyZXMpOiB2b2lkCnsKJHRoaXMtPmRldlJlcXVpcmVzID0gJHRoaXMtPnJlcGxhY2VTZWxmVmVyc2lvbkRlcGVuZGVuY2llcygkZGV2UmVxdWlyZXMsIExpbms6OlRZUEVfREVWX1JFUVVJUkUpOwoKJHRoaXMtPmFsaWFzT2YtPnNldERldlJlcXVpcmVzKCRkZXZSZXF1aXJlcyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDb25mbGljdHMoYXJyYXkgJGNvbmZsaWN0cyk6IHZvaWQKewokdGhpcy0+Y29uZmxpY3RzID0gJHRoaXMtPnJlcGxhY2VTZWxmVmVyc2lvbkRlcGVuZGVuY2llcygkY29uZmxpY3RzLCBMaW5rOjpUWVBFX0NPTkZMSUNUKTsKJHRoaXMtPmFsaWFzT2YtPnNldENvbmZsaWN0cygkY29uZmxpY3RzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByb3ZpZGVzKGFycmF5ICRwcm92aWRlcyk6IHZvaWQKewokdGhpcy0+cHJvdmlkZXMgPSAkdGhpcy0+cmVwbGFjZVNlbGZWZXJzaW9uRGVwZW5kZW5jaWVzKCRwcm92aWRlcywgTGluazo6VFlQRV9QUk9WSURFKTsKJHRoaXMtPmFsaWFzT2YtPnNldFByb3ZpZGVzKCRwcm92aWRlcyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSZXBsYWNlcyhhcnJheSAkcmVwbGFjZXMpOiB2b2lkCnsKJHRoaXMtPnJlcGxhY2VzID0gJHRoaXMtPnJlcGxhY2VTZWxmVmVyc2lvbkRlcGVuZGVuY2llcygkcmVwbGFjZXMsIExpbms6OlRZUEVfUkVQTEFDRSk7CiR0aGlzLT5hbGlhc09mLT5zZXRSZXBsYWNlcygkcmVwbGFjZXMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXV0b2xvYWQoYXJyYXkgJGF1dG9sb2FkKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRBdXRvbG9hZCgkYXV0b2xvYWQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGV2QXV0b2xvYWQoYXJyYXkgJGRldkF1dG9sb2FkKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXREZXZBdXRvbG9hZCgkZGV2QXV0b2xvYWQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U3RhYmlsaXR5RmxhZ3MoYXJyYXkgJHN0YWJpbGl0eUZsYWdzKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRTdGFiaWxpdHlGbGFncygkc3RhYmlsaXR5RmxhZ3MpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0TWluaW11bVN0YWJpbGl0eShzdHJpbmcgJG1pbmltdW1TdGFiaWxpdHkpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldE1pbmltdW1TdGFiaWxpdHkoJG1pbmltdW1TdGFiaWxpdHkpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJlZmVyU3RhYmxlKGJvb2wgJHByZWZlclN0YWJsZSk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0UHJlZmVyU3RhYmxlKCRwcmVmZXJTdGFibGUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29uZmlnKGFycmF5ICRjb25maWcpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldENvbmZpZygkY29uZmlnKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJlZmVyZW5jZXMoYXJyYXkgJHJlZmVyZW5jZXMpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldFJlZmVyZW5jZXMoJHJlZmVyZW5jZXMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QWxpYXNlcyhhcnJheSAkYWxpYXNlcyk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0QWxpYXNlcygkYWxpYXNlcyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRTdWdnZXN0cyhhcnJheSAkc3VnZ2VzdHMpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldFN1Z2dlc3RzKCRzdWdnZXN0cyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRFeHRyYShhcnJheSAkZXh0cmEpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldEV4dHJhKCRleHRyYSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX2Nsb25lKCkKewpwYXJlbnQ6Ol9fY2xvbmUoKTsKJHRoaXMtPmFsaWFzT2YgPSBjbG9uZSAkdGhpcy0+YWxpYXNPZjsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlOwoKCgoKCgpjbGFzcyBSb290UGFja2FnZSBleHRlbmRzIENvbXBsZXRlUGFja2FnZSBpbXBsZW1lbnRzIFJvb3RQYWNrYWdlSW50ZXJmYWNlCnsKcHVibGljIGNvbnN0IERFRkFVTFRfUFJFVFRZX1ZFUlNJT04gPSAnMS4wLjArbm8tdmVyc2lvbi1zZXQnOwoKCnByb3RlY3RlZCAkbWluaW11bVN0YWJpbGl0eSA9ICdzdGFibGUnOwoKcHJvdGVjdGVkICRwcmVmZXJTdGFibGUgPSBmYWxzZTsKCnByb3RlY3RlZCAkc3RhYmlsaXR5RmxhZ3MgPSBbXTsKCnByb3RlY3RlZCAkY29uZmlnID0gW107Cgpwcm90ZWN0ZWQgJHJlZmVyZW5jZXMgPSBbXTsKCnByb3RlY3RlZCAkYWxpYXNlcyA9IFtdOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE1pbmltdW1TdGFiaWxpdHkoc3RyaW5nICRtaW5pbXVtU3RhYmlsaXR5KTogdm9pZAp7CiR0aGlzLT5taW5pbXVtU3RhYmlsaXR5ID0gJG1pbmltdW1TdGFiaWxpdHk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRNaW5pbXVtU3RhYmlsaXR5KCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+bWluaW11bVN0YWJpbGl0eTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFN0YWJpbGl0eUZsYWdzKGFycmF5ICRzdGFiaWxpdHlGbGFncyk6IHZvaWQKewokdGhpcy0+c3RhYmlsaXR5RmxhZ3MgPSAkc3RhYmlsaXR5RmxhZ3M7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdGFiaWxpdHlGbGFncygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+c3RhYmlsaXR5RmxhZ3M7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQcmVmZXJTdGFibGUoYm9vbCAkcHJlZmVyU3RhYmxlKTogdm9pZAp7CiR0aGlzLT5wcmVmZXJTdGFibGUgPSAkcHJlZmVyU3RhYmxlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJlZmVyU3RhYmxlKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPnByZWZlclN0YWJsZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldENvbmZpZyhhcnJheSAkY29uZmlnKTogdm9pZAp7CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29uZmlnKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5jb25maWc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSZWZlcmVuY2VzKGFycmF5ICRyZWZlcmVuY2VzKTogdm9pZAp7CiR0aGlzLT5yZWZlcmVuY2VzID0gJHJlZmVyZW5jZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZWZlcmVuY2VzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yZWZlcmVuY2VzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QWxpYXNlcyhhcnJheSAkYWxpYXNlcyk6IHZvaWQKewokdGhpcy0+YWxpYXNlcyA9ICRhbGlhc2VzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QWxpYXNlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNlczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlOwoKCgoKCgoKCgoKCmludGVyZmFjZSBSb290UGFja2FnZUludGVyZmFjZSBleHRlbmRzIENvbXBsZXRlUGFja2FnZUludGVyZmFjZQp7CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFsaWFzZXMoKTogYXJyYXk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRNaW5pbXVtU3RhYmlsaXR5KCk6IHN0cmluZzsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhYmlsaXR5RmxhZ3MoKTogYXJyYXk7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlZmVyZW5jZXMoKTogYXJyYXk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJlZmVyU3RhYmxlKCk6IGJvb2w7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb25maWcoKTogYXJyYXk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSZXF1aXJlcyhhcnJheSAkcmVxdWlyZXMpOiB2b2lkOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGV2UmVxdWlyZXMoYXJyYXkgJGRldlJlcXVpcmVzKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldENvbmZsaWN0cyhhcnJheSAkY29uZmxpY3RzKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByb3ZpZGVzKGFycmF5ICRwcm92aWRlcyk6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSZXBsYWNlcyhhcnJheSAkcmVwbGFjZXMpOiB2b2lkOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEF1dG9sb2FkKGFycmF5ICRhdXRvbG9hZCk6IHZvaWQ7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGV2QXV0b2xvYWQoYXJyYXkgJGRldkF1dG9sb2FkKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFN0YWJpbGl0eUZsYWdzKGFycmF5ICRzdGFiaWxpdHlGbGFncyk6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRNaW5pbXVtU3RhYmlsaXR5KHN0cmluZyAkbWluaW11bVN0YWJpbGl0eSk6IHZvaWQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJlZmVyU3RhYmxlKGJvb2wgJHByZWZlclN0YWJsZSk6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDb25maWcoYXJyYXkgJGNvbmZpZyk6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSZWZlcmVuY2VzKGFycmF5ICRyZWZlcmVuY2VzKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFsaWFzZXMoYXJyYXkgJGFsaWFzZXMpOiB2b2lkOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U3VnZ2VzdHMoYXJyYXkgJHN1Z2dlc3RzKTogdm9pZDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRFeHRyYShhcnJheSAkZXh0cmEpOiB2b2lkOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb247Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKCgoKCmNsYXNzIFN0YWJpbGl0eUZpbHRlcgp7CgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1BhY2thZ2VBY2NlcHRhYmxlKGFycmF5ICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMsIGFycmF5ICRzdGFiaWxpdHlGbGFncywgYXJyYXkgJG5hbWVzLCBzdHJpbmcgJHN0YWJpbGl0eSk6IGJvb2wKewpmb3JlYWNoICgkbmFtZXMgYXMgJG5hbWUpIHsKCmlmIChpc3NldCgkc3RhYmlsaXR5RmxhZ3NbJG5hbWVdKSkgewppZiAoQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTWyRzdGFiaWxpdHldIDw9ICRzdGFiaWxpdHlGbGFnc1skbmFtZV0pIHsKcmV0dXJuIHRydWU7Cn0KfSBlbHNlaWYgKGlzc2V0KCRhY2NlcHRhYmxlU3RhYmlsaXRpZXNbJHN0YWJpbGl0eV0pKSB7CgpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXEFycmF5TG9hZGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxEdW1wZXJcQXJyYXlEdW1wZXI7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNlbXZlclxJbnRlcnZhbHM7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwoKCgoKCmNsYXNzIFZlcnNpb25CdW1wZXIKewoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBidW1wUmVxdWlyZW1lbnQoQ29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IHN0cmluZwp7CiRwYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwokcHJldHR5Q29uc3RyYWludCA9ICRjb25zdHJhaW50LT5nZXRQcmV0dHlTdHJpbmcoKTsKaWYgKHN0cl9zdGFydHNfd2l0aCgkY29uc3RyYWludC0+Z2V0UHJldHR5U3RyaW5nKCksICdkZXYtJykpIHsKcmV0dXJuICRwcmV0dHlDb25zdHJhaW50Owp9CgokdmVyc2lvbiA9ICRwYWNrYWdlLT5nZXRWZXJzaW9uKCk7CmlmIChzdHJfc3RhcnRzX3dpdGgoJHBhY2thZ2UtPmdldFZlcnNpb24oKSwgJ2Rldi0nKSkgewokbG9hZGVyID0gbmV3IEFycmF5TG9hZGVyKCRwYXJzZXIpOwokZHVtcGVyID0gbmV3IEFycmF5RHVtcGVyKCk7CiRleHRyYSA9ICRsb2FkZXItPmdldEJyYW5jaEFsaWFzKCRkdW1wZXItPmR1bXAoJHBhY2thZ2UpKTsKCgppZiAobnVsbCA9PT0gJGV4dHJhIHx8ICRleHRyYSA9PT0gVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVMpIHsKcmV0dXJuICRwcmV0dHlDb25zdHJhaW50Owp9CgokdmVyc2lvbiA9ICRleHRyYTsKfQoKJGludGVydmFscyA9IEludGVydmFsczo6Z2V0KCRjb25zdHJhaW50KTsKCgppZiAoXGNvdW50KCRpbnRlcnZhbHNbJ2JyYW5jaGVzJ11bJ25hbWVzJ10pID4gMCkgewpyZXR1cm4gJHByZXR0eUNvbnN0cmFpbnQ7Cn0KCiRtYWpvciA9IFByZWc6OnJlcGxhY2UoJ3teKFsxLTldWzAtOV0qfDBcLlxkKykuKn0nLCAnJDEnLCAkdmVyc2lvbik7CiR2ZXJzaW9uV2l0aG91dFN1ZmZpeCA9IFByZWc6OnJlcGxhY2UoJ3soPzpcLig/OjB8OTk5OTk5OSkpKygtZGV2KT8kfScsICcnLCAkdmVyc2lvbik7CiRuZXdQcmV0dHlDb25zdHJhaW50ID0gJ14nLiR2ZXJzaW9uV2l0aG91dFN1ZmZpeDsKCgppZiAoIVByZWc6OmlzTWF0Y2goJ3teXF5cZCsoXC5cZCspKiR9JywgJG5ld1ByZXR0eUNvbnN0cmFpbnQpKSB7CnJldHVybiAkcHJldHR5Q29uc3RyYWludDsKfQoKJHBhdHRlcm4gPSAnewogICAgICAgICAgICAoPzw9LHxcIHxcfHxeKSAjIGxlYWRpbmcgc2VwYXJhdG9yCiAgICAgICAgICAgICg/UDxjb25zdHJhaW50PgogICAgICAgICAgICAgICAgXF52PycuJG1ham9yLicoPzpcLlxkKykqICMgZS5nLiBeMi5hbnl0aGluZwogICAgICAgICAgICAgICAgfCB+dj8nLiRtYWpvci4nKD86XC5cZCspezEsM30gIyBlLmcuIH4yLjIgb3IgfjIuMi4yIG9yIH4yLjIuMi4yCiAgICAgICAgICAgICAgICB8IHY/Jy4kbWFqb3IuJyg/OlwuWyp4XSkrICMgZS5nLiAyLiogb3IgMi4qLiogb3IgMi54LngueCBldGMKICAgICAgICAgICAgICAgIHwgPj12P1xkKD86XC5cZCspKiAjIGUuZy4gPj0yIG9yID49MS4yIGV0YwogICAgICAgICAgICAgICAgfCBcKiAjIGZ1bGwgd2lsZGNhcmQKICAgICAgICAgICAgKQogICAgICAgICAgICAoPz0sfCR8XCB8XHx8QCkgIyB0cmFpbGluZyBzZXBhcmF0b3IKICAgICAgICB9eCc7CmlmIChQcmVnOjppc01hdGNoQWxsV2l0aE9mZnNldHMoJHBhdHRlcm4sICRwcmV0dHlDb25zdHJhaW50LCAkbWF0Y2hlcykpIHsKJG1vZGlmaWVkID0gJHByZXR0eUNvbnN0cmFpbnQ7CmZvcmVhY2ggKGFycmF5X3JldmVyc2UoJG1hdGNoZXNbJ2NvbnN0cmFpbnQnXSkgYXMgJG1hdGNoKSB7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoWzBdKSk7CiRzdWZmaXggPSAnJzsKaWYgKHN1YnN0cl9jb3VudCgkbWF0Y2hbMF0sICcuJykgPT09IDIgJiYgc3Vic3RyX2NvdW50KCR2ZXJzaW9uV2l0aG91dFN1ZmZpeCwgJy4nKSA9PT0gMSkgewokc3VmZml4ID0gJy4wJzsKfQppZiAoc3RyX3N0YXJ0c193aXRoKCRtYXRjaFswXSwgJ34nKSAmJiBzdWJzdHJfY291bnQoJG1hdGNoWzBdLCAnLicpICE9PSAxKSB7CgokdmVyc2lvbkJpdHMgPSBleHBsb2RlKCcuJywgJHZlcnNpb25XaXRob3V0U3VmZml4KTsKJHZlcnNpb25CaXRzID0gYXJyYXlfcGFkKCR2ZXJzaW9uQml0cywgc3Vic3RyX2NvdW50KCRtYXRjaFswXSwgJy4nKSArIDEsICcwJyk7CiRyZXBsYWNlbWVudCA9ICd+Jy5pbXBsb2RlKCcuJywgYXJyYXlfc2xpY2UoJHZlcnNpb25CaXRzLCAwLCBzdWJzdHJfY291bnQoJG1hdGNoWzBdLCAnLicpICsgMSkpOwp9IGVsc2VpZiAoJG1hdGNoWzBdID09PSAnKicgfHwgc3RyX3N0YXJ0c193aXRoKCRtYXRjaFswXSwgJz49JykpIHsKJHJlcGxhY2VtZW50ID0gJz49Jy4kdmVyc2lvbldpdGhvdXRTdWZmaXguJHN1ZmZpeDsKfSBlbHNlIHsKJHJlcGxhY2VtZW50ID0gJG5ld1ByZXR0eUNvbnN0cmFpbnQuJHN1ZmZpeDsKfQokbW9kaWZpZWQgPSBzdWJzdHJfcmVwbGFjZSgkbW9kaWZpZWQsICRyZXBsYWNlbWVudCwgJG1hdGNoWzFdLCBQbGF0Zm9ybTo6c3RybGVuKCRtYXRjaFswXSkpOwp9CgoKJG5ld0NvbnN0cmFpbnQgPSAkcGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCRtb2RpZmllZCk7CmlmIChJbnRlcnZhbHM6OmlzU3Vic2V0T2YoJG5ld0NvbnN0cmFpbnQsICRjb25zdHJhaW50KSAmJiBJbnRlcnZhbHM6OmlzU3Vic2V0T2YoJGNvbnN0cmFpbnQsICRuZXdDb25zdHJhaW50KSkgewpyZXR1cm4gJHByZXR0eUNvbnN0cmFpbnQ7Cn0KCnJldHVybiAkbW9kaWZpZWQ7Cn0KCnJldHVybiAkcHJldHR5Q29uc3RyYWludDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb247Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFZjc1xIZ0RyaXZlcjsKdXNlIENvbXBvc2VyXElPXE51bGxJTzsKdXNlIENvbXBvc2VyXFNlbXZlclxWZXJzaW9uUGFyc2VyIGFzIFNlbXZlclZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxVdGlsXEdpdCBhcyBHaXRVdGlsOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwRG93bmxvYWRlcjsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcU3ZuIGFzIFN2blV0aWw7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFByb2Nlc3M7CgoKCgoKCgoKCmNsYXNzIFZlcnNpb25HdWVzc2VyCnsKCgoKcHJpdmF0ZSAkY29uZmlnOwoKCgoKcHJpdmF0ZSAkcHJvY2VzczsKCgoKCnByaXZhdGUgJHZlcnNpb25QYXJzZXI7CgoKCgpwcml2YXRlICRpbzsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChDb25maWcgJGNvbmZpZywgUHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzLCBTZW12ZXJWZXJzaW9uUGFyc2VyICR2ZXJzaW9uUGFyc2VyLCA/SU9JbnRlcmZhY2UgJGlvID0gbnVsbCkKewokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKJHRoaXMtPnByb2Nlc3MgPSAkcHJvY2VzczsKJHRoaXMtPnZlcnNpb25QYXJzZXIgPSAkdmVyc2lvblBhcnNlcjsKJHRoaXMtPmlvID0gJGlvOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ3Vlc3NWZXJzaW9uKGFycmF5ICRwYWNrYWdlQ29uZmlnLCBzdHJpbmcgJHBhdGgpOiA/YXJyYXkKewppZiAoIWZ1bmN0aW9uX2V4aXN0cygncHJvY19vcGVuJykpIHsKcmV0dXJuIG51bGw7Cn0KCgoKaWYgKFBsYXRmb3JtOjppc0lucHV0Q29tcGxldGlvblByb2Nlc3MoKSkgewpyZXR1cm4gbnVsbDsKfQoKJHZlcnNpb25EYXRhID0gJHRoaXMtPmd1ZXNzR2l0VmVyc2lvbigkcGFja2FnZUNvbmZpZywgJHBhdGgpOwppZiAobnVsbCAhPT0gJHZlcnNpb25EYXRhWyd2ZXJzaW9uJ10pIHsKcmV0dXJuICR0aGlzLT5wb3N0cHJvY2VzcygkdmVyc2lvbkRhdGEpOwp9CgokdmVyc2lvbkRhdGEgPSAkdGhpcy0+Z3Vlc3NIZ1ZlcnNpb24oJHBhY2thZ2VDb25maWcsICRwYXRoKTsKaWYgKG51bGwgIT09ICR2ZXJzaW9uRGF0YSAmJiBudWxsICE9PSAkdmVyc2lvbkRhdGFbJ3ZlcnNpb24nXSkgewpyZXR1cm4gJHRoaXMtPnBvc3Rwcm9jZXNzKCR2ZXJzaW9uRGF0YSk7Cn0KCiR2ZXJzaW9uRGF0YSA9ICR0aGlzLT5ndWVzc0Zvc3NpbFZlcnNpb24oJHBhdGgpOwppZiAobnVsbCAhPT0gJHZlcnNpb25EYXRhWyd2ZXJzaW9uJ10pIHsKcmV0dXJuICR0aGlzLT5wb3N0cHJvY2VzcygkdmVyc2lvbkRhdGEpOwp9CgokdmVyc2lvbkRhdGEgPSAkdGhpcy0+Z3Vlc3NTdm5WZXJzaW9uKCRwYWNrYWdlQ29uZmlnLCAkcGF0aCk7CmlmIChudWxsICE9PSAkdmVyc2lvbkRhdGEgJiYgbnVsbCAhPT0gJHZlcnNpb25EYXRhWyd2ZXJzaW9uJ10pIHsKcmV0dXJuICR0aGlzLT5wb3N0cHJvY2VzcygkdmVyc2lvbkRhdGEpOwp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHBvc3Rwcm9jZXNzKGFycmF5ICR2ZXJzaW9uRGF0YSk6IGFycmF5CnsKaWYgKCFlbXB0eSgkdmVyc2lvbkRhdGFbJ2ZlYXR1cmVfdmVyc2lvbiddKSAmJiAkdmVyc2lvbkRhdGFbJ2ZlYXR1cmVfdmVyc2lvbiddID09PSAkdmVyc2lvbkRhdGFbJ3ZlcnNpb24nXSAmJiAkdmVyc2lvbkRhdGFbJ2ZlYXR1cmVfcHJldHR5X3ZlcnNpb24nXSA9PT0gJHZlcnNpb25EYXRhWydwcmV0dHlfdmVyc2lvbiddKSB7CnVuc2V0KCR2ZXJzaW9uRGF0YVsnZmVhdHVyZV92ZXJzaW9uJ10sICR2ZXJzaW9uRGF0YVsnZmVhdHVyZV9wcmV0dHlfdmVyc2lvbiddKTsKfQoKaWYgKCctZGV2JyA9PT0gc3Vic3RyKCR2ZXJzaW9uRGF0YVsndmVyc2lvbiddLCAtNCkgJiYgUHJlZzo6aXNNYXRjaCgne1wuOXs3fX0nLCAkdmVyc2lvbkRhdGFbJ3ZlcnNpb24nXSkpIHsKJHZlcnNpb25EYXRhWydwcmV0dHlfdmVyc2lvbiddID0gUHJlZzo6cmVwbGFjZSgneyhcLjl7N30pK30nLCAnLngnLCAkdmVyc2lvbkRhdGFbJ3ZlcnNpb24nXSk7Cn0KCmlmICghZW1wdHkoJHZlcnNpb25EYXRhWydmZWF0dXJlX3ZlcnNpb24nXSkgJiYgJy1kZXYnID09PSBzdWJzdHIoJHZlcnNpb25EYXRhWydmZWF0dXJlX3ZlcnNpb24nXSwgLTQpICYmIFByZWc6OmlzTWF0Y2goJ3tcLjl7N319JywgJHZlcnNpb25EYXRhWydmZWF0dXJlX3ZlcnNpb24nXSkpIHsKJHZlcnNpb25EYXRhWydmZWF0dXJlX3ByZXR0eV92ZXJzaW9uJ10gPSBQcmVnOjpyZXBsYWNlKCd7KFwuOXs3fSkrfScsICcueCcsICR2ZXJzaW9uRGF0YVsnZmVhdHVyZV92ZXJzaW9uJ10pOwp9CgpyZXR1cm4gJHZlcnNpb25EYXRhOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ3Vlc3NHaXRWZXJzaW9uKGFycmF5ICRwYWNrYWdlQ29uZmlnLCBzdHJpbmcgJHBhdGgpOiBhcnJheQp7CkdpdFV0aWw6OmNsZWFuRW52KCR0aGlzLT5wcm9jZXNzKTsKJGNvbW1pdCA9IG51bGw7CiR2ZXJzaW9uID0gbnVsbDsKJHByZXR0eVZlcnNpb24gPSBudWxsOwokZmVhdHVyZVZlcnNpb24gPSBudWxsOwokZmVhdHVyZVByZXR0eVZlcnNpb24gPSBudWxsOwokaXNEZXRhY2hlZCA9IGZhbHNlOwoKCmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdicmFuY2gnLCAnLWEnLCAnLS1uby1jb2xvcicsICctLW5vLWFiYnJldicsICctdiddLCAkb3V0cHV0LCAkcGF0aCkpIHsKJGJyYW5jaGVzID0gW107CiRpc0ZlYXR1cmVCcmFuY2ggPSBmYWxzZTsKCgpmb3JlYWNoICgkdGhpcy0+cHJvY2Vzcy0+c3BsaXRMaW5lcygkb3V0cHV0KSBhcyAkYnJhbmNoKSB7CmlmICgkYnJhbmNoICYmIFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teKD86XCogKSAqKFwobm8gYnJhbmNoXCl8XChkZXRhY2hlZCBmcm9tIFxTK1wpfFwoSEVBRCBkZXRhY2hlZCBhdCBcUytcKXxcUyspICooW2EtZjAtOV0rKSAuKiR9JywgJGJyYW5jaCwgJG1hdGNoKSkgewppZiAoCiRtYXRjaFsxXSA9PT0gJyhubyBicmFuY2gpJwp8fCBzdHJwb3MoJG1hdGNoWzFdLCAnKGRldGFjaGVkICcpID09PSAwCnx8IHN0cnBvcygkbWF0Y2hbMV0sICcoSEVBRCBkZXRhY2hlZCBhdCcpID09PSAwCikgewokdmVyc2lvbiA9ICdkZXYtJyAuICRtYXRjaFsyXTsKJHByZXR0eVZlcnNpb24gPSAkdmVyc2lvbjsKJGlzRmVhdHVyZUJyYW5jaCA9IHRydWU7CiRpc0RldGFjaGVkID0gdHJ1ZTsKfSBlbHNlIHsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplQnJhbmNoKCRtYXRjaFsxXSk7CiRwcmV0dHlWZXJzaW9uID0gJ2Rldi0nIC4gJG1hdGNoWzFdOwokaXNGZWF0dXJlQnJhbmNoID0gJHRoaXMtPmlzRmVhdHVyZUJyYW5jaCgkcGFja2FnZUNvbmZpZywgJG1hdGNoWzFdKTsKfQoKJGNvbW1pdCA9ICRtYXRjaFsyXTsKfQoKaWYgKCRicmFuY2ggJiYgIVByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teICouKy9IRUFEIH0nLCAkYnJhbmNoKSkgewppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14oPzpcKiApPyAqKCg/OnJlbW90ZXMvKD86b3JpZ2lufHVwc3RyZWFtKS8pP1teXHMvXSspICooW2EtZjAtOV0rKSAuKiR9JywgJGJyYW5jaCwgJG1hdGNoKSkgewokYnJhbmNoZXNbXSA9ICRtYXRjaFsxXTsKfQp9Cn0KCmlmICgkaXNGZWF0dXJlQnJhbmNoKSB7CiRmZWF0dXJlVmVyc2lvbiA9ICR2ZXJzaW9uOwokZmVhdHVyZVByZXR0eVZlcnNpb24gPSAkcHJldHR5VmVyc2lvbjsKCgokcmVzdWx0ID0gJHRoaXMtPmd1ZXNzRmVhdHVyZVZlcnNpb24oJHBhY2thZ2VDb25maWcsICR2ZXJzaW9uLCAkYnJhbmNoZXMsIFsnZ2l0JywgJ3Jldi1saXN0JywgJyVjYW5kaWRhdGUlLi4lYnJhbmNoJSddLCAkcGF0aCk7CiR2ZXJzaW9uID0gJHJlc3VsdFsndmVyc2lvbiddOwokcHJldHR5VmVyc2lvbiA9ICRyZXN1bHRbJ3ByZXR0eV92ZXJzaW9uJ107Cn0KfQpHaXRVdGlsOjpjaGVja0ZvclJlcG9Pd25lcnNoaXBFcnJvcigkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSwgJHBhdGgsICR0aGlzLT5pbyk7CgppZiAoISR2ZXJzaW9uIHx8ICRpc0RldGFjaGVkKSB7CiRyZXN1bHQgPSAkdGhpcy0+dmVyc2lvbkZyb21HaXRUYWdzKCRwYXRoKTsKaWYgKCRyZXN1bHQpIHsKJHZlcnNpb24gPSAkcmVzdWx0Wyd2ZXJzaW9uJ107CiRwcmV0dHlWZXJzaW9uID0gJHJlc3VsdFsncHJldHR5X3ZlcnNpb24nXTsKJGZlYXR1cmVWZXJzaW9uID0gbnVsbDsKJGZlYXR1cmVQcmV0dHlWZXJzaW9uID0gbnVsbDsKfQp9CgppZiAobnVsbCA9PT0gJGNvbW1pdCkgewokY29tbWFuZCA9IEdpdFV0aWw6OmJ1aWxkUmV2TGlzdENvbW1hbmQoJHRoaXMtPnByb2Nlc3MsIGFycmF5X21lcmdlKFsnLS1mb3JtYXQ9JUgnLCAnLW4xJywgJ0hFQUQnXSwgR2l0VXRpbDo6Z2V0Tm9TaG93U2lnbmF0dXJlRmxhZ3MoJHRoaXMtPnByb2Nlc3MpKSk7CmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY29tbWFuZCwgJG91dHB1dCwgJHBhdGgpKSB7CiRjb21taXQgPSB0cmltKEdpdFV0aWw6OnBhcnNlUmV2TGlzdE91dHB1dCgkb3V0cHV0LCAkdGhpcy0+cHJvY2VzcykpID86IG51bGw7Cn0KfQoKaWYgKCRmZWF0dXJlVmVyc2lvbikgewpyZXR1cm4gWyd2ZXJzaW9uJyA9PiAkdmVyc2lvbiwgJ2NvbW1pdCcgPT4gJGNvbW1pdCwgJ3ByZXR0eV92ZXJzaW9uJyA9PiAkcHJldHR5VmVyc2lvbiwgJ2ZlYXR1cmVfdmVyc2lvbicgPT4gJGZlYXR1cmVWZXJzaW9uLCAnZmVhdHVyZV9wcmV0dHlfdmVyc2lvbicgPT4gJGZlYXR1cmVQcmV0dHlWZXJzaW9uXTsKfQoKcmV0dXJuIFsndmVyc2lvbicgPT4gJHZlcnNpb24sICdjb21taXQnID0+ICRjb21taXQsICdwcmV0dHlfdmVyc2lvbicgPT4gJHByZXR0eVZlcnNpb25dOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHZlcnNpb25Gcm9tR2l0VGFncyhzdHJpbmcgJHBhdGgpOiA/YXJyYXkKewoKaWYgKDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ2Rlc2NyaWJlJywgJy0tZXhhY3QtbWF0Y2gnLCAnLS10YWdzJ10sICRvdXRwdXQsICRwYXRoKSkgewp0cnkgewokdmVyc2lvbiA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUodHJpbSgkb3V0cHV0KSk7CgpyZXR1cm4gWyd2ZXJzaW9uJyA9PiAkdmVyc2lvbiwgJ3ByZXR0eV92ZXJzaW9uJyA9PiB0cmltKCRvdXRwdXQpXTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewp9Cn0KCnJldHVybiBudWxsOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ3Vlc3NIZ1ZlcnNpb24oYXJyYXkgJHBhY2thZ2VDb25maWcsIHN0cmluZyAkcGF0aCk6ID9hcnJheQp7CgppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydoZycsICdicmFuY2gnXSwgJG91dHB1dCwgJHBhdGgpKSB7CiRicmFuY2ggPSB0cmltKCRvdXRwdXQpOwokdmVyc2lvbiA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemVCcmFuY2goJGJyYW5jaCk7CiRpc0ZlYXR1cmVCcmFuY2ggPSAwID09PSBzdHJwb3MoJHZlcnNpb24sICdkZXYtJyk7CgppZiAoVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVMgPT09ICR2ZXJzaW9uKSB7CnJldHVybiBbJ3ZlcnNpb24nID0+ICR2ZXJzaW9uLCAnY29tbWl0JyA9PiBudWxsLCAncHJldHR5X3ZlcnNpb24nID0+ICdkZXYtJy4kYnJhbmNoXTsKfQoKaWYgKCEkaXNGZWF0dXJlQnJhbmNoKSB7CnJldHVybiBbJ3ZlcnNpb24nID0+ICR2ZXJzaW9uLCAnY29tbWl0JyA9PiBudWxsLCAncHJldHR5X3ZlcnNpb24nID0+ICR2ZXJzaW9uXTsKfQoKCiRpbyA9IG5ldyBOdWxsSU8oKTsKJGRyaXZlciA9IG5ldyBIZ0RyaXZlcihbJ3VybCcgPT4gJHBhdGhdLCAkaW8sICR0aGlzLT5jb25maWcsIG5ldyBIdHRwRG93bmxvYWRlcigkaW8sICR0aGlzLT5jb25maWcpLCAkdGhpcy0+cHJvY2Vzcyk7CiRicmFuY2hlcyA9IGFycmF5X21hcCgnc3RydmFsJywgYXJyYXlfa2V5cygkZHJpdmVyLT5nZXRCcmFuY2hlcygpKSk7CgoKJHJlc3VsdCA9ICR0aGlzLT5ndWVzc0ZlYXR1cmVWZXJzaW9uKCRwYWNrYWdlQ29uZmlnLCAkdmVyc2lvbiwgJGJyYW5jaGVzLCBbJ2hnJywgJ2xvZycsICctcicsICdub3QgYW5jZXN0b3JzKFwnJWNhbmRpZGF0ZSVcJykgYW5kIGFuY2VzdG9ycyhcJyVicmFuY2glXCcpJywgJy0tdGVtcGxhdGUnLCAnIntub2RlfVxcbiInXSwgJHBhdGgpOwokcmVzdWx0Wydjb21taXQnXSA9ICcnOwokcmVzdWx0WydmZWF0dXJlX3ZlcnNpb24nXSA9ICR2ZXJzaW9uOwokcmVzdWx0WydmZWF0dXJlX3ByZXR0eV92ZXJzaW9uJ10gPSAkdmVyc2lvbjsKCnJldHVybiAkcmVzdWx0Owp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ3Vlc3NGZWF0dXJlVmVyc2lvbihhcnJheSAkcGFja2FnZUNvbmZpZywgP3N0cmluZyAkdmVyc2lvbiwgYXJyYXkgJGJyYW5jaGVzLCBhcnJheSAkc2NtQ21kbGluZSwgc3RyaW5nICRwYXRoKTogYXJyYXkKewokcHJldHR5VmVyc2lvbiA9ICR2ZXJzaW9uOwoKCgppZiAoIWlzc2V0KCRwYWNrYWdlQ29uZmlnWydleHRyYSddWydicmFuY2gtYWxpYXMnXVskdmVyc2lvbl0pCnx8IHN0cnBvcyhqc29uX2VuY29kZSgkcGFja2FnZUNvbmZpZyksICcic2VsZi52ZXJzaW9uIicpCikgewokYnJhbmNoID0gUHJlZzo6cmVwbGFjZSgne15kZXYtfScsICcnLCAkdmVyc2lvbik7CiRsZW5ndGggPSBQSFBfSU5UX01BWDsKCgppZiAoISR0aGlzLT5pc0ZlYXR1cmVCcmFuY2goJHBhY2thZ2VDb25maWcsICRicmFuY2gpKSB7CnJldHVybiBbJ3ZlcnNpb24nID0+ICR2ZXJzaW9uLCAncHJldHR5X3ZlcnNpb24nID0+ICRwcmV0dHlWZXJzaW9uXTsKfQoKCgoKdXNvcnQoJGJyYW5jaGVzLCBzdGF0aWMgZnVuY3Rpb24gKCRhLCAkYik6IGludCB7CiRhUmVtb3RlID0gMCA9PT0gc3RycG9zKCRhLCAncmVtb3Rlcy8nKTsKJGJSZW1vdGUgPSAwID09PSBzdHJwb3MoJGIsICdyZW1vdGVzLycpOwoKaWYgKCRhUmVtb3RlICE9PSAkYlJlbW90ZSkgewpyZXR1cm4gJGFSZW1vdGUgPyAxIDogLTE7Cn0KCnJldHVybiBzdHJuYXRjYXNlY21wKCRiLCAkYSk7Cn0pOwoKJHByb21pc2VzID0gW107CiR0aGlzLT5wcm9jZXNzLT5zZXRNYXhKb2JzKDMwKTsKdHJ5IHsKJGxhc3RJbmRleCA9IC0xOwpmb3JlYWNoICgkYnJhbmNoZXMgYXMgJGluZGV4ID0+ICRjYW5kaWRhdGUpIHsKJGNhbmRpZGF0ZVZlcnNpb24gPSBQcmVnOjpyZXBsYWNlKCd7XnJlbW90ZXMvXFMrL30nLCAnJywgJGNhbmRpZGF0ZSk7CgoKaWYgKCRjYW5kaWRhdGUgPT09ICRicmFuY2ggfHwgJHRoaXMtPmlzRmVhdHVyZUJyYW5jaCgkcGFja2FnZUNvbmZpZywgJGNhbmRpZGF0ZVZlcnNpb24pKSB7CmNvbnRpbnVlOwp9CgokY21kTGluZSA9IGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKHN0cmluZyAkY29tcG9uZW50KSB1c2UgKCRjYW5kaWRhdGUsICRicmFuY2gpIHsKcmV0dXJuIHN0cl9yZXBsYWNlKFsnJWNhbmRpZGF0ZSUnLCAnJWJyYW5jaCUnXSwgWyRjYW5kaWRhdGUsICRicmFuY2hdLCAkY29tcG9uZW50KTsKfSwgJHNjbUNtZGxpbmUpOwokcHJvbWlzZXNbXSA9ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlQXN5bmMoJGNtZExpbmUsICRwYXRoKS0+dGhlbihmdW5jdGlvbiAoUHJvY2VzcyAkcHJvY2VzcykgdXNlICgmJGxhc3RJbmRleCwgJGluZGV4LCAmJGxlbmd0aCwgJiR2ZXJzaW9uLCAmJHByZXR0eVZlcnNpb24sICRjYW5kaWRhdGVWZXJzaW9uLCAmJHByb21pc2VzKTogdm9pZCB7CmlmICghJHByb2Nlc3MtPmlzU3VjY2Vzc2Z1bCgpKSB7CnJldHVybjsKfQoKJG91dHB1dCA9ICRwcm9jZXNzLT5nZXRPdXRwdXQoKTsKCgoKaWYgKHN0cmxlbigkb3V0cHV0KSA8ICRsZW5ndGggfHwgKHN0cmxlbigkb3V0cHV0KSA9PT0gJGxlbmd0aCAmJiAkbGFzdEluZGV4IDwgJGluZGV4KSkgewokbGFzdEluZGV4ID0gJGluZGV4OwokbGVuZ3RoID0gc3RybGVuKCRvdXRwdXQpOwokdmVyc2lvbiA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemVCcmFuY2goJGNhbmRpZGF0ZVZlcnNpb24pOwokcHJldHR5VmVyc2lvbiA9ICdkZXYtJyAuICRjYW5kaWRhdGVWZXJzaW9uOwppZiAoJGxlbmd0aCA9PT0gMCkgewpmb3JlYWNoICgkcHJvbWlzZXMgYXMgJHByb21pc2UpIHsKClxSZWFjdFxQcm9taXNlXHJlc29sdmUoJHByb21pc2UpLT5jYW5jZWwoKTsKfQp9Cn0KfSk7Cn0KCiR0aGlzLT5wcm9jZXNzLT53YWl0KCk7Cn0gZmluYWxseSB7CiR0aGlzLT5wcm9jZXNzLT5yZXNldE1heEpvYnMoKTsKfQp9CgpyZXR1cm4gWyd2ZXJzaW9uJyA9PiAkdmVyc2lvbiwgJ3ByZXR0eV92ZXJzaW9uJyA9PiAkcHJldHR5VmVyc2lvbl07Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gaXNGZWF0dXJlQnJhbmNoKGFycmF5ICRwYWNrYWdlQ29uZmlnLCA/c3RyaW5nICRicmFuY2hOYW1lKTogYm9vbAp7CiRub25GZWF0dXJlQnJhbmNoZXMgPSAnJzsKaWYgKCFlbXB0eSgkcGFja2FnZUNvbmZpZ1snbm9uLWZlYXR1cmUtYnJhbmNoZXMnXSkpIHsKJG5vbkZlYXR1cmVCcmFuY2hlcyA9IGltcGxvZGUoJ3wnLCAkcGFja2FnZUNvbmZpZ1snbm9uLWZlYXR1cmUtYnJhbmNoZXMnXSk7Cn0KCnJldHVybiAhUHJlZzo6aXNNYXRjaCgne14oJyAuICRub25GZWF0dXJlQnJhbmNoZXMgLiAnfG1hc3RlcnxtYWlufGxhdGVzdHxuZXh0fGN1cnJlbnR8c3VwcG9ydHx0aXB8dHJ1bmt8ZGVmYXVsdHxkZXZlbG9wfFxkK1wuLispJH0nLCAkYnJhbmNoTmFtZSwgJG1hdGNoKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBndWVzc0Zvc3NpbFZlcnNpb24oc3RyaW5nICRwYXRoKTogYXJyYXkKewokdmVyc2lvbiA9IG51bGw7CiRwcmV0dHlWZXJzaW9uID0gbnVsbDsKCgppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydmb3NzaWwnLCAnYnJhbmNoJywgJ2xpc3QnXSwgJG91dHB1dCwgJHBhdGgpKSB7CiRicmFuY2ggPSB0cmltKCRvdXRwdXQpOwokdmVyc2lvbiA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemVCcmFuY2goJGJyYW5jaCk7CiRwcmV0dHlWZXJzaW9uID0gJ2Rldi0nIC4gJGJyYW5jaDsKfQoKCmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2Zvc3NpbCcsICd0YWcnLCAnbGlzdCddLCAkb3V0cHV0LCAkcGF0aCkpIHsKdHJ5IHsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKHRyaW0oJG91dHB1dCkpOwokcHJldHR5VmVyc2lvbiA9IHRyaW0oJG91dHB1dCk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKfQp9CgpyZXR1cm4gWyd2ZXJzaW9uJyA9PiAkdmVyc2lvbiwgJ2NvbW1pdCcgPT4gJycsICdwcmV0dHlfdmVyc2lvbicgPT4gJHByZXR0eVZlcnNpb25dOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ3Vlc3NTdm5WZXJzaW9uKGFycmF5ICRwYWNrYWdlQ29uZmlnLCBzdHJpbmcgJHBhdGgpOiA/YXJyYXkKewpTdm5VdGlsOjpjbGVhbkVudigpOwoKCmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ3N2bicsICdpbmZvJywgJy0teG1sJ10sICRvdXRwdXQsICRwYXRoKSkgewokdHJ1bmtQYXRoID0gaXNzZXQoJHBhY2thZ2VDb25maWdbJ3RydW5rLXBhdGgnXSkgPyBwcmVnX3F1b3RlKCRwYWNrYWdlQ29uZmlnWyd0cnVuay1wYXRoJ10sICcjJykgOiAndHJ1bmsnOwokYnJhbmNoZXNQYXRoID0gaXNzZXQoJHBhY2thZ2VDb25maWdbJ2JyYW5jaGVzLXBhdGgnXSkgPyBwcmVnX3F1b3RlKCRwYWNrYWdlQ29uZmlnWydicmFuY2hlcy1wYXRoJ10sICcjJykgOiAnYnJhbmNoZXMnOwokdGFnc1BhdGggPSBpc3NldCgkcGFja2FnZUNvbmZpZ1sndGFncy1wYXRoJ10pID8gcHJlZ19xdW90ZSgkcGFja2FnZUNvbmZpZ1sndGFncy1wYXRoJ10sICcjJykgOiAndGFncyc7CgokdXJsUGF0dGVybiA9ICcjPHVybD4uKi8oJyAuICR0cnVua1BhdGggLiAnfCgnIC4gJGJyYW5jaGVzUGF0aCAuICd8JyAuICR0YWdzUGF0aCAuICcpLyguKikpPC91cmw+Iyc7CgppZiAoUHJlZzo6aXNNYXRjaCgkdXJsUGF0dGVybiwgJG91dHB1dCwgJG1hdGNoZXMpKSB7CmlmIChpc3NldCgkbWF0Y2hlc1syXSwgJG1hdGNoZXNbM10pICYmICgkYnJhbmNoZXNQYXRoID09PSAkbWF0Y2hlc1syXSB8fCAkdGFnc1BhdGggPT09ICRtYXRjaGVzWzJdKSkgewoKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplQnJhbmNoKCRtYXRjaGVzWzNdKTsKJHByZXR0eVZlcnNpb24gPSAnZGV2LScgLiAkbWF0Y2hlc1szXTsKCnJldHVybiBbJ3ZlcnNpb24nID0+ICR2ZXJzaW9uLCAnY29tbWl0JyA9PiAnJywgJ3ByZXR0eV92ZXJzaW9uJyA9PiAkcHJldHR5VmVyc2lvbl07Cn0KCmFzc2VydChpc19zdHJpbmcoJG1hdGNoZXNbMV0pKTsKJHByZXR0eVZlcnNpb24gPSB0cmltKCRtYXRjaGVzWzFdKTsKaWYgKCRwcmV0dHlWZXJzaW9uID09PSAndHJ1bmsnKSB7CiR2ZXJzaW9uID0gJ2Rldi10cnVuayc7Cn0gZWxzZSB7CiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkcHJldHR5VmVyc2lvbik7Cn0KCnJldHVybiBbJ3ZlcnNpb24nID0+ICR2ZXJzaW9uLCAnY29tbWl0JyA9PiAnJywgJ3ByZXR0eV92ZXJzaW9uJyA9PiAkcHJldHR5VmVyc2lvbl07Cn0KfQoKcmV0dXJuIG51bGw7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSb290VmVyc2lvbkZyb21FbnYoKTogc3RyaW5nCnsKJHZlcnNpb24gPSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9ST09UX1ZFUlNJT04nKTsKaWYgKCFpc19zdHJpbmcoJHZlcnNpb24pIHx8ICR2ZXJzaW9uID09PSAnJykgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NPTVBPU0VSX1JPT1RfVkVSU0lPTiBub3Qgc2V0IG9yIGVtcHR5Jyk7Cn0KaWYgKFByZWc6OmlzTWF0Y2goJ3teKFxkKyg/OlwuXGQrKSopLWRldiR9aScsICR2ZXJzaW9uLCAkbWF0Y2gpKSB7CiR2ZXJzaW9uID0gJG1hdGNoWzFdLicueC1kZXYnOwp9CgpyZXR1cm4gJHZlcnNpb247Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcU2VtdmVyXFZlcnNpb25QYXJzZXIgYXMgU2VtdmVyVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFNlbXZlclxTZW12ZXI7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50SW50ZXJmYWNlOwoKY2xhc3MgVmVyc2lvblBhcnNlciBleHRlbmRzIFNlbXZlclZlcnNpb25QYXJzZXIKewpwdWJsaWMgY29uc3QgREVGQVVMVF9CUkFOQ0hfQUxJQVMgPSAnOTk5OTk5OS1kZXYnOwoKCnByaXZhdGUgc3RhdGljICRjb25zdHJhaW50cyA9IFtdOwoKCgoKcHVibGljIGZ1bmN0aW9uIHBhcnNlQ29uc3RyYWludHMoJGNvbnN0cmFpbnRzKTogQ29uc3RyYWludEludGVyZmFjZQp7CmlmICghaXNzZXQoc2VsZjo6JGNvbnN0cmFpbnRzWyRjb25zdHJhaW50c10pKSB7CnNlbGY6OiRjb25zdHJhaW50c1skY29uc3RyYWludHNdID0gcGFyZW50OjpwYXJzZUNvbnN0cmFpbnRzKCRjb25zdHJhaW50cyk7Cn0KCnJldHVybiBzZWxmOjokY29uc3RyYWludHNbJGNvbnN0cmFpbnRzXTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwYXJzZU5hbWVWZXJzaW9uUGFpcnMoYXJyYXkgJHBhaXJzKTogYXJyYXkKewokcGFpcnMgPSBhcnJheV92YWx1ZXMoJHBhaXJzKTsKJHJlc3VsdCA9IFtdOwoKZm9yICgkaSA9IDAsICRjb3VudCA9IGNvdW50KCRwYWlycyk7ICRpIDwgJGNvdW50OyAkaSsrKSB7CiRwYWlyID0gUHJlZzo6cmVwbGFjZSgne14oW149OiBdKylbPTogXSguKikkfScsICckMSAkMicsIHRyaW0oJHBhaXJzWyRpXSkpOwppZiAoZmFsc2UgPT09IHN0cnBvcygkcGFpciwgJyAnKSAmJiBpc3NldCgkcGFpcnNbJGkgKyAxXSkgJiYgZmFsc2UgPT09IHN0cnBvcygkcGFpcnNbJGkgKyAxXSwgJy8nKSAmJiAhUHJlZzo6aXNNYXRjaCgneyg/PD1bYS16MC05Xy8tXSlcKnxcKig/PVthLXowLTlfLy1dKX1pJywgJHBhaXJzWyRpICsgMV0pICYmICFQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRwYWlyc1skaSArIDFdKSkgewokcGFpciAuPSAnICcuJHBhaXJzWyRpICsgMV07CiRpKys7Cn0KCmlmIChzdHJwb3MoJHBhaXIsICcgJykpIHsKWyRuYW1lLCAkdmVyc2lvbl0gPSBleHBsb2RlKCcgJywgJHBhaXIsIDIpOwokcmVzdWx0W10gPSBbJ25hbWUnID0+ICRuYW1lLCAndmVyc2lvbicgPT4gJHZlcnNpb25dOwp9IGVsc2UgewokcmVzdWx0W10gPSBbJ25hbWUnID0+ICRwYWlyXTsKfQp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1VwZ3JhZGUoc3RyaW5nICRub3JtYWxpemVkRnJvbSwgc3RyaW5nICRub3JtYWxpemVkVG8pOiBib29sCnsKaWYgKCRub3JtYWxpemVkRnJvbSA9PT0gJG5vcm1hbGl6ZWRUbykgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKGluX2FycmF5KCRub3JtYWxpemVkRnJvbSwgWydkZXYtbWFzdGVyJywgJ2Rldi10cnVuaycsICdkZXYtZGVmYXVsdCddLCB0cnVlKSkgewokbm9ybWFsaXplZEZyb20gPSBWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBUzsKfQppZiAoaW5fYXJyYXkoJG5vcm1hbGl6ZWRUbywgWydkZXYtbWFzdGVyJywgJ2Rldi10cnVuaycsICdkZXYtZGVmYXVsdCddLCB0cnVlKSkgewokbm9ybWFsaXplZFRvID0gVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVM7Cn0KCmlmIChzdHJwb3MoJG5vcm1hbGl6ZWRGcm9tLCAnZGV2LScpID09PSAwIHx8IHN0cnBvcygkbm9ybWFsaXplZFRvLCAnZGV2LScpID09PSAwKSB7CnJldHVybiB0cnVlOwp9Cgokc29ydGVkID0gU2VtdmVyOjpzb3J0KFskbm9ybWFsaXplZFRvLCAkbm9ybWFsaXplZEZyb21dKTsKCnJldHVybiAkc29ydGVkWzBdID09PSAkbm9ybWFsaXplZEZyb207Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uOwoKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXElnbm9yZUFsbFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXI7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxJZ25vcmVMaXN0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcjsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5Owp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxBcnJheUxvYWRlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcRHVtcGVyXEFycmF5RHVtcGVyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5U2V0Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKCgoKCgoKCmNsYXNzIFZlcnNpb25TZWxlY3Rvcgp7Cgpwcml2YXRlICRyZXBvc2l0b3J5U2V0OwoKCnByaXZhdGUgJHBsYXRmb3JtQ29uc3RyYWludHMgPSBbXTsKCgpwcml2YXRlICRwYXJzZXI7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUmVwb3NpdG9yeVNldCAkcmVwb3NpdG9yeVNldCwgP1BsYXRmb3JtUmVwb3NpdG9yeSAkcGxhdGZvcm1SZXBvID0gbnVsbCkKewokdGhpcy0+cmVwb3NpdG9yeVNldCA9ICRyZXBvc2l0b3J5U2V0OwppZiAoJHBsYXRmb3JtUmVwbykgewpmb3JlYWNoICgkcGxhdGZvcm1SZXBvLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiR0aGlzLT5wbGF0Zm9ybUNvbnN0cmFpbnRzWyRwYWNrYWdlLT5nZXROYW1lKCldW10gPSBuZXcgQ29uc3RyYWludCgnPT0nLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKTsKfQp9Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kQmVzdENhbmRpZGF0ZShzdHJpbmcgJHBhY2thZ2VOYW1lLCA/c3RyaW5nICR0YXJnZXRQYWNrYWdlVmVyc2lvbiA9IG51bGwsIHN0cmluZyAkcHJlZmVycmVkU3RhYmlsaXR5ID0gJ3N0YWJsZScsICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyID0gbnVsbCwgaW50ICRyZXBvU2V0RmxhZ3MgPSAwLCA/SU9JbnRlcmZhY2UgJGlvID0gbnVsbCwgJHNob3dXYXJuaW5ncyA9IHRydWUpCnsKaWYgKCFpc3NldChCYXNlUGFja2FnZTo6U1RBQklMSVRJRVNbJHByZWZlcnJlZFN0YWJpbGl0eV0pKSB7Cgp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignRXhwZWN0ZWQgYSB2YWxpZCBzdGFiaWxpdHkgbmFtZSBhcyAzcmQgYXJndW1lbnQsIGdvdCAnLiRwcmVmZXJyZWRTdGFiaWxpdHkpOwp9CgppZiAobnVsbCA9PT0gJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpIHsKJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgPSBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTo6aWdub3JlTm90aGluZygpOwp9IGVsc2VpZiAoISgkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciBpbnN0YW5jZW9mIFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UpKSB7CnRyaWdnZXJfZXJyb3IoJ1ZlcnNpb25TZWxlY3Rvcjo6ZmluZEJlc3RDYW5kaWRhdGUgd2l0aCBpZ25vcmVkIHBsYXRmb3JtIHJlcXMgYXMgYm9vbHxhcnJheSBpcyBkZXByZWNhdGVkIHNpbmNlIENvbXBvc2VyIDIuMiwgdXNlIGFuIGluc3RhbmNlIG9mIFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UgaW5zdGVhZC4nLCBFX1VTRVJfREVQUkVDQVRFRCk7CiRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyID0gUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk6OmZyb21Cb29sT3JMaXN0KCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKTsKfQoKJGNvbnN0cmFpbnQgPSAkdGFyZ2V0UGFja2FnZVZlcnNpb24gPyAkdGhpcy0+Z2V0UGFyc2VyKCktPnBhcnNlQ29uc3RyYWludHMoJHRhcmdldFBhY2thZ2VWZXJzaW9uKSA6IG51bGw7CiRjYW5kaWRhdGVzID0gJHRoaXMtPnJlcG9zaXRvcnlTZXQtPmZpbmRQYWNrYWdlcyhzdHJ0b2xvd2VyKCRwYWNrYWdlTmFtZSksICRjb25zdHJhaW50LCAkcmVwb1NldEZsYWdzKTsKCiRtaW5Qcmlvcml0eSA9IEJhc2VQYWNrYWdlOjpTVEFCSUxJVElFU1skcHJlZmVycmVkU3RhYmlsaXR5XTsKdXNvcnQoJGNhbmRpZGF0ZXMsIHN0YXRpYyBmdW5jdGlvbiAoUGFja2FnZUludGVyZmFjZSAkYSwgUGFja2FnZUludGVyZmFjZSAkYikgdXNlICgkbWluUHJpb3JpdHkpIHsKJGFQcmlvcml0eSA9ICRhLT5nZXRTdGFiaWxpdHlQcmlvcml0eSgpOwokYlByaW9yaXR5ID0gJGItPmdldFN0YWJpbGl0eVByaW9yaXR5KCk7CgoKCmlmICgkbWluUHJpb3JpdHkgPCAkYVByaW9yaXR5ICYmICRiUHJpb3JpdHkgPCAkYVByaW9yaXR5KSB7CnJldHVybiAxOwp9CgoKCmlmICgkbWluUHJpb3JpdHkgPCAkYVByaW9yaXR5ICYmICRhUHJpb3JpdHkgPCAkYlByaW9yaXR5KSB7CnJldHVybiAtMTsKfQoKCgppZiAoJG1pblByaW9yaXR5ID49ICRhUHJpb3JpdHkgJiYgJG1pblByaW9yaXR5IDwgJGJQcmlvcml0eSkgewpyZXR1cm4gLTE7Cn0KCgpyZXR1cm4gdmVyc2lvbl9jb21wYXJlKCRiLT5nZXRWZXJzaW9uKCksICRhLT5nZXRWZXJzaW9uKCkpOwp9KTsKCmlmIChjb3VudCgkdGhpcy0+cGxhdGZvcm1Db25zdHJhaW50cykgPiAwICYmICEoJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgaW5zdGFuY2VvZiBJZ25vcmVBbGxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKSkgewoKJGFscmVhZHlXYXJuZWROYW1lcyA9IFtdOwoKJGFscmVhZHlTZWVuTmFtZXMgPSBbXTsKCmZvcmVhY2ggKCRjYW5kaWRhdGVzIGFzICRwa2cpIHsKJHJlcXMgPSAkcGtnLT5nZXRSZXF1aXJlcygpOwokc2tpcCA9IGZhbHNlOwpmb3JlYWNoICgkcmVxcyBhcyAkbmFtZSA9PiAkbGluaykgewppZiAoIVBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJG5hbWUpIHx8ICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLT5pc0lnbm9yZWQoJG5hbWUpKSB7CmNvbnRpbnVlOwp9CmlmIChpc3NldCgkdGhpcy0+cGxhdGZvcm1Db25zdHJhaW50c1skbmFtZV0pKSB7CmZvcmVhY2ggKCR0aGlzLT5wbGF0Zm9ybUNvbnN0cmFpbnRzWyRuYW1lXSBhcyAkcHJvdmlkZWRDb25zdHJhaW50KSB7CmlmICgkbGluay0+Z2V0Q29uc3RyYWludCgpLT5tYXRjaGVzKCRwcm92aWRlZENvbnN0cmFpbnQpKSB7Cgpjb250aW51ZSAyOwp9CmlmICgkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciBpbnN0YW5jZW9mIElnbm9yZUxpc3RQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyICYmICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLT5pc1VwcGVyQm91bmRJZ25vcmVkKCRuYW1lKSkgewokZmlsdGVyZWRDb25zdHJhaW50ID0gJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXItPmZpbHRlckNvbnN0cmFpbnQoJG5hbWUsICRsaW5rLT5nZXRDb25zdHJhaW50KCkpOwppZiAoJGZpbHRlcmVkQ29uc3RyYWludC0+bWF0Y2hlcygkcHJvdmlkZWRDb25zdHJhaW50KSkgewoKY29udGludWUgMjsKfQp9Cn0KCgokcmVhc29uID0gJ2lzIG5vdCBzYXRpc2ZpZWQgYnkgeW91ciBwbGF0Zm9ybSc7Cn0gZWxzZSB7CgoKJHJlYXNvbiA9ICdpcyBtaXNzaW5nIGZyb20geW91ciBwbGF0Zm9ybSc7Cn0KCiRpc0xhdGVzdFZlcnNpb24gPSAhaXNzZXQoJGFscmVhZHlTZWVuTmFtZXNbJHBrZy0+Z2V0TmFtZSgpXSk7CiRhbHJlYWR5U2Vlbk5hbWVzWyRwa2ctPmdldE5hbWUoKV0gPSB0cnVlOwppZiAoJGlvICE9PSBudWxsICYmICgkc2hvd1dhcm5pbmdzID09PSB0cnVlIHx8IChpc19jYWxsYWJsZSgkc2hvd1dhcm5pbmdzKSAmJiAkc2hvd1dhcm5pbmdzKCRwa2cpKSkpIHsKJGlzRmlyc3RXYXJuaW5nID0gIWlzc2V0KCRhbHJlYWR5V2FybmVkTmFtZXNbJHBrZy0+Z2V0TmFtZSgpLicvJy4kbGluay0+Z2V0VGFyZ2V0KCldKTsKJGFscmVhZHlXYXJuZWROYW1lc1skcGtnLT5nZXROYW1lKCkuJy8nLiRsaW5rLT5nZXRUYXJnZXQoKV0gPSB0cnVlOwokbGF0ZXN0ID0gJGlzTGF0ZXN0VmVyc2lvbiA/ICIncyBsYXRlc3QgdmVyc2lvbiIgOiAnJzsKJGlvLT53cml0ZUVycm9yKAonPHdhcm5pbmc+Q2Fubm90IHVzZSAnLiRwa2ctPmdldFByZXR0eU5hbWUoKS4kbGF0ZXN0LicgJy4kcGtnLT5nZXRQcmV0dHlWZXJzaW9uKCkuJyBhcyBpdCAnLiRsaW5rLT5nZXREZXNjcmlwdGlvbigpLicgJy4kbGluay0+Z2V0VGFyZ2V0KCkuJyAnLiRsaW5rLT5nZXRQcmV0dHlDb25zdHJhaW50KCkuJyB3aGljaCAnLiRyZWFzb24uJy48Lz4nLAp0cnVlLAokaXNGaXJzdFdhcm5pbmcgPyBJT0ludGVyZmFjZTo6Tk9STUFMIDogSU9JbnRlcmZhY2U6OlZFUkJPU0UKKTsKfQoKCiRza2lwID0gdHJ1ZTsKfQoKaWYgKCRza2lwKSB7CmNvbnRpbnVlOwp9CgokcGFja2FnZSA9ICRwa2c7CmJyZWFrOwp9Cn0gZWxzZSB7CiRwYWNrYWdlID0gY291bnQoJGNhbmRpZGF0ZXMpID4gMCA/ICRjYW5kaWRhdGVzWzBdIDogbnVsbDsKfQoKaWYgKCFpc3NldCgkcGFja2FnZSkpIHsKcmV0dXJuIGZhbHNlOwp9CgoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICYmICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkgPT09IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTKSB7CiRwYWNrYWdlID0gJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKfQoKcmV0dXJuICRwYWNrYWdlOwp9CgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmRSZWNvbW1lbmRlZFJlcXVpcmVWZXJzaW9uKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBzdHJpbmcKewoKCmlmICgwID09PSBzdHJwb3MoJHBhY2thZ2UtPmdldE5hbWUoKSwgJ2V4dC0nKSkgewokcGhwVmVyc2lvbiA9IFBIUF9NQUpPUl9WRVJTSU9OIC4gJy4nIC4gUEhQX01JTk9SX1ZFUlNJT04gLiAnLicgLiBQSFBfUkVMRUFTRV9WRVJTSU9OOwokZXh0VmVyc2lvbiA9IGltcGxvZGUoJy4nLCBhcnJheV9zbGljZShleHBsb2RlKCcuJywgJHBhY2thZ2UtPmdldFZlcnNpb24oKSksIDAsIDMpKTsKaWYgKCRwaHBWZXJzaW9uID09PSAkZXh0VmVyc2lvbikgewpyZXR1cm4gJyonOwp9Cn0KCiR2ZXJzaW9uID0gJHBhY2thZ2UtPmdldFZlcnNpb24oKTsKaWYgKCEkcGFja2FnZS0+aXNEZXYoKSkgewpyZXR1cm4gJHRoaXMtPnRyYW5zZm9ybVZlcnNpb24oJHZlcnNpb24sICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCksICRwYWNrYWdlLT5nZXRTdGFiaWxpdHkoKSk7Cn0KCiRsb2FkZXIgPSBuZXcgQXJyYXlMb2FkZXIoJHRoaXMtPmdldFBhcnNlcigpKTsKJGR1bXBlciA9IG5ldyBBcnJheUR1bXBlcigpOwokZXh0cmEgPSAkbG9hZGVyLT5nZXRCcmFuY2hBbGlhcygkZHVtcGVyLT5kdW1wKCRwYWNrYWdlKSk7CmlmICgkZXh0cmEgJiYgJGV4dHJhICE9PSBWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBUykgewokZXh0cmEgPSBQcmVnOjpyZXBsYWNlKCd7XihcZCtcLlxkK1wuXGQrKShcLjk5OTk5OTkpLWRldiR9JywgJyQxLjAnLCAkZXh0cmEsIC0xLCAkY291bnQpOwppZiAoJGNvdW50ID4gMCkgewokZXh0cmEgPSBzdHJfcmVwbGFjZSgnLjk5OTk5OTknLCAnLjAnLCAkZXh0cmEpOwoKcmV0dXJuICR0aGlzLT50cmFuc2Zvcm1WZXJzaW9uKCRleHRyYSwgJGV4dHJhLCAnZGV2Jyk7Cn0KfQoKcmV0dXJuICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gdHJhbnNmb3JtVmVyc2lvbihzdHJpbmcgJHZlcnNpb24sIHN0cmluZyAkcHJldHR5VmVyc2lvbiwgc3RyaW5nICRzdGFiaWxpdHkpOiBzdHJpbmcKewoKCiRzZW1hbnRpY1ZlcnNpb25QYXJ0cyA9IGV4cGxvZGUoJy4nLCAkdmVyc2lvbik7CgoKaWYgKGNvdW50KCRzZW1hbnRpY1ZlcnNpb25QYXJ0cykgPT09IDQgJiYgUHJlZzo6aXNNYXRjaCgne15cZCtcRD99JywgJHNlbWFudGljVmVyc2lvblBhcnRzWzNdKSkgewoKaWYgKCRzZW1hbnRpY1ZlcnNpb25QYXJ0c1swXSA9PT0gJzAnKSB7CnVuc2V0KCRzZW1hbnRpY1ZlcnNpb25QYXJ0c1szXSk7Cn0gZWxzZSB7CnVuc2V0KCRzZW1hbnRpY1ZlcnNpb25QYXJ0c1syXSwgJHNlbWFudGljVmVyc2lvblBhcnRzWzNdKTsKfQokdmVyc2lvbiA9IGltcGxvZGUoJy4nLCAkc2VtYW50aWNWZXJzaW9uUGFydHMpOwp9IGVsc2UgewpyZXR1cm4gJHByZXR0eVZlcnNpb247Cn0KCgppZiAoJHN0YWJpbGl0eSAhPT0gJ3N0YWJsZScpIHsKJHZlcnNpb24gLj0gJ0AnLiRzdGFiaWxpdHk7Cn0KCgpyZXR1cm4gJ14nIC4gJHZlcnNpb247Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0UGFyc2VyKCk6IFZlcnNpb25QYXJzZXIKewppZiAoJHRoaXMtPnBhcnNlciA9PT0gbnVsbCkgewokdGhpcy0+cGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKfQoKcmV0dXJuICR0aGlzLT5wYXJzZXI7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFV0aWxcTG9vcDsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeU1hbmFnZXI7CnVzZSBDb21wb3NlclxJbnN0YWxsZXJcSW5zdGFsbGF0aW9uTWFuYWdlcjsKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudERpc3BhdGNoZXI7CgoKCgpjbGFzcyBQYXJ0aWFsQ29tcG9zZXIKewoKCgpwcml2YXRlICRnbG9iYWwgPSBmYWxzZTsKCgoKCnByaXZhdGUgJHBhY2thZ2U7CgoKCgpwcml2YXRlICRsb29wOwoKCgoKcHJpdmF0ZSAkcmVwb3NpdG9yeU1hbmFnZXI7CgoKCgpwcml2YXRlICRpbnN0YWxsYXRpb25NYW5hZ2VyOwoKCgoKcHJpdmF0ZSAkY29uZmlnOwoKCgoKcHJpdmF0ZSAkZXZlbnREaXNwYXRjaGVyOwoKcHVibGljIGZ1bmN0aW9uIHNldFBhY2thZ2UoUm9vdFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiB2b2lkCnsKJHRoaXMtPnBhY2thZ2UgPSAkcGFja2FnZTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFBhY2thZ2UoKTogUm9vdFBhY2thZ2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPnBhY2thZ2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRDb25maWcoQ29uZmlnICRjb25maWcpOiB2b2lkCnsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRDb25maWcoKTogQ29uZmlnCnsKcmV0dXJuICR0aGlzLT5jb25maWc7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRMb29wKExvb3AgJGxvb3ApOiB2b2lkCnsKJHRoaXMtPmxvb3AgPSAkbG9vcDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldExvb3AoKTogTG9vcAp7CnJldHVybiAkdGhpcy0+bG9vcDsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFJlcG9zaXRvcnlNYW5hZ2VyKFJlcG9zaXRvcnlNYW5hZ2VyICRtYW5hZ2VyKTogdm9pZAp7CiR0aGlzLT5yZXBvc2l0b3J5TWFuYWdlciA9ICRtYW5hZ2VyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb3NpdG9yeU1hbmFnZXIoKTogUmVwb3NpdG9yeU1hbmFnZXIKewpyZXR1cm4gJHRoaXMtPnJlcG9zaXRvcnlNYW5hZ2VyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0SW5zdGFsbGF0aW9uTWFuYWdlcihJbnN0YWxsYXRpb25NYW5hZ2VyICRtYW5hZ2VyKTogdm9pZAp7CiR0aGlzLT5pbnN0YWxsYXRpb25NYW5hZ2VyID0gJG1hbmFnZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRJbnN0YWxsYXRpb25NYW5hZ2VyKCk6IEluc3RhbGxhdGlvbk1hbmFnZXIKewpyZXR1cm4gJHRoaXMtPmluc3RhbGxhdGlvbk1hbmFnZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRFdmVudERpc3BhdGNoZXIoRXZlbnREaXNwYXRjaGVyICRldmVudERpc3BhdGNoZXIpOiB2b2lkCnsKJHRoaXMtPmV2ZW50RGlzcGF0Y2hlciA9ICRldmVudERpc3BhdGNoZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRFdmVudERpc3BhdGNoZXIoKTogRXZlbnREaXNwYXRjaGVyCnsKcmV0dXJuICR0aGlzLT5ldmVudERpc3BhdGNoZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0dsb2JhbCgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5nbG9iYWw7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRHbG9iYWwoKTogdm9pZAp7CiR0aGlzLT5nbG9iYWwgPSB0cnVlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBsYXRmb3JtOwoKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhlY3V0YWJsZUZpbmRlcjsKCmNsYXNzIEhodm1EZXRlY3Rvcgp7Cgpwcml2YXRlIHN0YXRpYyAkaGh2bVZlcnNpb24gPSBudWxsOwoKcHJpdmF0ZSAkZXhlY3V0YWJsZUZpbmRlcjsKCnByaXZhdGUgJHByb2Nlc3NFeGVjdXRvcjsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RXhlY3V0YWJsZUZpbmRlciAkZXhlY3V0YWJsZUZpbmRlciA9IG51bGwsID9Qcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3NFeGVjdXRvciA9IG51bGwpCnsKJHRoaXMtPmV4ZWN1dGFibGVGaW5kZXIgPSAkZXhlY3V0YWJsZUZpbmRlcjsKJHRoaXMtPnByb2Nlc3NFeGVjdXRvciA9ICRwcm9jZXNzRXhlY3V0b3I7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZXNldCgpOiB2b2lkCnsKc2VsZjo6JGhodm1WZXJzaW9uID0gbnVsbDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFZlcnNpb24oKTogP3N0cmluZwp7CmlmIChudWxsICE9PSBzZWxmOjokaGh2bVZlcnNpb24pIHsKcmV0dXJuIHNlbGY6OiRoaHZtVmVyc2lvbiA/OiBudWxsOwp9CgpzZWxmOjokaGh2bVZlcnNpb24gPSBkZWZpbmVkKCdISFZNX1ZFUlNJT04nKSA/IEhIVk1fVkVSU0lPTiA6IG51bGw7CmlmIChzZWxmOjokaGh2bVZlcnNpb24gPT09IG51bGwgJiYgIVBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewpzZWxmOjokaGh2bVZlcnNpb24gPSBmYWxzZTsKJHRoaXMtPmV4ZWN1dGFibGVGaW5kZXIgPSAkdGhpcy0+ZXhlY3V0YWJsZUZpbmRlciA/OiBuZXcgRXhlY3V0YWJsZUZpbmRlcigpOwokaGh2bVBhdGggPSAkdGhpcy0+ZXhlY3V0YWJsZUZpbmRlci0+ZmluZCgnaGh2bScpOwppZiAoJGhodm1QYXRoICE9PSBudWxsKSB7CiR0aGlzLT5wcm9jZXNzRXhlY3V0b3IgPSAkdGhpcy0+cHJvY2Vzc0V4ZWN1dG9yID8/IG5ldyBQcm9jZXNzRXhlY3V0b3IoKTsKJGV4aXRDb2RlID0gJHRoaXMtPnByb2Nlc3NFeGVjdXRvci0+ZXhlY3V0ZShbJGhodm1QYXRoLCAnLS1waHAnLCAnLWQnLCAnaGh2bS5qaXQ9MCcsICctcicsICdlY2hvIEhIVk1fVkVSU0lPTjsnXSwgc2VsZjo6JGhodm1WZXJzaW9uKTsKaWYgKCRleGl0Q29kZSAhPT0gMCkgewpzZWxmOjokaGh2bVZlcnNpb24gPSBmYWxzZTsKfQp9Cn0KCnJldHVybiBzZWxmOjokaGh2bVZlcnNpb24gPzogbnVsbDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQbGF0Zm9ybTsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgpjbGFzcyBSdW50aW1lCnsKCgoKcHVibGljIGZ1bmN0aW9uIGhhc0NvbnN0YW50KHN0cmluZyAkY29uc3RhbnQsID9zdHJpbmcgJGNsYXNzID0gbnVsbCk6IGJvb2wKewpyZXR1cm4gZGVmaW5lZChsdHJpbSgkY2xhc3MuJzo6Jy4kY29uc3RhbnQsICc6JykpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb25zdGFudChzdHJpbmcgJGNvbnN0YW50LCA/c3RyaW5nICRjbGFzcyA9IG51bGwpCnsKcmV0dXJuIGNvbnN0YW50KGx0cmltKCRjbGFzcy4nOjonLiRjb25zdGFudCwgJzonKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBoYXNGdW5jdGlvbihzdHJpbmcgJGZuKTogYm9vbAp7CnJldHVybiBmdW5jdGlvbl9leGlzdHMoJGZuKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaW52b2tlKGNhbGxhYmxlICRjYWxsYWJsZSwgYXJyYXkgJGFyZ3VtZW50cyA9IFtdKQp7CnJldHVybiAkY2FsbGFibGUoLi4uJGFyZ3VtZW50cyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNDbGFzcyhzdHJpbmcgJGNsYXNzKTogYm9vbAp7CnJldHVybiBjbGFzc19leGlzdHMoJGNsYXNzLCBmYWxzZSk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb25zdHJ1Y3Qoc3RyaW5nICRjbGFzcywgYXJyYXkgJGFyZ3VtZW50cyA9IFtdKTogb2JqZWN0CnsKaWYgKGVtcHR5KCRhcmd1bWVudHMpKSB7CnJldHVybiBuZXcgJGNsYXNzOwp9CgokcmVmbCA9IG5ldyBcUmVmbGVjdGlvbkNsYXNzKCRjbGFzcyk7CgpyZXR1cm4gJHJlZmwtPm5ld0luc3RhbmNlQXJncygkYXJndW1lbnRzKTsKfQoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFeHRlbnNpb25zKCk6IGFycmF5CnsKcmV0dXJuIGdldF9sb2FkZWRfZXh0ZW5zaW9ucygpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uVmVyc2lvbihzdHJpbmcgJGV4dGVuc2lvbik6IHN0cmluZwp7CiR2ZXJzaW9uID0gcGhwdmVyc2lvbigkZXh0ZW5zaW9uKTsKaWYgKCR2ZXJzaW9uID09PSBmYWxzZSkgewokdmVyc2lvbiA9ICcwJzsKfQoKcmV0dXJuICR2ZXJzaW9uOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uSW5mbyhzdHJpbmcgJGV4dGVuc2lvbik6IHN0cmluZwp7CiRyZWZsZWN0b3IgPSBuZXcgXFJlZmxlY3Rpb25FeHRlbnNpb24oJGV4dGVuc2lvbik7CgpvYl9zdGFydCgpOwokcmVmbGVjdG9yLT5pbmZvKCk7CgokaW5mbyA9IChzdHJpbmcpIG9iX2dldF9jbGVhbigpOwoKaWYgKCdjbGknID09PSBQSFBfU0FQSSkgewpyZXR1cm4gJGluZm87Cn0KCnJldHVybiBzZWxmOjpwYXJzZUh0bWxFeHRlbnNpb25JbmZvKCRpbmZvKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwYXJzZUh0bWxFeHRlbnNpb25JbmZvKHN0cmluZyAkaHRtbCk6IHN0cmluZwp7CiRyZXN1bHQgPSBbXTsKCmlmICgoYm9vbCkgUHJlZzo6bWF0Y2goJ348aDI+XHMqPGFbXj5dKj4oW148XSspPC9hPlxzKjwvaDI+fmknLCAkaHRtbCwgJG1hdGNoZXMpKSB7CiRyZXN1bHRbXSA9IHRyaW0oaHRtbF9lbnRpdHlfZGVjb2RlKCRtYXRjaGVzWzFdKSk7CiRyZXN1bHRbXSA9ICcnOwp9CgppZiAoKGJvb2wpIFByZWc6Om1hdGNoQWxsKCd+PHRyPlxzKjx0ZCBjbGFzcz0iZSI+XHMqKC4qPylccyo8L3RkPlxzKjx0ZCBjbGFzcz0idiI+XHMqKC4qPylccyo8L3RkPlxzKjwvdHI+fmlzJywgJGh0bWwsICRtYXRjaGVzKSkgewokY291bnQgPSBtaW4oXGNvdW50KCRtYXRjaGVzWzFdKSwgXGNvdW50KCRtYXRjaGVzWzJdKSk7Cgpmb3IgKCRpID0gMDsgJGkgPCAkY291bnQ7ICRpKyspIHsKJGtleSA9IHRyaW0oaHRtbF9lbnRpdHlfZGVjb2RlKHN0cmlwX3RhZ3MoJG1hdGNoZXNbMV1bJGldKSkpOwokdmFsdWUgPSB0cmltKGh0bWxfZW50aXR5X2RlY29kZShzdHJpcF90YWdzKCRtYXRjaGVzWzJdWyRpXSkpKTsKJHJlc3VsdFtdID0gJGtleSAuICcgPT4gJyAuICR2YWx1ZTsKfQp9CgpyZXR1cm4gaW1wbG9kZSgiXG4iLCAkcmVzdWx0KTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQbGF0Zm9ybTsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgpjbGFzcyBWZXJzaW9uCnsKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlT3BlbnNzbChzdHJpbmcgJG9wZW5zc2xWZXJzaW9uLCA/Ym9vbCAmJGlzRmlwcyk6ID9zdHJpbmcKewokaXNGaXBzID0gZmFsc2U7CgppZiAoIVByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9eKD88dmVyc2lvbj5bMC05Ll0rKSg/PHBhdGNoPlthLXpdezAsMn0pKD88c3VmZml4Pig/Oi0/KD86ZGV2fHByZXxhbHBoYXxiZXRhfHJjfGZpcHMpW1xkXSopKikoPzotXHcrKT8oPzogXCguKz9cKSk/JC8nLCAkb3BlbnNzbFZlcnNpb24sICRtYXRjaGVzKSkgewpyZXR1cm4gbnVsbDsKfQoKCiRwYXRjaCA9ICcnOwppZiAodmVyc2lvbl9jb21wYXJlKCRtYXRjaGVzWyd2ZXJzaW9uJ10sICczLjAuMCcsICc8JykpIHsKJHBhdGNoID0gJy4nLnNlbGY6OmNvbnZlcnRBbHBoYVZlcnNpb25Ub0ludFZlcnNpb24oJG1hdGNoZXNbJ3BhdGNoJ10pOwp9CgokaXNGaXBzID0gc3RycG9zKCRtYXRjaGVzWydzdWZmaXgnXSwgJ2ZpcHMnKSAhPT0gZmFsc2U7CiRzdWZmaXggPSBzdHJ0cignLScubHRyaW0oJG1hdGNoZXNbJ3N1ZmZpeCddLCAnLScpLCBbJy1maXBzJyA9PiAnJywgJy1wcmUnID0+ICctYWxwaGEnXSk7CgpyZXR1cm4gcnRyaW0oJG1hdGNoZXNbJ3ZlcnNpb24nXS4kcGF0Y2guJHN1ZmZpeCwgJy0nKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwYXJzZUxpYmpwZWcoc3RyaW5nICRsaWJqcGVnVmVyc2lvbik6ID9zdHJpbmcKewppZiAoIVByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9eKD88bWFqb3I+XGQrKSg/PG1pbm9yPlthLXpdKikkLycsICRsaWJqcGVnVmVyc2lvbiwgJG1hdGNoZXMpKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gJG1hdGNoZXNbJ21ham9yJ10uJy4nLnNlbGY6OmNvbnZlcnRBbHBoYVZlcnNpb25Ub0ludFZlcnNpb24oJG1hdGNoZXNbJ21pbm9yJ10pOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlWm9uZWluZm9WZXJzaW9uKHN0cmluZyAkem9uZWluZm9WZXJzaW9uKTogP3N0cmluZwp7CmlmICghUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL14oPzx5ZWFyPlxkezR9KSg/PHJldmlzaW9uPlthLXpdKikkLycsICR6b25laW5mb1ZlcnNpb24sICRtYXRjaGVzKSkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICRtYXRjaGVzWyd5ZWFyJ10uJy4nLnNlbGY6OmNvbnZlcnRBbHBoYVZlcnNpb25Ub0ludFZlcnNpb24oJG1hdGNoZXNbJ3JldmlzaW9uJ10pOwp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjb252ZXJ0QWxwaGFWZXJzaW9uVG9JbnRWZXJzaW9uKHN0cmluZyAkYWxwaGEpOiBpbnQKewpyZXR1cm4gc3RybGVuKCRhbHBoYSkgKiAoLW9yZCgnYScpICsgMSkgKyBhcnJheV9zdW0oYXJyYXlfbWFwKCdvcmQnLCBzdHJfc3BsaXQoJGFscGhhKSkpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNvbnZlcnRMaWJ4cG1WZXJzaW9uSWQoaW50ICR2ZXJzaW9uSWQpOiBzdHJpbmcKewpyZXR1cm4gc2VsZjo6Y29udmVydFZlcnNpb25JZCgkdmVyc2lvbklkLCAxMDApOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNvbnZlcnRPcGVubGRhcFZlcnNpb25JZChpbnQgJHZlcnNpb25JZCk6IHN0cmluZwp7CnJldHVybiBzZWxmOjpjb252ZXJ0VmVyc2lvbklkKCR2ZXJzaW9uSWQsIDEwMCk7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNvbnZlcnRWZXJzaW9uSWQoaW50ICR2ZXJzaW9uSWQsIGludCAkYmFzZSk6IHN0cmluZwp7CnJldHVybiBzcHJpbnRmKAonJWQuJWQuJWQnLAokdmVyc2lvbklkIC8gKCRiYXNlICogJGJhc2UpLAooaW50KSAoJHZlcnNpb25JZCAvICRiYXNlKSAlICRiYXNlLAokdmVyc2lvbklkICUgJGJhc2UKKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQbHVnaW5cQ2FwYWJpbGl0eTsKCgoKCgoKCmludGVyZmFjZSBDYXBhYmlsaXR5CnsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGx1Z2luXENhcGFiaWxpdHk7CgoKCgoKCgoKCgoKaW50ZXJmYWNlIENvbW1hbmRQcm92aWRlciBleHRlbmRzIENhcGFiaWxpdHkKewoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21tYW5kcygpOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQbHVnaW47CgoKCgoKCgoKaW50ZXJmYWNlIENhcGFibGUKewoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2FwYWJpbGl0aWVzKCk7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBsdWdpbjsKCnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBDb21tYW5kRXZlbnQgZXh0ZW5kcyBFdmVudAp7CgoKCnByaXZhdGUgJGNvbW1hbmROYW1lOwoKCgoKcHJpdmF0ZSAkaW5wdXQ7CgoKCgpwcml2YXRlICRvdXRwdXQ7CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG5hbWUsIHN0cmluZyAkY29tbWFuZE5hbWUsIElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIGFycmF5ICRhcmdzID0gW10sIGFycmF5ICRmbGFncyA9IFtdKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJG5hbWUsICRhcmdzLCAkZmxhZ3MpOwokdGhpcy0+Y29tbWFuZE5hbWUgPSAkY29tbWFuZE5hbWU7CiR0aGlzLT5pbnB1dCA9ICRpbnB1dDsKJHRoaXMtPm91dHB1dCA9ICRvdXRwdXQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJbnB1dCgpOiBJbnB1dEludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+aW5wdXQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPdXRwdXQoKTogT3V0cHV0SW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5vdXRwdXQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21tYW5kTmFtZSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmNvbW1hbmROYW1lOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBsdWdpbjsKCnVzZSBVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb247CgpjbGFzcyBQbHVnaW5CbG9ja2VkRXhjZXB0aW9uIGV4dGVuZHMgVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uCnsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGx1Z2luOwoKCgoKCgpjbGFzcyBQbHVnaW5FdmVudHMKewoKCgoKCgoKCnB1YmxpYyBjb25zdCBJTklUID0gJ2luaXQnOwoKCgoKCgoKCgpwdWJsaWMgY29uc3QgQ09NTUFORCA9ICdjb21tYW5kJzsKCgoKCgoKCgoKcHVibGljIGNvbnN0IFBSRV9GSUxFX0RPV05MT0FEID0gJ3ByZS1maWxlLWRvd25sb2FkJzsKCgoKCgoKCgoKcHVibGljIGNvbnN0IFBPU1RfRklMRV9ET1dOTE9BRCA9ICdwb3N0LWZpbGUtZG93bmxvYWQnOwoKCgoKCgoKCgpwdWJsaWMgY29uc3QgUFJFX0NPTU1BTkRfUlVOID0gJ3ByZS1jb21tYW5kLXJ1bic7CgoKCgoKCgoKCgpwdWJsaWMgY29uc3QgUFJFX1BPT0xfQ1JFQVRFID0gJ3ByZS1wb29sLWNyZWF0ZSc7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBsdWdpbjsKCnVzZSBDb21wb3NlclxDb21wb3NlcjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwoKCgoKCgppbnRlcmZhY2UgUGx1Z2luSW50ZXJmYWNlCnsKCgoKCgoKCgoKCnB1YmxpYyBjb25zdCBQTFVHSU5fQVBJX1ZFUlNJT04gPSAnMi45LjAnOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWN0aXZhdGUoQ29tcG9zZXIgJGNvbXBvc2VyLCBJT0ludGVyZmFjZSAkaW8pOwoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRlYWN0aXZhdGUoQ29tcG9zZXIgJGNvbXBvc2VyLCBJT0ludGVyZmFjZSAkaW8pOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB1bmluc3RhbGwoQ29tcG9zZXIgJGNvbXBvc2VyLCBJT0ludGVyZmFjZSAkaW8pOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQbHVnaW47Cgp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnRTdWJzY3JpYmVySW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyXEluc3RhbGxlckludGVyZmFjZTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2NrZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxQYXJ0aWFsQ29tcG9zZXI7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEluc3RhbGxlZFJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlVdGlsczsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUm9vdFBhY2thZ2VSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMaW5rOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFBsdWdpblxDYXBhYmlsaXR5XENhcGFiaWxpdHk7CnVzZSBDb21wb3NlclxVdGlsXFBhY2thZ2VTb3J0ZXI7CgoKCgoKCgpjbGFzcyBQbHVnaW5NYW5hZ2VyCnsKCnByb3RlY3RlZCAkY29tcG9zZXI7Cgpwcm90ZWN0ZWQgJGlvOwoKcHJvdGVjdGVkICRnbG9iYWxDb21wb3NlcjsKCnByb3RlY3RlZCAkdmVyc2lvblBhcnNlcjsKCnByb3RlY3RlZCAkZGlzYWJsZVBsdWdpbnMgPSBmYWxzZTsKCgpwcm90ZWN0ZWQgJHBsdWdpbnMgPSBbXTsKCnByb3RlY3RlZCAkcmVnaXN0ZXJlZFBsdWdpbnMgPSBbXTsKCgoKCnByaXZhdGUgJGFsbG93UGx1Z2luUnVsZXM7CgoKCgpwcml2YXRlICRhbGxvd0dsb2JhbFBsdWdpblJ1bGVzOwoKCnByaXZhdGUgJHJ1bm5pbmdJbkdsb2JhbERpciA9IGZhbHNlOwoKCnByaXZhdGUgc3RhdGljICRjbGFzc0NvdW50ZXIgPSAwOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgQ29tcG9zZXIgJGNvbXBvc2VyLCA/UGFydGlhbENvbXBvc2VyICRnbG9iYWxDb21wb3NlciA9IG51bGwsICRkaXNhYmxlUGx1Z2lucyA9IGZhbHNlKQp7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmNvbXBvc2VyID0gJGNvbXBvc2VyOwokdGhpcy0+Z2xvYmFsQ29tcG9zZXIgPSAkZ2xvYmFsQ29tcG9zZXI7CiR0aGlzLT52ZXJzaW9uUGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKJHRoaXMtPmRpc2FibGVQbHVnaW5zID0gJGRpc2FibGVQbHVnaW5zOwokdGhpcy0+YWxsb3dQbHVnaW5SdWxlcyA9ICR0aGlzLT5wYXJzZUFsbG93ZWRQbHVnaW5zKCRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgnYWxsb3ctcGx1Z2lucycpLCAkY29tcG9zZXItPmdldExvY2tlcigpKTsKJHRoaXMtPmFsbG93R2xvYmFsUGx1Z2luUnVsZXMgPSAkdGhpcy0+cGFyc2VBbGxvd2VkUGx1Z2lucygkZ2xvYmFsQ29tcG9zZXIgIT09IG51bGwgPyAkZ2xvYmFsQ29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ2FsbG93LXBsdWdpbnMnKSA6IGZhbHNlKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFJ1bm5pbmdJbkdsb2JhbERpcihib29sICRydW5uaW5nSW5HbG9iYWxEaXIpOiB2b2lkCnsKJHRoaXMtPnJ1bm5pbmdJbkdsb2JhbERpciA9ICRydW5uaW5nSW5HbG9iYWxEaXI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2FkSW5zdGFsbGVkUGx1Z2lucygpOiB2b2lkCnsKaWYgKCEkdGhpcy0+YXJlUGx1Z2luc0Rpc2FibGVkKCdsb2NhbCcpKSB7CiRyZXBvID0gJHRoaXMtPmNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKJHRoaXMtPmxvYWRSZXBvc2l0b3J5KCRyZXBvLCBmYWxzZSwgJHRoaXMtPmNvbXBvc2VyLT5nZXRQYWNrYWdlKCkpOwp9CgppZiAoJHRoaXMtPmdsb2JhbENvbXBvc2VyICE9PSBudWxsICYmICEkdGhpcy0+YXJlUGx1Z2luc0Rpc2FibGVkKCdnbG9iYWwnKSkgewokdGhpcy0+bG9hZFJlcG9zaXRvcnkoJHRoaXMtPmdsb2JhbENvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKSwgdHJ1ZSk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGRlYWN0aXZhdGVJbnN0YWxsZWRQbHVnaW5zKCk6IHZvaWQKewppZiAoISR0aGlzLT5hcmVQbHVnaW5zRGlzYWJsZWQoJ2xvY2FsJykpIHsKJHJlcG8gPSAkdGhpcy0+Y29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpOwokdGhpcy0+ZGVhY3RpdmF0ZVJlcG9zaXRvcnkoJHJlcG8sIGZhbHNlKTsKfQoKaWYgKCR0aGlzLT5nbG9iYWxDb21wb3NlciAhPT0gbnVsbCAmJiAhJHRoaXMtPmFyZVBsdWdpbnNEaXNhYmxlZCgnZ2xvYmFsJykpIHsKJHRoaXMtPmRlYWN0aXZhdGVSZXBvc2l0b3J5KCR0aGlzLT5nbG9iYWxDb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCksIHRydWUpOwp9Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBsdWdpbnMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnBsdWdpbnM7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZWdpc3RlcmVkUGx1Z2lucygpOiBhcnJheQp7CnJldHVybiBhcnJheV9rZXlzKCR0aGlzLT5yZWdpc3RlcmVkUGx1Z2lucyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRHbG9iYWxDb21wb3NlcigpOiA/UGFydGlhbENvbXBvc2VyCnsKcmV0dXJuICR0aGlzLT5nbG9iYWxDb21wb3NlcjsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXJQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIGJvb2wgJGZhaWxPbk1pc3NpbmdDbGFzc2VzID0gZmFsc2UsIGJvb2wgJGlzR2xvYmFsUGx1Z2luID0gZmFsc2UpOiB2b2lkCnsKaWYgKCR0aGlzLT5hcmVQbHVnaW5zRGlzYWJsZWQoJGlzR2xvYmFsUGx1Z2luID8gJ2dsb2JhbCcgOiAnbG9jYWwnKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlRoZSAiJy4kcGFja2FnZS0+Z2V0TmFtZSgpLiciIHBsdWdpbiB3YXMgbm90IGxvYWRlZCBhcyBwbHVnaW5zIGFyZSBkaXNhYmxlZC48L3dhcm5pbmc+Jyk7CgpyZXR1cm47Cn0KCmlmICgkcGFja2FnZS0+Z2V0VHlwZSgpID09PSAnY29tcG9zZXItcGx1Z2luJykgewokcmVxdWlyZXNDb21wb3NlciA9IG51bGw7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXF1aXJlcygpIGFzICRsaW5rKSB7IAppZiAoJ2NvbXBvc2VyLXBsdWdpbi1hcGknID09PSAkbGluay0+Z2V0VGFyZ2V0KCkpIHsKJHJlcXVpcmVzQ29tcG9zZXIgPSAkbGluay0+Z2V0Q29uc3RyYWludCgpOwpicmVhazsKfQp9CgppZiAoISRyZXF1aXJlc0NvbXBvc2VyKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigiUGx1Z2luICIuJHBhY2thZ2UtPmdldE5hbWUoKS4iIGlzIG1pc3NpbmcgYSByZXF1aXJlIHN0YXRlbWVudCBmb3IgYSB2ZXJzaW9uIG9mIHRoZSBjb21wb3Nlci1wbHVnaW4tYXBpIHBhY2thZ2UuIik7Cn0KCiRjdXJyZW50UGx1Z2luQXBpVmVyc2lvbiA9ICR0aGlzLT5nZXRQbHVnaW5BcGlWZXJzaW9uKCk7CiRjdXJyZW50UGx1Z2luQXBpQ29uc3RyYWludCA9IG5ldyBDb25zdHJhaW50KCc9PScsICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJGN1cnJlbnRQbHVnaW5BcGlWZXJzaW9uKSk7CgppZiAoJHJlcXVpcmVzQ29tcG9zZXItPmdldFByZXR0eVN0cmluZygpID09PSAkdGhpcy0+Z2V0UGx1Z2luQXBpVmVyc2lvbigpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+VGhlICInIC4gJHBhY2thZ2UtPmdldE5hbWUoKSAuICciIHBsdWdpbiByZXF1aXJlcyBjb21wb3Nlci1wbHVnaW4tYXBpICcuJHRoaXMtPmdldFBsdWdpbkFwaVZlcnNpb24oKS4nLCB0aGlzICpXSUxMKiBicmVhayBpbiB0aGUgZnV0dXJlIGFuZCBpdCBzaG91bGQgYmUgZml4ZWQgQVNBUCAocmVxdWlyZSBeJy4kdGhpcy0+Z2V0UGx1Z2luQXBpVmVyc2lvbigpLicgaW5zdGVhZCBmb3IgZXhhbXBsZSkuPC93YXJuaW5nPicpOwp9IGVsc2VpZiAoISRyZXF1aXJlc0NvbXBvc2VyLT5tYXRjaGVzKCRjdXJyZW50UGx1Z2luQXBpQ29uc3RyYWludCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5UaGUgIicgLiAkcGFja2FnZS0+Z2V0TmFtZSgpIC4gJyIgcGx1Z2luICcuKCRpc0dsb2JhbFBsdWdpbiB8fCAkdGhpcy0+cnVubmluZ0luR2xvYmFsRGlyID8gJyhpbnN0YWxsZWQgZ2xvYmFsbHkpICcgOiAnJykuJ3dhcyBza2lwcGVkIGJlY2F1c2UgaXQgcmVxdWlyZXMgYSBQbHVnaW4gQVBJIHZlcnNpb24gKCInIC4gJHJlcXVpcmVzQ29tcG9zZXItPmdldFByZXR0eVN0cmluZygpIC4gJyIpIHRoYXQgZG9lcyBub3QgbWF0Y2ggeW91ciBDb21wb3NlciBpbnN0YWxsYXRpb24gKCInIC4gJGN1cnJlbnRQbHVnaW5BcGlWZXJzaW9uIC4gJyIpLiBZb3UgbWF5IG5lZWQgdG8gcnVuIGNvbXBvc2VyIHVwZGF0ZSB3aXRoIHRoZSAiLS1uby1wbHVnaW5zIiBvcHRpb24uPC93YXJuaW5nPicpOwoKcmV0dXJuOwp9CgppZiAoJHBhY2thZ2UtPmdldE5hbWUoKSA9PT0gJ3N5bWZvbnkvZmxleCcgJiYgUHJlZzo6aXNNYXRjaCgne15bMC05Ll0rJH0nLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKSAmJiB2ZXJzaW9uX2NvbXBhcmUoJHBhY2thZ2UtPmdldFZlcnNpb24oKSwgJzEuOS44JywgJzwnKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlRoZSAiJyAuICRwYWNrYWdlLT5nZXROYW1lKCkgLiAnIiBwbHVnaW4gJy4oJGlzR2xvYmFsUGx1Z2luIHx8ICR0aGlzLT5ydW5uaW5nSW5HbG9iYWxEaXIgPyAnKGluc3RhbGxlZCBnbG9iYWxseSkgJyA6ICcnKS4nd2FzIHNraXBwZWQgYmVjYXVzZSBpdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIENvbXBvc2VyIDIrLiBNYWtlIHN1cmUgdG8gdXBkYXRlIGl0IHRvIHZlcnNpb24gMS45Ljggb3IgZ3JlYXRlci48L3dhcm5pbmc+Jyk7CgpyZXR1cm47Cn0KfQoKaWYgKCEkdGhpcy0+aXNQbHVnaW5BbGxvd2VkKCRwYWNrYWdlLT5nZXROYW1lKCksICRpc0dsb2JhbFBsdWdpbiwgdHJ1ZSA9PT0gKCRwYWNrYWdlLT5nZXRFeHRyYSgpWydwbHVnaW4tb3B0aW9uYWwnXSA/PyBmYWxzZSkpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignU2tpcHBlZCBsb2FkaW5nICInLiRwYWNrYWdlLT5nZXROYW1lKCkgLiAnIiAnLigkaXNHbG9iYWxQbHVnaW4gfHwgJHRoaXMtPnJ1bm5pbmdJbkdsb2JhbERpciA/ICcoaW5zdGFsbGVkIGdsb2JhbGx5KSAnIDogJycpLidhcyBpdCBpcyBub3QgaW4gY29uZmlnLmFsbG93LXBsdWdpbnMnLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwoKcmV0dXJuOwp9Cgokb2xkSW5zdGFsbGVyUGx1Z2luID0gKCRwYWNrYWdlLT5nZXRUeXBlKCkgPT09ICdjb21wb3Nlci1pbnN0YWxsZXInKTsKCmlmIChpc3NldCgkdGhpcy0+cmVnaXN0ZXJlZFBsdWdpbnNbJHBhY2thZ2UtPmdldE5hbWUoKV0pKSB7CnJldHVybjsKfQoKJGV4dHJhID0gJHBhY2thZ2UtPmdldEV4dHJhKCk7CmlmIChlbXB0eSgkZXh0cmFbJ2NsYXNzJ10pKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdFcnJvciB3aGlsZSBpbnN0YWxsaW5nICcuJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nLCBjb21wb3Nlci1wbHVnaW4gcGFja2FnZXMgc2hvdWxkIGhhdmUgYSBjbGFzcyBkZWZpbmVkIGluIHRoZWlyIGV4dHJhIGtleSB0byBiZSB1c2FibGUuJyk7Cn0KJGNsYXNzZXMgPSBpc19hcnJheSgkZXh0cmFbJ2NsYXNzJ10pID8gJGV4dHJhWydjbGFzcyddIDogWyRleHRyYVsnY2xhc3MnXV07CgokbG9jYWxSZXBvID0gJHRoaXMtPmNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKJGdsb2JhbFJlcG8gPSAkdGhpcy0+Z2xvYmFsQ29tcG9zZXIgIT09IG51bGwgPyAkdGhpcy0+Z2xvYmFsQ29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpIDogbnVsbDsKCiRyb290UGFja2FnZSA9IGNsb25lICR0aGlzLT5jb21wb3Nlci0+Z2V0UGFja2FnZSgpOwoKCgokcm9vdFBhY2thZ2VBdXRvbG9hZHMgPSAkcm9vdFBhY2thZ2UtPmdldEF1dG9sb2FkKCk7CiRyb290UGFja2FnZUF1dG9sb2Fkc1snZmlsZXMnXSA9IFtdOwokcm9vdFBhY2thZ2UtPnNldEF1dG9sb2FkKCRyb290UGFja2FnZUF1dG9sb2Fkcyk7CiRyb290UGFja2FnZUF1dG9sb2FkcyA9ICRyb290UGFja2FnZS0+Z2V0RGV2QXV0b2xvYWQoKTsKJHJvb3RQYWNrYWdlQXV0b2xvYWRzWydmaWxlcyddID0gW107CiRyb290UGFja2FnZS0+c2V0RGV2QXV0b2xvYWQoJHJvb3RQYWNrYWdlQXV0b2xvYWRzKTsKdW5zZXQoJHJvb3RQYWNrYWdlQXV0b2xvYWRzKTsKCiRyb290UGFja2FnZVJlcG8gPSBuZXcgUm9vdFBhY2thZ2VSZXBvc2l0b3J5KCRyb290UGFja2FnZSk7CiRpbnN0YWxsZWRSZXBvID0gbmV3IEluc3RhbGxlZFJlcG9zaXRvcnkoWyRsb2NhbFJlcG8sICRyb290UGFja2FnZVJlcG9dKTsKaWYgKCRnbG9iYWxSZXBvKSB7CiRpbnN0YWxsZWRSZXBvLT5hZGRSZXBvc2l0b3J5KCRnbG9iYWxSZXBvKTsKfQoKJGF1dG9sb2FkUGFja2FnZXMgPSBbJHBhY2thZ2UtPmdldE5hbWUoKSA9PiAkcGFja2FnZV07CiRhdXRvbG9hZFBhY2thZ2VzID0gJHRoaXMtPmNvbGxlY3REZXBlbmRlbmNpZXMoJGluc3RhbGxlZFJlcG8sICRhdXRvbG9hZFBhY2thZ2VzLCAkcGFja2FnZSk7CgokZ2VuZXJhdG9yID0gJHRoaXMtPmNvbXBvc2VyLT5nZXRBdXRvbG9hZEdlbmVyYXRvcigpOwokYXV0b2xvYWRzID0gW1skcm9vdFBhY2thZ2UsICcnXV07CmZvcmVhY2ggKCRhdXRvbG9hZFBhY2thZ2VzIGFzICRhdXRvbG9hZFBhY2thZ2UpIHsKaWYgKCRhdXRvbG9hZFBhY2thZ2UgPT09ICRyb290UGFja2FnZSkgewpjb250aW51ZTsKfQoKJGluc3RhbGxQYXRoID0gJHRoaXMtPmdldEluc3RhbGxQYXRoKCRhdXRvbG9hZFBhY2thZ2UsICRnbG9iYWxSZXBvICYmICRnbG9iYWxSZXBvLT5oYXNQYWNrYWdlKCRhdXRvbG9hZFBhY2thZ2UpKTsKaWYgKCRpbnN0YWxsUGF0aCA9PT0gbnVsbCkgewpjb250aW51ZTsKfQokYXV0b2xvYWRzW10gPSBbJGF1dG9sb2FkUGFja2FnZSwgJGluc3RhbGxQYXRoXTsKfQoKJG1hcCA9ICRnZW5lcmF0b3ItPnBhcnNlQXV0b2xvYWRzKCRhdXRvbG9hZHMsICRyb290UGFja2FnZSk7CiRjbGFzc0xvYWRlciA9ICRnZW5lcmF0b3ItPmNyZWF0ZUxvYWRlcigkbWFwLCAkdGhpcy0+Y29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ3ZlbmRvci1kaXInKSk7CiRjbGFzc0xvYWRlci0+cmVnaXN0ZXIoZmFsc2UpOwoKZm9yZWFjaCAoJG1hcFsnZmlsZXMnXSBhcyAkZmlsZUlkZW50aWZpZXIgPT4gJGZpbGUpIHsKCgoKaWYgKCRmaWxlSWRlbnRpZmllciA9PT0gJzdlOWJkNjEyY2M0NDRiM2VlZDc4OGViYmU0NjI2M2EwJykgewpjb250aW51ZTsKfQpcQ29tcG9zZXJcQXV0b2xvYWRcY29tcG9zZXJSZXF1aXJlKCRmaWxlSWRlbnRpZmllciwgJGZpbGUpOwp9Cgpmb3JlYWNoICgkY2xhc3NlcyBhcyAkY2xhc3MpIHsKaWYgKGNsYXNzX2V4aXN0cygkY2xhc3MsIGZhbHNlKSkgewokY2xhc3MgPSB0cmltKCRjbGFzcywgJ1xcJyk7CiRwYXRoID0gJGNsYXNzTG9hZGVyLT5maW5kRmlsZSgkY2xhc3MpOwokY29kZSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRwYXRoKTsKJHNlcGFyYXRvclBvcyA9IHN0cnJwb3MoJGNsYXNzLCAnXFwnKTsKJGNsYXNzTmFtZSA9ICRjbGFzczsKaWYgKCRzZXBhcmF0b3JQb3MpIHsKJGNsYXNzTmFtZSA9IHN1YnN0cigkY2xhc3MsICRzZXBhcmF0b3JQb3MgKyAxKTsKfQokY29kZSA9IFByZWc6OnJlcGxhY2UoJ3teKCg/Oig/OmZpbmFsfHJlYWRvbmx5KVxzKykqKD86XHMqKSljbGFzc1xzKygnLnByZWdfcXVvdGUoJGNsYXNzTmFtZSkuJyl9bWknLCAnJDFjbGFzcyAkMl9jb21wb3Nlcl90bXAnLnNlbGY6OiRjbGFzc0NvdW50ZXIsICRjb2RlLCAxKTsKJGNvZGUgPSBzdHJ0cigkY29kZSwgWwonX19GSUxFX18nID0+IHZhcl9leHBvcnQoJHBhdGgsIHRydWUpLAonX19ESVJfXycgPT4gdmFyX2V4cG9ydChkaXJuYW1lKCRwYXRoKSwgdHJ1ZSksCidfX0NMQVNTX18nID0+IHZhcl9leHBvcnQoJGNsYXNzLCB0cnVlKSwKXSk7CiRjb2RlID0gUHJlZzo6cmVwbGFjZSgnL15ccyo8XD8ocGhwKT8vaScsICcnLCAkY29kZSwgMSk7CmV2YWwoJGNvZGUpOwokY2xhc3MgLj0gJ19jb21wb3Nlcl90bXAnLnNlbGY6OiRjbGFzc0NvdW50ZXI7CnNlbGY6OiRjbGFzc0NvdW50ZXIrKzsKfQoKaWYgKCRvbGRJbnN0YWxsZXJQbHVnaW4pIHsKaWYgKCFpc19hKCRjbGFzcywgJ0NvbXBvc2VyXEluc3RhbGxlclxJbnN0YWxsZXJJbnRlcmZhY2UnLCB0cnVlKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBhY3RpdmF0ZSBwbHVnaW4gIicuJHBhY2thZ2UtPmdldE5hbWUoKS4nIiBhcyAiJy4kY2xhc3MuJyIgZG9lcyBub3QgaW1wbGVtZW50IENvbXBvc2VyXEluc3RhbGxlclxJbnN0YWxsZXJJbnRlcmZhY2UnKTsKfQokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkxvYWRpbmcgIicuJHBhY2thZ2UtPmdldE5hbWUoKSAuICciICcuKCRpc0dsb2JhbFBsdWdpbiB8fCAkdGhpcy0+cnVubmluZ0luR2xvYmFsRGlyID8gJyhpbnN0YWxsZWQgZ2xvYmFsbHkpICcgOiAnJykuJ3doaWNoIGlzIGEgbGVnYWN5IGNvbXBvc2VyLWluc3RhbGxlciBidWlsdCBmb3IgQ29tcG9zZXIgMS54LCBpdCBpcyBsaWtlbHkgdG8gY2F1c2UgaXNzdWVzIGFzIHlvdSBhcmUgcnVubmluZyBDb21wb3NlciAyLnguPC93YXJuaW5nPicpOwokaW5zdGFsbGVyID0gbmV3ICRjbGFzcygkdGhpcy0+aW8sICR0aGlzLT5jb21wb3Nlcik7CiR0aGlzLT5jb21wb3Nlci0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpLT5hZGRJbnN0YWxsZXIoJGluc3RhbGxlcik7CiR0aGlzLT5yZWdpc3RlcmVkUGx1Z2luc1skcGFja2FnZS0+Z2V0TmFtZSgpXVtdID0gJGluc3RhbGxlcjsKfSBlbHNlaWYgKGNsYXNzX2V4aXN0cygkY2xhc3MpKSB7CmlmICghaXNfYSgkY2xhc3MsICdDb21wb3NlclxQbHVnaW5cUGx1Z2luSW50ZXJmYWNlJywgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgYWN0aXZhdGUgcGx1Z2luICInLiRwYWNrYWdlLT5nZXROYW1lKCkuJyIgYXMgIicuJGNsYXNzLiciIGRvZXMgbm90IGltcGxlbWVudCBDb21wb3NlclxQbHVnaW5cUGx1Z2luSW50ZXJmYWNlJyk7Cn0KJHBsdWdpbiA9IG5ldyAkY2xhc3MoKTsKJHRoaXMtPmFkZFBsdWdpbigkcGx1Z2luLCAkaXNHbG9iYWxQbHVnaW4sICRwYWNrYWdlKTsKJHRoaXMtPnJlZ2lzdGVyZWRQbHVnaW5zWyRwYWNrYWdlLT5nZXROYW1lKCldW10gPSAkcGx1Z2luOwp9IGVsc2VpZiAoJGZhaWxPbk1pc3NpbmdDbGFzc2VzKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdQbHVnaW4gJy4kcGFja2FnZS0+Z2V0TmFtZSgpLicgY291bGQgbm90IGJlIGluaXRpYWxpemVkLCBjbGFzcyBub3QgZm91bmQ6ICcuJGNsYXNzKTsKfQp9Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRlYWN0aXZhdGVQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiB2b2lkCnsKaWYgKCFpc3NldCgkdGhpcy0+cmVnaXN0ZXJlZFBsdWdpbnNbJHBhY2thZ2UtPmdldE5hbWUoKV0pKSB7CnJldHVybjsKfQoKJHBsdWdpbnMgPSAkdGhpcy0+cmVnaXN0ZXJlZFBsdWdpbnNbJHBhY2thZ2UtPmdldE5hbWUoKV07CmZvcmVhY2ggKCRwbHVnaW5zIGFzICRwbHVnaW4pIHsKaWYgKCRwbHVnaW4gaW5zdGFuY2VvZiBJbnN0YWxsZXJJbnRlcmZhY2UpIHsKJHRoaXMtPmNvbXBvc2VyLT5nZXRJbnN0YWxsYXRpb25NYW5hZ2VyKCktPnJlbW92ZUluc3RhbGxlcigkcGx1Z2luKTsKfSBlbHNlIHsKJHRoaXMtPnJlbW92ZVBsdWdpbigkcGx1Z2luKTsKfQp9CnVuc2V0KCR0aGlzLT5yZWdpc3RlcmVkUGx1Z2luc1skcGFja2FnZS0+Z2V0TmFtZSgpXSk7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHVuaW5zdGFsbFBhY2thZ2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IHZvaWQKewppZiAoIWlzc2V0KCR0aGlzLT5yZWdpc3RlcmVkUGx1Z2luc1skcGFja2FnZS0+Z2V0TmFtZSgpXSkpIHsKcmV0dXJuOwp9CgokcGx1Z2lucyA9ICR0aGlzLT5yZWdpc3RlcmVkUGx1Z2luc1skcGFja2FnZS0+Z2V0TmFtZSgpXTsKZm9yZWFjaCAoJHBsdWdpbnMgYXMgJHBsdWdpbikgewppZiAoJHBsdWdpbiBpbnN0YW5jZW9mIEluc3RhbGxlckludGVyZmFjZSkgewokdGhpcy0+Y29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKS0+cmVtb3ZlSW5zdGFsbGVyKCRwbHVnaW4pOwp9IGVsc2UgewokdGhpcy0+cmVtb3ZlUGx1Z2luKCRwbHVnaW4pOwokdGhpcy0+dW5pbnN0YWxsUGx1Z2luKCRwbHVnaW4pOwp9Cn0KdW5zZXQoJHRoaXMtPnJlZ2lzdGVyZWRQbHVnaW5zWyRwYWNrYWdlLT5nZXROYW1lKCldKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFBsdWdpbkFwaVZlcnNpb24oKTogc3RyaW5nCnsKcmV0dXJuIFBsdWdpbkludGVyZmFjZTo6UExVR0lOX0FQSV9WRVJTSU9OOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFBsdWdpbihQbHVnaW5JbnRlcmZhY2UgJHBsdWdpbiwgYm9vbCAkaXNHbG9iYWxQbHVnaW4gPSBmYWxzZSwgP1BhY2thZ2VJbnRlcmZhY2UgJHNvdXJjZVBhY2thZ2UgPSBudWxsKTogdm9pZAp7CmlmICgkdGhpcy0+YXJlUGx1Z2luc0Rpc2FibGVkKCRpc0dsb2JhbFBsdWdpbiA/ICdnbG9iYWwnIDogJ2xvY2FsJykpIHsKcmV0dXJuOwp9CgppZiAoJHNvdXJjZVBhY2thZ2UgPT09IG51bGwpIHsKdHJpZ2dlcl9lcnJvcignQ2FsbGluZyBQbHVnaW5NYW5hZ2VyOjphZGRQbHVnaW4gd2l0aG91dCAkc291cmNlUGFja2FnZSBpcyBkZXByZWNhdGVkLCBpZiB5b3UgYXJlIHVzaW5nIHRoaXMgcGxlYXNlIGdldCBpbiB0b3VjaCB3aXRoIHVzIHRvIGV4cGxhaW4gdGhlIHVzZSBjYXNlJywgRV9VU0VSX0RFUFJFQ0FURUQpOwp9IGVsc2VpZiAoISR0aGlzLT5pc1BsdWdpbkFsbG93ZWQoJHNvdXJjZVBhY2thZ2UtPmdldE5hbWUoKSwgJGlzR2xvYmFsUGx1Z2luLCB0cnVlID09PSAoJHNvdXJjZVBhY2thZ2UtPmdldEV4dHJhKClbJ3BsdWdpbi1vcHRpb25hbCddID8/IGZhbHNlKSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdTa2lwcGVkIGxvYWRpbmcgIicuZ2V0X2NsYXNzKCRwbHVnaW4pLicgZnJvbSAnLiRzb3VyY2VQYWNrYWdlLT5nZXROYW1lKCkgLiAnIiAnLigkaXNHbG9iYWxQbHVnaW4gfHwgJHRoaXMtPnJ1bm5pbmdJbkdsb2JhbERpciA/ICcoaW5zdGFsbGVkIGdsb2JhbGx5KSAnIDogJycpLicgYXMgaXQgaXMgbm90IGluIGNvbmZpZy5hbGxvdy1wbHVnaW5zJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKCnJldHVybjsKfQoKJGRldGFpbHMgPSBbXTsKaWYgKCRzb3VyY2VQYWNrYWdlKSB7CiRkZXRhaWxzW10gPSAnZnJvbSAnLiRzb3VyY2VQYWNrYWdlLT5nZXROYW1lKCk7Cn0KaWYgKCRpc0dsb2JhbFBsdWdpbiB8fCAkdGhpcy0+cnVubmluZ0luR2xvYmFsRGlyKSB7CiRkZXRhaWxzW10gPSAnaW5zdGFsbGVkIGdsb2JhbGx5JzsKfQokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0xvYWRpbmcgcGx1Z2luICcuZ2V0X2NsYXNzKCRwbHVnaW4pLigkZGV0YWlscyA/ICcgKCcuaW1wbG9kZSgnLCAnLCAkZGV0YWlscykuJyknIDogJycpLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwokdGhpcy0+cGx1Z2luc1tdID0gJHBsdWdpbjsKJHBsdWdpbi0+YWN0aXZhdGUoJHRoaXMtPmNvbXBvc2VyLCAkdGhpcy0+aW8pOwoKaWYgKCRwbHVnaW4gaW5zdGFuY2VvZiBFdmVudFN1YnNjcmliZXJJbnRlcmZhY2UpIHsKJHRoaXMtPmNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+YWRkU3Vic2NyaWJlcigkcGx1Z2luKTsKfQp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlUGx1Z2luKFBsdWdpbkludGVyZmFjZSAkcGx1Z2luKTogdm9pZAp7CiRpbmRleCA9IGFycmF5X3NlYXJjaCgkcGx1Z2luLCAkdGhpcy0+cGx1Z2lucywgdHJ1ZSk7CmlmICgkaW5kZXggPT09IGZhbHNlKSB7CnJldHVybjsKfQoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdVbmxvYWRpbmcgcGx1Z2luICcuZ2V0X2NsYXNzKCRwbHVnaW4pLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwp1bnNldCgkdGhpcy0+cGx1Z2luc1skaW5kZXhdKTsKJHBsdWdpbi0+ZGVhY3RpdmF0ZSgkdGhpcy0+Y29tcG9zZXIsICR0aGlzLT5pbyk7CgokdGhpcy0+Y29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5yZW1vdmVMaXN0ZW5lcigkcGx1Z2luKTsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHVuaW5zdGFsbFBsdWdpbihQbHVnaW5JbnRlcmZhY2UgJHBsdWdpbik6IHZvaWQKewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1VuaW5zdGFsbGluZyBwbHVnaW4gJy5nZXRfY2xhc3MoJHBsdWdpbiksIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CiRwbHVnaW4tPnVuaW5zdGFsbCgkdGhpcy0+Y29tcG9zZXIsICR0aGlzLT5pbyk7Cn0KCgoKCgoKCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gbG9hZFJlcG9zaXRvcnkoUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgYm9vbCAkaXNHbG9iYWxSZXBvLCA/Um9vdFBhY2thZ2VJbnRlcmZhY2UgJHJvb3RQYWNrYWdlID0gbnVsbCk6IHZvaWQKewokcGFja2FnZXMgPSAkcmVwby0+Z2V0UGFja2FnZXMoKTsKCiR3ZWlnaHRzID0gW107CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UtPmdldFR5cGUoKSA9PT0gJ2NvbXBvc2VyLXBsdWdpbicpIHsKJGV4dHJhID0gJHBhY2thZ2UtPmdldEV4dHJhKCk7CmlmICgkcGFja2FnZS0+Z2V0TmFtZSgpID09PSAnY29tcG9zZXIvaW5zdGFsbGVycycgfHwgdHJ1ZSA9PT0gKCRleHRyYVsncGx1Z2luLW1vZGlmaWVzLWluc3RhbGwtcGF0aCddID8/IGZhbHNlKSkgewokd2VpZ2h0c1skcGFja2FnZS0+Z2V0TmFtZSgpXSA9IC0xMDAwMDsKfQp9Cn0KCiRzb3J0ZWRQYWNrYWdlcyA9IFBhY2thZ2VTb3J0ZXI6OnNvcnRQYWNrYWdlcygkcGFja2FnZXMsICR3ZWlnaHRzKTsKaWYgKCEkaXNHbG9iYWxSZXBvKSB7CiRyZXF1aXJlZFBhY2thZ2VzID0gUmVwb3NpdG9yeVV0aWxzOjpmaWx0ZXJSZXF1aXJlZFBhY2thZ2VzKCRwYWNrYWdlcywgJHJvb3RQYWNrYWdlLCB0cnVlKTsKfQoKZm9yZWFjaCAoJHNvcnRlZFBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CmlmICghKCRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlKSkgewpjb250aW51ZTsKfQoKaWYgKCFpbl9hcnJheSgkcGFja2FnZS0+Z2V0VHlwZSgpLCBbJ2NvbXBvc2VyLXBsdWdpbicsICdjb21wb3Nlci1pbnN0YWxsZXInXSwgdHJ1ZSkpIHsKY29udGludWU7Cn0KCmlmICgKISRpc0dsb2JhbFJlcG8KJiYgIWluX2FycmF5KCRwYWNrYWdlLCAkcmVxdWlyZWRQYWNrYWdlcywgdHJ1ZSkKJiYgISR0aGlzLT5pc1BsdWdpbkFsbG93ZWQoJHBhY2thZ2UtPmdldE5hbWUoKSwgZmFsc2UsIHRydWUsIGZhbHNlKQopIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5UaGUgIicuJHBhY2thZ2UtPmdldE5hbWUoKS4nIiBwbHVnaW4gd2FzIG5vdCBsb2FkZWQgYXMgaXQgaXMgbm90IGxpc3RlZCBpbiBhbGxvdy1wbHVnaW5zIGFuZCBpcyBub3QgcmVxdWlyZWQgYnkgdGhlIHJvb3QgcGFja2FnZSBhbnltb3JlLjwvd2FybmluZz4nKTsKY29udGludWU7Cn0KCmlmICgnY29tcG9zZXItcGx1Z2luJyA9PT0gJHBhY2thZ2UtPmdldFR5cGUoKSkgewokdGhpcy0+cmVnaXN0ZXJQYWNrYWdlKCRwYWNrYWdlLCBmYWxzZSwgJGlzR2xvYmFsUmVwbyk7Cgp9IGVsc2VpZiAoJ2NvbXBvc2VyLWluc3RhbGxlcicgPT09ICRwYWNrYWdlLT5nZXRUeXBlKCkpIHsKJHRoaXMtPnJlZ2lzdGVyUGFja2FnZSgkcGFja2FnZSwgZmFsc2UsICRpc0dsb2JhbFJlcG8pOwp9Cn0KfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZGVhY3RpdmF0ZVJlcG9zaXRvcnkoUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgYm9vbCAkaXNHbG9iYWxSZXBvKTogdm9pZAp7CiRwYWNrYWdlcyA9ICRyZXBvLT5nZXRQYWNrYWdlcygpOwokc29ydGVkUGFja2FnZXMgPSBhcnJheV9yZXZlcnNlKFBhY2thZ2VTb3J0ZXI6OnNvcnRQYWNrYWdlcygkcGFja2FnZXMpKTsKCmZvcmVhY2ggKCRzb3J0ZWRQYWNrYWdlcyBhcyAkcGFja2FnZSkgewppZiAoISgkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZSkpIHsKY29udGludWU7Cn0KaWYgKCdjb21wb3Nlci1wbHVnaW4nID09PSAkcGFja2FnZS0+Z2V0VHlwZSgpKSB7CiR0aGlzLT5kZWFjdGl2YXRlUGFja2FnZSgkcGFja2FnZSk7Cgp9IGVsc2VpZiAoJ2NvbXBvc2VyLWluc3RhbGxlcicgPT09ICRwYWNrYWdlLT5nZXRUeXBlKCkpIHsKJHRoaXMtPmRlYWN0aXZhdGVQYWNrYWdlKCRwYWNrYWdlKTsKfQp9Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gY29sbGVjdERlcGVuZGVuY2llcyhJbnN0YWxsZWRSZXBvc2l0b3J5ICRpbnN0YWxsZWRSZXBvLCBhcnJheSAkY29sbGVjdGVkLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogYXJyYXkKewpmb3JlYWNoICgkcGFja2FnZS0+Z2V0UmVxdWlyZXMoKSBhcyAkcmVxdWlyZUxpbmspIHsKZm9yZWFjaCAoJGluc3RhbGxlZFJlcG8tPmZpbmRQYWNrYWdlc1dpdGhSZXBsYWNlcnNBbmRQcm92aWRlcnMoJHJlcXVpcmVMaW5rLT5nZXRUYXJnZXQoKSkgYXMgJHJlcXVpcmVkUGFja2FnZSkgewppZiAoIWlzc2V0KCRjb2xsZWN0ZWRbJHJlcXVpcmVkUGFja2FnZS0+Z2V0TmFtZSgpXSkpIHsKJGNvbGxlY3RlZFskcmVxdWlyZWRQYWNrYWdlLT5nZXROYW1lKCldID0gJHJlcXVpcmVkUGFja2FnZTsKJGNvbGxlY3RlZCA9ICR0aGlzLT5jb2xsZWN0RGVwZW5kZW5jaWVzKCRpbnN0YWxsZWRSZXBvLCAkY29sbGVjdGVkLCAkcmVxdWlyZWRQYWNrYWdlKTsKfQp9Cn0KCnJldHVybiAkY29sbGVjdGVkOwp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRJbnN0YWxsUGF0aChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBib29sICRnbG9iYWwgPSBmYWxzZSk6ID9zdHJpbmcKewppZiAoISRnbG9iYWwpIHsKcmV0dXJuICR0aGlzLT5jb21wb3Nlci0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7Cn0KCmFzc2VydChudWxsICE9PSAkdGhpcy0+Z2xvYmFsQ29tcG9zZXIpOwoKcmV0dXJuICR0aGlzLT5nbG9iYWxDb21wb3Nlci0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7Cn0KCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Q2FwYWJpbGl0eUltcGxlbWVudGF0aW9uQ2xhc3NOYW1lKFBsdWdpbkludGVyZmFjZSAkcGx1Z2luLCBzdHJpbmcgJGNhcGFiaWxpdHkpOiA/c3RyaW5nCnsKaWYgKCEoJHBsdWdpbiBpbnN0YW5jZW9mIENhcGFibGUpKSB7CnJldHVybiBudWxsOwp9CgokY2FwYWJpbGl0aWVzID0gKGFycmF5KSAkcGx1Z2luLT5nZXRDYXBhYmlsaXRpZXMoKTsKCmlmICghZW1wdHkoJGNhcGFiaWxpdGllc1skY2FwYWJpbGl0eV0pICYmIGlzX3N0cmluZygkY2FwYWJpbGl0aWVzWyRjYXBhYmlsaXR5XSkgJiYgdHJpbSgkY2FwYWJpbGl0aWVzWyRjYXBhYmlsaXR5XSkpIHsKcmV0dXJuIHRyaW0oJGNhcGFiaWxpdGllc1skY2FwYWJpbGl0eV0pOwp9CgppZiAoCmFycmF5X2tleV9leGlzdHMoJGNhcGFiaWxpdHksICRjYXBhYmlsaXRpZXMpCiYmIChlbXB0eSgkY2FwYWJpbGl0aWVzWyRjYXBhYmlsaXR5XSkgfHwgIWlzX3N0cmluZygkY2FwYWJpbGl0aWVzWyRjYXBhYmlsaXR5XSkgfHwgIXRyaW0oJGNhcGFiaWxpdGllc1skY2FwYWJpbGl0eV0pKQopIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ1BsdWdpbiAnLmdldF9jbGFzcygkcGx1Z2luKS4nIHByb3ZpZGVkIGludmFsaWQgY2FwYWJpbGl0eSBjbGFzcyBuYW1lKHMpLCBnb3QgJy52YXJfZXhwb3J0KCRjYXBhYmlsaXRpZXNbJGNhcGFiaWxpdHldLCB0cnVlKSk7Cn0KCnJldHVybiBudWxsOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGx1Z2luQ2FwYWJpbGl0eShQbHVnaW5JbnRlcmZhY2UgJHBsdWdpbiwgJGNhcGFiaWxpdHlDbGFzc05hbWUsIGFycmF5ICRjdG9yQXJncyA9IFtdKTogP0NhcGFiaWxpdHkKewppZiAoJGNhcGFiaWxpdHlDbGFzcyA9ICR0aGlzLT5nZXRDYXBhYmlsaXR5SW1wbGVtZW50YXRpb25DbGFzc05hbWUoJHBsdWdpbiwgJGNhcGFiaWxpdHlDbGFzc05hbWUpKSB7CmlmICghY2xhc3NfZXhpc3RzKCRjYXBhYmlsaXR5Q2xhc3MpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGluc3RhbnRpYXRlIENhcGFiaWxpdHksIGFzIGNsYXNzICRjYXBhYmlsaXR5Q2xhc3MgZnJvbSBwbHVnaW4gIi5nZXRfY2xhc3MoJHBsdWdpbikuIiBkb2VzIG5vdCBleGlzdC4iKTsKfQoKJGN0b3JBcmdzWydwbHVnaW4nXSA9ICRwbHVnaW47CiRjYXBhYmlsaXR5T2JqID0gbmV3ICRjYXBhYmlsaXR5Q2xhc3MoJGN0b3JBcmdzKTsKCgppZiAoISRjYXBhYmlsaXR5T2JqIGluc3RhbmNlb2YgQ2FwYWJpbGl0eSB8fCAhJGNhcGFiaWxpdHlPYmogaW5zdGFuY2VvZiAkY2FwYWJpbGl0eUNsYXNzTmFtZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCidDbGFzcyAnIC4gJGNhcGFiaWxpdHlDbGFzcyAuICcgbXVzdCBpbXBsZW1lbnQgYm90aCBDb21wb3NlclxQbHVnaW5cQ2FwYWJpbGl0eVxDYXBhYmlsaXR5IGFuZCAnLiAkY2FwYWJpbGl0eUNsYXNzTmFtZSAuICcuJwopOwp9CgpyZXR1cm4gJGNhcGFiaWxpdHlPYmo7Cn0KCnJldHVybiBudWxsOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQbHVnaW5DYXBhYmlsaXRpZXMoJGNhcGFiaWxpdHlDbGFzc05hbWUsIGFycmF5ICRjdG9yQXJncyA9IFtdKTogYXJyYXkKewokY2FwYWJpbGl0aWVzID0gW107CmZvcmVhY2ggKCR0aGlzLT5nZXRQbHVnaW5zKCkgYXMgJHBsdWdpbikgewokY2FwYWJpbGl0eSA9ICR0aGlzLT5nZXRQbHVnaW5DYXBhYmlsaXR5KCRwbHVnaW4sICRjYXBhYmlsaXR5Q2xhc3NOYW1lLCAkY3RvckFyZ3MpOwppZiAobnVsbCAhPT0gJGNhcGFiaWxpdHkpIHsKJGNhcGFiaWxpdGllc1tdID0gJGNhcGFiaWxpdHk7Cn0KfQoKcmV0dXJuICRjYXBhYmlsaXRpZXM7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHBhcnNlQWxsb3dlZFBsdWdpbnMoJGFsbG93UGx1Z2luc0NvbmZpZywgP0xvY2tlciAkbG9ja2VyID0gbnVsbCk6ID9hcnJheQp7CmlmIChbXSA9PT0gJGFsbG93UGx1Z2luc0NvbmZpZyAmJiAkbG9ja2VyICE9PSBudWxsICYmICRsb2NrZXItPmlzTG9ja2VkKCkgJiYgdmVyc2lvbl9jb21wYXJlKCRsb2NrZXItPmdldFBsdWdpbkFwaSgpLCAnMi4yLjAnLCAnPCcpKSB7CnJldHVybiBudWxsOwp9CgppZiAodHJ1ZSA9PT0gJGFsbG93UGx1Z2luc0NvbmZpZykgewpyZXR1cm4gWyd7fScgPT4gdHJ1ZV07Cn0KCmlmIChmYWxzZSA9PT0gJGFsbG93UGx1Z2luc0NvbmZpZykgewpyZXR1cm4gWyd7fScgPT4gZmFsc2VdOwp9CgokcnVsZXMgPSBbXTsKZm9yZWFjaCAoJGFsbG93UGx1Z2luc0NvbmZpZyBhcyAkcGF0dGVybiA9PiAkYWxsb3cpIHsKJHJ1bGVzW0Jhc2VQYWNrYWdlOjpwYWNrYWdlTmFtZVRvUmVnZXhwKCRwYXR0ZXJuKV0gPSAkYWxsb3c7Cn0KCnJldHVybiAkcnVsZXM7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhcmVQbHVnaW5zRGlzYWJsZWQoJHR5cGUpCnsKcmV0dXJuICR0aGlzLT5kaXNhYmxlUGx1Z2lucyA9PT0gdHJ1ZSB8fCAkdGhpcy0+ZGlzYWJsZVBsdWdpbnMgPT09ICR0eXBlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZGlzYWJsZVBsdWdpbnMoKTogdm9pZAp7CiR0aGlzLT5kaXNhYmxlUGx1Z2lucyA9IHRydWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1BsdWdpbkFsbG93ZWQoc3RyaW5nICRwYWNrYWdlLCBib29sICRpc0dsb2JhbFBsdWdpbiwgYm9vbCAkb3B0aW9uYWwgPSBmYWxzZSwgYm9vbCAkcHJvbXB0ID0gdHJ1ZSk6IGJvb2wKewppZiAoJGlzR2xvYmFsUGx1Z2luKSB7CiRydWxlcyA9ICYkdGhpcy0+YWxsb3dHbG9iYWxQbHVnaW5SdWxlczsKfSBlbHNlIHsKJHJ1bGVzID0gJiR0aGlzLT5hbGxvd1BsdWdpblJ1bGVzOwp9CgoKCmlmICgkcnVsZXMgPT09IG51bGwpIHsKaWYgKCEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkZvciBhZGRpdGlvbmFsIHNlY3VyaXR5IHlvdSBzaG91bGQgZGVjbGFyZSB0aGUgYWxsb3ctcGx1Z2lucyBjb25maWcgd2l0aCBhIGxpc3Qgb2YgcGFja2FnZXMgbmFtZXMgdGhhdCBhcmUgYWxsb3dlZCB0byBydW4gY29kZS4gU2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2FsbG93LXBsdWdpbnM8L3dhcm5pbmc+Jyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+VGhpcyB3YXJuaW5nIHdpbGwgYmVjb21lIGFuIGV4Y2VwdGlvbiBvbmNlIHlvdSBydW4gY29tcG9zZXIgdXBkYXRlITwvd2FybmluZz4nKTsKCiRydWxlcyA9IFsne30nID0+IHRydWVdOwoKCnJldHVybiB0cnVlOwp9CgoKJHJ1bGVzID0gW107Cn0KCmZvcmVhY2ggKCRydWxlcyBhcyAkcGF0dGVybiA9PiAkYWxsb3cpIHsKaWYgKFByZWc6OmlzTWF0Y2goJHBhdHRlcm4sICRwYWNrYWdlKSkgewpyZXR1cm4gJGFsbG93ID09PSB0cnVlOwp9Cn0KCmlmICgkcGFja2FnZSA9PT0gJ2NvbXBvc2VyL3BhY2thZ2UtdmVyc2lvbnMtZGVwcmVjYXRlZCcpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkgJiYgJHByb21wdCkgewokY29tcG9zZXIgPSAkaXNHbG9iYWxQbHVnaW4gJiYgJHRoaXMtPmdsb2JhbENvbXBvc2VyICE9PSBudWxsID8gJHRoaXMtPmdsb2JhbENvbXBvc2VyIDogJHRoaXMtPmNvbXBvc2VyOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz4nLiRwYWNrYWdlLigkaXNHbG9iYWxQbHVnaW4gfHwgJHRoaXMtPnJ1bm5pbmdJbkdsb2JhbERpciA/ICcgKGluc3RhbGxlZCBnbG9iYWxseSknIDogJycpLicgY29udGFpbnMgYSBDb21wb3NlciBwbHVnaW4gd2hpY2ggaXMgY3VycmVudGx5IG5vdCBpbiB5b3VyIGFsbG93LXBsdWdpbnMgY29uZmlnLiBTZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvYWxsb3ctcGx1Z2luczwvd2FybmluZz4nKTsKJGF0dGVtcHRzID0gMDsKd2hpbGUgKHRydWUpIHsKCgokZGVmYXVsdCA9ICc/JzsKaWYgKCRhdHRlbXB0cyA+IDUpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdUb28gbWFueSBmYWlsZWQgcHJvbXB0cywgYWJvcnRpbmcuJyk7CmJyZWFrOwp9Cgpzd2l0Y2ggKCRhbnN3ZXIgPSAkdGhpcy0+aW8tPmFzaygnRG8geW91IHRydXN0ICI8Zmc9Z3JlZW47b3B0aW9ucz1ib2xkPicuJHBhY2thZ2UuJzwvPiIgdG8gZXhlY3V0ZSBjb2RlIGFuZCB3aXNoIHRvIGVuYWJsZSBpdCBub3c/ICh3cml0ZXMgImFsbG93LXBsdWdpbnMiIHRvIGNvbXBvc2VyLmpzb24pIFs8Y29tbWVudD55LG4sZCw/PC9jb21tZW50Pl0gJywgJGRlZmF1bHQpKSB7CmNhc2UgJ3knOgpjYXNlICduJzoKY2FzZSAnZCc6CiRhbGxvdyA9ICRhbnN3ZXIgPT09ICd5JzsKCgokcnVsZXNbQmFzZVBhY2thZ2U6OnBhY2thZ2VOYW1lVG9SZWdleHAoJHBhY2thZ2UpXSA9ICRhbGxvdzsKCgppZiAoJGFuc3dlciA9PT0gJ3knIHx8ICRhbnN3ZXIgPT09ICduJykgewokYWxsb3dQbHVnaW5zID0gJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdhbGxvdy1wbHVnaW5zJyk7CmlmIChpc19hcnJheSgkYWxsb3dQbHVnaW5zKSkgewokYWxsb3dQbHVnaW5zWyRwYWNrYWdlXSA9ICRhbGxvdzsKaWYgKCRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgnc29ydC1wYWNrYWdlcycpKSB7Cmtzb3J0KCRhbGxvd1BsdWdpbnMpOwp9CiRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldENvbmZpZ1NvdXJjZSgpLT5hZGRDb25maWdTZXR0aW5nKCdhbGxvdy1wbHVnaW5zJywgJGFsbG93UGx1Z2lucyk7CiRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPm1lcmdlKFsnY29uZmlnJyA9PiBbJ2FsbG93LXBsdWdpbnMnID0+ICRhbGxvd1BsdWdpbnNdXSk7Cn0KfQoKcmV0dXJuICRhbGxvdzsKCmNhc2UgJz8nOgpkZWZhdWx0OgokYXR0ZW1wdHMrKzsKJHRoaXMtPmlvLT53cml0ZUVycm9yKFsKJ3kgLSBhZGQgcGFja2FnZSB0byBhbGxvdy1wbHVnaW5zIGluIGNvbXBvc2VyLmpzb24gYW5kIGxldCBpdCBydW4gaW1tZWRpYXRlbHknLAonbiAtIGFkZCBwYWNrYWdlIChhcyBkaXNhbGxvd2VkKSB0byBhbGxvdy1wbHVnaW5zIGluIGNvbXBvc2VyLmpzb24gdG8gc3VwcHJlc3MgZnVydGhlciBwcm9tcHRzJywKJ2QgLSBkaXNjYXJkIHRoaXMsIGRvIG5vdCBjaGFuZ2UgY29tcG9zZXIuanNvbiBhbmQgZG8gbm90IGFsbG93IHRoZSBwbHVnaW4gdG8gcnVuJywKJz8gLSBwcmludCBoZWxwJywKXSk7CmJyZWFrOwp9Cn0KfSBlbHNlaWYgKCRvcHRpb25hbCkgewpyZXR1cm4gZmFsc2U7Cn0KCnRocm93IG5ldyBQbHVnaW5CbG9ja2VkRXhjZXB0aW9uKAokcGFja2FnZS4oJGlzR2xvYmFsUGx1Z2luIHx8ICR0aGlzLT5ydW5uaW5nSW5HbG9iYWxEaXIgPyAnIChpbnN0YWxsZWQgZ2xvYmFsbHkpJyA6ICcnKS4nIGNvbnRhaW5zIGEgQ29tcG9zZXIgcGx1Z2luIHdoaWNoIGlzIGJsb2NrZWQgYnkgeW91ciBhbGxvdy1wbHVnaW5zIGNvbmZpZy4gWW91IG1heSBhZGQgaXQgdG8gdGhlIGxpc3QgaWYgeW91IGNvbnNpZGVyIGl0IHNhZmUuJy5QSFBfRU9MLgonWW91IGNhbiBydW4gImNvbXBvc2VyICcuKCRpc0dsb2JhbFBsdWdpbiB8fCAkdGhpcy0+cnVubmluZ0luR2xvYmFsRGlyID8gJ2dsb2JhbCAnIDogJycpLidjb25maWcgLS1uby1wbHVnaW5zIGFsbG93LXBsdWdpbnMuJy4kcGFja2FnZS4nIFt0cnVlfGZhbHNlXSIgdG8gZW5hYmxlIGl0ICh0cnVlKSBvciBkaXNhYmxlIGl0IGV4cGxpY2l0bHkgYW5kIHN1cHByZXNzIHRoaXMgZXhjZXB0aW9uIChmYWxzZSknLlBIUF9FT0wuCidTZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvYWxsb3ctcGx1Z2lucycKKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQbHVnaW47Cgp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50Owp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBQb3N0RmlsZURvd25sb2FkRXZlbnQgZXh0ZW5kcyBFdmVudAp7CgoKCnByaXZhdGUgJGZpbGVOYW1lOwoKCgoKcHJpdmF0ZSAkY2hlY2tzdW07CgoKCgpwcml2YXRlICR1cmw7CgoKCgpwcml2YXRlICRjb250ZXh0OwoKCgoKcHJpdmF0ZSAkdHlwZTsKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lLCA/c3RyaW5nICRmaWxlTmFtZSwgP3N0cmluZyAkY2hlY2tzdW0sIHN0cmluZyAkdXJsLCBzdHJpbmcgJHR5cGUsICRjb250ZXh0ID0gbnVsbCkKewoKaWYgKCRjb250ZXh0ID09PSBudWxsICYmICR0eXBlIGluc3RhbmNlb2YgUGFja2FnZUludGVyZmFjZSkgewokY29udGV4dCA9ICR0eXBlOwokdHlwZSA9ICdwYWNrYWdlJzsKdHJpZ2dlcl9lcnJvcignUG9zdEZpbGVEb3dubG9hZEV2ZW50OjpfX2NvbnN0cnVjdCBzaG91bGQgcmVjZWl2ZSBhICR0eXBlPXBhY2thZ2UgYW5kIHRoZSBwYWNrYWdlIG9iamVjdCBpbiAkY29udGV4dCBzaW5jZSBDb21wb3NlciAyLjEuJywgRV9VU0VSX0RFUFJFQ0FURUQpOwp9CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRuYW1lKTsKJHRoaXMtPmZpbGVOYW1lID0gJGZpbGVOYW1lOwokdGhpcy0+Y2hlY2tzdW0gPSAkY2hlY2tzdW07CiR0aGlzLT51cmwgPSAkdXJsOwokdGhpcy0+Y29udGV4dCA9ICRjb250ZXh0OwokdGhpcy0+dHlwZSA9ICR0eXBlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlTmFtZSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5maWxlTmFtZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENoZWNrc3VtKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmNoZWNrc3VtOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXJsKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+dXJsOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb250ZXh0KCkKewpyZXR1cm4gJHRoaXMtPmNvbnRleHQ7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhY2thZ2UoKTogP1BhY2thZ2VJbnRlcmZhY2UKewp0cmlnZ2VyX2Vycm9yKCdQb3N0RmlsZURvd25sb2FkRXZlbnQ6OmdldFBhY2thZ2UgaXMgZGVwcmVjYXRlZCBzaW5jZSBDb21wb3NlciAyLjEsIHVzZSBnZXRDb250ZXh0IGluc3RlYWQuJywgRV9VU0VSX0RFUFJFQ0FURUQpOwokY29udGV4dCA9ICR0aGlzLT5nZXRDb250ZXh0KCk7CgpyZXR1cm4gJGNvbnRleHQgaW5zdGFuY2VvZiBQYWNrYWdlSW50ZXJmYWNlID8gJGNvbnRleHQgOiBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VHlwZSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnR5cGU7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGx1Z2luOwoKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CgoKCgoKCmNsYXNzIFByZUNvbW1hbmRSdW5FdmVudCBleHRlbmRzIEV2ZW50CnsKCgoKcHJpdmF0ZSAkaW5wdXQ7CgoKCgpwcml2YXRlICRjb21tYW5kOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSwgSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBzdHJpbmcgJGNvbW1hbmQpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkbmFtZSk7CiR0aGlzLT5pbnB1dCA9ICRpbnB1dDsKJHRoaXMtPmNvbW1hbmQgPSAkY29tbWFuZDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldElucHV0KCk6IElucHV0SW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5pbnB1dDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbW1hbmQoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5jb21tYW5kOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBsdWdpbjsKCnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnQ7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBEb3dubG9hZGVyOwoKCgoKCgpjbGFzcyBQcmVGaWxlRG93bmxvYWRFdmVudCBleHRlbmRzIEV2ZW50CnsKCgoKcHJpdmF0ZSAkaHR0cERvd25sb2FkZXI7CgoKCgpwcml2YXRlICRwcm9jZXNzZWRVcmw7CgoKCgpwcml2YXRlICRjdXN0b21DYWNoZUtleTsKCgoKCnByaXZhdGUgJHR5cGU7CgoKCgpwcml2YXRlICRjb250ZXh0OwoKCgoKcHJpdmF0ZSAkdHJhbnNwb3J0T3B0aW9ucyA9IFtdOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG5hbWUsIEh0dHBEb3dubG9hZGVyICRodHRwRG93bmxvYWRlciwgc3RyaW5nICRwcm9jZXNzZWRVcmwsIHN0cmluZyAkdHlwZSwgJGNvbnRleHQgPSBudWxsKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJG5hbWUpOwokdGhpcy0+aHR0cERvd25sb2FkZXIgPSAkaHR0cERvd25sb2FkZXI7CiR0aGlzLT5wcm9jZXNzZWRVcmwgPSAkcHJvY2Vzc2VkVXJsOwokdGhpcy0+dHlwZSA9ICR0eXBlOwokdGhpcy0+Y29udGV4dCA9ICRjb250ZXh0Owp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SHR0cERvd25sb2FkZXIoKTogSHR0cERvd25sb2FkZXIKewpyZXR1cm4gJHRoaXMtPmh0dHBEb3dubG9hZGVyOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm9jZXNzZWRVcmwoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5wcm9jZXNzZWRVcmw7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByb2Nlc3NlZFVybChzdHJpbmcgJHByb2Nlc3NlZFVybCk6IHZvaWQKewokdGhpcy0+cHJvY2Vzc2VkVXJsID0gJHByb2Nlc3NlZFVybDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEN1c3RvbUNhY2hlS2V5KCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmN1c3RvbUNhY2hlS2V5Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDdXN0b21DYWNoZUtleSg/c3RyaW5nICRjdXN0b21DYWNoZUtleSk6IHZvaWQKewokdGhpcy0+Y3VzdG9tQ2FjaGVLZXkgPSAkY3VzdG9tQ2FjaGVLZXk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUeXBlKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+dHlwZTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29udGV4dCgpCnsKcmV0dXJuICR0aGlzLT5jb250ZXh0Owp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydE9wdGlvbnMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnRyYW5zcG9ydE9wdGlvbnM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VHJhbnNwb3J0T3B0aW9ucyhhcnJheSAkb3B0aW9ucyk6IHZvaWQKewokdGhpcy0+dHJhbnNwb3J0T3B0aW9ucyA9ICRvcHRpb25zOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBsdWdpbjsKCnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnQ7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcUmVxdWVzdDsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CgoKCgoKCmNsYXNzIFByZVBvb2xDcmVhdGVFdmVudCBleHRlbmRzIEV2ZW50CnsKCgoKcHJpdmF0ZSAkcmVwb3NpdG9yaWVzOwoKCgpwcml2YXRlICRyZXF1ZXN0OwoKCgoKcHJpdmF0ZSAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzOwoKCgoKcHJpdmF0ZSAkc3RhYmlsaXR5RmxhZ3M7CgoKCgpwcml2YXRlICRyb290QWxpYXNlczsKCgoKCnByaXZhdGUgJHJvb3RSZWZlcmVuY2VzOwoKCgpwcml2YXRlICRwYWNrYWdlczsKCgoKcHJpdmF0ZSAkdW5hY2NlcHRhYmxlRml4ZWRQYWNrYWdlczsKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG5hbWUsIGFycmF5ICRyZXBvc2l0b3JpZXMsIFJlcXVlc3QgJHJlcXVlc3QsIGFycmF5ICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMsIGFycmF5ICRzdGFiaWxpdHlGbGFncywgYXJyYXkgJHJvb3RBbGlhc2VzLCBhcnJheSAkcm9vdFJlZmVyZW5jZXMsIGFycmF5ICRwYWNrYWdlcywgYXJyYXkgJHVuYWNjZXB0YWJsZUZpeGVkUGFja2FnZXMpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkbmFtZSk7CgokdGhpcy0+cmVwb3NpdG9yaWVzID0gJHJlcG9zaXRvcmllczsKJHRoaXMtPnJlcXVlc3QgPSAkcmVxdWVzdDsKJHRoaXMtPmFjY2VwdGFibGVTdGFiaWxpdGllcyA9ICRhY2NlcHRhYmxlU3RhYmlsaXRpZXM7CiR0aGlzLT5zdGFiaWxpdHlGbGFncyA9ICRzdGFiaWxpdHlGbGFnczsKJHRoaXMtPnJvb3RBbGlhc2VzID0gJHJvb3RBbGlhc2VzOwokdGhpcy0+cm9vdFJlZmVyZW5jZXMgPSAkcm9vdFJlZmVyZW5jZXM7CiR0aGlzLT5wYWNrYWdlcyA9ICRwYWNrYWdlczsKJHRoaXMtPnVuYWNjZXB0YWJsZUZpeGVkUGFja2FnZXMgPSAkdW5hY2NlcHRhYmxlRml4ZWRQYWNrYWdlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9zaXRvcmllcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cmVwb3NpdG9yaWVzOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVxdWVzdCgpOiBSZXF1ZXN0CnsKcmV0dXJuICR0aGlzLT5yZXF1ZXN0Owp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFjY2VwdGFibGVTdGFiaWxpdGllcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWNjZXB0YWJsZVN0YWJpbGl0aWVzOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0YWJpbGl0eUZsYWdzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5zdGFiaWxpdHlGbGFnczsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSb290QWxpYXNlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cm9vdEFsaWFzZXM7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Um9vdFJlZmVyZW5jZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnJvb3RSZWZlcmVuY2VzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFja2FnZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnBhY2thZ2VzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VW5hY2NlcHRhYmxlRml4ZWRQYWNrYWdlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+dW5hY2NlcHRhYmxlRml4ZWRQYWNrYWdlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFBhY2thZ2VzKGFycmF5ICRwYWNrYWdlcyk6IHZvaWQKewokdGhpcy0+cGFja2FnZXMgPSAkcGFja2FnZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRVbmFjY2VwdGFibGVGaXhlZFBhY2thZ2VzKGFycmF5ICRwYWNrYWdlcyk6IHZvaWQKewokdGhpcy0+dW5hY2NlcHRhYmxlRml4ZWRQYWNrYWdlcyA9ICRwYWNrYWdlczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxRdWVzdGlvbjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFF1ZXN0aW9uXFF1ZXN0aW9uOwoKCgoKCgoKCmNsYXNzIFN0cmljdENvbmZpcm1hdGlvblF1ZXN0aW9uIGV4dGVuZHMgUXVlc3Rpb24KewoKcHJpdmF0ZSAkdHJ1ZUFuc3dlclJlZ2V4OwoKcHJpdmF0ZSAkZmFsc2VBbnN3ZXJSZWdleDsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkcXVlc3Rpb24sIGJvb2wgJGRlZmF1bHQgPSB0cnVlLCBzdHJpbmcgJHRydWVBbnN3ZXJSZWdleCA9ICcvXnkoPzplcyk/JC9pJywgc3RyaW5nICRmYWxzZUFuc3dlclJlZ2V4ID0gJy9ebm8/JC9pJykKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRxdWVzdGlvbiwgJGRlZmF1bHQpOwoKJHRoaXMtPnRydWVBbnN3ZXJSZWdleCA9ICR0cnVlQW5zd2VyUmVnZXg7CiR0aGlzLT5mYWxzZUFuc3dlclJlZ2V4ID0gJGZhbHNlQW5zd2VyUmVnZXg7CiR0aGlzLT5zZXROb3JtYWxpemVyKCR0aGlzLT5nZXREZWZhdWx0Tm9ybWFsaXplcigpKTsKJHRoaXMtPnNldFZhbGlkYXRvcigkdGhpcy0+Z2V0RGVmYXVsdFZhbGlkYXRvcigpKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXREZWZhdWx0Tm9ybWFsaXplcigpOiBjYWxsYWJsZQp7CiRkZWZhdWx0ID0gJHRoaXMtPmdldERlZmF1bHQoKTsKJHRydWVSZWdleCA9ICR0aGlzLT50cnVlQW5zd2VyUmVnZXg7CiRmYWxzZVJlZ2V4ID0gJHRoaXMtPmZhbHNlQW5zd2VyUmVnZXg7CgpyZXR1cm4gc3RhdGljIGZ1bmN0aW9uICgkYW5zd2VyKSB1c2UgKCRkZWZhdWx0LCAkdHJ1ZVJlZ2V4LCAkZmFsc2VSZWdleCkgewppZiAoaXNfYm9vbCgkYW5zd2VyKSkgewpyZXR1cm4gJGFuc3dlcjsKfQppZiAoZW1wdHkoJGFuc3dlcikgJiYgIWVtcHR5KCRkZWZhdWx0KSkgewpyZXR1cm4gJGRlZmF1bHQ7Cn0KCmlmIChQcmVnOjppc01hdGNoKCR0cnVlUmVnZXgsICRhbnN3ZXIpKSB7CnJldHVybiB0cnVlOwp9CgppZiAoUHJlZzo6aXNNYXRjaCgkZmFsc2VSZWdleCwgJGFuc3dlcikpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gbnVsbDsKfTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXREZWZhdWx0VmFsaWRhdG9yKCk6IGNhbGxhYmxlCnsKcmV0dXJuIHN0YXRpYyBmdW5jdGlvbiAoJGFuc3dlcik6IGJvb2wgewppZiAoIWlzX2Jvb2woJGFuc3dlcikpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUGxlYXNlIGFuc3dlciB5ZXMsIHksIG5vLCBvciBuLicpOwp9CgpyZXR1cm4gJGFuc3dlcjsKfTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxBZHZpc29yeVxQYXJ0aWFsU2VjdXJpdHlBZHZpc29yeTsKdXNlIENvbXBvc2VyXEFkdmlzb3J5XFNlY3VyaXR5QWR2aXNvcnk7CgoKCgoKCgppbnRlcmZhY2UgQWR2aXNvcnlQcm92aWRlckludGVyZmFjZQp7CnB1YmxpYyBmdW5jdGlvbiBoYXNTZWN1cml0eUFkdmlzb3JpZXMoKTogYm9vbDsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U2VjdXJpdHlBZHZpc29yaWVzKGFycmF5ICRwYWNrYWdlQ29uc3RyYWludE1hcCwgYm9vbCAkYWxsb3dQYXJ0aWFsQWR2aXNvcmllcyA9IGZhbHNlKTogYXJyYXk7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZUFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxTdGFiaWxpdHlGaWx0ZXI7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKCgoKCgoKY2xhc3MgQXJyYXlSZXBvc2l0b3J5IGltcGxlbWVudHMgUmVwb3NpdG9yeUludGVyZmFjZQp7Cgpwcm90ZWN0ZWQgJHBhY2thZ2VzID0gbnVsbDsKCgoKCnByb3RlY3RlZCAkcGFja2FnZU1hcCA9IG51bGw7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJHBhY2thZ2VzID0gW10pCnsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiR0aGlzLT5hZGRQYWNrYWdlKCRwYWNrYWdlKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb05hbWUoKQp7CnJldHVybiAnYXJyYXkgcmVwbyAoZGVmaW5pbmcgJy4kdGhpcy0+Y291bnQoKS4nIHBhY2thZ2UnLigkdGhpcy0+Y291bnQoKSA+IDEgPyAncycgOiAnJykuJyknOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbG9hZFBhY2thZ2VzKGFycmF5ICRwYWNrYWdlTmFtZU1hcCwgYXJyYXkgJGFjY2VwdGFibGVTdGFiaWxpdGllcywgYXJyYXkgJHN0YWJpbGl0eUZsYWdzLCBhcnJheSAkYWxyZWFkeUxvYWRlZCA9IFtdKQp7CiRwYWNrYWdlcyA9ICR0aGlzLT5nZXRQYWNrYWdlcygpOwoKJHJlc3VsdCA9IFtdOwokbmFtZXNGb3VuZCA9IFtdOwpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKaWYgKGFycmF5X2tleV9leGlzdHMoJHBhY2thZ2UtPmdldE5hbWUoKSwgJHBhY2thZ2VOYW1lTWFwKSkgewppZiAoCighJHBhY2thZ2VOYW1lTWFwWyRwYWNrYWdlLT5nZXROYW1lKCldIHx8ICRwYWNrYWdlTmFtZU1hcFskcGFja2FnZS0+Z2V0TmFtZSgpXS0+bWF0Y2hlcyhuZXcgQ29uc3RyYWludCgnPT0nLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKSkpCiYmIFN0YWJpbGl0eUZpbHRlcjo6aXNQYWNrYWdlQWNjZXB0YWJsZSgkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCAkc3RhYmlsaXR5RmxhZ3MsICRwYWNrYWdlLT5nZXROYW1lcygpLCAkcGFja2FnZS0+Z2V0U3RhYmlsaXR5KCkpCiYmICFpc3NldCgkYWxyZWFkeUxvYWRlZFskcGFja2FnZS0+Z2V0TmFtZSgpXVskcGFja2FnZS0+Z2V0VmVyc2lvbigpXSkKKSB7CgokcmVzdWx0W3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldID0gJHBhY2thZ2U7CgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UgJiYgIWlzc2V0KCRyZXN1bHRbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlLT5nZXRBbGlhc09mKCkpXSkpIHsKJHJlc3VsdFtzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UtPmdldEFsaWFzT2YoKSldID0gJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKfQp9CgokbmFtZXNGb3VuZFskcGFja2FnZS0+Z2V0TmFtZSgpXSA9IHRydWU7Cn0KfQoKCmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKaWYgKGlzc2V0KCRyZXN1bHRbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlLT5nZXRBbGlhc09mKCkpXSkpIHsKJHJlc3VsdFtzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSA9ICRwYWNrYWdlOwp9Cn0KfQoKcmV0dXJuIFsnbmFtZXNGb3VuZCcgPT4gYXJyYXlfa2V5cygkbmFtZXNGb3VuZCksICdwYWNrYWdlcycgPT4gJHJlc3VsdF07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kUGFja2FnZShzdHJpbmcgJG5hbWUsICRjb25zdHJhaW50KQp7CiRuYW1lID0gc3RydG9sb3dlcigkbmFtZSk7CgppZiAoISRjb25zdHJhaW50IGluc3RhbmNlb2YgQ29uc3RyYWludEludGVyZmFjZSkgewokdmVyc2lvblBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyKCk7CiRjb25zdHJhaW50ID0gJHZlcnNpb25QYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJGNvbnN0cmFpbnQpOwp9Cgpmb3JlYWNoICgkdGhpcy0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoJG5hbWUgPT09ICRwYWNrYWdlLT5nZXROYW1lKCkpIHsKJHBrZ0NvbnN0cmFpbnQgPSBuZXcgQ29uc3RyYWludCgnPT0nLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKTsKaWYgKCRjb25zdHJhaW50LT5tYXRjaGVzKCRwa2dDb25zdHJhaW50KSkgewpyZXR1cm4gJHBhY2thZ2U7Cn0KfQp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmRQYWNrYWdlcyhzdHJpbmcgJG5hbWUsICRjb25zdHJhaW50ID0gbnVsbCkKewoKJG5hbWUgPSBzdHJ0b2xvd2VyKCRuYW1lKTsKJHBhY2thZ2VzID0gW107CgppZiAobnVsbCAhPT0gJGNvbnN0cmFpbnQgJiYgISRjb25zdHJhaW50IGluc3RhbmNlb2YgQ29uc3RyYWludEludGVyZmFjZSkgewokdmVyc2lvblBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyKCk7CiRjb25zdHJhaW50ID0gJHZlcnNpb25QYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJGNvbnN0cmFpbnQpOwp9Cgpmb3JlYWNoICgkdGhpcy0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoJG5hbWUgPT09ICRwYWNrYWdlLT5nZXROYW1lKCkpIHsKaWYgKG51bGwgPT09ICRjb25zdHJhaW50IHx8ICRjb25zdHJhaW50LT5tYXRjaGVzKG5ldyBDb25zdHJhaW50KCc9PScsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkpKSkgewokcGFja2FnZXNbXSA9ICRwYWNrYWdlOwp9Cn0KfQoKcmV0dXJuICRwYWNrYWdlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNlYXJjaChzdHJpbmcgJHF1ZXJ5LCBpbnQgJG1vZGUgPSAwLCA/c3RyaW5nICR0eXBlID0gbnVsbCkKewppZiAoJG1vZGUgPT09IHNlbGY6OlNFQVJDSF9GVUxMVEVYVCkgewokcmVnZXggPSAneyg/OicuaW1wbG9kZSgnfCcsIFByZWc6OnNwbGl0KCd7XHMrfScsIHByZWdfcXVvdGUoJHF1ZXJ5KSkpLicpfWknOwp9IGVsc2UgewoKJHJlZ2V4ID0gJ3soPzonLmltcGxvZGUoJ3wnLCBQcmVnOjpzcGxpdCgne1xzK30nLCAkcXVlcnkpKS4nKX1pJzsKfQoKJG1hdGNoZXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKJG5hbWUgPSAkcGFja2FnZS0+Z2V0TmFtZSgpOwppZiAoJG1vZGUgPT09IHNlbGY6OlNFQVJDSF9WRU5ET1IpIHsKWyRuYW1lXSA9IGV4cGxvZGUoJy8nLCAkbmFtZSk7Cn0KaWYgKGlzc2V0KCRtYXRjaGVzWyRuYW1lXSkpIHsKY29udGludWU7Cn0KaWYgKG51bGwgIT09ICR0eXBlICYmICRwYWNrYWdlLT5nZXRUeXBlKCkgIT09ICR0eXBlKSB7CmNvbnRpbnVlOwp9CgppZiAoUHJlZzo6aXNNYXRjaCgkcmVnZXgsICRuYW1lKQp8fCAoJG1vZGUgPT09IHNlbGY6OlNFQVJDSF9GVUxMVEVYVCAmJiAkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAmJiBQcmVnOjppc01hdGNoKCRyZWdleCwgaW1wbG9kZSgnICcsIChhcnJheSkgJHBhY2thZ2UtPmdldEtleXdvcmRzKCkpIC4gJyAnIC4gJHBhY2thZ2UtPmdldERlc2NyaXB0aW9uKCkpKQopIHsKaWYgKCRtb2RlID09PSBzZWxmOjpTRUFSQ0hfVkVORE9SKSB7CiRtYXRjaGVzWyRuYW1lXSA9IFsKJ25hbWUnID0+ICRuYW1lLAonZGVzY3JpcHRpb24nID0+IG51bGwsCl07Cn0gZWxzZSB7CiRtYXRjaGVzWyRuYW1lXSA9IFsKJ25hbWUnID0+ICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCksCidkZXNjcmlwdGlvbicgPT4gJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgPyAkcGFja2FnZS0+Z2V0RGVzY3JpcHRpb24oKSA6IG51bGwsCl07CgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJiYgJHBhY2thZ2UtPmlzQWJhbmRvbmVkKCkpIHsKJG1hdGNoZXNbJG5hbWVdWydhYmFuZG9uZWQnXSA9ICRwYWNrYWdlLT5nZXRSZXBsYWNlbWVudFBhY2thZ2UoKSA/OiB0cnVlOwp9Cn0KfQp9CgpyZXR1cm4gYXJyYXlfdmFsdWVzKCRtYXRjaGVzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc1BhY2thZ2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewppZiAoJHRoaXMtPnBhY2thZ2VNYXAgPT09IG51bGwpIHsKJHRoaXMtPnBhY2thZ2VNYXAgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPmdldFBhY2thZ2VzKCkgYXMgJHJlcG9QYWNrYWdlKSB7CiR0aGlzLT5wYWNrYWdlTWFwWyRyZXBvUGFja2FnZS0+Z2V0VW5pcXVlTmFtZSgpXSA9ICRyZXBvUGFja2FnZTsKfQp9CgpyZXR1cm4gaXNzZXQoJHRoaXMtPnBhY2thZ2VNYXBbJHBhY2thZ2UtPmdldFVuaXF1ZU5hbWUoKV0pOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKaWYgKCEkcGFja2FnZSBpbnN0YW5jZW9mIEJhc2VQYWNrYWdlKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdPbmx5IHN1YmNsYXNzZXMgb2YgQmFzZVBhY2thZ2UgYXJlIHN1cHBvcnRlZCcpOwp9CmlmIChudWxsID09PSAkdGhpcy0+cGFja2FnZXMpIHsKJHRoaXMtPmluaXRpYWxpemUoKTsKfQokcGFja2FnZS0+c2V0UmVwb3NpdG9yeSgkdGhpcyk7CiR0aGlzLT5wYWNrYWdlc1tdID0gJHBhY2thZ2U7CgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJGFsaWFzZWRQYWNrYWdlID0gJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKaWYgKG51bGwgPT09ICRhbGlhc2VkUGFja2FnZS0+Z2V0UmVwb3NpdG9yeSgpKSB7CiR0aGlzLT5hZGRQYWNrYWdlKCRhbGlhc2VkUGFja2FnZSk7Cn0KfQoKCiR0aGlzLT5wYWNrYWdlTWFwID0gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByb3ZpZGVycyhzdHJpbmcgJHBhY2thZ2VOYW1lKQp7CiRyZXN1bHQgPSBbXTsKCmZvcmVhY2ggKCR0aGlzLT5nZXRQYWNrYWdlcygpIGFzICRjYW5kaWRhdGUpIHsKaWYgKGlzc2V0KCRyZXN1bHRbJGNhbmRpZGF0ZS0+Z2V0TmFtZSgpXSkpIHsKY29udGludWU7Cn0KZm9yZWFjaCAoJGNhbmRpZGF0ZS0+Z2V0UHJvdmlkZXMoKSBhcyAkbGluaykgewppZiAoJHBhY2thZ2VOYW1lID09PSAkbGluay0+Z2V0VGFyZ2V0KCkpIHsKJHJlc3VsdFskY2FuZGlkYXRlLT5nZXROYW1lKCldID0gWwonbmFtZScgPT4gJGNhbmRpZGF0ZS0+Z2V0TmFtZSgpLAonZGVzY3JpcHRpb24nID0+ICRjYW5kaWRhdGUgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgPyAkY2FuZGlkYXRlLT5nZXREZXNjcmlwdGlvbigpIDogbnVsbCwKJ3R5cGUnID0+ICRjYW5kaWRhdGUtPmdldFR5cGUoKSwKXTsKY29udGludWUgMjsKfQp9Cn0KCnJldHVybiAkcmVzdWx0Owp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY3JlYXRlQWxpYXNQYWNrYWdlKEJhc2VQYWNrYWdlICRwYWNrYWdlLCBzdHJpbmcgJGFsaWFzLCBzdHJpbmcgJHByZXR0eUFsaWFzKQp7CndoaWxlICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokcGFja2FnZSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7Cn0KCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZSkgewpyZXR1cm4gbmV3IENvbXBsZXRlQWxpYXNQYWNrYWdlKCRwYWNrYWdlLCAkYWxpYXMsICRwcmV0dHlBbGlhcyk7Cn0KCnJldHVybiBuZXcgQWxpYXNQYWNrYWdlKCRwYWNrYWdlLCAkYWxpYXMsICRwcmV0dHlBbGlhcyk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CiRwYWNrYWdlSWQgPSAkcGFja2FnZS0+Z2V0VW5pcXVlTmFtZSgpOwoKZm9yZWFjaCAoJHRoaXMtPmdldFBhY2thZ2VzKCkgYXMgJGtleSA9PiAkcmVwb1BhY2thZ2UpIHsKaWYgKCRwYWNrYWdlSWQgPT09ICRyZXBvUGFja2FnZS0+Z2V0VW5pcXVlTmFtZSgpKSB7CmFycmF5X3NwbGljZSgkdGhpcy0+cGFja2FnZXMsICRrZXksIDEpOwoKCiR0aGlzLT5wYWNrYWdlTWFwID0gbnVsbDsKCnJldHVybjsKfQp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWNrYWdlcygpCnsKaWYgKG51bGwgPT09ICR0aGlzLT5wYWNrYWdlcykgewokdGhpcy0+aW5pdGlhbGl6ZSgpOwp9CgppZiAobnVsbCA9PT0gJHRoaXMtPnBhY2thZ2VzKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ2luaXRpYWxpemUgZmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIHBhY2thZ2VzIGFycmF5Jyk7Cn0KCnJldHVybiAkdGhpcy0+cGFja2FnZXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvdW50KCk6IGludAp7CmlmIChudWxsID09PSAkdGhpcy0+cGFja2FnZXMpIHsKJHRoaXMtPmluaXRpYWxpemUoKTsKfQoKcmV0dXJuIGNvdW50KCR0aGlzLT5wYWNrYWdlcyk7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluaXRpYWxpemUoKQp7CiR0aGlzLT5wYWNrYWdlcyA9IFtdOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7Cgp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXEFycmF5TG9hZGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcTG9hZGVySW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFV0aWxcVGFyOwp1c2UgQ29tcG9zZXJcVXRpbFxaaXA7CgoKCgpjbGFzcyBBcnRpZmFjdFJlcG9zaXRvcnkgZXh0ZW5kcyBBcnJheVJlcG9zaXRvcnkgaW1wbGVtZW50cyBDb25maWd1cmFibGVSZXBvc2l0b3J5SW50ZXJmYWNlCnsKCnByb3RlY3RlZCAkbG9hZGVyOwoKCnByb3RlY3RlZCAkbG9va3VwOwoKcHJvdGVjdGVkICRyZXBvQ29uZmlnOwoKcHJpdmF0ZSAkaW87CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJHJlcG9Db25maWcsIElPSW50ZXJmYWNlICRpbykKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCk7CmlmICghZXh0ZW5zaW9uX2xvYWRlZCgnemlwJykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgYXJ0aWZhY3QgcmVwb3NpdG9yeSByZXF1aXJlcyBQSFBcJ3MgemlwIGV4dGVuc2lvbicpOwp9CgokdGhpcy0+bG9hZGVyID0gbmV3IEFycmF5TG9hZGVyKCk7CiR0aGlzLT5sb29rdXAgPSBQbGF0Zm9ybTo6ZXhwYW5kUGF0aCgkcmVwb0NvbmZpZ1sndXJsJ10pOwokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5yZXBvQ29uZmlnID0gJHJlcG9Db25maWc7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvTmFtZSgpCnsKcmV0dXJuICdhcnRpZmFjdCByZXBvICgnLiR0aGlzLT5sb29rdXAuJyknOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb0NvbmZpZygpCnsKcmV0dXJuICR0aGlzLT5yZXBvQ29uZmlnOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpCnsKcGFyZW50Ojppbml0aWFsaXplKCk7CgokdGhpcy0+c2NhbkRpcmVjdG9yeSgkdGhpcy0+bG9va3VwKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBzY2FuRGlyZWN0b3J5KHN0cmluZyAkcGF0aCk6IHZvaWQKewokaW8gPSAkdGhpcy0+aW87CgokZGlyZWN0b3J5ID0gbmV3IFxSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkcGF0aCwgXFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yOjpGT0xMT1dfU1lNTElOS1MpOwokaXRlcmF0b3IgPSBuZXcgXFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoJGRpcmVjdG9yeSk7CiRyZWdleCA9IG5ldyBcUmVnZXhJdGVyYXRvcigkaXRlcmF0b3IsICcvXi4rXC4oemlwfHRhcnxnenx0Z3opJC9pJyk7CmZvcmVhY2ggKCRyZWdleCBhcyAkZmlsZSkgewoKaWYgKCEkZmlsZS0+aXNGaWxlKCkpIHsKY29udGludWU7Cn0KCiRwYWNrYWdlID0gJHRoaXMtPmdldENvbXBvc2VySW5mb3JtYXRpb24oJGZpbGUpOwppZiAoISRwYWNrYWdlKSB7CiRpby0+d3JpdGVFcnJvcigiRmlsZSA8Y29tbWVudD57JGZpbGUtPmdldEJhc2VuYW1lKCl9PC9jb21tZW50PiBkb2Vzbid0IHNlZW0gdG8gaG9sZCBhIHBhY2thZ2UiLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7CmNvbnRpbnVlOwp9CgokdGVtcGxhdGUgPSAnRm91bmQgcGFja2FnZSA8aW5mbz4lczwvaW5mbz4gKDxjb21tZW50PiVzPC9jb21tZW50PikgaW4gZmlsZSA8aW5mbz4lczwvaW5mbz4nOwokaW8tPndyaXRlRXJyb3Ioc3ByaW50ZigkdGVtcGxhdGUsICRwYWNrYWdlLT5nZXROYW1lKCksICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCksICRmaWxlLT5nZXRCYXNlbmFtZSgpKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUkJPU0UpOwoKJHRoaXMtPmFkZFBhY2thZ2UoJHBhY2thZ2UpOwp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0Q29tcG9zZXJJbmZvcm1hdGlvbihcU3BsRmlsZUluZm8gJGZpbGUpOiA/QmFzZVBhY2thZ2UKewokanNvbiA9IG51bGw7CiRmaWxlVHlwZSA9IG51bGw7CiRmaWxlRXh0ZW5zaW9uID0gcGF0aGluZm8oJGZpbGUtPmdldFBhdGhuYW1lKCksIFBBVEhJTkZPX0VYVEVOU0lPTik7CmlmIChpbl9hcnJheSgkZmlsZUV4dGVuc2lvbiwgWydneicsICd0YXInLCAndGd6J10sIHRydWUpKSB7CiRmaWxlVHlwZSA9ICd0YXInOwp9IGVsc2VpZiAoJGZpbGVFeHRlbnNpb24gPT09ICd6aXAnKSB7CiRmaWxlVHlwZSA9ICd6aXAnOwp9IGVsc2Ugewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZpbGVzIHdpdGggIicuJGZpbGVFeHRlbnNpb24uJyIgZXh0ZW5zaW9ucyBhcmVuXCd0IHN1cHBvcnRlZC4gT25seSBaSVAgYW5kIFRBUi9UQVIuR1ovVEdaIGFyY2hpdmVzIGFyZSBzdXBwb3J0ZWQuJyk7Cn0KCnRyeSB7CmlmICgkZmlsZVR5cGUgPT09ICd0YXInKSB7CiRqc29uID0gVGFyOjpnZXRDb21wb3Nlckpzb24oJGZpbGUtPmdldFBhdGhuYW1lKCkpOwp9IGVsc2UgewokanNvbiA9IFppcDo6Z2V0Q29tcG9zZXJKc29uKCRmaWxlLT5nZXRQYXRobmFtZSgpKTsKfQp9IGNhdGNoIChcRXhjZXB0aW9uICRleGNlcHRpb24pIHsKJHRoaXMtPmlvLT53cml0ZSgnRmFpbGVkIGxvYWRpbmcgcGFja2FnZSAnLiRmaWxlLT5nZXRQYXRobmFtZSgpLic6ICcuJGV4Y2VwdGlvbi0+Z2V0TWVzc2FnZSgpLCBmYWxzZSwgSU9JbnRlcmZhY2U6OlZFUkJPU0UpOwp9CgppZiAobnVsbCA9PT0gJGpzb24pIHsKcmV0dXJuIG51bGw7Cn0KCiRwYWNrYWdlID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkanNvbiwgJGZpbGUtPmdldFBhdGhuYW1lKCkuJyNjb21wb3Nlci5qc29uJyk7CiRwYWNrYWdlWydkaXN0J10gPSBbCid0eXBlJyA9PiAkZmlsZVR5cGUsCid1cmwnID0+IHN0cnRyKCRmaWxlLT5nZXRQYXRobmFtZSgpLCAnXFwnLCAnLycpLAonc2hhc3VtJyA9PiBoYXNoX2ZpbGUoJ3NoYTEnLCAkZmlsZS0+Z2V0UmVhbFBhdGgoKSksCl07Cgp0cnkgewokcGFja2FnZSA9ICR0aGlzLT5sb2FkZXItPmxvYWQoJHBhY2thZ2UpOwp9IGNhdGNoIChcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uICRlKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdGYWlsZWQgbG9hZGluZyBwYWNrYWdlIGluICcuJGZpbGUuJzogJy4kZS0+Z2V0TWVzc2FnZSgpLCAwLCAkZSk7Cn0KCnJldHVybiAkcGFja2FnZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwoKCgoKCgp0cmFpdCBDYW5vbmljYWxQYWNrYWdlc1RyYWl0CnsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2Fub25pY2FsUGFja2FnZXMoKQp7CiRwYWNrYWdlcyA9ICR0aGlzLT5nZXRQYWNrYWdlcygpOwoKCiRwYWNrYWdlc0J5TmFtZSA9IFtdOwpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKaWYgKCFpc3NldCgkcGFja2FnZXNCeU5hbWVbJHBhY2thZ2UtPmdldE5hbWUoKV0pIHx8ICRwYWNrYWdlc0J5TmFtZVskcGFja2FnZS0+Z2V0TmFtZSgpXSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokcGFja2FnZXNCeU5hbWVbJHBhY2thZ2UtPmdldE5hbWUoKV0gPSAkcGFja2FnZTsKfQp9CgokY2Fub25pY2FsUGFja2FnZXMgPSBbXTsKCgpmb3JlYWNoICgkcGFja2FnZXNCeU5hbWUgYXMgJHBhY2thZ2UpIHsKd2hpbGUgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiRwYWNrYWdlID0gJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKfQoKJGNhbm9uaWNhbFBhY2thZ2VzW10gPSAkcGFja2FnZTsKfQoKcmV0dXJuICRjYW5vbmljYWxQYWNrYWdlczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXEFkdmlzb3J5XFBhcnRpYWxTZWN1cml0eUFkdmlzb3J5Owp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcU2VjdXJpdHlBZHZpc29yeTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxBcnJheUxvYWRlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cU3RhYmlsaXR5RmlsdGVyOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXENhY2hlOwp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxQbHVnaW5cUG9zdEZpbGVEb3dubG9hZEV2ZW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbXBpbGluZ01hdGNoZXI7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBEb3dubG9hZGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxMb29wOwp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXFBsdWdpblxQcmVGaWxlRG93bmxvYWRFdmVudDsKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudERpc3BhdGNoZXI7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcTWF0Y2hBbGxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwXFJlc3BvbnNlOwp1c2UgQ29tcG9zZXJcTWV0YWRhdGFNaW5pZmllclxNZXRhZGF0YU1pbmlmaWVyOwp1c2UgQ29tcG9zZXJcVXRpbFxVcmw7CnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CgoKCgpjbGFzcyBDb21wb3NlclJlcG9zaXRvcnkgZXh0ZW5kcyBBcnJheVJlcG9zaXRvcnkgaW1wbGVtZW50cyBDb25maWd1cmFibGVSZXBvc2l0b3J5SW50ZXJmYWNlLCBBZHZpc29yeVByb3ZpZGVySW50ZXJmYWNlCnsKCgoKCnByaXZhdGUgJHJlcG9Db25maWc7Cgpwcml2YXRlICRvcHRpb25zOwoKcHJpdmF0ZSAkdXJsOwoKcHJpdmF0ZSAkYmFzZVVybDsKCnByaXZhdGUgJGlvOwoKcHJpdmF0ZSAkaHR0cERvd25sb2FkZXI7Cgpwcml2YXRlICRsb29wOwoKcHJvdGVjdGVkICRjYWNoZTsKCnByb3RlY3RlZCAkbm90aWZ5VXJsID0gbnVsbDsKCnByb3RlY3RlZCAkc2VhcmNoVXJsID0gbnVsbDsKCnByb3RlY3RlZCAkcHJvdmlkZXJzQXBpVXJsID0gbnVsbDsKCnByb3RlY3RlZCAkaGFzUHJvdmlkZXJzID0gZmFsc2U7Cgpwcm90ZWN0ZWQgJHByb3ZpZGVyc1VybCA9IG51bGw7Cgpwcm90ZWN0ZWQgJGxpc3RVcmwgPSBudWxsOwoKcHJvdGVjdGVkICRoYXNBdmFpbGFibGVQYWNrYWdlTGlzdCA9IGZhbHNlOwoKcHJvdGVjdGVkICRhdmFpbGFibGVQYWNrYWdlcyA9IG51bGw7Cgpwcm90ZWN0ZWQgJGF2YWlsYWJsZVBhY2thZ2VQYXR0ZXJucyA9IG51bGw7Cgpwcm90ZWN0ZWQgJGxhenlQcm92aWRlcnNVcmwgPSBudWxsOwoKcHJvdGVjdGVkICRwcm92aWRlckxpc3Rpbmc7Cgpwcm90ZWN0ZWQgJGxvYWRlcjsKCnByaXZhdGUgJGFsbG93U3NsRG93bmdyYWRlID0gZmFsc2U7Cgpwcml2YXRlICRldmVudERpc3BhdGNoZXI7Cgpwcml2YXRlICRzb3VyY2VNaXJyb3JzOwoKcHJpdmF0ZSAkZGlzdE1pcnJvcnM7Cgpwcml2YXRlICRkZWdyYWRlZE1vZGUgPSBmYWxzZTsKCnByaXZhdGUgJHJvb3REYXRhOwoKcHJpdmF0ZSAkaGFzUGFydGlhbFBhY2thZ2VzID0gZmFsc2U7Cgpwcml2YXRlICRwYXJ0aWFsUGFja2FnZXNCeU5hbWUgPSBudWxsOwoKcHJpdmF0ZSAkZGlzcGxheWVkV2FybmluZ0Fib3V0Tm9uTWF0Y2hpbmdQYWNrYWdlSW5kZXggPSBmYWxzZTsKCnByaXZhdGUgJHNlY3VyaXR5QWR2aXNvcnlDb25maWcgPSBudWxsOwoKCgoKCgpwcml2YXRlICRmcmVzaE1ldGFkYXRhVXJscyA9IFtdOwoKCgoKCgpwcml2YXRlICRwYWNrYWdlc05vdEZvdW5kQ2FjaGUgPSBbXTsKCgoKCnByaXZhdGUgJHZlcnNpb25QYXJzZXI7CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRyZXBvQ29uZmlnLCBJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBIdHRwRG93bmxvYWRlciAkaHR0cERvd25sb2FkZXIsID9FdmVudERpc3BhdGNoZXIgJGV2ZW50RGlzcGF0Y2hlciA9IG51bGwpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgpOwppZiAoIVByZWc6OmlzTWF0Y2goJ3teW1x3Ll0rXD8/Oi8vfScsICRyZXBvQ29uZmlnWyd1cmwnXSkpIHsKaWYgKCgkbG9jYWxGaWxlUGF0aCA9IHJlYWxwYXRoKCRyZXBvQ29uZmlnWyd1cmwnXSkpICE9PSBmYWxzZSkgewoKJHJlcG9Db25maWdbJ3VybCddID0gJ2ZpbGU6Ly8nLiRsb2NhbEZpbGVQYXRoOwp9IGVsc2UgewoKJHJlcG9Db25maWdbJ3VybCddID0gJ2h0dHA6Ly8nLiRyZXBvQ29uZmlnWyd1cmwnXTsKfQp9CiRyZXBvQ29uZmlnWyd1cmwnXSA9IHJ0cmltKCRyZXBvQ29uZmlnWyd1cmwnXSwgJy8nKTsKaWYgKCRyZXBvQ29uZmlnWyd1cmwnXSA9PT0gJycpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSByZXBvc2l0b3J5IHVybCBtdXN0IG5vdCBiZSBhbiBlbXB0eSBzdHJpbmcnKTsKfQoKaWYgKHN0cl9zdGFydHNfd2l0aCgkcmVwb0NvbmZpZ1sndXJsJ10sICdodHRwcz8nKSkgewokcmVwb0NvbmZpZ1sndXJsJ10gPSAoZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpID8gJ2h0dHBzJyA6ICdodHRwJykgLiBzdWJzdHIoJHJlcG9Db25maWdbJ3VybCddLCA2KTsKfQoKJHVybEJpdHMgPSBwYXJzZV91cmwoc3RydHIoJHJlcG9Db25maWdbJ3VybCddLCAnXFwnLCAnLycpKTsKaWYgKCR1cmxCaXRzID09PSBmYWxzZSB8fCBlbXB0eSgkdXJsQml0c1snc2NoZW1lJ10pKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdJbnZhbGlkIHVybCBnaXZlbiBmb3IgQ29tcG9zZXIgcmVwb3NpdG9yeTogJy4kcmVwb0NvbmZpZ1sndXJsJ10pOwp9CgppZiAoIWlzc2V0KCRyZXBvQ29uZmlnWydvcHRpb25zJ10pKSB7CiRyZXBvQ29uZmlnWydvcHRpb25zJ10gPSBbXTsKfQppZiAoaXNzZXQoJHJlcG9Db25maWdbJ2FsbG93X3NzbF9kb3duZ3JhZGUnXSkgJiYgdHJ1ZSA9PT0gJHJlcG9Db25maWdbJ2FsbG93X3NzbF9kb3duZ3JhZGUnXSkgewokdGhpcy0+YWxsb3dTc2xEb3duZ3JhZGUgPSB0cnVlOwp9CgokdGhpcy0+b3B0aW9ucyA9ICRyZXBvQ29uZmlnWydvcHRpb25zJ107CiR0aGlzLT51cmwgPSAkcmVwb0NvbmZpZ1sndXJsJ107CgoKaWYgKFByZWc6OmlzTWF0Y2goJ3teKD9QPHByb3RvPmh0dHBzPyk6Ly9wYWNrYWdpc3RcLm9yZy8/JH1pJywgJHRoaXMtPnVybCwgJG1hdGNoKSkgewokdGhpcy0+dXJsID0gJG1hdGNoWydwcm90byddLic6Ly9yZXBvLnBhY2thZ2lzdC5vcmcnOwp9CgokYmFzZVVybCA9IHJ0cmltKFByZWc6OnJlcGxhY2UoJ3soPzovW14vXFxcXF0rXC5qc29uKT8oPzpbPyNdLiopPyR9JywgJycsICR0aGlzLT51cmwpLCAnLycpOwphc3NlcnQoJGJhc2VVcmwgIT09ICcnKTsKJHRoaXMtPmJhc2VVcmwgPSAkYmFzZVVybDsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+Y2FjaGUgPSBuZXcgQ2FjaGUoJGlvLCAkY29uZmlnLT5nZXQoJ2NhY2hlLXJlcG8tZGlyJykuJy8nLlByZWc6OnJlcGxhY2UoJ3tbXmEtejAtOS5dfWknLCAnLScsIFVybDo6c2FuaXRpemUoJHRoaXMtPnVybCkpLCAnYS16MC05LiR+XycpOwokdGhpcy0+Y2FjaGUtPnNldFJlYWRPbmx5KCRjb25maWctPmdldCgnY2FjaGUtcmVhZC1vbmx5JykpOwokdGhpcy0+dmVyc2lvblBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyKCk7CiR0aGlzLT5sb2FkZXIgPSBuZXcgQXJyYXlMb2FkZXIoJHRoaXMtPnZlcnNpb25QYXJzZXIpOwokdGhpcy0+aHR0cERvd25sb2FkZXIgPSAkaHR0cERvd25sb2FkZXI7CiR0aGlzLT5ldmVudERpc3BhdGNoZXIgPSAkZXZlbnREaXNwYXRjaGVyOwokdGhpcy0+cmVwb0NvbmZpZyA9ICRyZXBvQ29uZmlnOwokdGhpcy0+bG9vcCA9IG5ldyBMb29wKCR0aGlzLT5odHRwRG93bmxvYWRlcik7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvTmFtZSgpCnsKcmV0dXJuICdjb21wb3NlciByZXBvICgnLlVybDo6c2FuaXRpemUoJHRoaXMtPnVybCkuJyknOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb0NvbmZpZygpCnsKcmV0dXJuICR0aGlzLT5yZXBvQ29uZmlnOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZFBhY2thZ2Uoc3RyaW5nICRuYW1lLCAkY29uc3RyYWludCkKewoKJGhhc1Byb3ZpZGVycyA9ICR0aGlzLT5oYXNQcm92aWRlcnMoKTsKCiRuYW1lID0gc3RydG9sb3dlcigkbmFtZSk7CmlmICghJGNvbnN0cmFpbnQgaW5zdGFuY2VvZiBDb25zdHJhaW50SW50ZXJmYWNlKSB7CiRjb25zdHJhaW50ID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJGNvbnN0cmFpbnQpOwp9CgppZiAoJHRoaXMtPmxhenlQcm92aWRlcnNVcmwpIHsKaWYgKCR0aGlzLT5oYXNQYXJ0aWFsUGFja2FnZXMoKSAmJiBpc3NldCgkdGhpcy0+cGFydGlhbFBhY2thZ2VzQnlOYW1lWyRuYW1lXSkpIHsKcmV0dXJuICR0aGlzLT5maWx0ZXJQYWNrYWdlcygkdGhpcy0+d2hhdFByb3ZpZGVzKCRuYW1lKSwgJGNvbnN0cmFpbnQsIHRydWUpOwp9CgppZiAoJHRoaXMtPmhhc0F2YWlsYWJsZVBhY2thZ2VMaXN0ICYmICEkdGhpcy0+bGF6eVByb3ZpZGVyc1JlcG9Db250YWlucygkbmFtZSkpIHsKcmV0dXJuIG51bGw7Cn0KCiRwYWNrYWdlcyA9ICR0aGlzLT5sb2FkQXN5bmNQYWNrYWdlcyhbJG5hbWUgPT4gJGNvbnN0cmFpbnRdKTsKCmlmIChjb3VudCgkcGFja2FnZXNbJ3BhY2thZ2VzJ10pID4gMCkgewpyZXR1cm4gcmVzZXQoJHBhY2thZ2VzWydwYWNrYWdlcyddKTsKfQoKcmV0dXJuIG51bGw7Cn0KCmlmICgkaGFzUHJvdmlkZXJzKSB7CmZvcmVhY2ggKCR0aGlzLT5nZXRQcm92aWRlck5hbWVzKCkgYXMgJHByb3ZpZGVyTmFtZSkgewppZiAoJG5hbWUgPT09ICRwcm92aWRlck5hbWUpIHsKcmV0dXJuICR0aGlzLT5maWx0ZXJQYWNrYWdlcygkdGhpcy0+d2hhdFByb3ZpZGVzKCRwcm92aWRlck5hbWUpLCAkY29uc3RyYWludCwgdHJ1ZSk7Cn0KfQoKcmV0dXJuIG51bGw7Cn0KCnJldHVybiBwYXJlbnQ6OmZpbmRQYWNrYWdlKCRuYW1lLCAkY29uc3RyYWludCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kUGFja2FnZXMoc3RyaW5nICRuYW1lLCAkY29uc3RyYWludCA9IG51bGwpCnsKCiRoYXNQcm92aWRlcnMgPSAkdGhpcy0+aGFzUHJvdmlkZXJzKCk7CgokbmFtZSA9IHN0cnRvbG93ZXIoJG5hbWUpOwppZiAobnVsbCAhPT0gJGNvbnN0cmFpbnQgJiYgISRjb25zdHJhaW50IGluc3RhbmNlb2YgQ29uc3RyYWludEludGVyZmFjZSkgewokY29uc3RyYWludCA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCRjb25zdHJhaW50KTsKfQoKaWYgKCR0aGlzLT5sYXp5UHJvdmlkZXJzVXJsKSB7CmlmICgkdGhpcy0+aGFzUGFydGlhbFBhY2thZ2VzKCkgJiYgaXNzZXQoJHRoaXMtPnBhcnRpYWxQYWNrYWdlc0J5TmFtZVskbmFtZV0pKSB7CnJldHVybiAkdGhpcy0+ZmlsdGVyUGFja2FnZXMoJHRoaXMtPndoYXRQcm92aWRlcygkbmFtZSksICRjb25zdHJhaW50KTsKfQoKaWYgKCR0aGlzLT5oYXNBdmFpbGFibGVQYWNrYWdlTGlzdCAmJiAhJHRoaXMtPmxhenlQcm92aWRlcnNSZXBvQ29udGFpbnMoJG5hbWUpKSB7CnJldHVybiBbXTsKfQoKJHJlc3VsdCA9ICR0aGlzLT5sb2FkQXN5bmNQYWNrYWdlcyhbJG5hbWUgPT4gJGNvbnN0cmFpbnRdKTsKCnJldHVybiAkcmVzdWx0WydwYWNrYWdlcyddOwp9CgppZiAoJGhhc1Byb3ZpZGVycykgewpmb3JlYWNoICgkdGhpcy0+Z2V0UHJvdmlkZXJOYW1lcygpIGFzICRwcm92aWRlck5hbWUpIHsKaWYgKCRuYW1lID09PSAkcHJvdmlkZXJOYW1lKSB7CnJldHVybiAkdGhpcy0+ZmlsdGVyUGFja2FnZXMoJHRoaXMtPndoYXRQcm92aWRlcygkcHJvdmlkZXJOYW1lKSwgJGNvbnN0cmFpbnQpOwp9Cn0KCnJldHVybiBbXTsKfQoKcmV0dXJuIHBhcmVudDo6ZmluZFBhY2thZ2VzKCRuYW1lLCAkY29uc3RyYWludCk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBmaWx0ZXJQYWNrYWdlcyhhcnJheSAkcGFja2FnZXMsID9Db25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50ID0gbnVsbCwgYm9vbCAkcmV0dXJuRmlyc3RNYXRjaCA9IGZhbHNlKQp7CmlmIChudWxsID09PSAkY29uc3RyYWludCkgewppZiAoJHJldHVybkZpcnN0TWF0Y2gpIHsKcmV0dXJuIHJlc2V0KCRwYWNrYWdlcyk7Cn0KCnJldHVybiAkcGFja2FnZXM7Cn0KCiRmaWx0ZXJlZFBhY2thZ2VzID0gW107Cgpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJHBrZ0NvbnN0cmFpbnQgPSBuZXcgQ29uc3RyYWludCgnPT0nLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKTsKCmlmICgkY29uc3RyYWludC0+bWF0Y2hlcygkcGtnQ29uc3RyYWludCkpIHsKaWYgKCRyZXR1cm5GaXJzdE1hdGNoKSB7CnJldHVybiAkcGFja2FnZTsKfQoKJGZpbHRlcmVkUGFja2FnZXNbXSA9ICRwYWNrYWdlOwp9Cn0KCmlmICgkcmV0dXJuRmlyc3RNYXRjaCkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICRmaWx0ZXJlZFBhY2thZ2VzOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFja2FnZXMoKQp7CiRoYXNQcm92aWRlcnMgPSAkdGhpcy0+aGFzUHJvdmlkZXJzKCk7CgppZiAoJHRoaXMtPmxhenlQcm92aWRlcnNVcmwpIHsKaWYgKGlzX2FycmF5KCR0aGlzLT5hdmFpbGFibGVQYWNrYWdlcykgJiYgISR0aGlzLT5hdmFpbGFibGVQYWNrYWdlUGF0dGVybnMpIHsKJHBhY2thZ2VNYXAgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPmF2YWlsYWJsZVBhY2thZ2VzIGFzICRuYW1lKSB7CiRwYWNrYWdlTWFwWyRuYW1lXSA9IG5ldyBNYXRjaEFsbENvbnN0cmFpbnQoKTsKfQoKJHJlc3VsdCA9ICR0aGlzLT5sb2FkQXN5bmNQYWNrYWdlcygkcGFja2FnZU1hcCk7CgpyZXR1cm4gYXJyYXlfdmFsdWVzKCRyZXN1bHRbJ3BhY2thZ2VzJ10pOwp9CgppZiAoJHRoaXMtPmhhc1BhcnRpYWxQYWNrYWdlcygpKSB7CmlmICghaXNfYXJyYXkoJHRoaXMtPnBhcnRpYWxQYWNrYWdlc0J5TmFtZSkpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignaGFzUGFydGlhbFBhY2thZ2VzIGZhaWxlZCB0byBpbml0aWFsaXplICR0aGlzLT5wYXJ0aWFsUGFja2FnZXNCeU5hbWUnKTsKfQoKcmV0dXJuICR0aGlzLT5jcmVhdGVQYWNrYWdlcygkdGhpcy0+cGFydGlhbFBhY2thZ2VzQnlOYW1lLCAncGFja2FnZXMuanNvbiBpbmxpbmUgcGFja2FnZXMnKTsKfQoKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignQ29tcG9zZXIgcmVwb3NpdG9yaWVzIHRoYXQgaGF2ZSBsYXp5IHByb3ZpZGVycyBhbmQgbm8gYXZhaWxhYmxlLXBhY2thZ2VzIGxpc3QgY2FuIG5vdCBsb2FkIHRoZSBjb21wbGV0ZSBsaXN0IG9mIHBhY2thZ2VzLCB1c2UgZ2V0UGFja2FnZU5hbWVzIGluc3RlYWQuJyk7Cn0KCmlmICgkaGFzUHJvdmlkZXJzKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0NvbXBvc2VyIHJlcG9zaXRvcmllcyB0aGF0IGhhdmUgcHJvdmlkZXJzIGNhbiBub3QgbG9hZCB0aGUgY29tcGxldGUgbGlzdCBvZiBwYWNrYWdlcywgdXNlIGdldFBhY2thZ2VOYW1lcyBpbnN0ZWFkLicpOwp9CgpyZXR1cm4gcGFyZW50OjpnZXRQYWNrYWdlcygpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWNrYWdlTmFtZXMoP3N0cmluZyAkcGFja2FnZUZpbHRlciA9IG51bGwpCnsKJGhhc1Byb3ZpZGVycyA9ICR0aGlzLT5oYXNQcm92aWRlcnMoKTsKCiRmaWx0ZXJSZXN1bHRzID0KCgoKCnN0YXRpYyBmdW5jdGlvbiAoYXJyYXkgJHJlc3VsdHMpOiBhcnJheSB7CnJldHVybiAkcmVzdWx0czsKfQo7CmlmIChudWxsICE9PSAkcGFja2FnZUZpbHRlciAmJiAnJyAhPT0gJHBhY2thZ2VGaWx0ZXIpIHsKJHBhY2thZ2VGaWx0ZXJSZWdleCA9IEJhc2VQYWNrYWdlOjpwYWNrYWdlTmFtZVRvUmVnZXhwKCRwYWNrYWdlRmlsdGVyKTsKJGZpbHRlclJlc3VsdHMgPQoKCgoKc3RhdGljIGZ1bmN0aW9uIChhcnJheSAkcmVzdWx0cykgdXNlICgkcGFja2FnZUZpbHRlclJlZ2V4KTogYXJyYXkgewoKcmV0dXJuIFByZWc6OmdyZXAoJHBhY2thZ2VGaWx0ZXJSZWdleCwgJHJlc3VsdHMpOwp9CjsKfQoKaWYgKCR0aGlzLT5sYXp5UHJvdmlkZXJzVXJsKSB7CmlmIChpc19hcnJheSgkdGhpcy0+YXZhaWxhYmxlUGFja2FnZXMpKSB7CnJldHVybiAkZmlsdGVyUmVzdWx0cyhhcnJheV9rZXlzKCR0aGlzLT5hdmFpbGFibGVQYWNrYWdlcykpOwp9CgppZiAoJHRoaXMtPmxpc3RVcmwpIHsKCnJldHVybiAkdGhpcy0+bG9hZFBhY2thZ2VMaXN0KCRwYWNrYWdlRmlsdGVyKTsKfQoKaWYgKCR0aGlzLT5oYXNQYXJ0aWFsUGFja2FnZXMoKSAmJiAkdGhpcy0+cGFydGlhbFBhY2thZ2VzQnlOYW1lICE9PSBudWxsKSB7CnJldHVybiAkZmlsdGVyUmVzdWx0cyhhcnJheV9rZXlzKCR0aGlzLT5wYXJ0aWFsUGFja2FnZXNCeU5hbWUpKTsKfQoKcmV0dXJuIFtdOwp9CgppZiAoJGhhc1Byb3ZpZGVycykgewpyZXR1cm4gJGZpbHRlclJlc3VsdHMoJHRoaXMtPmdldFByb3ZpZGVyTmFtZXMoKSk7Cn0KCiRuYW1lcyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewokbmFtZXNbXSA9ICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCk7Cn0KCnJldHVybiAkZmlsdGVyUmVzdWx0cygkbmFtZXMpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFZlbmRvck5hbWVzKCk6IGFycmF5CnsKJGNhY2hlS2V5ID0gJ3ZlbmRvci1saXN0LnR4dCc7CiRjYWNoZUFnZSA9ICR0aGlzLT5jYWNoZS0+Z2V0QWdlKCRjYWNoZUtleSk7CmlmIChmYWxzZSAhPT0gJGNhY2hlQWdlICYmICRjYWNoZUFnZSA8IDYwMCAmJiAoJGNhY2hlZERhdGEgPSAkdGhpcy0+Y2FjaGUtPnJlYWQoJGNhY2hlS2V5KSkgIT09IGZhbHNlKSB7CiRjYWNoZWREYXRhID0gZXhwbG9kZSgiXG4iLCAkY2FjaGVkRGF0YSk7CgpyZXR1cm4gJGNhY2hlZERhdGE7Cn0KCiRuYW1lcyA9ICR0aGlzLT5nZXRQYWNrYWdlTmFtZXMoKTsKCiR1bmlxdWVzID0gW107CmZvcmVhY2ggKCRuYW1lcyBhcyAkbmFtZSkgewokdW5pcXVlc1tleHBsb2RlKCcvJywgJG5hbWUsIDIpWzBdXSA9IHRydWU7Cn0KCiR2ZW5kb3JzID0gYXJyYXlfa2V5cygkdW5pcXVlcyk7CgppZiAoISR0aGlzLT5jYWNoZS0+aXNSZWFkT25seSgpKSB7CiR0aGlzLT5jYWNoZS0+d3JpdGUoJGNhY2hlS2V5LCBpbXBsb2RlKCJcbiIsICR2ZW5kb3JzKSk7Cn0KCnJldHVybiAkdmVuZG9yczsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBsb2FkUGFja2FnZUxpc3QoP3N0cmluZyAkcGFja2FnZUZpbHRlciA9IG51bGwpOiBhcnJheQp7CmlmIChudWxsID09PSAkdGhpcy0+bGlzdFVybCkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdNYWtlIHN1cmUgdG8gY2FsbCBsb2FkUm9vdFNlcnZlckZpbGUgYmVmb3JlIGxvYWRQYWNrYWdlTGlzdCcpOwp9CgokdXJsID0gJHRoaXMtPmxpc3RVcmw7CmlmIChpc19zdHJpbmcoJHBhY2thZ2VGaWx0ZXIpICYmICRwYWNrYWdlRmlsdGVyICE9PSAnJykgewokdXJsIC49ICc/ZmlsdGVyPScudXJsZW5jb2RlKCRwYWNrYWdlRmlsdGVyKTsKJHJlc3VsdCA9ICR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KCR1cmwsICR0aGlzLT5vcHRpb25zKS0+ZGVjb2RlSnNvbigpOwoKcmV0dXJuICRyZXN1bHRbJ3BhY2thZ2VOYW1lcyddOwp9CgokY2FjaGVLZXkgPSAncGFja2FnZS1saXN0LnR4dCc7CiRjYWNoZUFnZSA9ICR0aGlzLT5jYWNoZS0+Z2V0QWdlKCRjYWNoZUtleSk7CmlmIChmYWxzZSAhPT0gJGNhY2hlQWdlICYmICRjYWNoZUFnZSA8IDYwMCAmJiAoJGNhY2hlZERhdGEgPSAkdGhpcy0+Y2FjaGUtPnJlYWQoJGNhY2hlS2V5KSkgIT09IGZhbHNlKSB7CiRjYWNoZWREYXRhID0gZXhwbG9kZSgiXG4iLCAkY2FjaGVkRGF0YSk7CgpyZXR1cm4gJGNhY2hlZERhdGE7Cn0KCiRyZXN1bHQgPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkdXJsLCAkdGhpcy0+b3B0aW9ucyktPmRlY29kZUpzb24oKTsKaWYgKCEkdGhpcy0+Y2FjaGUtPmlzUmVhZE9ubHkoKSkgewokdGhpcy0+Y2FjaGUtPndyaXRlKCRjYWNoZUtleSwgaW1wbG9kZSgiXG4iLCAkcmVzdWx0WydwYWNrYWdlTmFtZXMnXSkpOwp9CgpyZXR1cm4gJHJlc3VsdFsncGFja2FnZU5hbWVzJ107Cn0KCnB1YmxpYyBmdW5jdGlvbiBsb2FkUGFja2FnZXMoYXJyYXkgJHBhY2thZ2VOYW1lTWFwLCBhcnJheSAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCBhcnJheSAkc3RhYmlsaXR5RmxhZ3MsIGFycmF5ICRhbHJlYWR5TG9hZGVkID0gW10pCnsKCiRoYXNQcm92aWRlcnMgPSAkdGhpcy0+aGFzUHJvdmlkZXJzKCk7CgppZiAoISRoYXNQcm92aWRlcnMgJiYgISR0aGlzLT5oYXNQYXJ0aWFsUGFja2FnZXMoKSAmJiBudWxsID09PSAkdGhpcy0+bGF6eVByb3ZpZGVyc1VybCkgewpyZXR1cm4gcGFyZW50Ojpsb2FkUGFja2FnZXMoJHBhY2thZ2VOYW1lTWFwLCAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCAkc3RhYmlsaXR5RmxhZ3MsICRhbHJlYWR5TG9hZGVkKTsKfQoKJHBhY2thZ2VzID0gW107CiRuYW1lc0ZvdW5kID0gW107CgppZiAoJGhhc1Byb3ZpZGVycyB8fCAkdGhpcy0+aGFzUGFydGlhbFBhY2thZ2VzKCkpIHsKZm9yZWFjaCAoJHBhY2thZ2VOYW1lTWFwIGFzICRuYW1lID0+ICRjb25zdHJhaW50KSB7CiRtYXRjaGVzID0gW107CgoKCmlmICghJGhhc1Byb3ZpZGVycyAmJiAhaXNzZXQoJHRoaXMtPnBhcnRpYWxQYWNrYWdlc0J5TmFtZVskbmFtZV0pKSB7CmNvbnRpbnVlOwp9CgokY2FuZGlkYXRlcyA9ICR0aGlzLT53aGF0UHJvdmlkZXMoJG5hbWUsICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMsICRzdGFiaWxpdHlGbGFncywgJGFscmVhZHlMb2FkZWQpOwpmb3JlYWNoICgkY2FuZGlkYXRlcyBhcyAkY2FuZGlkYXRlKSB7CmlmICgkY2FuZGlkYXRlLT5nZXROYW1lKCkgIT09ICRuYW1lKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ3doYXRQcm92aWRlcyBzaG91bGQgbmV2ZXIgcmV0dXJuIGEgcGFja2FnZSB3aXRoIGEgZGlmZmVyZW50IG5hbWUgdGhhbiB0aGUgcmVxdWVzdGVkIG9uZScpOwp9CiRuYW1lc0ZvdW5kWyRuYW1lXSA9IHRydWU7CgppZiAoISRjb25zdHJhaW50IHx8ICRjb25zdHJhaW50LT5tYXRjaGVzKG5ldyBDb25zdHJhaW50KCc9PScsICRjYW5kaWRhdGUtPmdldFZlcnNpb24oKSkpKSB7CiRtYXRjaGVzW3NwbF9vYmplY3RfaGFzaCgkY2FuZGlkYXRlKV0gPSAkY2FuZGlkYXRlOwppZiAoJGNhbmRpZGF0ZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSAmJiAhaXNzZXQoJG1hdGNoZXNbc3BsX29iamVjdF9oYXNoKCRjYW5kaWRhdGUtPmdldEFsaWFzT2YoKSldKSkgewokbWF0Y2hlc1tzcGxfb2JqZWN0X2hhc2goJGNhbmRpZGF0ZS0+Z2V0QWxpYXNPZigpKV0gPSAkY2FuZGlkYXRlLT5nZXRBbGlhc09mKCk7Cn0KfQp9CgoKZm9yZWFjaCAoJGNhbmRpZGF0ZXMgYXMgJGNhbmRpZGF0ZSkgewppZiAoJGNhbmRpZGF0ZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewppZiAoaXNzZXQoJG1hdGNoZXNbc3BsX29iamVjdF9oYXNoKCRjYW5kaWRhdGUtPmdldEFsaWFzT2YoKSldKSkgewokbWF0Y2hlc1tzcGxfb2JqZWN0X2hhc2goJGNhbmRpZGF0ZSldID0gJGNhbmRpZGF0ZTsKfQp9Cn0KJHBhY2thZ2VzID0gYXJyYXlfbWVyZ2UoJHBhY2thZ2VzLCAkbWF0Y2hlcyk7Cgp1bnNldCgkcGFja2FnZU5hbWVNYXBbJG5hbWVdKTsKfQp9CgppZiAoJHRoaXMtPmxhenlQcm92aWRlcnNVcmwgJiYgY291bnQoJHBhY2thZ2VOYW1lTWFwKSkgewppZiAoJHRoaXMtPmhhc0F2YWlsYWJsZVBhY2thZ2VMaXN0KSB7CmZvcmVhY2ggKCRwYWNrYWdlTmFtZU1hcCBhcyAkbmFtZSA9PiAkY29uc3RyYWludCkgewppZiAoISR0aGlzLT5sYXp5UHJvdmlkZXJzUmVwb0NvbnRhaW5zKHN0cnRvbG93ZXIoJG5hbWUpKSkgewp1bnNldCgkcGFja2FnZU5hbWVNYXBbJG5hbWVdKTsKfQp9Cn0KCiRyZXN1bHQgPSAkdGhpcy0+bG9hZEFzeW5jUGFja2FnZXMoJHBhY2thZ2VOYW1lTWFwLCAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCAkc3RhYmlsaXR5RmxhZ3MsICRhbHJlYWR5TG9hZGVkKTsKJHBhY2thZ2VzID0gYXJyYXlfbWVyZ2UoJHBhY2thZ2VzLCAkcmVzdWx0WydwYWNrYWdlcyddKTsKJG5hbWVzRm91bmQgPSBhcnJheV9tZXJnZSgkbmFtZXNGb3VuZCwgJHJlc3VsdFsnbmFtZXNGb3VuZCddKTsKfQoKcmV0dXJuIFsnbmFtZXNGb3VuZCcgPT4gYXJyYXlfa2V5cygkbmFtZXNGb3VuZCksICdwYWNrYWdlcycgPT4gJHBhY2thZ2VzXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNlYXJjaChzdHJpbmcgJHF1ZXJ5LCBpbnQgJG1vZGUgPSAwLCA/c3RyaW5nICR0eXBlID0gbnVsbCkKewokdGhpcy0+bG9hZFJvb3RTZXJ2ZXJGaWxlKDYwMCk7CgppZiAoJHRoaXMtPnNlYXJjaFVybCAmJiAkbW9kZSA9PT0gc2VsZjo6U0VBUkNIX0ZVTExURVhUKSB7CiR1cmwgPSBzdHJfcmVwbGFjZShbJyVxdWVyeSUnLCAnJXR5cGUlJ10sIFt1cmxlbmNvZGUoJHF1ZXJ5KSwgJHR5cGVdLCAkdGhpcy0+c2VhcmNoVXJsKTsKCiRzZWFyY2ggPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkdXJsLCAkdGhpcy0+b3B0aW9ucyktPmRlY29kZUpzb24oKTsKCmlmIChlbXB0eSgkc2VhcmNoWydyZXN1bHRzJ10pKSB7CnJldHVybiBbXTsKfQoKJHJlc3VsdHMgPSBbXTsKZm9yZWFjaCAoJHNlYXJjaFsncmVzdWx0cyddIGFzICRyZXN1bHQpIHsKCmlmICghZW1wdHkoJHJlc3VsdFsndmlydHVhbCddKSkgewpjb250aW51ZTsKfQoKJHJlc3VsdHNbXSA9ICRyZXN1bHQ7Cn0KCnJldHVybiAkcmVzdWx0czsKfQoKaWYgKCRtb2RlID09PSBzZWxmOjpTRUFSQ0hfVkVORE9SKSB7CiRyZXN1bHRzID0gW107CiRyZWdleCA9ICd7KD86Jy5pbXBsb2RlKCd8JywgUHJlZzo6c3BsaXQoJ3tccyt9JywgJHF1ZXJ5KSkuJyl9aSc7CgokdmVuZG9yTmFtZXMgPSAkdGhpcy0+Z2V0VmVuZG9yTmFtZXMoKTsKZm9yZWFjaCAoUHJlZzo6Z3JlcCgkcmVnZXgsICR2ZW5kb3JOYW1lcykgYXMgJG5hbWUpIHsKJHJlc3VsdHNbXSA9IFsnbmFtZScgPT4gJG5hbWUsICdkZXNjcmlwdGlvbicgPT4gJyddOwp9CgpyZXR1cm4gJHJlc3VsdHM7Cn0KCmlmICgkdGhpcy0+aGFzUHJvdmlkZXJzKCkgfHwgJHRoaXMtPmxhenlQcm92aWRlcnNVcmwpIHsKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XlxeKD9QPHF1ZXJ5Pig/UDx2ZW5kb3I+W2EtejAtOV8uLV0rKS9bYS16MC05Xy4tXSopXCo/JH1pJywgJHF1ZXJ5LCAkbWF0Y2gpICYmICR0aGlzLT5saXN0VXJsICE9PSBudWxsKSB7CiR1cmwgPSAkdGhpcy0+bGlzdFVybCAuICc/dmVuZG9yPScudXJsZW5jb2RlKCRtYXRjaFsndmVuZG9yJ10pLicmZmlsdGVyPScudXJsZW5jb2RlKCRtYXRjaFsncXVlcnknXS4nKicpOwokcmVzdWx0ID0gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoJHVybCwgJHRoaXMtPm9wdGlvbnMpLT5kZWNvZGVKc29uKCk7CgokcmVzdWx0cyA9IFtdOwpmb3JlYWNoICgkcmVzdWx0WydwYWNrYWdlTmFtZXMnXSBhcyAkbmFtZSkgewokcmVzdWx0c1tdID0gWyduYW1lJyA9PiAkbmFtZSwgJ2Rlc2NyaXB0aW9uJyA9PiAnJ107Cn0KCnJldHVybiAkcmVzdWx0czsKfQoKJHJlc3VsdHMgPSBbXTsKJHJlZ2V4ID0gJ3soPzonLmltcGxvZGUoJ3wnLCBQcmVnOjpzcGxpdCgne1xzK30nLCAkcXVlcnkpKS4nKX1pJzsKCiRwYWNrYWdlTmFtZXMgPSAkdGhpcy0+Z2V0UGFja2FnZU5hbWVzKCk7CmZvcmVhY2ggKFByZWc6OmdyZXAoJHJlZ2V4LCAkcGFja2FnZU5hbWVzKSBhcyAkbmFtZSkgewokcmVzdWx0c1tdID0gWyduYW1lJyA9PiAkbmFtZSwgJ2Rlc2NyaXB0aW9uJyA9PiAnJ107Cn0KCnJldHVybiAkcmVzdWx0czsKfQoKcmV0dXJuIHBhcmVudDo6c2VhcmNoKCRxdWVyeSwgJG1vZGUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaGFzU2VjdXJpdHlBZHZpc29yaWVzKCk6IGJvb2wKewokdGhpcy0+bG9hZFJvb3RTZXJ2ZXJGaWxlKDYwMCk7CgpyZXR1cm4gJHRoaXMtPnNlY3VyaXR5QWR2aXNvcnlDb25maWcgIT09IG51bGwgJiYgKCR0aGlzLT5zZWN1cml0eUFkdmlzb3J5Q29uZmlnWydtZXRhZGF0YSddIHx8ICR0aGlzLT5zZWN1cml0eUFkdmlzb3J5Q29uZmlnWydhcGktdXJsJ10gIT09IG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U2VjdXJpdHlBZHZpc29yaWVzKGFycmF5ICRwYWNrYWdlQ29uc3RyYWludE1hcCwgYm9vbCAkYWxsb3dQYXJ0aWFsQWR2aXNvcmllcyA9IGZhbHNlKTogYXJyYXkKewokdGhpcy0+bG9hZFJvb3RTZXJ2ZXJGaWxlKDYwMCk7CmlmIChudWxsID09PSAkdGhpcy0+c2VjdXJpdHlBZHZpc29yeUNvbmZpZykgewpyZXR1cm4gWyduYW1lc0ZvdW5kJyA9PiBbXSwgJ2Fkdmlzb3JpZXMnID0+IFtdXTsKfQoKJGFkdmlzb3JpZXMgPSBbXTsKJG5hbWVzRm91bmQgPSBbXTsKCiRhcGlVcmwgPSAkdGhpcy0+c2VjdXJpdHlBZHZpc29yeUNvbmZpZ1snYXBpLXVybCddOwoKCmlmICgkdGhpcy0+aGFzQXZhaWxhYmxlUGFja2FnZUxpc3QpIHsKZm9yZWFjaCAoJHBhY2thZ2VDb25zdHJhaW50TWFwIGFzICRuYW1lID0+ICRjb25zdHJhaW50KSB7CmlmICghJHRoaXMtPmxhenlQcm92aWRlcnNSZXBvQ29udGFpbnMoc3RydG9sb3dlcigkbmFtZSkpKSB7CnVuc2V0KCRwYWNrYWdlQ29uc3RyYWludE1hcFskbmFtZV0pOwp9Cn0KfQoKJHBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyKCk7CgoKCgoKJGNyZWF0ZSA9IGZ1bmN0aW9uIChhcnJheSAkZGF0YSwgc3RyaW5nICRuYW1lKSB1c2UgKCRwYXJzZXIsICRhbGxvd1BhcnRpYWxBZHZpc29yaWVzLCAmJHBhY2thZ2VDb25zdHJhaW50TWFwKTogP1BhcnRpYWxTZWN1cml0eUFkdmlzb3J5IHsKJGFkdmlzb3J5ID0gUGFydGlhbFNlY3VyaXR5QWR2aXNvcnk6OmNyZWF0ZSgkbmFtZSwgJGRhdGEsICRwYXJzZXIpOwppZiAoISRhbGxvd1BhcnRpYWxBZHZpc29yaWVzICYmICEkYWR2aXNvcnkgaW5zdGFuY2VvZiBTZWN1cml0eUFkdmlzb3J5KSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQWR2aXNvcnkgZm9yICcuJG5hbWUuJyBjb3VsZCBub3QgYmUgbG9hZGVkIGFzIGEgZnVsbCBhZHZpc29yeSBmcm9tICcuJHRoaXMtPmdldFJlcG9OYW1lKCkgLiBQSFBfRU9MIC4gdmFyX2V4cG9ydCgkZGF0YSwgdHJ1ZSkpOwp9CmlmICghJGFkdmlzb3J5LT5hZmZlY3RlZFZlcnNpb25zLT5tYXRjaGVzKCRwYWNrYWdlQ29uc3RyYWludE1hcFskbmFtZV0pKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gJGFkdmlzb3J5Owp9OwoKaWYgKCR0aGlzLT5zZWN1cml0eUFkdmlzb3J5Q29uZmlnWydtZXRhZGF0YSddICYmICgkYWxsb3dQYXJ0aWFsQWR2aXNvcmllcyB8fCAkYXBpVXJsID09PSBudWxsKSkgewokcHJvbWlzZXMgPSBbXTsKZm9yZWFjaCAoJHBhY2thZ2VDb25zdHJhaW50TWFwIGFzICRuYW1lID0+ICRjb25zdHJhaW50KSB7CiRuYW1lID0gc3RydG9sb3dlcigkbmFtZSk7CgoKaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJG5hbWUpIHx8ICdfX3Jvb3RfXycgPT09ICRuYW1lKSB7CmNvbnRpbnVlOwp9CgokcHJvbWlzZXNbXSA9ICR0aGlzLT5zdGFydENhY2hlZEFzeW5jRG93bmxvYWQoJG5hbWUsICRuYW1lKQotPnRoZW4oc3RhdGljIGZ1bmN0aW9uIChhcnJheSAkc3BlYykgdXNlICgmJGFkdmlzb3JpZXMsICYkbmFtZXNGb3VuZCwgJiRwYWNrYWdlQ29uc3RyYWludE1hcCwgJG5hbWUsICRjcmVhdGUpOiB2b2lkIHsKWyRyZXNwb25zZV0gPSAkc3BlYzsKCmlmICghaXNzZXQoJHJlc3BvbnNlWydzZWN1cml0eS1hZHZpc29yaWVzJ10pIHx8ICFpc19hcnJheSgkcmVzcG9uc2VbJ3NlY3VyaXR5LWFkdmlzb3JpZXMnXSkpIHsKcmV0dXJuOwp9CgokbmFtZXNGb3VuZFskbmFtZV0gPSB0cnVlOwppZiAoY291bnQoJHJlc3BvbnNlWydzZWN1cml0eS1hZHZpc29yaWVzJ10pID4gMCkgewokYWR2aXNvcmllc1skbmFtZV0gPSBhcnJheV92YWx1ZXMoYXJyYXlfZmlsdGVyKGFycmF5X21hcCgKc3RhdGljIGZ1bmN0aW9uICgkZGF0YSkgdXNlICgkbmFtZSwgJGNyZWF0ZSkgewpyZXR1cm4gJGNyZWF0ZSgkZGF0YSwgJG5hbWUpOwp9LAokcmVzcG9uc2VbJ3NlY3VyaXR5LWFkdmlzb3JpZXMnXQopKSk7Cn0KdW5zZXQoJHBhY2thZ2VDb25zdHJhaW50TWFwWyRuYW1lXSk7Cn0pOwp9CgokdGhpcy0+bG9vcC0+d2FpdCgkcHJvbWlzZXMpOwp9CgppZiAoJGFwaVVybCAhPT0gbnVsbCAmJiBjb3VudCgkcGFja2FnZUNvbnN0cmFpbnRNYXApID4gMCkgewokb3B0aW9ucyA9ICR0aGlzLT5vcHRpb25zOwokb3B0aW9uc1snaHR0cCddWydtZXRob2QnXSA9ICdQT1NUJzsKaWYgKGlzc2V0KCRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddKSkgewokb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSA9IChhcnJheSkgJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ107Cn0KJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ11bXSA9ICdDb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc7CiRvcHRpb25zWydodHRwJ11bJ3RpbWVvdXQnXSA9IDEwOwokb3B0aW9uc1snaHR0cCddWydjb250ZW50J10gPSBodHRwX2J1aWxkX3F1ZXJ5KFsncGFja2FnZXMnID0+IGFycmF5X2tleXMoJHBhY2thZ2VDb25zdHJhaW50TWFwKV0pOwoKJHJlc3BvbnNlID0gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoJGFwaVVybCwgJG9wdGlvbnMpOwokd2FybmVkID0gZmFsc2U7Cgpmb3JlYWNoICgkcmVzcG9uc2UtPmRlY29kZUpzb24oKVsnYWR2aXNvcmllcyddIGFzICRuYW1lID0+ICRsaXN0KSB7CmlmICghaXNzZXQoJHBhY2thZ2VDb25zdHJhaW50TWFwWyRuYW1lXSkpIHsKaWYgKCEkd2FybmVkKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Jy4kdGhpcy0+Z2V0UmVwb05hbWUoKS4nIHJldHVybmVkIG5hbWVzIHdoaWNoIHdlcmUgbm90IHJlcXVlc3RlZCBpbiByZXNwb25zZSB0byB0aGUgc2VjdXJpdHktYWR2aXNvcmllcyBBUEkuICcuJG5hbWUuJyB3YXMgbm90IHJlcXVlc3RlZCBidXQgaXMgcHJlc2VudCBpbiB0aGUgcmVzcG9uc2UuIFJlcXVlc3RlZCBuYW1lcyB3ZXJlOiAnLmltcGxvZGUoJywgJywgYXJyYXlfa2V5cygkcGFja2FnZUNvbnN0cmFpbnRNYXApKS4nPC93YXJuaW5nPicpOwokd2FybmVkID0gdHJ1ZTsKfQpjb250aW51ZTsKfQppZiAoY291bnQoJGxpc3QpID4gMCkgewokYWR2aXNvcmllc1skbmFtZV0gPSBhcnJheV92YWx1ZXMoYXJyYXlfZmlsdGVyKGFycmF5X21hcCgKc3RhdGljIGZ1bmN0aW9uICgkZGF0YSkgdXNlICgkbmFtZSwgJGNyZWF0ZSkgewpyZXR1cm4gJGNyZWF0ZSgkZGF0YSwgJG5hbWUpOwp9LAokbGlzdAopKSk7Cn0KJG5hbWVzRm91bmRbJG5hbWVdID0gdHJ1ZTsKfQp9CgpyZXR1cm4gWyduYW1lc0ZvdW5kJyA9PiBhcnJheV9rZXlzKCRuYW1lc0ZvdW5kKSwgJ2Fkdmlzb3JpZXMnID0+IGFycmF5X2ZpbHRlcigkYWR2aXNvcmllcywgc3RhdGljIGZ1bmN0aW9uICgkYWR2KTogYm9vbCB7IHJldHVybiBcY291bnQoJGFkdikgPiAwOyB9KV07Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm92aWRlcnMoc3RyaW5nICRwYWNrYWdlTmFtZSkKewokdGhpcy0+bG9hZFJvb3RTZXJ2ZXJGaWxlKCk7CiRyZXN1bHQgPSBbXTsKCmlmICgkdGhpcy0+cHJvdmlkZXJzQXBpVXJsKSB7CnRyeSB7CiRhcGlSZXN1bHQgPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldChzdHJfcmVwbGFjZSgnJXBhY2thZ2UlJywgJHBhY2thZ2VOYW1lLCAkdGhpcy0+cHJvdmlkZXJzQXBpVXJsKSwgJHRoaXMtPm9wdGlvbnMpLT5kZWNvZGVKc29uKCk7Cn0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgewppZiAoJGUtPmdldFN0YXR1c0NvZGUoKSA9PT0gNDA0KSB7CnJldHVybiAkcmVzdWx0Owp9CnRocm93ICRlOwp9Cgpmb3JlYWNoICgkYXBpUmVzdWx0Wydwcm92aWRlcnMnXSBhcyAkcHJvdmlkZXIpIHsKJHJlc3VsdFskcHJvdmlkZXJbJ25hbWUnXV0gPSAkcHJvdmlkZXI7Cn0KCnJldHVybiAkcmVzdWx0Owp9CgppZiAoJHRoaXMtPmhhc1BhcnRpYWxQYWNrYWdlcygpKSB7CmlmICghaXNfYXJyYXkoJHRoaXMtPnBhcnRpYWxQYWNrYWdlc0J5TmFtZSkpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignaGFzUGFydGlhbFBhY2thZ2VzIGZhaWxlZCB0byBpbml0aWFsaXplICR0aGlzLT5wYXJ0aWFsUGFja2FnZXNCeU5hbWUnKTsKfQpmb3JlYWNoICgkdGhpcy0+cGFydGlhbFBhY2thZ2VzQnlOYW1lIGFzICR2ZXJzaW9ucykgewpmb3JlYWNoICgkdmVyc2lvbnMgYXMgJGNhbmRpZGF0ZSkgewppZiAoaXNzZXQoJHJlc3VsdFskY2FuZGlkYXRlWyduYW1lJ11dKSB8fCAhaXNzZXQoJGNhbmRpZGF0ZVsncHJvdmlkZSddWyRwYWNrYWdlTmFtZV0pKSB7CmNvbnRpbnVlOwp9CiRyZXN1bHRbJGNhbmRpZGF0ZVsnbmFtZSddXSA9IFsKJ25hbWUnID0+ICRjYW5kaWRhdGVbJ25hbWUnXSwKJ2Rlc2NyaXB0aW9uJyA9PiAkY2FuZGlkYXRlWydkZXNjcmlwdGlvbiddID8/ICcnLAondHlwZScgPT4gJGNhbmRpZGF0ZVsndHlwZSddID8/ICcnLApdOwp9Cn0KfQoKaWYgKCR0aGlzLT5wYWNrYWdlcykgewokcmVzdWx0ID0gYXJyYXlfbWVyZ2UoJHJlc3VsdCwgcGFyZW50OjpnZXRQcm92aWRlcnMoJHBhY2thZ2VOYW1lKSk7Cn0KCnJldHVybiAkcmVzdWx0Owp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFByb3ZpZGVyTmFtZXMoKTogYXJyYXkKewokdGhpcy0+bG9hZFJvb3RTZXJ2ZXJGaWxlKCk7CgppZiAobnVsbCA9PT0gJHRoaXMtPnByb3ZpZGVyTGlzdGluZykgewokZGF0YSA9ICR0aGlzLT5sb2FkUm9vdFNlcnZlckZpbGUoKTsKaWYgKGlzX2FycmF5KCRkYXRhKSkgewokdGhpcy0+bG9hZFByb3ZpZGVyTGlzdGluZ3MoJGRhdGEpOwp9Cn0KCmlmICgkdGhpcy0+bGF6eVByb3ZpZGVyc1VybCkgewoKcmV0dXJuIFtdOwp9CgppZiAobnVsbCAhPT0gJHRoaXMtPnByb3ZpZGVyc1VybCAmJiBudWxsICE9PSAkdGhpcy0+cHJvdmlkZXJMaXN0aW5nKSB7CnJldHVybiBhcnJheV9rZXlzKCR0aGlzLT5wcm92aWRlckxpc3RpbmcpOwp9CgpyZXR1cm4gW107Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmVQYWNrYWdlVHJhbnNwb3J0T3B0aW9ucyhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogdm9pZAp7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXREaXN0VXJscygpIGFzICR1cmwpIHsKaWYgKHN0cnBvcygkdXJsLCAkdGhpcy0+YmFzZVVybCkgPT09IDApIHsKJHBhY2thZ2UtPnNldFRyYW5zcG9ydE9wdGlvbnMoJHRoaXMtPm9wdGlvbnMpOwoKcmV0dXJuOwp9Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBoYXNQcm92aWRlcnMoKTogYm9vbAp7CiR0aGlzLT5sb2FkUm9vdFNlcnZlckZpbGUoKTsKCnJldHVybiAkdGhpcy0+aGFzUHJvdmlkZXJzOwp9CgoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB3aGF0UHJvdmlkZXMoc3RyaW5nICRuYW1lLCA/YXJyYXkgJGFjY2VwdGFibGVTdGFiaWxpdGllcyA9IG51bGwsID9hcnJheSAkc3RhYmlsaXR5RmxhZ3MgPSBudWxsLCBhcnJheSAkYWxyZWFkeUxvYWRlZCA9IFtdKTogYXJyYXkKewokcGFja2FnZXNTb3VyY2UgPSBudWxsOwppZiAoISR0aGlzLT5oYXNQYXJ0aWFsUGFja2FnZXMoKSB8fCAhaXNzZXQoJHRoaXMtPnBhcnRpYWxQYWNrYWdlc0J5TmFtZVskbmFtZV0pKSB7CgppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkbmFtZSkgfHwgJ19fcm9vdF9fJyA9PT0gJG5hbWUpIHsKcmV0dXJuIFtdOwp9CgppZiAobnVsbCA9PT0gJHRoaXMtPnByb3ZpZGVyTGlzdGluZykgewokZGF0YSA9ICR0aGlzLT5sb2FkUm9vdFNlcnZlckZpbGUoKTsKaWYgKGlzX2FycmF5KCRkYXRhKSkgewokdGhpcy0+bG9hZFByb3ZpZGVyTGlzdGluZ3MoJGRhdGEpOwp9Cn0KCiR1c2VMYXN0TW9kaWZpZWRDaGVjayA9IGZhbHNlOwppZiAoJHRoaXMtPmxhenlQcm92aWRlcnNVcmwgJiYgIWlzc2V0KCR0aGlzLT5wcm92aWRlckxpc3RpbmdbJG5hbWVdKSkgewokaGFzaCA9IG51bGw7CiR1cmwgPSBzdHJfcmVwbGFjZSgnJXBhY2thZ2UlJywgJG5hbWUsICR0aGlzLT5sYXp5UHJvdmlkZXJzVXJsKTsKJGNhY2hlS2V5ID0gJ3Byb3ZpZGVyLScuc3RydHIoJG5hbWUsICcvJywgJyQnKS4nLmpzb24nOwokdXNlTGFzdE1vZGlmaWVkQ2hlY2sgPSB0cnVlOwp9IGVsc2VpZiAoJHRoaXMtPnByb3ZpZGVyc1VybCkgewoKaWYgKCFpc3NldCgkdGhpcy0+cHJvdmlkZXJMaXN0aW5nWyRuYW1lXSkpIHsKcmV0dXJuIFtdOwp9CgokaGFzaCA9ICR0aGlzLT5wcm92aWRlckxpc3RpbmdbJG5hbWVdWydzaGEyNTYnXTsKJHVybCA9IHN0cl9yZXBsYWNlKFsnJXBhY2thZ2UlJywgJyVoYXNoJSddLCBbJG5hbWUsICRoYXNoXSwgJHRoaXMtPnByb3ZpZGVyc1VybCk7CiRjYWNoZUtleSA9ICdwcm92aWRlci0nLnN0cnRyKCRuYW1lLCAnLycsICckJykuJy5qc29uJzsKfSBlbHNlIHsKcmV0dXJuIFtdOwp9CgokcGFja2FnZXMgPSBudWxsOwppZiAoISR1c2VMYXN0TW9kaWZpZWRDaGVjayAmJiAkaGFzaCAmJiAkdGhpcy0+Y2FjaGUtPnNoYTI1NigkY2FjaGVLZXkpID09PSAkaGFzaCkgewokcGFja2FnZXMgPSBqc29uX2RlY29kZSgkdGhpcy0+Y2FjaGUtPnJlYWQoJGNhY2hlS2V5KSwgdHJ1ZSk7CiRwYWNrYWdlc1NvdXJjZSA9ICdjYWNoZWQgZmlsZSAoJy4kY2FjaGVLZXkuJyBvcmlnaW5hdGluZyBmcm9tICcuVXJsOjpzYW5pdGl6ZSgkdXJsKS4nKSc7Cn0gZWxzZWlmICgkdXNlTGFzdE1vZGlmaWVkQ2hlY2spIHsKaWYgKCRjb250ZW50cyA9ICR0aGlzLT5jYWNoZS0+cmVhZCgkY2FjaGVLZXkpKSB7CiRjb250ZW50cyA9IGpzb25fZGVjb2RlKCRjb250ZW50cywgdHJ1ZSk7CgppZiAoaXNzZXQoJGFscmVhZHlMb2FkZWRbJG5hbWVdKSkgewokcGFja2FnZXMgPSAkY29udGVudHM7CiRwYWNrYWdlc1NvdXJjZSA9ICdjYWNoZWQgZmlsZSAoJy4kY2FjaGVLZXkuJyBvcmlnaW5hdGluZyBmcm9tICcuVXJsOjpzYW5pdGl6ZSgkdXJsKS4nKSc7Cn0gZWxzZWlmIChpc3NldCgkY29udGVudHNbJ2xhc3QtbW9kaWZpZWQnXSkpIHsKJHJlc3BvbnNlID0gJHRoaXMtPmZldGNoRmlsZUlmTGFzdE1vZGlmaWVkKCR1cmwsICRjYWNoZUtleSwgJGNvbnRlbnRzWydsYXN0LW1vZGlmaWVkJ10pOwokcGFja2FnZXMgPSB0cnVlID09PSAkcmVzcG9uc2UgPyAkY29udGVudHMgOiAkcmVzcG9uc2U7CiRwYWNrYWdlc1NvdXJjZSA9IHRydWUgPT09ICRyZXNwb25zZSA/ICdjYWNoZWQgZmlsZSAoJy4kY2FjaGVLZXkuJyBvcmlnaW5hdGluZyBmcm9tICcuVXJsOjpzYW5pdGl6ZSgkdXJsKS4nKScgOiAnZG93bmxvYWRlZCBmaWxlICgnLlVybDo6c2FuaXRpemUoJHVybCkuJyknOwp9Cn0KfQoKaWYgKCEkcGFja2FnZXMpIHsKdHJ5IHsKJHBhY2thZ2VzID0gJHRoaXMtPmZldGNoRmlsZSgkdXJsLCAkY2FjaGVLZXksICRoYXNoLCAkdXNlTGFzdE1vZGlmaWVkQ2hlY2spOwokcGFja2FnZXNTb3VyY2UgPSAnZG93bmxvYWRlZCBmaWxlICgnLlVybDo6c2FuaXRpemUoJHVybCkuJyknOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKCmlmICgkdGhpcy0+bGF6eVByb3ZpZGVyc1VybCAmJiBpbl9hcnJheSgkZS0+Z2V0U3RhdHVzQ29kZSgpLCBbNDA0LCA0OTldLCB0cnVlKSkgewokcGFja2FnZXMgPSBbJ3BhY2thZ2VzJyA9PiBbXV07CiRwYWNrYWdlc1NvdXJjZSA9ICdub3QtZm91bmQgZmlsZSAoJy5Vcmw6OnNhbml0aXplKCR1cmwpLicpJzsKaWYgKCRlLT5nZXRTdGF0dXNDb2RlKCkgPT09IDQ5OSkgewokdGhpcy0+aW8tPmVycm9yKCc8d2FybmluZz4nIC4gJGUtPmdldE1lc3NhZ2UoKSAuICc8L3dhcm5pbmc+Jyk7Cn0KfSBlbHNlIHsKdGhyb3cgJGU7Cn0KfQp9CgokbG9hZGluZ1BhcnRpYWxQYWNrYWdlID0gZmFsc2U7Cn0gZWxzZSB7CiRwYWNrYWdlcyA9IFsncGFja2FnZXMnID0+IFsndmVyc2lvbnMnID0+ICR0aGlzLT5wYXJ0aWFsUGFja2FnZXNCeU5hbWVbJG5hbWVdXV07CiRwYWNrYWdlc1NvdXJjZSA9ICdyb290IGZpbGUgKCcuVXJsOjpzYW5pdGl6ZSgkdGhpcy0+Z2V0UGFja2FnZXNKc29uVXJsKCkpLicpJzsKJGxvYWRpbmdQYXJ0aWFsUGFja2FnZSA9IHRydWU7Cn0KCiRyZXN1bHQgPSBbXTsKJHZlcnNpb25zVG9Mb2FkID0gW107CmZvcmVhY2ggKCRwYWNrYWdlc1sncGFja2FnZXMnXSBhcyAkdmVyc2lvbnMpIHsKZm9yZWFjaCAoJHZlcnNpb25zIGFzICR2ZXJzaW9uKSB7CiRub3JtYWxpemVkTmFtZSA9IHN0cnRvbG93ZXIoJHZlcnNpb25bJ25hbWUnXSk7CgoKaWYgKCRub3JtYWxpemVkTmFtZSAhPT0gJG5hbWUpIHsKY29udGludWU7Cn0KCmlmICghJGxvYWRpbmdQYXJ0aWFsUGFja2FnZSAmJiAkdGhpcy0+aGFzUGFydGlhbFBhY2thZ2VzKCkgJiYgaXNzZXQoJHRoaXMtPnBhcnRpYWxQYWNrYWdlc0J5TmFtZVskbm9ybWFsaXplZE5hbWVdKSkgewpjb250aW51ZTsKfQoKaWYgKCFpc3NldCgkdmVyc2lvbnNUb0xvYWRbJHZlcnNpb25bJ3VpZCddXSkpIHsKaWYgKCFpc3NldCgkdmVyc2lvblsndmVyc2lvbl9ub3JtYWxpemVkJ10pKSB7CiR2ZXJzaW9uWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXSA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHZlcnNpb25bJ3ZlcnNpb24nXSk7Cn0gZWxzZWlmICgkdmVyc2lvblsndmVyc2lvbl9ub3JtYWxpemVkJ10gPT09IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTKSB7CgokdmVyc2lvblsndmVyc2lvbl9ub3JtYWxpemVkJ10gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCR2ZXJzaW9uWyd2ZXJzaW9uJ10pOwp9CgoKaWYgKGlzc2V0KCRhbHJlYWR5TG9hZGVkWyRuYW1lXVskdmVyc2lvblsndmVyc2lvbl9ub3JtYWxpemVkJ11dKSkgewpjb250aW51ZTsKfQoKaWYgKCR0aGlzLT5pc1ZlcnNpb25BY2NlcHRhYmxlKG51bGwsICRub3JtYWxpemVkTmFtZSwgJHZlcnNpb24sICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMsICRzdGFiaWxpdHlGbGFncykpIHsKJHZlcnNpb25zVG9Mb2FkWyR2ZXJzaW9uWyd1aWQnXV0gPSAkdmVyc2lvbjsKfQp9Cn0KfQoKCiRsb2FkZWRQYWNrYWdlcyA9ICR0aGlzLT5jcmVhdGVQYWNrYWdlcygkdmVyc2lvbnNUb0xvYWQsICRwYWNrYWdlc1NvdXJjZSk7CiR1aWRzID0gYXJyYXlfa2V5cygkdmVyc2lvbnNUb0xvYWQpOwoKZm9yZWFjaCAoJGxvYWRlZFBhY2thZ2VzIGFzICRpbmRleCA9PiAkcGFja2FnZSkgewokcGFja2FnZS0+c2V0UmVwb3NpdG9yeSgkdGhpcyk7CiR1aWQgPSAkdWlkc1skaW5kZXhdOwoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiRhbGlhc2VkID0gJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKJGFsaWFzZWQtPnNldFJlcG9zaXRvcnkoJHRoaXMpOwoKJHJlc3VsdFskdWlkXSA9ICRhbGlhc2VkOwokcmVzdWx0WyR1aWQuJy1hbGlhcyddID0gJHBhY2thZ2U7Cn0gZWxzZSB7CiRyZXN1bHRbJHVpZF0gPSAkcGFja2FnZTsKfQp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluaXRpYWxpemUoKQp7CnBhcmVudDo6aW5pdGlhbGl6ZSgpOwoKJHJlcG9EYXRhID0gJHRoaXMtPmxvYWREYXRhRnJvbVNlcnZlcigpOwoKZm9yZWFjaCAoJHRoaXMtPmNyZWF0ZVBhY2thZ2VzKCRyZXBvRGF0YSwgJ3Jvb3QgZmlsZSAoJy5Vcmw6OnNhbml0aXplKCR0aGlzLT5nZXRQYWNrYWdlc0pzb25VcmwoKSkuJyknKSBhcyAkcGFja2FnZSkgewokdGhpcy0+YWRkUGFja2FnZSgkcGFja2FnZSk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFBhY2thZ2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewpwYXJlbnQ6OmFkZFBhY2thZ2UoJHBhY2thZ2UpOwokdGhpcy0+Y29uZmlndXJlUGFja2FnZVRyYW5zcG9ydE9wdGlvbnMoJHBhY2thZ2UpOwp9CgoKCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gbG9hZEFzeW5jUGFja2FnZXMoYXJyYXkgJHBhY2thZ2VOYW1lcywgP2FycmF5ICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMgPSBudWxsLCA/YXJyYXkgJHN0YWJpbGl0eUZsYWdzID0gbnVsbCwgYXJyYXkgJGFscmVhZHlMb2FkZWQgPSBbXSk6IGFycmF5CnsKJHRoaXMtPmxvYWRSb290U2VydmVyRmlsZSgpOwoKJHBhY2thZ2VzID0gW107CiRuYW1lc0ZvdW5kID0gW107CiRwcm9taXNlcyA9IFtdOwoKaWYgKG51bGwgPT09ICR0aGlzLT5sYXp5UHJvdmlkZXJzVXJsKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ2xvYWRBc3luY1BhY2thZ2VzIG9ubHkgc3VwcG9ydHMgdjIgcHJvdG9jb2wgY29tcG9zZXIgcmVwb3Mgd2l0aCBhIG1ldGFkYXRhLXVybCcpOwp9CgoKZm9yZWFjaCAoJHBhY2thZ2VOYW1lcyBhcyAkbmFtZSA9PiAkY29uc3RyYWludCkgewppZiAoJGFjY2VwdGFibGVTdGFiaWxpdGllcyA9PT0gbnVsbCB8fCAkc3RhYmlsaXR5RmxhZ3MgPT09IG51bGwgfHwgU3RhYmlsaXR5RmlsdGVyOjppc1BhY2thZ2VBY2NlcHRhYmxlKCRhY2NlcHRhYmxlU3RhYmlsaXRpZXMsICRzdGFiaWxpdHlGbGFncywgWyRuYW1lXSwgJ2RldicpKSB7CiRwYWNrYWdlTmFtZXNbJG5hbWUuJ35kZXYnXSA9ICRjb25zdHJhaW50Owp9CgppZiAoaXNzZXQoJGFjY2VwdGFibGVTdGFiaWxpdGllc1snZGV2J10pICYmIGNvdW50KCRhY2NlcHRhYmxlU3RhYmlsaXRpZXMpID09PSAxICYmIGNvdW50KCRzdGFiaWxpdHlGbGFncykgPT09IDApIHsKdW5zZXQoJHBhY2thZ2VOYW1lc1skbmFtZV0pOwp9Cn0KCmZvcmVhY2ggKCRwYWNrYWdlTmFtZXMgYXMgJG5hbWUgPT4gJGNvbnN0cmFpbnQpIHsKJG5hbWUgPSBzdHJ0b2xvd2VyKCRuYW1lKTsKCiRyZWFsTmFtZSA9IFByZWc6OnJlcGxhY2UoJ3t+ZGV2JH0nLCAnJywgJG5hbWUpOwoKaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJHJlYWxOYW1lKSB8fCAnX19yb290X18nID09PSAkcmVhbE5hbWUpIHsKY29udGludWU7Cn0KCiRwcm9taXNlc1tdID0gJHRoaXMtPnN0YXJ0Q2FjaGVkQXN5bmNEb3dubG9hZCgkbmFtZSwgJHJlYWxOYW1lKQotPnRoZW4oZnVuY3Rpb24gKGFycmF5ICRzcGVjKSB1c2UgKCYkcGFja2FnZXMsICYkbmFtZXNGb3VuZCwgJHJlYWxOYW1lLCAkY29uc3RyYWludCwgJGFjY2VwdGFibGVTdGFiaWxpdGllcywgJHN0YWJpbGl0eUZsYWdzLCAkYWxyZWFkeUxvYWRlZCk6IHZvaWQgewpbJHJlc3BvbnNlLCAkcGFja2FnZXNTb3VyY2VdID0gJHNwZWM7CmlmIChudWxsID09PSAkcmVzcG9uc2UgfHwgIWlzc2V0KCRyZXNwb25zZVsncGFja2FnZXMnXVskcmVhbE5hbWVdKSkgewpyZXR1cm47Cn0KCiR2ZXJzaW9ucyA9ICRyZXNwb25zZVsncGFja2FnZXMnXVskcmVhbE5hbWVdOwoKaWYgKGlzc2V0KCRyZXNwb25zZVsnbWluaWZpZWQnXSkgJiYgJHJlc3BvbnNlWydtaW5pZmllZCddID09PSAnY29tcG9zZXIvMi4wJykgewokdmVyc2lvbnMgPSBNZXRhZGF0YU1pbmlmaWVyOjpleHBhbmQoJHZlcnNpb25zKTsKfQoKJG5hbWVzRm91bmRbJHJlYWxOYW1lXSA9IHRydWU7CiR2ZXJzaW9uc1RvTG9hZCA9IFtdOwpmb3JlYWNoICgkdmVyc2lvbnMgYXMgJHZlcnNpb24pIHsKaWYgKCFpc3NldCgkdmVyc2lvblsndmVyc2lvbl9ub3JtYWxpemVkJ10pKSB7CiR2ZXJzaW9uWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXSA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHZlcnNpb25bJ3ZlcnNpb24nXSk7Cn0gZWxzZWlmICgkdmVyc2lvblsndmVyc2lvbl9ub3JtYWxpemVkJ10gPT09IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTKSB7CgokdmVyc2lvblsndmVyc2lvbl9ub3JtYWxpemVkJ10gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCR2ZXJzaW9uWyd2ZXJzaW9uJ10pOwp9CgoKaWYgKGlzc2V0KCRhbHJlYWR5TG9hZGVkWyRyZWFsTmFtZV1bJHZlcnNpb25bJ3ZlcnNpb25fbm9ybWFsaXplZCddXSkpIHsKY29udGludWU7Cn0KCmlmICgkdGhpcy0+aXNWZXJzaW9uQWNjZXB0YWJsZSgkY29uc3RyYWludCwgJHJlYWxOYW1lLCAkdmVyc2lvbiwgJGFjY2VwdGFibGVTdGFiaWxpdGllcywgJHN0YWJpbGl0eUZsYWdzKSkgewokdmVyc2lvbnNUb0xvYWRbXSA9ICR2ZXJzaW9uOwp9Cn0KCiRsb2FkZWRQYWNrYWdlcyA9ICR0aGlzLT5jcmVhdGVQYWNrYWdlcygkdmVyc2lvbnNUb0xvYWQsICRwYWNrYWdlc1NvdXJjZSk7CmZvcmVhY2ggKCRsb2FkZWRQYWNrYWdlcyBhcyAkcGFja2FnZSkgewokcGFja2FnZS0+c2V0UmVwb3NpdG9yeSgkdGhpcyk7CiRwYWNrYWdlc1tzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSA9ICRwYWNrYWdlOwoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICYmICFpc3NldCgkcGFja2FnZXNbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlLT5nZXRBbGlhc09mKCkpXSkpIHsKJHBhY2thZ2UtPmdldEFsaWFzT2YoKS0+c2V0UmVwb3NpdG9yeSgkdGhpcyk7CiRwYWNrYWdlc1tzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UtPmdldEFsaWFzT2YoKSldID0gJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKfQp9Cn0pOwp9CgokdGhpcy0+bG9vcC0+d2FpdCgkcHJvbWlzZXMpOwoKcmV0dXJuIFsnbmFtZXNGb3VuZCcgPT4gJG5hbWVzRm91bmQsICdwYWNrYWdlcycgPT4gJHBhY2thZ2VzXTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzdGFydENhY2hlZEFzeW5jRG93bmxvYWQoc3RyaW5nICRmaWxlTmFtZSwgP3N0cmluZyAkcGFja2FnZU5hbWUgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CmlmIChudWxsID09PSAkdGhpcy0+bGF6eVByb3ZpZGVyc1VybCkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdzdGFydENhY2hlZEFzeW5jRG93bmxvYWQgb25seSBzdXBwb3J0cyB2MiBwcm90b2NvbCBjb21wb3NlciByZXBvcyB3aXRoIGEgbWV0YWRhdGEtdXJsJyk7Cn0KCiRuYW1lID0gc3RydG9sb3dlcigkZmlsZU5hbWUpOwokcGFja2FnZU5hbWUgPSAkcGFja2FnZU5hbWUgPz8gJG5hbWU7CgokdXJsID0gc3RyX3JlcGxhY2UoJyVwYWNrYWdlJScsICRuYW1lLCAkdGhpcy0+bGF6eVByb3ZpZGVyc1VybCk7CiRjYWNoZUtleSA9ICdwcm92aWRlci0nLnN0cnRyKCRuYW1lLCAnLycsICd+JykuJy5qc29uJzsKCiRsYXN0TW9kaWZpZWQgPSBudWxsOwppZiAoJGNvbnRlbnRzID0gJHRoaXMtPmNhY2hlLT5yZWFkKCRjYWNoZUtleSkpIHsKJGNvbnRlbnRzID0ganNvbl9kZWNvZGUoJGNvbnRlbnRzLCB0cnVlKTsKJGxhc3RNb2RpZmllZCA9ICRjb250ZW50c1snbGFzdC1tb2RpZmllZCddID8/IG51bGw7Cn0KCnJldHVybiAkdGhpcy0+YXN5bmNGZXRjaEZpbGUoJHVybCwgJGNhY2hlS2V5LCAkbGFzdE1vZGlmaWVkKQotPnRoZW4oc3RhdGljIGZ1bmN0aW9uICgkcmVzcG9uc2UpIHVzZSAoJHVybCwgJGNhY2hlS2V5LCAkY29udGVudHMsICRwYWNrYWdlTmFtZSk6IGFycmF5IHsKJHBhY2thZ2VzU291cmNlID0gJ2Rvd25sb2FkZWQgZmlsZSAoJy5Vcmw6OnNhbml0aXplKCR1cmwpLicpJzsKCmlmICh0cnVlID09PSAkcmVzcG9uc2UpIHsKJHBhY2thZ2VzU291cmNlID0gJ2NhY2hlZCBmaWxlICgnLiRjYWNoZUtleS4nIG9yaWdpbmF0aW5nIGZyb20gJy5Vcmw6OnNhbml0aXplKCR1cmwpLicpJzsKJHJlc3BvbnNlID0gJGNvbnRlbnRzOwp9CgppZiAoIWlzc2V0KCRyZXNwb25zZVsncGFja2FnZXMnXVskcGFja2FnZU5hbWVdKSAmJiAhaXNzZXQoJHJlc3BvbnNlWydzZWN1cml0eS1hZHZpc29yaWVzJ10pKSB7CnJldHVybiBbbnVsbCwgJHBhY2thZ2VzU291cmNlXTsKfQoKcmV0dXJuIFskcmVzcG9uc2UsICRwYWNrYWdlc1NvdXJjZV07Cn0pOwp9CgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gaXNWZXJzaW9uQWNjZXB0YWJsZSg/Q29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCwgc3RyaW5nICRuYW1lLCBhcnJheSAkdmVyc2lvbkRhdGEsID9hcnJheSAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzID0gbnVsbCwgP2FycmF5ICRzdGFiaWxpdHlGbGFncyA9IG51bGwpOiBib29sCnsKJHZlcnNpb25zID0gWyR2ZXJzaW9uRGF0YVsndmVyc2lvbl9ub3JtYWxpemVkJ11dOwoKaWYgKCRhbGlhcyA9ICR0aGlzLT5sb2FkZXItPmdldEJyYW5jaEFsaWFzKCR2ZXJzaW9uRGF0YSkpIHsKJHZlcnNpb25zW10gPSAkYWxpYXM7Cn0KCmZvcmVhY2ggKCR2ZXJzaW9ucyBhcyAkdmVyc2lvbikgewppZiAobnVsbCAhPT0gJGFjY2VwdGFibGVTdGFiaWxpdGllcyAmJiBudWxsICE9PSAkc3RhYmlsaXR5RmxhZ3MgJiYgIVN0YWJpbGl0eUZpbHRlcjo6aXNQYWNrYWdlQWNjZXB0YWJsZSgkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCAkc3RhYmlsaXR5RmxhZ3MsIFskbmFtZV0sIFZlcnNpb25QYXJzZXI6OnBhcnNlU3RhYmlsaXR5KCR2ZXJzaW9uKSkpIHsKY29udGludWU7Cn0KCmlmICgkY29uc3RyYWludCAmJiAhQ29tcGlsaW5nTWF0Y2hlcjo6bWF0Y2goJGNvbnN0cmFpbnQsIENvbnN0cmFpbnQ6Ok9QX0VRLCAkdmVyc2lvbikpIHsKY29udGludWU7Cn0KCnJldHVybiB0cnVlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0UGFja2FnZXNKc29uVXJsKCk6IHN0cmluZwp7CiRqc29uVXJsUGFydHMgPSBwYXJzZV91cmwoc3RydHIoJHRoaXMtPnVybCwgJ1xcJywgJy8nKSk7CgppZiAoaXNzZXQoJGpzb25VcmxQYXJ0c1sncGF0aCddKSAmJiBmYWxzZSAhPT0gc3RycG9zKCRqc29uVXJsUGFydHNbJ3BhdGgnXSwgJy5qc29uJykpIHsKcmV0dXJuICR0aGlzLT51cmw7Cn0KCnJldHVybiAkdGhpcy0+dXJsIC4gJy9wYWNrYWdlcy5qc29uJzsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGxvYWRSb290U2VydmVyRmlsZSg/aW50ICRyb290TWF4QWdlID0gbnVsbCkKewppZiAobnVsbCAhPT0gJHRoaXMtPnJvb3REYXRhKSB7CnJldHVybiAkdGhpcy0+cm9vdERhdGE7Cn0KCmlmICghZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpICYmIHN0cnBvcygkdGhpcy0+dXJsLCAnaHR0cHMnKSA9PT0gMCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1lvdSBtdXN0IGVuYWJsZSB0aGUgb3BlbnNzbCBleHRlbnNpb24gaW4geW91ciBwaHAuaW5pIHRvIGxvYWQgaW5mb3JtYXRpb24gZnJvbSAnLiR0aGlzLT51cmwpOwp9CgppZiAoJGNhY2hlZERhdGEgPSAkdGhpcy0+Y2FjaGUtPnJlYWQoJ3BhY2thZ2VzLmpzb24nKSkgewokY2FjaGVkRGF0YSA9IGpzb25fZGVjb2RlKCRjYWNoZWREYXRhLCB0cnVlKTsKaWYgKCRyb290TWF4QWdlICE9PSBudWxsICYmICgkYWdlID0gJHRoaXMtPmNhY2hlLT5nZXRBZ2UoJ3BhY2thZ2VzLmpzb24nKSkgIT09IGZhbHNlICYmICRhZ2UgPD0gJHJvb3RNYXhBZ2UpIHsKJGRhdGEgPSAkY2FjaGVkRGF0YTsKfSBlbHNlaWYgKGlzc2V0KCRjYWNoZWREYXRhWydsYXN0LW1vZGlmaWVkJ10pKSB7CiRyZXNwb25zZSA9ICR0aGlzLT5mZXRjaEZpbGVJZkxhc3RNb2RpZmllZCgkdGhpcy0+Z2V0UGFja2FnZXNKc29uVXJsKCksICdwYWNrYWdlcy5qc29uJywgJGNhY2hlZERhdGFbJ2xhc3QtbW9kaWZpZWQnXSk7CiRkYXRhID0gdHJ1ZSA9PT0gJHJlc3BvbnNlID8gJGNhY2hlZERhdGEgOiAkcmVzcG9uc2U7Cn0KfQoKaWYgKCFpc3NldCgkZGF0YSkpIHsKJGRhdGEgPSAkdGhpcy0+ZmV0Y2hGaWxlKCR0aGlzLT5nZXRQYWNrYWdlc0pzb25VcmwoKSwgJ3BhY2thZ2VzLmpzb24nLCBudWxsLCB0cnVlKTsKfQoKaWYgKCFlbXB0eSgkZGF0YVsnbm90aWZ5LWJhdGNoJ10pKSB7CiR0aGlzLT5ub3RpZnlVcmwgPSAkdGhpcy0+Y2Fub25pY2FsaXplVXJsKCRkYXRhWydub3RpZnktYmF0Y2gnXSk7Cn0gZWxzZWlmICghZW1wdHkoJGRhdGFbJ25vdGlmeSddKSkgewokdGhpcy0+bm90aWZ5VXJsID0gJHRoaXMtPmNhbm9uaWNhbGl6ZVVybCgkZGF0YVsnbm90aWZ5J10pOwp9CgppZiAoIWVtcHR5KCRkYXRhWydzZWFyY2gnXSkpIHsKJHRoaXMtPnNlYXJjaFVybCA9ICR0aGlzLT5jYW5vbmljYWxpemVVcmwoJGRhdGFbJ3NlYXJjaCddKTsKfQoKaWYgKCFlbXB0eSgkZGF0YVsnbWlycm9ycyddKSkgewpmb3JlYWNoICgkZGF0YVsnbWlycm9ycyddIGFzICRtaXJyb3IpIHsKaWYgKCFlbXB0eSgkbWlycm9yWydnaXQtdXJsJ10pKSB7CiR0aGlzLT5zb3VyY2VNaXJyb3JzWydnaXQnXVtdID0gWyd1cmwnID0+ICRtaXJyb3JbJ2dpdC11cmwnXSwgJ3ByZWZlcnJlZCcgPT4gIWVtcHR5KCRtaXJyb3JbJ3ByZWZlcnJlZCddKV07Cn0KaWYgKCFlbXB0eSgkbWlycm9yWydoZy11cmwnXSkpIHsKJHRoaXMtPnNvdXJjZU1pcnJvcnNbJ2hnJ11bXSA9IFsndXJsJyA9PiAkbWlycm9yWydoZy11cmwnXSwgJ3ByZWZlcnJlZCcgPT4gIWVtcHR5KCRtaXJyb3JbJ3ByZWZlcnJlZCddKV07Cn0KaWYgKCFlbXB0eSgkbWlycm9yWydkaXN0LXVybCddKSkgewokdGhpcy0+ZGlzdE1pcnJvcnNbXSA9IFsKJ3VybCcgPT4gJHRoaXMtPmNhbm9uaWNhbGl6ZVVybCgkbWlycm9yWydkaXN0LXVybCddKSwKJ3ByZWZlcnJlZCcgPT4gIWVtcHR5KCRtaXJyb3JbJ3ByZWZlcnJlZCddKSwKXTsKfQp9Cn0KCmlmICghZW1wdHkoJGRhdGFbJ3Byb3ZpZGVycy1sYXp5LXVybCddKSkgewokdGhpcy0+bGF6eVByb3ZpZGVyc1VybCA9ICR0aGlzLT5jYW5vbmljYWxpemVVcmwoJGRhdGFbJ3Byb3ZpZGVycy1sYXp5LXVybCddKTsKJHRoaXMtPmhhc1Byb3ZpZGVycyA9IHRydWU7CgokdGhpcy0+aGFzUGFydGlhbFBhY2thZ2VzID0gIWVtcHR5KCRkYXRhWydwYWNrYWdlcyddKSAmJiBpc19hcnJheSgkZGF0YVsncGFja2FnZXMnXSk7Cn0KCgoKCmlmICghZW1wdHkoJGRhdGFbJ21ldGFkYXRhLXVybCddKSkgewokdGhpcy0+bGF6eVByb3ZpZGVyc1VybCA9ICR0aGlzLT5jYW5vbmljYWxpemVVcmwoJGRhdGFbJ21ldGFkYXRhLXVybCddKTsKJHRoaXMtPnByb3ZpZGVyc1VybCA9IG51bGw7CiR0aGlzLT5oYXNQcm92aWRlcnMgPSBmYWxzZTsKJHRoaXMtPmhhc1BhcnRpYWxQYWNrYWdlcyA9ICFlbXB0eSgkZGF0YVsncGFja2FnZXMnXSkgJiYgaXNfYXJyYXkoJGRhdGFbJ3BhY2thZ2VzJ10pOwokdGhpcy0+YWxsb3dTc2xEb3duZ3JhZGUgPSBmYWxzZTsKCgoKCmlmICghZW1wdHkoJGRhdGFbJ2F2YWlsYWJsZS1wYWNrYWdlcyddKSkgewokYXZhaWxQYWNrYWdlcyA9IGFycmF5X21hcCgnc3RydG9sb3dlcicsICRkYXRhWydhdmFpbGFibGUtcGFja2FnZXMnXSk7CiR0aGlzLT5hdmFpbGFibGVQYWNrYWdlcyA9IGFycmF5X2NvbWJpbmUoJGF2YWlsUGFja2FnZXMsICRhdmFpbFBhY2thZ2VzKTsKJHRoaXMtPmhhc0F2YWlsYWJsZVBhY2thZ2VMaXN0ID0gdHJ1ZTsKfQoKCgoKaWYgKCFlbXB0eSgkZGF0YVsnYXZhaWxhYmxlLXBhY2thZ2UtcGF0dGVybnMnXSkpIHsKJHRoaXMtPmF2YWlsYWJsZVBhY2thZ2VQYXR0ZXJucyA9IGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRwYXR0ZXJuKTogc3RyaW5nIHsKcmV0dXJuIEJhc2VQYWNrYWdlOjpwYWNrYWdlTmFtZVRvUmVnZXhwKCRwYXR0ZXJuKTsKfSwgJGRhdGFbJ2F2YWlsYWJsZS1wYWNrYWdlLXBhdHRlcm5zJ10pOwokdGhpcy0+aGFzQXZhaWxhYmxlUGFja2FnZUxpc3QgPSB0cnVlOwp9CgoKCnVuc2V0KCRkYXRhWydwcm92aWRlcnMtdXJsJ10sICRkYXRhWydwcm92aWRlcnMnXSwgJGRhdGFbJ3Byb3ZpZGVycy1pbmNsdWRlcyddKTsKCmlmIChpc3NldCgkZGF0YVsnc2VjdXJpdHktYWR2aXNvcmllcyddKSAmJiBpc19hcnJheSgkZGF0YVsnc2VjdXJpdHktYWR2aXNvcmllcyddKSkgewokdGhpcy0+c2VjdXJpdHlBZHZpc29yeUNvbmZpZyA9IFsKJ21ldGFkYXRhJyA9PiAkZGF0YVsnc2VjdXJpdHktYWR2aXNvcmllcyddWydtZXRhZGF0YSddID8/IGZhbHNlLAonYXBpLXVybCcgPT4gaXNzZXQoJGRhdGFbJ3NlY3VyaXR5LWFkdmlzb3JpZXMnXVsnYXBpLXVybCddKSAmJiBpc19zdHJpbmcoJGRhdGFbJ3NlY3VyaXR5LWFkdmlzb3JpZXMnXVsnYXBpLXVybCddKSA/ICR0aGlzLT5jYW5vbmljYWxpemVVcmwoJGRhdGFbJ3NlY3VyaXR5LWFkdmlzb3JpZXMnXVsnYXBpLXVybCddKSA6IG51bGwsCl07CmlmICgkdGhpcy0+c2VjdXJpdHlBZHZpc29yeUNvbmZpZ1snYXBpLXVybCddID09PSBudWxsICYmICEkdGhpcy0+aGFzQXZhaWxhYmxlUGFja2FnZUxpc3QpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0ludmFsaWQgc2VjdXJpdHkgYWR2aXNvcnkgY29uZmlndXJhdGlvbiBvbiAnLiR0aGlzLT5nZXRSZXBvTmFtZSgpLic6IElmIHRoZSByZXBvc2l0b3J5IGRvZXMgbm90IHByb3ZpZGUgYSBzZWN1cml0eS1hZHZpc29yaWVzLmFwaS11cmwgdGhlbiBhdmFpbGFibGUtcGFja2FnZXMgb3IgYXZhaWxhYmxlLXBhY2thZ2UtcGF0dGVybnMgYXJlIHJlcXVpcmVkIHRvIGJlIHByb3ZpZGVkIGZvciBwZXJmb3JtYW5jZSByZWFzb24uJyk7Cn0KfQp9CgppZiAoJHRoaXMtPmFsbG93U3NsRG93bmdyYWRlKSB7CiR0aGlzLT51cmwgPSBzdHJfcmVwbGFjZSgnaHR0cHM6Ly8nLCAnaHR0cDovLycsICR0aGlzLT51cmwpOwokdGhpcy0+YmFzZVVybCA9IHN0cl9yZXBsYWNlKCdodHRwczovLycsICdodHRwOi8vJywgJHRoaXMtPmJhc2VVcmwpOwp9CgppZiAoIWVtcHR5KCRkYXRhWydwcm92aWRlcnMtdXJsJ10pKSB7CiR0aGlzLT5wcm92aWRlcnNVcmwgPSAkdGhpcy0+Y2Fub25pY2FsaXplVXJsKCRkYXRhWydwcm92aWRlcnMtdXJsJ10pOwokdGhpcy0+aGFzUHJvdmlkZXJzID0gdHJ1ZTsKfQoKaWYgKCFlbXB0eSgkZGF0YVsnbGlzdCddKSkgewokdGhpcy0+bGlzdFVybCA9ICR0aGlzLT5jYW5vbmljYWxpemVVcmwoJGRhdGFbJ2xpc3QnXSk7Cn0KCmlmICghZW1wdHkoJGRhdGFbJ3Byb3ZpZGVycyddKSB8fCAhZW1wdHkoJGRhdGFbJ3Byb3ZpZGVycy1pbmNsdWRlcyddKSkgewokdGhpcy0+aGFzUHJvdmlkZXJzID0gdHJ1ZTsKfQoKaWYgKCFlbXB0eSgkZGF0YVsncHJvdmlkZXJzLWFwaSddKSkgewokdGhpcy0+cHJvdmlkZXJzQXBpVXJsID0gJHRoaXMtPmNhbm9uaWNhbGl6ZVVybCgkZGF0YVsncHJvdmlkZXJzLWFwaSddKTsKfQoKcmV0dXJuICR0aGlzLT5yb290RGF0YSA9ICRkYXRhOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNhbm9uaWNhbGl6ZVVybChzdHJpbmcgJHVybCk6IHN0cmluZwp7CmlmIChzdHJsZW4oJHVybCkgPT09IDApIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0V4cGVjdGVkIGEgc3RyaW5nIHdpdGggYSB2YWx1ZSBhbmQgbm90IGFuIGVtcHR5IHN0cmluZycpOwp9CgppZiAoc3RyX3N0YXJ0c193aXRoKCR1cmwsICcvJykpIHsKaWYgKFByZWc6OmlzTWF0Y2goJ3teW146XSsrOi8vW14vXSorfScsICR0aGlzLT51cmwsICRtYXRjaGVzKSkgewpyZXR1cm4gJG1hdGNoZXNbMF0gLiAkdXJsOwp9CgpyZXR1cm4gJHRoaXMtPnVybDsKfQoKcmV0dXJuICR1cmw7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gbG9hZERhdGFGcm9tU2VydmVyKCk6IGFycmF5CnsKJGRhdGEgPSAkdGhpcy0+bG9hZFJvb3RTZXJ2ZXJGaWxlKCk7CmlmICh0cnVlID09PSAkZGF0YSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdsb2FkUm9vdFNlcnZlckZpbGUgc2hvdWxkIG5vdCByZXR1cm4gdHJ1ZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24nKTsKfQoKcmV0dXJuICR0aGlzLT5sb2FkSW5jbHVkZXMoJGRhdGEpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGhhc1BhcnRpYWxQYWNrYWdlcygpOiBib29sCnsKaWYgKCR0aGlzLT5oYXNQYXJ0aWFsUGFja2FnZXMgJiYgbnVsbCA9PT0gJHRoaXMtPnBhcnRpYWxQYWNrYWdlc0J5TmFtZSkgewokdGhpcy0+aW5pdGlhbGl6ZVBhcnRpYWxQYWNrYWdlcygpOwp9CgpyZXR1cm4gJHRoaXMtPmhhc1BhcnRpYWxQYWNrYWdlczsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBsb2FkUHJvdmlkZXJMaXN0aW5ncygkZGF0YSk6IHZvaWQKewppZiAoaXNzZXQoJGRhdGFbJ3Byb3ZpZGVycyddKSkgewppZiAoIWlzX2FycmF5KCR0aGlzLT5wcm92aWRlckxpc3RpbmcpKSB7CiR0aGlzLT5wcm92aWRlckxpc3RpbmcgPSBbXTsKfQokdGhpcy0+cHJvdmlkZXJMaXN0aW5nID0gYXJyYXlfbWVyZ2UoJHRoaXMtPnByb3ZpZGVyTGlzdGluZywgJGRhdGFbJ3Byb3ZpZGVycyddKTsKfQoKaWYgKCR0aGlzLT5wcm92aWRlcnNVcmwgJiYgaXNzZXQoJGRhdGFbJ3Byb3ZpZGVyLWluY2x1ZGVzJ10pKSB7CiRpbmNsdWRlcyA9ICRkYXRhWydwcm92aWRlci1pbmNsdWRlcyddOwpmb3JlYWNoICgkaW5jbHVkZXMgYXMgJGluY2x1ZGUgPT4gJG1ldGFkYXRhKSB7CiR1cmwgPSAkdGhpcy0+YmFzZVVybCAuICcvJyAuIHN0cl9yZXBsYWNlKCclaGFzaCUnLCAkbWV0YWRhdGFbJ3NoYTI1NiddLCAkaW5jbHVkZSk7CiRjYWNoZUtleSA9IHN0cl9yZXBsYWNlKFsnJWhhc2glJywnJCddLCAnJywgJGluY2x1ZGUpOwppZiAoJHRoaXMtPmNhY2hlLT5zaGEyNTYoJGNhY2hlS2V5KSA9PT0gJG1ldGFkYXRhWydzaGEyNTYnXSkgewokaW5jbHVkZWREYXRhID0ganNvbl9kZWNvZGUoJHRoaXMtPmNhY2hlLT5yZWFkKCRjYWNoZUtleSksIHRydWUpOwp9IGVsc2UgewokaW5jbHVkZWREYXRhID0gJHRoaXMtPmZldGNoRmlsZSgkdXJsLCAkY2FjaGVLZXksICRtZXRhZGF0YVsnc2hhMjU2J10pOwp9CgokdGhpcy0+bG9hZFByb3ZpZGVyTGlzdGluZ3MoJGluY2x1ZGVkRGF0YSk7Cn0KfQp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gbG9hZEluY2x1ZGVzKGFycmF5ICRkYXRhKTogYXJyYXkKewokcGFja2FnZXMgPSBbXTsKCgppZiAoIWlzc2V0KCRkYXRhWydwYWNrYWdlcyddKSAmJiAhaXNzZXQoJGRhdGFbJ2luY2x1ZGVzJ10pKSB7CmZvcmVhY2ggKCRkYXRhIGFzICRwa2cpIHsKaWYgKGlzc2V0KCRwa2dbJ3ZlcnNpb25zJ10pICYmIGlzX2FycmF5KCRwa2dbJ3ZlcnNpb25zJ10pKSB7CmZvcmVhY2ggKCRwa2dbJ3ZlcnNpb25zJ10gYXMgJG1ldGFkYXRhKSB7CiRwYWNrYWdlc1tdID0gJG1ldGFkYXRhOwp9Cn0KfQoKcmV0dXJuICRwYWNrYWdlczsKfQoKaWYgKGlzc2V0KCRkYXRhWydwYWNrYWdlcyddKSkgewpmb3JlYWNoICgkZGF0YVsncGFja2FnZXMnXSBhcyAkcGFja2FnZSA9PiAkdmVyc2lvbnMpIHsKJHBhY2thZ2VOYW1lID0gc3RydG9sb3dlcigoc3RyaW5nKSAkcGFja2FnZSk7CmZvcmVhY2ggKCR2ZXJzaW9ucyBhcyAkdmVyc2lvbiA9PiAkbWV0YWRhdGEpIHsKJHBhY2thZ2VzW10gPSAkbWV0YWRhdGE7CmlmICghJHRoaXMtPmRpc3BsYXllZFdhcm5pbmdBYm91dE5vbk1hdGNoaW5nUGFja2FnZUluZGV4ICYmICRwYWNrYWdlTmFtZSAhPT0gc3RydG9sb3dlcigoc3RyaW5nKSAoJG1ldGFkYXRhWyduYW1lJ10gPz8gJycpKSkgewokdGhpcy0+ZGlzcGxheWVkV2FybmluZ0Fib3V0Tm9uTWF0Y2hpbmdQYWNrYWdlSW5kZXggPSB0cnVlOwokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZigiPHdhcm5pbmc+V2FybmluZzogdGhlIHBhY2thZ2VzIGtleSAnJXMnIGRvZXNuJ3QgbWF0Y2ggdGhlIG5hbWUgZGVmaW5lZCBpbiB0aGUgcGFja2FnZSBtZXRhZGF0YSAnJXMnIGluIHJlcG9zaXRvcnkgJXM8L3dhcm5pbmc+IiwgJHBhY2thZ2UsICRtZXRhZGF0YVsnbmFtZSddID8/ICcnLCAkdGhpcy0+YmFzZVVybCkpOwp9Cn0KfQp9CgppZiAoaXNzZXQoJGRhdGFbJ2luY2x1ZGVzJ10pKSB7CmZvcmVhY2ggKCRkYXRhWydpbmNsdWRlcyddIGFzICRpbmNsdWRlID0+ICRtZXRhZGF0YSkgewppZiAoaXNzZXQoJG1ldGFkYXRhWydzaGExJ10pICYmICR0aGlzLT5jYWNoZS0+c2hhMSgoc3RyaW5nKSAkaW5jbHVkZSkgPT09ICRtZXRhZGF0YVsnc2hhMSddKSB7CiRpbmNsdWRlZERhdGEgPSBqc29uX2RlY29kZSgkdGhpcy0+Y2FjaGUtPnJlYWQoKHN0cmluZykgJGluY2x1ZGUpLCB0cnVlKTsKfSBlbHNlIHsKJGluY2x1ZGVkRGF0YSA9ICR0aGlzLT5mZXRjaEZpbGUoJGluY2x1ZGUpOwp9CiRwYWNrYWdlcyA9IGFycmF5X21lcmdlKCRwYWNrYWdlcywgJHRoaXMtPmxvYWRJbmNsdWRlcygkaW5jbHVkZWREYXRhKSk7Cn0KfQoKcmV0dXJuICRwYWNrYWdlczsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZVBhY2thZ2VzKGFycmF5ICRwYWNrYWdlcywgP3N0cmluZyAkc291cmNlID0gbnVsbCk6IGFycmF5CnsKaWYgKCEkcGFja2FnZXMpIHsKcmV0dXJuIFtdOwp9Cgp0cnkgewpmb3JlYWNoICgkcGFja2FnZXMgYXMgJiRkYXRhKSB7CmlmICghaXNzZXQoJGRhdGFbJ25vdGlmaWNhdGlvbi11cmwnXSkpIHsKJGRhdGFbJ25vdGlmaWNhdGlvbi11cmwnXSA9ICR0aGlzLT5ub3RpZnlVcmw7Cn0KfQoKJHBhY2thZ2VJbnN0YW5jZXMgPSAkdGhpcy0+bG9hZGVyLT5sb2FkUGFja2FnZXMoJHBhY2thZ2VzKTsKCmZvcmVhY2ggKCRwYWNrYWdlSW5zdGFuY2VzIGFzICRwYWNrYWdlKSB7CmlmIChpc3NldCgkdGhpcy0+c291cmNlTWlycm9yc1skcGFja2FnZS0+Z2V0U291cmNlVHlwZSgpXSkpIHsKJHBhY2thZ2UtPnNldFNvdXJjZU1pcnJvcnMoJHRoaXMtPnNvdXJjZU1pcnJvcnNbJHBhY2thZ2UtPmdldFNvdXJjZVR5cGUoKV0pOwp9CiRwYWNrYWdlLT5zZXREaXN0TWlycm9ycygkdGhpcy0+ZGlzdE1pcnJvcnMpOwokdGhpcy0+Y29uZmlndXJlUGFja2FnZVRyYW5zcG9ydE9wdGlvbnMoJHBhY2thZ2UpOwp9CgpyZXR1cm4gJHBhY2thZ2VJbnN0YW5jZXM7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgbG9hZCBwYWNrYWdlcyBpbiAnLiR0aGlzLT5nZXRSZXBvTmFtZSgpLigkc291cmNlID8gJyBmcm9tICcuJHNvdXJjZSA6ICcnKS4nOiBbJy5nZXRfY2xhc3MoJGUpLiddICcuJGUtPmdldE1lc3NhZ2UoKSwgMCwgJGUpOwp9Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBmZXRjaEZpbGUoc3RyaW5nICRmaWxlbmFtZSwgP3N0cmluZyAkY2FjaGVLZXkgPSBudWxsLCA/c3RyaW5nICRzaGEyNTYgPSBudWxsLCBib29sICRzdG9yZUxhc3RNb2RpZmllZFRpbWUgPSBmYWxzZSkKewppZiAoJycgPT09ICRmaWxlbmFtZSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignJGZpbGVuYW1lIHNob3VsZCBub3QgYmUgYW4gZW1wdHkgc3RyaW5nJyk7Cn0KCmlmIChudWxsID09PSAkY2FjaGVLZXkpIHsKJGNhY2hlS2V5ID0gJGZpbGVuYW1lOwokZmlsZW5hbWUgPSAkdGhpcy0+YmFzZVVybC4nLycuJGZpbGVuYW1lOwp9CgoKaWYgKCgkcG9zID0gc3RycG9zKCRmaWxlbmFtZSwgJyQnKSkgJiYgUHJlZzo6aXNNYXRjaCgne15odHRwcz86Ly99aScsICRmaWxlbmFtZSkpIHsKJGZpbGVuYW1lID0gc3Vic3RyKCRmaWxlbmFtZSwgMCwgJHBvcykgLiAnJTI0JyAuIHN1YnN0cigkZmlsZW5hbWUsICRwb3MgKyAxKTsKfQoKJHJldHJpZXMgPSAzOwp3aGlsZSAoJHJldHJpZXMtLSkgewp0cnkgewokb3B0aW9ucyA9ICR0aGlzLT5vcHRpb25zOwppZiAoJHRoaXMtPmV2ZW50RGlzcGF0Y2hlcikgewokcHJlRmlsZURvd25sb2FkRXZlbnQgPSBuZXcgUHJlRmlsZURvd25sb2FkRXZlbnQoUGx1Z2luRXZlbnRzOjpQUkVfRklMRV9ET1dOTE9BRCwgJHRoaXMtPmh0dHBEb3dubG9hZGVyLCAkZmlsZW5hbWUsICdtZXRhZGF0YScsIFsncmVwb3NpdG9yeScgPT4gJHRoaXNdKTsKJHByZUZpbGVEb3dubG9hZEV2ZW50LT5zZXRUcmFuc3BvcnRPcHRpb25zKCR0aGlzLT5vcHRpb25zKTsKJHRoaXMtPmV2ZW50RGlzcGF0Y2hlci0+ZGlzcGF0Y2goJHByZUZpbGVEb3dubG9hZEV2ZW50LT5nZXROYW1lKCksICRwcmVGaWxlRG93bmxvYWRFdmVudCk7CiRmaWxlbmFtZSA9ICRwcmVGaWxlRG93bmxvYWRFdmVudC0+Z2V0UHJvY2Vzc2VkVXJsKCk7CiRvcHRpb25zID0gJHByZUZpbGVEb3dubG9hZEV2ZW50LT5nZXRUcmFuc3BvcnRPcHRpb25zKCk7Cn0KCiRyZXNwb25zZSA9ICR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KCRmaWxlbmFtZSwgJG9wdGlvbnMpOwokanNvbiA9IChzdHJpbmcpICRyZXNwb25zZS0+Z2V0Qm9keSgpOwppZiAoJHNoYTI1NiAmJiAkc2hhMjU2ICE9PSBoYXNoKCdzaGEyNTYnLCAkanNvbikpIHsKCmlmICgkdGhpcy0+YWxsb3dTc2xEb3duZ3JhZGUpIHsKJHRoaXMtPnVybCA9IHN0cl9yZXBsYWNlKCdodHRwOi8vJywgJ2h0dHBzOi8vJywgJHRoaXMtPnVybCk7CiR0aGlzLT5iYXNlVXJsID0gc3RyX3JlcGxhY2UoJ2h0dHA6Ly8nLCAnaHR0cHM6Ly8nLCAkdGhpcy0+YmFzZVVybCk7CiRmaWxlbmFtZSA9IHN0cl9yZXBsYWNlKCdodHRwOi8vJywgJ2h0dHBzOi8vJywgJGZpbGVuYW1lKTsKfQoKaWYgKCRyZXRyaWVzID4gMCkgewp1c2xlZXAoMTAwMDAwKTsKCmNvbnRpbnVlOwp9CgoKdGhyb3cgbmV3IFJlcG9zaXRvcnlTZWN1cml0eUV4Y2VwdGlvbignVGhlIGNvbnRlbnRzIG9mICcuJGZpbGVuYW1lLicgZG8gbm90IG1hdGNoIGl0cyBzaWduYXR1cmUuIFRoaXMgY291bGQgaW5kaWNhdGUgYSBtYW4taW4tdGhlLW1pZGRsZSBhdHRhY2sgb3IgZS5nLiBhbnRpdmlydXMgc29mdHdhcmUgY29ycnVwdGluZyBmaWxlcy4gVHJ5IHJ1bm5pbmcgY29tcG9zZXIgYWdhaW4gYW5kIHJlcG9ydCB0aGlzIGlmIHlvdSB0aGluayBpdCBpcyBhIG1pc3Rha2UuJyk7Cn0KCmlmICgkdGhpcy0+ZXZlbnREaXNwYXRjaGVyKSB7CiRwb3N0RmlsZURvd25sb2FkRXZlbnQgPSBuZXcgUG9zdEZpbGVEb3dubG9hZEV2ZW50KFBsdWdpbkV2ZW50czo6UE9TVF9GSUxFX0RPV05MT0FELCBudWxsLCAkc2hhMjU2LCAkZmlsZW5hbWUsICdtZXRhZGF0YScsIFsncmVzcG9uc2UnID0+ICRyZXNwb25zZSwgJ3JlcG9zaXRvcnknID0+ICR0aGlzXSk7CiR0aGlzLT5ldmVudERpc3BhdGNoZXItPmRpc3BhdGNoKCRwb3N0RmlsZURvd25sb2FkRXZlbnQtPmdldE5hbWUoKSwgJHBvc3RGaWxlRG93bmxvYWRFdmVudCk7Cn0KCiRkYXRhID0gJHJlc3BvbnNlLT5kZWNvZGVKc29uKCk7Ckh0dHBEb3dubG9hZGVyOjpvdXRwdXRXYXJuaW5ncygkdGhpcy0+aW8sICR0aGlzLT51cmwsICRkYXRhKTsKCmlmICgkY2FjaGVLZXkgJiYgISR0aGlzLT5jYWNoZS0+aXNSZWFkT25seSgpKSB7CmlmICgkc3RvcmVMYXN0TW9kaWZpZWRUaW1lKSB7CiRsYXN0TW9kaWZpZWREYXRlID0gJHJlc3BvbnNlLT5nZXRIZWFkZXIoJ2xhc3QtbW9kaWZpZWQnKTsKaWYgKCRsYXN0TW9kaWZpZWREYXRlKSB7CiRkYXRhWydsYXN0LW1vZGlmaWVkJ10gPSAkbGFzdE1vZGlmaWVkRGF0ZTsKJGpzb24gPSBKc29uRmlsZTo6ZW5jb2RlKCRkYXRhLCAwKTsKfQp9CiR0aGlzLT5jYWNoZS0+d3JpdGUoJGNhY2hlS2V5LCAkanNvbik7Cn0KCiRyZXNwb25zZS0+Y29sbGVjdCgpOwoKYnJlYWs7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKaWYgKCRlIGluc3RhbmNlb2YgXExvZ2ljRXhjZXB0aW9uKSB7CnRocm93ICRlOwp9CgppZiAoJGUgaW5zdGFuY2VvZiBUcmFuc3BvcnRFeGNlcHRpb24gJiYgJGUtPmdldFN0YXR1c0NvZGUoKSA9PT0gNDA0KSB7CnRocm93ICRlOwp9CgppZiAoJGUgaW5zdGFuY2VvZiBSZXBvc2l0b3J5U2VjdXJpdHlFeGNlcHRpb24pIHsKdGhyb3cgJGU7Cn0KCmlmICgkY2FjaGVLZXkgJiYgKCRjb250ZW50cyA9ICR0aGlzLT5jYWNoZS0+cmVhZCgkY2FjaGVLZXkpKSkgewppZiAoISR0aGlzLT5kZWdyYWRlZE1vZGUpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz4nLiR0aGlzLT51cmwuJyBjb3VsZCBub3QgYmUgZnVsbHkgbG9hZGVkICgnLiRlLT5nZXRNZXNzYWdlKCkuJyksIHBhY2thZ2UgaW5mb3JtYXRpb24gd2FzIGxvYWRlZCBmcm9tIHRoZSBsb2NhbCBjYWNoZSBhbmQgbWF5IGJlIG91dCBvZiBkYXRlPC93YXJuaW5nPicpOwp9CiR0aGlzLT5kZWdyYWRlZE1vZGUgPSB0cnVlOwokZGF0YSA9IEpzb25GaWxlOjpwYXJzZUpzb24oJGNvbnRlbnRzLCAkdGhpcy0+Y2FjaGUtPmdldFJvb3QoKS4kY2FjaGVLZXkpOwoKYnJlYWs7Cn0KCnRocm93ICRlOwp9Cn0KCmlmICghaXNzZXQoJGRhdGEpKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oIkNvbXBvc2VyUmVwb3NpdG9yeTogVW5kZWZpbmVkIFwkZGF0YS4gUGxlYXNlIHJlcG9ydCBhdCBodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvY29tcG9zZXIvaXNzdWVzL25ldy4iKTsKfQoKcmV0dXJuICRkYXRhOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGZldGNoRmlsZUlmTGFzdE1vZGlmaWVkKHN0cmluZyAkZmlsZW5hbWUsIHN0cmluZyAkY2FjaGVLZXksIHN0cmluZyAkbGFzdE1vZGlmaWVkVGltZSkKewppZiAoJycgPT09ICRmaWxlbmFtZSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignJGZpbGVuYW1lIHNob3VsZCBub3QgYmUgYW4gZW1wdHkgc3RyaW5nJyk7Cn0KCnRyeSB7CiRvcHRpb25zID0gJHRoaXMtPm9wdGlvbnM7CmlmICgkdGhpcy0+ZXZlbnREaXNwYXRjaGVyKSB7CiRwcmVGaWxlRG93bmxvYWRFdmVudCA9IG5ldyBQcmVGaWxlRG93bmxvYWRFdmVudChQbHVnaW5FdmVudHM6OlBSRV9GSUxFX0RPV05MT0FELCAkdGhpcy0+aHR0cERvd25sb2FkZXIsICRmaWxlbmFtZSwgJ21ldGFkYXRhJywgWydyZXBvc2l0b3J5JyA9PiAkdGhpc10pOwokcHJlRmlsZURvd25sb2FkRXZlbnQtPnNldFRyYW5zcG9ydE9wdGlvbnMoJHRoaXMtPm9wdGlvbnMpOwokdGhpcy0+ZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaCgkcHJlRmlsZURvd25sb2FkRXZlbnQtPmdldE5hbWUoKSwgJHByZUZpbGVEb3dubG9hZEV2ZW50KTsKJGZpbGVuYW1lID0gJHByZUZpbGVEb3dubG9hZEV2ZW50LT5nZXRQcm9jZXNzZWRVcmwoKTsKJG9wdGlvbnMgPSAkcHJlRmlsZURvd25sb2FkRXZlbnQtPmdldFRyYW5zcG9ydE9wdGlvbnMoKTsKfQoKaWYgKGlzc2V0KCRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddKSkgewokb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSA9IChhcnJheSkgJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ107Cn0KJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ11bXSA9ICdJZi1Nb2RpZmllZC1TaW5jZTogJy4kbGFzdE1vZGlmaWVkVGltZTsKJHJlc3BvbnNlID0gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoJGZpbGVuYW1lLCAkb3B0aW9ucyk7CiRqc29uID0gKHN0cmluZykgJHJlc3BvbnNlLT5nZXRCb2R5KCk7CmlmICgkanNvbiA9PT0gJycgJiYgJHJlc3BvbnNlLT5nZXRTdGF0dXNDb2RlKCkgPT09IDMwNCkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKCR0aGlzLT5ldmVudERpc3BhdGNoZXIpIHsKJHBvc3RGaWxlRG93bmxvYWRFdmVudCA9IG5ldyBQb3N0RmlsZURvd25sb2FkRXZlbnQoUGx1Z2luRXZlbnRzOjpQT1NUX0ZJTEVfRE9XTkxPQUQsIG51bGwsIG51bGwsICRmaWxlbmFtZSwgJ21ldGFkYXRhJywgWydyZXNwb25zZScgPT4gJHJlc3BvbnNlLCAncmVwb3NpdG9yeScgPT4gJHRoaXNdKTsKJHRoaXMtPmV2ZW50RGlzcGF0Y2hlci0+ZGlzcGF0Y2goJHBvc3RGaWxlRG93bmxvYWRFdmVudC0+Z2V0TmFtZSgpLCAkcG9zdEZpbGVEb3dubG9hZEV2ZW50KTsKfQoKJGRhdGEgPSAkcmVzcG9uc2UtPmRlY29kZUpzb24oKTsKSHR0cERvd25sb2FkZXI6Om91dHB1dFdhcm5pbmdzKCR0aGlzLT5pbywgJHRoaXMtPnVybCwgJGRhdGEpOwoKJGxhc3RNb2RpZmllZERhdGUgPSAkcmVzcG9uc2UtPmdldEhlYWRlcignbGFzdC1tb2RpZmllZCcpOwokcmVzcG9uc2UtPmNvbGxlY3QoKTsKaWYgKCRsYXN0TW9kaWZpZWREYXRlKSB7CiRkYXRhWydsYXN0LW1vZGlmaWVkJ10gPSAkbGFzdE1vZGlmaWVkRGF0ZTsKJGpzb24gPSBKc29uRmlsZTo6ZW5jb2RlKCRkYXRhLCAwKTsKfQppZiAoISR0aGlzLT5jYWNoZS0+aXNSZWFkT25seSgpKSB7CiR0aGlzLT5jYWNoZS0+d3JpdGUoJGNhY2hlS2V5LCAkanNvbik7Cn0KCnJldHVybiAkZGF0YTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewppZiAoJGUgaW5zdGFuY2VvZiBcTG9naWNFeGNlcHRpb24pIHsKdGhyb3cgJGU7Cn0KCmlmICgkZSBpbnN0YW5jZW9mIFRyYW5zcG9ydEV4Y2VwdGlvbiAmJiAkZS0+Z2V0U3RhdHVzQ29kZSgpID09PSA0MDQpIHsKdGhyb3cgJGU7Cn0KCmlmICghJHRoaXMtPmRlZ3JhZGVkTW9kZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPicuJHRoaXMtPnVybC4nIGNvdWxkIG5vdCBiZSBmdWxseSBsb2FkZWQgKCcuJGUtPmdldE1lc3NhZ2UoKS4nKSwgcGFja2FnZSBpbmZvcm1hdGlvbiB3YXMgbG9hZGVkIGZyb20gdGhlIGxvY2FsIGNhY2hlIGFuZCBtYXkgYmUgb3V0IG9mIGRhdGU8L3dhcm5pbmc+Jyk7Cn0KJHRoaXMtPmRlZ3JhZGVkTW9kZSA9IHRydWU7CgpyZXR1cm4gdHJ1ZTsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFzeW5jRmV0Y2hGaWxlKHN0cmluZyAkZmlsZW5hbWUsIHN0cmluZyAkY2FjaGVLZXksID9zdHJpbmcgJGxhc3RNb2RpZmllZFRpbWUgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CmlmICgnJyA9PT0gJGZpbGVuYW1lKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCckZmlsZW5hbWUgc2hvdWxkIG5vdCBiZSBhbiBlbXB0eSBzdHJpbmcnKTsKfQoKaWYgKGlzc2V0KCR0aGlzLT5wYWNrYWdlc05vdEZvdW5kQ2FjaGVbJGZpbGVuYW1lXSkpIHsKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUoWydwYWNrYWdlcycgPT4gW11dKTsKfQoKaWYgKGlzc2V0KCR0aGlzLT5mcmVzaE1ldGFkYXRhVXJsc1skZmlsZW5hbWVdKSAmJiAkbGFzdE1vZGlmaWVkVGltZSkgewoKCiRwcm9taXNlID0gXFJlYWN0XFByb21pc2VccmVzb2x2ZSh0cnVlKTsKCnJldHVybiAkcHJvbWlzZTsKfQoKJGh0dHBEb3dubG9hZGVyID0gJHRoaXMtPmh0dHBEb3dubG9hZGVyOwokb3B0aW9ucyA9ICR0aGlzLT5vcHRpb25zOwppZiAoJHRoaXMtPmV2ZW50RGlzcGF0Y2hlcikgewokcHJlRmlsZURvd25sb2FkRXZlbnQgPSBuZXcgUHJlRmlsZURvd25sb2FkRXZlbnQoUGx1Z2luRXZlbnRzOjpQUkVfRklMRV9ET1dOTE9BRCwgJHRoaXMtPmh0dHBEb3dubG9hZGVyLCAkZmlsZW5hbWUsICdtZXRhZGF0YScsIFsncmVwb3NpdG9yeScgPT4gJHRoaXNdKTsKJHByZUZpbGVEb3dubG9hZEV2ZW50LT5zZXRUcmFuc3BvcnRPcHRpb25zKCR0aGlzLT5vcHRpb25zKTsKJHRoaXMtPmV2ZW50RGlzcGF0Y2hlci0+ZGlzcGF0Y2goJHByZUZpbGVEb3dubG9hZEV2ZW50LT5nZXROYW1lKCksICRwcmVGaWxlRG93bmxvYWRFdmVudCk7CiRmaWxlbmFtZSA9ICRwcmVGaWxlRG93bmxvYWRFdmVudC0+Z2V0UHJvY2Vzc2VkVXJsKCk7CiRvcHRpb25zID0gJHByZUZpbGVEb3dubG9hZEV2ZW50LT5nZXRUcmFuc3BvcnRPcHRpb25zKCk7Cn0KCmlmICgkbGFzdE1vZGlmaWVkVGltZSkgewppZiAoaXNzZXQoJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pKSB7CiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddID0gKGFycmF5KSAkb3B0aW9uc1snaHR0cCddWydoZWFkZXInXTsKfQokb3B0aW9uc1snaHR0cCddWydoZWFkZXInXVtdID0gJ0lmLU1vZGlmaWVkLVNpbmNlOiAnLiRsYXN0TW9kaWZpZWRUaW1lOwp9CgokaW8gPSAkdGhpcy0+aW87CiR1cmwgPSAkdGhpcy0+dXJsOwokY2FjaGUgPSAkdGhpcy0+Y2FjaGU7CiRkZWdyYWRlZE1vZGUgPSAmJHRoaXMtPmRlZ3JhZGVkTW9kZTsKJGV2ZW50RGlzcGF0Y2hlciA9ICR0aGlzLT5ldmVudERpc3BhdGNoZXI7CgoKCgokYWNjZXB0ID0gZnVuY3Rpb24gKCRyZXNwb25zZSkgdXNlICgkaW8sICR1cmwsICRmaWxlbmFtZSwgJGNhY2hlLCAkY2FjaGVLZXksICRldmVudERpc3BhdGNoZXIpIHsKCmlmICgkcmVzcG9uc2UtPmdldFN0YXR1c0NvZGUoKSA9PT0gNDA0KSB7CiR0aGlzLT5wYWNrYWdlc05vdEZvdW5kQ2FjaGVbJGZpbGVuYW1lXSA9IHRydWU7CgpyZXR1cm4gWydwYWNrYWdlcycgPT4gW11dOwp9CgokanNvbiA9IChzdHJpbmcpICRyZXNwb25zZS0+Z2V0Qm9keSgpOwppZiAoJGpzb24gPT09ICcnICYmICRyZXNwb25zZS0+Z2V0U3RhdHVzQ29kZSgpID09PSAzMDQpIHsKJHRoaXMtPmZyZXNoTWV0YWRhdGFVcmxzWyRmaWxlbmFtZV0gPSB0cnVlOwoKcmV0dXJuIHRydWU7Cn0KCmlmICgkZXZlbnREaXNwYXRjaGVyKSB7CiRwb3N0RmlsZURvd25sb2FkRXZlbnQgPSBuZXcgUG9zdEZpbGVEb3dubG9hZEV2ZW50KFBsdWdpbkV2ZW50czo6UE9TVF9GSUxFX0RPV05MT0FELCBudWxsLCBudWxsLCAkZmlsZW5hbWUsICdtZXRhZGF0YScsIFsncmVzcG9uc2UnID0+ICRyZXNwb25zZSwgJ3JlcG9zaXRvcnknID0+ICR0aGlzXSk7CiRldmVudERpc3BhdGNoZXItPmRpc3BhdGNoKCRwb3N0RmlsZURvd25sb2FkRXZlbnQtPmdldE5hbWUoKSwgJHBvc3RGaWxlRG93bmxvYWRFdmVudCk7Cn0KCiRkYXRhID0gJHJlc3BvbnNlLT5kZWNvZGVKc29uKCk7Ckh0dHBEb3dubG9hZGVyOjpvdXRwdXRXYXJuaW5ncygkaW8sICR1cmwsICRkYXRhKTsKCiRsYXN0TW9kaWZpZWREYXRlID0gJHJlc3BvbnNlLT5nZXRIZWFkZXIoJ2xhc3QtbW9kaWZpZWQnKTsKJHJlc3BvbnNlLT5jb2xsZWN0KCk7CmlmICgkbGFzdE1vZGlmaWVkRGF0ZSkgewokZGF0YVsnbGFzdC1tb2RpZmllZCddID0gJGxhc3RNb2RpZmllZERhdGU7CiRqc29uID0gSnNvbkZpbGU6OmVuY29kZSgkZGF0YSwgSlNPTl9VTkVTQ0FQRURfU0xBU0hFUyB8IEpTT05fVU5FU0NBUEVEX1VOSUNPREUpOwp9CmlmICghJGNhY2hlLT5pc1JlYWRPbmx5KCkpIHsKJGNhY2hlLT53cml0ZSgkY2FjaGVLZXksICRqc29uKTsKfQokdGhpcy0+ZnJlc2hNZXRhZGF0YVVybHNbJGZpbGVuYW1lXSA9IHRydWU7CgpyZXR1cm4gJGRhdGE7Cn07CgokcmVqZWN0ID0gZnVuY3Rpb24gKCRlKSB1c2UgKCRmaWxlbmFtZSwgJGFjY2VwdCwgJGlvLCAkdXJsLCAmJGRlZ3JhZGVkTW9kZSwgJGxhc3RNb2RpZmllZFRpbWUpIHsKaWYgKCRlIGluc3RhbmNlb2YgVHJhbnNwb3J0RXhjZXB0aW9uICYmICRlLT5nZXRTdGF0dXNDb2RlKCkgPT09IDQwNCkgewokdGhpcy0+cGFja2FnZXNOb3RGb3VuZENhY2hlWyRmaWxlbmFtZV0gPSB0cnVlOwoKcmV0dXJuIGZhbHNlOwp9CgppZiAoISRkZWdyYWRlZE1vZGUpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz4nLiR1cmwuJyBjb3VsZCBub3QgYmUgZnVsbHkgbG9hZGVkICgnLiRlLT5nZXRNZXNzYWdlKCkuJyksIHBhY2thZ2UgaW5mb3JtYXRpb24gd2FzIGxvYWRlZCBmcm9tIHRoZSBsb2NhbCBjYWNoZSBhbmQgbWF5IGJlIG91dCBvZiBkYXRlPC93YXJuaW5nPicpOwp9CiRkZWdyYWRlZE1vZGUgPSB0cnVlOwoKCmlmICgkbGFzdE1vZGlmaWVkVGltZSkgewpyZXR1cm4gJGFjY2VwdChuZXcgUmVzcG9uc2UoWyd1cmwnID0+ICR1cmxdLCAzMDQsIFtdLCAnJykpOwp9CgoKaWYgKCRlIGluc3RhbmNlb2YgVHJhbnNwb3J0RXhjZXB0aW9uICYmICRlLT5nZXRTdGF0dXNDb2RlKCkgPT09IDQ5OSkgewpyZXR1cm4gJGFjY2VwdChuZXcgUmVzcG9uc2UoWyd1cmwnID0+ICR1cmxdLCA0MDQsIFtdLCAnJykpOwp9Cgp0aHJvdyAkZTsKfTsKCnJldHVybiAkaHR0cERvd25sb2FkZXItPmFkZCgkZmlsZW5hbWUsICRvcHRpb25zKS0+dGhlbigkYWNjZXB0LCAkcmVqZWN0KTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGluaXRpYWxpemVQYXJ0aWFsUGFja2FnZXMoKTogdm9pZAp7CiRyb290RGF0YSA9ICR0aGlzLT5sb2FkUm9vdFNlcnZlckZpbGUoKTsKaWYgKCRyb290RGF0YSA9PT0gdHJ1ZSkgewpyZXR1cm47Cn0KCiR0aGlzLT5wYXJ0aWFsUGFja2FnZXNCeU5hbWUgPSBbXTsKZm9yZWFjaCAoJHJvb3REYXRhWydwYWNrYWdlcyddIGFzICRwYWNrYWdlID0+ICR2ZXJzaW9ucykgewpmb3JlYWNoICgkdmVyc2lvbnMgYXMgJHZlcnNpb24pIHsKJHZlcnNpb25QYWNrYWdlTmFtZSA9IHN0cnRvbG93ZXIoKHN0cmluZykgKCR2ZXJzaW9uWyduYW1lJ10gPz8gJycpKTsKJHRoaXMtPnBhcnRpYWxQYWNrYWdlc0J5TmFtZVskdmVyc2lvblBhY2thZ2VOYW1lXVtdID0gJHZlcnNpb247CmlmICghJHRoaXMtPmRpc3BsYXllZFdhcm5pbmdBYm91dE5vbk1hdGNoaW5nUGFja2FnZUluZGV4ICYmICR2ZXJzaW9uUGFja2FnZU5hbWUgIT09IHN0cnRvbG93ZXIoJHBhY2thZ2UpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCI8d2FybmluZz5XYXJuaW5nOiB0aGUgcGFja2FnZXMga2V5ICclcycgZG9lc24ndCBtYXRjaCB0aGUgbmFtZSBkZWZpbmVkIGluIHRoZSBwYWNrYWdlIG1ldGFkYXRhICclcycgaW4gcmVwb3NpdG9yeSAlczwvd2FybmluZz4iLCAkcGFja2FnZSwgJHZlcnNpb25bJ25hbWUnXSA/PyAnJywgJHRoaXMtPmJhc2VVcmwpKTsKJHRoaXMtPmRpc3BsYXllZFdhcm5pbmdBYm91dE5vbk1hdGNoaW5nUGFja2FnZUluZGV4ID0gdHJ1ZTsKfQp9Cn0KCgokdGhpcy0+cm9vdERhdGEgPSB0cnVlOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBsYXp5UHJvdmlkZXJzUmVwb0NvbnRhaW5zKHN0cmluZyAkbmFtZSkKewppZiAoISR0aGlzLT5oYXNBdmFpbGFibGVQYWNrYWdlTGlzdCkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdsYXp5UHJvdmlkZXJzUmVwb0NvbnRhaW5zIHNob3VsZCBub3QgYmUgY2FsbGVkIHVubGVzcyBoYXNBdmFpbGFibGVQYWNrYWdlTGlzdCBpcyB0cnVlJyk7Cn0KCmlmIChpc19hcnJheSgkdGhpcy0+YXZhaWxhYmxlUGFja2FnZXMpICYmIGlzc2V0KCR0aGlzLT5hdmFpbGFibGVQYWNrYWdlc1skbmFtZV0pKSB7CnJldHVybiB0cnVlOwp9CgppZiAoaXNfYXJyYXkoJHRoaXMtPmF2YWlsYWJsZVBhY2thZ2VQYXR0ZXJucykpIHsKZm9yZWFjaCAoJHRoaXMtPmF2YWlsYWJsZVBhY2thZ2VQYXR0ZXJucyBhcyAkcHJvdmlkZXJSZWdleCkgewppZiAoUHJlZzo6aXNNYXRjaCgkcHJvdmlkZXJSZWdleCwgJG5hbWUpKSB7CnJldHVybiB0cnVlOwp9Cn0KfQoKcmV0dXJuIGZhbHNlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKCgoKCgoKY2xhc3MgQ29tcG9zaXRlUmVwb3NpdG9yeSBpbXBsZW1lbnRzIFJlcG9zaXRvcnlJbnRlcmZhY2UKewoKCgoKcHJpdmF0ZSAkcmVwb3NpdG9yaWVzOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkcmVwb3NpdG9yaWVzKQp7CiR0aGlzLT5yZXBvc2l0b3JpZXMgPSBbXTsKZm9yZWFjaCAoJHJlcG9zaXRvcmllcyBhcyAkcmVwbykgewokdGhpcy0+YWRkUmVwb3NpdG9yeSgkcmVwbyk7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9OYW1lKCk6IHN0cmluZwp7CnJldHVybiAnY29tcG9zaXRlIHJlcG8gKCcuaW1wbG9kZSgnLCAnLCBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkcmVwbyk6IHN0cmluZyB7CnJldHVybiAkcmVwby0+Z2V0UmVwb05hbWUoKTsKfSwgJHRoaXMtPnJlcG9zaXRvcmllcykpLicpJzsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb3NpdG9yaWVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yZXBvc2l0b3JpZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBib29sCnsKZm9yZWFjaCAoJHRoaXMtPnJlcG9zaXRvcmllcyBhcyAkcmVwb3NpdG9yeSkgewoKaWYgKCRyZXBvc2l0b3J5LT5oYXNQYWNrYWdlKCRwYWNrYWdlKSkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kUGFja2FnZSgkbmFtZSwgJGNvbnN0cmFpbnQpOiA/QmFzZVBhY2thZ2UKewpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yaWVzIGFzICRyZXBvc2l0b3J5KSB7CgokcGFja2FnZSA9ICRyZXBvc2l0b3J5LT5maW5kUGFja2FnZSgkbmFtZSwgJGNvbnN0cmFpbnQpOwppZiAobnVsbCAhPT0gJHBhY2thZ2UpIHsKcmV0dXJuICRwYWNrYWdlOwp9Cn0KCnJldHVybiBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZFBhY2thZ2VzKCRuYW1lLCAkY29uc3RyYWludCA9IG51bGwpOiBhcnJheQp7CiRwYWNrYWdlcyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yaWVzIGFzICRyZXBvc2l0b3J5KSB7CgokcGFja2FnZXNbXSA9ICRyZXBvc2l0b3J5LT5maW5kUGFja2FnZXMoJG5hbWUsICRjb25zdHJhaW50KTsKfQoKcmV0dXJuICRwYWNrYWdlcyA/IGFycmF5X21lcmdlKC4uLiRwYWNrYWdlcykgOiBbXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGxvYWRQYWNrYWdlcyhhcnJheSAkcGFja2FnZU5hbWVNYXAsIGFycmF5ICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMsIGFycmF5ICRzdGFiaWxpdHlGbGFncywgYXJyYXkgJGFscmVhZHlMb2FkZWQgPSBbXSk6IGFycmF5CnsKJHBhY2thZ2VzID0gW107CiRuYW1lc0ZvdW5kID0gW107CmZvcmVhY2ggKCR0aGlzLT5yZXBvc2l0b3JpZXMgYXMgJHJlcG9zaXRvcnkpIHsKCiRyZXN1bHQgPSAkcmVwb3NpdG9yeS0+bG9hZFBhY2thZ2VzKCRwYWNrYWdlTmFtZU1hcCwgJGFjY2VwdGFibGVTdGFiaWxpdGllcywgJHN0YWJpbGl0eUZsYWdzLCAkYWxyZWFkeUxvYWRlZCk7CiRwYWNrYWdlc1tdID0gJHJlc3VsdFsncGFja2FnZXMnXTsKJG5hbWVzRm91bmRbXSA9ICRyZXN1bHRbJ25hbWVzRm91bmQnXTsKfQoKcmV0dXJuIFsKJ3BhY2thZ2VzJyA9PiAkcGFja2FnZXMgPyBhcnJheV9tZXJnZSguLi4kcGFja2FnZXMpIDogW10sCiduYW1lc0ZvdW5kJyA9PiAkbmFtZXNGb3VuZCA/IGFycmF5X3VuaXF1ZShhcnJheV9tZXJnZSguLi4kbmFtZXNGb3VuZCkpIDogW10sCl07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZWFyY2goc3RyaW5nICRxdWVyeSwgaW50ICRtb2RlID0gMCwgP3N0cmluZyAkdHlwZSA9IG51bGwpOiBhcnJheQp7CiRtYXRjaGVzID0gW107CmZvcmVhY2ggKCR0aGlzLT5yZXBvc2l0b3JpZXMgYXMgJHJlcG9zaXRvcnkpIHsKCiRtYXRjaGVzW10gPSAkcmVwb3NpdG9yeS0+c2VhcmNoKCRxdWVyeSwgJG1vZGUsICR0eXBlKTsKfQoKcmV0dXJuIFxjb3VudCgkbWF0Y2hlcykgPiAwID8gYXJyYXlfbWVyZ2UoLi4uJG1hdGNoZXMpIDogW107Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWNrYWdlcygpOiBhcnJheQp7CiRwYWNrYWdlcyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yaWVzIGFzICRyZXBvc2l0b3J5KSB7CgokcGFja2FnZXNbXSA9ICRyZXBvc2l0b3J5LT5nZXRQYWNrYWdlcygpOwp9CgpyZXR1cm4gJHBhY2thZ2VzID8gYXJyYXlfbWVyZ2UoLi4uJHBhY2thZ2VzKSA6IFtdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdmlkZXJzKCRwYWNrYWdlTmFtZSk6IGFycmF5CnsKJHJlc3VsdHMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPnJlcG9zaXRvcmllcyBhcyAkcmVwb3NpdG9yeSkgewoKJHJlc3VsdHNbXSA9ICRyZXBvc2l0b3J5LT5nZXRQcm92aWRlcnMoJHBhY2thZ2VOYW1lKTsKfQoKcmV0dXJuICRyZXN1bHRzID8gYXJyYXlfbWVyZ2UoLi4uJHJlc3VsdHMpIDogW107Cn0KCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiB2b2lkCnsKZm9yZWFjaCAoJHRoaXMtPnJlcG9zaXRvcmllcyBhcyAkcmVwb3NpdG9yeSkgewppZiAoJHJlcG9zaXRvcnkgaW5zdGFuY2VvZiBXcml0YWJsZVJlcG9zaXRvcnlJbnRlcmZhY2UpIHsKJHJlcG9zaXRvcnktPnJlbW92ZVBhY2thZ2UoJHBhY2thZ2UpOwp9Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNvdW50KCk6IGludAp7CiR0b3RhbCA9IDA7CmZvcmVhY2ggKCR0aGlzLT5yZXBvc2l0b3JpZXMgYXMgJHJlcG9zaXRvcnkpIHsKCiR0b3RhbCArPSAkcmVwb3NpdG9yeS0+Y291bnQoKTsKfQoKcmV0dXJuICR0b3RhbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFJlcG9zaXRvcnkoUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwb3NpdG9yeSk6IHZvaWQKewppZiAoJHJlcG9zaXRvcnkgaW5zdGFuY2VvZiBzZWxmKSB7CmZvcmVhY2ggKCRyZXBvc2l0b3J5LT5nZXRSZXBvc2l0b3JpZXMoKSBhcyAkcmVwbykgewokdGhpcy0+YWRkUmVwb3NpdG9yeSgkcmVwbyk7Cn0KfSBlbHNlIHsKJHRoaXMtPnJlcG9zaXRvcmllc1tdID0gJHJlcG9zaXRvcnk7Cn0KfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKCgoKCgppbnRlcmZhY2UgQ29uZmlndXJhYmxlUmVwb3NpdG9yeUludGVyZmFjZQp7CgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvQ29uZmlnKCk7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7Cgp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXEFycmF5TG9hZGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290QWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxEdW1wZXJcQXJyYXlEdW1wZXI7CnVzZSBDb21wb3NlclxJbnN0YWxsZXJcSW5zdGFsbGF0aW9uTWFuYWdlcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CgoKCgoKCgpjbGFzcyBGaWxlc3lzdGVtUmVwb3NpdG9yeSBleHRlbmRzIFdyaXRhYmxlQXJyYXlSZXBvc2l0b3J5CnsKCnByb3RlY3RlZCAkZmlsZTsKCnByaXZhdGUgJGR1bXBWZXJzaW9uczsKCnByaXZhdGUgJHJvb3RQYWNrYWdlOwoKcHJpdmF0ZSAkZmlsZXN5c3RlbTsKCnByaXZhdGUgJGRldk1vZGUgPSBudWxsOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KEpzb25GaWxlICRyZXBvc2l0b3J5RmlsZSwgYm9vbCAkZHVtcFZlcnNpb25zID0gZmFsc2UsID9Sb290UGFja2FnZUludGVyZmFjZSAkcm9vdFBhY2thZ2UgPSBudWxsLCA/RmlsZXN5c3RlbSAkZmlsZXN5c3RlbSA9IG51bGwpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgpOwokdGhpcy0+ZmlsZSA9ICRyZXBvc2l0b3J5RmlsZTsKJHRoaXMtPmR1bXBWZXJzaW9ucyA9ICRkdW1wVmVyc2lvbnM7CiR0aGlzLT5yb290UGFja2FnZSA9ICRyb290UGFja2FnZTsKJHRoaXMtPmZpbGVzeXN0ZW0gPSAkZmlsZXN5c3RlbSA/OiBuZXcgRmlsZXN5c3RlbTsKaWYgKCRkdW1wVmVyc2lvbnMgJiYgISRyb290UGFja2FnZSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignRXhwZWN0ZWQgYSByb290IHBhY2thZ2UgaW5zdGFuY2UgaWYgJGR1bXBWZXJzaW9ucyBpcyB0cnVlJyk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERldk1vZGUoKQp7CnJldHVybiAkdGhpcy0+ZGV2TW9kZTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluaXRpYWxpemUoKQp7CnBhcmVudDo6aW5pdGlhbGl6ZSgpOwoKaWYgKCEkdGhpcy0+ZmlsZS0+ZXhpc3RzKCkpIHsKcmV0dXJuOwp9Cgp0cnkgewokZGF0YSA9ICR0aGlzLT5maWxlLT5yZWFkKCk7CmlmIChpc3NldCgkZGF0YVsncGFja2FnZXMnXSkpIHsKJHBhY2thZ2VzID0gJGRhdGFbJ3BhY2thZ2VzJ107Cn0gZWxzZSB7CiRwYWNrYWdlcyA9ICRkYXRhOwp9CgppZiAoaXNzZXQoJGRhdGFbJ2Rldi1wYWNrYWdlLW5hbWVzJ10pKSB7CiR0aGlzLT5zZXREZXZQYWNrYWdlTmFtZXMoJGRhdGFbJ2Rldi1wYWNrYWdlLW5hbWVzJ10pOwp9CmlmIChpc3NldCgkZGF0YVsnZGV2J10pKSB7CiR0aGlzLT5kZXZNb2RlID0gJGRhdGFbJ2RldiddOwp9CgppZiAoIWlzX2FycmF5KCRwYWNrYWdlcykpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBwYXJzZSBwYWNrYWdlIGxpc3QgZnJvbSB0aGUgcmVwb3NpdG9yeScpOwp9Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKdGhyb3cgbmV3IEludmFsaWRSZXBvc2l0b3J5RXhjZXB0aW9uKCdJbnZhbGlkIHJlcG9zaXRvcnkgZGF0YSBpbiAnLiR0aGlzLT5maWxlLT5nZXRQYXRoKCkuJywgcGFja2FnZXMgY291bGQgbm90IGJlIGxvYWRlZDogWycuZ2V0X2NsYXNzKCRlKS4nXSAnLiRlLT5nZXRNZXNzYWdlKCkpOwp9CgokbG9hZGVyID0gbmV3IEFycmF5TG9hZGVyKG51bGwsIHRydWUpOwpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2VEYXRhKSB7CiRwYWNrYWdlID0gJGxvYWRlci0+bG9hZCgkcGFja2FnZURhdGEpOwokdGhpcy0+YWRkUGFja2FnZSgkcGFja2FnZSk7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIHJlbG9hZCgpCnsKJHRoaXMtPnBhY2thZ2VzID0gbnVsbDsKJHRoaXMtPmluaXRpYWxpemUoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlKGJvb2wgJGRldk1vZGUsIEluc3RhbGxhdGlvbk1hbmFnZXIgJGluc3RhbGxhdGlvbk1hbmFnZXIpCnsKJGRhdGEgPSBbJ3BhY2thZ2VzJyA9PiBbXSwgJ2RldicgPT4gJGRldk1vZGUsICdkZXYtcGFja2FnZS1uYW1lcycgPT4gW11dOwokZHVtcGVyID0gbmV3IEFycmF5RHVtcGVyKCk7CgoKCgokcmVwb0RpciA9IGRpcm5hbWUoJHRoaXMtPmZpbGUtPmdldFBhdGgoKSk7CiR0aGlzLT5maWxlc3lzdGVtLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoJHJlcG9EaXIpOwoKJHJlcG9EaXIgPSAkdGhpcy0+ZmlsZXN5c3RlbS0+bm9ybWFsaXplUGF0aChyZWFscGF0aCgkcmVwb0RpcikpOwokaW5zdGFsbFBhdGhzID0gW107Cgpmb3JlYWNoICgkdGhpcy0+Z2V0Q2Fub25pY2FsUGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewokcGtnQXJyYXkgPSAkZHVtcGVyLT5kdW1wKCRwYWNrYWdlKTsKJHBhdGggPSAkaW5zdGFsbGF0aW9uTWFuYWdlci0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwokaW5zdGFsbFBhdGggPSBudWxsOwppZiAoJycgIT09ICRwYXRoICYmIG51bGwgIT09ICRwYXRoKSB7CiRub3JtYWxpemVkUGF0aCA9ICR0aGlzLT5maWxlc3lzdGVtLT5ub3JtYWxpemVQYXRoKCR0aGlzLT5maWxlc3lzdGVtLT5pc0Fic29sdXRlUGF0aCgkcGF0aCkgPyAkcGF0aCA6IFBsYXRmb3JtOjpnZXRDd2QoKSAuICcvJyAuICRwYXRoKTsKJGluc3RhbGxQYXRoID0gJHRoaXMtPmZpbGVzeXN0ZW0tPmZpbmRTaG9ydGVzdFBhdGgoJHJlcG9EaXIsICRub3JtYWxpemVkUGF0aCwgdHJ1ZSk7Cn0KJGluc3RhbGxQYXRoc1skcGFja2FnZS0+Z2V0TmFtZSgpXSA9ICRpbnN0YWxsUGF0aDsKCiRwa2dBcnJheVsnaW5zdGFsbC1wYXRoJ10gPSAkaW5zdGFsbFBhdGg7CiRkYXRhWydwYWNrYWdlcyddW10gPSAkcGtnQXJyYXk7CgoKCmlmIChpbl9hcnJheSgkcGFja2FnZS0+Z2V0TmFtZSgpLCAkdGhpcy0+ZGV2UGFja2FnZU5hbWVzLCB0cnVlKSkgewokZGF0YVsnZGV2LXBhY2thZ2UtbmFtZXMnXVtdID0gJHBhY2thZ2UtPmdldE5hbWUoKTsKfQp9Cgpzb3J0KCRkYXRhWydkZXYtcGFja2FnZS1uYW1lcyddKTsKdXNvcnQoJGRhdGFbJ3BhY2thZ2VzJ10sIHN0YXRpYyBmdW5jdGlvbiAoJGEsICRiKTogaW50IHsKcmV0dXJuIHN0cmNtcCgkYVsnbmFtZSddLCAkYlsnbmFtZSddKTsKfSk7CgokdGhpcy0+ZmlsZS0+d3JpdGUoJGRhdGEpOwoKaWYgKCR0aGlzLT5kdW1wVmVyc2lvbnMpIHsKJHZlcnNpb25zID0gJHRoaXMtPmdlbmVyYXRlSW5zdGFsbGVkVmVyc2lvbnMoJGluc3RhbGxhdGlvbk1hbmFnZXIsICRpbnN0YWxsUGF0aHMsICRkZXZNb2RlLCAkcmVwb0Rpcik7CgokdGhpcy0+ZmlsZXN5c3RlbS0+ZmlsZVB1dENvbnRlbnRzSWZNb2RpZmllZCgkcmVwb0Rpci4nL2luc3RhbGxlZC5waHAnLCAnPD9waHAgcmV0dXJuICcgLiAkdGhpcy0+ZHVtcFRvUGhwQ29kZSgkdmVyc2lvbnMpIC4gJzsnLiJcbiIpOwokaW5zdGFsbGVkVmVyc2lvbnNDbGFzcyA9IGZpbGVfZ2V0X2NvbnRlbnRzKF9fRElSX18uJy8uLi9JbnN0YWxsZWRWZXJzaW9ucy5waHAnKTsKCgppZiAoJGluc3RhbGxlZFZlcnNpb25zQ2xhc3MgIT09IGZhbHNlKSB7CiR0aGlzLT5maWxlc3lzdGVtLT5maWxlUHV0Q29udGVudHNJZk1vZGlmaWVkKCRyZXBvRGlyLicvSW5zdGFsbGVkVmVyc2lvbnMucGhwJywgJGluc3RhbGxlZFZlcnNpb25zQ2xhc3MpOwoKClxDb21wb3NlclxJbnN0YWxsZWRWZXJzaW9uczo6cmVsb2FkKCR2ZXJzaW9ucyk7CgoKCgp0cnkgewokcmVmbFByb3AgPSBuZXcgXFJlZmxlY3Rpb25Qcm9wZXJ0eShcQ29tcG9zZXJcSW5zdGFsbGVkVmVyc2lvbnM6OmNsYXNzLCAnc2VsZkRpcicpOwooXFBIUF9WRVJTSU9OX0lEIDwgODAxMDApIGFuZCAkcmVmbFByb3AtPnNldEFjY2Vzc2libGUodHJ1ZSk7CiRyZWZsUHJvcC0+c2V0VmFsdWUobnVsbCwgc3RydHIoJHJlcG9EaXIsICdcXCcsICcvJykpOwoKJHJlZmxQcm9wID0gbmV3IFxSZWZsZWN0aW9uUHJvcGVydHkoXENvbXBvc2VyXEluc3RhbGxlZFZlcnNpb25zOjpjbGFzcywgJ2luc3RhbGxlZElzTG9jYWxEaXInKTsKKFxQSFBfVkVSU0lPTl9JRCA8IDgwMTAwKSBhbmQgJHJlZmxQcm9wLT5zZXRBY2Nlc3NpYmxlKHRydWUpOwokcmVmbFByb3AtPnNldFZhbHVlKG51bGwsIHRydWUpOwp9IGNhdGNoIChcUmVmbGVjdGlvbkV4Y2VwdGlvbiAkZSkgewppZiAoIVByZWc6OmlzTWF0Y2goJ3tQcm9wZXJ0eSAuKj8gZG9lcyBub3QgZXhpc3R9aScsICRlLT5nZXRNZXNzYWdlKCkpKSB7CnRocm93ICRlOwp9Cgp9Cn0KfQp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2FmZWx5TG9hZEluc3RhbGxlZFZlcnNpb25zKHN0cmluZyAkcGF0aCk6IGJvb2wKewokaW5zdGFsbGVkVmVyc2lvbnNEYXRhID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRwYXRoKTsKJHBhdHRlcm4gPSA8PDwnUkVHRVgnCnsoPyhERUZJTkUpCiAgICg/PG51bWJlcj4gIC0/IFxzKisgXGQrKyAoPzpcLlxkKyspPyApCiAgICg/PGJvb2xlYW4+IHRydWUgfCBmYWxzZSB8IG51bGwgKQogICAoPzxzdHJpbmdzPiAoPyZzdHJpbmcpICg/OiBccyorIFwuIFxzKisgKD8mc3RyaW5nKSkqKyApCiAgICg/PHN0cmluZz4gICg/OiAiICg/OlteIlxcJF0qKyB8IFxcIFsiXFwwXSApKiAiIHwgJyAoPzpbXidcXF0qKyB8IFxcIFsnXFxdICkqICcgKSApCiAgICg/PGFycmF5PiAgIGFycmF5XCggXHMqKyAoPzogKD86KD8mbnVtYmVyKXwoPyZzdHJpbmdzKSkgXHMqKyA9PiBccyorICg/OiAoPzpfX0RJUl9fIFxzKisgXC4gXHMqKyk/ICg/JnN0cmluZ3MpIHwgKD8mdmFsdWUpICkgXHMqKywgXHMqKyApKisgIFxzKisgXCkgKQogICAoPzx2YWx1ZT4gICAoPzogKD8mbnVtYmVyKSB8ICg/JmJvb2xlYW4pIHwgKD8mc3RyaW5ncykgfCAoPyZhcnJheSkgKSApCikKXjxcP3BocFxzKytyZXR1cm5ccysrKD8mYXJyYXkpXHMqKzskfWl4ClJFR0VYOwppZiAoaXNfc3RyaW5nKCRpbnN0YWxsZWRWZXJzaW9uc0RhdGEpICYmIFByZWc6OmlzTWF0Y2goJHBhdHRlcm4sIHRyaW0oJGluc3RhbGxlZFZlcnNpb25zRGF0YSkpKSB7ClxDb21wb3NlclxJbnN0YWxsZWRWZXJzaW9uczo6cmVsb2FkKGV2YWwoJz8+Jy5QcmVnOjpyZXBsYWNlKCd7PT5ccyorX19ESVJfX1xzKitcLlxzKisoW1wnIl0pfScsICc9PiAnLnZhcl9leHBvcnQoZGlybmFtZSgkcGF0aCksIHRydWUpLicgLiAkMScsICRpbnN0YWxsZWRWZXJzaW9uc0RhdGEpKSk7CgpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGR1bXBUb1BocENvZGUoYXJyYXkgJGFycmF5ID0gW10sIGludCAkbGV2ZWwgPSAwKTogc3RyaW5nCnsKJGxpbmVzID0gImFycmF5KFxuIjsKJGxldmVsKys7Cgpmb3JlYWNoICgkYXJyYXkgYXMgJGtleSA9PiAkdmFsdWUpIHsKJGxpbmVzIC49IHN0cl9yZXBlYXQoJyAgICAnLCAkbGV2ZWwpOwokbGluZXMgLj0gaXNfaW50KCRrZXkpID8gJGtleSAuICcgPT4gJyA6IHZhcl9leHBvcnQoJGtleSwgdHJ1ZSkgLiAnID0+ICc7CgppZiAoaXNfYXJyYXkoJHZhbHVlKSkgewppZiAoIWVtcHR5KCR2YWx1ZSkpIHsKJGxpbmVzIC49ICR0aGlzLT5kdW1wVG9QaHBDb2RlKCR2YWx1ZSwgJGxldmVsKTsKfSBlbHNlIHsKJGxpbmVzIC49ICJhcnJheSgpLFxuIjsKfQp9IGVsc2VpZiAoJGtleSA9PT0gJ2luc3RhbGxfcGF0aCcgJiYgaXNfc3RyaW5nKCR2YWx1ZSkpIHsKaWYgKCR0aGlzLT5maWxlc3lzdGVtLT5pc0Fic29sdXRlUGF0aCgkdmFsdWUpKSB7CiRsaW5lcyAuPSB2YXJfZXhwb3J0KCR2YWx1ZSwgdHJ1ZSkgLiAiLFxuIjsKfSBlbHNlIHsKJGxpbmVzIC49ICJfX0RJUl9fIC4gIiAuIHZhcl9leHBvcnQoJy8nIC4gJHZhbHVlLCB0cnVlKSAuICIsXG4iOwp9Cn0gZWxzZWlmIChpc19zdHJpbmcoJHZhbHVlKSkgewokbGluZXMgLj0gdmFyX2V4cG9ydCgkdmFsdWUsIHRydWUpIC4gIixcbiI7Cn0gZWxzZWlmIChpc19ib29sKCR2YWx1ZSkpIHsKJGxpbmVzIC49ICgkdmFsdWUgPyAndHJ1ZScgOiAnZmFsc2UnKSAuICIsXG4iOwp9IGVsc2VpZiAoaXNfbnVsbCgkdmFsdWUpKSB7CiRsaW5lcyAuPSAibnVsbCxcbiI7Cn0gZWxzZSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdVbmV4cGVjdGVkIHR5cGUgJy5nZXRfZGVidWdfdHlwZSgkdmFsdWUpKTsKfQp9CgokbGluZXMgLj0gc3RyX3JlcGVhdCgnICAgICcsICRsZXZlbCAtIDEpIC4gJyknIC4gKCRsZXZlbCAtIDEgPT09IDAgPyAnJyA6ICIsXG4iKTsKCnJldHVybiAkbGluZXM7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZW5lcmF0ZUluc3RhbGxlZFZlcnNpb25zKEluc3RhbGxhdGlvbk1hbmFnZXIgJGluc3RhbGxhdGlvbk1hbmFnZXIsIGFycmF5ICRpbnN0YWxsUGF0aHMsIGJvb2wgJGRldk1vZGUsIHN0cmluZyAkcmVwb0Rpcik6IGFycmF5CnsKJGRldlBhY2thZ2VzID0gYXJyYXlfZmxpcCgkdGhpcy0+ZGV2UGFja2FnZU5hbWVzKTsKJHBhY2thZ2VzID0gJHRoaXMtPmdldFBhY2thZ2VzKCk7CmlmIChudWxsID09PSAkdGhpcy0+cm9vdFBhY2thZ2UpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignSXQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSB0byBkdW1wIHBhY2thZ2VzIGlmIG5vIHJvb3QgcGFja2FnZSBpcyBnaXZlbicpOwp9CiRwYWNrYWdlc1tdID0gJHJvb3RQYWNrYWdlID0gJHRoaXMtPnJvb3RQYWNrYWdlOwoKd2hpbGUgKCRyb290UGFja2FnZSBpbnN0YW5jZW9mIFJvb3RBbGlhc1BhY2thZ2UpIHsKJHJvb3RQYWNrYWdlID0gJHJvb3RQYWNrYWdlLT5nZXRBbGlhc09mKCk7CiRwYWNrYWdlc1tdID0gJHJvb3RQYWNrYWdlOwp9CiR2ZXJzaW9ucyA9IFsKJ3Jvb3QnID0+ICR0aGlzLT5kdW1wUm9vdFBhY2thZ2UoJHJvb3RQYWNrYWdlLCAkaW5zdGFsbFBhdGhzLCAkZGV2TW9kZSwgJHJlcG9EaXIsICRkZXZQYWNrYWdlcyksCid2ZXJzaW9ucycgPT4gW10sCl07CgoKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewpjb250aW51ZTsKfQoKJHZlcnNpb25zWyd2ZXJzaW9ucyddWyRwYWNrYWdlLT5nZXROYW1lKCldID0gJHRoaXMtPmR1bXBJbnN0YWxsZWRQYWNrYWdlKCRwYWNrYWdlLCAkaW5zdGFsbFBhdGhzLCAkcmVwb0RpciwgJGRldlBhY2thZ2VzKTsKfQoKCmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewokaXNEZXZQYWNrYWdlID0gaXNzZXQoJGRldlBhY2thZ2VzWyRwYWNrYWdlLT5nZXROYW1lKCldKTsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcGxhY2VzKCkgYXMgJHJlcGxhY2UpIHsKCmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRyZXBsYWNlLT5nZXRUYXJnZXQoKSkpIHsKY29udGludWU7Cn0KaWYgKCFpc3NldCgkdmVyc2lvbnNbJ3ZlcnNpb25zJ11bJHJlcGxhY2UtPmdldFRhcmdldCgpXVsnZGV2X3JlcXVpcmVtZW50J10pKSB7CiR2ZXJzaW9uc1sndmVyc2lvbnMnXVskcmVwbGFjZS0+Z2V0VGFyZ2V0KCldWydkZXZfcmVxdWlyZW1lbnQnXSA9ICRpc0RldlBhY2thZ2U7Cn0gZWxzZWlmICghJGlzRGV2UGFja2FnZSkgewokdmVyc2lvbnNbJ3ZlcnNpb25zJ11bJHJlcGxhY2UtPmdldFRhcmdldCgpXVsnZGV2X3JlcXVpcmVtZW50J10gPSBmYWxzZTsKfQokcmVwbGFjZWQgPSAkcmVwbGFjZS0+Z2V0UHJldHR5Q29uc3RyYWludCgpOwppZiAoJHJlcGxhY2VkID09PSAnc2VsZi52ZXJzaW9uJykgewokcmVwbGFjZWQgPSAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwp9CmlmICghaXNzZXQoJHZlcnNpb25zWyd2ZXJzaW9ucyddWyRyZXBsYWNlLT5nZXRUYXJnZXQoKV1bJ3JlcGxhY2VkJ10pIHx8ICFpbl9hcnJheSgkcmVwbGFjZWQsICR2ZXJzaW9uc1sndmVyc2lvbnMnXVskcmVwbGFjZS0+Z2V0VGFyZ2V0KCldWydyZXBsYWNlZCddLCB0cnVlKSkgewokdmVyc2lvbnNbJ3ZlcnNpb25zJ11bJHJlcGxhY2UtPmdldFRhcmdldCgpXVsncmVwbGFjZWQnXVtdID0gJHJlcGxhY2VkOwp9Cn0KZm9yZWFjaCAoJHBhY2thZ2UtPmdldFByb3ZpZGVzKCkgYXMgJHByb3ZpZGUpIHsKCmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRwcm92aWRlLT5nZXRUYXJnZXQoKSkpIHsKY29udGludWU7Cn0KaWYgKCFpc3NldCgkdmVyc2lvbnNbJ3ZlcnNpb25zJ11bJHByb3ZpZGUtPmdldFRhcmdldCgpXVsnZGV2X3JlcXVpcmVtZW50J10pKSB7CiR2ZXJzaW9uc1sndmVyc2lvbnMnXVskcHJvdmlkZS0+Z2V0VGFyZ2V0KCldWydkZXZfcmVxdWlyZW1lbnQnXSA9ICRpc0RldlBhY2thZ2U7Cn0gZWxzZWlmICghJGlzRGV2UGFja2FnZSkgewokdmVyc2lvbnNbJ3ZlcnNpb25zJ11bJHByb3ZpZGUtPmdldFRhcmdldCgpXVsnZGV2X3JlcXVpcmVtZW50J10gPSBmYWxzZTsKfQokcHJvdmlkZWQgPSAkcHJvdmlkZS0+Z2V0UHJldHR5Q29uc3RyYWludCgpOwppZiAoJHByb3ZpZGVkID09PSAnc2VsZi52ZXJzaW9uJykgewokcHJvdmlkZWQgPSAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwp9CmlmICghaXNzZXQoJHZlcnNpb25zWyd2ZXJzaW9ucyddWyRwcm92aWRlLT5nZXRUYXJnZXQoKV1bJ3Byb3ZpZGVkJ10pIHx8ICFpbl9hcnJheSgkcHJvdmlkZWQsICR2ZXJzaW9uc1sndmVyc2lvbnMnXVskcHJvdmlkZS0+Z2V0VGFyZ2V0KCldWydwcm92aWRlZCddLCB0cnVlKSkgewokdmVyc2lvbnNbJ3ZlcnNpb25zJ11bJHByb3ZpZGUtPmdldFRhcmdldCgpXVsncHJvdmlkZWQnXVtdID0gJHByb3ZpZGVkOwp9Cn0KfQoKCmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewppZiAoISRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CmNvbnRpbnVlOwp9CiR2ZXJzaW9uc1sndmVyc2lvbnMnXVskcGFja2FnZS0+Z2V0TmFtZSgpXVsnYWxpYXNlcyddW10gPSAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBSb290UGFja2FnZUludGVyZmFjZSkgewokdmVyc2lvbnNbJ3Jvb3QnXVsnYWxpYXNlcyddW10gPSAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwp9Cn0KCmtzb3J0KCR2ZXJzaW9uc1sndmVyc2lvbnMnXSk7Cmtzb3J0KCR2ZXJzaW9ucyk7Cgpmb3JlYWNoICgkdmVyc2lvbnNbJ3ZlcnNpb25zJ10gYXMgJG5hbWUgPT4gJHZlcnNpb24pIHsKZm9yZWFjaCAoWydhbGlhc2VzJywgJ3JlcGxhY2VkJywgJ3Byb3ZpZGVkJ10gYXMgJGtleSkgewppZiAoaXNzZXQoJHZlcnNpb25zWyd2ZXJzaW9ucyddWyRuYW1lXVska2V5XSkpIHsKc29ydCgkdmVyc2lvbnNbJ3ZlcnNpb25zJ11bJG5hbWVdWyRrZXldLCBTT1JUX05BVFVSQUwpOwp9Cn0KfQoKcmV0dXJuICR2ZXJzaW9uczsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGR1bXBJbnN0YWxsZWRQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIGFycmF5ICRpbnN0YWxsUGF0aHMsIHN0cmluZyAkcmVwb0RpciwgYXJyYXkgJGRldlBhY2thZ2VzKTogYXJyYXkKewokcmVmZXJlbmNlID0gbnVsbDsKaWYgKCRwYWNrYWdlLT5nZXRJbnN0YWxsYXRpb25Tb3VyY2UoKSkgewokcmVmZXJlbmNlID0gJHBhY2thZ2UtPmdldEluc3RhbGxhdGlvblNvdXJjZSgpID09PSAnc291cmNlJyA/ICRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKSA6ICRwYWNrYWdlLT5nZXREaXN0UmVmZXJlbmNlKCk7Cn0KaWYgKG51bGwgPT09ICRyZWZlcmVuY2UpIHsKJHJlZmVyZW5jZSA9ICgkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCkgPzogJHBhY2thZ2UtPmdldERpc3RSZWZlcmVuY2UoKSkgPzogbnVsbDsKfQoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgUm9vdFBhY2thZ2VJbnRlcmZhY2UpIHsKJHRvID0gJHRoaXMtPmZpbGVzeXN0ZW0tPm5vcm1hbGl6ZVBhdGgocmVhbHBhdGgoUGxhdGZvcm06OmdldEN3ZCgpKSk7CiRpbnN0YWxsUGF0aCA9ICR0aGlzLT5maWxlc3lzdGVtLT5maW5kU2hvcnRlc3RQYXRoKCRyZXBvRGlyLCAkdG8sIHRydWUpOwp9IGVsc2UgewokaW5zdGFsbFBhdGggPSAkaW5zdGFsbFBhdGhzWyRwYWNrYWdlLT5nZXROYW1lKCldOwp9CgokZGF0YSA9IFsKJ3ByZXR0eV92ZXJzaW9uJyA9PiAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpLAondmVyc2lvbicgPT4gJHBhY2thZ2UtPmdldFZlcnNpb24oKSwKJ3JlZmVyZW5jZScgPT4gJHJlZmVyZW5jZSwKJ3R5cGUnID0+ICRwYWNrYWdlLT5nZXRUeXBlKCksCidpbnN0YWxsX3BhdGgnID0+ICRpbnN0YWxsUGF0aCwKJ2FsaWFzZXMnID0+IFtdLAonZGV2X3JlcXVpcmVtZW50JyA9PiBpc3NldCgkZGV2UGFja2FnZXNbJHBhY2thZ2UtPmdldE5hbWUoKV0pLApdOwoKcmV0dXJuICRkYXRhOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZHVtcFJvb3RQYWNrYWdlKFJvb3RQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBhcnJheSAkaW5zdGFsbFBhdGhzLCBib29sICRkZXZNb2RlLCBzdHJpbmcgJHJlcG9EaXIsIGFycmF5ICRkZXZQYWNrYWdlcykKewokZGF0YSA9ICR0aGlzLT5kdW1wSW5zdGFsbGVkUGFja2FnZSgkcGFja2FnZSwgJGluc3RhbGxQYXRocywgJHJlcG9EaXIsICRkZXZQYWNrYWdlcyk7CgpyZXR1cm4gWwonbmFtZScgPT4gJHBhY2thZ2UtPmdldE5hbWUoKSwKJ3ByZXR0eV92ZXJzaW9uJyA9PiAkZGF0YVsncHJldHR5X3ZlcnNpb24nXSwKJ3ZlcnNpb24nID0+ICRkYXRhWyd2ZXJzaW9uJ10sCidyZWZlcmVuY2UnID0+ICRkYXRhWydyZWZlcmVuY2UnXSwKJ3R5cGUnID0+ICRkYXRhWyd0eXBlJ10sCidpbnN0YWxsX3BhdGgnID0+ICRkYXRhWydpbnN0YWxsX3BhdGgnXSwKJ2FsaWFzZXMnID0+ICRkYXRhWydhbGlhc2VzJ10sCidkZXYnID0+ICRkZXZNb2RlLApdOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCgoKY2xhc3MgRmlsdGVyUmVwb3NpdG9yeSBpbXBsZW1lbnRzIFJlcG9zaXRvcnlJbnRlcmZhY2UsIEFkdmlzb3J5UHJvdmlkZXJJbnRlcmZhY2UKewoKcHJpdmF0ZSAkb25seSA9IG51bGw7Cgpwcml2YXRlICRleGNsdWRlID0gbnVsbDsKCnByaXZhdGUgJGNhbm9uaWNhbCA9IHRydWU7Cgpwcml2YXRlICRyZXBvOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIGFycmF5ICRvcHRpb25zKQp7CmlmIChpc3NldCgkb3B0aW9uc1snb25seSddKSkgewppZiAoIWlzX2FycmF5KCRvcHRpb25zWydvbmx5J10pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCcib25seSIga2V5IGZvciByZXBvc2l0b3J5ICcuJHJlcG8tPmdldFJlcG9OYW1lKCkuJyBzaG91bGQgYmUgYW4gYXJyYXknKTsKfQokdGhpcy0+b25seSA9IEJhc2VQYWNrYWdlOjpwYWNrYWdlTmFtZXNUb1JlZ2V4cCgkb3B0aW9uc1snb25seSddKTsKfQppZiAoaXNzZXQoJG9wdGlvbnNbJ2V4Y2x1ZGUnXSkpIHsKaWYgKCFpc19hcnJheSgkb3B0aW9uc1snZXhjbHVkZSddKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignImV4Y2x1ZGUiIGtleSBmb3IgcmVwb3NpdG9yeSAnLiRyZXBvLT5nZXRSZXBvTmFtZSgpLicgc2hvdWxkIGJlIGFuIGFycmF5Jyk7Cn0KJHRoaXMtPmV4Y2x1ZGUgPSBCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVzVG9SZWdleHAoJG9wdGlvbnNbJ2V4Y2x1ZGUnXSk7Cn0KaWYgKCR0aGlzLT5leGNsdWRlICYmICR0aGlzLT5vbmx5KSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdPbmx5IG9uZSBvZiAib25seSIgYW5kICJleGNsdWRlIiBjYW4gYmUgc3BlY2lmaWVkIGZvciByZXBvc2l0b3J5ICcuJHJlcG8tPmdldFJlcG9OYW1lKCkpOwp9CmlmIChpc3NldCgkb3B0aW9uc1snY2Fub25pY2FsJ10pKSB7CmlmICghaXNfYm9vbCgkb3B0aW9uc1snY2Fub25pY2FsJ10pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCciY2Fub25pY2FsIiBrZXkgZm9yIHJlcG9zaXRvcnkgJy4kcmVwby0+Z2V0UmVwb05hbWUoKS4nIHNob3VsZCBiZSBhIGJvb2xlYW4nKTsKfQokdGhpcy0+Y2Fub25pY2FsID0gJG9wdGlvbnNbJ2Nhbm9uaWNhbCddOwp9CgokdGhpcy0+cmVwbyA9ICRyZXBvOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb05hbWUoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5yZXBvLT5nZXRSZXBvTmFtZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb3NpdG9yeSgpOiBSZXBvc2l0b3J5SW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5yZXBvOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogYm9vbAp7CnJldHVybiAkdGhpcy0+cmVwby0+aGFzUGFja2FnZSgkcGFja2FnZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kUGFja2FnZSgkbmFtZSwgJGNvbnN0cmFpbnQpOiA/QmFzZVBhY2thZ2UKewppZiAoISR0aGlzLT5pc0FsbG93ZWQoJG5hbWUpKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gJHRoaXMtPnJlcG8tPmZpbmRQYWNrYWdlKCRuYW1lLCAkY29uc3RyYWludCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kUGFja2FnZXMoJG5hbWUsICRjb25zdHJhaW50ID0gbnVsbCk6IGFycmF5CnsKaWYgKCEkdGhpcy0+aXNBbGxvd2VkKCRuYW1lKSkgewpyZXR1cm4gW107Cn0KCnJldHVybiAkdGhpcy0+cmVwby0+ZmluZFBhY2thZ2VzKCRuYW1lLCAkY29uc3RyYWludCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2FkUGFja2FnZXMoYXJyYXkgJHBhY2thZ2VOYW1lTWFwLCBhcnJheSAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCBhcnJheSAkc3RhYmlsaXR5RmxhZ3MsIGFycmF5ICRhbHJlYWR5TG9hZGVkID0gW10pOiBhcnJheQp7CmZvcmVhY2ggKCRwYWNrYWdlTmFtZU1hcCBhcyAkbmFtZSA9PiAkY29uc3RyYWludCkgewppZiAoISR0aGlzLT5pc0FsbG93ZWQoJG5hbWUpKSB7CnVuc2V0KCRwYWNrYWdlTmFtZU1hcFskbmFtZV0pOwp9Cn0KCmlmICghJHBhY2thZ2VOYW1lTWFwKSB7CnJldHVybiBbJ25hbWVzRm91bmQnID0+IFtdLCAncGFja2FnZXMnID0+IFtdXTsKfQoKJHJlc3VsdCA9ICR0aGlzLT5yZXBvLT5sb2FkUGFja2FnZXMoJHBhY2thZ2VOYW1lTWFwLCAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCAkc3RhYmlsaXR5RmxhZ3MsICRhbHJlYWR5TG9hZGVkKTsKaWYgKCEkdGhpcy0+Y2Fub25pY2FsKSB7CiRyZXN1bHRbJ25hbWVzRm91bmQnXSA9IFtdOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNlYXJjaChzdHJpbmcgJHF1ZXJ5LCBpbnQgJG1vZGUgPSAwLCA/c3RyaW5nICR0eXBlID0gbnVsbCk6IGFycmF5CnsKJHJlc3VsdCA9IFtdOwoKZm9yZWFjaCAoJHRoaXMtPnJlcG8tPnNlYXJjaCgkcXVlcnksICRtb2RlLCAkdHlwZSkgYXMgJHBhY2thZ2UpIHsKaWYgKCR0aGlzLT5pc0FsbG93ZWQoJHBhY2thZ2VbJ25hbWUnXSkpIHsKJHJlc3VsdFtdID0gJHBhY2thZ2U7Cn0KfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWNrYWdlcygpOiBhcnJheQp7CiRyZXN1bHQgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPnJlcG8tPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKCR0aGlzLT5pc0FsbG93ZWQoJHBhY2thZ2UtPmdldE5hbWUoKSkpIHsKJHJlc3VsdFtdID0gJHBhY2thZ2U7Cn0KfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm92aWRlcnMoJHBhY2thZ2VOYW1lKTogYXJyYXkKewokcmVzdWx0ID0gW107CmZvcmVhY2ggKCR0aGlzLT5yZXBvLT5nZXRQcm92aWRlcnMoJHBhY2thZ2VOYW1lKSBhcyAkbmFtZSA9PiAkcHJvdmlkZXIpIHsKaWYgKCR0aGlzLT5pc0FsbG93ZWQoJHByb3ZpZGVyWyduYW1lJ10pKSB7CiRyZXN1bHRbJG5hbWVdID0gJHByb3ZpZGVyOwp9Cn0KCnJldHVybiAkcmVzdWx0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY291bnQoKTogaW50CnsKaWYgKCR0aGlzLT5yZXBvLT5jb3VudCgpID4gMCkgewpyZXR1cm4gY291bnQoJHRoaXMtPmdldFBhY2thZ2VzKCkpOwp9CgpyZXR1cm4gMDsKfQoKcHVibGljIGZ1bmN0aW9uIGhhc1NlY3VyaXR5QWR2aXNvcmllcygpOiBib29sCnsKaWYgKCEkdGhpcy0+cmVwbyBpbnN0YW5jZW9mIEFkdmlzb3J5UHJvdmlkZXJJbnRlcmZhY2UpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gJHRoaXMtPnJlcG8tPmhhc1NlY3VyaXR5QWR2aXNvcmllcygpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U2VjdXJpdHlBZHZpc29yaWVzKGFycmF5ICRwYWNrYWdlQ29uc3RyYWludE1hcCwgYm9vbCAkYWxsb3dQYXJ0aWFsQWR2aXNvcmllcyA9IGZhbHNlKTogYXJyYXkKewppZiAoISR0aGlzLT5yZXBvIGluc3RhbmNlb2YgQWR2aXNvcnlQcm92aWRlckludGVyZmFjZSkgewpyZXR1cm4gWyduYW1lc0ZvdW5kJyA9PiBbXSwgJ2Fkdmlzb3JpZXMnID0+IFtdXTsKfQoKZm9yZWFjaCAoJHBhY2thZ2VDb25zdHJhaW50TWFwIGFzICRuYW1lID0+ICRjb25zdHJhaW50KSB7CmlmICghJHRoaXMtPmlzQWxsb3dlZCgkbmFtZSkpIHsKdW5zZXQoJHBhY2thZ2VDb25zdHJhaW50TWFwWyRuYW1lXSk7Cn0KfQoKcmV0dXJuICR0aGlzLT5yZXBvLT5nZXRTZWN1cml0eUFkdmlzb3JpZXMoJHBhY2thZ2VDb25zdHJhaW50TWFwLCAkYWxsb3dQYXJ0aWFsQWR2aXNvcmllcyk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gaXNBbGxvd2VkKHN0cmluZyAkbmFtZSk6IGJvb2wKewppZiAoISR0aGlzLT5vbmx5ICYmICEkdGhpcy0+ZXhjbHVkZSkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKCR0aGlzLT5vbmx5KSB7CnJldHVybiBQcmVnOjppc01hdGNoKCR0aGlzLT5vbmx5LCAkbmFtZSk7Cn0KCmlmICgkdGhpcy0+ZXhjbHVkZSA9PT0gbnVsbCkgewpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuICFQcmVnOjppc01hdGNoKCR0aGlzLT5leGNsdWRlLCAkbmFtZSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCgoKCgoKCgpjbGFzcyBJbnN0YWxsZWRBcnJheVJlcG9zaXRvcnkgZXh0ZW5kcyBXcml0YWJsZUFycmF5UmVwb3NpdG9yeSBpbXBsZW1lbnRzIEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UKewpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb05hbWUoKTogc3RyaW5nCnsKcmV0dXJuICdpbnN0YWxsZWQgJy5wYXJlbnQ6OmdldFJlcG9OYW1lKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0ZyZXNoKCk6IGJvb2wKewoKCnJldHVybiAkdGhpcy0+Y291bnQoKSA9PT0gMDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKCgoKCgpjbGFzcyBJbnN0YWxsZWRGaWxlc3lzdGVtUmVwb3NpdG9yeSBleHRlbmRzIEZpbGVzeXN0ZW1SZXBvc2l0b3J5IGltcGxlbWVudHMgSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZQp7CnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvTmFtZSgpCnsKcmV0dXJuICdpbnN0YWxsZWQgJy5wYXJlbnQ6OmdldFJlcG9OYW1lKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0ZyZXNoKCkKewpyZXR1cm4gISR0aGlzLT5maWxlLT5leGlzdHMoKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcTWF0Y2hBbGxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTGluazsKCgoKCgoKCgoKCmNsYXNzIEluc3RhbGxlZFJlcG9zaXRvcnkgZXh0ZW5kcyBDb21wb3NpdGVSZXBvc2l0b3J5CnsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZFBhY2thZ2VzV2l0aFJlcGxhY2Vyc0FuZFByb3ZpZGVycyhzdHJpbmcgJG5hbWUsICRjb25zdHJhaW50ID0gbnVsbCk6IGFycmF5CnsKJG5hbWUgPSBzdHJ0b2xvd2VyKCRuYW1lKTsKCmlmIChudWxsICE9PSAkY29uc3RyYWludCAmJiAhJGNvbnN0cmFpbnQgaW5zdGFuY2VvZiBDb25zdHJhaW50SW50ZXJmYWNlKSB7CiR2ZXJzaW9uUGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKJGNvbnN0cmFpbnQgPSAkdmVyc2lvblBhcnNlci0+cGFyc2VDb25zdHJhaW50cygkY29uc3RyYWludCk7Cn0KCiRtYXRjaGVzID0gW107CmZvcmVhY2ggKCR0aGlzLT5nZXRSZXBvc2l0b3JpZXMoKSBhcyAkcmVwbykgewpmb3JlYWNoICgkcmVwby0+Z2V0UGFja2FnZXMoKSBhcyAkY2FuZGlkYXRlKSB7CmlmICgkbmFtZSA9PT0gJGNhbmRpZGF0ZS0+Z2V0TmFtZSgpKSB7CmlmIChudWxsID09PSAkY29uc3RyYWludCB8fCAkY29uc3RyYWludC0+bWF0Y2hlcyhuZXcgQ29uc3RyYWludCgnPT0nLCAkY2FuZGlkYXRlLT5nZXRWZXJzaW9uKCkpKSkgewokbWF0Y2hlc1tdID0gJGNhbmRpZGF0ZTsKfQpjb250aW51ZTsKfQoKZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJGNhbmRpZGF0ZS0+Z2V0UHJvdmlkZXMoKSwgJGNhbmRpZGF0ZS0+Z2V0UmVwbGFjZXMoKSkgYXMgJGxpbmspIHsKaWYgKAokbmFtZSA9PT0gJGxpbmstPmdldFRhcmdldCgpCiYmICgkY29uc3RyYWludCA9PT0gbnVsbCB8fCAkY29uc3RyYWludC0+bWF0Y2hlcygkbGluay0+Z2V0Q29uc3RyYWludCgpKSkKKSB7CiRtYXRjaGVzW10gPSAkY2FuZGlkYXRlOwpjb250aW51ZSAyOwp9Cn0KfQp9CgpyZXR1cm4gJG1hdGNoZXM7Cn0KCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXBlbmRlbnRzKCRuZWVkbGUsID9Db25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50ID0gbnVsbCwgYm9vbCAkaW52ZXJ0ID0gZmFsc2UsIGJvb2wgJHJlY3Vyc2UgPSB0cnVlLCA/YXJyYXkgJHBhY2thZ2VzRm91bmQgPSBudWxsKTogYXJyYXkKewokbmVlZGxlcyA9IGFycmF5X21hcCgnc3RydG9sb3dlcicsIChhcnJheSkgJG5lZWRsZSk7CiRyZXN1bHRzID0gW107CgoKaWYgKG51bGwgPT09ICRwYWNrYWdlc0ZvdW5kKSB7CiRwYWNrYWdlc0ZvdW5kID0gJG5lZWRsZXM7Cn0KCgokcm9vdFBhY2thZ2UgPSBudWxsOwpmb3JlYWNoICgkdGhpcy0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBSb290UGFja2FnZUludGVyZmFjZSkgewokcm9vdFBhY2thZ2UgPSAkcGFja2FnZTsKYnJlYWs7Cn0KfQoKCmZvcmVhY2ggKCR0aGlzLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiRsaW5rcyA9ICRwYWNrYWdlLT5nZXRSZXF1aXJlcygpOwoKCgokcGFja2FnZXNJblRyZWUgPSAkcGFja2FnZXNGb3VuZDsKCgppZiAoISRpbnZlcnQpIHsKJGxpbmtzICs9ICRwYWNrYWdlLT5nZXRSZXBsYWNlcygpOwoKCgoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcGxhY2VzKCkgYXMgJGxpbmspIHsKZm9yZWFjaCAoJG5lZWRsZXMgYXMgJG5lZWRsZSkgewppZiAoJGxpbmstPmdldFNvdXJjZSgpID09PSAkbmVlZGxlKSB7CmlmICgkY29uc3RyYWludCA9PT0gbnVsbCB8fCAoJGxpbmstPmdldENvbnN0cmFpbnQoKS0+bWF0Y2hlcygkY29uc3RyYWludCkgPT09IHRydWUpKSB7CgppZiAoaW5fYXJyYXkoJGxpbmstPmdldFRhcmdldCgpLCAkcGFja2FnZXNJblRyZWUpKSB7CiRyZXN1bHRzW10gPSBbJHBhY2thZ2UsICRsaW5rLCBmYWxzZV07CmNvbnRpbnVlOwp9CiRwYWNrYWdlc0luVHJlZVtdID0gJGxpbmstPmdldFRhcmdldCgpOwokZGVwZW5kZW50cyA9ICRyZWN1cnNlID8gJHRoaXMtPmdldERlcGVuZGVudHMoJGxpbmstPmdldFRhcmdldCgpLCBudWxsLCBmYWxzZSwgdHJ1ZSwgJHBhY2thZ2VzSW5UcmVlKSA6IFtdOwokcmVzdWx0c1tdID0gWyRwYWNrYWdlLCAkbGluaywgJGRlcGVuZGVudHNdOwokbmVlZGxlc1tdID0gJGxpbmstPmdldFRhcmdldCgpOwp9Cn0KfQp9CnVuc2V0KCRuZWVkbGUpOwp9CgoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgUm9vdFBhY2thZ2VJbnRlcmZhY2UpIHsKJGxpbmtzICs9ICRwYWNrYWdlLT5nZXREZXZSZXF1aXJlcygpOwp9CgoKZm9yZWFjaCAoJGxpbmtzIGFzICRsaW5rKSB7CmZvcmVhY2ggKCRuZWVkbGVzIGFzICRuZWVkbGUpIHsKaWYgKCRsaW5rLT5nZXRUYXJnZXQoKSA9PT0gJG5lZWRsZSkgewppZiAoJGNvbnN0cmFpbnQgPT09IG51bGwgfHwgKCRsaW5rLT5nZXRDb25zdHJhaW50KCktPm1hdGNoZXMoJGNvbnN0cmFpbnQpID09PSAhJGludmVydCkpIHsKCmlmIChpbl9hcnJheSgkbGluay0+Z2V0U291cmNlKCksICRwYWNrYWdlc0luVHJlZSkpIHsKJHJlc3VsdHNbXSA9IFskcGFja2FnZSwgJGxpbmssIGZhbHNlXTsKY29udGludWU7Cn0KJHBhY2thZ2VzSW5UcmVlW10gPSAkbGluay0+Z2V0U291cmNlKCk7CiRkZXBlbmRlbnRzID0gJHJlY3Vyc2UgPyAkdGhpcy0+Z2V0RGVwZW5kZW50cygkbGluay0+Z2V0U291cmNlKCksIG51bGwsIGZhbHNlLCB0cnVlLCAkcGFja2FnZXNJblRyZWUpIDogW107CiRyZXN1bHRzW10gPSBbJHBhY2thZ2UsICRsaW5rLCAkZGVwZW5kZW50c107Cn0KfQp9Cn0KCgppZiAoJGludmVydCAmJiBpbl9hcnJheSgkcGFja2FnZS0+Z2V0TmFtZSgpLCAkbmVlZGxlcywgdHJ1ZSkpIHsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldENvbmZsaWN0cygpIGFzICRsaW5rKSB7CmZvcmVhY2ggKCR0aGlzLT5maW5kUGFja2FnZXMoJGxpbmstPmdldFRhcmdldCgpKSBhcyAkcGtnKSB7CiR2ZXJzaW9uID0gbmV3IENvbnN0cmFpbnQoJz0nLCAkcGtnLT5nZXRWZXJzaW9uKCkpOwppZiAoJGxpbmstPmdldENvbnN0cmFpbnQoKS0+bWF0Y2hlcygkdmVyc2lvbikgPT09ICRpbnZlcnQpIHsKJHJlc3VsdHNbXSA9IFskcGFja2FnZSwgJGxpbmssIGZhbHNlXTsKfQp9Cn0KfQoKCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRDb25mbGljdHMoKSBhcyAkbGluaykgewppZiAoaW5fYXJyYXkoJGxpbmstPmdldFRhcmdldCgpLCAkbmVlZGxlcywgdHJ1ZSkpIHsKZm9yZWFjaCAoJHRoaXMtPmZpbmRQYWNrYWdlcygkbGluay0+Z2V0VGFyZ2V0KCkpIGFzICRwa2cpIHsKJHZlcnNpb24gPSBuZXcgQ29uc3RyYWludCgnPScsICRwa2ctPmdldFZlcnNpb24oKSk7CmlmICgkbGluay0+Z2V0Q29uc3RyYWludCgpLT5tYXRjaGVzKCR2ZXJzaW9uKSA9PT0gJGludmVydCkgewokcmVzdWx0c1tdID0gWyRwYWNrYWdlLCAkbGluaywgZmFsc2VdOwp9Cn0KfQp9CgoKaWYgKCRpbnZlcnQgJiYgJGNvbnN0cmFpbnQgJiYgaW5fYXJyYXkoJHBhY2thZ2UtPmdldE5hbWUoKSwgJG5lZWRsZXMsIHRydWUpICYmICRjb25zdHJhaW50LT5tYXRjaGVzKG5ldyBDb25zdHJhaW50KCc9JywgJHBhY2thZ2UtPmdldFZlcnNpb24oKSkpKSB7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXF1aXJlcygpIGFzICRsaW5rKSB7CmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRsaW5rLT5nZXRUYXJnZXQoKSkpIHsKaWYgKCR0aGlzLT5maW5kUGFja2FnZSgkbGluay0+Z2V0VGFyZ2V0KCksICRsaW5rLT5nZXRDb25zdHJhaW50KCkpKSB7CmNvbnRpbnVlOwp9CgokcGxhdGZvcm1Qa2cgPSAkdGhpcy0+ZmluZFBhY2thZ2UoJGxpbmstPmdldFRhcmdldCgpLCAnKicpOwokZGVzY3JpcHRpb24gPSAkcGxhdGZvcm1Qa2cgPyAnYnV0ICcuJHBsYXRmb3JtUGtnLT5nZXRQcmV0dHlWZXJzaW9uKCkuJyBpcyBpbnN0YWxsZWQnIDogJ2J1dCBpdCBpcyBtaXNzaW5nJzsKJHJlc3VsdHNbXSA9IFskcGFja2FnZSwgbmV3IExpbmsoJHBhY2thZ2UtPmdldE5hbWUoKSwgJGxpbmstPmdldFRhcmdldCgpLCBuZXcgTWF0Y2hBbGxDb25zdHJhaW50LCBMaW5rOjpUWVBFX1JFUVVJUkUsICRsaW5rLT5nZXRQcmV0dHlDb25zdHJhaW50KCkuJyAnLiRkZXNjcmlwdGlvbiksIGZhbHNlXTsKCmNvbnRpbnVlOwp9Cgpmb3JlYWNoICgkdGhpcy0+Z2V0UGFja2FnZXMoKSBhcyAkcGtnKSB7CmlmICghaW5fYXJyYXkoJGxpbmstPmdldFRhcmdldCgpLCAkcGtnLT5nZXROYW1lcygpKSkgewpjb250aW51ZTsKfQoKJHZlcnNpb24gPSBuZXcgQ29uc3RyYWludCgnPScsICRwa2ctPmdldFZlcnNpb24oKSk7CgppZiAoJGxpbmstPmdldFRhcmdldCgpICE9PSAkcGtnLT5nZXROYW1lKCkpIHsKZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJHBrZy0+Z2V0UmVwbGFjZXMoKSwgJHBrZy0+Z2V0UHJvdmlkZXMoKSkgYXMgJHByb3YpIHsKaWYgKCRsaW5rLT5nZXRUYXJnZXQoKSA9PT0gJHByb3YtPmdldFRhcmdldCgpKSB7CiR2ZXJzaW9uID0gJHByb3YtPmdldENvbnN0cmFpbnQoKTsKYnJlYWs7Cn0KfQp9CgppZiAoISRsaW5rLT5nZXRDb25zdHJhaW50KCktPm1hdGNoZXMoJHZlcnNpb24pKSB7CgoKaWYgKCRyb290UGFja2FnZSkgewpmb3JlYWNoIChhcnJheV9tZXJnZSgkcm9vdFBhY2thZ2UtPmdldFJlcXVpcmVzKCksICRyb290UGFja2FnZS0+Z2V0RGV2UmVxdWlyZXMoKSkgYXMgJHJvb3RSZXEpIHsKaWYgKGluX2FycmF5KCRyb290UmVxLT5nZXRUYXJnZXQoKSwgJHBrZy0+Z2V0TmFtZXMoKSkgJiYgISRyb290UmVxLT5nZXRDb25zdHJhaW50KCktPm1hdGNoZXMoJGxpbmstPmdldENvbnN0cmFpbnQoKSkpIHsKJHJlc3VsdHNbXSA9IFskcGFja2FnZSwgJGxpbmssIGZhbHNlXTsKJHJlc3VsdHNbXSA9IFskcm9vdFBhY2thZ2UsICRyb290UmVxLCBmYWxzZV07CmNvbnRpbnVlIDM7Cn0KfQoKJHJlc3VsdHNbXSA9IFskcGFja2FnZSwgJGxpbmssIGZhbHNlXTsKJHJlc3VsdHNbXSA9IFskcm9vdFBhY2thZ2UsIG5ldyBMaW5rKCRyb290UGFja2FnZS0+Z2V0TmFtZSgpLCAkbGluay0+Z2V0VGFyZ2V0KCksIG5ldyBNYXRjaEFsbENvbnN0cmFpbnQsIExpbms6OlRZUEVfRE9FU19OT1RfUkVRVUlSRSwgJ2J1dCAnIC4gJHBrZy0+Z2V0UHJldHR5VmVyc2lvbigpIC4gJyBpcyBpbnN0YWxsZWQnKSwgZmFsc2VdOwp9IGVsc2UgewoKJHJlc3VsdHNbXSA9IFskcGFja2FnZSwgJGxpbmssIGZhbHNlXTsKfQp9Cgpjb250aW51ZSAyOwp9Cn0KfQp9Cgprc29ydCgkcmVzdWx0cyk7CgpyZXR1cm4gJHJlc3VsdHM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvTmFtZSgpOiBzdHJpbmcKewpyZXR1cm4gJ2luc3RhbGxlZCByZXBvICgnLmltcGxvZGUoJywgJywgYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJHJlcG8pOiBzdHJpbmcgewpyZXR1cm4gJHJlcG8tPmdldFJlcG9OYW1lKCk7Cn0sICR0aGlzLT5nZXRSZXBvc2l0b3JpZXMoKSkpLicpJzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFJlcG9zaXRvcnkoUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwb3NpdG9yeSk6IHZvaWQKewppZiAoCiRyZXBvc2l0b3J5IGluc3RhbmNlb2YgTG9ja0FycmF5UmVwb3NpdG9yeQp8fCAkcmVwb3NpdG9yeSBpbnN0YW5jZW9mIEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UKfHwgJHJlcG9zaXRvcnkgaW5zdGFuY2VvZiBSb290UGFja2FnZVJlcG9zaXRvcnkKfHwgJHJlcG9zaXRvcnkgaW5zdGFuY2VvZiBQbGF0Zm9ybVJlcG9zaXRvcnkKKSB7CnBhcmVudDo6YWRkUmVwb3NpdG9yeSgkcmVwb3NpdG9yeSk7CgpyZXR1cm47Cn0KCnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0FuIEluc3RhbGxlZFJlcG9zaXRvcnkgY2FuIG5vdCBjb250YWluIGEgcmVwb3NpdG9yeSBvZiB0eXBlICcuZ2V0X2NsYXNzKCRyZXBvc2l0b3J5KS4nICgnLiRyZXBvc2l0b3J5LT5nZXRSZXBvTmFtZSgpLicpJyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCgoKCgoKCgppbnRlcmZhY2UgSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSBleHRlbmRzIFdyaXRhYmxlUmVwb3NpdG9yeUludGVyZmFjZQp7CgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXZNb2RlKCk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNGcmVzaCgpOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKCgoKCgpjbGFzcyBJbnZhbGlkUmVwb3NpdG9yeUV4Y2VwdGlvbiBleHRlbmRzIFxFeGNlcHRpb24Kewp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKCgoKCgoKCmNsYXNzIExvY2tBcnJheVJlcG9zaXRvcnkgZXh0ZW5kcyBBcnJheVJlcG9zaXRvcnkKewp1c2UgQ2Fub25pY2FsUGFja2FnZXNUcmFpdDsKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvTmFtZSgpOiBzdHJpbmcKewpyZXR1cm4gJ2xvY2sgcmVwbyc7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCnVzZSBDb21wb3NlclxBZHZpc29yeVxQYXJ0aWFsU2VjdXJpdHlBZHZpc29yeTsKdXNlIENvbXBvc2VyXEFkdmlzb3J5XFNlY3VyaXR5QWR2aXNvcnk7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxBcnJheUxvYWRlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXFZhbGlkYXRpbmdBcnJheUxvYWRlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKCgpjbGFzcyBQYWNrYWdlUmVwb3NpdG9yeSBleHRlbmRzIEFycmF5UmVwb3NpdG9yeSBpbXBsZW1lbnRzIEFkdmlzb3J5UHJvdmlkZXJJbnRlcmZhY2UKewoKcHJpdmF0ZSAkY29uZmlnOwoKCnByaXZhdGUgJHNlY3VyaXR5QWR2aXNvcmllczsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRjb25maWcpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgpOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZ1sncGFja2FnZSddOwoKCmlmICghaXNfbnVtZXJpYyhrZXkoJHRoaXMtPmNvbmZpZykpKSB7CiR0aGlzLT5jb25maWcgPSBbJHRoaXMtPmNvbmZpZ107Cn0KCiR0aGlzLT5zZWN1cml0eUFkdmlzb3JpZXMgPSAkY29uZmlnWydzZWN1cml0eS1hZHZpc29yaWVzJ10gPz8gW107Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpbml0aWFsaXplKCk6IHZvaWQKewpwYXJlbnQ6OmluaXRpYWxpemUoKTsKCiRsb2FkZXIgPSBuZXcgVmFsaWRhdGluZ0FycmF5TG9hZGVyKG5ldyBBcnJheUxvYWRlcihudWxsLCB0cnVlKSwgdHJ1ZSk7CmZvcmVhY2ggKCR0aGlzLT5jb25maWcgYXMgJHBhY2thZ2UpIHsKdHJ5IHsKJHBhY2thZ2UgPSAkbG9hZGVyLT5sb2FkKCRwYWNrYWdlKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewp0aHJvdyBuZXcgSW52YWxpZFJlcG9zaXRvcnlFeGNlcHRpb24oJ0EgcmVwb3NpdG9yeSBvZiB0eXBlICJwYWNrYWdlIiBjb250YWlucyBhbiBpbnZhbGlkIHBhY2thZ2UgZGVmaW5pdGlvbjogJy4kZS0+Z2V0TWVzc2FnZSgpLiJcblxuSW52YWxpZCBwYWNrYWdlIGRlZmluaXRpb246XG4iLmpzb25fZW5jb2RlKCRwYWNrYWdlKSk7Cn0KCiR0aGlzLT5hZGRQYWNrYWdlKCRwYWNrYWdlKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb05hbWUoKTogc3RyaW5nCnsKcmV0dXJuIFByZWc6OnJlcGxhY2UoJ3teYXJyYXkgfScsICdwYWNrYWdlICcsIHBhcmVudDo6Z2V0UmVwb05hbWUoKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBoYXNTZWN1cml0eUFkdmlzb3JpZXMoKTogYm9vbAp7CnJldHVybiBjb3VudCgkdGhpcy0+c2VjdXJpdHlBZHZpc29yaWVzKSA+IDA7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTZWN1cml0eUFkdmlzb3JpZXMoYXJyYXkgJHBhY2thZ2VDb25zdHJhaW50TWFwLCBib29sICRhbGxvd1BhcnRpYWxBZHZpc29yaWVzID0gZmFsc2UpOiBhcnJheQp7CiRwYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwoKJGFkdmlzb3JpZXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPnNlY3VyaXR5QWR2aXNvcmllcyBhcyAkcGFja2FnZU5hbWUgPT4gJHBhY2thZ2VBZHZpc29yaWVzKSB7CmlmIChpc3NldCgkcGFja2FnZUNvbnN0cmFpbnRNYXBbJHBhY2thZ2VOYW1lXSkpIHsKJGFkdmlzb3JpZXNbJHBhY2thZ2VOYW1lXSA9IGFycmF5X3ZhbHVlcyhhcnJheV9maWx0ZXIoYXJyYXlfbWFwKGZ1bmN0aW9uIChhcnJheSAkZGF0YSkgdXNlICgkcGFja2FnZU5hbWUsICRhbGxvd1BhcnRpYWxBZHZpc29yaWVzLCAkcGFja2FnZUNvbnN0cmFpbnRNYXAsICRwYXJzZXIpIHsKJGFkdmlzb3J5ID0gUGFydGlhbFNlY3VyaXR5QWR2aXNvcnk6OmNyZWF0ZSgkcGFja2FnZU5hbWUsICRkYXRhLCAkcGFyc2VyKTsKaWYgKCEkYWxsb3dQYXJ0aWFsQWR2aXNvcmllcyAmJiAhJGFkdmlzb3J5IGluc3RhbmNlb2YgU2VjdXJpdHlBZHZpc29yeSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0Fkdmlzb3J5IGZvciAnLiRwYWNrYWdlTmFtZS4nIGNvdWxkIG5vdCBiZSBsb2FkZWQgYXMgYSBmdWxsIGFkdmlzb3J5IGZyb20gJy4kdGhpcy0+Z2V0UmVwb05hbWUoKSAuIFBIUF9FT0wgLiB2YXJfZXhwb3J0KCRkYXRhLCB0cnVlKSk7Cn0KCmlmICghJGFkdmlzb3J5LT5hZmZlY3RlZFZlcnNpb25zLT5tYXRjaGVzKCRwYWNrYWdlQ29uc3RyYWludE1hcFskcGFja2FnZU5hbWVdKSkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICRhZHZpc29yeTsKfSwgJHBhY2thZ2VBZHZpc29yaWVzKSkpOwp9Cn0KCnJldHVybiBbJ2Fkdmlzb3JpZXMnID0+IGFycmF5X2ZpbHRlcigkYWR2aXNvcmllcywgc3RhdGljIGZ1bmN0aW9uICgkYWR2KTogYm9vbCB7IHJldHVybiBcY291bnQoJGFkdikgPiAwOyB9KSwgJ25hbWVzRm91bmQnID0+IGFycmF5X2tleXMoJGFkdmlzb3JpZXMpXTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudERpc3BhdGNoZXI7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxBcnJheUxvYWRlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uR3Vlc3NlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwRG93bmxvYWRlcjsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcVXJsOwp1c2UgQ29tcG9zZXJcVXRpbFxHaXQgYXMgR2l0VXRpbDsKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIFBhdGhSZXBvc2l0b3J5IGV4dGVuZHMgQXJyYXlSZXBvc2l0b3J5IGltcGxlbWVudHMgQ29uZmlndXJhYmxlUmVwb3NpdG9yeUludGVyZmFjZQp7CgoKCnByaXZhdGUgJGxvYWRlcjsKCgoKCnByaXZhdGUgJHZlcnNpb25HdWVzc2VyOwoKCgoKcHJpdmF0ZSAkdXJsOwoKCgoKCnByaXZhdGUgJHJlcG9Db25maWc7CgoKCgpwcml2YXRlICRwcm9jZXNzOwoKCgoKcHJpdmF0ZSAkb3B0aW9uczsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRyZXBvQ29uZmlnLCBJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCA/SHR0cERvd25sb2FkZXIgJGh0dHBEb3dubG9hZGVyID0gbnVsbCwgP0V2ZW50RGlzcGF0Y2hlciAkZGlzcGF0Y2hlciA9IG51bGwsID9Qcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MgPSBudWxsKQp7CmlmICghaXNzZXQoJHJlcG9Db25maWdbJ3VybCddKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1lvdSBtdXN0IHNwZWNpZnkgdGhlIGB1cmxgIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBwYXRoIHJlcG9zaXRvcnknKTsKfQoKJHRoaXMtPmxvYWRlciA9IG5ldyBBcnJheUxvYWRlcihudWxsLCB0cnVlKTsKJHRoaXMtPnVybCA9IFBsYXRmb3JtOjpleHBhbmRQYXRoKCRyZXBvQ29uZmlnWyd1cmwnXSk7CiR0aGlzLT5wcm9jZXNzID0gJHByb2Nlc3MgPz8gbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwokdGhpcy0+dmVyc2lvbkd1ZXNzZXIgPSBuZXcgVmVyc2lvbkd1ZXNzZXIoJGNvbmZpZywgJHRoaXMtPnByb2Nlc3MsIG5ldyBWZXJzaW9uUGFyc2VyKCksICRpbyk7CiR0aGlzLT5yZXBvQ29uZmlnID0gJHJlcG9Db25maWc7CiR0aGlzLT5vcHRpb25zID0gJHJlcG9Db25maWdbJ29wdGlvbnMnXSA/PyBbXTsKaWYgKCFpc3NldCgkdGhpcy0+b3B0aW9uc1sncmVsYXRpdmUnXSkpIHsKJGZpbGVzeXN0ZW0gPSBuZXcgRmlsZXN5c3RlbSgpOwokdGhpcy0+b3B0aW9uc1sncmVsYXRpdmUnXSA9ICEkZmlsZXN5c3RlbS0+aXNBYnNvbHV0ZVBhdGgoJHRoaXMtPnVybCk7Cn0KCnBhcmVudDo6X19jb25zdHJ1Y3QoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9OYW1lKCk6IHN0cmluZwp7CnJldHVybiAncGF0aCByZXBvICgnLlVybDo6c2FuaXRpemUoJHRoaXMtPnJlcG9Db25maWdbJ3VybCddKS4nKSc7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvQ29uZmlnKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yZXBvQ29uZmlnOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpbml0aWFsaXplKCk6IHZvaWQKewpwYXJlbnQ6OmluaXRpYWxpemUoKTsKCiR1cmxNYXRjaGVzID0gJHRoaXMtPmdldFVybE1hdGNoZXMoKTsKCmlmIChlbXB0eSgkdXJsTWF0Y2hlcykpIHsKaWYgKFByZWc6OmlzTWF0Y2goJ3tbKnt9XX0nLCAkdGhpcy0+dXJsKSkgewokdXJsID0gJHRoaXMtPnVybDsKd2hpbGUgKFByZWc6OmlzTWF0Y2goJ3tbKnt9XX0nLCAkdXJsKSkgewokdXJsID0gZGlybmFtZSgkdXJsKTsKfQoKaWYgKGlzX2RpcigkdXJsKSkgewpyZXR1cm47Cn0KfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgYHVybGAgc3VwcGxpZWQgZm9yIHRoZSBwYXRoICgnIC4gJHRoaXMtPnVybCAuICcpIHJlcG9zaXRvcnkgZG9lcyBub3QgZXhpc3QnKTsKfQoKZm9yZWFjaCAoJHVybE1hdGNoZXMgYXMgJHVybCkgewokcGF0aCA9IHJlYWxwYXRoKCR1cmwpIC4gRElSRUNUT1JZX1NFUEFSQVRPUjsKJGNvbXBvc2VyRmlsZVBhdGggPSAkcGF0aC4nY29tcG9zZXIuanNvbic7CgppZiAoIWZpbGVfZXhpc3RzKCRjb21wb3NlckZpbGVQYXRoKSkgewpjb250aW51ZTsKfQoKJGpzb24gPSBmaWxlX2dldF9jb250ZW50cygkY29tcG9zZXJGaWxlUGF0aCk7CiRwYWNrYWdlID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkanNvbiwgJGNvbXBvc2VyRmlsZVBhdGgpOwokcGFja2FnZVsnZGlzdCddID0gWwondHlwZScgPT4gJ3BhdGgnLAondXJsJyA9PiAkdXJsLApdOwokcmVmZXJlbmNlID0gJHRoaXMtPm9wdGlvbnNbJ3JlZmVyZW5jZSddID8/ICdhdXRvJzsKaWYgKCdub25lJyA9PT0gJHJlZmVyZW5jZSkgewokcGFja2FnZVsnZGlzdCddWydyZWZlcmVuY2UnXSA9IG51bGw7Cn0gZWxzZWlmICgnY29uZmlnJyA9PT0gJHJlZmVyZW5jZSB8fCAnYXV0bycgPT09ICRyZWZlcmVuY2UpIHsKJHBhY2thZ2VbJ2Rpc3QnXVsncmVmZXJlbmNlJ10gPSBoYXNoKCdzaGExJywgJGpzb24gLiBzZXJpYWxpemUoJHRoaXMtPm9wdGlvbnMpKTsKfQoKCiRwYWNrYWdlWyd0cmFuc3BvcnQtb3B0aW9ucyddID0gYXJyYXlfaW50ZXJzZWN0X2tleSgkdGhpcy0+b3B0aW9ucywgWydzeW1saW5rJyA9PiB0cnVlLCAncmVsYXRpdmUnID0+IHRydWVdKTsKCmlmIChpc3NldCgkcGFja2FnZVsnbmFtZSddLCAkdGhpcy0+b3B0aW9uc1sndmVyc2lvbnMnXVskcGFja2FnZVsnbmFtZSddXSkpIHsKJHBhY2thZ2VbJ3ZlcnNpb24nXSA9ICR0aGlzLT5vcHRpb25zWyd2ZXJzaW9ucyddWyRwYWNrYWdlWyduYW1lJ11dOwp9CgoKaWYgKCFpc3NldCgkcGFja2FnZVsndmVyc2lvbiddKSAmJiAoJHJvb3RWZXJzaW9uID0gUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfUk9PVF9WRVJTSU9OJykpKSB7CmlmICgKMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAncmV2LXBhcnNlJywgJ0hFQUQnXSwgJHJlZjEsICRwYXRoKQomJiAwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdyZXYtcGFyc2UnLCAnSEVBRCddLCAkcmVmMikKJiYgJHJlZjEgPT09ICRyZWYyCikgewokcGFja2FnZVsndmVyc2lvbiddID0gJHRoaXMtPnZlcnNpb25HdWVzc2VyLT5nZXRSb290VmVyc2lvbkZyb21FbnYoKTsKfQp9Cgokb3V0cHV0ID0gJyc7CiRjb21tYW5kID0gR2l0VXRpbDo6YnVpbGRSZXZMaXN0Q29tbWFuZCgkdGhpcy0+cHJvY2VzcywgYXJyYXlfbWVyZ2UoWyctbjEnLCAnLS1mb3JtYXQ9JUgnLCAnSEVBRCddLCBHaXRVdGlsOjpnZXROb1Nob3dTaWduYXR1cmVGbGFncygkdGhpcy0+cHJvY2VzcykpKTsKaWYgKCdhdXRvJyA9PT0gJHJlZmVyZW5jZSAmJiBpc19kaXIoJHBhdGggLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJy5naXQnKSAmJiAwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY29tbWFuZCwgJG91dHB1dCwgJHBhdGgpKSB7CiRwYWNrYWdlWydkaXN0J11bJ3JlZmVyZW5jZSddID0gdHJpbShHaXRVdGlsOjpwYXJzZVJldkxpc3RPdXRwdXQoJG91dHB1dCwgJHRoaXMtPnByb2Nlc3MpKTsKfQoKaWYgKCFpc3NldCgkcGFja2FnZVsndmVyc2lvbiddKSkgewokdmVyc2lvbkRhdGEgPSAkdGhpcy0+dmVyc2lvbkd1ZXNzZXItPmd1ZXNzVmVyc2lvbigkcGFja2FnZSwgJHBhdGgpOwppZiAoaXNfYXJyYXkoJHZlcnNpb25EYXRhKSAmJiAkdmVyc2lvbkRhdGFbJ3ByZXR0eV92ZXJzaW9uJ10pIHsKCmlmICghZW1wdHkoJHZlcnNpb25EYXRhWydmZWF0dXJlX3ByZXR0eV92ZXJzaW9uJ10pKSB7CiRwYWNrYWdlWyd2ZXJzaW9uJ10gPSAkdmVyc2lvbkRhdGFbJ2ZlYXR1cmVfcHJldHR5X3ZlcnNpb24nXTsKJHRoaXMtPmFkZFBhY2thZ2UoJHRoaXMtPmxvYWRlci0+bG9hZCgkcGFja2FnZSkpOwp9CgokcGFja2FnZVsndmVyc2lvbiddID0gJHZlcnNpb25EYXRhWydwcmV0dHlfdmVyc2lvbiddOwp9IGVsc2UgewokcGFja2FnZVsndmVyc2lvbiddID0gJ2Rldi1tYWluJzsKfQp9Cgp0cnkgewokdGhpcy0+YWRkUGFja2FnZSgkdGhpcy0+bG9hZGVyLT5sb2FkKCRwYWNrYWdlKSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgbG9hZGluZyB0aGUgcGFja2FnZSBpbiAnLiRjb21wb3NlckZpbGVQYXRoLCAwLCAkZSk7Cn0KfQp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0VXJsTWF0Y2hlcygpOiBhcnJheQp7CiRmbGFncyA9IEdMT0JfTUFSSyB8IEdMT0JfT05MWURJUjsKCmlmIChkZWZpbmVkKCdHTE9CX0JSQUNFJykpIHsKJGZsYWdzIHw9IEdMT0JfQlJBQ0U7Cn0gZWxzZWlmIChzdHJwb3MoJHRoaXMtPnVybCwgJ3snKSAhPT0gZmFsc2UgfHwgc3RycG9zKCR0aGlzLT51cmwsICd9JykgIT09IGZhbHNlKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIG9wZXJhdGluZyBzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBHTE9CX0JSQUNFIHdoaWNoIGlzIHJlcXVpcmVkIGZvciB0aGUgdXJsICcuICR0aGlzLT51cmwpOwp9CgoKcmV0dXJuIGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCR2YWwpOiBzdHJpbmcgewpyZXR1cm4gcnRyaW0oc3RyX3JlcGxhY2UoRElSRUNUT1JZX1NFUEFSQVRPUiwgJy8nLCAkdmFsKSwgJy8nKTsKfSwgZ2xvYigkdGhpcy0+dXJsLCAkZmxhZ3MpKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKCgoKCgoKCgoKCgpjbGFzcyBQZWFyUmVwb3NpdG9yeSBleHRlbmRzIEFycmF5UmVwb3NpdG9yeQp7CnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCnsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSBQRUFSIHJlcG9zaXRvcnkgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIENvbXBvc2VyIDIueCcpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7Cgp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMaW5rOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxQbGF0Zm9ybVxIaHZtRGV0ZWN0b3I7CnVzZSBDb21wb3NlclxQbGF0Zm9ybVxSdW50aW1lOwp1c2UgQ29tcG9zZXJcUGxhdGZvcm1cVmVyc2lvbjsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcVXRpbFxTaWxlbmNlcjsKdXNlIENvbXBvc2VyXFhkZWJ1Z0hhbmRsZXJcWGRlYnVnSGFuZGxlcjsKCgoKCmNsYXNzIFBsYXRmb3JtUmVwb3NpdG9yeSBleHRlbmRzIEFycmF5UmVwb3NpdG9yeQp7CgoKCgpwdWJsaWMgY29uc3QgUExBVEZPUk1fUEFDS0FHRV9SRUdFWCA9ICd7Xig/OnBocCg/Oi02NGJpdHwtaXB2NnwtenRzfC1kZWJ1Zyk/fGhodm18KD86ZXh0fGxpYiktW2EtejAtOV0oPzpbXy4tXT9bYS16MC05XSspKnxjb21wb3Nlcig/Oi0oPzpwbHVnaW58cnVudGltZSktYXBpKT8pJH1pRCc7CgoKCgpwcml2YXRlIHN0YXRpYyAkbGFzdFNlZW5QbGF0Zm9ybVBocCA9IG51bGw7CgoKCgpwcml2YXRlICR2ZXJzaW9uUGFyc2VyOwoKCgoKCgoKCnByaXZhdGUgJG92ZXJyaWRlcyA9IFtdOwoKCgoKCgpwcml2YXRlICRkaXNhYmxlZFBhY2thZ2VzID0gW107CgoKcHJpdmF0ZSAkcnVudGltZTsKCnByaXZhdGUgJGhodm1EZXRlY3RvcjsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkcGFja2FnZXMgPSBbXSwgYXJyYXkgJG92ZXJyaWRlcyA9IFtdLCA/UnVudGltZSAkcnVudGltZSA9IG51bGwsID9IaHZtRGV0ZWN0b3IgJGhodm1EZXRlY3RvciA9IG51bGwpCnsKJHRoaXMtPnJ1bnRpbWUgPSAkcnVudGltZSA/OiBuZXcgUnVudGltZSgpOwokdGhpcy0+aGh2bURldGVjdG9yID0gJGhodm1EZXRlY3RvciA/OiBuZXcgSGh2bURldGVjdG9yKCk7CmZvcmVhY2ggKCRvdmVycmlkZXMgYXMgJG5hbWUgPT4gJHZlcnNpb24pIHsKaWYgKCFpc19zdHJpbmcoJHZlcnNpb24pICYmIGZhbHNlICE9PSAkdmVyc2lvbikgeyAKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ2NvbmZpZy5wbGF0Zm9ybS4nLiRuYW1lLicgc2hvdWxkIGJlIGEgc3RyaW5nIG9yIGZhbHNlLCBidXQgZ290ICcuZ2V0X2RlYnVnX3R5cGUoJHZlcnNpb24pLicgJy52YXJfZXhwb3J0KCR2ZXJzaW9uLCB0cnVlKSk7Cn0KaWYgKCRuYW1lID09PSAncGhwJyAmJiAkdmVyc2lvbiA9PT0gZmFsc2UpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ2NvbmZpZy5wbGF0Zm9ybS4nLiRuYW1lLicgY2Fubm90IGJlIHNldCB0byBmYWxzZSBhcyB5b3UgY2Fubm90IGRpc2FibGUgcGhwIGVudGlyZWx5LicpOwp9CiR0aGlzLT5vdmVycmlkZXNbc3RydG9sb3dlcigkbmFtZSldID0gWyduYW1lJyA9PiAkbmFtZSwgJ3ZlcnNpb24nID0+ICR2ZXJzaW9uXTsKfQpwYXJlbnQ6Ol9fY29uc3RydWN0KCRwYWNrYWdlcyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvTmFtZSgpOiBzdHJpbmcKewpyZXR1cm4gJ3BsYXRmb3JtIHJlcG8nOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNQbGF0Zm9ybVBhY2thZ2VEaXNhYmxlZChzdHJpbmcgJG5hbWUpOiBib29sCnsKcmV0dXJuIGlzc2V0KCR0aGlzLT5kaXNhYmxlZFBhY2thZ2VzWyRuYW1lXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXNhYmxlZFBhY2thZ2VzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5kaXNhYmxlZFBhY2thZ2VzOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpOiB2b2lkCnsKcGFyZW50Ojppbml0aWFsaXplKCk7CgokbGlicmFyaWVzID0gW107CgokdGhpcy0+dmVyc2lvblBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyKCk7CgoKCmZvcmVhY2ggKCR0aGlzLT5vdmVycmlkZXMgYXMgJG92ZXJyaWRlKSB7CgppZiAoIXNlbGY6OmlzUGxhdGZvcm1QYWNrYWdlKCRvdmVycmlkZVsnbmFtZSddKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBwbGF0Zm9ybSBwYWNrYWdlIG5hbWUgaW4gY29uZmlnLnBsYXRmb3JtOiAnLiRvdmVycmlkZVsnbmFtZSddKTsKfQoKaWYgKCRvdmVycmlkZVsndmVyc2lvbiddICE9PSBmYWxzZSkgewokdGhpcy0+YWRkT3ZlcnJpZGRlblBhY2thZ2UoJG92ZXJyaWRlKTsKfQp9CgokcHJldHR5VmVyc2lvbiA9IENvbXBvc2VyOjpnZXRWZXJzaW9uKCk7CiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkcHJldHR5VmVyc2lvbik7CiRjb21wb3NlciA9IG5ldyBDb21wbGV0ZVBhY2thZ2UoJ2NvbXBvc2VyJywgJHZlcnNpb24sICRwcmV0dHlWZXJzaW9uKTsKJGNvbXBvc2VyLT5zZXREZXNjcmlwdGlvbignQ29tcG9zZXIgcGFja2FnZScpOwokdGhpcy0+YWRkUGFja2FnZSgkY29tcG9zZXIpOwoKJHByZXR0eVZlcnNpb24gPSBQbHVnaW5JbnRlcmZhY2U6OlBMVUdJTl9BUElfVkVSU0lPTjsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRwcmV0dHlWZXJzaW9uKTsKJGNvbXBvc2VyUGx1Z2luQXBpID0gbmV3IENvbXBsZXRlUGFja2FnZSgnY29tcG9zZXItcGx1Z2luLWFwaScsICR2ZXJzaW9uLCAkcHJldHR5VmVyc2lvbik7CiRjb21wb3NlclBsdWdpbkFwaS0+c2V0RGVzY3JpcHRpb24oJ1RoZSBDb21wb3NlciBQbHVnaW4gQVBJJyk7CiR0aGlzLT5hZGRQYWNrYWdlKCRjb21wb3NlclBsdWdpbkFwaSk7CgokcHJldHR5VmVyc2lvbiA9IENvbXBvc2VyOjpSVU5USU1FX0FQSV9WRVJTSU9OOwokdmVyc2lvbiA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHByZXR0eVZlcnNpb24pOwokY29tcG9zZXJSdW50aW1lQXBpID0gbmV3IENvbXBsZXRlUGFja2FnZSgnY29tcG9zZXItcnVudGltZS1hcGknLCAkdmVyc2lvbiwgJHByZXR0eVZlcnNpb24pOwokY29tcG9zZXJSdW50aW1lQXBpLT5zZXREZXNjcmlwdGlvbignVGhlIENvbXBvc2VyIFJ1bnRpbWUgQVBJJyk7CiR0aGlzLT5hZGRQYWNrYWdlKCRjb21wb3NlclJ1bnRpbWVBcGkpOwoKdHJ5IHsKJHByZXR0eVZlcnNpb24gPSAkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ1BIUF9WRVJTSU9OJyk7CiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkcHJldHR5VmVyc2lvbik7Cn0gY2F0Y2ggKFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24gJGUpIHsKJHByZXR0eVZlcnNpb24gPSBQcmVnOjpyZXBsYWNlKCcjXihbXn4rLV0rKS4qJCMnLCAnJDEnLCAkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ1BIUF9WRVJTSU9OJykpOwokdmVyc2lvbiA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHByZXR0eVZlcnNpb24pOwp9CgokcGhwID0gbmV3IENvbXBsZXRlUGFja2FnZSgncGhwJywgJHZlcnNpb24sICRwcmV0dHlWZXJzaW9uKTsKJHBocC0+c2V0RGVzY3JpcHRpb24oJ1RoZSBQSFAgaW50ZXJwcmV0ZXInKTsKJHRoaXMtPmFkZFBhY2thZ2UoJHBocCk7CgppZiAoJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdQSFBfREVCVUcnKSkgewokcGhwZGVidWcgPSBuZXcgQ29tcGxldGVQYWNrYWdlKCdwaHAtZGVidWcnLCAkdmVyc2lvbiwgJHByZXR0eVZlcnNpb24pOwokcGhwZGVidWctPnNldERlc2NyaXB0aW9uKCdUaGUgUEhQIGludGVycHJldGVyLCB3aXRoIGRlYnVnZ2luZyBzeW1ib2xzJyk7CiR0aGlzLT5hZGRQYWNrYWdlKCRwaHBkZWJ1Zyk7Cn0KCmlmICgkdGhpcy0+cnVudGltZS0+aGFzQ29uc3RhbnQoJ1BIUF9aVFMnKSAmJiAkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ1BIUF9aVFMnKSkgewokcGhwenRzID0gbmV3IENvbXBsZXRlUGFja2FnZSgncGhwLXp0cycsICR2ZXJzaW9uLCAkcHJldHR5VmVyc2lvbik7CiRwaHB6dHMtPnNldERlc2NyaXB0aW9uKCdUaGUgUEhQIGludGVycHJldGVyLCB3aXRoIFplbmQgVGhyZWFkIFNhZmV0eScpOwokdGhpcy0+YWRkUGFja2FnZSgkcGhwenRzKTsKfQoKaWYgKCR0aGlzLT5ydW50aW1lLT5nZXRDb25zdGFudCgnUEhQX0lOVF9TSVpFJykgPT09IDgpIHsKJHBocDY0ID0gbmV3IENvbXBsZXRlUGFja2FnZSgncGhwLTY0Yml0JywgJHZlcnNpb24sICRwcmV0dHlWZXJzaW9uKTsKJHBocDY0LT5zZXREZXNjcmlwdGlvbignVGhlIFBIUCBpbnRlcnByZXRlciwgNjRiaXQnKTsKJHRoaXMtPmFkZFBhY2thZ2UoJHBocDY0KTsKfQoKCgppZiAoJHRoaXMtPnJ1bnRpbWUtPmhhc0NvbnN0YW50KCdBRl9JTkVUNicpIHx8IFNpbGVuY2VyOjpjYWxsKFskdGhpcy0+cnVudGltZSwgJ2ludm9rZSddLCAnaW5ldF9wdG9uJywgWyc6OiddKSAhPT0gZmFsc2UpIHsKJHBocElwdjYgPSBuZXcgQ29tcGxldGVQYWNrYWdlKCdwaHAtaXB2NicsICR2ZXJzaW9uLCAkcHJldHR5VmVyc2lvbik7CiRwaHBJcHY2LT5zZXREZXNjcmlwdGlvbignVGhlIFBIUCBpbnRlcnByZXRlciwgd2l0aCBJUHY2IHN1cHBvcnQnKTsKJHRoaXMtPmFkZFBhY2thZ2UoJHBocElwdjYpOwp9CgokbG9hZGVkRXh0ZW5zaW9ucyA9ICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25zKCk7CgoKZm9yZWFjaCAoJGxvYWRlZEV4dGVuc2lvbnMgYXMgJG5hbWUpIHsKaWYgKGluX2FycmF5KCRuYW1lLCBbJ3N0YW5kYXJkJywgJ0NvcmUnXSkpIHsKY29udGludWU7Cn0KCiR0aGlzLT5hZGRFeHRlbnNpb24oJG5hbWUsICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25WZXJzaW9uKCRuYW1lKSk7Cn0KCgppZiAoIWluX2FycmF5KCd4ZGVidWcnLCAkbG9hZGVkRXh0ZW5zaW9ucywgdHJ1ZSkgJiYgKCRwcmV0dHlWZXJzaW9uID0gWGRlYnVnSGFuZGxlcjo6Z2V0U2tpcHBlZFZlcnNpb24oKSkpIHsKJHRoaXMtPmFkZEV4dGVuc2lvbigneGRlYnVnJywgJHByZXR0eVZlcnNpb24pOwp9CgoKCgpmb3JlYWNoICgkbG9hZGVkRXh0ZW5zaW9ucyBhcyAkbmFtZSkgewpzd2l0Y2ggKCRuYW1lKSB7CmNhc2UgJ2FtcXAnOgokaW5mbyA9ICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25JbmZvKCRuYW1lKTsKCgppZiAoUHJlZzo6aXNNYXRjaCgnL15saWJyYWJiaXRtcSB2ZXJzaW9uID0+ICg/PHZlcnNpb24+LispJC9pbScsICRpbmZvLCAkbGlicmFiYml0bXFNYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLWxpYnJhYmJpdG1xJywgJGxpYnJhYmJpdG1xTWF0Y2hlc1sndmVyc2lvbiddLCAnQU1RUCBsaWJyYWJiaXRtcSB2ZXJzaW9uJyk7Cn0KCgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL15BTVFQIHByb3RvY29sIHZlcnNpb24gPT4gKD88dmVyc2lvbj4uKykkL2ltJywgJGluZm8sICRwcm90b2NvbE1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictcHJvdG9jb2wnLCBzdHJfcmVwbGFjZSgnLScsICcuJywgJHByb3RvY29sTWF0Y2hlc1sndmVyc2lvbiddKSwgJ0FNUVAgcHJvdG9jb2wgdmVyc2lvbicpOwp9CmJyZWFrOwoKY2FzZSAnYnoyJzoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgoKaWYgKFByZWc6OmlzTWF0Y2goJy9eQlppcDIgVmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4qKSwvaW0nLCAkaW5mbywgJG1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLCAkbWF0Y2hlc1sndmVyc2lvbiddKTsKfQpicmVhazsKCmNhc2UgJ2N1cmwnOgokY3VybFZlcnNpb24gPSAkdGhpcy0+cnVudGltZS0+aW52b2tlKCdjdXJsX3ZlcnNpb24nKTsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUsICRjdXJsVmVyc2lvblsndmVyc2lvbiddKTsKCiRpbmZvID0gJHRoaXMtPnJ1bnRpbWUtPmdldEV4dGVuc2lvbkluZm8oJG5hbWUpOwoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XlNTTCBWZXJzaW9uID0+ICg/PGxpYnJhcnk+W14vXSspLyg/PHZlcnNpb24+LispJH1pbScsICRpbmZvLCAkc3NsTWF0Y2hlcykpIHsKJGxpYnJhcnkgPSBzdHJ0b2xvd2VyKCRzc2xNYXRjaGVzWydsaWJyYXJ5J10pOwppZiAoJGxpYnJhcnkgPT09ICdvcGVuc3NsJykgewokcGFyc2VkVmVyc2lvbiA9IFZlcnNpb246OnBhcnNlT3BlbnNzbCgkc3NsTWF0Y2hlc1sndmVyc2lvbiddLCAkaXNGaXBzKTsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUuJy1vcGVuc3NsJy4oJGlzRmlwcyA/ICctZmlwcycgOiAnJyksICRwYXJzZWRWZXJzaW9uLCAnY3VybCBPcGVuU1NMIHZlcnNpb24gKCcuJHBhcnNlZFZlcnNpb24uJyknLCBbXSwgJGlzRmlwcyA/IFsnY3VybC1vcGVuc3NsJ10gOiBbXSk7Cn0gZWxzZSB7CmlmIChzdHJfc3RhcnRzX3dpdGgoJGxpYnJhcnksICcoc2VjdXJldHJhbnNwb3J0KScpICYmIFByZWc6OmlzTWF0Y2goJ3teXChzZWN1cmV0cmFuc3BvcnRcKSAoW2EtejAtOV0rKX0nLCAkbGlicmFyeSwgJHNlY3VyZXRyYW5zcG9ydE1hdGNoZXMpKSB7CiRzaG9ydGxpYiA9ICdzZWN1cmV0cmFuc3BvcnQnOwokc3NsTGliID0gJ2N1cmwtJy4kc2VjdXJldHJhbnNwb3J0TWF0Y2hlc1sxXTsKfSBlbHNlIHsKJHNob3J0bGliID0gJGxpYnJhcnk7CiRzc2xMaWIgPSAnY3VybC1vcGVuc3NsJzsKfQokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLScuJHNob3J0bGliLCAkc3NsTWF0Y2hlc1sndmVyc2lvbiddLCAnY3VybCAnLiRsaWJyYXJ5LicgdmVyc2lvbiAoJy4kc3NsTWF0Y2hlc1sndmVyc2lvbiddLicpJywgWyRzc2xMaWJdKTsKfQp9CgoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3tebGliU1NIIFZlcnNpb24gPT4gKD88bGlicmFyeT5bXi9dKykvKD88dmVyc2lvbj4uKz8pKD86Ly4qKT8kfWltJywgJGluZm8sICRzc2hNYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLScuc3RydG9sb3dlcigkc3NoTWF0Y2hlc1snbGlicmFyeSddKSwgJHNzaE1hdGNoZXNbJ3ZlcnNpb24nXSwgJ2N1cmwgJy4kc3NoTWF0Y2hlc1snbGlicmFyeSddLicgdmVyc2lvbicpOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teWkxpYiBWZXJzaW9uID0+ICg/PHZlcnNpb24+LispJH1pbScsICRpbmZvLCAkemxpYk1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictemxpYicsICR6bGliTWF0Y2hlc1sndmVyc2lvbiddLCAnY3VybCB6bGliIHZlcnNpb24nKTsKfQpicmVhazsKCmNhc2UgJ2RhdGUnOgokaW5mbyA9ICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25JbmZvKCRuYW1lKTsKCgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL150aW1lbGliIHZlcnNpb24gPT4gKD88dmVyc2lvbj4uKykkL2ltJywgJGluZm8sICR0aW1lbGliTWF0Y2hlcykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUuJy10aW1lbGliJywgJHRpbWVsaWJNYXRjaGVzWyd2ZXJzaW9uJ10sICdkYXRlIHRpbWVsaWIgdmVyc2lvbicpOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9eVGltZXpvbmUgRGF0YWJhc2UgPT4gKD88c291cmNlPmludGVybmFsfGV4dGVybmFsKSQvaW0nLCAkaW5mbywgJHpvbmVpbmZvU291cmNlTWF0Y2hlcykpIHsKJGV4dGVybmFsID0gJHpvbmVpbmZvU291cmNlTWF0Y2hlc1snc291cmNlJ10gPT09ICdleHRlcm5hbCc7CmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcvXiJPbHNvbiIgVGltZXpvbmUgRGF0YWJhc2UgVmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4rPykoPzpcLnN5c3RlbSk/JC9pbScsICRpbmZvLCAkem9uZWluZm9NYXRjaGVzKSkgewoKaWYgKCRleHRlcm5hbCAmJiBpbl9hcnJheSgndGltZXpvbmVkYicsICRsb2FkZWRFeHRlbnNpb25zLCB0cnVlKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAndGltZXpvbmVkYi16b25laW5mbycsICR6b25laW5mb01hdGNoZXNbJ3ZlcnNpb24nXSwgJ3pvbmVpbmZvICgiT2xzb24iKSBkYXRhYmFzZSBmb3IgZGF0ZSAocmVwbGFjZWQgYnkgdGltZXpvbmVkYiknLCBbJG5hbWUuJy16b25laW5mbyddKTsKfSBlbHNlIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUuJy16b25laW5mbycsICR6b25laW5mb01hdGNoZXNbJ3ZlcnNpb24nXSwgJ3pvbmVpbmZvICgiT2xzb24iKSBkYXRhYmFzZSBmb3IgZGF0ZScpOwp9Cn0KfQpicmVhazsKCmNhc2UgJ2ZpbGVpbmZvJzoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgoKaWYgKFByZWc6OmlzTWF0Y2goJy9ebGlibWFnaWMgPT4gKD88dmVyc2lvbj4uKykkL2ltJywgJGluZm8sICRtYWdpY01hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictbGlibWFnaWMnLCAkbWFnaWNNYXRjaGVzWyd2ZXJzaW9uJ10sICdmaWxlaW5mbyBsaWJtYWdpYyB2ZXJzaW9uJyk7Cn0KYnJlYWs7CgpjYXNlICdnZCc6CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLCAkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ0dEX1ZFUlNJT04nKSk7CgokaW5mbyA9ICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25JbmZvKCRuYW1lKTsKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcvXmxpYkpQRUcgVmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4rPykoPzogY29tcGF0aWJsZSk/JC9pbScsICRpbmZvLCAkbGlianBlZ01hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictbGlianBlZycsIFZlcnNpb246OnBhcnNlTGlianBlZygkbGlianBlZ01hdGNoZXNbJ3ZlcnNpb24nXSksICdsaWJqcGVnIHZlcnNpb24gZm9yIGdkJyk7Cn0KCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcvXmxpYlBORyBWZXJzaW9uID0+ICg/PHZlcnNpb24+LispJC9pbScsICRpbmZvLCAkbGlicG5nTWF0Y2hlcykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUuJy1saWJwbmcnLCAkbGlicG5nTWF0Y2hlc1sndmVyc2lvbiddLCAnbGlicG5nIHZlcnNpb24gZm9yIGdkJyk7Cn0KCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcvXkZyZWVUeXBlIFZlcnNpb24gPT4gKD88dmVyc2lvbj4uKykkL2ltJywgJGluZm8sICRmcmVldHlwZU1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictZnJlZXR5cGUnLCAkZnJlZXR5cGVNYXRjaGVzWyd2ZXJzaW9uJ10sICdmcmVldHlwZSB2ZXJzaW9uIGZvciBnZCcpOwp9CgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL15saWJYcG0gVmVyc2lvbiA9PiAoPzx2ZXJzaW9uSWQ+XGQrKSQvaW0nLCAkaW5mbywgJGxpYnhwbU1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictbGlieHBtJywgVmVyc2lvbjo6Y29udmVydExpYnhwbVZlcnNpb25JZCgoaW50KSAkbGlieHBtTWF0Y2hlc1sndmVyc2lvbklkJ10pLCAnbGlieHBtIHZlcnNpb24gZm9yIGdkJyk7Cn0KCmJyZWFrOwoKY2FzZSAnZ21wJzoKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUsICR0aGlzLT5ydW50aW1lLT5nZXRDb25zdGFudCgnR01QX1ZFUlNJT04nKSk7CmJyZWFrOwoKY2FzZSAnaWNvbnYnOgokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZSwgJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdJQ09OVl9WRVJTSU9OJykpOwpicmVhazsKCmNhc2UgJ2ludGwnOgokaW5mbyA9ICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25JbmZvKCRuYW1lKTsKCiRkZXNjcmlwdGlvbiA9ICdUaGUgSUNVIHVuaWNvZGUgYW5kIGdsb2JhbGl6YXRpb24gc3VwcG9ydCBsaWJyYXJ5JzsKCmlmICgkdGhpcy0+cnVudGltZS0+aGFzQ29uc3RhbnQoJ0lOVExfSUNVX1ZFUlNJT04nKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAnaWN1JywgJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdJTlRMX0lDVV9WRVJTSU9OJyksICRkZXNjcmlwdGlvbik7Cn0gZWxzZWlmIChQcmVnOjppc01hdGNoKCcvXklDVSB2ZXJzaW9uID0+ICg/PHZlcnNpb24+LispJC9pbScsICRpbmZvLCAkbWF0Y2hlcykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJ2ljdScsICRtYXRjaGVzWyd2ZXJzaW9uJ10sICRkZXNjcmlwdGlvbik7Cn0KCgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL15JQ1UgVFpEYXRhIHZlcnNpb24gPT4gKD88dmVyc2lvbj4uKikkL2ltJywgJGluZm8sICR6b25laW5mb01hdGNoZXMpICYmIG51bGwgIT09ICgkdmVyc2lvbiA9IFZlcnNpb246OnBhcnNlWm9uZWluZm9WZXJzaW9uKCR6b25laW5mb01hdGNoZXNbJ3ZlcnNpb24nXSkpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICdpY3Utem9uZWluZm8nLCAkdmVyc2lvbiwgJ3pvbmVpbmZvICgiT2xzb24iKSBkYXRhYmFzZSBmb3IgaWN1Jyk7Cn0KCgppZiAoJHRoaXMtPnJ1bnRpbWUtPmhhc0NsYXNzKCdSZXNvdXJjZUJ1bmRsZScpKSB7CiRyZXNvdXJjZUJ1bmRsZSA9ICR0aGlzLT5ydW50aW1lLT5pbnZva2UoWydSZXNvdXJjZUJ1bmRsZScsICdjcmVhdGUnXSwgWydyb290JywgJ0lDVURBVEEnLCBmYWxzZV0pOwppZiAoJHJlc291cmNlQnVuZGxlICE9PSBudWxsKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICdpY3UtY2xkcicsICRyZXNvdXJjZUJ1bmRsZS0+Z2V0KCdWZXJzaW9uJyksICdJQ1UgQ0xEUiBwcm9qZWN0IHZlcnNpb24nKTsKfQp9CgppZiAoJHRoaXMtPnJ1bnRpbWUtPmhhc0NsYXNzKCdJbnRsQ2hhcicpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICdpY3UtdW5pY29kZScsIGltcGxvZGUoJy4nLCBhcnJheV9zbGljZSgkdGhpcy0+cnVudGltZS0+aW52b2tlKFsnSW50bENoYXInLCAnZ2V0VW5pY29kZVZlcnNpb24nXSksIDAsIDMpKSwgJ0lDVSB1bmljb2RlIHZlcnNpb24nKTsKfQpicmVhazsKCmNhc2UgJ2ltYWdpY2snOgoKJGltYWdlTWFnaWNrVmVyc2lvbiA9ICR0aGlzLT5ydW50aW1lLT5jb25zdHJ1Y3QoJ0ltYWdpY2snKS0+Z2V0VmVyc2lvbigpOwoKCmlmIChQcmVnOjppc01hdGNoKCcvXkltYWdlTWFnaWNrICg/PHZlcnNpb24+W1xkLl0rKSg/Oi0oPzxwYXRjaD5cZCspKT8vJywgJGltYWdlTWFnaWNrVmVyc2lvblsndmVyc2lvblN0cmluZyddLCAkbWF0Y2hlcykpIHsKJHZlcnNpb24gPSAkbWF0Y2hlc1sndmVyc2lvbiddOwppZiAoaXNzZXQoJG1hdGNoZXNbJ3BhdGNoJ10pKSB7CiR2ZXJzaW9uIC49ICcuJy4kbWF0Y2hlc1sncGF0Y2gnXTsKfQoKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUuJy1pbWFnZW1hZ2ljaycsICR2ZXJzaW9uLCBudWxsLCBbJ2ltYWdpY2snXSk7Cn0KYnJlYWs7CgpjYXNlICdsZGFwJzoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL15WZW5kb3IgVmVyc2lvbiA9PiAoPzx2ZXJzaW9uSWQ+XGQrKSQvaW0nLCAkaW5mbywgJG1hdGNoZXMpICYmIFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9eVmVuZG9yIE5hbWUgPT4gKD88dmVuZG9yPi4rKSQvaW0nLCAkaW5mbywgJHZlbmRvck1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictJy5zdHJ0b2xvd2VyKCR2ZW5kb3JNYXRjaGVzWyd2ZW5kb3InXSksIFZlcnNpb246OmNvbnZlcnRPcGVubGRhcFZlcnNpb25JZCgoaW50KSAkbWF0Y2hlc1sndmVyc2lvbklkJ10pLCAkdmVuZG9yTWF0Y2hlc1sndmVuZG9yJ10uJyB2ZXJzaW9uIG9mIGxkYXAnKTsKfQpicmVhazsKCmNhc2UgJ2xpYnhtbCc6CgokbGlieG1sUHJvdmlkZXMgPSBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkZXh0ZW5zaW9uKTogc3RyaW5nIHsKcmV0dXJuICRleHRlbnNpb24gLiAnLWxpYnhtbCc7Cn0sIGFycmF5X2ludGVyc2VjdCgkbG9hZGVkRXh0ZW5zaW9ucywgWydkb20nLCAnc2ltcGxleG1sJywgJ3htbCcsICd4bWxyZWFkZXInLCAneG1sd3JpdGVyJ10pKTsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUsICR0aGlzLT5ydW50aW1lLT5nZXRDb25zdGFudCgnTElCWE1MX0RPVFRFRF9WRVJTSU9OJyksICdsaWJ4bWwgbGlicmFyeSB2ZXJzaW9uJywgW10sICRsaWJ4bWxQcm92aWRlcyk7CgpicmVhazsKCmNhc2UgJ21ic3RyaW5nJzoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgoKaWYgKFByZWc6OmlzTWF0Y2goJy9ebGlibWJmbCB2ZXJzaW9uID0+ICg/PHZlcnNpb24+LispJC9pbScsICRpbmZvLCAkbGlibWJmbE1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictbGlibWJmbCcsICRsaWJtYmZsTWF0Y2hlc1sndmVyc2lvbiddLCAnbWJzdHJpbmcgbGlibWJmbCB2ZXJzaW9uJyk7Cn0KCmlmICgkdGhpcy0+cnVudGltZS0+aGFzQ29uc3RhbnQoJ01CX09OSUdVUlVNQV9WRVJTSU9OJykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUuJy1vbmlndXJ1bWEnLCAkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ01CX09OSUdVUlVNQV9WRVJTSU9OJyksICdtYnN0cmluZyBvbmlndXJ1bWEgdmVyc2lvbicpOwoKCgp9IGVsc2VpZiAoUHJlZzo6aXNNYXRjaCgnL14oPzpvbmlndXJ1bWF8TXVsdGlieXRlIHJlZ2V4IFwob25pZ3VydW1hXCkpIHZlcnNpb24gPT4gKD88dmVyc2lvbj4uKykkL2ltJywgJGluZm8sICRvbmlndXJ1bWFNYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLW9uaWd1cnVtYScsICRvbmlndXJ1bWFNYXRjaGVzWyd2ZXJzaW9uJ10sICdtYnN0cmluZyBvbmlndXJ1bWEgdmVyc2lvbicpOwp9CgpicmVhazsKCmNhc2UgJ21lbWNhY2hlZCc6CiRpbmZvID0gJHRoaXMtPnJ1bnRpbWUtPmdldEV4dGVuc2lvbkluZm8oJG5hbWUpOwoKCmlmIChQcmVnOjppc01hdGNoKCcvXmxpYm1lbWNhY2hlZCB2ZXJzaW9uID0+ICg/PHZlcnNpb24+LispJC9pbScsICRpbmZvLCAkbWF0Y2hlcykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUuJy1saWJtZW1jYWNoZWQnLCAkbWF0Y2hlc1sndmVyc2lvbiddLCAnbGlibWVtY2FjaGVkIHZlcnNpb24nKTsKfQpicmVhazsKCmNhc2UgJ29wZW5zc2wnOgoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teKD86T3BlblNTTHxMaWJyZVNTTCk/XHMqKD88dmVyc2lvbj5cUyspfWknLCAkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ09QRU5TU0xfVkVSU0lPTl9URVhUJyksICRtYXRjaGVzKSkgewokcGFyc2VkVmVyc2lvbiA9IFZlcnNpb246OnBhcnNlT3BlbnNzbCgkbWF0Y2hlc1sndmVyc2lvbiddLCAkaXNGaXBzKTsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUuKCRpc0ZpcHMgPyAnLWZpcHMnIDogJycpLCAkcGFyc2VkVmVyc2lvbiwgJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdPUEVOU1NMX1ZFUlNJT05fVEVYVCcpLCBbXSwgJGlzRmlwcyA/IFskbmFtZV0gOiBbXSk7Cn0KYnJlYWs7CgpjYXNlICdwY3JlJzoKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUsIFByZWc6OnJlcGxhY2UoJ3teKFxTKykuKn0nLCAnJDEnLCAkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ1BDUkVfVkVSU0lPTicpKSk7CgokaW5mbyA9ICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25JbmZvKCRuYW1lKTsKCgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL15QQ1JFIFVuaWNvZGUgVmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4rKSQvaW0nLCAkaW5mbywgJHBjcmVVbmljb2RlTWF0Y2hlcykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUuJy11bmljb2RlJywgJHBjcmVVbmljb2RlTWF0Y2hlc1sndmVyc2lvbiddLCAnUENSRSBVbmljb2RlIHZlcnNpb24gc3VwcG9ydCcpOwp9CgpicmVhazsKCmNhc2UgJ215c3FsbmQnOgpjYXNlICdwZG9fbXlzcWwnOgokaW5mbyA9ICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25JbmZvKCRuYW1lKTsKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcvXig/OkNsaWVudCBBUEkgdmVyc2lvbnxWZXJzaW9uKSA9PiBteXNxbG5kICg/PHZlcnNpb24+Lis/KSAvbWknLCAkaW5mbywgJG1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictbXlzcWxuZCcsICRtYXRjaGVzWyd2ZXJzaW9uJ10sICdteXNxbG5kIGxpYnJhcnkgdmVyc2lvbiBmb3IgJy4kbmFtZSk7Cn0KYnJlYWs7CgpjYXNlICdtb25nb2RiJzoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL15saWJtb25nb2MgYnVuZGxlZCB2ZXJzaW9uID0+ICg/PHZlcnNpb24+LispJC9pbScsICRpbmZvLCAkbGlibW9uZ29jTWF0Y2hlcykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUuJy1saWJtb25nb2MnLCAkbGlibW9uZ29jTWF0Y2hlc1sndmVyc2lvbiddLCAnbGlibW9uZ29jIHZlcnNpb24gb2YgbW9uZ29kYicpOwp9CgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL15saWJic29uIGJ1bmRsZWQgdmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4rKSQvaW0nLCAkaW5mbywgJGxpYmJzb25NYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLWxpYmJzb24nLCAkbGliYnNvbk1hdGNoZXNbJ3ZlcnNpb24nXSwgJ2xpYmJzb24gdmVyc2lvbiBvZiBtb25nb2RiJyk7Cn0KYnJlYWs7CgpjYXNlICdwZ3NxbCc6CmlmICgkdGhpcy0+cnVudGltZS0+aGFzQ29uc3RhbnQoJ1BHU1FMX0xJQlBRX1ZFUlNJT04nKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAncGdzcWwtbGlicHEnLCAkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ1BHU1FMX0xJQlBRX1ZFUlNJT04nKSwgJ2xpYnBxIGZvciBwZ3NxbCcpOwpicmVhazsKfQoKCmNhc2UgJ3Bkb19wZ3NxbCc6CiRpbmZvID0gJHRoaXMtPnJ1bnRpbWUtPmdldEV4dGVuc2lvbkluZm8oJG5hbWUpOwoKaWYgKFByZWc6OmlzTWF0Y2goJy9eUG9zdGdyZVNRTFwobGlicHFcKSBWZXJzaW9uID0+ICg/PHZlcnNpb24+LiopJC9pbScsICRpbmZvLCAkbWF0Y2hlcykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUuJy1saWJwcScsICRtYXRjaGVzWyd2ZXJzaW9uJ10sICdsaWJwcSBmb3IgJy4kbmFtZSk7Cn0KYnJlYWs7CgpjYXNlICdwcSc6CiRpbmZvID0gJHRoaXMtPnJ1bnRpbWUtPmdldEV4dGVuc2lvbkluZm8oJG5hbWUpOwoKCgppZiAoUHJlZzo6aXNNYXRjaCgnL15saWJwcSA9PiAoPzxjb21waWxlZD4uKykgPT4gKD88bGlua2VkPi4rKSQvaW0nLCAkaW5mbywgJG1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictbGlicHEnLCAkbWF0Y2hlc1snbGlua2VkJ10sICdsaWJwcSBmb3IgJy4kbmFtZSk7Cn0KYnJlYWs7CgpjYXNlICdyZGthZmthJzoKaWYgKCR0aGlzLT5ydW50aW1lLT5oYXNDb25zdGFudCgnUkRfS0FGS0FfVkVSU0lPTicpKSB7CgoKCgoKCgoKCiRsaWJSZEthZmthVmVyc2lvbkludCA9ICR0aGlzLT5ydW50aW1lLT5nZXRDb25zdGFudCgnUkRfS0FGS0FfVkVSU0lPTicpOwokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLWxpYnJka2Fma2EnLCBzcHJpbnRmKCclZC4lZC4lZCcsICgkbGliUmRLYWZrYVZlcnNpb25JbnQgJiAweDdGMDAwMDAwKSA+PiAyNCwgKCRsaWJSZEthZmthVmVyc2lvbkludCAmIDB4MDBGRjAwMDApID4+IDE2LCAoJGxpYlJkS2Fma2FWZXJzaW9uSW50ICYgMHgwMDAwRkYwMCkgPj4gOCksICdsaWJyZGthZmthIGZvciAnLiRuYW1lKTsKfQpicmVhazsKCmNhc2UgJ2xpYnNvZGl1bSc6CmNhc2UgJ3NvZGl1bSc6CmlmICgkdGhpcy0+cnVudGltZS0+aGFzQ29uc3RhbnQoJ1NPRElVTV9MSUJSQVJZX1ZFUlNJT04nKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAnbGlic29kaXVtJywgJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdTT0RJVU1fTElCUkFSWV9WRVJTSU9OJykpOwokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAnbGlic29kaXVtJywgJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdTT0RJVU1fTElCUkFSWV9WRVJTSU9OJykpOwp9CmJyZWFrOwoKY2FzZSAnc3FsaXRlMyc6CmNhc2UgJ3Bkb19zcWxpdGUnOgokaW5mbyA9ICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25JbmZvKCRuYW1lKTsKCmlmIChQcmVnOjppc01hdGNoKCcvXlNRTGl0ZSBMaWJyYXJ5ID0+ICg/PHZlcnNpb24+LispJC9pbScsICRpbmZvLCAkbWF0Y2hlcykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUuJy1zcWxpdGUnLCAkbWF0Y2hlc1sndmVyc2lvbiddKTsKfQpicmVhazsKCmNhc2UgJ3NzaDInOgokaW5mbyA9ICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25JbmZvKCRuYW1lKTsKCmlmIChQcmVnOjppc01hdGNoKCcvXmxpYnNzaDIgdmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4rKSQvaW0nLCAkaW5mbywgJG1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictbGlic3NoMicsICRtYXRjaGVzWyd2ZXJzaW9uJ10pOwp9CmJyZWFrOwoKY2FzZSAneHNsJzoKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJ2xpYnhzbHQnLCAkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ0xJQlhTTFRfRE9UVEVEX1ZFUlNJT04nKSwgbnVsbCwgWyd4c2wnXSk7CgokaW5mbyA9ICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25JbmZvKCd4c2wnKTsKaWYgKFByZWc6OmlzTWF0Y2goJy9ebGlieHNsdCBjb21waWxlZCBhZ2FpbnN0IGxpYnhtbCBWZXJzaW9uID0+ICg/PHZlcnNpb24+LispJC9pbScsICRpbmZvLCAkbWF0Y2hlcykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJ2xpYnhzbHQtbGlieG1sJywgJG1hdGNoZXNbJ3ZlcnNpb24nXSwgJ2xpYnhtbCB2ZXJzaW9uIGxpYnhzbHQgaXMgY29tcGlsZWQgYWdhaW5zdCcpOwp9CmJyZWFrOwoKY2FzZSAneWFtbCc6CiRpbmZvID0gJHRoaXMtPnJ1bnRpbWUtPmdldEV4dGVuc2lvbkluZm8oJ3lhbWwnKTsKCmlmIChQcmVnOjppc01hdGNoKCcvXkxpYllBTUwgVmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4rKSQvaW0nLCAkaW5mbywgJG1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictbGlieWFtbCcsICRtYXRjaGVzWyd2ZXJzaW9uJ10sICdsaWJ5YW1sIHZlcnNpb24gb2YgeWFtbCcpOwp9CmJyZWFrOwoKY2FzZSAnemlwJzoKaWYgKCR0aGlzLT5ydW50aW1lLT5oYXNDb25zdGFudCgnTElCWklQX1ZFUlNJT04nLCAnWmlwQXJjaGl2ZScpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictbGliemlwJywgJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdMSUJaSVBfVkVSU0lPTicsICdaaXBBcmNoaXZlJyksIG51bGwsIFsnemlwJ10pOwp9CmJyZWFrOwoKY2FzZSAnemxpYic6CmlmICgkdGhpcy0+cnVudGltZS0+aGFzQ29uc3RhbnQoJ1pMSUJfVkVSU0lPTicpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLCAkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ1pMSUJfVkVSU0lPTicpKTsKCgp9IGVsc2VpZiAoUHJlZzo6aXNNYXRjaCgnL15MaW5rZWQgVmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4rKSQvaW0nLCAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSksICRtYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZSwgJG1hdGNoZXNbJ3ZlcnNpb24nXSk7Cn0KYnJlYWs7CgpkZWZhdWx0OgpicmVhazsKfQp9CgokaGh2bVZlcnNpb24gPSAkdGhpcy0+aGh2bURldGVjdG9yLT5nZXRWZXJzaW9uKCk7CmlmICgkaGh2bVZlcnNpb24pIHsKdHJ5IHsKJHByZXR0eVZlcnNpb24gPSAkaGh2bVZlcnNpb247CiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkcHJldHR5VmVyc2lvbik7Cn0gY2F0Y2ggKFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24gJGUpIHsKJHByZXR0eVZlcnNpb24gPSBQcmVnOjpyZXBsYWNlKCcjXihbXn4rLV0rKS4qJCMnLCAnJDEnLCAkaGh2bVZlcnNpb24pOwokdmVyc2lvbiA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHByZXR0eVZlcnNpb24pOwp9CgokaGh2bSA9IG5ldyBDb21wbGV0ZVBhY2thZ2UoJ2hodm0nLCAkdmVyc2lvbiwgJHByZXR0eVZlcnNpb24pOwokaGh2bS0+c2V0RGVzY3JpcHRpb24oJ1RoZSBISFZNIFJ1bnRpbWUgKDY0Yml0KScpOwokdGhpcy0+YWRkUGFja2FnZSgkaGh2bSk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFBhY2thZ2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IHZvaWQKewppZiAoISRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdFeHBlY3RlZCBDb21wbGV0ZVBhY2thZ2UgYnV0IGdvdCAnLmdldF9jbGFzcygkcGFja2FnZSkpOwp9CgoKaWYgKGlzc2V0KCR0aGlzLT5vdmVycmlkZXNbJHBhY2thZ2UtPmdldE5hbWUoKV0pKSB7CmlmICgkdGhpcy0+b3ZlcnJpZGVzWyRwYWNrYWdlLT5nZXROYW1lKCldWyd2ZXJzaW9uJ10gPT09IGZhbHNlKSB7CiR0aGlzLT5hZGREaXNhYmxlZFBhY2thZ2UoJHBhY2thZ2UpOwoKcmV0dXJuOwp9Cgokb3ZlcnJpZGVyID0gJHRoaXMtPmZpbmRQYWNrYWdlKCRwYWNrYWdlLT5nZXROYW1lKCksICcqJyk7CmlmICgkcGFja2FnZS0+Z2V0VmVyc2lvbigpID09PSAkb3ZlcnJpZGVyLT5nZXRWZXJzaW9uKCkpIHsKJGFjdHVhbFRleHQgPSAnc2FtZSBhcyBhY3R1YWwnOwp9IGVsc2UgewokYWN0dWFsVGV4dCA9ICdhY3R1YWw6ICcuJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKfQppZiAoJG92ZXJyaWRlciBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSkgewokb3ZlcnJpZGVyLT5zZXREZXNjcmlwdGlvbigkb3ZlcnJpZGVyLT5nZXREZXNjcmlwdGlvbigpLicsICcuJGFjdHVhbFRleHQpOwp9CgpyZXR1cm47Cn0KCgppZiAoaXNzZXQoJHRoaXMtPm92ZXJyaWRlc1sncGhwJ10pICYmIDAgPT09IHN0cnBvcygkcGFja2FnZS0+Z2V0TmFtZSgpLCAncGhwLScpKSB7CiRvdmVycmlkZXIgPSAkdGhpcy0+YWRkT3ZlcnJpZGRlblBhY2thZ2UoJHRoaXMtPm92ZXJyaWRlc1sncGhwJ10sICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkpOwppZiAoJHBhY2thZ2UtPmdldFZlcnNpb24oKSA9PT0gJG92ZXJyaWRlci0+Z2V0VmVyc2lvbigpKSB7CiRhY3R1YWxUZXh0ID0gJ3NhbWUgYXMgYWN0dWFsJzsKfSBlbHNlIHsKJGFjdHVhbFRleHQgPSAnYWN0dWFsOiAnLiRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCk7Cn0KJG92ZXJyaWRlci0+c2V0RGVzY3JpcHRpb24oJG92ZXJyaWRlci0+Z2V0RGVzY3JpcHRpb24oKS4nLCAnLiRhY3R1YWxUZXh0KTsKCnJldHVybjsKfQoKcGFyZW50OjphZGRQYWNrYWdlKCRwYWNrYWdlKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBhZGRPdmVycmlkZGVuUGFja2FnZShhcnJheSAkb3ZlcnJpZGUsID9zdHJpbmcgJG5hbWUgPSBudWxsKTogQ29tcGxldGVQYWNrYWdlCnsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRvdmVycmlkZVsndmVyc2lvbiddKTsKJHBhY2thZ2UgPSBuZXcgQ29tcGxldGVQYWNrYWdlKCRuYW1lID86ICRvdmVycmlkZVsnbmFtZSddLCAkdmVyc2lvbiwgJG92ZXJyaWRlWyd2ZXJzaW9uJ10pOwokcGFja2FnZS0+c2V0RGVzY3JpcHRpb24oJ1BhY2thZ2Ugb3ZlcnJpZGRlbiB2aWEgY29uZmlnLnBsYXRmb3JtJyk7CiRwYWNrYWdlLT5zZXRFeHRyYShbJ2NvbmZpZy5wbGF0Zm9ybScgPT4gdHJ1ZV0pOwpwYXJlbnQ6OmFkZFBhY2thZ2UoJHBhY2thZ2UpOwoKaWYgKCRwYWNrYWdlLT5nZXROYW1lKCkgPT09ICdwaHAnKSB7CnNlbGY6OiRsYXN0U2VlblBsYXRmb3JtUGhwID0gaW1wbG9kZSgnLicsIGFycmF5X3NsaWNlKGV4cGxvZGUoJy4nLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKSwgMCwgMykpOwp9CgpyZXR1cm4gJHBhY2thZ2U7Cn0KCnByaXZhdGUgZnVuY3Rpb24gYWRkRGlzYWJsZWRQYWNrYWdlKENvbXBsZXRlUGFja2FnZSAkcGFja2FnZSk6IHZvaWQKewokcGFja2FnZS0+c2V0RGVzY3JpcHRpb24oJHBhY2thZ2UtPmdldERlc2NyaXB0aW9uKCkuJy4gPHdhcm5pbmc+UGFja2FnZSBkaXNhYmxlZCB2aWEgY29uZmlnLnBsYXRmb3JtPC93YXJuaW5nPicpOwokcGFja2FnZS0+c2V0RXh0cmEoWydjb25maWcucGxhdGZvcm0nID0+IHRydWVdKTsKCiR0aGlzLT5kaXNhYmxlZFBhY2thZ2VzWyRwYWNrYWdlLT5nZXROYW1lKCldID0gJHBhY2thZ2U7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gYWRkRXh0ZW5zaW9uKHN0cmluZyAkbmFtZSwgc3RyaW5nICRwcmV0dHlWZXJzaW9uKTogdm9pZAp7CiRleHRyYURlc2NyaXB0aW9uID0gbnVsbDsKCnRyeSB7CiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkcHJldHR5VmVyc2lvbik7Cn0gY2F0Y2ggKFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24gJGUpIHsKJGV4dHJhRGVzY3JpcHRpb24gPSAnIChhY3R1YWwgdmVyc2lvbjogJy4kcHJldHR5VmVyc2lvbi4nKSc7CmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XihcZCtcLlxkK1wuXGQrKD86XC5cZCspPyl9JywgJHByZXR0eVZlcnNpb24sICRtYXRjaCkpIHsKJHByZXR0eVZlcnNpb24gPSAkbWF0Y2hbMV07Cn0gZWxzZSB7CiRwcmV0dHlWZXJzaW9uID0gJzAnOwp9CiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkcHJldHR5VmVyc2lvbik7Cn0KCiRwYWNrYWdlTmFtZSA9ICR0aGlzLT5idWlsZFBhY2thZ2VOYW1lKCRuYW1lKTsKJGV4dCA9IG5ldyBDb21wbGV0ZVBhY2thZ2UoJHBhY2thZ2VOYW1lLCAkdmVyc2lvbiwgJHByZXR0eVZlcnNpb24pOwokZXh0LT5zZXREZXNjcmlwdGlvbignVGhlICcuJG5hbWUuJyBQSFAgZXh0ZW5zaW9uJy4kZXh0cmFEZXNjcmlwdGlvbik7CiRleHQtPnNldFR5cGUoJ3BocC1leHQnKTsKCmlmICgkbmFtZSA9PT0gJ3V1aWQnKSB7CiRleHQtPnNldFJlcGxhY2VzKFsKJ2xpYi11dWlkJyA9PiBuZXcgTGluaygnZXh0LXV1aWQnLCAnbGliLXV1aWQnLCBuZXcgQ29uc3RyYWludCgnPScsICR2ZXJzaW9uKSwgTGluazo6VFlQRV9SRVBMQUNFLCAkZXh0LT5nZXRQcmV0dHlWZXJzaW9uKCkpLApdKTsKfQoKJHRoaXMtPmFkZFBhY2thZ2UoJGV4dCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gYnVpbGRQYWNrYWdlTmFtZShzdHJpbmcgJG5hbWUpOiBzdHJpbmcKewpyZXR1cm4gJ2V4dC0nIC4gc3RyX3JlcGxhY2UoJyAnLCAnLScsIHN0cnRvbG93ZXIoJG5hbWUpKTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFkZExpYnJhcnkoYXJyYXkgJiRsaWJyYXJpZXMsIHN0cmluZyAkbmFtZSwgP3N0cmluZyAkcHJldHR5VmVyc2lvbiwgP3N0cmluZyAkZGVzY3JpcHRpb24gPSBudWxsLCBhcnJheSAkcmVwbGFjZXMgPSBbXSwgYXJyYXkgJHByb3ZpZGVzID0gW10pOiB2b2lkCnsKaWYgKG51bGwgPT09ICRwcmV0dHlWZXJzaW9uKSB7CnJldHVybjsKfQp0cnkgewokdmVyc2lvbiA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHByZXR0eVZlcnNpb24pOwp9IGNhdGNoIChcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uICRlKSB7CnJldHVybjsKfQoKCgppZiAoaXNzZXQoJGxpYnJhcmllc1snbGliLScuJG5hbWVdKSkgewpyZXR1cm47Cn0KJGxpYnJhcmllc1snbGliLScuJG5hbWVdID0gdHJ1ZTsKCmlmICgkZGVzY3JpcHRpb24gPT09IG51bGwpIHsKJGRlc2NyaXB0aW9uID0gJ1RoZSAnLiRuYW1lLicgbGlicmFyeSc7Cn0KCiRsaWIgPSBuZXcgQ29tcGxldGVQYWNrYWdlKCdsaWItJy4kbmFtZSwgJHZlcnNpb24sICRwcmV0dHlWZXJzaW9uKTsKJGxpYi0+c2V0RGVzY3JpcHRpb24oJGRlc2NyaXB0aW9uKTsKCiRyZXBsYWNlTGlua3MgPSBbXTsKZm9yZWFjaCAoJHJlcGxhY2VzIGFzICRyZXBsYWNlKSB7CiRyZXBsYWNlID0gc3RydG9sb3dlcigkcmVwbGFjZSk7CiRyZXBsYWNlTGlua3NbJHJlcGxhY2VdID0gbmV3IExpbmsoJ2xpYi0nLiRuYW1lLCAnbGliLScuJHJlcGxhY2UsIG5ldyBDb25zdHJhaW50KCc9JywgJHZlcnNpb24pLCBMaW5rOjpUWVBFX1JFUExBQ0UsICRsaWItPmdldFByZXR0eVZlcnNpb24oKSk7Cn0KJHByb3ZpZGVMaW5rcyA9IFtdOwpmb3JlYWNoICgkcHJvdmlkZXMgYXMgJHByb3ZpZGUpIHsKJHByb3ZpZGUgPSBzdHJ0b2xvd2VyKCRwcm92aWRlKTsKJHByb3ZpZGVMaW5rc1skcHJvdmlkZV0gPSBuZXcgTGluaygnbGliLScuJG5hbWUsICdsaWItJy4kcHJvdmlkZSwgbmV3IENvbnN0cmFpbnQoJz0nLCAkdmVyc2lvbiksIExpbms6OlRZUEVfUFJPVklERSwgJGxpYi0+Z2V0UHJldHR5VmVyc2lvbigpKTsKfQokbGliLT5zZXRSZXBsYWNlcygkcmVwbGFjZUxpbmtzKTsKJGxpYi0+c2V0UHJvdmlkZXMoJHByb3ZpZGVMaW5rcyk7CgokdGhpcy0+YWRkUGFja2FnZSgkbGliKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1BsYXRmb3JtUGFja2FnZShzdHJpbmcgJG5hbWUpOiBib29sCnsKc3RhdGljICRjYWNoZSA9IFtdOwoKaWYgKGlzc2V0KCRjYWNoZVskbmFtZV0pKSB7CnJldHVybiAkY2FjaGVbJG5hbWVdOwp9CgpyZXR1cm4gJGNhY2hlWyRuYW1lXSA9IFByZWc6OmlzTWF0Y2goUGxhdGZvcm1SZXBvc2l0b3J5OjpQTEFURk9STV9QQUNLQUdFX1JFR0VYLCAkbmFtZSk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UGxhdGZvcm1QaHBWZXJzaW9uKCk6ID9zdHJpbmcKewpyZXR1cm4gc2VsZjo6JGxhc3RTZWVuUGxhdGZvcm1QaHA7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZWFyY2goc3RyaW5nICRxdWVyeSwgaW50ICRtb2RlID0gMCwgP3N0cmluZyAkdHlwZSA9IG51bGwpOiBhcnJheQp7CgppZiAoJG1vZGUgPT09IHNlbGY6OlNFQVJDSF9WRU5ET1IpIHsKcmV0dXJuIFtdOwp9CgpyZXR1cm4gcGFyZW50OjpzZWFyY2goJHF1ZXJ5LCAkbW9kZSwgJHR5cGUpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7Cgp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50RGlzcGF0Y2hlcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CgoKCgpjbGFzcyBSZXBvc2l0b3J5RmFjdG9yeQp7CgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY29uZmlnRnJvbVN0cmluZyhJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBzdHJpbmcgJHJlcG9zaXRvcnksIGJvb2wgJGFsbG93RmlsZXN5c3RlbSA9IGZhbHNlKQp7CmlmICgwID09PSBzdHJwb3MoJHJlcG9zaXRvcnksICdodHRwJykpIHsKJHJlcG9Db25maWcgPSBbJ3R5cGUnID0+ICdjb21wb3NlcicsICd1cmwnID0+ICRyZXBvc2l0b3J5XTsKfSBlbHNlaWYgKCJqc29uIiA9PT0gcGF0aGluZm8oJHJlcG9zaXRvcnksIFBBVEhJTkZPX0VYVEVOU0lPTikpIHsKJGpzb24gPSBuZXcgSnNvbkZpbGUoJHJlcG9zaXRvcnksIEZhY3Rvcnk6OmNyZWF0ZUh0dHBEb3dubG9hZGVyKCRpbywgJGNvbmZpZykpOwokZGF0YSA9ICRqc29uLT5yZWFkKCk7CmlmICghZW1wdHkoJGRhdGFbJ3BhY2thZ2VzJ10pIHx8ICFlbXB0eSgkZGF0YVsnaW5jbHVkZXMnXSkgfHwgIWVtcHR5KCRkYXRhWydwcm92aWRlci1pbmNsdWRlcyddKSkgewokcmVwb0NvbmZpZyA9IFsndHlwZScgPT4gJ2NvbXBvc2VyJywgJ3VybCcgPT4gJ2ZpbGU6Ly8nIC4gc3RydHIocmVhbHBhdGgoJHJlcG9zaXRvcnkpLCAnXFwnLCAnLycpXTsKfSBlbHNlaWYgKCRhbGxvd0ZpbGVzeXN0ZW0pIHsKJHJlcG9Db25maWcgPSBbJ3R5cGUnID0+ICdmaWxlc3lzdGVtJywgJ2pzb24nID0+ICRqc29uXTsKfSBlbHNlIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgcmVwb3NpdG9yeSBVUkwgKCRyZXBvc2l0b3J5KSBnaXZlbi4gVGhpcyBmaWxlIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBjb21wb3NlciByZXBvc2l0b3J5LiIpOwp9Cn0gZWxzZWlmIChzdHJwb3MoJHJlcG9zaXRvcnksICd7JykgPT09IDApIHsKCiRyZXBvQ29uZmlnID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkcmVwb3NpdG9yeSk7Cn0gZWxzZSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHJlcG9zaXRvcnkgdXJsICgkcmVwb3NpdG9yeSkgZ2l2ZW4uIEhhcyB0byBiZSBhIC5qc29uIGZpbGUsIGFuIGh0dHAgdXJsIG9yIGEgSlNPTiBvYmplY3QuIik7Cn0KCnJldHVybiAkcmVwb0NvbmZpZzsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tU3RyaW5nKElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIHN0cmluZyAkcmVwb3NpdG9yeSwgYm9vbCAkYWxsb3dGaWxlc3lzdGVtID0gZmFsc2UsID9SZXBvc2l0b3J5TWFuYWdlciAkcm0gPSBudWxsKTogUmVwb3NpdG9yeUludGVyZmFjZQp7CiRyZXBvQ29uZmlnID0gc3RhdGljOjpjb25maWdGcm9tU3RyaW5nKCRpbywgJGNvbmZpZywgJHJlcG9zaXRvcnksICRhbGxvd0ZpbGVzeXN0ZW0pOwoKcmV0dXJuIHN0YXRpYzo6Y3JlYXRlUmVwbygkaW8sICRjb25maWcsICRyZXBvQ29uZmlnLCAkcm0pOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZVJlcG8oSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgYXJyYXkgJHJlcG9Db25maWcsID9SZXBvc2l0b3J5TWFuYWdlciAkcm0gPSBudWxsKTogUmVwb3NpdG9yeUludGVyZmFjZQp7CmlmICghJHJtKSB7CkB0cmlnZ2VyX2Vycm9yKCdOb3QgcGFzc2luZyBhIHJlcG9zaXRvcnkgbWFuYWdlciB3aGVuIGNhbGxpbmcgY3JlYXRlUmVwbyBpcyBkZXByZWNhdGVkIHNpbmNlIENvbXBvc2VyIDIuMy42JywgRV9VU0VSX0RFUFJFQ0FURUQpOwokcm0gPSBzdGF0aWM6Om1hbmFnZXIoJGlvLCAkY29uZmlnKTsKfQokcmVwb3MgPSBzZWxmOjpjcmVhdGVSZXBvcygkcm0sIFskcmVwb0NvbmZpZ10pOwoKcmV0dXJuIHJlc2V0KCRyZXBvcyk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGVmYXVsdFJlcG9zKD9JT0ludGVyZmFjZSAkaW8gPSBudWxsLCA/Q29uZmlnICRjb25maWcgPSBudWxsLCA/UmVwb3NpdG9yeU1hbmFnZXIgJHJtID0gbnVsbCk6IGFycmF5CnsKaWYgKG51bGwgPT09ICRybSkgewpAdHJpZ2dlcl9lcnJvcignTm90IHBhc3NpbmcgYSByZXBvc2l0b3J5IG1hbmFnZXIgd2hlbiBjYWxsaW5nIGRlZmF1bHRSZXBvcyBpcyBkZXByZWNhdGVkIHNpbmNlIENvbXBvc2VyIDIuMy42LCB1c2UgZGVmYXVsdFJlcG9zV2l0aERlZmF1bHRNYW5hZ2VyKCkgaW5zdGVhZCBpZiB5b3UgY2Fubm90IGdldCBhIG1hbmFnZXIuJywgRV9VU0VSX0RFUFJFQ0FURUQpOwp9CgppZiAobnVsbCA9PT0gJGNvbmZpZykgewokY29uZmlnID0gRmFjdG9yeTo6Y3JlYXRlQ29uZmlnKCRpbyk7Cn0KaWYgKG51bGwgIT09ICRpbykgewokaW8tPmxvYWRDb25maWd1cmF0aW9uKCRjb25maWcpOwp9CmlmIChudWxsID09PSAkcm0pIHsKaWYgKG51bGwgPT09ICRpbykgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVGhpcyBmdW5jdGlvbiByZXF1aXJlcyBlaXRoZXIgYW4gSU9JbnRlcmZhY2Ugb3IgYSBSZXBvc2l0b3J5TWFuYWdlcicpOwp9CiRybSA9IHN0YXRpYzo6bWFuYWdlcigkaW8sICRjb25maWcsIEZhY3Rvcnk6OmNyZWF0ZUh0dHBEb3dubG9hZGVyKCRpbywgJGNvbmZpZykpOwp9CgpyZXR1cm4gc2VsZjo6Y3JlYXRlUmVwb3MoJHJtLCAkY29uZmlnLT5nZXRSZXBvc2l0b3JpZXMoKSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWFuYWdlcihJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCA/SHR0cERvd25sb2FkZXIgJGh0dHBEb3dubG9hZGVyID0gbnVsbCwgP0V2ZW50RGlzcGF0Y2hlciAkZXZlbnREaXNwYXRjaGVyID0gbnVsbCwgP1Byb2Nlc3NFeGVjdXRvciAkcHJvY2VzcyA9IG51bGwpOiBSZXBvc2l0b3J5TWFuYWdlcgp7CmlmICgkaHR0cERvd25sb2FkZXIgPT09IG51bGwpIHsKJGh0dHBEb3dubG9hZGVyID0gRmFjdG9yeTo6Y3JlYXRlSHR0cERvd25sb2FkZXIoJGlvLCAkY29uZmlnKTsKfQppZiAoJHByb2Nlc3MgPT09IG51bGwpIHsKJHByb2Nlc3MgPSBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7CiRwcm9jZXNzLT5lbmFibGVBc3luYygpOwp9Cgokcm0gPSBuZXcgUmVwb3NpdG9yeU1hbmFnZXIoJGlvLCAkY29uZmlnLCAkaHR0cERvd25sb2FkZXIsICRldmVudERpc3BhdGNoZXIsICRwcm9jZXNzKTsKJHJtLT5zZXRSZXBvc2l0b3J5Q2xhc3MoJ2NvbXBvc2VyJywgJ0NvbXBvc2VyXFJlcG9zaXRvcnlcQ29tcG9zZXJSZXBvc2l0b3J5Jyk7CiRybS0+c2V0UmVwb3NpdG9yeUNsYXNzKCd2Y3MnLCAnQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NSZXBvc2l0b3J5Jyk7CiRybS0+c2V0UmVwb3NpdG9yeUNsYXNzKCdwYWNrYWdlJywgJ0NvbXBvc2VyXFJlcG9zaXRvcnlcUGFja2FnZVJlcG9zaXRvcnknKTsKJHJtLT5zZXRSZXBvc2l0b3J5Q2xhc3MoJ3BlYXInLCAnQ29tcG9zZXJcUmVwb3NpdG9yeVxQZWFyUmVwb3NpdG9yeScpOwokcm0tPnNldFJlcG9zaXRvcnlDbGFzcygnZ2l0JywgJ0NvbXBvc2VyXFJlcG9zaXRvcnlcVmNzUmVwb3NpdG9yeScpOwokcm0tPnNldFJlcG9zaXRvcnlDbGFzcygnYml0YnVja2V0JywgJ0NvbXBvc2VyXFJlcG9zaXRvcnlcVmNzUmVwb3NpdG9yeScpOwokcm0tPnNldFJlcG9zaXRvcnlDbGFzcygnZ2l0LWJpdGJ1Y2tldCcsICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1JlcG9zaXRvcnknKTsKJHJtLT5zZXRSZXBvc2l0b3J5Q2xhc3MoJ2dpdGh1YicsICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1JlcG9zaXRvcnknKTsKJHJtLT5zZXRSZXBvc2l0b3J5Q2xhc3MoJ2dpdGxhYicsICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1JlcG9zaXRvcnknKTsKJHJtLT5zZXRSZXBvc2l0b3J5Q2xhc3MoJ3N2bicsICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1JlcG9zaXRvcnknKTsKJHJtLT5zZXRSZXBvc2l0b3J5Q2xhc3MoJ2Zvc3NpbCcsICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1JlcG9zaXRvcnknKTsKJHJtLT5zZXRSZXBvc2l0b3J5Q2xhc3MoJ3BlcmZvcmNlJywgJ0NvbXBvc2VyXFJlcG9zaXRvcnlcVmNzUmVwb3NpdG9yeScpOwokcm0tPnNldFJlcG9zaXRvcnlDbGFzcygnaGcnLCAnQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NSZXBvc2l0b3J5Jyk7CiRybS0+c2V0UmVwb3NpdG9yeUNsYXNzKCdhcnRpZmFjdCcsICdDb21wb3NlclxSZXBvc2l0b3J5XEFydGlmYWN0UmVwb3NpdG9yeScpOwokcm0tPnNldFJlcG9zaXRvcnlDbGFzcygncGF0aCcsICdDb21wb3NlclxSZXBvc2l0b3J5XFBhdGhSZXBvc2l0b3J5Jyk7CgpyZXR1cm4gJHJtOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRlZmF1bHRSZXBvc1dpdGhEZWZhdWx0TWFuYWdlcihJT0ludGVyZmFjZSAkaW8pOiBhcnJheQp7CiRtYW5hZ2VyID0gUmVwb3NpdG9yeUZhY3Rvcnk6Om1hbmFnZXIoJGlvLCAkY29uZmlnID0gRmFjdG9yeTo6Y3JlYXRlQ29uZmlnKCRpbykpOwokaW8tPmxvYWRDb25maWd1cmF0aW9uKCRjb25maWcpOwoKcmV0dXJuIFJlcG9zaXRvcnlGYWN0b3J5OjpkZWZhdWx0UmVwb3MoJGlvLCAkY29uZmlnLCAkbWFuYWdlcik7Cn0KCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlUmVwb3MoUmVwb3NpdG9yeU1hbmFnZXIgJHJtLCBhcnJheSAkcmVwb0NvbmZpZ3MpOiBhcnJheQp7CiRyZXBvcyA9IFtdOwoKZm9yZWFjaCAoJHJlcG9Db25maWdzIGFzICRpbmRleCA9PiAkcmVwbykgewppZiAoaXNfc3RyaW5nKCRyZXBvKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignInJlcG9zaXRvcmllcyIgc2hvdWxkIGJlIGFuIGFycmF5IG9mIHJlcG9zaXRvcnkgZGVmaW5pdGlvbnMsIG9ubHkgYSBzaW5nbGUgcmVwb3NpdG9yeSB3YXMgZ2l2ZW4nKTsKfQppZiAoIWlzX2FycmF5KCRyZXBvKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignUmVwb3NpdG9yeSAiJy4kaW5kZXguJyIgKCcuanNvbl9lbmNvZGUoJHJlcG8pLicpIHNob3VsZCBiZSBhbiBhcnJheSwgJy5nZXRfZGVidWdfdHlwZSgkcmVwbykuJyBnaXZlbicpOwp9CmlmICghaXNzZXQoJHJlcG9bJ3R5cGUnXSkpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ1JlcG9zaXRvcnkgIicuJGluZGV4LiciICgnLmpzb25fZW5jb2RlKCRyZXBvKS4nKSBtdXN0IGhhdmUgYSB0eXBlIGRlZmluZWQnKTsKfQoKJG5hbWUgPSBzZWxmOjpnZW5lcmF0ZVJlcG9zaXRvcnlOYW1lKCRpbmRleCwgJHJlcG8sICRyZXBvcyk7CmlmICgkcmVwb1sndHlwZSddID09PSAnZmlsZXN5c3RlbScpIHsKJHJlcG9zWyRuYW1lXSA9IG5ldyBGaWxlc3lzdGVtUmVwb3NpdG9yeSgkcmVwb1snanNvbiddKTsKfSBlbHNlIHsKJHJlcG9zWyRuYW1lXSA9ICRybS0+Y3JlYXRlUmVwb3NpdG9yeSgkcmVwb1sndHlwZSddLCAkcmVwbywgKHN0cmluZykgJGluZGV4KTsKfQp9CgpyZXR1cm4gJHJlcG9zOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2VuZXJhdGVSZXBvc2l0b3J5TmFtZSgkaW5kZXgsIGFycmF5ICRyZXBvLCBhcnJheSAkZXhpc3RpbmdSZXBvcyk6IHN0cmluZwp7CiRuYW1lID0gaXNfaW50KCRpbmRleCkgJiYgaXNzZXQoJHJlcG9bJ3VybCddKSA/IFByZWc6OnJlcGxhY2UoJ3teaHR0cHM/Oi8vfWknLCAnJywgJHJlcG9bJ3VybCddKSA6IChzdHJpbmcpICRpbmRleDsKd2hpbGUgKGlzc2V0KCRleGlzdGluZ1JlcG9zWyRuYW1lXSkpIHsKJG5hbWUgLj0gJzInOwp9CgpyZXR1cm4gJG5hbWU7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKCgoKCgoKCgppbnRlcmZhY2UgUmVwb3NpdG9yeUludGVyZmFjZSBleHRlbmRzIFxDb3VudGFibGUKewpwdWJsaWMgY29uc3QgU0VBUkNIX0ZVTExURVhUID0gMDsKcHVibGljIGNvbnN0IFNFQVJDSF9OQU1FID0gMTsKcHVibGljIGNvbnN0IFNFQVJDSF9WRU5ET1IgPSAyOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZFBhY2thZ2Uoc3RyaW5nICRuYW1lLCAkY29uc3RyYWludCk7CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kUGFja2FnZXMoc3RyaW5nICRuYW1lLCAkY29uc3RyYWludCA9IG51bGwpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFja2FnZXMoKTsKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGxvYWRQYWNrYWdlcyhhcnJheSAkcGFja2FnZU5hbWVNYXAsIGFycmF5ICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMsIGFycmF5ICRzdGFiaWxpdHlGbGFncywgYXJyYXkgJGFscmVhZHlMb2FkZWQgPSBbXSk7CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNlYXJjaChzdHJpbmcgJHF1ZXJ5LCBpbnQgJG1vZGUgPSAwLCA/c3RyaW5nICR0eXBlID0gbnVsbCk7CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByb3ZpZGVycyhzdHJpbmcgJHBhY2thZ2VOYW1lKTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb05hbWUoKTsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudERpc3BhdGNoZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBEb3dubG9hZGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CgoKCgoKCgoKY2xhc3MgUmVwb3NpdG9yeU1hbmFnZXIKewoKcHJpdmF0ZSAkbG9jYWxSZXBvc2l0b3J5OwoKcHJpdmF0ZSAkcmVwb3NpdG9yaWVzID0gW107Cgpwcml2YXRlICRyZXBvc2l0b3J5Q2xhc3NlcyA9IFtdOwoKcHJpdmF0ZSAkaW87Cgpwcml2YXRlICRjb25maWc7Cgpwcml2YXRlICRodHRwRG93bmxvYWRlcjsKCnByaXZhdGUgJGV2ZW50RGlzcGF0Y2hlcjsKCnByaXZhdGUgJHByb2Nlc3M7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgSHR0cERvd25sb2FkZXIgJGh0dHBEb3dubG9hZGVyLCA/RXZlbnREaXNwYXRjaGVyICRldmVudERpc3BhdGNoZXIgPSBudWxsLCA/UHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzID0gbnVsbCkKewokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwokdGhpcy0+aHR0cERvd25sb2FkZXIgPSAkaHR0cERvd25sb2FkZXI7CiR0aGlzLT5ldmVudERpc3BhdGNoZXIgPSAkZXZlbnREaXNwYXRjaGVyOwokdGhpcy0+cHJvY2VzcyA9ICRwcm9jZXNzID8/IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmRQYWNrYWdlKHN0cmluZyAkbmFtZSwgJGNvbnN0cmFpbnQpOiA/UGFja2FnZUludGVyZmFjZQp7CmZvcmVhY2ggKCR0aGlzLT5yZXBvc2l0b3JpZXMgYXMgJHJlcG9zaXRvcnkpIHsKCmlmICgkcGFja2FnZSA9ICRyZXBvc2l0b3J5LT5maW5kUGFja2FnZSgkbmFtZSwgJGNvbnN0cmFpbnQpKSB7CnJldHVybiAkcGFja2FnZTsKfQp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZFBhY2thZ2VzKHN0cmluZyAkbmFtZSwgJGNvbnN0cmFpbnQpOiBhcnJheQp7CiRwYWNrYWdlcyA9IFtdOwoKZm9yZWFjaCAoJHRoaXMtPmdldFJlcG9zaXRvcmllcygpIGFzICRyZXBvc2l0b3J5KSB7CiRwYWNrYWdlcyA9IGFycmF5X21lcmdlKCRwYWNrYWdlcywgJHJlcG9zaXRvcnktPmZpbmRQYWNrYWdlcygkbmFtZSwgJGNvbnN0cmFpbnQpKTsKfQoKcmV0dXJuICRwYWNrYWdlczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkUmVwb3NpdG9yeShSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvc2l0b3J5KTogdm9pZAp7CiR0aGlzLT5yZXBvc2l0b3JpZXNbXSA9ICRyZXBvc2l0b3J5Owp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHByZXBlbmRSZXBvc2l0b3J5KFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG9zaXRvcnkpOiB2b2lkCnsKYXJyYXlfdW5zaGlmdCgkdGhpcy0+cmVwb3NpdG9yaWVzLCAkcmVwb3NpdG9yeSk7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNyZWF0ZVJlcG9zaXRvcnkoc3RyaW5nICR0eXBlLCBhcnJheSAkY29uZmlnLCA/c3RyaW5nICRuYW1lID0gbnVsbCk6IFJlcG9zaXRvcnlJbnRlcmZhY2UKewppZiAoIWlzc2V0KCR0aGlzLT5yZXBvc2l0b3J5Q2xhc3Nlc1skdHlwZV0pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdSZXBvc2l0b3J5IHR5cGUgaXMgbm90IHJlZ2lzdGVyZWQ6ICcuJHR5cGUpOwp9CgppZiAoaXNzZXQoJGNvbmZpZ1sncGFja2FnaXN0J10pICYmIGZhbHNlID09PSAkY29uZmlnWydwYWNrYWdpc3QnXSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlJlcG9zaXRvcnkgIicuJG5hbWUuJyIgKCcuanNvbl9lbmNvZGUoJGNvbmZpZykuJykgaGFzIGEgcGFja2FnaXN0IGtleSB3aGljaCBzaG91bGQgYmUgaW4gaXRzIG93biByZXBvc2l0b3J5IGRlZmluaXRpb248L3dhcm5pbmc+Jyk7Cn0KCiRjbGFzcyA9ICR0aGlzLT5yZXBvc2l0b3J5Q2xhc3Nlc1skdHlwZV07CgppZiAoaXNzZXQoJGNvbmZpZ1snb25seSddKSB8fCBpc3NldCgkY29uZmlnWydleGNsdWRlJ10pIHx8IGlzc2V0KCRjb25maWdbJ2Nhbm9uaWNhbCddKSkgewokZmlsdGVyQ29uZmlnID0gJGNvbmZpZzsKdW5zZXQoJGNvbmZpZ1snb25seSddLCAkY29uZmlnWydleGNsdWRlJ10sICRjb25maWdbJ2Nhbm9uaWNhbCddKTsKfQoKJHJlcG9zaXRvcnkgPSBuZXcgJGNsYXNzKCRjb25maWcsICR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPmh0dHBEb3dubG9hZGVyLCAkdGhpcy0+ZXZlbnREaXNwYXRjaGVyLCAkdGhpcy0+cHJvY2Vzcyk7CgppZiAoaXNzZXQoJGZpbHRlckNvbmZpZykpIHsKJHJlcG9zaXRvcnkgPSBuZXcgRmlsdGVyUmVwb3NpdG9yeSgkcmVwb3NpdG9yeSwgJGZpbHRlckNvbmZpZyk7Cn0KCnJldHVybiAkcmVwb3NpdG9yeTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJlcG9zaXRvcnlDbGFzcyhzdHJpbmcgJHR5cGUsICRjbGFzcyk6IHZvaWQKewokdGhpcy0+cmVwb3NpdG9yeUNsYXNzZXNbJHR5cGVdID0gJGNsYXNzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvc2l0b3JpZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnJlcG9zaXRvcmllczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0TG9jYWxSZXBvc2l0b3J5KEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG9zaXRvcnkpOiB2b2lkCnsKJHRoaXMtPmxvY2FsUmVwb3NpdG9yeSA9ICRyZXBvc2l0b3J5Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG9jYWxSZXBvc2l0b3J5KCk6IEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmxvY2FsUmVwb3NpdG9yeTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKCgoKCgpjbGFzcyBSZXBvc2l0b3J5U2VjdXJpdHlFeGNlcHRpb24gZXh0ZW5kcyBcRXhjZXB0aW9uCnsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcUG9vbE9wdGltaXplcjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxQb29sOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFBvb2xCdWlsZGVyOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFJlcXVlc3Q7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcU2VjdXJpdHlBZHZpc29yeVBvb2xGaWx0ZXI7CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnREaXNwYXRjaGVyOwp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcU2VjdXJpdHlBZHZpc29yeTsKdXNlIENvbXBvc2VyXEFkdmlzb3J5XFBhcnRpYWxTZWN1cml0eUFkdmlzb3J5Owp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJT1xOdWxsSU87CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxTdGFiaWxpdHlGaWx0ZXI7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxNYXRjaEFsbENvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxNdWx0aUNvbnN0cmFpbnQ7CgoKCgoKCmNsYXNzIFJlcG9zaXRvcnlTZXQKewoKCgpwdWJsaWMgY29uc3QgQUxMT1dfVU5BQ0NFUFRBQkxFX1NUQUJJTElUSUVTID0gMTsKCgoKcHVibGljIGNvbnN0IEFMTE9XX1NIQURPV0VEX1JFUE9TSVRPUklFUyA9IDI7CgoKCgoKcHJpdmF0ZSAkcm9vdEFsaWFzZXM7CgoKCgoKcHJpdmF0ZSAkcm9vdFJlZmVyZW5jZXM7CgoKcHJpdmF0ZSAkcmVwb3NpdG9yaWVzID0gW107CgoKCgoKcHJpdmF0ZSAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzOwoKCgoKCnByaXZhdGUgJHN0YWJpbGl0eUZsYWdzOwoKCgoKCnByaXZhdGUgJHJvb3RSZXF1aXJlczsKCgoKCnByaXZhdGUgJHRlbXBvcmFyeUNvbnN0cmFpbnRzOwoKCnByaXZhdGUgJGxvY2tlZCA9IGZhbHNlOwoKcHJpdmF0ZSAkYWxsb3dJbnN0YWxsZWRSZXBvc2l0b3JpZXMgPSBmYWxzZTsKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRtaW5pbXVtU3RhYmlsaXR5ID0gJ3N0YWJsZScsIGFycmF5ICRzdGFiaWxpdHlGbGFncyA9IFtdLCBhcnJheSAkcm9vdEFsaWFzZXMgPSBbXSwgYXJyYXkgJHJvb3RSZWZlcmVuY2VzID0gW10sIGFycmF5ICRyb290UmVxdWlyZXMgPSBbXSwgYXJyYXkgJHRlbXBvcmFyeUNvbnN0cmFpbnRzID0gW10pCnsKJHRoaXMtPnJvb3RBbGlhc2VzID0gc2VsZjo6Z2V0Um9vdEFsaWFzZXNQZXJQYWNrYWdlKCRyb290QWxpYXNlcyk7CiR0aGlzLT5yb290UmVmZXJlbmNlcyA9ICRyb290UmVmZXJlbmNlczsKCiR0aGlzLT5hY2NlcHRhYmxlU3RhYmlsaXRpZXMgPSBbXTsKZm9yZWFjaCAoQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTIGFzICRzdGFiaWxpdHkgPT4gJHZhbHVlKSB7CmlmICgkdmFsdWUgPD0gQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTWyRtaW5pbXVtU3RhYmlsaXR5XSkgewokdGhpcy0+YWNjZXB0YWJsZVN0YWJpbGl0aWVzWyRzdGFiaWxpdHldID0gJHZhbHVlOwp9Cn0KJHRoaXMtPnN0YWJpbGl0eUZsYWdzID0gJHN0YWJpbGl0eUZsYWdzOwokdGhpcy0+cm9vdFJlcXVpcmVzID0gJHJvb3RSZXF1aXJlczsKZm9yZWFjaCAoJHJvb3RSZXF1aXJlcyBhcyAkbmFtZSA9PiAkY29uc3RyYWludCkgewppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkbmFtZSkpIHsKdW5zZXQoJHRoaXMtPnJvb3RSZXF1aXJlc1skbmFtZV0pOwp9Cn0KCiR0aGlzLT50ZW1wb3JhcnlDb25zdHJhaW50cyA9ICR0ZW1wb3JhcnlDb25zdHJhaW50czsKfQoKcHVibGljIGZ1bmN0aW9uIGFsbG93SW5zdGFsbGVkUmVwb3NpdG9yaWVzKGJvb2wgJGFsbG93ID0gdHJ1ZSk6IHZvaWQKewokdGhpcy0+YWxsb3dJbnN0YWxsZWRSZXBvc2l0b3JpZXMgPSAkYWxsb3c7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Um9vdFJlcXVpcmVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yb290UmVxdWlyZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUZW1wb3JhcnlDb25zdHJhaW50cygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+dGVtcG9yYXJ5Q29uc3RyYWludHM7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFJlcG9zaXRvcnkoUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbyk6IHZvaWQKewppZiAoJHRoaXMtPmxvY2tlZCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIlBvb2wgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGZyb20gdGhpcyByZXBvc2l0b3J5IHNldCwgaXQgY2Fubm90IGJlIG1vZGlmaWVkIGFueW1vcmUuIik7Cn0KCmlmICgkcmVwbyBpbnN0YW5jZW9mIENvbXBvc2l0ZVJlcG9zaXRvcnkpIHsKJHJlcG9zID0gJHJlcG8tPmdldFJlcG9zaXRvcmllcygpOwp9IGVsc2UgewokcmVwb3MgPSBbJHJlcG9dOwp9Cgpmb3JlYWNoICgkcmVwb3MgYXMgJHJlcG8pIHsKJHRoaXMtPnJlcG9zaXRvcmllc1tdID0gJHJlcG87Cn0KfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZFBhY2thZ2VzKHN0cmluZyAkbmFtZSwgP0NvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQgPSBudWxsLCBpbnQgJGZsYWdzID0gMCk6IGFycmF5CnsKJGlnbm9yZVN0YWJpbGl0eSA9ICgkZmxhZ3MgJiBzZWxmOjpBTExPV19VTkFDQ0VQVEFCTEVfU1RBQklMSVRJRVMpICE9PSAwOwokbG9hZEZyb21BbGxSZXBvcyA9ICgkZmxhZ3MgJiBzZWxmOjpBTExPV19TSEFET1dFRF9SRVBPU0lUT1JJRVMpICE9PSAwOwoKJHBhY2thZ2VzID0gW107CmlmICgkbG9hZEZyb21BbGxSZXBvcykgewpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yaWVzIGFzICRyZXBvc2l0b3J5KSB7CiRwYWNrYWdlc1tdID0gJHJlcG9zaXRvcnktPmZpbmRQYWNrYWdlcygkbmFtZSwgJGNvbnN0cmFpbnQpID86IFtdOwp9Cn0gZWxzZSB7CmZvcmVhY2ggKCR0aGlzLT5yZXBvc2l0b3JpZXMgYXMgJHJlcG9zaXRvcnkpIHsKJHJlc3VsdCA9ICRyZXBvc2l0b3J5LT5sb2FkUGFja2FnZXMoWyRuYW1lID0+ICRjb25zdHJhaW50XSwgJGlnbm9yZVN0YWJpbGl0eSA/IEJhc2VQYWNrYWdlOjpTVEFCSUxJVElFUyA6ICR0aGlzLT5hY2NlcHRhYmxlU3RhYmlsaXRpZXMsICRpZ25vcmVTdGFiaWxpdHkgPyBbXSA6ICR0aGlzLT5zdGFiaWxpdHlGbGFncyk7CgokcGFja2FnZXNbXSA9ICRyZXN1bHRbJ3BhY2thZ2VzJ107CmZvcmVhY2ggKCRyZXN1bHRbJ25hbWVzRm91bmQnXSBhcyAkbmFtZUZvdW5kKSB7CgppZiAoJG5hbWUgPT09ICRuYW1lRm91bmQpIHsKYnJlYWsgMjsKfQp9Cn0KfQoKJGNhbmRpZGF0ZXMgPSAkcGFja2FnZXMgPyBhcnJheV9tZXJnZSguLi4kcGFja2FnZXMpIDogW107CgoKaWYgKCRpZ25vcmVTdGFiaWxpdHkgfHwgISRsb2FkRnJvbUFsbFJlcG9zKSB7CnJldHVybiAkY2FuZGlkYXRlczsKfQoKJHJlc3VsdCA9IFtdOwpmb3JlYWNoICgkY2FuZGlkYXRlcyBhcyAkY2FuZGlkYXRlKSB7CmlmICgkdGhpcy0+aXNQYWNrYWdlQWNjZXB0YWJsZSgkY2FuZGlkYXRlLT5nZXROYW1lcygpLCAkY2FuZGlkYXRlLT5nZXRTdGFiaWxpdHkoKSkpIHsKJHJlc3VsdFtdID0gJGNhbmRpZGF0ZTsKfQp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTZWN1cml0eUFkdmlzb3JpZXMoYXJyYXkgJHBhY2thZ2VOYW1lcywgYm9vbCAkYWxsb3dQYXJ0aWFsQWR2aXNvcmllcywgYm9vbCAkaWdub3JlVW5yZWFjaGFibGUgPSBmYWxzZSk6IGFycmF5CnsKJG1hcCA9IFtdOwpmb3JlYWNoICgkcGFja2FnZU5hbWVzIGFzICRuYW1lKSB7CiRtYXBbJG5hbWVdID0gbmV3IE1hdGNoQWxsQ29uc3RyYWludCgpOwp9CgokdW5yZWFjaGFibGVSZXBvcyA9IFtdOwokYWR2aXNvcmllcyA9ICR0aGlzLT5nZXRTZWN1cml0eUFkdmlzb3JpZXNGb3JDb25zdHJhaW50cygkbWFwLCAkYWxsb3dQYXJ0aWFsQWR2aXNvcmllcywgJGlnbm9yZVVucmVhY2hhYmxlLCAkdW5yZWFjaGFibGVSZXBvcyk7CgpyZXR1cm4gWydhZHZpc29yaWVzJyA9PiAkYWR2aXNvcmllcywgJ3VucmVhY2hhYmxlUmVwb3MnID0+ICR1bnJlYWNoYWJsZVJlcG9zXTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRNYXRjaGluZ1NlY3VyaXR5QWR2aXNvcmllcyhhcnJheSAkcGFja2FnZXMsIGJvb2wgJGFsbG93UGFydGlhbEFkdmlzb3JpZXMgPSBmYWxzZSwgYm9vbCAkaWdub3JlVW5yZWFjaGFibGUgPSBmYWxzZSk6IGFycmF5CnsKJG1hcCA9IFtdOwpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSAmJiAkcGFja2FnZS0+aXNSb290UGFja2FnZUFsaWFzKCkpIHsKY29udGludWU7Cn0KaWYgKGlzc2V0KCRtYXBbJHBhY2thZ2UtPmdldE5hbWUoKV0pKSB7CiRtYXBbJHBhY2thZ2UtPmdldE5hbWUoKV0gPSBuZXcgTXVsdGlDb25zdHJhaW50KFtuZXcgQ29uc3RyYWludCgnPScsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkpLCAkbWFwWyRwYWNrYWdlLT5nZXROYW1lKCldXSwgZmFsc2UpOwp9IGVsc2UgewokbWFwWyRwYWNrYWdlLT5nZXROYW1lKCldID0gbmV3IENvbnN0cmFpbnQoJz0nLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKTsKfQp9CgokdW5yZWFjaGFibGVSZXBvcyA9IFtdOwokYWR2aXNvcmllcyA9ICR0aGlzLT5nZXRTZWN1cml0eUFkdmlzb3JpZXNGb3JDb25zdHJhaW50cygkbWFwLCAkYWxsb3dQYXJ0aWFsQWR2aXNvcmllcywgJGlnbm9yZVVucmVhY2hhYmxlLCAkdW5yZWFjaGFibGVSZXBvcyk7CgpyZXR1cm4gWydhZHZpc29yaWVzJyA9PiAkYWR2aXNvcmllcywgJ3VucmVhY2hhYmxlUmVwb3MnID0+ICR1bnJlYWNoYWJsZVJlcG9zXTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFNlY3VyaXR5QWR2aXNvcmllc0ZvckNvbnN0cmFpbnRzKGFycmF5ICRwYWNrYWdlQ29uc3RyYWludE1hcCwgYm9vbCAkYWxsb3dQYXJ0aWFsQWR2aXNvcmllcywgYm9vbCAkaWdub3JlVW5yZWFjaGFibGUgPSBmYWxzZSwgYXJyYXkgJiR1bnJlYWNoYWJsZVJlcG9zID0gW10pOiBhcnJheQp7CiRyZXBvQWR2aXNvcmllcyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yaWVzIGFzICRyZXBvc2l0b3J5KSB7CnRyeSB7CmlmICghJHJlcG9zaXRvcnkgaW5zdGFuY2VvZiBBZHZpc29yeVByb3ZpZGVySW50ZXJmYWNlIHx8ICEkcmVwb3NpdG9yeS0+aGFzU2VjdXJpdHlBZHZpc29yaWVzKCkpIHsKY29udGludWU7Cn0KCiRyZXBvQWR2aXNvcmllc1tdID0gJHJlcG9zaXRvcnktPmdldFNlY3VyaXR5QWR2aXNvcmllcygkcGFja2FnZUNvbnN0cmFpbnRNYXAsICRhbGxvd1BhcnRpYWxBZHZpc29yaWVzKVsnYWR2aXNvcmllcyddOwp9IGNhdGNoIChcQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKaWYgKCEkaWdub3JlVW5yZWFjaGFibGUpIHsKdGhyb3cgJGU7Cn0KJHVucmVhY2hhYmxlUmVwb3NbXSA9ICRlLT5nZXRNZXNzYWdlKCk7Cn0KfQoKJGFkdmlzb3JpZXMgPSBjb3VudCgkcmVwb0Fkdmlzb3JpZXMpID4gMCA/IGFycmF5X21lcmdlX3JlY3Vyc2l2ZShbXSwgLi4uJHJlcG9BZHZpc29yaWVzKSA6IFtdOwprc29ydCgkYWR2aXNvcmllcyk7CgpyZXR1cm4gJGFkdmlzb3JpZXM7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdmlkZXJzKHN0cmluZyAkcGFja2FnZU5hbWUpOiBhcnJheQp7CiRwcm92aWRlcnMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPnJlcG9zaXRvcmllcyBhcyAkcmVwb3NpdG9yeSkgewppZiAoJHJlcG9Qcm92aWRlcnMgPSAkcmVwb3NpdG9yeS0+Z2V0UHJvdmlkZXJzKCRwYWNrYWdlTmFtZSkpIHsKJHByb3ZpZGVycyA9IGFycmF5X21lcmdlKCRwcm92aWRlcnMsICRyZXBvUHJvdmlkZXJzKTsKfQp9CgpyZXR1cm4gJHByb3ZpZGVyczsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUGFja2FnZUFjY2VwdGFibGUoYXJyYXkgJG5hbWVzLCBzdHJpbmcgJHN0YWJpbGl0eSk6IGJvb2wKewpyZXR1cm4gU3RhYmlsaXR5RmlsdGVyOjppc1BhY2thZ2VBY2NlcHRhYmxlKCR0aGlzLT5hY2NlcHRhYmxlU3RhYmlsaXRpZXMsICR0aGlzLT5zdGFiaWxpdHlGbGFncywgJG5hbWVzLCAkc3RhYmlsaXR5KTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNyZWF0ZVBvb2woUmVxdWVzdCAkcmVxdWVzdCwgSU9JbnRlcmZhY2UgJGlvLCA/RXZlbnREaXNwYXRjaGVyICRldmVudERpc3BhdGNoZXIgPSBudWxsLCA/UG9vbE9wdGltaXplciAkcG9vbE9wdGltaXplciA9IG51bGwsIGFycmF5ICRpZ25vcmVkVHlwZXMgPSBbXSwgP2FycmF5ICRhbGxvd2VkVHlwZXMgPSBudWxsLCA/U2VjdXJpdHlBZHZpc29yeVBvb2xGaWx0ZXIgJHNlY3VyaXR5QWR2aXNvcnlQb29sRmlsdGVyID0gbnVsbCk6IFBvb2wKewokcG9vbEJ1aWxkZXIgPSBuZXcgUG9vbEJ1aWxkZXIoJHRoaXMtPmFjY2VwdGFibGVTdGFiaWxpdGllcywgJHRoaXMtPnN0YWJpbGl0eUZsYWdzLCAkdGhpcy0+cm9vdEFsaWFzZXMsICR0aGlzLT5yb290UmVmZXJlbmNlcywgJGlvLCAkZXZlbnREaXNwYXRjaGVyLCAkcG9vbE9wdGltaXplciwgJHRoaXMtPnRlbXBvcmFyeUNvbnN0cmFpbnRzLCAkc2VjdXJpdHlBZHZpc29yeVBvb2xGaWx0ZXIpOwokcG9vbEJ1aWxkZXItPnNldElnbm9yZWRUeXBlcygkaWdub3JlZFR5cGVzKTsKJHBvb2xCdWlsZGVyLT5zZXRBbGxvd2VkVHlwZXMoJGFsbG93ZWRUeXBlcyk7Cgpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yaWVzIGFzICRyZXBvKSB7CmlmICgoJHJlcG8gaW5zdGFuY2VvZiBJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlIHx8ICRyZXBvIGluc3RhbmNlb2YgSW5zdGFsbGVkUmVwb3NpdG9yeSkgJiYgISR0aGlzLT5hbGxvd0luc3RhbGxlZFJlcG9zaXRvcmllcykgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdUaGUgcG9vbCBjYW4gbm90IGFjY2VwdCBwYWNrYWdlcyBmcm9tIGFuIGluc3RhbGxlZCByZXBvc2l0b3J5Jyk7Cn0KfQoKJHRoaXMtPmxvY2tlZCA9IHRydWU7CgpyZXR1cm4gJHBvb2xCdWlsZGVyLT5idWlsZFBvb2woJHRoaXMtPnJlcG9zaXRvcmllcywgJHJlcXVlc3QpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY3JlYXRlUG9vbFdpdGhBbGxQYWNrYWdlcygpOiBQb29sCnsKZm9yZWFjaCAoJHRoaXMtPnJlcG9zaXRvcmllcyBhcyAkcmVwbykgewppZiAoKCRyZXBvIGluc3RhbmNlb2YgSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSB8fCAkcmVwbyBpbnN0YW5jZW9mIEluc3RhbGxlZFJlcG9zaXRvcnkpICYmICEkdGhpcy0+YWxsb3dJbnN0YWxsZWRSZXBvc2l0b3JpZXMpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignVGhlIHBvb2wgY2FuIG5vdCBhY2NlcHQgcGFja2FnZXMgZnJvbSBhbiBpbnN0YWxsZWQgcmVwb3NpdG9yeScpOwp9Cn0KCiR0aGlzLT5sb2NrZWQgPSB0cnVlOwoKJHBhY2thZ2VzID0gW107CmZvcmVhY2ggKCR0aGlzLT5yZXBvc2l0b3JpZXMgYXMgJHJlcG9zaXRvcnkpIHsKZm9yZWFjaCAoJHJlcG9zaXRvcnktPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKJHBhY2thZ2VzW10gPSAkcGFja2FnZTsKCmlmIChpc3NldCgkdGhpcy0+cm9vdEFsaWFzZXNbJHBhY2thZ2UtPmdldE5hbWUoKV1bJHBhY2thZ2UtPmdldFZlcnNpb24oKV0pKSB7CiRhbGlhcyA9ICR0aGlzLT5yb290QWxpYXNlc1skcGFja2FnZS0+Z2V0TmFtZSgpXVskcGFja2FnZS0+Z2V0VmVyc2lvbigpXTsKd2hpbGUgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiRwYWNrYWdlID0gJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKfQppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2UpIHsKJGFsaWFzUGFja2FnZSA9IG5ldyBDb21wbGV0ZUFsaWFzUGFja2FnZSgkcGFja2FnZSwgJGFsaWFzWydhbGlhc19ub3JtYWxpemVkJ10sICRhbGlhc1snYWxpYXMnXSk7Cn0gZWxzZSB7CiRhbGlhc1BhY2thZ2UgPSBuZXcgQWxpYXNQYWNrYWdlKCRwYWNrYWdlLCAkYWxpYXNbJ2FsaWFzX25vcm1hbGl6ZWQnXSwgJGFsaWFzWydhbGlhcyddKTsKfQokYWxpYXNQYWNrYWdlLT5zZXRSb290UGFja2FnZUFsaWFzKHRydWUpOwokcGFja2FnZXNbXSA9ICRhbGlhc1BhY2thZ2U7Cn0KfQp9CgpyZXR1cm4gbmV3IFBvb2woJHBhY2thZ2VzKTsKfQoKcHVibGljIGZ1bmN0aW9uIGNyZWF0ZVBvb2xGb3JQYWNrYWdlKHN0cmluZyAkcGFja2FnZU5hbWUsID9Mb2NrQXJyYXlSZXBvc2l0b3J5ICRsb2NrZWRSZXBvID0gbnVsbCk6IFBvb2wKewoKcmV0dXJuICR0aGlzLT5jcmVhdGVQb29sRm9yUGFja2FnZXMoWyRwYWNrYWdlTmFtZV0sICRsb2NrZWRSZXBvKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNyZWF0ZVBvb2xGb3JQYWNrYWdlcyhhcnJheSAkcGFja2FnZU5hbWVzLCA/TG9ja0FycmF5UmVwb3NpdG9yeSAkbG9ja2VkUmVwbyA9IG51bGwpOiBQb29sCnsKJHJlcXVlc3QgPSBuZXcgUmVxdWVzdCgkbG9ja2VkUmVwbyk7CgokYWxsb3dlZFBhY2thZ2VzID0gW107CmZvcmVhY2ggKCRwYWNrYWdlTmFtZXMgYXMgJHBhY2thZ2VOYW1lKSB7CmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRwYWNrYWdlTmFtZSkpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignY3JlYXRlUG9vbEZvclBhY2thZ2UocykgY2FuIG5vdCBiZSB1c2VkIGZvciBwbGF0Zm9ybSBwYWNrYWdlcywgYXMgdGhleSBhcmUgbmV2ZXIgbG9hZGVkIGJ5IHRoZSBQb29sQnVpbGRlciB3aGljaCBleHBlY3RzIHRoZW0gdG8gYmUgZml4ZWQuIFVzZSBjcmVhdGVQb29sV2l0aEFsbFBhY2thZ2VzIG9yIHBhc3MgaW4gYSBwcm9wZXIgcmVxdWVzdCB3aXRoIHRoZSBwbGF0Zm9ybSBwYWNrYWdlcyB5b3UgbmVlZCBmaXhlZCBpbiBpdC4nKTsKfQoKJHJlcXVlc3QtPnJlcXVpcmVOYW1lKCRwYWNrYWdlTmFtZSk7CiRhbGxvd2VkUGFja2FnZXNbXSA9IHN0cnRvbG93ZXIoJHBhY2thZ2VOYW1lKTsKfQoKaWYgKGNvdW50KCRhbGxvd2VkUGFja2FnZXMpID4gMCkgewokcmVxdWVzdC0+cmVzdHJpY3RQYWNrYWdlcygkYWxsb3dlZFBhY2thZ2VzKTsKfQoKcmV0dXJuICR0aGlzLT5jcmVhdGVQb29sKCRyZXF1ZXN0LCBuZXcgTnVsbElPKCkpOwp9CgoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRSb290QWxpYXNlc1BlclBhY2thZ2UoYXJyYXkgJGFsaWFzZXMpOiBhcnJheQp7CiRub3JtYWxpemVkQWxpYXNlcyA9IFtdOwoKZm9yZWFjaCAoJGFsaWFzZXMgYXMgJGFsaWFzKSB7CiRub3JtYWxpemVkQWxpYXNlc1skYWxpYXNbJ3BhY2thZ2UnXV1bJGFsaWFzWyd2ZXJzaW9uJ11dID0gWwonYWxpYXMnID0+ICRhbGlhc1snYWxpYXMnXSwKJ2FsaWFzX25vcm1hbGl6ZWQnID0+ICRhbGlhc1snYWxpYXNfbm9ybWFsaXplZCddLApdOwp9CgpyZXR1cm4gJG5vcm1hbGl6ZWRBbGlhc2VzOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBSZXBvc2l0b3J5VXRpbHMKewoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZpbHRlclJlcXVpcmVkUGFja2FnZXMoYXJyYXkgJHBhY2thZ2VzLCBQYWNrYWdlSW50ZXJmYWNlICRyZXF1aXJlciwgYm9vbCAkaW5jbHVkZVJlcXVpcmVEZXYgPSBmYWxzZSwgYXJyYXkgJGJ1Y2tldCA9IFtdKTogYXJyYXkKewokcmVxdWlyZXMgPSAkcmVxdWlyZXItPmdldFJlcXVpcmVzKCk7CmlmICgkaW5jbHVkZVJlcXVpcmVEZXYpIHsKJHJlcXVpcmVzID0gYXJyYXlfbWVyZ2UoJHJlcXVpcmVzLCAkcmVxdWlyZXItPmdldERldlJlcXVpcmVzKCkpOwp9Cgpmb3JlYWNoICgkcGFja2FnZXMgYXMgJGNhbmRpZGF0ZSkgewpmb3JlYWNoICgkY2FuZGlkYXRlLT5nZXROYW1lcygpIGFzICRuYW1lKSB7CmlmIChpc3NldCgkcmVxdWlyZXNbJG5hbWVdKSkgewppZiAoIWluX2FycmF5KCRjYW5kaWRhdGUsICRidWNrZXQsIHRydWUpKSB7CiRidWNrZXRbXSA9ICRjYW5kaWRhdGU7CiRidWNrZXQgPSBzZWxmOjpmaWx0ZXJSZXF1aXJlZFBhY2thZ2VzKCRwYWNrYWdlcywgJGNhbmRpZGF0ZSwgZmFsc2UsICRidWNrZXQpOwp9CmJyZWFrOwp9Cn0KfQoKcmV0dXJuICRidWNrZXQ7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmbGF0dGVuUmVwb3NpdG9yaWVzKFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIGJvb2wgJHVud3JhcEZpbHRlclJlcG9zID0gdHJ1ZSk6IGFycmF5CnsKCmlmICgkdW53cmFwRmlsdGVyUmVwb3MgJiYgJHJlcG8gaW5zdGFuY2VvZiBGaWx0ZXJSZXBvc2l0b3J5KSB7CiRyZXBvID0gJHJlcG8tPmdldFJlcG9zaXRvcnkoKTsKfQoKaWYgKCEkcmVwbyBpbnN0YW5jZW9mIENvbXBvc2l0ZVJlcG9zaXRvcnkpIHsKcmV0dXJuIFskcmVwb107Cn0KCiRyZXBvcyA9IFtdOwpmb3JlYWNoICgkcmVwby0+Z2V0UmVwb3NpdG9yaWVzKCkgYXMgJHIpIHsKZm9yZWFjaCAoc2VsZjo6ZmxhdHRlblJlcG9zaXRvcmllcygkciwgJHVud3JhcEZpbHRlclJlcG9zKSBhcyAkcjIpIHsKJHJlcG9zW10gPSAkcjI7Cn0KfQoKcmV0dXJuICRyZXBvczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUm9vdFBhY2thZ2VJbnRlcmZhY2U7CgoKCgoKCgoKY2xhc3MgUm9vdFBhY2thZ2VSZXBvc2l0b3J5IGV4dGVuZHMgQXJyYXlSZXBvc2l0b3J5CnsKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFJvb3RQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoWyRwYWNrYWdlXSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvTmFtZSgpOiBzdHJpbmcKewpyZXR1cm4gJ3Jvb3QgcGFja2FnZSByZXBvJzsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5XFZjczsKCnVzZSBDb21wb3NlclxDYWNoZTsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxGb3JnZWpvOwp1c2UgQ29tcG9zZXJcVXRpbFxGb3JnZWpvUmVwb3NpdG9yeURhdGE7CnVzZSBDb21wb3NlclxVdGlsXEZvcmdlam9Vcmw7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBcUmVzcG9uc2U7CgpjbGFzcyBGb3JnZWpvRHJpdmVyIGV4dGVuZHMgVmNzRHJpdmVyCnsKCnByaXZhdGUgJGZvcmdlam9Vcmw7Cgpwcml2YXRlICRyZXBvc2l0b3J5RGF0YTsKCgpwcm90ZWN0ZWQgJGdpdERyaXZlciA9IG51bGw7Cgpwcml2YXRlICR0YWdzOwoKcHJpdmF0ZSAkYnJhbmNoZXM7CgpwdWJsaWMgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpOiB2b2lkCnsKJHRoaXMtPmZvcmdlam9VcmwgPSBGb3JnZWpvVXJsOjpjcmVhdGUoJHRoaXMtPnVybCk7CiR0aGlzLT5vcmlnaW5VcmwgPSAkdGhpcy0+Zm9yZ2Vqb1VybC0+b3JpZ2luVXJsOwoKJHRoaXMtPmNhY2hlID0gbmV3IENhY2hlKCR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS1yZXBvLWRpcicpLicvJy4kdGhpcy0+b3JpZ2luVXJsLicvJy4kdGhpcy0+Zm9yZ2Vqb1VybC0+b3duZXIuJy8nLiR0aGlzLT5mb3JnZWpvVXJsLT5yZXBvc2l0b3J5KTsKJHRoaXMtPmNhY2hlLT5zZXRSZWFkT25seSgkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXJlYWQtb25seScpKTsKCiR0aGlzLT5mZXRjaFJlcG9zaXRvcnlEYXRhKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlQ29udGVudChzdHJpbmcgJGZpbGUsIHN0cmluZyAkaWRlbnRpZmllcik6ID9zdHJpbmcKewppZiAoJHRoaXMtPmdpdERyaXZlciAhPT0gbnVsbCkgewpyZXR1cm4gJHRoaXMtPmdpdERyaXZlci0+Z2V0RmlsZUNvbnRlbnQoJGZpbGUsICRpZGVudGlmaWVyKTsKfQoKJHJlc291cmNlID0gJHRoaXMtPmZvcmdlam9VcmwtPmFwaVVybC4nL2NvbnRlbnRzLycgLiAkZmlsZSAuICc/cmVmPScudXJsZW5jb2RlKCRpZGVudGlmaWVyKTsKJHJlc291cmNlID0gJHRoaXMtPmdldENvbnRlbnRzKCRyZXNvdXJjZSktPmRlY29kZUpzb24oKTsKCgoKaWYgKCghaXNzZXQoJHJlc291cmNlWydjb250ZW50J10pIHx8ICRyZXNvdXJjZVsnY29udGVudCddID09PSAnJykgJiYgJHJlc291cmNlWydlbmNvZGluZyddID09PSAnbm9uZScgJiYgaXNzZXQoJHJlc291cmNlWydnaXRfdXJsJ10pKSB7CiRyZXNvdXJjZSA9ICR0aGlzLT5nZXRDb250ZW50cygkcmVzb3VyY2VbJ2dpdF91cmwnXSktPmRlY29kZUpzb24oKTsKfQoKaWYgKCFpc3NldCgkcmVzb3VyY2VbJ2NvbnRlbnQnXSkgfHwgJHJlc291cmNlWydlbmNvZGluZyddICE9PSAnYmFzZTY0JyB8fCBmYWxzZSA9PT0gKCRjb250ZW50ID0gYmFzZTY0X2RlY29kZSgkcmVzb3VyY2VbJ2NvbnRlbnQnXSwgdHJ1ZSkpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IHJldHJpZXZlICcgLiAkZmlsZSAuICcgZm9yICcuJGlkZW50aWZpZXIpOwp9CgpyZXR1cm4gJGNvbnRlbnQ7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRDaGFuZ2VEYXRlKHN0cmluZyAkaWRlbnRpZmllcik6ID9cRGF0ZVRpbWVJbW11dGFibGUKewppZiAoJHRoaXMtPmdpdERyaXZlciAhPT0gbnVsbCkgewpyZXR1cm4gJHRoaXMtPmdpdERyaXZlci0+Z2V0Q2hhbmdlRGF0ZSgkaWRlbnRpZmllcik7Cn0KCiRyZXNvdXJjZSA9ICR0aGlzLT5mb3JnZWpvVXJsLT5hcGlVcmwuJy9naXQvY29tbWl0cy8nLnVybGVuY29kZSgkaWRlbnRpZmllcikuJz92ZXJpZmljYXRpb249ZmFsc2UmZmlsZXM9ZmFsc2UnOwokY29tbWl0ID0gJHRoaXMtPmdldENvbnRlbnRzKCRyZXNvdXJjZSktPmRlY29kZUpzb24oKTsKCnJldHVybiBuZXcgXERhdGVUaW1lSW1tdXRhYmxlKCRjb21taXRbJ2NvbW1pdCddWydjb21taXR0ZXInXVsnZGF0ZSddKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJvb3RJZGVudGlmaWVyKCk6IHN0cmluZwp7CmlmICgkdGhpcy0+Z2l0RHJpdmVyICE9PSBudWxsKSB7CnJldHVybiAkdGhpcy0+Z2l0RHJpdmVyLT5nZXRSb290SWRlbnRpZmllcigpOwp9CgpyZXR1cm4gJHRoaXMtPnJlcG9zaXRvcnlEYXRhLT5kZWZhdWx0QnJhbmNoOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0QnJhbmNoZXMoKTogYXJyYXkKewppZiAoJHRoaXMtPmdpdERyaXZlciAhPT0gbnVsbCkgewpyZXR1cm4gJHRoaXMtPmdpdERyaXZlci0+Z2V0QnJhbmNoZXMoKTsKfQoKaWYgKG51bGwgPT09ICR0aGlzLT5icmFuY2hlcykgewokYnJhbmNoZXMgPSBbXTsKJHJlc291cmNlID0gJHRoaXMtPmZvcmdlam9VcmwtPmFwaVVybC4nL2JyYW5jaGVzP3Blcl9wYWdlPTEwMCc7CgpkbyB7CiRyZXNwb25zZSA9ICR0aGlzLT5nZXRDb250ZW50cygkcmVzb3VyY2UpOwokYnJhbmNoRGF0YSA9ICRyZXNwb25zZS0+ZGVjb2RlSnNvbigpOwpmb3JlYWNoICgkYnJhbmNoRGF0YSBhcyAkYnJhbmNoKSB7CiRicmFuY2hlc1skYnJhbmNoWyduYW1lJ11dID0gJGJyYW5jaFsnY29tbWl0J11bJ2lkJ107Cn0KCiRyZXNvdXJjZSA9ICR0aGlzLT5nZXROZXh0UGFnZSgkcmVzcG9uc2UpOwp9IHdoaWxlICgkcmVzb3VyY2UpOwoKJHRoaXMtPmJyYW5jaGVzID0gJGJyYW5jaGVzOwp9CgpyZXR1cm4gJHRoaXMtPmJyYW5jaGVzOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGFncygpOiBhcnJheQp7CmlmICgkdGhpcy0+Z2l0RHJpdmVyICE9PSBudWxsKSB7CnJldHVybiAkdGhpcy0+Z2l0RHJpdmVyLT5nZXRUYWdzKCk7Cn0KaWYgKG51bGwgPT09ICR0aGlzLT50YWdzKSB7CiR0YWdzID0gW107CiRyZXNvdXJjZSA9ICR0aGlzLT5mb3JnZWpvVXJsLT5hcGlVcmwuJy90YWdzP3Blcl9wYWdlPTEwMCc7CgpkbyB7CiRyZXNwb25zZSA9ICR0aGlzLT5nZXRDb250ZW50cygkcmVzb3VyY2UpOwokdGFnc0RhdGEgPSAkcmVzcG9uc2UtPmRlY29kZUpzb24oKTsKZm9yZWFjaCAoJHRhZ3NEYXRhIGFzICR0YWcpIHsKJHRhZ3NbJHRhZ1snbmFtZSddXSA9ICR0YWdbJ2NvbW1pdCddWydzaGEnXTsKfQoKJHJlc291cmNlID0gJHRoaXMtPmdldE5leHRQYWdlKCRyZXNwb25zZSk7Cn0gd2hpbGUgKCRyZXNvdXJjZSk7CgokdGhpcy0+dGFncyA9ICR0YWdzOwp9CgpyZXR1cm4gJHRoaXMtPnRhZ3M7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0KHN0cmluZyAkaWRlbnRpZmllcik6ID9hcnJheQp7CiR1cmwgPSAkdGhpcy0+Zm9yZ2Vqb1VybC0+YXBpVXJsLicvYXJjaGl2ZS8nLiRpZGVudGlmaWVyLicuemlwJzsKCnJldHVybiBbJ3R5cGUnID0+ICd6aXAnLCAndXJsJyA9PiAkdXJsLCAncmVmZXJlbmNlJyA9PiAkaWRlbnRpZmllciwgJ3NoYXN1bScgPT4gJyddOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tcG9zZXJJbmZvcm1hdGlvbihzdHJpbmcgJGlkZW50aWZpZXIpOiA/YXJyYXkKewppZiAoJHRoaXMtPmdpdERyaXZlciAhPT0gbnVsbCkgewpyZXR1cm4gJHRoaXMtPmdpdERyaXZlci0+Z2V0Q29tcG9zZXJJbmZvcm1hdGlvbigkaWRlbnRpZmllcik7Cn0KCmlmICghaXNzZXQoJHRoaXMtPmluZm9DYWNoZVskaWRlbnRpZmllcl0pKSB7CmlmICgkdGhpcy0+c2hvdWxkQ2FjaGUoJGlkZW50aWZpZXIpICYmIGZhbHNlICE9PSAoJHJlcyA9ICR0aGlzLT5jYWNoZS0+cmVhZCgkaWRlbnRpZmllcikpKSB7CiRjb21wb3NlciA9IEpzb25GaWxlOjpwYXJzZUpzb24oJHJlcyk7Cn0gZWxzZSB7CiRjb21wb3NlciA9ICR0aGlzLT5nZXRCYXNlQ29tcG9zZXJJbmZvcm1hdGlvbigkaWRlbnRpZmllcik7CgppZiAoJHRoaXMtPnNob3VsZENhY2hlKCRpZGVudGlmaWVyKSkgewokdGhpcy0+Y2FjaGUtPndyaXRlKCRpZGVudGlmaWVyLCBKc29uRmlsZTo6ZW5jb2RlKCRjb21wb3NlciwgXEpTT05fVU5FU0NBUEVEX1VOSUNPREUgfCBcSlNPTl9VTkVTQ0FQRURfU0xBU0hFUykpOwp9Cn0KCmlmICgkY29tcG9zZXIgIT09IG51bGwpIHsKCmlmIChpc3NldCgkY29tcG9zZXJbJ3N1cHBvcnQnXSkgJiYgIWlzX2FycmF5KCRjb21wb3Nlclsnc3VwcG9ydCddKSkgewokY29tcG9zZXJbJ3N1cHBvcnQnXSA9IFtdOwp9CmlmICghaXNzZXQoJGNvbXBvc2VyWydzdXBwb3J0J11bJ3NvdXJjZSddKSkgewppZiAoZmFsc2UgIT09ICgkbGFiZWwgPSBhcnJheV9zZWFyY2goJGlkZW50aWZpZXIsICR0aGlzLT5nZXRUYWdzKCksIHRydWUpKSkgewokY29tcG9zZXJbJ3N1cHBvcnQnXVsnc291cmNlJ10gPSAkdGhpcy0+cmVwb3NpdG9yeURhdGEtPmh0bWxVcmwuJy90YWcvJyAuICRsYWJlbDsKfSBlbHNlaWYgKGZhbHNlICE9PSAoJGxhYmVsID0gYXJyYXlfc2VhcmNoKCRpZGVudGlmaWVyLCAkdGhpcy0+Z2V0QnJhbmNoZXMoKSwgdHJ1ZSkpKSB7CiRjb21wb3Nlclsnc3VwcG9ydCddWydzb3VyY2UnXSA9ICR0aGlzLT5yZXBvc2l0b3J5RGF0YS0+aHRtbFVybC4nL2JyYW5jaC8nLiRsYWJlbDsKfSBlbHNlIHsKJGNvbXBvc2VyWydzdXBwb3J0J11bJ3NvdXJjZSddID0gJHRoaXMtPnJlcG9zaXRvcnlEYXRhLT5odG1sVXJsLicvY29tbWl0LycuJGlkZW50aWZpZXI7Cn0KfQppZiAoIWlzc2V0KCRjb21wb3Nlclsnc3VwcG9ydCddWydpc3N1ZXMnXSkgJiYgJHRoaXMtPnJlcG9zaXRvcnlEYXRhLT5oYXNJc3N1ZXMpIHsKJGNvbXBvc2VyWydzdXBwb3J0J11bJ2lzc3VlcyddID0gJHRoaXMtPnJlcG9zaXRvcnlEYXRhLT5odG1sVXJsLicvaXNzdWVzJzsKfQppZiAoIWlzc2V0KCRjb21wb3NlclsnYWJhbmRvbmVkJ10pICYmICR0aGlzLT5yZXBvc2l0b3J5RGF0YS0+aXNBcmNoaXZlZCkgewokY29tcG9zZXJbJ2FiYW5kb25lZCddID0gdHJ1ZTsKfQp9CgokdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXSA9ICRjb21wb3NlcjsKfQoKcmV0dXJuICR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlKHN0cmluZyAkaWRlbnRpZmllcik6IGFycmF5CnsKaWYgKCR0aGlzLT5naXREcml2ZXIgIT09IG51bGwpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldFNvdXJjZSgkaWRlbnRpZmllcik7Cn0KCnJldHVybiBbJ3R5cGUnID0+ICdnaXQnLCAndXJsJyA9PiAkdGhpcy0+Z2V0VXJsKCksICdyZWZlcmVuY2UnID0+ICRpZGVudGlmaWVyXTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFVybCgpOiBzdHJpbmcKewppZiAoJHRoaXMtPmdpdERyaXZlciAhPT0gbnVsbCkgewpyZXR1cm4gJHRoaXMtPmdpdERyaXZlci0+Z2V0VXJsKCk7Cn0KCnJldHVybiAkdGhpcy0+cmVwb3NpdG9yeURhdGEtPmlzUHJpdmF0ZSA/ICR0aGlzLT5yZXBvc2l0b3J5RGF0YS0+c3NoVXJsIDogJHRoaXMtPnJlcG9zaXRvcnlEYXRhLT5odHRwQ2xvbmVVcmw7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3VwcG9ydHMoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgc3RyaW5nICR1cmwsIGJvb2wgJGRlZXAgPSBmYWxzZSk6IGJvb2wKewokZm9yZ2Vqb1VybCA9IEZvcmdlam9Vcmw6OnRyeUZyb20oJHVybCk7CmlmICgkZm9yZ2Vqb1VybCA9PT0gbnVsbCkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICghaW5fYXJyYXkoc3RydG9sb3dlcigkZm9yZ2Vqb1VybC0+b3JpZ2luVXJsKSwgJGNvbmZpZy0+Z2V0KCdmb3JnZWpvLWRvbWFpbnMnKSwgdHJ1ZSkpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoIWV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSkgewokaW8tPndyaXRlRXJyb3IoJ1NraXBwaW5nIEZvcmdlam8gZHJpdmVyIGZvciAnLiR1cmwuJyBiZWNhdXNlIHRoZSBPcGVuU1NMIFBIUCBleHRlbnNpb24gaXMgbWlzc2luZy4nLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7CgpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiB0cnVlOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0dXBHaXREcml2ZXIoc3RyaW5nICR1cmwpOiB2b2lkCnsKJHRoaXMtPmdpdERyaXZlciA9IG5ldyBHaXREcml2ZXIoClsndXJsJyA9PiAkdXJsXSwKJHRoaXMtPmlvLAokdGhpcy0+Y29uZmlnLAokdGhpcy0+aHR0cERvd25sb2FkZXIsCiR0aGlzLT5wcm9jZXNzCik7CiR0aGlzLT5naXREcml2ZXItPmluaXRpYWxpemUoKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBmZXRjaFJlcG9zaXRvcnlEYXRhKCk6IHZvaWQKewppZiAoJHRoaXMtPnJlcG9zaXRvcnlEYXRhICE9PSBudWxsKSB7CnJldHVybjsKfQoKJGRhdGEgPSAkdGhpcy0+Z2V0Q29udGVudHMoJHRoaXMtPmZvcmdlam9VcmwtPmFwaVVybCwgdHJ1ZSktPmRlY29kZUpzb24oKTsKCmlmIChudWxsID09PSAkZGF0YSAmJiBudWxsICE9PSAkdGhpcy0+Z2l0RHJpdmVyKSB7CnJldHVybjsKfQoKJHRoaXMtPnJlcG9zaXRvcnlEYXRhID0gRm9yZ2Vqb1JlcG9zaXRvcnlEYXRhOjpmcm9tUmVtb3RlRGF0YSgkZGF0YSk7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBnZXROZXh0UGFnZShSZXNwb25zZSAkcmVzcG9uc2UpOiA/c3RyaW5nCnsKJGhlYWRlciA9ICRyZXNwb25zZS0+Z2V0SGVhZGVyKCdsaW5rJyk7CmlmICgkaGVhZGVyID09PSBudWxsKSB7CnJldHVybiBudWxsOwp9CgokbGlua3MgPSBleHBsb2RlKCcsJywgJGhlYWRlcik7CmZvcmVhY2ggKCRsaW5rcyBhcyAkbGluaykgewppZiAoUHJlZzo6aXNNYXRjaCgnezwoLis/KT47ICpyZWw9Im5leHQifScsICRsaW5rLCAkbWF0Y2gpKSB7CnJldHVybiAkbWF0Y2hbMV07Cn0KfQoKcmV0dXJuIG51bGw7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRDb250ZW50cyhzdHJpbmcgJHVybCwgYm9vbCAkZmV0Y2hpbmdSZXBvRGF0YSA9IGZhbHNlKTogUmVzcG9uc2UKewokZm9yZ2VqbyA9IG5ldyBGb3JnZWpvKCR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPmh0dHBEb3dubG9hZGVyKTsKCnRyeSB7CnJldHVybiBwYXJlbnQ6OmdldENvbnRlbnRzKCR1cmwpOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKc3dpdGNoICgkZS0+Z2V0Q29kZSgpKSB7CmNhc2UgNDAxOgpjYXNlIDQwMzoKY2FzZSA0MDQ6CmNhc2UgNDI5OgppZiAoISRmZXRjaGluZ1JlcG9EYXRhKSB7CnRocm93ICRlOwp9CgppZiAoISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpKSB7CiR0aGlzLT5hdHRlbXB0Q2xvbmVGYWxsYmFjaygpOwoKcmV0dXJuIG5ldyBSZXNwb25zZShbJ3VybCcgPT4gJ2R1bW15J10sIDIwMCwgW10sICdudWxsJyk7Cn0KCmlmICgKISR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJHRoaXMtPm9yaWdpblVybCkgJiYKJGZvcmdlam8tPmF1dGhvcml6ZU9BdXRoSW50ZXJhY3RpdmVseSgkdGhpcy0+Zm9yZ2Vqb1VybC0+b3JpZ2luVXJsLCAkZS0+Z2V0Q29kZSgpID09PSA0MjkgPyAnQVBJIGxpbWl0IGV4aGF1c3RlZC4gRW50ZXIgeW91ciBGb3JnZWpvIGNyZWRlbnRpYWxzIHRvIGdldCBhIGxhcmdlciBBUEkgbGltaXQgKDxpbmZvPicuJHRoaXMtPnVybC4nPC9pbmZvPiknIDogbnVsbCkKKSB7CnJldHVybiBwYXJlbnQ6OmdldENvbnRlbnRzKCR1cmwpOwp9Cgp0aHJvdyAkZTsKZGVmYXVsdDoKdGhyb3cgJGU7Cn0KfQp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gYXR0ZW1wdENsb25lRmFsbGJhY2soKTogYm9vbAp7CnRyeSB7CgoKCgokdGhpcy0+c2V0dXBHaXREcml2ZXIoJHRoaXMtPmZvcmdlam9VcmwtPmdlbmVyYXRlU3NoVXJsKCkpOwoKcmV0dXJuIHRydWU7Cn0gY2F0Y2ggKFxSdW50aW1lRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5naXREcml2ZXIgPSBudWxsOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+RmFpbGVkIHRvIGNsb25lIHRoZSAnLiR0aGlzLT5mb3JnZWpvVXJsLT5nZW5lcmF0ZVNzaFVybCgpLicgcmVwb3NpdG9yeSwgdHJ5IHJ1bm5pbmcgaW4gaW50ZXJhY3RpdmUgbW9kZSBzbyB0aGF0IHlvdSBjYW4gZW50ZXIgeW91ciBGb3JnZWpvIGNyZWRlbnRpYWxzPC9lcnJvcj4nKTsKdGhyb3cgJGU7Cn0KfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5XFZjczsKCnVzZSBDb21wb3NlclxDYWNoZTsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CgoKCgpjbGFzcyBGb3NzaWxEcml2ZXIgZXh0ZW5kcyBWY3NEcml2ZXIKewoKcHJvdGVjdGVkICR0YWdzOwoKcHJvdGVjdGVkICRicmFuY2hlczsKCnByb3RlY3RlZCAkcm9vdElkZW50aWZpZXIgPSBudWxsOwoKcHJvdGVjdGVkICRyZXBvRmlsZSA9IG51bGw7Cgpwcm90ZWN0ZWQgJGNoZWNrb3V0RGlyOwoKCgoKcHVibGljIGZ1bmN0aW9uIGluaXRpYWxpemUoKTogdm9pZAp7CgokdGhpcy0+Y2hlY2tGb3NzaWwoKTsKCgokdGhpcy0+Y29uZmlnLT5wcm9oaWJpdFVybEJ5Q29uZmlnKCR0aGlzLT51cmwsICR0aGlzLT5pbyk7CgoKCmlmIChGaWxlc3lzdGVtOjppc0xvY2FsUGF0aCgkdGhpcy0+dXJsKSAmJiBpc19kaXIoJHRoaXMtPnVybCkpIHsKJHRoaXMtPmNoZWNrb3V0RGlyID0gJHRoaXMtPnVybDsKfSBlbHNlIHsKaWYgKCFDYWNoZTo6aXNVc2FibGUoJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS1yZXBvLWRpcicpKSB8fCAhQ2FjaGU6OmlzVXNhYmxlKCR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtdmNzLWRpcicpKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0Zvc3NpbERyaXZlciByZXF1aXJlcyBhIHVzYWJsZSBjYWNoZSBkaXJlY3RvcnksIGFuZCBpdCBsb29rcyBsaWtlIHlvdSBzZXQgaXQgdG8gYmUgZGlzYWJsZWQnKTsKfQoKJGxvY2FsTmFtZSA9IFByZWc6OnJlcGxhY2UoJ3tbXmEtejAtOV19aScsICctJywgJHRoaXMtPnVybCk7CiR0aGlzLT5yZXBvRmlsZSA9ICR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtcmVwby1kaXInKSAuICcvJyAuICRsb2NhbE5hbWUgLiAnLmZvc3NpbCc7CiR0aGlzLT5jaGVja291dERpciA9ICR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtdmNzLWRpcicpIC4gJy8nIC4gJGxvY2FsTmFtZSAuICcvJzsKCiR0aGlzLT51cGRhdGVMb2NhbFJlcG8oKTsKfQoKJHRoaXMtPmdldFRhZ3MoKTsKJHRoaXMtPmdldEJyYW5jaGVzKCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjaGVja0Zvc3NpbCgpOiB2b2lkCnsKaWYgKDAgIT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZm9zc2lsJywgJ3ZlcnNpb24nXSwgJGlnbm9yZWRPdXRwdXQpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigiZm9zc2lsIHdhcyBub3QgZm91bmQsIGNoZWNrIHRoYXQgaXQgaXMgaW5zdGFsbGVkIGFuZCBpbiB5b3VyIFBBVEggZW52LlxuXG4iIC4gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCkpOwp9Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB1cGRhdGVMb2NhbFJlcG8oKTogdm9pZAp7CmFzc2VydCgkdGhpcy0+cmVwb0ZpbGUgIT09IG51bGwpOwoKJGZzID0gbmV3IEZpbGVzeXN0ZW0oKTsKJGZzLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoJHRoaXMtPmNoZWNrb3V0RGlyKTsKCmlmICghaXNfd3JpdGFibGUoZGlybmFtZSgkdGhpcy0+Y2hlY2tvdXREaXIpKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NhbiBub3QgY2xvbmUgJy4kdGhpcy0+dXJsLicgdG8gYWNjZXNzIHBhY2thZ2UgaW5mb3JtYXRpb24uIFRoZSAiJy4kdGhpcy0+Y2hlY2tvdXREaXIuJyIgZGlyZWN0b3J5IGlzIG5vdCB3cml0YWJsZSBieSB0aGUgY3VycmVudCB1c2VyLicpOwp9CgoKaWYgKGlzX2ZpbGUoJHRoaXMtPnJlcG9GaWxlKSAmJiBpc19kaXIoJHRoaXMtPmNoZWNrb3V0RGlyKSAmJiAwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2Zvc3NpbCcsICdpbmZvJ10sICRvdXRwdXQsICR0aGlzLT5jaGVja291dERpcikpIHsKaWYgKDAgIT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZm9zc2lsJywgJ3B1bGwnXSwgJG91dHB1dCwgJHRoaXMtPmNoZWNrb3V0RGlyKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj5GYWlsZWQgdG8gdXBkYXRlICcuJHRoaXMtPnVybC4nLCBwYWNrYWdlIGluZm9ybWF0aW9uIGZyb20gdGhpcyByZXBvc2l0b3J5IG1heSBiZSBvdXRkYXRlZCAoJy4kdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKS4nKTwvZXJyb3I+Jyk7Cn0KfSBlbHNlIHsKCiRmcy0+cmVtb3ZlRGlyZWN0b3J5KCR0aGlzLT5jaGVja291dERpcik7CiRmcy0+cmVtb3ZlKCR0aGlzLT5yZXBvRmlsZSk7CgokZnMtPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkdGhpcy0+Y2hlY2tvdXREaXIpOwoKaWYgKDAgIT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZm9zc2lsJywgJ2Nsb25lJywgJy0tJywgJHRoaXMtPnVybCwgJHRoaXMtPnJlcG9GaWxlXSwgJG91dHB1dCkpIHsKJG91dHB1dCA9ICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpOwoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gY2xvbmUgJy4kdGhpcy0+dXJsLicgdG8gcmVwb3NpdG9yeSAnIC4gJHRoaXMtPnJlcG9GaWxlIC4gIlxuXG4iIC4kb3V0cHV0KTsKfQoKaWYgKDAgIT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZm9zc2lsJywgJ29wZW4nLCAnLS1uZXN0ZWQnLCAnLS0nLCAkdGhpcy0+cmVwb0ZpbGVdLCAkb3V0cHV0LCAkdGhpcy0+Y2hlY2tvdXREaXIpKSB7CiRvdXRwdXQgPSAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKTsKCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIG9wZW4gcmVwb3NpdG9yeSAnLiR0aGlzLT5yZXBvRmlsZS4nIGluICcgLiAkdGhpcy0+Y2hlY2tvdXREaXIgLiAiXG5cbiIgLiRvdXRwdXQpOwp9Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJvb3RJZGVudGlmaWVyKCk6IHN0cmluZwp7CmlmIChudWxsID09PSAkdGhpcy0+cm9vdElkZW50aWZpZXIpIHsKJHRoaXMtPnJvb3RJZGVudGlmaWVyID0gJ3RydW5rJzsKfQoKcmV0dXJuICR0aGlzLT5yb290SWRlbnRpZmllcjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVybCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnVybDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZShzdHJpbmcgJGlkZW50aWZpZXIpOiBhcnJheQp7CnJldHVybiBbJ3R5cGUnID0+ICdmb3NzaWwnLCAndXJsJyA9PiAkdGhpcy0+Z2V0VXJsKCksICdyZWZlcmVuY2UnID0+ICRpZGVudGlmaWVyXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3Qoc3RyaW5nICRpZGVudGlmaWVyKTogP2FycmF5CnsKcmV0dXJuIG51bGw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlQ29udGVudChzdHJpbmcgJGZpbGUsIHN0cmluZyAkaWRlbnRpZmllcik6ID9zdHJpbmcKewppZiAoaXNzZXQoJGlkZW50aWZpZXJbMF0pICYmICRpZGVudGlmaWVyWzBdID09PSAnLScpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdJbnZhbGlkIGZvc3NpbCBpZGVudGlmaWVyIGRldGVjdGVkLiBJZGVudGlmaWVyIG11c3Qgbm90IHN0YXJ0IHdpdGggYSAtLCBnaXZlbjogJyAuICRpZGVudGlmaWVyKTsKfQoKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydmb3NzaWwnLCAnY2F0JywgJy1yJywgJGlkZW50aWZpZXIsICctLScsICRmaWxlXSwgJGNvbnRlbnQsICR0aGlzLT5jaGVja291dERpcik7CgppZiAoJycgPT09IHRyaW0oJGNvbnRlbnQpKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gJGNvbnRlbnQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDaGFuZ2VEYXRlKHN0cmluZyAkaWRlbnRpZmllcik6ID9cRGF0ZVRpbWVJbW11dGFibGUKewokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2Zvc3NpbCcsICdmaW5mbycsICctYicsICctbicsICcxJywgJ2NvbXBvc2VyLmpzb24nXSwgJG91dHB1dCwgJHRoaXMtPmNoZWNrb3V0RGlyKTsKWywgJGRhdGVdID0gZXhwbG9kZSgnICcsIHRyaW0oJG91dHB1dCksIDMpOwoKcmV0dXJuIG5ldyBcRGF0ZVRpbWVJbW11dGFibGUoJGRhdGUsIG5ldyBcRGF0ZVRpbWVab25lKCdVVEMnKSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUYWdzKCk6IGFycmF5CnsKaWYgKG51bGwgPT09ICR0aGlzLT50YWdzKSB7CiR0YWdzID0gW107CgokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2Zvc3NpbCcsICd0YWcnLCAnbGlzdCddLCAkb3V0cHV0LCAkdGhpcy0+Y2hlY2tvdXREaXIpOwpmb3JlYWNoICgkdGhpcy0+cHJvY2Vzcy0+c3BsaXRMaW5lcygkb3V0cHV0KSBhcyAkdGFnKSB7CiR0YWdzWyR0YWddID0gJHRhZzsKfQoKJHRoaXMtPnRhZ3MgPSAkdGFnczsKfQoKcmV0dXJuICR0aGlzLT50YWdzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QnJhbmNoZXMoKTogYXJyYXkKewppZiAobnVsbCA9PT0gJHRoaXMtPmJyYW5jaGVzKSB7CiRicmFuY2hlcyA9IFtdOwoKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydmb3NzaWwnLCAnYnJhbmNoJywgJ2xpc3QnXSwgJG91dHB1dCwgJHRoaXMtPmNoZWNrb3V0RGlyKTsKZm9yZWFjaCAoJHRoaXMtPnByb2Nlc3MtPnNwbGl0TGluZXMoJG91dHB1dCkgYXMgJGJyYW5jaCkgewokYnJhbmNoID0gdHJpbShQcmVnOjpyZXBsYWNlKCcvXlwqLycsICcnLCB0cmltKCRicmFuY2gpKSk7CiRicmFuY2hlc1skYnJhbmNoXSA9ICRicmFuY2g7Cn0KCiR0aGlzLT5icmFuY2hlcyA9ICRicmFuY2hlczsKfQoKcmV0dXJuICR0aGlzLT5icmFuY2hlczsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdXBwb3J0cyhJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBzdHJpbmcgJHVybCwgYm9vbCAkZGVlcCA9IGZhbHNlKTogYm9vbAp7CmlmIChQcmVnOjppc01hdGNoKCcjKF4oPzpodHRwcz98c3NoKTovLyg/OlteQF1AKT8oPzpjaGlzZWxhcHBcLmNvbXxmb3NzaWxcLikpI2knLCAkdXJsKSkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKFByZWc6OmlzTWF0Y2goJyEvZm9zc2lsL3xcLmZvc3NpbCEnLCAkdXJsKSkgewpyZXR1cm4gdHJ1ZTsKfQoKCmlmIChGaWxlc3lzdGVtOjppc0xvY2FsUGF0aCgkdXJsKSkgewokdXJsID0gRmlsZXN5c3RlbTo6Z2V0UGxhdGZvcm1QYXRoKCR1cmwpOwppZiAoIWlzX2RpcigkdXJsKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRwcm9jZXNzID0gbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwoKaWYgKCRwcm9jZXNzLT5leGVjdXRlKFsnZm9zc2lsJywgJ2luZm8nXSwgJG91dHB1dCwgJHVybCkgPT09IDApIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnlcVmNzOwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ2FjaGU7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEJpdGJ1Y2tldDsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cFxSZXNwb25zZTsKCgoKCmNsYXNzIEdpdEJpdGJ1Y2tldERyaXZlciBleHRlbmRzIFZjc0RyaXZlcgp7Cgpwcm90ZWN0ZWQgJG93bmVyOwoKcHJvdGVjdGVkICRyZXBvc2l0b3J5OwoKcHJpdmF0ZSAkaGFzSXNzdWVzID0gZmFsc2U7Cgpwcml2YXRlICRyb290SWRlbnRpZmllcjsKCnByaXZhdGUgJHRhZ3M7Cgpwcml2YXRlICRicmFuY2hlczsKCnByaXZhdGUgJGJyYW5jaGVzVXJsID0gJyc7Cgpwcml2YXRlICR0YWdzVXJsID0gJyc7Cgpwcml2YXRlICRob21lVXJsID0gJyc7Cgpwcml2YXRlICR3ZWJzaXRlID0gJyc7Cgpwcml2YXRlICRjbG9uZUh0dHBzVXJsID0gJyc7Cgpwcml2YXRlICRyZXBvRGF0YTsKCgoKCnByb3RlY3RlZCAkZmFsbGJhY2tEcml2ZXIgPSBudWxsOwoKcHJpdmF0ZSAkdmNzVHlwZTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbml0aWFsaXplKCk6IHZvaWQKewppZiAoIVByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJyNeaHR0cHM/Oi8vYml0YnVja2V0XC5vcmcvKFteL10rKS8oW14vXSs/KSg/OlwuZ2l0fC8/KT8kI2knLCAkdGhpcy0+dXJsLCAkbWF0Y2gpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSBCaXRidWNrZXQgcmVwb3NpdG9yeSBVUkwgJXMgaXMgaW52YWxpZC4gSXQgbXVzdCBiZSB0aGUgSFRUUFMgVVJMIG9mIGEgQml0YnVja2V0IHJlcG9zaXRvcnkuJywgJHRoaXMtPnVybCkpOwp9CgokdGhpcy0+b3duZXIgPSAkbWF0Y2hbMV07CiR0aGlzLT5yZXBvc2l0b3J5ID0gJG1hdGNoWzJdOwokdGhpcy0+b3JpZ2luVXJsID0gJ2JpdGJ1Y2tldC5vcmcnOwokdGhpcy0+Y2FjaGUgPSBuZXcgQ2FjaGUoCiR0aGlzLT5pbywKaW1wbG9kZSgnLycsIFsKJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS1yZXBvLWRpcicpLAokdGhpcy0+b3JpZ2luVXJsLAokdGhpcy0+b3duZXIsCiR0aGlzLT5yZXBvc2l0b3J5LApdKQopOwokdGhpcy0+Y2FjaGUtPnNldFJlYWRPbmx5KCR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtcmVhZC1vbmx5JykpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXJsKCk6IHN0cmluZwp7CmlmICgkdGhpcy0+ZmFsbGJhY2tEcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5mYWxsYmFja0RyaXZlci0+Z2V0VXJsKCk7Cn0KCnJldHVybiAkdGhpcy0+Y2xvbmVIdHRwc1VybDsKfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFJlcG9EYXRhKCk6IGJvb2wKewokcmVzb3VyY2UgPSBzcHJpbnRmKAonaHR0cHM6Ly9hcGkuYml0YnVja2V0Lm9yZy8yLjAvcmVwb3NpdG9yaWVzLyVzLyVzPyVzJywKJHRoaXMtPm93bmVyLAokdGhpcy0+cmVwb3NpdG9yeSwKaHR0cF9idWlsZF9xdWVyeSgKWydmaWVsZHMnID0+ICctcHJvamVjdCwtb3duZXInXSwKJycsCicmJwopCik7CgokcmVwb0RhdGEgPSAkdGhpcy0+ZmV0Y2hXaXRoT0F1dGhDcmVkZW50aWFscygkcmVzb3VyY2UsIHRydWUpLT5kZWNvZGVKc29uKCk7CmlmICgkdGhpcy0+ZmFsbGJhY2tEcml2ZXIpIHsKcmV0dXJuIGZhbHNlOwp9CiR0aGlzLT5wYXJzZUNsb25lVXJscygkcmVwb0RhdGFbJ2xpbmtzJ11bJ2Nsb25lJ10pOwoKJHRoaXMtPmhhc0lzc3VlcyA9ICFlbXB0eSgkcmVwb0RhdGFbJ2hhc19pc3N1ZXMnXSk7CiR0aGlzLT5icmFuY2hlc1VybCA9ICRyZXBvRGF0YVsnbGlua3MnXVsnYnJhbmNoZXMnXVsnaHJlZiddOwokdGhpcy0+dGFnc1VybCA9ICRyZXBvRGF0YVsnbGlua3MnXVsndGFncyddWydocmVmJ107CiR0aGlzLT5ob21lVXJsID0gJHJlcG9EYXRhWydsaW5rcyddWydodG1sJ11bJ2hyZWYnXTsKJHRoaXMtPndlYnNpdGUgPSAkcmVwb0RhdGFbJ3dlYnNpdGUnXTsKJHRoaXMtPnZjc1R5cGUgPSAkcmVwb0RhdGFbJ3NjbSddOwoKJHRoaXMtPnJlcG9EYXRhID0gJHJlcG9EYXRhOwoKcmV0dXJuIHRydWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21wb3NlckluZm9ybWF0aW9uKHN0cmluZyAkaWRlbnRpZmllcik6ID9hcnJheQp7CmlmICgkdGhpcy0+ZmFsbGJhY2tEcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5mYWxsYmFja0RyaXZlci0+Z2V0Q29tcG9zZXJJbmZvcm1hdGlvbigkaWRlbnRpZmllcik7Cn0KCmlmICghaXNzZXQoJHRoaXMtPmluZm9DYWNoZVskaWRlbnRpZmllcl0pKSB7CmlmICgkdGhpcy0+c2hvdWxkQ2FjaGUoJGlkZW50aWZpZXIpICYmICRyZXMgPSAkdGhpcy0+Y2FjaGUtPnJlYWQoJGlkZW50aWZpZXIpKSB7CiRjb21wb3NlciA9IEpzb25GaWxlOjpwYXJzZUpzb24oJHJlcyk7Cn0gZWxzZSB7CiRjb21wb3NlciA9ICR0aGlzLT5nZXRCYXNlQ29tcG9zZXJJbmZvcm1hdGlvbigkaWRlbnRpZmllcik7CgppZiAoJHRoaXMtPnNob3VsZENhY2hlKCRpZGVudGlmaWVyKSkgewokdGhpcy0+Y2FjaGUtPndyaXRlKCRpZGVudGlmaWVyLCBKc29uRmlsZTo6ZW5jb2RlKCRjb21wb3NlciwgXEpTT05fVU5FU0NBUEVEX1VOSUNPREUgfCBcSlNPTl9VTkVTQ0FQRURfU0xBU0hFUykpOwp9Cn0KCmlmICgkY29tcG9zZXIgIT09IG51bGwpIHsKCmlmIChpc3NldCgkY29tcG9zZXJbJ3N1cHBvcnQnXSkgJiYgIWlzX2FycmF5KCRjb21wb3Nlclsnc3VwcG9ydCddKSkgewokY29tcG9zZXJbJ3N1cHBvcnQnXSA9IFtdOwp9CmlmICghaXNzZXQoJGNvbXBvc2VyWydzdXBwb3J0J11bJ3NvdXJjZSddKSkgewokbGFiZWwgPSBhcnJheV9zZWFyY2goCiRpZGVudGlmaWVyLAokdGhpcy0+Z2V0VGFncygpCikgPzogYXJyYXlfc2VhcmNoKAokaWRlbnRpZmllciwKJHRoaXMtPmdldEJyYW5jaGVzKCkKKSA/OiAkaWRlbnRpZmllcjsKCmlmIChhcnJheV9rZXlfZXhpc3RzKCRsYWJlbCwgJHRhZ3MgPSAkdGhpcy0+Z2V0VGFncygpKSkgewokaGFzaCA9ICR0YWdzWyRsYWJlbF07Cn0gZWxzZWlmIChhcnJheV9rZXlfZXhpc3RzKCRsYWJlbCwgJGJyYW5jaGVzID0gJHRoaXMtPmdldEJyYW5jaGVzKCkpKSB7CiRoYXNoID0gJGJyYW5jaGVzWyRsYWJlbF07Cn0KCmlmICghaXNzZXQoJGhhc2gpKSB7CiRjb21wb3Nlclsnc3VwcG9ydCddWydzb3VyY2UnXSA9IHNwcmludGYoCidodHRwczovLyVzLyVzLyVzL3NyYycsCiR0aGlzLT5vcmlnaW5VcmwsCiR0aGlzLT5vd25lciwKJHRoaXMtPnJlcG9zaXRvcnkKKTsKfSBlbHNlIHsKJGNvbXBvc2VyWydzdXBwb3J0J11bJ3NvdXJjZSddID0gc3ByaW50ZigKJ2h0dHBzOi8vJXMvJXMvJXMvc3JjLyVzLz9hdD0lcycsCiR0aGlzLT5vcmlnaW5VcmwsCiR0aGlzLT5vd25lciwKJHRoaXMtPnJlcG9zaXRvcnksCiRoYXNoLAokbGFiZWwKKTsKfQp9CmlmICghaXNzZXQoJGNvbXBvc2VyWydzdXBwb3J0J11bJ2lzc3VlcyddKSAmJiAkdGhpcy0+aGFzSXNzdWVzKSB7CiRjb21wb3Nlclsnc3VwcG9ydCddWydpc3N1ZXMnXSA9IHNwcmludGYoCidodHRwczovLyVzLyVzLyVzL2lzc3VlcycsCiR0aGlzLT5vcmlnaW5VcmwsCiR0aGlzLT5vd25lciwKJHRoaXMtPnJlcG9zaXRvcnkKKTsKfQppZiAoIWlzc2V0KCRjb21wb3NlclsnaG9tZXBhZ2UnXSkpIHsKJGNvbXBvc2VyWydob21lcGFnZSddID0gZW1wdHkoJHRoaXMtPndlYnNpdGUpID8gJHRoaXMtPmhvbWVVcmwgOiAkdGhpcy0+d2Vic2l0ZTsKfQp9CgokdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXSA9ICRjb21wb3NlcjsKfQoKcmV0dXJuICR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZUNvbnRlbnQoc3RyaW5nICRmaWxlLCBzdHJpbmcgJGlkZW50aWZpZXIpOiA/c3RyaW5nCnsKaWYgKCR0aGlzLT5mYWxsYmFja0RyaXZlcikgewpyZXR1cm4gJHRoaXMtPmZhbGxiYWNrRHJpdmVyLT5nZXRGaWxlQ29udGVudCgkZmlsZSwgJGlkZW50aWZpZXIpOwp9CgppZiAoc3RycG9zKCRpZGVudGlmaWVyLCAnLycpICE9PSBmYWxzZSkgewokYnJhbmNoZXMgPSAkdGhpcy0+Z2V0QnJhbmNoZXMoKTsKaWYgKGlzc2V0KCRicmFuY2hlc1skaWRlbnRpZmllcl0pKSB7CiRpZGVudGlmaWVyID0gJGJyYW5jaGVzWyRpZGVudGlmaWVyXTsKfQp9CgokcmVzb3VyY2UgPSBzcHJpbnRmKAonaHR0cHM6Ly9hcGkuYml0YnVja2V0Lm9yZy8yLjAvcmVwb3NpdG9yaWVzLyVzLyVzL3NyYy8lcy8lcycsCiR0aGlzLT5vd25lciwKJHRoaXMtPnJlcG9zaXRvcnksCiRpZGVudGlmaWVyLAokZmlsZQopOwoKcmV0dXJuICR0aGlzLT5mZXRjaFdpdGhPQXV0aENyZWRlbnRpYWxzKCRyZXNvdXJjZSktPmdldEJvZHkoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENoYW5nZURhdGUoc3RyaW5nICRpZGVudGlmaWVyKTogP1xEYXRlVGltZUltbXV0YWJsZQp7CmlmICgkdGhpcy0+ZmFsbGJhY2tEcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5mYWxsYmFja0RyaXZlci0+Z2V0Q2hhbmdlRGF0ZSgkaWRlbnRpZmllcik7Cn0KCmlmIChzdHJwb3MoJGlkZW50aWZpZXIsICcvJykgIT09IGZhbHNlKSB7CiRicmFuY2hlcyA9ICR0aGlzLT5nZXRCcmFuY2hlcygpOwppZiAoaXNzZXQoJGJyYW5jaGVzWyRpZGVudGlmaWVyXSkpIHsKJGlkZW50aWZpZXIgPSAkYnJhbmNoZXNbJGlkZW50aWZpZXJdOwp9Cn0KCiRyZXNvdXJjZSA9IHNwcmludGYoCidodHRwczovL2FwaS5iaXRidWNrZXQub3JnLzIuMC9yZXBvc2l0b3JpZXMvJXMvJXMvY29tbWl0LyVzP2ZpZWxkcz1kYXRlJywKJHRoaXMtPm93bmVyLAokdGhpcy0+cmVwb3NpdG9yeSwKJGlkZW50aWZpZXIKKTsKJGNvbW1pdCA9ICR0aGlzLT5mZXRjaFdpdGhPQXV0aENyZWRlbnRpYWxzKCRyZXNvdXJjZSktPmRlY29kZUpzb24oKTsKCnJldHVybiBuZXcgXERhdGVUaW1lSW1tdXRhYmxlKCRjb21taXRbJ2RhdGUnXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2Uoc3RyaW5nICRpZGVudGlmaWVyKTogYXJyYXkKewppZiAoJHRoaXMtPmZhbGxiYWNrRHJpdmVyKSB7CnJldHVybiAkdGhpcy0+ZmFsbGJhY2tEcml2ZXItPmdldFNvdXJjZSgkaWRlbnRpZmllcik7Cn0KCnJldHVybiBbJ3R5cGUnID0+ICR0aGlzLT52Y3NUeXBlLCAndXJsJyA9PiAkdGhpcy0+Z2V0VXJsKCksICdyZWZlcmVuY2UnID0+ICRpZGVudGlmaWVyXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3Qoc3RyaW5nICRpZGVudGlmaWVyKTogP2FycmF5CnsKaWYgKCR0aGlzLT5mYWxsYmFja0RyaXZlcikgewpyZXR1cm4gJHRoaXMtPmZhbGxiYWNrRHJpdmVyLT5nZXREaXN0KCRpZGVudGlmaWVyKTsKfQoKJHVybCA9IHNwcmludGYoCidodHRwczovL2JpdGJ1Y2tldC5vcmcvJXMvJXMvZ2V0LyVzLnppcCcsCiR0aGlzLT5vd25lciwKJHRoaXMtPnJlcG9zaXRvcnksCiRpZGVudGlmaWVyCik7CgpyZXR1cm4gWyd0eXBlJyA9PiAnemlwJywgJ3VybCcgPT4gJHVybCwgJ3JlZmVyZW5jZScgPT4gJGlkZW50aWZpZXIsICdzaGFzdW0nID0+ICcnXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRhZ3MoKTogYXJyYXkKewppZiAoJHRoaXMtPmZhbGxiYWNrRHJpdmVyKSB7CnJldHVybiAkdGhpcy0+ZmFsbGJhY2tEcml2ZXItPmdldFRhZ3MoKTsKfQoKaWYgKG51bGwgPT09ICR0aGlzLT50YWdzKSB7CiR0YWdzID0gW107CiRyZXNvdXJjZSA9IHNwcmludGYoCiclcz8lcycsCiR0aGlzLT50YWdzVXJsLApodHRwX2J1aWxkX3F1ZXJ5KApbCidwYWdlbGVuJyA9PiAxMDAsCidmaWVsZHMnID0+ICd2YWx1ZXMubmFtZSx2YWx1ZXMudGFyZ2V0Lmhhc2gsbmV4dCcsCidzb3J0JyA9PiAnLXRhcmdldC5kYXRlJywKXSwKJycsCicmJwopCik7CiRoYXNOZXh0ID0gdHJ1ZTsKd2hpbGUgKCRoYXNOZXh0KSB7CiR0YWdzRGF0YSA9ICR0aGlzLT5mZXRjaFdpdGhPQXV0aENyZWRlbnRpYWxzKCRyZXNvdXJjZSktPmRlY29kZUpzb24oKTsKZm9yZWFjaCAoJHRhZ3NEYXRhWyd2YWx1ZXMnXSBhcyAkZGF0YSkgewokdGFnc1skZGF0YVsnbmFtZSddXSA9ICRkYXRhWyd0YXJnZXQnXVsnaGFzaCddOwp9CmlmIChlbXB0eSgkdGFnc0RhdGFbJ25leHQnXSkpIHsKJGhhc05leHQgPSBmYWxzZTsKfSBlbHNlIHsKJHJlc291cmNlID0gJHRhZ3NEYXRhWyduZXh0J107Cn0KfQoKJHRoaXMtPnRhZ3MgPSAkdGFnczsKfQoKcmV0dXJuICR0aGlzLT50YWdzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QnJhbmNoZXMoKTogYXJyYXkKewppZiAoJHRoaXMtPmZhbGxiYWNrRHJpdmVyKSB7CnJldHVybiAkdGhpcy0+ZmFsbGJhY2tEcml2ZXItPmdldEJyYW5jaGVzKCk7Cn0KCmlmIChudWxsID09PSAkdGhpcy0+YnJhbmNoZXMpIHsKJGJyYW5jaGVzID0gW107CiRyZXNvdXJjZSA9IHNwcmludGYoCiclcz8lcycsCiR0aGlzLT5icmFuY2hlc1VybCwKaHR0cF9idWlsZF9xdWVyeSgKWwoncGFnZWxlbicgPT4gMTAwLAonZmllbGRzJyA9PiAndmFsdWVzLm5hbWUsdmFsdWVzLnRhcmdldC5oYXNoLHZhbHVlcy5oZWFkcyxuZXh0JywKJ3NvcnQnID0+ICctdGFyZ2V0LmRhdGUnLApdLAonJywKJyYnCikKKTsKJGhhc05leHQgPSB0cnVlOwp3aGlsZSAoJGhhc05leHQpIHsKJGJyYW5jaERhdGEgPSAkdGhpcy0+ZmV0Y2hXaXRoT0F1dGhDcmVkZW50aWFscygkcmVzb3VyY2UpLT5kZWNvZGVKc29uKCk7CmZvcmVhY2ggKCRicmFuY2hEYXRhWyd2YWx1ZXMnXSBhcyAkZGF0YSkgewokYnJhbmNoZXNbJGRhdGFbJ25hbWUnXV0gPSAkZGF0YVsndGFyZ2V0J11bJ2hhc2gnXTsKfQppZiAoZW1wdHkoJGJyYW5jaERhdGFbJ25leHQnXSkpIHsKJGhhc05leHQgPSBmYWxzZTsKfSBlbHNlIHsKJHJlc291cmNlID0gJGJyYW5jaERhdGFbJ25leHQnXTsKfQp9CgokdGhpcy0+YnJhbmNoZXMgPSAkYnJhbmNoZXM7Cn0KCnJldHVybiAkdGhpcy0+YnJhbmNoZXM7Cn0KCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBmZXRjaFdpdGhPQXV0aENyZWRlbnRpYWxzKHN0cmluZyAkdXJsLCBib29sICRmZXRjaGluZ1JlcG9EYXRhID0gZmFsc2UpOiBSZXNwb25zZQp7CnRyeSB7CnJldHVybiBwYXJlbnQ6OmdldENvbnRlbnRzKCR1cmwpOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKJGJpdGJ1Y2tldFV0aWwgPSBuZXcgQml0YnVja2V0KCR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPnByb2Nlc3MsICR0aGlzLT5odHRwRG93bmxvYWRlcik7CgppZiAoaW5fYXJyYXkoJGUtPmdldENvZGUoKSwgWzQwMywgNDA0XSwgdHJ1ZSkgfHwgKDQwMSA9PT0gJGUtPmdldENvZGUoKSAmJiBzdHJwb3MoJGUtPmdldE1lc3NhZ2UoKSwgJ0NvdWxkIG5vdCBhdXRoZW50aWNhdGUgYWdhaW5zdCcpID09PSAwKSkgewppZiAoISR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJHRoaXMtPm9yaWdpblVybCkKJiYgJGJpdGJ1Y2tldFV0aWwtPmF1dGhvcml6ZU9BdXRoKCR0aGlzLT5vcmlnaW5VcmwpCikgewpyZXR1cm4gcGFyZW50OjpnZXRDb250ZW50cygkdXJsKTsKfQoKaWYgKCEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSAmJiAkZmV0Y2hpbmdSZXBvRGF0YSkgewokdGhpcy0+YXR0ZW1wdENsb25lRmFsbGJhY2soKTsKCnJldHVybiBuZXcgUmVzcG9uc2UoWyd1cmwnID0+ICdkdW1teSddLCAyMDAsIFtdLCAnbnVsbCcpOwp9Cn0KCnRocm93ICRlOwp9Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZW5lcmF0ZVNzaFVybCgpOiBzdHJpbmcKewpyZXR1cm4gJ2dpdEAnIC4gJHRoaXMtPm9yaWdpblVybCAuICc6JyAuICR0aGlzLT5vd25lci4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy5naXQnOwp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gYXR0ZW1wdENsb25lRmFsbGJhY2soKTogYm9vbAp7CnRyeSB7CiR0aGlzLT5zZXR1cEZhbGxiYWNrRHJpdmVyKCR0aGlzLT5nZW5lcmF0ZVNzaFVybCgpKTsKCnJldHVybiB0cnVlOwp9IGNhdGNoIChcUnVudGltZUV4Y2VwdGlvbiAkZSkgewokdGhpcy0+ZmFsbGJhY2tEcml2ZXIgPSBudWxsOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKAonPGVycm9yPkZhaWxlZCB0byBjbG9uZSB0aGUgJyAuICR0aGlzLT5nZW5lcmF0ZVNzaFVybCgpIC4gJyByZXBvc2l0b3J5LCB0cnkgcnVubmluZyBpbiBpbnRlcmFjdGl2ZSBtb2RlJwouICcgc28gdGhhdCB5b3UgY2FuIGVudGVyIHlvdXIgQml0YnVja2V0IE9BdXRoIGNvbnN1bWVyIGNyZWRlbnRpYWxzPC9lcnJvcj4nCik7CnRocm93ICRlOwp9Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBzZXR1cEZhbGxiYWNrRHJpdmVyKHN0cmluZyAkdXJsKTogdm9pZAp7CiR0aGlzLT5mYWxsYmFja0RyaXZlciA9IG5ldyBHaXREcml2ZXIoClsndXJsJyA9PiAkdXJsXSwKJHRoaXMtPmlvLAokdGhpcy0+Y29uZmlnLAokdGhpcy0+aHR0cERvd25sb2FkZXIsCiR0aGlzLT5wcm9jZXNzCik7CiR0aGlzLT5mYWxsYmFja0RyaXZlci0+aW5pdGlhbGl6ZSgpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcGFyc2VDbG9uZVVybHMoYXJyYXkgJGNsb25lTGlua3MpOiB2b2lkCnsKZm9yZWFjaCAoJGNsb25lTGlua3MgYXMgJGNsb25lTGluaykgewppZiAoJGNsb25lTGlua1snbmFtZSddID09PSAnaHR0cHMnKSB7CgoKJHRoaXMtPmNsb25lSHR0cHNVcmwgPSBQcmVnOjpyZXBsYWNlKCcvaHR0cHM6XC9cLyhbXkBdK0ApPy8nLCAnaHR0cHM6Ly8nLCAkY2xvbmVMaW5rWydocmVmJ10pOwp9Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJvb3RJZGVudGlmaWVyKCk6IHN0cmluZwp7CmlmICgkdGhpcy0+ZmFsbGJhY2tEcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5mYWxsYmFja0RyaXZlci0+Z2V0Um9vdElkZW50aWZpZXIoKTsKfQoKaWYgKG51bGwgPT09ICR0aGlzLT5yb290SWRlbnRpZmllcikgewppZiAoISR0aGlzLT5nZXRSZXBvRGF0YSgpKSB7CmlmICghJHRoaXMtPmZhbGxiYWNrRHJpdmVyKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0EgZmFsbGJhY2sgZHJpdmVyIHNob3VsZCBiZSBzZXR1cCBpZiBnZXRSZXBvRGF0YSByZXR1cm5zIGZhbHNlJyk7Cn0KCnJldHVybiAkdGhpcy0+ZmFsbGJhY2tEcml2ZXItPmdldFJvb3RJZGVudGlmaWVyKCk7Cn0KCmlmICgkdGhpcy0+dmNzVHlwZSAhPT0gJ2dpdCcpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKAokdGhpcy0+dXJsLicgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgZ2l0IHJlcG9zaXRvcnksIHVzZSAnLgokdGhpcy0+Y2xvbmVIdHRwc1VybC4nIGJ1dCByZW1lbWJlciB0aGF0IEJpdGJ1Y2tldCBubyBsb25nZXIgc3VwcG9ydHMgdGhlIG1lcmN1cmlhbCByZXBvc2l0b3JpZXMuICcuCidodHRwczovL2JpdGJ1Y2tldC5vcmcvYmxvZy9zdW5zZXR0aW5nLW1lcmN1cmlhbC1zdXBwb3J0LWluLWJpdGJ1Y2tldCcKKTsKfQoKJHRoaXMtPnJvb3RJZGVudGlmaWVyID0gJHRoaXMtPnJlcG9EYXRhWydtYWluYnJhbmNoJ11bJ25hbWUnXSA/PyAnbWFzdGVyJzsKfQoKcmV0dXJuICR0aGlzLT5yb290SWRlbnRpZmllcjsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdXBwb3J0cyhJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBzdHJpbmcgJHVybCwgYm9vbCAkZGVlcCA9IGZhbHNlKTogYm9vbAp7CmlmICghUHJlZzo6aXNNYXRjaCgnI15odHRwcz86Ly9iaXRidWNrZXRcLm9yZy8oW14vXSspLyhbXi9dKz8pKFwuZ2l0fC8/KT8kI2knLCAkdXJsKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICghZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpKSB7CiRpby0+d3JpdGVFcnJvcignU2tpcHBpbmcgQml0YnVja2V0IGdpdCBkcml2ZXIgZm9yICcuJHVybC4nIGJlY2F1c2UgdGhlIE9wZW5TU0wgUEhQIGV4dGVuc2lvbiBpcyBtaXNzaW5nLicsIHRydWUsIElPSW50ZXJmYWNlOjpWRVJCT1NFKTsKCnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3M7Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXFVybDsKdXNlIENvbXBvc2VyXFV0aWxcR2l0IGFzIEdpdFV0aWw7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXENhY2hlOwp1c2UgQ29tcG9zZXJcQ29uZmlnOwoKCgoKY2xhc3MgR2l0RHJpdmVyIGV4dGVuZHMgVmNzRHJpdmVyCnsKCnByb3RlY3RlZCAkdGFnczsKCnByb3RlY3RlZCAkYnJhbmNoZXM7Cgpwcm90ZWN0ZWQgJHJvb3RJZGVudGlmaWVyOwoKcHJvdGVjdGVkICRyZXBvRGlyOwoKCgoKcHVibGljIGZ1bmN0aW9uIGluaXRpYWxpemUoKTogdm9pZAp7CmlmIChGaWxlc3lzdGVtOjppc0xvY2FsUGF0aCgkdGhpcy0+dXJsKSkgewokdGhpcy0+dXJsID0gUHJlZzo6cmVwbGFjZSgne1tcXC9dXC5naXQvPyR9JywgJycsICR0aGlzLT51cmwpOwppZiAoIWlzX2RpcigkdGhpcy0+dXJsKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byByZWFkIHBhY2thZ2UgaW5mb3JtYXRpb24gZnJvbSAnLiR0aGlzLT51cmwuJyBhcyB0aGUgcGF0aCBkb2VzIG5vdCBleGlzdCcpOwp9CiR0aGlzLT5yZXBvRGlyID0gJHRoaXMtPnVybDsKJGNhY2hlVXJsID0gcmVhbHBhdGgoJHRoaXMtPnVybCk7Cn0gZWxzZSB7CmlmICghQ2FjaGU6OmlzVXNhYmxlKCR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtdmNzLWRpcicpKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0dpdERyaXZlciByZXF1aXJlcyBhIHVzYWJsZSBjYWNoZSBkaXJlY3RvcnksIGFuZCBpdCBsb29rcyBsaWtlIHlvdSBzZXQgaXQgdG8gYmUgZGlzYWJsZWQnKTsKfQoKJHRoaXMtPnJlcG9EaXIgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXZjcy1kaXInKSAuICcvJyAuIFByZWc6OnJlcGxhY2UoJ3tbXmEtejAtOS5dfWknLCAnLScsIFVybDo6c2FuaXRpemUoJHRoaXMtPnVybCkpIC4gJy8nOwoKR2l0VXRpbDo6Y2xlYW5FbnYoJHRoaXMtPnByb2Nlc3MpOwoKJGZzID0gbmV3IEZpbGVzeXN0ZW0oKTsKJGZzLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoZGlybmFtZSgkdGhpcy0+cmVwb0RpcikpOwoKaWYgKCFpc193cml0YWJsZShkaXJuYW1lKCR0aGlzLT5yZXBvRGlyKSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDYW4gbm90IGNsb25lICcuJHRoaXMtPnVybC4nIHRvIGFjY2VzcyBwYWNrYWdlIGluZm9ybWF0aW9uLiBUaGUgIicuZGlybmFtZSgkdGhpcy0+cmVwb0RpcikuJyIgZGlyZWN0b3J5IGlzIG5vdCB3cml0YWJsZSBieSB0aGUgY3VycmVudCB1c2VyLicpOwp9CgppZiAoUHJlZzo6aXNNYXRjaCgne15zc2g6Ly9bXkBdK0BbXjpdKzpbXjAtOV0rfScsICR0aGlzLT51cmwpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdUaGUgc291cmNlIFVSTCAnLiR0aGlzLT51cmwuJyBpcyBpbnZhbGlkLCBzc2ggVVJMcyBzaG91bGQgaGF2ZSBhIHBvcnQgbnVtYmVyIGFmdGVyICI6Ii4nLiJcbiIuJ1VzZSBzc2g6Ly9naXRAZXhhbXBsZS5jb206MjIvcGF0aCBvciBqdXN0IGdpdEBleGFtcGxlLmNvbTpwYXRoIGlmIHlvdSBkbyBub3Qgd2FudCB0byBwcm92aWRlIGEgcGFzc3dvcmQgb3IgY3VzdG9tIHBvcnQuJyk7Cn0KCiRnaXRVdGlsID0gbmV3IEdpdFV0aWwoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2VzcywgJGZzKTsKaWYgKCEkZ2l0VXRpbC0+c3luY01pcnJvcigkdGhpcy0+dXJsLCAkdGhpcy0+cmVwb0RpcikpIHsKaWYgKCFpc19kaXIoJHRoaXMtPnJlcG9EaXIpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIGNsb25lICcuJHRoaXMtPnVybC4nIHRvIHJlYWQgcGFja2FnZSBpbmZvcm1hdGlvbiBmcm9tIGl0Jyk7Cn0KJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+RmFpbGVkIHRvIHVwZGF0ZSAnLiR0aGlzLT51cmwuJywgcGFja2FnZSBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgcmVwb3NpdG9yeSBtYXkgYmUgb3V0ZGF0ZWQ8L2Vycm9yPicpOwp9CgokY2FjaGVVcmwgPSAkdGhpcy0+dXJsOwp9CgokdGhpcy0+Z2V0VGFncygpOwokdGhpcy0+Z2V0QnJhbmNoZXMoKTsKCiR0aGlzLT5jYWNoZSA9IG5ldyBDYWNoZSgkdGhpcy0+aW8sICR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtcmVwby1kaXInKS4nLycuUHJlZzo6cmVwbGFjZSgne1teYS16MC05Ll19aScsICctJywgVXJsOjpzYW5pdGl6ZSgkY2FjaGVVcmwpKSk7CiR0aGlzLT5jYWNoZS0+c2V0UmVhZE9ubHkoJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS1yZWFkLW9ubHknKSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSb290SWRlbnRpZmllcigpOiBzdHJpbmcKewppZiAobnVsbCA9PT0gJHRoaXMtPnJvb3RJZGVudGlmaWVyKSB7CiR0aGlzLT5yb290SWRlbnRpZmllciA9ICdtYXN0ZXInOwoKJGdpdFV0aWwgPSBuZXcgR2l0VXRpbCgkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsICR0aGlzLT5wcm9jZXNzLCBuZXcgRmlsZXN5c3RlbSgpKTsKaWYgKCFGaWxlc3lzdGVtOjppc0xvY2FsUGF0aCgkdGhpcy0+dXJsKSkgewokZGVmYXVsdEJyYW5jaCA9ICRnaXRVdGlsLT5nZXRNaXJyb3JEZWZhdWx0QnJhbmNoKCR0aGlzLT51cmwsICR0aGlzLT5yZXBvRGlyLCBmYWxzZSk7CmlmICgkZGVmYXVsdEJyYW5jaCAhPT0gbnVsbCkgewpyZXR1cm4gJHRoaXMtPnJvb3RJZGVudGlmaWVyID0gJGRlZmF1bHRCcmFuY2g7Cn0KfQoKCiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ2JyYW5jaCcsICctLW5vLWNvbG9yJ10sICRvdXRwdXQsICR0aGlzLT5yZXBvRGlyKTsKJGJyYW5jaGVzID0gJHRoaXMtPnByb2Nlc3MtPnNwbGl0TGluZXMoJG91dHB1dCk7CmlmICghaW5fYXJyYXkoJyogbWFzdGVyJywgJGJyYW5jaGVzKSkgewpmb3JlYWNoICgkYnJhbmNoZXMgYXMgJGJyYW5jaCkgewppZiAoJGJyYW5jaCAmJiBQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XlwqICsoXFMrKX0nLCAkYnJhbmNoLCAkbWF0Y2gpKSB7CiR0aGlzLT5yb290SWRlbnRpZmllciA9ICRtYXRjaFsxXTsKYnJlYWs7Cn0KfQp9Cn0KCnJldHVybiAkdGhpcy0+cm9vdElkZW50aWZpZXI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVcmwoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT51cmw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2Uoc3RyaW5nICRpZGVudGlmaWVyKTogYXJyYXkKewpyZXR1cm4gWyd0eXBlJyA9PiAnZ2l0JywgJ3VybCcgPT4gJHRoaXMtPmdldFVybCgpLCAncmVmZXJlbmNlJyA9PiAkaWRlbnRpZmllcl07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0KHN0cmluZyAkaWRlbnRpZmllcik6ID9hcnJheQp7CnJldHVybiBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZUNvbnRlbnQoc3RyaW5nICRmaWxlLCBzdHJpbmcgJGlkZW50aWZpZXIpOiA/c3RyaW5nCnsKaWYgKGlzc2V0KCRpZGVudGlmaWVyWzBdKSAmJiAkaWRlbnRpZmllclswXSA9PT0gJy0nKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignSW52YWxpZCBnaXQgaWRlbnRpZmllciBkZXRlY3RlZC4gSWRlbnRpZmllciBtdXN0IG5vdCBzdGFydCB3aXRoIGEgLSwgZ2l2ZW46ICcgLiAkaWRlbnRpZmllcik7Cn0KCiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ3Nob3cnLCAkaWRlbnRpZmllci4nOicuJGZpbGVdLCAkY29udGVudCwgJHRoaXMtPnJlcG9EaXIpOwoKaWYgKHRyaW0oJGNvbnRlbnQpID09PSAnJykgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICRjb250ZW50Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hhbmdlRGF0ZShzdHJpbmcgJGlkZW50aWZpZXIpOiA/XERhdGVUaW1lSW1tdXRhYmxlCnsKaWYgKGlzc2V0KCRpZGVudGlmaWVyWzBdKSAmJiAkaWRlbnRpZmllclswXSA9PT0gJy0nKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignSW52YWxpZCBnaXQgaWRlbnRpZmllciBkZXRlY3RlZC4gSWRlbnRpZmllciBtdXN0IG5vdCBzdGFydCB3aXRoIGEgLSwgZ2l2ZW46ICcgLiAkaWRlbnRpZmllcik7Cn0KCiRjb21tYW5kID0gR2l0VXRpbDo6YnVpbGRSZXZMaXN0Q29tbWFuZCgkdGhpcy0+cHJvY2VzcywgWyctbjEnLCAnLS1mb3JtYXQ9JWF0JywgJGlkZW50aWZpZXJdKTsKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRvdXRwdXQsICR0aGlzLT5yZXBvRGlyKTsKCnJldHVybiBuZXcgXERhdGVUaW1lSW1tdXRhYmxlKCdAJy50cmltKEdpdFV0aWw6OnBhcnNlUmV2TGlzdE91dHB1dCgkb3V0cHV0LCAkdGhpcy0+cHJvY2VzcykpLCBuZXcgXERhdGVUaW1lWm9uZSgnVVRDJykpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGFncygpOiBhcnJheQp7CmlmIChudWxsID09PSAkdGhpcy0+dGFncykgewokdGhpcy0+dGFncyA9IFtdOwoKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAnc2hvdy1yZWYnLCAnLS10YWdzJywgJy0tZGVyZWZlcmVuY2UnXSwgJG91dHB1dCwgJHRoaXMtPnJlcG9EaXIpOwpmb3JlYWNoICgkdGhpcy0+cHJvY2Vzcy0+c3BsaXRMaW5lcygkb3V0cHV0KSBhcyAkdGFnKSB7CmlmICgkdGFnICE9PSAnJyAmJiBQcmVnOjppc01hdGNoKCd7XihbYS1mMC05XXs0MH0pIHJlZnMvdGFncy8oXFMrPykoXF5ce1x9KT8kfScsICR0YWcsICRtYXRjaCkpIHsKJHRoaXMtPnRhZ3NbJG1hdGNoWzJdXSA9ICRtYXRjaFsxXTsKfQp9Cn0KCnJldHVybiAkdGhpcy0+dGFnczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEJyYW5jaGVzKCk6IGFycmF5CnsKaWYgKG51bGwgPT09ICR0aGlzLT5icmFuY2hlcykgewokYnJhbmNoZXMgPSBbXTsKCiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ2JyYW5jaCcsICctLW5vLWNvbG9yJywgJy0tbm8tYWJicmV2JywgJy12J10sICRvdXRwdXQsICR0aGlzLT5yZXBvRGlyKTsKZm9yZWFjaCAoJHRoaXMtPnByb2Nlc3MtPnNwbGl0TGluZXMoJG91dHB1dCkgYXMgJGJyYW5jaCkgewppZiAoJGJyYW5jaCAhPT0gJycgJiYgIVByZWc6OmlzTWF0Y2goJ3teICpbXi9dKy9IRUFEIH0nLCAkYnJhbmNoKSkgewppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14oPzpcKiApPyAqKFxTKykgKihbYS1mMC05XSspKD86IC4qKT8kfScsICRicmFuY2gsICRtYXRjaCkgJiYgJG1hdGNoWzFdWzBdICE9PSAnLScpIHsKJGJyYW5jaGVzWyRtYXRjaFsxXV0gPSAkbWF0Y2hbMl07Cn0KfQp9CgokdGhpcy0+YnJhbmNoZXMgPSAkYnJhbmNoZXM7Cn0KCnJldHVybiAkdGhpcy0+YnJhbmNoZXM7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3VwcG9ydHMoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgc3RyaW5nICR1cmwsIGJvb2wgJGRlZXAgPSBmYWxzZSk6IGJvb2wKewppZiAoUHJlZzo6aXNNYXRjaCgnIyheZ2l0Oi8vfFwuZ2l0Lz8kfGdpdCg/Om9saXRlKT9AfC8vZ2l0XC58Ly9naXRodWIuY29tLykjaScsICR1cmwpKSB7CnJldHVybiB0cnVlOwp9CgoKaWYgKEZpbGVzeXN0ZW06OmlzTG9jYWxQYXRoKCR1cmwpKSB7CiR1cmwgPSBGaWxlc3lzdGVtOjpnZXRQbGF0Zm9ybVBhdGgoJHVybCk7CmlmICghaXNfZGlyKCR1cmwpKSB7CnJldHVybiBmYWxzZTsKfQoKJHByb2Nlc3MgPSBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7CgppZiAoJHByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAndGFnJ10sICRvdXRwdXQsICR1cmwpID09PSAwKSB7CnJldHVybiB0cnVlOwp9CkdpdFV0aWw6OmNoZWNrRm9yUmVwb093bmVyc2hpcEVycm9yKCRwcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpLCAkdXJsKTsKfQoKaWYgKCEkZGVlcCkgewpyZXR1cm4gZmFsc2U7Cn0KCiRwcm9jZXNzID0gbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwokZ2l0VXRpbCA9IG5ldyBHaXRVdGlsKCRpbywgJGNvbmZpZywgJHByb2Nlc3MsIG5ldyBGaWxlc3lzdGVtKCkpOwpHaXRVdGlsOjpjbGVhbkVudigkcHJvY2Vzcyk7Cgp0cnkgewokZ2l0VXRpbC0+cnVuQ29tbWFuZHMoW1snZ2l0JywgJ2xzLXJlbW90ZScsICctLWhlYWRzJywgJy0tJywgJyV1cmwlJ11dLCAkdXJsLCBzeXNfZ2V0X3RlbXBfZGlyKCkpOwp9IGNhdGNoIChcUnVudGltZUV4Y2VwdGlvbiAkZSkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiB0cnVlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnlcVmNzOwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXENhY2hlOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEdpdEh1YjsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cFxSZXNwb25zZTsKCgoKCmNsYXNzIEdpdEh1YkRyaXZlciBleHRlbmRzIFZjc0RyaXZlcgp7Cgpwcm90ZWN0ZWQgJG93bmVyOwoKcHJvdGVjdGVkICRyZXBvc2l0b3J5OwoKcHJvdGVjdGVkICR0YWdzOwoKcHJvdGVjdGVkICRicmFuY2hlczsKCnByb3RlY3RlZCAkcm9vdElkZW50aWZpZXI7Cgpwcm90ZWN0ZWQgJHJlcG9EYXRhOwoKcHJvdGVjdGVkICRoYXNJc3N1ZXMgPSBmYWxzZTsKCnByb3RlY3RlZCAkaXNQcml2YXRlID0gZmFsc2U7Cgpwcml2YXRlICRpc0FyY2hpdmVkID0gZmFsc2U7Cgpwcml2YXRlICRmdW5kaW5nSW5mbzsKCnByaXZhdGUgJGFsbG93R2l0RmFsbGJhY2sgPSB0cnVlOwoKCgoKCgpwcm90ZWN0ZWQgJGdpdERyaXZlciA9IG51bGw7CgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpOiB2b2lkCnsKaWYgKCFQcmVnOjppc01hdGNoKCcjXig/Oig/Omh0dHBzP3xnaXQpOi8vKFteL10rKS98Z2l0QChbXjpdKyk6Lz8pKFteL10rKS8oW14vXSs/KSg/OlwuZ2l0fC8pPyQjJywgJHRoaXMtPnVybCwgJG1hdGNoKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgR2l0SHViIHJlcG9zaXRvcnkgVVJMICVzIGlzIGludmFsaWQuJywgJHRoaXMtPnVybCkpOwp9CgokdGhpcy0+b3duZXIgPSAkbWF0Y2hbM107CiR0aGlzLT5yZXBvc2l0b3J5ID0gJG1hdGNoWzRdOwokdGhpcy0+b3JpZ2luVXJsID0gc3RydG9sb3dlcigkbWF0Y2hbMV0gPz8gKHN0cmluZykgJG1hdGNoWzJdKTsKaWYgKCR0aGlzLT5vcmlnaW5VcmwgPT09ICd3d3cuZ2l0aHViLmNvbScpIHsKJHRoaXMtPm9yaWdpblVybCA9ICdnaXRodWIuY29tJzsKfQokdGhpcy0+Y2FjaGUgPSBuZXcgQ2FjaGUoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXJlcG8tZGlyJykuJy8nLiR0aGlzLT5vcmlnaW5VcmwuJy8nLiR0aGlzLT5vd25lci4nLycuJHRoaXMtPnJlcG9zaXRvcnkpOwokdGhpcy0+Y2FjaGUtPnNldFJlYWRPbmx5KCR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtcmVhZC1vbmx5JykpOwoKaWYgKGlzc2V0KCR0aGlzLT5yZXBvQ29uZmlnWydhbGxvdy1naXQtZmFsbGJhY2snXSkgJiYgJHRoaXMtPnJlcG9Db25maWdbJ2FsbG93LWdpdC1mYWxsYmFjayddID09PSBmYWxzZSkgewokdGhpcy0+YWxsb3dHaXRGYWxsYmFjayA9IGZhbHNlOwp9CgppZiAoJHRoaXMtPmNvbmZpZy0+Z2V0KCd1c2UtZ2l0aHViLWFwaScpID09PSBmYWxzZSB8fCAoaXNzZXQoJHRoaXMtPnJlcG9Db25maWdbJ25vLWFwaSddKSAmJiAkdGhpcy0+cmVwb0NvbmZpZ1snbm8tYXBpJ10pKSB7CiR0aGlzLT5zZXR1cEdpdERyaXZlcigkdGhpcy0+dXJsKTsKCnJldHVybjsKfQoKJHRoaXMtPmZldGNoUm9vdElkZW50aWZpZXIoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9zaXRvcnlVcmwoKTogc3RyaW5nCnsKcmV0dXJuICdodHRwczovLycuJHRoaXMtPm9yaWdpblVybC4nLycuJHRoaXMtPm93bmVyLicvJy4kdGhpcy0+cmVwb3NpdG9yeTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJvb3RJZGVudGlmaWVyKCk6IHN0cmluZwp7CmlmICgkdGhpcy0+Z2l0RHJpdmVyKSB7CnJldHVybiAkdGhpcy0+Z2l0RHJpdmVyLT5nZXRSb290SWRlbnRpZmllcigpOwp9CgpyZXR1cm4gJHRoaXMtPnJvb3RJZGVudGlmaWVyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXJsKCk6IHN0cmluZwp7CmlmICgkdGhpcy0+Z2l0RHJpdmVyKSB7CnJldHVybiAkdGhpcy0+Z2l0RHJpdmVyLT5nZXRVcmwoKTsKfQoKcmV0dXJuICdodHRwczovLycgLiAkdGhpcy0+b3JpZ2luVXJsIC4gJy8nLiR0aGlzLT5vd25lci4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy5naXQnOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0QXBpVXJsKCk6IHN0cmluZwp7CmlmICgnZ2l0aHViLmNvbScgPT09ICR0aGlzLT5vcmlnaW5VcmwpIHsKJGFwaVVybCA9ICdhcGkuZ2l0aHViLmNvbSc7Cn0gZWxzZSB7CiRhcGlVcmwgPSAkdGhpcy0+b3JpZ2luVXJsIC4gJy9hcGkvdjMnOwp9CgpyZXR1cm4gJ2h0dHBzOi8vJyAuICRhcGlVcmw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2Uoc3RyaW5nICRpZGVudGlmaWVyKTogYXJyYXkKewppZiAoJHRoaXMtPmdpdERyaXZlcikgewpyZXR1cm4gJHRoaXMtPmdpdERyaXZlci0+Z2V0U291cmNlKCRpZGVudGlmaWVyKTsKfQppZiAoJHRoaXMtPmlzUHJpdmF0ZSkgewoKCiR1cmwgPSAkdGhpcy0+Z2VuZXJhdGVTc2hVcmwoKTsKfSBlbHNlIHsKJHVybCA9ICR0aGlzLT5nZXRVcmwoKTsKfQoKcmV0dXJuIFsndHlwZScgPT4gJ2dpdCcsICd1cmwnID0+ICR1cmwsICdyZWZlcmVuY2UnID0+ICRpZGVudGlmaWVyXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3Qoc3RyaW5nICRpZGVudGlmaWVyKTogP2FycmF5CnsKJHVybCA9ICR0aGlzLT5nZXRBcGlVcmwoKSAuICcvcmVwb3MvJy4kdGhpcy0+b3duZXIuJy8nLiR0aGlzLT5yZXBvc2l0b3J5LicvemlwYmFsbC8nLiRpZGVudGlmaWVyOwoKcmV0dXJuIFsndHlwZScgPT4gJ3ppcCcsICd1cmwnID0+ICR1cmwsICdyZWZlcmVuY2UnID0+ICRpZGVudGlmaWVyLCAnc2hhc3VtJyA9PiAnJ107Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21wb3NlckluZm9ybWF0aW9uKHN0cmluZyAkaWRlbnRpZmllcik6ID9hcnJheQp7CmlmICgkdGhpcy0+Z2l0RHJpdmVyKSB7CnJldHVybiAkdGhpcy0+Z2l0RHJpdmVyLT5nZXRDb21wb3NlckluZm9ybWF0aW9uKCRpZGVudGlmaWVyKTsKfQoKaWYgKCFpc3NldCgkdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXSkpIHsKaWYgKCR0aGlzLT5zaG91bGRDYWNoZSgkaWRlbnRpZmllcikgJiYgJHJlcyA9ICR0aGlzLT5jYWNoZS0+cmVhZCgkaWRlbnRpZmllcikpIHsKJGNvbXBvc2VyID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkcmVzKTsKfSBlbHNlIHsKJGNvbXBvc2VyID0gJHRoaXMtPmdldEJhc2VDb21wb3NlckluZm9ybWF0aW9uKCRpZGVudGlmaWVyKTsKCmlmICgkdGhpcy0+c2hvdWxkQ2FjaGUoJGlkZW50aWZpZXIpKSB7CiR0aGlzLT5jYWNoZS0+d3JpdGUoJGlkZW50aWZpZXIsIEpzb25GaWxlOjplbmNvZGUoJGNvbXBvc2VyLCBcSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSB8IFxKU09OX1VORVNDQVBFRF9TTEFTSEVTKSk7Cn0KfQoKaWYgKCRjb21wb3NlciAhPT0gbnVsbCkgewoKaWYgKGlzc2V0KCRjb21wb3Nlclsnc3VwcG9ydCddKSAmJiAhaXNfYXJyYXkoJGNvbXBvc2VyWydzdXBwb3J0J10pKSB7CiRjb21wb3Nlclsnc3VwcG9ydCddID0gW107Cn0KaWYgKCFpc3NldCgkY29tcG9zZXJbJ3N1cHBvcnQnXVsnc291cmNlJ10pKSB7CiRsYWJlbCA9IGFycmF5X3NlYXJjaCgkaWRlbnRpZmllciwgJHRoaXMtPmdldFRhZ3MoKSkgPzogYXJyYXlfc2VhcmNoKCRpZGVudGlmaWVyLCAkdGhpcy0+Z2V0QnJhbmNoZXMoKSkgPzogJGlkZW50aWZpZXI7CiRjb21wb3Nlclsnc3VwcG9ydCddWydzb3VyY2UnXSA9IHNwcmludGYoJ2h0dHBzOi8vJXMvJXMvJXMvdHJlZS8lcycsICR0aGlzLT5vcmlnaW5VcmwsICR0aGlzLT5vd25lciwgJHRoaXMtPnJlcG9zaXRvcnksICRsYWJlbCk7Cn0KaWYgKCFpc3NldCgkY29tcG9zZXJbJ3N1cHBvcnQnXVsnaXNzdWVzJ10pICYmICR0aGlzLT5oYXNJc3N1ZXMpIHsKJGNvbXBvc2VyWydzdXBwb3J0J11bJ2lzc3VlcyddID0gc3ByaW50ZignaHR0cHM6Ly8lcy8lcy8lcy9pc3N1ZXMnLCAkdGhpcy0+b3JpZ2luVXJsLCAkdGhpcy0+b3duZXIsICR0aGlzLT5yZXBvc2l0b3J5KTsKfQppZiAoIWlzc2V0KCRjb21wb3NlclsnYWJhbmRvbmVkJ10pICYmICR0aGlzLT5pc0FyY2hpdmVkKSB7CiRjb21wb3NlclsnYWJhbmRvbmVkJ10gPSB0cnVlOwp9CmlmICghaXNzZXQoJGNvbXBvc2VyWydmdW5kaW5nJ10pICYmICRmdW5kaW5nID0gJHRoaXMtPmdldEZ1bmRpbmdJbmZvKCkpIHsKJGNvbXBvc2VyWydmdW5kaW5nJ10gPSAkZnVuZGluZzsKfQp9CgokdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXSA9ICRjb21wb3NlcjsKfQoKcmV0dXJuICR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldEZ1bmRpbmdJbmZvKCkKewppZiAobnVsbCAhPT0gJHRoaXMtPmZ1bmRpbmdJbmZvKSB7CnJldHVybiAkdGhpcy0+ZnVuZGluZ0luZm87Cn0KCmlmICgkdGhpcy0+b3JpZ2luVXJsICE9PSAnZ2l0aHViLmNvbScpIHsKcmV0dXJuICR0aGlzLT5mdW5kaW5nSW5mbyA9IGZhbHNlOwp9Cgpmb3JlYWNoIChbJHRoaXMtPmdldEFwaVVybCgpIC4gJy9yZXBvcy8nLiR0aGlzLT5vd25lci4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy9jb250ZW50cy8uZ2l0aHViL0ZVTkRJTkcueW1sJywgJHRoaXMtPmdldEFwaVVybCgpIC4gJy9yZXBvcy8nLiR0aGlzLT5vd25lci4nLy5naXRodWIvY29udGVudHMvRlVORElORy55bWwnXSBhcyAkZmlsZSkgewp0cnkgewokcmVzcG9uc2UgPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkZmlsZSwgWwoncmV0cnktYXV0aC1mYWlsdXJlJyA9PiBmYWxzZSwKXSktPmRlY29kZUpzb24oKTsKfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CmNvbnRpbnVlOwp9CmlmIChlbXB0eSgkcmVzcG9uc2VbJ2NvbnRlbnQnXSkgfHwgJHJlc3BvbnNlWydlbmNvZGluZyddICE9PSAnYmFzZTY0JyB8fCAhKCRmdW5kaW5nID0gYmFzZTY0X2RlY29kZSgkcmVzcG9uc2VbJ2NvbnRlbnQnXSkpKSB7CmNvbnRpbnVlOwp9CmJyZWFrOwp9CmlmIChlbXB0eSgkZnVuZGluZykpIHsKcmV0dXJuICR0aGlzLT5mdW5kaW5nSW5mbyA9IGZhbHNlOwp9CgokcmVzdWx0ID0gW107CiRrZXkgPSBudWxsOwpmb3JlYWNoIChQcmVnOjpzcGxpdCgne1xyP1xufScsICRmdW5kaW5nKSBhcyAkbGluZSkgewokbGluZSA9IHRyaW0oJGxpbmUpOwppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14oXHcrKVxzKjpccyooLispJH0nLCAkbGluZSwgJG1hdGNoKSkgewppZiAoJG1hdGNoWzJdID09PSAnWycpIHsKJGtleSA9ICRtYXRjaFsxXTsKY29udGludWU7Cn0KaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teXFsoLio/KVxdKD86XHMqIy4qKT8kfScsICRtYXRjaFsyXSwgJG1hdGNoMikpIHsKZm9yZWFjaCAoYXJyYXlfbWFwKCd0cmltJywgUHJlZzo6c3BsaXQoJ3tbXCciXT9ccyosXHMqW1wnIl0/fScsICRtYXRjaDJbMV0pKSBhcyAkaXRlbSkgewokcmVzdWx0W10gPSBbJ3R5cGUnID0+ICRtYXRjaFsxXSwgJ3VybCcgPT4gdHJpbSgkaXRlbSwgJyJcJyAnKV07Cn0KfSBlbHNlaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teKFteI10uKj8pKD86XHMrIy4qKT8kfScsICRtYXRjaFsyXSwgJG1hdGNoMikpIHsKJHJlc3VsdFtdID0gWyd0eXBlJyA9PiAkbWF0Y2hbMV0sICd1cmwnID0+IHRyaW0oJG1hdGNoMlsxXSwgJyJcJyAnKV07Cn0KJGtleSA9IG51bGw7Cn0gZWxzZWlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XihcdyspXHMqOlxzKiNccyokfScsICRsaW5lLCAkbWF0Y2gpKSB7CiRrZXkgPSAkbWF0Y2hbMV07Cn0gZWxzZWlmICgka2V5ICE9PSBudWxsICYmICgKUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14tXHMqKC4rKSg/OlxzKyMuKik/JH0nLCAkbGluZSwgJG1hdGNoKQp8fCBQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XiguKyksKD86XHMqIy4qKT8kfScsICRsaW5lLCAkbWF0Y2gpCikpIHsKJHJlc3VsdFtdID0gWyd0eXBlJyA9PiAka2V5LCAndXJsJyA9PiB0cmltKCRtYXRjaFsxXSwgJyJcJyAnKV07Cn0gZWxzZWlmICgka2V5ICE9PSBudWxsICYmICRsaW5lID09PSAnXScpIHsKJGtleSA9IG51bGw7Cn0KfQoKZm9yZWFjaCAoJHJlc3VsdCBhcyAka2V5ID0+ICRpdGVtKSB7CnN3aXRjaCAoJGl0ZW1bJ3R5cGUnXSkgewpjYXNlICdjb21tdW5pdHlfYnJpZGdlJzoKJHJlc3VsdFska2V5XVsndXJsJ10gPSAnaHR0cHM6Ly9mdW5kaW5nLmNvbW11bml0eWJyaWRnZS5vcmcvcHJvamVjdHMvJyAuIGJhc2VuYW1lKCRpdGVtWyd1cmwnXSk7CmJyZWFrOwpjYXNlICdnaXRodWInOgokcmVzdWx0WyRrZXldWyd1cmwnXSA9ICdodHRwczovL2dpdGh1Yi5jb20vJyAuIGJhc2VuYW1lKCRpdGVtWyd1cmwnXSk7CmJyZWFrOwpjYXNlICdpc3N1ZWh1bnQnOgokcmVzdWx0WyRrZXldWyd1cmwnXSA9ICdodHRwczovL2lzc3VlaHVudC5pby9yLycgLiAkaXRlbVsndXJsJ107CmJyZWFrOwpjYXNlICdrb19maSc6CiRyZXN1bHRbJGtleV1bJ3VybCddID0gJ2h0dHBzOi8va28tZmkuY29tLycgLiBiYXNlbmFtZSgkaXRlbVsndXJsJ10pOwpicmVhazsKY2FzZSAnbGliZXJhcGF5JzoKJHJlc3VsdFska2V5XVsndXJsJ10gPSAnaHR0cHM6Ly9saWJlcmFwYXkuY29tLycgLiBiYXNlbmFtZSgkaXRlbVsndXJsJ10pOwpicmVhazsKY2FzZSAnb3Blbl9jb2xsZWN0aXZlJzoKJHJlc3VsdFska2V5XVsndXJsJ10gPSAnaHR0cHM6Ly9vcGVuY29sbGVjdGl2ZS5jb20vJyAuIGJhc2VuYW1lKCRpdGVtWyd1cmwnXSk7CmJyZWFrOwpjYXNlICdwYXRyZW9uJzoKJHJlc3VsdFska2V5XVsndXJsJ10gPSAnaHR0cHM6Ly93d3cucGF0cmVvbi5jb20vJyAuIGJhc2VuYW1lKCRpdGVtWyd1cmwnXSk7CmJyZWFrOwpjYXNlICd0aWRlbGlmdCc6CiRyZXN1bHRbJGtleV1bJ3VybCddID0gJ2h0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViLycgLiAkaXRlbVsndXJsJ107CmJyZWFrOwpjYXNlICdwb2xhcic6CiRyZXN1bHRbJGtleV1bJ3VybCddID0gJ2h0dHBzOi8vcG9sYXIuc2gvJyAuIGJhc2VuYW1lKCRpdGVtWyd1cmwnXSk7CmJyZWFrOwpjYXNlICdidXlfbWVfYV9jb2ZmZWUnOgokcmVzdWx0WyRrZXldWyd1cmwnXSA9ICdodHRwczovL3d3dy5idXltZWFjb2ZmZWUuY29tLycgLiBiYXNlbmFtZSgkaXRlbVsndXJsJ10pOwpicmVhazsKY2FzZSAndGhhbmtzX2Rldic6CiRyZXN1bHRbJGtleV1bJ3VybCddID0gJ2h0dHBzOi8vdGhhbmtzLmRldi8nIC4gJGl0ZW1bJ3VybCddOwpicmVhazsKY2FzZSAnb3RlY2hpZSc6CiRyZXN1bHRbJGtleV1bJ3VybCddID0gJ2h0dHBzOi8vb3RlY2hpZS5jb20vJyAuIGJhc2VuYW1lKCRpdGVtWyd1cmwnXSk7CmJyZWFrOwpjYXNlICdjdXN0b20nOgokYml0cyA9IHBhcnNlX3VybCgkaXRlbVsndXJsJ10pOwppZiAoJGJpdHMgPT09IGZhbHNlKSB7CnVuc2V0KCRyZXN1bHRbJGtleV0pOwpicmVhazsKfQoKaWYgKCFhcnJheV9rZXlfZXhpc3RzKCdzY2hlbWUnLCAkYml0cykgJiYgIWFycmF5X2tleV9leGlzdHMoJ2hvc3QnLCAkYml0cykpIHsKaWYgKFByZWc6OmlzTWF0Y2goJ3teW2EtejAtOS1dKytcLlthLXpdezIsM30kfScsICRpdGVtWyd1cmwnXSkpIHsKJHJlc3VsdFska2V5XVsndXJsJ10gPSAnaHR0cHM6Ly8nLiRpdGVtWyd1cmwnXTsKYnJlYWs7Cn0KCiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+RnVuZGluZyBVUkwgJy4kaXRlbVsndXJsJ10uJyBub3QgaW4gYSBzdXBwb3J0ZWQgZm9ybWF0Ljwvd2FybmluZz4nKTsKdW5zZXQoJHJlc3VsdFska2V5XSk7CmJyZWFrOwp9CmJyZWFrOwp9Cn0KCnJldHVybiAkdGhpcy0+ZnVuZGluZ0luZm8gPSAkcmVzdWx0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZUNvbnRlbnQoc3RyaW5nICRmaWxlLCBzdHJpbmcgJGlkZW50aWZpZXIpOiA/c3RyaW5nCnsKaWYgKCR0aGlzLT5naXREcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldEZpbGVDb250ZW50KCRmaWxlLCAkaWRlbnRpZmllcik7Cn0KCiRyZXNvdXJjZSA9ICR0aGlzLT5nZXRBcGlVcmwoKSAuICcvcmVwb3MvJy4kdGhpcy0+b3duZXIuJy8nLiR0aGlzLT5yZXBvc2l0b3J5LicvY29udGVudHMvJyAuICRmaWxlIC4gJz9yZWY9Jy51cmxlbmNvZGUoJGlkZW50aWZpZXIpOwokcmVzb3VyY2UgPSAkdGhpcy0+Z2V0Q29udGVudHMoJHJlc291cmNlKS0+ZGVjb2RlSnNvbigpOwoKCgppZiAoKCFpc3NldCgkcmVzb3VyY2VbJ2NvbnRlbnQnXSkgfHwgJHJlc291cmNlWydjb250ZW50J10gPT09ICcnKSAmJiAkcmVzb3VyY2VbJ2VuY29kaW5nJ10gPT09ICdub25lJyAmJiBpc3NldCgkcmVzb3VyY2VbJ2dpdF91cmwnXSkpIHsKJHJlc291cmNlID0gJHRoaXMtPmdldENvbnRlbnRzKCRyZXNvdXJjZVsnZ2l0X3VybCddKS0+ZGVjb2RlSnNvbigpOwp9CgppZiAoIWlzc2V0KCRyZXNvdXJjZVsnY29udGVudCddKSB8fCAkcmVzb3VyY2VbJ2VuY29kaW5nJ10gIT09ICdiYXNlNjQnIHx8IGZhbHNlID09PSAoJGNvbnRlbnQgPSBiYXNlNjRfZGVjb2RlKCRyZXNvdXJjZVsnY29udGVudCddKSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgcmV0cmlldmUgJyAuICRmaWxlIC4gJyBmb3IgJy4kaWRlbnRpZmllcik7Cn0KCnJldHVybiAkY29udGVudDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENoYW5nZURhdGUoc3RyaW5nICRpZGVudGlmaWVyKTogP1xEYXRlVGltZUltbXV0YWJsZQp7CmlmICgkdGhpcy0+Z2l0RHJpdmVyKSB7CnJldHVybiAkdGhpcy0+Z2l0RHJpdmVyLT5nZXRDaGFuZ2VEYXRlKCRpZGVudGlmaWVyKTsKfQoKJHJlc291cmNlID0gJHRoaXMtPmdldEFwaVVybCgpIC4gJy9yZXBvcy8nLiR0aGlzLT5vd25lci4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy9jb21taXRzLycudXJsZW5jb2RlKCRpZGVudGlmaWVyKTsKJGNvbW1pdCA9ICR0aGlzLT5nZXRDb250ZW50cygkcmVzb3VyY2UpLT5kZWNvZGVKc29uKCk7CgpyZXR1cm4gbmV3IFxEYXRlVGltZUltbXV0YWJsZSgkY29tbWl0Wydjb21taXQnXVsnY29tbWl0dGVyJ11bJ2RhdGUnXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUYWdzKCk6IGFycmF5CnsKaWYgKCR0aGlzLT5naXREcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldFRhZ3MoKTsKfQppZiAobnVsbCA9PT0gJHRoaXMtPnRhZ3MpIHsKJHRhZ3MgPSBbXTsKJHJlc291cmNlID0gJHRoaXMtPmdldEFwaVVybCgpIC4gJy9yZXBvcy8nLiR0aGlzLT5vd25lci4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy90YWdzP3Blcl9wYWdlPTEwMCc7CgpkbyB7CiRyZXNwb25zZSA9ICR0aGlzLT5nZXRDb250ZW50cygkcmVzb3VyY2UpOwokdGFnc0RhdGEgPSAkcmVzcG9uc2UtPmRlY29kZUpzb24oKTsKZm9yZWFjaCAoJHRhZ3NEYXRhIGFzICR0YWcpIHsKJHRhZ3NbJHRhZ1snbmFtZSddXSA9ICR0YWdbJ2NvbW1pdCddWydzaGEnXTsKfQoKJHJlc291cmNlID0gJHRoaXMtPmdldE5leHRQYWdlKCRyZXNwb25zZSk7Cn0gd2hpbGUgKCRyZXNvdXJjZSk7CgokdGhpcy0+dGFncyA9ICR0YWdzOwp9CgpyZXR1cm4gJHRoaXMtPnRhZ3M7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRCcmFuY2hlcygpOiBhcnJheQp7CmlmICgkdGhpcy0+Z2l0RHJpdmVyKSB7CnJldHVybiAkdGhpcy0+Z2l0RHJpdmVyLT5nZXRCcmFuY2hlcygpOwp9CmlmIChudWxsID09PSAkdGhpcy0+YnJhbmNoZXMpIHsKJGJyYW5jaGVzID0gW107CiRyZXNvdXJjZSA9ICR0aGlzLT5nZXRBcGlVcmwoKSAuICcvcmVwb3MvJy4kdGhpcy0+b3duZXIuJy8nLiR0aGlzLT5yZXBvc2l0b3J5LicvZ2l0L3JlZnMvaGVhZHM/cGVyX3BhZ2U9MTAwJzsKCmRvIHsKJHJlc3BvbnNlID0gJHRoaXMtPmdldENvbnRlbnRzKCRyZXNvdXJjZSk7CiRicmFuY2hEYXRhID0gJHJlc3BvbnNlLT5kZWNvZGVKc29uKCk7CmZvcmVhY2ggKCRicmFuY2hEYXRhIGFzICRicmFuY2gpIHsKJG5hbWUgPSBzdWJzdHIoJGJyYW5jaFsncmVmJ10sIDExKTsKaWYgKCRuYW1lICE9PSAnZ2gtcGFnZXMnKSB7CiRicmFuY2hlc1skbmFtZV0gPSAkYnJhbmNoWydvYmplY3QnXVsnc2hhJ107Cn0KfQoKJHJlc291cmNlID0gJHRoaXMtPmdldE5leHRQYWdlKCRyZXNwb25zZSk7Cn0gd2hpbGUgKCRyZXNvdXJjZSk7CgokdGhpcy0+YnJhbmNoZXMgPSAkYnJhbmNoZXM7Cn0KCnJldHVybiAkdGhpcy0+YnJhbmNoZXM7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3VwcG9ydHMoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgc3RyaW5nICR1cmwsIGJvb2wgJGRlZXAgPSBmYWxzZSk6IGJvb2wKewppZiAoIVByZWc6OmlzTWF0Y2goJyNeKCg/Omh0dHBzP3xnaXQpOi8vKFteL10rKS98Z2l0QChbXjpdKyk6Lz8pKFteL10rKS8oW14vXSs/KSg/OlwuZ2l0fC8pPyQjJywgJHVybCwgJG1hdGNoZXMpKSB7CnJldHVybiBmYWxzZTsKfQoKJG9yaWdpblVybCA9ICRtYXRjaGVzWzJdID8/IChzdHJpbmcpICRtYXRjaGVzWzNdOwppZiAoIWluX2FycmF5KHN0cnRvbG93ZXIoUHJlZzo6cmVwbGFjZSgne153d3dcLn1pJywgJycsICRvcmlnaW5VcmwpKSwgJGNvbmZpZy0+Z2V0KCdnaXRodWItZG9tYWlucycpKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICghZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpKSB7CiRpby0+d3JpdGVFcnJvcignU2tpcHBpbmcgR2l0SHViIGRyaXZlciBmb3IgJy4kdXJsLicgYmVjYXVzZSB0aGUgT3BlblNTTCBQSFAgZXh0ZW5zaW9uIGlzIG1pc3NpbmcuJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUkJPU0UpOwoKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb0RhdGEoKTogP2FycmF5CnsKJHRoaXMtPmZldGNoUm9vdElkZW50aWZpZXIoKTsKCnJldHVybiAkdGhpcy0+cmVwb0RhdGE7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZW5lcmF0ZVNzaFVybCgpOiBzdHJpbmcKewppZiAoZmFsc2UgIT09IHN0cnBvcygkdGhpcy0+b3JpZ2luVXJsLCAnOicpKSB7CnJldHVybiAnc3NoOi8vZ2l0QCcgLiAkdGhpcy0+b3JpZ2luVXJsIC4gJy8nLiR0aGlzLT5vd25lci4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy5naXQnOwp9CgpyZXR1cm4gJ2dpdEAnIC4gJHRoaXMtPm9yaWdpblVybCAuICc6Jy4kdGhpcy0+b3duZXIuJy8nLiR0aGlzLT5yZXBvc2l0b3J5LicuZ2l0JzsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldENvbnRlbnRzKHN0cmluZyAkdXJsLCBib29sICRmZXRjaGluZ1JlcG9EYXRhID0gZmFsc2UpOiBSZXNwb25zZQp7CnRyeSB7CnJldHVybiBwYXJlbnQ6OmdldENvbnRlbnRzKCR1cmwpOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKJGdpdEh1YlV0aWwgPSBuZXcgR2l0SHViKCR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPnByb2Nlc3MsICR0aGlzLT5odHRwRG93bmxvYWRlcik7Cgpzd2l0Y2ggKCRlLT5nZXRDb2RlKCkpIHsKY2FzZSA0MDE6CmNhc2UgNDA0OgoKaWYgKCEkZmV0Y2hpbmdSZXBvRGF0YSkgewp0aHJvdyAkZTsKfQoKaWYgKCRnaXRIdWJVdGlsLT5hdXRob3JpemVPQXV0aCgkdGhpcy0+b3JpZ2luVXJsKSkgewpyZXR1cm4gcGFyZW50OjpnZXRDb250ZW50cygkdXJsKTsKfQoKaWYgKCEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewokdGhpcy0+YXR0ZW1wdENsb25lRmFsbGJhY2soJGUpOwoKcmV0dXJuIG5ldyBSZXNwb25zZShbJ3VybCcgPT4gJ2R1bW15J10sIDIwMCwgW10sICdudWxsJyk7Cn0KCiRzY29wZXNJc3N1ZWQgPSBbXTsKJHNjb3Blc05lZWRlZCA9IFtdOwppZiAoJGhlYWRlcnMgPSAkZS0+Z2V0SGVhZGVycygpKSB7CmlmICgkc2NvcGVzID0gUmVzcG9uc2U6OmZpbmRIZWFkZXJWYWx1ZSgkaGVhZGVycywgJ1gtT0F1dGgtU2NvcGVzJykpIHsKJHNjb3Blc0lzc3VlZCA9IGV4cGxvZGUoJyAnLCAkc2NvcGVzKTsKfQppZiAoJHNjb3BlcyA9IFJlc3BvbnNlOjpmaW5kSGVhZGVyVmFsdWUoJGhlYWRlcnMsICdYLUFjY2VwdGVkLU9BdXRoLVNjb3BlcycpKSB7CiRzY29wZXNOZWVkZWQgPSBleHBsb2RlKCcgJywgJHNjb3Blcyk7Cn0KfQokc2NvcGVzRmFpbGVkID0gYXJyYXlfZGlmZigkc2NvcGVzTmVlZGVkLCAkc2NvcGVzSXNzdWVkKTsKCgppZiAoISRoZWFkZXJzIHx8ICFjb3VudCgkc2NvcGVzTmVlZGVkKSB8fCBjb3VudCgkc2NvcGVzRmFpbGVkKSkgewokZ2l0SHViVXRpbC0+YXV0aG9yaXplT0F1dGhJbnRlcmFjdGl2ZWx5KCR0aGlzLT5vcmlnaW5VcmwsICdZb3VyIEdpdEh1YiBjcmVkZW50aWFscyBhcmUgcmVxdWlyZWQgdG8gZmV0Y2ggcHJpdmF0ZSByZXBvc2l0b3J5IG1ldGFkYXRhICg8aW5mbz4nLiR0aGlzLT51cmwuJzwvaW5mbz4pJyk7Cn0KCnJldHVybiBwYXJlbnQ6OmdldENvbnRlbnRzKCR1cmwpOwoKY2FzZSA0MDM6CmlmICghJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkdGhpcy0+b3JpZ2luVXJsKSAmJiAkZ2l0SHViVXRpbC0+YXV0aG9yaXplT0F1dGgoJHRoaXMtPm9yaWdpblVybCkpIHsKcmV0dXJuIHBhcmVudDo6Z2V0Q29udGVudHMoJHVybCk7Cn0KCmlmICghJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkgJiYgJGZldGNoaW5nUmVwb0RhdGEpIHsKJHRoaXMtPmF0dGVtcHRDbG9uZUZhbGxiYWNrKCRlKTsKCnJldHVybiBuZXcgUmVzcG9uc2UoWyd1cmwnID0+ICdkdW1teSddLCAyMDAsIFtdLCAnbnVsbCcpOwp9CgokcmF0ZUxpbWl0ZWQgPSAkZ2l0SHViVXRpbC0+aXNSYXRlTGltaXRlZCgoYXJyYXkpICRlLT5nZXRIZWFkZXJzKCkpOwoKaWYgKCEkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCR0aGlzLT5vcmlnaW5VcmwpKSB7CmlmICghJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+R2l0SHViIEFQSSBsaW1pdCBleGhhdXN0ZWQuIEZhaWxlZCB0byBnZXQgbWV0YWRhdGEgZm9yIHRoZSAnLiR0aGlzLT51cmwuJyByZXBvc2l0b3J5LCB0cnkgcnVubmluZyBpbiBpbnRlcmFjdGl2ZSBtb2RlIHNvIHRoYXQgeW91IGNhbiBlbnRlciB5b3VyIEdpdEh1YiBjcmVkZW50aWFscyB0byBpbmNyZWFzZSB0aGUgQVBJIGxpbWl0PC9lcnJvcj4nKTsKdGhyb3cgJGU7Cn0KCiRnaXRIdWJVdGlsLT5hdXRob3JpemVPQXV0aEludGVyYWN0aXZlbHkoJHRoaXMtPm9yaWdpblVybCwgJ0FQSSBsaW1pdCBleGhhdXN0ZWQuIEVudGVyIHlvdXIgR2l0SHViIGNyZWRlbnRpYWxzIHRvIGdldCBhIGxhcmdlciBBUEkgbGltaXQgKDxpbmZvPicuJHRoaXMtPnVybC4nPC9pbmZvPiknKTsKCnJldHVybiBwYXJlbnQ6OmdldENvbnRlbnRzKCR1cmwpOwp9CgppZiAoJHJhdGVMaW1pdGVkKSB7CiRyYXRlTGltaXQgPSAkZ2l0SHViVXRpbC0+Z2V0UmF0ZUxpbWl0KCRlLT5nZXRIZWFkZXJzKCkpOwokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZigKJzxlcnJvcj5HaXRIdWIgQVBJIGxpbWl0ICglZCBjYWxscy9ocikgaXMgZXhoYXVzdGVkLiBZb3UgYXJlIGFscmVhZHkgYXV0aG9yaXplZCBzbyB5b3UgaGF2ZSB0byB3YWl0IHVudGlsICVzIGJlZm9yZSBkb2luZyBtb3JlIHJlcXVlc3RzPC9lcnJvcj4nLAokcmF0ZUxpbWl0WydsaW1pdCddLAokcmF0ZUxpbWl0WydyZXNldCddCikpOwp9Cgp0aHJvdyAkZTsKCmRlZmF1bHQ6CnRocm93ICRlOwp9Cn0KfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZmV0Y2hSb290SWRlbnRpZmllcigpOiB2b2lkCnsKaWYgKCR0aGlzLT5yZXBvRGF0YSkgewpyZXR1cm47Cn0KCiRyZXBvRGF0YVVybCA9ICR0aGlzLT5nZXRBcGlVcmwoKSAuICcvcmVwb3MvJy4kdGhpcy0+b3duZXIuJy8nLiR0aGlzLT5yZXBvc2l0b3J5OwoKdHJ5IHsKJHRoaXMtPnJlcG9EYXRhID0gJHRoaXMtPmdldENvbnRlbnRzKCRyZXBvRGF0YVVybCwgdHJ1ZSktPmRlY29kZUpzb24oKTsKfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CmlmICgkZS0+Z2V0Q29kZSgpID09PSA0OTkpIHsKJHRoaXMtPmF0dGVtcHRDbG9uZUZhbGxiYWNrKCRlKTsKfSBlbHNlIHsKdGhyb3cgJGU7Cn0KfQppZiAobnVsbCA9PT0gJHRoaXMtPnJlcG9EYXRhICYmIG51bGwgIT09ICR0aGlzLT5naXREcml2ZXIpIHsKcmV0dXJuOwp9CgokdGhpcy0+b3duZXIgPSAkdGhpcy0+cmVwb0RhdGFbJ293bmVyJ11bJ2xvZ2luJ107CiR0aGlzLT5yZXBvc2l0b3J5ID0gJHRoaXMtPnJlcG9EYXRhWyduYW1lJ107CgokdGhpcy0+aXNQcml2YXRlID0gIWVtcHR5KCR0aGlzLT5yZXBvRGF0YVsncHJpdmF0ZSddKTsKaWYgKGlzc2V0KCR0aGlzLT5yZXBvRGF0YVsnZGVmYXVsdF9icmFuY2gnXSkpIHsKJHRoaXMtPnJvb3RJZGVudGlmaWVyID0gJHRoaXMtPnJlcG9EYXRhWydkZWZhdWx0X2JyYW5jaCddOwp9IGVsc2VpZiAoaXNzZXQoJHRoaXMtPnJlcG9EYXRhWydtYXN0ZXJfYnJhbmNoJ10pKSB7CiR0aGlzLT5yb290SWRlbnRpZmllciA9ICR0aGlzLT5yZXBvRGF0YVsnbWFzdGVyX2JyYW5jaCddOwp9IGVsc2UgewokdGhpcy0+cm9vdElkZW50aWZpZXIgPSAnbWFzdGVyJzsKfQokdGhpcy0+aGFzSXNzdWVzID0gIWVtcHR5KCR0aGlzLT5yZXBvRGF0YVsnaGFzX2lzc3VlcyddKTsKJHRoaXMtPmlzQXJjaGl2ZWQgPSAhZW1wdHkoJHRoaXMtPnJlcG9EYXRhWydhcmNoaXZlZCddKTsKfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGF0dGVtcHRDbG9uZUZhbGxiYWNrKD9cVGhyb3dhYmxlICRlID0gbnVsbCk6IGJvb2wKewppZiAoISR0aGlzLT5hbGxvd0dpdEZhbGxiYWNrKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFsbGJhY2sgdG8gZ2l0IGRyaXZlciBkaXNhYmxlZCcsIDAsICRlKTsKfQoKJHRoaXMtPmlzUHJpdmF0ZSA9IHRydWU7Cgp0cnkgewoKCgoKJHRoaXMtPnNldHVwR2l0RHJpdmVyKCR0aGlzLT5nZW5lcmF0ZVNzaFVybCgpKTsKCnJldHVybiB0cnVlOwp9IGNhdGNoIChcUnVudGltZUV4Y2VwdGlvbiAkZSkgewokdGhpcy0+Z2l0RHJpdmVyID0gbnVsbDsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPkZhaWxlZCB0byBjbG9uZSB0aGUgJy4kdGhpcy0+Z2VuZXJhdGVTc2hVcmwoKS4nIHJlcG9zaXRvcnksIHRyeSBydW5uaW5nIGluIGludGVyYWN0aXZlIG1vZGUgc28gdGhhdCB5b3UgY2FuIGVudGVyIHlvdXIgR2l0SHViIGNyZWRlbnRpYWxzPC9lcnJvcj4nKTsKdGhyb3cgJGU7Cn0KfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIHNldHVwR2l0RHJpdmVyKHN0cmluZyAkdXJsKTogdm9pZAp7CmlmICghJHRoaXMtPmFsbG93R2l0RmFsbGJhY2spIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWxsYmFjayB0byBnaXQgZHJpdmVyIGRpc2FibGVkJyk7Cn0KJHRoaXMtPmdpdERyaXZlciA9IG5ldyBHaXREcml2ZXIoClsndXJsJyA9PiAkdXJsXSwKJHRoaXMtPmlvLAokdGhpcy0+Y29uZmlnLAokdGhpcy0+aHR0cERvd25sb2FkZXIsCiR0aGlzLT5wcm9jZXNzCik7CiR0aGlzLT5naXREcml2ZXItPmluaXRpYWxpemUoKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldE5leHRQYWdlKFJlc3BvbnNlICRyZXNwb25zZSk6ID9zdHJpbmcKewokaGVhZGVyID0gJHJlc3BvbnNlLT5nZXRIZWFkZXIoJ2xpbmsnKTsKaWYgKCEkaGVhZGVyKSB7CnJldHVybiBudWxsOwp9CgokbGlua3MgPSBleHBsb2RlKCcsJywgJGhlYWRlcik7CmZvcmVhY2ggKCRsaW5rcyBhcyAkbGluaykgewppZiAoUHJlZzo6aXNNYXRjaCgnezwoLis/KT47ICpyZWw9Im5leHQifScsICRsaW5rLCAkbWF0Y2gpKSB7CnJldHVybiAkbWF0Y2hbMV07Cn0KfQoKcmV0dXJuIG51bGw7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3M7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcQ2FjaGU7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CnVzZSBDb21wb3NlclxVdGlsXEdpdExhYjsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cFxSZXNwb25zZTsKCgoKCgoKCmNsYXNzIEdpdExhYkRyaXZlciBleHRlbmRzIFZjc0RyaXZlcgp7CgoKCgpwcml2YXRlICRzY2hlbWU7Cgpwcml2YXRlICRuYW1lc3BhY2U7Cgpwcml2YXRlICRyZXBvc2l0b3J5OwoKCgoKcHJpdmF0ZSAkcHJvamVjdCA9IG51bGw7CgoKCgpwcml2YXRlICRjb21taXRzID0gW107CgoKcHJpdmF0ZSAkdGFnczsKCgpwcml2YXRlICRicmFuY2hlczsKCgoKCgoKcHJvdGVjdGVkICRnaXREcml2ZXIgPSBudWxsOwoKCgoKCgpwcm90ZWN0ZWQgJHByb3RvY29sOwoKCgoKCgpwcml2YXRlICRpc1ByaXZhdGUgPSB0cnVlOwoKCgoKcHJpdmF0ZSAkaGFzTm9uc3RhbmRhcmRPcmlnaW4gPSBmYWxzZTsKCnB1YmxpYyBjb25zdCBVUkxfUkVHRVggPSAnI14oPzooP1A8c2NoZW1lPmh0dHBzPyk6Ly8oP1A8ZG9tYWluPi4rPykoPzo6KD9QPHBvcnQ+WzAtOV0rKSk/L3xnaXRAKD9QPGRvbWFpbjI+W146XSspOikoP1A8cGFydHM+LispLyg/UDxyZXBvPlteL10rPykoPzpcLmdpdHwvKT8kIyc7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGluaXRpYWxpemUoKTogdm9pZAp7CmlmICghUHJlZzo6aXNNYXRjaChzZWxmOjpVUkxfUkVHRVgsICR0aGlzLT51cmwsICRtYXRjaCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlIEdpdExhYiByZXBvc2l0b3J5IFVSTCAlcyBpcyBpbnZhbGlkLiBJdCBtdXN0IGJlIHRoZSBIVFRQIFVSTCBvZiBhIEdpdExhYiBwcm9qZWN0LicsICR0aGlzLT51cmwpKTsKfQoKJGd1ZXNzZWREb21haW4gPSAkbWF0Y2hbJ2RvbWFpbiddID8/IChzdHJpbmcpICRtYXRjaFsnZG9tYWluMiddOwokY29uZmlndXJlZERvbWFpbnMgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2dpdGxhYi1kb21haW5zJyk7CiR1cmxQYXJ0cyA9IGV4cGxvZGUoJy8nLCAkbWF0Y2hbJ3BhcnRzJ10pOwoKJHRoaXMtPnNjaGVtZSA9IGluX2FycmF5KCRtYXRjaFsnc2NoZW1lJ10sIFsnaHR0cHMnLCAnaHR0cCddLCB0cnVlKQo/ICRtYXRjaFsnc2NoZW1lJ10KOiAoaXNzZXQoJHRoaXMtPnJlcG9Db25maWdbJ3NlY3VyZS1odHRwJ10pICYmICR0aGlzLT5yZXBvQ29uZmlnWydzZWN1cmUtaHR0cCddID09PSBmYWxzZSA/ICdodHRwJyA6ICdodHRwcycpCjsKJG9yaWdpbiA9IHNlbGY6OmRldGVybWluZU9yaWdpbigkY29uZmlndXJlZERvbWFpbnMsICRndWVzc2VkRG9tYWluLCAkdXJsUGFydHMsICRtYXRjaFsncG9ydCddKTsKaWYgKGZhbHNlID09PSAkb3JpZ2luKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0l0IHNob3VsZCBub3QgYmUgcG9zc2libGUgdG8gY3JlYXRlIGEgZ2l0bGFiIGRyaXZlciB3aXRoIGFuIHVucGFyc2FibGUgb3JpZ2luIFVSTCAoJy4kdGhpcy0+dXJsLicpJyk7Cn0KJHRoaXMtPm9yaWdpblVybCA9ICRvcmlnaW47CgppZiAoaXNfc3RyaW5nKCRwcm90b2NvbCA9ICR0aGlzLT5jb25maWctPmdldCgnZ2l0bGFiLXByb3RvY29sJykpKSB7CgppZiAoIWluX2FycmF5KCRwcm90b2NvbCwgWydnaXQnLCAnaHR0cCcsICdodHRwcyddLCB0cnVlKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ2dpdGxhYi1wcm90b2NvbCBtdXN0IGJlIG9uZSBvZiBnaXQsIGh0dHAuJyk7Cn0KJHRoaXMtPnByb3RvY29sID0gJHByb3RvY29sID09PSAnZ2l0JyA/ICdzc2gnIDogJ2h0dHAnOwp9CgppZiAoZmFsc2UgIT09IHN0cnBvcygkdGhpcy0+b3JpZ2luVXJsLCAnOicpIHx8IGZhbHNlICE9PSBzdHJwb3MoJHRoaXMtPm9yaWdpblVybCwgJy8nKSkgewokdGhpcy0+aGFzTm9uc3RhbmRhcmRPcmlnaW4gPSB0cnVlOwp9CgokdGhpcy0+bmFtZXNwYWNlID0gaW1wbG9kZSgnLycsICR1cmxQYXJ0cyk7CiR0aGlzLT5yZXBvc2l0b3J5ID0gUHJlZzo6cmVwbGFjZSgnIyhcLmdpdCkkIycsICcnLCAkbWF0Y2hbJ3JlcG8nXSk7CgokdGhpcy0+Y2FjaGUgPSBuZXcgQ2FjaGUoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXJlcG8tZGlyJykuJy8nLiR0aGlzLT5vcmlnaW5VcmwuJy8nLiR0aGlzLT5uYW1lc3BhY2UuJy8nLiR0aGlzLT5yZXBvc2l0b3J5KTsKJHRoaXMtPmNhY2hlLT5zZXRSZWFkT25seSgkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXJlYWQtb25seScpKTsKCiR0aGlzLT5mZXRjaFByb2plY3QoKTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEh0dHBEb3dubG9hZGVyKEh0dHBEb3dubG9hZGVyICRodHRwRG93bmxvYWRlcik6IHZvaWQKewokdGhpcy0+aHR0cERvd25sb2FkZXIgPSAkaHR0cERvd25sb2FkZXI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21wb3NlckluZm9ybWF0aW9uKHN0cmluZyAkaWRlbnRpZmllcik6ID9hcnJheQp7CmlmICgkdGhpcy0+Z2l0RHJpdmVyKSB7CnJldHVybiAkdGhpcy0+Z2l0RHJpdmVyLT5nZXRDb21wb3NlckluZm9ybWF0aW9uKCRpZGVudGlmaWVyKTsKfQoKaWYgKCFpc3NldCgkdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXSkpIHsKaWYgKCR0aGlzLT5zaG91bGRDYWNoZSgkaWRlbnRpZmllcikgJiYgJHJlcyA9ICR0aGlzLT5jYWNoZS0+cmVhZCgkaWRlbnRpZmllcikpIHsKJGNvbXBvc2VyID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkcmVzKTsKfSBlbHNlIHsKJGNvbXBvc2VyID0gJHRoaXMtPmdldEJhc2VDb21wb3NlckluZm9ybWF0aW9uKCRpZGVudGlmaWVyKTsKCmlmICgkdGhpcy0+c2hvdWxkQ2FjaGUoJGlkZW50aWZpZXIpKSB7CiR0aGlzLT5jYWNoZS0+d3JpdGUoJGlkZW50aWZpZXIsIEpzb25GaWxlOjplbmNvZGUoJGNvbXBvc2VyLCBcSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSB8IFxKU09OX1VORVNDQVBFRF9TTEFTSEVTKSk7Cn0KfQoKaWYgKG51bGwgIT09ICRjb21wb3NlcikgewoKaWYgKGlzc2V0KCRjb21wb3Nlclsnc3VwcG9ydCddKSAmJiAhaXNfYXJyYXkoJGNvbXBvc2VyWydzdXBwb3J0J10pKSB7CiRjb21wb3Nlclsnc3VwcG9ydCddID0gW107Cn0KaWYgKCFpc3NldCgkY29tcG9zZXJbJ3N1cHBvcnQnXVsnc291cmNlJ10pICYmIGlzc2V0KCR0aGlzLT5wcm9qZWN0Wyd3ZWJfdXJsJ10pKSB7CiRsYWJlbCA9IGFycmF5X3NlYXJjaCgkaWRlbnRpZmllciwgJHRoaXMtPmdldFRhZ3MoKSwgdHJ1ZSkgPzogYXJyYXlfc2VhcmNoKCRpZGVudGlmaWVyLCAkdGhpcy0+Z2V0QnJhbmNoZXMoKSwgdHJ1ZSkgPzogJGlkZW50aWZpZXI7CiRjb21wb3Nlclsnc3VwcG9ydCddWydzb3VyY2UnXSA9IHNwcmludGYoJyVzLy0vdHJlZS8lcycsICR0aGlzLT5wcm9qZWN0Wyd3ZWJfdXJsJ10sICRsYWJlbCk7Cn0KaWYgKCFpc3NldCgkY29tcG9zZXJbJ3N1cHBvcnQnXVsnaXNzdWVzJ10pICYmICFlbXB0eSgkdGhpcy0+cHJvamVjdFsnaXNzdWVzX2VuYWJsZWQnXSkgJiYgaXNzZXQoJHRoaXMtPnByb2plY3RbJ3dlYl91cmwnXSkpIHsKJGNvbXBvc2VyWydzdXBwb3J0J11bJ2lzc3VlcyddID0gc3ByaW50ZignJXMvLS9pc3N1ZXMnLCAkdGhpcy0+cHJvamVjdFsnd2ViX3VybCddKTsKfQppZiAoIWlzc2V0KCRjb21wb3NlclsnYWJhbmRvbmVkJ10pICYmICFlbXB0eSgkdGhpcy0+cHJvamVjdFsnYXJjaGl2ZWQnXSkpIHsKJGNvbXBvc2VyWydhYmFuZG9uZWQnXSA9IHRydWU7Cn0KfQoKJHRoaXMtPmluZm9DYWNoZVskaWRlbnRpZmllcl0gPSAkY29tcG9zZXI7Cn0KCnJldHVybiAkdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZpbGVDb250ZW50KHN0cmluZyAkZmlsZSwgc3RyaW5nICRpZGVudGlmaWVyKTogP3N0cmluZwp7CmlmICgkdGhpcy0+Z2l0RHJpdmVyKSB7CnJldHVybiAkdGhpcy0+Z2l0RHJpdmVyLT5nZXRGaWxlQ29udGVudCgkZmlsZSwgJGlkZW50aWZpZXIpOwp9CgoKaWYgKCFQcmVnOjppc01hdGNoKCd7W2EtZjAtOV17NDB9fWknLCAkaWRlbnRpZmllcikpIHsKJGJyYW5jaGVzID0gJHRoaXMtPmdldEJyYW5jaGVzKCk7CmlmIChpc3NldCgkYnJhbmNoZXNbJGlkZW50aWZpZXJdKSkgewokaWRlbnRpZmllciA9ICRicmFuY2hlc1skaWRlbnRpZmllcl07Cn0KfQoKJHJlc291cmNlID0gJHRoaXMtPmdldEFwaVVybCgpLicvcmVwb3NpdG9yeS9maWxlcy8nLiR0aGlzLT51cmxFbmNvZGVBbGwoJGZpbGUpLicvcmF3P3JlZj0nLiRpZGVudGlmaWVyOwoKdHJ5IHsKJGNvbnRlbnQgPSAkdGhpcy0+Z2V0Q29udGVudHMoJHJlc291cmNlKS0+Z2V0Qm9keSgpOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKaWYgKCRlLT5nZXRDb2RlKCkgIT09IDQwNCkgewp0aHJvdyAkZTsKfQoKcmV0dXJuIG51bGw7Cn0KCnJldHVybiAkY29udGVudDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENoYW5nZURhdGUoc3RyaW5nICRpZGVudGlmaWVyKTogP1xEYXRlVGltZUltbXV0YWJsZQp7CmlmICgkdGhpcy0+Z2l0RHJpdmVyKSB7CnJldHVybiAkdGhpcy0+Z2l0RHJpdmVyLT5nZXRDaGFuZ2VEYXRlKCRpZGVudGlmaWVyKTsKfQoKaWYgKGlzc2V0KCR0aGlzLT5jb21taXRzWyRpZGVudGlmaWVyXSkpIHsKcmV0dXJuIG5ldyBcRGF0ZVRpbWVJbW11dGFibGUoJHRoaXMtPmNvbW1pdHNbJGlkZW50aWZpZXJdWydjb21taXR0ZWRfZGF0ZSddKTsKfQoKcmV0dXJuIG51bGw7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvc2l0b3J5VXJsKCk6IHN0cmluZwp7CmlmICgkdGhpcy0+cHJvdG9jb2wpIHsKcmV0dXJuICR0aGlzLT5wcm9qZWN0WyJ7JHRoaXMtPnByb3RvY29sfV91cmxfdG9fcmVwbyJdOwp9CgpyZXR1cm4gJHRoaXMtPmlzUHJpdmF0ZSA/ICR0aGlzLT5wcm9qZWN0Wydzc2hfdXJsX3RvX3JlcG8nXSA6ICR0aGlzLT5wcm9qZWN0WydodHRwX3VybF90b19yZXBvJ107Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVcmwoKTogc3RyaW5nCnsKaWYgKCR0aGlzLT5naXREcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldFVybCgpOwp9CgpyZXR1cm4gJHRoaXMtPnByb2plY3RbJ3dlYl91cmwnXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3Qoc3RyaW5nICRpZGVudGlmaWVyKTogP2FycmF5CnsKJHVybCA9ICR0aGlzLT5nZXRBcGlVcmwoKS4nL3JlcG9zaXRvcnkvYXJjaGl2ZS56aXA/c2hhPScuJGlkZW50aWZpZXI7CgpyZXR1cm4gWyd0eXBlJyA9PiAnemlwJywgJ3VybCcgPT4gJHVybCwgJ3JlZmVyZW5jZScgPT4gJGlkZW50aWZpZXIsICdzaGFzdW0nID0+ICcnXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZShzdHJpbmcgJGlkZW50aWZpZXIpOiBhcnJheQp7CmlmICgkdGhpcy0+Z2l0RHJpdmVyKSB7CnJldHVybiAkdGhpcy0+Z2l0RHJpdmVyLT5nZXRTb3VyY2UoJGlkZW50aWZpZXIpOwp9CgpyZXR1cm4gWyd0eXBlJyA9PiAnZ2l0JywgJ3VybCcgPT4gJHRoaXMtPmdldFJlcG9zaXRvcnlVcmwoKSwgJ3JlZmVyZW5jZScgPT4gJGlkZW50aWZpZXJdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Um9vdElkZW50aWZpZXIoKTogc3RyaW5nCnsKaWYgKCR0aGlzLT5naXREcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldFJvb3RJZGVudGlmaWVyKCk7Cn0KCnJldHVybiAkdGhpcy0+cHJvamVjdFsnZGVmYXVsdF9icmFuY2gnXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEJyYW5jaGVzKCk6IGFycmF5CnsKaWYgKCR0aGlzLT5naXREcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldEJyYW5jaGVzKCk7Cn0KCmlmIChudWxsID09PSAkdGhpcy0+YnJhbmNoZXMpIHsKJHRoaXMtPmJyYW5jaGVzID0gJHRoaXMtPmdldFJlZmVyZW5jZXMoJ2JyYW5jaGVzJyk7Cn0KCnJldHVybiAkdGhpcy0+YnJhbmNoZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUYWdzKCk6IGFycmF5CnsKaWYgKCR0aGlzLT5naXREcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldFRhZ3MoKTsKfQoKaWYgKG51bGwgPT09ICR0aGlzLT50YWdzKSB7CiR0aGlzLT50YWdzID0gJHRoaXMtPmdldFJlZmVyZW5jZXMoJ3RhZ3MnKTsKfQoKcmV0dXJuICR0aGlzLT50YWdzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXBpVXJsKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+c2NoZW1lLic6Ly8nLiR0aGlzLT5vcmlnaW5VcmwuJy9hcGkvdjQvcHJvamVjdHMvJy4kdGhpcy0+dXJsRW5jb2RlQWxsKCR0aGlzLT5uYW1lc3BhY2UpLiclMkYnLiR0aGlzLT51cmxFbmNvZGVBbGwoJHRoaXMtPnJlcG9zaXRvcnkpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHVybEVuY29kZUFsbChzdHJpbmcgJHN0cmluZyk6IHN0cmluZwp7CiRlbmNvZGVkID0gJyc7CmZvciAoJGkgPSAwOyBpc3NldCgkc3RyaW5nWyRpXSk7ICRpKyspIHsKJGNoYXJhY3RlciA9ICRzdHJpbmdbJGldOwppZiAoIWN0eXBlX2FsbnVtKCRjaGFyYWN0ZXIpICYmICFpbl9hcnJheSgkY2hhcmFjdGVyLCBbJy0nLCAnXyddLCB0cnVlKSkgewokY2hhcmFjdGVyID0gJyUnIC4gc3ByaW50ZignJTAyWCcsIG9yZCgkY2hhcmFjdGVyKSk7Cn0KJGVuY29kZWQgLj0gJGNoYXJhY3RlcjsKfQoKcmV0dXJuICRlbmNvZGVkOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UmVmZXJlbmNlcyhzdHJpbmcgJHR5cGUpOiBhcnJheQp7CiRwZXJQYWdlID0gMTAwOwokcmVzb3VyY2UgPSAkdGhpcy0+Z2V0QXBpVXJsKCkuJy9yZXBvc2l0b3J5LycuJHR5cGUuJz9wZXJfcGFnZT0nLiRwZXJQYWdlOwoKJHJlZmVyZW5jZXMgPSBbXTsKZG8gewokcmVzcG9uc2UgPSAkdGhpcy0+Z2V0Q29udGVudHMoJHJlc291cmNlKTsKJGRhdGEgPSAkcmVzcG9uc2UtPmRlY29kZUpzb24oKTsKCmZvcmVhY2ggKCRkYXRhIGFzICRkYXR1bSkgewokcmVmZXJlbmNlc1skZGF0dW1bJ25hbWUnXV0gPSAkZGF0dW1bJ2NvbW1pdCddWydpZCddOwoKCgokdGhpcy0+Y29tbWl0c1skZGF0dW1bJ2NvbW1pdCddWydpZCddXSA9ICRkYXR1bVsnY29tbWl0J107Cn0KCmlmIChjb3VudCgkZGF0YSkgPj0gJHBlclBhZ2UpIHsKJHJlc291cmNlID0gJHRoaXMtPmdldE5leHRQYWdlKCRyZXNwb25zZSk7Cn0gZWxzZSB7CiRyZXNvdXJjZSA9IGZhbHNlOwp9Cn0gd2hpbGUgKCRyZXNvdXJjZSk7CgpyZXR1cm4gJHJlZmVyZW5jZXM7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBmZXRjaFByb2plY3QoKTogdm9pZAp7CmlmICghaXNfbnVsbCgkdGhpcy0+cHJvamVjdCkpIHsKcmV0dXJuOwp9CgoKJHJlc291cmNlID0gJHRoaXMtPmdldEFwaVVybCgpOwokdGhpcy0+cHJvamVjdCA9ICR0aGlzLT5nZXRDb250ZW50cygkcmVzb3VyY2UsIHRydWUpLT5kZWNvZGVKc29uKCk7CmlmIChpc3NldCgkdGhpcy0+cHJvamVjdFsndmlzaWJpbGl0eSddKSkgewokdGhpcy0+aXNQcml2YXRlID0gJHRoaXMtPnByb2plY3RbJ3Zpc2liaWxpdHknXSAhPT0gJ3B1YmxpYyc7Cn0gZWxzZSB7CgokdGhpcy0+aXNQcml2YXRlID0gZmFsc2U7Cn0KfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGF0dGVtcHRDbG9uZUZhbGxiYWNrKCk6IGJvb2wKewppZiAoJHRoaXMtPmlzUHJpdmF0ZSA9PT0gZmFsc2UpIHsKJHVybCA9ICR0aGlzLT5nZW5lcmF0ZVB1YmxpY1VybCgpOwp9IGVsc2UgewokdXJsID0gJHRoaXMtPmdlbmVyYXRlU3NoVXJsKCk7Cn0KCnRyeSB7CgoKCiR0aGlzLT5zZXR1cEdpdERyaXZlcigkdXJsKTsKCnJldHVybiB0cnVlOwp9IGNhdGNoIChcUnVudGltZUV4Y2VwdGlvbiAkZSkgewokdGhpcy0+Z2l0RHJpdmVyID0gbnVsbDsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPkZhaWxlZCB0byBjbG9uZSB0aGUgJy4kdXJsLicgcmVwb3NpdG9yeSwgdHJ5IHJ1bm5pbmcgaW4gaW50ZXJhY3RpdmUgbW9kZSBzbyB0aGF0IHlvdSBjYW4gZW50ZXIgeW91ciBjcmVkZW50aWFsczwvZXJyb3I+Jyk7CnRocm93ICRlOwp9Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZW5lcmF0ZVNzaFVybCgpOiBzdHJpbmcKewppZiAoJHRoaXMtPmhhc05vbnN0YW5kYXJkT3JpZ2luKSB7CnJldHVybiAnc3NoOi8vZ2l0QCcuJHRoaXMtPm9yaWdpblVybC4nLycuJHRoaXMtPm5hbWVzcGFjZS4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy5naXQnOwp9CgpyZXR1cm4gJ2dpdEAnIC4gJHRoaXMtPm9yaWdpblVybCAuICc6Jy4kdGhpcy0+bmFtZXNwYWNlLicvJy4kdGhpcy0+cmVwb3NpdG9yeS4nLmdpdCc7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBnZW5lcmF0ZVB1YmxpY1VybCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnNjaGVtZSAuICc6Ly8nIC4gJHRoaXMtPm9yaWdpblVybCAuICcvJy4kdGhpcy0+bmFtZXNwYWNlLicvJy4kdGhpcy0+cmVwb3NpdG9yeS4nLmdpdCc7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBzZXR1cEdpdERyaXZlcihzdHJpbmcgJHVybCk6IHZvaWQKewokdGhpcy0+Z2l0RHJpdmVyID0gbmV3IEdpdERyaXZlcigKWyd1cmwnID0+ICR1cmxdLAokdGhpcy0+aW8sCiR0aGlzLT5jb25maWcsCiR0aGlzLT5odHRwRG93bmxvYWRlciwKJHRoaXMtPnByb2Nlc3MKKTsKJHRoaXMtPmdpdERyaXZlci0+aW5pdGlhbGl6ZSgpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Q29udGVudHMoc3RyaW5nICR1cmwsIGJvb2wgJGZldGNoaW5nUmVwb0RhdGEgPSBmYWxzZSk6IFJlc3BvbnNlCnsKdHJ5IHsKJHJlc3BvbnNlID0gcGFyZW50OjpnZXRDb250ZW50cygkdXJsKTsKCmlmICgkZmV0Y2hpbmdSZXBvRGF0YSkgewokanNvbiA9ICRyZXNwb25zZS0+ZGVjb2RlSnNvbigpOwoKCgoKaWYgKCFpc3NldCgkanNvblsnZGVmYXVsdF9icmFuY2gnXSkgJiYgaXNzZXQoJGpzb25bJ3Blcm1pc3Npb25zJ10pKSB7CiR0aGlzLT5pc1ByaXZhdGUgPSAkanNvblsndmlzaWJpbGl0eSddICE9PSAncHVibGljJzsKCiRtb3JlVGhhbkd1ZXN0QWNjZXNzID0gZmFsc2U7CgoKCmZvcmVhY2ggKCRqc29uWydwZXJtaXNzaW9ucyddIGFzICRwZXJtaXNzaW9uKSB7CmlmICgkcGVybWlzc2lvbiAmJiAkcGVybWlzc2lvblsnYWNjZXNzX2xldmVsJ10gPj0gMjApIHsKJG1vcmVUaGFuR3Vlc3RBY2Nlc3MgPSB0cnVlOwp9Cn0KCmlmICghJG1vcmVUaGFuR3Vlc3RBY2Nlc3MpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5HaXRMYWIgdG9rZW4gd2l0aCBHdWVzdCBvciBQbGFubmVyIG9ubHkgYWNjZXNzIGRldGVjdGVkPC93YXJuaW5nPicpOwoKJHRoaXMtPmF0dGVtcHRDbG9uZUZhbGxiYWNrKCk7CgpyZXR1cm4gbmV3IFJlc3BvbnNlKFsndXJsJyA9PiAnZHVtbXknXSwgMjAwLCBbXSwgJ251bGwnKTsKfQp9CgoKaWYgKCFpc3NldCgkanNvblsnZGVmYXVsdF9icmFuY2gnXSkpIHsKCmlmIChpc3NldCgkanNvblsncmVwb3NpdG9yeV9hY2Nlc3NfbGV2ZWwnXSkgJiYgJGpzb25bJ3JlcG9zaXRvcnlfYWNjZXNzX2xldmVsJ10gPT09ICdkaXNhYmxlZCcpIHsKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignVGhlIEdpdExhYiByZXBvc2l0b3J5IGlzIGRpc2FibGVkIGluIHRoZSBwcm9qZWN0JywgNDAwKTsKfQoKaWYgKCFlbXB0eSgkanNvblsnaWQnXSkpIHsKJHRoaXMtPmlzUHJpdmF0ZSA9IGZhbHNlOwp9Cgp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdHaXRMYWIgQVBJIHNlZW1zIHRvIG5vdCBiZSBhdXRoZW50aWNhdGVkIGFzIGl0IGRpZCBub3QgcmV0dXJuIGEgZGVmYXVsdF9icmFuY2gnLCA0MDEpOwp9Cn0KCnJldHVybiAkcmVzcG9uc2U7Cn0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgewokZ2l0TGFiVXRpbCA9IG5ldyBHaXRMYWIoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2VzcywgJHRoaXMtPmh0dHBEb3dubG9hZGVyKTsKCnN3aXRjaCAoJGUtPmdldENvZGUoKSkgewpjYXNlIDQwMToKY2FzZSA0MDQ6CgppZiAoISRmZXRjaGluZ1JlcG9EYXRhKSB7CnRocm93ICRlOwp9CgppZiAoJGdpdExhYlV0aWwtPmF1dGhvcml6ZU9BdXRoKCR0aGlzLT5vcmlnaW5VcmwpKSB7CnJldHVybiBwYXJlbnQ6OmdldENvbnRlbnRzKCR1cmwpOwp9CgppZiAoJGdpdExhYlV0aWwtPmlzT0F1dGhFeHBpcmVkKCR0aGlzLT5vcmlnaW5VcmwpICYmICRnaXRMYWJVdGlsLT5hdXRob3JpemVPQXV0aFJlZnJlc2goJHRoaXMtPnNjaGVtZSwgJHRoaXMtPm9yaWdpblVybCkpIHsKcmV0dXJuIHBhcmVudDo6Z2V0Q29udGVudHMoJHVybCk7Cn0KCmlmICghJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkpIHsKJHRoaXMtPmF0dGVtcHRDbG9uZUZhbGxiYWNrKCk7CgpyZXR1cm4gbmV3IFJlc3BvbnNlKFsndXJsJyA9PiAnZHVtbXknXSwgMjAwLCBbXSwgJ251bGwnKTsKfQokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkZhaWxlZCB0byBkb3dubG9hZCAnIC4gJHRoaXMtPm5hbWVzcGFjZSAuICcvJyAuICR0aGlzLT5yZXBvc2l0b3J5IC4gJzonIC4gJGUtPmdldE1lc3NhZ2UoKSAuICc8L3dhcm5pbmc+Jyk7CiRnaXRMYWJVdGlsLT5hdXRob3JpemVPQXV0aEludGVyYWN0aXZlbHkoJHRoaXMtPnNjaGVtZSwgJHRoaXMtPm9yaWdpblVybCwgJ1lvdXIgY3JlZGVudGlhbHMgYXJlIHJlcXVpcmVkIHRvIGZldGNoIHByaXZhdGUgcmVwb3NpdG9yeSBtZXRhZGF0YSAoPGluZm8+Jy4kdGhpcy0+dXJsLic8L2luZm8+KScpOwoKcmV0dXJuIHBhcmVudDo6Z2V0Q29udGVudHMoJHVybCk7CgpjYXNlIDQwMzoKaWYgKCEkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCR0aGlzLT5vcmlnaW5VcmwpICYmICRnaXRMYWJVdGlsLT5hdXRob3JpemVPQXV0aCgkdGhpcy0+b3JpZ2luVXJsKSkgewpyZXR1cm4gcGFyZW50OjpnZXRDb250ZW50cygkdXJsKTsKfQoKaWYgKCEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSAmJiAkZmV0Y2hpbmdSZXBvRGF0YSkgewokdGhpcy0+YXR0ZW1wdENsb25lRmFsbGJhY2soKTsKCnJldHVybiBuZXcgUmVzcG9uc2UoWyd1cmwnID0+ICdkdW1teSddLCAyMDAsIFtdLCAnbnVsbCcpOwp9Cgp0aHJvdyAkZTsKCmRlZmF1bHQ6CnRocm93ICRlOwp9Cn0KfQoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdXBwb3J0cyhJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBzdHJpbmcgJHVybCwgYm9vbCAkZGVlcCA9IGZhbHNlKTogYm9vbAp7CmlmICghUHJlZzo6aXNNYXRjaChzZWxmOjpVUkxfUkVHRVgsICR1cmwsICRtYXRjaCkpIHsKcmV0dXJuIGZhbHNlOwp9Cgokc2NoZW1lID0gJG1hdGNoWydzY2hlbWUnXTsKJGd1ZXNzZWREb21haW4gPSAkbWF0Y2hbJ2RvbWFpbiddID8/IChzdHJpbmcpICRtYXRjaFsnZG9tYWluMiddOwokdXJsUGFydHMgPSBleHBsb2RlKCcvJywgJG1hdGNoWydwYXJ0cyddKTsKCmlmIChmYWxzZSA9PT0gc2VsZjo6ZGV0ZXJtaW5lT3JpZ2luKCRjb25maWctPmdldCgnZ2l0bGFiLWRvbWFpbnMnKSwgJGd1ZXNzZWREb21haW4sICR1cmxQYXJ0cywgJG1hdGNoWydwb3J0J10pKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCdodHRwcycgPT09ICRzY2hlbWUgJiYgIWV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSkgewokaW8tPndyaXRlRXJyb3IoJ1NraXBwaW5nIEdpdExhYiBkcml2ZXIgZm9yICcuJHVybC4nIGJlY2F1c2UgdGhlIE9wZW5TU0wgUEhQIGV4dGVuc2lvbiBpcyBtaXNzaW5nLicsIHRydWUsIElPSW50ZXJmYWNlOjpWRVJCT1NFKTsKCnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9EYXRhKCk6ID9hcnJheQp7CiR0aGlzLT5mZXRjaFByb2plY3QoKTsKCnJldHVybiAkdGhpcy0+cHJvamVjdDsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldE5leHRQYWdlKFJlc3BvbnNlICRyZXNwb25zZSk6ID9zdHJpbmcKewokaGVhZGVyID0gJHJlc3BvbnNlLT5nZXRIZWFkZXIoJ2xpbmsnKTsKCiRsaW5rcyA9IGV4cGxvZGUoJywnLCAkaGVhZGVyKTsKZm9yZWFjaCAoJGxpbmtzIGFzICRsaW5rKSB7CmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7PCguKz8pPjsgKnJlbD0ibmV4dCJ9JywgJGxpbmssICRtYXRjaCkpIHsKcmV0dXJuICRtYXRjaFsxXTsKfQp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZGV0ZXJtaW5lT3JpZ2luKGFycmF5ICRjb25maWd1cmVkRG9tYWlucywgc3RyaW5nICRndWVzc2VkRG9tYWluLCBhcnJheSAmJHVybFBhcnRzLCA/c3RyaW5nICRwb3J0TnVtYmVyKQp7CiRndWVzc2VkRG9tYWluID0gc3RydG9sb3dlcigkZ3Vlc3NlZERvbWFpbik7CgppZiAoaW5fYXJyYXkoJGd1ZXNzZWREb21haW4sICRjb25maWd1cmVkRG9tYWlucykgfHwgKG51bGwgIT09ICRwb3J0TnVtYmVyICYmIGluX2FycmF5KCRndWVzc2VkRG9tYWluLic6Jy4kcG9ydE51bWJlciwgJGNvbmZpZ3VyZWREb21haW5zKSkpIHsKaWYgKG51bGwgIT09ICRwb3J0TnVtYmVyKSB7CnJldHVybiAkZ3Vlc3NlZERvbWFpbi4nOicuJHBvcnROdW1iZXI7Cn0KCnJldHVybiAkZ3Vlc3NlZERvbWFpbjsKfQoKaWYgKG51bGwgIT09ICRwb3J0TnVtYmVyKSB7CiRndWVzc2VkRG9tYWluIC49ICc6Jy4kcG9ydE51bWJlcjsKfQoKd2hpbGUgKG51bGwgIT09ICgkcGFydCA9IGFycmF5X3NoaWZ0KCR1cmxQYXJ0cykpKSB7CiRndWVzc2VkRG9tYWluIC49ICcvJyAuICRwYXJ0OwoKaWYgKGluX2FycmF5KCRndWVzc2VkRG9tYWluLCAkY29uZmlndXJlZERvbWFpbnMpIHx8IChudWxsICE9PSAkcG9ydE51bWJlciAmJiBpbl9hcnJheShQcmVnOjpyZXBsYWNlKCd7OlxkK30nLCAnJywgJGd1ZXNzZWREb21haW4pLCAkY29uZmlndXJlZERvbWFpbnMpKSkgewpyZXR1cm4gJGd1ZXNzZWREb21haW47Cn0KfQoKcmV0dXJuIGZhbHNlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnlcVmNzOwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXENhY2hlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxIZyBhcyBIZ1V0aWxzOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFV0aWxcVXJsOwoKCgoKY2xhc3MgSGdEcml2ZXIgZXh0ZW5kcyBWY3NEcml2ZXIKewoKcHJvdGVjdGVkICR0YWdzOwoKcHJvdGVjdGVkICRicmFuY2hlczsKCnByb3RlY3RlZCAkcm9vdElkZW50aWZpZXI7Cgpwcm90ZWN0ZWQgJHJlcG9EaXI7CgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpOiB2b2lkCnsKaWYgKEZpbGVzeXN0ZW06OmlzTG9jYWxQYXRoKCR0aGlzLT51cmwpKSB7CiR0aGlzLT5yZXBvRGlyID0gJHRoaXMtPnVybDsKfSBlbHNlIHsKaWYgKCFDYWNoZTo6aXNVc2FibGUoJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS12Y3MtZGlyJykpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignSGdEcml2ZXIgcmVxdWlyZXMgYSB1c2FibGUgY2FjaGUgZGlyZWN0b3J5LCBhbmQgaXQgbG9va3MgbGlrZSB5b3Ugc2V0IGl0IHRvIGJlIGRpc2FibGVkJyk7Cn0KCiRjYWNoZURpciA9ICR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtdmNzLWRpcicpOwokdGhpcy0+cmVwb0RpciA9ICRjYWNoZURpciAuICcvJyAuIFByZWc6OnJlcGxhY2UoJ3tbXmEtejAtOV19aScsICctJywgVXJsOjpzYW5pdGl6ZSgkdGhpcy0+dXJsKSkgLiAnLyc7CgokZnMgPSBuZXcgRmlsZXN5c3RlbSgpOwokZnMtPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkY2FjaGVEaXIpOwoKaWYgKCFpc193cml0YWJsZShkaXJuYW1lKCR0aGlzLT5yZXBvRGlyKSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDYW4gbm90IGNsb25lICcuJHRoaXMtPnVybC4nIHRvIGFjY2VzcyBwYWNrYWdlIGluZm9ybWF0aW9uLiBUaGUgIicuJGNhY2hlRGlyLiciIGRpcmVjdG9yeSBpcyBub3Qgd3JpdGFibGUgYnkgdGhlIGN1cnJlbnQgdXNlci4nKTsKfQoKCiR0aGlzLT5jb25maWctPnByb2hpYml0VXJsQnlDb25maWcoJHRoaXMtPnVybCwgJHRoaXMtPmlvKTsKCiRoZ1V0aWxzID0gbmV3IEhnVXRpbHMoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2Vzcyk7CgoKaWYgKGlzX2RpcigkdGhpcy0+cmVwb0RpcikgJiYgMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydoZycsICdzdW1tYXJ5J10sICRvdXRwdXQsICR0aGlzLT5yZXBvRGlyKSkgewppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydoZycsICdwdWxsJ10sICRvdXRwdXQsICR0aGlzLT5yZXBvRGlyKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj5GYWlsZWQgdG8gdXBkYXRlICcuJHRoaXMtPnVybC4nLCBwYWNrYWdlIGluZm9ybWF0aW9uIGZyb20gdGhpcyByZXBvc2l0b3J5IG1heSBiZSBvdXRkYXRlZCAoJy4kdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKS4nKTwvZXJyb3I+Jyk7Cn0KfSBlbHNlIHsKCiRmcy0+cmVtb3ZlRGlyZWN0b3J5KCR0aGlzLT5yZXBvRGlyKTsKCiRyZXBvRGlyID0gJHRoaXMtPnJlcG9EaXI7CiRjb21tYW5kID0gc3RhdGljIGZ1bmN0aW9uICgkdXJsKSB1c2UgKCRyZXBvRGlyKTogYXJyYXkgewpyZXR1cm4gWydoZycsICdjbG9uZScsICctLW5vdXBkYXRlJywgJy0tJywgJHVybCwgJHJlcG9EaXJdOwp9OwoKJGhnVXRpbHMtPnJ1bkNvbW1hbmQoJGNvbW1hbmQsICR0aGlzLT51cmwsIG51bGwpOwp9Cn0KCiR0aGlzLT5nZXRUYWdzKCk7CiR0aGlzLT5nZXRCcmFuY2hlcygpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Um9vdElkZW50aWZpZXIoKTogc3RyaW5nCnsKaWYgKG51bGwgPT09ICR0aGlzLT5yb290SWRlbnRpZmllcikgewokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2hnJywgJ3RpcCcsICctLXRlbXBsYXRlJywgJ3tub2RlfSddLCAkb3V0cHV0LCAkdGhpcy0+cmVwb0Rpcik7CiRvdXRwdXQgPSAkdGhpcy0+cHJvY2Vzcy0+c3BsaXRMaW5lcygkb3V0cHV0KTsKJHRoaXMtPnJvb3RJZGVudGlmaWVyID0gJG91dHB1dFswXTsKfQoKcmV0dXJuICR0aGlzLT5yb290SWRlbnRpZmllcjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVybCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnVybDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZShzdHJpbmcgJGlkZW50aWZpZXIpOiBhcnJheQp7CnJldHVybiBbJ3R5cGUnID0+ICdoZycsICd1cmwnID0+ICR0aGlzLT5nZXRVcmwoKSwgJ3JlZmVyZW5jZScgPT4gJGlkZW50aWZpZXJdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdChzdHJpbmcgJGlkZW50aWZpZXIpOiA/YXJyYXkKewpyZXR1cm4gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZpbGVDb250ZW50KHN0cmluZyAkZmlsZSwgc3RyaW5nICRpZGVudGlmaWVyKTogP3N0cmluZwp7CmlmIChpc3NldCgkaWRlbnRpZmllclswXSkgJiYgJGlkZW50aWZpZXJbMF0gPT09ICctJykgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ludmFsaWQgaGcgaWRlbnRpZmllciBkZXRlY3RlZC4gSWRlbnRpZmllciBtdXN0IG5vdCBzdGFydCB3aXRoIGEgLSwgZ2l2ZW46ICcgLiAkaWRlbnRpZmllcik7Cn0KCiRyZXNvdXJjZSA9IFsnaGcnLCAnY2F0JywgJy1yJywgJGlkZW50aWZpZXIsICctLScsICRmaWxlXTsKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJHJlc291cmNlLCAkY29udGVudCwgJHRoaXMtPnJlcG9EaXIpOwoKaWYgKCF0cmltKCRjb250ZW50KSkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICRjb250ZW50Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hhbmdlRGF0ZShzdHJpbmcgJGlkZW50aWZpZXIpOiA/XERhdGVUaW1lSW1tdXRhYmxlCnsKaWYgKGlzc2V0KCRpZGVudGlmaWVyWzBdKSAmJiAkaWRlbnRpZmllclswXSA9PT0gJy0nKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignSW52YWxpZCBoZyBpZGVudGlmaWVyIGRldGVjdGVkLiBJZGVudGlmaWVyIG11c3Qgbm90IHN0YXJ0IHdpdGggYSAtLCBnaXZlbjogJyAuICRpZGVudGlmaWVyKTsKfQoKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoClsnaGcnLCAnbG9nJywgJy0tdGVtcGxhdGUnLCAne2RhdGV8cmZjMzMzOWRhdGV9JywgJy1yJywgJGlkZW50aWZpZXJdLAokb3V0cHV0LAokdGhpcy0+cmVwb0RpcgopOwoKcmV0dXJuIG5ldyBcRGF0ZVRpbWVJbW11dGFibGUodHJpbSgkb3V0cHV0KSwgbmV3IFxEYXRlVGltZVpvbmUoJ1VUQycpKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRhZ3MoKTogYXJyYXkKewppZiAobnVsbCA9PT0gJHRoaXMtPnRhZ3MpIHsKJHRhZ3MgPSBbXTsKCiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnaGcnLCAndGFncyddLCAkb3V0cHV0LCAkdGhpcy0+cmVwb0Rpcik7CmZvcmVhY2ggKCR0aGlzLT5wcm9jZXNzLT5zcGxpdExpbmVzKCRvdXRwdXQpIGFzICR0YWcpIHsKaWYgKCR0YWcgJiYgUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnKF4oW15cc10rKVxzK1xkKzooLiopJCknLCAkdGFnLCAkbWF0Y2gpKSB7CiR0YWdzWyRtYXRjaFsxXV0gPSAkbWF0Y2hbMl07Cn0KfQp1bnNldCgkdGFnc1sndGlwJ10pOwoKJHRoaXMtPnRhZ3MgPSAkdGFnczsKfQoKcmV0dXJuICR0aGlzLT50YWdzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QnJhbmNoZXMoKTogYXJyYXkKewppZiAobnVsbCA9PT0gJHRoaXMtPmJyYW5jaGVzKSB7CiRicmFuY2hlcyA9IFtdOwokYm9va21hcmtzID0gW107CgokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2hnJywgJ2JyYW5jaGVzJ10sICRvdXRwdXQsICR0aGlzLT5yZXBvRGlyKTsKZm9yZWFjaCAoJHRoaXMtPnByb2Nlc3MtPnNwbGl0TGluZXMoJG91dHB1dCkgYXMgJGJyYW5jaCkgewppZiAoJGJyYW5jaCAmJiBQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcoXihbXlxzXSspXHMrXGQrOihbYS1mMC05XSspKScsICRicmFuY2gsICRtYXRjaCkgJiYgJG1hdGNoWzFdWzBdICE9PSAnLScpIHsKJGJyYW5jaGVzWyRtYXRjaFsxXV0gPSAkbWF0Y2hbMl07Cn0KfQoKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydoZycsICdib29rbWFya3MnXSwgJG91dHB1dCwgJHRoaXMtPnJlcG9EaXIpOwpmb3JlYWNoICgkdGhpcy0+cHJvY2Vzcy0+c3BsaXRMaW5lcygkb3V0cHV0KSBhcyAkYnJhbmNoKSB7CmlmICgkYnJhbmNoICYmIFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJyheKD86W1xzKl0qKShbXlxzXSspXHMrXGQrOiguKikkKScsICRicmFuY2gsICRtYXRjaCkgJiYgJG1hdGNoWzFdWzBdICE9PSAnLScpIHsKJGJvb2ttYXJrc1skbWF0Y2hbMV1dID0gJG1hdGNoWzJdOwp9Cn0KCgokdGhpcy0+YnJhbmNoZXMgPSBhcnJheV9tZXJnZSgkYm9va21hcmtzLCAkYnJhbmNoZXMpOwp9CgpyZXR1cm4gJHRoaXMtPmJyYW5jaGVzOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN1cHBvcnRzKElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIHN0cmluZyAkdXJsLCBib29sICRkZWVwID0gZmFsc2UpOiBib29sCnsKaWYgKFByZWc6OmlzTWF0Y2goJyMoXig/Omh0dHBzP3xzc2gpOi8vKD86W15AXStAKT9iaXRidWNrZXQub3JnfGh0dHBzOi8vKD86Lio/KVwua2lsbmhnLmNvbSkjaScsICR1cmwpKSB7CnJldHVybiB0cnVlOwp9CgoKaWYgKEZpbGVzeXN0ZW06OmlzTG9jYWxQYXRoKCR1cmwpKSB7CiR1cmwgPSBGaWxlc3lzdGVtOjpnZXRQbGF0Zm9ybVBhdGgoJHVybCk7CmlmICghaXNfZGlyKCR1cmwpKSB7CnJldHVybiBmYWxzZTsKfQoKJHByb2Nlc3MgPSBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7CgppZiAoJHByb2Nlc3MtPmV4ZWN1dGUoWydoZycsICdzdW1tYXJ5J10sICRvdXRwdXQsICR1cmwpID09PSAwKSB7CnJldHVybiB0cnVlOwp9Cn0KCmlmICghJGRlZXApIHsKcmV0dXJuIGZhbHNlOwp9CgokcHJvY2VzcyA9IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKJGV4aXQgPSAkcHJvY2Vzcy0+ZXhlY3V0ZShbJ2hnJywgJ2lkZW50aWZ5JywgJy0tJywgJHVybF0sICRpZ25vcmVkKTsKCnJldHVybiAkZXhpdCA9PT0gMDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5XFZjczsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxDYWNoZTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxVdGlsXFBlcmZvcmNlOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwXFJlc3BvbnNlOwoKCgoKY2xhc3MgUGVyZm9yY2VEcml2ZXIgZXh0ZW5kcyBWY3NEcml2ZXIKewoKcHJvdGVjdGVkICRkZXBvdDsKCnByb3RlY3RlZCAkYnJhbmNoOwoKcHJvdGVjdGVkICRwZXJmb3JjZSA9IG51bGw7CgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpOiB2b2lkCnsKJHRoaXMtPmRlcG90ID0gJHRoaXMtPnJlcG9Db25maWdbJ2RlcG90J107CiR0aGlzLT5icmFuY2ggPSAnJzsKaWYgKCFlbXB0eSgkdGhpcy0+cmVwb0NvbmZpZ1snYnJhbmNoJ10pKSB7CiR0aGlzLT5icmFuY2ggPSAkdGhpcy0+cmVwb0NvbmZpZ1snYnJhbmNoJ107Cn0KCiR0aGlzLT5pbml0UGVyZm9yY2UoJHRoaXMtPnJlcG9Db25maWcpOwokdGhpcy0+cGVyZm9yY2UtPnA0TG9naW4oKTsKJHRoaXMtPnBlcmZvcmNlLT5jaGVja1N0cmVhbSgpOwoKJHRoaXMtPnBlcmZvcmNlLT53cml0ZVA0Q2xpZW50U3BlYygpOwokdGhpcy0+cGVyZm9yY2UtPmNvbm5lY3RDbGllbnQoKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpbml0UGVyZm9yY2UoYXJyYXkgJHJlcG9Db25maWcpOiB2b2lkCnsKaWYgKCFlbXB0eSgkdGhpcy0+cGVyZm9yY2UpKSB7CnJldHVybjsKfQoKaWYgKCFDYWNoZTo6aXNVc2FibGUoJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS12Y3MtZGlyJykpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignUGVyZm9yY2VEcml2ZXIgcmVxdWlyZXMgYSB1c2FibGUgY2FjaGUgZGlyZWN0b3J5LCBhbmQgaXQgbG9va3MgbGlrZSB5b3Ugc2V0IGl0IHRvIGJlIGRpc2FibGVkJyk7Cn0KCiRyZXBvRGlyID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS12Y3MtZGlyJykgLiAnLycgLiAkdGhpcy0+ZGVwb3Q7CiR0aGlzLT5wZXJmb3JjZSA9IFBlcmZvcmNlOjpjcmVhdGUoJHJlcG9Db25maWcsICR0aGlzLT5nZXRVcmwoKSwgJHJlcG9EaXIsICR0aGlzLT5wcm9jZXNzLCAkdGhpcy0+aW8pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZUNvbnRlbnQoc3RyaW5nICRmaWxlLCBzdHJpbmcgJGlkZW50aWZpZXIpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5wZXJmb3JjZS0+Z2V0RmlsZUNvbnRlbnQoJGZpbGUsICRpZGVudGlmaWVyKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENoYW5nZURhdGUoc3RyaW5nICRpZGVudGlmaWVyKTogP1xEYXRlVGltZUltbXV0YWJsZQp7CnJldHVybiBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Um9vdElkZW50aWZpZXIoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5icmFuY2g7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRCcmFuY2hlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cGVyZm9yY2UtPmdldEJyYW5jaGVzKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUYWdzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5wZXJmb3JjZS0+Z2V0VGFncygpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdChzdHJpbmcgJGlkZW50aWZpZXIpOiA/YXJyYXkKewpyZXR1cm4gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZShzdHJpbmcgJGlkZW50aWZpZXIpOiBhcnJheQp7CnJldHVybiBbCid0eXBlJyA9PiAncGVyZm9yY2UnLAondXJsJyA9PiAkdGhpcy0+cmVwb0NvbmZpZ1sndXJsJ10sCidyZWZlcmVuY2UnID0+ICRpZGVudGlmaWVyLAoncDR1c2VyJyA9PiAkdGhpcy0+cGVyZm9yY2UtPmdldFVzZXIoKSwKXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVybCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnVybDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc0NvbXBvc2VyRmlsZShzdHJpbmcgJGlkZW50aWZpZXIpOiBib29sCnsKJGNvbXBvc2VySW5mbyA9ICR0aGlzLT5wZXJmb3JjZS0+Z2V0Q29tcG9zZXJJbmZvcm1hdGlvbignLy8nIC4gJHRoaXMtPmRlcG90IC4gJy8nIC4gJGlkZW50aWZpZXIpOwoKcmV0dXJuICFlbXB0eSgkY29tcG9zZXJJbmZvKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbnRlbnRzKHN0cmluZyAkdXJsKTogUmVzcG9uc2UKewp0aHJvdyBuZXcgXEJhZE1ldGhvZENhbGxFeGNlcHRpb24oJ05vdCBpbXBsZW1lbnRlZC91c2VkIGluIFBlcmZvcmNlRHJpdmVyJyk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3VwcG9ydHMoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgc3RyaW5nICR1cmwsIGJvb2wgJGRlZXAgPSBmYWxzZSk6IGJvb2wKewppZiAoJGRlZXAgfHwgUHJlZzo6aXNNYXRjaCgnI1xiKHBlcmZvcmNlfHA0KVxiI2knLCAkdXJsKSkgewpyZXR1cm4gUGVyZm9yY2U6OmNoZWNrU2VydmVyRXhpc3RzKCR1cmwsIG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKSk7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNsZWFudXAoKTogdm9pZAp7CiR0aGlzLT5wZXJmb3JjZS0+Y2xlYW51cENsaWVudFNwZWMoKTsKJHRoaXMtPnBlcmZvcmNlID0gbnVsbDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldERlcG90KCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+ZGVwb3Q7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRCcmFuY2goKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5icmFuY2g7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3M7Cgp1c2UgQ29tcG9zZXJcQ2FjaGU7CnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXFVybDsKdXNlIENvbXBvc2VyXFV0aWxcU3ZuIGFzIFN2blV0aWw7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwoKCgoKCmNsYXNzIFN2bkRyaXZlciBleHRlbmRzIFZjc0RyaXZlcgp7Cgpwcm90ZWN0ZWQgJGJhc2VVcmw7Cgpwcm90ZWN0ZWQgJHRhZ3M7Cgpwcm90ZWN0ZWQgJGJyYW5jaGVzOwoKcHJvdGVjdGVkICRyb290SWRlbnRpZmllcjsKCgpwcm90ZWN0ZWQgJHRydW5rUGF0aCA9ICd0cnVuayc7Cgpwcm90ZWN0ZWQgJGJyYW5jaGVzUGF0aCA9ICdicmFuY2hlcyc7Cgpwcm90ZWN0ZWQgJHRhZ3NQYXRoID0gJ3RhZ3MnOwoKcHJvdGVjdGVkICRwYWNrYWdlUGF0aCA9ICcnOwoKcHJvdGVjdGVkICRjYWNoZUNyZWRlbnRpYWxzID0gdHJ1ZTsKCgoKCnByaXZhdGUgJHV0aWw7CgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpOiB2b2lkCnsKJHRoaXMtPnVybCA9ICR0aGlzLT5iYXNlVXJsID0gcnRyaW0oc2VsZjo6bm9ybWFsaXplVXJsKCR0aGlzLT51cmwpLCAnLycpOwoKU3ZuVXRpbDo6Y2xlYW5FbnYoKTsKCmlmIChpc3NldCgkdGhpcy0+cmVwb0NvbmZpZ1sndHJ1bmstcGF0aCddKSkgewokdGhpcy0+dHJ1bmtQYXRoID0gJHRoaXMtPnJlcG9Db25maWdbJ3RydW5rLXBhdGgnXTsKfQppZiAoaXNzZXQoJHRoaXMtPnJlcG9Db25maWdbJ2JyYW5jaGVzLXBhdGgnXSkpIHsKJHRoaXMtPmJyYW5jaGVzUGF0aCA9ICR0aGlzLT5yZXBvQ29uZmlnWydicmFuY2hlcy1wYXRoJ107Cn0KaWYgKGlzc2V0KCR0aGlzLT5yZXBvQ29uZmlnWyd0YWdzLXBhdGgnXSkpIHsKJHRoaXMtPnRhZ3NQYXRoID0gJHRoaXMtPnJlcG9Db25maWdbJ3RhZ3MtcGF0aCddOwp9CmlmIChhcnJheV9rZXlfZXhpc3RzKCdzdm4tY2FjaGUtY3JlZGVudGlhbHMnLCAkdGhpcy0+cmVwb0NvbmZpZykpIHsKJHRoaXMtPmNhY2hlQ3JlZGVudGlhbHMgPSAoYm9vbCkgJHRoaXMtPnJlcG9Db25maWdbJ3N2bi1jYWNoZS1jcmVkZW50aWFscyddOwp9CmlmIChpc3NldCgkdGhpcy0+cmVwb0NvbmZpZ1sncGFja2FnZS1wYXRoJ10pKSB7CiR0aGlzLT5wYWNrYWdlUGF0aCA9ICcvJyAuIHRyaW0oJHRoaXMtPnJlcG9Db25maWdbJ3BhY2thZ2UtcGF0aCddLCAnLycpOwp9CgppZiAoZmFsc2UgIT09ICgkcG9zID0gc3RycnBvcygkdGhpcy0+dXJsLCAnLycgLiAkdGhpcy0+dHJ1bmtQYXRoKSkpIHsKJHRoaXMtPmJhc2VVcmwgPSBzdWJzdHIoJHRoaXMtPnVybCwgMCwgJHBvcyk7Cn0KCiR0aGlzLT5jYWNoZSA9IG5ldyBDYWNoZSgkdGhpcy0+aW8sICR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtcmVwby1kaXInKS4nLycuUHJlZzo6cmVwbGFjZSgne1teYS16MC05Ll19aScsICctJywgVXJsOjpzYW5pdGl6ZSgkdGhpcy0+YmFzZVVybCkpKTsKJHRoaXMtPmNhY2hlLT5zZXRSZWFkT25seSgkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXJlYWQtb25seScpKTsKCiR0aGlzLT5nZXRCcmFuY2hlcygpOwokdGhpcy0+Z2V0VGFncygpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Um9vdElkZW50aWZpZXIoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5yb290SWRlbnRpZmllciA/OiAkdGhpcy0+dHJ1bmtQYXRoOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXJsKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+dXJsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlKHN0cmluZyAkaWRlbnRpZmllcik6IGFycmF5CnsKcmV0dXJuIFsndHlwZScgPT4gJ3N2bicsICd1cmwnID0+ICR0aGlzLT5iYXNlVXJsLCAncmVmZXJlbmNlJyA9PiAkaWRlbnRpZmllcl07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0KHN0cmluZyAkaWRlbnRpZmllcik6ID9hcnJheQp7CnJldHVybiBudWxsOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gc2hvdWxkQ2FjaGUoc3RyaW5nICRpZGVudGlmaWVyKTogYm9vbAp7CnJldHVybiAkdGhpcy0+Y2FjaGUgJiYgUHJlZzo6aXNNYXRjaCgne0BcZCskfScsICRpZGVudGlmaWVyKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbXBvc2VySW5mb3JtYXRpb24oc3RyaW5nICRpZGVudGlmaWVyKTogP2FycmF5CnsKaWYgKCFpc3NldCgkdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXSkpIHsKaWYgKCR0aGlzLT5zaG91bGRDYWNoZSgkaWRlbnRpZmllcikgJiYgJHJlcyA9ICR0aGlzLT5jYWNoZS0+cmVhZCgkaWRlbnRpZmllci4nLmpzb24nKSkgewoKCmlmICgkcmVzID09PSAnIiInKSB7CiRyZXMgPSAnbnVsbCc7CiR0aGlzLT5jYWNoZS0+d3JpdGUoJGlkZW50aWZpZXIuJy5qc29uJywgJHJlcyk7Cn0KCnJldHVybiAkdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXSA9IEpzb25GaWxlOjpwYXJzZUpzb24oJHJlcyk7Cn0KCnRyeSB7CiRjb21wb3NlciA9ICR0aGlzLT5nZXRCYXNlQ29tcG9zZXJJbmZvcm1hdGlvbigkaWRlbnRpZmllcik7Cn0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgewokbWVzc2FnZSA9ICRlLT5nZXRNZXNzYWdlKCk7CmlmIChzdHJpcG9zKCRtZXNzYWdlLCAncGF0aCBub3QgZm91bmQnKSA9PT0gZmFsc2UgJiYgc3RyaXBvcygkbWVzc2FnZSwgJ3N2bjogd2FybmluZzogVzE2MDAxMycpID09PSBmYWxzZSkgewp0aHJvdyAkZTsKfQoKJGNvbXBvc2VyID0gbnVsbDsKfQoKaWYgKCR0aGlzLT5zaG91bGRDYWNoZSgkaWRlbnRpZmllcikpIHsKJHRoaXMtPmNhY2hlLT53cml0ZSgkaWRlbnRpZmllci4nLmpzb24nLCBKc29uRmlsZTo6ZW5jb2RlKCRjb21wb3NlciwgXEpTT05fVU5FU0NBUEVEX1VOSUNPREUgfCBcSlNPTl9VTkVTQ0FQRURfU0xBU0hFUykpOwp9CgokdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXSA9ICRjb21wb3NlcjsKfQoKCmlmICghaXNfYXJyYXkoJHRoaXMtPmluZm9DYWNoZVskaWRlbnRpZmllcl0pKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gJHRoaXMtPmluZm9DYWNoZVskaWRlbnRpZmllcl07Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlQ29udGVudChzdHJpbmcgJGZpbGUsIHN0cmluZyAkaWRlbnRpZmllcik6ID9zdHJpbmcKewokaWRlbnRpZmllciA9ICcvJyAuIHRyaW0oJGlkZW50aWZpZXIsICcvJykgLiAnLyc7CgppZiAoUHJlZzo6aXNNYXRjaCgne14oLis/KShAXGQrKT8vJH0nLCAkaWRlbnRpZmllciwgJG1hdGNoKSAmJiAkbWF0Y2hbMl0gIT09IG51bGwpIHsKJHBhdGggPSAkbWF0Y2hbMV07CiRyZXYgPSAkbWF0Y2hbMl07Cn0gZWxzZSB7CiRwYXRoID0gJGlkZW50aWZpZXI7CiRyZXYgPSAnJzsKfQoKdHJ5IHsKJHJlc291cmNlID0gJHBhdGguJGZpbGU7CiRvdXRwdXQgPSAkdGhpcy0+ZXhlY3V0ZShbJ3N2bicsICdjYXQnXSwgJHRoaXMtPmJhc2VVcmwgLiAkcmVzb3VyY2UgLiAkcmV2KTsKaWYgKCcnID09PSB0cmltKCRvdXRwdXQpKSB7CnJldHVybiBudWxsOwp9Cn0gY2F0Y2ggKFxSdW50aW1lRXhjZXB0aW9uICRlKSB7CnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJGUtPmdldE1lc3NhZ2UoKSk7Cn0KCnJldHVybiAkb3V0cHV0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hhbmdlRGF0ZShzdHJpbmcgJGlkZW50aWZpZXIpOiA/XERhdGVUaW1lSW1tdXRhYmxlCnsKJGlkZW50aWZpZXIgPSAnLycgLiB0cmltKCRpZGVudGlmaWVyLCAnLycpIC4gJy8nOwoKaWYgKFByZWc6OmlzTWF0Y2goJ3teKC4rPykoQFxkKyk/LyR9JywgJGlkZW50aWZpZXIsICRtYXRjaCkgJiYgbnVsbCAhPT0gJG1hdGNoWzJdKSB7CiRwYXRoID0gJG1hdGNoWzFdOwokcmV2ID0gJG1hdGNoWzJdOwp9IGVsc2UgewokcGF0aCA9ICRpZGVudGlmaWVyOwokcmV2ID0gJyc7Cn0KCiRvdXRwdXQgPSAkdGhpcy0+ZXhlY3V0ZShbJ3N2bicsICdpbmZvJ10sICR0aGlzLT5iYXNlVXJsIC4gJHBhdGggLiAkcmV2KTsKZm9yZWFjaCAoJHRoaXMtPnByb2Nlc3MtPnNwbGl0TGluZXMoJG91dHB1dCkgYXMgJGxpbmUpIHsKaWYgKCRsaW5lICE9PSAnJyAmJiBQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7Xkxhc3QgQ2hhbmdlZCBEYXRlOiAoW14oXSspfScsICRsaW5lLCAkbWF0Y2gpKSB7CnJldHVybiBuZXcgXERhdGVUaW1lSW1tdXRhYmxlKCRtYXRjaFsxXSwgbmV3IFxEYXRlVGltZVpvbmUoJ1VUQycpKTsKfQp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRhZ3MoKTogYXJyYXkKewppZiAobnVsbCA9PT0gJHRoaXMtPnRhZ3MpIHsKJHRhZ3MgPSBbXTsKCmlmICgkdGhpcy0+dGFnc1BhdGggIT09IGZhbHNlKSB7CiRvdXRwdXQgPSAkdGhpcy0+ZXhlY3V0ZShbJ3N2bicsICdscycsICctLXZlcmJvc2UnXSwgJHRoaXMtPmJhc2VVcmwgLiAnLycgLiAkdGhpcy0+dGFnc1BhdGgpOwppZiAoJG91dHB1dCAhPT0gJycpIHsKJGxhc3RSZXYgPSAwOwpmb3JlYWNoICgkdGhpcy0+cHJvY2Vzcy0+c3BsaXRMaW5lcygkb3V0cHV0KSBhcyAkbGluZSkgewokbGluZSA9IHRyaW0oJGxpbmUpOwppZiAoJGxpbmUgIT09ICcnICYmIFByZWc6OmlzTWF0Y2goJ3teXHMqKFxTKykuKj8oXFMrKVxzKiR9JywgJGxpbmUsICRtYXRjaCkpIHsKaWYgKCRtYXRjaFsyXSA9PT0gJy4vJykgewokbGFzdFJldiA9IChpbnQpICRtYXRjaFsxXTsKfSBlbHNlIHsKJHRhZ3NbcnRyaW0oJG1hdGNoWzJdLCAnLycpXSA9ICR0aGlzLT5idWlsZElkZW50aWZpZXIoCicvJyAuICR0aGlzLT50YWdzUGF0aCAuICcvJyAuICRtYXRjaFsyXSwKbWF4KCRsYXN0UmV2LCAoaW50KSAkbWF0Y2hbMV0pCik7Cn0KfQp9Cn0KfQoKJHRoaXMtPnRhZ3MgPSAkdGFnczsKfQoKcmV0dXJuICR0aGlzLT50YWdzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QnJhbmNoZXMoKTogYXJyYXkKewppZiAobnVsbCA9PT0gJHRoaXMtPmJyYW5jaGVzKSB7CiRicmFuY2hlcyA9IFtdOwoKaWYgKGZhbHNlID09PSAkdGhpcy0+dHJ1bmtQYXRoKSB7CiR0cnVua1BhcmVudCA9ICR0aGlzLT5iYXNlVXJsIC4gJy8nOwp9IGVsc2UgewokdHJ1bmtQYXJlbnQgPSAkdGhpcy0+YmFzZVVybCAuICcvJyAuICR0aGlzLT50cnVua1BhdGg7Cn0KCiRvdXRwdXQgPSAkdGhpcy0+ZXhlY3V0ZShbJ3N2bicsICdscycsICctLXZlcmJvc2UnXSwgJHRydW5rUGFyZW50KTsKaWYgKCRvdXRwdXQgIT09ICcnKSB7CmZvcmVhY2ggKCR0aGlzLT5wcm9jZXNzLT5zcGxpdExpbmVzKCRvdXRwdXQpIGFzICRsaW5lKSB7CiRsaW5lID0gdHJpbSgkbGluZSk7CmlmICgkbGluZSAhPT0gJycgJiYgUHJlZzo6aXNNYXRjaCgne15ccyooXFMrKS4qPyhcUyspXHMqJH0nLCAkbGluZSwgJG1hdGNoKSkgewppZiAoJG1hdGNoWzJdID09PSAnLi8nKSB7CiRicmFuY2hlc1sndHJ1bmsnXSA9ICR0aGlzLT5idWlsZElkZW50aWZpZXIoCicvJyAuICR0aGlzLT50cnVua1BhdGgsCihpbnQpICRtYXRjaFsxXQopOwokdGhpcy0+cm9vdElkZW50aWZpZXIgPSAkYnJhbmNoZXNbJ3RydW5rJ107CmJyZWFrOwp9Cn0KfQp9CnVuc2V0KCRvdXRwdXQpOwoKaWYgKCR0aGlzLT5icmFuY2hlc1BhdGggIT09IGZhbHNlKSB7CiRvdXRwdXQgPSAkdGhpcy0+ZXhlY3V0ZShbJ3N2bicsICdscycsICctLXZlcmJvc2UnXSwgJHRoaXMtPmJhc2VVcmwgLiAnLycgLiAkdGhpcy0+YnJhbmNoZXNQYXRoKTsKaWYgKCRvdXRwdXQgIT09ICcnKSB7CiRsYXN0UmV2ID0gMDsKZm9yZWFjaCAoJHRoaXMtPnByb2Nlc3MtPnNwbGl0TGluZXModHJpbSgkb3V0cHV0KSkgYXMgJGxpbmUpIHsKJGxpbmUgPSB0cmltKCRsaW5lKTsKaWYgKCRsaW5lICE9PSAnJyAmJiBQcmVnOjppc01hdGNoKCd7XlxzKihcUyspLio/KFxTKylccyokfScsICRsaW5lLCAkbWF0Y2gpKSB7CmlmICgkbWF0Y2hbMl0gPT09ICcuLycpIHsKJGxhc3RSZXYgPSAoaW50KSAkbWF0Y2hbMV07Cn0gZWxzZSB7CiRicmFuY2hlc1tydHJpbSgkbWF0Y2hbMl0sICcvJyldID0gJHRoaXMtPmJ1aWxkSWRlbnRpZmllcigKJy8nIC4gJHRoaXMtPmJyYW5jaGVzUGF0aCAuICcvJyAuICRtYXRjaFsyXSwKbWF4KCRsYXN0UmV2LCAoaW50KSAkbWF0Y2hbMV0pCik7Cn0KfQp9Cn0KfQoKJHRoaXMtPmJyYW5jaGVzID0gJGJyYW5jaGVzOwp9CgpyZXR1cm4gJHRoaXMtPmJyYW5jaGVzOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN1cHBvcnRzKElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIHN0cmluZyAkdXJsLCBib29sICRkZWVwID0gZmFsc2UpOiBib29sCnsKJHVybCA9IHNlbGY6Om5vcm1hbGl6ZVVybCgkdXJsKTsKaWYgKFByZWc6OmlzTWF0Y2goJyMoXnN2bjovL3xec3ZuXCtzc2g6Ly98c3ZuXC4pI2knLCAkdXJsKSkgewpyZXR1cm4gdHJ1ZTsKfQoKCmlmICghJGRlZXAgJiYgIUZpbGVzeXN0ZW06OmlzTG9jYWxQYXRoKCR1cmwpKSB7CnJldHVybiBmYWxzZTsKfQoKJHByb2Nlc3MgPSBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7CiRleGl0ID0gJHByb2Nlc3MtPmV4ZWN1dGUoWydzdm4nLCAnaW5mbycsICctLW5vbi1pbnRlcmFjdGl2ZScsICctLScsICR1cmxdLCAkaWdub3JlZE91dHB1dCk7CgppZiAoJGV4aXQgPT09IDApIHsKCnJldHVybiB0cnVlOwp9CgoKaWYgKGZhbHNlICE9PSBzdHJpcG9zKCRwcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpLCAnYXV0aG9yaXphdGlvbiBmYWlsZWQ6JykpIHsKCgpyZXR1cm4gdHJ1ZTsKfQoKCmlmIChmYWxzZSAhPT0gc3RyaXBvcygkcHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSwgJ0F1dGhlbnRpY2F0aW9uIGZhaWxlZCcpKSB7CgoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBub3JtYWxpemVVcmwoc3RyaW5nICR1cmwpOiBzdHJpbmcKewokZnMgPSBuZXcgRmlsZXN5c3RlbSgpOwppZiAoJGZzLT5pc0Fic29sdXRlUGF0aCgkdXJsKSkgewpyZXR1cm4gJ2ZpbGU6Ly8nIC4gc3RydHIoJHVybCwgJ1xcJywgJy8nKTsKfQoKcmV0dXJuICR1cmw7Cn0KCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoYXJyYXkgJGNvbW1hbmQsIHN0cmluZyAkdXJsKTogc3RyaW5nCnsKaWYgKG51bGwgPT09ICR0aGlzLT51dGlsKSB7CiR0aGlzLT51dGlsID0gbmV3IFN2blV0aWwoJHRoaXMtPmJhc2VVcmwsICR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPnByb2Nlc3MpOwokdGhpcy0+dXRpbC0+c2V0Q2FjaGVDcmVkZW50aWFscygkdGhpcy0+Y2FjaGVDcmVkZW50aWFscyk7Cn0KCnRyeSB7CnJldHVybiAkdGhpcy0+dXRpbC0+ZXhlY3V0ZSgkY29tbWFuZCwgJHVybCk7Cn0gY2F0Y2ggKFxSdW50aW1lRXhjZXB0aW9uICRlKSB7CmlmIChudWxsID09PSAkdGhpcy0+dXRpbC0+YmluYXJ5VmVyc2lvbigpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIGxvYWQgJy4kdGhpcy0+dXJsLicsIHN2biB3YXMgbm90IGZvdW5kLCBjaGVjayB0aGF0IGl0IGlzIGluc3RhbGxlZCBhbmQgaW4geW91ciBQQVRIIGVudi4nIC4gIlxuXG4iIC4gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCkpOwp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCidSZXBvc2l0b3J5ICcuJHRoaXMtPnVybC4nIGNvdWxkIG5vdCBiZSBwcm9jZXNzZWQsICcuJGUtPmdldE1lc3NhZ2UoKQopOwp9Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBidWlsZElkZW50aWZpZXIoc3RyaW5nICRiYXNlRGlyLCBpbnQgJHJldmlzaW9uKTogc3RyaW5nCnsKcmV0dXJuIHJ0cmltKCRiYXNlRGlyLCAnLycpIC4gJHRoaXMtPnBhY2thZ2VQYXRoIC4gJy9AJyAuICRyZXZpc2lvbjsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5XFZjczsKCnVzZSBDb21wb3NlclxDYWNoZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBEb3dubG9hZGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwXFJlc3BvbnNlOwoKCgoKCgphYnN0cmFjdCBjbGFzcyBWY3NEcml2ZXIgaW1wbGVtZW50cyBWY3NEcml2ZXJJbnRlcmZhY2UKewoKcHJvdGVjdGVkICR1cmw7Cgpwcm90ZWN0ZWQgJG9yaWdpblVybDsKCnByb3RlY3RlZCAkcmVwb0NvbmZpZzsKCnByb3RlY3RlZCAkaW87Cgpwcm90ZWN0ZWQgJGNvbmZpZzsKCnByb3RlY3RlZCAkcHJvY2VzczsKCnByb3RlY3RlZCAkaHR0cERvd25sb2FkZXI7Cgpwcm90ZWN0ZWQgJGluZm9DYWNoZSA9IFtdOwoKcHJvdGVjdGVkICRjYWNoZTsKCgoKCgoKCgoKCmZpbmFsIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkcmVwb0NvbmZpZywgSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgSHR0cERvd25sb2FkZXIgJGh0dHBEb3dubG9hZGVyLCBQcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MpCnsKaWYgKEZpbGVzeXN0ZW06OmlzTG9jYWxQYXRoKCRyZXBvQ29uZmlnWyd1cmwnXSkpIHsKJHJlcG9Db25maWdbJ3VybCddID0gRmlsZXN5c3RlbTo6Z2V0UGxhdGZvcm1QYXRoKCRyZXBvQ29uZmlnWyd1cmwnXSk7Cn0KCiR0aGlzLT51cmwgPSAkcmVwb0NvbmZpZ1sndXJsJ107CiR0aGlzLT5vcmlnaW5VcmwgPSAkcmVwb0NvbmZpZ1sndXJsJ107CiR0aGlzLT5yZXBvQ29uZmlnID0gJHJlcG9Db25maWc7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7CiR0aGlzLT5odHRwRG93bmxvYWRlciA9ICRodHRwRG93bmxvYWRlcjsKJHRoaXMtPnByb2Nlc3MgPSAkcHJvY2VzczsKfQoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBzaG91bGRDYWNoZShzdHJpbmcgJGlkZW50aWZpZXIpOiBib29sCnsKcmV0dXJuICR0aGlzLT5jYWNoZSAmJiBQcmVnOjppc01hdGNoKCd7XlthLWYwLTldezQwfSR9aUQnLCAkaWRlbnRpZmllcik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21wb3NlckluZm9ybWF0aW9uKHN0cmluZyAkaWRlbnRpZmllcik6ID9hcnJheQp7CmlmICghaXNzZXQoJHRoaXMtPmluZm9DYWNoZVskaWRlbnRpZmllcl0pKSB7CmlmICgkdGhpcy0+c2hvdWxkQ2FjaGUoJGlkZW50aWZpZXIpICYmICRyZXMgPSAkdGhpcy0+Y2FjaGUtPnJlYWQoJGlkZW50aWZpZXIpKSB7CnJldHVybiAkdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXSA9IEpzb25GaWxlOjpwYXJzZUpzb24oJHJlcyk7Cn0KCiRjb21wb3NlciA9ICR0aGlzLT5nZXRCYXNlQ29tcG9zZXJJbmZvcm1hdGlvbigkaWRlbnRpZmllcik7CgppZiAoJHRoaXMtPnNob3VsZENhY2hlKCRpZGVudGlmaWVyKSkgewokdGhpcy0+Y2FjaGUtPndyaXRlKCRpZGVudGlmaWVyLCBKc29uRmlsZTo6ZW5jb2RlKCRjb21wb3NlciwgXEpTT05fVU5FU0NBUEVEX1VOSUNPREUgfCBcSlNPTl9VTkVTQ0FQRURfU0xBU0hFUykpOwp9CgokdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXSA9ICRjb21wb3NlcjsKfQoKcmV0dXJuICR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0QmFzZUNvbXBvc2VySW5mb3JtYXRpb24oc3RyaW5nICRpZGVudGlmaWVyKTogP2FycmF5CnsKJGNvbXBvc2VyRmlsZUNvbnRlbnQgPSAkdGhpcy0+Z2V0RmlsZUNvbnRlbnQoJ2NvbXBvc2VyLmpzb24nLCAkaWRlbnRpZmllcik7CgppZiAoISRjb21wb3NlckZpbGVDb250ZW50KSB7CnJldHVybiBudWxsOwp9CgokY29tcG9zZXIgPSBKc29uRmlsZTo6cGFyc2VKc29uKCRjb21wb3NlckZpbGVDb250ZW50LCAkaWRlbnRpZmllciAuICc6Y29tcG9zZXIuanNvbicpOwoKaWYgKFtdID09PSAkY29tcG9zZXIgfHwgIWlzX2FycmF5KCRjb21wb3NlcikpIHsKcmV0dXJuIG51bGw7Cn0KCmlmIChlbXB0eSgkY29tcG9zZXJbJ3RpbWUnXSkgJiYgbnVsbCAhPT0gKCRjaGFuZ2VEYXRlID0gJHRoaXMtPmdldENoYW5nZURhdGUoJGlkZW50aWZpZXIpKSkgewokY29tcG9zZXJbJ3RpbWUnXSA9ICRjaGFuZ2VEYXRlLT5mb3JtYXQoREFURV9SRkMzMzM5KTsKfQoKcmV0dXJuICRjb21wb3NlcjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc0NvbXBvc2VyRmlsZShzdHJpbmcgJGlkZW50aWZpZXIpOiBib29sCnsKdHJ5IHsKcmV0dXJuIG51bGwgIT09ICR0aGlzLT5nZXRDb21wb3NlckluZm9ybWF0aW9uKCRpZGVudGlmaWVyKTsKfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRTY2hlbWUoKTogc3RyaW5nCnsKaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSkgewpyZXR1cm4gJ2h0dHBzJzsKfQoKcmV0dXJuICdodHRwJzsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRDb250ZW50cyhzdHJpbmcgJHVybCk6IFJlc3BvbnNlCnsKJG9wdGlvbnMgPSAkdGhpcy0+cmVwb0NvbmZpZ1snb3B0aW9ucyddID8/IFtdOwoKcmV0dXJuICR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KCR1cmwsICRvcHRpb25zKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNsZWFudXAoKTogdm9pZAp7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3M7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CgoKCgoKaW50ZXJmYWNlIFZjc0RyaXZlckludGVyZmFjZQp7CgoKCnB1YmxpYyBmdW5jdGlvbiBpbml0aWFsaXplKCk6IHZvaWQ7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tcG9zZXJJbmZvcm1hdGlvbihzdHJpbmcgJGlkZW50aWZpZXIpOiA/YXJyYXk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZUNvbnRlbnQoc3RyaW5nICRmaWxlLCBzdHJpbmcgJGlkZW50aWZpZXIpOiA/c3RyaW5nOwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENoYW5nZURhdGUoc3RyaW5nICRpZGVudGlmaWVyKTogP1xEYXRlVGltZUltbXV0YWJsZTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJvb3RJZGVudGlmaWVyKCk6IHN0cmluZzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEJyYW5jaGVzKCk6IGFycmF5OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGFncygpOiBhcnJheTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3Qoc3RyaW5nICRpZGVudGlmaWVyKTogP2FycmF5OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlKHN0cmluZyAkaWRlbnRpZmllcik6IGFycmF5OwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVybCgpOiBzdHJpbmc7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc0NvbXBvc2VyRmlsZShzdHJpbmcgJGlkZW50aWZpZXIpOiBib29sOwoKCgoKcHVibGljIGZ1bmN0aW9uIGNsZWFudXAoKTogdm9pZDsKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdXBwb3J0cyhJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBzdHJpbmcgJHVybCwgYm9vbCAkZGVlcCA9IGZhbHNlKTogYm9vbDsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcVmNzXFZjc0RyaXZlckludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcQXJyYXlMb2FkZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxWYWxpZGF0aW5nQXJyYXlMb2FkZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxJbnZhbGlkUGFja2FnZUV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXExvYWRlckludGVyZmFjZTsKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudERpc3BhdGNoZXI7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBEb3dubG9hZGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxVcmw7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25maWc7CgoKCgpjbGFzcyBWY3NSZXBvc2l0b3J5IGV4dGVuZHMgQXJyYXlSZXBvc2l0b3J5IGltcGxlbWVudHMgQ29uZmlndXJhYmxlUmVwb3NpdG9yeUludGVyZmFjZQp7Cgpwcm90ZWN0ZWQgJHVybDsKCnByb3RlY3RlZCAkcGFja2FnZU5hbWU7Cgpwcm90ZWN0ZWQgJGlzVmVyYm9zZTsKCnByb3RlY3RlZCAkaXNWZXJ5VmVyYm9zZTsKCnByb3RlY3RlZCAkaW87Cgpwcm90ZWN0ZWQgJGNvbmZpZzsKCnByb3RlY3RlZCAkdmVyc2lvblBhcnNlcjsKCnByb3RlY3RlZCAkdHlwZTsKCnByb3RlY3RlZCAkbG9hZGVyOwoKcHJvdGVjdGVkICRyZXBvQ29uZmlnOwoKcHJvdGVjdGVkICRodHRwRG93bmxvYWRlcjsKCnByb3RlY3RlZCAkcHJvY2Vzc0V4ZWN1dG9yOwoKcHJvdGVjdGVkICRicmFuY2hFcnJvck9jY3VycmVkID0gZmFsc2U7Cgpwcml2YXRlICRkcml2ZXJzOwoKcHJpdmF0ZSAkZHJpdmVyOwoKcHJpdmF0ZSAkdmVyc2lvbkNhY2hlOwoKcHJpdmF0ZSAkZW1wdHlSZWZlcmVuY2VzID0gW107Cgpwcml2YXRlICR2ZXJzaW9uVHJhbnNwb3J0RXhjZXB0aW9ucyA9IFtdOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkcmVwb0NvbmZpZywgSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgSHR0cERvd25sb2FkZXIgJGh0dHBEb3dubG9hZGVyLCA/RXZlbnREaXNwYXRjaGVyICRkaXNwYXRjaGVyID0gbnVsbCwgP1Byb2Nlc3NFeGVjdXRvciAkcHJvY2VzcyA9IG51bGwsID9hcnJheSAkZHJpdmVycyA9IG51bGwsID9WZXJzaW9uQ2FjaGVJbnRlcmZhY2UgJHZlcnNpb25DYWNoZSA9IG51bGwpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgpOwokdGhpcy0+ZHJpdmVycyA9ICRkcml2ZXJzID86IFsKJ2dpdGh1YicgPT4gJ0NvbXBvc2VyXFJlcG9zaXRvcnlcVmNzXEdpdEh1YkRyaXZlcicsCidnaXRsYWInID0+ICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1xHaXRMYWJEcml2ZXInLAonYml0YnVja2V0JyA9PiAnQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NcR2l0Qml0YnVja2V0RHJpdmVyJywKJ2dpdC1iaXRidWNrZXQnID0+ICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1xHaXRCaXRidWNrZXREcml2ZXInLAonZm9yZ2VqbycgPT4gJ0NvbXBvc2VyXFJlcG9zaXRvcnlcVmNzXEZvcmdlam9Ecml2ZXInLAonZ2l0JyA9PiAnQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NcR2l0RHJpdmVyJywKJ2hnJyA9PiAnQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NcSGdEcml2ZXInLAoncGVyZm9yY2UnID0+ICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1xQZXJmb3JjZURyaXZlcicsCidmb3NzaWwnID0+ICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1xGb3NzaWxEcml2ZXInLAoKJ3N2bicgPT4gJ0NvbXBvc2VyXFJlcG9zaXRvcnlcVmNzXFN2bkRyaXZlcicsCl07CgokdGhpcy0+dXJsID0gJHJlcG9Db25maWdbJ3VybCddID0gUGxhdGZvcm06OmV4cGFuZFBhdGgoJHJlcG9Db25maWdbJ3VybCddKTsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+dHlwZSA9ICRyZXBvQ29uZmlnWyd0eXBlJ10gPz8gJ3Zjcyc7CiR0aGlzLT5pc1ZlcmJvc2UgPSAkaW8tPmlzVmVyYm9zZSgpOwokdGhpcy0+aXNWZXJ5VmVyYm9zZSA9ICRpby0+aXNWZXJ5VmVyYm9zZSgpOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKJHRoaXMtPnJlcG9Db25maWcgPSAkcmVwb0NvbmZpZzsKJHRoaXMtPnZlcnNpb25DYWNoZSA9ICR2ZXJzaW9uQ2FjaGU7CiR0aGlzLT5odHRwRG93bmxvYWRlciA9ICRodHRwRG93bmxvYWRlcjsKJHRoaXMtPnByb2Nlc3NFeGVjdXRvciA9ICRwcm9jZXNzID8/IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9OYW1lKCkKewokZHJpdmVyQ2xhc3MgPSBnZXRfY2xhc3MoJHRoaXMtPmdldERyaXZlcigpKTsKJGRyaXZlclR5cGUgPSBhcnJheV9zZWFyY2goJGRyaXZlckNsYXNzLCAkdGhpcy0+ZHJpdmVycyk7CmlmICghJGRyaXZlclR5cGUpIHsKJGRyaXZlclR5cGUgPSAkZHJpdmVyQ2xhc3M7Cn0KCnJldHVybiAndmNzIHJlcG8gKCcuJGRyaXZlclR5cGUuJyAnLlVybDo6c2FuaXRpemUoJHRoaXMtPnVybCkuJyknOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb0NvbmZpZygpCnsKcmV0dXJuICR0aGlzLT5yZXBvQ29uZmlnOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0TG9hZGVyKExvYWRlckludGVyZmFjZSAkbG9hZGVyKTogdm9pZAp7CiR0aGlzLT5sb2FkZXIgPSAkbG9hZGVyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RHJpdmVyKCk6ID9WY3NEcml2ZXJJbnRlcmZhY2UKewppZiAoJHRoaXMtPmRyaXZlcikgewpyZXR1cm4gJHRoaXMtPmRyaXZlcjsKfQoKaWYgKGlzc2V0KCR0aGlzLT5kcml2ZXJzWyR0aGlzLT50eXBlXSkpIHsKJGNsYXNzID0gJHRoaXMtPmRyaXZlcnNbJHRoaXMtPnR5cGVdOwokdGhpcy0+ZHJpdmVyID0gbmV3ICRjbGFzcygkdGhpcy0+cmVwb0NvbmZpZywgJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+aHR0cERvd25sb2FkZXIsICR0aGlzLT5wcm9jZXNzRXhlY3V0b3IpOwokdGhpcy0+ZHJpdmVyLT5pbml0aWFsaXplKCk7CgpyZXR1cm4gJHRoaXMtPmRyaXZlcjsKfQoKZm9yZWFjaCAoJHRoaXMtPmRyaXZlcnMgYXMgJGRyaXZlcikgewppZiAoJGRyaXZlcjo6c3VwcG9ydHMoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+dXJsKSkgewokdGhpcy0+ZHJpdmVyID0gbmV3ICRkcml2ZXIoJHRoaXMtPnJlcG9Db25maWcsICR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPmh0dHBEb3dubG9hZGVyLCAkdGhpcy0+cHJvY2Vzc0V4ZWN1dG9yKTsKJHRoaXMtPmRyaXZlci0+aW5pdGlhbGl6ZSgpOwoKcmV0dXJuICR0aGlzLT5kcml2ZXI7Cn0KfQoKZm9yZWFjaCAoJHRoaXMtPmRyaXZlcnMgYXMgJGRyaXZlcikgewppZiAoJGRyaXZlcjo6c3VwcG9ydHMoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+dXJsLCB0cnVlKSkgewokdGhpcy0+ZHJpdmVyID0gbmV3ICRkcml2ZXIoJHRoaXMtPnJlcG9Db25maWcsICR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPmh0dHBEb3dubG9hZGVyLCAkdGhpcy0+cHJvY2Vzc0V4ZWN1dG9yKTsKJHRoaXMtPmRyaXZlci0+aW5pdGlhbGl6ZSgpOwoKcmV0dXJuICR0aGlzLT5kcml2ZXI7Cn0KfQoKcmV0dXJuIG51bGw7Cn0KCnB1YmxpYyBmdW5jdGlvbiBoYWRJbnZhbGlkQnJhbmNoZXMoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+YnJhbmNoRXJyb3JPY2N1cnJlZDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEVtcHR5UmVmZXJlbmNlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+ZW1wdHlSZWZlcmVuY2VzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmVyc2lvblRyYW5zcG9ydEV4Y2VwdGlvbnMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnZlcnNpb25UcmFuc3BvcnRFeGNlcHRpb25zOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpCnsKcGFyZW50Ojppbml0aWFsaXplKCk7CgokaXNWZXJib3NlID0gJHRoaXMtPmlzVmVyYm9zZTsKJGlzVmVyeVZlcmJvc2UgPSAkdGhpcy0+aXNWZXJ5VmVyYm9zZTsKCiRkcml2ZXIgPSAkdGhpcy0+Z2V0RHJpdmVyKCk7CmlmICghJGRyaXZlcikgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignTm8gZHJpdmVyIGZvdW5kIHRvIGhhbmRsZSBWQ1MgcmVwb3NpdG9yeSAnLiR0aGlzLT51cmwpOwp9CgokdGhpcy0+dmVyc2lvblBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyOwppZiAoISR0aGlzLT5sb2FkZXIpIHsKJHRoaXMtPmxvYWRlciA9IG5ldyBBcnJheUxvYWRlcigkdGhpcy0+dmVyc2lvblBhcnNlcik7Cn0KCiRoYXNSb290SWRlbnRpZmllckNvbXBvc2VySnNvbiA9IGZhbHNlOwp0cnkgewokaGFzUm9vdElkZW50aWZpZXJDb21wb3Nlckpzb24gPSAkZHJpdmVyLT5oYXNDb21wb3NlckZpbGUoJGRyaXZlci0+Z2V0Um9vdElkZW50aWZpZXIoKSk7CmlmICgkaGFzUm9vdElkZW50aWZpZXJDb21wb3Nlckpzb24pIHsKJGRhdGEgPSAkZHJpdmVyLT5nZXRDb21wb3NlckluZm9ybWF0aW9uKCRkcml2ZXItPmdldFJvb3RJZGVudGlmaWVyKCkpOwokdGhpcy0+cGFja2FnZU5hbWUgPSAhZW1wdHkoJGRhdGFbJ25hbWUnXSkgPyAkZGF0YVsnbmFtZSddIDogbnVsbDsKfQp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmlmICgkZSBpbnN0YW5jZW9mIFRyYW5zcG9ydEV4Y2VwdGlvbiAmJiAkdGhpcy0+c2hvdWxkUmV0aHJvd1RyYW5zcG9ydEV4Y2VwdGlvbigkZSkpIHsKdGhyb3cgJGU7Cn0KCmlmICgkaXNWZXJ5VmVyYm9zZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj5Ta2lwcGVkIHBhcnNpbmcgJy4kZHJpdmVyLT5nZXRSb290SWRlbnRpZmllcigpLicsICcuJGUtPmdldE1lc3NhZ2UoKS4nPC9lcnJvcj4nKTsKfQp9Cgpmb3JlYWNoICgkZHJpdmVyLT5nZXRUYWdzKCkgYXMgJHRhZyA9PiAkaWRlbnRpZmllcikgewokdGFnID0gKHN0cmluZykgJHRhZzsKJG1zZyA9ICdSZWFkaW5nIGNvbXBvc2VyLmpzb24gb2YgPGluZm8+JyAuICgkdGhpcy0+cGFja2FnZU5hbWUgPzogJHRoaXMtPnVybCkgLiAnPC9pbmZvPiAoPGNvbW1lbnQ+JyAuICR0YWcgLiAnPC9jb21tZW50PiknOwoKCiR0YWcgPSBzdHJfcmVwbGFjZSgncmVsZWFzZS0nLCAnJywgJHRhZyk7CgokY2FjaGVkUGFja2FnZSA9ICR0aGlzLT5nZXRDYWNoZWRQYWNrYWdlVmVyc2lvbigkdGFnLCAkaWRlbnRpZmllciwgJGlzVmVyYm9zZSwgJGlzVmVyeVZlcmJvc2UpOwppZiAoJGNhY2hlZFBhY2thZ2UpIHsKJHRoaXMtPmFkZFBhY2thZ2UoJGNhY2hlZFBhY2thZ2UpOwoKY29udGludWU7Cn0KaWYgKCRjYWNoZWRQYWNrYWdlID09PSBmYWxzZSkgewokdGhpcy0+ZW1wdHlSZWZlcmVuY2VzW10gPSAkaWRlbnRpZmllcjsKCmNvbnRpbnVlOwp9CgppZiAoISRwYXJzZWRUYWcgPSAkdGhpcy0+dmFsaWRhdGVUYWcoJHRhZykpIHsKaWYgKCRpc1ZlcnlWZXJib3NlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+U2tpcHBlZCB0YWcgJy4kdGFnLicsIGludmFsaWQgdGFnIG5hbWU8L3dhcm5pbmc+Jyk7Cn0KY29udGludWU7Cn0KCmlmICgkaXNWZXJ5VmVyYm9zZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJG1zZyk7Cn0gZWxzZWlmICgkaXNWZXJib3NlKSB7CiR0aGlzLT5pby0+b3ZlcndyaXRlRXJyb3IoJG1zZywgZmFsc2UpOwp9Cgp0cnkgewokZGF0YSA9ICRkcml2ZXItPmdldENvbXBvc2VySW5mb3JtYXRpb24oJGlkZW50aWZpZXIpOwppZiAobnVsbCA9PT0gJGRhdGEpIHsKaWYgKCRpc1ZlcnlWZXJib3NlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+U2tpcHBlZCB0YWcgJy4kdGFnLicsIG5vIGNvbXBvc2VyIGZpbGU8L3dhcm5pbmc+Jyk7Cn0KJHRoaXMtPmVtcHR5UmVmZXJlbmNlc1tdID0gJGlkZW50aWZpZXI7CmNvbnRpbnVlOwp9CgoKaWYgKGlzc2V0KCRkYXRhWyd2ZXJzaW9uJ10pKSB7CiRkYXRhWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXSA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJGRhdGFbJ3ZlcnNpb24nXSk7Cn0gZWxzZSB7CgokZGF0YVsndmVyc2lvbiddID0gJHRhZzsKJGRhdGFbJ3ZlcnNpb25fbm9ybWFsaXplZCddID0gJHBhcnNlZFRhZzsKfQoKCiRkYXRhWyd2ZXJzaW9uJ10gPSBQcmVnOjpyZXBsYWNlKCd7Wy4tXT9kZXYkfWknLCAnJywgJGRhdGFbJ3ZlcnNpb24nXSk7CiRkYXRhWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXSA9IFByZWc6OnJlcGxhY2UoJ3soXmRldi18Wy4tXT9kZXYkKX1pJywgJycsICRkYXRhWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXSk7CgoKdW5zZXQoJGRhdGFbJ2RlZmF1bHQtYnJhbmNoJ10pOwoKCmlmICgkZGF0YVsndmVyc2lvbl9ub3JtYWxpemVkJ10gIT09ICRwYXJzZWRUYWcpIHsKaWYgKCRpc1ZlcnlWZXJib3NlKSB7CmlmIChQcmVnOjppc01hdGNoKCd7KF5kZXYtfFsuLV0/ZGV2JCl9aScsICRwYXJzZWRUYWcpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+U2tpcHBlZCB0YWcgJy4kdGFnLicsIGludmFsaWQgdGFnIG5hbWUsIHRhZ3MgY2FuIG5vdCB1c2UgZGV2IHByZWZpeGVzIG9yIHN1ZmZpeGVzPC93YXJuaW5nPicpOwp9IGVsc2UgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlNraXBwZWQgdGFnICcuJHRhZy4nLCB0YWcgKCcuJHBhcnNlZFRhZy4nKSBkb2VzIG5vdCBtYXRjaCB2ZXJzaW9uICgnLiRkYXRhWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXS4nKSBpbiBjb21wb3Nlci5qc29uPC93YXJuaW5nPicpOwp9Cn0KY29udGludWU7Cn0KCiR0YWdQYWNrYWdlTmFtZSA9ICR0aGlzLT5wYWNrYWdlTmFtZSA/OiAoJGRhdGFbJ25hbWUnXSA/PyAnJyk7CmlmICgkZXhpc3RpbmdQYWNrYWdlID0gJHRoaXMtPmZpbmRQYWNrYWdlKCR0YWdQYWNrYWdlTmFtZSwgJGRhdGFbJ3ZlcnNpb25fbm9ybWFsaXplZCddKSkgewppZiAoJGlzVmVyeVZlcmJvc2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Ta2lwcGVkIHRhZyAnLiR0YWcuJywgaXQgY29uZmxpY3RzIHdpdGggYW4gYW5vdGhlciB0YWcgKCcuJGV4aXN0aW5nUGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpLicpIGFzIGJvdGggcmVzb2x2ZSB0byAnLiRkYXRhWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXS4nIGludGVybmFsbHk8L3dhcm5pbmc+Jyk7Cn0KY29udGludWU7Cn0KCmlmICgkaXNWZXJ5VmVyYm9zZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0ltcG9ydGluZyB0YWcgJy4kdGFnLicgKCcuJGRhdGFbJ3ZlcnNpb25fbm9ybWFsaXplZCddLicpJyk7Cn0KCiR0aGlzLT5hZGRQYWNrYWdlKCR0aGlzLT5sb2FkZXItPmxvYWQoJHRoaXMtPnByZVByb2Nlc3MoJGRyaXZlciwgJGRhdGEsICRpZGVudGlmaWVyKSkpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmlmICgkZSBpbnN0YW5jZW9mIFRyYW5zcG9ydEV4Y2VwdGlvbikgewokdGhpcy0+dmVyc2lvblRyYW5zcG9ydEV4Y2VwdGlvbnNbJ3RhZ3MnXVskdGFnXSA9ICRlOwppZiAoJGUtPmdldENvZGUoKSA9PT0gNDA0KSB7CiR0aGlzLT5lbXB0eVJlZmVyZW5jZXNbXSA9ICRpZGVudGlmaWVyOwp9CmlmICgkdGhpcy0+c2hvdWxkUmV0aHJvd1RyYW5zcG9ydEV4Y2VwdGlvbigkZSkpIHsKdGhyb3cgJGU7Cn0KfQppZiAoJGlzVmVyeVZlcmJvc2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Ta2lwcGVkIHRhZyAnLiR0YWcuJywgJy4oJGUgaW5zdGFuY2VvZiBUcmFuc3BvcnRFeGNlcHRpb24gPyAnbm8gY29tcG9zZXIgZmlsZSB3YXMgZm91bmQgKCcgLiAkZS0+Z2V0Q29kZSgpIC4gJyBIVFRQIHN0YXR1cyBjb2RlKScgOiAkZS0+Z2V0TWVzc2FnZSgpKS4nPC93YXJuaW5nPicpOwp9CmNvbnRpbnVlOwp9Cn0KCmlmICghJGlzVmVyeVZlcmJvc2UpIHsKJHRoaXMtPmlvLT5vdmVyd3JpdGVFcnJvcignJywgZmFsc2UpOwp9CgokYnJhbmNoZXMgPSAkZHJpdmVyLT5nZXRCcmFuY2hlcygpOwoKaWYgKCRoYXNSb290SWRlbnRpZmllckNvbXBvc2VySnNvbiAmJiBpc3NldCgkYnJhbmNoZXNbJGRyaXZlci0+Z2V0Um9vdElkZW50aWZpZXIoKV0pKSB7CiRicmFuY2hlcyA9IFskZHJpdmVyLT5nZXRSb290SWRlbnRpZmllcigpID0+ICRicmFuY2hlc1skZHJpdmVyLT5nZXRSb290SWRlbnRpZmllcigpXV0gKyAkYnJhbmNoZXM7Cn0KCmZvcmVhY2ggKCRicmFuY2hlcyBhcyAkYnJhbmNoID0+ICRpZGVudGlmaWVyKSB7CiRicmFuY2ggPSAoc3RyaW5nKSAkYnJhbmNoOwokbXNnID0gJ1JlYWRpbmcgY29tcG9zZXIuanNvbiBvZiA8aW5mbz4nIC4gKCR0aGlzLT5wYWNrYWdlTmFtZSA/OiAkdGhpcy0+dXJsKSAuICc8L2luZm8+ICg8Y29tbWVudD4nIC4gJGJyYW5jaCAuICc8L2NvbW1lbnQ+KSc7CmlmICgkaXNWZXJ5VmVyYm9zZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJG1zZyk7Cn0gZWxzZWlmICgkaXNWZXJib3NlKSB7CiR0aGlzLT5pby0+b3ZlcndyaXRlRXJyb3IoJG1zZywgZmFsc2UpOwp9CgppZiAoISRwYXJzZWRCcmFuY2ggPSAkdGhpcy0+dmFsaWRhdGVCcmFuY2goJGJyYW5jaCkpIHsKaWYgKCRpc1ZlcnlWZXJib3NlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+U2tpcHBlZCBicmFuY2ggJy4kYnJhbmNoLicsIGludmFsaWQgbmFtZTwvd2FybmluZz4nKTsKfQpjb250aW51ZTsKfQoKCmlmIChzdHJwb3MoJHBhcnNlZEJyYW5jaCwgJ2Rldi0nKSA9PT0gMCB8fCBWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBUyA9PT0gJHBhcnNlZEJyYW5jaCkgewokdmVyc2lvbiA9ICdkZXYtJyAuIHN0cl9yZXBsYWNlKCcjJywgJysnLCAkYnJhbmNoKTsKJHBhcnNlZEJyYW5jaCA9IHN0cl9yZXBsYWNlKCcjJywgJysnLCAkcGFyc2VkQnJhbmNoKTsKfSBlbHNlIHsKJHByZWZpeCA9IHN0cnBvcygkYnJhbmNoLCAndicpID09PSAwID8gJ3YnIDogJyc7CiR2ZXJzaW9uID0gJHByZWZpeCAuIFByZWc6OnJlcGxhY2UoJ3soXC45ezd9KSt9JywgJy54JywgJHBhcnNlZEJyYW5jaCk7Cn0KCiRjYWNoZWRQYWNrYWdlID0gJHRoaXMtPmdldENhY2hlZFBhY2thZ2VWZXJzaW9uKCR2ZXJzaW9uLCAkaWRlbnRpZmllciwgJGlzVmVyYm9zZSwgJGlzVmVyeVZlcmJvc2UsICRkcml2ZXItPmdldFJvb3RJZGVudGlmaWVyKCkgPT09ICRicmFuY2gpOwppZiAoJGNhY2hlZFBhY2thZ2UpIHsKJHRoaXMtPmFkZFBhY2thZ2UoJGNhY2hlZFBhY2thZ2UpOwoKY29udGludWU7Cn0KaWYgKCRjYWNoZWRQYWNrYWdlID09PSBmYWxzZSkgewokdGhpcy0+ZW1wdHlSZWZlcmVuY2VzW10gPSAkaWRlbnRpZmllcjsKCmNvbnRpbnVlOwp9Cgp0cnkgewokZGF0YSA9ICRkcml2ZXItPmdldENvbXBvc2VySW5mb3JtYXRpb24oJGlkZW50aWZpZXIpOwppZiAobnVsbCA9PT0gJGRhdGEpIHsKaWYgKCRpc1ZlcnlWZXJib3NlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+U2tpcHBlZCBicmFuY2ggJy4kYnJhbmNoLicsIG5vIGNvbXBvc2VyIGZpbGU8L3dhcm5pbmc+Jyk7Cn0KJHRoaXMtPmVtcHR5UmVmZXJlbmNlc1tdID0gJGlkZW50aWZpZXI7CmNvbnRpbnVlOwp9CgoKJGRhdGFbJ3ZlcnNpb24nXSA9ICR2ZXJzaW9uOwokZGF0YVsndmVyc2lvbl9ub3JtYWxpemVkJ10gPSAkcGFyc2VkQnJhbmNoOwoKdW5zZXQoJGRhdGFbJ2RlZmF1bHQtYnJhbmNoJ10pOwppZiAoJGRyaXZlci0+Z2V0Um9vdElkZW50aWZpZXIoKSA9PT0gJGJyYW5jaCkgewokZGF0YVsnZGVmYXVsdC1icmFuY2gnXSA9IHRydWU7Cn0KCmlmICgkaXNWZXJ5VmVyYm9zZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0ltcG9ydGluZyBicmFuY2ggJy4kYnJhbmNoLicgKCcuJGRhdGFbJ3ZlcnNpb24nXS4nKScpOwp9CgokcGFja2FnZURhdGEgPSAkdGhpcy0+cHJlUHJvY2VzcygkZHJpdmVyLCAkZGF0YSwgJGlkZW50aWZpZXIpOwokcGFja2FnZSA9ICR0aGlzLT5sb2FkZXItPmxvYWQoJHBhY2thZ2VEYXRhKTsKaWYgKCR0aGlzLT5sb2FkZXIgaW5zdGFuY2VvZiBWYWxpZGF0aW5nQXJyYXlMb2FkZXIgJiYgXGNvdW50KCR0aGlzLT5sb2FkZXItPmdldFdhcm5pbmdzKCkpID4gMCkgewp0aHJvdyBuZXcgSW52YWxpZFBhY2thZ2VFeGNlcHRpb24oJHRoaXMtPmxvYWRlci0+Z2V0RXJyb3JzKCksICR0aGlzLT5sb2FkZXItPmdldFdhcm5pbmdzKCksICRwYWNrYWdlRGF0YSk7Cn0KJHRoaXMtPmFkZFBhY2thZ2UoJHBhY2thZ2UpOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKJHRoaXMtPnZlcnNpb25UcmFuc3BvcnRFeGNlcHRpb25zWydicmFuY2hlcyddWyRicmFuY2hdID0gJGU7CmlmICgkZS0+Z2V0Q29kZSgpID09PSA0MDQpIHsKJHRoaXMtPmVtcHR5UmVmZXJlbmNlc1tdID0gJGlkZW50aWZpZXI7Cn0KaWYgKCR0aGlzLT5zaG91bGRSZXRocm93VHJhbnNwb3J0RXhjZXB0aW9uKCRlKSkgewp0aHJvdyAkZTsKfQppZiAoJGlzVmVyeVZlcmJvc2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Ta2lwcGVkIGJyYW5jaCAnLiRicmFuY2guJywgbm8gY29tcG9zZXIgZmlsZSB3YXMgZm91bmQgKCcgLiAkZS0+Z2V0Q29kZSgpIC4gJyBIVFRQIHN0YXR1cyBjb2RlKTwvd2FybmluZz4nKTsKfQpjb250aW51ZTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewppZiAoISRpc1ZlcnlWZXJib3NlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignJyk7Cn0KJHRoaXMtPmJyYW5jaEVycm9yT2NjdXJyZWQgPSB0cnVlOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj5Ta2lwcGVkIGJyYW5jaCAnLiRicmFuY2guJywgJy4kZS0+Z2V0TWVzc2FnZSgpLic8L2Vycm9yPicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJycpOwpjb250aW51ZTsKfQp9CiRkcml2ZXItPmNsZWFudXAoKTsKCmlmICghJGlzVmVyeVZlcmJvc2UpIHsKJHRoaXMtPmlvLT5vdmVyd3JpdGVFcnJvcignJywgZmFsc2UpOwp9CgppZiAoISR0aGlzLT5nZXRQYWNrYWdlcygpKSB7CnRocm93IG5ldyBJbnZhbGlkUmVwb3NpdG9yeUV4Y2VwdGlvbignTm8gdmFsaWQgY29tcG9zZXIuanNvbiB3YXMgZm91bmQgaW4gYW55IGJyYW5jaCBvciB0YWcgb2YgJy4kdGhpcy0+dXJsLicsIGNvdWxkIG5vdCBsb2FkIGEgcGFja2FnZSBmcm9tIGl0LicpOwp9Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHByZVByb2Nlc3MoVmNzRHJpdmVySW50ZXJmYWNlICRkcml2ZXIsIGFycmF5ICRkYXRhLCBzdHJpbmcgJGlkZW50aWZpZXIpOiBhcnJheQp7CgoKCiRkYXRhUGFja2FnZU5hbWUgPSAkZGF0YVsnbmFtZSddID8/IG51bGw7CiRkYXRhWyduYW1lJ10gPSAkdGhpcy0+cGFja2FnZU5hbWUgPzogJGRhdGFQYWNrYWdlTmFtZTsKCmlmICghaXNzZXQoJGRhdGFbJ2Rpc3QnXSkpIHsKJGRhdGFbJ2Rpc3QnXSA9ICRkcml2ZXItPmdldERpc3QoJGlkZW50aWZpZXIpOwp9CmlmICghaXNzZXQoJGRhdGFbJ3NvdXJjZSddKSkgewokZGF0YVsnc291cmNlJ10gPSAkZHJpdmVyLT5nZXRTb3VyY2UoJGlkZW50aWZpZXIpOwp9CgoKaWYgKGlzX2FycmF5KCRkYXRhWydkaXN0J10pICYmICFpc3NldCgkZGF0YVsnZGlzdCddWydyZWZlcmVuY2UnXSkgJiYgaXNzZXQoJGRhdGFbJ3NvdXJjZSddWydyZWZlcmVuY2UnXSkpIHsKJGRhdGFbJ2Rpc3QnXVsncmVmZXJlbmNlJ10gPSAkZGF0YVsnc291cmNlJ11bJ3JlZmVyZW5jZSddOwp9CgpyZXR1cm4gJGRhdGE7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gdmFsaWRhdGVCcmFuY2goc3RyaW5nICRicmFuY2gpCnsKdHJ5IHsKJG5vcm1hbGl6ZWRCcmFuY2ggPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplQnJhbmNoKCRicmFuY2gpOwoKCiR0aGlzLT52ZXJzaW9uUGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCRub3JtYWxpemVkQnJhbmNoKTsKCnJldHVybiAkbm9ybWFsaXplZEJyYW5jaDsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gdmFsaWRhdGVUYWcoc3RyaW5nICR2ZXJzaW9uKQp7CnRyeSB7CnJldHVybiAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCR2ZXJzaW9uKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0Q2FjaGVkUGFja2FnZVZlcnNpb24oc3RyaW5nICR2ZXJzaW9uLCBzdHJpbmcgJGlkZW50aWZpZXIsIGJvb2wgJGlzVmVyYm9zZSwgYm9vbCAkaXNWZXJ5VmVyYm9zZSwgYm9vbCAkaXNEZWZhdWx0QnJhbmNoID0gZmFsc2UpCnsKaWYgKCEkdGhpcy0+dmVyc2lvbkNhY2hlKSB7CnJldHVybiBudWxsOwp9CgokY2FjaGVkUGFja2FnZSA9ICR0aGlzLT52ZXJzaW9uQ2FjaGUtPmdldFZlcnNpb25QYWNrYWdlKCR2ZXJzaW9uLCAkaWRlbnRpZmllcik7CmlmICgkY2FjaGVkUGFja2FnZSA9PT0gZmFsc2UpIHsKaWYgKCRpc1ZlcnlWZXJib3NlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+U2tpcHBlZCAnLiR2ZXJzaW9uLicsIG5vIGNvbXBvc2VyIGZpbGUgKGNhY2hlZCBmcm9tIHJlZiAnLiRpZGVudGlmaWVyLicpPC93YXJuaW5nPicpOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCmlmICgkY2FjaGVkUGFja2FnZSkgewokbXNnID0gJ0ZvdW5kIGNhY2hlZCBjb21wb3Nlci5qc29uIG9mIDxpbmZvPicgLiAoJHRoaXMtPnBhY2thZ2VOYW1lID86ICR0aGlzLT51cmwpIC4gJzwvaW5mbz4gKDxjb21tZW50PicgLiAkdmVyc2lvbiAuICc8L2NvbW1lbnQ+KSc7CmlmICgkaXNWZXJ5VmVyYm9zZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJG1zZyk7Cn0gZWxzZWlmICgkaXNWZXJib3NlKSB7CiR0aGlzLT5pby0+b3ZlcndyaXRlRXJyb3IoJG1zZywgZmFsc2UpOwp9Cgp1bnNldCgkY2FjaGVkUGFja2FnZVsnZGVmYXVsdC1icmFuY2gnXSk7CmlmICgkaXNEZWZhdWx0QnJhbmNoKSB7CiRjYWNoZWRQYWNrYWdlWydkZWZhdWx0LWJyYW5jaCddID0gdHJ1ZTsKfQoKaWYgKCRleGlzdGluZ1BhY2thZ2UgPSAkdGhpcy0+ZmluZFBhY2thZ2UoJGNhY2hlZFBhY2thZ2VbJ25hbWUnXSwgbmV3IENvbnN0cmFpbnQoJz0nLCAkY2FjaGVkUGFja2FnZVsndmVyc2lvbl9ub3JtYWxpemVkJ10pKSkgewppZiAoJGlzVmVyeVZlcmJvc2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Ta2lwcGVkIGNhY2hlZCB2ZXJzaW9uICcuJHZlcnNpb24uJywgaXQgY29uZmxpY3RzIHdpdGggYW4gYW5vdGhlciB0YWcgKCcuJGV4aXN0aW5nUGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpLicpIGFzIGJvdGggcmVzb2x2ZSB0byAnLiRjYWNoZWRQYWNrYWdlWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXS4nIGludGVybmFsbHk8L3dhcm5pbmc+Jyk7Cn0KJGNhY2hlZFBhY2thZ2UgPSBudWxsOwp9Cn0KCmlmICgkY2FjaGVkUGFja2FnZSkgewpyZXR1cm4gJHRoaXMtPmxvYWRlci0+bG9hZCgkY2FjaGVkUGFja2FnZSk7Cn0KCnJldHVybiBudWxsOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHNob3VsZFJldGhyb3dUcmFuc3BvcnRFeGNlcHRpb24oVHJhbnNwb3J0RXhjZXB0aW9uICRlKTogYm9vbAp7CnJldHVybiBpbl9hcnJheSgkZS0+Z2V0Q29kZSgpLCBbNDAxLCA0MDMsIDQyOV0sIHRydWUpIHx8ICRlLT5nZXRDb2RlKCkgPj0gNTAwOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7CgppbnRlcmZhY2UgVmVyc2lvbkNhY2hlSW50ZXJmYWNlCnsKCgoKcHVibGljIGZ1bmN0aW9uIGdldFZlcnNpb25QYWNrYWdlKHN0cmluZyAkdmVyc2lvbiwgc3RyaW5nICRpZGVudGlmaWVyKTsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCnVzZSBDb21wb3NlclxJbnN0YWxsZXJcSW5zdGFsbGF0aW9uTWFuYWdlcjsKCgoKCgoKY2xhc3MgV3JpdGFibGVBcnJheVJlcG9zaXRvcnkgZXh0ZW5kcyBBcnJheVJlcG9zaXRvcnkgaW1wbGVtZW50cyBXcml0YWJsZVJlcG9zaXRvcnlJbnRlcmZhY2UKewp1c2UgQ2Fub25pY2FsUGFja2FnZXNUcmFpdDsKCgoKCnByb3RlY3RlZCAkZGV2UGFja2FnZU5hbWVzID0gW107CgoKcHJpdmF0ZSAkZGV2TW9kZSA9IG51bGw7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGV2TW9kZSgpCnsKcmV0dXJuICR0aGlzLT5kZXZNb2RlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGV2UGFja2FnZU5hbWVzKGFycmF5ICRkZXZQYWNrYWdlTmFtZXMpCnsKJHRoaXMtPmRldlBhY2thZ2VOYW1lcyA9ICRkZXZQYWNrYWdlTmFtZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXZQYWNrYWdlTmFtZXMoKQp7CnJldHVybiAkdGhpcy0+ZGV2UGFja2FnZU5hbWVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGUoYm9vbCAkZGV2TW9kZSwgSW5zdGFsbGF0aW9uTWFuYWdlciAkaW5zdGFsbGF0aW9uTWFuYWdlcikKewokdGhpcy0+ZGV2TW9kZSA9ICRkZXZNb2RlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVsb2FkKCkKewokdGhpcy0+ZGV2TW9kZSA9IG51bGw7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJbnN0YWxsZXJcSW5zdGFsbGF0aW9uTWFuYWdlcjsKCgoKCgoKaW50ZXJmYWNlIFdyaXRhYmxlUmVwb3NpdG9yeUludGVyZmFjZSBleHRlbmRzIFJlcG9zaXRvcnlJbnRlcmZhY2UKewoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGUoYm9vbCAkZGV2TW9kZSwgSW5zdGFsbGF0aW9uTWFuYWdlciAkaW5zdGFsbGF0aW9uTWFuYWdlcik7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2Fub25pY2FsUGFja2FnZXMoKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbG9hZCgpOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZXZQYWNrYWdlTmFtZXMoYXJyYXkgJGRldlBhY2thZ2VOYW1lcyk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGV2UGFja2FnZU5hbWVzKCk7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFNjcmlwdDsKCnVzZSBDb21wb3NlclxDb21wb3NlcjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50IGFzIEJhc2VFdmVudDsKCgoKCgoKCmNsYXNzIEV2ZW50IGV4dGVuZHMgQmFzZUV2ZW50CnsKCgoKcHJpdmF0ZSAkY29tcG9zZXI7CgoKCgpwcml2YXRlICRpbzsKCgoKCnByaXZhdGUgJGRldk1vZGU7CgoKCgpwcml2YXRlICRvcmlnaW5hdGluZ0V2ZW50OwoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG5hbWUsIENvbXBvc2VyICRjb21wb3NlciwgSU9JbnRlcmZhY2UgJGlvLCBib29sICRkZXZNb2RlID0gZmFsc2UsIGFycmF5ICRhcmdzID0gW10sIGFycmF5ICRmbGFncyA9IFtdKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJG5hbWUsICRhcmdzLCAkZmxhZ3MpOwokdGhpcy0+Y29tcG9zZXIgPSAkY29tcG9zZXI7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmRldk1vZGUgPSAkZGV2TW9kZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbXBvc2VyKCk6IENvbXBvc2VyCnsKcmV0dXJuICR0aGlzLT5jb21wb3NlcjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldElPKCk6IElPSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5pbzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGV2TW9kZSgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5kZXZNb2RlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3JpZ2luYXRpbmdFdmVudCgpOiA/QmFzZUV2ZW50CnsKcmV0dXJuICR0aGlzLT5vcmlnaW5hdGluZ0V2ZW50Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRPcmlnaW5hdGluZ0V2ZW50KEJhc2VFdmVudCAkZXZlbnQpOiBzZWxmCnsKJHRoaXMtPm9yaWdpbmF0aW5nRXZlbnQgPSAkdGhpcy0+Y2FsY3VsYXRlT3JpZ2luYXRpbmdFdmVudCgkZXZlbnQpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNhbGN1bGF0ZU9yaWdpbmF0aW5nRXZlbnQoQmFzZUV2ZW50ICRldmVudCk6IEJhc2VFdmVudAp7CmlmICgkZXZlbnQgaW5zdGFuY2VvZiBFdmVudCAmJiAkZXZlbnQtPmdldE9yaWdpbmF0aW5nRXZlbnQoKSkgewpyZXR1cm4gJHRoaXMtPmNhbGN1bGF0ZU9yaWdpbmF0aW5nRXZlbnQoJGV2ZW50LT5nZXRPcmlnaW5hdGluZ0V2ZW50KCkpOwp9CgpyZXR1cm4gJGV2ZW50Owp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFNjcmlwdDsKCgoKCgoKCmNsYXNzIFNjcmlwdEV2ZW50cwp7CgoKCgoKCgpwdWJsaWMgY29uc3QgUFJFX0lOU1RBTExfQ01EID0gJ3ByZS1pbnN0YWxsLWNtZCc7CgoKCgoKCgoKcHVibGljIGNvbnN0IFBPU1RfSU5TVEFMTF9DTUQgPSAncG9zdC1pbnN0YWxsLWNtZCc7CgoKCgoKCgoKcHVibGljIGNvbnN0IFBSRV9VUERBVEVfQ01EID0gJ3ByZS11cGRhdGUtY21kJzsKCgoKCgoKCgpwdWJsaWMgY29uc3QgUE9TVF9VUERBVEVfQ01EID0gJ3Bvc3QtdXBkYXRlLWNtZCc7CgoKCgoKCgoKcHVibGljIGNvbnN0IFBSRV9TVEFUVVNfQ01EID0gJ3ByZS1zdGF0dXMtY21kJzsKCgoKCgoKCgpwdWJsaWMgY29uc3QgUE9TVF9TVEFUVVNfQ01EID0gJ3Bvc3Qtc3RhdHVzLWNtZCc7CgoKCgoKCgoKcHVibGljIGNvbnN0IFBSRV9BVVRPTE9BRF9EVU1QID0gJ3ByZS1hdXRvbG9hZC1kdW1wJzsKCgoKCgoKCgpwdWJsaWMgY29uc3QgUE9TVF9BVVRPTE9BRF9EVU1QID0gJ3Bvc3QtYXV0b2xvYWQtZHVtcCc7CgoKCgoKCgoKcHVibGljIGNvbnN0IFBPU1RfUk9PVF9QQUNLQUdFX0lOU1RBTEwgPSAncG9zdC1yb290LXBhY2thZ2UtaW5zdGFsbCc7CgoKCgoKCgoKCnB1YmxpYyBjb25zdCBQT1NUX0NSRUFURV9QUk9KRUNUX0NNRCA9ICdwb3N0LWNyZWF0ZS1wcm9qZWN0LWNtZCc7CgoKCgoKCgoKcHVibGljIGNvbnN0IFBSRV9BUkNISVZFX0NNRCA9ICdwcmUtYXJjaGl2ZS1jbWQnOwoKCgoKCgoKCnB1YmxpYyBjb25zdCBQT1NUX0FSQ0hJVkVfQ01EID0gJ3Bvc3QtYXJjaGl2ZS1jbWQnOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxTZWxmVXBkYXRlOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCmNsYXNzIEtleXMKewpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZpbmdlcnByaW50KHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CiRoYXNoID0gc3RydG91cHBlcihoYXNoKCdzaGEyNTYnLCBQcmVnOjpyZXBsYWNlKCd7XHN9JywgJycsIGZpbGVfZ2V0X2NvbnRlbnRzKCRwYXRoKSkpKTsKCnJldHVybiBpbXBsb2RlKCcgJywgWwpzdWJzdHIoJGhhc2gsIDAsIDgpLApzdWJzdHIoJGhhc2gsIDgsIDgpLApzdWJzdHIoJGhhc2gsIDE2LCA4KSwKc3Vic3RyKCRoYXNoLCAyNCwgOCksCicnLCAKc3Vic3RyKCRoYXNoLCAzMiwgOCksCnN1YnN0cigkaGFzaCwgNDAsIDgpLApzdWJzdHIoJGhhc2gsIDQ4LCA4KSwKc3Vic3RyKCRoYXNoLCA1NiwgOCksCl0pOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFNlbGZVcGRhdGU7Cgp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBEb3dubG9hZGVyOwp1c2UgQ29tcG9zZXJcQ29uZmlnOwoKCgoKY2xhc3MgVmVyc2lvbnMKewoKCgoKcHVibGljIHN0YXRpYyAkY2hhbm5lbHMgPSBzZWxmOjpDSEFOTkVMUzsKCnB1YmxpYyBjb25zdCBDSEFOTkVMUyA9IFsnc3RhYmxlJywgJ3ByZXZpZXcnLCAnc25hcHNob3QnLCAnMScsICcyJywgJzIuMiddOwoKCnByaXZhdGUgJGh0dHBEb3dubG9hZGVyOwoKcHJpdmF0ZSAkY29uZmlnOwoKcHJpdmF0ZSAkY2hhbm5lbDsKCnByaXZhdGUgJHZlcnNpb25zRGF0YSA9IG51bGw7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoQ29uZmlnICRjb25maWcsIEh0dHBEb3dubG9hZGVyICRodHRwRG93bmxvYWRlcikKewokdGhpcy0+aHR0cERvd25sb2FkZXIgPSAkaHR0cERvd25sb2FkZXI7CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hhbm5lbCgpOiBzdHJpbmcKewppZiAoJHRoaXMtPmNoYW5uZWwpIHsKcmV0dXJuICR0aGlzLT5jaGFubmVsOwp9CgokY2hhbm5lbEZpbGUgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2hvbWUnKS4nL3VwZGF0ZS1jaGFubmVsJzsKaWYgKGZpbGVfZXhpc3RzKCRjaGFubmVsRmlsZSkpIHsKJGNoYW5uZWwgPSB0cmltKGZpbGVfZ2V0X2NvbnRlbnRzKCRjaGFubmVsRmlsZSkpOwppZiAoaW5fYXJyYXkoJGNoYW5uZWwsIFsnc3RhYmxlJywgJ3ByZXZpZXcnLCAnc25hcHNob3QnLCAnMi4yJ10sIHRydWUpKSB7CnJldHVybiAkdGhpcy0+Y2hhbm5lbCA9ICRjaGFubmVsOwp9Cn0KCnJldHVybiAkdGhpcy0+Y2hhbm5lbCA9ICdzdGFibGUnOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0Q2hhbm5lbChzdHJpbmcgJGNoYW5uZWwsID9JT0ludGVyZmFjZSAkaW8gPSBudWxsKTogdm9pZAp7CmlmICghaW5fYXJyYXkoJGNoYW5uZWwsIHNlbGY6OkNIQU5ORUxTLCB0cnVlKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBjaGFubmVsICcuJGNoYW5uZWwuJywgbXVzdCBiZSBvbmUgb2Y6ICcgLiBpbXBsb2RlKCcsICcsIHNlbGY6OkNIQU5ORUxTKSk7Cn0KCiRjaGFubmVsRmlsZSA9ICR0aGlzLT5jb25maWctPmdldCgnaG9tZScpLicvdXBkYXRlLWNoYW5uZWwnOwokdGhpcy0+Y2hhbm5lbCA9ICRjaGFubmVsOwoKCiRzdG9yZWRDaGFubmVsID0gUHJlZzo6aXNNYXRjaCgne15cZCskfUQnLCAkY2hhbm5lbCkgPyAnc3RhYmxlJyA6ICRjaGFubmVsOwokcHJldmlvdXNseVN0b3JlZCA9IGZpbGVfZXhpc3RzKCRjaGFubmVsRmlsZSkgPyB0cmltKChzdHJpbmcpIGZpbGVfZ2V0X2NvbnRlbnRzKCRjaGFubmVsRmlsZSkpIDogbnVsbDsKZmlsZV9wdXRfY29udGVudHMoJGNoYW5uZWxGaWxlLCAkc3RvcmVkQ2hhbm5lbC5QSFBfRU9MKTsKCmlmICgkaW8gIT09IG51bGwgJiYgJHByZXZpb3VzbHlTdG9yZWQgIT09ICRzdG9yZWRDaGFubmVsKSB7CiRpby0+d3JpdGVFcnJvcignU3RvcmluZyAiPGluZm8+Jy4kc3RvcmVkQ2hhbm5lbC4nPC9pbmZvPiIgYXMgZGVmYXVsdCB1cGRhdGUgY2hhbm5lbCBmb3IgdGhlIG5leHQgc2VsZi11cGRhdGUgcnVuLicpOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMYXRlc3QoP3N0cmluZyAkY2hhbm5lbCA9IG51bGwpOiBhcnJheQp7CiR2ZXJzaW9ucyA9ICR0aGlzLT5nZXRWZXJzaW9uc0RhdGEoKTsKCmZvcmVhY2ggKCR2ZXJzaW9uc1skY2hhbm5lbCA/OiAkdGhpcy0+Z2V0Q2hhbm5lbCgpXSBhcyAkdmVyc2lvbikgewppZiAoJHZlcnNpb25bJ21pbi1waHAnXSA8PSBcUEhQX1ZFUlNJT05fSUQpIHsKcmV0dXJuICR2ZXJzaW9uOwp9Cn0KCnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdUaGVyZSBpcyBubyB2ZXJzaW9uIG9mIENvbXBvc2VyIGF2YWlsYWJsZSBmb3IgeW91ciBQSFAgdmVyc2lvbiAoJy5QSFBfVkVSU0lPTi4nKScpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFZlcnNpb25zRGF0YSgpOiBhcnJheQp7CmlmIChudWxsID09PSAkdGhpcy0+dmVyc2lvbnNEYXRhKSB7CmlmICgkdGhpcy0+Y29uZmlnLT5nZXQoJ2Rpc2FibGUtdGxzJykgPT09IHRydWUpIHsKJHByb3RvY29sID0gJ2h0dHAnOwp9IGVsc2UgewokcHJvdG9jb2wgPSAnaHR0cHMnOwp9CgokdGhpcy0+dmVyc2lvbnNEYXRhID0gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoJHByb3RvY29sIC4gJzovL2dldGNvbXBvc2VyLm9yZy92ZXJzaW9ucycpLT5kZWNvZGVKc29uKCk7Cn0KCnJldHVybiAkdGhpcy0+dmVyc2lvbnNEYXRhOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCmNsYXNzIEF1dGhIZWxwZXIKewoKcHJvdGVjdGVkICRpbzsKCnByb3RlY3RlZCAkY29uZmlnOwoKcHJpdmF0ZSAkZGlzcGxheWVkT3JpZ2luQXV0aGVudGljYXRpb25zID0gW107Cgpwcml2YXRlICRiaXRidWNrZXRSZXRyeSA9IFtdOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcpCnsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHN0b3JlQXV0aChzdHJpbmcgJG9yaWdpbiwgJHN0b3JlQXV0aCk6IHZvaWQKewokc3RvcmUgPSBmYWxzZTsKJGNvbmZpZ1NvdXJjZSA9ICR0aGlzLT5jb25maWctPmdldEF1dGhDb25maWdTb3VyY2UoKTsKaWYgKCRzdG9yZUF1dGggPT09IHRydWUpIHsKJHN0b3JlID0gJGNvbmZpZ1NvdXJjZTsKfSBlbHNlaWYgKCRzdG9yZUF1dGggPT09ICdwcm9tcHQnKSB7CiRhbnN3ZXIgPSAkdGhpcy0+aW8tPmFza0FuZFZhbGlkYXRlKAonRG8geW91IHdhbnQgdG8gc3RvcmUgY3JlZGVudGlhbHMgZm9yICcuJG9yaWdpbi4nIGluICcuJGNvbmZpZ1NvdXJjZS0+Z2V0TmFtZSgpLicgPyBbWW5dICcsCnN0YXRpYyBmdW5jdGlvbiAoJHZhbHVlKTogc3RyaW5nIHsKJGlucHV0ID0gc3RydG9sb3dlcihzdWJzdHIodHJpbSgkdmFsdWUpLCAwLCAxKSk7CmlmIChpbl9hcnJheSgkaW5wdXQsIFsneScsJ24nXSkpIHsKcmV0dXJuICRpbnB1dDsKfQp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1BsZWFzZSBhbnN3ZXIgKHkpZXMgb3IgKG4pbycpOwp9LApudWxsLAoneScKKTsKCmlmICgkYW5zd2VyID09PSAneScpIHsKJHN0b3JlID0gJGNvbmZpZ1NvdXJjZTsKfQp9CmlmICgkc3RvcmUpIHsKJHN0b3JlLT5hZGRDb25maWdTZXR0aW5nKAonaHR0cC1iYXNpYy4nLiRvcmlnaW4sCiR0aGlzLT5pby0+Z2V0QXV0aGVudGljYXRpb24oJG9yaWdpbikKKTsKfQp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcHJvbXB0QXV0aElmTmVlZGVkKHN0cmluZyAkdXJsLCBzdHJpbmcgJG9yaWdpbiwgaW50ICRzdGF0dXNDb2RlLCA/c3RyaW5nICRyZWFzb24gPSBudWxsLCBhcnJheSAkaGVhZGVycyA9IFtdLCBpbnQgJHJldHJ5Q291bnQgPSAwLCA/c3RyaW5nICRyZXNwb25zZUJvZHkgPSBudWxsKTogYXJyYXkKewokc3RvcmVBdXRoID0gZmFsc2U7CgppZiAoaW5fYXJyYXkoJG9yaWdpbiwgJHRoaXMtPmNvbmZpZy0+Z2V0KCdnaXRodWItZG9tYWlucycpLCB0cnVlKSkgewokZ2l0SHViVXRpbCA9IG5ldyBHaXRIdWIoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCBudWxsKTsKJG1lc3NhZ2UgPSAiXG4iOwoKJHJhdGVMaW1pdGVkID0gJGdpdEh1YlV0aWwtPmlzUmF0ZUxpbWl0ZWQoJGhlYWRlcnMpOwokcmVxdWlyZXNTc28gPSAkZ2l0SHViVXRpbC0+cmVxdWlyZXNTc28oJGhlYWRlcnMpOwoKaWYgKCRyZXF1aXJlc1Nzbykgewokc3NvVXJsID0gJGdpdEh1YlV0aWwtPmdldFNzb1VybCgkaGVhZGVycyk7CiRtZXNzYWdlID0gJ0dpdEh1YiBBUEkgdG9rZW4gcmVxdWlyZXMgU1NPIGF1dGhvcml6YXRpb24uIEF1dGhvcml6ZSB0aGlzIHRva2VuIGF0ICcgLiAkc3NvVXJsIC4gIlxuIjsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRtZXNzYWdlKTsKaWYgKCEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdDb3VsZCBub3QgYXV0aGVudGljYXRlIGFnYWluc3QgJyAuICRvcmlnaW4sIDQwMyk7Cn0KJHRoaXMtPmlvLT5hc2soJ0FmdGVyIGF1dGhvcml6aW5nIHlvdXIgdG9rZW4sIGNvbmZpcm0gdGhhdCB5b3Ugd291bGQgbGlrZSB0byByZXRyeSB0aGUgcmVxdWVzdCcpOwoKcmV0dXJuIFsncmV0cnknID0+IHRydWUsICdzdG9yZUF1dGgnID0+ICRzdG9yZUF1dGhdOwp9CgppZiAoJHJhdGVMaW1pdGVkKSB7CiRyYXRlTGltaXQgPSAkZ2l0SHViVXRpbC0+Z2V0UmF0ZUxpbWl0KCRoZWFkZXJzKTsKaWYgKCR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJG9yaWdpbikpIHsKJG1lc3NhZ2UgPSAnUmV2aWV3IHlvdXIgY29uZmlndXJlZCBHaXRIdWIgT0F1dGggdG9rZW4gb3IgZW50ZXIgYSBuZXcgb25lIHRvIGdvIG92ZXIgdGhlIEFQSSByYXRlIGxpbWl0Lic7Cn0gZWxzZSB7CiRtZXNzYWdlID0gJ0NyZWF0ZSBhIEdpdEh1YiBPQXV0aCB0b2tlbiB0byBnbyBvdmVyIHRoZSBBUEkgcmF0ZSBsaW1pdC4nOwp9CgokbWVzc2FnZSA9IHNwcmludGYoCidHaXRIdWIgQVBJIGxpbWl0ICglZCBjYWxscy9ocikgaXMgZXhoYXVzdGVkLCBjb3VsZCBub3QgZmV0Y2ggJy4kdXJsLicuICcuJG1lc3NhZ2UuJyBZb3UgY2FuIGFsc28gd2FpdCB1bnRpbCAlcyBmb3IgdGhlIHJhdGUgbGltaXQgdG8gcmVzZXQuJywKJHJhdGVMaW1pdFsnbGltaXQnXSwKJHJhdGVMaW1pdFsncmVzZXQnXQopLiJcbiI7Cn0gZWxzZSB7CgokZ2l0SHViQXBpTWVzc2FnZSA9IG51bGw7CmlmICgkcmVzcG9uc2VCb2R5ICE9PSBudWxsKSB7CiRkZWNvZGVkID0ganNvbl9kZWNvZGUoJHJlc3BvbnNlQm9keSwgdHJ1ZSk7CmlmIChpc19hcnJheSgkZGVjb2RlZCkgJiYgaXNzZXQoJGRlY29kZWRbJ21lc3NhZ2UnXSkgJiYgaXNfc3RyaW5nKCRkZWNvZGVkWydtZXNzYWdlJ10pKSB7CiRnaXRIdWJBcGlNZXNzYWdlID0gJGRlY29kZWRbJ21lc3NhZ2UnXTsKfQp9CgppZiAoJGdpdEh1YkFwaU1lc3NhZ2UgIT09IG51bGwpIHsKJG1lc3NhZ2UgLj0gJ0NvdWxkIG5vdCBmZXRjaCAnLiR1cmwuJzogJy4kZ2l0SHViQXBpTWVzc2FnZTsKfSBlbHNlIHsKJG1lc3NhZ2UgLj0gJ0NvdWxkIG5vdCBmZXRjaCAnLiR1cmwuJywgcGxlYXNlICc7CmlmICgkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCRvcmlnaW4pKSB7CiRtZXNzYWdlIC49ICdyZXZpZXcgeW91ciBjb25maWd1cmVkIEdpdEh1YiBPQXV0aCB0b2tlbiBvciBlbnRlciBhIG5ldyBvbmUgdG8gYWNjZXNzIHByaXZhdGUgcmVwb3MnOwp9IGVsc2UgewokbWVzc2FnZSAuPSAnY3JlYXRlIGEgR2l0SHViIE9BdXRoIHRva2VuIHRvIGFjY2VzcyBwcml2YXRlIHJlcG9zJzsKfQp9Cn0KCmlmICghJGdpdEh1YlV0aWwtPmF1dGhvcml6ZU9BdXRoKCRvcmlnaW4pCiYmICghJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkgfHwgISRnaXRIdWJVdGlsLT5hdXRob3JpemVPQXV0aEludGVyYWN0aXZlbHkoJG9yaWdpbiwgJG1lc3NhZ2UpKQopIHsKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignQ291bGQgbm90IGF1dGhlbnRpY2F0ZSBhZ2FpbnN0ICcuJG9yaWdpbiwgNDAxKTsKfQp9IGVsc2VpZiAoaW5fYXJyYXkoJG9yaWdpbiwgJHRoaXMtPmNvbmZpZy0+Z2V0KCdnaXRsYWItZG9tYWlucycpLCB0cnVlKSkgewokbWVzc2FnZSA9ICJcbiIuJ0NvdWxkIG5vdCBmZXRjaCAnLiR1cmwuJywgZW50ZXIgeW91ciAnIC4gJG9yaWdpbiAuICcgY3JlZGVudGlhbHMgJyAuKCRzdGF0dXNDb2RlID09PSA0MDEgPyAndG8gYWNjZXNzIHByaXZhdGUgcmVwb3MnIDogJ3RvIGdvIG92ZXIgdGhlIEFQSSByYXRlIGxpbWl0Jyk7CiRnaXRMYWJVdGlsID0gbmV3IEdpdExhYigkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsIG51bGwpOwoKJGF1dGggPSBudWxsOwppZiAoJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkb3JpZ2luKSkgewokYXV0aCA9ICR0aGlzLT5pby0+Z2V0QXV0aGVudGljYXRpb24oJG9yaWdpbik7CmlmIChpbl9hcnJheSgkYXV0aFsncGFzc3dvcmQnXSwgWydnaXRsYWItY2ktdG9rZW4nLCAncHJpdmF0ZS10b2tlbicsICdvYXV0aDInXSwgdHJ1ZSkpIHsKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbigiSW52YWxpZCBjcmVkZW50aWFscyBmb3IgJyIgLiAkdXJsIC4gIicsIGFib3J0aW5nLiIsICRzdGF0dXNDb2RlKTsKfQp9CgppZiAoISRnaXRMYWJVdGlsLT5hdXRob3JpemVPQXV0aCgkb3JpZ2luKQomJiAoISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpIHx8ICEkZ2l0TGFiVXRpbC0+YXV0aG9yaXplT0F1dGhJbnRlcmFjdGl2ZWx5KHBhcnNlX3VybCgkdXJsLCBQSFBfVVJMX1NDSEVNRSksICRvcmlnaW4sICRtZXNzYWdlKSkKKSB7CnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJ0NvdWxkIG5vdCBhdXRoZW50aWNhdGUgYWdhaW5zdCAnLiRvcmlnaW4sIDQwMSk7Cn0KCmlmICgkYXV0aCAhPT0gbnVsbCAmJiAkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCRvcmlnaW4pKSB7CmlmICgkYXV0aCA9PT0gJHRoaXMtPmlvLT5nZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luKSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCJJbnZhbGlkIGNyZWRlbnRpYWxzIGZvciAnIiAuICR1cmwgLiAiJywgYWJvcnRpbmcuIiwgJHN0YXR1c0NvZGUpOwp9Cn0KfSBlbHNlaWYgKCRvcmlnaW4gPT09ICdiaXRidWNrZXQub3JnJyB8fCAkb3JpZ2luID09PSAnYXBpLmJpdGJ1Y2tldC5vcmcnKSB7CiRhc2tGb3JPQXV0aFRva2VuID0gdHJ1ZTsKJG9yaWdpbiA9ICdiaXRidWNrZXQub3JnJzsKaWYgKCR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJG9yaWdpbikpIHsKJGF1dGggPSAkdGhpcy0+aW8tPmdldEF1dGhlbnRpY2F0aW9uKCRvcmlnaW4pOwppZiAoJGF1dGhbJ3VzZXJuYW1lJ10gIT09ICd4LXRva2VuLWF1dGgnKSB7CiRiaXRidWNrZXRVdGlsID0gbmV3IEJpdGJ1Y2tldCgkdGhpcy0+aW8sICR0aGlzLT5jb25maWcpOwokYWNjZXNzVG9rZW4gPSAkYml0YnVja2V0VXRpbC0+cmVxdWVzdFRva2VuKCRvcmlnaW4sICRhdXRoWyd1c2VybmFtZSddLCAkYXV0aFsncGFzc3dvcmQnXSk7CmlmICghZW1wdHkoJGFjY2Vzc1Rva2VuKSkgewokdGhpcy0+aW8tPnNldEF1dGhlbnRpY2F0aW9uKCRvcmlnaW4sICd4LXRva2VuLWF1dGgnLCAkYWNjZXNzVG9rZW4pOwokYXNrRm9yT0F1dGhUb2tlbiA9IGZhbHNlOwp9Cn0gZWxzZWlmICghaXNzZXQoJHRoaXMtPmJpdGJ1Y2tldFJldHJ5WyR1cmxdKSkgewoKCgokYXNrRm9yT0F1dGhUb2tlbiA9IGZhbHNlOwokdGhpcy0+Yml0YnVja2V0UmV0cnlbJHVybF0gPSB0cnVlOwp9IGVsc2Ugewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdDb3VsZCBub3QgYXV0aGVudGljYXRlIGFnYWluc3QgJyAuICRvcmlnaW4sIDQwMSk7Cn0KfQoKaWYgKCRhc2tGb3JPQXV0aFRva2VuKSB7CiRtZXNzYWdlID0gIlxuIi4nQ291bGQgbm90IGZldGNoICcgLiAkdXJsIC4gJywgcGxlYXNlIGNyZWF0ZSBhIGJpdGJ1Y2tldCBPQXV0aCB0b2tlbiB0byAnIC4gKCgkc3RhdHVzQ29kZSA9PT0gNDAxIHx8ICRzdGF0dXNDb2RlID09PSA0MDMpID8gJ2FjY2VzcyBwcml2YXRlIHJlcG9zJyA6ICdnbyBvdmVyIHRoZSBBUEkgcmF0ZSBsaW1pdCcpOwokYml0QnVja2V0VXRpbCA9IG5ldyBCaXRidWNrZXQoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnKTsKaWYgKCEkYml0QnVja2V0VXRpbC0+YXV0aG9yaXplT0F1dGgoJG9yaWdpbikKJiYgKCEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSB8fCAhJGJpdEJ1Y2tldFV0aWwtPmF1dGhvcml6ZU9BdXRoSW50ZXJhY3RpdmVseSgkb3JpZ2luLCAkbWVzc2FnZSkpCikgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdDb3VsZCBub3QgYXV0aGVudGljYXRlIGFnYWluc3QgJyAuICRvcmlnaW4sIDQwMSk7Cn0KfQp9IGVsc2UgewoKaWYgKCRzdGF0dXNDb2RlID09PSA0MDQpIHsKcmV0dXJuIFsncmV0cnknID0+IGZhbHNlLCAnc3RvcmVBdXRoJyA9PiBmYWxzZV07Cn0KCgppZiAoISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpKSB7CmlmICgkc3RhdHVzQ29kZSA9PT0gNDAxKSB7CiRtZXNzYWdlID0gIlRoZSAnIiAuICR1cmwgLiAiJyBVUkwgcmVxdWlyZWQgYXV0aGVudGljYXRpb24gKEhUVFAgNDAxKS5cbllvdSBtdXN0IGJlIHVzaW5nIHRoZSBpbnRlcmFjdGl2ZSBjb25zb2xlIHRvIGF1dGhlbnRpY2F0ZSI7Cn0gZWxzZWlmICgkc3RhdHVzQ29kZSA9PT0gNDAzKSB7CiRtZXNzYWdlID0gIlRoZSAnIiAuICR1cmwgLiAiJyBVUkwgY291bGQgbm90IGJlIGFjY2Vzc2VkIChIVFRQIDQwMyk6ICIgLiAkcmVhc29uOwp9IGVsc2UgewokbWVzc2FnZSA9ICJVbmtub3duIGVycm9yIGNvZGUgJyIgLiAkc3RhdHVzQ29kZSAuICInLCByZWFzb246ICIgLiAkcmVhc29uOwp9Cgp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCRtZXNzYWdlLCAkc3RhdHVzQ29kZSk7Cn0KCgppZiAoJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkb3JpZ2luKSkgewoKCmlmICgkcmV0cnlDb3VudCA9PT0gMCkgewpyZXR1cm4gWydyZXRyeScgPT4gdHJ1ZSwgJ3N0b3JlQXV0aCcgPT4gZmFsc2VdOwp9Cgp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCJJbnZhbGlkIGNyZWRlbnRpYWxzIChIVFRQICRzdGF0dXNDb2RlKSBmb3IgJyR1cmwnLCBhYm9ydGluZy4iLCAkc3RhdHVzQ29kZSk7Cn0KCiR0aGlzLT5pby0+d3JpdGVFcnJvcignICAgIEF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkICg8aW5mbz4nLiRvcmlnaW4uJzwvaW5mbz4pOicpOwokdXNlcm5hbWUgPSAkdGhpcy0+aW8tPmFzaygnICAgICAgVXNlcm5hbWU6ICcpOwokcGFzc3dvcmQgPSAkdGhpcy0+aW8tPmFza0FuZEhpZGVBbnN3ZXIoJyAgICAgIFBhc3N3b3JkOiAnKTsKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luLCAkdXNlcm5hbWUsICRwYXNzd29yZCk7CiRzdG9yZUF1dGggPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ3N0b3JlLWF1dGhzJyk7Cn0KCnJldHVybiBbJ3JldHJ5JyA9PiB0cnVlLCAnc3RvcmVBdXRoJyA9PiAkc3RvcmVBdXRoXTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRBdXRoZW50aWNhdGlvbkhlYWRlcihhcnJheSAkaGVhZGVycywgc3RyaW5nICRvcmlnaW4sIHN0cmluZyAkdXJsKTogYXJyYXkKewp0cmlnZ2VyX2Vycm9yKCdBdXRoSGVscGVyOjphZGRBdXRoZW50aWNhdGlvbkhlYWRlciBpcyBkZXByZWNhdGVkIHNpbmNlIENvbXBvc2VyIDIuOSB1c2UgYWRkQXV0aGVudGljYXRpb25PcHRpb25zIGluc3RlYWQuJywgRV9VU0VSX0RFUFJFQ0FURUQpOwoKJG9wdGlvbnMgPSBbJ2h0dHAnID0+IFsnaGVhZGVyJyA9PiAmJGhlYWRlcnNdXTsKJG9wdGlvbnMgPSAkdGhpcy0+YWRkQXV0aGVudGljYXRpb25PcHRpb25zKCRvcHRpb25zLCAkb3JpZ2luLCAkdXJsKTsKCnJldHVybiAkb3B0aW9uc1snaHR0cCddWydoZWFkZXInXTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkQXV0aGVudGljYXRpb25PcHRpb25zKGFycmF5ICRvcHRpb25zLCBzdHJpbmcgJG9yaWdpbiwgc3RyaW5nICR1cmwpOiBhcnJheQp7CmlmICghaXNzZXQoJG9wdGlvbnNbJ2h0dHAnXSkpIHsKJG9wdGlvbnNbJ2h0dHAnXSA9IFtdOwp9CmlmICghaXNzZXQoJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pKSB7CiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddID0gW107Cn0KJGhlYWRlcnMgPSAmJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ107CmlmICgkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCRvcmlnaW4pKSB7CiRhdXRoZW50aWNhdGlvbkRpc3BsYXlNZXNzYWdlID0gbnVsbDsKJGF1dGggPSAkdGhpcy0+aW8tPmdldEF1dGhlbnRpY2F0aW9uKCRvcmlnaW4pOwppZiAoJGF1dGhbJ3Bhc3N3b3JkJ10gPT09ICdiZWFyZXInKSB7CiRoZWFkZXJzW10gPSAnQXV0aG9yaXphdGlvbjogQmVhcmVyICcuJGF1dGhbJ3VzZXJuYW1lJ107Cn0gZWxzZWlmICgkYXV0aFsncGFzc3dvcmQnXSA9PT0gJ2N1c3RvbS1oZWFkZXJzJykgewoKJGN1c3RvbUhlYWRlcnMgPSBudWxsOwppZiAoaXNfc3RyaW5nKCRhdXRoWyd1c2VybmFtZSddKSkgewokY3VzdG9tSGVhZGVycyA9IGpzb25fZGVjb2RlKCRhdXRoWyd1c2VybmFtZSddLCB0cnVlKTsKfQppZiAoaXNfYXJyYXkoJGN1c3RvbUhlYWRlcnMpKSB7CmZvcmVhY2ggKCRjdXN0b21IZWFkZXJzIGFzICRoZWFkZXIpIHsKJGhlYWRlcnNbXSA9ICRoZWFkZXI7Cn0KJGF1dGhlbnRpY2F0aW9uRGlzcGxheU1lc3NhZ2UgPSAnVXNpbmcgY3VzdG9tIEhUVFAgaGVhZGVycyBmb3IgYXV0aGVudGljYXRpb24nOwp9Cn0gZWxzZWlmICgnZ2l0aHViLmNvbScgPT09ICRvcmlnaW4gJiYgJ3gtb2F1dGgtYmFzaWMnID09PSAkYXV0aFsncGFzc3dvcmQnXSkgewoKaWYgKFByZWc6OmlzTWF0Y2goJ3teaHR0cHM/Oi8vYXBpXC5naXRodWJcLmNvbS99JywgJHVybCkpIHsKJGhlYWRlcnNbXSA9ICdBdXRob3JpemF0aW9uOiB0b2tlbiAnLiRhdXRoWyd1c2VybmFtZSddOwokYXV0aGVudGljYXRpb25EaXNwbGF5TWVzc2FnZSA9ICdVc2luZyBHaXRIdWIgdG9rZW4gYXV0aGVudGljYXRpb24nOwp9Cn0gZWxzZWlmICgKaW5fYXJyYXkoJGF1dGhbJ3Bhc3N3b3JkJ10sIFsnb2F1dGgyJywgJ3ByaXZhdGUtdG9rZW4nLCAnZ2l0bGFiLWNpLXRva2VuJ10sIHRydWUpCiYmIGluX2FycmF5KCRvcmlnaW4sICR0aGlzLT5jb25maWctPmdldCgnZ2l0bGFiLWRvbWFpbnMnKSwgdHJ1ZSkKKSB7CmlmICgkYXV0aFsncGFzc3dvcmQnXSA9PT0gJ29hdXRoMicpIHsKJGhlYWRlcnNbXSA9ICdBdXRob3JpemF0aW9uOiBCZWFyZXIgJy4kYXV0aFsndXNlcm5hbWUnXTsKJGF1dGhlbnRpY2F0aW9uRGlzcGxheU1lc3NhZ2UgPSAnVXNpbmcgR2l0TGFiIE9BdXRoIHRva2VuIGF1dGhlbnRpY2F0aW9uJzsKfSBlbHNlIHsKJGhlYWRlcnNbXSA9ICdQUklWQVRFLVRPS0VOOiAnLiRhdXRoWyd1c2VybmFtZSddOwokYXV0aGVudGljYXRpb25EaXNwbGF5TWVzc2FnZSA9ICdVc2luZyBHaXRMYWIgcHJpdmF0ZSB0b2tlbiBhdXRoZW50aWNhdGlvbic7Cn0KfSBlbHNlaWYgKAonYml0YnVja2V0Lm9yZycgPT09ICRvcmlnaW4KJiYgJHVybCAhPT0gQml0YnVja2V0OjpPQVVUSDJfQUNDRVNTX1RPS0VOX1VSTAomJiAneC10b2tlbi1hdXRoJyA9PT0gJGF1dGhbJ3VzZXJuYW1lJ10KKSB7CmlmICghJHRoaXMtPmlzUHVibGljQml0QnVja2V0RG93bmxvYWQoJHVybCkpIHsKJGhlYWRlcnNbXSA9ICdBdXRob3JpemF0aW9uOiBCZWFyZXIgJyAuICRhdXRoWydwYXNzd29yZCddOwokYXV0aGVudGljYXRpb25EaXNwbGF5TWVzc2FnZSA9ICdVc2luZyBCaXRidWNrZXQgT0F1dGggdG9rZW4gYXV0aGVudGljYXRpb24nOwp9Cn0gZWxzZWlmICgnY2xpZW50LWNlcnRpZmljYXRlJyA9PT0gJGF1dGhbJ3VzZXJuYW1lJ10pIHsKJG9wdGlvbnNbJ3NzbCddID0gYXJyYXlfbWVyZ2UoJG9wdGlvbnNbJ3NzbCddID8/IFtdLCBqc29uX2RlY29kZSgoc3RyaW5nKSAkYXV0aFsncGFzc3dvcmQnXSwgdHJ1ZSkpOwokYXV0aGVudGljYXRpb25EaXNwbGF5TWVzc2FnZSA9ICdVc2luZyBTU0wgY2xpZW50IGNlcnRpZmljYXRlJzsKfSBlbHNlIHsKJGF1dGhTdHIgPSBiYXNlNjRfZW5jb2RlKCRhdXRoWyd1c2VybmFtZSddIC4gJzonIC4gJGF1dGhbJ3Bhc3N3b3JkJ10pOwokaGVhZGVyc1tdID0gJ0F1dGhvcml6YXRpb246IEJhc2ljICcuJGF1dGhTdHI7CiRhdXRoZW50aWNhdGlvbkRpc3BsYXlNZXNzYWdlID0gJ1VzaW5nIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb24gd2l0aCB1c2VybmFtZSAiJyAuICRhdXRoWyd1c2VybmFtZSddIC4gJyInOwp9CgppZiAoJGF1dGhlbnRpY2F0aW9uRGlzcGxheU1lc3NhZ2UgJiYgKCFpc3NldCgkdGhpcy0+ZGlzcGxheWVkT3JpZ2luQXV0aGVudGljYXRpb25zWyRvcmlnaW5dKSB8fCAkdGhpcy0+ZGlzcGxheWVkT3JpZ2luQXV0aGVudGljYXRpb25zWyRvcmlnaW5dICE9PSAkYXV0aGVudGljYXRpb25EaXNwbGF5TWVzc2FnZSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRhdXRoZW50aWNhdGlvbkRpc3BsYXlNZXNzYWdlLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwokdGhpcy0+ZGlzcGxheWVkT3JpZ2luQXV0aGVudGljYXRpb25zWyRvcmlnaW5dID0gJGF1dGhlbnRpY2F0aW9uRGlzcGxheU1lc3NhZ2U7Cn0KfSBlbHNlaWYgKGluX2FycmF5KCRvcmlnaW4sIFsnYXBpLmJpdGJ1Y2tldC5vcmcnLCAnYXBpLmdpdGh1Yi5jb20nXSwgdHJ1ZSkpIHsKcmV0dXJuICR0aGlzLT5hZGRBdXRoZW50aWNhdGlvbk9wdGlvbnMoJG9wdGlvbnMsIHN0cl9yZXBsYWNlKCdhcGkuJywgJycsICRvcmlnaW4pLCAkdXJsKTsKfQoKcmV0dXJuICRvcHRpb25zOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUHVibGljQml0QnVja2V0RG93bmxvYWQoc3RyaW5nICR1cmxUb0JpdEJ1Y2tldEZpbGUpOiBib29sCnsKJGRvbWFpbiA9IHBhcnNlX3VybCgkdXJsVG9CaXRCdWNrZXRGaWxlLCBQSFBfVVJMX0hPU1QpOwppZiAoc3RycG9zKCRkb21haW4sICdiaXRidWNrZXQub3JnJykgPT09IGZhbHNlKSB7CgoKcmV0dXJuIHRydWU7Cn0KCiRwYXRoID0gcGFyc2VfdXJsKCR1cmxUb0JpdEJ1Y2tldEZpbGUsIFBIUF9VUkxfUEFUSCk7CgoKCiRwYXRoUGFydHMgPSBleHBsb2RlKCcvJywgJHBhdGgpOwoKcmV0dXJuIGNvdW50KCRwYXRoUGFydHMpID49IDQgJiYgJHBhdGhQYXJ0c1szXSA9PT0gJ2Rvd25sb2Fkcyc7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxGYWN0b3J5Owp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKCgoKCmNsYXNzIEJpdGJ1Y2tldAp7Cgpwcml2YXRlICRpbzsKCnByaXZhdGUgJGNvbmZpZzsKCnByaXZhdGUgJHByb2Nlc3M7Cgpwcml2YXRlICRodHRwRG93bmxvYWRlcjsKCnByaXZhdGUgJHRva2VuID0gbnVsbDsKCnByaXZhdGUgJHRpbWU7CgpwdWJsaWMgY29uc3QgT0FVVEgyX0FDQ0VTU19UT0tFTl9VUkwgPSAnaHR0cHM6Ly9iaXRidWNrZXQub3JnL3NpdGUvb2F1dGgyL2FjY2Vzc190b2tlbic7CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgP1Byb2Nlc3NFeGVjdXRvciAkcHJvY2VzcyA9IG51bGwsID9IdHRwRG93bmxvYWRlciAkaHR0cERvd25sb2FkZXIgPSBudWxsLCA/aW50ICR0aW1lID0gbnVsbCkKewokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwokdGhpcy0+cHJvY2VzcyA9ICRwcm9jZXNzID86IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKJHRoaXMtPmh0dHBEb3dubG9hZGVyID0gJGh0dHBEb3dubG9hZGVyID86IEZhY3Rvcnk6OmNyZWF0ZUh0dHBEb3dubG9hZGVyKCR0aGlzLT5pbywgJGNvbmZpZyk7CiR0aGlzLT50aW1lID0gJHRpbWU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRUb2tlbigpOiBzdHJpbmcKewppZiAoIWlzc2V0KCR0aGlzLT50b2tlblsnYWNjZXNzX3Rva2VuJ10pKSB7CnJldHVybiAnJzsKfQoKcmV0dXJuICR0aGlzLT50b2tlblsnYWNjZXNzX3Rva2VuJ107Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhdXRob3JpemVPQXV0aChzdHJpbmcgJG9yaWdpblVybCk6IGJvb2wKewppZiAoJG9yaWdpblVybCAhPT0gJ2JpdGJ1Y2tldC5vcmcnKSB7CnJldHVybiBmYWxzZTsKfQoKCmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdjb25maWcnLCAnYml0YnVja2V0LmFjY2Vzc3Rva2VuJ10sICRvdXRwdXQpKSB7CiR0aGlzLT5pby0+c2V0QXV0aGVudGljYXRpb24oJG9yaWdpblVybCwgJ3gtdG9rZW4tYXV0aCcsIHRyaW0oJG91dHB1dCkpOwoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiByZXF1ZXN0QWNjZXNzVG9rZW4oKTogYm9vbAp7CnRyeSB7CiRyZXNwb25zZSA9ICR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KHNlbGY6Ok9BVVRIMl9BQ0NFU1NfVE9LRU5fVVJMLCBbCidyZXRyeS1hdXRoLWZhaWx1cmUnID0+IGZhbHNlLAonaHR0cCcgPT4gWwonbWV0aG9kJyA9PiAnUE9TVCcsCidjb250ZW50JyA9PiAnZ3JhbnRfdHlwZT1jbGllbnRfY3JlZGVudGlhbHMnLApdLApdKTsKCiR0b2tlbiA9ICRyZXNwb25zZS0+ZGVjb2RlSnNvbigpOwppZiAoIWlzc2V0KCR0b2tlblsnZXhwaXJlc19pbiddKSB8fCAhaXNzZXQoJHRva2VuWydhY2Nlc3NfdG9rZW4nXSkpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignRXhwZWN0ZWQgYSB0b2tlbiBjb25maWd1cmVkIHdpdGggZXhwaXJlc19pbiBhbmQgYWNjZXNzX3Rva2VuIHByZXNlbnQsIGdvdCAnLmpzb25fZW5jb2RlKCR0b2tlbikpOwp9CgokdGhpcy0+dG9rZW4gPSAkdG9rZW47Cn0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgewppZiAoJGUtPmdldENvZGUoKSA9PT0gNDAwKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPkludmFsaWQgT0F1dGggY29uc3VtZXIgcHJvdmlkZWQuPC9lcnJvcj4nKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdUaGlzIGNhbiBoYXZlIHRocmVlIHJlYXNvbnM6Jyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignMS4gWW91IGFyZSBhdXRoZW50aWNhdGluZyB3aXRoIGEgYml0YnVja2V0IHVzZXJuYW1lL3Bhc3N3b3JkIGNvbWJpbmF0aW9uJyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignMi4gWW91IGFyZSB1c2luZyBhbiBPQXV0aCBjb25zdW1lciwgYnV0IGRpZG5cJ3QgY29uZmlndXJlIGEgKGR1bW15KSBjYWxsYmFjayB1cmwnKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCczLiBZb3UgYXJlIHVzaW5nIGFuIE9BdXRoIGNvbnN1bWVyLCBidXQgZGlkblwndCBjb25maWd1cmUgaXQgYXMgcHJpdmF0ZSBjb25zdW1lcicpOwoKcmV0dXJuIGZhbHNlOwp9CmlmIChpbl9hcnJheSgkZS0+Z2V0Q29kZSgpLCBbNDAzLCA0MDFdKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj5JbnZhbGlkIE9BdXRoIGNvbnN1bWVyIHByb3ZpZGVkLjwvZXJyb3I+Jyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignWW91IGNhbiBhbHNvIGFkZCBpdCBtYW51YWxseSBsYXRlciBieSB1c2luZyAiY29tcG9zZXIgY29uZmlnIC0tZ2xvYmFsIC0tYXV0aCBiaXRidWNrZXQtb2F1dGguYml0YnVja2V0Lm9yZyA8Y29uc3VtZXIta2V5PiA8Y29uc3VtZXItc2VjcmV0PiInKTsKCnJldHVybiBmYWxzZTsKfQoKdGhyb3cgJGU7Cn0KCnJldHVybiB0cnVlOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXV0aG9yaXplT0F1dGhJbnRlcmFjdGl2ZWx5KHN0cmluZyAkb3JpZ2luVXJsLCA/c3RyaW5nICRtZXNzYWdlID0gbnVsbCk6IGJvb2wKewppZiAoJG1lc3NhZ2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRtZXNzYWdlKTsKfQoKJGxvY2FsQXV0aENvbmZpZyA9ICR0aGlzLT5jb25maWctPmdldExvY2FsQXV0aENvbmZpZ1NvdXJjZSgpOwokdXJsID0gJ2h0dHBzOi8vc3VwcG9ydC5hdGxhc3NpYW4uY29tL2JpdGJ1Y2tldC1jbG91ZC9kb2NzL3VzZS1vYXV0aC1vbi1iaXRidWNrZXQtY2xvdWQvJzsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdGb2xsb3cgdGhlIGluc3RydWN0aW9ucyBoZXJlOicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJHVybCk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCd0byBjcmVhdGUgYSBjb25zdW1lci4gSXQgd2lsbCBiZSBzdG9yZWQgaW4gIiVzIiBmb3IgZnV0dXJlIHVzZSBieSBDb21wb3Nlci4nLCAoJGxvY2FsQXV0aENvbmZpZyAhPT0gbnVsbCA/ICRsb2NhbEF1dGhDb25maWctPmdldE5hbWUoKSAuICcgT1IgJyA6ICcnKSAuICR0aGlzLT5jb25maWctPmdldEF1dGhDb25maWdTb3VyY2UoKS0+Z2V0TmFtZSgpKSk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignRW5zdXJlIHlvdSBlbnRlciBhICJDYWxsYmFjayBVUkwiIChodHRwOi8vZXhhbXBsZS5jb20gaXMgZmluZSkgb3IgaXQgd2lsbCBub3QgYmUgcG9zc2libGUgdG8gY3JlYXRlIGFuIEFjY2VzcyBUb2tlbiAodGhpcyBjYWxsYmFjayB1cmwgd2lsbCBub3QgYmUgdXNlZCBieSBjb21wb3NlciknKTsKCiRzdG9yZUluTG9jYWxBdXRoQ29uZmlnID0gZmFsc2U7CmlmICgkbG9jYWxBdXRoQ29uZmlnICE9PSBudWxsKSB7CiRzdG9yZUluTG9jYWxBdXRoQ29uZmlnID0gJHRoaXMtPmlvLT5hc2tDb25maXJtYXRpb24oJ0EgbG9jYWwgYXV0aCBjb25maWcgc291cmNlIHdhcyBmb3VuZCwgZG8geW91IHdhbnQgdG8gc3RvcmUgdGhlIHRva2VuIHRoZXJlPycsIHRydWUpOwp9CgokY29uc3VtZXJLZXkgPSB0cmltKChzdHJpbmcpICR0aGlzLT5pby0+YXNrQW5kSGlkZUFuc3dlcignQ29uc3VtZXIgS2V5IChoaWRkZW4pOiAnKSk7CgppZiAoISRjb25zdW1lcktleSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPk5vIGNvbnN1bWVyIGtleSBnaXZlbiwgYWJvcnRpbmcuPC93YXJuaW5nPicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1lvdSBjYW4gYWxzbyBhZGQgaXQgbWFudWFsbHkgbGF0ZXIgYnkgdXNpbmcgImNvbXBvc2VyIGNvbmZpZyAtLWdsb2JhbCAtLWF1dGggYml0YnVja2V0LW9hdXRoLmJpdGJ1Y2tldC5vcmcgPGNvbnN1bWVyLWtleT4gPGNvbnN1bWVyLXNlY3JldD4iJyk7CgpyZXR1cm4gZmFsc2U7Cn0KCiRjb25zdW1lclNlY3JldCA9IHRyaW0oKHN0cmluZykgJHRoaXMtPmlvLT5hc2tBbmRIaWRlQW5zd2VyKCdDb25zdW1lciBTZWNyZXQgKGhpZGRlbik6ICcpKTsKCmlmICghJGNvbnN1bWVyU2VjcmV0KSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Tm8gY29uc3VtZXIgc2VjcmV0IGdpdmVuLCBhYm9ydGluZy48L3dhcm5pbmc+Jyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignWW91IGNhbiBhbHNvIGFkZCBpdCBtYW51YWxseSBsYXRlciBieSB1c2luZyAiY29tcG9zZXIgY29uZmlnIC0tZ2xvYmFsIC0tYXV0aCBiaXRidWNrZXQtb2F1dGguYml0YnVja2V0Lm9yZyA8Y29uc3VtZXIta2V5PiA8Y29uc3VtZXItc2VjcmV0PiInKTsKCnJldHVybiBmYWxzZTsKfQoKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luVXJsLCAkY29uc3VtZXJLZXksICRjb25zdW1lclNlY3JldCk7CgppZiAoISR0aGlzLT5yZXF1ZXN0QWNjZXNzVG9rZW4oKSkgewpyZXR1cm4gZmFsc2U7Cn0KCgokYXV0aENvbmZpZ1NvdXJjZSA9ICRzdG9yZUluTG9jYWxBdXRoQ29uZmlnICYmICRsb2NhbEF1dGhDb25maWcgIT09IG51bGwgPyAkbG9jYWxBdXRoQ29uZmlnIDogJHRoaXMtPmNvbmZpZy0+Z2V0QXV0aENvbmZpZ1NvdXJjZSgpOwokdGhpcy0+c3RvcmVJbkF1dGhDb25maWcoJGF1dGhDb25maWdTb3VyY2UsICRvcmlnaW5VcmwsICRjb25zdW1lcktleSwgJGNvbnN1bWVyU2VjcmV0KTsKCgokdGhpcy0+Y29uZmlnLT5nZXRBdXRoQ29uZmlnU291cmNlKCktPnJlbW92ZUNvbmZpZ1NldHRpbmcoJ2h0dHAtYmFzaWMuJyAuICRvcmlnaW5VcmwpOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8aW5mbz5Db25zdW1lciBzdG9yZWQgc3VjY2Vzc2Z1bGx5LjwvaW5mbz4nKTsKCnJldHVybiB0cnVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVxdWVzdFRva2VuKHN0cmluZyAkb3JpZ2luVXJsLCBzdHJpbmcgJGNvbnN1bWVyS2V5LCBzdHJpbmcgJGNvbnN1bWVyU2VjcmV0KTogc3RyaW5nCnsKaWYgKCR0aGlzLT50b2tlbiAhPT0gbnVsbCB8fCAkdGhpcy0+Z2V0VG9rZW5Gcm9tQ29uZmlnKCRvcmlnaW5VcmwpKSB7CnJldHVybiAkdGhpcy0+dG9rZW5bJ2FjY2Vzc190b2tlbiddOwp9CgokdGhpcy0+aW8tPnNldEF1dGhlbnRpY2F0aW9uKCRvcmlnaW5VcmwsICRjb25zdW1lcktleSwgJGNvbnN1bWVyU2VjcmV0KTsKaWYgKCEkdGhpcy0+cmVxdWVzdEFjY2Vzc1Rva2VuKCkpIHsKcmV0dXJuICcnOwp9CgokdGhpcy0+c3RvcmVJbkF1dGhDb25maWcoJHRoaXMtPmNvbmZpZy0+Z2V0TG9jYWxBdXRoQ29uZmlnU291cmNlKCkgPz8gJHRoaXMtPmNvbmZpZy0+Z2V0QXV0aENvbmZpZ1NvdXJjZSgpLCAkb3JpZ2luVXJsLCAkY29uc3VtZXJLZXksICRjb25zdW1lclNlY3JldCk7CgppZiAoIWlzc2V0KCR0aGlzLT50b2tlblsnYWNjZXNzX3Rva2VuJ10pKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0ZhaWxlZCB0byBpbml0aWFsaXplIHRva2VuIGFib3ZlJyk7Cn0KCnJldHVybiAkdGhpcy0+dG9rZW5bJ2FjY2Vzc190b2tlbiddOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHN0b3JlSW5BdXRoQ29uZmlnKENvbmZpZ1xDb25maWdTb3VyY2VJbnRlcmZhY2UgJGF1dGhDb25maWdTb3VyY2UsIHN0cmluZyAkb3JpZ2luVXJsLCBzdHJpbmcgJGNvbnN1bWVyS2V5LCBzdHJpbmcgJGNvbnN1bWVyU2VjcmV0KTogdm9pZAp7CiR0aGlzLT5jb25maWctPmdldENvbmZpZ1NvdXJjZSgpLT5yZW1vdmVDb25maWdTZXR0aW5nKCdiaXRidWNrZXQtb2F1dGguJy4kb3JpZ2luVXJsKTsKCmlmIChudWxsID09PSAkdGhpcy0+dG9rZW4gfHwgIWlzc2V0KCR0aGlzLT50b2tlblsnZXhwaXJlc19pbiddKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdFeHBlY3RlZCBhIHRva2VuIGNvbmZpZ3VyZWQgd2l0aCBleHBpcmVzX2luIHByZXNlbnQsIGdvdCAnLmpzb25fZW5jb2RlKCR0aGlzLT50b2tlbikpOwp9CgokdGltZSA9IG51bGwgPT09ICR0aGlzLT50aW1lID8gdGltZSgpIDogJHRoaXMtPnRpbWU7CiRjb25zdW1lciA9IFsKImNvbnN1bWVyLWtleSIgPT4gJGNvbnN1bWVyS2V5LAoiY29uc3VtZXItc2VjcmV0IiA9PiAkY29uc3VtZXJTZWNyZXQsCiJhY2Nlc3MtdG9rZW4iID0+ICR0aGlzLT50b2tlblsnYWNjZXNzX3Rva2VuJ10sCiJhY2Nlc3MtdG9rZW4tZXhwaXJhdGlvbiIgPT4gJHRpbWUgKyAkdGhpcy0+dG9rZW5bJ2V4cGlyZXNfaW4nXSwKXTsKCiR0aGlzLT5jb25maWctPmdldEF1dGhDb25maWdTb3VyY2UoKS0+YWRkQ29uZmlnU2V0dGluZygnYml0YnVja2V0LW9hdXRoLicuJG9yaWdpblVybCwgJGNvbnN1bWVyKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRUb2tlbkZyb21Db25maWcoc3RyaW5nICRvcmlnaW5VcmwpOiBib29sCnsKJGF1dGhDb25maWcgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2JpdGJ1Y2tldC1vYXV0aCcpOwoKaWYgKAohaXNzZXQoJGF1dGhDb25maWdbJG9yaWdpblVybF1bJ2FjY2Vzcy10b2tlbiddLCAkYXV0aENvbmZpZ1skb3JpZ2luVXJsXVsnYWNjZXNzLXRva2VuLWV4cGlyYXRpb24nXSkKfHwgdGltZSgpID4gJGF1dGhDb25maWdbJG9yaWdpblVybF1bJ2FjY2Vzcy10b2tlbi1leHBpcmF0aW9uJ10KKSB7CnJldHVybiBmYWxzZTsKfQoKJHRoaXMtPnRva2VuID0gWwonYWNjZXNzX3Rva2VuJyA9PiAkYXV0aENvbmZpZ1skb3JpZ2luVXJsXVsnYWNjZXNzLXRva2VuJ10sCl07CgpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCgoKY2xhc3MgQ29tcG9zZXJNaXJyb3IKewoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcm9jZXNzVXJsKHN0cmluZyAkbWlycm9yVXJsLCBzdHJpbmcgJHBhY2thZ2VOYW1lLCBzdHJpbmcgJHZlcnNpb24sID9zdHJpbmcgJHJlZmVyZW5jZSwgP3N0cmluZyAkdHlwZSwgP3N0cmluZyAkcHJldHR5VmVyc2lvbiA9IG51bGwpOiBzdHJpbmcKewppZiAoJHJlZmVyZW5jZSkgewokcmVmZXJlbmNlID0gUHJlZzo6aXNNYXRjaCgne14oW2EtZjAtOV0qfCVyZWZlcmVuY2UlKSR9JywgJHJlZmVyZW5jZSkgPyAkcmVmZXJlbmNlIDogaGFzaCgnbWQ1JywgJHJlZmVyZW5jZSk7Cn0KJHZlcnNpb24gPSBzdHJwb3MoJHZlcnNpb24sICcvJykgPT09IGZhbHNlID8gJHZlcnNpb24gOiBoYXNoKCdtZDUnLCAkdmVyc2lvbik7CgokZnJvbSA9IFsnJXBhY2thZ2UlJywgJyV2ZXJzaW9uJScsICclcmVmZXJlbmNlJScsICcldHlwZSUnXTsKJHRvID0gWyRwYWNrYWdlTmFtZSwgJHZlcnNpb24sICRyZWZlcmVuY2UsICR0eXBlXTsKaWYgKG51bGwgIT09ICRwcmV0dHlWZXJzaW9uKSB7CiRmcm9tW10gPSAnJXByZXR0eVZlcnNpb24lJzsKJHRvW10gPSAkcHJldHR5VmVyc2lvbjsKfQoKJHVybCA9IHN0cl9yZXBsYWNlKCRmcm9tLCAkdG8sICRtaXJyb3JVcmwpOwphc3NlcnQoJHVybCAhPT0gJycpOwoKcmV0dXJuICR1cmw7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJvY2Vzc0dpdFVybChzdHJpbmcgJG1pcnJvclVybCwgc3RyaW5nICRwYWNrYWdlTmFtZSwgc3RyaW5nICR1cmwsID9zdHJpbmcgJHR5cGUpOiBzdHJpbmcKewppZiAoUHJlZzo6aXNNYXRjaCgnI14oPzooPzpodHRwcz98Z2l0KTovL2dpdGh1YlwuY29tL3xnaXRAZ2l0aHViXC5jb206KShbXi9dKykvKC4rPykoPzpcLmdpdCk/JCMnLCAkdXJsLCAkbWF0Y2gpKSB7CiR1cmwgPSAnZ2gtJy4kbWF0Y2hbMV0uJy8nLiRtYXRjaFsyXTsKfSBlbHNlaWYgKFByZWc6OmlzTWF0Y2goJyNeaHR0cHM6Ly9iaXRidWNrZXRcLm9yZy8oW14vXSspLyguKz8pKD86XC5naXQpPy8/JCMnLCAkdXJsLCAkbWF0Y2gpKSB7CiR1cmwgPSAnYmItJy4kbWF0Y2hbMV0uJy8nLiRtYXRjaFsyXTsKfSBlbHNlIHsKJHVybCA9IFByZWc6OnJlcGxhY2UoJ3tbXmEtejAtOV8uLV19aScsICctJywgdHJpbSgkdXJsLCAnLycpKTsKfQoKcmV0dXJuIHN0cl9yZXBsYWNlKApbJyVwYWNrYWdlJScsICclbm9ybWFsaXplZFVybCUnLCAnJXR5cGUlJ10sClskcGFja2FnZU5hbWUsICR1cmwsICR0eXBlXSwKJG1pcnJvclVybAopOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByb2Nlc3NIZ1VybChzdHJpbmcgJG1pcnJvclVybCwgc3RyaW5nICRwYWNrYWdlTmFtZSwgc3RyaW5nICR1cmwsIHN0cmluZyAkdHlwZSk6IHN0cmluZwp7CnJldHVybiBzZWxmOjpwcm9jZXNzR2l0VXJsKCRtaXJyb3JVcmwsICRwYWNrYWdlTmFtZSwgJHVybCwgJHR5cGUpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcQXJyYXlMb2FkZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxWYWxpZGF0aW5nQXJyYXlMb2FkZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxJbnZhbGlkUGFja2FnZUV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXEpzb25cSnNvblZhbGlkYXRpb25FeGNlcHRpb247CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxTcGR4XFNwZHhMaWNlbnNlczsKdXNlIFNlbGRcSnNvbkxpbnRcRHVwbGljYXRlS2V5RXhjZXB0aW9uOwp1c2UgU2VsZFxKc29uTGludFxKc29uUGFyc2VyOwoKCgoKCgoKY2xhc3MgQ29uZmlnVmFsaWRhdG9yCnsKcHVibGljIGNvbnN0IENIRUNLX1ZFUlNJT04gPSAxOwoKCnByaXZhdGUgJGlvOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbykKewokdGhpcy0+aW8gPSAkaW87Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZShzdHJpbmcgJGZpbGUsIGludCAkYXJyYXlMb2FkZXJWYWxpZGF0aW9uRmxhZ3MgPSBWYWxpZGF0aW5nQXJyYXlMb2FkZXI6OkNIRUNLX0FMTCwgaW50ICRmbGFncyA9IHNlbGY6OkNIRUNLX1ZFUlNJT04pOiBhcnJheQp7CiRlcnJvcnMgPSBbXTsKJHB1Ymxpc2hFcnJvcnMgPSBbXTsKJHdhcm5pbmdzID0gW107CgoKJGxheFZhbGlkID0gZmFsc2U7CiRtYW5pZmVzdCA9IG51bGw7CnRyeSB7CiRqc29uID0gbmV3IEpzb25GaWxlKCRmaWxlLCBudWxsLCAkdGhpcy0+aW8pOwokbWFuaWZlc3QgPSAkanNvbi0+cmVhZCgpOwoKJGpzb24tPnZhbGlkYXRlU2NoZW1hKEpzb25GaWxlOjpMQVhfU0NIRU1BKTsKJGxheFZhbGlkID0gdHJ1ZTsKJGpzb24tPnZhbGlkYXRlU2NoZW1hKCk7Cn0gY2F0Y2ggKEpzb25WYWxpZGF0aW9uRXhjZXB0aW9uICRlKSB7CmZvcmVhY2ggKCRlLT5nZXRFcnJvcnMoKSBhcyAkbWVzc2FnZSkgewppZiAoJGxheFZhbGlkKSB7CiRwdWJsaXNoRXJyb3JzW10gPSAkbWVzc2FnZTsKfSBlbHNlIHsKJGVycm9yc1tdID0gJG1lc3NhZ2U7Cn0KfQp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CiRlcnJvcnNbXSA9ICRlLT5nZXRNZXNzYWdlKCk7CgpyZXR1cm4gWyRlcnJvcnMsICRwdWJsaXNoRXJyb3JzLCAkd2FybmluZ3NdOwp9CgppZiAoaXNfYXJyYXkoJG1hbmlmZXN0KSkgewokanNvblBhcnNlciA9IG5ldyBKc29uUGFyc2VyKCk7CnRyeSB7CiRqc29uUGFyc2VyLT5wYXJzZSgoc3RyaW5nKSBmaWxlX2dldF9jb250ZW50cygkZmlsZSksIEpzb25QYXJzZXI6OkRFVEVDVF9LRVlfQ09ORkxJQ1RTKTsKfSBjYXRjaCAoRHVwbGljYXRlS2V5RXhjZXB0aW9uICRlKSB7CiRkZXRhaWxzID0gJGUtPmdldERldGFpbHMoKTsKJHdhcm5pbmdzW10gPSAnS2V5ICcuJGRldGFpbHNbJ2tleSddLicgaXMgYSBkdXBsaWNhdGUgaW4gJy4kZmlsZS4nIGF0IGxpbmUgJy4kZGV0YWlsc1snbGluZSddOwp9Cn0KCgppZiAoZW1wdHkoJG1hbmlmZXN0WydsaWNlbnNlJ10pKSB7CiR3YXJuaW5nc1tdID0gJ05vIGxpY2Vuc2Ugc3BlY2lmaWVkLCBpdCBpcyByZWNvbW1lbmRlZCB0byBkbyBzby4gRm9yIGNsb3NlZC1zb3VyY2Ugc29mdHdhcmUgeW91IG1heSB1c2UgInByb3ByaWV0YXJ5IiBhcyBsaWNlbnNlLic7Cn0gZWxzZSB7CiRsaWNlbnNlcyA9IChhcnJheSkgJG1hbmlmZXN0WydsaWNlbnNlJ107CgoKZm9yZWFjaCAoJGxpY2Vuc2VzIGFzICRrZXkgPT4gJGxpY2Vuc2UpIHsKaWYgKCdwcm9wcmlldGFyeScgPT09ICRsaWNlbnNlKSB7CnVuc2V0KCRsaWNlbnNlc1ska2V5XSk7Cn0KfQoKJGxpY2Vuc2VWYWxpZGF0b3IgPSBuZXcgU3BkeExpY2Vuc2VzKCk7CmZvcmVhY2ggKCRsaWNlbnNlcyBhcyAkbGljZW5zZSkgewokc3BkeExpY2Vuc2UgPSAkbGljZW5zZVZhbGlkYXRvci0+Z2V0TGljZW5zZUJ5SWRlbnRpZmllcigkbGljZW5zZSk7CmlmICgkc3BkeExpY2Vuc2UgJiYgJHNwZHhMaWNlbnNlWzNdKSB7CmlmIChQcmVnOjppc01hdGNoKCd7XltBTF0/R1BMLVsxMjNdKFwuWzAxXSk/XCskfWknLCAkbGljZW5zZSkpIHsKJHdhcm5pbmdzW10gPSBzcHJpbnRmKAonTGljZW5zZSAiJXMiIGlzIGEgZGVwcmVjYXRlZCBTUERYIGxpY2Vuc2UgaWRlbnRpZmllciwgdXNlICInLnN0cl9yZXBsYWNlKCcrJywgJycsICRsaWNlbnNlKS4nLW9yLWxhdGVyIiBpbnN0ZWFkJywKJGxpY2Vuc2UKKTsKfSBlbHNlaWYgKFByZWc6OmlzTWF0Y2goJ3teW0FMXT9HUEwtWzEyM10oXC5bMDFdKT8kfWknLCAkbGljZW5zZSkpIHsKJHdhcm5pbmdzW10gPSBzcHJpbnRmKAonTGljZW5zZSAiJXMiIGlzIGEgZGVwcmVjYXRlZCBTUERYIGxpY2Vuc2UgaWRlbnRpZmllciwgdXNlICInLiRsaWNlbnNlLictb25seSIgb3IgIicuJGxpY2Vuc2UuJy1vci1sYXRlciIgaW5zdGVhZCcsCiRsaWNlbnNlCik7Cn0gZWxzZSB7CiR3YXJuaW5nc1tdID0gc3ByaW50ZigKJ0xpY2Vuc2UgIiVzIiBpcyBhIGRlcHJlY2F0ZWQgU1BEWCBsaWNlbnNlIGlkZW50aWZpZXIsIHNlZSBodHRwczovL3NwZHgub3JnL2xpY2Vuc2VzLycsCiRsaWNlbnNlCik7Cn0KfQp9Cn0KCmlmICgoJGZsYWdzICYgc2VsZjo6Q0hFQ0tfVkVSU0lPTikgJiYgaXNzZXQoJG1hbmlmZXN0Wyd2ZXJzaW9uJ10pKSB7CiR3YXJuaW5nc1tdID0gJ1RoZSB2ZXJzaW9uIGZpZWxkIGlzIHByZXNlbnQsIGl0IGlzIHJlY29tbWVuZGVkIHRvIGxlYXZlIGl0IG91dCBpZiB0aGUgcGFja2FnZSBpcyBwdWJsaXNoZWQgb24gUGFja2FnaXN0Lic7Cn0KCmlmICghZW1wdHkoJG1hbmlmZXN0WyduYW1lJ10pICYmIFByZWc6OmlzTWF0Y2goJ3tbQS1aXX0nLCAkbWFuaWZlc3RbJ25hbWUnXSkpIHsKJHN1Z2dlc3ROYW1lID0gUHJlZzo6cmVwbGFjZSgneyg/OihbYS16XSkoW0EtWl0pfChbQS1aXSkoW0EtWl1bYS16XSkpfScsICdcXDFcXDMtXFwyXFw0JywgJG1hbmlmZXN0WyduYW1lJ10pOwokc3VnZ2VzdE5hbWUgPSBzdHJ0b2xvd2VyKCRzdWdnZXN0TmFtZSk7CgokcHVibGlzaEVycm9yc1tdID0gc3ByaW50ZigKJ05hbWUgIiVzIiBkb2VzIG5vdCBtYXRjaCB0aGUgYmVzdCBwcmFjdGljZSAoZS5nLiBsb3dlci1jYXNlZC93aXRoLWRhc2hlcykuIFdlIHN1Z2dlc3QgdXNpbmcgIiVzIiBpbnN0ZWFkLiBBcyBzdWNoIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIHN1Ym1pdCBpdCB0byBQYWNrYWdpc3QuJywKJG1hbmlmZXN0WyduYW1lJ10sCiRzdWdnZXN0TmFtZQopOwp9CgppZiAoIWVtcHR5KCRtYW5pZmVzdFsndHlwZSddKSAmJiAkbWFuaWZlc3RbJ3R5cGUnXSA9PT0gJ2NvbXBvc2VyLWluc3RhbGxlcicpIHsKJHdhcm5pbmdzW10gPSAiVGhlIHBhY2thZ2UgdHlwZSAnY29tcG9zZXItaW5zdGFsbGVyJyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgZGlzdHJpYnV0ZSB5b3VyIGN1c3RvbSBpbnN0YWxsZXJzIGFzIHBsdWdpbnMgZnJvbSBub3cgb24uIFNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvYXJ0aWNsZXMvcGx1Z2lucy5tZCBmb3IgcGx1Z2luIGRvY3VtZW50YXRpb24uIjsKfQoKCmlmIChpc3NldCgkbWFuaWZlc3RbJ3JlcXVpcmUnXSwgJG1hbmlmZXN0WydyZXF1aXJlLWRldiddKSkgewokcmVxdWlyZU92ZXJyaWRlcyA9IGFycmF5X2ludGVyc2VjdF9rZXkoJG1hbmlmZXN0WydyZXF1aXJlJ10sICRtYW5pZmVzdFsncmVxdWlyZS1kZXYnXSk7CgppZiAoIWVtcHR5KCRyZXF1aXJlT3ZlcnJpZGVzKSkgewokcGx1cmFsID0gKGNvdW50KCRyZXF1aXJlT3ZlcnJpZGVzKSA+IDEpID8gJ2FyZScgOiAnaXMnOwokd2FybmluZ3NbXSA9IGltcGxvZGUoJywgJywgYXJyYXlfa2V5cygkcmVxdWlyZU92ZXJyaWRlcykpLiAiIHskcGx1cmFsfSByZXF1aXJlZCBib3RoIGluIHJlcXVpcmUgYW5kIHJlcXVpcmUtZGV2LCB0aGlzIGNhbiBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3IiOwp9Cn0KCgpmb3JlYWNoIChbJ3Byb3ZpZGUnLCAncmVwbGFjZSddIGFzICRsaW5rVHlwZSkgewppZiAoaXNzZXQoJG1hbmlmZXN0WyRsaW5rVHlwZV0pKSB7CmZvcmVhY2ggKFsncmVxdWlyZScsICdyZXF1aXJlLWRldiddIGFzICRyZXF1aXJlVHlwZSkgewppZiAoaXNzZXQoJG1hbmlmZXN0WyRyZXF1aXJlVHlwZV0pKSB7CmZvcmVhY2ggKCRtYW5pZmVzdFskbGlua1R5cGVdIGFzICRwcm92aWRlID0+ICRjb25zdHJhaW50KSB7CmlmIChpc3NldCgkbWFuaWZlc3RbJHJlcXVpcmVUeXBlXVskcHJvdmlkZV0pKSB7CiR3YXJuaW5nc1tdID0gJ1RoZSBwYWNrYWdlICcgLiAkcHJvdmlkZSAuICcgaW4gJy4kcmVxdWlyZVR5cGUuJyBpcyBhbHNvIGxpc3RlZCBpbiAnLiRsaW5rVHlwZS4nIHdoaWNoIHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnQuIFJlbW92ZSBpdCBmcm9tICcuJGxpbmtUeXBlLicgaWYgeW91IHdpc2ggdG8gaW5zdGFsbCBpdC4nOwp9Cn0KfQp9Cn0KfQoKCiRyZXF1aXJlID0gJG1hbmlmZXN0WydyZXF1aXJlJ10gPz8gW107CiRyZXF1aXJlRGV2ID0gJG1hbmlmZXN0WydyZXF1aXJlLWRldiddID8/IFtdOwokcGFja2FnZXMgPSBhcnJheV9tZXJnZSgkcmVxdWlyZSwgJHJlcXVpcmVEZXYpOwpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UgPT4gJHZlcnNpb24pIHsKaWYgKFByZWc6OmlzTWF0Y2goJy8jLycsICR2ZXJzaW9uKSkgewokd2FybmluZ3NbXSA9IHNwcmludGYoCidUaGUgcGFja2FnZSAiJXMiIGlzIHBvaW50aW5nIHRvIGEgY29tbWl0LXJlZiwgdGhpcyBpcyBiYWQgcHJhY3RpY2UgYW5kIGNhbiBjYXVzZSB1bmZvcmVzZWVuIGlzc3Vlcy4nLAokcGFja2FnZQopOwp9Cn0KCgokc2NyaXB0c0Rlc2NyaXB0aW9ucyA9ICRtYW5pZmVzdFsnc2NyaXB0cy1kZXNjcmlwdGlvbnMnXSA/PyBbXTsKJHNjcmlwdHMgPSAkbWFuaWZlc3RbJ3NjcmlwdHMnXSA/PyBbXTsKZm9yZWFjaCAoJHNjcmlwdHNEZXNjcmlwdGlvbnMgYXMgJHNjcmlwdE5hbWUgPT4gJHNjcmlwdERlc2NyaXB0aW9uKSB7CmlmICghYXJyYXlfa2V5X2V4aXN0cygkc2NyaXB0TmFtZSwgJHNjcmlwdHMpKSB7CiR3YXJuaW5nc1tdID0gc3ByaW50ZigKJ0Rlc2NyaXB0aW9uIGZvciBub24tZXhpc3RlbnQgc2NyaXB0ICIlcyIgZm91bmQgaW4gInNjcmlwdHMtZGVzY3JpcHRpb25zIicsCiRzY3JpcHROYW1lCik7Cn0KfQoKCiRzY3JpcHRBbGlhc2VzID0gJG1hbmlmZXN0WydzY3JpcHRzLWFsaWFzZXMnXSA/PyBbXTsKZm9yZWFjaCAoJHNjcmlwdEFsaWFzZXMgYXMgJHNjcmlwdE5hbWUgPT4gJHNjcmlwdEFsaWFzKSB7CmlmICghYXJyYXlfa2V5X2V4aXN0cygkc2NyaXB0TmFtZSwgJHNjcmlwdHMpKSB7CiR3YXJuaW5nc1tdID0gc3ByaW50ZigKJ0FsaWFzZXMgZm9yIG5vbi1leGlzdGVudCBzY3JpcHQgIiVzIiBmb3VuZCBpbiAic2NyaXB0cy1hbGlhc2VzIicsCiRzY3JpcHROYW1lCik7Cn0KfQoKCmlmIChpc3NldCgkbWFuaWZlc3RbJ2F1dG9sb2FkJ11bJ3Bzci0wJ11bJyddKSkgewokd2FybmluZ3NbXSA9ICJEZWZpbmluZyBhdXRvbG9hZC5wc3ItMCB3aXRoIGFuIGVtcHR5IG5hbWVzcGFjZSBwcmVmaXggaXMgYSBiYWQgaWRlYSBmb3IgcGVyZm9ybWFuY2UiOwp9CmlmIChpc3NldCgkbWFuaWZlc3RbJ2F1dG9sb2FkJ11bJ3Bzci00J11bJyddKSkgewokd2FybmluZ3NbXSA9ICJEZWZpbmluZyBhdXRvbG9hZC5wc3ItNCB3aXRoIGFuIGVtcHR5IG5hbWVzcGFjZSBwcmVmaXggaXMgYSBiYWQgaWRlYSBmb3IgcGVyZm9ybWFuY2UiOwp9CgokbG9hZGVyID0gbmV3IFZhbGlkYXRpbmdBcnJheUxvYWRlcihuZXcgQXJyYXlMb2FkZXIoKSwgdHJ1ZSwgbnVsbCwgJGFycmF5TG9hZGVyVmFsaWRhdGlvbkZsYWdzKTsKdHJ5IHsKaWYgKCFpc3NldCgkbWFuaWZlc3RbJ3ZlcnNpb24nXSkpIHsKJG1hbmlmZXN0Wyd2ZXJzaW9uJ10gPSAnMS4wLjAnOwp9CmlmICghaXNzZXQoJG1hbmlmZXN0WyduYW1lJ10pKSB7CiRtYW5pZmVzdFsnbmFtZSddID0gJ2R1bW15L2R1bW15JzsKfQokbG9hZGVyLT5sb2FkKCRtYW5pZmVzdCk7Cn0gY2F0Y2ggKEludmFsaWRQYWNrYWdlRXhjZXB0aW9uICRlKSB7CiRlcnJvcnMgPSBhcnJheV9tZXJnZSgkZXJyb3JzLCAkZS0+Z2V0RXJyb3JzKCkpOwp9Cgokd2FybmluZ3MgPSBhcnJheV9tZXJnZSgkd2FybmluZ3MsICRsb2FkZXItPmdldFdhcm5pbmdzKCkpOwoKcmV0dXJuIFskZXJyb3JzLCAkcHVibGlzaEVycm9ycywgJHdhcm5pbmdzXTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBFcnJvckhhbmRsZXIKewoKcHJpdmF0ZSBzdGF0aWMgJGlvOwoKCnByaXZhdGUgc3RhdGljICRoYXNTaG93bkRlcHJlY2F0aW9uTm90aWNlID0gMDsKCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBoYW5kbGUoaW50ICRsZXZlbCwgc3RyaW5nICRtZXNzYWdlLCBzdHJpbmcgJGZpbGUsIGludCAkbGluZSk6IGJvb2wKewokaXNEZXByZWNhdGlvbk5vdGljZSA9ICRsZXZlbCA9PT0gRV9ERVBSRUNBVEVEIHx8ICRsZXZlbCA9PT0gRV9VU0VSX0RFUFJFQ0FURUQ7CgoKaWYgKCEkaXNEZXByZWNhdGlvbk5vdGljZSAmJiAwID09PSAoZXJyb3JfcmVwb3J0aW5nKCkgJiAkbGV2ZWwpKSB7CnJldHVybiB0cnVlOwp9CgppZiAoZmlsdGVyX3ZhcihpbmlfZ2V0KCd4ZGVidWcuc2NyZWFtJyksIEZJTFRFUl9WQUxJREFURV9CT09MRUFOKSkgewokbWVzc2FnZSAuPSAiXG5cbldhcm5pbmc6IFlvdSBoYXZlIHhkZWJ1Zy5zY3JlYW0gZW5hYmxlZCwgdGhlIHdhcm5pbmcgYWJvdmUgbWF5IGJlIi4KIlxuYSBsZWdpdGltYXRlbHkgc3VwcHJlc3NlZCBlcnJvciB0aGF0IHlvdSB3ZXJlIG5vdCBzdXBwb3NlZCB0byBzZWUuIjsKfQoKaWYgKCEkaXNEZXByZWNhdGlvbk5vdGljZSkgewoKCmlmIChpbl9hcnJheSgkbGV2ZWwsIFtFX1dBUk5JTkcsIEVfVVNFUl9XQVJOSU5HXSwgdHJ1ZSkgJiYgc3RyX2NvbnRhaW5zKCRtZXNzYWdlLCAnc2hvdWxkIGVpdGhlciBiZSB1c2VkIG9yIGludGVudGlvbmFsbHkgaWdub3JlZCBieSBjYXN0aW5nIGl0IGFzICh2b2lkKScpKSB7CnNlbGY6Om91dHB1dFdhcm5pbmcoJ0lnbm9yZWQgbmV3IFBIUCB3YXJuaW5nIGJ1dCBpdCBzaG91bGQgYmUgcmVwb3J0ZWQgYW5kIGZpeGVkOiAnLiRtZXNzYWdlLicgaW4gJy4kZmlsZS4nOicuJGxpbmUsIHRydWUpOwoKcmV0dXJuIHRydWU7Cn0KCnRocm93IG5ldyBcRXJyb3JFeGNlcHRpb24oJG1lc3NhZ2UsIDAsICRsZXZlbCwgJGZpbGUsICRsaW5lKTsKfQoKaWYgKHNlbGY6OiRpbyAhPT0gbnVsbCkgewppZiAoc2VsZjo6JGhhc1Nob3duRGVwcmVjYXRpb25Ob3RpY2UgPiAwICYmICFzZWxmOjokaW8tPmlzVmVyYm9zZSgpKSB7CmlmIChzZWxmOjokaGFzU2hvd25EZXByZWNhdGlvbk5vdGljZSA9PT0gMSkgewpzZWxmOjokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPk1vcmUgZGVwcmVjYXRpb24gbm90aWNlcyB3ZXJlIGhpZGRlbiwgcnVuIGFnYWluIHdpdGggYC12YCB0byBzaG93IHRoZW0uPC93YXJuaW5nPicpOwpzZWxmOjokaGFzU2hvd25EZXByZWNhdGlvbk5vdGljZSA9IDI7Cn0KCnJldHVybiB0cnVlOwp9CnNlbGY6OiRoYXNTaG93bkRlcHJlY2F0aW9uTm90aWNlID0gMTsKc2VsZjo6b3V0cHV0V2FybmluZygnRGVwcmVjYXRpb24gTm90aWNlOiAnLiRtZXNzYWdlLicgaW4gJy4kZmlsZS4nOicuJGxpbmUpOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZWdpc3Rlcig/SU9JbnRlcmZhY2UgJGlvID0gbnVsbCk6IHZvaWQKewpzZXRfZXJyb3JfaGFuZGxlcihbX19DTEFTU19fLCAnaGFuZGxlJ10pOwplcnJvcl9yZXBvcnRpbmcoRV9BTEwpOwpzZWxmOjokaW8gPSAkaW87Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIG91dHB1dFdhcm5pbmcoc3RyaW5nICRtZXNzYWdlLCBib29sICRvdXRwdXRFdmVuV2l0aG91dElPID0gZmFsc2UpOiB2b2lkCnsKaWYgKHNlbGY6OiRpbyAhPT0gbnVsbCkgewpzZWxmOjokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPicuJG1lc3NhZ2UuJzwvd2FybmluZz4nKTsKaWYgKHNlbGY6OiRpby0+aXNWZXJib3NlKCkpIHsKc2VsZjo6JGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5TdGFjayB0cmFjZTo8L3dhcm5pbmc+Jyk7CnNlbGY6OiRpby0+d3JpdGVFcnJvcihhcnJheV9maWx0ZXIoYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGEpOiA/c3RyaW5nIHsKaWYgKGlzc2V0KCRhWydsaW5lJ10sICRhWydmaWxlJ10pKSB7CnJldHVybiAnPHdhcm5pbmc+ICcuJGFbJ2ZpbGUnXS4nOicuJGFbJ2xpbmUnXS4nPC93YXJuaW5nPic7Cn0KCnJldHVybiBudWxsOwp9LCBhcnJheV9zbGljZShkZWJ1Z19iYWNrdHJhY2UoKSwgMikpLCBzdGF0aWMgZnVuY3Rpb24gKD9zdHJpbmcgJGxpbmUpIHsKcmV0dXJuICRsaW5lICE9PSBudWxsOwp9KSk7Cn0KCnJldHVybjsKfQoKaWYgKCRvdXRwdXRFdmVuV2l0aG91dElPKSB7CmlmIChkZWZpbmVkKCdTVERFUlInKSAmJiBpc19yZXNvdXJjZShTVERFUlIpKSB7CmZ3cml0ZShTVERFUlIsICdXYXJuaW5nOiAnLiRtZXNzYWdlLlBIUF9FT0wpOwp9IGVsc2UgewplY2hvICdXYXJuaW5nOiAnLiRtZXNzYWdlLlBIUF9FT0w7Cn0KfQp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgRXJyb3JFeGNlcHRpb247CnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcjsKdXNlIFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaWxlc3lzdGVtXEV4Y2VwdGlvblxJT0V4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxGaW5kZXI7CgoKCgoKY2xhc3MgRmlsZXN5c3RlbQp7Cgpwcml2YXRlICRwcm9jZXNzRXhlY3V0b3I7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP1Byb2Nlc3NFeGVjdXRvciAkZXhlY3V0b3IgPSBudWxsKQp7CiR0aGlzLT5wcm9jZXNzRXhlY3V0b3IgPSAkZXhlY3V0b3I7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmUoc3RyaW5nICRmaWxlKQp7CmlmIChpc19kaXIoJGZpbGUpKSB7CnJldHVybiAkdGhpcy0+cmVtb3ZlRGlyZWN0b3J5KCRmaWxlKTsKfQoKaWYgKGZpbGVfZXhpc3RzKCRmaWxlKSkgewpyZXR1cm4gJHRoaXMtPnVubGluaygkZmlsZSk7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEaXJFbXB0eShzdHJpbmcgJGRpcikKewokZmluZGVyID0gRmluZGVyOjpjcmVhdGUoKQotPmlnbm9yZVZDUyhmYWxzZSkKLT5pZ25vcmVEb3RGaWxlcyhmYWxzZSkKLT5kZXB0aCgwKQotPmluKCRkaXIpOwoKcmV0dXJuIFxjb3VudCgkZmluZGVyKSA9PT0gMDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGVtcHR5RGlyZWN0b3J5KHN0cmluZyAkZGlyLCBib29sICRlbnN1cmVEaXJlY3RvcnlFeGlzdHMgPSB0cnVlKQp7CmlmIChpc19saW5rKCRkaXIpICYmIGZpbGVfZXhpc3RzKCRkaXIpKSB7CiR0aGlzLT51bmxpbmsoJGRpcik7Cn0KCmlmICgkZW5zdXJlRGlyZWN0b3J5RXhpc3RzKSB7CiR0aGlzLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoJGRpcik7Cn0KCmlmIChpc19kaXIoJGRpcikpIHsKJGZpbmRlciA9IEZpbmRlcjo6Y3JlYXRlKCkKLT5pZ25vcmVWQ1MoZmFsc2UpCi0+aWdub3JlRG90RmlsZXMoZmFsc2UpCi0+ZGVwdGgoMCkKLT5pbigkZGlyKTsKCmZvcmVhY2ggKCRmaW5kZXIgYXMgJHBhdGgpIHsKJHRoaXMtPnJlbW92ZSgoc3RyaW5nKSAkcGF0aCk7Cn0KfQp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlRGlyZWN0b3J5KHN0cmluZyAkZGlyZWN0b3J5KQp7CiRlZGdlQ2FzZVJlc3VsdCA9ICR0aGlzLT5yZW1vdmVFZGdlQ2FzZXMoJGRpcmVjdG9yeSk7CmlmICgkZWRnZUNhc2VSZXN1bHQgIT09IG51bGwpIHsKcmV0dXJuICRlZGdlQ2FzZVJlc3VsdDsKfQoKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewokY21kID0gWydybWRpcicsICcvUycsICcvUScsIFBsYXRmb3JtOjpyZWFscGF0aCgkZGlyZWN0b3J5KV07Cn0gZWxzZSB7CiRjbWQgPSBbJ3JtJywgJy1yZicsICRkaXJlY3RvcnldOwp9CgokcmVzdWx0ID0gJHRoaXMtPmdldFByb2Nlc3MoKS0+ZXhlY3V0ZSgkY21kLCAkb3V0cHV0KSA9PT0gMDsKCgpjbGVhcnN0YXRjYWNoZSgpOwoKaWYgKCRyZXN1bHQgJiYgIWlzX2RpcigkZGlyZWN0b3J5KSkgewpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuICR0aGlzLT5yZW1vdmVEaXJlY3RvcnlQaHAoJGRpcmVjdG9yeSk7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlRGlyZWN0b3J5QXN5bmMoc3RyaW5nICRkaXJlY3RvcnkpCnsKJGVkZ2VDYXNlUmVzdWx0ID0gJHRoaXMtPnJlbW92ZUVkZ2VDYXNlcygkZGlyZWN0b3J5KTsKaWYgKCRlZGdlQ2FzZVJlc3VsdCAhPT0gbnVsbCkgewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZSgkZWRnZUNhc2VSZXN1bHQpOwp9CgppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CiRjbWQgPSBbJ3JtZGlyJywgJy9TJywgJy9RJywgUGxhdGZvcm06OnJlYWxwYXRoKCRkaXJlY3RvcnkpXTsKfSBlbHNlIHsKJGNtZCA9IFsncm0nLCAnLXJmJywgJGRpcmVjdG9yeV07Cn0KCiRwcm9taXNlID0gJHRoaXMtPmdldFByb2Nlc3MoKS0+ZXhlY3V0ZUFzeW5jKCRjbWQpOwoKcmV0dXJuICRwcm9taXNlLT50aGVuKGZ1bmN0aW9uICgkcHJvY2VzcykgdXNlICgkZGlyZWN0b3J5KSB7CgpjbGVhcnN0YXRjYWNoZSgpOwoKaWYgKCRwcm9jZXNzLT5pc1N1Y2Nlc3NmdWwoKSkgewppZiAoIWlzX2RpcigkZGlyZWN0b3J5KSkgewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZSh0cnVlKTsKfQp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZSgkdGhpcy0+cmVtb3ZlRGlyZWN0b3J5UGhwKCRkaXJlY3RvcnkpKTsKfSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVtb3ZlRWRnZUNhc2VzKHN0cmluZyAkZGlyZWN0b3J5LCBib29sICRmYWxsYmFja1RvUGhwID0gdHJ1ZSk6ID9ib29sCnsKaWYgKCR0aGlzLT5pc1N5bWxpbmtlZERpcmVjdG9yeSgkZGlyZWN0b3J5KSkgewpyZXR1cm4gJHRoaXMtPnVubGlua1N5bWxpbmtlZERpcmVjdG9yeSgkZGlyZWN0b3J5KTsKfQoKaWYgKCR0aGlzLT5pc0p1bmN0aW9uKCRkaXJlY3RvcnkpKSB7CnJldHVybiAkdGhpcy0+cmVtb3ZlSnVuY3Rpb24oJGRpcmVjdG9yeSk7Cn0KCmlmIChpc19saW5rKCRkaXJlY3RvcnkpKSB7CnJldHVybiB1bmxpbmsoJGRpcmVjdG9yeSk7Cn0KCmlmICghaXNfZGlyKCRkaXJlY3RvcnkpIHx8ICFmaWxlX2V4aXN0cygkZGlyZWN0b3J5KSkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKFByZWc6OmlzTWF0Y2goJ3teKD86W2Etel06KT9bL1xcXFxdKyR9aScsICRkaXJlY3RvcnkpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQWJvcnRpbmcgYW4gYXR0ZW1wdGVkIGRlbGV0aW9uIG9mICcuJGRpcmVjdG9yeS4nLCB0aGlzIHdhcyBwcm9iYWJseSBub3QgaW50ZW5kZWQsIGlmIGl0IGlzIGEgcmVhbCB1c2UgY2FzZSBwbGVhc2UgcmVwb3J0IGl0LicpOwp9CgppZiAoIVxmdW5jdGlvbl9leGlzdHMoJ3Byb2Nfb3BlbicpICYmICRmYWxsYmFja1RvUGhwKSB7CnJldHVybiAkdGhpcy0+cmVtb3ZlRGlyZWN0b3J5UGhwKCRkaXJlY3RvcnkpOwp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZURpcmVjdG9yeVBocChzdHJpbmcgJGRpcmVjdG9yeSkKewokZWRnZUNhc2VSZXN1bHQgPSAkdGhpcy0+cmVtb3ZlRWRnZUNhc2VzKCRkaXJlY3RvcnksIGZhbHNlKTsKaWYgKCRlZGdlQ2FzZVJlc3VsdCAhPT0gbnVsbCkgewpyZXR1cm4gJGVkZ2VDYXNlUmVzdWx0Owp9Cgp0cnkgewokaXQgPSBuZXcgUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IoJGRpcmVjdG9yeSwgUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3I6OlNLSVBfRE9UUyk7Cn0gY2F0Y2ggKFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24gJGUpIHsKCgpjbGVhcnN0YXRjYWNoZSgpOwp1c2xlZXAoMTAwMDAwKTsKaWYgKCFpc19kaXIoJGRpcmVjdG9yeSkpIHsKcmV0dXJuIHRydWU7Cn0KJGl0ID0gbmV3IFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRkaXJlY3RvcnksIFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yOjpTS0lQX0RPVFMpOwp9CiRyaSA9IG5ldyBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKCRpdCwgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcjo6Q0hJTERfRklSU1QpOwoKZm9yZWFjaCAoJHJpIGFzICRmaWxlKSB7CmlmICgkZmlsZS0+aXNEaXIoKSkgewokdGhpcy0+cm1kaXIoJGZpbGUtPmdldFBhdGhuYW1lKCkpOwp9IGVsc2UgewokdGhpcy0+dW5saW5rKCRmaWxlLT5nZXRQYXRobmFtZSgpKTsKfQp9CgoKdW5zZXQoJHJpLCAkaXQsICRmaWxlKTsKCnJldHVybiAkdGhpcy0+cm1kaXIoJGRpcmVjdG9yeSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBlbnN1cmVEaXJlY3RvcnlFeGlzdHMoc3RyaW5nICRkaXJlY3RvcnkpCnsKaWYgKCFpc19kaXIoJGRpcmVjdG9yeSkpIHsKaWYgKGZpbGVfZXhpc3RzKCRkaXJlY3RvcnkpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigKJGRpcmVjdG9yeS4nIGV4aXN0cyBhbmQgaXMgbm90IGEgZGlyZWN0b3J5LicKKTsKfQoKaWYgKGlzX2xpbmsoJGRpcmVjdG9yeSkgJiYgIUAkdGhpcy0+dW5saW5rSW1wbGVtZW50YXRpb24oJGRpcmVjdG9yeSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgZGVsZXRlIHN5bWJvbGljIGxpbmsgJy4kZGlyZWN0b3J5Lic6ICcuKGVycm9yX2dldF9sYXN0KClbJ21lc3NhZ2UnXSA/PyAnJykpOwp9CgppZiAoIUBta2RpcigkZGlyZWN0b3J5LCAwNzc3LCB0cnVlKSkgewokZSA9IG5ldyBcUnVudGltZUV4Y2VwdGlvbigkZGlyZWN0b3J5LicgZG9lcyBub3QgZXhpc3QgYW5kIGNvdWxkIG5vdCBiZSBjcmVhdGVkOiAnLihlcnJvcl9nZXRfbGFzdCgpWydtZXNzYWdlJ10gPz8gJycpKTsKCgoKCgokbm9ybWFsaXplZCA9ICR0aGlzLT5ub3JtYWxpemVQYXRoKCRkaXJlY3RvcnkpOwppZiAoJG5vcm1hbGl6ZWQgIT09ICRkaXJlY3RvcnkpIHsKdHJ5IHsKJHRoaXMtPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkbm9ybWFsaXplZCk7CgpyZXR1cm47Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGlnbm9yZWRFeCkgewp9Cn0KCnRocm93ICRlOwp9Cn0KfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHVubGluayhzdHJpbmcgJHBhdGgpCnsKJHVubGlua2VkID0gQCR0aGlzLT51bmxpbmtJbXBsZW1lbnRhdGlvbigkcGF0aCk7CmlmICghJHVubGlua2VkKSB7CgppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CnVzbGVlcCgzNTAwMDApOwokdW5saW5rZWQgPSBAJHRoaXMtPnVubGlua0ltcGxlbWVudGF0aW9uKCRwYXRoKTsKfQoKaWYgKCEkdW5saW5rZWQpIHsKJGVycm9yID0gZXJyb3JfZ2V0X2xhc3QoKTsKJG1lc3NhZ2UgPSAnQ291bGQgbm90IGRlbGV0ZSAnLiRwYXRoLic6ICcgLiAoJGVycm9yWydtZXNzYWdlJ10gPz8gJycpOwppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CiRtZXNzYWdlIC49ICJcblRoaXMgY2FuIGJlIGR1ZSB0byBhbiBhbnRpdmlydXMgb3IgdGhlIFdpbmRvd3MgU2VhcmNoIEluZGV4ZXIgbG9ja2luZyB0aGUgZmlsZSB3aGlsZSB0aGV5IGFyZSBhbmFseXplZCI7Cn0KCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigkbWVzc2FnZSk7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBybWRpcihzdHJpbmcgJHBhdGgpCnsKJGRlbGV0ZWQgPSBAcm1kaXIoJHBhdGgpOwppZiAoISRkZWxldGVkKSB7CgppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CnVzbGVlcCgzNTAwMDApOwokZGVsZXRlZCA9IEBybWRpcigkcGF0aCk7Cn0KCmlmICghJGRlbGV0ZWQpIHsKJGVycm9yID0gZXJyb3JfZ2V0X2xhc3QoKTsKJG1lc3NhZ2UgPSAnQ291bGQgbm90IGRlbGV0ZSAnLiRwYXRoLic6ICcgLiAoJGVycm9yWydtZXNzYWdlJ10gPz8gJycpOwppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CiRtZXNzYWdlIC49ICJcblRoaXMgY2FuIGJlIGR1ZSB0byBhbiBhbnRpdmlydXMgb3IgdGhlIFdpbmRvd3MgU2VhcmNoIEluZGV4ZXIgbG9ja2luZyB0aGUgZmlsZSB3aGlsZSB0aGV5IGFyZSBhbmFseXplZCI7Cn0KCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigkbWVzc2FnZSk7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvcHlUaGVuUmVtb3ZlKHN0cmluZyAkc291cmNlLCBzdHJpbmcgJHRhcmdldCkKewokdGhpcy0+Y29weSgkc291cmNlLCAkdGFyZ2V0KTsKaWYgKCFpc19kaXIoJHNvdXJjZSkpIHsKJHRoaXMtPnVubGluaygkc291cmNlKTsKCnJldHVybjsKfQoKJHRoaXMtPnJlbW92ZURpcmVjdG9yeVBocCgkc291cmNlKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29weShzdHJpbmcgJHNvdXJjZSwgc3RyaW5nICR0YXJnZXQpCnsKCiR0YXJnZXQgPSAkdGhpcy0+bm9ybWFsaXplUGF0aCgkdGFyZ2V0KTsKCmlmICghaXNfZGlyKCRzb3VyY2UpKSB7CnRyeSB7CnJldHVybiBjb3B5KCRzb3VyY2UsICR0YXJnZXQpOwp9IGNhdGNoIChFcnJvckV4Y2VwdGlvbiAkZSkgewoKCmlmIChzdHJfY29udGFpbnMoJGUtPmdldE1lc3NhZ2UoKSwgJ0JhZCBhZGRyZXNzJykpIHsKJHNvdXJjZUhhbmRsZSA9IGZvcGVuKCRzb3VyY2UsICdyJyk7CiR0YXJnZXRIYW5kbGUgPSBmb3BlbigkdGFyZ2V0LCAndycpOwppZiAoZmFsc2UgPT09ICRzb3VyY2VIYW5kbGUgfHwgZmFsc2UgPT09ICR0YXJnZXRIYW5kbGUpIHsKdGhyb3cgJGU7Cn0Kd2hpbGUgKCFmZW9mKCRzb3VyY2VIYW5kbGUpKSB7CmlmIChmYWxzZSA9PT0gZndyaXRlKCR0YXJnZXRIYW5kbGUsIChzdHJpbmcpIGZyZWFkKCRzb3VyY2VIYW5kbGUsIDEwMjQgKiAxMDI0KSkpIHsKdGhyb3cgJGU7Cn0KfQpmY2xvc2UoJHNvdXJjZUhhbmRsZSk7CmZjbG9zZSgkdGFyZ2V0SGFuZGxlKTsKCnJldHVybiB0cnVlOwp9CnRocm93ICRlOwp9Cn0KCiRpdCA9IG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkc291cmNlLCBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcjo6U0tJUF9ET1RTKTsKJHJpID0gbmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoJGl0LCBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yOjpTRUxGX0ZJUlNUKTsKJHRoaXMtPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkdGFyZ2V0KTsKCiRyZXN1bHQgPSB0cnVlOwpmb3JlYWNoICgkcmkgYXMgJGZpbGUpIHsKJHRhcmdldFBhdGggPSAkdGFyZ2V0IC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRyaS0+Z2V0U3ViUGF0aG5hbWUoKTsKaWYgKCRmaWxlLT5pc0RpcigpKSB7CiR0aGlzLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoJHRhcmdldFBhdGgpOwp9IGVsc2UgewokcmVzdWx0ID0gJHJlc3VsdCAmJiBjb3B5KCRmaWxlLT5nZXRQYXRobmFtZSgpLCAkdGFyZ2V0UGF0aCk7Cn0KfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZW5hbWUoc3RyaW5nICRzb3VyY2UsIHN0cmluZyAkdGFyZ2V0KQp7CmlmICh0cnVlID09PSBAcmVuYW1lKCRzb3VyY2UsICR0YXJnZXQpKSB7CnJldHVybjsKfQoKaWYgKCFcZnVuY3Rpb25fZXhpc3RzKCdwcm9jX29wZW4nKSkgewokdGhpcy0+Y29weVRoZW5SZW1vdmUoJHNvdXJjZSwgJHRhcmdldCk7CgpyZXR1cm47Cn0KCmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKCiRyZXN1bHQgPSAkdGhpcy0+Z2V0UHJvY2VzcygpLT5leGVjdXRlKFsneGNvcHknLCAkc291cmNlLCAkdGFyZ2V0LCAnL0UnLCAnL0knLCAnL1EnLCAnL1knXSwgJG91dHB1dCk7CgoKY2xlYXJzdGF0Y2FjaGUoKTsKCmlmICgwID09PSAkcmVzdWx0KSB7CiR0aGlzLT5yZW1vdmUoJHNvdXJjZSk7CgpyZXR1cm47Cn0KfSBlbHNlIHsKCgokcmVzdWx0ID0gJHRoaXMtPmdldFByb2Nlc3MoKS0+ZXhlY3V0ZShbJ212JywgJHNvdXJjZSwgJHRhcmdldF0sICRvdXRwdXQpOwoKCmNsZWFyc3RhdGNhY2hlKCk7CgppZiAoMCA9PT0gJHJlc3VsdCkgewpyZXR1cm47Cn0KfQoKJHRoaXMtPmNvcHlUaGVuUmVtb3ZlKCRzb3VyY2UsICR0YXJnZXQpOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kU2hvcnRlc3RQYXRoKHN0cmluZyAkZnJvbSwgc3RyaW5nICR0bywgYm9vbCAkZGlyZWN0b3JpZXMgPSBmYWxzZSwgYm9vbCAkcHJlZmVyUmVsYXRpdmUgPSBmYWxzZSkKewppZiAoISR0aGlzLT5pc0Fic29sdXRlUGF0aCgkZnJvbSkgfHwgISR0aGlzLT5pc0Fic29sdXRlUGF0aCgkdG8pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJyRmcm9tICglcykgYW5kICR0byAoJXMpIG11c3QgYmUgYWJzb2x1dGUgcGF0aHMuJywgJGZyb20sICR0bykpOwp9CgokZnJvbSA9ICR0aGlzLT5ub3JtYWxpemVQYXRoKCRmcm9tKTsKJHRvID0gJHRoaXMtPm5vcm1hbGl6ZVBhdGgoJHRvKTsKCmlmICgkZGlyZWN0b3JpZXMpIHsKJGZyb20gPSBydHJpbSgkZnJvbSwgJy8nKSAuICcvZHVtbXlfZmlsZSc7Cn0KCmlmIChcZGlybmFtZSgkZnJvbSkgPT09IFxkaXJuYW1lKCR0bykpIHsKcmV0dXJuICcuLycuYmFzZW5hbWUoJHRvKTsKfQoKJGNvbW1vblBhdGggPSAkdG87CndoaWxlIChzdHJwb3MoJGZyb20uJy8nLCAkY29tbW9uUGF0aC4nLycpICE9PSAwICYmICcvJyAhPT0gJGNvbW1vblBhdGggJiYgIVByZWc6OmlzTWF0Y2goJ3teW0EtWl06Lz8kfWknLCAkY29tbW9uUGF0aCkpIHsKJGNvbW1vblBhdGggPSBzdHJ0cihcZGlybmFtZSgkY29tbW9uUGF0aCksICdcXCcsICcvJyk7Cn0KCgppZiAoMCAhPT0gc3RycG9zKCRmcm9tLCAkY29tbW9uUGF0aCkpIHsKcmV0dXJuICR0bzsKfQoKJGNvbW1vblBhdGggPSBydHJpbSgkY29tbW9uUGF0aCwgJy8nKSAuICcvJzsKJHNvdXJjZVBhdGhEZXB0aCA9IHN1YnN0cl9jb3VudCgoc3RyaW5nKSBzdWJzdHIoJGZyb20sIFxzdHJsZW4oJGNvbW1vblBhdGgpKSwgJy8nKTsKJGNvbW1vblBhdGhDb2RlID0gc3RyX3JlcGVhdCgnLi4vJywgJHNvdXJjZVBhdGhEZXB0aCk7CgoKaWYgKCEkcHJlZmVyUmVsYXRpdmUgJiYgJy8nID09PSAkY29tbW9uUGF0aCAmJiAkc291cmNlUGF0aERlcHRoID4gMSkgewpyZXR1cm4gJHRvOwp9CgokcmVzdWx0ID0gJGNvbW1vblBhdGhDb2RlIC4gc3Vic3RyKCR0bywgXHN0cmxlbigkY29tbW9uUGF0aCkpOwppZiAoXHN0cmxlbigkcmVzdWx0KSA9PT0gMCkgewpyZXR1cm4gJy4vJzsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmRTaG9ydGVzdFBhdGhDb2RlKHN0cmluZyAkZnJvbSwgc3RyaW5nICR0bywgYm9vbCAkZGlyZWN0b3JpZXMgPSBmYWxzZSwgYm9vbCAkc3RhdGljQ29kZSA9IGZhbHNlLCBib29sICRwcmVmZXJSZWxhdGl2ZSA9IGZhbHNlKQp7CmlmICghJHRoaXMtPmlzQWJzb2x1dGVQYXRoKCRmcm9tKSB8fCAhJHRoaXMtPmlzQWJzb2x1dGVQYXRoKCR0bykpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignJGZyb20gKCVzKSBhbmQgJHRvICglcykgbXVzdCBiZSBhYnNvbHV0ZSBwYXRocy4nLCAkZnJvbSwgJHRvKSk7Cn0KCiRmcm9tID0gJHRoaXMtPm5vcm1hbGl6ZVBhdGgoJGZyb20pOwokdG8gPSAkdGhpcy0+bm9ybWFsaXplUGF0aCgkdG8pOwoKaWYgKCRmcm9tID09PSAkdG8pIHsKcmV0dXJuICRkaXJlY3RvcmllcyA/ICdfX0RJUl9fJyA6ICdfX0ZJTEVfXyc7Cn0KCiRjb21tb25QYXRoID0gJHRvOwp3aGlsZSAoc3RycG9zKCRmcm9tLicvJywgJGNvbW1vblBhdGguJy8nKSAhPT0gMCAmJiAnLycgIT09ICRjb21tb25QYXRoICYmICFQcmVnOjppc01hdGNoKCd7XltBLVpdOi8/JH1pJywgJGNvbW1vblBhdGgpICYmICcuJyAhPT0gJGNvbW1vblBhdGgpIHsKJGNvbW1vblBhdGggPSBzdHJ0cihcZGlybmFtZSgkY29tbW9uUGF0aCksICdcXCcsICcvJyk7Cn0KCgppZiAoMCAhPT0gc3RycG9zKCRmcm9tLCAkY29tbW9uUGF0aCkgfHwgJy4nID09PSAkY29tbW9uUGF0aCkgewpyZXR1cm4gdmFyX2V4cG9ydCgkdG8sIHRydWUpOwp9CgokY29tbW9uUGF0aCA9IHJ0cmltKCRjb21tb25QYXRoLCAnLycpIC4gJy8nOwppZiAoc3RyX3N0YXJ0c193aXRoKCR0bywgJGZyb20uJy8nKSkgewpyZXR1cm4gJ19fRElSX18gLiAnLnZhcl9leHBvcnQoKHN0cmluZykgc3Vic3RyKCR0bywgXHN0cmxlbigkZnJvbSkpLCB0cnVlKTsKfQokc291cmNlUGF0aERlcHRoID0gc3Vic3RyX2NvdW50KChzdHJpbmcpIHN1YnN0cigkZnJvbSwgXHN0cmxlbigkY29tbW9uUGF0aCkpLCAnLycpICsgKGludCkgJGRpcmVjdG9yaWVzOwoKCmlmICghJHByZWZlclJlbGF0aXZlICYmICcvJyA9PT0gJGNvbW1vblBhdGggJiYgJHNvdXJjZVBhdGhEZXB0aCA+IDEpIHsKcmV0dXJuIHZhcl9leHBvcnQoJHRvLCB0cnVlKTsKfQoKaWYgKCRzdGF0aWNDb2RlKSB7CiRjb21tb25QYXRoQ29kZSA9ICJfX0RJUl9fIC4gJyIuc3RyX3JlcGVhdCgnLy4uJywgJHNvdXJjZVBhdGhEZXB0aCkuIiciOwp9IGVsc2UgewokY29tbW9uUGF0aENvZGUgPSBzdHJfcmVwZWF0KCdkaXJuYW1lKCcsICRzb3VyY2VQYXRoRGVwdGgpLidfX0RJUl9fJy5zdHJfcmVwZWF0KCcpJywgJHNvdXJjZVBhdGhEZXB0aCk7Cn0KJHJlbFRhcmdldCA9IChzdHJpbmcpIHN1YnN0cigkdG8sIFxzdHJsZW4oJGNvbW1vblBhdGgpKTsKCnJldHVybiAkY29tbW9uUGF0aENvZGUgLiAoXHN0cmxlbigkcmVsVGFyZ2V0KSA+IDAgPyAnLicgLiB2YXJfZXhwb3J0KCcvJyAuICRyZWxUYXJnZXQsIHRydWUpIDogJycpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0Fic29sdXRlUGF0aChzdHJpbmcgJHBhdGgpCnsKcmV0dXJuIHN0cnBvcygkcGF0aCwgJy8nKSA9PT0gMCB8fCBzdWJzdHIoJHBhdGgsIDEsIDEpID09PSAnOicgfHwgc3RycG9zKCRwYXRoLCAnXFxcXCcpID09PSAwOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzaXplKHN0cmluZyAkcGF0aCkKewppZiAoIWZpbGVfZXhpc3RzKCRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIiRwYXRoIGRvZXMgbm90IGV4aXN0LiIpOwp9CmlmIChpc19kaXIoJHBhdGgpKSB7CnJldHVybiAkdGhpcy0+ZGlyZWN0b3J5U2l6ZSgkcGF0aCk7Cn0KCnJldHVybiAoaW50KSBmaWxlc2l6ZSgkcGF0aCk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChzdHJpbmcgJHBhdGgpCnsKJHBhcnRzID0gW107CiRwYXRoID0gc3RydHIoJHBhdGgsICdcXCcsICcvJyk7CiRwcmVmaXggPSAnJzsKJGFic29sdXRlID0gJyc7CgoKaWYgKHN0cnBvcygkcGF0aCwgJy8vJykgPT09IDAgJiYgXHN0cmxlbigkcGF0aCkgPiAyKSB7CiRhYnNvbHV0ZSA9ICcvLyc7CiRwYXRoID0gc3Vic3RyKCRwYXRoLCAyKTsKfQoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XiggWzAtOWEtel17Mix9KzogKD86IC8vICg/OiBbYS16XTogKT8gKT8gfCBbYS16XTogKX1peCcsICRwYXRoLCAkbWF0Y2gpKSB7CiRwcmVmaXggPSAkbWF0Y2hbMV07CiRwYXRoID0gc3Vic3RyKCRwYXRoLCBcc3RybGVuKCRwcmVmaXgpKTsKfQoKaWYgKHN0cnBvcygkcGF0aCwgJy8nKSA9PT0gMCkgewokYWJzb2x1dGUgPSAnLyc7CiRwYXRoID0gc3Vic3RyKCRwYXRoLCAxKTsKfQoKJHVwID0gZmFsc2U7CmZvcmVhY2ggKGV4cGxvZGUoJy8nLCAkcGF0aCkgYXMgJGNodW5rKSB7CmlmICgnLi4nID09PSAkY2h1bmsgJiYgKFxzdHJsZW4oJGFic29sdXRlKSA+IDAgfHwgJHVwKSkgewphcnJheV9wb3AoJHBhcnRzKTsKJHVwID0gIShcY291bnQoJHBhcnRzKSA9PT0gMCB8fCAnLi4nID09PSBlbmQoJHBhcnRzKSk7Cn0gZWxzZWlmICgnLicgIT09ICRjaHVuayAmJiAnJyAhPT0gJGNodW5rKSB7CiRwYXJ0c1tdID0gJGNodW5rOwokdXAgPSAnLi4nICE9PSAkY2h1bms7Cn0KfQoKCiRwcmVmaXggPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJ3soXnw6Ly8pW2Etel06JH1pJywgc3RhdGljIGZ1bmN0aW9uIChhcnJheSAkbSkgewpyZXR1cm4gc3RydG91cHBlcigkbVswXSk7Cn0sICRwcmVmaXgpOwoKcmV0dXJuICRwcmVmaXguJGFic29sdXRlLmltcGxvZGUoJy8nLCAkcGFydHMpOwp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0cmltVHJhaWxpbmdTbGFzaChzdHJpbmcgJHBhdGgpCnsKaWYgKCFQcmVnOjppc01hdGNoKCd7XlsvXFxcXF0rJH0nLCAkcGF0aCkpIHsKJHBhdGggPSBydHJpbSgkcGF0aCwgJy9cXCcpOwp9CgpyZXR1cm4gJHBhdGg7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0xvY2FsUGF0aChzdHJpbmcgJHBhdGgpCnsKCgppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CnJldHVybiBQcmVnOjppc01hdGNoKCd7XihmaWxlOi8vKD8hLy8pfC8oPyEvKXwvP1thLXpdOltcXFxcL118XC5cLltcXFxcL118W2EtejAtOV8uLV0rW1xcXFwvXSl9aScsICRwYXRoKTsKfQoKcmV0dXJuIFByZWc6OmlzTWF0Y2goJ3teKGZpbGU6Ly98L3wvP1thLXpdOltcXFxcL118XC5cLltcXFxcL118W2EtejAtOV8uLV0rW1xcXFwvXSl9aScsICRwYXRoKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRQbGF0Zm9ybVBhdGgoc3RyaW5nICRwYXRoKQp7CmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKJHBhdGggPSBQcmVnOjpyZXBsYWNlKCd7Xig/OmZpbGU6Ly8vKFthLXpdKTo/Lyl9aScsICdmaWxlOi8vJDE6LycsICRwYXRoKTsKfQoKcmV0dXJuIFByZWc6OnJlcGxhY2UoJ3teZmlsZTovL31pJywgJycsICRwYXRoKTsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzUmVhZGFibGUoc3RyaW5nICRwYXRoKQp7CmlmIChpc19yZWFkYWJsZSgkcGF0aCkpIHsKcmV0dXJuIHRydWU7Cn0KCmlmIChpc19maWxlKCRwYXRoKSkgewpyZXR1cm4gZmFsc2UgIT09IFNpbGVuY2VyOjpjYWxsKCdmaWxlX2dldF9jb250ZW50cycsICRwYXRoLCBmYWxzZSwgbnVsbCwgMCwgMSk7Cn0KCmlmIChpc19kaXIoJHBhdGgpKSB7CnJldHVybiBmYWxzZSAhPT0gU2lsZW5jZXI6OmNhbGwoJ29wZW5kaXInLCAkcGF0aCk7Cn0KCgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkaXJlY3RvcnlTaXplKHN0cmluZyAkZGlyZWN0b3J5KQp7CiRpdCA9IG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkZGlyZWN0b3J5LCBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcjo6U0tJUF9ET1RTKTsKJHJpID0gbmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoJGl0LCBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yOjpDSElMRF9GSVJTVCk7Cgokc2l6ZSA9IDA7CmZvcmVhY2ggKCRyaSBhcyAkZmlsZSkgewppZiAoJGZpbGUtPmlzRmlsZSgpKSB7CiRzaXplICs9ICRmaWxlLT5nZXRTaXplKCk7Cn0KfQoKcmV0dXJuICRzaXplOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UHJvY2VzcygpCnsKaWYgKG51bGwgPT09ICR0aGlzLT5wcm9jZXNzRXhlY3V0b3IpIHsKJHRoaXMtPnByb2Nlc3NFeGVjdXRvciA9IG5ldyBQcm9jZXNzRXhlY3V0b3IoKTsKfQoKcmV0dXJuICR0aGlzLT5wcm9jZXNzRXhlY3V0b3I7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB1bmxpbmtJbXBsZW1lbnRhdGlvbihzdHJpbmcgJHBhdGgpOiBib29sCnsKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiBpc19kaXIoJHBhdGgpICYmIGlzX2xpbmsoJHBhdGgpKSB7CnJldHVybiBybWRpcigkcGF0aCk7Cn0KCnJldHVybiB1bmxpbmsoJHBhdGgpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbGF0aXZlU3ltbGluayhzdHJpbmcgJHRhcmdldCwgc3RyaW5nICRsaW5rKQp7CmlmICghZnVuY3Rpb25fZXhpc3RzKCdzeW1saW5rJykpIHsKcmV0dXJuIGZhbHNlOwp9CgokY3dkID0gUGxhdGZvcm06OmdldEN3ZCgpOwoKJHJlbGF0aXZlUGF0aCA9ICR0aGlzLT5maW5kU2hvcnRlc3RQYXRoKCRsaW5rLCAkdGFyZ2V0KTsKY2hkaXIoXGRpcm5hbWUoJGxpbmspKTsKJHJlc3VsdCA9IEBzeW1saW5rKCRyZWxhdGl2ZVBhdGgsICRsaW5rKTsKCmNoZGlyKCRjd2QpOwoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzU3ltbGlua2VkRGlyZWN0b3J5KHN0cmluZyAkZGlyZWN0b3J5KQp7CmlmICghaXNfZGlyKCRkaXJlY3RvcnkpKSB7CnJldHVybiBmYWxzZTsKfQoKJHJlc29sdmVkID0gJHRoaXMtPnJlc29sdmVTeW1saW5rZWREaXJlY3RvcnlTeW1saW5rKCRkaXJlY3RvcnkpOwoKcmV0dXJuIGlzX2xpbmsoJHJlc29sdmVkKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiB1bmxpbmtTeW1saW5rZWREaXJlY3Rvcnkoc3RyaW5nICRkaXJlY3RvcnkpOiBib29sCnsKJHJlc29sdmVkID0gJHRoaXMtPnJlc29sdmVTeW1saW5rZWREaXJlY3RvcnlTeW1saW5rKCRkaXJlY3RvcnkpOwoKcmV0dXJuICR0aGlzLT51bmxpbmsoJHJlc29sdmVkKTsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVzb2x2ZVN5bWxpbmtlZERpcmVjdG9yeVN5bWxpbmsoc3RyaW5nICRwYXRobmFtZSk6IHN0cmluZwp7CmlmICghaXNfZGlyKCRwYXRobmFtZSkpIHsKcmV0dXJuICRwYXRobmFtZTsKfQoKJHJlc29sdmVkID0gcnRyaW0oJHBhdGhuYW1lLCAnLycpOwoKaWYgKDAgPT09IFxzdHJsZW4oJHJlc29sdmVkKSkgewpyZXR1cm4gJHBhdGhuYW1lOwp9CgpyZXR1cm4gJHJlc29sdmVkOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBqdW5jdGlvbihzdHJpbmcgJHRhcmdldCwgc3RyaW5nICRqdW5jdGlvbikKewppZiAoIVBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ0Z1bmN0aW9uICVzIGlzIG5vdCBhdmFpbGFibGUgb24gbm9uLVdpbmRvd3MgcGxhdGZvcm0nLCBfX0NMQVNTX18pKTsKfQppZiAoIWlzX2RpcigkdGFyZ2V0KSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignQ2Fubm90IGp1bmN0aW9uIHRvICIlcyIgYXMgaXQgaXMgbm90IGEgZGlyZWN0b3J5LicsICR0YXJnZXQpLCAwLCBudWxsLCAkdGFyZ2V0KTsKfQoKCmlmICghaXNfZGlyKCRqdW5jdGlvbikgfHwgJHRoaXMtPmlzSnVuY3Rpb24oJGp1bmN0aW9uKSkgewpAcm1kaXIoJGp1bmN0aW9uKTsKfQoKJGNtZCA9IFsnbWtsaW5rJywgJy9KJywgc3RyX3JlcGxhY2UoJy8nLCBESVJFQ1RPUllfU0VQQVJBVE9SLCAkanVuY3Rpb24pLCBQbGF0Zm9ybTo6cmVhbHBhdGgoJHRhcmdldCldOwppZiAoJHRoaXMtPmdldFByb2Nlc3MoKS0+ZXhlY3V0ZSgkY21kLCAkb3V0cHV0KSAhPT0gMCkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIGNyZWF0ZSBqdW5jdGlvbiB0byAiJXMiIGF0ICIlcyIuJywgJHRhcmdldCwgJGp1bmN0aW9uKSwgMCwgbnVsbCwgJHRhcmdldCk7Cn0KY2xlYXJzdGF0Y2FjaGUodHJ1ZSwgJGp1bmN0aW9uKTsKfQoKCgoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNKdW5jdGlvbihzdHJpbmcgJGp1bmN0aW9uKQp7CmlmICghUGxhdGZvcm06OmlzV2luZG93cygpKSB7CnJldHVybiBmYWxzZTsKfQoKCmNsZWFyc3RhdGNhY2hlKHRydWUsICRqdW5jdGlvbik7CgppZiAoIWlzX2RpcigkanVuY3Rpb24pIHx8IGlzX2xpbmsoJGp1bmN0aW9uKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRzdGF0ID0gbHN0YXQoJGp1bmN0aW9uKTsKCgpyZXR1cm4gaXNfYXJyYXkoJHN0YXQpID8gMHg0MDAwICE9PSAoJHN0YXRbJ21vZGUnXSAmIDB4RjAwMCkgOiBmYWxzZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlSnVuY3Rpb24oc3RyaW5nICRqdW5jdGlvbikKewppZiAoIVBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewpyZXR1cm4gZmFsc2U7Cn0KJGp1bmN0aW9uID0gcnRyaW0oc3RyX3JlcGxhY2UoJy8nLCBESVJFQ1RPUllfU0VQQVJBVE9SLCAkanVuY3Rpb24pLCBESVJFQ1RPUllfU0VQQVJBVE9SKTsKaWYgKCEkdGhpcy0+aXNKdW5jdGlvbigkanVuY3Rpb24pKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCclcyBpcyBub3QgYSBqdW5jdGlvbiBhbmQgdGh1cyBjYW5ub3QgYmUgcmVtb3ZlZCBhcyBvbmUnLCAkanVuY3Rpb24pKTsKfQoKcmV0dXJuICR0aGlzLT5ybWRpcigkanVuY3Rpb24pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZmlsZVB1dENvbnRlbnRzSWZNb2RpZmllZChzdHJpbmcgJHBhdGgsIHN0cmluZyAkY29udGVudCkKewokY3VycmVudENvbnRlbnQgPSBTaWxlbmNlcjo6Y2FsbCgnZmlsZV9nZXRfY29udGVudHMnLCAkcGF0aCk7CmlmIChmYWxzZSA9PT0gJGN1cnJlbnRDb250ZW50IHx8ICRjdXJyZW50Q29udGVudCAhPT0gJGNvbnRlbnQpIHsKcmV0dXJuIGZpbGVfcHV0X2NvbnRlbnRzKCRwYXRoLCAkY29udGVudCk7Cn0KCnJldHVybiAwOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2FmZUNvcHkoc3RyaW5nICRzb3VyY2UsIHN0cmluZyAkdGFyZ2V0KTogdm9pZAp7CmlmICghZmlsZV9leGlzdHMoJHRhcmdldCkgfHwgIWZpbGVfZXhpc3RzKCRzb3VyY2UpIHx8ICEkdGhpcy0+ZmlsZXNBcmVFcXVhbCgkc291cmNlLCAkdGFyZ2V0KSkgewokc291cmNlSGFuZGxlID0gZm9wZW4oJHNvdXJjZSwgJ3InKTsKYXNzZXJ0KCRzb3VyY2VIYW5kbGUgIT09IGZhbHNlLCAnQ291bGQgbm90IG9wZW4gIicuJHNvdXJjZS4nIiBmb3IgcmVhZGluZy4nKTsKJHRhcmdldEhhbmRsZSA9IGZvcGVuKCR0YXJnZXQsICd3KycpOwphc3NlcnQoJHRhcmdldEhhbmRsZSAhPT0gZmFsc2UsICdDb3VsZCBub3Qgb3BlbiAiJy4kdGFyZ2V0LiciIGZvciB3cml0aW5nLicpOwoKc3RyZWFtX2NvcHlfdG9fc3RyZWFtKCRzb3VyY2VIYW5kbGUsICR0YXJnZXRIYW5kbGUpOwpmY2xvc2UoJHNvdXJjZUhhbmRsZSk7CmZjbG9zZSgkdGFyZ2V0SGFuZGxlKTsKCnRvdWNoKCR0YXJnZXQsIChpbnQpIGZpbGVtdGltZSgkc291cmNlKSwgKGludCkgZmlsZWF0aW1lKCRzb3VyY2UpKTsKfQp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBmaWxlc0FyZUVxdWFsKHN0cmluZyAkYSwgc3RyaW5nICRiKTogYm9vbAp7CgppZiAoZmlsZXNpemUoJGEpICE9PSBmaWxlc2l6ZSgkYikpIHsKcmV0dXJuIGZhbHNlOwp9CgoKJGFIYW5kbGUgPSBmb3BlbigkYSwgJ3JiJyk7CmFzc2VydCgkYUhhbmRsZSAhPT0gZmFsc2UsICdDb3VsZCBub3Qgb3BlbiAiJy4kYS4nIiBmb3IgcmVhZGluZy4nKTsKJGJIYW5kbGUgPSBmb3BlbigkYiwgJ3JiJyk7CmFzc2VydCgkYkhhbmRsZSAhPT0gZmFsc2UsICdDb3VsZCBub3Qgb3BlbiAiJy4kYi4nIiBmb3IgcmVhZGluZy4nKTsKCiRyZXN1bHQgPSB0cnVlOwp3aGlsZSAoIWZlb2YoJGFIYW5kbGUpKSB7CmlmIChmcmVhZCgkYUhhbmRsZSwgODE5MikgIT09IGZyZWFkKCRiSGFuZGxlLCA4MTkyKSkgewokcmVzdWx0ID0gZmFsc2U7CmJyZWFrOwp9Cn0KCmZjbG9zZSgkYUhhbmRsZSk7CmZjbG9zZSgkYkhhbmRsZSk7CgpyZXR1cm4gJHJlc3VsdDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CgoKCgoKZmluYWwgY2xhc3MgRm9yZ2Vqbwp7Cgpwcml2YXRlICRpbzsKCnByaXZhdGUgJGNvbmZpZzsKCnByaXZhdGUgJGh0dHBEb3dubG9hZGVyOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIEh0dHBEb3dubG9hZGVyICRodHRwRG93bmxvYWRlcikKewokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwokdGhpcy0+aHR0cERvd25sb2FkZXIgPSAkaHR0cERvd25sb2FkZXI7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhdXRob3JpemVPQXV0aEludGVyYWN0aXZlbHkoc3RyaW5nICRvcmlnaW5VcmwsID9zdHJpbmcgJG1lc3NhZ2UgPSBudWxsKTogYm9vbAp7CmlmICgkbWVzc2FnZSAhPT0gbnVsbCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJG1lc3NhZ2UpOwp9CgokdXJsID0gJ2h0dHBzOi8vJy4kb3JpZ2luVXJsLicvdXNlci9zZXR0aW5ncy9hcHBsaWNhdGlvbnMnOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1NldHVwIGEgcGVyc29uYWwgYWNjZXNzIHRva2VuIHdpdGggcmVwb3NpdG9yeTpyZWFkIHBlcm1pc3Npb25zIG9uOicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJHVybCk7CiRsb2NhbEF1dGhDb25maWcgPSAkdGhpcy0+Y29uZmlnLT5nZXRMb2NhbEF1dGhDb25maWdTb3VyY2UoKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoJ1Rva2VucyB3aWxsIGJlIHN0b3JlZCBpbiBwbGFpbiB0ZXh0IGluICIlcyIgZm9yIGZ1dHVyZSB1c2UgYnkgQ29tcG9zZXIuJywgKCRsb2NhbEF1dGhDb25maWcgIT09IG51bGwgPyAkbG9jYWxBdXRoQ29uZmlnLT5nZXROYW1lKCkgLiAnIE9SICcgOiAnJykgLiAkdGhpcy0+Y29uZmlnLT5nZXRBdXRoQ29uZmlnU291cmNlKCktPmdldE5hbWUoKSkpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0ZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBjaGVjayBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvYXJ0aWNsZXMvYXV0aGVudGljYXRpb24tZm9yLXByaXZhdGUtcGFja2FnZXMubWQjZm9yZ2Vqby10b2tlbicpOwoKJHN0b3JlSW5Mb2NhbEF1dGhDb25maWcgPSBmYWxzZTsKaWYgKCRsb2NhbEF1dGhDb25maWcgIT09IG51bGwpIHsKJHN0b3JlSW5Mb2NhbEF1dGhDb25maWcgPSAkdGhpcy0+aW8tPmFza0NvbmZpcm1hdGlvbignQSBsb2NhbCBhdXRoIGNvbmZpZyBzb3VyY2Ugd2FzIGZvdW5kLCBkbyB5b3Ugd2FudCB0byBzdG9yZSB0aGUgdG9rZW4gdGhlcmU/JywgdHJ1ZSk7Cn0KCiR1c2VybmFtZSA9IHRyaW0oKHN0cmluZykgJHRoaXMtPmlvLT5hc2soJ1VzZXJuYW1lOiAnKSk7CiR0b2tlbiA9IHRyaW0oKHN0cmluZykgJHRoaXMtPmlvLT5hc2tBbmRIaWRlQW5zd2VyKCdUb2tlbiAoaGlkZGVuKTogJykpOwoKJGFkZFRva2VuTWFudWFsbHkgPSBzcHJpbnRmKCdZb3UgY2FuIGFsc28gYWRkIGl0IG1hbnVhbGx5IGxhdGVyIGJ5IHVzaW5nICJjb21wb3NlciBjb25maWcgLS1nbG9iYWwgLS1hdXRoIGZvcmdlam8tdG9rZW4uJXMgPHVzZXJuYW1lPiA8dG9rZW4+IicsICRvcmlnaW5VcmwpOwppZiAoJHRva2VuID09PSAnJyB8fCAkdXNlcm5hbWUgPT09ICcnKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Tm8gdXNlcm5hbWUvdG9rZW4gZ2l2ZW4sIGFib3J0aW5nLjwvd2FybmluZz4nKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRhZGRUb2tlbk1hbnVhbGx5KTsKCnJldHVybiBmYWxzZTsKfQoKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luVXJsLCAkdXNlcm5hbWUsICR0b2tlbik7Cgp0cnkgewokdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgnaHR0cHM6Ly8nLiAkb3JpZ2luVXJsIC4gJy9hcGkvdjEvdmVyc2lvbicsIFsKJ3JldHJ5LWF1dGgtZmFpbHVyZScgPT4gZmFsc2UsCl0pOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKaWYgKGluX2FycmF5KCRlLT5nZXRDb2RlKCksIFs0MDMsIDQwMSwgNDA0XSwgdHJ1ZSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+SW52YWxpZCBhY2Nlc3MgdG9rZW4gcHJvdmlkZWQuPC9lcnJvcj4nKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRhZGRUb2tlbk1hbnVhbGx5KTsKCnJldHVybiBmYWxzZTsKfQoKdGhyb3cgJGU7Cn0KCgokYXV0aENvbmZpZ1NvdXJjZSA9ICRzdG9yZUluTG9jYWxBdXRoQ29uZmlnICYmICRsb2NhbEF1dGhDb25maWcgIT09IG51bGwgPyAkbG9jYWxBdXRoQ29uZmlnIDogJHRoaXMtPmNvbmZpZy0+Z2V0QXV0aENvbmZpZ1NvdXJjZSgpOwokdGhpcy0+Y29uZmlnLT5nZXRDb25maWdTb3VyY2UoKS0+cmVtb3ZlQ29uZmlnU2V0dGluZygnZm9yZ2Vqby10b2tlbi4nLiRvcmlnaW5VcmwpOwokYXV0aENvbmZpZ1NvdXJjZS0+YWRkQ29uZmlnU2V0dGluZygnZm9yZ2Vqby10b2tlbi4nLiRvcmlnaW5VcmwsIFsndXNlcm5hbWUnID0+ICR1c2VybmFtZSwgJ3Rva2VuJyA9PiAkdG9rZW5dKTsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGluZm8+VG9rZW4gc3RvcmVkIHN1Y2Nlc3NmdWxseS48L2luZm8+Jyk7CgpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKCgoKCmZpbmFsIGNsYXNzIEZvcmdlam9SZXBvc2l0b3J5RGF0YQp7CgpwdWJsaWMgJGh0bWxVcmw7CgpwdWJsaWMgJHNzaFVybDsKCnB1YmxpYyAkaHR0cENsb25lVXJsOwoKcHVibGljICRpc1ByaXZhdGU7CgpwdWJsaWMgJGRlZmF1bHRCcmFuY2g7CgpwdWJsaWMgJGhhc0lzc3VlczsKCnB1YmxpYyAkaXNBcmNoaXZlZDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKc3RyaW5nICRodG1sVXJsLApzdHJpbmcgJGh0dHBDbG9uZVVybCwKc3RyaW5nICRzc2hVcmwsCmJvb2wgJGlzUHJpdmF0ZSwKc3RyaW5nICRkZWZhdWx0QnJhbmNoLApib29sICRoYXNJc3N1ZXMsCmJvb2wgJGlzQXJjaGl2ZWQKKSB7CiR0aGlzLT5odG1sVXJsID0gJGh0bWxVcmw7CiR0aGlzLT5odHRwQ2xvbmVVcmwgPSAkaHR0cENsb25lVXJsOwokdGhpcy0+c3NoVXJsID0gJHNzaFVybDsKJHRoaXMtPmlzUHJpdmF0ZSA9ICRpc1ByaXZhdGU7CiR0aGlzLT5kZWZhdWx0QnJhbmNoID0gJGRlZmF1bHRCcmFuY2g7CiR0aGlzLT5oYXNJc3N1ZXMgPSAkaGFzSXNzdWVzOwokdGhpcy0+aXNBcmNoaXZlZCA9ICRpc0FyY2hpdmVkOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21SZW1vdGVEYXRhKGFycmF5ICRkYXRhKTogc2VsZgp7CnJldHVybiBuZXcgc2VsZigKJGRhdGFbJ2h0bWxfdXJsJ10sCiRkYXRhWydjbG9uZV91cmwnXSwKJGRhdGFbJ3NzaF91cmwnXSwKJGRhdGFbJ3ByaXZhdGUnXSwKJGRhdGFbJ2RlZmF1bHRfYnJhbmNoJ10sCiRkYXRhWydoYXNfaXNzdWVzJ10sCiRkYXRhWydhcmNoaXZlZCddCik7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgoKZmluYWwgY2xhc3MgRm9yZ2Vqb1VybAp7CnB1YmxpYyBjb25zdCBVUkxfUkVHRVggPSAne14oPzooPzpodHRwcz98Z2l0KTovLyhbXi9dKykvfGdpdEAoW146XSspOi8/KShbXi9dKykvKFteL10rPykoPzpcLmdpdHwvKT8kfSc7CgoKcHVibGljICRvd25lcjsKCnB1YmxpYyAkcmVwb3NpdG9yeTsKCnB1YmxpYyAkb3JpZ2luVXJsOwoKcHVibGljICRhcGlVcmw7Cgpwcml2YXRlIGZ1bmN0aW9uIF9fY29uc3RydWN0KApzdHJpbmcgJG93bmVyLApzdHJpbmcgJHJlcG9zaXRvcnksCnN0cmluZyAkb3JpZ2luVXJsLApzdHJpbmcgJGFwaVVybAopIHsKJHRoaXMtPm93bmVyID0gJG93bmVyOwokdGhpcy0+cmVwb3NpdG9yeSA9ICRyZXBvc2l0b3J5OwokdGhpcy0+b3JpZ2luVXJsID0gJG9yaWdpblVybDsKJHRoaXMtPmFwaVVybCA9ICRhcGlVcmw7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlKHN0cmluZyAkcmVwb1VybCk6IHNlbGYKewokdXJsID0gc2VsZjo6dHJ5RnJvbSgkcmVwb1VybCk7CmlmICgkdXJsICE9PSBudWxsKSB7CnJldHVybiAkdXJsOwp9Cgp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVGhpcyBpcyBub3QgYSB2YWxpZCBGb3JnZWpvIFVSTDogJyAuICRyZXBvVXJsKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0cnlGcm9tKD9zdHJpbmcgJHJlcG9VcmwpOiA/c2VsZgp7CmlmICgkcmVwb1VybCA9PT0gbnVsbCB8fCAhUHJlZzo6aXNNYXRjaChzZWxmOjpVUkxfUkVHRVgsICRyZXBvVXJsLCAkbWF0Y2gpKSB7CnJldHVybiBudWxsOwp9Cgokb3JpZ2luVXJsID0gc3RydG9sb3dlcigkbWF0Y2hbMV0gPz8gKHN0cmluZykgJG1hdGNoWzJdKTsKJGFwaUJhc2UgPSAkb3JpZ2luVXJsIC4gJy9hcGkvdjEnOwoKcmV0dXJuIG5ldyBzZWxmKAokbWF0Y2hbM10sCiRtYXRjaFs0XSwKJG9yaWdpblVybCwKc3ByaW50ZignaHR0cHM6Ly8lcy9yZXBvcy8lcy8lcycsICRhcGlCYXNlLCAkbWF0Y2hbM10sICRtYXRjaFs0XSkKKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdlbmVyYXRlU3NoVXJsKCk6IHN0cmluZwp7CnJldHVybiAnZ2l0QCcgLiAkdGhpcy0+b3JpZ2luVXJsIC4gJzonLiR0aGlzLT5vd25lci4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy5naXQnOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgpjbGFzcyBHaXQKewoKcHJpdmF0ZSBzdGF0aWMgJHZlcnNpb24gPSBmYWxzZTsKCgpwcm90ZWN0ZWQgJGlvOwoKcHJvdGVjdGVkICRjb25maWc7Cgpwcm90ZWN0ZWQgJHByb2Nlc3M7Cgpwcm90ZWN0ZWQgJGZpbGVzeXN0ZW07Cgpwcm90ZWN0ZWQgJGh0dHBEb3dubG9hZGVyOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIFByb2Nlc3NFeGVjdXRvciAkcHJvY2VzcywgRmlsZXN5c3RlbSAkZnMpCnsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKJHRoaXMtPnByb2Nlc3MgPSAkcHJvY2VzczsKJHRoaXMtPmZpbGVzeXN0ZW0gPSAkZnM7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2hlY2tGb3JSZXBvT3duZXJzaGlwRXJyb3Ioc3RyaW5nICRvdXRwdXQsIHN0cmluZyAkcGF0aCwgP0lPSW50ZXJmYWNlICRpbyA9IG51bGwpOiB2b2lkCnsKaWYgKHN0cl9jb250YWlucygkb3V0cHV0LCAnZmF0YWw6IGRldGVjdGVkIGR1YmlvdXMgb3duZXJzaGlwJykpIHsKJG1zZyA9ICdUaGUgcmVwb3NpdG9yeSBhdCAiJyAuICRwYXRoIC4gJyIgZG9lcyBub3QgaGF2ZSB0aGUgY29ycmVjdCBvd25lcnNoaXAgYW5kIGdpdCByZWZ1c2VzIHRvIHVzZSBpdDonIC4gUEhQX0VPTCAuIFBIUF9FT0wgLiAkb3V0cHV0OwppZiAoJGlvID09PSBudWxsKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigkbXNnKTsKfQokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPicuJG1zZy4nPC93YXJuaW5nPicpOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRIdHRwRG93bmxvYWRlcihIdHRwRG93bmxvYWRlciAkaHR0cERvd25sb2FkZXIpOiB2b2lkCnsKJHRoaXMtPmh0dHBEb3dubG9hZGVyID0gJGh0dHBEb3dubG9hZGVyOwp9CgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcnVuQ29tbWFuZHMoYXJyYXkgJGNvbW1hbmRzLCBzdHJpbmcgJHVybCwgP3N0cmluZyAkY3dkLCBib29sICRpbml0aWFsQ2xvbmUgPSBmYWxzZSwgJiRjb21tYW5kT3V0cHV0ID0gbnVsbCk6IHZvaWQKewokY2FsbGFibGVzID0gW107CmZvcmVhY2ggKCRjb21tYW5kcyBhcyAkY21kKSB7CiRjYWxsYWJsZXNbXSA9IHN0YXRpYyBmdW5jdGlvbiAoc3RyaW5nICR1cmwpIHVzZSAoJGNtZCk6IGFycmF5IHsKJG1hcCA9IFsKJyV1cmwlJyA9PiAkdXJsLAonJXNhbml0aXplZFVybCUnID0+IFByZWc6OnJlcGxhY2UoJ3s6Ly8oW15AXSs/KTooLis/KUB9JywgJzovLycsICR1cmwpLApdOwoKcmV0dXJuIGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCR2YWx1ZSkgdXNlICgkbWFwKTogc3RyaW5nIHsKcmV0dXJuICRtYXBbJHZhbHVlXSA/PyAkdmFsdWU7Cn0sICRjbWQpOwp9Owp9CgoKJHRoaXMtPnJ1bkNvbW1hbmQoJGNhbGxhYmxlcywgJHVybCwgJGN3ZCwgJGluaXRpYWxDbG9uZSwgJGNvbW1hbmRPdXRwdXQpOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcnVuQ29tbWFuZCgkY29tbWFuZENhbGxhYmxlLCBzdHJpbmcgJHVybCwgP3N0cmluZyAkY3dkLCBib29sICRpbml0aWFsQ2xvbmUgPSBmYWxzZSwgJiRjb21tYW5kT3V0cHV0ID0gbnVsbCk6IHZvaWQKewokY29tbWFuZENhbGxhYmxlcyA9IGlzX2NhbGxhYmxlKCRjb21tYW5kQ2FsbGFibGUpID8gWyRjb21tYW5kQ2FsbGFibGVdIDogJGNvbW1hbmRDYWxsYWJsZTsKJGxhc3RDb21tYW5kID0gJyc7CgoKJHRoaXMtPmNvbmZpZy0+cHJvaGliaXRVcmxCeUNvbmZpZygkdXJsLCAkdGhpcy0+aW8pOwoKaWYgKCRpbml0aWFsQ2xvbmUpIHsKJG9yaWdDd2QgPSAkY3dkOwp9CgokcnVuQ29tbWFuZHMgPSBmdW5jdGlvbiAoJHVybCkgdXNlICgkY29tbWFuZENhbGxhYmxlcywgJGN3ZCwgJiRjb21tYW5kT3V0cHV0LCAmJGxhc3RDb21tYW5kLCAkaW5pdGlhbENsb25lKSB7CiRjb2xsZWN0T3V0cHV0cyA9ICFpc19jYWxsYWJsZSgkY29tbWFuZE91dHB1dCk7CiRvdXRwdXRzID0gW107Cgokc3RhdHVzID0gMDsKJGNvdW50ZXIgPSAwOwpmb3JlYWNoICgkY29tbWFuZENhbGxhYmxlcyBhcyAkY2FsbGFibGUpIHsKJGxhc3RDb21tYW5kID0gJGNhbGxhYmxlKCR1cmwpOwppZiAoJGNvbGxlY3RPdXRwdXRzKSB7CiRvdXRwdXRzW10gPSAnJzsKJG91dHB1dCA9ICYkb3V0cHV0c1tjb3VudCgkb3V0cHV0cykgLSAxXTsKfSBlbHNlIHsKJG91dHB1dCA9ICYkY29tbWFuZE91dHB1dDsKfQokc3RhdHVzID0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGxhc3RDb21tYW5kLCAkb3V0cHV0LCAkaW5pdGlhbENsb25lICYmICRjb3VudGVyID09PSAwID8gbnVsbCA6ICRjd2QpOwppZiAoJHN0YXR1cyAhPT0gMCkgewpicmVhazsKfQokY291bnRlcisrOwp9CgppZiAoJGNvbGxlY3RPdXRwdXRzKSB7CiRjb21tYW5kT3V0cHV0ID0gaW1wbG9kZSgnJywgJG91dHB1dHMpOwp9CgpyZXR1cm4gJHN0YXR1czsKfTsKCmlmIChQcmVnOjppc01hdGNoKCd7XnNzaDovL1teQF0rQFteOl0rOlteMC05XSt9JywgJHVybCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSBzb3VyY2UgVVJMICcgLiAkdXJsIC4gJyBpcyBpbnZhbGlkLCBzc2ggVVJMcyBzaG91bGQgaGF2ZSBhIHBvcnQgbnVtYmVyIGFmdGVyICI6Ii4nIC4gIlxuIiAuICdVc2Ugc3NoOi8vZ2l0QGV4YW1wbGUuY29tOjIyL3BhdGggb3IganVzdCBnaXRAZXhhbXBsZS5jb206cGF0aCBpZiB5b3UgZG8gbm90IHdhbnQgdG8gcHJvdmlkZSBhIHBhc3N3b3JkIG9yIGN1c3RvbSBwb3J0LicpOwp9CgppZiAoISRpbml0aWFsQ2xvbmUpIHsKCiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ3JlbW90ZScsICctdiddLCAkb3V0cHV0LCAkY3dkKTsKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teKD86Y29tcG9zZXJ8b3JpZ2luKVxzK2h0dHBzPzovLyguKyk6KC4rKUAoW14vXSspfWltJywgJG91dHB1dCwgJG1hdGNoKSAmJiAhJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkbWF0Y2hbM10pKSB7CiR0aGlzLT5pby0+c2V0QXV0aGVudGljYXRpb24oJG1hdGNoWzNdLCByYXd1cmxkZWNvZGUoJG1hdGNoWzFdKSwgcmF3dXJsZGVjb2RlKCRtYXRjaFsyXSkpOwp9Cn0KCiRwcm90b2NvbHMgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2dpdGh1Yi1wcm90b2NvbHMnKTsKCgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14oPzpodHRwcz98Z2l0KTovLycgLiBzZWxmOjpnZXRHaXRIdWJEb21haW5zUmVnZXgoJHRoaXMtPmNvbmZpZykgLiAnLyguKil9JywgJHVybCwgJG1hdGNoKSkgewokbWVzc2FnZXMgPSBbXTsKZm9yZWFjaCAoJHByb3RvY29scyBhcyAkcHJvdG9jb2wpIHsKaWYgKCdzc2gnID09PSAkcHJvdG9jb2wpIHsKJHByb3RvVXJsID0gImdpdEAiIC4gJG1hdGNoWzFdIC4gIjoiIC4gJG1hdGNoWzJdOwp9IGVsc2UgewokcHJvdG9VcmwgPSAkcHJvdG9jb2wgLiAiOi8vIiAuICRtYXRjaFsxXSAuICIvIiAuICRtYXRjaFsyXTsKfQoKaWYgKDAgPT09ICRydW5Db21tYW5kcygkcHJvdG9VcmwpKSB7CnJldHVybjsKfQokbWVzc2FnZXNbXSA9ICctICcgLiAkcHJvdG9VcmwgLiAiXG4iIC4gUHJlZzo6cmVwbGFjZSgnI14jbScsICcgICcsICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpKTsKCmlmICgkaW5pdGlhbENsb25lICYmIGlzc2V0KCRvcmlnQ3dkKSkgewokdGhpcy0+ZmlsZXN5c3RlbS0+cmVtb3ZlRGlyZWN0b3J5KCRvcmlnQ3dkKTsKfQp9CgoKaWYgKCEkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCRtYXRjaFsxXSkgJiYgISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpKSB7CiR0aGlzLT50aHJvd0V4Y2VwdGlvbignRmFpbGVkIHRvIGNsb25lICcgLiAkdXJsIC4gJyB2aWEgJyAuIGltcGxvZGUoJywgJywgJHByb3RvY29scykgLiAnIHByb3RvY29scywgYWJvcnRpbmcuJyAuICJcblxuIiAuIGltcGxvZGUoIlxuIiwgJG1lc3NhZ2VzKSwgJHVybCk7Cn0KfQoKCiRieXBhc3NTc2hGb3JHaXRIdWIgPSBQcmVnOjppc01hdGNoKCd7XmdpdEAnIC4gc2VsZjo6Z2V0R2l0SHViRG9tYWluc1JlZ2V4KCR0aGlzLT5jb25maWcpIC4gJzooLis/KVwuZ2l0JH1pJywgJHVybCkgJiYgIWluX2FycmF5KCdzc2gnLCAkcHJvdG9jb2xzLCB0cnVlKTsKCiRhdXRoID0gbnVsbDsKJGNyZWRlbnRpYWxzID0gW107CmlmICgkYnlwYXNzU3NoRm9yR2l0SHViIHx8IDAgIT09ICRydW5Db21tYW5kcygkdXJsKSkgewokZXJyb3JNc2cgPSAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKTsKCgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne15naXRAJyAuIHNlbGY6OmdldEdpdEh1YkRvbWFpbnNSZWdleCgkdGhpcy0+Y29uZmlnKSAuICc6KC4rPylcLmdpdCR9aScsICR1cmwsICRtYXRjaCkKCnx8IFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teaHR0cHM/Oi8vJyAuIHNlbGY6OmdldEdpdEh1YkRvbWFpbnNSZWdleCgkdGhpcy0+Y29uZmlnKSAuICcvKC4qPykoPzpcLmdpdCk/JH1pJywgJHVybCwgJG1hdGNoKQopIHsKaWYgKCEkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCRtYXRjaFsxXSkpIHsKJGdpdEh1YlV0aWwgPSBuZXcgR2l0SHViKCR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPnByb2Nlc3MpOwokbWVzc2FnZSA9ICdDbG9uaW5nIGZhaWxlZCB1c2luZyBhbiBzc2gga2V5IGZvciBhdXRoZW50aWNhdGlvbiwgZW50ZXIgeW91ciBHaXRIdWIgY3JlZGVudGlhbHMgdG8gYWNjZXNzIHByaXZhdGUgcmVwb3MnOwoKaWYgKCEkZ2l0SHViVXRpbC0+YXV0aG9yaXplT0F1dGgoJG1hdGNoWzFdKSAmJiAkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewokZ2l0SHViVXRpbC0+YXV0aG9yaXplT0F1dGhJbnRlcmFjdGl2ZWx5KCRtYXRjaFsxXSwgJG1lc3NhZ2UpOwp9Cn0KCmlmICgkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCRtYXRjaFsxXSkpIHsKJGF1dGggPSAkdGhpcy0+aW8tPmdldEF1dGhlbnRpY2F0aW9uKCRtYXRjaFsxXSk7CiRhdXRoVXJsID0gJ2h0dHBzOi8vJyAuIHJhd3VybGVuY29kZSgkYXV0aFsndXNlcm5hbWUnXSkgLiAnOicgLiByYXd1cmxlbmNvZGUoJGF1dGhbJ3Bhc3N3b3JkJ10pIC4gJ0AnIC4gJG1hdGNoWzFdIC4gJy8nIC4gJG1hdGNoWzJdIC4gJy5naXQnOwppZiAoMCA9PT0gJHJ1bkNvbW1hbmRzKCRhdXRoVXJsKSkgewpyZXR1cm47Cn0KCiRjcmVkZW50aWFscyA9IFtyYXd1cmxlbmNvZGUoJGF1dGhbJ3VzZXJuYW1lJ10pLCByYXd1cmxlbmNvZGUoJGF1dGhbJ3Bhc3N3b3JkJ10pXTsKJGVycm9yTXNnID0gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCk7Cn0KCn0gZWxzZWlmICgKUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14oaHR0cHM/KTovLyhiaXRidWNrZXRcLm9yZykvKC4qPykoPzpcLmdpdCk/JH1pJywgJHVybCwgJG1hdGNoKQp8fCBQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XihnaXQpQChiaXRidWNrZXRcLm9yZyk6KC4rP1wuZ2l0KSR9aScsICR1cmwsICRtYXRjaCkKKSB7IAokYml0YnVja2V0VXRpbCA9IG5ldyBCaXRidWNrZXQoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2VzcywgJHRoaXMtPmh0dHBEb3dubG9hZGVyKTsKCiRkb21haW4gPSAkbWF0Y2hbMl07CiRyZXBvX3dpdGhfZ2l0X3BhcnQgPSAkbWF0Y2hbM107CmlmICghc3RyX2VuZHNfd2l0aCgkcmVwb193aXRoX2dpdF9wYXJ0LCAnLmdpdCcpKSB7CiRyZXBvX3dpdGhfZ2l0X3BhcnQgLj0gJy5naXQnOwp9CmlmICghJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkZG9tYWluKSkgewokbWVzc2FnZSA9ICdFbnRlciB5b3VyIEJpdGJ1Y2tldCBjcmVkZW50aWFscyB0byBhY2Nlc3MgcHJpdmF0ZSByZXBvcyc7CgppZiAoISRiaXRidWNrZXRVdGlsLT5hdXRob3JpemVPQXV0aCgkZG9tYWluKSAmJiAkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewokYml0YnVja2V0VXRpbC0+YXV0aG9yaXplT0F1dGhJbnRlcmFjdGl2ZWx5KCRkb21haW4sICRtZXNzYWdlKTsKJGFjY2Vzc1Rva2VuID0gJGJpdGJ1Y2tldFV0aWwtPmdldFRva2VuKCk7CiR0aGlzLT5pby0+c2V0QXV0aGVudGljYXRpb24oJGRvbWFpbiwgJ3gtdG9rZW4tYXV0aCcsICRhY2Nlc3NUb2tlbik7Cn0KfQoKCgoKaWYgKCR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJGRvbWFpbikpIHsKJGF1dGggPSAkdGhpcy0+aW8tPmdldEF1dGhlbnRpY2F0aW9uKCRkb21haW4pOwoKCgppZiAoc3RycG9zKChzdHJpbmcpICRhdXRoWydwYXNzd29yZCddLCAnQVRBVCcpID09PSAwKSB7CiRhdXRoWyd1c2VybmFtZSddID0gJ3gtYml0YnVja2V0LWFwaS10b2tlbi1hdXRoJzsKfQoKJGF1dGhVcmwgPSAnaHR0cHM6Ly8nIC4gcmF3dXJsZW5jb2RlKCRhdXRoWyd1c2VybmFtZSddKSAuICc6JyAuIHJhd3VybGVuY29kZSgkYXV0aFsncGFzc3dvcmQnXSkgLiAnQCcgLiAkZG9tYWluIC4gJy8nIC4gJHJlcG9fd2l0aF9naXRfcGFydDsKCmlmICgwID09PSAkcnVuQ29tbWFuZHMoJGF1dGhVcmwpKSB7CgoKcmV0dXJuOwp9CgoKaWYgKCRhdXRoWyd1c2VybmFtZSddICE9PSAneC10b2tlbi1hdXRoJykgewokYWNjZXNzVG9rZW4gPSAkYml0YnVja2V0VXRpbC0+cmVxdWVzdFRva2VuKCRkb21haW4sICRhdXRoWyd1c2VybmFtZSddLCAkYXV0aFsncGFzc3dvcmQnXSk7CmlmICghZW1wdHkoJGFjY2Vzc1Rva2VuKSkgewokdGhpcy0+aW8tPnNldEF1dGhlbnRpY2F0aW9uKCRkb21haW4sICd4LXRva2VuLWF1dGgnLCAkYWNjZXNzVG9rZW4pOwp9Cn0KfQoKaWYgKCR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJGRvbWFpbikpIHsKJGF1dGggPSAkdGhpcy0+aW8tPmdldEF1dGhlbnRpY2F0aW9uKCRkb21haW4pOwokYXV0aFVybCA9ICdodHRwczovLycgLiByYXd1cmxlbmNvZGUoJGF1dGhbJ3VzZXJuYW1lJ10pIC4gJzonIC4gcmF3dXJsZW5jb2RlKCRhdXRoWydwYXNzd29yZCddKSAuICdAJyAuICRkb21haW4gLiAnLycgLiAkcmVwb193aXRoX2dpdF9wYXJ0OwppZiAoMCA9PT0gJHJ1bkNvbW1hbmRzKCRhdXRoVXJsKSkgewpyZXR1cm47Cn0KCiRjcmVkZW50aWFscyA9IFtyYXd1cmxlbmNvZGUoJGF1dGhbJ3VzZXJuYW1lJ10pLCByYXd1cmxlbmNvZGUoJGF1dGhbJ3Bhc3N3b3JkJ10pXTsKfQoKJHNzaFVybCA9ICdnaXRAYml0YnVja2V0Lm9yZzonIC4gJHJlcG9fd2l0aF9naXRfcGFydDsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgTm8gYml0YnVja2V0IGF1dGhlbnRpY2F0aW9uIGNvbmZpZ3VyZWQuIEZhbGxpbmcgYmFjayB0byBzc2guJyk7CmlmICgwID09PSAkcnVuQ29tbWFuZHMoJHNzaFVybCkpIHsKcmV0dXJuOwp9CgokZXJyb3JNc2cgPSAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKTsKfSBlbHNlaWYgKAoKUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14oZ2l0KUAnIC4gc2VsZjo6Z2V0R2l0TGFiRG9tYWluc1JlZ2V4KCR0aGlzLT5jb25maWcpIC4gJzooLis/XC5naXQpJH1pJywgJHVybCwgJG1hdGNoKQoKfHwgUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14oaHR0cHM/KTovLycgLiBzZWxmOjpnZXRHaXRMYWJEb21haW5zUmVnZXgoJHRoaXMtPmNvbmZpZykgLiAnLyguKil9aScsICR1cmwsICRtYXRjaCkKKSB7CmlmICgkbWF0Y2hbMV0gPT09ICdnaXQnKSB7CiRtYXRjaFsxXSA9ICdodHRwcyc7Cn0KCmlmICghJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkbWF0Y2hbMl0pKSB7CiRnaXRMYWJVdGlsID0gbmV3IEdpdExhYigkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsICR0aGlzLT5wcm9jZXNzKTsKJG1lc3NhZ2UgPSAnQ2xvbmluZyBmYWlsZWQsIGVudGVyIHlvdXIgR2l0TGFiIGNyZWRlbnRpYWxzIHRvIGFjY2VzcyBwcml2YXRlIHJlcG9zJzsKCmlmICghJGdpdExhYlV0aWwtPmF1dGhvcml6ZU9BdXRoKCRtYXRjaFsyXSkgJiYgJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkpIHsKJGdpdExhYlV0aWwtPmF1dGhvcml6ZU9BdXRoSW50ZXJhY3RpdmVseSgkbWF0Y2hbMV0sICRtYXRjaFsyXSwgJG1lc3NhZ2UpOwp9Cn0KCmlmICgkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCRtYXRjaFsyXSkpIHsKJGF1dGggPSAkdGhpcy0+aW8tPmdldEF1dGhlbnRpY2F0aW9uKCRtYXRjaFsyXSk7CmlmICgkYXV0aFsncGFzc3dvcmQnXSA9PT0gJ3ByaXZhdGUtdG9rZW4nIHx8ICRhdXRoWydwYXNzd29yZCddID09PSAnb2F1dGgyJyB8fCAkYXV0aFsncGFzc3dvcmQnXSA9PT0gJ2dpdGxhYi1jaS10b2tlbicpIHsKJGF1dGhVcmwgPSAkbWF0Y2hbMV0gLiAnOi8vJyAuIHJhd3VybGVuY29kZSgkYXV0aFsncGFzc3dvcmQnXSkgLiAnOicgLiByYXd1cmxlbmNvZGUoKHN0cmluZykgJGF1dGhbJ3VzZXJuYW1lJ10pIC4gJ0AnIC4gJG1hdGNoWzJdIC4gJy8nIC4gJG1hdGNoWzNdOyAKfSBlbHNlIHsKJGF1dGhVcmwgPSAkbWF0Y2hbMV0gLiAnOi8vJyAuIHJhd3VybGVuY29kZSgoc3RyaW5nKSAkYXV0aFsndXNlcm5hbWUnXSkgLiAnOicgLiByYXd1cmxlbmNvZGUoKHN0cmluZykgJGF1dGhbJ3Bhc3N3b3JkJ10pIC4gJ0AnIC4gJG1hdGNoWzJdIC4gJy8nIC4gJG1hdGNoWzNdOwp9CgppZiAoMCA9PT0gJHJ1bkNvbW1hbmRzKCRhdXRoVXJsKSkgewpyZXR1cm47Cn0KCiRjcmVkZW50aWFscyA9IFtyYXd1cmxlbmNvZGUoKHN0cmluZykgJGF1dGhbJ3VzZXJuYW1lJ10pLCByYXd1cmxlbmNvZGUoKHN0cmluZykgJGF1dGhbJ3Bhc3N3b3JkJ10pXTsKJGVycm9yTXNnID0gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCk7Cn0KfSBlbHNlaWYgKG51bGwgIT09ICgkbWF0Y2ggPSAkdGhpcy0+Z2V0QXV0aGVudGljYXRpb25GYWlsdXJlKCR1cmwpKSkgeyAKaWYgKHN0cl9jb250YWlucygkbWF0Y2hbMl0sICdAJykpIHsKWyRhdXRoUGFydHMsICRtYXRjaFsyXV0gPSBleHBsb2RlKCdAJywgJG1hdGNoWzJdLCAyKTsKfQoKJHN0b3JlQXV0aCA9IGZhbHNlOwppZiAoJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkbWF0Y2hbMl0pKSB7CiRhdXRoID0gJHRoaXMtPmlvLT5nZXRBdXRoZW50aWNhdGlvbigkbWF0Y2hbMl0pOwp9IGVsc2VpZiAoJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkpIHsKJGRlZmF1bHRVc2VybmFtZSA9IG51bGw7CmlmIChpc3NldCgkYXV0aFBhcnRzKSAmJiAkYXV0aFBhcnRzICE9PSAnJykgewppZiAoc3RyX2NvbnRhaW5zKCRhdXRoUGFydHMsICc6JykpIHsKWyRkZWZhdWx0VXNlcm5hbWVdID0gZXhwbG9kZSgnOicsICRhdXRoUGFydHMsIDIpOwp9IGVsc2UgewokZGVmYXVsdFVzZXJuYW1lID0gJGF1dGhQYXJ0czsKfQp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICBBdXRoZW50aWNhdGlvbiByZXF1aXJlZCAoPGluZm8+JyAuICRtYXRjaFsyXSAuICc8L2luZm8+KTonKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz4nIC4gdHJpbSgkZXJyb3JNc2cpIC4gJzwvd2FybmluZz4nLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7CiRhdXRoID0gWwondXNlcm5hbWUnID0+ICR0aGlzLT5pby0+YXNrKCcgICAgICBVc2VybmFtZTogJywgJGRlZmF1bHRVc2VybmFtZSksCidwYXNzd29yZCcgPT4gJHRoaXMtPmlvLT5hc2tBbmRIaWRlQW5zd2VyKCcgICAgICBQYXNzd29yZDogJyksCl07CiRzdG9yZUF1dGggPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ3N0b3JlLWF1dGhzJyk7Cn0KCmlmIChudWxsICE9PSAkYXV0aCkgewokYXV0aFVybCA9ICRtYXRjaFsxXSAuIHJhd3VybGVuY29kZSgoc3RyaW5nKSAkYXV0aFsndXNlcm5hbWUnXSkgLiAnOicgLiByYXd1cmxlbmNvZGUoKHN0cmluZykgJGF1dGhbJ3Bhc3N3b3JkJ10pIC4gJ0AnIC4gJG1hdGNoWzJdIC4gJG1hdGNoWzNdOwoKaWYgKDAgPT09ICRydW5Db21tYW5kcygkYXV0aFVybCkpIHsKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkbWF0Y2hbMl0sICRhdXRoWyd1c2VybmFtZSddLCAkYXV0aFsncGFzc3dvcmQnXSk7CiRhdXRoSGVscGVyID0gbmV3IEF1dGhIZWxwZXIoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnKTsKJGF1dGhIZWxwZXItPnN0b3JlQXV0aCgkbWF0Y2hbMl0sICRzdG9yZUF1dGgpOwoKcmV0dXJuOwp9CgokY3JlZGVudGlhbHMgPSBbcmF3dXJsZW5jb2RlKChzdHJpbmcpICRhdXRoWyd1c2VybmFtZSddKSwgcmF3dXJsZW5jb2RlKChzdHJpbmcpICRhdXRoWydwYXNzd29yZCddKV07CiRlcnJvck1zZyA9ICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpOwp9Cn0KCmlmICgkaW5pdGlhbENsb25lICYmIGlzc2V0KCRvcmlnQ3dkKSkgewokdGhpcy0+ZmlsZXN5c3RlbS0+cmVtb3ZlRGlyZWN0b3J5KCRvcmlnQ3dkKTsKfQoKaWYgKFxpc19hcnJheSgkbGFzdENvbW1hbmQpKSB7CiRsYXN0Q29tbWFuZCA9IGltcGxvZGUoJyAnLCAkbGFzdENvbW1hbmQpOwp9CmlmIChjb3VudCgkY3JlZGVudGlhbHMpID4gMCkgewokbGFzdENvbW1hbmQgPSAkdGhpcy0+bWFza0NyZWRlbnRpYWxzKCRsYXN0Q29tbWFuZCwgJGNyZWRlbnRpYWxzKTsKJGVycm9yTXNnID0gJHRoaXMtPm1hc2tDcmVkZW50aWFscygkZXJyb3JNc2csICRjcmVkZW50aWFscyk7Cn0KJHRoaXMtPnRocm93RXhjZXB0aW9uKCdGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gJGxhc3RDb21tYW5kIC4gIlxuXG4iIC4gJGVycm9yTXNnLCAkdXJsKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gc3luY01pcnJvcihzdHJpbmcgJHVybCwgc3RyaW5nICRkaXIpOiBib29sCnsKaWYgKChib29sKSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9ESVNBQkxFX05FVFdPUksnKSAmJiBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9ESVNBQkxFX05FVFdPUksnKSAhPT0gJ3ByaW1lJykgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkFib3J0aW5nIGdpdCBtaXJyb3Igc3luYyBvZiAnLiR1cmwuJyBhcyBuZXR3b3JrIGlzIGRpc2FibGVkPC93YXJuaW5nPicpOwoKcmV0dXJuIGZhbHNlOwp9CgoKaWYgKGlzX2RpcigkZGlyKSAmJiAwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdyZXYtcGFyc2UnLCAnLS1naXQtZGlyJ10sICRvdXRwdXQsICRkaXIpICYmIHRyaW0oJG91dHB1dCkgPT09ICcuJykgewp0cnkgewp0cnkgewokY29tbWFuZHMgPSBbClsnZ2l0JywgJ3JlbW90ZScsICdzZXQtdXJsJywgJ29yaWdpbicsICctLScsICcldXJsJSddLApbJ2dpdCcsICdyZW1vdGUnLCAndXBkYXRlJywgJy0tcHJ1bmUnLCAnb3JpZ2luJ10sClsnZ2l0JywgJ2djJywgJy0tYXV0byddLApdOwoKJHRoaXMtPnJ1bkNvbW1hbmRzKCRjb21tYW5kcywgJHVybCwgJGRpcik7Cn0gZmluYWxseSB7CiR0aGlzLT5ydW5Db21tYW5kcyhbWydnaXQnLCAncmVtb3RlJywgJ3NldC11cmwnLCAnb3JpZ2luJywgJy0tJywgJyVzYW5pdGl6ZWRVcmwlJ11dLCAkdXJsLCAkZGlyKTsKfQp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPlN5bmMgbWlycm9yIGZhaWxlZDogJyAuICRlLT5nZXRNZXNzYWdlKCkgLiAnPC9lcnJvcj4nLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwoKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQpzZWxmOjpjaGVja0ZvclJlcG9Pd25lcnNoaXBFcnJvcigkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSwgJGRpcik7CgoKJHRoaXMtPmZpbGVzeXN0ZW0tPnJlbW92ZURpcmVjdG9yeSgkZGlyKTsKCiR0aGlzLT5ydW5Db21tYW5kcyhbWydnaXQnLCAnY2xvbmUnLCAnLS1taXJyb3InLCAnLS0nLCAnJXVybCUnLCAkZGlyXV0sICR1cmwsICRkaXIsIHRydWUpOwoKJHRoaXMtPnJ1bkNvbW1hbmRzKFtbJ2dpdCcsICdyZW1vdGUnLCAnc2V0LXVybCcsICdvcmlnaW4nLCAnLS0nLCAnJXNhbml0aXplZFVybCUnXV0sICR1cmwsICRkaXIpOwoKcmV0dXJuIHRydWU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBmZXRjaFJlZk9yU3luY01pcnJvcihzdHJpbmcgJHVybCwgc3RyaW5nICRkaXIsIHN0cmluZyAkcmVmLCA/c3RyaW5nICRwcmV0dHlWZXJzaW9uID0gbnVsbCk6IGJvb2wKewppZiAoJHRoaXMtPmNoZWNrUmVmSXNJbk1pcnJvcigkZGlyLCAkcmVmKSkgewppZiAoUHJlZzo6aXNNYXRjaCgne15bYS1mMC05XXs0MH0kfScsICRyZWYpICYmICRwcmV0dHlWZXJzaW9uICE9PSBudWxsKSB7CiRicmFuY2ggPSBQcmVnOjpyZXBsYWNlKCd7KD86XmRldi18KD86XC54KT8tZGV2JCl9aScsICcnLCAkcHJldHR5VmVyc2lvbik7CiRicmFuY2hlcyA9IG51bGw7CiR0YWdzID0gbnVsbDsKaWYgKDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ2JyYW5jaCddLCAkb3V0cHV0LCAkZGlyKSkgewokYnJhbmNoZXMgPSAkb3V0cHV0Owp9CmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICd0YWcnXSwgJG91dHB1dCwgJGRpcikpIHsKJHRhZ3MgPSAkb3V0cHV0Owp9CgoKCgoKaWYgKG51bGwgIT09ICRicmFuY2hlcyAmJiAhUHJlZzo6aXNNYXRjaCgne15bXHMqXSp2PycucHJlZ19xdW90ZSgkYnJhbmNoKS4nJH1tJywgJGJyYW5jaGVzKQomJiBudWxsICE9PSAkdGFncyAmJiAhUHJlZzo6aXNNYXRjaCgne15bXHMqXSonLnByZWdfcXVvdGUoJGJyYW5jaCkuJyR9bScsICR0YWdzKQopIHsKJHRoaXMtPnN5bmNNaXJyb3IoJHVybCwgJGRpcik7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KCmlmICgkdGhpcy0+c3luY01pcnJvcigkdXJsLCAkZGlyKSkgewpyZXR1cm4gJHRoaXMtPmNoZWNrUmVmSXNJbk1pcnJvcigkZGlyLCAkcmVmKTsKfQoKcmV0dXJuIGZhbHNlOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldE5vU2hvd1NpZ25hdHVyZUZsYWcoUHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzKTogc3RyaW5nCnsKJGdpdFZlcnNpb24gPSBzZWxmOjpnZXRWZXJzaW9uKCRwcm9jZXNzKTsKaWYgKCRnaXRWZXJzaW9uICE9PSBudWxsICYmIHZlcnNpb25fY29tcGFyZSgkZ2l0VmVyc2lvbiwgJzIuMTAuMC1yYzAnLCAnPj0nKSkgewpyZXR1cm4gJyAtLW5vLXNob3ctc2lnbmF0dXJlJzsKfQoKcmV0dXJuICcnOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldE5vU2hvd1NpZ25hdHVyZUZsYWdzKFByb2Nlc3NFeGVjdXRvciAkcHJvY2Vzcyk6IGFycmF5CnsKJGZsYWdzID0gc3RhdGljOjpnZXROb1Nob3dTaWduYXR1cmVGbGFnKCRwcm9jZXNzKTsKaWYgKCcnID09PSAkZmxhZ3MpIHsKcmV0dXJuIFtdOwp9CgpyZXR1cm4gZXhwbG9kZSgnICcsIHN1YnN0cigkZmxhZ3MsIDEpKTsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN1cHBvcnRzTm9Db21taXRIZWFkZXJGbGFnKFByb2Nlc3NFeGVjdXRvciAkcHJvY2Vzcyk6IGJvb2wKewokZ2l0VmVyc2lvbiA9IHNlbGY6OmdldFZlcnNpb24oJHByb2Nlc3MpOwoKcmV0dXJuICRnaXRWZXJzaW9uICE9PSBudWxsICYmIHZlcnNpb25fY29tcGFyZSgkZ2l0VmVyc2lvbiwgJzIuMzMuMC1yYzAnLCAnPj0nKTsKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYnVpbGRSZXZMaXN0Q29tbWFuZChQcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MsIGFycmF5ICRhcmd1bWVudHMpOiBhcnJheQp7CiRjb21tYW5kID0gWydnaXQnLCAncmV2LWxpc3QnXTsKaWYgKHNlbGY6OnN1cHBvcnRzTm9Db21taXRIZWFkZXJGbGFnKCRwcm9jZXNzKSkgewokY29tbWFuZFtdID0gJy0tbm8tY29tbWl0LWhlYWRlcic7Cn0KCnJldHVybiBhcnJheV9tZXJnZSgkY29tbWFuZCwgJGFyZ3VtZW50cyk7Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwYXJzZVJldkxpc3RPdXRwdXQoc3RyaW5nICRvdXRwdXQsIFByb2Nlc3NFeGVjdXRvciAkcHJvY2Vzcyk6IHN0cmluZwp7CgppZiAoc2VsZjo6c3VwcG9ydHNOb0NvbW1pdEhlYWRlckZsYWcoJHByb2Nlc3MpKSB7CnJldHVybiAkb3V0cHV0Owp9CgoKcmV0dXJuIFByZWc6OnJlcGxhY2UoJ3teY29tbWl0IFthLWYwLTldezQwfVxuP31tJywgJycsICRvdXRwdXQpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGNoZWNrUmVmSXNJbk1pcnJvcihzdHJpbmcgJGRpciwgc3RyaW5nICRyZWYpOiBib29sCnsKaWYgKGlzX2RpcigkZGlyKSAmJiAwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdyZXYtcGFyc2UnLCAnLS1naXQtZGlyJ10sICRvdXRwdXQsICRkaXIpICYmIHRyaW0oJG91dHB1dCkgPT09ICcuJykgewokZXhpdENvZGUgPSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdyZXYtcGFyc2UnLCAnLS1xdWlldCcsICctLXZlcmlmeScsICRyZWYuJ157Y29tbWl0fSddLCAkaWdub3JlZE91dHB1dCwgJGRpcik7CmlmICgkZXhpdENvZGUgPT09IDApIHsKcmV0dXJuIHRydWU7Cn0KfQpzZWxmOjpjaGVja0ZvclJlcG9Pd25lcnNoaXBFcnJvcigkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSwgJGRpcik7CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0QXV0aGVudGljYXRpb25GYWlsdXJlKHN0cmluZyAkdXJsKTogP2FycmF5CnsKaWYgKCFQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XihodHRwcz86Ly8pKFteL10rKSguKikkfWknLCAkdXJsLCAkbWF0Y2gpKSB7CnJldHVybiBudWxsOwp9CgokYXV0aEZhaWx1cmVzID0gWwonZmF0YWw6IEF1dGhlbnRpY2F0aW9uIGZhaWxlZCcsCidyZW1vdGUgZXJyb3I6IEludmFsaWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQuJywKJ2Vycm9yOiA0MDEgVW5hdXRob3JpemVkJywKJ2ZhdGFsOiB1bmFibGUgdG8gYWNjZXNzJywKJ2ZhdGFsOiBjb3VsZCBub3QgcmVhZCBVc2VybmFtZScsCl07CgokZXJyb3JPdXRwdXQgPSAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKTsKZm9yZWFjaCAoJGF1dGhGYWlsdXJlcyBhcyAkYXV0aEZhaWx1cmUpIHsKaWYgKHN0cnBvcygkZXJyb3JPdXRwdXQsICRhdXRoRmFpbHVyZSkgIT09IGZhbHNlKSB7CnJldHVybiAkbWF0Y2g7Cn0KfQoKcmV0dXJuIG51bGw7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRNaXJyb3JEZWZhdWx0QnJhbmNoKHN0cmluZyAkdXJsLCBzdHJpbmcgJGRpciwgYm9vbCAkaXNMb2NhbFBhdGhSZXBvc2l0b3J5KTogP3N0cmluZwp7CmlmICgoYm9vbCkgUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfRElTQUJMRV9ORVRXT1JLJykpIHsKcmV0dXJuIG51bGw7Cn0KCnRyeSB7CmlmICgkaXNMb2NhbFBhdGhSZXBvc2l0b3J5KSB7CiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ3JlbW90ZScsICdzaG93JywgJ29yaWdpbiddLCAkb3V0cHV0LCAkZGlyKTsKfSBlbHNlIHsKJGNvbW1hbmRzID0gWwpbJ2dpdCcsICdyZW1vdGUnLCAnc2V0LXVybCcsICdvcmlnaW4nLCAnLS0nLCAnJXVybCUnXSwKWydnaXQnLCAncmVtb3RlJywgJ3Nob3cnLCAnb3JpZ2luJ10sClsnZ2l0JywgJ3JlbW90ZScsICdzZXQtdXJsJywgJ29yaWdpbicsICctLScsICclc2FuaXRpemVkVXJsJSddLApdOwoKJHRoaXMtPnJ1bkNvbW1hbmRzKCRjb21tYW5kcywgJHVybCwgJGRpciwgZmFsc2UsICRvdXRwdXQpOwp9CgokbGluZXMgPSAkdGhpcy0+cHJvY2Vzcy0+c3BsaXRMaW5lcygkb3V0cHV0KTsKZm9yZWFjaCAoJGxpbmVzIGFzICRsaW5lKSB7CmlmIChQcmVnOjppc01hdGNoKCd7XlxzKkhFQUQgYnJhbmNoOlxzKC4rKVxzKiR9bScsICRsaW5lLCAkbWF0Y2hlcykpIHsKcmV0dXJuICRtYXRjaGVzWzFdOwp9Cn0KfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj5GYWlsZWQgdG8gZmV0Y2ggcm9vdCBpZGVudGlmaWVyIGZyb20gcmVtb3RlOiAnIC4gJGUtPmdldE1lc3NhZ2UoKSAuICc8L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7Cn0KCnJldHVybiBudWxsOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNsZWFuRW52KD9Qcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MgPSBudWxsKTogdm9pZAp7CiRnaXRWZXJzaW9uID0gc2VsZjo6Z2V0VmVyc2lvbigkcHJvY2VzcyA/PyBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCkpOwppZiAoJGdpdFZlcnNpb24gIT09IG51bGwgJiYgdmVyc2lvbl9jb21wYXJlKCRnaXRWZXJzaW9uLCAnMi4zLjAnLCAnPj0nKSkgewoKaWYgKFBsYXRmb3JtOjpnZXRFbnYoJ0dJVF9URVJNSU5BTF9QUk9NUFQnKSAhPT0gJzAnKSB7ClBsYXRmb3JtOjpwdXRFbnYoJ0dJVF9URVJNSU5BTF9QUk9NUFQnLCAnMCcpOwp9Cn0gZWxzZSB7CgppZiAoUGxhdGZvcm06OmdldEVudignR0lUX0FTS1BBU1MnKSAhPT0gJ2VjaG8nKSB7ClBsYXRmb3JtOjpwdXRFbnYoJ0dJVF9BU0tQQVNTJywgJ2VjaG8nKTsKfQp9CgoKaWYgKFBsYXRmb3JtOjpnZXRFbnYoJ0dJVF9ESVInKSkgewpQbGF0Zm9ybTo6Y2xlYXJFbnYoJ0dJVF9ESVInKTsKfQppZiAoUGxhdGZvcm06OmdldEVudignR0lUX1dPUktfVFJFRScpKSB7ClBsYXRmb3JtOjpjbGVhckVudignR0lUX1dPUktfVFJFRScpOwp9CgoKaWYgKFBsYXRmb3JtOjpnZXRFbnYoJ0xBTkdVQUdFJykgIT09ICdDJykgewpQbGF0Zm9ybTo6cHV0RW52KCdMQU5HVUFHRScsICdDJyk7Cn0KCgpQbGF0Zm9ybTo6Y2xlYXJFbnYoJ0RZTERfTElCUkFSWV9QQVRIJyk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0R2l0SHViRG9tYWluc1JlZ2V4KENvbmZpZyAkY29uZmlnKTogc3RyaW5nCnsKcmV0dXJuICcoJyAuIGltcGxvZGUoJ3wnLCBhcnJheV9tYXAoJ3ByZWdfcXVvdGUnLCAkY29uZmlnLT5nZXQoJ2dpdGh1Yi1kb21haW5zJykpKSAuICcpJzsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRHaXRMYWJEb21haW5zUmVnZXgoQ29uZmlnICRjb25maWcpOiBzdHJpbmcKewpyZXR1cm4gJygnIC4gaW1wbG9kZSgnfCcsIGFycmF5X21hcCgncHJlZ19xdW90ZScsICRjb25maWctPmdldCgnZ2l0bGFiLWRvbWFpbnMnKSkpIC4gJyknOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gdGhyb3dFeGNlcHRpb24oJG1lc3NhZ2UsIHN0cmluZyAkdXJsKTogdm9pZAp7CgpjbGVhcnN0YXRjYWNoZSgpOwoKaWYgKDAgIT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJy0tdmVyc2lvbiddLCAkaWdub3JlZE91dHB1dCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKFVybDo6c2FuaXRpemUoJ0ZhaWxlZCB0byBjbG9uZSAnIC4gJHVybCAuICcsIGdpdCB3YXMgbm90IGZvdW5kLCBjaGVjayB0aGF0IGl0IGlzIGluc3RhbGxlZCBhbmQgaW4geW91ciBQQVRIIGVudi4nIC4gIlxuXG4iIC4gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCkpKTsKfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKFVybDo6c2FuaXRpemUoJG1lc3NhZ2UpKTsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFZlcnNpb24oUHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzKTogP3N0cmluZwp7CmlmIChmYWxzZSA9PT0gc2VsZjo6JHZlcnNpb24pIHsKc2VsZjo6JHZlcnNpb24gPSBudWxsOwppZiAoMCA9PT0gJHByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAnLS12ZXJzaW9uJ10sICRvdXRwdXQpICYmIFByZWc6OmlzTWF0Y2goJy9eZ2l0IHZlcnNpb24gKFxkKyg/OlwuXGQrKSspL20nLCAkb3V0cHV0LCAkbWF0Y2hlcykpIHsKc2VsZjo6JHZlcnNpb24gPSAkbWF0Y2hlc1sxXTsKfQp9CgpyZXR1cm4gc2VsZjo6JHZlcnNpb247Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gbWFza0NyZWRlbnRpYWxzKHN0cmluZyAkZXJyb3IsIGFycmF5ICRjcmVkZW50aWFscyk6IHN0cmluZwp7CiRtYXNrZWRDcmVkZW50aWFscyA9IFtdOwoKZm9yZWFjaCAoJGNyZWRlbnRpYWxzIGFzICRjcmVkZW50aWFsKSB7CmlmIChpbl9hcnJheSgkY3JlZGVudGlhbCwgWydwcml2YXRlLXRva2VuJywgJ3gtdG9rZW4tYXV0aCcsICdvYXV0aDInLCAnZ2l0bGFiLWNpLXRva2VuJywgJ3gtb2F1dGgtYmFzaWMnXSkpIHsKJG1hc2tlZENyZWRlbnRpYWxzW10gPSAkY3JlZGVudGlhbDsKfSBlbHNlaWYgKHN0cmxlbigkY3JlZGVudGlhbCkgPiA2KSB7CiRtYXNrZWRDcmVkZW50aWFsc1tdID0gc3Vic3RyKCRjcmVkZW50aWFsLCAwLCAzKSAuICcuLi4nIC4gc3Vic3RyKCRjcmVkZW50aWFsLCAtMyk7Cn0gZWxzZWlmIChzdHJsZW4oJGNyZWRlbnRpYWwpID4gMykgewokbWFza2VkQ3JlZGVudGlhbHNbXSA9IHN1YnN0cigkY3JlZGVudGlhbCwgMCwgMykgLiAnLi4uJzsKfSBlbHNlIHsKJG1hc2tlZENyZWRlbnRpYWxzW10gPSAnWFhYJzsKfQp9CgpyZXR1cm4gc3RyX3JlcGxhY2UoJGNyZWRlbnRpYWxzLCAkbWFza2VkQ3JlZGVudGlhbHMsICRlcnJvcik7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxGYWN0b3J5Owp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCmNsYXNzIEdpdEh1Ygp7CnB1YmxpYyBjb25zdCBHSVRIVUJfVE9LRU5fUkVHRVggPSAne14oW2EtZjAtOV17MTIsfXxnaFthLXpdX1thLXpBLVowLTlfLi1dK3xnaXRodWJfcGF0X1thLXpBLVowLTlfXSspJH0nOwoKCnByb3RlY3RlZCAkaW87Cgpwcm90ZWN0ZWQgJGNvbmZpZzsKCnByb3RlY3RlZCAkcHJvY2VzczsKCnByb3RlY3RlZCAkaHR0cERvd25sb2FkZXI7CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCA/UHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzID0gbnVsbCwgP0h0dHBEb3dubG9hZGVyICRodHRwRG93bmxvYWRlciA9IG51bGwpCnsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKJHRoaXMtPnByb2Nlc3MgPSAkcHJvY2VzcyA/OiBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7CiR0aGlzLT5odHRwRG93bmxvYWRlciA9ICRodHRwRG93bmxvYWRlciA/OiBGYWN0b3J5OjpjcmVhdGVIdHRwRG93bmxvYWRlcigkdGhpcy0+aW8sICRjb25maWcpOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXV0aG9yaXplT0F1dGgoc3RyaW5nICRvcmlnaW5VcmwpOiBib29sCnsKaWYgKCFpbl9hcnJheSgkb3JpZ2luVXJsLCAkdGhpcy0+Y29uZmlnLT5nZXQoJ2dpdGh1Yi1kb21haW5zJykpKSB7CnJldHVybiBmYWxzZTsKfQoKCmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdjb25maWcnLCAnZ2l0aHViLmFjY2Vzc3Rva2VuJ10sICRvdXRwdXQpKSB7CiR0aGlzLT5pby0+c2V0QXV0aGVudGljYXRpb24oJG9yaWdpblVybCwgdHJpbSgkb3V0cHV0KSwgJ3gtb2F1dGgtYmFzaWMnKTsKCnJldHVybiB0cnVlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhdXRob3JpemVPQXV0aEludGVyYWN0aXZlbHkoc3RyaW5nICRvcmlnaW5VcmwsID9zdHJpbmcgJG1lc3NhZ2UgPSBudWxsKTogYm9vbAp7CmlmICgkbWVzc2FnZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJG1lc3NhZ2UpOwp9Cgokbm90ZSA9ICdDb21wb3Nlcic7CmlmICgkdGhpcy0+Y29uZmlnLT5nZXQoJ2dpdGh1Yi1leHBvc2UtaG9zdG5hbWUnKSA9PT0gdHJ1ZSAmJiAwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2hvc3RuYW1lJ10sICRvdXRwdXQpKSB7CiRub3RlIC49ICcgb24gJyAuIHRyaW0oJG91dHB1dCk7Cn0KJG5vdGUgLj0gJyAnIC4gZGF0ZSgnWS1tLWQgSGknKTsKCiRsb2NhbEF1dGhDb25maWcgPSAkdGhpcy0+Y29uZmlnLT5nZXRMb2NhbEF1dGhDb25maWdTb3VyY2UoKTsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcihbCidZb3UgbmVlZCB0byBwcm92aWRlIGEgR2l0SHViIGFjY2VzcyB0b2tlbi4nLApzcHJpbnRmKCdUb2tlbnMgd2lsbCBiZSBzdG9yZWQgaW4gcGxhaW4gdGV4dCBpbiAiJXMiIGZvciBmdXR1cmUgdXNlIGJ5IENvbXBvc2VyLicsICgkbG9jYWxBdXRoQ29uZmlnICE9PSBudWxsID8gJGxvY2FsQXV0aENvbmZpZy0+Z2V0TmFtZSgpIC4gJyBPUiAnIDogJycpIC4gJHRoaXMtPmNvbmZpZy0+Z2V0QXV0aENvbmZpZ1NvdXJjZSgpLT5nZXROYW1lKCkpLAonRHVlIHRvIHRoZSBzZWN1cml0eSByaXNrIG9mIHRva2VucyBiZWluZyBleGZpbHRyYXRlZCwgdXNlIHRva2VucyB3aXRoIHNob3J0IGV4cGlyYXRpb24gdGltZXMgYW5kIG9ubHkgdGhlIG1pbmltdW0gcGVybWlzc2lvbnMgbmVjZXNzYXJ5LicsCicnLAonQ2FyZWZ1bGx5IGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBpbiBvcmRlcjonLAonJywKXSk7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoWwonMS4gV2hlbiB5b3UgZG9uXCd0IHVzZSBcJ3Zjc1wnICB0eXBlIFwncmVwb3NpdG9yaWVzXCcgIGluIGNvbXBvc2VyLmpzb24gYW5kIGRvIG5vdCBuZWVkIHRvIGNsb25lIHNvdXJjZSBvciBkb3dubG9hZCBkaXN0IGZpbGVzJywKJ2Zyb20gcHJpdmF0ZSBHaXRIdWIgcmVwb3NpdG9yaWVzIG92ZXIgSFRUUFMsIHVzZSBhIGZpbmUtZ3JhaW5lZCB0b2tlbiB3aXRoIHJlYWQtb25seSBhY2Nlc3MgdG8gcHVibGljIGluZm9ybWF0aW9uLicsCidVc2UgdGhlIGZvbGxvd2luZyBVUkwgdG8gY3JlYXRlIHN1Y2ggYSB0b2tlbjonLAonaHR0cHM6Ly8nLiRvcmlnaW5VcmwuJy9zZXR0aW5ncy9wZXJzb25hbC1hY2Nlc3MtdG9rZW5zL25ldz9uYW1lPScgLiBzdHJfcmVwbGFjZSgnJTIwJywgJysnLCByYXd1cmxlbmNvZGUoJG5vdGUpKSwKJycsCl0pOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKFsKJzIuIFdoZW4gYWxsIHJlbGV2YW50IF9wcml2YXRlXyBHaXRIdWIgcmVwb3NpdG9yaWVzIGJlbG9uZyB0byBhIHNpbmdsZSB1c2VyIG9yIG9yZ2FuaXNhdGlvbiwgdXNlIGEgZmluZS1ncmFpbmVkIHRva2VuIHdpdGgnLAoncmVwb3NpdG9yeSAiY29udGVudCIgcmVhZC1vbmx5IHBlcm1pc3Npb25zLiBZb3UgY2FuIHN0YXJ0IHdpdGggdGhlIGZvbGxvd2luZyBVUkwsIGJ1dCB5b3UgbWF5IG5lZWQgdG8gY2hhbmdlIHRoZSByZXNvdXJjZSBvd25lcicsCid0byB0aGUgcmlnaHQgdXNlciBvciBvcmdhbmlzYXRpb24uIEFkZGl0aW9uYWxseSwgeW91IGNhbiBzY29wZSBwZXJtaXNzaW9ucyBkb3duIHRvIGFwcGx5IG9ubHkgdG8gc2VsZWN0ZWQgcmVwb3NpdG9yaWVzLicsCidodHRwczovLycuJG9yaWdpblVybC4nL3NldHRpbmdzL3BlcnNvbmFsLWFjY2Vzcy10b2tlbnMvbmV3P2NvbnRlbnRzPXJlYWQmbmFtZT0nIC4gc3RyX3JlcGxhY2UoJyUyMCcsICcrJywgcmF3dXJsZW5jb2RlKCRub3RlKSksCicnLApdKTsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcihbCiczLiBBICJjbGFzc2ljIiB0b2tlbiBncmFudHMgYnJvYWQgcGVybWlzc2lvbnMgb24geW91ciBiZWhhbGYgdG8gYWxsIHJlcG9zaXRvcmllcyBhY2Nlc3NpYmxlIGJ5IHlvdS4nLAonVGhpcyBtYXkgaW5jbHVkZSB3cml0ZSBwZXJtaXNzaW9ucywgZXZlbiB0aG91Z2ggbm90IG5lZWRlZCBieSBDb21wb3Nlci4gVXNlIGl0IG9ubHkgd2hlbiB5b3UgbmVlZCB0byBhY2Nlc3MnLAoncHJpdmF0ZSByZXBvc2l0b3JpZXMgYWNyb3NzIG11bHRpcGxlIG9yZ2FuaXNhdGlvbnMgYXQgdGhlIHNhbWUgdGltZSBhbmQgdXNpbmcgZGlyZWN0b3J5LXNwZWNpZmljIGF1dGhlbnRpY2F0aW9uIHNvdXJjZXMnLAonaXMgbm90IGFuIG9wdGlvbi4gWW91IGNhbiBnZW5lcmF0ZSBhIGNsYXNzaWMgdG9rZW4gaGVyZTonLAonaHR0cHM6Ly8nLiRvcmlnaW5VcmwuJy9zZXR0aW5ncy90b2tlbnMvbmV3P3Njb3Blcz1yZXBvJmRlc2NyaXB0aW9uPScgLiBzdHJfcmVwbGFjZSgnJTIwJywgJysnLCByYXd1cmxlbmNvZGUoJG5vdGUpKSwKJycsCl0pOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdGb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgY2hlY2sgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jL2FydGljbGVzL2F1dGhlbnRpY2F0aW9uLWZvci1wcml2YXRlLXBhY2thZ2VzLm1kI2dpdGh1Yi1vYXV0aCcpOwoKJHN0b3JlSW5Mb2NhbEF1dGhDb25maWcgPSBmYWxzZTsKaWYgKCRsb2NhbEF1dGhDb25maWcgIT09IG51bGwpIHsKJHN0b3JlSW5Mb2NhbEF1dGhDb25maWcgPSAkdGhpcy0+aW8tPmFza0NvbmZpcm1hdGlvbignQSBsb2NhbCBhdXRoIGNvbmZpZyBzb3VyY2Ugd2FzIGZvdW5kLCBkbyB5b3Ugd2FudCB0byBzdG9yZSB0aGUgdG9rZW4gdGhlcmU/JywgdHJ1ZSk7Cn0KCiR0b2tlbiA9IHRyaW0oKHN0cmluZykgJHRoaXMtPmlvLT5hc2tBbmRIaWRlQW5zd2VyKCdUb2tlbiAoaGlkZGVuKTogJykpOwoKaWYgKCR0b2tlbiA9PT0gJycpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5ObyB0b2tlbiBnaXZlbiwgYWJvcnRpbmcuPC93YXJuaW5nPicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1lvdSBjYW4gYWxzbyBhZGQgaXQgbWFudWFsbHkgbGF0ZXIgYnkgdXNpbmcgImNvbXBvc2VyIGNvbmZpZyAtLWdsb2JhbCAtLWF1dGggZ2l0aHViLW9hdXRoLmdpdGh1Yi5jb20gPHRva2VuPiInKTsKCnJldHVybiBmYWxzZTsKfQoKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luVXJsLCAkdG9rZW4sICd4LW9hdXRoLWJhc2ljJyk7Cgp0cnkgewokYXBpVXJsID0gKCdnaXRodWIuY29tJyA9PT0gJG9yaWdpblVybCkgPyAnYXBpLmdpdGh1Yi5jb20vJyA6ICRvcmlnaW5VcmwgLiAnL2FwaS92My8nOwoKJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoJ2h0dHBzOi8vJy4gJGFwaVVybCwgWwoncmV0cnktYXV0aC1mYWlsdXJlJyA9PiBmYWxzZSwKXSk7Cn0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgewppZiAoaW5fYXJyYXkoJGUtPmdldENvZGUoKSwgWzQwMywgNDAxXSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+SW52YWxpZCB0b2tlbiBwcm92aWRlZC48L2Vycm9yPicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1lvdSBjYW4gYWxzbyBhZGQgaXQgbWFudWFsbHkgbGF0ZXIgYnkgdXNpbmcgImNvbXBvc2VyIGNvbmZpZyAtLWdsb2JhbCAtLWF1dGggZ2l0aHViLW9hdXRoLmdpdGh1Yi5jb20gPHRva2VuPiInKTsKCnJldHVybiBmYWxzZTsKfQoKdGhyb3cgJGU7Cn0KCgokYXV0aENvbmZpZ1NvdXJjZSA9ICRzdG9yZUluTG9jYWxBdXRoQ29uZmlnICYmICRsb2NhbEF1dGhDb25maWcgIT09IG51bGwgPyAkbG9jYWxBdXRoQ29uZmlnIDogJHRoaXMtPmNvbmZpZy0+Z2V0QXV0aENvbmZpZ1NvdXJjZSgpOwokdGhpcy0+Y29uZmlnLT5nZXRDb25maWdTb3VyY2UoKS0+cmVtb3ZlQ29uZmlnU2V0dGluZygnZ2l0aHViLW9hdXRoLicuJG9yaWdpblVybCk7CiRhdXRoQ29uZmlnU291cmNlLT5hZGRDb25maWdTZXR0aW5nKCdnaXRodWItb2F1dGguJy4kb3JpZ2luVXJsLCAkdG9rZW4pOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8aW5mbz5Ub2tlbiBzdG9yZWQgc3VjY2Vzc2Z1bGx5LjwvaW5mbz4nKTsKCnJldHVybiB0cnVlOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJhdGVMaW1pdChhcnJheSAkaGVhZGVycyk6IGFycmF5CnsKJHJhdGVMaW1pdCA9IFsKJ2xpbWl0JyA9PiAnPycsCidyZXNldCcgPT4gJz8nLApdOwoKZm9yZWFjaCAoJGhlYWRlcnMgYXMgJGhlYWRlcikgewokaGVhZGVyID0gdHJpbSgkaGVhZGVyKTsKaWYgKGZhbHNlID09PSBzdHJpcG9zKCRoZWFkZXIsICd4LXJhdGVsaW1pdC0nKSkgewpjb250aW51ZTsKfQpbJHR5cGUsICR2YWx1ZV0gPSBleHBsb2RlKCc6JywgJGhlYWRlciwgMik7CnN3aXRjaCAoc3RydG9sb3dlcigkdHlwZSkpIHsKY2FzZSAneC1yYXRlbGltaXQtbGltaXQnOgokcmF0ZUxpbWl0WydsaW1pdCddID0gKGludCkgdHJpbSgkdmFsdWUpOwpicmVhazsKY2FzZSAneC1yYXRlbGltaXQtcmVzZXQnOgokcmF0ZUxpbWl0WydyZXNldCddID0gZGF0ZSgnWS1tLWQgSDppOnMnLCAoaW50KSB0cmltKCR2YWx1ZSkpOwpicmVhazsKfQp9CgpyZXR1cm4gJHJhdGVMaW1pdDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3NvVXJsKGFycmF5ICRoZWFkZXJzKTogP3N0cmluZwp7CmZvcmVhY2ggKCRoZWFkZXJzIGFzICRoZWFkZXIpIHsKJGhlYWRlciA9IHRyaW0oJGhlYWRlcik7CmlmIChmYWxzZSA9PT0gc3RyaXBvcygkaGVhZGVyLCAneC1naXRodWItc3NvOiByZXF1aXJlZCcpKSB7CmNvbnRpbnVlOwp9CmlmIChQcmVnOjppc01hdGNoKCd7XGJ1cmw9KD9QPHVybD5bXlxzO10rKX0nLCAkaGVhZGVyLCAkbWF0Y2gpKSB7CnJldHVybiAkbWF0Y2hbJ3VybCddOwp9Cn0KCnJldHVybiBudWxsOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1JhdGVMaW1pdGVkKGFycmF5ICRoZWFkZXJzKTogYm9vbAp7CmZvcmVhY2ggKCRoZWFkZXJzIGFzICRoZWFkZXIpIHsKaWYgKFByZWc6OmlzTWF0Y2goJ3teeC1yYXRlbGltaXQtcmVtYWluaW5nOiAqMCR9aScsIHRyaW0oJGhlYWRlcikpKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXF1aXJlc1NzbyhhcnJheSAkaGVhZGVycyk6IGJvb2wKewpmb3JlYWNoICgkaGVhZGVycyBhcyAkaGVhZGVyKSB7CmlmIChQcmVnOjppc01hdGNoKCd7XngtZ2l0aHViLXNzbzogcmVxdWlyZWR9aScsIHRyaW0oJGhlYWRlcikpKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKY2xhc3MgR2l0TGFiCnsKCnByb3RlY3RlZCAkaW87Cgpwcm90ZWN0ZWQgJGNvbmZpZzsKCnByb3RlY3RlZCAkcHJvY2VzczsKCnByb3RlY3RlZCAkaHR0cERvd25sb2FkZXI7CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCA/UHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzID0gbnVsbCwgP0h0dHBEb3dubG9hZGVyICRodHRwRG93bmxvYWRlciA9IG51bGwpCnsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKJHRoaXMtPnByb2Nlc3MgPSAkcHJvY2VzcyA/OiBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7CiR0aGlzLT5odHRwRG93bmxvYWRlciA9ICRodHRwRG93bmxvYWRlciA/OiBGYWN0b3J5OjpjcmVhdGVIdHRwRG93bmxvYWRlcigkdGhpcy0+aW8sICRjb25maWcpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGF1dGhvcml6ZU9BdXRoKHN0cmluZyAkb3JpZ2luVXJsKTogYm9vbAp7CgokYmNPcmlnaW5VcmwgPSBQcmVnOjpyZXBsYWNlKCd7OlxkK30nLCAnJywgJG9yaWdpblVybCk7CgppZiAoIWluX2FycmF5KCRvcmlnaW5VcmwsICR0aGlzLT5jb25maWctPmdldCgnZ2l0bGFiLWRvbWFpbnMnKSwgdHJ1ZSkgJiYgIWluX2FycmF5KCRiY09yaWdpblVybCwgJHRoaXMtPmNvbmZpZy0+Z2V0KCdnaXRsYWItZG9tYWlucycpLCB0cnVlKSkgewpyZXR1cm4gZmFsc2U7Cn0KCgppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAnY29uZmlnJywgJ2dpdGxhYi5hY2Nlc3N0b2tlbiddLCAkb3V0cHV0KSkgewokdGhpcy0+aW8tPnNldEF1dGhlbnRpY2F0aW9uKCRvcmlnaW5VcmwsIHRyaW0oJG91dHB1dCksICdvYXV0aDInKTsKCnJldHVybiB0cnVlOwp9CgoKaWYgKDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ2NvbmZpZycsICdnaXRsYWIuZGVwbG95dG9rZW4udXNlciddLCAkdG9rZW5Vc2VyKSAmJiAwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdjb25maWcnLCAnZ2l0bGFiLmRlcGxveXRva2VuLnRva2VuJ10sICR0b2tlblBhc3N3b3JkKSkgewokdGhpcy0+aW8tPnNldEF1dGhlbnRpY2F0aW9uKCRvcmlnaW5VcmwsIHRyaW0oJHRva2VuVXNlciksIHRyaW0oJHRva2VuUGFzc3dvcmQpKTsKCnJldHVybiB0cnVlOwp9CgoKJGF1dGhUb2tlbnMgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2dpdGxhYi10b2tlbicpOwoKaWYgKGlzc2V0KCRhdXRoVG9rZW5zWyRvcmlnaW5VcmxdKSkgewokdG9rZW4gPSAkYXV0aFRva2Vuc1skb3JpZ2luVXJsXTsKfQoKaWYgKGlzc2V0KCRhdXRoVG9rZW5zWyRiY09yaWdpblVybF0pKSB7CiR0b2tlbiA9ICRhdXRoVG9rZW5zWyRiY09yaWdpblVybF07Cn0KCmlmIChpc3NldCgkdG9rZW4pKSB7CiR1c2VybmFtZSA9IGlzX2FycmF5KCR0b2tlbikgPyAkdG9rZW5bInVzZXJuYW1lIl0gOiAkdG9rZW47CiRwYXNzd29yZCA9IGlzX2FycmF5KCR0b2tlbikgPyAkdG9rZW5bInRva2VuIl0gOiAncHJpdmF0ZS10b2tlbic7CgoKCmlmIChpbl9hcnJheSgkdXNlcm5hbWUsIFsncHJpdmF0ZS10b2tlbicsICdnaXRsYWItY2ktdG9rZW4nLCAnb2F1dGgyJ10sIHRydWUpKSB7CiR0aGlzLT5pby0+c2V0QXV0aGVudGljYXRpb24oJG9yaWdpblVybCwgJHBhc3N3b3JkLCAkdXNlcm5hbWUpOwp9IGVsc2UgewokdGhpcy0+aW8tPnNldEF1dGhlbnRpY2F0aW9uKCRvcmlnaW5VcmwsICR1c2VybmFtZSwgJHBhc3N3b3JkKTsKfQoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGF1dGhvcml6ZU9BdXRoSW50ZXJhY3RpdmVseShzdHJpbmcgJHNjaGVtZSwgc3RyaW5nICRvcmlnaW5VcmwsID9zdHJpbmcgJG1lc3NhZ2UgPSBudWxsKTogYm9vbAp7CmlmICgkbWVzc2FnZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJG1lc3NhZ2UpOwp9CgokbG9jYWxBdXRoQ29uZmlnID0gJHRoaXMtPmNvbmZpZy0+Z2V0TG9jYWxBdXRoQ29uZmlnU291cmNlKCk7CiRwZXJzb25hbEFjY2Vzc1Rva2VuTGluayA9ICRzY2hlbWUuJzovLycuJG9yaWdpblVybC4nLy0vdXNlcl9zZXR0aW5ncy9wZXJzb25hbF9hY2Nlc3NfdG9rZW5zJzsKJHJldm9rZUxpbmsgPSAkc2NoZW1lLic6Ly8nLiRvcmlnaW5VcmwuJy8tL3VzZXJfc2V0dGluZ3MvYXBwbGljYXRpb25zJzsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoJ0EgdG9rZW4gd2lsbCBiZSBjcmVhdGVkIGFuZCBzdG9yZWQgaW4gIiVzIiwgeW91ciBwYXNzd29yZCB3aWxsIG5ldmVyIGJlIHN0b3JlZCcsICgkbG9jYWxBdXRoQ29uZmlnICE9PSBudWxsID8gJGxvY2FsQXV0aENvbmZpZy0+Z2V0TmFtZSgpIC4gJyBPUiAnIDogJycpIC4gJHRoaXMtPmNvbmZpZy0+Z2V0QXV0aENvbmZpZ1NvdXJjZSgpLT5nZXROYW1lKCkpKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdUbyByZXZva2UgYWNjZXNzIHRvIHRoaXMgdG9rZW4geW91IGNhbiB2aXNpdDonKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRyZXZva2VMaW5rKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gc2V0dXAgYW4gcGVyc29uYWwgYWNjZXNzIHRva2VuIG9uOicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJHBlcnNvbmFsQWNjZXNzVG9rZW5MaW5rKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdhbmQgc3RvcmUgaXQgdW5kZXIgImdpdGxhYi10b2tlbiIgc2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy9hcnRpY2xlcy9hdXRoZW50aWNhdGlvbi1mb3ItcHJpdmF0ZS1wYWNrYWdlcy5tZCNnaXRsYWItdG9rZW4gZm9yIG1vcmUgZGV0YWlscy4nKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvYXJ0aWNsZXMvYXV0aGVudGljYXRpb24tZm9yLXByaXZhdGUtcGFja2FnZXMubWQjZ2l0bGFiLXRva2VuJyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignZm9yIG1vcmUgZGV0YWlscy4nKTsKCiRzdG9yZUluTG9jYWxBdXRoQ29uZmlnID0gZmFsc2U7CmlmICgkbG9jYWxBdXRoQ29uZmlnICE9PSBudWxsKSB7CiRzdG9yZUluTG9jYWxBdXRoQ29uZmlnID0gJHRoaXMtPmlvLT5hc2tDb25maXJtYXRpb24oJ0EgbG9jYWwgYXV0aCBjb25maWcgc291cmNlIHdhcyBmb3VuZCwgZG8geW91IHdhbnQgdG8gc3RvcmUgdGhlIHRva2VuIHRoZXJlPycsIHRydWUpOwp9CgokYXR0ZW1wdENvdW50ZXIgPSAwOwoKd2hpbGUgKCRhdHRlbXB0Q291bnRlcisrIDwgNSkgewp0cnkgewokcmVzcG9uc2UgPSAkdGhpcy0+Y3JlYXRlVG9rZW4oJHNjaGVtZSwgJG9yaWdpblVybCk7Cn0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgewoKCmlmIChpbl9hcnJheSgkZS0+Z2V0Q29kZSgpLCBbNDAzLCA0MDFdKSkgewppZiAoNDAxID09PSAkZS0+Z2V0Q29kZSgpKSB7CiRyZXNwb25zZSA9IGpzb25fZGVjb2RlKCRlLT5nZXRSZXNwb25zZSgpLCB0cnVlKTsKaWYgKGlzc2V0KCRyZXNwb25zZVsnZXJyb3InXSkgJiYgJHJlc3BvbnNlWydlcnJvciddID09PSAnaW52YWxpZF9ncmFudCcpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdCYWQgY3JlZGVudGlhbHMuIElmIHlvdSBoYXZlIHR3byBmYWN0b3IgYXV0aGVudGljYXRpb24gZW5hYmxlZCB5b3Ugd2lsbCBoYXZlIHRvIG1hbnVhbGx5IGNyZWF0ZSBhIHBlcnNvbmFsIGFjY2VzcyB0b2tlbicpOwp9IGVsc2UgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0JhZCBjcmVkZW50aWFscy4nKTsKfQp9IGVsc2UgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ01heGltdW0gbnVtYmVyIG9mIGxvZ2luIGF0dGVtcHRzIGV4Y2VlZGVkLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLicpOwp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1lvdSBjYW4gYWxzbyBtYW51YWxseSBjcmVhdGUgYSBwZXJzb25hbCBhY2Nlc3MgdG9rZW4gZW5hYmxpbmcgdGhlICJyZWFkX2FwaSIgc2NvcGUgYXQ6Jyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigkcGVyc29uYWxBY2Nlc3NUb2tlbkxpbmspOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0FkZCBpdCB1c2luZyAiY29tcG9zZXIgY29uZmlnIC0tZ2xvYmFsIC0tYXV0aCBnaXRsYWItdG9rZW4uJy4kb3JpZ2luVXJsLicgPHRva2VuPiInKTsKCmNvbnRpbnVlOwp9Cgp0aHJvdyAkZTsKfQoKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luVXJsLCAkcmVzcG9uc2VbJ2FjY2Vzc190b2tlbiddLCAnb2F1dGgyJyk7CgokYXV0aENvbmZpZ1NvdXJjZSA9ICRzdG9yZUluTG9jYWxBdXRoQ29uZmlnICYmICRsb2NhbEF1dGhDb25maWcgIT09IG51bGwgPyAkbG9jYWxBdXRoQ29uZmlnIDogJHRoaXMtPmNvbmZpZy0+Z2V0QXV0aENvbmZpZ1NvdXJjZSgpOwoKaWYgKGlzc2V0KCRyZXNwb25zZVsnZXhwaXJlc19pbiddKSkgewokYXV0aENvbmZpZ1NvdXJjZS0+YWRkQ29uZmlnU2V0dGluZygKJ2dpdGxhYi1vYXV0aC4nLiRvcmlnaW5VcmwsClsKJ2V4cGlyZXMtYXQnID0+IGludHZhbCgkcmVzcG9uc2VbJ2NyZWF0ZWRfYXQnXSkgKyBpbnR2YWwoJHJlc3BvbnNlWydleHBpcmVzX2luJ10pLAoncmVmcmVzaC10b2tlbicgPT4gJHJlc3BvbnNlWydyZWZyZXNoX3Rva2VuJ10sCid0b2tlbicgPT4gJHJlc3BvbnNlWydhY2Nlc3NfdG9rZW4nXSwKXQopOwp9IGVsc2UgewokYXV0aENvbmZpZ1NvdXJjZS0+YWRkQ29uZmlnU2V0dGluZygnZ2l0bGFiLW9hdXRoLicuJG9yaWdpblVybCwgJHJlc3BvbnNlWydhY2Nlc3NfdG9rZW4nXSk7Cn0KCnJldHVybiB0cnVlOwp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ludmFsaWQgR2l0TGFiIGNyZWRlbnRpYWxzIDUgdGltZXMgaW4gYSByb3csIGFib3J0aW5nLicpOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhdXRob3JpemVPQXV0aFJlZnJlc2goc3RyaW5nICRzY2hlbWUsIHN0cmluZyAkb3JpZ2luVXJsKTogYm9vbAp7CnRyeSB7CiRyZXNwb25zZSA9ICR0aGlzLT5yZWZyZXNoVG9rZW4oJHNjaGVtZSwgJG9yaWdpblVybCk7Cn0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIkNvdWxkbid0IHJlZnJlc2ggYWNjZXNzIHRva2VuOiAiLiRlLT5nZXRNZXNzYWdlKCkpOwoKcmV0dXJuIGZhbHNlOwp9CgokdGhpcy0+aW8tPnNldEF1dGhlbnRpY2F0aW9uKCRvcmlnaW5VcmwsICRyZXNwb25zZVsnYWNjZXNzX3Rva2VuJ10sICdvYXV0aDInKTsKCgokdGhpcy0+Y29uZmlnLT5nZXRBdXRoQ29uZmlnU291cmNlKCktPmFkZENvbmZpZ1NldHRpbmcoCidnaXRsYWItb2F1dGguJy4kb3JpZ2luVXJsLApbCidleHBpcmVzLWF0JyA9PiBpbnR2YWwoJHJlc3BvbnNlWydjcmVhdGVkX2F0J10pICsgaW50dmFsKCRyZXNwb25zZVsnZXhwaXJlc19pbiddKSwKJ3JlZnJlc2gtdG9rZW4nID0+ICRyZXNwb25zZVsncmVmcmVzaF90b2tlbiddLAondG9rZW4nID0+ICRyZXNwb25zZVsnYWNjZXNzX3Rva2VuJ10sCl0KKTsKCnJldHVybiB0cnVlOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gY3JlYXRlVG9rZW4oc3RyaW5nICRzY2hlbWUsIHN0cmluZyAkb3JpZ2luVXJsKTogYXJyYXkKewokdXNlcm5hbWUgPSAkdGhpcy0+aW8tPmFzaygnVXNlcm5hbWU6ICcpOwokcGFzc3dvcmQgPSAkdGhpcy0+aW8tPmFza0FuZEhpZGVBbnN3ZXIoJ1Bhc3N3b3JkOiAnKTsKCiRoZWFkZXJzID0gWydDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCddOwoKJGFwaVVybCA9ICRvcmlnaW5Vcmw7CiRkYXRhID0gaHR0cF9idWlsZF9xdWVyeShbCid1c2VybmFtZScgPT4gJHVzZXJuYW1lLAoncGFzc3dvcmQnID0+ICRwYXNzd29yZCwKJ2dyYW50X3R5cGUnID0+ICdwYXNzd29yZCcsCl0sICcnLCAnJicpOwokb3B0aW9ucyA9IFsKJ3JldHJ5LWF1dGgtZmFpbHVyZScgPT4gZmFsc2UsCidodHRwJyA9PiBbCidtZXRob2QnID0+ICdQT1NUJywKJ2hlYWRlcicgPT4gJGhlYWRlcnMsCidjb250ZW50JyA9PiAkZGF0YSwKXSwKXTsKCiR0b2tlbiA9ICR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KCRzY2hlbWUuJzovLycuJGFwaVVybC4nL29hdXRoL3Rva2VuJywgJG9wdGlvbnMpLT5kZWNvZGVKc29uKCk7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1Rva2VuIHN1Y2Nlc3NmdWxseSBjcmVhdGVkJyk7CgpyZXR1cm4gJHRva2VuOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc09BdXRoRXhwaXJlZChzdHJpbmcgJG9yaWdpblVybCk6IGJvb2wKewokYXV0aFRva2VucyA9ICR0aGlzLT5jb25maWctPmdldCgnZ2l0bGFiLW9hdXRoJyk7CmlmIChpc3NldCgkYXV0aFRva2Vuc1skb3JpZ2luVXJsXVsnZXhwaXJlcy1hdCddKSkgewppZiAoJGF1dGhUb2tlbnNbJG9yaWdpblVybF1bJ2V4cGlyZXMtYXQnXSA8IHRpbWUoKSkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiByZWZyZXNoVG9rZW4oc3RyaW5nICRzY2hlbWUsIHN0cmluZyAkb3JpZ2luVXJsKTogYXJyYXkKewokYXV0aFRva2VucyA9ICR0aGlzLT5jb25maWctPmdldCgnZ2l0bGFiLW9hdXRoJyk7CmlmICghaXNzZXQoJGF1dGhUb2tlbnNbJG9yaWdpblVybF1bJ3JlZnJlc2gtdG9rZW4nXSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdObyBHaXRMYWIgcmVmcmVzaCB0b2tlbiBwcmVzZW50IGZvciAnLiRvcmlnaW5VcmwuJy4nKTsKfQoKJHJlZnJlc2hUb2tlbiA9ICRhdXRoVG9rZW5zWyRvcmlnaW5VcmxdWydyZWZyZXNoLXRva2VuJ107CiRoZWFkZXJzID0gWydDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCddOwoKJGRhdGEgPSBodHRwX2J1aWxkX3F1ZXJ5KFsKJ3JlZnJlc2hfdG9rZW4nID0+ICRyZWZyZXNoVG9rZW4sCidncmFudF90eXBlJyA9PiAncmVmcmVzaF90b2tlbicsCl0sICcnLCAnJicpOwokb3B0aW9ucyA9IFsKJ3JldHJ5LWF1dGgtZmFpbHVyZScgPT4gZmFsc2UsCidodHRwJyA9PiBbCidtZXRob2QnID0+ICdQT1NUJywKJ2hlYWRlcicgPT4gJGhlYWRlcnMsCidjb250ZW50JyA9PiAkZGF0YSwKXSwKXTsKCiR0b2tlbiA9ICR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KCRzY2hlbWUuJzovLycuJG9yaWdpblVybC4nL29hdXRoL3Rva2VuJywgJG9wdGlvbnMpLT5kZWNvZGVKc29uKCk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignR2l0TGFiIHRva2VuIHN1Y2Nlc3NmdWxseSByZWZyZXNoZWQnLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSWV9WRVJCT1NFKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdUbyByZXZva2UgYWNjZXNzIHRvIHRoaXMgdG9rZW4geW91IGNhbiB2aXNpdCAnLiRzY2hlbWUuJzovLycuJG9yaWdpblVybC4nLy0vdXNlcl9zZXR0aW5ncy9hcHBsaWNhdGlvbnMnLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSWV9WRVJCT1NFKTsKCnJldHVybiAkdG9rZW47Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCmNsYXNzIEhnCnsKCnByaXZhdGUgc3RhdGljICR2ZXJzaW9uID0gZmFsc2U7CgoKCgpwcml2YXRlICRpbzsKCgoKCnByaXZhdGUgJGNvbmZpZzsKCgoKCnByaXZhdGUgJHByb2Nlc3M7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgUHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzKQp7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7CiR0aGlzLT5wcm9jZXNzID0gJHByb2Nlc3M7Cn0KCnB1YmxpYyBmdW5jdGlvbiBydW5Db21tYW5kKGNhbGxhYmxlICRjb21tYW5kQ2FsbGFibGUsIHN0cmluZyAkdXJsLCA/c3RyaW5nICRjd2QpOiB2b2lkCnsKJHRoaXMtPmNvbmZpZy0+cHJvaGliaXRVcmxCeUNvbmZpZygkdXJsLCAkdGhpcy0+aW8pOwoKCiRjb21tYW5kID0gJGNvbW1hbmRDYWxsYWJsZSgkdXJsKTsKCmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY29tbWFuZCwgJGlnbm9yZWRPdXRwdXQsICRjd2QpKSB7CnJldHVybjsKfQoKCmlmICgKUHJlZzo6aXNNYXRjaCgne14oP1A8cHJvdG8+c3NofGh0dHBzPyk6Ly8oPzooP1A8dXNlcj5bXjpAXSspKD86Oig/UDxwYXNzPlteOkBdKykpP0ApPyg/UDxob3N0PlteL10rKSg/UDxwYXRoPi8uKik/fW1pJywgJHVybCwgJG1hdGNoZXMpCiYmICR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJG1hdGNoZXNbJ2hvc3QnXSkKKSB7CmlmICgkbWF0Y2hlc1sncHJvdG8nXSA9PT0gJ3NzaCcpIHsKJHVzZXIgPSAnJzsKaWYgKCRtYXRjaGVzWyd1c2VyJ10gIT09IG51bGwpIHsKJHVzZXIgPSByYXd1cmxlbmNvZGUoJG1hdGNoZXNbJ3VzZXInXSkgLiAnQCc7Cn0KJGF1dGhlbnRpY2F0ZWRVcmwgPSAkbWF0Y2hlc1sncHJvdG8nXSAuICc6Ly8nIC4gJHVzZXIgLiAkbWF0Y2hlc1snaG9zdCddIC4gJG1hdGNoZXNbJ3BhdGgnXTsKfSBlbHNlIHsKJGF1dGggPSAkdGhpcy0+aW8tPmdldEF1dGhlbnRpY2F0aW9uKCRtYXRjaGVzWydob3N0J10pOwokYXV0aGVudGljYXRlZFVybCA9ICRtYXRjaGVzWydwcm90byddIC4gJzovLycgLiByYXd1cmxlbmNvZGUoKHN0cmluZykgJGF1dGhbJ3VzZXJuYW1lJ10pIC4gJzonIC4gcmF3dXJsZW5jb2RlKChzdHJpbmcpICRhdXRoWydwYXNzd29yZCddKSAuICdAJyAuICRtYXRjaGVzWydob3N0J10gLiAkbWF0Y2hlc1sncGF0aCddOwp9CiRjb21tYW5kID0gJGNvbW1hbmRDYWxsYWJsZSgkYXV0aGVudGljYXRlZFVybCk7CgppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRpZ25vcmVkT3V0cHV0LCAkY3dkKSkgewpyZXR1cm47Cn0KCiRlcnJvciA9ICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpOwp9IGVsc2UgewokZXJyb3IgPSAnVGhlIGdpdmVuIFVSTCAoJyAuJHVybC4gJykgZG9lcyBub3QgbWF0Y2ggdGhlIHJlcXVpcmVkIGZvcm1hdCAoc3NofGh0dHAocyk6Ly8odXNlcm5hbWU6cGFzc3dvcmRAKWV4YW1wbGUuY29tL3BhdGgtdG8tcmVwb3NpdG9yeSknOwp9CgokdGhpcy0+dGhyb3dFeGNlcHRpb24oIkZhaWxlZCB0byBjbG9uZSAkdXJsLCBcblxuIiAuICRlcnJvciwgJHVybCk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB0aHJvd0V4Y2VwdGlvbigkbWVzc2FnZSwgc3RyaW5nICR1cmwpOiB2b2lkCnsKaWYgKG51bGwgPT09IHNlbGY6OmdldFZlcnNpb24oJHRoaXMtPnByb2Nlc3MpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihVcmw6OnNhbml0aXplKAonRmFpbGVkIHRvIGNsb25lICcgLiAkdXJsIC4gJywgaGcgd2FzIG5vdCBmb3VuZCwgY2hlY2sgdGhhdCBpdCBpcyBpbnN0YWxsZWQgYW5kIGluIHlvdXIgUEFUSCBlbnYuJyAuICJcblxuIiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpCikpOwp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oVXJsOjpzYW5pdGl6ZSgkbWVzc2FnZSkpOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VmVyc2lvbihQcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MpOiA/c3RyaW5nCnsKaWYgKGZhbHNlID09PSBzZWxmOjokdmVyc2lvbikgewpzZWxmOjokdmVyc2lvbiA9IG51bGw7CmlmICgwID09PSAkcHJvY2Vzcy0+ZXhlY3V0ZShbJ2hnJywgJy0tdmVyc2lvbiddLCAkb3V0cHV0KSAmJiBQcmVnOjppc01hdGNoKCcvXi4rPyAoXGQrKD86XC5cZCspKykoPzpcKy4qPyk/XCk/XHI/XG4vJywgJG91dHB1dCwgJG1hdGNoZXMpKSB7CnNlbGY6OiR2ZXJzaW9uID0gJG1hdGNoZXNbMV07Cn0KfQoKcmV0dXJuIHNlbGY6OiR2ZXJzaW9uOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWxcSHR0cDsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXE1heEZpbGVTaXplRXhjZWVkZWRFeGNlcHRpb247CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFV0aWxcU3RyZWFtQ29udGV4dEZhY3Rvcnk7CnVzZSBDb21wb3NlclxVdGlsXEF1dGhIZWxwZXI7CnVzZSBDb21wb3NlclxVdGlsXFVybDsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2U7CgoKCgoKCgoKY2xhc3MgQ3VybERvd25sb2FkZXIKewoKCgoKCgpwcml2YXRlIGNvbnN0IEJBRF9NVUxUSVBMRVhJTkdfQ1VSTF9WRVJTSU9OUyA9IFsnNy44Ny4wJywgJzcuODguMCcsICc3Ljg4LjEnXTsKCgpwcml2YXRlICRtdWx0aUhhbmRsZTsKCnByaXZhdGUgJHNoYXJlSGFuZGxlOwoKcHJpdmF0ZSAkam9icyA9IFtdOwoKcHJpdmF0ZSAkaW87Cgpwcml2YXRlICRjb25maWc7Cgpwcml2YXRlICRhdXRoSGVscGVyOwoKcHJpdmF0ZSAkc2VsZWN0VGltZW91dCA9IDUuMDsKCnByaXZhdGUgJG1heFJlZGlyZWN0cyA9IDIwOwoKcHJpdmF0ZSAkbWF4UmV0cmllcyA9IDM7Cgpwcm90ZWN0ZWQgJG11bHRpRXJyb3JzID0gWwpDVVJMTV9CQURfSEFORExFID0+IFsnQ1VSTE1fQkFEX0hBTkRMRScsICdUaGUgcGFzc2VkLWluIGhhbmRsZSBpcyBub3QgYSB2YWxpZCBDVVJMTSBoYW5kbGUuJ10sCkNVUkxNX0JBRF9FQVNZX0hBTkRMRSA9PiBbJ0NVUkxNX0JBRF9FQVNZX0hBTkRMRScsICJBbiBlYXN5IGhhbmRsZSB3YXMgbm90IGdvb2QvdmFsaWQuIEl0IGNvdWxkIG1lYW4gdGhhdCBpdCBpc24ndCBhbiBlYXN5IGhhbmRsZSBhdCBhbGwsIG9yIHBvc3NpYmx5IHRoYXQgdGhlIGhhbmRsZSBhbHJlYWR5IGlzIGluIHVzZWQgYnkgdGhpcyBvciBhbm90aGVyIG11bHRpIGhhbmRsZS4iXSwKQ1VSTE1fT1VUX09GX01FTU9SWSA9PiBbJ0NVUkxNX09VVF9PRl9NRU1PUlknLCAnWW91IGFyZSBkb29tZWQuJ10sCkNVUkxNX0lOVEVSTkFMX0VSUk9SID0+IFsnQ1VSTE1fSU5URVJOQUxfRVJST1InLCAnVGhpcyBjYW4gb25seSBiZSByZXR1cm5lZCBpZiBsaWJjdXJsIGJ1Z3MuIFBsZWFzZSByZXBvcnQgaXQgdG8gdXMhJ10sCl07CgoKcHJpdmF0ZSBzdGF0aWMgJG9wdGlvbnMgPSBbCidodHRwJyA9PiBbCidtZXRob2QnID0+IENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwKJ2NvbnRlbnQnID0+IENVUkxPUFRfUE9TVEZJRUxEUywKJ2hlYWRlcicgPT4gQ1VSTE9QVF9IVFRQSEVBREVSLAondGltZW91dCcgPT4gQ1VSTE9QVF9USU1FT1VULApdLAonc3NsJyA9PiBbCidjYWZpbGUnID0+IENVUkxPUFRfQ0FJTkZPLAonY2FwYXRoJyA9PiBDVVJMT1BUX0NBUEFUSCwKJ3ZlcmlmeV9wZWVyJyA9PiBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLAondmVyaWZ5X3BlZXJfbmFtZScgPT4gQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwKJ2xvY2FsX2NlcnQnID0+IENVUkxPUFRfU1NMQ0VSVCwKJ2xvY2FsX3BrJyA9PiBDVVJMT1BUX1NTTEtFWSwKJ3Bhc3NwaHJhc2UnID0+IENVUkxPUFRfU1NMS0VZUEFTU1dELApdLApdOwoKCnByaXZhdGUgc3RhdGljICR0aW1lSW5mbyA9IFsKJ3RvdGFsX3RpbWUnID0+IHRydWUsCiduYW1lbG9va3VwX3RpbWUnID0+IHRydWUsCidjb25uZWN0X3RpbWUnID0+IHRydWUsCidwcmV0cmFuc2Zlcl90aW1lJyA9PiB0cnVlLAonc3RhcnR0cmFuc2Zlcl90aW1lJyA9PiB0cnVlLAoncmVkaXJlY3RfdGltZScgPT4gdHJ1ZSwKXTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBhcnJheSAkb3B0aW9ucyA9IFtdLCBib29sICRkaXNhYmxlVGxzID0gZmFsc2UpCnsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKCiR0aGlzLT5tdWx0aUhhbmRsZSA9ICRtaCA9IGN1cmxfbXVsdGlfaW5pdCgpOwppZiAoZnVuY3Rpb25fZXhpc3RzKCdjdXJsX211bHRpX3NldG9wdCcpKSB7CmlmIChQcm94eU1hbmFnZXI6OmdldEluc3RhbmNlKCktPmhhc1Byb3h5KCkgJiYgKCR2ZXJzaW9uID0gY3VybF92ZXJzaW9uKCkpICE9PSBmYWxzZSAmJiBpbl9hcnJheSgkdmVyc2lvblsndmVyc2lvbiddLCBzZWxmOjpCQURfTVVMVElQTEVYSU5HX0NVUkxfVkVSU0lPTlMsIHRydWUpKSB7CgoKCgoKCgpjdXJsX211bHRpX3NldG9wdCgkbWgsIENVUkxNT1BUX1BJUEVMSU5JTkcsICAwKTsKfSBlbHNlIHsKY3VybF9tdWx0aV9zZXRvcHQoJG1oLCBDVVJMTU9QVF9QSVBFTElOSU5HLCBcUEhQX1ZFUlNJT05fSUQgPj0gNzA0MDAgPyAgMiA6ICAzKTsKfQppZiAoZGVmaW5lZCgnQ1VSTE1PUFRfTUFYX0hPU1RfQ09OTkVDVElPTlMnKSAmJiAhZGVmaW5lZCgnSEhWTV9WRVJTSU9OJykpIHsKY3VybF9tdWx0aV9zZXRvcHQoJG1oLCBDVVJMTU9QVF9NQVhfSE9TVF9DT05ORUNUSU9OUywgOCk7Cn0KfQoKaWYgKGZ1bmN0aW9uX2V4aXN0cygnY3VybF9zaGFyZV9pbml0JykpIHsKJHRoaXMtPnNoYXJlSGFuZGxlID0gJHNoID0gY3VybF9zaGFyZV9pbml0KCk7CmN1cmxfc2hhcmVfc2V0b3B0KCRzaCwgQ1VSTFNIT1BUX1NIQVJFLCBDVVJMX0xPQ0tfREFUQV9DT09LSUUpOwpjdXJsX3NoYXJlX3NldG9wdCgkc2gsIENVUkxTSE9QVF9TSEFSRSwgQ1VSTF9MT0NLX0RBVEFfRE5TKTsKY3VybF9zaGFyZV9zZXRvcHQoJHNoLCBDVVJMU0hPUFRfU0hBUkUsIENVUkxfTE9DS19EQVRBX1NTTF9TRVNTSU9OKTsKfQoKJHRoaXMtPmF1dGhIZWxwZXIgPSBuZXcgQXV0aEhlbHBlcigkaW8sICRjb25maWcpOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZG93bmxvYWQoY2FsbGFibGUgJHJlc29sdmUsIGNhbGxhYmxlICRyZWplY3QsIHN0cmluZyAkb3JpZ2luLCBzdHJpbmcgJHVybCwgYXJyYXkgJG9wdGlvbnMsID9zdHJpbmcgJGNvcHlUbyA9IG51bGwpOiBpbnQKewokYXR0cmlidXRlcyA9IFtdOwppZiAoaXNzZXQoJG9wdGlvbnNbJ3JldHJ5LWF1dGgtZmFpbHVyZSddKSkgewokYXR0cmlidXRlc1sncmV0cnlBdXRoRmFpbHVyZSddID0gJG9wdGlvbnNbJ3JldHJ5LWF1dGgtZmFpbHVyZSddOwp1bnNldCgkb3B0aW9uc1sncmV0cnktYXV0aC1mYWlsdXJlJ10pOwp9CgpyZXR1cm4gJHRoaXMtPmluaXREb3dubG9hZCgkcmVzb2x2ZSwgJHJlamVjdCwgJG9yaWdpbiwgJHVybCwgJG9wdGlvbnMsICRjb3B5VG8sICRhdHRyaWJ1dGVzKTsKfQoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGluaXREb3dubG9hZChjYWxsYWJsZSAkcmVzb2x2ZSwgY2FsbGFibGUgJHJlamVjdCwgc3RyaW5nICRvcmlnaW4sIHN0cmluZyAkdXJsLCBhcnJheSAkb3B0aW9ucywgP3N0cmluZyAkY29weVRvID0gbnVsbCwgYXJyYXkgJGF0dHJpYnV0ZXMgPSBbXSk6IGludAp7CiRhdHRyaWJ1dGVzID0gYXJyYXlfbWVyZ2UoWwoncmV0cnlBdXRoRmFpbHVyZScgPT4gdHJ1ZSwKJ3JlZGlyZWN0cycgPT4gMCwKJ3JldHJpZXMnID0+IDAsCidzdG9yZUF1dGgnID0+IGZhbHNlLAonaXBSZXNvbHZlJyA9PiBudWxsLApdLCAkYXR0cmlidXRlcyk7CgppZiAoJGF0dHJpYnV0ZXNbJ2lwUmVzb2x2ZSddID09PSBudWxsICYmIFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0lQUkVTT0xWRScpID09PSAnNCcpIHsKJGF0dHJpYnV0ZXNbJ2lwUmVzb2x2ZSddID0gNDsKfSBlbHNlaWYgKCRhdHRyaWJ1dGVzWydpcFJlc29sdmUnXSA9PT0gbnVsbCAmJiBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9JUFJFU09MVkUnKSA9PT0gJzYnKSB7CiRhdHRyaWJ1dGVzWydpcFJlc29sdmUnXSA9IDY7Cn0KCiRvcmlnaW5hbE9wdGlvbnMgPSAkb3B0aW9uczsKCgppZiAoIVByZWc6OmlzTWF0Y2goJ3teaHR0cDovLyhyZXBvXC4pP3BhY2thZ2lzdFwub3JnL3AvfScsICR1cmwpIHx8IChmYWxzZSA9PT0gc3RycG9zKCR1cmwsICckJykgJiYgZmFsc2UgPT09IHN0cnBvcygkdXJsLCAnJTI0JykpKSB7CiR0aGlzLT5jb25maWctPnByb2hpYml0VXJsQnlDb25maWcoJHVybCwgJHRoaXMtPmlvLCAkb3B0aW9ucyk7Cn0KCiRjdXJsSGFuZGxlID0gY3VybF9pbml0KCk7CiRoZWFkZXJIYW5kbGUgPSBmb3BlbigncGhwOi8vdGVtcC9tYXhtZW1vcnk6MzI3NjgnLCAndytiJyk7CmlmIChmYWxzZSA9PT0gJGhlYWRlckhhbmRsZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byBvcGVuIGEgdGVtcCBzdHJlYW0gdG8gc3RvcmUgY3VybCBoZWFkZXJzJyk7Cn0KCmlmICgkY29weVRvICE9PSBudWxsKSB7CiRib2R5VGFyZ2V0ID0gJGNvcHlUby4nfic7Cn0gZWxzZSB7CiRib2R5VGFyZ2V0ID0gJ3BocDovL3RlbXAvbWF4bWVtb3J5OjUyNDI4OCc7Cn0KCiRlcnJvck1lc3NhZ2UgPSAnJzsKc2V0X2Vycm9yX2hhbmRsZXIoc3RhdGljIGZ1bmN0aW9uIChpbnQgJGNvZGUsIHN0cmluZyAkbXNnKSB1c2UgKCYkZXJyb3JNZXNzYWdlKTogYm9vbCB7CmlmICgkZXJyb3JNZXNzYWdlKSB7CiRlcnJvck1lc3NhZ2UgLj0gIlxuIjsKfQokZXJyb3JNZXNzYWdlIC49IFByZWc6OnJlcGxhY2UoJ3teZm9wZW5cKC4qP1wpOiB9JywgJycsICRtc2cpOwoKcmV0dXJuIHRydWU7Cn0pOwokYm9keUhhbmRsZSA9IGZvcGVuKCRib2R5VGFyZ2V0LCAndytiJyk7CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwppZiAoZmFsc2UgPT09ICRib2R5SGFuZGxlKSB7CnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJ1RoZSAiJy4kdXJsLiciIGZpbGUgY291bGQgbm90IGJlIHdyaXR0ZW4gdG8gJy4oJGNvcHlUbyA/PyAnYSB0ZW1wb3JhcnkgZmlsZScpLic6ICcuJGVycm9yTWVzc2FnZSk7Cn0KCmN1cmxfc2V0b3B0KCRjdXJsSGFuZGxlLCBDVVJMT1BUX1VSTCwgJHVybCk7CmN1cmxfc2V0b3B0KCRjdXJsSGFuZGxlLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCBmYWxzZSk7CmN1cmxfc2V0b3B0KCRjdXJsSGFuZGxlLCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VULCAxMCk7CmN1cmxfc2V0b3B0KCRjdXJsSGFuZGxlLCBDVVJMT1BUX1RJTUVPVVQsIG1heCgoaW50KSBpbmlfZ2V0KCJkZWZhdWx0X3NvY2tldF90aW1lb3V0IiksIDMwMCkpOwpjdXJsX3NldG9wdCgkY3VybEhhbmRsZSwgQ1VSTE9QVF9XUklURUhFQURFUiwgJGhlYWRlckhhbmRsZSk7CmN1cmxfc2V0b3B0KCRjdXJsSGFuZGxlLCBDVVJMT1BUX0ZJTEUsICRib2R5SGFuZGxlKTsKY3VybF9zZXRvcHQoJGN1cmxIYW5kbGUsIENVUkxPUFRfRU5DT0RJTkcsICIiKTsgCmN1cmxfc2V0b3B0KCRjdXJsSGFuZGxlLCBDVVJMT1BUX1BST1RPQ09MUywgQ1VSTFBST1RPX0hUVFAgfCBDVVJMUFJPVE9fSFRUUFMpOwoKaWYgKCRhdHRyaWJ1dGVzWydpcFJlc29sdmUnXSA9PT0gNCkgewpjdXJsX3NldG9wdCgkY3VybEhhbmRsZSwgQ1VSTE9QVF9JUFJFU09MVkUsIENVUkxfSVBSRVNPTFZFX1Y0KTsKfSBlbHNlaWYgKCRhdHRyaWJ1dGVzWydpcFJlc29sdmUnXSA9PT0gNikgewpjdXJsX3NldG9wdCgkY3VybEhhbmRsZSwgQ1VSTE9QVF9JUFJFU09MVkUsIENVUkxfSVBSRVNPTFZFX1Y2KTsKfQoKaWYgKGZ1bmN0aW9uX2V4aXN0cygnY3VybF9zaGFyZV9pbml0JykpIHsKY3VybF9zZXRvcHQoJGN1cmxIYW5kbGUsIENVUkxPUFRfU0hBUkUsICR0aGlzLT5zaGFyZUhhbmRsZSk7Cn0KCmlmICghaXNzZXQoJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pKSB7CiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddID0gW107Cn0KCiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddID0gYXJyYXlfZGlmZigkb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSwgWydDb25uZWN0aW9uOiBjbG9zZSddKTsKJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ11bXSA9ICdDb25uZWN0aW9uOiBrZWVwLWFsaXZlJzsKCiR2ZXJzaW9uID0gY3VybF92ZXJzaW9uKCk7CiRmZWF0dXJlcyA9ICR2ZXJzaW9uWydmZWF0dXJlcyddOwoKJHByb3h5ID0gUHJveHlNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpLT5nZXRQcm94eUZvclJlcXVlc3QoJHVybCk7CgppZiAoMCA9PT0gc3RycG9zKCR1cmwsICdodHRwczovLycpKSB7CiR3aWxsVXNlUHJveHkgPSAkcHJveHktPmdldFN0YXR1cygpICE9PSAnJyAmJiAhJHByb3h5LT5pc0V4Y2x1ZGVkQnlOb1Byb3h5KCk7CgppZiAoISR3aWxsVXNlUHJveHkgJiYgXGRlZmluZWQoJ0NVUkxfVkVSU0lPTl9IVFRQMycpICYmIFxkZWZpbmVkKCdDVVJMX0hUVFBfVkVSU0lPTl8zJykgJiYgKENVUkxfVkVSU0lPTl9IVFRQMyAmICRmZWF0dXJlcykgIT09IDApIHsKY3VybF9zZXRvcHQoJGN1cmxIYW5kbGUsIENVUkxPUFRfSFRUUF9WRVJTSU9OLCBDVVJMX0hUVFBfVkVSU0lPTl8zKTsKfSBlbHNlaWYgKFxkZWZpbmVkKCdDVVJMX1ZFUlNJT05fSFRUUDInKSAmJiBcZGVmaW5lZCgnQ1VSTF9IVFRQX1ZFUlNJT05fMl8wJykgJiYgKENVUkxfVkVSU0lPTl9IVFRQMiAmICRmZWF0dXJlcykgIT09IDApIHsKY3VybF9zZXRvcHQoJGN1cmxIYW5kbGUsIENVUkxPUFRfSFRUUF9WRVJTSU9OLCBDVVJMX0hUVFBfVkVSU0lPTl8yXzApOwp9Cn0KCgoKaWYgKGlzc2V0KCR2ZXJzaW9uWyd2ZXJzaW9uJ10pICYmIGluX2FycmF5KCR2ZXJzaW9uWyd2ZXJzaW9uJ10sIFsnOC43LjAnLCAnOC43LjEnXSwgdHJ1ZSkgJiYgXGRlZmluZWQoJ0NVUkxfVkVSU0lPTl9MSUJaJykgJiYgKENVUkxfVkVSU0lPTl9MSUJaICYgJGZlYXR1cmVzKSAhPT0gMCkgewpjdXJsX3NldG9wdCgkY3VybEhhbmRsZSwgQ1VSTE9QVF9FTkNPRElORywgImd6aXAiKTsKfQoKJG9wdGlvbnMgPSAkdGhpcy0+YXV0aEhlbHBlci0+YWRkQXV0aGVudGljYXRpb25PcHRpb25zKCRvcHRpb25zLCAkb3JpZ2luLCAkdXJsKTsKJG9wdGlvbnMgPSBTdHJlYW1Db250ZXh0RmFjdG9yeTo6aW5pdE9wdGlvbnMoJHVybCwgJG9wdGlvbnMsIHRydWUpOwoKZm9yZWFjaCAoc2VsZjo6JG9wdGlvbnMgYXMgJHR5cGUgPT4gJGN1cmxPcHRpb25zKSB7CmZvcmVhY2ggKCRjdXJsT3B0aW9ucyBhcyAkbmFtZSA9PiAkY3VybE9wdGlvbikgewppZiAoaXNzZXQoJG9wdGlvbnNbJHR5cGVdWyRuYW1lXSkpIHsKaWYgKCR0eXBlID09PSAnc3NsJyAmJiAkbmFtZSA9PT0gJ3ZlcmlmeV9wZWVyX25hbWUnKSB7CmN1cmxfc2V0b3B0KCRjdXJsSGFuZGxlLCAkY3VybE9wdGlvbiwgJG9wdGlvbnNbJHR5cGVdWyRuYW1lXSA9PT0gdHJ1ZSA/IDIgOiAkb3B0aW9uc1skdHlwZV1bJG5hbWVdKTsKfSBlbHNlIHsKY3VybF9zZXRvcHQoJGN1cmxIYW5kbGUsICRjdXJsT3B0aW9uLCAkb3B0aW9uc1skdHlwZV1bJG5hbWVdKTsKfQp9Cn0KfQoKY3VybF9zZXRvcHRfYXJyYXkoJGN1cmxIYW5kbGUsICRwcm94eS0+Z2V0Q3VybE9wdGlvbnMoJG9wdGlvbnNbJ3NzbCddID8/IFtdKSk7CgokcHJvZ3Jlc3MgPSBhcnJheV9kaWZmX2tleShjdXJsX2dldGluZm8oJGN1cmxIYW5kbGUpLCBzZWxmOjokdGltZUluZm8pOwoKJHRoaXMtPmpvYnNbKGludCkgJGN1cmxIYW5kbGVdID0gWwondXJsJyA9PiAkdXJsLAonb3JpZ2luJyA9PiAkb3JpZ2luLAonYXR0cmlidXRlcycgPT4gJGF0dHJpYnV0ZXMsCidvcHRpb25zJyA9PiAkb3JpZ2luYWxPcHRpb25zLAoncHJvZ3Jlc3MnID0+ICRwcm9ncmVzcywKJ2N1cmxIYW5kbGUnID0+ICRjdXJsSGFuZGxlLAonZmlsZW5hbWUnID0+ICRjb3B5VG8sCidoZWFkZXJIYW5kbGUnID0+ICRoZWFkZXJIYW5kbGUsCidib2R5SGFuZGxlJyA9PiAkYm9keUhhbmRsZSwKJ3Jlc29sdmUnID0+ICRyZXNvbHZlLAoncmVqZWN0JyA9PiAkcmVqZWN0LAoncHJpbWFyeUlwJyA9PiAnJywKXTsKCiR1c2luZ1Byb3h5ID0gJHByb3h5LT5nZXRTdGF0dXMoJyB1c2luZyBwcm94eSAoJXMpJyk7CiRpZk1vZGlmaWVkID0gZmFsc2UgIT09IHN0cmlwb3MoaW1wbG9kZSgnLCcsICRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddKSwgJ2lmLW1vZGlmaWVkLXNpbmNlOicpID8gJyBpZiBtb2RpZmllZCcgOiAnJzsKaWYgKCRhdHRyaWJ1dGVzWydyZWRpcmVjdHMnXSA9PT0gMCAmJiAkYXR0cmlidXRlc1sncmV0cmllcyddID09PSAwKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignRG93bmxvYWRpbmcgJyAuIFVybDo6c2FuaXRpemUoJHVybCkgLiAkdXNpbmdQcm94eSAuICRpZk1vZGlmaWVkLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwp9CgokdGhpcy0+Y2hlY2tDdXJsUmVzdWx0KGN1cmxfbXVsdGlfYWRkX2hhbmRsZSgkdGhpcy0+bXVsdGlIYW5kbGUsICRjdXJsSGFuZGxlKSk7CgoKcmV0dXJuIChpbnQpICRjdXJsSGFuZGxlOwp9CgpwdWJsaWMgZnVuY3Rpb24gYWJvcnRSZXF1ZXN0KGludCAkaWQpOiB2b2lkCnsKaWYgKGlzc2V0KCR0aGlzLT5qb2JzWyRpZF0sICR0aGlzLT5qb2JzWyRpZF1bJ2N1cmxIYW5kbGUnXSkpIHsKJGpvYiA9ICR0aGlzLT5qb2JzWyRpZF07CmN1cmxfbXVsdGlfcmVtb3ZlX2hhbmRsZSgkdGhpcy0+bXVsdGlIYW5kbGUsICRqb2JbJ2N1cmxIYW5kbGUnXSk7CmlmIChcUEhQX1ZFUlNJT05fSUQgPCA4MDAwMCkgewpjdXJsX2Nsb3NlKCRqb2JbJ2N1cmxIYW5kbGUnXSk7Cn0KaWYgKGlzX3Jlc291cmNlKCRqb2JbJ2hlYWRlckhhbmRsZSddKSkgewpmY2xvc2UoJGpvYlsnaGVhZGVySGFuZGxlJ10pOwp9CmlmIChpc19yZXNvdXJjZSgkam9iWydib2R5SGFuZGxlJ10pKSB7CmZjbG9zZSgkam9iWydib2R5SGFuZGxlJ10pOwp9CmlmIChudWxsICE9PSAkam9iWydmaWxlbmFtZSddKSB7CkB1bmxpbmsoJGpvYlsnZmlsZW5hbWUnXS4nficpOwp9CnVuc2V0KCR0aGlzLT5qb2JzWyRpZF0pOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiB0aWNrKCk6IHZvaWQKewpzdGF0aWMgJHRpbWVvdXRXYXJuaW5nID0gZmFsc2U7CgppZiAoY291bnQoJHRoaXMtPmpvYnMpID09PSAwKSB7CnJldHVybjsKfQoKJGFjdGl2ZSA9IHRydWU7CiR0aGlzLT5jaGVja0N1cmxSZXN1bHQoY3VybF9tdWx0aV9leGVjKCR0aGlzLT5tdWx0aUhhbmRsZSwgJGFjdGl2ZSkpOwppZiAoLTEgPT09IGN1cmxfbXVsdGlfc2VsZWN0KCR0aGlzLT5tdWx0aUhhbmRsZSwgJHRoaXMtPnNlbGVjdFRpbWVvdXQpKSB7Cgp1c2xlZXAoMTUwKTsKfQoKd2hpbGUgKCRwcm9ncmVzcyA9IGN1cmxfbXVsdGlfaW5mb19yZWFkKCR0aGlzLT5tdWx0aUhhbmRsZSkpIHsKJGN1cmxIYW5kbGUgPSAkcHJvZ3Jlc3NbJ2hhbmRsZSddOwokcmVzdWx0ID0gJHByb2dyZXNzWydyZXN1bHQnXTsKJGkgPSAoaW50KSAkY3VybEhhbmRsZTsKaWYgKCFpc3NldCgkdGhpcy0+am9ic1skaV0pKSB7CmNvbnRpbnVlOwp9CgokcHJvZ3Jlc3MgPSBjdXJsX2dldGluZm8oJGN1cmxIYW5kbGUpOwppZiAoZmFsc2UgPT09ICRwcm9ncmVzcykgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCBnZXR0aW5nIGluZm8gZnJvbSBjdXJsIGhhbmRsZSAnLiRpLicgKCcuJHRoaXMtPmpvYnNbJGldWyd1cmwnXS4nKScpOwp9CiRqb2IgPSAkdGhpcy0+am9ic1skaV07CnVuc2V0KCR0aGlzLT5qb2JzWyRpXSk7CiRlcnJvciA9IGN1cmxfZXJyb3IoJGN1cmxIYW5kbGUpOwokZXJybm8gPSBjdXJsX2Vycm5vKCRjdXJsSGFuZGxlKTsKY3VybF9tdWx0aV9yZW1vdmVfaGFuZGxlKCR0aGlzLT5tdWx0aUhhbmRsZSwgJGN1cmxIYW5kbGUpOwppZiAoXFBIUF9WRVJTSU9OX0lEIDwgODAwMDApIHsKY3VybF9jbG9zZSgkY3VybEhhbmRsZSk7Cn0KCiRoZWFkZXJzID0gbnVsbDsKJHN0YXR1c0NvZGUgPSBudWxsOwokcmVzcG9uc2UgPSBudWxsOwp0cnkgewoKaWYgKENVUkxFX09LICE9PSAkZXJybm8gfHwgJGVycm9yIHx8ICRyZXN1bHQgIT09IENVUkxFX09LKSB7CiRlcnJubyA9ICRlcnJubyA/OiAkcmVzdWx0OwppZiAoISRlcnJvciAmJiBmdW5jdGlvbl9leGlzdHMoJ2N1cmxfc3RyZXJyb3InKSkgewokZXJyb3IgPSBjdXJsX3N0cmVycm9yKCRlcnJubyk7Cn0KJHByb2dyZXNzWydlcnJvcl9jb2RlJ10gPSAkZXJybm87CgppZiAoJGVycm5vID09PSAyOCAgJiYgXFBIUF9WRVJTSU9OX0lEID49IDcwMzAwICYmICRwcm9ncmVzc1snbmFtZWxvb2t1cF90aW1lJ10gPT09IDAuMCAmJiAhJHRpbWVvdXRXYXJuaW5nKSB7CiR0aW1lb3V0V2FybmluZyA9IHRydWU7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+QSBjb25uZWN0aW9uIHRpbWVvdXQgd2FzIGVuY291bnRlcmVkLiBJZiB5b3UgaW50ZW5kIHRvIHJ1biBDb21wb3NlciB3aXRob3V0IGNvbm5lY3RpbmcgdG8gdGhlIGludGVybmV0LCBydW4gdGhlIGNvbW1hbmQgYWdhaW4gcHJlZml4ZWQgd2l0aCBDT01QT1NFUl9ESVNBQkxFX05FVFdPUks9MSB0byBtYWtlIENvbXBvc2VyIHJ1biBpbiBvZmZsaW5lIG1vZGUuPC93YXJuaW5nPicpOwp9CgppZiAoCighaXNzZXQoJGpvYlsnb3B0aW9ucyddWydodHRwJ11bJ21ldGhvZCddKSB8fCAkam9iWydvcHRpb25zJ11bJ2h0dHAnXVsnbWV0aG9kJ10gPT09ICdHRVQnKQomJiAoCmluX2FycmF5KCRlcnJubywgWzcgLCAxNiAsIDkyICwgNiAsIDI4IF0sIHRydWUpCnx8IChpbl9hcnJheSgkZXJybm8sIFs1NiAsIDM1IF0sIHRydWUpICYmIHN0cl9jb250YWlucygoc3RyaW5nKSAkZXJyb3IsICdDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXInKSkKKSAmJiAkam9iWydhdHRyaWJ1dGVzJ11bJ3JldHJpZXMnXSA8ICR0aGlzLT5tYXhSZXRyaWVzCikgewokYXR0cmlidXRlcyA9IFsncmV0cmllcycgPT4gJGpvYlsnYXR0cmlidXRlcyddWydyZXRyaWVzJ10gKyAxXTsKaWYgKCRlcnJubyA9PT0gNyAmJiAhaXNzZXQoJGpvYlsnYXR0cmlidXRlcyddWydpcFJlc29sdmUnXSkpIHsgCiRhdHRyaWJ1dGVzWydpcFJlc29sdmUnXSA9IDQ7Cn0KJHRoaXMtPmlvLT53cml0ZUVycm9yKCdSZXRyeWluZyAoJy4oJGpvYlsnYXR0cmlidXRlcyddWydyZXRyaWVzJ10gKyAxKS4nKSAnIC4gVXJsOjpzYW5pdGl6ZSgkam9iWyd1cmwnXSkgLiAnIGR1ZSB0byBjdXJsIGVycm9yICcuICRlcnJubywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKJHRoaXMtPnJlc3RhcnRKb2JXaXRoRGVsYXkoJGpvYiwgJGpvYlsndXJsJ10sICRhdHRyaWJ1dGVzKTsKY29udGludWU7Cn0KCgppZiAoJGVycm5vID09PSA1NSApIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdSZXRyeWluZyAoJy4oJGpvYlsnYXR0cmlidXRlcyddWydyZXRyaWVzJ10gKyAxKS4nKSAnIC4gVXJsOjpzYW5pdGl6ZSgkam9iWyd1cmwnXSkgLiAnIGR1ZSB0byBjdXJsIGVycm9yICcuICRlcnJubywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKJHRoaXMtPnJlc3RhcnRKb2JXaXRoRGVsYXkoJGpvYiwgJGpvYlsndXJsJ10sIFsncmV0cmllcycgPT4gJGpvYlsnYXR0cmlidXRlcyddWydyZXRyaWVzJ10gKyAxXSk7CmNvbnRpbnVlOwp9Cgp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdjdXJsIGVycm9yICcuJGVycm5vLicgd2hpbGUgZG93bmxvYWRpbmcgJy5Vcmw6OnNhbml0aXplKCRwcm9ncmVzc1sndXJsJ10pLic6ICcuJGVycm9yKTsKfQokc3RhdHVzQ29kZSA9ICRwcm9ncmVzc1snaHR0cF9jb2RlJ107CnJld2luZCgkam9iWydoZWFkZXJIYW5kbGUnXSk7CiRoZWFkZXJzID0gZXhwbG9kZSgiXHJcbiIsIHJ0cmltKHN0cmVhbV9nZXRfY29udGVudHMoJGpvYlsnaGVhZGVySGFuZGxlJ10pKSk7CmZjbG9zZSgkam9iWydoZWFkZXJIYW5kbGUnXSk7CgppZiAoJHN0YXR1c0NvZGUgPT09IDApIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignUmVjZWl2ZWQgdW5leHBlY3RlZCBodHRwIHN0YXR1cyBjb2RlIDAgd2l0aG91dCBlcnJvciBmb3IgJy5Vcmw6OnNhbml0aXplKCRwcm9ncmVzc1sndXJsJ10pLic6IGhlYWRlcnMgJy52YXJfZXhwb3J0KCRoZWFkZXJzLCB0cnVlKS4nIGN1cmwgaW5mbyAnLnZhcl9leHBvcnQoJHByb2dyZXNzLCB0cnVlKSk7Cn0KCgppZiAobnVsbCAhPT0gJGpvYlsnZmlsZW5hbWUnXSkgewokY29udGVudHMgPSAkam9iWydmaWxlbmFtZSddLid+JzsKaWYgKCRzdGF0dXNDb2RlID49IDMwMCkgewpyZXdpbmQoJGpvYlsnYm9keUhhbmRsZSddKTsKJGNvbnRlbnRzID0gc3RyZWFtX2dldF9jb250ZW50cygkam9iWydib2R5SGFuZGxlJ10pOwp9CiRyZXNwb25zZSA9IG5ldyBDdXJsUmVzcG9uc2UoWyd1cmwnID0+ICRqb2JbJ3VybCddXSwgJHN0YXR1c0NvZGUsICRoZWFkZXJzLCAkY29udGVudHMsICRwcm9ncmVzcyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignWycuJHN0YXR1c0NvZGUuJ10gJy5Vcmw6OnNhbml0aXplKCRqb2JbJ3VybCddKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKfSBlbHNlIHsKJG1heEZpbGVTaXplID0gJGpvYlsnb3B0aW9ucyddWydtYXhfZmlsZV9zaXplJ10gPz8gbnVsbDsKcmV3aW5kKCRqb2JbJ2JvZHlIYW5kbGUnXSk7CmlmICgkbWF4RmlsZVNpemUgIT09IG51bGwpIHsKJGNvbnRlbnRzID0gc3RyZWFtX2dldF9jb250ZW50cygkam9iWydib2R5SGFuZGxlJ10sICRtYXhGaWxlU2l6ZSk7CgoKaWYgKCRjb250ZW50cyAhPT0gZmFsc2UgJiYgUGxhdGZvcm06OnN0cmxlbigkY29udGVudHMpID49ICRtYXhGaWxlU2l6ZSkgewp0aHJvdyBuZXcgTWF4RmlsZVNpemVFeGNlZWRlZEV4Y2VwdGlvbignTWF4aW11bSBhbGxvd2VkIGRvd25sb2FkIHNpemUgcmVhY2hlZC4gRG93bmxvYWRlZCAnIC4gUGxhdGZvcm06OnN0cmxlbigkY29udGVudHMpIC4gJyBvZiBhbGxvd2VkICcgLiAkbWF4RmlsZVNpemUgLiAnIGJ5dGVzJyk7Cn0KfSBlbHNlIHsKJGNvbnRlbnRzID0gc3RyZWFtX2dldF9jb250ZW50cygkam9iWydib2R5SGFuZGxlJ10pOwp9CgokcmVzcG9uc2UgPSBuZXcgQ3VybFJlc3BvbnNlKFsndXJsJyA9PiAkam9iWyd1cmwnXV0sICRzdGF0dXNDb2RlLCAkaGVhZGVycywgJGNvbnRlbnRzLCAkcHJvZ3Jlc3MpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1snLiRzdGF0dXNDb2RlLiddICcuVXJsOjpzYW5pdGl6ZSgkam9iWyd1cmwnXSksIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7Cn0KZmNsb3NlKCRqb2JbJ2JvZHlIYW5kbGUnXSk7CgppZiAoJHJlc3BvbnNlLT5nZXRTdGF0dXNDb2RlKCkgPj0gMzAwICYmICRyZXNwb25zZS0+Z2V0SGVhZGVyKCdjb250ZW50LXR5cGUnKSA9PT0gJ2FwcGxpY2F0aW9uL2pzb24nKSB7Ckh0dHBEb3dubG9hZGVyOjpvdXRwdXRXYXJuaW5ncygkdGhpcy0+aW8sICRqb2JbJ29yaWdpbiddLCBqc29uX2RlY29kZSgkcmVzcG9uc2UtPmdldEJvZHkoKSwgdHJ1ZSkpOwp9CgokcmVzdWx0ID0gJHRoaXMtPmlzQXV0aGVudGljYXRlZFJldHJ5TmVlZGVkKCRqb2IsICRyZXNwb25zZSk7CmlmICgkcmVzdWx0WydyZXRyeSddKSB7CiR0aGlzLT5yZXN0YXJ0Sm9iKCRqb2IsICRqb2JbJ3VybCddLCBbJ3N0b3JlQXV0aCcgPT4gJHJlc3VsdFsnc3RvcmVBdXRoJ10sICdyZXRyaWVzJyA9PiAkam9iWydhdHRyaWJ1dGVzJ11bJ3JldHJpZXMnXSArIDFdKTsKY29udGludWU7Cn0KCgppZiAoJHN0YXR1c0NvZGUgPj0gMzAwICYmICRzdGF0dXNDb2RlIDw9IDM5OSAmJiAkc3RhdHVzQ29kZSAhPT0gMzA0ICYmICRqb2JbJ2F0dHJpYnV0ZXMnXVsncmVkaXJlY3RzJ10gPCAkdGhpcy0+bWF4UmVkaXJlY3RzKSB7CiRsb2NhdGlvbiA9ICR0aGlzLT5oYW5kbGVSZWRpcmVjdCgkam9iLCAkcmVzcG9uc2UpOwppZiAoJGxvY2F0aW9uKSB7CiR0aGlzLT5yZXN0YXJ0Sm9iKCRqb2IsICRsb2NhdGlvbiwgWydyZWRpcmVjdHMnID0+ICRqb2JbJ2F0dHJpYnV0ZXMnXVsncmVkaXJlY3RzJ10gKyAxXSk7CmNvbnRpbnVlOwp9Cn0KCgppZiAoJHN0YXR1c0NvZGUgPj0gNDAwICYmICRzdGF0dXNDb2RlIDw9IDU5OSkgewppZiAoCighaXNzZXQoJGpvYlsnb3B0aW9ucyddWydodHRwJ11bJ21ldGhvZCddKSB8fCAkam9iWydvcHRpb25zJ11bJ2h0dHAnXVsnbWV0aG9kJ10gPT09ICdHRVQnKQomJiBpbl9hcnJheSgkc3RhdHVzQ29kZSwgWzQyMywgNDI1LCA1MDAsIDUwMiwgNTAzLCA1MDQsIDUwNywgNTEwXSwgdHJ1ZSkKJiYgJGpvYlsnYXR0cmlidXRlcyddWydyZXRyaWVzJ10gPCAkdGhpcy0+bWF4UmV0cmllcwopIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdSZXRyeWluZyAoJy4oJGpvYlsnYXR0cmlidXRlcyddWydyZXRyaWVzJ10gKyAxKS4nKSAnIC4gVXJsOjpzYW5pdGl6ZSgkam9iWyd1cmwnXSkgLiAnIGR1ZSB0byBzdGF0dXMgY29kZSAnLiAkc3RhdHVzQ29kZSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKJHRoaXMtPnJlc3RhcnRKb2JXaXRoRGVsYXkoJGpvYiwgJGpvYlsndXJsJ10sIFsncmV0cmllcycgPT4gJGpvYlsnYXR0cmlidXRlcyddWydyZXRyaWVzJ10gKyAxXSk7CmNvbnRpbnVlOwp9Cgp0aHJvdyAkdGhpcy0+ZmFpbFJlc3BvbnNlKCRqb2IsICRyZXNwb25zZSwgJHJlc3BvbnNlLT5nZXRTdGF0dXNNZXNzYWdlKCkpOwp9CgppZiAoJGpvYlsnYXR0cmlidXRlcyddWydzdG9yZUF1dGgnXSAhPT0gZmFsc2UpIHsKJHRoaXMtPmF1dGhIZWxwZXItPnN0b3JlQXV0aCgkam9iWydvcmlnaW4nXSwgJGpvYlsnYXR0cmlidXRlcyddWydzdG9yZUF1dGgnXSk7Cn0KCgppZiAobnVsbCAhPT0gJGpvYlsnZmlsZW5hbWUnXSkgewpyZW5hbWUoJGpvYlsnZmlsZW5hbWUnXS4nficsICRqb2JbJ2ZpbGVuYW1lJ10pOwokam9iWydyZXNvbHZlJ10oJHJlc3BvbnNlKTsKfSBlbHNlIHsKJGpvYlsncmVzb2x2ZSddKCRyZXNwb25zZSk7Cn0KfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewppZiAoJGUgaW5zdGFuY2VvZiBUcmFuc3BvcnRFeGNlcHRpb24pIHsKaWYgKG51bGwgIT09ICRoZWFkZXJzKSB7CiRlLT5zZXRIZWFkZXJzKCRoZWFkZXJzKTsKJGUtPnNldFN0YXR1c0NvZGUoJHN0YXR1c0NvZGUpOwp9CmlmIChudWxsICE9PSAkcmVzcG9uc2UpIHsKJGUtPnNldFJlc3BvbnNlKCRyZXNwb25zZS0+Z2V0Qm9keSgpKTsKfQokZS0+c2V0UmVzcG9uc2VJbmZvKCRwcm9ncmVzcyk7Cn0KCiR0aGlzLT5yZWplY3RKb2IoJGpvYiwgJGUpOwp9Cn0KCmZvcmVhY2ggKCR0aGlzLT5qb2JzIGFzICRpID0+ICRjdXJsSGFuZGxlKSB7CiRjdXJsSGFuZGxlID0gJHRoaXMtPmpvYnNbJGldWydjdXJsSGFuZGxlJ107CiRwcm9ncmVzcyA9IGFycmF5X2RpZmZfa2V5KGN1cmxfZ2V0aW5mbygkY3VybEhhbmRsZSksIHNlbGY6OiR0aW1lSW5mbyk7CgppZiAoJHRoaXMtPmpvYnNbJGldWydwcm9ncmVzcyddICE9PSAkcHJvZ3Jlc3MpIHsKJHRoaXMtPmpvYnNbJGldWydwcm9ncmVzcyddID0gJHByb2dyZXNzOwoKaWYgKGlzc2V0KCR0aGlzLT5qb2JzWyRpXVsnb3B0aW9ucyddWydtYXhfZmlsZV9zaXplJ10pKSB7CgppZiAoJHRoaXMtPmpvYnNbJGldWydvcHRpb25zJ11bJ21heF9maWxlX3NpemUnXSA8ICRwcm9ncmVzc1snZG93bmxvYWRfY29udGVudF9sZW5ndGgnXSkgewokdGhpcy0+cmVqZWN0Sm9iKCR0aGlzLT5qb2JzWyRpXSwgbmV3IE1heEZpbGVTaXplRXhjZWVkZWRFeGNlcHRpb24oJ01heGltdW0gYWxsb3dlZCBkb3dubG9hZCBzaXplIHJlYWNoZWQuIENvbnRlbnQtbGVuZ3RoIGhlYWRlciBpbmRpY2F0ZXMgJyAuICRwcm9ncmVzc1snZG93bmxvYWRfY29udGVudF9sZW5ndGgnXSAuICcgYnl0ZXMuIEFsbG93ZWQgJyAuICR0aGlzLT5qb2JzWyRpXVsnb3B0aW9ucyddWydtYXhfZmlsZV9zaXplJ10gLiAnIGJ5dGVzJykpOwp9CgoKaWYgKCR0aGlzLT5qb2JzWyRpXVsnb3B0aW9ucyddWydtYXhfZmlsZV9zaXplJ10gPCAkcHJvZ3Jlc3NbJ3NpemVfZG93bmxvYWQnXSkgewokdGhpcy0+cmVqZWN0Sm9iKCR0aGlzLT5qb2JzWyRpXSwgbmV3IE1heEZpbGVTaXplRXhjZWVkZWRFeGNlcHRpb24oJ01heGltdW0gYWxsb3dlZCBkb3dubG9hZCBzaXplIHJlYWNoZWQuIERvd25sb2FkZWQgJyAuICRwcm9ncmVzc1snc2l6ZV9kb3dubG9hZCddIC4gJyBvZiBhbGxvd2VkICcgLiAkdGhpcy0+am9ic1skaV1bJ29wdGlvbnMnXVsnbWF4X2ZpbGVfc2l6ZSddIC4gJyBieXRlcycpKTsKfQp9CgppZiAoaXNzZXQoJHByb2dyZXNzWydwcmltYXJ5X2lwJ10pICYmICRwcm9ncmVzc1sncHJpbWFyeV9pcCddICE9PSAkdGhpcy0+am9ic1skaV1bJ3ByaW1hcnlJcCddKSB7CmlmICgKaXNzZXQoJHRoaXMtPmpvYnNbJGldWydvcHRpb25zJ11bJ3ByZXZlbnRfaXBfYWNjZXNzX2NhbGxhYmxlJ10pICYmCmlzX2NhbGxhYmxlKCR0aGlzLT5qb2JzWyRpXVsnb3B0aW9ucyddWydwcmV2ZW50X2lwX2FjY2Vzc19jYWxsYWJsZSddKSAmJgokdGhpcy0+am9ic1skaV1bJ29wdGlvbnMnXVsncHJldmVudF9pcF9hY2Nlc3NfY2FsbGFibGUnXSgkcHJvZ3Jlc3NbJ3ByaW1hcnlfaXAnXSkKKSB7CiR0aGlzLT5yZWplY3RKb2IoJHRoaXMtPmpvYnNbJGldLCBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKHNwcmludGYoJ0lQICIlcyIgaXMgYmxvY2tlZCBmb3IgIiVzIi4nLCAkcHJvZ3Jlc3NbJ3ByaW1hcnlfaXAnXSwgJHByb2dyZXNzWyd1cmwnXSkpKTsKfQoKJHRoaXMtPmpvYnNbJGldWydwcmltYXJ5SXAnXSA9IChzdHJpbmcpICRwcm9ncmVzc1sncHJpbWFyeV9pcCddOwp9CgoKfQp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gaGFuZGxlUmVkaXJlY3QoYXJyYXkgJGpvYiwgUmVzcG9uc2UgJHJlc3BvbnNlKTogc3RyaW5nCnsKaWYgKCRsb2NhdGlvbkhlYWRlciA9ICRyZXNwb25zZS0+Z2V0SGVhZGVyKCdsb2NhdGlvbicpKSB7CmlmIChwYXJzZV91cmwoJGxvY2F0aW9uSGVhZGVyLCBQSFBfVVJMX1NDSEVNRSkpIHsKCiR0YXJnZXRVcmwgPSAkbG9jYXRpb25IZWFkZXI7Cn0gZWxzZWlmIChwYXJzZV91cmwoJGxvY2F0aW9uSGVhZGVyLCBQSFBfVVJMX0hPU1QpKSB7CgokdGFyZ2V0VXJsID0gcGFyc2VfdXJsKCRqb2JbJ3VybCddLCBQSFBfVVJMX1NDSEVNRSkuJzonLiRsb2NhdGlvbkhlYWRlcjsKfSBlbHNlaWYgKCcvJyA9PT0gJGxvY2F0aW9uSGVhZGVyWzBdKSB7CgokdXJsSG9zdCA9IHBhcnNlX3VybCgkam9iWyd1cmwnXSwgUEhQX1VSTF9IT1NUKTsKCgokdGFyZ2V0VXJsID0gUHJlZzo6cmVwbGFjZSgne14oLisoPzovL3xAKScucHJlZ19xdW90ZSgkdXJsSG9zdCkuJyg/OjpcZCspPykoPzpbL1w/XS4qKT8kfScsICdcMScuJGxvY2F0aW9uSGVhZGVyLCAkam9iWyd1cmwnXSk7Cn0gZWxzZSB7CgoKJHRhcmdldFVybCA9IFByZWc6OnJlcGxhY2UoJ3teKC4rLylbXi8/XSooPzpcPy4qKT8kfScsICdcMScuJGxvY2F0aW9uSGVhZGVyLCAkam9iWyd1cmwnXSk7Cn0KfQoKaWYgKCFlbXB0eSgkdGFyZ2V0VXJsKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignRm9sbG93aW5nIHJlZGlyZWN0ICgldSkgJXMnLCAkam9iWydhdHRyaWJ1dGVzJ11bJ3JlZGlyZWN0cyddICsgMSwgVXJsOjpzYW5pdGl6ZSgkdGFyZ2V0VXJsKSksIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CgpyZXR1cm4gJHRhcmdldFVybDsKfQoKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignVGhlICInLiRqb2JbJ3VybCddLiciIGZpbGUgY291bGQgbm90IGJlIGRvd25sb2FkZWQsIGdvdCByZWRpcmVjdCB3aXRob3V0IExvY2F0aW9uICgnLiRyZXNwb25zZS0+Z2V0U3RhdHVzTWVzc2FnZSgpLicpJyk7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGlzQXV0aGVudGljYXRlZFJldHJ5TmVlZGVkKGFycmF5ICRqb2IsIFJlc3BvbnNlICRyZXNwb25zZSk6IGFycmF5CnsKaWYgKGluX2FycmF5KCRyZXNwb25zZS0+Z2V0U3RhdHVzQ29kZSgpLCBbNDAxLCA0MDNdKSAmJiAkam9iWydhdHRyaWJ1dGVzJ11bJ3JldHJ5QXV0aEZhaWx1cmUnXSkgewokcmVzdWx0ID0gJHRoaXMtPmF1dGhIZWxwZXItPnByb21wdEF1dGhJZk5lZWRlZCgkam9iWyd1cmwnXSwgJGpvYlsnb3JpZ2luJ10sICRyZXNwb25zZS0+Z2V0U3RhdHVzQ29kZSgpLCAkcmVzcG9uc2UtPmdldFN0YXR1c01lc3NhZ2UoKSwgJHJlc3BvbnNlLT5nZXRIZWFkZXJzKCksICRqb2JbJ2F0dHJpYnV0ZXMnXVsncmV0cmllcyddLCAkcmVzcG9uc2UtPmdldEJvZHkoKSk7CgppZiAoJHJlc3VsdFsncmV0cnknXSkgewpyZXR1cm4gJHJlc3VsdDsKfQp9CgokbG9jYXRpb25IZWFkZXIgPSAkcmVzcG9uc2UtPmdldEhlYWRlcignbG9jYXRpb24nKTsKJG5lZWRzQXV0aFJldHJ5ID0gZmFsc2U7CgoKaWYgKAokam9iWydvcmlnaW4nXSA9PT0gJ2JpdGJ1Y2tldC5vcmcnCiYmICEkdGhpcy0+YXV0aEhlbHBlci0+aXNQdWJsaWNCaXRCdWNrZXREb3dubG9hZCgkam9iWyd1cmwnXSkKJiYgc3Vic3RyKCRqb2JbJ3VybCddLCAtNCkgPT09ICcuemlwJwomJiAoISRsb2NhdGlvbkhlYWRlciB8fCBzdWJzdHIoJGxvY2F0aW9uSGVhZGVyLCAtNCkgIT09ICcuemlwJykKJiYgUHJlZzo6aXNNYXRjaCgne150ZXh0L2h0bWxcYn1pJywgJHJlc3BvbnNlLT5nZXRIZWFkZXIoJ2NvbnRlbnQtdHlwZScpKQopIHsKJG5lZWRzQXV0aFJldHJ5ID0gJ0JpdGJ1Y2tldCByZXF1aXJlcyBhdXRoZW50aWNhdGlvbiBhbmQgaXQgd2FzIG5vdCBwcm92aWRlZCc7Cn0KCgppZiAoCiRyZXNwb25zZS0+Z2V0U3RhdHVzQ29kZSgpID09PSA0MDQKJiYgaW5fYXJyYXkoJGpvYlsnb3JpZ2luJ10sICR0aGlzLT5jb25maWctPmdldCgnZ2l0bGFiLWRvbWFpbnMnKSwgdHJ1ZSkKJiYgZmFsc2UgIT09IHN0cnBvcygkam9iWyd1cmwnXSwgJ2FyY2hpdmUuemlwJykKKSB7CiRuZWVkc0F1dGhSZXRyeSA9ICdHaXRMYWIgcmVxdWlyZXMgYXV0aGVudGljYXRpb24gYW5kIGl0IHdhcyBub3QgcHJvdmlkZWQnOwp9CgppZiAoJG5lZWRzQXV0aFJldHJ5KSB7CmlmICgkam9iWydhdHRyaWJ1dGVzJ11bJ3JldHJ5QXV0aEZhaWx1cmUnXSkgewokcmVzdWx0ID0gJHRoaXMtPmF1dGhIZWxwZXItPnByb21wdEF1dGhJZk5lZWRlZCgkam9iWyd1cmwnXSwgJGpvYlsnb3JpZ2luJ10sIDQwMSwgbnVsbCwgW10sICRqb2JbJ2F0dHJpYnV0ZXMnXVsncmV0cmllcyddKTsKaWYgKCRyZXN1bHRbJ3JldHJ5J10pIHsKcmV0dXJuICRyZXN1bHQ7Cn0KfQoKdGhyb3cgJHRoaXMtPmZhaWxSZXNwb25zZSgkam9iLCAkcmVzcG9uc2UsICRuZWVkc0F1dGhSZXRyeSk7Cn0KCnJldHVybiBbJ3JldHJ5JyA9PiBmYWxzZSwgJ3N0b3JlQXV0aCcgPT4gZmFsc2VdOwp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlc3RhcnRKb2IoYXJyYXkgJGpvYiwgc3RyaW5nICR1cmwsIGFycmF5ICRhdHRyaWJ1dGVzID0gW10pOiB2b2lkCnsKaWYgKG51bGwgIT09ICRqb2JbJ2ZpbGVuYW1lJ10pIHsKQHVubGluaygkam9iWydmaWxlbmFtZSddLid+Jyk7Cn0KCiRhdHRyaWJ1dGVzID0gYXJyYXlfbWVyZ2UoJGpvYlsnYXR0cmlidXRlcyddLCAkYXR0cmlidXRlcyk7CiRvcmlnaW4gPSBVcmw6OmdldE9yaWdpbigkdGhpcy0+Y29uZmlnLCAkdXJsKTsKCiR0aGlzLT5pbml0RG93bmxvYWQoJGpvYlsncmVzb2x2ZSddLCAkam9iWydyZWplY3QnXSwgJG9yaWdpbiwgJHVybCwgJGpvYlsnb3B0aW9ucyddLCAkam9iWydmaWxlbmFtZSddLCAkYXR0cmlidXRlcyk7Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVzdGFydEpvYldpdGhEZWxheShhcnJheSAkam9iLCBzdHJpbmcgJHVybCwgYXJyYXkgJGF0dHJpYnV0ZXMpOiB2b2lkCnsKaWYgKCRhdHRyaWJ1dGVzWydyZXRyaWVzJ10gPj0gMykgewp1c2xlZXAoNTAwMDAwKTsgCn0gZWxzZWlmICgkYXR0cmlidXRlc1sncmV0cmllcyddID49IDIpIHsKdXNsZWVwKDEwMDAwMCk7IAp9IAoKJHRoaXMtPnJlc3RhcnRKb2IoJGpvYiwgJHVybCwgJGF0dHJpYnV0ZXMpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGZhaWxSZXNwb25zZShhcnJheSAkam9iLCBSZXNwb25zZSAkcmVzcG9uc2UsIHN0cmluZyAkZXJyb3JNZXNzYWdlKTogVHJhbnNwb3J0RXhjZXB0aW9uCnsKaWYgKG51bGwgIT09ICRqb2JbJ2ZpbGVuYW1lJ10pIHsKQHVubGluaygkam9iWydmaWxlbmFtZSddLid+Jyk7Cn0KCiRkZXRhaWxzID0gJyc7CmlmIChpbl9hcnJheShzdHJ0b2xvd2VyKChzdHJpbmcpICRyZXNwb25zZS0+Z2V0SGVhZGVyKCdjb250ZW50LXR5cGUnKSksIFsnYXBwbGljYXRpb24vanNvbicsICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04J10sIHRydWUpKSB7CiRkZXRhaWxzID0gJzonLlBIUF9FT0wuc3Vic3RyKCRyZXNwb25zZS0+Z2V0Qm9keSgpLCAwLCAyMDApLihzdHJsZW4oJHJlc3BvbnNlLT5nZXRCb2R5KCkpID4gMjAwID8gJy4uLicgOiAnJyk7Cn0KCnJldHVybiBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdUaGUgIicuJGpvYlsndXJsJ10uJyIgZmlsZSBjb3VsZCBub3QgYmUgZG93bmxvYWRlZCAoJy4kZXJyb3JNZXNzYWdlLicpJyAuICRkZXRhaWxzLCAkcmVzcG9uc2UtPmdldFN0YXR1c0NvZGUoKSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVqZWN0Sm9iKGFycmF5ICRqb2IsIFxFeGNlcHRpb24gJGUpOiB2b2lkCnsKaWYgKGlzX3Jlc291cmNlKCRqb2JbJ2hlYWRlckhhbmRsZSddKSkgewpmY2xvc2UoJGpvYlsnaGVhZGVySGFuZGxlJ10pOwp9CmlmIChpc19yZXNvdXJjZSgkam9iWydib2R5SGFuZGxlJ10pKSB7CmZjbG9zZSgkam9iWydib2R5SGFuZGxlJ10pOwp9CmlmIChudWxsICE9PSAkam9iWydmaWxlbmFtZSddKSB7CkB1bmxpbmsoJGpvYlsnZmlsZW5hbWUnXS4nficpOwp9CiRqb2JbJ3JlamVjdCddKCRlKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja0N1cmxSZXN1bHQoaW50ICRjb2RlKTogdm9pZAp7CmlmICgkY29kZSAhPT0gQ1VSTE1fT0sgJiYgJGNvZGUgIT09IENVUkxNX0NBTExfTVVMVElfUEVSRk9STSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCmlzc2V0KCR0aGlzLT5tdWx0aUVycm9yc1skY29kZV0pCj8gImNVUkwgZXJyb3I6IHskY29kZX0gKHskdGhpcy0+bXVsdGlFcnJvcnNbJGNvZGVdWzBdfSk6IGNVUkwgbWVzc2FnZTogeyR0aGlzLT5tdWx0aUVycm9yc1skY29kZV1bMV19Igo6ICdVbmV4cGVjdGVkIGNVUkwgZXJyb3I6ICcgLiAkY29kZQopOwp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbFxIdHRwOwoKCgoKY2xhc3MgQ3VybFJlc3BvbnNlIGV4dGVuZHMgUmVzcG9uc2UKewoKCgoKCnByaXZhdGUgJGN1cmxJbmZvOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRyZXF1ZXN0LCA/aW50ICRjb2RlLCBhcnJheSAkaGVhZGVycywgP3N0cmluZyAkYm9keSwgYXJyYXkgJGN1cmxJbmZvKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJHJlcXVlc3QsICRjb2RlLCAkaGVhZGVycywgJGJvZHkpOwokdGhpcy0+Y3VybEluZm8gPSAkY3VybEluZm87Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDdXJsSW5mbygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+Y3VybEluZm87Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbFxIdHRwOwoKCgoKCmNsYXNzIFByb3h5SXRlbQp7Cgpwcml2YXRlICR1cmw7Cgpwcml2YXRlICRzYWZlVXJsOwoKcHJpdmF0ZSAkY3VybEF1dGg7Cgpwcml2YXRlICRvcHRpb25zUHJveHk7Cgpwcml2YXRlICRvcHRpb25zQXV0aDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkcHJveHlVcmwsIHN0cmluZyAkZW52TmFtZSkKewokc3ludGF4RXJyb3IgPSBzcHJpbnRmKCd1bnN1cHBvcnRlZCBgJXNgIHN5bnRheCcsICRlbnZOYW1lKTsKCmlmIChzdHJwYnJrKCRwcm94eVVybCwgIlxyXG5cdCIpICE9PSBmYWxzZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJHN5bnRheEVycm9yKTsKfQppZiAoZmFsc2UgPT09ICgkcHJveHkgPSBwYXJzZV91cmwoJHByb3h5VXJsKSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRzeW50YXhFcnJvcik7Cn0KaWYgKCFpc3NldCgkcHJveHlbJ2hvc3QnXSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCd1bmFibGUgdG8gZmluZCBwcm94eSBob3N0IGluICcgLiAkZW52TmFtZSk7Cn0KCiRzY2hlbWUgPSBpc3NldCgkcHJveHlbJ3NjaGVtZSddKSA/IHN0cnRvbG93ZXIoJHByb3h5WydzY2hlbWUnXSkgLiAnOi8vJyA6ICdodHRwOi8vJzsKJHNhZmUgPSAnJzsKCmlmIChpc3NldCgkcHJveHlbJ3VzZXInXSkpIHsKJHNhZmUgPSAnKioqJzsKJHVzZXIgPSAkcHJveHlbJ3VzZXInXTsKJGF1dGggPSByYXd1cmxkZWNvZGUoJHByb3h5Wyd1c2VyJ10pOwoKaWYgKGlzc2V0KCRwcm94eVsncGFzcyddKSkgewokc2FmZSAuPSAnOioqKic7CiR1c2VyIC49ICc6JyAuICRwcm94eVsncGFzcyddOwokYXV0aCAuPSAnOicgLiByYXd1cmxkZWNvZGUoJHByb3h5WydwYXNzJ10pOwp9Cgokc2FmZSAuPSAnQCc7CgppZiAoc3RybGVuKCR1c2VyKSA+IDApIHsKJHRoaXMtPmN1cmxBdXRoID0gJHVzZXI7CiR0aGlzLT5vcHRpb25zQXV0aCA9ICdQcm94eS1BdXRob3JpemF0aW9uOiBCYXNpYyAnIC4gYmFzZTY0X2VuY29kZSgkYXV0aCk7Cn0KfQoKJGhvc3QgPSAkcHJveHlbJ2hvc3QnXTsKJHBvcnQgPSBudWxsOwoKaWYgKGlzc2V0KCRwcm94eVsncG9ydCddKSkgewokcG9ydCA9ICRwcm94eVsncG9ydCddOwp9IGVsc2VpZiAoJHNjaGVtZSA9PT0gJ2h0dHA6Ly8nKSB7CiRwb3J0ID0gODA7Cn0gZWxzZWlmICgkc2NoZW1lID09PSAnaHR0cHM6Ly8nKSB7CiRwb3J0ID0gNDQzOwp9CgoKCmlmICgkcG9ydCA9PT0gbnVsbCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ3VuYWJsZSB0byBmaW5kIHByb3h5IHBvcnQgaW4gJyAuICRlbnZOYW1lKTsKfQppZiAoJHBvcnQgPT09IDApIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdwb3J0IDAgaXMgcmVzZXJ2ZWQgaW4gJyAuICRlbnZOYW1lKTsKfQoKJHRoaXMtPnVybCA9IHNwcmludGYoJyVzJXM6JWQnLCAkc2NoZW1lLCAkaG9zdCwgJHBvcnQpOwokdGhpcy0+c2FmZVVybCA9IHNwcmludGYoJyVzJXMlczolZCcsICRzY2hlbWUsICRzYWZlLCAkaG9zdCwgJHBvcnQpOwoKJHNjaGVtZSA9IHN0cl9yZXBsYWNlKFsnaHR0cDovLycsICdodHRwczovLyddLCBbJ3RjcDovLycsICdzc2w6Ly8nXSwgJHNjaGVtZSk7CiR0aGlzLT5vcHRpb25zUHJveHkgPSBzcHJpbnRmKCclcyVzOiVkJywgJHNjaGVtZSwgJGhvc3QsICRwb3J0KTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdG9SZXF1ZXN0UHJveHkoc3RyaW5nICRzY2hlbWUpOiBSZXF1ZXN0UHJveHkKewokb3B0aW9ucyA9IFsnaHR0cCcgPT4gWydwcm94eScgPT4gJHRoaXMtPm9wdGlvbnNQcm94eV1dOwoKaWYgKCR0aGlzLT5vcHRpb25zQXV0aCAhPT0gbnVsbCkgewokb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSA9ICR0aGlzLT5vcHRpb25zQXV0aDsKfQoKaWYgKCRzY2hlbWUgPT09ICdodHRwJykgewokb3B0aW9uc1snaHR0cCddWydyZXF1ZXN0X2Z1bGx1cmknXSA9IHRydWU7Cn0KCnJldHVybiBuZXcgUmVxdWVzdFByb3h5KCR0aGlzLT51cmwsICR0aGlzLT5jdXJsQXV0aCwgJG9wdGlvbnMsICR0aGlzLT5zYWZlVXJsKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsXEh0dHA7Cgp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CnVzZSBDb21wb3NlclxVdGlsXE5vUHJveHlQYXR0ZXJuOwoKCgoKCmNsYXNzIFByb3h5TWFuYWdlcgp7Cgpwcml2YXRlICRlcnJvciA9IG51bGw7Cgpwcml2YXRlICRodHRwUHJveHkgPSBudWxsOwoKcHJpdmF0ZSAkaHR0cHNQcm94eSA9IG51bGw7Cgpwcml2YXRlICRub1Byb3h5SGFuZGxlciA9IG51bGw7CgoKcHJpdmF0ZSBzdGF0aWMgJGluc3RhbmNlID0gbnVsbDsKCnByaXZhdGUgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7CnRyeSB7CiR0aGlzLT5nZXRQcm94eURhdGEoKTsKfSBjYXRjaCAoXFJ1bnRpbWVFeGNlcHRpb24gJGUpIHsKJHRoaXMtPmVycm9yID0gJGUtPmdldE1lc3NhZ2UoKTsKfQp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEluc3RhbmNlKCk6IFByb3h5TWFuYWdlcgp7CmlmIChzZWxmOjokaW5zdGFuY2UgPT09IG51bGwpIHsKc2VsZjo6JGluc3RhbmNlID0gbmV3IHNlbGYoKTsKfQoKcmV0dXJuIHNlbGY6OiRpbnN0YW5jZTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXNldCgpOiB2b2lkCnsKc2VsZjo6JGluc3RhbmNlID0gbnVsbDsKfQoKcHVibGljIGZ1bmN0aW9uIGhhc1Byb3h5KCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmh0dHBQcm94eSAhPT0gbnVsbCB8fCAkdGhpcy0+aHR0cHNQcm94eSAhPT0gbnVsbDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJveHlGb3JSZXF1ZXN0KHN0cmluZyAkcmVxdWVzdFVybCk6IFJlcXVlc3RQcm94eQp7CmlmICgkdGhpcy0+ZXJyb3IgIT09IG51bGwpIHsKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignVW5hYmxlIHRvIHVzZSBhIHByb3h5OiAnLiR0aGlzLT5lcnJvcik7Cn0KCiRzY2hlbWUgPSAoc3RyaW5nKSBwYXJzZV91cmwoJHJlcXVlc3RVcmwsIFBIUF9VUkxfU0NIRU1FKTsKJHByb3h5ID0gJHRoaXMtPmdldFByb3h5Rm9yU2NoZW1lKCRzY2hlbWUpOwoKaWYgKCRwcm94eSA9PT0gbnVsbCkgewpyZXR1cm4gUmVxdWVzdFByb3h5Ojpub25lKCk7Cn0KCmlmICgkdGhpcy0+bm9Qcm94eSgkcmVxdWVzdFVybCkpIHsKcmV0dXJuIFJlcXVlc3RQcm94eTo6bm9Qcm94eSgpOwp9CgpyZXR1cm4gJHByb3h5LT50b1JlcXVlc3RQcm94eSgkc2NoZW1lKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRQcm94eUZvclNjaGVtZShzdHJpbmcgJHNjaGVtZSk6ID9Qcm94eUl0ZW0KewppZiAoJHNjaGVtZSA9PT0gJ2h0dHAnKSB7CnJldHVybiAkdGhpcy0+aHR0cFByb3h5Owp9CgppZiAoJHNjaGVtZSA9PT0gJ2h0dHBzJykgewpyZXR1cm4gJHRoaXMtPmh0dHBzUHJveHk7Cn0KCnJldHVybiBudWxsOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFByb3h5RGF0YSgpOiB2b2lkCnsKCmlmIChQSFBfU0FQSSA9PT0gJ2NsaScgfHwgUEhQX1NBUEkgPT09ICdwaHBkYmcnKSB7ClskZW52LCAkbmFtZV0gPSAkdGhpcy0+Z2V0UHJveHlFbnYoJ2h0dHBfcHJveHknKTsKaWYgKCRlbnYgIT09IG51bGwpIHsKJHRoaXMtPmh0dHBQcm94eSA9IG5ldyBQcm94eUl0ZW0oJGVudiwgJG5hbWUpOwp9Cn0KCgppZiAoJHRoaXMtPmh0dHBQcm94eSA9PT0gbnVsbCkgewpbJGVudiwgJG5hbWVdID0gJHRoaXMtPmdldFByb3h5RW52KCdjZ2lfaHR0cF9wcm94eScpOwppZiAoJGVudiAhPT0gbnVsbCkgewokdGhpcy0+aHR0cFByb3h5ID0gbmV3IFByb3h5SXRlbSgkZW52LCAkbmFtZSk7Cn0KfQoKClskZW52LCAkbmFtZV0gPSAkdGhpcy0+Z2V0UHJveHlFbnYoJ2h0dHBzX3Byb3h5Jyk7CmlmICgkZW52ICE9PSBudWxsKSB7CiR0aGlzLT5odHRwc1Byb3h5ID0gbmV3IFByb3h5SXRlbSgkZW52LCAkbmFtZSk7Cn0KCgpbJGVudiwgJG5hbWVdID0gJHRoaXMtPmdldFByb3h5RW52KCdub19wcm94eScpOwppZiAoJGVudiAhPT0gbnVsbCkgewokdGhpcy0+bm9Qcm94eUhhbmRsZXIgPSBuZXcgTm9Qcm94eVBhdHRlcm4oJGVudik7Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFByb3h5RW52KHN0cmluZyAkZW52TmFtZSk6IGFycmF5CnsKJG5hbWVzID0gW3N0cnRvbG93ZXIoJGVudk5hbWUpLCBzdHJ0b3VwcGVyKCRlbnZOYW1lKV07Cgpmb3JlYWNoICgkbmFtZXMgYXMgJG5hbWUpIHsKaWYgKGlzX3N0cmluZygkX1NFUlZFUlskbmFtZV0gPz8gbnVsbCkpIHsKaWYgKCRfU0VSVkVSWyRuYW1lXSAhPT0gJycpIHsKcmV0dXJuIFskX1NFUlZFUlskbmFtZV0sICRuYW1lXTsKfQp9Cn0KCnJldHVybiBbbnVsbCwgJyddOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIG5vUHJveHkoc3RyaW5nICRyZXF1ZXN0VXJsKTogYm9vbAp7CmlmICgkdGhpcy0+bm9Qcm94eUhhbmRsZXIgPT09IG51bGwpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gJHRoaXMtPm5vUHJveHlIYW5kbGVyLT50ZXN0KCRyZXF1ZXN0VXJsKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsXEh0dHA7Cgp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CgoKCgoKCgpjbGFzcyBSZXF1ZXN0UHJveHkKewoKcHJpdmF0ZSAkY29udGV4dE9wdGlvbnM7Cgpwcml2YXRlICRzdGF0dXM7Cgpwcml2YXRlICR1cmw7Cgpwcml2YXRlICRhdXRoOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9zdHJpbmcgJHVybCwgP3N0cmluZyAkYXV0aCwgP2FycmF5ICRjb250ZXh0T3B0aW9ucywgP3N0cmluZyAkc3RhdHVzKQp7CiR0aGlzLT51cmwgPSAkdXJsOwokdGhpcy0+YXV0aCA9ICRhdXRoOwokdGhpcy0+Y29udGV4dE9wdGlvbnMgPSAkY29udGV4dE9wdGlvbnM7CiR0aGlzLT5zdGF0dXMgPSAkc3RhdHVzOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG5vbmUoKTogUmVxdWVzdFByb3h5CnsKcmV0dXJuIG5ldyBzZWxmKG51bGwsIG51bGwsIG51bGwsIG51bGwpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG5vUHJveHkoKTogUmVxdWVzdFByb3h5CnsKcmV0dXJuIG5ldyBzZWxmKG51bGwsIG51bGwsIG51bGwsICdleGNsdWRlZCBieSBub19wcm94eScpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb250ZXh0T3B0aW9ucygpOiA/YXJyYXkKewpyZXR1cm4gJHRoaXMtPmNvbnRleHRPcHRpb25zOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q3VybE9wdGlvbnMoYXJyYXkgJHNzbE9wdGlvbnMpOiBhcnJheQp7CmlmICgkdGhpcy0+aXNTZWN1cmUoKSAmJiAhJHRoaXMtPnN1cHBvcnRzU2VjdXJlUHJveHkoKSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdDYW5ub3QgdXNlIGFuIEhUVFBTIHByb3h5LiBQSFAgPj0gNy4zIGFuZCBjVXJsID49IDcuNTIuMCBhcmUgcmVxdWlyZWQuJyk7Cn0KCgoKJG9wdGlvbnMgPSBbQ1VSTE9QVF9QUk9YWSA9PiAoc3RyaW5nKSAkdGhpcy0+dXJsXTsKCgppZiAoJHRoaXMtPnVybCAhPT0gbnVsbCkgewokb3B0aW9uc1tDVVJMT1BUX05PUFJPWFldID0gJyc7Cn0KCgppZiAoJHRoaXMtPmF1dGggIT09IG51bGwpIHsKJG9wdGlvbnNbQ1VSTE9QVF9QUk9YWUFVVEhdID0gQ1VSTEFVVEhfQkFTSUM7CiRvcHRpb25zW0NVUkxPUFRfUFJPWFlVU0VSUFdEXSA9ICR0aGlzLT5hdXRoOwp9CgppZiAoJHRoaXMtPmlzU2VjdXJlKCkpIHsKaWYgKGlzc2V0KCRzc2xPcHRpb25zWydjYWZpbGUnXSkpIHsKJG9wdGlvbnNbQ1VSTE9QVF9QUk9YWV9DQUlORk9dID0gJHNzbE9wdGlvbnNbJ2NhZmlsZSddOwp9CmlmIChpc3NldCgkc3NsT3B0aW9uc1snY2FwYXRoJ10pKSB7CiRvcHRpb25zW0NVUkxPUFRfUFJPWFlfQ0FQQVRIXSA9ICRzc2xPcHRpb25zWydjYXBhdGgnXTsKfQp9CgpyZXR1cm4gJG9wdGlvbnM7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhdHVzKD9zdHJpbmcgJGZvcm1hdCA9IG51bGwpOiBzdHJpbmcKewppZiAoJHRoaXMtPnN0YXR1cyA9PT0gbnVsbCkgewpyZXR1cm4gJyc7Cn0KCiRmb3JtYXQgPSAkZm9ybWF0ID8/ICclcyc7CmlmIChzdHJwb3MoJGZvcm1hdCwgJyVzJykgIT09IGZhbHNlKSB7CnJldHVybiBzcHJpbnRmKCRmb3JtYXQsICR0aGlzLT5zdGF0dXMpOwp9Cgp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignU3RyaW5nIGZvcm1hdCBzcGVjaWZpZXIgaXMgbWlzc2luZycpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0V4Y2x1ZGVkQnlOb1Byb3h5KCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPnN0YXR1cyAhPT0gbnVsbCAmJiAkdGhpcy0+dXJsID09PSBudWxsOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNTZWN1cmUoKTogYm9vbAp7CnJldHVybiAwID09PSBzdHJwb3MoKHN0cmluZykgJHRoaXMtPnVybCwgJ2h0dHBzOi8vJyk7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzdXBwb3J0c1NlY3VyZVByb3h5KCk6IGJvb2wKewppZiAoZmFsc2UgPT09ICgkdmVyc2lvbiA9IGN1cmxfdmVyc2lvbigpKSB8fCAhZGVmaW5lZCgnQ1VSTF9WRVJTSU9OX0hUVFBTX1BST1hZJykpIHsKcmV0dXJuIGZhbHNlOwp9CgokZmVhdHVyZXMgPSAkdmVyc2lvblsnZmVhdHVyZXMnXTsKCnJldHVybiAoYm9vbCkgKCRmZWF0dXJlcyAmIENVUkxfVkVSU0lPTl9IVFRQU19QUk9YWSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbFxIdHRwOwoKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgpjbGFzcyBSZXNwb25zZQp7Cgpwcml2YXRlICRyZXF1ZXN0OwoKcHJpdmF0ZSAkY29kZTsKCnByaXZhdGUgJGhlYWRlcnM7Cgpwcml2YXRlICRib2R5OwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkcmVxdWVzdCwgP2ludCAkY29kZSwgYXJyYXkgJGhlYWRlcnMsID9zdHJpbmcgJGJvZHkpCnsKaWYgKCFpc3NldCgkcmVxdWVzdFsndXJsJ10pKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ3VybCBrZXkgbWlzc2luZyBmcm9tIHJlcXVlc3QgYXJyYXknKTsKfQokdGhpcy0+cmVxdWVzdCA9ICRyZXF1ZXN0OwokdGhpcy0+Y29kZSA9IChpbnQpICRjb2RlOwokdGhpcy0+aGVhZGVycyA9ICRoZWFkZXJzOwokdGhpcy0+Ym9keSA9ICRib2R5Owp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhdHVzQ29kZSgpOiBpbnQKewpyZXR1cm4gJHRoaXMtPmNvZGU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTdGF0dXNNZXNzYWdlKCk6ID9zdHJpbmcKewokdmFsdWUgPSBudWxsOwpmb3JlYWNoICgkdGhpcy0+aGVhZGVycyBhcyAkaGVhZGVyKSB7CmlmIChQcmVnOjppc01hdGNoKCd7XkhUVFAvXFMrIFxkK31pJywgJGhlYWRlcikpIHsKCgokdmFsdWUgPSAkaGVhZGVyOwp9Cn0KCnJldHVybiAkdmFsdWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRIZWFkZXJzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5oZWFkZXJzOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SGVhZGVyKHN0cmluZyAkbmFtZSk6ID9zdHJpbmcKewpyZXR1cm4gc2VsZjo6ZmluZEhlYWRlclZhbHVlKCR0aGlzLT5oZWFkZXJzLCAkbmFtZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRCb2R5KCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmJvZHk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBkZWNvZGVKc29uKCkKewpyZXR1cm4gSnNvbkZpbGU6OnBhcnNlSnNvbigkdGhpcy0+Ym9keSwgJHRoaXMtPnJlcXVlc3RbJ3VybCddKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbGxlY3QoKTogdm9pZAp7CnVuc2V0KCR0aGlzLT5yZXF1ZXN0LCAkdGhpcy0+Y29kZSwgJHRoaXMtPmhlYWRlcnMsICR0aGlzLT5ib2R5KTsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZmluZEhlYWRlclZhbHVlKGFycmF5ICRoZWFkZXJzLCBzdHJpbmcgJG5hbWUpOiA/c3RyaW5nCnsKJHZhbHVlID0gbnVsbDsKZm9yZWFjaCAoJGhlYWRlcnMgYXMgJGhlYWRlcikgewppZiAoUHJlZzo6aXNNYXRjaCgne14nLnByZWdfcXVvdGUoJG5hbWUpLic6XHMqKC4rPylccyokfWknLCAkaGVhZGVyLCAkbWF0Y2gpKSB7CiR2YWx1ZSA9ICRtYXRjaFsxXTsKfQp9CgpyZXR1cm4gJHZhbHVlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cFxSZXNwb25zZTsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cFxDdXJsRG93bmxvYWRlcjsKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcRXhjZXB0aW9uXElycmVjb3ZlcmFibGVEb3dubG9hZEV4Y2VwdGlvbjsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZTsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKY2xhc3MgSHR0cERvd25sb2FkZXIKewpwcml2YXRlIGNvbnN0IFNUQVRVU19RVUVVRUQgPSAxOwpwcml2YXRlIGNvbnN0IFNUQVRVU19TVEFSVEVEID0gMjsKcHJpdmF0ZSBjb25zdCBTVEFUVVNfQ09NUExFVEVEID0gMzsKcHJpdmF0ZSBjb25zdCBTVEFUVVNfRkFJTEVEID0gNDsKcHJpdmF0ZSBjb25zdCBTVEFUVVNfQUJPUlRFRCA9IDU7CgoKcHJpdmF0ZSAkaW87Cgpwcml2YXRlICRjb25maWc7Cgpwcml2YXRlICRqb2JzID0gW107Cgpwcml2YXRlICRvcHRpb25zID0gW107Cgpwcml2YXRlICRydW5uaW5nSm9icyA9IDA7Cgpwcml2YXRlICRtYXhKb2JzID0gMTI7Cgpwcml2YXRlICRjdXJsOwoKcHJpdmF0ZSAkcmZzOwoKcHJpdmF0ZSAkaWRHZW4gPSAwOwoKcHJpdmF0ZSAkZGlzYWJsZWQ7Cgpwcml2YXRlICRhbGxvd0FzeW5jID0gZmFsc2U7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBhcnJheSAkb3B0aW9ucyA9IFtdLCBib29sICRkaXNhYmxlVGxzID0gZmFsc2UpCnsKJHRoaXMtPmlvID0gJGlvOwoKJHRoaXMtPmRpc2FibGVkID0gKGJvb2wpIFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0RJU0FCTEVfTkVUV09SSycpOwoKCgppZiAoJGRpc2FibGVUbHMgPT09IGZhbHNlKSB7CiR0aGlzLT5vcHRpb25zID0gU3RyZWFtQ29udGV4dEZhY3Rvcnk6OmdldFRsc0RlZmF1bHRzKCRvcHRpb25zLCAkaW8pOwp9CgoKJHRoaXMtPm9wdGlvbnMgPSBhcnJheV9yZXBsYWNlX3JlY3Vyc2l2ZSgkdGhpcy0+b3B0aW9ucywgJG9wdGlvbnMpOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKCmlmIChzZWxmOjppc0N1cmxFbmFibGVkKCkpIHsKJHRoaXMtPmN1cmwgPSBuZXcgQ3VybERvd25sb2FkZXIoJGlvLCAkY29uZmlnLCAkb3B0aW9ucywgJGRpc2FibGVUbHMpOwp9CgokdGhpcy0+cmZzID0gbmV3IFJlbW90ZUZpbGVzeXN0ZW0oJGlvLCAkY29uZmlnLCAkb3B0aW9ucywgJGRpc2FibGVUbHMpOwoKaWYgKGlzX251bWVyaWMoJG1heEpvYnMgPSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9NQVhfUEFSQUxMRUxfSFRUUCcpKSkgewokdGhpcy0+bWF4Sm9icyA9IG1heCgxLCBtaW4oNTAsIChpbnQpICRtYXhKb2JzKSk7Cn0KfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldChzdHJpbmcgJHVybCwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewppZiAoJycgPT09ICR1cmwpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJyR1cmwgbXVzdCBub3QgYmUgYW4gZW1wdHkgc3RyaW5nJyk7Cn0KWyRqb2IsICRwcm9taXNlXSA9ICR0aGlzLT5hZGRKb2IoWyd1cmwnID0+ICR1cmwsICdvcHRpb25zJyA9PiAkb3B0aW9ucywgJ2NvcHlUbycgPT4gbnVsbF0sIHRydWUpOwokcHJvbWlzZS0+dGhlbihudWxsLCBzdGF0aWMgZnVuY3Rpb24gKFxUaHJvd2FibGUgJGUpIHsKCn0pOwokdGhpcy0+d2FpdCgkam9iWydpZCddKTsKCiRyZXNwb25zZSA9ICR0aGlzLT5nZXRSZXNwb25zZSgkam9iWydpZCddKTsKCnJldHVybiAkcmVzcG9uc2U7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkKHN0cmluZyAkdXJsLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CmlmICgnJyA9PT0gJHVybCkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignJHVybCBtdXN0IG5vdCBiZSBhbiBlbXB0eSBzdHJpbmcnKTsKfQpbLCAkcHJvbWlzZV0gPSAkdGhpcy0+YWRkSm9iKFsndXJsJyA9PiAkdXJsLCAnb3B0aW9ucycgPT4gJG9wdGlvbnMsICdjb3B5VG8nID0+IG51bGxdKTsKCnJldHVybiAkcHJvbWlzZTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb3B5KHN0cmluZyAkdXJsLCBzdHJpbmcgJHRvLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CmlmICgnJyA9PT0gJHVybCkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignJHVybCBtdXN0IG5vdCBiZSBhbiBlbXB0eSBzdHJpbmcnKTsKfQpbJGpvYl0gPSAkdGhpcy0+YWRkSm9iKFsndXJsJyA9PiAkdXJsLCAnb3B0aW9ucycgPT4gJG9wdGlvbnMsICdjb3B5VG8nID0+ICR0b10sIHRydWUpOwokdGhpcy0+d2FpdCgkam9iWydpZCddKTsKCnJldHVybiAkdGhpcy0+Z2V0UmVzcG9uc2UoJGpvYlsnaWQnXSk7Cn0KCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZENvcHkoc3RyaW5nICR1cmwsIHN0cmluZyAkdG8sIGFycmF5ICRvcHRpb25zID0gW10pCnsKaWYgKCcnID09PSAkdXJsKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCckdXJsIG11c3Qgbm90IGJlIGFuIGVtcHR5IHN0cmluZycpOwp9ClssICRwcm9taXNlXSA9ICR0aGlzLT5hZGRKb2IoWyd1cmwnID0+ICR1cmwsICdvcHRpb25zJyA9PiAkb3B0aW9ucywgJ2NvcHlUbycgPT4gJHRvXSk7CgpyZXR1cm4gJHByb21pc2U7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE9wdGlvbnMoKQp7CnJldHVybiAkdGhpcy0+b3B0aW9uczsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE9wdGlvbnMoYXJyYXkgJG9wdGlvbnMpCnsKJHRoaXMtPm9wdGlvbnMgPSBhcnJheV9yZXBsYWNlX3JlY3Vyc2l2ZSgkdGhpcy0+b3B0aW9ucywgJG9wdGlvbnMpOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gYWRkSm9iKGFycmF5ICRyZXF1ZXN0LCBib29sICRzeW5jID0gZmFsc2UpOiBhcnJheQp7CiRyZXF1ZXN0WydvcHRpb25zJ10gPSBhcnJheV9yZXBsYWNlX3JlY3Vyc2l2ZSgkdGhpcy0+b3B0aW9ucywgJHJlcXVlc3RbJ29wdGlvbnMnXSk7CgoKJGpvYiA9IFsKJ2lkJyA9PiAkdGhpcy0+aWRHZW4rKywKJ3N0YXR1cycgPT4gc2VsZjo6U1RBVFVTX1FVRVVFRCwKJ3JlcXVlc3QnID0+ICRyZXF1ZXN0LAonc3luYycgPT4gJHN5bmMsCidvcmlnaW4nID0+IFVybDo6Z2V0T3JpZ2luKCR0aGlzLT5jb25maWcsICRyZXF1ZXN0Wyd1cmwnXSksCl07CgppZiAoISRzeW5jICYmICEkdGhpcy0+YWxsb3dBc3luYykgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdZb3UgbXVzdCB1c2UgdGhlIEh0dHBEb3dubG9hZGVyIGluc3RhbmNlIHdoaWNoIGlzIHBhcnQgb2YgYSBDb21wb3NlclxMb29wIGluc3RhbmNlIHRvIGJlIGFibGUgdG8gcnVuIGFzeW5jIGh0dHAgcmVxdWVzdHMnKTsKfQoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7Xmh0dHBzPzovLyhbXjovXSspOihbXkAvXSspQChbXi9dKyl9aScsICRyZXF1ZXN0Wyd1cmwnXSwgJG1hdGNoKSkgewokdGhpcy0+aW8tPnNldEF1dGhlbnRpY2F0aW9uKCRqb2JbJ29yaWdpbiddLCByYXd1cmxkZWNvZGUoJG1hdGNoWzFdKSwgcmF3dXJsZGVjb2RlKCRtYXRjaFsyXSkpOwp9CgokcmZzID0gJHRoaXMtPnJmczsKCmlmICgkdGhpcy0+Y2FuVXNlQ3VybCgkam9iKSkgewokcmVzb2x2ZXIgPSBzdGF0aWMgZnVuY3Rpb24gKCRyZXNvbHZlLCAkcmVqZWN0KSB1c2UgKCYkam9iKTogdm9pZCB7CiRqb2JbJ3N0YXR1cyddID0gSHR0cERvd25sb2FkZXI6OlNUQVRVU19RVUVVRUQ7CiRqb2JbJ3Jlc29sdmUnXSA9ICRyZXNvbHZlOwokam9iWydyZWplY3QnXSA9ICRyZWplY3Q7Cn07Cn0gZWxzZSB7CiRyZXNvbHZlciA9IHN0YXRpYyBmdW5jdGlvbiAoJHJlc29sdmUsICRyZWplY3QpIHVzZSAoJiRqb2IsICRyZnMpOiB2b2lkIHsKCiR1cmwgPSAkam9iWydyZXF1ZXN0J11bJ3VybCddOwokb3B0aW9ucyA9ICRqb2JbJ3JlcXVlc3QnXVsnb3B0aW9ucyddOwoKJGpvYlsnc3RhdHVzJ10gPSBIdHRwRG93bmxvYWRlcjo6U1RBVFVTX1NUQVJURUQ7CgppZiAoJGpvYlsncmVxdWVzdCddWydjb3B5VG8nXSkgewokcmZzLT5jb3B5KCRqb2JbJ29yaWdpbiddLCAkdXJsLCAkam9iWydyZXF1ZXN0J11bJ2NvcHlUbyddLCBmYWxzZSAsICRvcHRpb25zKTsKCiRoZWFkZXJzID0gJHJmcy0+Z2V0TGFzdEhlYWRlcnMoKTsKJHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKCRqb2JbJ3JlcXVlc3QnXSwgJHJmcy0+ZmluZFN0YXR1c0NvZGUoJGhlYWRlcnMpLCAkaGVhZGVycywgJGpvYlsncmVxdWVzdCddWydjb3B5VG8nXS4nficpOwoKJHJlc29sdmUoJHJlc3BvbnNlKTsKfSBlbHNlIHsKJGJvZHkgPSAkcmZzLT5nZXRDb250ZW50cygkam9iWydvcmlnaW4nXSwgJHVybCwgZmFsc2UgLCAkb3B0aW9ucyk7CiRoZWFkZXJzID0gJHJmcy0+Z2V0TGFzdEhlYWRlcnMoKTsKJHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKCRqb2JbJ3JlcXVlc3QnXSwgJHJmcy0+ZmluZFN0YXR1c0NvZGUoJGhlYWRlcnMpLCAkaGVhZGVycywgJGJvZHkpOwoKJHJlc29sdmUoJHJlc3BvbnNlKTsKfQp9Owp9CgokY3VybCA9ICR0aGlzLT5jdXJsOwoKJGNhbmNlbGVyID0gc3RhdGljIGZ1bmN0aW9uICgpIHVzZSAoJiRqb2IsICRjdXJsKTogdm9pZCB7CmlmICgkam9iWydzdGF0dXMnXSA9PT0gSHR0cERvd25sb2FkZXI6OlNUQVRVU19RVUVVRUQpIHsKJGpvYlsnc3RhdHVzJ10gPSBIdHRwRG93bmxvYWRlcjo6U1RBVFVTX0FCT1JURUQ7Cn0KaWYgKCRqb2JbJ3N0YXR1cyddICE9PSBIdHRwRG93bmxvYWRlcjo6U1RBVFVTX1NUQVJURUQpIHsKcmV0dXJuOwp9CiRqb2JbJ3N0YXR1cyddID0gSHR0cERvd25sb2FkZXI6OlNUQVRVU19BQk9SVEVEOwppZiAoaXNzZXQoJGpvYlsnY3VybF9pZCddKSkgewokY3VybC0+YWJvcnRSZXF1ZXN0KCRqb2JbJ2N1cmxfaWQnXSk7Cn0KdGhyb3cgbmV3IElycmVjb3ZlcmFibGVEb3dubG9hZEV4Y2VwdGlvbignRG93bmxvYWQgb2YgJyAuIFVybDo6c2FuaXRpemUoJGpvYlsncmVxdWVzdCddWyd1cmwnXSkgLiAnIGNhbmNlbGVkJyk7Cn07CgokcHJvbWlzZSA9IG5ldyBQcm9taXNlKCRyZXNvbHZlciwgJGNhbmNlbGVyKTsKJHByb21pc2UgPSAkcHJvbWlzZS0+dGhlbihmdW5jdGlvbiAoJHJlc3BvbnNlKSB1c2UgKCYkam9iKSB7CiRqb2JbJ3N0YXR1cyddID0gSHR0cERvd25sb2FkZXI6OlNUQVRVU19DT01QTEVURUQ7CiRqb2JbJ3Jlc3BvbnNlJ10gPSAkcmVzcG9uc2U7CgokdGhpcy0+bWFya0pvYkRvbmUoKTsKCnJldHVybiAkcmVzcG9uc2U7Cn0sIGZ1bmN0aW9uICgkZSkgdXNlICgmJGpvYik6IHZvaWQgewokam9iWydzdGF0dXMnXSA9IEh0dHBEb3dubG9hZGVyOjpTVEFUVVNfRkFJTEVEOwokam9iWydleGNlcHRpb24nXSA9ICRlOwoKJHRoaXMtPm1hcmtKb2JEb25lKCk7Cgp0aHJvdyAkZTsKfSk7CiR0aGlzLT5qb2JzWyRqb2JbJ2lkJ11dID0gJiRqb2I7CgppZiAoJHRoaXMtPnJ1bm5pbmdKb2JzIDwgJHRoaXMtPm1heEpvYnMpIHsKJHRoaXMtPnN0YXJ0Sm9iKCRqb2JbJ2lkJ10pOwp9CgpyZXR1cm4gWyRqb2IsICRwcm9taXNlXTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBzdGFydEpvYihpbnQgJGlkKTogdm9pZAp7CiRqb2IgPSAmJHRoaXMtPmpvYnNbJGlkXTsKaWYgKCRqb2JbJ3N0YXR1cyddICE9PSBzZWxmOjpTVEFUVVNfUVVFVUVEKSB7CnJldHVybjsKfQoKCiRqb2JbJ3N0YXR1cyddID0gc2VsZjo6U1RBVFVTX1NUQVJURUQ7CiR0aGlzLT5ydW5uaW5nSm9icysrOwoKYXNzZXJ0KGlzc2V0KCRqb2JbJ3Jlc29sdmUnXSkpOwphc3NlcnQoaXNzZXQoJGpvYlsncmVqZWN0J10pKTsKCiRyZXNvbHZlID0gJGpvYlsncmVzb2x2ZSddOwokcmVqZWN0ID0gJGpvYlsncmVqZWN0J107CiR1cmwgPSAkam9iWydyZXF1ZXN0J11bJ3VybCddOwokb3B0aW9ucyA9ICRqb2JbJ3JlcXVlc3QnXVsnb3B0aW9ucyddOwokb3JpZ2luID0gJGpvYlsnb3JpZ2luJ107CgppZiAoJHRoaXMtPmRpc2FibGVkKSB7CmlmIChpc3NldCgkam9iWydyZXF1ZXN0J11bJ29wdGlvbnMnXVsnaHR0cCddWydoZWFkZXInXSkgJiYgZmFsc2UgIT09IHN0cmlwb3MoaW1wbG9kZSgnJywgJGpvYlsncmVxdWVzdCddWydvcHRpb25zJ11bJ2h0dHAnXVsnaGVhZGVyJ10pLCAnaWYtbW9kaWZpZWQtc2luY2UnKSkgewokcmVzb2x2ZShuZXcgUmVzcG9uc2UoWyd1cmwnID0+ICR1cmxdLCAzMDQsIFtdLCAnJykpOwp9IGVsc2UgewokZSA9IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJ05ldHdvcmsgZGlzYWJsZWQsIHJlcXVlc3QgY2FuY2VsZWQ6ICcuVXJsOjpzYW5pdGl6ZSgkdXJsKSwgNDk5KTsKJGUtPnNldFN0YXR1c0NvZGUoNDk5KTsKJHJlamVjdCgkZSk7Cn0KCnJldHVybjsKfQoKdHJ5IHsKaWYgKCRqb2JbJ3JlcXVlc3QnXVsnY29weVRvJ10pIHsKJGpvYlsnY3VybF9pZCddID0gJHRoaXMtPmN1cmwtPmRvd25sb2FkKCRyZXNvbHZlLCAkcmVqZWN0LCAkb3JpZ2luLCAkdXJsLCAkb3B0aW9ucywgJGpvYlsncmVxdWVzdCddWydjb3B5VG8nXSk7Cn0gZWxzZSB7CiRqb2JbJ2N1cmxfaWQnXSA9ICR0aGlzLT5jdXJsLT5kb3dubG9hZCgkcmVzb2x2ZSwgJHJlamVjdCwgJG9yaWdpbiwgJHVybCwgJG9wdGlvbnMpOwp9Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGV4Y2VwdGlvbikgewokcmVqZWN0KCRleGNlcHRpb24pOwp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gbWFya0pvYkRvbmUoKTogdm9pZAp7CiR0aGlzLT5ydW5uaW5nSm9icy0tOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdhaXQoP2ludCAkaW5kZXggPSBudWxsKQp7CmRvIHsKJGpvYkNvdW50ID0gJHRoaXMtPmNvdW50QWN0aXZlSm9icygkaW5kZXgpOwp9IHdoaWxlICgkam9iQ291bnQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZW5hYmxlQXN5bmMoKTogdm9pZAp7CiR0aGlzLT5hbGxvd0FzeW5jID0gdHJ1ZTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvdW50QWN0aXZlSm9icyg/aW50ICRpbmRleCA9IG51bGwpOiBpbnQKewppZiAoJHRoaXMtPnJ1bm5pbmdKb2JzIDwgJHRoaXMtPm1heEpvYnMpIHsKZm9yZWFjaCAoJHRoaXMtPmpvYnMgYXMgJGpvYikgewppZiAoJGpvYlsnc3RhdHVzJ10gPT09IHNlbGY6OlNUQVRVU19RVUVVRUQgJiYgJHRoaXMtPnJ1bm5pbmdKb2JzIDwgJHRoaXMtPm1heEpvYnMpIHsKJHRoaXMtPnN0YXJ0Sm9iKCRqb2JbJ2lkJ10pOwp9Cn0KfQoKaWYgKCR0aGlzLT5jdXJsKSB7CiR0aGlzLT5jdXJsLT50aWNrKCk7Cn0KCmlmIChudWxsICE9PSAkaW5kZXgpIHsKcmV0dXJuICR0aGlzLT5qb2JzWyRpbmRleF1bJ3N0YXR1cyddIDwgc2VsZjo6U1RBVFVTX0NPTVBMRVRFRCA/IDEgOiAwOwp9CgokYWN0aXZlID0gMDsKZm9yZWFjaCAoJHRoaXMtPmpvYnMgYXMgJGpvYikgewppZiAoJGpvYlsnc3RhdHVzJ10gPCBzZWxmOjpTVEFUVVNfQ09NUExFVEVEKSB7CiRhY3RpdmUrKzsKfSBlbHNlaWYgKCEkam9iWydzeW5jJ10pIHsKdW5zZXQoJHRoaXMtPmpvYnNbJGpvYlsnaWQnXV0pOwp9Cn0KCnJldHVybiAkYWN0aXZlOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFJlc3BvbnNlKGludCAkaW5kZXgpOiBSZXNwb25zZQp7CmlmICghaXNzZXQoJHRoaXMtPmpvYnNbJGluZGV4XSkpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignSW52YWxpZCByZXF1ZXN0IGlkJyk7Cn0KCmlmICgkdGhpcy0+am9ic1skaW5kZXhdWydzdGF0dXMnXSA9PT0gc2VsZjo6U1RBVFVTX0ZBSUxFRCkgewphc3NlcnQoaXNzZXQoJHRoaXMtPmpvYnNbJGluZGV4XVsnZXhjZXB0aW9uJ10pKTsKdGhyb3cgJHRoaXMtPmpvYnNbJGluZGV4XVsnZXhjZXB0aW9uJ107Cn0KCmlmICghaXNzZXQoJHRoaXMtPmpvYnNbJGluZGV4XVsncmVzcG9uc2UnXSkpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignUmVzcG9uc2Ugbm90IGF2YWlsYWJsZSB5ZXQsIGNhbGwgd2FpdCgpIGZpcnN0Jyk7Cn0KCiRyZXNwID0gJHRoaXMtPmpvYnNbJGluZGV4XVsncmVzcG9uc2UnXTsKCnVuc2V0KCR0aGlzLT5qb2JzWyRpbmRleF0pOwoKcmV0dXJuICRyZXNwOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gb3V0cHV0V2FybmluZ3MoSU9JbnRlcmZhY2UgJGlvLCBzdHJpbmcgJHVybCwgJGRhdGEpOiB2b2lkCnsKJGNsZWFuTWVzc2FnZSA9IHN0YXRpYyBmdW5jdGlvbiAoJG1zZykgdXNlICgkaW8pIHsKaWYgKCEkaW8tPmlzRGVjb3JhdGVkKCkpIHsKJG1zZyA9IFByZWc6OnJlcGxhY2UoJ3snLmNocigyNykuJ1xcW1s7XGRdKm19dScsICcnLCAkbXNnKTsKfQoKcmV0dXJuICRtc2c7Cn07CgoKZm9yZWFjaCAoWyd3YXJuaW5nJywgJ2luZm8nXSBhcyAkdHlwZSkgewppZiAoZW1wdHkoJGRhdGFbJHR5cGVdKSkgewpjb250aW51ZTsKfQoKaWYgKCFlbXB0eSgkZGF0YVskdHlwZSAuICctdmVyc2lvbnMnXSkpIHsKJHZlcnNpb25QYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwokY29uc3RyYWludCA9ICR2ZXJzaW9uUGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCRkYXRhWyR0eXBlIC4gJy12ZXJzaW9ucyddKTsKJGNvbXBvc2VyID0gbmV3IENvbnN0cmFpbnQoJz09JywgJHZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZShDb21wb3Nlcjo6Z2V0VmVyc2lvbigpKSk7CmlmICghJGNvbnN0cmFpbnQtPm1hdGNoZXMoJGNvbXBvc2VyKSkgewpjb250aW51ZTsKfQp9CgokaW8tPndyaXRlRXJyb3IoJzwnLiR0eXBlLic+Jy51Y2ZpcnN0KCR0eXBlKS4nIGZyb20gJy5Vcmw6OnNhbml0aXplKCR1cmwpLic6ICcuJGNsZWFuTWVzc2FnZSgkZGF0YVskdHlwZV0pLic8LycuJHR5cGUuJz4nKTsKfQoKCmZvcmVhY2ggKFsnd2FybmluZ3MnLCAnaW5mb3MnXSBhcyAka2V5KSB7CmlmIChlbXB0eSgkZGF0YVska2V5XSkpIHsKY29udGludWU7Cn0KCiR2ZXJzaW9uUGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKZm9yZWFjaCAoJGRhdGFbJGtleV0gYXMgJHNwZWMpIHsKJHR5cGUgPSBzdWJzdHIoJGtleSwgMCwgLTEpOwokY29uc3RyYWludCA9ICR2ZXJzaW9uUGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCRzcGVjWyd2ZXJzaW9ucyddKTsKJGNvbXBvc2VyID0gbmV3IENvbnN0cmFpbnQoJz09JywgJHZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZShDb21wb3Nlcjo6Z2V0VmVyc2lvbigpKSk7CmlmICghJGNvbnN0cmFpbnQtPm1hdGNoZXMoJGNvbXBvc2VyKSkgewpjb250aW51ZTsKfQoKJGlvLT53cml0ZUVycm9yKCc8Jy4kdHlwZS4nPicudWNmaXJzdCgkdHlwZSkuJyBmcm9tICcuVXJsOjpzYW5pdGl6ZSgkdXJsKS4nOiAnLiRjbGVhbk1lc3NhZ2UoJHNwZWNbJ21lc3NhZ2UnXSkuJzwvJy4kdHlwZS4nPicpOwp9Cn0KfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEV4Y2VwdGlvbkhpbnRzKFxUaHJvd2FibGUgJGUpOiA/YXJyYXkKewppZiAoISRlIGluc3RhbmNlb2YgVHJhbnNwb3J0RXhjZXB0aW9uKSB7CnJldHVybiBudWxsOwp9CgppZiAoCmZhbHNlICE9PSBzdHJwb3MoJGUtPmdldE1lc3NhZ2UoKSwgJ1Jlc29sdmluZyB0aW1lZCBvdXQnKQp8fCBmYWxzZSAhPT0gc3RycG9zKCRlLT5nZXRNZXNzYWdlKCksICdDb3VsZCBub3QgcmVzb2x2ZSBob3N0JykKKSB7ClNpbGVuY2VyOjpzdXBwcmVzcygpOwokdGVzdENvbm5lY3Rpdml0eSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCdodHRwczovLzguOC44LjgnLCBmYWxzZSwgc3RyZWFtX2NvbnRleHRfY3JlYXRlKFsKJ3NzbCcgPT4gWyd2ZXJpZnlfcGVlcicgPT4gZmFsc2VdLAonaHR0cCcgPT4gWydmb2xsb3dfbG9jYXRpb24nID0+IGZhbHNlLCAnaWdub3JlX2Vycm9ycycgPT4gdHJ1ZV0sCl0pKTsKU2lsZW5jZXI6OnJlc3RvcmUoKTsKaWYgKGZhbHNlICE9PSAkdGVzdENvbm5lY3Rpdml0eSkgewpyZXR1cm4gWwonPGVycm9yPlRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uIHByb2JhYmx5IGluZGljYXRlcyB5b3UgaGF2ZSBtaXNjb25maWd1cmVkIEROUyByZXNvbHZlcihzKTwvZXJyb3I+JywKXTsKfQoKcmV0dXJuIFsKJzxlcnJvcj5UaGUgZm9sbG93aW5nIGV4Y2VwdGlvbiBwcm9iYWJseSBpbmRpY2F0ZXMgeW91IGFyZSBvZmZsaW5lIG9yIGhhdmUgbWlzY29uZmlndXJlZCBETlMgcmVzb2x2ZXIocyk8L2Vycm9yPicsCl07Cn0KCnJldHVybiBudWxsOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNhblVzZUN1cmwoYXJyYXkgJGpvYik6IGJvb2wKewppZiAoISR0aGlzLT5jdXJsKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCFQcmVnOjppc01hdGNoKCd7Xmh0dHBzPzovL31pJywgJGpvYlsncmVxdWVzdCddWyd1cmwnXSkpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoIWVtcHR5KCRqb2JbJ3JlcXVlc3QnXVsnb3B0aW9ucyddWydzc2wnXVsnYWxsb3dfc2VsZl9zaWduZWQnXSkpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0N1cmxFbmFibGVkKCk6IGJvb2wKewpyZXR1cm4gXGV4dGVuc2lvbl9sb2FkZWQoJ2N1cmwnKSAmJiBcZnVuY3Rpb25fZXhpc3RzKCdjdXJsX211bHRpX2V4ZWMnKSAmJiBcZnVuY3Rpb25fZXhpc3RzKCdjdXJsX211bHRpX2luaXQnKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXFhkZWJ1Z0hhbmRsZXJcWGRlYnVnSGFuZGxlcjsKCgoKCgoKCgpjbGFzcyBJbmlIZWxwZXIKewoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0QWxsKCk6IGFycmF5CnsKcmV0dXJuIFhkZWJ1Z0hhbmRsZXI6OmdldEFsbEluaUZpbGVzKCk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0TWVzc2FnZSgpOiBzdHJpbmcKewokcGF0aHMgPSBzZWxmOjpnZXRBbGwoKTsKCmlmIChlbXB0eSgkcGF0aHNbMF0pKSB7CmFycmF5X3NoaWZ0KCRwYXRocyk7Cn0KCiRpbmkgPSBhcnJheV9zaGlmdCgkcGF0aHMpOwoKaWYgKGVtcHR5KCRpbmkpKSB7CnJldHVybiAnQSBwaHAuaW5pIGZpbGUgZG9lcyBub3QgZXhpc3QuIFlvdSB3aWxsIGhhdmUgdG8gY3JlYXRlIG9uZS4nOwp9CgppZiAoIWVtcHR5KCRwYXRocykpIHsKcmV0dXJuICdZb3VyIGNvbW1hbmQtbGluZSBQSFAgaXMgdXNpbmcgbXVsdGlwbGUgaW5pIGZpbGVzLiBSdW4gYHBocCAtLWluaWAgdG8gc2hvdyB0aGVtLic7Cn0KCnJldHVybiAnVGhlIHBocC5pbmkgdXNlZCBieSB5b3VyIGNvbW1hbmQtbGluZSBQSFAgaXM6ICcuJGluaTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFByb2dyZXNzQmFyOwp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwoKCgoKY2xhc3MgTG9vcAp7Cgpwcml2YXRlICRodHRwRG93bmxvYWRlcjsKCnByaXZhdGUgJHByb2Nlc3NFeGVjdXRvcjsKCnByaXZhdGUgJGN1cnJlbnRQcm9taXNlcyA9IFtdOwoKcHJpdmF0ZSAkd2FpdEluZGV4ID0gMDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChIdHRwRG93bmxvYWRlciAkaHR0cERvd25sb2FkZXIsID9Qcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3NFeGVjdXRvciA9IG51bGwpCnsKJHRoaXMtPmh0dHBEb3dubG9hZGVyID0gJGh0dHBEb3dubG9hZGVyOwokdGhpcy0+aHR0cERvd25sb2FkZXItPmVuYWJsZUFzeW5jKCk7CgokdGhpcy0+cHJvY2Vzc0V4ZWN1dG9yID0gJHByb2Nlc3NFeGVjdXRvcjsKaWYgKCR0aGlzLT5wcm9jZXNzRXhlY3V0b3IpIHsKJHRoaXMtPnByb2Nlc3NFeGVjdXRvci0+ZW5hYmxlQXN5bmMoKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SHR0cERvd25sb2FkZXIoKTogSHR0cERvd25sb2FkZXIKewpyZXR1cm4gJHRoaXMtPmh0dHBEb3dubG9hZGVyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvY2Vzc0V4ZWN1dG9yKCk6ID9Qcm9jZXNzRXhlY3V0b3IKewpyZXR1cm4gJHRoaXMtPnByb2Nlc3NFeGVjdXRvcjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdhaXQoYXJyYXkgJHByb21pc2VzLCA/UHJvZ3Jlc3NCYXIgJHByb2dyZXNzID0gbnVsbCk6IHZvaWQKewokdW5jYXVnaHQgPSBudWxsOwoKXFJlYWN0XFByb21pc2VcYWxsKCRwcm9taXNlcyktPnRoZW4oCnN0YXRpYyBmdW5jdGlvbiAoKTogdm9pZCB7Cn0sCnN0YXRpYyBmdW5jdGlvbiAoXFRocm93YWJsZSAkZSkgdXNlICgmJHVuY2F1Z2h0KTogdm9pZCB7CiR1bmNhdWdodCA9ICRlOwp9Cik7CgoKCiR3YWl0SW5kZXggPSAkdGhpcy0+d2FpdEluZGV4Kys7CiR0aGlzLT5jdXJyZW50UHJvbWlzZXNbJHdhaXRJbmRleF0gPSAkcHJvbWlzZXM7CgppZiAoJHByb2dyZXNzKSB7CiR0b3RhbEpvYnMgPSAwOwokdG90YWxKb2JzICs9ICR0aGlzLT5odHRwRG93bmxvYWRlci0+Y291bnRBY3RpdmVKb2JzKCk7CmlmICgkdGhpcy0+cHJvY2Vzc0V4ZWN1dG9yKSB7CiR0b3RhbEpvYnMgKz0gJHRoaXMtPnByb2Nlc3NFeGVjdXRvci0+Y291bnRBY3RpdmVKb2JzKCk7Cn0KJHByb2dyZXNzLT5zdGFydCgkdG90YWxKb2JzKTsKfQoKJGxhc3RVcGRhdGUgPSAwOwp3aGlsZSAodHJ1ZSkgewokYWN0aXZlSm9icyA9IDA7CgokYWN0aXZlSm9icyArPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmNvdW50QWN0aXZlSm9icygpOwppZiAoJHRoaXMtPnByb2Nlc3NFeGVjdXRvcikgewokYWN0aXZlSm9icyArPSAkdGhpcy0+cHJvY2Vzc0V4ZWN1dG9yLT5jb3VudEFjdGl2ZUpvYnMoKTsKfQoKaWYgKCRwcm9ncmVzcyAmJiBtaWNyb3RpbWUodHJ1ZSkgLSAkbGFzdFVwZGF0ZSA+IDAuMSkgewokbGFzdFVwZGF0ZSA9IG1pY3JvdGltZSh0cnVlKTsKJHByb2dyZXNzLT5zZXRQcm9ncmVzcygkcHJvZ3Jlc3MtPmdldE1heFN0ZXBzKCkgLSAkYWN0aXZlSm9icyk7Cn0KCmlmICghJGFjdGl2ZUpvYnMpIHsKYnJlYWs7Cn0KfQoKCmlmICgkcHJvZ3Jlc3MpIHsKJHByb2dyZXNzLT5maW5pc2goKTsKfQoKdW5zZXQoJHRoaXMtPmN1cnJlbnRQcm9taXNlc1skd2FpdEluZGV4XSk7CmlmIChudWxsICE9PSAkdW5jYXVnaHQpIHsKdGhyb3cgJHVuY2F1Z2h0Owp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBhYm9ydEpvYnMoKTogdm9pZAp7CmZvcmVhY2ggKCR0aGlzLT5jdXJyZW50UHJvbWlzZXMgYXMgJHByb21pc2VHcm91cCkgewpmb3JlYWNoICgkcHJvbWlzZUdyb3VwIGFzICRwcm9taXNlKSB7CgpcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKCRwcm9taXNlKS0+Y2FuY2VsKCk7Cn0KfQp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7CgpAdHJpZ2dlcl9lcnJvcignQ29tcG9zZXJcVXRpbFxNZXRhZGF0YU1pbmlmaWVyIGlzIGRlcHJlY2F0ZWQsIHVzZSBDb21wb3NlclxNZXRhZGF0YU1pbmlmaWVyXE1ldGFkYXRhTWluaWZpZXIgZnJvbSBjb21wb3Nlci9tZXRhZGF0YS1taW5pZmllciBpbnN0ZWFkLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKCgoKCmNsYXNzIE1ldGFkYXRhTWluaWZpZXIgZXh0ZW5kcyBcQ29tcG9zZXJcTWV0YWRhdGFNaW5pZmllclxNZXRhZGF0YU1pbmlmaWVyCnsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBzdGRDbGFzczsKCgoKCmNsYXNzIE5vUHJveHlQYXR0ZXJuCnsKCgoKcHJvdGVjdGVkICRob3N0TmFtZXMgPSBbXTsKCgoKCnByb3RlY3RlZCAkcnVsZXMgPSBbXTsKCgoKCnByb3RlY3RlZCAkbm9wcm94eTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHBhdHRlcm4pCnsKJHRoaXMtPmhvc3ROYW1lcyA9IFByZWc6OnNwbGl0KCd7W1xzLF0rfScsICRwYXR0ZXJuLCAtMSwgUFJFR19TUExJVF9OT19FTVBUWSk7CiR0aGlzLT5ub3Byb3h5ID0gZW1wdHkoJHRoaXMtPmhvc3ROYW1lcykgfHwgJyonID09PSAkdGhpcy0+aG9zdE5hbWVzWzBdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdGVzdChzdHJpbmcgJHVybCk6IGJvb2wKewppZiAoJHRoaXMtPm5vcHJveHkpIHsKcmV0dXJuIHRydWU7Cn0KCmlmICghJHVybERhdGEgPSAkdGhpcy0+Z2V0VXJsRGF0YSgkdXJsKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmZvcmVhY2ggKCR0aGlzLT5ob3N0TmFtZXMgYXMgJGluZGV4ID0+ICRob3N0TmFtZSkgewppZiAoJHRoaXMtPm1hdGNoKCRpbmRleCwgJGhvc3ROYW1lLCAkdXJsRGF0YSkpIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRVcmxEYXRhKHN0cmluZyAkdXJsKQp7CmlmICghJGhvc3QgPSBwYXJzZV91cmwoJHVybCwgUEhQX1VSTF9IT1NUKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRwb3J0ID0gcGFyc2VfdXJsKCR1cmwsIFBIUF9VUkxfUE9SVCk7CgppZiAoZW1wdHkoJHBvcnQpKSB7CnN3aXRjaCAocGFyc2VfdXJsKCR1cmwsIFBIUF9VUkxfU0NIRU1FKSkgewpjYXNlICdodHRwJzoKJHBvcnQgPSA4MDsKYnJlYWs7CmNhc2UgJ2h0dHBzJzoKJHBvcnQgPSA0NDM7CmJyZWFrOwp9Cn0KCiRob3N0TmFtZSA9ICRob3N0IC4gKCRwb3J0ID8gJzonIC4gJHBvcnQgOiAnJyk7ClskaG9zdCwgJHBvcnQsICRlcnJdID0gJHRoaXMtPnNwbGl0SG9zdFBvcnQoJGhvc3ROYW1lKTsKCmlmICgkZXJyIHx8ICEkdGhpcy0+aXBDaGVja0RhdGEoJGhvc3QsICRpcGRhdGEpKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuICR0aGlzLT5tYWtlRGF0YSgkaG9zdCwgJHBvcnQsICRpcGRhdGEpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gbWF0Y2goaW50ICRpbmRleCwgc3RyaW5nICRob3N0TmFtZSwgc3RkQ2xhc3MgJHVybCk6IGJvb2wKewppZiAoISRydWxlID0gJHRoaXMtPmdldFJ1bGUoJGluZGV4LCAkaG9zdE5hbWUpKSB7CgpyZXR1cm4gZmFsc2U7Cn0KCmlmICgkcnVsZS0+aXBkYXRhKSB7CgppZiAoISR1cmwtPmlwZGF0YSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICgkcnVsZS0+aXBkYXRhLT5uZXRtYXNrKSB7CnJldHVybiAkdGhpcy0+bWF0Y2hSYW5nZSgkcnVsZS0+aXBkYXRhLCAkdXJsLT5pcGRhdGEpOwp9CgokbWF0Y2ggPSAkcnVsZS0+aXBkYXRhLT5pcCA9PT0gJHVybC0+aXBkYXRhLT5pcDsKfSBlbHNlIHsKCiRoYXlzdGFjayA9IHN1YnN0cigkdXJsLT5uYW1lLCAtc3RybGVuKCRydWxlLT5uYW1lKSk7CiRtYXRjaCA9IHN0cmlwb3MoJGhheXN0YWNrLCAkcnVsZS0+bmFtZSkgPT09IDA7Cn0KCmlmICgkbWF0Y2ggJiYgJHJ1bGUtPnBvcnQpIHsKJG1hdGNoID0gJHJ1bGUtPnBvcnQgPT09ICR1cmwtPnBvcnQ7Cn0KCnJldHVybiAkbWF0Y2g7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBtYXRjaFJhbmdlKHN0ZENsYXNzICRuZXR3b3JrLCBzdGRDbGFzcyAkdGFyZ2V0KTogYm9vbAp7CiRuZXQgPSB1bnBhY2soJ0MqJywgJG5ldHdvcmstPmlwKTsKJG1hc2sgPSB1bnBhY2soJ0MqJywgJG5ldHdvcmstPm5ldG1hc2spOwokaXAgPSB1bnBhY2soJ0MqJywgJHRhcmdldC0+aXApOwppZiAoZmFsc2UgPT09ICRuZXQpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgcGFyc2UgbmV0d29yayBJUCAnLiRuZXR3b3JrLT5pcCk7Cn0KaWYgKGZhbHNlID09PSAkbWFzaykgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBwYXJzZSBuZXRtYXNrICcuJG5ldHdvcmstPm5ldG1hc2spOwp9CmlmIChmYWxzZSA9PT0gJGlwKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IHBhcnNlIHRhcmdldCBJUCAnLiR0YXJnZXQtPmlwKTsKfQoKZm9yICgkaSA9IDE7ICRpIDwgMTc7ICsrJGkpIHsKaWYgKCgkbmV0WyRpXSAmICRtYXNrWyRpXSkgIT09ICgkaXBbJGldICYgJG1hc2tbJGldKSkgewpyZXR1cm4gZmFsc2U7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRSdWxlKGludCAkaW5kZXgsIHN0cmluZyAkaG9zdE5hbWUpOiA/c3RkQ2xhc3MKewppZiAoYXJyYXlfa2V5X2V4aXN0cygkaW5kZXgsICR0aGlzLT5ydWxlcykpIHsKcmV0dXJuICR0aGlzLT5ydWxlc1skaW5kZXhdOwp9CgokdGhpcy0+cnVsZXNbJGluZGV4XSA9IG51bGw7ClskaG9zdCwgJHBvcnQsICRlcnJdID0gJHRoaXMtPnNwbGl0SG9zdFBvcnQoJGhvc3ROYW1lKTsKCmlmICgkZXJyIHx8ICEkdGhpcy0+aXBDaGVja0RhdGEoJGhvc3QsICRpcGRhdGEsIHRydWUpKSB7CnJldHVybiBudWxsOwp9CgokdGhpcy0+cnVsZXNbJGluZGV4XSA9ICR0aGlzLT5tYWtlRGF0YSgkaG9zdCwgJHBvcnQsICRpcGRhdGEpOwoKcmV0dXJuICR0aGlzLT5ydWxlc1skaW5kZXhdOwp9CgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gaXBDaGVja0RhdGEoc3RyaW5nICRob3N0LCA/c3RkQ2xhc3MgJiRpcGRhdGEsIGJvb2wgJGFsbG93UHJlZml4ID0gZmFsc2UpOiBib29sCnsKJGlwZGF0YSA9IG51bGw7CiRuZXRtYXNrID0gbnVsbDsKJHByZWZpeCA9IG51bGw7CiRtb2RpZmllZCA9IGZhbHNlOwoKCmlmIChzdHJwb3MoJGhvc3QsICcvJykgIT09IGZhbHNlKSB7ClskaG9zdCwgJHByZWZpeF0gPSBleHBsb2RlKCcvJywgJGhvc3QpOwoKaWYgKCEkYWxsb3dQcmVmaXggfHwgISR0aGlzLT52YWxpZGF0ZUludCgkcHJlZml4LCAwLCAxMjgpKSB7CnJldHVybiBmYWxzZTsKfQokcHJlZml4ID0gKGludCkgJHByZWZpeDsKJG1vZGlmaWVkID0gdHJ1ZTsKfQoKCmlmICghZmlsdGVyX3ZhcigkaG9zdCwgRklMVEVSX1ZBTElEQVRFX0lQKSkgewpyZXR1cm4gISRtb2RpZmllZDsKfQoKWyRpcCwgJHNpemVdID0gJHRoaXMtPmlwR2V0QWRkcigkaG9zdCk7CgppZiAoJHByZWZpeCAhPT0gbnVsbCkgewoKaWYgKCRwcmVmaXggPiAkc2l6ZSAqIDgpIHsKcmV0dXJuIGZhbHNlOwp9CgpbJGlwLCAkbmV0bWFza10gPSAkdGhpcy0+aXBHZXROZXR3b3JrKCRpcCwgJHNpemUsICRwcmVmaXgpOwp9CgokaXBkYXRhID0gJHRoaXMtPm1ha2VJcERhdGEoJGlwLCAkc2l6ZSwgJG5ldG1hc2spOwoKcmV0dXJuIHRydWU7Cn0KCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpcEdldEFkZHIoc3RyaW5nICRob3N0KTogYXJyYXkKewokaXAgPSBpbmV0X3B0b24oJGhvc3QpOwokc2l6ZSA9IHN0cmxlbigkaXApOwokbWFwcGVkID0gJHRoaXMtPmlwTWFwVG82KCRpcCwgJHNpemUpOwoKcmV0dXJuIFskbWFwcGVkLCAkc2l6ZV07Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gaXBHZXRNYXNrKGludCAkcHJlZml4LCBpbnQgJHNpemUpOiBzdHJpbmcKewokbWFzayA9ICcnOwoKaWYgKCRvbmVzID0gZmxvb3IoJHByZWZpeCAvIDgpKSB7CiRtYXNrID0gc3RyX3JlcGVhdChjaHIoMjU1KSwgKGludCkgJG9uZXMpOwp9CgppZiAoJHJlbWFpbmRlciA9ICRwcmVmaXggJSA4KSB7CiRtYXNrIC49IGNocigweGZmIF4gKDB4ZmYgPj4gJHJlbWFpbmRlcikpOwp9CgokbWFzayA9IHN0cl9wYWQoJG1hc2ssICRzaXplLCBjaHIoMCkpOwoKcmV0dXJuICR0aGlzLT5pcE1hcFRvNigkbWFzaywgJHNpemUpOwp9CgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGlwR2V0TmV0d29yayhzdHJpbmcgJHJhbmdlSXAsIGludCAkc2l6ZSwgaW50ICRwcmVmaXgpOiBhcnJheQp7CiRuZXRtYXNrID0gJHRoaXMtPmlwR2V0TWFzaygkcHJlZml4LCAkc2l6ZSk7CgoKJG1hc2sgPSB1bnBhY2soJ0MqJywgJG5ldG1hc2spOwokaXAgPSB1bnBhY2soJ0MqJywgJHJhbmdlSXApOwokbmV0ID0gJyc7CmlmIChmYWxzZSA9PT0gJG1hc2spIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgcGFyc2UgbmV0bWFzayAnLiRuZXRtYXNrKTsKfQppZiAoZmFsc2UgPT09ICRpcCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBwYXJzZSByYW5nZSBJUCAnLiRyYW5nZUlwKTsKfQoKZm9yICgkaSA9IDE7ICRpIDwgMTc7ICsrJGkpIHsKJG5ldCAuPSBjaHIoJGlwWyRpXSAmICRtYXNrWyRpXSk7Cn0KCnJldHVybiBbJG5ldCwgJG5ldG1hc2tdOwp9CgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gaXBNYXBUbzYoc3RyaW5nICRiaW5hcnksIGludCAkc2l6ZSk6IHN0cmluZwp7CmlmICgkc2l6ZSA9PT0gNCkgewokcHJlZml4ID0gc3RyX3JlcGVhdChjaHIoMCksIDEwKSAuIHN0cl9yZXBlYXQoY2hyKDI1NSksIDIpOwokYmluYXJ5ID0gJHByZWZpeCAuICRiaW5hcnk7Cn0KCnJldHVybiAkYmluYXJ5Owp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIG1ha2VEYXRhKHN0cmluZyAkaG9zdCwgaW50ICRwb3J0LCA/c3RkQ2xhc3MgJGlwZGF0YSk6IHN0ZENsYXNzCnsKcmV0dXJuIChvYmplY3QpIFsKJ2hvc3QnID0+ICRob3N0LAonbmFtZScgPT4gJy4nIC4gbHRyaW0oJGhvc3QsICcuJyksCidwb3J0JyA9PiAkcG9ydCwKJ2lwZGF0YScgPT4gJGlwZGF0YSwKXTsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gbWFrZUlwRGF0YShzdHJpbmcgJGlwLCBpbnQgJHNpemUsID9zdHJpbmcgJG5ldG1hc2spOiBzdGRDbGFzcwp7CnJldHVybiAob2JqZWN0KSBbCidpcCcgPT4gJGlwLAonc2l6ZScgPT4gJHNpemUsCiduZXRtYXNrJyA9PiAkbmV0bWFzaywKXTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHNwbGl0SG9zdFBvcnQoc3RyaW5nICRob3N0TmFtZSk6IGFycmF5CnsKCiRlcnJvciA9IFsnJywgJycsIHRydWVdOwokcG9ydCA9IDA7CiRpcDYgPSAnJzsKCgppZiAoJGhvc3ROYW1lWzBdID09PSAnWycpIHsKJGluZGV4ID0gc3RycG9zKCRob3N0TmFtZSwgJ10nKTsKCgppZiAoZmFsc2UgPT09ICRpbmRleCB8fCAkaW5kZXggPCAzKSB7CnJldHVybiAkZXJyb3I7Cn0KCiRpcDYgPSBzdWJzdHIoJGhvc3ROYW1lLCAxLCAkaW5kZXggLSAxKTsKJGhvc3ROYW1lID0gc3Vic3RyKCRob3N0TmFtZSwgJGluZGV4ICsgMSk7CgppZiAoc3RycGJyaygkaG9zdE5hbWUsICdbXScpICE9PSBmYWxzZSB8fCBzdWJzdHJfY291bnQoJGhvc3ROYW1lLCAnOicpID4gMSkgewpyZXR1cm4gJGVycm9yOwp9Cn0KCmlmIChzdWJzdHJfY291bnQoJGhvc3ROYW1lLCAnOicpID09PSAxKSB7CiRpbmRleCA9IHN0cnBvcygkaG9zdE5hbWUsICc6Jyk7CiRwb3J0ID0gc3Vic3RyKCRob3N0TmFtZSwgJGluZGV4ICsgMSk7CiRob3N0TmFtZSA9IHN1YnN0cigkaG9zdE5hbWUsIDAsICRpbmRleCk7CgppZiAoISR0aGlzLT52YWxpZGF0ZUludCgkcG9ydCwgMSwgNjU1MzUpKSB7CnJldHVybiAkZXJyb3I7Cn0KCiRwb3J0ID0gKGludCkgJHBvcnQ7Cn0KCiRob3N0ID0gJGlwNiAuICRob3N0TmFtZTsKCnJldHVybiBbJGhvc3QsICRwb3J0LCBmYWxzZV07Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gdmFsaWRhdGVJbnQoc3RyaW5nICRpbnQsIGludCAkbWluLCBpbnQgJG1heCk6IGJvb2wKewokb3B0aW9ucyA9IFsKJ29wdGlvbnMnID0+IFsKJ21pbl9yYW5nZScgPT4gJG1pbiwKJ21heF9yYW5nZScgPT4gJG1heCwKXSwKXTsKCnJldHVybiBmYWxzZSAhPT0gZmlsdGVyX3ZhcigkaW50LCBGSUxURVJfVkFMSURBVEVfSU5ULCAkb3B0aW9ucyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKCmNsYXNzIFBhY2thZ2VJbmZvCnsKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRWaWV3U291cmNlVXJsKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiA/c3RyaW5nCnsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICYmIGlzc2V0KCRwYWNrYWdlLT5nZXRTdXBwb3J0KClbJ3NvdXJjZSddKSAmJiAnJyAhPT0gJHBhY2thZ2UtPmdldFN1cHBvcnQoKVsnc291cmNlJ10pIHsKcmV0dXJuICRwYWNrYWdlLT5nZXRTdXBwb3J0KClbJ3NvdXJjZSddOwp9CgpyZXR1cm4gJHBhY2thZ2UtPmdldFNvdXJjZVVybCgpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFZpZXdTb3VyY2VPckhvbWVwYWdlVXJsKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiA/c3RyaW5nCnsKJHVybCA9IHNlbGY6OmdldFZpZXdTb3VyY2VVcmwoJHBhY2thZ2UpID8/ICgkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSA/ICRwYWNrYWdlLT5nZXRIb21lcGFnZSgpIDogbnVsbCk7CgppZiAoJHVybCA9PT0gJycpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiAkdXJsOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZUludGVyZmFjZTsKCmNsYXNzIFBhY2thZ2VTb3J0ZXIKewoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldE1vc3RDdXJyZW50VmVyc2lvbihhcnJheSAkcGFja2FnZXMpOiA/UGFja2FnZUludGVyZmFjZQp7CmlmIChjb3VudCgkcGFja2FnZXMpID09PSAwKSB7CnJldHVybiBudWxsOwp9CgokaGlnaGVzdCA9IHJlc2V0KCRwYWNrYWdlcyk7CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkY2FuZGlkYXRlKSB7CmlmICgkY2FuZGlkYXRlLT5pc0RlZmF1bHRCcmFuY2goKSkgewpyZXR1cm4gJGNhbmRpZGF0ZTsKfQoKaWYgKHZlcnNpb25fY29tcGFyZSgkaGlnaGVzdC0+Z2V0VmVyc2lvbigpLCAkY2FuZGlkYXRlLT5nZXRWZXJzaW9uKCksICc8JykpIHsKJGhpZ2hlc3QgPSAkY2FuZGlkYXRlOwp9Cn0KCnJldHVybiAkaGlnaGVzdDsKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc29ydFBhY2thZ2VzQWxwaGFiZXRpY2FsbHkoYXJyYXkgJHBhY2thZ2VzKTogYXJyYXkKewp1c29ydCgkcGFja2FnZXMsIHN0YXRpYyBmdW5jdGlvbiAoUGFja2FnZUludGVyZmFjZSAkYSwgUGFja2FnZUludGVyZmFjZSAkYikgewpyZXR1cm4gJGEtPmdldE5hbWUoKSA8PT4gJGItPmdldE5hbWUoKTsKfSk7CgpyZXR1cm4gJHBhY2thZ2VzOwp9CgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNvcnRQYWNrYWdlcyhhcnJheSAkcGFja2FnZXMsIGFycmF5ICR3ZWlnaHRzID0gW10pOiBhcnJheQp7CiR1c2FnZUxpc3QgPSBbXTsKCmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewokbGlua3MgPSAkcGFja2FnZS0+Z2V0UmVxdWlyZXMoKTsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgUm9vdFBhY2thZ2VJbnRlcmZhY2UpIHsKJGxpbmtzID0gYXJyYXlfbWVyZ2UoJGxpbmtzLCAkcGFja2FnZS0+Z2V0RGV2UmVxdWlyZXMoKSk7Cn0KZm9yZWFjaCAoJGxpbmtzIGFzICRsaW5rKSB7CiR0YXJnZXQgPSAkbGluay0+Z2V0VGFyZ2V0KCk7CiR1c2FnZUxpc3RbJHRhcmdldF1bXSA9ICRwYWNrYWdlLT5nZXROYW1lKCk7Cn0KfQokY29tcHV0aW5nID0gW107CiRjb21wdXRlZCA9IFtdOwokY29tcHV0ZUltcG9ydGFuY2UgPSBzdGF0aWMgZnVuY3Rpb24gKCRuYW1lKSB1c2UgKCYkY29tcHV0ZUltcG9ydGFuY2UsICYkY29tcHV0aW5nLCAmJGNvbXB1dGVkLCAkdXNhZ2VMaXN0LCAkd2VpZ2h0cykgewoKaWYgKGlzc2V0KCRjb21wdXRlZFskbmFtZV0pKSB7CnJldHVybiAkY29tcHV0ZWRbJG5hbWVdOwp9CgoKaWYgKGlzc2V0KCRjb21wdXRpbmdbJG5hbWVdKSkgewpyZXR1cm4gMDsKfQoKJGNvbXB1dGluZ1skbmFtZV0gPSB0cnVlOwokd2VpZ2h0ID0gJHdlaWdodHNbJG5hbWVdID8/IDA7CgppZiAoaXNzZXQoJHVzYWdlTGlzdFskbmFtZV0pKSB7CmZvcmVhY2ggKCR1c2FnZUxpc3RbJG5hbWVdIGFzICR1c2VyKSB7CiR3ZWlnaHQgLT0gMSAtICRjb21wdXRlSW1wb3J0YW5jZSgkdXNlcik7Cn0KfQoKdW5zZXQoJGNvbXB1dGluZ1skbmFtZV0pOwokY29tcHV0ZWRbJG5hbWVdID0gJHdlaWdodDsKCnJldHVybiAkd2VpZ2h0Owp9OwoKJHdlaWdodGVkUGFja2FnZXMgPSBbXTsKCmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkaW5kZXggPT4gJHBhY2thZ2UpIHsKJG5hbWUgPSAkcGFja2FnZS0+Z2V0TmFtZSgpOwokd2VpZ2h0ID0gJGNvbXB1dGVJbXBvcnRhbmNlKCRuYW1lKTsKJHdlaWdodGVkUGFja2FnZXNbXSA9IFsnbmFtZScgPT4gJG5hbWUsICd3ZWlnaHQnID0+ICR3ZWlnaHQsICdpbmRleCcgPT4gJGluZGV4XTsKfQoKdXNvcnQoJHdlaWdodGVkUGFja2FnZXMsIHN0YXRpYyBmdW5jdGlvbiAoYXJyYXkgJGEsIGFycmF5ICRiKTogaW50IHsKaWYgKCRhWyd3ZWlnaHQnXSAhPT0gJGJbJ3dlaWdodCddKSB7CnJldHVybiAkYVsnd2VpZ2h0J10gLSAkYlsnd2VpZ2h0J107Cn0KCnJldHVybiBzdHJuYXRjYXNlY21wKCRhWyduYW1lJ10sICRiWyduYW1lJ10pOwp9KTsKCiRzb3J0ZWRQYWNrYWdlcyA9IFtdOwoKZm9yZWFjaCAoJHdlaWdodGVkUGFja2FnZXMgYXMgJHBrZykgewokc29ydGVkUGFja2FnZXNbXSA9ICRwYWNrYWdlc1skcGtnWydpbmRleCddXTsKfQoKcmV0dXJuICRzb3J0ZWRQYWNrYWdlczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGVjdXRhYmxlRmluZGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xQcm9jZXNzOwoKCgoKCgpjbGFzcyBQZXJmb3JjZQp7Cgpwcm90ZWN0ZWQgJHBhdGg7Cgpwcm90ZWN0ZWQgJHA0RGVwb3Q7Cgpwcm90ZWN0ZWQgJHA0Q2xpZW50OwoKcHJvdGVjdGVkICRwNFVzZXI7Cgpwcm90ZWN0ZWQgJHA0UGFzc3dvcmQ7Cgpwcm90ZWN0ZWQgJHA0UG9ydDsKCnByb3RlY3RlZCAkcDRTdHJlYW07Cgpwcm90ZWN0ZWQgJHA0Q2xpZW50U3BlYzsKCnByb3RlY3RlZCAkcDREZXBvdFR5cGU7Cgpwcm90ZWN0ZWQgJHA0QnJhbmNoOwoKcHJvdGVjdGVkICRwcm9jZXNzOwoKcHJvdGVjdGVkICR1bmlxdWVQZXJmb3JjZUNsaWVudE5hbWU7Cgpwcm90ZWN0ZWQgJHdpbmRvd3NGbGFnOwoKcHJvdGVjdGVkICRjb21tYW5kUmVzdWx0OwoKCnByb3RlY3RlZCAkaW87CgoKcHJvdGVjdGVkICRmaWxlc3lzdGVtOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRyZXBvQ29uZmlnLCBzdHJpbmcgJHBvcnQsIHN0cmluZyAkcGF0aCwgUHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzLCBib29sICRpc1dpbmRvd3MsIElPSW50ZXJmYWNlICRpbykKewokdGhpcy0+d2luZG93c0ZsYWcgPSAkaXNXaW5kb3dzOwokdGhpcy0+cDRQb3J0ID0gJHBvcnQ7CiR0aGlzLT5pbml0aWFsaXplUGF0aCgkcGF0aCk7CiR0aGlzLT5wcm9jZXNzID0gJHByb2Nlc3M7CiR0aGlzLT5pbml0aWFsaXplKCRyZXBvQ29uZmlnKTsKJHRoaXMtPmlvID0gJGlvOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZSgkcmVwb0NvbmZpZywgc3RyaW5nICRwb3J0LCBzdHJpbmcgJHBhdGgsIFByb2Nlc3NFeGVjdXRvciAkcHJvY2VzcywgSU9JbnRlcmZhY2UgJGlvKTogc2VsZgp7CnJldHVybiBuZXcgUGVyZm9yY2UoJHJlcG9Db25maWcsICRwb3J0LCAkcGF0aCwgJHByb2Nlc3MsIFBsYXRmb3JtOjppc1dpbmRvd3MoKSwgJGlvKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGVja1NlcnZlckV4aXN0cyhzdHJpbmcgJHVybCwgUHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzRXhlY3V0b3IpOiBib29sCnsKcmV0dXJuIDAgPT09ICRwcm9jZXNzRXhlY3V0b3ItPmV4ZWN1dGUoWydwNCcsICctcCcsICR1cmwsICdpbmZvJywgJy1zJ10sICRpZ25vcmVkT3V0cHV0KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGluaXRpYWxpemUoJHJlcG9Db25maWcpOiB2b2lkCnsKJHRoaXMtPnVuaXF1ZVBlcmZvcmNlQ2xpZW50TmFtZSA9ICR0aGlzLT5nZW5lcmF0ZVVuaXF1ZVBlcmZvcmNlQ2xpZW50TmFtZSgpOwppZiAoISRyZXBvQ29uZmlnKSB7CnJldHVybjsKfQppZiAoaXNzZXQoJHJlcG9Db25maWdbJ3VuaXF1ZV9wZXJmb3JjZV9jbGllbnRfbmFtZSddKSkgewokdGhpcy0+dW5pcXVlUGVyZm9yY2VDbGllbnROYW1lID0gJHJlcG9Db25maWdbJ3VuaXF1ZV9wZXJmb3JjZV9jbGllbnRfbmFtZSddOwp9CgppZiAoaXNzZXQoJHJlcG9Db25maWdbJ2RlcG90J10pKSB7CiR0aGlzLT5wNERlcG90ID0gJHJlcG9Db25maWdbJ2RlcG90J107Cn0KaWYgKGlzc2V0KCRyZXBvQ29uZmlnWydicmFuY2gnXSkpIHsKJHRoaXMtPnA0QnJhbmNoID0gJHJlcG9Db25maWdbJ2JyYW5jaCddOwp9CmlmIChpc3NldCgkcmVwb0NvbmZpZ1sncDR1c2VyJ10pKSB7CiR0aGlzLT5wNFVzZXIgPSAkcmVwb0NvbmZpZ1sncDR1c2VyJ107Cn0gZWxzZSB7CiR0aGlzLT5wNFVzZXIgPSAkdGhpcy0+Z2V0UDR2YXJpYWJsZSgnUDRVU0VSJyk7Cn0KaWYgKGlzc2V0KCRyZXBvQ29uZmlnWydwNHBhc3N3b3JkJ10pKSB7CiR0aGlzLT5wNFBhc3N3b3JkID0gJHJlcG9Db25maWdbJ3A0cGFzc3dvcmQnXTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gaW5pdGlhbGl6ZURlcG90QW5kQnJhbmNoKD9zdHJpbmcgJGRlcG90LCA/c3RyaW5nICRicmFuY2gpOiB2b2lkCnsKaWYgKGlzc2V0KCRkZXBvdCkpIHsKJHRoaXMtPnA0RGVwb3QgPSAkZGVwb3Q7Cn0KaWYgKGlzc2V0KCRicmFuY2gpKSB7CiR0aGlzLT5wNEJyYW5jaCA9ICRicmFuY2g7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdlbmVyYXRlVW5pcXVlUGVyZm9yY2VDbGllbnROYW1lKCk6IHN0cmluZwp7CnJldHVybiBnZXRob3N0bmFtZSgpIC4gIl8iIC4gdGltZSgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2xlYW51cENsaWVudFNwZWMoKTogdm9pZAp7CiRjbGllbnQgPSAkdGhpcy0+Z2V0Q2xpZW50KCk7CiR0YXNrID0gWydjbGllbnQnLCAnLWQnLCAkY2xpZW50XTsKJHVzZVA0Q2xpZW50ID0gZmFsc2U7CiRjb21tYW5kID0gJHRoaXMtPmdlbmVyYXRlUDRDb21tYW5kKCR0YXNrLCAkdXNlUDRDbGllbnQpOwokdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNvbW1hbmQpOwokY2xpZW50U3BlYyA9ICR0aGlzLT5nZXRQNENsaWVudFNwZWMoKTsKJGZpbGVTeXN0ZW0gPSAkdGhpcy0+Z2V0RmlsZXN5c3RlbSgpOwokZmlsZVN5c3RlbS0+cmVtb3ZlKCRjbGllbnRTcGVjKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGVDb21tYW5kKCRjb21tYW5kKTogaW50CnsKJHRoaXMtPmNvbW1hbmRSZXN1bHQgPSAnJzsKCnJldHVybiAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY29tbWFuZCwgJHRoaXMtPmNvbW1hbmRSZXN1bHQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2xpZW50KCk6IHN0cmluZwp7CmlmICghaXNzZXQoJHRoaXMtPnA0Q2xpZW50KSkgewokY2xlYW5TdHJlYW1OYW1lID0gc3RyX3JlcGxhY2UoWycvLycsICcvJywgJ0AnXSwgWycnLCAnXycsICcnXSwgJHRoaXMtPmdldFN0cmVhbSgpKTsKJHRoaXMtPnA0Q2xpZW50ID0gJ2NvbXBvc2VyX3BlcmZvcmNlXycgLiAkdGhpcy0+dW5pcXVlUGVyZm9yY2VDbGllbnROYW1lIC4gJ18nIC4gJGNsZWFuU3RyZWFtTmFtZTsKfQoKcmV0dXJuICR0aGlzLT5wNENsaWVudDsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFBhdGgoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5wYXRoOwp9CgpwdWJsaWMgZnVuY3Rpb24gaW5pdGlhbGl6ZVBhdGgoc3RyaW5nICRwYXRoKTogdm9pZAp7CiR0aGlzLT5wYXRoID0gJHBhdGg7CiRmcyA9ICR0aGlzLT5nZXRGaWxlc3lzdGVtKCk7CiRmcy0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKCRwYXRoKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFBvcnQoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5wNFBvcnQ7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRTdHJlYW0oc3RyaW5nICRzdHJlYW0pOiB2b2lkCnsKJHRoaXMtPnA0U3RyZWFtID0gJHN0cmVhbTsKJGluZGV4ID0gc3RycnBvcygkc3RyZWFtLCAnLycpOwoKaWYgKCRpbmRleCA+IDIpIHsKJHRoaXMtPnA0RGVwb3RUeXBlID0gJ3N0cmVhbSc7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIGlzU3RyZWFtKCk6IGJvb2wKewpyZXR1cm4gaXNfc3RyaW5nKCR0aGlzLT5wNERlcG90VHlwZSkgJiYgKHN0cmNtcCgkdGhpcy0+cDREZXBvdFR5cGUsICdzdHJlYW0nKSA9PT0gMCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTdHJlYW0oKTogc3RyaW5nCnsKaWYgKCFpc3NldCgkdGhpcy0+cDRTdHJlYW0pKSB7CmlmICgkdGhpcy0+aXNTdHJlYW0oKSkgewokdGhpcy0+cDRTdHJlYW0gPSAnLy8nIC4gJHRoaXMtPnA0RGVwb3QgLiAnLycgLiAkdGhpcy0+cDRCcmFuY2g7Cn0gZWxzZSB7CiR0aGlzLT5wNFN0cmVhbSA9ICcvLycgLiAkdGhpcy0+cDREZXBvdDsKfQp9CgpyZXR1cm4gJHRoaXMtPnA0U3RyZWFtOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RyZWFtV2l0aG91dExhYmVsKHN0cmluZyAkc3RyZWFtKTogc3RyaW5nCnsKJGluZGV4ID0gc3RycG9zKCRzdHJlYW0sICdAJyk7CmlmICgkaW5kZXggPT09IGZhbHNlKSB7CnJldHVybiAkc3RyZWFtOwp9CgpyZXR1cm4gc3Vic3RyKCRzdHJlYW0sIDAsICRpbmRleCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQNENsaWVudFNwZWMoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5wYXRoIC4gJy8nIC4gJHRoaXMtPmdldENsaWVudCgpIC4gJy5wNC5zcGVjJzsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFVzZXIoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+cDRVc2VyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0VXNlcig/c3RyaW5nICR1c2VyKTogdm9pZAp7CiR0aGlzLT5wNFVzZXIgPSAkdXNlcjsKfQoKcHVibGljIGZ1bmN0aW9uIHF1ZXJ5UDRVc2VyKCk6IHZvaWQKewokdGhpcy0+Z2V0VXNlcigpOwppZiAoc3RybGVuKChzdHJpbmcpICR0aGlzLT5wNFVzZXIpID4gMCkgewpyZXR1cm47Cn0KJHRoaXMtPnA0VXNlciA9ICR0aGlzLT5nZXRQNHZhcmlhYmxlKCdQNFVTRVInKTsKaWYgKHN0cmxlbigoc3RyaW5nKSAkdGhpcy0+cDRVc2VyKSA+IDApIHsKcmV0dXJuOwp9CiR0aGlzLT5wNFVzZXIgPSAkdGhpcy0+aW8tPmFzaygnRW50ZXIgUDQgVXNlcjonKTsKaWYgKCR0aGlzLT53aW5kb3dzRmxhZykgewokY29tbWFuZCA9ICR0aGlzLT5nZXRQNEV4ZWN1dGFibGUoKS4nIHNldCBQNFVTRVI9JyAuIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCR0aGlzLT5wNFVzZXIpOwp9IGVsc2UgewokY29tbWFuZCA9ICdleHBvcnQgUDRVU0VSPScgLiBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkdGhpcy0+cDRVc2VyKTsKfQokdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNvbW1hbmQpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UDR2YXJpYWJsZShzdHJpbmcgJG5hbWUpOiA/c3RyaW5nCnsKaWYgKCR0aGlzLT53aW5kb3dzRmxhZykgewokY29tbWFuZCA9ICR0aGlzLT5nZXRQNEV4ZWN1dGFibGUoKS4nIHNldCc7CiR0aGlzLT5leGVjdXRlQ29tbWFuZCgkY29tbWFuZCk7CiRyZXN1bHQgPSB0cmltKCR0aGlzLT5jb21tYW5kUmVzdWx0KTsKJHJlc0FycmF5ID0gZXhwbG9kZShQSFBfRU9MLCAkcmVzdWx0KTsKZm9yZWFjaCAoJHJlc0FycmF5IGFzICRsaW5lKSB7CiRmaWVsZHMgPSBleHBsb2RlKCc9JywgJGxpbmUpOwppZiAoc3RyY21wKCRuYW1lLCAkZmllbGRzWzBdKSA9PT0gMCkgewokaW5kZXggPSBzdHJwb3MoJGZpZWxkc1sxXSwgJyAnKTsKaWYgKCRpbmRleCA9PT0gZmFsc2UpIHsKJHZhbHVlID0gJGZpZWxkc1sxXTsKfSBlbHNlIHsKJHZhbHVlID0gc3Vic3RyKCRmaWVsZHNbMV0sIDAsICRpbmRleCk7Cn0KJHZhbHVlID0gdHJpbSgkdmFsdWUpOwoKcmV0dXJuICR2YWx1ZTsKfQp9CgpyZXR1cm4gbnVsbDsKfQoKJGNvbW1hbmQgPSAnZWNobyAkJyAuICRuYW1lOwokdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNvbW1hbmQpOwokcmVzdWx0ID0gdHJpbSgkdGhpcy0+Y29tbWFuZFJlc3VsdCk7CgpyZXR1cm4gJHJlc3VsdDsKfQoKcHVibGljIGZ1bmN0aW9uIHF1ZXJ5UDRQYXNzd29yZCgpOiA/c3RyaW5nCnsKaWYgKGlzc2V0KCR0aGlzLT5wNFBhc3N3b3JkKSkgewpyZXR1cm4gJHRoaXMtPnA0UGFzc3dvcmQ7Cn0KJHBhc3N3b3JkID0gJHRoaXMtPmdldFA0dmFyaWFibGUoJ1A0UEFTU1dEJyk7CmlmIChzdHJsZW4oKHN0cmluZykgJHBhc3N3b3JkKSA8PSAwKSB7CiRwYXNzd29yZCA9ICR0aGlzLT5pby0+YXNrQW5kSGlkZUFuc3dlcignRW50ZXIgcGFzc3dvcmQgZm9yIFBlcmZvcmNlIHVzZXIgJyAuICR0aGlzLT5nZXRVc2VyKCkgLiAnOiAnKTsKfQokdGhpcy0+cDRQYXNzd29yZCA9ICRwYXNzd29yZDsKCnJldHVybiAkcGFzc3dvcmQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdlbmVyYXRlUDRDb21tYW5kKGFycmF5ICRhcmd1bWVudHMsIGJvb2wgJHVzZUNsaWVudCA9IHRydWUpOiBhcnJheQp7CiRwNENvbW1hbmQgPSBbJHRoaXMtPmdldFA0RXhlY3V0YWJsZSgpXTsKaWYgKCR0aGlzLT5nZXRVc2VyKCkgIT09IG51bGwpIHsKJHA0Q29tbWFuZFtdID0gJy11JzsKJHA0Q29tbWFuZFtdID0gJHRoaXMtPmdldFVzZXIoKTsKfQppZiAoJHVzZUNsaWVudCkgewokcDRDb21tYW5kW10gPSAnLWMnOwokcDRDb21tYW5kW10gPSAkdGhpcy0+Z2V0Q2xpZW50KCk7Cn0KJHA0Q29tbWFuZFtdID0gJy1wJzsKJHA0Q29tbWFuZFtdID0gJHRoaXMtPmdldFBvcnQoKTsKCnJldHVybiBhcnJheV9tZXJnZSgkcDRDb21tYW5kLCAkYXJndW1lbnRzKTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzTG9nZ2VkSW4oKTogYm9vbAp7CiRjb21tYW5kID0gJHRoaXMtPmdlbmVyYXRlUDRDb21tYW5kKFsnbG9naW4nLCAnLXMnXSwgZmFsc2UpOwokZXhpdENvZGUgPSAkdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNvbW1hbmQpOwppZiAoJGV4aXRDb2RlKSB7CiRlcnJvck91dHB1dCA9ICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpOwokaW5kZXggPSBzdHJwb3MoJGVycm9yT3V0cHV0LCAkdGhpcy0+Z2V0VXNlcigpKTsKaWYgKCRpbmRleCA9PT0gZmFsc2UpIHsKJGluZGV4ID0gc3RycG9zKCRlcnJvck91dHB1dCwgJ3A0Jyk7CmlmICgkaW5kZXggPT09IGZhbHNlKSB7CnJldHVybiBmYWxzZTsKfQp0aHJvdyBuZXcgXEV4Y2VwdGlvbigncDQgY29tbWFuZCBub3QgZm91bmQgaW4gcGF0aDogJyAuICRlcnJvck91dHB1dCk7Cn0KdGhyb3cgbmV3IFxFeGNlcHRpb24oJ0ludmFsaWQgdXNlciBuYW1lOiAnIC4gJHRoaXMtPmdldFVzZXIoKSk7Cn0KCnJldHVybiB0cnVlOwp9CgpwdWJsaWMgZnVuY3Rpb24gY29ubmVjdENsaWVudCgpOiB2b2lkCnsKJHA0Q3JlYXRlQ2xpZW50Q29tbWFuZCA9ICR0aGlzLT5nZW5lcmF0ZVA0Q29tbWFuZChbJ2NsaWVudCcsICctaSddKTsKCiRwcm9jZXNzID0gbmV3IFByb2Nlc3MoJHA0Q3JlYXRlQ2xpZW50Q29tbWFuZCwgbnVsbCwgbnVsbCwgZmlsZV9nZXRfY29udGVudHMoJHRoaXMtPmdldFA0Q2xpZW50U3BlYygpKSk7CiRwcm9jZXNzLT5ydW4oKTsKfQoKcHVibGljIGZ1bmN0aW9uIHN5bmNDb2RlQmFzZSg/c3RyaW5nICRzb3VyY2VSZWZlcmVuY2UpOiB2b2lkCnsKJHByZXZEaXIgPSBQbGF0Zm9ybTo6Z2V0Q3dkKCk7CmNoZGlyKCR0aGlzLT5wYXRoKTsKJHA0U3luY0NvbW1hbmQgPSAkdGhpcy0+Z2VuZXJhdGVQNENvbW1hbmQoWydzeW5jJywgJy1mJ10pOwppZiAobnVsbCAhPT0gJHNvdXJjZVJlZmVyZW5jZSkgewokcDRTeW5jQ29tbWFuZFtdID0gJ0AnIC4gJHNvdXJjZVJlZmVyZW5jZTsKfQokdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJHA0U3luY0NvbW1hbmQpOwpjaGRpcigkcHJldkRpcik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZUNsaWVudFNwZWNUb0ZpbGUoJHNwZWMpOiB2b2lkCnsKZndyaXRlKCRzcGVjLCAnQ2xpZW50OiAnIC4gJHRoaXMtPmdldENsaWVudCgpIC4gUEhQX0VPTCAuIFBIUF9FT0wpOwpmd3JpdGUoJHNwZWMsICdVcGRhdGU6ICcgLiBkYXRlKCdZL20vZCBIOmk6cycpIC4gUEhQX0VPTCAuIFBIUF9FT0wpOwpmd3JpdGUoJHNwZWMsICdBY2Nlc3M6ICcgLiBkYXRlKCdZL20vZCBIOmk6cycpIC4gUEhQX0VPTCk7CmZ3cml0ZSgkc3BlYywgJ093bmVyOiAgJyAuICR0aGlzLT5nZXRVc2VyKCkgLiBQSFBfRU9MIC4gUEhQX0VPTCk7CmZ3cml0ZSgkc3BlYywgJ0Rlc2NyaXB0aW9uOicgLiBQSFBfRU9MKTsKZndyaXRlKCRzcGVjLCAnICBDcmVhdGVkIGJ5ICcgLiAkdGhpcy0+Z2V0VXNlcigpIC4gJyBmcm9tIGNvbXBvc2VyLicgLiBQSFBfRU9MIC4gUEhQX0VPTCk7CmZ3cml0ZSgkc3BlYywgJ1Jvb3Q6ICcgLiAkdGhpcy0+Z2V0UGF0aCgpIC4gUEhQX0VPTCAuIFBIUF9FT0wpOwpmd3JpdGUoJHNwZWMsICdPcHRpb25zOiAgbm9hbGx3cml0ZSBub2Nsb2JiZXIgbm9jb21wcmVzcyB1bmxvY2tlZCBtb2R0aW1lIHJtZGlyJyAuIFBIUF9FT0wgLiBQSFBfRU9MKTsKZndyaXRlKCRzcGVjLCAnU3VibWl0T3B0aW9uczogIHJldmVydHVuY2hhbmdlZCcgLiBQSFBfRU9MIC4gUEhQX0VPTCk7CmZ3cml0ZSgkc3BlYywgJ0xpbmVFbmQ6ICBsb2NhbCcgLiBQSFBfRU9MIC4gUEhQX0VPTCk7CmlmICgkdGhpcy0+aXNTdHJlYW0oKSkgewpmd3JpdGUoJHNwZWMsICdTdHJlYW06JyAuIFBIUF9FT0wpOwpmd3JpdGUoJHNwZWMsICcgICcgLiAkdGhpcy0+Z2V0U3RyZWFtV2l0aG91dExhYmVsKCR0aGlzLT5wNFN0cmVhbSkgLiBQSFBfRU9MKTsKfSBlbHNlIHsKZndyaXRlKAokc3BlYywKJ1ZpZXc6ICAnIC4gJHRoaXMtPmdldFN0cmVhbSgpIC4gJy8uLi4gIC8vJyAuICR0aGlzLT5nZXRDbGllbnQoKSAuICcvLi4uICcgLiBQSFBfRU9MCik7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIHdyaXRlUDRDbGllbnRTcGVjKCk6IHZvaWQKewokY2xpZW50U3BlYyA9ICR0aGlzLT5nZXRQNENsaWVudFNwZWMoKTsKJHNwZWMgPSBmb3BlbigkY2xpZW50U3BlYywgJ3cnKTsKdHJ5IHsKJHRoaXMtPndyaXRlQ2xpZW50U3BlY1RvRmlsZSgkc3BlYyk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKZmNsb3NlKCRzcGVjKTsKdGhyb3cgJGU7Cn0KZmNsb3NlKCRzcGVjKTsKfQoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiByZWFkKCRwaXBlLCAkbmFtZSk6IHZvaWQKewppZiAoZmVvZigkcGlwZSkpIHsKcmV0dXJuOwp9CiRsaW5lID0gZmdldHMoJHBpcGUpOwp3aGlsZSAoJGxpbmUgIT09IGZhbHNlKSB7CiRsaW5lID0gZmdldHMoJHBpcGUpOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiB3aW5kb3dzTG9naW4oP3N0cmluZyAkcGFzc3dvcmQpOiBpbnQKewokY29tbWFuZCA9ICR0aGlzLT5nZW5lcmF0ZVA0Q29tbWFuZChbJ2xvZ2luJywgJy1hJ10pOwoKJHByb2Nlc3MgPSBuZXcgUHJvY2VzcygkY29tbWFuZCwgbnVsbCwgbnVsbCwgJHBhc3N3b3JkKTsKCnJldHVybiAkcHJvY2Vzcy0+cnVuKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBwNExvZ2luKCk6IHZvaWQKewokdGhpcy0+cXVlcnlQNFVzZXIoKTsKaWYgKCEkdGhpcy0+aXNMb2dnZWRJbigpKSB7CiRwYXNzd29yZCA9ICR0aGlzLT5xdWVyeVA0UGFzc3dvcmQoKTsKaWYgKCR0aGlzLT53aW5kb3dzRmxhZykgewokdGhpcy0+d2luZG93c0xvZ2luKCRwYXNzd29yZCk7Cn0gZWxzZSB7CiRjb21tYW5kID0gJHRoaXMtPmdlbmVyYXRlUDRDb21tYW5kKFsnbG9naW4nLCAnLWEnXSwgZmFsc2UpOwoKJHByb2Nlc3MgPSBuZXcgUHJvY2VzcygkY29tbWFuZCwgbnVsbCwgbnVsbCwgJHBhc3N3b3JkKTsKJHByb2Nlc3MtPnJ1bigpOwoKaWYgKCEkcHJvY2Vzcy0+aXNTdWNjZXNzZnVsKCkpIHsKdGhyb3cgbmV3IFxFeGNlcHRpb24oIkVycm9yIGxvZ2dpbmcgaW46IiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpKTsKfQp9Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbXBvc2VySW5mb3JtYXRpb24oc3RyaW5nICRpZGVudGlmaWVyKTogP2FycmF5CnsKJGNvbXBvc2VyRmlsZUNvbnRlbnQgPSAkdGhpcy0+Z2V0RmlsZUNvbnRlbnQoJ2NvbXBvc2VyLmpzb24nLCAkaWRlbnRpZmllcik7CgppZiAoISRjb21wb3NlckZpbGVDb250ZW50KSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4ganNvbl9kZWNvZGUoJGNvbXBvc2VyRmlsZUNvbnRlbnQsIHRydWUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZUNvbnRlbnQoc3RyaW5nICRmaWxlLCBzdHJpbmcgJGlkZW50aWZpZXIpOiA/c3RyaW5nCnsKJHBhdGggPSAkdGhpcy0+Z2V0RmlsZVBhdGgoJGZpbGUsICRpZGVudGlmaWVyKTsKaWYgKCRwYXRoID09PSBudWxsKSB7CnJldHVybiBudWxsOwp9CgokY29tbWFuZCA9ICR0aGlzLT5nZW5lcmF0ZVA0Q29tbWFuZChbJ3ByaW50JywgJHBhdGhdKTsKJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCRjb21tYW5kKTsKJHJlc3VsdCA9ICR0aGlzLT5jb21tYW5kUmVzdWx0OwoKaWYgKCF0cmltKCRyZXN1bHQpKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEZpbGVQYXRoKHN0cmluZyAkZmlsZSwgc3RyaW5nICRpZGVudGlmaWVyKTogP3N0cmluZwp7CiRpbmRleCA9IHN0cnBvcygkaWRlbnRpZmllciwgJ0AnKTsKaWYgKCRpbmRleCA9PT0gZmFsc2UpIHsKcmV0dXJuICRpZGVudGlmaWVyLiAnLycgLiAkZmlsZTsKfQoKJHBhdGggPSBzdWJzdHIoJGlkZW50aWZpZXIsIDAsICRpbmRleCkgLiAnLycgLiAkZmlsZSAuIHN1YnN0cigkaWRlbnRpZmllciwgJGluZGV4KTsKJGNvbW1hbmQgPSAkdGhpcy0+Z2VuZXJhdGVQNENvbW1hbmQoWydmaWxlcycsICRwYXRoXSwgZmFsc2UpOwokdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNvbW1hbmQpOwokcmVzdWx0ID0gJHRoaXMtPmNvbW1hbmRSZXN1bHQ7CiRpbmRleDIgPSBzdHJwb3MoJHJlc3VsdCwgJ25vIHN1Y2ggZmlsZShzKS4nKTsKaWYgKCRpbmRleDIgPT09IGZhbHNlKSB7CiRpbmRleDMgPSBzdHJwb3MoJHJlc3VsdCwgJ2NoYW5nZScpOwppZiAoJGluZGV4MyAhPT0gZmFsc2UpIHsKJHBocmFzZSA9IHRyaW0oc3Vic3RyKCRyZXN1bHQsICRpbmRleDMpKTsKJGZpZWxkcyA9IGV4cGxvZGUoJyAnLCAkcGhyYXNlKTsKCnJldHVybiBzdWJzdHIoJGlkZW50aWZpZXIsIDAsICRpbmRleCkgLiAnLycgLiAkZmlsZSAuICdAJyAuICRmaWVsZHNbMV07Cn0KfQoKcmV0dXJuIG51bGw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRCcmFuY2hlcygpOiBhcnJheQp7CiRwb3NzaWJsZUJyYW5jaGVzID0gW107CmlmICghJHRoaXMtPmlzU3RyZWFtKCkpIHsKJHBvc3NpYmxlQnJhbmNoZXNbJHRoaXMtPnA0QnJhbmNoXSA9ICR0aGlzLT5nZXRTdHJlYW0oKTsKfSBlbHNlIHsKJGNvbW1hbmQgPSAkdGhpcy0+Z2VuZXJhdGVQNENvbW1hbmQoWydzdHJlYW1zJywgJy8vJyAuICR0aGlzLT5wNERlcG90IC4gJy8uLi4nXSk7CiR0aGlzLT5leGVjdXRlQ29tbWFuZCgkY29tbWFuZCk7CiRyZXN1bHQgPSAkdGhpcy0+Y29tbWFuZFJlc3VsdDsKJHJlc0FycmF5ID0gZXhwbG9kZShQSFBfRU9MLCAkcmVzdWx0KTsKZm9yZWFjaCAoJHJlc0FycmF5IGFzICRsaW5lKSB7CiRyZXNCaXRzID0gZXhwbG9kZSgnICcsICRsaW5lKTsKaWYgKGNvdW50KCRyZXNCaXRzKSA+IDQpIHsKJGJyYW5jaCA9IFByZWc6OnJlcGxhY2UoJy9bXkEtWmEtejAtOSBdLycsICcnLCAkcmVzQml0c1s0XSk7CiRwb3NzaWJsZUJyYW5jaGVzWyRicmFuY2hdID0gJHJlc0JpdHNbMV07Cn0KfQp9CiRjb21tYW5kID0gJHRoaXMtPmdlbmVyYXRlUDRDb21tYW5kKFsnY2hhbmdlcycsICR0aGlzLT5nZXRTdHJlYW0oKSAuICcvLi4uJ10sIGZhbHNlKTsKJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCRjb21tYW5kKTsKJHJlc3VsdCA9ICR0aGlzLT5jb21tYW5kUmVzdWx0OwokcmVzQXJyYXkgPSBleHBsb2RlKFBIUF9FT0wsICRyZXN1bHQpOwokbGFzdENvbW1pdCA9ICRyZXNBcnJheVswXTsKJGxhc3RDb21taXRBcnIgPSBleHBsb2RlKCcgJywgJGxhc3RDb21taXQpOwokbGFzdENvbW1pdE51bSA9ICRsYXN0Q29tbWl0QXJyWzFdOwoKcmV0dXJuIFsnbWFzdGVyJyA9PiAkcG9zc2libGVCcmFuY2hlc1skdGhpcy0+cDRCcmFuY2hdIC4gJ0AnLiAkbGFzdENvbW1pdE51bV07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUYWdzKCk6IGFycmF5CnsKJGNvbW1hbmQgPSAkdGhpcy0+Z2VuZXJhdGVQNENvbW1hbmQoWydsYWJlbHMnXSk7CiR0aGlzLT5leGVjdXRlQ29tbWFuZCgkY29tbWFuZCk7CiRyZXN1bHQgPSAkdGhpcy0+Y29tbWFuZFJlc3VsdDsKJHJlc0FycmF5ID0gZXhwbG9kZShQSFBfRU9MLCAkcmVzdWx0KTsKJHRhZ3MgPSBbXTsKZm9yZWFjaCAoJHJlc0FycmF5IGFzICRsaW5lKSB7CmlmIChzdHJwb3MoJGxpbmUsICdMYWJlbCcpICE9PSBmYWxzZSkgewokZmllbGRzID0gZXhwbG9kZSgnICcsICRsaW5lKTsKJHRhZ3NbJGZpZWxkc1sxXV0gPSAkdGhpcy0+Z2V0U3RyZWFtKCkgLiAnQCcgLiAkZmllbGRzWzFdOwp9Cn0KCnJldHVybiAkdGFnczsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrU3RyZWFtKCk6IGJvb2wKewokY29tbWFuZCA9ICR0aGlzLT5nZW5lcmF0ZVA0Q29tbWFuZChbJ2RlcG90cyddLCBmYWxzZSk7CiR0aGlzLT5leGVjdXRlQ29tbWFuZCgkY29tbWFuZCk7CiRyZXN1bHQgPSAkdGhpcy0+Y29tbWFuZFJlc3VsdDsKJHJlc0FycmF5ID0gZXhwbG9kZShQSFBfRU9MLCAkcmVzdWx0KTsKZm9yZWFjaCAoJHJlc0FycmF5IGFzICRsaW5lKSB7CmlmIChzdHJwb3MoJGxpbmUsICdEZXBvdCcpICE9PSBmYWxzZSkgewokZmllbGRzID0gZXhwbG9kZSgnICcsICRsaW5lKTsKaWYgKHN0cmNtcCgkdGhpcy0+cDREZXBvdCwgJGZpZWxkc1sxXSkgPT09IDApIHsKJHRoaXMtPnA0RGVwb3RUeXBlID0gJGZpZWxkc1szXTsKCnJldHVybiAkdGhpcy0+aXNTdHJlYW0oKTsKfQp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldENoYW5nZUxpc3Qoc3RyaW5nICRyZWZlcmVuY2UpOiBtaXhlZAp7CiRpbmRleCA9IHN0cnBvcygkcmVmZXJlbmNlLCAnQCcpOwppZiAoJGluZGV4ID09PSBmYWxzZSkgewpyZXR1cm4gbnVsbDsKfQokbGFiZWwgPSBzdWJzdHIoJHJlZmVyZW5jZSwgJGluZGV4KTsKJGNvbW1hbmQgPSAkdGhpcy0+Z2VuZXJhdGVQNENvbW1hbmQoWydjaGFuZ2VzJywgJy1tMScsICRsYWJlbF0pOwokdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNvbW1hbmQpOwokY2hhbmdlcyA9ICR0aGlzLT5jb21tYW5kUmVzdWx0OwppZiAoc3RycG9zKCRjaGFuZ2VzLCAnQ2hhbmdlJykgIT09IDApIHsKcmV0dXJuIG51bGw7Cn0KJGZpZWxkcyA9IGV4cGxvZGUoJyAnLCAkY2hhbmdlcyk7CgpyZXR1cm4gJGZpZWxkc1sxXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbW1pdExvZ3Moc3RyaW5nICRmcm9tUmVmZXJlbmNlLCBzdHJpbmcgJHRvUmVmZXJlbmNlKTogbWl4ZWQKewokZnJvbUNoYW5nZUxpc3QgPSAkdGhpcy0+Z2V0Q2hhbmdlTGlzdCgkZnJvbVJlZmVyZW5jZSk7CmlmICgkZnJvbUNoYW5nZUxpc3QgPT09IG51bGwpIHsKcmV0dXJuIG51bGw7Cn0KJHRvQ2hhbmdlTGlzdCA9ICR0aGlzLT5nZXRDaGFuZ2VMaXN0KCR0b1JlZmVyZW5jZSk7CmlmICgkdG9DaGFuZ2VMaXN0ID09PSBudWxsKSB7CnJldHVybiBudWxsOwp9CiRpbmRleCA9IHN0cnBvcygkZnJvbVJlZmVyZW5jZSwgJ0AnKTsKJG1haW4gPSBzdWJzdHIoJGZyb21SZWZlcmVuY2UsIDAsICRpbmRleCkgLiAnLy4uLic7CiRjb21tYW5kID0gJHRoaXMtPmdlbmVyYXRlUDRDb21tYW5kKFsnZmlsZWxvZycsICRtYWluIC4gJ0AnIC4gJGZyb21DaGFuZ2VMaXN0IC4gJywnIC4gJHRvQ2hhbmdlTGlzdF0pOwokdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNvbW1hbmQpOwoKcmV0dXJuICR0aGlzLT5jb21tYW5kUmVzdWx0Owp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZXN5c3RlbSgpOiBGaWxlc3lzdGVtCnsKaWYgKG51bGwgPT09ICR0aGlzLT5maWxlc3lzdGVtKSB7CiR0aGlzLT5maWxlc3lzdGVtID0gbmV3IEZpbGVzeXN0ZW0oJHRoaXMtPnByb2Nlc3MpOwp9CgpyZXR1cm4gJHRoaXMtPmZpbGVzeXN0ZW07Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRGaWxlc3lzdGVtKEZpbGVzeXN0ZW0gJGZzKTogdm9pZAp7CiR0aGlzLT5maWxlc3lzdGVtID0gJGZzOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldFA0RXhlY3V0YWJsZSgpOiBzdHJpbmcKewpzdGF0aWMgJHA0RXhlY3V0YWJsZTsKCmlmICgkcDRFeGVjdXRhYmxlKSB7CnJldHVybiAkcDRFeGVjdXRhYmxlOwp9CgokZmluZGVyID0gbmV3IEV4ZWN1dGFibGVGaW5kZXIoKTsKCnJldHVybiAkcDRFeGVjdXRhYmxlID0gJGZpbmRlci0+ZmluZCgncDQnKSA/PyAncDQnOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKCgpjbGFzcyBQbGF0Zm9ybQp7Cgpwcml2YXRlIHN0YXRpYyAkaXNWaXJ0dWFsQm94R3Vlc3QgPSBudWxsOwoKcHJpdmF0ZSBzdGF0aWMgJGlzV2luZG93c1N1YnN5c3RlbUZvckxpbnV4ID0gbnVsbDsKCnByaXZhdGUgc3RhdGljICRpc0RvY2tlciA9IG51bGw7CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Q3dkKGJvb2wgJGFsbG93RW1wdHkgPSBmYWxzZSk6IHN0cmluZwp7CiRjd2QgPSBnZXRjd2QoKTsKCgppZiAoZmFsc2UgPT09ICRjd2QpIHsKJGN3ZCA9IHJlYWxwYXRoKCcnKTsKfQoKCmlmIChmYWxzZSA9PT0gJGN3ZCkgewppZiAoJGFsbG93RW1wdHkpIHsKcmV0dXJuICcnOwp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnknKTsKfQoKcmV0dXJuICRjd2Q7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVhbHBhdGgoc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKJHJlYWxQYXRoID0gcmVhbHBhdGgoJHBhdGgpOwppZiAoJHJlYWxQYXRoID09PSBmYWxzZSkgewpyZXR1cm4gJHBhdGg7Cn0KCnJldHVybiAkcmVhbFBhdGg7Cn0KCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEVudihzdHJpbmcgJG5hbWUpCnsKaWYgKGFycmF5X2tleV9leGlzdHMoJG5hbWUsICRfU0VSVkVSKSkgewpyZXR1cm4gKHN0cmluZykgJF9TRVJWRVJbJG5hbWVdOwp9CmlmIChhcnJheV9rZXlfZXhpc3RzKCRuYW1lLCAkX0VOVikpIHsKcmV0dXJuIChzdHJpbmcpICRfRU5WWyRuYW1lXTsKfQoKcmV0dXJuIGdldGVudigkbmFtZSk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHV0RW52KHN0cmluZyAkbmFtZSwgc3RyaW5nICR2YWx1ZSk6IHZvaWQKewpwdXRlbnYoJG5hbWUgLiAnPScgLiAkdmFsdWUpOwokX1NFUlZFUlskbmFtZV0gPSAkX0VOVlskbmFtZV0gPSAkdmFsdWU7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2xlYXJFbnYoc3RyaW5nICRuYW1lKTogdm9pZAp7CnB1dGVudigkbmFtZSk7CnVuc2V0KCRfU0VSVkVSWyRuYW1lXSwgJF9FTlZbJG5hbWVdKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBleHBhbmRQYXRoKHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CmlmIChQcmVnOjppc01hdGNoKCcjXn5bXFwvXSMnLCAkcGF0aCkpIHsKcmV0dXJuIHNlbGY6OmdldFVzZXJEaXJlY3RvcnkoKSAuIHN1YnN0cigkcGF0aCwgMSk7Cn0KCnJldHVybiBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJyNeKFwkfCg/UDxwZXJjZW50PiUpKSg/UDx2YXI+XHcrKykoPyhwZXJjZW50KSUpKD9QPHBhdGg+LiopIycsIHN0YXRpYyBmdW5jdGlvbiAoJG1hdGNoZXMpOiBzdHJpbmcgewoKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiAkbWF0Y2hlc1sndmFyJ10gPT09ICdIT01FJykgewppZiAoKGJvb2wpIFBsYXRmb3JtOjpnZXRFbnYoJ0hPTUUnKSkgewpyZXR1cm4gUGxhdGZvcm06OmdldEVudignSE9NRScpIC4gJG1hdGNoZXNbJ3BhdGgnXTsKfQoKcmV0dXJuIFBsYXRmb3JtOjpnZXRFbnYoJ1VTRVJQUk9GSUxFJykgLiAkbWF0Y2hlc1sncGF0aCddOwp9CgpyZXR1cm4gUGxhdGZvcm06OmdldEVudigkbWF0Y2hlc1sndmFyJ10pIC4gJG1hdGNoZXNbJ3BhdGgnXTsKfSwgJHBhdGgpOwp9CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRVc2VyRGlyZWN0b3J5KCk6IHN0cmluZwp7CmlmIChmYWxzZSAhPT0gKCRob21lID0gc2VsZjo6Z2V0RW52KCdIT01FJykpKSB7CnJldHVybiAkaG9tZTsKfQoKaWYgKHNlbGY6OmlzV2luZG93cygpICYmIGZhbHNlICE9PSAoJGhvbWUgPSBzZWxmOjpnZXRFbnYoJ1VTRVJQUk9GSUxFJykpKSB7CnJldHVybiAkaG9tZTsKfQoKaWYgKFxmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldHVpZCcpICYmIFxmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldHB3dWlkJykpIHsKJGluZm8gPSBwb3NpeF9nZXRwd3VpZChwb3NpeF9nZXR1aWQoKSk7CgppZiAoaXNfYXJyYXkoJGluZm8pKSB7CnJldHVybiAkaW5mb1snZGlyJ107Cn0KfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgZGV0ZXJtaW5lIHVzZXIgZGlyZWN0b3J5Jyk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNXaW5kb3dzU3Vic3lzdGVtRm9yTGludXgoKTogYm9vbAp7CmlmIChudWxsID09PSBzZWxmOjokaXNXaW5kb3dzU3Vic3lzdGVtRm9yTGludXgpIHsKc2VsZjo6JGlzV2luZG93c1N1YnN5c3RlbUZvckxpbnV4ID0gZmFsc2U7CgoKaWYgKHNlbGY6OmlzV2luZG93cygpKSB7CnJldHVybiBzZWxmOjokaXNXaW5kb3dzU3Vic3lzdGVtRm9yTGludXggPSBmYWxzZTsKfQoKaWYgKAohKGJvb2wpIGluaV9nZXQoJ29wZW5fYmFzZWRpcicpCiYmIGlzX3JlYWRhYmxlKCcvcHJvYy92ZXJzaW9uJykKJiYgZmFsc2UgIT09IHN0cmlwb3MoKHN0cmluZykgU2lsZW5jZXI6OmNhbGwoJ2ZpbGVfZ2V0X2NvbnRlbnRzJywgJy9wcm9jL3ZlcnNpb24nKSwgJ21pY3Jvc29mdCcpCiYmICFzZWxmOjppc0RvY2tlcigpIAopIHsKcmV0dXJuIHNlbGY6OiRpc1dpbmRvd3NTdWJzeXN0ZW1Gb3JMaW51eCA9IHRydWU7Cn0KfQoKcmV0dXJuIHNlbGY6OiRpc1dpbmRvd3NTdWJzeXN0ZW1Gb3JMaW51eDsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1dpbmRvd3MoKTogYm9vbAp7CnJldHVybiBcZGVmaW5lZCgnUEhQX1dJTkRPV1NfVkVSU0lPTl9CVUlMRCcpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzRG9ja2VyKCk6IGJvb2wKewppZiAobnVsbCAhPT0gc2VsZjo6JGlzRG9ja2VyKSB7CnJldHVybiBzZWxmOjokaXNEb2NrZXI7Cn0KCgppZiAoKGJvb2wpIGluaV9nZXQoJ29wZW5fYmFzZWRpcicpKSB7CnJldHVybiBzZWxmOjokaXNEb2NrZXIgPSBmYWxzZTsKfQoKCmlmIChmaWxlX2V4aXN0cygnLy5kb2NrZXJlbnYnKSB8fCBmaWxlX2V4aXN0cygnL3J1bi8uY29udGFpbmVyZW52JykgfHwgZmlsZV9leGlzdHMoJy92YXIvcnVuLy5jb250YWluZXJlbnYnKSkgewpyZXR1cm4gc2VsZjo6JGlzRG9ja2VyID0gdHJ1ZTsKfQoKCiRjZ3JvdXBzID0gWwonL3Byb2Mvc2VsZi9tb3VudGluZm8nLCAKJy9wcm9jLzEvY2dyb3VwJywgCl07CmZvcmVhY2ggKCRjZ3JvdXBzIGFzICRjZ3JvdXApIHsKaWYgKCFpc19yZWFkYWJsZSgkY2dyb3VwKSkgewpjb250aW51ZTsKfQoKCnRyeSB7CiRkYXRhID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRjZ3JvdXApOwp9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7CmJyZWFrOwp9CmlmICghaXNfc3RyaW5nKCRkYXRhKSkgewpjb250aW51ZTsKfQoKaWYgKHN0cl9jb250YWlucygkZGF0YSwgJy92YXIvbGliL2RvY2tlci8nKSB8fCBzdHJfY29udGFpbnMoJGRhdGEsICcvaW8uY29udGFpbmVyZC5zbmFwc2hvdHRlcicpKSB7CnJldHVybiBzZWxmOjokaXNEb2NrZXIgPSB0cnVlOwp9Cn0KCnJldHVybiBzZWxmOjokaXNEb2NrZXIgPSBmYWxzZTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdHJsZW4oc3RyaW5nICRzdHIpOiBpbnQKewpzdGF0aWMgJHVzZU1iU3RyaW5nID0gbnVsbDsKaWYgKG51bGwgPT09ICR1c2VNYlN0cmluZykgewokdXNlTWJTdHJpbmcgPSBcZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJsZW4nKSAmJiAoYm9vbCkgaW5pX2dldCgnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcpOwp9CgppZiAoJHVzZU1iU3RyaW5nKSB7CnJldHVybiBtYl9zdHJsZW4oJHN0ciwgJzhiaXQnKTsKfQoKcmV0dXJuIFxzdHJsZW4oJHN0cik7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNUdHkoJGZkID0gbnVsbCk6IGJvb2wKewppZiAoJGZkID09PSBudWxsKSB7CiRmZCA9IGRlZmluZWQoJ1NURE9VVCcpID8gU1RET1VUIDogZm9wZW4oJ3BocDovL3N0ZG91dCcsICd3Jyk7CmlmICgkZmQgPT09IGZhbHNlKSB7CnJldHVybiBmYWxzZTsKfQp9CgoKCmlmIChpbl9hcnJheShzdHJ0b3VwcGVyKChzdHJpbmcpIHNlbGY6OmdldEVudignTVNZU1RFTScpKSwgWydNSU5HVzMyJywgJ01JTkdXNjQnXSwgdHJ1ZSkpIHsKcmV0dXJuIHRydWU7Cn0KCgoKaWYgKGZ1bmN0aW9uX2V4aXN0cygnc3RyZWFtX2lzYXR0eScpKSB7CnJldHVybiBzdHJlYW1faXNhdHR5KCRmZCk7Cn0KCgppZiAoZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9pc2F0dHknKSAmJiBwb3NpeF9pc2F0dHkoJGZkKSkgewpyZXR1cm4gdHJ1ZTsKfQoKJHN0YXQgPSBAZnN0YXQoJGZkKTsKaWYgKCRzdGF0ID09PSBmYWxzZSkgewpyZXR1cm4gZmFsc2U7Cn0KCgpyZXR1cm4gMDAyMDAwMCA9PT0gKCRzdGF0Wydtb2RlJ10gJiAwMTcwMDAwKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0lucHV0Q29tcGxldGlvblByb2Nlc3MoKTogYm9vbAp7CnJldHVybiAnX2NvbXBsZXRlJyA9PT0gKCRfU0VSVkVSWydhcmd2J11bMV0gPz8gbnVsbCk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gd29ya2Fyb3VuZEZpbGVzeXN0ZW1Jc3N1ZXMoKTogdm9pZAp7CmlmIChzZWxmOjppc1ZpcnR1YWxCb3hHdWVzdCgpKSB7CnVzbGVlcCgyMDAwMDApOwp9Cn0KCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaXNWaXJ0dWFsQm94R3Vlc3QoKTogYm9vbAp7CmlmIChudWxsID09PSBzZWxmOjokaXNWaXJ0dWFsQm94R3Vlc3QpIHsKc2VsZjo6JGlzVmlydHVhbEJveEd1ZXN0ID0gZmFsc2U7CmlmIChzZWxmOjppc1dpbmRvd3MoKSkgewpyZXR1cm4gc2VsZjo6JGlzVmlydHVhbEJveEd1ZXN0Owp9CgppZiAoZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRwd3VpZCcpICYmIGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0ZXVpZCcpKSB7CiRwcm9jZXNzVXNlciA9IHBvc2l4X2dldHB3dWlkKHBvc2l4X2dldGV1aWQoKSk7CmlmIChpc19hcnJheSgkcHJvY2Vzc1VzZXIpICYmICRwcm9jZXNzVXNlclsnbmFtZSddID09PSAndmFncmFudCcpIHsKcmV0dXJuIHNlbGY6OiRpc1ZpcnR1YWxCb3hHdWVzdCA9IHRydWU7Cn0KfQoKaWYgKHNlbGY6OmdldEVudignQ09NUE9TRVJfUlVOVElNRV9FTlYnKSA9PT0gJ3ZpcnR1YWxib3gnKSB7CnJldHVybiBzZWxmOjokaXNWaXJ0dWFsQm94R3Vlc3QgPSB0cnVlOwp9CgppZiAoZGVmaW5lZCgnUEhQX09TX0ZBTUlMWScpICYmIFBIUF9PU19GQU1JTFkgPT09ICdMaW51eCcpIHsKJHByb2Nlc3MgPSBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCk7CnRyeSB7CmlmICgwID09PSAkcHJvY2Vzcy0+ZXhlY3V0ZShbJ2xzbW9kJ10sICRvdXRwdXQpICYmIHN0cl9jb250YWlucygkb3V0cHV0LCAndmJveGd1ZXN0JykpIHsKcmV0dXJuIHNlbGY6OiRpc1ZpcnR1YWxCb3hHdWVzdCA9IHRydWU7Cn0KfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewoKfQp9Cn0KCnJldHVybiBzZWxmOjokaXNWaXJ0dWFsQm94R3Vlc3Q7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RGV2TnVsbCgpOiBzdHJpbmcKewppZiAoc2VsZjo6aXNXaW5kb3dzKCkpIHsKcmV0dXJuICdOVUwnOwp9CgpyZXR1cm4gJy9kZXYvbnVsbCc7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIFNlbGRcU2lnbmFsXFNpZ25hbEhhbmRsZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvblxQcm9jZXNzU2lnbmFsZWRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFByb2Nlc3M7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvblxSdW50aW1lRXhjZXB0aW9uOwp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlOwp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGVjdXRhYmxlRmluZGVyOwoKCgoKCmNsYXNzIFByb2Nlc3NFeGVjdXRvcgp7CnByaXZhdGUgY29uc3QgU1RBVFVTX1FVRVVFRCA9IDE7CnByaXZhdGUgY29uc3QgU1RBVFVTX1NUQVJURUQgPSAyOwpwcml2YXRlIGNvbnN0IFNUQVRVU19DT01QTEVURUQgPSAzOwpwcml2YXRlIGNvbnN0IFNUQVRVU19GQUlMRUQgPSA0Owpwcml2YXRlIGNvbnN0IFNUQVRVU19BQk9SVEVEID0gNTsKCnByaXZhdGUgY29uc3QgQlVJTFRJTl9DTURfQ09NTUFORFMgPSBbCidhc3NvYycsICdicmVhaycsICdjYWxsJywgJ2NkJywgJ2NoZGlyJywgJ2NscycsICdjb2xvcicsICdjb3B5JywgJ2RhdGUnLAonZGVsJywgJ2RpcicsICdlY2hvJywgJ2VuZGxvY2FsJywgJ2VyYXNlJywgJ2V4aXQnLCAnZm9yJywgJ2Z0eXBlJywgJ2dvdG8nLAonaGVscCcsICdpZicsICdsYWJlbCcsICdtZCcsICdta2RpcicsICdta2xpbmsnLCAnbW92ZScsICdwYXRoJywgJ3BhdXNlJywKJ3BvcGQnLCAncHJvbXB0JywgJ3B1c2hkJywgJ3JkJywgJ3JlbScsICdyZW4nLCAncmVuYW1lJywgJ3JtZGlyJywgJ3NldCcsCidzZXRsb2NhbCcsICdzaGlmdCcsICdzdGFydCcsICd0aW1lJywgJ3RpdGxlJywgJ3R5cGUnLCAndmVyJywgJ3ZvbCcsCl07Cgpwcml2YXRlIGNvbnN0IEdJVF9DTURTX05FRURfR0lUX0RJUiA9IFsKWydzaG93J10sClsnbG9nJ10sClsnYnJhbmNoJ10sClsncmVtb3RlJywgJ3NldC11cmwnXSwKXTsKCgpwcm90ZWN0ZWQgc3RhdGljICR0aW1lb3V0ID0gMzAwOwoKCnByb3RlY3RlZCAkY2FwdHVyZU91dHB1dCA9IGZhbHNlOwoKcHJvdGVjdGVkICRlcnJvck91dHB1dCA9ICcnOwoKcHJvdGVjdGVkICRpbzsKCgoKCnByaXZhdGUgJGpvYnMgPSBbXTsKCnByaXZhdGUgJHJ1bm5pbmdKb2JzID0gMDsKCnByaXZhdGUgJG1heEpvYnMgPSAxMDsKCnByaXZhdGUgJGlkR2VuID0gMDsKCnByaXZhdGUgJGFsbG93QXN5bmMgPSBmYWxzZTsKCgpwcml2YXRlIHN0YXRpYyAkZXhlY3V0YWJsZXMgPSBbXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/SU9JbnRlcmZhY2UgJGlvID0gbnVsbCkKewokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5yZXNldE1heEpvYnMoKTsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGV4ZWN1dGUoJGNvbW1hbmQsICYkb3V0cHV0ID0gbnVsbCwgP3N0cmluZyAkY3dkID0gbnVsbCk6IGludAp7CmlmIChmdW5jX251bV9hcmdzKCkgPiAxKSB7CnJldHVybiAkdGhpcy0+ZG9FeGVjdXRlKCRjb21tYW5kLCAkY3dkLCBmYWxzZSwgJG91dHB1dCk7Cn0KCnJldHVybiAkdGhpcy0+ZG9FeGVjdXRlKCRjb21tYW5kLCAkY3dkLCBmYWxzZSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXhlY3V0ZVR0eSgkY29tbWFuZCwgP3N0cmluZyAkY3dkID0gbnVsbCk6IGludAp7CmlmIChQbGF0Zm9ybTo6aXNUdHkoKSkgewpyZXR1cm4gJHRoaXMtPmRvRXhlY3V0ZSgkY29tbWFuZCwgJGN3ZCwgdHJ1ZSk7Cn0KCnJldHVybiAkdGhpcy0+ZG9FeGVjdXRlKCRjb21tYW5kLCAkY3dkLCBmYWxzZSk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBydW5Qcm9jZXNzKCRjb21tYW5kLCA/c3RyaW5nICRjd2QsID9hcnJheSAkZW52LCBib29sICR0dHksICYkb3V0cHV0ID0gbnVsbCk6ID9pbnQKewoKCgppZiAoaXNfc3RyaW5nKCRjb21tYW5kKSkgewppZiAoUGxhdGZvcm06OmlzV2luZG93cygpICYmIFByZWc6OmlzTWF0Y2goJ3teKFteOi9cXFxcXSsrKSB9JywgJGNvbW1hbmQsICRtYXRjaCkpIHsKJGNvbW1hbmQgPSBzdWJzdHJfcmVwbGFjZSgkY29tbWFuZCwgc2VsZjo6ZXNjYXBlKHNlbGY6OmdldEV4ZWN1dGFibGUoJG1hdGNoWzFdKSksIDAsIHN0cmxlbigkbWF0Y2hbMV0pKTsKfQoKJHByb2Nlc3MgPSBQcm9jZXNzOjpmcm9tU2hlbGxDb21tYW5kbGluZSgkY29tbWFuZCwgJGN3ZCwgJGVudiwgbnVsbCwgc3RhdGljOjpnZXRUaW1lb3V0KCkpOwp9IGVsc2UgewppZiAoUGxhdGZvcm06OmlzV2luZG93cygpICYmIFxzdHJsZW4oJGNvbW1hbmRbMF0pID09PSBzdHJjc3BuKCRjb21tYW5kWzBdLCAnOi9cXCcpKSB7CiRjb21tYW5kWzBdID0gc2VsZjo6Z2V0RXhlY3V0YWJsZSgkY29tbWFuZFswXSk7Cn0KCiRwcm9jZXNzID0gbmV3IFByb2Nlc3MoJGNvbW1hbmQsICRjd2QsICRlbnYsIG51bGwsIHN0YXRpYzo6Z2V0VGltZW91dCgpKTsKfQoKaWYgKCFQbGF0Zm9ybTo6aXNXaW5kb3dzKCkgJiYgJHR0eSkgewp0cnkgewokcHJvY2Vzcy0+c2V0VHR5KHRydWUpOwp9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uICRlKSB7Cgp9Cn0KCiRjYWxsYmFjayA9IGlzX2NhbGxhYmxlKCRvdXRwdXQpID8gJG91dHB1dCA6IGZ1bmN0aW9uIChzdHJpbmcgJHR5cGUsIHN0cmluZyAkYnVmZmVyKTogdm9pZCB7CiR0aGlzLT5vdXRwdXRIYW5kbGVyKCR0eXBlLCAkYnVmZmVyKTsKfTsKCiRzaWduYWxIYW5kbGVyID0gU2lnbmFsSGFuZGxlcjo6Y3JlYXRlKApbU2lnbmFsSGFuZGxlcjo6U0lHSU5ULCBTaWduYWxIYW5kbGVyOjpTSUdURVJNLCBTaWduYWxIYW5kbGVyOjpTSUdIVVBdLApmdW5jdGlvbiAoc3RyaW5nICRzaWduYWwpIHsKaWYgKCR0aGlzLT5pbyAhPT0gbnVsbCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoCidSZWNlaXZlZCAnLiRzaWduYWwuJywgYWJvcnRpbmcgd2hlbiBjaGlsZCBwcm9jZXNzIGlzIGRvbmUnLAp0cnVlLApJT0ludGVyZmFjZTo6REVCVUcKKTsKfQp9Cik7Cgp0cnkgewokcHJvY2Vzcy0+cnVuKCRjYWxsYmFjayk7CgppZiAoJHRoaXMtPmNhcHR1cmVPdXRwdXQgJiYgIWlzX2NhbGxhYmxlKCRvdXRwdXQpKSB7CiRvdXRwdXQgPSAkcHJvY2Vzcy0+Z2V0T3V0cHV0KCk7Cn0KCiR0aGlzLT5lcnJvck91dHB1dCA9ICRwcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpOwp9IGNhdGNoIChQcm9jZXNzU2lnbmFsZWRFeGNlcHRpb24gJGUpIHsKaWYgKCRzaWduYWxIYW5kbGVyLT5pc1RyaWdnZXJlZCgpKSB7Cgokc2lnbmFsSGFuZGxlci0+ZXhpdFdpdGhMYXN0U2lnbmFsKCk7Cn0KfSBmaW5hbGx5IHsKJHNpZ25hbEhhbmRsZXItPnVucmVnaXN0ZXIoKTsKfQoKcmV0dXJuICRwcm9jZXNzLT5nZXRFeGl0Q29kZSgpOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkb0V4ZWN1dGUoJGNvbW1hbmQsID9zdHJpbmcgJGN3ZCwgYm9vbCAkdHR5LCAmJG91dHB1dCA9IG51bGwpOiBpbnQKewokdGhpcy0+b3V0cHV0Q29tbWFuZFJ1bigkY29tbWFuZCwgJGN3ZCwgZmFsc2UpOwoKJHRoaXMtPmNhcHR1cmVPdXRwdXQgPSBmdW5jX251bV9hcmdzKCkgPiAzOwokdGhpcy0+ZXJyb3JPdXRwdXQgPSAnJzsKCiRlbnYgPSBudWxsOwoKJHJlcXVpcmVzR2l0RGlyRW52ID0gJHRoaXMtPnJlcXVpcmVzR2l0RGlyRW52KCRjb21tYW5kKTsKaWYgKCRjd2QgIT09IG51bGwgJiYgJHJlcXVpcmVzR2l0RGlyRW52KSB7CiRpc0JhcmVSZXBvc2l0b3J5ID0gIWlzX2RpcihzcHJpbnRmKCclcy8uZ2l0JywgcnRyaW0oJGN3ZCwgJy8nKSkpOwppZiAoJGlzQmFyZVJlcG9zaXRvcnkpIHsKJGNvbmZpZ1ZhbHVlID0gJyc7CiR0aGlzLT5ydW5Qcm9jZXNzKFsnZ2l0JywgJ2NvbmZpZycsICdzYWZlLmJhcmVSZXBvc2l0b3J5J10sICRjd2QsIFsnR0lUX0RJUicgPT4gJGN3ZF0sICR0dHksICRjb25maWdWYWx1ZSk7CiRjb25maWdWYWx1ZSA9IHRyaW0oJGNvbmZpZ1ZhbHVlKTsKaWYgKCRjb25maWdWYWx1ZSA9PT0gJ2V4cGxpY2l0JykgewokZW52ID0gWydHSVRfRElSJyA9PiAkY3dkXTsKfQp9Cn0KCnJldHVybiAkdGhpcy0+cnVuUHJvY2VzcygkY29tbWFuZCwgJGN3ZCwgJGVudiwgJHR0eSwgJG91dHB1dCk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXhlY3V0ZUFzeW5jKCRjb21tYW5kLCA/c3RyaW5nICRjd2QgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CmlmICghJHRoaXMtPmFsbG93QXN5bmMpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignWW91IG11c3QgdXNlIHRoZSBQcm9jZXNzRXhlY3V0b3IgaW5zdGFuY2Ugd2hpY2ggaXMgcGFydCBvZiBhIENvbXBvc2VyXExvb3AgaW5zdGFuY2UgdG8gYmUgYWJsZSB0byBydW4gYXN5bmMgcHJvY2Vzc2VzJyk7Cn0KCiRqb2IgPSBbCidpZCcgPT4gJHRoaXMtPmlkR2VuKyssCidzdGF0dXMnID0+IHNlbGY6OlNUQVRVU19RVUVVRUQsCidjb21tYW5kJyA9PiAkY29tbWFuZCwKJ2N3ZCcgPT4gJGN3ZCwKXTsKCiRyZXNvbHZlciA9IHN0YXRpYyBmdW5jdGlvbiAoJHJlc29sdmUsICRyZWplY3QpIHVzZSAoJiRqb2IpOiB2b2lkIHsKJGpvYlsnc3RhdHVzJ10gPSBQcm9jZXNzRXhlY3V0b3I6OlNUQVRVU19RVUVVRUQ7CiRqb2JbJ3Jlc29sdmUnXSA9ICRyZXNvbHZlOwokam9iWydyZWplY3QnXSA9ICRyZWplY3Q7Cn07CgokY2FuY2VsZXIgPSBzdGF0aWMgZnVuY3Rpb24gKCkgdXNlICgmJGpvYik6IHZvaWQgewppZiAoJGpvYlsnc3RhdHVzJ10gPT09IFByb2Nlc3NFeGVjdXRvcjo6U1RBVFVTX1FVRVVFRCkgewokam9iWydzdGF0dXMnXSA9IFByb2Nlc3NFeGVjdXRvcjo6U1RBVFVTX0FCT1JURUQ7Cn0KaWYgKCRqb2JbJ3N0YXR1cyddICE9PSBQcm9jZXNzRXhlY3V0b3I6OlNUQVRVU19TVEFSVEVEKSB7CnJldHVybjsKfQokam9iWydzdGF0dXMnXSA9IFByb2Nlc3NFeGVjdXRvcjo6U1RBVFVTX0FCT1JURUQ7CnRyeSB7CmlmIChkZWZpbmVkKCdTSUdJTlQnKSkgewokam9iWydwcm9jZXNzJ10tPnNpZ25hbChTSUdJTlQpOwp9Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKCn0KJGpvYlsncHJvY2VzcyddLT5zdG9wKDEpOwoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdBYm9ydGVkIHByb2Nlc3MnKTsKfTsKCiRwcm9taXNlID0gbmV3IFByb21pc2UoJHJlc29sdmVyLCAkY2FuY2VsZXIpOwokcHJvbWlzZSA9ICRwcm9taXNlLT50aGVuKGZ1bmN0aW9uICgpIHVzZSAoJiRqb2IpIHsKaWYgKCRqb2JbJ3Byb2Nlc3MnXS0+aXNTdWNjZXNzZnVsKCkpIHsKJGpvYlsnc3RhdHVzJ10gPSBQcm9jZXNzRXhlY3V0b3I6OlNUQVRVU19DT01QTEVURUQ7Cn0gZWxzZSB7CiRqb2JbJ3N0YXR1cyddID0gUHJvY2Vzc0V4ZWN1dG9yOjpTVEFUVVNfRkFJTEVEOwp9CgokdGhpcy0+bWFya0pvYkRvbmUoKTsKCnJldHVybiAkam9iWydwcm9jZXNzJ107Cn0sIGZ1bmN0aW9uICgkZSkgdXNlICgmJGpvYik6IHZvaWQgewokam9iWydzdGF0dXMnXSA9IFByb2Nlc3NFeGVjdXRvcjo6U1RBVFVTX0ZBSUxFRDsKCiR0aGlzLT5tYXJrSm9iRG9uZSgpOwoKdGhyb3cgJGU7Cn0pOwokdGhpcy0+am9ic1skam9iWydpZCddXSA9ICYkam9iOwoKaWYgKCR0aGlzLT5ydW5uaW5nSm9icyA8ICR0aGlzLT5tYXhKb2JzKSB7CiR0aGlzLT5zdGFydEpvYigkam9iWydpZCddKTsKfQoKcmV0dXJuICRwcm9taXNlOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gb3V0cHV0SGFuZGxlcihzdHJpbmcgJHR5cGUsIHN0cmluZyAkYnVmZmVyKTogdm9pZAp7CmlmICgkdGhpcy0+Y2FwdHVyZU91dHB1dCkgewpyZXR1cm47Cn0KCmlmIChudWxsID09PSAkdGhpcy0+aW8pIHsKZWNobyAkYnVmZmVyOwoKcmV0dXJuOwp9CgppZiAoUHJvY2Vzczo6RVJSID09PSAkdHlwZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3JSYXcoJGJ1ZmZlciwgZmFsc2UpOwp9IGVsc2UgewokdGhpcy0+aW8tPndyaXRlUmF3KCRidWZmZXIsIGZhbHNlKTsKfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIHN0YXJ0Sm9iKGludCAkaWQpOiB2b2lkCnsKJGpvYiA9ICYkdGhpcy0+am9ic1skaWRdOwppZiAoJGpvYlsnc3RhdHVzJ10gIT09IHNlbGY6OlNUQVRVU19RVUVVRUQpIHsKcmV0dXJuOwp9CgoKJGpvYlsnc3RhdHVzJ10gPSBzZWxmOjpTVEFUVVNfU1RBUlRFRDsKJHRoaXMtPnJ1bm5pbmdKb2JzKys7CgokY29tbWFuZCA9ICRqb2JbJ2NvbW1hbmQnXTsKJGN3ZCA9ICRqb2JbJ2N3ZCddOwoKJHRoaXMtPm91dHB1dENvbW1hbmRSdW4oJGNvbW1hbmQsICRjd2QsIHRydWUpOwoKdHJ5IHsKaWYgKGlzX3N0cmluZygkY29tbWFuZCkpIHsKJHByb2Nlc3MgPSBQcm9jZXNzOjpmcm9tU2hlbGxDb21tYW5kbGluZSgkY29tbWFuZCwgJGN3ZCwgbnVsbCwgbnVsbCwgc3RhdGljOjpnZXRUaW1lb3V0KCkpOwp9IGVsc2UgewokcHJvY2VzcyA9IG5ldyBQcm9jZXNzKCRjb21tYW5kLCAkY3dkLCBudWxsLCBudWxsLCBzdGF0aWM6OmdldFRpbWVvdXQoKSk7Cn0KfSBjYXRjaCAoXFRocm93YWJsZSAkZSkgewokam9iWydyZWplY3QnXSgkZSk7CgpyZXR1cm47Cn0KCiRqb2JbJ3Byb2Nlc3MnXSA9ICRwcm9jZXNzOwoKdHJ5IHsKJHByb2Nlc3MtPnN0YXJ0KCk7Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGUpIHsKJGpvYlsncmVqZWN0J10oJGUpOwoKcmV0dXJuOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRNYXhKb2JzKGludCAkbWF4Sm9icyk6IHZvaWQKewokdGhpcy0+bWF4Sm9icyA9ICRtYXhKb2JzOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVzZXRNYXhKb2JzKCk6IHZvaWQKewppZiAoaXNfbnVtZXJpYygkbWF4Sm9icyA9IFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX01BWF9QQVJBTExFTF9QUk9DRVNTRVMnKSkpIHsKJHRoaXMtPm1heEpvYnMgPSBtYXgoMSwgbWluKDUwLCAoaW50KSAkbWF4Sm9icykpOwp9IGVsc2UgewokdGhpcy0+bWF4Sm9icyA9IDEwOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3YWl0KCRpbmRleCA9IG51bGwpOiB2b2lkCnsKd2hpbGUgKHRydWUpIHsKaWYgKDAgPT09ICR0aGlzLT5jb3VudEFjdGl2ZUpvYnMoJGluZGV4KSkgewpyZXR1cm47Cn0KCnVzbGVlcCgxMDAwKTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZW5hYmxlQXN5bmMoKTogdm9pZAp7CiR0aGlzLT5hbGxvd0FzeW5jID0gdHJ1ZTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvdW50QWN0aXZlSm9icygkaW5kZXggPSBudWxsKTogaW50CnsKCmZvcmVhY2ggKCR0aGlzLT5qb2JzIGFzICRqb2IpIHsKaWYgKCRqb2JbJ3N0YXR1cyddID09PSBzZWxmOjpTVEFUVVNfU1RBUlRFRCkgewppZiAoISRqb2JbJ3Byb2Nlc3MnXS0+aXNSdW5uaW5nKCkpIHsKY2FsbF91c2VyX2Z1bmMoJGpvYlsncmVzb2x2ZSddLCAkam9iWydwcm9jZXNzJ10pOwp9Cgokam9iWydwcm9jZXNzJ10tPmNoZWNrVGltZW91dCgpOwp9CgppZiAoJHRoaXMtPnJ1bm5pbmdKb2JzIDwgJHRoaXMtPm1heEpvYnMpIHsKaWYgKCRqb2JbJ3N0YXR1cyddID09PSBzZWxmOjpTVEFUVVNfUVVFVUVEKSB7CiR0aGlzLT5zdGFydEpvYigkam9iWydpZCddKTsKfQp9Cn0KCmlmIChudWxsICE9PSAkaW5kZXgpIHsKcmV0dXJuICR0aGlzLT5qb2JzWyRpbmRleF1bJ3N0YXR1cyddIDwgc2VsZjo6U1RBVFVTX0NPTVBMRVRFRCA/IDEgOiAwOwp9CgokYWN0aXZlID0gMDsKZm9yZWFjaCAoJHRoaXMtPmpvYnMgYXMgJGpvYikgewppZiAoJGpvYlsnc3RhdHVzJ10gPCBzZWxmOjpTVEFUVVNfQ09NUExFVEVEKSB7CiRhY3RpdmUrKzsKfSBlbHNlIHsKdW5zZXQoJHRoaXMtPmpvYnNbJGpvYlsnaWQnXV0pOwp9Cn0KCnJldHVybiAkYWN0aXZlOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIG1hcmtKb2JEb25lKCk6IHZvaWQKewokdGhpcy0+cnVubmluZ0pvYnMtLTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNwbGl0TGluZXMoP3N0cmluZyAkb3V0cHV0KTogYXJyYXkKewokb3V0cHV0ID0gdHJpbSgoc3RyaW5nKSAkb3V0cHV0KTsKCnJldHVybiAkb3V0cHV0ID09PSAnJyA/IFtdIDogUHJlZzo6c3BsaXQoJ3tccj9cbn0nLCAkb3V0cHV0KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEVycm9yT3V0cHV0KCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+ZXJyb3JPdXRwdXQ7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VGltZW91dCgpOiBpbnQKewpyZXR1cm4gc3RhdGljOjokdGltZW91dDsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRUaW1lb3V0KGludCAkdGltZW91dCk6IHZvaWQKewpzdGF0aWM6OiR0aW1lb3V0ID0gJHRpbWVvdXQ7Cn0KCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGVzY2FwZSgkYXJndW1lbnQpOiBzdHJpbmcKewpyZXR1cm4gc2VsZjo6ZXNjYXBlQXJndW1lbnQoJGFyZ3VtZW50KTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBvdXRwdXRDb21tYW5kUnVuKCRjb21tYW5kLCA/c3RyaW5nICRjd2QsIGJvb2wgJGFzeW5jKTogdm9pZAp7CmlmIChudWxsID09PSAkdGhpcy0+aW8gfHwgISR0aGlzLT5pby0+aXNEZWJ1ZygpKSB7CnJldHVybjsKfQoKJGNvbW1hbmRTdHJpbmcgPSBpc19zdHJpbmcoJGNvbW1hbmQpID8gJGNvbW1hbmQgOiBpbXBsb2RlKCcgJywgYXJyYXlfbWFwKHNlbGY6OmNsYXNzLic6OmVzY2FwZScsICRjb21tYW5kKSk7CiRzYWZlQ29tbWFuZCA9IFByZWc6OnJlcGxhY2VDYWxsYmFjaygnezovLyg/UDx1c2VyPlteOi9cc10rKTooP1A8cGFzc3dvcmQ+W15AXHMvXSspQH1pJywgc3RhdGljIGZ1bmN0aW9uICgkbSk6IHN0cmluZyB7CgppZiAoUHJlZzo6aXNNYXRjaChHaXRIdWI6OkdJVEhVQl9UT0tFTl9SRUdFWCwgJG1bJ3VzZXInXSkpIHsKcmV0dXJuICc6Ly8qKio6KioqQCc7Cn0KaWYgKFByZWc6OmlzTWF0Y2goJ3teW2EtZjAtOV17MTIsfSR9JywgJG1bJ3VzZXInXSkpIHsKcmV0dXJuICc6Ly8qKio6KioqQCc7Cn0KCnJldHVybiAnOi8vJy4kbVsndXNlciddLic6KioqQCc7Cn0sICRjb21tYW5kU3RyaW5nKTsKJHNhZmVDb21tYW5kID0gUHJlZzo6cmVwbGFjZSgiey0tcGFzc3dvcmQgKC4qW15cXFxcXVwnKSB9IiwgJy0tcGFzc3dvcmQgXCcqKipcJyAnLCAkc2FmZUNvbW1hbmQpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0V4ZWN1dGluZycuKCRhc3luYyA/ICcgYXN5bmMnIDogJycpLicgY29tbWFuZCAoJy4oJGN3ZCA/OiAnQ1dEJykuJyk6ICcuJHNhZmVDb21tYW5kKTsKfQoKCgoKCgoKCgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGVzY2FwZUFyZ3VtZW50KCRhcmd1bWVudCk6IHN0cmluZwp7CmlmICgnJyA9PT0gKCRhcmd1bWVudCA9IChzdHJpbmcpICRhcmd1bWVudCkpIHsKcmV0dXJuIGVzY2FwZXNoZWxsYXJnKCRhcmd1bWVudCk7Cn0KCmlmICghUGxhdGZvcm06OmlzV2luZG93cygpKSB7CnJldHVybiAiJyIuc3RyX3JlcGxhY2UoIiciLCAiJ1xcJyciLCAkYXJndW1lbnQpLiInIjsKfQoKCgoKJGFyZ3VtZW50ID0gc3RydHIoJGFyZ3VtZW50LCBbCiJcbiIgPT4gJyAnLAoiXHV7ZmYwMn0iID0+ICciJywKIlx1ezAyYmF9IiA9PiAnIicsCiJcdXszMDFkfSIgPT4gJyInLAoiXHV7MzAxZX0iID0+ICciJywKIlx1ezAzMGV9IiA9PiAnIicsCiJcdXtmZjFhfSIgPT4gJzonLAoiXHV7MDU4OX0iID0+ICc6JywKIlx1ezIyMzZ9IiA9PiAnOicsCiJcdXtmZjBmfSIgPT4gJy8nLAoiXHV7MjA0NH0iID0+ICcvJywKIlx1ezIyMTV9IiA9PiAnLycsCiJcdXswMGI0fSIgPT4gJy8nLApdKTsKCgokcXVvdGUgPSBzdHJwYnJrKCRhcmd1bWVudCwgIiBcdCwiKSAhPT0gZmFsc2U7CiRhcmd1bWVudCA9IFByZWc6OnJlcGxhY2UoJy8oXFxcXCopIi8nLCAnJDEkMVxcIicsICRhcmd1bWVudCwgLTEsICRkcXVvdGVzKTsKJG1ldGEgPSAkZHF1b3RlcyA+IDAgfHwgUHJlZzo6aXNNYXRjaCgnLyVbXiVdKyV8IVteIV0rIS8nLCAkYXJndW1lbnQpOwoKaWYgKCEkbWV0YSAmJiAhJHF1b3RlKSB7CiRxdW90ZSA9IHN0cnBicmsoJGFyZ3VtZW50LCAnXiZ8PD4oKScpICE9PSBmYWxzZTsKfQoKaWYgKCRxdW90ZSkgewokYXJndW1lbnQgPSAnIicuUHJlZzo6cmVwbGFjZSgnLyhcXFxcKikkLycsICckMSQxJywgJGFyZ3VtZW50KS4nIic7Cn0KCmlmICgkbWV0YSkgewokYXJndW1lbnQgPSBQcmVnOjpyZXBsYWNlKCcvKFsiXiZ8PD4oKSVdKS8nLCAnXiQxJywgJGFyZ3VtZW50KTsKJGFyZ3VtZW50ID0gUHJlZzo6cmVwbGFjZSgnLyghKS8nLCAnXl4kMScsICRhcmd1bWVudCk7Cn0KCnJldHVybiAkYXJndW1lbnQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZXF1aXJlc0dpdERpckVudigkY29tbWFuZCk6IGJvb2wKewokY21kID0gIWlzX2FycmF5KCRjb21tYW5kKSA/IGV4cGxvZGUoJyAnLCAkY29tbWFuZCkgOiAkY29tbWFuZDsKaWYgKCRjbWRbMF0gIT09ICdnaXQnKSB7CnJldHVybiBmYWxzZTsKfQoKZm9yZWFjaCAoc2VsZjo6R0lUX0NNRFNfTkVFRF9HSVRfRElSIGFzICRnaXRDbWQpIHsKaWYgKGFycmF5X2ludGVyc2VjdCgkY21kLCAkZ2l0Q21kKSA9PT0gJGdpdENtZCkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldEV4ZWN1dGFibGUoc3RyaW5nICRuYW1lKTogc3RyaW5nCnsKaWYgKFxpbl9hcnJheShzdHJ0b2xvd2VyKCRuYW1lKSwgc2VsZjo6QlVJTFRJTl9DTURfQ09NTUFORFMsIHRydWUpKSB7CnJldHVybiAkbmFtZTsKfQoKaWYgKCFpc3NldChzZWxmOjokZXhlY3V0YWJsZXNbJG5hbWVdKSkgewokcGF0aCA9IChuZXcgRXhlY3V0YWJsZUZpbmRlcigpKS0+ZmluZCgkbmFtZSwgJG5hbWUpOwppZiAoJHBhdGggIT09IG51bGwpIHsKc2VsZjo6JGV4ZWN1dGFibGVzWyRuYW1lXSA9ICRwYXRoOwp9Cn0KCnJldHVybiBzZWxmOjokZXhlY3V0YWJsZXNbJG5hbWVdID8/ICRuYW1lOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ2xvc3VyZTsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcTWF4RmlsZVNpemVFeGNlZWRlZEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBcUmVzcG9uc2U7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBcUHJveHlNYW5hZ2VyOwoKCgoKCgoKY2xhc3MgUmVtb3RlRmlsZXN5c3RlbQp7Cgpwcml2YXRlICRpbzsKCnByaXZhdGUgJGNvbmZpZzsKCnByaXZhdGUgJHNjaGVtZTsKCnByaXZhdGUgJGJ5dGVzTWF4OwoKcHJpdmF0ZSAkb3JpZ2luVXJsOwoKcHJpdmF0ZSAkZmlsZVVybDsKCnByaXZhdGUgJGZpbGVOYW1lOwoKcHJpdmF0ZSAkcmV0cnkgPSBmYWxzZTsKCnByaXZhdGUgJHByb2dyZXNzOwoKcHJpdmF0ZSAkbGFzdFByb2dyZXNzOwoKcHJpdmF0ZSAkb3B0aW9ucyA9IFtdOwoKcHJpdmF0ZSAkZGlzYWJsZVRscyA9IGZhbHNlOwoKcHJpdmF0ZSAkbGFzdEhlYWRlcnM7Cgpwcml2YXRlICRzdG9yZUF1dGggPSBmYWxzZTsKCnByaXZhdGUgJGF1dGhIZWxwZXI7Cgpwcml2YXRlICRkZWdyYWRlZE1vZGUgPSBmYWxzZTsKCnByaXZhdGUgJHJlZGlyZWN0czsKCnByaXZhdGUgJG1heFJlZGlyZWN0cyA9IDIwOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBhcnJheSAkb3B0aW9ucyA9IFtdLCBib29sICRkaXNhYmxlVGxzID0gZmFsc2UsID9BdXRoSGVscGVyICRhdXRoSGVscGVyID0gbnVsbCkKewokdGhpcy0+aW8gPSAkaW87CgoKCmlmICgkZGlzYWJsZVRscyA9PT0gZmFsc2UpIHsKJHRoaXMtPm9wdGlvbnMgPSBTdHJlYW1Db250ZXh0RmFjdG9yeTo6Z2V0VGxzRGVmYXVsdHMoJG9wdGlvbnMsICRpbyk7Cn0gZWxzZSB7CiR0aGlzLT5kaXNhYmxlVGxzID0gdHJ1ZTsKfQoKCiR0aGlzLT5vcHRpb25zID0gYXJyYXlfcmVwbGFjZV9yZWN1cnNpdmUoJHRoaXMtPm9wdGlvbnMsICRvcHRpb25zKTsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7CiR0aGlzLT5hdXRoSGVscGVyID0gJGF1dGhIZWxwZXIgPz8gbmV3IEF1dGhIZWxwZXIoJGlvLCAkY29uZmlnKTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29weShzdHJpbmcgJG9yaWdpblVybCwgc3RyaW5nICRmaWxlVXJsLCBzdHJpbmcgJGZpbGVOYW1lLCBib29sICRwcm9ncmVzcyA9IHRydWUsIGFycmF5ICRvcHRpb25zID0gW10pCnsKcmV0dXJuICR0aGlzLT5nZXQoJG9yaWdpblVybCwgJGZpbGVVcmwsICRvcHRpb25zLCAkZmlsZU5hbWUsICRwcm9ncmVzcyk7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29udGVudHMoc3RyaW5nICRvcmlnaW5VcmwsIHN0cmluZyAkZmlsZVVybCwgYm9vbCAkcHJvZ3Jlc3MgPSB0cnVlLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CnJldHVybiAkdGhpcy0+Z2V0KCRvcmlnaW5VcmwsICRmaWxlVXJsLCAkb3B0aW9ucywgbnVsbCwgJHByb2dyZXNzKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3B0aW9ucygpCnsKcmV0dXJuICR0aGlzLT5vcHRpb25zOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0T3B0aW9ucyhhcnJheSAkb3B0aW9ucykKewokdGhpcy0+b3B0aW9ucyA9IGFycmF5X3JlcGxhY2VfcmVjdXJzaXZlKCR0aGlzLT5vcHRpb25zLCAkb3B0aW9ucyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVGxzRGlzYWJsZWQoKQp7CnJldHVybiAkdGhpcy0+ZGlzYWJsZVRscyA9PT0gdHJ1ZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TGFzdEhlYWRlcnMoKQp7CnJldHVybiAkdGhpcy0+bGFzdEhlYWRlcnM7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZpbmRTdGF0dXNDb2RlKGFycmF5ICRoZWFkZXJzKQp7CiR2YWx1ZSA9IG51bGw7CmZvcmVhY2ggKCRoZWFkZXJzIGFzICRoZWFkZXIpIHsKaWYgKFByZWc6OmlzTWF0Y2goJ3teSFRUUC9cUysgKFxkKyl9aScsICRoZWFkZXIsICRtYXRjaCkpIHsKCgokdmFsdWUgPSAoaW50KSAkbWF0Y2hbMV07Cn0KfQoKcmV0dXJuICR2YWx1ZTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kU3RhdHVzTWVzc2FnZShhcnJheSAkaGVhZGVycykKewokdmFsdWUgPSBudWxsOwpmb3JlYWNoICgkaGVhZGVycyBhcyAkaGVhZGVyKSB7CmlmIChQcmVnOjppc01hdGNoKCd7XkhUVFAvXFMrIFxkK31pJywgJGhlYWRlcikpIHsKCgokdmFsdWUgPSAkaGVhZGVyOwp9Cn0KCnJldHVybiAkdmFsdWU7Cn0KCgoKCgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldChzdHJpbmcgJG9yaWdpblVybCwgc3RyaW5nICRmaWxlVXJsLCBhcnJheSAkYWRkaXRpb25hbE9wdGlvbnMgPSBbXSwgP3N0cmluZyAkZmlsZU5hbWUgPSBudWxsLCBib29sICRwcm9ncmVzcyA9IHRydWUpCnsKJHRoaXMtPnNjaGVtZSA9IHBhcnNlX3VybChzdHJ0cigkZmlsZVVybCwgJ1xcJywgJy8nKSwgUEhQX1VSTF9TQ0hFTUUpOwokdGhpcy0+Ynl0ZXNNYXggPSAwOwokdGhpcy0+b3JpZ2luVXJsID0gJG9yaWdpblVybDsKJHRoaXMtPmZpbGVVcmwgPSAkZmlsZVVybDsKJHRoaXMtPmZpbGVOYW1lID0gJGZpbGVOYW1lOwokdGhpcy0+cHJvZ3Jlc3MgPSAkcHJvZ3Jlc3M7CiR0aGlzLT5sYXN0UHJvZ3Jlc3MgPSBudWxsOwokcmV0cnlBdXRoRmFpbHVyZSA9IHRydWU7CiR0aGlzLT5sYXN0SGVhZGVycyA9IFtdOwokdGhpcy0+cmVkaXJlY3RzID0gMTsgCgokdGVtcEFkZGl0aW9uYWxPcHRpb25zID0gJGFkZGl0aW9uYWxPcHRpb25zOwppZiAoaXNzZXQoJHRlbXBBZGRpdGlvbmFsT3B0aW9uc1sncmV0cnktYXV0aC1mYWlsdXJlJ10pKSB7CiRyZXRyeUF1dGhGYWlsdXJlID0gKGJvb2wpICR0ZW1wQWRkaXRpb25hbE9wdGlvbnNbJ3JldHJ5LWF1dGgtZmFpbHVyZSddOwoKdW5zZXQoJHRlbXBBZGRpdGlvbmFsT3B0aW9uc1sncmV0cnktYXV0aC1mYWlsdXJlJ10pOwp9CgokaXNSZWRpcmVjdCA9IGZhbHNlOwppZiAoaXNzZXQoJHRlbXBBZGRpdGlvbmFsT3B0aW9uc1sncmVkaXJlY3RzJ10pKSB7CiR0aGlzLT5yZWRpcmVjdHMgPSAkdGVtcEFkZGl0aW9uYWxPcHRpb25zWydyZWRpcmVjdHMnXTsKJGlzUmVkaXJlY3QgPSB0cnVlOwoKdW5zZXQoJHRlbXBBZGRpdGlvbmFsT3B0aW9uc1sncmVkaXJlY3RzJ10pOwp9Cgokb3B0aW9ucyA9ICR0aGlzLT5nZXRPcHRpb25zRm9yVXJsKCRvcmlnaW5VcmwsICR0ZW1wQWRkaXRpb25hbE9wdGlvbnMpOwp1bnNldCgkdGVtcEFkZGl0aW9uYWxPcHRpb25zKTsKCiRvcmlnRmlsZVVybCA9ICRmaWxlVXJsOwoKaWYgKGlzc2V0KCRvcHRpb25zWydwcmV2ZW50X2lwX2FjY2Vzc19jYWxsYWJsZSddKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIlJlbW90ZUZpbGVzeXN0ZW0gZG9lc24ndCBzdXBwb3J0IHRoZSAncHJldmVudF9pcF9hY2Nlc3NfY2FsbGFibGUnIGNvbmZpZy4iKTsKfQoKaWYgKGlzc2V0KCRvcHRpb25zWydnaXRsYWItdG9rZW4nXSkpIHsKJGZpbGVVcmwgLj0gKGZhbHNlID09PSBzdHJwb3MoJGZpbGVVcmwsICc/JykgPyAnPycgOiAnJicpIC4gJ2FjY2Vzc190b2tlbj0nLiRvcHRpb25zWydnaXRsYWItdG9rZW4nXTsKdW5zZXQoJG9wdGlvbnNbJ2dpdGxhYi10b2tlbiddKTsKfQoKaWYgKGlzc2V0KCRvcHRpb25zWydodHRwJ10pKSB7CiRvcHRpb25zWydodHRwJ11bJ2lnbm9yZV9lcnJvcnMnXSA9IHRydWU7Cn0KCmlmICgkdGhpcy0+ZGVncmFkZWRNb2RlICYmIHN0cnBvcygkZmlsZVVybCwgJ2h0dHA6Ly9yZXBvLnBhY2thZ2lzdC5vcmcvJykgPT09IDApIHsKCiRmaWxlVXJsID0gJ2h0dHA6Ly8nIC4gZ2V0aG9zdGJ5bmFtZSgncmVwby5wYWNrYWdpc3Qub3JnJykgLiBzdWJzdHIoJGZpbGVVcmwsIDIwKTsKJGRlZ3JhZGVkUGFja2FnaXN0ID0gdHJ1ZTsKfQoKJG1heEZpbGVTaXplID0gbnVsbDsKaWYgKGlzc2V0KCRvcHRpb25zWydtYXhfZmlsZV9zaXplJ10pKSB7CiRtYXhGaWxlU2l6ZSA9ICRvcHRpb25zWydtYXhfZmlsZV9zaXplJ107CnVuc2V0KCRvcHRpb25zWydtYXhfZmlsZV9zaXplJ10pOwp9CgokY3R4ID0gU3RyZWFtQ29udGV4dEZhY3Rvcnk6OmdldENvbnRleHQoJGZpbGVVcmwsICRvcHRpb25zLCBbJ25vdGlmaWNhdGlvbicgPT4gQ2xvc3VyZTo6ZnJvbUNhbGxhYmxlKFskdGhpcywgJ2NhbGxiYWNrR2V0J10pXSk7CgokcHJveHkgPSBQcm94eU1hbmFnZXI6OmdldEluc3RhbmNlKCktPmdldFByb3h5Rm9yUmVxdWVzdCgkZmlsZVVybCk7CiR1c2luZ1Byb3h5ID0gJHByb3h5LT5nZXRTdGF0dXMoJyB1c2luZyBwcm94eSAoJXMpJyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigoc3RycG9zKCRvcmlnRmlsZVVybCwgJ2h0dHAnKSA9PT0gMCA/ICdEb3dubG9hZGluZyAnIDogJ1JlYWRpbmcgJykgLiBVcmw6OnNhbml0aXplKCRvcmlnRmlsZVVybCkgLiAkdXNpbmdQcm94eSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKdW5zZXQoJG9yaWdGaWxlVXJsLCAkcHJveHksICR1c2luZ1Byb3h5KTsKCgppZiAoKCFQcmVnOjppc01hdGNoKCd7Xmh0dHA6Ly8ocmVwb1wuKT9wYWNrYWdpc3RcLm9yZy9wL30nLCAkZmlsZVVybCkgfHwgKGZhbHNlID09PSBzdHJwb3MoJGZpbGVVcmwsICckJykgJiYgZmFsc2UgPT09IHN0cnBvcygkZmlsZVVybCwgJyUyNCcpKSkgJiYgZW1wdHkoJGRlZ3JhZGVkUGFja2FnaXN0KSkgewokdGhpcy0+Y29uZmlnLT5wcm9oaWJpdFVybEJ5Q29uZmlnKCRmaWxlVXJsLCAkdGhpcy0+aW8pOwp9CgppZiAoJHRoaXMtPnByb2dyZXNzICYmICEkaXNSZWRpcmVjdCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIkRvd25sb2FkaW5nICg8Y29tbWVudD5jb25uZWN0aW5nLi4uPC9jb21tZW50PikiLCBmYWxzZSk7Cn0KCiRlcnJvck1lc3NhZ2UgPSAnJzsKJGVycm9yQ29kZSA9IDA7CiRyZXN1bHQgPSBmYWxzZTsKc2V0X2Vycm9yX2hhbmRsZXIoc3RhdGljIGZ1bmN0aW9uICgkY29kZSwgJG1zZykgdXNlICgmJGVycm9yTWVzc2FnZSk6IGJvb2wgewppZiAoJGVycm9yTWVzc2FnZSkgewokZXJyb3JNZXNzYWdlIC49ICJcbiI7Cn0KJGVycm9yTWVzc2FnZSAuPSBQcmVnOjpyZXBsYWNlKCd7XmZpbGVfZ2V0X2NvbnRlbnRzXCguKj9cKTogfScsICcnLCAkbXNnKTsKCnJldHVybiB0cnVlOwp9KTsKJGh0dHBfcmVzcG9uc2VfaGVhZGVyID0gW107CnRyeSB7CiRyZXN1bHQgPSAkdGhpcy0+Z2V0UmVtb3RlQ29udGVudHMoJG9yaWdpblVybCwgJGZpbGVVcmwsICRjdHgsICRodHRwX3Jlc3BvbnNlX2hlYWRlciwgJG1heEZpbGVTaXplKTsKCmlmICghZW1wdHkoJGh0dHBfcmVzcG9uc2VfaGVhZGVyWzBdKSkgewokc3RhdHVzQ29kZSA9IHNlbGY6OmZpbmRTdGF0dXNDb2RlKCRodHRwX3Jlc3BvbnNlX2hlYWRlcik7CmlmICgkc3RhdHVzQ29kZSA+PSAzMDAgJiYgUmVzcG9uc2U6OmZpbmRIZWFkZXJWYWx1ZSgkaHR0cF9yZXNwb25zZV9oZWFkZXIsICdjb250ZW50LXR5cGUnKSA9PT0gJ2FwcGxpY2F0aW9uL2pzb24nKSB7Ckh0dHBEb3dubG9hZGVyOjpvdXRwdXRXYXJuaW5ncygkdGhpcy0+aW8sICRvcmlnaW5VcmwsIGpzb25fZGVjb2RlKCRyZXN1bHQsIHRydWUpKTsKfQoKaWYgKGluX2FycmF5KCRzdGF0dXNDb2RlLCBbNDAxLCA0MDNdKSAmJiAkcmV0cnlBdXRoRmFpbHVyZSkgewokdGhpcy0+cHJvbXB0QXV0aEFuZFJldHJ5KCRzdGF0dXNDb2RlLCAkdGhpcy0+ZmluZFN0YXR1c01lc3NhZ2UoJGh0dHBfcmVzcG9uc2VfaGVhZGVyKSwgJGh0dHBfcmVzcG9uc2VfaGVhZGVyKTsKfQp9CgokY29udGVudExlbmd0aCA9ICFlbXB0eSgkaHR0cF9yZXNwb25zZV9oZWFkZXJbMF0pID8gUmVzcG9uc2U6OmZpbmRIZWFkZXJWYWx1ZSgkaHR0cF9yZXNwb25zZV9oZWFkZXIsICdjb250ZW50LWxlbmd0aCcpIDogbnVsbDsKaWYgKCRjb250ZW50TGVuZ3RoICYmIFBsYXRmb3JtOjpzdHJsZW4oJHJlc3VsdCkgPCAkY29udGVudExlbmd0aCkgewoKJGUgPSBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdDb250ZW50LUxlbmd0aCBtaXNtYXRjaCwgcmVjZWl2ZWQgJy5QbGF0Zm9ybTo6c3RybGVuKCRyZXN1bHQpLicgYnl0ZXMgb3V0IG9mIHRoZSBleHBlY3RlZCAnLiRjb250ZW50TGVuZ3RoKTsKJGUtPnNldEhlYWRlcnMoJGh0dHBfcmVzcG9uc2VfaGVhZGVyKTsKJGUtPnNldFN0YXR1c0NvZGUoc2VsZjo6ZmluZFN0YXR1c0NvZGUoJGh0dHBfcmVzcG9uc2VfaGVhZGVyKSk7CnRyeSB7CiRlLT5zZXRSZXNwb25zZSgkdGhpcy0+ZGVjb2RlUmVzdWx0KCRyZXN1bHQsICRodHRwX3Jlc3BvbnNlX2hlYWRlcikpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRkaXNjYXJkZWQpIHsKJGUtPnNldFJlc3BvbnNlKCR0aGlzLT5ub3JtYWxpemVSZXN1bHQoJHJlc3VsdCkpOwp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0NvbnRlbnQtTGVuZ3RoIG1pc21hdGNoLCByZWNlaXZlZCAnLlBsYXRmb3JtOjpzdHJsZW4oJHJlc3VsdCkuJyBvdXQgb2YgJy4kY29udGVudExlbmd0aC4nIGJ5dGVzOiAoJyAuIGJhc2U2NF9lbmNvZGUoJHJlc3VsdCkuJyknLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwoKdGhyb3cgJGU7Cn0KfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewppZiAoJGUgaW5zdGFuY2VvZiBUcmFuc3BvcnRFeGNlcHRpb24gJiYgIWVtcHR5KCRodHRwX3Jlc3BvbnNlX2hlYWRlclswXSkpIHsKJGUtPnNldEhlYWRlcnMoJGh0dHBfcmVzcG9uc2VfaGVhZGVyKTsKJGUtPnNldFN0YXR1c0NvZGUoc2VsZjo6ZmluZFN0YXR1c0NvZGUoJGh0dHBfcmVzcG9uc2VfaGVhZGVyKSk7Cn0KaWYgKCRlIGluc3RhbmNlb2YgVHJhbnNwb3J0RXhjZXB0aW9uICYmICRyZXN1bHQgIT09IGZhbHNlKSB7CiRlLT5zZXRSZXNwb25zZSgkdGhpcy0+ZGVjb2RlUmVzdWx0KCRyZXN1bHQsICRodHRwX3Jlc3BvbnNlX2hlYWRlcikpOwp9CiRyZXN1bHQgPSBmYWxzZTsKfQppZiAoJGVycm9yTWVzc2FnZSAmJiAhZmlsdGVyX3ZhcihpbmlfZ2V0KCdhbGxvd191cmxfZm9wZW4nKSwgRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4pKSB7CiRlcnJvck1lc3NhZ2UgPSAnYWxsb3dfdXJsX2ZvcGVuIG11c3QgYmUgZW5hYmxlZCBpbiBwaHAuaW5pICgnLiRlcnJvck1lc3NhZ2UuJyknOwp9CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwppZiAoaXNzZXQoJGUpICYmICEkdGhpcy0+cmV0cnkpIHsKaWYgKCEkdGhpcy0+ZGVncmFkZWRNb2RlICYmIGZhbHNlICE9PSBzdHJwb3MoJGUtPmdldE1lc3NhZ2UoKSwgJ09wZXJhdGlvbiB0aW1lZCBvdXQnKSkgewokdGhpcy0+ZGVncmFkZWRNb2RlID0gdHJ1ZTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcnKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKFsKJzxlcnJvcj4nLiRlLT5nZXRNZXNzYWdlKCkuJzwvZXJyb3I+JywKJzxlcnJvcj5SZXRyeWluZyB3aXRoIGRlZ3JhZGVkIG1vZGUsIGNoZWNrIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy9hcnRpY2xlcy90cm91Ymxlc2hvb3RpbmcubWQjZGVncmFkZWQtbW9kZSBmb3IgbW9yZSBpbmZvPC9lcnJvcj4nLApdKTsKCnJldHVybiAkdGhpcy0+Z2V0KCR0aGlzLT5vcmlnaW5VcmwsICR0aGlzLT5maWxlVXJsLCAkYWRkaXRpb25hbE9wdGlvbnMsICR0aGlzLT5maWxlTmFtZSwgJHRoaXMtPnByb2dyZXNzKTsKfQoKdGhyb3cgJGU7Cn0KCiRzdGF0dXNDb2RlID0gbnVsbDsKJGNvbnRlbnRUeXBlID0gbnVsbDsKJGxvY2F0aW9uSGVhZGVyID0gbnVsbDsKaWYgKCFlbXB0eSgkaHR0cF9yZXNwb25zZV9oZWFkZXJbMF0pKSB7CiRzdGF0dXNDb2RlID0gc2VsZjo6ZmluZFN0YXR1c0NvZGUoJGh0dHBfcmVzcG9uc2VfaGVhZGVyKTsKJGNvbnRlbnRUeXBlID0gUmVzcG9uc2U6OmZpbmRIZWFkZXJWYWx1ZSgkaHR0cF9yZXNwb25zZV9oZWFkZXIsICdjb250ZW50LXR5cGUnKTsKJGxvY2F0aW9uSGVhZGVyID0gUmVzcG9uc2U6OmZpbmRIZWFkZXJWYWx1ZSgkaHR0cF9yZXNwb25zZV9oZWFkZXIsICdsb2NhdGlvbicpOwp9CgoKaWYgKCRvcmlnaW5VcmwgPT09ICdiaXRidWNrZXQub3JnJwomJiAhJHRoaXMtPmF1dGhIZWxwZXItPmlzUHVibGljQml0QnVja2V0RG93bmxvYWQoJGZpbGVVcmwpCiYmIHN1YnN0cigkZmlsZVVybCwgLTQpID09PSAnLnppcCcKJiYgKCEkbG9jYXRpb25IZWFkZXIgfHwgc3Vic3RyKHBhcnNlX3VybCgkbG9jYXRpb25IZWFkZXIsIFBIUF9VUkxfUEFUSCksIC00KSAhPT0gJy56aXAnKQomJiAkY29udGVudFR5cGUgJiYgUHJlZzo6aXNNYXRjaCgne150ZXh0L2h0bWxcYn1pJywgJGNvbnRlbnRUeXBlKQopIHsKJHJlc3VsdCA9IGZhbHNlOwppZiAoJHJldHJ5QXV0aEZhaWx1cmUpIHsKJHRoaXMtPnByb21wdEF1dGhBbmRSZXRyeSg0MDEpOwp9Cn0KCgppZiAoJHN0YXR1c0NvZGUgPT09IDQwNAomJiBpbl9hcnJheSgkb3JpZ2luVXJsLCAkdGhpcy0+Y29uZmlnLT5nZXQoJ2dpdGxhYi1kb21haW5zJyksIHRydWUpCiYmIGZhbHNlICE9PSBzdHJwb3MoJGZpbGVVcmwsICdhcmNoaXZlLnppcCcpCikgewokcmVzdWx0ID0gZmFsc2U7CmlmICgkcmV0cnlBdXRoRmFpbHVyZSkgewokdGhpcy0+cHJvbXB0QXV0aEFuZFJldHJ5KDQwMSk7Cn0KfQoKCiRoYXNGb2xsb3dlZFJlZGlyZWN0ID0gZmFsc2U7CmlmICgkc3RhdHVzQ29kZSA+PSAzMDAgJiYgJHN0YXR1c0NvZGUgPD0gMzk5ICYmICRzdGF0dXNDb2RlICE9PSAzMDQgJiYgJHRoaXMtPnJlZGlyZWN0cyA8ICR0aGlzLT5tYXhSZWRpcmVjdHMpIHsKJGhhc0ZvbGxvd2VkUmVkaXJlY3QgPSB0cnVlOwokcmVzdWx0ID0gJHRoaXMtPmhhbmRsZVJlZGlyZWN0KCRodHRwX3Jlc3BvbnNlX2hlYWRlciwgJGFkZGl0aW9uYWxPcHRpb25zLCAkcmVzdWx0KTsKfQoKCmlmICgkc3RhdHVzQ29kZSAmJiAkc3RhdHVzQ29kZSA+PSA0MDAgJiYgJHN0YXR1c0NvZGUgPD0gNTk5KSB7CmlmICghJHRoaXMtPnJldHJ5KSB7CmlmICgkdGhpcy0+cHJvZ3Jlc3MgJiYgISRpc1JlZGlyZWN0KSB7CiR0aGlzLT5pby0+b3ZlcndyaXRlRXJyb3IoIkRvd25sb2FkaW5nICg8ZXJyb3I+ZmFpbGVkPC9lcnJvcj4pIiwgZmFsc2UpOwp9CgokZSA9IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJ1RoZSAiJy4kdGhpcy0+ZmlsZVVybC4nIiBmaWxlIGNvdWxkIG5vdCBiZSBkb3dubG9hZGVkICgnLiRodHRwX3Jlc3BvbnNlX2hlYWRlclswXS4nKScsICRzdGF0dXNDb2RlKTsKJGUtPnNldEhlYWRlcnMoJGh0dHBfcmVzcG9uc2VfaGVhZGVyKTsKJGUtPnNldFJlc3BvbnNlKCR0aGlzLT5kZWNvZGVSZXN1bHQoJHJlc3VsdCwgJGh0dHBfcmVzcG9uc2VfaGVhZGVyKSk7CiRlLT5zZXRTdGF0dXNDb2RlKCRzdGF0dXNDb2RlKTsKdGhyb3cgJGU7Cn0KJHJlc3VsdCA9IGZhbHNlOwp9CgppZiAoJHRoaXMtPnByb2dyZXNzICYmICEkdGhpcy0+cmV0cnkgJiYgISRpc1JlZGlyZWN0KSB7CiR0aGlzLT5pby0+b3ZlcndyaXRlRXJyb3IoIkRvd25sb2FkaW5nICgiLigkcmVzdWx0ID09PSBmYWxzZSA/ICc8ZXJyb3I+ZmFpbGVkPC9lcnJvcj4nIDogJzxjb21tZW50PjEwMCU8L2NvbW1lbnQ+JykuIikiLCBmYWxzZSk7Cn0KCgppZiAoJHJlc3VsdCAmJiBleHRlbnNpb25fbG9hZGVkKCd6bGliJykgJiYgc3RycG9zKCRmaWxlVXJsLCAnaHR0cCcpID09PSAwICYmICEkaGFzRm9sbG93ZWRSZWRpcmVjdCkgewp0cnkgewokcmVzdWx0ID0gJHRoaXMtPmRlY29kZVJlc3VsdCgkcmVzdWx0LCAkaHR0cF9yZXNwb25zZV9oZWFkZXIpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmlmICgkdGhpcy0+ZGVncmFkZWRNb2RlKSB7CnRocm93ICRlOwp9CgokdGhpcy0+ZGVncmFkZWRNb2RlID0gdHJ1ZTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKFsKJycsCic8ZXJyb3I+RmFpbGVkIHRvIGRlY29kZSByZXNwb25zZTogJy4kZS0+Z2V0TWVzc2FnZSgpLic8L2Vycm9yPicsCic8ZXJyb3I+UmV0cnlpbmcgd2l0aCBkZWdyYWRlZCBtb2RlLCBjaGVjayBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvYXJ0aWNsZXMvdHJvdWJsZXNob290aW5nLm1kI2RlZ3JhZGVkLW1vZGUgZm9yIG1vcmUgaW5mbzwvZXJyb3I+JywKXSk7CgpyZXR1cm4gJHRoaXMtPmdldCgkdGhpcy0+b3JpZ2luVXJsLCAkdGhpcy0+ZmlsZVVybCwgJGFkZGl0aW9uYWxPcHRpb25zLCAkdGhpcy0+ZmlsZU5hbWUsICR0aGlzLT5wcm9ncmVzcyk7Cn0KfQoKCmlmIChmYWxzZSAhPT0gJHJlc3VsdCAmJiBudWxsICE9PSAkZmlsZU5hbWUgJiYgISRpc1JlZGlyZWN0KSB7CmlmICgnJyA9PT0gJHJlc3VsdCkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCciJy4kdGhpcy0+ZmlsZVVybC4nIiBhcHBlYXJzIGJyb2tlbiwgYW5kIHJldHVybmVkIGFuIGVtcHR5IDIwMCByZXNwb25zZScpOwp9CgokZXJyb3JNZXNzYWdlID0gJyc7CnNldF9lcnJvcl9oYW5kbGVyKHN0YXRpYyBmdW5jdGlvbiAoJGNvZGUsICRtc2cpIHVzZSAoJiRlcnJvck1lc3NhZ2UpOiBib29sIHsKaWYgKCRlcnJvck1lc3NhZ2UpIHsKJGVycm9yTWVzc2FnZSAuPSAiXG4iOwp9CiRlcnJvck1lc3NhZ2UgLj0gUHJlZzo6cmVwbGFjZSgne15maWxlX3B1dF9jb250ZW50c1woLio/XCk6IH0nLCAnJywgJG1zZyk7CgpyZXR1cm4gdHJ1ZTsKfSk7CiRyZXN1bHQgPSAoYm9vbCkgZmlsZV9wdXRfY29udGVudHMoJGZpbGVOYW1lLCAkcmVzdWx0KTsKcmVzdG9yZV9lcnJvcl9oYW5kbGVyKCk7CmlmIChmYWxzZSA9PT0gJHJlc3VsdCkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdUaGUgIicuJHRoaXMtPmZpbGVVcmwuJyIgZmlsZSBjb3VsZCBub3QgYmUgd3JpdHRlbiB0byAnLiRmaWxlTmFtZS4nOiAnLiRlcnJvck1lc3NhZ2UpOwp9Cn0KCmlmICgkdGhpcy0+cmV0cnkpIHsKJHRoaXMtPnJldHJ5ID0gZmFsc2U7CgokcmVzdWx0ID0gJHRoaXMtPmdldCgkdGhpcy0+b3JpZ2luVXJsLCAkdGhpcy0+ZmlsZVVybCwgJGFkZGl0aW9uYWxPcHRpb25zLCAkdGhpcy0+ZmlsZU5hbWUsICR0aGlzLT5wcm9ncmVzcyk7CgppZiAoJHRoaXMtPnN0b3JlQXV0aCkgewokdGhpcy0+YXV0aEhlbHBlci0+c3RvcmVBdXRoKCR0aGlzLT5vcmlnaW5VcmwsICR0aGlzLT5zdG9yZUF1dGgpOwokdGhpcy0+c3RvcmVBdXRoID0gZmFsc2U7Cn0KCnJldHVybiAkcmVzdWx0Owp9CgppZiAoZmFsc2UgPT09ICRyZXN1bHQpIHsKJGUgPSBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdUaGUgIicuJHRoaXMtPmZpbGVVcmwuJyIgZmlsZSBjb3VsZCBub3QgYmUgZG93bmxvYWRlZDogJy4kZXJyb3JNZXNzYWdlLCAkZXJyb3JDb2RlKTsKaWYgKCFlbXB0eSgkaHR0cF9yZXNwb25zZV9oZWFkZXJbMF0pKSB7CiRlLT5zZXRIZWFkZXJzKCRodHRwX3Jlc3BvbnNlX2hlYWRlcik7Cn0KCmlmICghJHRoaXMtPmRlZ3JhZGVkTW9kZSAmJiBmYWxzZSAhPT0gc3RycG9zKCRlLT5nZXRNZXNzYWdlKCksICdPcGVyYXRpb24gdGltZWQgb3V0JykpIHsKJHRoaXMtPmRlZ3JhZGVkTW9kZSA9IHRydWU7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignJyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihbCic8ZXJyb3I+Jy4kZS0+Z2V0TWVzc2FnZSgpLic8L2Vycm9yPicsCic8ZXJyb3I+UmV0cnlpbmcgd2l0aCBkZWdyYWRlZCBtb2RlLCBjaGVjayBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvYXJ0aWNsZXMvdHJvdWJsZXNob290aW5nLm1kI2RlZ3JhZGVkLW1vZGUgZm9yIG1vcmUgaW5mbzwvZXJyb3I+JywKXSk7CgpyZXR1cm4gJHRoaXMtPmdldCgkdGhpcy0+b3JpZ2luVXJsLCAkdGhpcy0+ZmlsZVVybCwgJGFkZGl0aW9uYWxPcHRpb25zLCAkdGhpcy0+ZmlsZU5hbWUsICR0aGlzLT5wcm9ncmVzcyk7Cn0KCnRocm93ICRlOwp9CgppZiAoIWVtcHR5KCRodHRwX3Jlc3BvbnNlX2hlYWRlclswXSkpIHsKJHRoaXMtPmxhc3RIZWFkZXJzID0gJGh0dHBfcmVzcG9uc2VfaGVhZGVyOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRSZW1vdGVDb250ZW50cyhzdHJpbmcgJG9yaWdpblVybCwgc3RyaW5nICRmaWxlVXJsLCAkY29udGV4dCwgP2FycmF5ICYkcmVzcG9uc2VIZWFkZXJzID0gbnVsbCwgP2ludCAkbWF4RmlsZVNpemUgPSBudWxsKQp7CiRyZXN1bHQgPSBmYWxzZTsKCmlmIChcUEhQX1ZFUlNJT05fSUQgPj0gODA0MDApIHsKaHR0cF9jbGVhcl9sYXN0X3Jlc3BvbnNlX2hlYWRlcnMoKTsKfQoKdHJ5IHsKJGUgPSBudWxsOwppZiAoJG1heEZpbGVTaXplICE9PSBudWxsKSB7CiRyZXN1bHQgPSBmaWxlX2dldF9jb250ZW50cygkZmlsZVVybCwgZmFsc2UsICRjb250ZXh0LCAwLCAkbWF4RmlsZVNpemUpOwp9IGVsc2UgewoKJHJlc3VsdCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlVXJsLCBmYWxzZSwgJGNvbnRleHQpOwp9Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGUpIHsKfQoKaWYgKCRyZXN1bHQgIT09IGZhbHNlICYmICRtYXhGaWxlU2l6ZSAhPT0gbnVsbCAmJiBQbGF0Zm9ybTo6c3RybGVuKCRyZXN1bHQpID49ICRtYXhGaWxlU2l6ZSkgewp0aHJvdyBuZXcgTWF4RmlsZVNpemVFeGNlZWRlZEV4Y2VwdGlvbignTWF4aW11bSBhbGxvd2VkIGRvd25sb2FkIHNpemUgcmVhY2hlZC4gRG93bmxvYWRlZCAnIC4gUGxhdGZvcm06OnN0cmxlbigkcmVzdWx0KSAuICcgb2YgYWxsb3dlZCAnIC4gJG1heEZpbGVTaXplIC4gJyBieXRlcycpOwp9CgoKaWYgKFxQSFBfVkVSU0lPTl9JRCA+PSA4MDQwMCkgewokcmVzcG9uc2VIZWFkZXJzID0gaHR0cF9nZXRfbGFzdF9yZXNwb25zZV9oZWFkZXJzKCkgPz8gW107Cmh0dHBfY2xlYXJfbGFzdF9yZXNwb25zZV9oZWFkZXJzKCk7Cn0gZWxzZSB7CiRyZXNwb25zZUhlYWRlcnMgPSAkaHR0cF9yZXNwb25zZV9oZWFkZXIgPz8gW107Cn0KCmlmIChudWxsICE9PSAkZSkgewp0aHJvdyAkZTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNhbGxiYWNrR2V0KGludCAkbm90aWZpY2F0aW9uQ29kZSwgaW50ICRzZXZlcml0eSwgP3N0cmluZyAkbWVzc2FnZSwgaW50ICRtZXNzYWdlQ29kZSwgaW50ICRieXRlc1RyYW5zZmVycmVkLCBpbnQgJGJ5dGVzTWF4KQp7CnN3aXRjaCAoJG5vdGlmaWNhdGlvbkNvZGUpIHsKY2FzZSBTVFJFQU1fTk9USUZZX0ZBSUxVUkU6CmlmICg0MDAgPT09ICRtZXNzYWdlQ29kZSkgewoKCnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oIlRoZSAnIiAuICR0aGlzLT5maWxlVXJsIC4gIicgVVJMIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZDogIiAuICRtZXNzYWdlLCAkbWVzc2FnZUNvZGUpOwp9CmJyZWFrOwoKY2FzZSBTVFJFQU1fTk9USUZZX0ZJTEVfU0laRV9JUzoKJHRoaXMtPmJ5dGVzTWF4ID0gJGJ5dGVzTWF4OwpicmVhazsKCmNhc2UgU1RSRUFNX05PVElGWV9QUk9HUkVTUzoKaWYgKCR0aGlzLT5ieXRlc01heCA+IDAgJiYgJHRoaXMtPnByb2dyZXNzKSB7CiRwcm9ncmVzc2lvbiA9IG1pbigxMDAsIChpbnQpIHJvdW5kKCRieXRlc1RyYW5zZmVycmVkIC8gJHRoaXMtPmJ5dGVzTWF4ICogMTAwKSk7CgppZiAoKDAgPT09ICRwcm9ncmVzc2lvbiAlIDUpICYmIDEwMCAhPT0gJHByb2dyZXNzaW9uICYmICRwcm9ncmVzc2lvbiAhPT0gJHRoaXMtPmxhc3RQcm9ncmVzcykgewokdGhpcy0+bGFzdFByb2dyZXNzID0gJHByb2dyZXNzaW9uOwokdGhpcy0+aW8tPm92ZXJ3cml0ZUVycm9yKCJEb3dubG9hZGluZyAoPGNvbW1lbnQ+JHByb2dyZXNzaW9uJTwvY29tbWVudD4pIiwgZmFsc2UpOwp9Cn0KYnJlYWs7CgpkZWZhdWx0OgpicmVhazsKfQp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJvbXB0QXV0aEFuZFJldHJ5KCRodHRwU3RhdHVzLCA/c3RyaW5nICRyZWFzb24gPSBudWxsLCBhcnJheSAkaGVhZGVycyA9IFtdKQp7CiRyZXN1bHQgPSAkdGhpcy0+YXV0aEhlbHBlci0+cHJvbXB0QXV0aElmTmVlZGVkKCR0aGlzLT5maWxlVXJsLCAkdGhpcy0+b3JpZ2luVXJsLCAkaHR0cFN0YXR1cywgJHJlYXNvbiwgJGhlYWRlcnMsIDEgKTsKCiR0aGlzLT5zdG9yZUF1dGggPSAkcmVzdWx0WydzdG9yZUF1dGgnXTsKJHRoaXMtPnJldHJ5ID0gJHJlc3VsdFsncmV0cnknXTsKCmlmICgkdGhpcy0+cmV0cnkpIHsKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignUkVUUlknKTsKfQp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRPcHRpb25zRm9yVXJsKHN0cmluZyAkb3JpZ2luVXJsLCBhcnJheSAkYWRkaXRpb25hbE9wdGlvbnMpCnsKJHRsc09wdGlvbnMgPSBbXTsKJGhlYWRlcnMgPSBbXTsKCmlmIChleHRlbnNpb25fbG9hZGVkKCd6bGliJykpIHsKJGhlYWRlcnNbXSA9ICdBY2NlcHQtRW5jb2Rpbmc6IGd6aXAnOwp9Cgokb3B0aW9ucyA9IGFycmF5X3JlcGxhY2VfcmVjdXJzaXZlKCR0aGlzLT5vcHRpb25zLCAkdGxzT3B0aW9ucywgJGFkZGl0aW9uYWxPcHRpb25zKTsKaWYgKCEkdGhpcy0+ZGVncmFkZWRNb2RlKSB7CgoKJG9wdGlvbnNbJ2h0dHAnXVsncHJvdG9jb2xfdmVyc2lvbiddID0gMS4xOwokaGVhZGVyc1tdID0gJ0Nvbm5lY3Rpb246IGNsb3NlJzsKfQoKaWYgKGlzc2V0KCRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddKSAmJiAhaXNfYXJyYXkoJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pKSB7CiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddID0gZXhwbG9kZSgiXHJcbiIsIHRyaW0oJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10sICJcclxuIikpOwp9CiRvcHRpb25zID0gJHRoaXMtPmF1dGhIZWxwZXItPmFkZEF1dGhlbnRpY2F0aW9uT3B0aW9ucygkb3B0aW9ucywgJG9yaWdpblVybCwgJHRoaXMtPmZpbGVVcmwpOwoKJG9wdGlvbnNbJ2h0dHAnXVsnZm9sbG93X2xvY2F0aW9uJ10gPSAwOwoKZm9yZWFjaCAoJGhlYWRlcnMgYXMgJGhlYWRlcikgewokb3B0aW9uc1snaHR0cCddWydoZWFkZXInXVtdID0gJGhlYWRlcjsKfQoKcmV0dXJuICRvcHRpb25zOwp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBoYW5kbGVSZWRpcmVjdChhcnJheSAkcmVzcG9uc2VIZWFkZXJzLCBhcnJheSAkYWRkaXRpb25hbE9wdGlvbnMsICRyZXN1bHQpCnsKaWYgKCRsb2NhdGlvbkhlYWRlciA9IFJlc3BvbnNlOjpmaW5kSGVhZGVyVmFsdWUoJHJlc3BvbnNlSGVhZGVycywgJ2xvY2F0aW9uJykpIHsKaWYgKHBhcnNlX3VybCgkbG9jYXRpb25IZWFkZXIsIFBIUF9VUkxfU0NIRU1FKSkgewoKJHRhcmdldFVybCA9ICRsb2NhdGlvbkhlYWRlcjsKfSBlbHNlaWYgKHBhcnNlX3VybCgkbG9jYXRpb25IZWFkZXIsIFBIUF9VUkxfSE9TVCkpIHsKCiR0YXJnZXRVcmwgPSAkdGhpcy0+c2NoZW1lLic6Jy4kbG9jYXRpb25IZWFkZXI7Cn0gZWxzZWlmICgnLycgPT09ICRsb2NhdGlvbkhlYWRlclswXSkgewoKJHVybEhvc3QgPSBwYXJzZV91cmwoJHRoaXMtPmZpbGVVcmwsIFBIUF9VUkxfSE9TVCk7CgoKJHRhcmdldFVybCA9IFByZWc6OnJlcGxhY2UoJ3teKC4rKD86Ly98QCknLnByZWdfcXVvdGUoJHVybEhvc3QpLicoPzo6XGQrKT8pKD86Wy9cP10uKik/JH0nLCAnXDEnLiRsb2NhdGlvbkhlYWRlciwgJHRoaXMtPmZpbGVVcmwpOwp9IGVsc2UgewoKCiR0YXJnZXRVcmwgPSBQcmVnOjpyZXBsYWNlKCd7XiguKy8pW14vP10qKD86XD8uKik/JH0nLCAnXDEnLiRsb2NhdGlvbkhlYWRlciwgJHRoaXMtPmZpbGVVcmwpOwp9Cn0KCmlmICghZW1wdHkoJHRhcmdldFVybCkpIHsKJHRoaXMtPnJlZGlyZWN0cysrOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcnLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignRm9sbG93aW5nIHJlZGlyZWN0ICgldSkgJXMnLCAkdGhpcy0+cmVkaXJlY3RzLCBVcmw6OnNhbml0aXplKCR0YXJnZXRVcmwpKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKCiRhZGRpdGlvbmFsT3B0aW9uc1sncmVkaXJlY3RzJ10gPSAkdGhpcy0+cmVkaXJlY3RzOwoKcmV0dXJuICR0aGlzLT5nZXQocGFyc2VfdXJsKCR0YXJnZXRVcmwsIFBIUF9VUkxfSE9TVCksICR0YXJnZXRVcmwsICRhZGRpdGlvbmFsT3B0aW9ucywgJHRoaXMtPmZpbGVOYW1lLCAkdGhpcy0+cHJvZ3Jlc3MpOwp9CgppZiAoISR0aGlzLT5yZXRyeSkgewokZSA9IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJ1RoZSAiJy4kdGhpcy0+ZmlsZVVybC4nIiBmaWxlIGNvdWxkIG5vdCBiZSBkb3dubG9hZGVkLCBnb3QgcmVkaXJlY3Qgd2l0aG91dCBMb2NhdGlvbiAoJy4kcmVzcG9uc2VIZWFkZXJzWzBdLicpJyk7CiRlLT5zZXRIZWFkZXJzKCRyZXNwb25zZUhlYWRlcnMpOwokZS0+c2V0UmVzcG9uc2UoJHRoaXMtPmRlY29kZVJlc3VsdCgkcmVzdWx0LCAkcmVzcG9uc2VIZWFkZXJzKSk7Cgp0aHJvdyAkZTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkZWNvZGVSZXN1bHQoJHJlc3VsdCwgYXJyYXkgJHJlc3BvbnNlSGVhZGVycyk6ID9zdHJpbmcKewoKaWYgKCRyZXN1bHQgJiYgZXh0ZW5zaW9uX2xvYWRlZCgnemxpYicpKSB7CiRjb250ZW50RW5jb2RpbmcgPSBSZXNwb25zZTo6ZmluZEhlYWRlclZhbHVlKCRyZXNwb25zZUhlYWRlcnMsICdjb250ZW50LWVuY29kaW5nJyk7CiRkZWNvZGUgPSAkY29udGVudEVuY29kaW5nICYmICdnemlwJyA9PT0gc3RydG9sb3dlcigkY29udGVudEVuY29kaW5nKTsKCmlmICgkZGVjb2RlKSB7CiRyZXN1bHQgPSB6bGliX2RlY29kZSgkcmVzdWx0KTsKCmlmICgkcmVzdWx0ID09PSBmYWxzZSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdGYWlsZWQgdG8gZGVjb2RlIHpsaWIgc3RyZWFtJyk7Cn0KfQp9CgpyZXR1cm4gJHRoaXMtPm5vcm1hbGl6ZVJlc3VsdCgkcmVzdWx0KTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBub3JtYWxpemVSZXN1bHQoJHJlc3VsdCk6ID9zdHJpbmcKewppZiAoJHJlc3VsdCA9PT0gZmFsc2UpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiAkcmVzdWx0Owp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7CgoKCgoKCmNsYXNzIFNpbGVuY2VyCnsKCgoKcHJpdmF0ZSBzdGF0aWMgJHN0YWNrID0gW107CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN1cHByZXNzKD9pbnQgJG1hc2sgPSBudWxsKTogaW50CnsKaWYgKCFpc3NldCgkbWFzaykpIHsKJG1hc2sgPSBFX1dBUk5JTkcgfCBFX05PVElDRSB8IEVfVVNFUl9XQVJOSU5HIHwgRV9VU0VSX05PVElDRSB8IEVfREVQUkVDQVRFRCB8IEVfVVNFUl9ERVBSRUNBVEVEOwp9CiRvbGQgPSBlcnJvcl9yZXBvcnRpbmcoKTsKc2VsZjo6JHN0YWNrW10gPSAkb2xkOwplcnJvcl9yZXBvcnRpbmcoJG9sZCAmIH4kbWFzayk7CgpyZXR1cm4gJG9sZDsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXN0b3JlKCk6IHZvaWQKewppZiAoIWVtcHR5KHNlbGY6OiRzdGFjaykpIHsKZXJyb3JfcmVwb3J0aW5nKGFycmF5X3BvcChzZWxmOjokc3RhY2spKTsKfQp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2FsbChjYWxsYWJsZSAkY2FsbGFibGUsIC4uLiRwYXJhbWV0ZXJzKQp7CnRyeSB7CnNlbGY6OnN1cHByZXNzKCk7CiRyZXN1bHQgPSAkY2FsbGFibGUoLi4uJHBhcmFtZXRlcnMpOwpzZWxmOjpyZXN0b3JlKCk7CgpyZXR1cm4gJHJlc3VsdDsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewoKc2VsZjo6cmVzdG9yZSgpOwp0aHJvdyAkZTsKfQp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxDYUJ1bmRsZVxDYUJ1bmRsZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBcUHJveHlNYW5hZ2VyOwp1c2UgUHNyXExvZ1xMb2dnZXJJbnRlcmZhY2U7CgoKCgoKCgpmaW5hbCBjbGFzcyBTdHJlYW1Db250ZXh0RmFjdG9yeQp7CgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldENvbnRleHQoc3RyaW5nICR1cmwsIGFycmF5ICRkZWZhdWx0T3B0aW9ucyA9IFtdLCBhcnJheSAkZGVmYXVsdFBhcmFtcyA9IFtdKQp7CiRvcHRpb25zID0gWydodHRwJyA9PiBbCgonZm9sbG93X2xvY2F0aW9uJyA9PiAxLAonbWF4X3JlZGlyZWN0cycgPT4gMjAsCl1dOwoKJG9wdGlvbnMgPSBhcnJheV9yZXBsYWNlX3JlY3Vyc2l2ZSgkb3B0aW9ucywgc2VsZjo6aW5pdE9wdGlvbnMoJHVybCwgJGRlZmF1bHRPcHRpb25zKSk7CnVuc2V0KCRkZWZhdWx0T3B0aW9uc1snaHR0cCddWydoZWFkZXInXSk7CiRvcHRpb25zID0gYXJyYXlfcmVwbGFjZV9yZWN1cnNpdmUoJG9wdGlvbnMsICRkZWZhdWx0T3B0aW9ucyk7CgppZiAoaXNzZXQoJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pKSB7CiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddID0gc2VsZjo6Zml4SHR0cEhlYWRlckZpZWxkKCRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddKTsKfQoKcmV0dXJuIHN0cmVhbV9jb250ZXh0X2NyZWF0ZSgkb3B0aW9ucywgJGRlZmF1bHRQYXJhbXMpOwp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpbml0T3B0aW9ucyhzdHJpbmcgJHVybCwgYXJyYXkgJG9wdGlvbnMsIGJvb2wgJGZvckN1cmwgPSBmYWxzZSk6IGFycmF5CnsKCmlmICghaXNzZXQoJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pKSB7CiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddID0gW107Cn0KaWYgKGlzX3N0cmluZygkb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSkpIHsKJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10gPSBleHBsb2RlKCJcclxuIiwgJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pOwp9CgoKaWYgKCEkZm9yQ3VybCkgewokcHJveHkgPSBQcm94eU1hbmFnZXI6OmdldEluc3RhbmNlKCktPmdldFByb3h5Rm9yUmVxdWVzdCgkdXJsKTsKJHByb3h5T3B0aW9ucyA9ICRwcm94eS0+Z2V0Q29udGV4dE9wdGlvbnMoKTsKaWYgKCRwcm94eU9wdGlvbnMgIT09IG51bGwpIHsKJGlzSHR0cHNSZXF1ZXN0ID0gMCA9PT0gc3RycG9zKCR1cmwsICdodHRwczovLycpOwoKaWYgKCRwcm94eS0+aXNTZWN1cmUoKSkgewppZiAoIWV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdZb3UgbXVzdCBlbmFibGUgdGhlIG9wZW5zc2wgZXh0ZW5zaW9uIHRvIHVzZSBhIHNlY3VyZSBwcm94eS4nKTsKfQppZiAoJGlzSHR0cHNSZXF1ZXN0KSB7CnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJ1lvdSBtdXN0IGVuYWJsZSB0aGUgY3VybCBleHRlbnNpb24gdG8gbWFrZSBodHRwcyByZXF1ZXN0cyB0aHJvdWdoIGEgc2VjdXJlIHByb3h5LicpOwp9Cn0gZWxzZWlmICgkaXNIdHRwc1JlcXVlc3QgJiYgIWV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdZb3UgbXVzdCBlbmFibGUgdGhlIG9wZW5zc2wgZXh0ZW5zaW9uIHRvIG1ha2UgaHR0cHMgcmVxdWVzdHMgdGhyb3VnaCBhIHByb3h5LicpOwp9CgoKaWYgKGlzc2V0KCRwcm94eU9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pKSB7CiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddW10gPSAkcHJveHlPcHRpb25zWydodHRwJ11bJ2hlYWRlciddOwp1bnNldCgkcHJveHlPcHRpb25zWydodHRwJ11bJ2hlYWRlciddKTsKfQokb3B0aW9ucyA9IGFycmF5X3JlcGxhY2VfcmVjdXJzaXZlKCRvcHRpb25zLCAkcHJveHlPcHRpb25zKTsKfQp9CgppZiAoZGVmaW5lZCgnSEhWTV9WRVJTSU9OJykpIHsKJHBocFZlcnNpb24gPSAnSEhWTSAnIC4gSEhWTV9WRVJTSU9OOwp9IGVsc2UgewokcGhwVmVyc2lvbiA9ICdQSFAgJyAuIFBIUF9NQUpPUl9WRVJTSU9OIC4gJy4nIC4gUEhQX01JTk9SX1ZFUlNJT04gLiAnLicgLiBQSFBfUkVMRUFTRV9WRVJTSU9OOwp9CgppZiAoJGZvckN1cmwpIHsKJGN1cmwgPSBjdXJsX3ZlcnNpb24oKTsKJGh0dHBWZXJzaW9uID0gJ2NVUkwgJy4kY3VybFsndmVyc2lvbiddOwp9IGVsc2UgewokaHR0cFZlcnNpb24gPSAnc3RyZWFtcyc7Cn0KCmlmICghaXNzZXQoJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pIHx8IGZhbHNlID09PSBzdHJpcG9zKGltcGxvZGUoJycsICRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddKSwgJ3VzZXItYWdlbnQnKSkgewokcGxhdGZvcm1QaHBWZXJzaW9uID0gUGxhdGZvcm1SZXBvc2l0b3J5OjpnZXRQbGF0Zm9ybVBocFZlcnNpb24oKTsKJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ11bXSA9IHNwcmludGYoCidVc2VyLUFnZW50OiBDb21wb3Nlci8lcyAoJXM7ICVzOyAlczsgJXMlcyVzKScsCkNvbXBvc2VyOjpnZXRWZXJzaW9uKCksCmZ1bmN0aW9uX2V4aXN0cygncGhwX3VuYW1lJykgPyBwaHBfdW5hbWUoJ3MnKSA6ICdVbmtub3duJywKZnVuY3Rpb25fZXhpc3RzKCdwaHBfdW5hbWUnKSA/IHBocF91bmFtZSgncicpIDogJ1Vua25vd24nLAokcGhwVmVyc2lvbiwKJGh0dHBWZXJzaW9uLAokcGxhdGZvcm1QaHBWZXJzaW9uID8gJzsgUGxhdGZvcm0tUEhQICcuJHBsYXRmb3JtUGhwVmVyc2lvbiA6ICcnLApQbGF0Zm9ybTo6Z2V0RW52KCdDSScpID8gJzsgQ0knIDogJycKKTsKfQoKcmV0dXJuICRvcHRpb25zOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VGxzRGVmYXVsdHMoYXJyYXkgJG9wdGlvbnMsID9Mb2dnZXJJbnRlcmZhY2UgJGxvZ2dlciA9IG51bGwpOiBhcnJheQp7CiRjaXBoZXJzID0gaW1wbG9kZSgnOicsIFsKJ0VDREhFLVJTQS1BRVMxMjgtR0NNLVNIQTI1NicsCidFQ0RIRS1FQ0RTQS1BRVMxMjgtR0NNLVNIQTI1NicsCidFQ0RIRS1SU0EtQUVTMjU2LUdDTS1TSEEzODQnLAonRUNESEUtRUNEU0EtQUVTMjU2LUdDTS1TSEEzODQnLAonREhFLVJTQS1BRVMxMjgtR0NNLVNIQTI1NicsCidESEUtRFNTLUFFUzEyOC1HQ00tU0hBMjU2JywKJ2tFREgrQUVTR0NNJywKJ0VDREhFLVJTQS1BRVMxMjgtU0hBMjU2JywKJ0VDREhFLUVDRFNBLUFFUzEyOC1TSEEyNTYnLAonRUNESEUtUlNBLUFFUzEyOC1TSEEnLAonRUNESEUtRUNEU0EtQUVTMTI4LVNIQScsCidFQ0RIRS1SU0EtQUVTMjU2LVNIQTM4NCcsCidFQ0RIRS1FQ0RTQS1BRVMyNTYtU0hBMzg0JywKJ0VDREhFLVJTQS1BRVMyNTYtU0hBJywKJ0VDREhFLUVDRFNBLUFFUzI1Ni1TSEEnLAonREhFLVJTQS1BRVMxMjgtU0hBMjU2JywKJ0RIRS1SU0EtQUVTMTI4LVNIQScsCidESEUtRFNTLUFFUzEyOC1TSEEyNTYnLAonREhFLVJTQS1BRVMyNTYtU0hBMjU2JywKJ0RIRS1EU1MtQUVTMjU2LVNIQScsCidESEUtUlNBLUFFUzI1Ni1TSEEnLAonQUVTMTI4LUdDTS1TSEEyNTYnLAonQUVTMjU2LUdDTS1TSEEzODQnLAonQUVTMTI4LVNIQTI1NicsCidBRVMyNTYtU0hBMjU2JywKJ0FFUzEyOC1TSEEnLAonQUVTMjU2LVNIQScsCidBRVMnLAonQ0FNRUxMSUEnLAonIWFOVUxMJywKJyFlTlVMTCcsCichRVhQT1JUJywKJyFERVMnLAonITNERVMnLAonIVJDNCcsCichTUQ1JywKJyFQU0snLAonIWFFQ0RIJywKJyFFREgtRFNTLURFUy1DQkMzLVNIQScsCichRURILVJTQS1ERVMtQ0JDMy1TSEEnLAonIUtSQjUtREVTLUNCQzMtU0hBJywKXSk7CgoKCgoKCgokZGVmYXVsdHMgPSBbCidzc2wnID0+IFsKJ2NpcGhlcnMnID0+ICRjaXBoZXJzLAondmVyaWZ5X3BlZXInID0+IHRydWUsCid2ZXJpZnlfZGVwdGgnID0+IDcsCidTTklfZW5hYmxlZCcgPT4gdHJ1ZSwKJ2NhcHR1cmVfcGVlcl9jZXJ0JyA9PiB0cnVlLApdLApdOwoKaWYgKGlzc2V0KCRvcHRpb25zWydzc2wnXSkpIHsKJGRlZmF1bHRzWydzc2wnXSA9IGFycmF5X3JlcGxhY2VfcmVjdXJzaXZlKCRkZWZhdWx0c1snc3NsJ10sICRvcHRpb25zWydzc2wnXSk7Cn0KCgoKCgppZiAoIWlzc2V0KCRkZWZhdWx0c1snc3NsJ11bJ2NhZmlsZSddKSAmJiAhaXNzZXQoJGRlZmF1bHRzWydzc2wnXVsnY2FwYXRoJ10pKSB7CiRyZXN1bHQgPSBDYUJ1bmRsZTo6Z2V0U3lzdGVtQ2FSb290QnVuZGxlUGF0aCgkbG9nZ2VyKTsKCmlmIChpc19kaXIoJHJlc3VsdCkpIHsKJGRlZmF1bHRzWydzc2wnXVsnY2FwYXRoJ10gPSAkcmVzdWx0Owp9IGVsc2UgewokZGVmYXVsdHNbJ3NzbCddWydjYWZpbGUnXSA9ICRyZXN1bHQ7Cn0KfQoKaWYgKGlzc2V0KCRkZWZhdWx0c1snc3NsJ11bJ2NhZmlsZSddKSAmJiAoIUZpbGVzeXN0ZW06OmlzUmVhZGFibGUoJGRlZmF1bHRzWydzc2wnXVsnY2FmaWxlJ10pIHx8ICFDYUJ1bmRsZTo6dmFsaWRhdGVDYUZpbGUoJGRlZmF1bHRzWydzc2wnXVsnY2FmaWxlJ10sICRsb2dnZXIpKSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdUaGUgY29uZmlndXJlZCBjYWZpbGUgd2FzIG5vdCB2YWxpZCBvciBjb3VsZCBub3QgYmUgcmVhZC4nKTsKfQoKaWYgKGlzc2V0KCRkZWZhdWx0c1snc3NsJ11bJ2NhcGF0aCddKSAmJiAoIWlzX2RpcigkZGVmYXVsdHNbJ3NzbCddWydjYXBhdGgnXSkgfHwgIUZpbGVzeXN0ZW06OmlzUmVhZGFibGUoJGRlZmF1bHRzWydzc2wnXVsnY2FwYXRoJ10pKSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdUaGUgY29uZmlndXJlZCBjYXBhdGggd2FzIG5vdCB2YWxpZCBvciBjb3VsZCBub3QgYmUgcmVhZC4nKTsKfQoKCgoKJGRlZmF1bHRzWydzc2wnXVsnZGlzYWJsZV9jb21wcmVzc2lvbiddID0gdHJ1ZTsKCnJldHVybiAkZGVmYXVsdHM7Cn0KCgoKCgoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBmaXhIdHRwSGVhZGVyRmllbGQoJGhlYWRlcik6IGFycmF5CnsKaWYgKCFpc19hcnJheSgkaGVhZGVyKSkgewokaGVhZGVyID0gZXhwbG9kZSgiXHJcbiIsICRoZWFkZXIpOwp9CnVhc29ydCgkaGVhZGVyLCBzdGF0aWMgZnVuY3Rpb24gKCRlbCk6IGludCB7CnJldHVybiBzdHJpcG9zKCRlbCwgJ2NvbnRlbnQtdHlwZScpID09PSAwID8gMSA6IC0xOwp9KTsKCnJldHVybiAkaGVhZGVyOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgoKY2xhc3MgU3ZuCnsKcHJpdmF0ZSBjb25zdCBNQVhfUVRZX0FVVEhfVFJJRVMgPSA1OwoKCgoKcHJvdGVjdGVkICRjcmVkZW50aWFsczsKCgoKCnByb3RlY3RlZCAkaGFzQXV0aDsKCgoKCnByb3RlY3RlZCAkaW87CgoKCgpwcm90ZWN0ZWQgJHVybDsKCgoKCnByb3RlY3RlZCAkY2FjaGVDcmVkZW50aWFscyA9IHRydWU7CgoKCgpwcm90ZWN0ZWQgJHByb2Nlc3M7CgoKCgpwcm90ZWN0ZWQgJHF0eUF1dGhUcmllcyA9IDA7CgoKCgpwcm90ZWN0ZWQgJGNvbmZpZzsKCgoKCnByaXZhdGUgc3RhdGljICR2ZXJzaW9uOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkdXJsLCBJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCA/UHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzID0gbnVsbCkKewokdGhpcy0+dXJsID0gJHVybDsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKJHRoaXMtPnByb2Nlc3MgPSAkcHJvY2VzcyA/OiBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2xlYW5FbnYoKTogdm9pZAp7CgpQbGF0Zm9ybTo6Y2xlYXJFbnYoJ0RZTERfTElCUkFSWV9QQVRIJyk7Cn0KCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBleGVjdXRlKGFycmF5ICRjb21tYW5kLCBzdHJpbmcgJHVybCwgP3N0cmluZyAkY3dkID0gbnVsbCwgP3N0cmluZyAkcGF0aCA9IG51bGwsIGJvb2wgJHZlcmJvc2UgPSBmYWxzZSk6IHN0cmluZwp7CgokdGhpcy0+Y29uZmlnLT5wcm9oaWJpdFVybEJ5Q29uZmlnKCR1cmwsICR0aGlzLT5pbyk7CgpyZXR1cm4gJHRoaXMtPmV4ZWN1dGVXaXRoQXV0aFJldHJ5KCRjb21tYW5kLCAkY3dkLCAkdXJsLCAkcGF0aCwgJHZlcmJvc2UpOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBleGVjdXRlTG9jYWwoYXJyYXkgJGNvbW1hbmQsIHN0cmluZyAkcGF0aCwgP3N0cmluZyAkY3dkID0gbnVsbCwgYm9vbCAkdmVyYm9zZSA9IGZhbHNlKTogc3RyaW5nCnsKCnJldHVybiAkdGhpcy0+ZXhlY3V0ZVdpdGhBdXRoUmV0cnkoJGNvbW1hbmQsICRjd2QsICcnLCAkcGF0aCwgJHZlcmJvc2UpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGV4ZWN1dGVXaXRoQXV0aFJldHJ5KGFycmF5ICRzdm5Db21tYW5kLCA/c3RyaW5nICRjd2QsIHN0cmluZyAkdXJsLCA/c3RyaW5nICRwYXRoLCBib29sICR2ZXJib3NlKTogP3N0cmluZwp7CgokY29tbWFuZCA9ICR0aGlzLT5nZXRDb21tYW5kKCRzdm5Db21tYW5kLCAkdXJsLCAkcGF0aCk7Cgokb3V0cHV0ID0gbnVsbDsKJGlvID0gJHRoaXMtPmlvOwokaGFuZGxlciA9IHN0YXRpYyBmdW5jdGlvbiAoJHR5cGUsICRidWZmZXIpIHVzZSAoJiRvdXRwdXQsICRpbywgJHZlcmJvc2UpIHsKaWYgKCR0eXBlICE9PSAnb3V0JykgewpyZXR1cm4gbnVsbDsKfQppZiAoc3RycG9zKCRidWZmZXIsICdSZWRpcmVjdGluZyB0byBVUkwgJykgPT09IDApIHsKcmV0dXJuIG51bGw7Cn0KJG91dHB1dCAuPSAkYnVmZmVyOwppZiAoJHZlcmJvc2UpIHsKJGlvLT53cml0ZUVycm9yKCRidWZmZXIsIGZhbHNlKTsKfQp9Owokc3RhdHVzID0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRoYW5kbGVyLCAkY3dkKTsKaWYgKDAgPT09ICRzdGF0dXMpIHsKcmV0dXJuICRvdXRwdXQ7Cn0KCiRlcnJvck91dHB1dCA9ICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpOwokZnVsbE91dHB1dCA9IHRyaW0oaW1wbG9kZSgiXG4iLCBbJG91dHB1dCwgJGVycm9yT3V0cHV0XSkpOwoKCmlmIChmYWxzZSA9PT0gc3RyaXBvcygkZnVsbE91dHB1dCwgJ0NvdWxkIG5vdCBhdXRoZW50aWNhdGUgdG8gc2VydmVyOicpCiYmIGZhbHNlID09PSBzdHJpcG9zKCRmdWxsT3V0cHV0LCAnYXV0aG9yaXphdGlvbiBmYWlsZWQnKQomJiBmYWxzZSA9PT0gc3RyaXBvcygkZnVsbE91dHB1dCwgJ3N2bjogRTE3MDAwMTonKQomJiBmYWxzZSA9PT0gc3RyaXBvcygkZnVsbE91dHB1dCwgJ3N2bjogRTIxNTAwNDonKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJGZ1bGxPdXRwdXQpOwp9CgppZiAoISR0aGlzLT5oYXNBdXRoKCkpIHsKJHRoaXMtPmRvQXV0aERhbmNlKCk7Cn0KCgppZiAoJHRoaXMtPnF0eUF1dGhUcmllcysrIDwgc2VsZjo6TUFYX1FUWV9BVVRIX1RSSUVTKSB7CgpyZXR1cm4gJHRoaXMtPmV4ZWN1dGVXaXRoQXV0aFJldHJ5KCRzdm5Db21tYW5kLCAkY3dkLCAkdXJsLCAkcGF0aCwgJHZlcmJvc2UpOwp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCid3cm9uZyBjcmVkZW50aWFscyBwcm92aWRlZCAoJy4kZnVsbE91dHB1dC4nKScKKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldENhY2hlQ3JlZGVudGlhbHMoYm9vbCAkY2FjaGVDcmVkZW50aWFscyk6IHZvaWQKewokdGhpcy0+Y2FjaGVDcmVkZW50aWFscyA9ICRjYWNoZUNyZWRlbnRpYWxzOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb0F1dGhEYW5jZSgpOiBTdm4KewoKaWYgKCEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCidjYW4gbm90IGFzayBmb3IgYXV0aGVudGljYXRpb24gaW4gbm9uIGludGVyYWN0aXZlIG1vZGUnCik7Cn0KCiR0aGlzLT5pby0+d3JpdGVFcnJvcigiVGhlIFN1YnZlcnNpb24gc2VydmVyICh7JHRoaXMtPnVybH0pIHJlcXVlc3RlZCBjcmVkZW50aWFsczoiKTsKCiR0aGlzLT5oYXNBdXRoID0gdHJ1ZTsKJHRoaXMtPmNyZWRlbnRpYWxzID0gWwondXNlcm5hbWUnID0+IChzdHJpbmcpICR0aGlzLT5pby0+YXNrKCJVc2VybmFtZTogIiwgJycpLAoncGFzc3dvcmQnID0+IChzdHJpbmcpICR0aGlzLT5pby0+YXNrQW5kSGlkZUFuc3dlcigiUGFzc3dvcmQ6ICIpLApdOwoKJHRoaXMtPmNhY2hlQ3JlZGVudGlhbHMgPSAkdGhpcy0+aW8tPmFza0NvbmZpcm1hdGlvbigiU2hvdWxkIFN1YnZlcnNpb24gY2FjaGUgdGhlc2UgY3JlZGVudGlhbHM/ICh5ZXMvbm8pICIpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Q29tbWFuZChhcnJheSAkY21kLCBzdHJpbmcgJHVybCwgP3N0cmluZyAkcGF0aCA9IG51bGwpOiBhcnJheQp7CiRjbWQgPSBhcnJheV9tZXJnZSgKJGNtZCwKWyctLW5vbi1pbnRlcmFjdGl2ZSddLAokdGhpcy0+Z2V0Q3JlZGVudGlhbEFyZ3MoKSwKWyctLScsICR1cmxdCik7CgppZiAoJHBhdGggIT09IG51bGwpIHsKJGNtZFtdID0gJHBhdGg7Cn0KCnJldHVybiAkY21kOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldENyZWRlbnRpYWxBcmdzKCk6IGFycmF5CnsKaWYgKCEkdGhpcy0+aGFzQXV0aCgpKSB7CnJldHVybiBbXTsKfQoKcmV0dXJuIGFycmF5X21lcmdlKAokdGhpcy0+Z2V0QXV0aENhY2hlQXJncygpLApbJy0tdXNlcm5hbWUnLCAkdGhpcy0+Z2V0VXNlcm5hbWUoKSwgJy0tcGFzc3dvcmQnLCAkdGhpcy0+Z2V0UGFzc3dvcmQoKV0KKTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UGFzc3dvcmQoKTogc3RyaW5nCnsKaWYgKCR0aGlzLT5jcmVkZW50aWFscyA9PT0gbnVsbCkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCJObyBzdm4gYXV0aCBkZXRlY3RlZC4iKTsKfQoKcmV0dXJuICR0aGlzLT5jcmVkZW50aWFsc1sncGFzc3dvcmQnXTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0VXNlcm5hbWUoKTogc3RyaW5nCnsKaWYgKCR0aGlzLT5jcmVkZW50aWFscyA9PT0gbnVsbCkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCJObyBzdm4gYXV0aCBkZXRlY3RlZC4iKTsKfQoKcmV0dXJuICR0aGlzLT5jcmVkZW50aWFsc1sndXNlcm5hbWUnXTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGhhc0F1dGgoKTogYm9vbAp7CmlmIChudWxsICE9PSAkdGhpcy0+aGFzQXV0aCkgewpyZXR1cm4gJHRoaXMtPmhhc0F1dGg7Cn0KCmlmIChmYWxzZSA9PT0gJHRoaXMtPmNyZWF0ZUF1dGhGcm9tQ29uZmlnKCkpIHsKJHRoaXMtPmNyZWF0ZUF1dGhGcm9tVXJsKCk7Cn0KCnJldHVybiAoYm9vbCkgJHRoaXMtPmhhc0F1dGg7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEF1dGhDYWNoZUFyZ3MoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmNhY2hlQ3JlZGVudGlhbHMgPyBbXSA6IFsnLS1uby1hdXRoLWNhY2hlJ107Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY3JlYXRlQXV0aEZyb21Db25maWcoKTogYm9vbAp7CmlmICghJHRoaXMtPmNvbmZpZy0+aGFzKCdodHRwLWJhc2ljJykpIHsKcmV0dXJuICR0aGlzLT5oYXNBdXRoID0gZmFsc2U7Cn0KCiRhdXRoQ29uZmlnID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdodHRwLWJhc2ljJyk7CgokaG9zdCA9IHBhcnNlX3VybCgkdGhpcy0+dXJsLCBQSFBfVVJMX0hPU1QpOwppZiAoaXNzZXQoJGF1dGhDb25maWdbJGhvc3RdKSkgewokdGhpcy0+Y3JlZGVudGlhbHMgPSBbCid1c2VybmFtZScgPT4gJGF1dGhDb25maWdbJGhvc3RdWyd1c2VybmFtZSddLAoncGFzc3dvcmQnID0+ICRhdXRoQ29uZmlnWyRob3N0XVsncGFzc3dvcmQnXSwKXTsKCnJldHVybiAkdGhpcy0+aGFzQXV0aCA9IHRydWU7Cn0KCnJldHVybiAkdGhpcy0+aGFzQXV0aCA9IGZhbHNlOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZUF1dGhGcm9tVXJsKCk6IGJvb2wKewokdXJpID0gcGFyc2VfdXJsKCR0aGlzLT51cmwpOwppZiAoZW1wdHkoJHVyaVsndXNlciddKSkgewpyZXR1cm4gJHRoaXMtPmhhc0F1dGggPSBmYWxzZTsKfQoKJHRoaXMtPmNyZWRlbnRpYWxzID0gWwondXNlcm5hbWUnID0+ICR1cmlbJ3VzZXInXSwKJ3Bhc3N3b3JkJyA9PiAhZW1wdHkoJHVyaVsncGFzcyddKSA/ICR1cmlbJ3Bhc3MnXSA6ICcnLApdOwoKcmV0dXJuICR0aGlzLT5oYXNBdXRoID0gdHJ1ZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGJpbmFyeVZlcnNpb24oKTogP3N0cmluZwp7CmlmICghc2VsZjo6JHZlcnNpb24pIHsKaWYgKDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnc3ZuJywgJy0tdmVyc2lvbiddLCAkb3V0cHV0KSkgewppZiAoUHJlZzo6aXNNYXRjaCgneyhcZCsoPzpcLlxkKykrKX0nLCAkb3V0cHV0LCAkbWF0Y2gpKSB7CnNlbGY6OiR2ZXJzaW9uID0gJG1hdGNoWzFdOwp9Cn0KfQoKcmV0dXJuIHNlbGY6OiR2ZXJzaW9uOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxEb3dubG9hZGVySW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxEb3dubG9hZE1hbmFnZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CgpjbGFzcyBTeW5jSGVscGVyCnsKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRvd25sb2FkQW5kSW5zdGFsbFBhY2thZ2VTeW5jKExvb3AgJGxvb3AsICRkb3dubG9hZGVyLCBzdHJpbmcgJHBhdGgsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiB2b2lkCnsKYXNzZXJ0KCRkb3dubG9hZGVyIGluc3RhbmNlb2YgRG93bmxvYWRlckludGVyZmFjZSB8fCAkZG93bmxvYWRlciBpbnN0YW5jZW9mIERvd25sb2FkTWFuYWdlcik7CgokdHlwZSA9ICRwcmV2UGFja2FnZSAhPT0gbnVsbCA/ICd1cGRhdGUnIDogJ2luc3RhbGwnOwoKdHJ5IHsKc2VsZjo6YXdhaXQoJGxvb3AsICRkb3dubG9hZGVyLT5kb3dubG9hZCgkcGFja2FnZSwgJHBhdGgsICRwcmV2UGFja2FnZSkpOwoKc2VsZjo6YXdhaXQoJGxvb3AsICRkb3dubG9hZGVyLT5wcmVwYXJlKCR0eXBlLCAkcGFja2FnZSwgJHBhdGgsICRwcmV2UGFja2FnZSkpOwoKaWYgKCR0eXBlID09PSAndXBkYXRlJyAmJiAkcHJldlBhY2thZ2UgIT09IG51bGwpIHsKc2VsZjo6YXdhaXQoJGxvb3AsICRkb3dubG9hZGVyLT51cGRhdGUoJHBhY2thZ2UsICRwcmV2UGFja2FnZSwgJHBhdGgpKTsKfSBlbHNlIHsKc2VsZjo6YXdhaXQoJGxvb3AsICRkb3dubG9hZGVyLT5pbnN0YWxsKCRwYWNrYWdlLCAkcGF0aCkpOwp9Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKc2VsZjo6YXdhaXQoJGxvb3AsICRkb3dubG9hZGVyLT5jbGVhbnVwKCR0eXBlLCAkcGFja2FnZSwgJHBhdGgsICRwcmV2UGFja2FnZSkpOwp0aHJvdyAkZTsKfQoKc2VsZjo6YXdhaXQoJGxvb3AsICRkb3dubG9hZGVyLT5jbGVhbnVwKCR0eXBlLCAkcGFja2FnZSwgJHBhdGgsICRwcmV2UGFja2FnZSkpOwp9CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGF3YWl0KExvb3AgJGxvb3AsID9Qcm9taXNlSW50ZXJmYWNlICRwcm9taXNlID0gbnVsbCk6IHZvaWQKewppZiAoJHByb21pc2UgIT09IG51bGwpIHsKJGxvb3AtPndhaXQoWyRwcm9taXNlXSk7Cn0KfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKCgoKY2xhc3MgVGFyCnsKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRDb21wb3Nlckpzb24oc3RyaW5nICRwYXRoVG9BcmNoaXZlKTogP3N0cmluZwp7CiRwaGFyID0gbmV3IFxQaGFyRGF0YSgkcGF0aFRvQXJjaGl2ZSk7CgppZiAoISRwaGFyLT52YWxpZCgpKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gc2VsZjo6ZXh0cmFjdENvbXBvc2VySnNvbkZyb21Gb2xkZXIoJHBoYXIpOwp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBleHRyYWN0Q29tcG9zZXJKc29uRnJvbUZvbGRlcihcUGhhckRhdGEgJHBoYXIpOiBzdHJpbmcKewppZiAoaXNzZXQoJHBoYXJbJ2NvbXBvc2VyLmpzb24nXSkpIHsKcmV0dXJuICRwaGFyWydjb21wb3Nlci5qc29uJ10tPmdldENvbnRlbnQoKTsKfQoKJHRvcExldmVsUGF0aHMgPSBbXTsKZm9yZWFjaCAoJHBoYXIgYXMgJGZvbGRlckZpbGUpIHsKJG5hbWUgPSAkZm9sZGVyRmlsZS0+Z2V0QmFzZW5hbWUoKTsKCmlmICgkZm9sZGVyRmlsZS0+aXNEaXIoKSkgewokdG9wTGV2ZWxQYXRoc1skbmFtZV0gPSB0cnVlOwppZiAoXGNvdW50KCR0b3BMZXZlbFBhdGhzKSA+IDEpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdBcmNoaXZlIGhhcyBtb3JlIHRoYW4gb25lIHRvcCBsZXZlbCBkaXJlY3RvcmllcywgYW5kIG5vIGNvbXBvc2VyLmpzb24gd2FzIGZvdW5kIG9uIHRoZSB0b3AgbGV2ZWwsIHNvIGl0XCdzIGFuIGludmFsaWQgYXJjaGl2ZS4gVG9wIGxldmVsIHBhdGhzIGZvdW5kIHdlcmU6ICcuaW1wbG9kZSgnLCcsIGFycmF5X2tleXMoJHRvcExldmVsUGF0aHMpKSk7Cn0KfQp9CgokY29tcG9zZXJKc29uUGF0aCA9IGtleSgkdG9wTGV2ZWxQYXRocykuJy9jb21wb3Nlci5qc29uJzsKaWYgKFxjb3VudCgkdG9wTGV2ZWxQYXRocykgPiAwICYmIGlzc2V0KCRwaGFyWyRjb21wb3Nlckpzb25QYXRoXSkpIHsKcmV0dXJuICRwaGFyWyRjb21wb3Nlckpzb25QYXRoXS0+Z2V0Q29udGVudCgpOwp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ05vIGNvbXBvc2VyLmpzb24gZm91bmQgZWl0aGVyIGF0IHRoZSB0b3AgbGV2ZWwgb3Igd2l0aGluIHRoZSB0b3Btb3N0IGRpcmVjdG9yeScpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcQ2FCdW5kbGVcQ2FCdW5kbGU7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgoKZmluYWwgY2xhc3MgVGxzSGVscGVyCnsKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2hlY2tDZXJ0aWZpY2F0ZUhvc3QoJGNlcnRpZmljYXRlLCBzdHJpbmcgJGhvc3RuYW1lLCA/c3RyaW5nICYkY24gPSBudWxsKTogYm9vbAp7CiRuYW1lcyA9IHNlbGY6OmdldENlcnRpZmljYXRlTmFtZXMoJGNlcnRpZmljYXRlKTsKCmlmIChlbXB0eSgkbmFtZXMpKSB7CnJldHVybiBmYWxzZTsKfQoKJGNvbWJpbmVkTmFtZXMgPSBhcnJheV9tZXJnZSgkbmFtZXNbJ3NhbiddLCBbJG5hbWVzWydjbiddXSk7CiRob3N0bmFtZSA9IHN0cnRvbG93ZXIoJGhvc3RuYW1lKTsKCmZvcmVhY2ggKCRjb21iaW5lZE5hbWVzIGFzICRjZXJ0TmFtZSkgewokbWF0Y2hlciA9IHNlbGY6OmNlcnROYW1lTWF0Y2hlcigkY2VydE5hbWUpOwoKaWYgKCRtYXRjaGVyICYmICRtYXRjaGVyKCRob3N0bmFtZSkpIHsKJGNuID0gJG5hbWVzWydjbiddOwoKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRDZXJ0aWZpY2F0ZU5hbWVzKCRjZXJ0aWZpY2F0ZSk6ID9hcnJheQp7CmlmIChpc19hcnJheSgkY2VydGlmaWNhdGUpKSB7CiRpbmZvID0gJGNlcnRpZmljYXRlOwp9IGVsc2VpZiAoQ2FCdW5kbGU6OmlzT3BlbnNzbFBhcnNlU2FmZSgpKSB7CiRpbmZvID0gb3BlbnNzbF94NTA5X3BhcnNlKCRjZXJ0aWZpY2F0ZSwgZmFsc2UpOwp9CgppZiAoIWlzc2V0KCRpbmZvWydzdWJqZWN0J11bJ2NvbW1vbk5hbWUnXSkpIHsKcmV0dXJuIG51bGw7Cn0KCiRjb21tb25OYW1lID0gc3RydG9sb3dlcigkaW5mb1snc3ViamVjdCddWydjb21tb25OYW1lJ10pOwokc3ViamVjdEFsdE5hbWVzID0gW107CgppZiAoaXNzZXQoJGluZm9bJ2V4dGVuc2lvbnMnXVsnc3ViamVjdEFsdE5hbWUnXSkpIHsKJHN1YmplY3RBbHROYW1lcyA9IFByZWc6OnNwbGl0KCd7XHMqLFxzKn0nLCAkaW5mb1snZXh0ZW5zaW9ucyddWydzdWJqZWN0QWx0TmFtZSddKTsKJHN1YmplY3RBbHROYW1lcyA9IGFycmF5X2ZpbHRlcigKYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJG5hbWUpOiA/c3RyaW5nIHsKaWYgKDAgPT09IHN0cnBvcygkbmFtZSwgJ0ROUzonKSkgewpyZXR1cm4gc3RydG9sb3dlcihsdHJpbShzdWJzdHIoJG5hbWUsIDQpKSk7Cn0KCnJldHVybiBudWxsOwp9LCAkc3ViamVjdEFsdE5hbWVzKSwKc3RhdGljIGZ1bmN0aW9uICg/c3RyaW5nICRzYW4pIHsKcmV0dXJuICRzYW4gIT09IG51bGw7Cn0KKTsKJHN1YmplY3RBbHROYW1lcyA9IGFycmF5X3ZhbHVlcygkc3ViamVjdEFsdE5hbWVzKTsKfQoKcmV0dXJuIFsKJ2NuJyA9PiAkY29tbW9uTmFtZSwKJ3NhbicgPT4gJHN1YmplY3RBbHROYW1lcywKXTsKfQoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRDZXJ0aWZpY2F0ZUZpbmdlcnByaW50KHN0cmluZyAkY2VydGlmaWNhdGUpOiBzdHJpbmcKewokcHVia2V5ID0gb3BlbnNzbF9nZXRfcHVibGlja2V5KCRjZXJ0aWZpY2F0ZSk7CmlmICgkcHVia2V5ID09PSBmYWxzZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byByZXRyaWV2ZSB0aGUgcHVibGljIGtleSBmcm9tIGNlcnRpZmljYXRlJyk7Cn0KJHB1YmtleWRldGFpbHMgPSBvcGVuc3NsX3BrZXlfZ2V0X2RldGFpbHMoJHB1YmtleSk7CiRwdWJrZXlwZW0gPSAkcHVia2V5ZGV0YWlsc1sna2V5J107Cgokc3RhcnQgPSAnLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0nOwokZW5kID0gJy0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLSc7CiRwZW10cmltID0gc3Vic3RyKCRwdWJrZXlwZW0sIHN0cnBvcygkcHVia2V5cGVtLCAkc3RhcnQpICsgc3RybGVuKCRzdGFydCksIChzdHJsZW4oJHB1YmtleXBlbSkgLSBzdHJwb3MoJHB1YmtleXBlbSwgJGVuZCkpICogKC0xKSk7CiRkZXIgPSBiYXNlNjRfZGVjb2RlKCRwZW10cmltKTsKCnJldHVybiBoYXNoKCdzaGExJywgJGRlcik7Cn0KCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNPcGVuc3NsUGFyc2VTYWZlKCk6IGJvb2wKewpyZXR1cm4gQ2FCdW5kbGU6OmlzT3BlbnNzbFBhcnNlU2FmZSgpOwp9CgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNlcnROYW1lTWF0Y2hlcihzdHJpbmcgJGNlcnROYW1lKTogP2NhbGxhYmxlCnsKJHdpbGRjYXJkcyA9IHN1YnN0cl9jb3VudCgkY2VydE5hbWUsICcqJyk7CgppZiAoMCA9PT0gJHdpbGRjYXJkcykgewoKcmV0dXJuIHN0YXRpYyBmdW5jdGlvbiAoJGhvc3RuYW1lKSB1c2UgKCRjZXJ0TmFtZSk6IGJvb2wgewpyZXR1cm4gJGhvc3RuYW1lID09PSAkY2VydE5hbWU7Cn07Cn0KCmlmICgxID09PSAkd2lsZGNhcmRzKSB7CiRjb21wb25lbnRzID0gZXhwbG9kZSgnLicsICRjZXJ0TmFtZSk7CgppZiAoMyA+IGNvdW50KCRjb21wb25lbnRzKSkgewoKcmV0dXJuIG51bGw7Cn0KCiRmaXJzdENvbXBvbmVudCA9ICRjb21wb25lbnRzWzBdOwoKCmlmICgnKicgIT09ICRmaXJzdENvbXBvbmVudFtzdHJsZW4oJGZpcnN0Q29tcG9uZW50KSAtIDFdKSB7CnJldHVybiBudWxsOwp9Cgokd2lsZGNhcmRSZWdleCA9IHByZWdfcXVvdGUoJGNlcnROYW1lKTsKJHdpbGRjYXJkUmVnZXggPSBzdHJfcmVwbGFjZSgnXFwqJywgJ1thLXowLTktXSsnLCAkd2lsZGNhcmRSZWdleCk7CiR3aWxkY2FyZFJlZ2V4ID0gInteeyR3aWxkY2FyZFJlZ2V4fSR9IjsKCnJldHVybiBzdGF0aWMgZnVuY3Rpb24gKCRob3N0bmFtZSkgdXNlICgkd2lsZGNhcmRSZWdleCk6IGJvb2wgewpyZXR1cm4gUHJlZzo6aXNNYXRjaCgkd2lsZGNhcmRSZWdleCwgJGhvc3RuYW1lKTsKfTsKfQoKcmV0dXJuIG51bGw7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgpjbGFzcyBVcmwKewoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiB1cGRhdGVEaXN0UmVmZXJlbmNlKENvbmZpZyAkY29uZmlnLCBzdHJpbmcgJHVybCwgc3RyaW5nICRyZWYpOiBzdHJpbmcKewokaG9zdCA9IHBhcnNlX3VybCgkdXJsLCBQSFBfVVJMX0hPU1QpOwoKaWYgKCRob3N0ID09PSAnYXBpLmdpdGh1Yi5jb20nIHx8ICRob3N0ID09PSAnZ2l0aHViLmNvbScgfHwgJGhvc3QgPT09ICd3d3cuZ2l0aHViLmNvbScpIHsKaWYgKFByZWc6OmlzTWF0Y2goJ3teaHR0cHM/Oi8vKD86d3d3XC4pP2dpdGh1YlwuY29tLyhbXi9dKykvKFteL10rKS8oemlwfHRhciliYWxsLyguKykkfWknLCAkdXJsLCAkbWF0Y2gpKSB7CgokdXJsID0gJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJyAuICRtYXRjaFsxXSAuICcvJy4gJG1hdGNoWzJdIC4gJy8nIC4gJG1hdGNoWzNdIC4gJ2JhbGwvJyAuICRyZWY7Cn0gZWxzZWlmIChQcmVnOjppc01hdGNoKCd7Xmh0dHBzPzovLyg/Ond3d1wuKT9naXRodWJcLmNvbS8oW14vXSspLyhbXi9dKykvYXJjaGl2ZS8uK1wuKHppcHx0YXIpKD86XC5neik/JH1pJywgJHVybCwgJG1hdGNoKSkgewoKJHVybCA9ICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLycgLiAkbWF0Y2hbMV0gLiAnLycuICRtYXRjaFsyXSAuICcvJyAuICRtYXRjaFszXSAuICdiYWxsLycgLiAkcmVmOwp9IGVsc2VpZiAoUHJlZzo6aXNNYXRjaCgne15odHRwcz86Ly9hcGlcLmdpdGh1YlwuY29tL3JlcG9zLyhbXi9dKykvKFteL10rKS8oemlwfHRhciliYWxsKD86Ly4rKT8kfWknLCAkdXJsLCAkbWF0Y2gpKSB7CgokdXJsID0gJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJyAuICRtYXRjaFsxXSAuICcvJy4gJG1hdGNoWzJdIC4gJy8nIC4gJG1hdGNoWzNdIC4gJ2JhbGwvJyAuICRyZWY7Cn0KfSBlbHNlaWYgKCRob3N0ID09PSAnYml0YnVja2V0Lm9yZycgfHwgJGhvc3QgPT09ICd3d3cuYml0YnVja2V0Lm9yZycpIHsKaWYgKFByZWc6OmlzTWF0Y2goJ3teaHR0cHM/Oi8vKD86d3d3XC4pP2JpdGJ1Y2tldFwub3JnLyhbXi9dKykvKFteL10rKS9nZXQvKC4rKVwuKHppcHx0YXJcLmd6fHRhclwuYnoyKSR9aScsICR1cmwsICRtYXRjaCkpIHsKCiR1cmwgPSAnaHR0cHM6Ly9iaXRidWNrZXQub3JnLycgLiAkbWF0Y2hbMV0gLiAnLycuICRtYXRjaFsyXSAuICcvZ2V0LycgLiAkcmVmIC4gJy4nIC4gJG1hdGNoWzRdOwp9Cn0gZWxzZWlmICgkaG9zdCA9PT0gJ2dpdGxhYi5jb20nIHx8ICRob3N0ID09PSAnd3d3LmdpdGxhYi5jb20nKSB7CmlmIChQcmVnOjppc01hdGNoKCd7Xmh0dHBzPzovLyg/Ond3d1wuKT9naXRsYWJcLmNvbS9hcGkvdlszNF0vcHJvamVjdHMvKFteL10rKS9yZXBvc2l0b3J5L2FyY2hpdmVcLih6aXB8dGFyXC5nenx0YXJcLmJ6Mnx0YXIpXD9zaGE9LiskfWknLCAkdXJsLCAkbWF0Y2gpKSB7CgokdXJsID0gJ2h0dHBzOi8vZ2l0bGFiLmNvbS9hcGkvdjQvcHJvamVjdHMvJyAuICRtYXRjaFsxXSAuICcvcmVwb3NpdG9yeS9hcmNoaXZlLicgLiAkbWF0Y2hbMl0gLiAnP3NoYT0nIC4gJHJlZjsKfQp9IGVsc2VpZiAoaW5fYXJyYXkoJGhvc3QsICRjb25maWctPmdldCgnZ2l0aHViLWRvbWFpbnMnKSwgdHJ1ZSkpIHsKJHVybCA9IFByZWc6OnJlcGxhY2UoJ3soL3JlcG9zL1teL10rL1teL10rLyh6aXB8dGFyKWJhbGwpKD86Ly4rKT8kfWknLCAnJDEvJy4kcmVmLCAkdXJsKTsKfSBlbHNlaWYgKGluX2FycmF5KCRob3N0LCAkY29uZmlnLT5nZXQoJ2dpdGxhYi1kb21haW5zJyksIHRydWUpKSB7CiR1cmwgPSBQcmVnOjpyZXBsYWNlKCd7KC9hcGkvdlszNF0vcHJvamVjdHMvW14vXSsvcmVwb3NpdG9yeS9hcmNoaXZlXC4oPzp6aXB8dGFyXC5nenx0YXJcLmJ6Mnx0YXIpXD9zaGE9KS4rJH1pJywgJyR7MX0nLiRyZWYsICR1cmwpOwp9Cgphc3NlcnQoJHVybCAhPT0gJycpOwoKcmV0dXJuICR1cmw7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldE9yaWdpbihDb25maWcgJGNvbmZpZywgc3RyaW5nICR1cmwpOiBzdHJpbmcKewppZiAoMCA9PT0gc3RycG9zKCR1cmwsICdmaWxlOi8vJykpIHsKcmV0dXJuICR1cmw7Cn0KCiRvcmlnaW4gPSAoc3RyaW5nKSBwYXJzZV91cmwoJHVybCwgUEhQX1VSTF9IT1NUKTsKaWYgKCRwb3J0ID0gcGFyc2VfdXJsKCR1cmwsIFBIUF9VUkxfUE9SVCkpIHsKJG9yaWdpbiAuPSAnOicuJHBvcnQ7Cn0KCmlmIChzdHJfZW5kc193aXRoKCRvcmlnaW4sICcuZ2l0aHViLmNvbScpICYmICRvcmlnaW4gIT09ICdjb2RlbG9hZC5naXRodWIuY29tJykgewpyZXR1cm4gJ2dpdGh1Yi5jb20nOwp9CgppZiAoJG9yaWdpbiA9PT0gJ3JlcG8ucGFja2FnaXN0Lm9yZycpIHsKcmV0dXJuICdwYWNrYWdpc3Qub3JnJzsKfQoKaWYgKCRvcmlnaW4gPT09ICcnKSB7CiRvcmlnaW4gPSAkdXJsOwp9CgoKCmlmICgKZmFsc2UgPT09IHN0cnBvcygkb3JpZ2luLCAnLycpCiYmICFpbl9hcnJheSgkb3JpZ2luLCAkY29uZmlnLT5nZXQoJ2dpdGxhYi1kb21haW5zJyksIHRydWUpCikgewpmb3JlYWNoICgkY29uZmlnLT5nZXQoJ2dpdGxhYi1kb21haW5zJykgYXMgJGdpdGxhYkRvbWFpbikgewppZiAoJGdpdGxhYkRvbWFpbiAhPT0gJycgJiYgc3RyX3N0YXJ0c193aXRoKCRnaXRsYWJEb21haW4sICRvcmlnaW4pKSB7CnJldHVybiAkZ2l0bGFiRG9tYWluOwp9Cn0KfQoKcmV0dXJuICRvcmlnaW47Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2FuaXRpemUoc3RyaW5nICR1cmwpOiBzdHJpbmcKewoKCiR1cmwgPSBQcmVnOjpyZXBsYWNlKCd7KFsmP11hY2Nlc3NfdG9rZW49KVteJl0rfScsICckMSoqKicsICR1cmwpOwoKJHVybCA9IFByZWc6OnJlcGxhY2VDYWxsYmFjaygne14oP1A8cHJlZml4PlthLXowLTldKzovLyk/KD9QPHVzZXI+W146L1xzQF0rKTooP1A8cGFzc3dvcmQ+W15AXHMvXSspQH1pJywgc3RhdGljIGZ1bmN0aW9uICgkbSk6IHN0cmluZyB7CgppZiAoUHJlZzo6aXNNYXRjaChHaXRIdWI6OkdJVEhVQl9UT0tFTl9SRUdFWCwgJG1bJ3VzZXInXSkpIHsKcmV0dXJuICRtWydwcmVmaXgnXS4nKioqOioqKkAnOwp9CgpyZXR1cm4gJG1bJ3ByZWZpeCddLiRtWyd1c2VyJ10uJzoqKipAJzsKfSwgJHVybCk7CgpyZXR1cm4gJHVybDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKCgoKY2xhc3MgWmlwCnsKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRDb21wb3Nlckpzb24oc3RyaW5nICRwYXRoVG9aaXApOiA/c3RyaW5nCnsKaWYgKCFleHRlbnNpb25fbG9hZGVkKCd6aXAnKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSBaaXAgVXRpbCByZXF1aXJlcyBQSFBcJ3MgemlwIGV4dGVuc2lvbicpOwp9CgokemlwID0gbmV3IFxaaXBBcmNoaXZlKCk7CmlmICgkemlwLT5vcGVuKCRwYXRoVG9aaXApICE9PSB0cnVlKSB7CnJldHVybiBudWxsOwp9CgppZiAoMCA9PT0gJHppcC0+bnVtRmlsZXMpIHsKJHppcC0+Y2xvc2UoKTsKCnJldHVybiBudWxsOwp9CgokZm91bmRGaWxlSW5kZXggPSBzZWxmOjpsb2NhdGVGaWxlKCR6aXAsICdjb21wb3Nlci5qc29uJyk7CgokY29udGVudCA9IG51bGw7CiRjb25maWd1cmF0aW9uRmlsZU5hbWUgPSAkemlwLT5nZXROYW1lSW5kZXgoJGZvdW5kRmlsZUluZGV4KTsKJHN0cmVhbSA9ICR6aXAtPmdldFN0cmVhbSgkY29uZmlndXJhdGlvbkZpbGVOYW1lKTsKCmlmIChmYWxzZSAhPT0gJHN0cmVhbSkgewokY29udGVudCA9IHN0cmVhbV9nZXRfY29udGVudHMoJHN0cmVhbSk7Cn0KCiR6aXAtPmNsb3NlKCk7CgpyZXR1cm4gJGNvbnRlbnQ7Cn0KCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gbG9jYXRlRmlsZShcWmlwQXJjaGl2ZSAkemlwLCBzdHJpbmcgJGZpbGVuYW1lKTogaW50CnsKCmlmIChmYWxzZSAhPT0gKCRpbmRleCA9ICR6aXAtPmxvY2F0ZU5hbWUoJGZpbGVuYW1lKSkgJiYgJHppcC0+Z2V0RnJvbUluZGV4KCRpbmRleCkgIT09IGZhbHNlKSB7CnJldHVybiAkaW5kZXg7Cn0KCiR0b3BMZXZlbFBhdGhzID0gW107CmZvciAoJGkgPSAwOyAkaSA8ICR6aXAtPm51bUZpbGVzOyAkaSsrKSB7CiRuYW1lID0gJHppcC0+Z2V0TmFtZUluZGV4KCRpKTsKJGRpcm5hbWUgPSBkaXJuYW1lKCRuYW1lKTsKCgppZiAoc3RycG9zKCRuYW1lLCAnX19NQUNPU1gnKSAhPT0gZmFsc2UpIHsKY29udGludWU7Cn0KCgppZiAoJGRpcm5hbWUgPT09ICcuJykgewokdG9wTGV2ZWxQYXRoc1skbmFtZV0gPSB0cnVlOwppZiAoXGNvdW50KCR0b3BMZXZlbFBhdGhzKSA+IDEpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdBcmNoaXZlIGhhcyBtb3JlIHRoYW4gb25lIHRvcCBsZXZlbCBkaXJlY3RvcmllcywgYW5kIG5vIGNvbXBvc2VyLmpzb24gd2FzIGZvdW5kIG9uIHRoZSB0b3AgbGV2ZWwsIHNvIGl0XCdzIGFuIGludmFsaWQgYXJjaGl2ZS4gVG9wIGxldmVsIHBhdGhzIGZvdW5kIHdlcmU6ICcuaW1wbG9kZSgnLCcsIGFycmF5X2tleXMoJHRvcExldmVsUGF0aHMpKSk7Cn0KY29udGludWU7Cn0KCgppZiAoZmFsc2UgPT09IHN0cnBvcygkZGlybmFtZSwgJ1xcJykgJiYgZmFsc2UgPT09IHN0cnBvcygkZGlybmFtZSwgJy8nKSkgewokdG9wTGV2ZWxQYXRoc1skZGlybmFtZS4nLyddID0gdHJ1ZTsKaWYgKFxjb3VudCgkdG9wTGV2ZWxQYXRocykgPiAxKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQXJjaGl2ZSBoYXMgbW9yZSB0aGFuIG9uZSB0b3AgbGV2ZWwgZGlyZWN0b3JpZXMsIGFuZCBubyBjb21wb3Nlci5qc29uIHdhcyBmb3VuZCBvbiB0aGUgdG9wIGxldmVsLCBzbyBpdFwncyBhbiBpbnZhbGlkIGFyY2hpdmUuIFRvcCBsZXZlbCBwYXRocyBmb3VuZCB3ZXJlOiAnLmltcGxvZGUoJywnLCBhcnJheV9rZXlzKCR0b3BMZXZlbFBhdGhzKSkpOwp9Cn0KfQoKaWYgKCR0b3BMZXZlbFBhdGhzICYmIGZhbHNlICE9PSAoJGluZGV4ID0gJHppcC0+bG9jYXRlTmFtZShrZXkoJHRvcExldmVsUGF0aHMpLiRmaWxlbmFtZSkpICYmICR6aXAtPmdldEZyb21JbmRleCgkaW5kZXgpICE9PSBmYWxzZSkgewpyZXR1cm4gJGluZGV4Owp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ05vIGNvbXBvc2VyLmpzb24gZm91bmQgZWl0aGVyIGF0IHRoZSB0b3AgbGV2ZWwgb3Igd2l0aGluIHRoZSB0b3Btb3N0IGRpcmVjdG9yeScpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKdXNlIENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyOwoKZnVuY3Rpb24gaW5jbHVkZUlmRXhpc3RzKHN0cmluZyAkZmlsZSk6ID9DbGFzc0xvYWRlcgp7CnJldHVybiBmaWxlX2V4aXN0cygkZmlsZSkgPyBpbmNsdWRlICRmaWxlIDogbnVsbDsKfQoKaWYgKCghJGxvYWRlciA9IGluY2x1ZGVJZkV4aXN0cyhfX0RJUl9fLicvLi4vdmVuZG9yL2F1dG9sb2FkLnBocCcpKSAmJiAoISRsb2FkZXIgPSBpbmNsdWRlSWZFeGlzdHMoX19ESVJfXy4nLy4uLy4uLy4uL2F1dG9sb2FkLnBocCcpKSkgewplY2hvICdZb3UgbXVzdCBzZXQgdXAgdGhlIHByb2plY3QgZGVwZW5kZW5jaWVzIHVzaW5nIGBjb21wb3NlciBpbnN0YWxsYCcuUEhQX0VPTC4KJ1NlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb3dubG9hZC8gZm9yIGluc3RydWN0aW9ucyBvbiBpbnN0YWxsaW5nIENvbXBvc2VyJy5QSFBfRU9MOwpleGl0KDEpOwp9CgpyZXR1cm4gJGxvYWRlcjsKPD9waHAKCi8qCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENvbXBvc2VyLgogKgogKiAoYykgTmlscyBBZGVybWFubiA8bmFkZXJtYW5AbmFkZXJtYW4uZGU+CiAqICAgICBKb3JkaSBCb2dnaWFubyA8ai5ib2dnaWFub0BzZWxkLmJlPgogKgogKiBGb3IgdGhlIGZ1bGwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIGluZm9ybWF0aW9uLCBwbGVhc2UgdmlldyB0aGUgTElDRU5TRQogKiBmaWxlIHRoYXQgd2FzIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb3VyY2UgY29kZS4KICovCgpuYW1lc3BhY2UgQ29tcG9zZXJcQXV0b2xvYWQ7CgovKioKICogQ2xhc3NMb2FkZXIgaW1wbGVtZW50cyBhIFBTUi0wLCBQU1ItNCBhbmQgY2xhc3NtYXAgY2xhc3MgbG9hZGVyLgogKgogKiAgICAgJGxvYWRlciA9IG5ldyBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIoKTsKICoKICogICAgIC8vIHJlZ2lzdGVyIGNsYXNzZXMgd2l0aCBuYW1lc3BhY2VzCiAqICAgICAkbG9hZGVyLT5hZGQoJ1N5bWZvbnlcQ29tcG9uZW50JywgX19ESVJfXy4nL2NvbXBvbmVudCcpOwogKiAgICAgJGxvYWRlci0+YWRkKCdTeW1mb255JywgICAgICAgICAgIF9fRElSX18uJy9mcmFtZXdvcmsnKTsKICoKICogICAgIC8vIGFjdGl2YXRlIHRoZSBhdXRvbG9hZGVyCiAqICAgICAkbG9hZGVyLT5yZWdpc3RlcigpOwogKgogKiAgICAgLy8gdG8gZW5hYmxlIHNlYXJjaGluZyB0aGUgaW5jbHVkZSBwYXRoIChlZy4gZm9yIFBFQVIgcGFja2FnZXMpCiAqICAgICAkbG9hZGVyLT5zZXRVc2VJbmNsdWRlUGF0aCh0cnVlKTsKICoKICogSW4gdGhpcyBleGFtcGxlLCBpZiB5b3UgdHJ5IHRvIHVzZSBhIGNsYXNzIGluIHRoZSBTeW1mb255XENvbXBvbmVudAogKiBuYW1lc3BhY2Ugb3Igb25lIG9mIGl0cyBjaGlsZHJlbiAoU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZSBmb3IgaW5zdGFuY2UpLAogKiB0aGUgYXV0b2xvYWRlciB3aWxsIGZpcnN0IGxvb2sgZm9yIHRoZSBjbGFzcyB1bmRlciB0aGUgY29tcG9uZW50LwogKiBkaXJlY3RvcnksIGFuZCBpdCB3aWxsIHRoZW4gZmFsbGJhY2sgdG8gdGhlIGZyYW1ld29yay8gZGlyZWN0b3J5IGlmIG5vdAogKiBmb3VuZCBiZWZvcmUgZ2l2aW5nIHVwLgogKgogKiBUaGlzIGNsYXNzIGlzIGxvb3NlbHkgYmFzZWQgb24gdGhlIFN5bWZvbnkgVW5pdmVyc2FsQ2xhc3NMb2FkZXIuCiAqCiAqIEBhdXRob3IgRmFiaWVuIFBvdGVuY2llciA8ZmFiaWVuQHN5bWZvbnkuY29tPgogKiBAYXV0aG9yIEpvcmRpIEJvZ2dpYW5vIDxqLmJvZ2dpYW5vQHNlbGQuYmU+CiAqIEBzZWUgICAgaHR0cHM6Ly93d3cucGhwLWZpZy5vcmcvcHNyL3Bzci0wLwogKiBAc2VlICAgIGh0dHBzOi8vd3d3LnBocC1maWcub3JnL3Bzci9wc3ItNC8KICovCmNsYXNzIENsYXNzTG9hZGVyCnsKICAgIC8qKiBAdmFyIFxDbG9zdXJlKHN0cmluZyk6dm9pZCAqLwogICAgcHJpdmF0ZSBzdGF0aWMgJGluY2x1ZGVGaWxlOwoKICAgIC8qKiBAdmFyIHN0cmluZ3xudWxsICovCiAgICBwcml2YXRlICR2ZW5kb3JEaXI7CgogICAgLy8gUFNSLTQKICAgIC8qKgogICAgICogQHZhciBhcnJheTxzdHJpbmcsIGFycmF5PHN0cmluZywgaW50Pj4KICAgICAqLwogICAgcHJpdmF0ZSAkcHJlZml4TGVuZ3Roc1BzcjQgPSBhcnJheSgpOwogICAgLyoqCiAgICAgKiBAdmFyIGFycmF5PHN0cmluZywgbGlzdDxzdHJpbmc+PgogICAgICovCiAgICBwcml2YXRlICRwcmVmaXhEaXJzUHNyNCA9IGFycmF5KCk7CiAgICAvKioKICAgICAqIEB2YXIgbGlzdDxzdHJpbmc+CiAgICAgKi8KICAgIHByaXZhdGUgJGZhbGxiYWNrRGlyc1BzcjQgPSBhcnJheSgpOwoKICAgIC8vIFBTUi0wCiAgICAvKioKICAgICAqIExpc3Qgb2YgUFNSLTAgcHJlZml4ZXMKICAgICAqCiAgICAgKiBTdHJ1Y3R1cmVkIGFzIGFycmF5KCdGIChmaXJzdCBsZXR0ZXIpJyA9PiBhcnJheSgnRm9vXEJhciAoZnVsbCBwcmVmaXgpJyA9PiBhcnJheSgncGF0aCcsICdwYXRoMicpKSkKICAgICAqCiAgICAgKiBAdmFyIGFycmF5PHN0cmluZywgYXJyYXk8c3RyaW5nLCBsaXN0PHN0cmluZz4+PgogICAgICovCiAgICBwcml2YXRlICRwcmVmaXhlc1BzcjAgPSBhcnJheSgpOwogICAgLyoqCiAgICAgKiBAdmFyIGxpc3Q8c3RyaW5nPgogICAgICovCiAgICBwcml2YXRlICRmYWxsYmFja0RpcnNQc3IwID0gYXJyYXkoKTsKCiAgICAvKiogQHZhciBib29sICovCiAgICBwcml2YXRlICR1c2VJbmNsdWRlUGF0aCA9IGZhbHNlOwoKICAgIC8qKgogICAgICogQHZhciBhcnJheTxzdHJpbmcsIHN0cmluZz4KICAgICAqLwogICAgcHJpdmF0ZSAkY2xhc3NNYXAgPSBhcnJheSgpOwoKICAgIC8qKiBAdmFyIGJvb2wgKi8KICAgIHByaXZhdGUgJGNsYXNzTWFwQXV0aG9yaXRhdGl2ZSA9IGZhbHNlOwoKICAgIC8qKgogICAgICogQHZhciBhcnJheTxzdHJpbmcsIGJvb2w+CiAgICAgKi8KICAgIHByaXZhdGUgJG1pc3NpbmdDbGFzc2VzID0gYXJyYXkoKTsKCiAgICAvKiogQHZhciBzdHJpbmd8bnVsbCAqLwogICAgcHJpdmF0ZSAkYXBjdVByZWZpeDsKCiAgICAvKioKICAgICAqIEB2YXIgYXJyYXk8c3RyaW5nLCBzZWxmPgogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyAkcmVnaXN0ZXJlZExvYWRlcnMgPSBhcnJheSgpOwoKICAgIC8qKgogICAgICogQHBhcmFtIHN0cmluZ3xudWxsICR2ZW5kb3JEaXIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR2ZW5kb3JEaXIgPSBudWxsKQogICAgewogICAgICAgICR0aGlzLT52ZW5kb3JEaXIgPSAkdmVuZG9yRGlyOwogICAgICAgIHNlbGY6OmluaXRpYWxpemVJbmNsdWRlQ2xvc3VyZSgpOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBhcnJheTxzdHJpbmcsIGxpc3Q8c3RyaW5nPj4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFByZWZpeGVzKCkKICAgIHsKICAgICAgICBpZiAoIWVtcHR5KCR0aGlzLT5wcmVmaXhlc1BzcjApKSB7CiAgICAgICAgICAgIHJldHVybiBjYWxsX3VzZXJfZnVuY19hcnJheSgnYXJyYXlfbWVyZ2UnLCBhcnJheV92YWx1ZXMoJHRoaXMtPnByZWZpeGVzUHNyMCkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGFycmF5PHN0cmluZywgbGlzdDxzdHJpbmc+PgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJlZml4ZXNQc3I0KCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnByZWZpeERpcnNQc3I0OwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBsaXN0PHN0cmluZz4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEZhbGxiYWNrRGlycygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5mYWxsYmFja0RpcnNQc3IwOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBsaXN0PHN0cmluZz4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEZhbGxiYWNrRGlyc1BzcjQoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyNDsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gYXJyYXk8c3RyaW5nLCBzdHJpbmc+IEFycmF5IG9mIGNsYXNzbmFtZSA9PiBwYXRoCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDbGFzc01hcCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jbGFzc01hcDsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBhcnJheTxzdHJpbmcsIHN0cmluZz4gJGNsYXNzTWFwIENsYXNzIHRvIGZpbGVuYW1lIG1hcAogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkQ2xhc3NNYXAoYXJyYXkgJGNsYXNzTWFwKQogICAgewogICAgICAgIGlmICgkdGhpcy0+Y2xhc3NNYXApIHsKICAgICAgICAgICAgJHRoaXMtPmNsYXNzTWFwID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmNsYXNzTWFwLCAkY2xhc3NNYXApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5jbGFzc01hcCA9ICRjbGFzc01hcDsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgYSBzZXQgb2YgUFNSLTAgZGlyZWN0b3JpZXMgZm9yIGEgZ2l2ZW4gcHJlZml4LCBlaXRoZXIKICAgICAqIGFwcGVuZGluZyBvciBwcmVwZW5kaW5nIHRvIHRoZSBvbmVzIHByZXZpb3VzbHkgc2V0IGZvciB0aGlzIHByZWZpeC4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgICAgICAgICAkcHJlZml4ICBUaGUgcHJlZml4CiAgICAgKiBAcGFyYW0gbGlzdDxzdHJpbmc+fHN0cmluZyAkcGF0aHMgICBUaGUgUFNSLTAgcm9vdCBkaXJlY3RvcmllcwogICAgICogQHBhcmFtIGJvb2wgICAgICAgICAgICAgICAgJHByZXBlbmQgV2hldGhlciB0byBwcmVwZW5kIHRoZSBkaXJlY3RvcmllcwogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkKCRwcmVmaXgsICRwYXRocywgJHByZXBlbmQgPSBmYWxzZSkKICAgIHsKICAgICAgICAkcGF0aHMgPSAoYXJyYXkpICRwYXRoczsKICAgICAgICBpZiAoISRwcmVmaXgpIHsKICAgICAgICAgICAgaWYgKCRwcmVwZW5kKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyMCA9IGFycmF5X21lcmdlKAogICAgICAgICAgICAgICAgICAgICRwYXRocywKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyMAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICR0aGlzLT5mYWxsYmFja0RpcnNQc3IwID0gYXJyYXlfbWVyZ2UoCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjAsCiAgICAgICAgICAgICAgICAgICAgJHBhdGhzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkZmlyc3QgPSAkcHJlZml4WzBdOwogICAgICAgIGlmICghaXNzZXQoJHRoaXMtPnByZWZpeGVzUHNyMFskZmlyc3RdWyRwcmVmaXhdKSkgewogICAgICAgICAgICAkdGhpcy0+cHJlZml4ZXNQc3IwWyRmaXJzdF1bJHByZWZpeF0gPSAkcGF0aHM7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICgkcHJlcGVuZCkgewogICAgICAgICAgICAkdGhpcy0+cHJlZml4ZXNQc3IwWyRmaXJzdF1bJHByZWZpeF0gPSBhcnJheV9tZXJnZSgKICAgICAgICAgICAgICAgICRwYXRocywKICAgICAgICAgICAgICAgICR0aGlzLT5wcmVmaXhlc1BzcjBbJGZpcnN0XVskcHJlZml4XQogICAgICAgICAgICApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5wcmVmaXhlc1BzcjBbJGZpcnN0XVskcHJlZml4XSA9IGFycmF5X21lcmdlKAogICAgICAgICAgICAgICAgJHRoaXMtPnByZWZpeGVzUHNyMFskZmlyc3RdWyRwcmVmaXhdLAogICAgICAgICAgICAgICAgJHBhdGhzCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmVnaXN0ZXJzIGEgc2V0IG9mIFBTUi00IGRpcmVjdG9yaWVzIGZvciBhIGdpdmVuIG5hbWVzcGFjZSwgZWl0aGVyCiAgICAgKiBhcHBlbmRpbmcgb3IgcHJlcGVuZGluZyB0byB0aGUgb25lcyBwcmV2aW91c2x5IHNldCBmb3IgdGhpcyBuYW1lc3BhY2UuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgICAgICAgICAgICAgJHByZWZpeCAgVGhlIHByZWZpeC9uYW1lc3BhY2UsIHdpdGggdHJhaWxpbmcgJ1xcJwogICAgICogQHBhcmFtIGxpc3Q8c3RyaW5nPnxzdHJpbmcgJHBhdGhzICAgVGhlIFBTUi00IGJhc2UgZGlyZWN0b3JpZXMKICAgICAqIEBwYXJhbSBib29sICAgICAgICAgICAgICAgICRwcmVwZW5kIFdoZXRoZXIgdG8gcHJlcGVuZCB0aGUgZGlyZWN0b3JpZXMKICAgICAqCiAgICAgKiBAdGhyb3dzIFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZFBzcjQoJHByZWZpeCwgJHBhdGhzLCAkcHJlcGVuZCA9IGZhbHNlKQogICAgewogICAgICAgICRwYXRocyA9IChhcnJheSkgJHBhdGhzOwogICAgICAgIGlmICghJHByZWZpeCkgewogICAgICAgICAgICAvLyBSZWdpc3RlciBkaXJlY3RvcmllcyBmb3IgdGhlIHJvb3QgbmFtZXNwYWNlLgogICAgICAgICAgICBpZiAoJHByZXBlbmQpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5mYWxsYmFja0RpcnNQc3I0ID0gYXJyYXlfbWVyZ2UoCiAgICAgICAgICAgICAgICAgICAgJHBhdGhzLAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5mYWxsYmFja0RpcnNQc3I0CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjQgPSBhcnJheV9tZXJnZSgKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyNCwKICAgICAgICAgICAgICAgICAgICAkcGF0aHMKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2VpZiAoIWlzc2V0KCR0aGlzLT5wcmVmaXhEaXJzUHNyNFskcHJlZml4XSkpIHsKICAgICAgICAgICAgLy8gUmVnaXN0ZXIgZGlyZWN0b3JpZXMgZm9yIGEgbmV3IG5hbWVzcGFjZS4KICAgICAgICAgICAgJGxlbmd0aCA9IHN0cmxlbigkcHJlZml4KTsKICAgICAgICAgICAgaWYgKCdcXCcgIT09ICRwcmVmaXhbJGxlbmd0aCAtIDFdKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQSBub24tZW1wdHkgUFNSLTQgcHJlZml4IG11c3QgZW5kIHdpdGggYSBuYW1lc3BhY2Ugc2VwYXJhdG9yLiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT5wcmVmaXhMZW5ndGhzUHNyNFskcHJlZml4WzBdXVskcHJlZml4XSA9ICRsZW5ndGg7CiAgICAgICAgICAgICR0aGlzLT5wcmVmaXhEaXJzUHNyNFskcHJlZml4XSA9ICRwYXRoczsKICAgICAgICB9IGVsc2VpZiAoJHByZXBlbmQpIHsKICAgICAgICAgICAgLy8gUHJlcGVuZCBkaXJlY3RvcmllcyBmb3IgYW4gYWxyZWFkeSByZWdpc3RlcmVkIG5hbWVzcGFjZS4KICAgICAgICAgICAgJHRoaXMtPnByZWZpeERpcnNQc3I0WyRwcmVmaXhdID0gYXJyYXlfbWVyZ2UoCiAgICAgICAgICAgICAgICAkcGF0aHMsCiAgICAgICAgICAgICAgICAkdGhpcy0+cHJlZml4RGlyc1BzcjRbJHByZWZpeF0KICAgICAgICAgICAgKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBBcHBlbmQgZGlyZWN0b3JpZXMgZm9yIGFuIGFscmVhZHkgcmVnaXN0ZXJlZCBuYW1lc3BhY2UuCiAgICAgICAgICAgICR0aGlzLT5wcmVmaXhEaXJzUHNyNFskcHJlZml4XSA9IGFycmF5X21lcmdlKAogICAgICAgICAgICAgICAgJHRoaXMtPnByZWZpeERpcnNQc3I0WyRwcmVmaXhdLAogICAgICAgICAgICAgICAgJHBhdGhzCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmVnaXN0ZXJzIGEgc2V0IG9mIFBTUi0wIGRpcmVjdG9yaWVzIGZvciBhIGdpdmVuIHByZWZpeCwKICAgICAqIHJlcGxhY2luZyBhbnkgb3RoZXJzIHByZXZpb3VzbHkgc2V0IGZvciB0aGlzIHByZWZpeC4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgICAgICAgICAkcHJlZml4IFRoZSBwcmVmaXgKICAgICAqIEBwYXJhbSBsaXN0PHN0cmluZz58c3RyaW5nICRwYXRocyAgVGhlIFBTUi0wIGJhc2UgZGlyZWN0b3JpZXMKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldCgkcHJlZml4LCAkcGF0aHMpCiAgICB7CiAgICAgICAgaWYgKCEkcHJlZml4KSB7CiAgICAgICAgICAgICR0aGlzLT5mYWxsYmFja0RpcnNQc3IwID0gKGFycmF5KSAkcGF0aHM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPnByZWZpeGVzUHNyMFskcHJlZml4WzBdXVskcHJlZml4XSA9IChhcnJheSkgJHBhdGhzOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhIHNldCBvZiBQU1ItNCBkaXJlY3RvcmllcyBmb3IgYSBnaXZlbiBuYW1lc3BhY2UsCiAgICAgKiByZXBsYWNpbmcgYW55IG90aGVycyBwcmV2aW91c2x5IHNldCBmb3IgdGhpcyBuYW1lc3BhY2UuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgICAgICAgICAgICAgJHByZWZpeCBUaGUgcHJlZml4L25hbWVzcGFjZSwgd2l0aCB0cmFpbGluZyAnXFwnCiAgICAgKiBAcGFyYW0gbGlzdDxzdHJpbmc+fHN0cmluZyAkcGF0aHMgIFRoZSBQU1ItNCBiYXNlIGRpcmVjdG9yaWVzCiAgICAgKgogICAgICogQHRocm93cyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRQc3I0KCRwcmVmaXgsICRwYXRocykKICAgIHsKICAgICAgICBpZiAoISRwcmVmaXgpIHsKICAgICAgICAgICAgJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjQgPSAoYXJyYXkpICRwYXRoczsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkbGVuZ3RoID0gc3RybGVuKCRwcmVmaXgpOwogICAgICAgICAgICBpZiAoJ1xcJyAhPT0gJHByZWZpeFskbGVuZ3RoIC0gMV0pIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJBIG5vbi1lbXB0eSBQU1ItNCBwcmVmaXggbXVzdCBlbmQgd2l0aCBhIG5hbWVzcGFjZSBzZXBhcmF0b3IuIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPnByZWZpeExlbmd0aHNQc3I0WyRwcmVmaXhbMF1dWyRwcmVmaXhdID0gJGxlbmd0aDsKICAgICAgICAgICAgJHRoaXMtPnByZWZpeERpcnNQc3I0WyRwcmVmaXhdID0gKGFycmF5KSAkcGF0aHM7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogVHVybnMgb24gc2VhcmNoaW5nIHRoZSBpbmNsdWRlIHBhdGggZm9yIGNsYXNzIGZpbGVzLgogICAgICoKICAgICAqIEBwYXJhbSBib29sICR1c2VJbmNsdWRlUGF0aAogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0VXNlSW5jbHVkZVBhdGgoJHVzZUluY2x1ZGVQYXRoKQogICAgewogICAgICAgICR0aGlzLT51c2VJbmNsdWRlUGF0aCA9ICR1c2VJbmNsdWRlUGF0aDsKICAgIH0KCiAgICAvKioKICAgICAqIENhbiBiZSB1c2VkIHRvIGNoZWNrIGlmIHRoZSBhdXRvbG9hZGVyIHVzZXMgdGhlIGluY2x1ZGUgcGF0aCB0byBjaGVjawogICAgICogZm9yIGNsYXNzZXMuCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRVc2VJbmNsdWRlUGF0aCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT51c2VJbmNsdWRlUGF0aDsKICAgIH0KCiAgICAvKioKICAgICAqIFR1cm5zIG9mZiBzZWFyY2hpbmcgdGhlIHByZWZpeCBhbmQgZmFsbGJhY2sgZGlyZWN0b3JpZXMgZm9yIGNsYXNzZXMKICAgICAqIHRoYXQgaGF2ZSBub3QgYmVlbiByZWdpc3RlcmVkIHdpdGggdGhlIGNsYXNzIG1hcC4KICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbCAkY2xhc3NNYXBBdXRob3JpdGF0aXZlCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRDbGFzc01hcEF1dGhvcml0YXRpdmUoJGNsYXNzTWFwQXV0aG9yaXRhdGl2ZSkKICAgIHsKICAgICAgICAkdGhpcy0+Y2xhc3NNYXBBdXRob3JpdGF0aXZlID0gJGNsYXNzTWFwQXV0aG9yaXRhdGl2ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFNob3VsZCBjbGFzcyBsb29rdXAgZmFpbCBpZiBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgY2xhc3MgbWFwPwogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNDbGFzc01hcEF1dGhvcml0YXRpdmUoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Y2xhc3NNYXBBdXRob3JpdGF0aXZlOwogICAgfQoKICAgIC8qKgogICAgICogQVBDdSBwcmVmaXggdG8gdXNlIHRvIGNhY2hlIGZvdW5kL25vdC1mb3VuZCBjbGFzc2VzLCBpZiB0aGUgZXh0ZW5zaW9uIGlzIGVuYWJsZWQuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZ3xudWxsICRhcGN1UHJlZml4CiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRBcGN1UHJlZml4KCRhcGN1UHJlZml4KQogICAgewogICAgICAgICR0aGlzLT5hcGN1UHJlZml4ID0gZnVuY3Rpb25fZXhpc3RzKCdhcGN1X2ZldGNoJykgJiYgZmlsdGVyX3ZhcihpbmlfZ2V0KCdhcGMuZW5hYmxlZCcpLCBGSUxURVJfVkFMSURBVEVfQk9PTEVBTikgPyAkYXBjdVByZWZpeCA6IG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGUgQVBDdSBwcmVmaXggaW4gdXNlLCBvciBudWxsIGlmIEFQQ3UgY2FjaGluZyBpcyBub3QgZW5hYmxlZC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZ3xudWxsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBcGN1UHJlZml4KCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFwY3VQcmVmaXg7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgdGhpcyBpbnN0YW5jZSBhcyBhbiBhdXRvbG9hZGVyLgogICAgICoKICAgICAqIEBwYXJhbSBib29sICRwcmVwZW5kIFdoZXRoZXIgdG8gcHJlcGVuZCB0aGUgYXV0b2xvYWRlciBvciBub3QKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHJlZ2lzdGVyKCRwcmVwZW5kID0gZmFsc2UpCiAgICB7CiAgICAgICAgc3BsX2F1dG9sb2FkX3JlZ2lzdGVyKGFycmF5KCR0aGlzLCAnbG9hZENsYXNzJyksIHRydWUsICRwcmVwZW5kKTsKCiAgICAgICAgaWYgKG51bGwgPT09ICR0aGlzLT52ZW5kb3JEaXIpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRwcmVwZW5kKSB7CiAgICAgICAgICAgIHNlbGY6OiRyZWdpc3RlcmVkTG9hZGVycyA9IGFycmF5KCR0aGlzLT52ZW5kb3JEaXIgPT4gJHRoaXMpICsgc2VsZjo6JHJlZ2lzdGVyZWRMb2FkZXJzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHVuc2V0KHNlbGY6OiRyZWdpc3RlcmVkTG9hZGVyc1skdGhpcy0+dmVuZG9yRGlyXSk7CiAgICAgICAgICAgIHNlbGY6OiRyZWdpc3RlcmVkTG9hZGVyc1skdGhpcy0+dmVuZG9yRGlyXSA9ICR0aGlzOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFVucmVnaXN0ZXJzIHRoaXMgaW5zdGFuY2UgYXMgYW4gYXV0b2xvYWRlci4KICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHVucmVnaXN0ZXIoKQogICAgewogICAgICAgIHNwbF9hdXRvbG9hZF91bnJlZ2lzdGVyKGFycmF5KCR0aGlzLCAnbG9hZENsYXNzJykpOwoKICAgICAgICBpZiAobnVsbCAhPT0gJHRoaXMtPnZlbmRvckRpcikgewogICAgICAgICAgICB1bnNldChzZWxmOjokcmVnaXN0ZXJlZExvYWRlcnNbJHRoaXMtPnZlbmRvckRpcl0pOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIExvYWRzIHRoZSBnaXZlbiBjbGFzcyBvciBpbnRlcmZhY2UuCiAgICAgKgogICAgICogQHBhcmFtICBzdHJpbmcgICAgJGNsYXNzIFRoZSBuYW1lIG9mIHRoZSBjbGFzcwogICAgICogQHJldHVybiB0cnVlfG51bGwgVHJ1ZSBpZiBsb2FkZWQsIG51bGwgb3RoZXJ3aXNlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBsb2FkQ2xhc3MoJGNsYXNzKQogICAgewogICAgICAgIGlmICgkZmlsZSA9ICR0aGlzLT5maW5kRmlsZSgkY2xhc3MpKSB7CiAgICAgICAgICAgICRpbmNsdWRlRmlsZSA9IHNlbGY6OiRpbmNsdWRlRmlsZTsKICAgICAgICAgICAgJGluY2x1ZGVGaWxlKCRmaWxlKTsKCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBGaW5kcyB0aGUgcGF0aCB0byB0aGUgZmlsZSB3aGVyZSB0aGUgY2xhc3MgaXMgZGVmaW5lZC4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRjbGFzcyBUaGUgbmFtZSBvZiB0aGUgY2xhc3MKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZ3xmYWxzZSBUaGUgcGF0aCBpZiBmb3VuZCwgZmFsc2Ugb3RoZXJ3aXNlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBmaW5kRmlsZSgkY2xhc3MpCiAgICB7CiAgICAgICAgLy8gY2xhc3MgbWFwIGxvb2t1cAogICAgICAgIGlmIChpc3NldCgkdGhpcy0+Y2xhc3NNYXBbJGNsYXNzXSkpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5jbGFzc01hcFskY2xhc3NdOwogICAgICAgIH0KICAgICAgICBpZiAoJHRoaXMtPmNsYXNzTWFwQXV0aG9yaXRhdGl2ZSB8fCBpc3NldCgkdGhpcy0+bWlzc2luZ0NsYXNzZXNbJGNsYXNzXSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAobnVsbCAhPT0gJHRoaXMtPmFwY3VQcmVmaXgpIHsKICAgICAgICAgICAgJGZpbGUgPSBhcGN1X2ZldGNoKCR0aGlzLT5hcGN1UHJlZml4LiRjbGFzcywgJGhpdCk7CiAgICAgICAgICAgIGlmICgkaGl0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGZpbGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRmaWxlID0gJHRoaXMtPmZpbmRGaWxlV2l0aEV4dGVuc2lvbigkY2xhc3MsICcucGhwJyk7CgogICAgICAgIC8vIFNlYXJjaCBmb3IgSGFjayBmaWxlcyBpZiB3ZSBhcmUgcnVubmluZyBvbiBISFZNCiAgICAgICAgaWYgKGZhbHNlID09PSAkZmlsZSAmJiBkZWZpbmVkKCdISFZNX1ZFUlNJT04nKSkgewogICAgICAgICAgICAkZmlsZSA9ICR0aGlzLT5maW5kRmlsZVdpdGhFeHRlbnNpb24oJGNsYXNzLCAnLmhoJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAobnVsbCAhPT0gJHRoaXMtPmFwY3VQcmVmaXgpIHsKICAgICAgICAgICAgYXBjdV9hZGQoJHRoaXMtPmFwY3VQcmVmaXguJGNsYXNzLCAkZmlsZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoZmFsc2UgPT09ICRmaWxlKSB7CiAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoYXQgdGhpcyBjbGFzcyBkb2VzIG5vdCBleGlzdC4KICAgICAgICAgICAgJHRoaXMtPm1pc3NpbmdDbGFzc2VzWyRjbGFzc10gPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRmaWxlOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IHJlZ2lzdGVyZWQgbG9hZGVycyBrZXllZCBieSB0aGVpciBjb3JyZXNwb25kaW5nIHZlbmRvciBkaXJlY3Rvcmllcy4KICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5PHN0cmluZywgc2VsZj4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRSZWdpc3RlcmVkTG9hZGVycygpCiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OiRyZWdpc3RlcmVkTG9hZGVyczsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSAgc3RyaW5nICAgICAgICRjbGFzcwogICAgICogQHBhcmFtICBzdHJpbmcgICAgICAgJGV4dAogICAgICogQHJldHVybiBzdHJpbmd8ZmFsc2UKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBmaW5kRmlsZVdpdGhFeHRlbnNpb24oJGNsYXNzLCAkZXh0KQogICAgewogICAgICAgIC8vIFBTUi00IGxvb2t1cAogICAgICAgICRsb2dpY2FsUGF0aFBzcjQgPSBzdHJ0cigkY2xhc3MsICdcXCcsIERJUkVDVE9SWV9TRVBBUkFUT1IpIC4gJGV4dDsKCiAgICAgICAgJGZpcnN0ID0gJGNsYXNzWzBdOwogICAgICAgIGlmIChpc3NldCgkdGhpcy0+cHJlZml4TGVuZ3Roc1BzcjRbJGZpcnN0XSkpIHsKICAgICAgICAgICAgJHN1YlBhdGggPSAkY2xhc3M7CiAgICAgICAgICAgIHdoaWxlIChmYWxzZSAhPT0gJGxhc3RQb3MgPSBzdHJycG9zKCRzdWJQYXRoLCAnXFwnKSkgewogICAgICAgICAgICAgICAgJHN1YlBhdGggPSBzdWJzdHIoJHN1YlBhdGgsIDAsICRsYXN0UG9zKTsKICAgICAgICAgICAgICAgICRzZWFyY2ggPSAkc3ViUGF0aCAuICdcXCc7CiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPnByZWZpeERpcnNQc3I0WyRzZWFyY2hdKSkgewogICAgICAgICAgICAgICAgICAgICRwYXRoRW5kID0gRElSRUNUT1JZX1NFUEFSQVRPUiAuIHN1YnN0cigkbG9naWNhbFBhdGhQc3I0LCAkbGFzdFBvcyArIDEpOwogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5wcmVmaXhEaXJzUHNyNFskc2VhcmNoXSBhcyAkZGlyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkZmlsZSA9ICRkaXIgLiAkcGF0aEVuZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkZmlsZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gUFNSLTQgZmFsbGJhY2sgZGlycwogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5mYWxsYmFja0RpcnNQc3I0IGFzICRkaXIpIHsKICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRmaWxlID0gJGRpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkbG9naWNhbFBhdGhQc3I0KSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRmaWxlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBQU1ItMCBsb29rdXAKICAgICAgICBpZiAoZmFsc2UgIT09ICRwb3MgPSBzdHJycG9zKCRjbGFzcywgJ1xcJykpIHsKICAgICAgICAgICAgLy8gbmFtZXNwYWNlZCBjbGFzcyBuYW1lCiAgICAgICAgICAgICRsb2dpY2FsUGF0aFBzcjAgPSBzdWJzdHIoJGxvZ2ljYWxQYXRoUHNyNCwgMCwgJHBvcyArIDEpCiAgICAgICAgICAgICAgICAuIHN0cnRyKHN1YnN0cigkbG9naWNhbFBhdGhQc3I0LCAkcG9zICsgMSksICdfJywgRElSRUNUT1JZX1NFUEFSQVRPUik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gUEVBUi1saWtlIGNsYXNzIG5hbWUKICAgICAgICAgICAgJGxvZ2ljYWxQYXRoUHNyMCA9IHN0cnRyKCRjbGFzcywgJ18nLCBESVJFQ1RPUllfU0VQQVJBVE9SKSAuICRleHQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPnByZWZpeGVzUHNyMFskZmlyc3RdKSkgewogICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+cHJlZml4ZXNQc3IwWyRmaXJzdF0gYXMgJHByZWZpeCA9PiAkZGlycykgewogICAgICAgICAgICAgICAgaWYgKDAgPT09IHN0cnBvcygkY2xhc3MsICRwcmVmaXgpKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGRpcnMgYXMgJGRpcikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJGZpbGUgPSAkZGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRsb2dpY2FsUGF0aFBzcjApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGZpbGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFBTUi0wIGZhbGxiYWNrIGRpcnMKICAgICAgICBmb3JlYWNoICgkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyMCBhcyAkZGlyKSB7CiAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkZmlsZSA9ICRkaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGxvZ2ljYWxQYXRoUHNyMCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkZmlsZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gUFNSLTAgaW5jbHVkZSBwYXRocy4KICAgICAgICBpZiAoJHRoaXMtPnVzZUluY2x1ZGVQYXRoICYmICRmaWxlID0gc3RyZWFtX3Jlc29sdmVfaW5jbHVkZV9wYXRoKCRsb2dpY2FsUGF0aFBzcjApKSB7CiAgICAgICAgICAgIHJldHVybiAkZmlsZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpbml0aWFsaXplSW5jbHVkZUNsb3N1cmUoKQogICAgewogICAgICAgIGlmIChzZWxmOjokaW5jbHVkZUZpbGUgIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogU2NvcGUgaXNvbGF0ZWQgaW5jbHVkZS4KICAgICAgICAgKgogICAgICAgICAqIFByZXZlbnRzIGFjY2VzcyB0byAkdGhpcy9zZWxmIGZyb20gaW5jbHVkZWQgZmlsZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gIHN0cmluZyAkZmlsZQogICAgICAgICAqIEByZXR1cm4gdm9pZAogICAgICAgICAqLwogICAgICAgIHNlbGY6OiRpbmNsdWRlRmlsZSA9IFxDbG9zdXJlOjpiaW5kKHN0YXRpYyBmdW5jdGlvbigkZmlsZSkgewogICAgICAgICAgICBpbmNsdWRlICRmaWxlOwogICAgICAgIH0sIG51bGwsIG51bGwpOwogICAgfQp9Cjw/cGhwCgovKgogKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBDb21wb3Nlci4KICoKICogKGMpIE5pbHMgQWRlcm1hbm4gPG5hZGVybWFuQG5hZGVybWFuLmRlPgogKiAgICAgSm9yZGkgQm9nZ2lhbm8gPGouYm9nZ2lhbm9Ac2VsZC5iZT4KICoKICogRm9yIHRoZSBmdWxsIGNvcHlyaWdodCBhbmQgbGljZW5zZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHZpZXcgdGhlIExJQ0VOU0UKICogZmlsZSB0aGF0IHdhcyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc291cmNlIGNvZGUuCiAqLwoKbmFtZXNwYWNlIENvbXBvc2VyOwoKdXNlIENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyOwp1c2UgQ29tcG9zZXJcU2VtdmVyXFZlcnNpb25QYXJzZXI7CgovKioKICogVGhpcyBjbGFzcyBpcyBjb3BpZWQgaW4gZXZlcnkgQ29tcG9zZXIgaW5zdGFsbGVkIHByb2plY3QgYW5kIGF2YWlsYWJsZSB0byBhbGwKICoKICogU2VlIGFsc28gaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzA3LXJ1bnRpbWUubWQjaW5zdGFsbGVkLXZlcnNpb25zCiAqCiAqIFRvIHJlcXVpcmUgaXRzIHByZXNlbmNlLCB5b3UgY2FuIHJlcXVpcmUgYGNvbXBvc2VyLXJ1bnRpbWUtYXBpIF4yLjBgCiAqCiAqIEBmaW5hbAogKi8KY2xhc3MgSW5zdGFsbGVkVmVyc2lvbnMKewogICAgLyoqCiAgICAgKiBAdmFyIHN0cmluZ3xudWxsIGlmIHNldCAoYnkgcmVmbGVjdGlvbiBieSBDb21wb3NlciksIHRoaXMgc2hvdWxkIGJlIHNldCB0byB0aGUgcGF0aCB3aGVyZSB0aGlzIGNsYXNzIGlzIGJlaW5nIGNvcGllZCB0bwogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljICRzZWxmRGlyID0gbnVsbDsKCiAgICAvKioKICAgICAqIEB2YXIgbWl4ZWRbXXxudWxsCiAgICAgKiBAcHNhbG0tdmFyIGFycmF5e3Jvb3Q6IGFycmF5e25hbWU6IHN0cmluZywgcHJldHR5X3ZlcnNpb246IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCByZWZlcmVuY2U6IHN0cmluZ3xudWxsLCB0eXBlOiBzdHJpbmcsIGluc3RhbGxfcGF0aDogc3RyaW5nLCBhbGlhc2VzOiBzdHJpbmdbXSwgZGV2OiBib29sfSwgdmVyc2lvbnM6IGFycmF5PHN0cmluZywgYXJyYXl7cHJldHR5X3ZlcnNpb24/OiBzdHJpbmcsIHZlcnNpb24/OiBzdHJpbmcsIHJlZmVyZW5jZT86IHN0cmluZ3xudWxsLCB0eXBlPzogc3RyaW5nLCBpbnN0YWxsX3BhdGg/OiBzdHJpbmcsIGFsaWFzZXM/OiBzdHJpbmdbXSwgZGV2X3JlcXVpcmVtZW50OiBib29sLCByZXBsYWNlZD86IHN0cmluZ1tdLCBwcm92aWRlZD86IHN0cmluZ1tdfT59fGFycmF5e318bnVsbAogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyAkaW5zdGFsbGVkOwoKICAgIC8qKgogICAgICogQHZhciBib29sCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljICRpbnN0YWxsZWRJc0xvY2FsRGlyOwoKICAgIC8qKgogICAgICogQHZhciBib29sfG51bGwKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgJGNhbkdldFZlbmRvcnM7CgogICAgLyoqCiAgICAgKiBAdmFyIGFycmF5W10KICAgICAqIEBwc2FsbS12YXIgYXJyYXk8c3RyaW5nLCBhcnJheXtyb290OiBhcnJheXtuYW1lOiBzdHJpbmcsIHByZXR0eV92ZXJzaW9uOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgcmVmZXJlbmNlOiBzdHJpbmd8bnVsbCwgdHlwZTogc3RyaW5nLCBpbnN0YWxsX3BhdGg6IHN0cmluZywgYWxpYXNlczogc3RyaW5nW10sIGRldjogYm9vbH0sIHZlcnNpb25zOiBhcnJheTxzdHJpbmcsIGFycmF5e3ByZXR0eV92ZXJzaW9uPzogc3RyaW5nLCB2ZXJzaW9uPzogc3RyaW5nLCByZWZlcmVuY2U/OiBzdHJpbmd8bnVsbCwgdHlwZT86IHN0cmluZywgaW5zdGFsbF9wYXRoPzogc3RyaW5nLCBhbGlhc2VzPzogc3RyaW5nW10sIGRldl9yZXF1aXJlbWVudDogYm9vbCwgcmVwbGFjZWQ/OiBzdHJpbmdbXSwgcHJvdmlkZWQ/OiBzdHJpbmdbXX0+fT4KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgJGluc3RhbGxlZEJ5VmVuZG9yID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBwYWNrYWdlIG5hbWVzIHdoaWNoIGFyZSBwcmVzZW50LCBlaXRoZXIgYnkgYmVpbmcgaW5zdGFsbGVkLCByZXBsYWNlZCBvciBwcm92aWRlZAogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nW10KICAgICAqIEBwc2FsbS1yZXR1cm4gbGlzdDxzdHJpbmc+CiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0SW5zdGFsbGVkUGFja2FnZXMoKQogICAgewogICAgICAgICRwYWNrYWdlcyA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewogICAgICAgICAgICAkcGFja2FnZXNbXSA9IGFycmF5X2tleXMoJGluc3RhbGxlZFsndmVyc2lvbnMnXSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoMSA9PT0gXGNvdW50KCRwYWNrYWdlcykpIHsKICAgICAgICAgICAgcmV0dXJuICRwYWNrYWdlc1swXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBhcnJheV9rZXlzKGFycmF5X2ZsaXAoXGNhbGxfdXNlcl9mdW5jX2FycmF5KCdhcnJheV9tZXJnZScsICRwYWNrYWdlcykpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBwYWNrYWdlIG5hbWVzIHdpdGggYSBzcGVjaWZpYyB0eXBlIGUuZy4gJ2xpYnJhcnknCiAgICAgKgogICAgICogQHBhcmFtICBzdHJpbmcgICAkdHlwZQogICAgICogQHJldHVybiBzdHJpbmdbXQogICAgICogQHBzYWxtLXJldHVybiBsaXN0PHN0cmluZz4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRJbnN0YWxsZWRQYWNrYWdlc0J5VHlwZSgkdHlwZSkKICAgIHsKICAgICAgICAkcGFja2FnZXNCeVR5cGUgPSBhcnJheSgpOwoKICAgICAgICBmb3JlYWNoIChzZWxmOjpnZXRJbnN0YWxsZWQoKSBhcyAkaW5zdGFsbGVkKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ10gYXMgJG5hbWUgPT4gJHBhY2thZ2UpIHsKICAgICAgICAgICAgICAgIGlmIChpc3NldCgkcGFja2FnZVsndHlwZSddKSAmJiAkcGFja2FnZVsndHlwZSddID09PSAkdHlwZSkgewogICAgICAgICAgICAgICAgICAgICRwYWNrYWdlc0J5VHlwZVtdID0gJG5hbWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkcGFja2FnZXNCeVR5cGU7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gcGFja2FnZSBpcyBpbnN0YWxsZWQKICAgICAqCiAgICAgKiBUaGlzIGFsc28gcmV0dXJucyB0cnVlIGlmIHRoZSBwYWNrYWdlIG5hbWUgaXMgcHJvdmlkZWQgb3IgcmVwbGFjZWQgYnkgYW5vdGhlciBwYWNrYWdlCiAgICAgKgogICAgICogQHBhcmFtICBzdHJpbmcgJHBhY2thZ2VOYW1lCiAgICAgKiBAcGFyYW0gIGJvb2wgICAkaW5jbHVkZURldlJlcXVpcmVtZW50cwogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNJbnN0YWxsZWQoJHBhY2thZ2VOYW1lLCAkaW5jbHVkZURldlJlcXVpcmVtZW50cyA9IHRydWUpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewogICAgICAgICAgICBpZiAoaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRpbmNsdWRlRGV2UmVxdWlyZW1lbnRzIHx8ICFpc3NldCgkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ2Rldl9yZXF1aXJlbWVudCddKSB8fCAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ2Rldl9yZXF1aXJlbWVudCddID09PSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHBhY2thZ2Ugc2F0aXNmaWVzIGEgdmVyc2lvbiBjb25zdHJhaW50CiAgICAgKgogICAgICogZS5nLiBJZiB5b3Ugd2FudCB0byBrbm93IHdoZXRoZXIgdmVyc2lvbiAyLjMrIG9mIHBhY2thZ2UgZm9vL2JhciBpcyBpbnN0YWxsZWQsIHlvdSB3b3VsZCBjYWxsOgogICAgICoKICAgICAqICAgQ29tcG9zZXJcSW5zdGFsbGVkVmVyc2lvbnM6OnNhdGlzZmllcyhuZXcgVmVyc2lvblBhcnNlciwgJ2Zvby9iYXInLCAnXjIuMycpCiAgICAgKgogICAgICogQHBhcmFtICBWZXJzaW9uUGFyc2VyICRwYXJzZXIgICAgICBJbnN0YWxsIGNvbXBvc2VyL3NlbXZlciB0byBoYXZlIGFjY2VzcyB0byB0aGlzIGNsYXNzIGFuZCBmdW5jdGlvbmFsaXR5CiAgICAgKiBAcGFyYW0gIHN0cmluZyAgICAgICAgJHBhY2thZ2VOYW1lCiAgICAgKiBAcGFyYW0gIHN0cmluZ3xudWxsICAgJGNvbnN0cmFpbnQgIEEgdmVyc2lvbiBjb25zdHJhaW50IHRvIGNoZWNrIGZvciwgaWYgeW91IHBhc3Mgb25lIHlvdSBoYXZlIHRvIG1ha2Ugc3VyZSBjb21wb3Nlci9zZW12ZXIgaXMgcmVxdWlyZWQgYnkgeW91ciBwYWNrYWdlCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzYXRpc2ZpZXMoVmVyc2lvblBhcnNlciAkcGFyc2VyLCAkcGFja2FnZU5hbWUsICRjb25zdHJhaW50KQogICAgewogICAgICAgICRjb25zdHJhaW50ID0gJHBhcnNlci0+cGFyc2VDb25zdHJhaW50cygoc3RyaW5nKSAkY29uc3RyYWludCk7CiAgICAgICAgJHByb3ZpZGVkID0gJHBhcnNlci0+cGFyc2VDb25zdHJhaW50cyhzZWxmOjpnZXRWZXJzaW9uUmFuZ2VzKCRwYWNrYWdlTmFtZSkpOwoKICAgICAgICByZXR1cm4gJHByb3ZpZGVkLT5tYXRjaGVzKCRjb25zdHJhaW50KTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSB2ZXJzaW9uIGNvbnN0cmFpbnQgcmVwcmVzZW50aW5nIGFsbCB0aGUgcmFuZ2Uocykgd2hpY2ggYXJlIGluc3RhbGxlZCBmb3IgYSBnaXZlbiBwYWNrYWdlCiAgICAgKgogICAgICogSXQgaXMgZWFzaWVyIHRvIHVzZSB0aGlzIHZpYSBpc0luc3RhbGxlZCgpIHdpdGggdGhlICRjb25zdHJhaW50IGFyZ3VtZW50IGlmIHlvdSBuZWVkIHRvIGNoZWNrCiAgICAgKiB3aGV0aGVyIGEgZ2l2ZW4gdmVyc2lvbiBvZiBhIHBhY2thZ2UgaXMgaW5zdGFsbGVkLCBhbmQgbm90IGp1c3Qgd2hldGhlciBpdCBleGlzdHMKICAgICAqCiAgICAgKiBAcGFyYW0gIHN0cmluZyAkcGFja2FnZU5hbWUKICAgICAqIEByZXR1cm4gc3RyaW5nIFZlcnNpb24gY29uc3RyYWludCB1c2FibGUgd2l0aCBjb21wb3Nlci9zZW12ZXIKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRWZXJzaW9uUmFuZ2VzKCRwYWNrYWdlTmFtZSkKICAgIHsKICAgICAgICBmb3JlYWNoIChzZWxmOjpnZXRJbnN0YWxsZWQoKSBhcyAkaW5zdGFsbGVkKSB7CiAgICAgICAgICAgIGlmICghaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRyYW5nZXMgPSBhcnJheSgpOwogICAgICAgICAgICBpZiAoaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydwcmV0dHlfdmVyc2lvbiddKSkgewogICAgICAgICAgICAgICAgJHJhbmdlc1tdID0gJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydwcmV0dHlfdmVyc2lvbiddOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCdhbGlhc2VzJywgJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewogICAgICAgICAgICAgICAgJHJhbmdlcyA9IGFycmF5X21lcmdlKCRyYW5nZXMsICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsnYWxpYXNlcyddKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygncmVwbGFjZWQnLCAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV0pKSB7CiAgICAgICAgICAgICAgICAkcmFuZ2VzID0gYXJyYXlfbWVyZ2UoJHJhbmdlcywgJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydyZXBsYWNlZCddKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygncHJvdmlkZWQnLCAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV0pKSB7CiAgICAgICAgICAgICAgICAkcmFuZ2VzID0gYXJyYXlfbWVyZ2UoJHJhbmdlcywgJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydwcm92aWRlZCddKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGltcGxvZGUoJyB8fCAnLCAkcmFuZ2VzKTsKICAgICAgICB9CgogICAgICAgIHRocm93IG5ldyBcT3V0T2ZCb3VuZHNFeGNlcHRpb24oJ1BhY2thZ2UgIicgLiAkcGFja2FnZU5hbWUgLiAnIiBpcyBub3QgaW5zdGFsbGVkJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gIHN0cmluZyAgICAgICRwYWNrYWdlTmFtZQogICAgICogQHJldHVybiBzdHJpbmd8bnVsbCBJZiB0aGUgcGFja2FnZSBpcyBiZWluZyByZXBsYWNlZCBvciBwcm92aWRlZCBidXQgaXMgbm90IHJlYWxseSBpbnN0YWxsZWQsIG51bGwgd2lsbCBiZSByZXR1cm5lZCBhcyB2ZXJzaW9uLCB1c2Ugc2F0aXNmaWVzIG9yIGdldFZlcnNpb25SYW5nZXMgaWYgeW91IG5lZWQgdG8ga25vdyBpZiBhIGdpdmVuIHZlcnNpb24gaXMgcHJlc2VudAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFZlcnNpb24oJHBhY2thZ2VOYW1lKQogICAgewogICAgICAgIGZvcmVhY2ggKHNlbGY6OmdldEluc3RhbGxlZCgpIGFzICRpbnN0YWxsZWQpIHsKICAgICAgICAgICAgaWYgKCFpc3NldCgkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV0pKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFpc3NldCgkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ3ZlcnNpb24nXSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWyd2ZXJzaW9uJ107CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBuZXcgXE91dE9mQm91bmRzRXhjZXB0aW9uKCdQYWNrYWdlICInIC4gJHBhY2thZ2VOYW1lIC4gJyIgaXMgbm90IGluc3RhbGxlZCcpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtICBzdHJpbmcgICAgICAkcGFja2FnZU5hbWUKICAgICAqIEByZXR1cm4gc3RyaW5nfG51bGwgSWYgdGhlIHBhY2thZ2UgaXMgYmVpbmcgcmVwbGFjZWQgb3IgcHJvdmlkZWQgYnV0IGlzIG5vdCByZWFsbHkgaW5zdGFsbGVkLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQgYXMgdmVyc2lvbiwgdXNlIHNhdGlzZmllcyBvciBnZXRWZXJzaW9uUmFuZ2VzIGlmIHlvdSBuZWVkIHRvIGtub3cgaWYgYSBnaXZlbiB2ZXJzaW9uIGlzIHByZXNlbnQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRQcmV0dHlWZXJzaW9uKCRwYWNrYWdlTmFtZSkKICAgIHsKICAgICAgICBmb3JlYWNoIChzZWxmOjpnZXRJbnN0YWxsZWQoKSBhcyAkaW5zdGFsbGVkKSB7CiAgICAgICAgICAgIGlmICghaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydwcmV0dHlfdmVyc2lvbiddKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ3ByZXR0eV92ZXJzaW9uJ107CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBuZXcgXE91dE9mQm91bmRzRXhjZXB0aW9uKCdQYWNrYWdlICInIC4gJHBhY2thZ2VOYW1lIC4gJyIgaXMgbm90IGluc3RhbGxlZCcpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtICBzdHJpbmcgICAgICAkcGFja2FnZU5hbWUKICAgICAqIEByZXR1cm4gc3RyaW5nfG51bGwgSWYgdGhlIHBhY2thZ2UgaXMgYmVpbmcgcmVwbGFjZWQgb3IgcHJvdmlkZWQgYnV0IGlzIG5vdCByZWFsbHkgaW5zdGFsbGVkLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQgYXMgcmVmZXJlbmNlCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UmVmZXJlbmNlKCRwYWNrYWdlTmFtZSkKICAgIHsKICAgICAgICBmb3JlYWNoIChzZWxmOjpnZXRJbnN0YWxsZWQoKSBhcyAkaW5zdGFsbGVkKSB7CiAgICAgICAgICAgIGlmICghaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydyZWZlcmVuY2UnXSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydyZWZlcmVuY2UnXTsKICAgICAgICB9CgogICAgICAgIHRocm93IG5ldyBcT3V0T2ZCb3VuZHNFeGNlcHRpb24oJ1BhY2thZ2UgIicgLiAkcGFja2FnZU5hbWUgLiAnIiBpcyBub3QgaW5zdGFsbGVkJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gIHN0cmluZyAgICAgICRwYWNrYWdlTmFtZQogICAgICogQHJldHVybiBzdHJpbmd8bnVsbCBJZiB0aGUgcGFja2FnZSBpcyBiZWluZyByZXBsYWNlZCBvciBwcm92aWRlZCBidXQgaXMgbm90IHJlYWxseSBpbnN0YWxsZWQsIG51bGwgd2lsbCBiZSByZXR1cm5lZCBhcyBpbnN0YWxsIHBhdGguIFBhY2thZ2VzIG9mIHR5cGUgbWV0YXBhY2thZ2VzIGFsc28gaGF2ZSBhIG51bGwgaW5zdGFsbCBwYXRoLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEluc3RhbGxQYXRoKCRwYWNrYWdlTmFtZSkKICAgIHsKICAgICAgICBmb3JlYWNoIChzZWxmOjpnZXRJbnN0YWxsZWQoKSBhcyAkaW5zdGFsbGVkKSB7CiAgICAgICAgICAgIGlmICghaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpc3NldCgkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ2luc3RhbGxfcGF0aCddKSA/ICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsnaW5zdGFsbF9wYXRoJ10gOiBudWxsOwogICAgICAgIH0KCiAgICAgICAgdGhyb3cgbmV3IFxPdXRPZkJvdW5kc0V4Y2VwdGlvbignUGFja2FnZSAiJyAuICRwYWNrYWdlTmFtZSAuICciIGlzIG5vdCBpbnN0YWxsZWQnKTsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqIEBwc2FsbS1yZXR1cm4gYXJyYXl7bmFtZTogc3RyaW5nLCBwcmV0dHlfdmVyc2lvbjogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIHJlZmVyZW5jZTogc3RyaW5nfG51bGwsIHR5cGU6IHN0cmluZywgaW5zdGFsbF9wYXRoOiBzdHJpbmcsIGFsaWFzZXM6IHN0cmluZ1tdLCBkZXY6IGJvb2x9CiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Um9vdFBhY2thZ2UoKQogICAgewogICAgICAgICRpbnN0YWxsZWQgPSBzZWxmOjpnZXRJbnN0YWxsZWQoKTsKCiAgICAgICAgcmV0dXJuICRpbnN0YWxsZWRbMF1bJ3Jvb3QnXTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJhdyBpbnN0YWxsZWQucGhwIGRhdGEgZm9yIGN1c3RvbSBpbXBsZW1lbnRhdGlvbnMKICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgZ2V0QWxsUmF3RGF0YSgpIGluc3RlYWQgd2hpY2ggcmV0dXJucyBhbGwgZGF0YXNldHMgZm9yIGFsbCBhdXRvbG9hZGVycyBwcmVzZW50IGluIHRoZSBwcm9jZXNzLiBnZXRSYXdEYXRhIG9ubHkgcmV0dXJucyB0aGUgZmlyc3QgZGF0YXNldCBsb2FkZWQsIHdoaWNoIG1heSBub3QgYmUgd2hhdCB5b3UgZXhwZWN0LgogICAgICogQHJldHVybiBhcnJheVtdCiAgICAgKiBAcHNhbG0tcmV0dXJuIGFycmF5e3Jvb3Q6IGFycmF5e25hbWU6IHN0cmluZywgcHJldHR5X3ZlcnNpb246IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCByZWZlcmVuY2U6IHN0cmluZ3xudWxsLCB0eXBlOiBzdHJpbmcsIGluc3RhbGxfcGF0aDogc3RyaW5nLCBhbGlhc2VzOiBzdHJpbmdbXSwgZGV2OiBib29sfSwgdmVyc2lvbnM6IGFycmF5PHN0cmluZywgYXJyYXl7cHJldHR5X3ZlcnNpb24/OiBzdHJpbmcsIHZlcnNpb24/OiBzdHJpbmcsIHJlZmVyZW5jZT86IHN0cmluZ3xudWxsLCB0eXBlPzogc3RyaW5nLCBpbnN0YWxsX3BhdGg/OiBzdHJpbmcsIGFsaWFzZXM/OiBzdHJpbmdbXSwgZGV2X3JlcXVpcmVtZW50OiBib29sLCByZXBsYWNlZD86IHN0cmluZ1tdLCBwcm92aWRlZD86IHN0cmluZ1tdfT59CiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UmF3RGF0YSgpCiAgICB7CiAgICAgICAgQHRyaWdnZXJfZXJyb3IoJ2dldFJhd0RhdGEgb25seSByZXR1cm5zIHRoZSBmaXJzdCBkYXRhc2V0IGxvYWRlZCwgd2hpY2ggbWF5IG5vdCBiZSB3aGF0IHlvdSBleHBlY3QuIFVzZSBnZXRBbGxSYXdEYXRhKCkgaW5zdGVhZCB3aGljaCByZXR1cm5zIGFsbCBkYXRhc2V0cyBmb3IgYWxsIGF1dG9sb2FkZXJzIHByZXNlbnQgaW4gdGhlIHByb2Nlc3MuJywgRV9VU0VSX0RFUFJFQ0FURUQpOwoKICAgICAgICBpZiAobnVsbCA9PT0gc2VsZjo6JGluc3RhbGxlZCkgewogICAgICAgICAgICAvLyBvbmx5IHJlcXVpcmUgdGhlIGluc3RhbGxlZC5waHAgZmlsZSBpZiB0aGlzIGZpbGUgaXMgbG9hZGVkIGZyb20gaXRzIGR1bXBlZCBsb2NhdGlvbiwKICAgICAgICAgICAgLy8gYW5kIG5vdCBmcm9tIGl0cyBzb3VyY2UgbG9jYXRpb24gaW4gdGhlIGNvbXBvc2VyL2NvbXBvc2VyIHBhY2thZ2UsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvY29tcG9zZXIvaXNzdWVzLzk5MzcKICAgICAgICAgICAgaWYgKHN1YnN0cihfX0RJUl9fLCAtOCwgMSkgIT09ICdDJykgewogICAgICAgICAgICAgICAgc2VsZjo6JGluc3RhbGxlZCA9IGluY2x1ZGUgX19ESVJfXyAuICcvaW5zdGFsbGVkLnBocCc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzZWxmOjokaW5zdGFsbGVkID0gYXJyYXkoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHNlbGY6OiRpbnN0YWxsZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByYXcgZGF0YSBvZiBhbGwgaW5zdGFsbGVkLnBocCB3aGljaCBhcmUgY3VycmVudGx5IGxvYWRlZCBmb3IgY3VzdG9tIGltcGxlbWVudGF0aW9ucwogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXlbXQogICAgICogQHBzYWxtLXJldHVybiBsaXN0PGFycmF5e3Jvb3Q6IGFycmF5e25hbWU6IHN0cmluZywgcHJldHR5X3ZlcnNpb246IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCByZWZlcmVuY2U6IHN0cmluZ3xudWxsLCB0eXBlOiBzdHJpbmcsIGluc3RhbGxfcGF0aDogc3RyaW5nLCBhbGlhc2VzOiBzdHJpbmdbXSwgZGV2OiBib29sfSwgdmVyc2lvbnM6IGFycmF5PHN0cmluZywgYXJyYXl7cHJldHR5X3ZlcnNpb24/OiBzdHJpbmcsIHZlcnNpb24/OiBzdHJpbmcsIHJlZmVyZW5jZT86IHN0cmluZ3xudWxsLCB0eXBlPzogc3RyaW5nLCBpbnN0YWxsX3BhdGg/OiBzdHJpbmcsIGFsaWFzZXM/OiBzdHJpbmdbXSwgZGV2X3JlcXVpcmVtZW50OiBib29sLCByZXBsYWNlZD86IHN0cmluZ1tdLCBwcm92aWRlZD86IHN0cmluZ1tdfT59PgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEFsbFJhd0RhdGEoKQogICAgewogICAgICAgIHJldHVybiBzZWxmOjpnZXRJbnN0YWxsZWQoKTsKICAgIH0KCiAgICAvKioKICAgICAqIExldHMgeW91IHJlbG9hZCB0aGUgc3RhdGljIGFycmF5IGZyb20gYW5vdGhlciBmaWxlCiAgICAgKgogICAgICogVGhpcyBpcyBvbmx5IHVzZWZ1bCBmb3IgY29tcGxleCBpbnRlZ3JhdGlvbnMgaW4gd2hpY2ggYSBwcm9qZWN0IG5lZWRzIHRvIHVzZQogICAgICogdGhpcyBjbGFzcyBidXQgdGhlbiBhbHNvIG5lZWRzIHRvIGV4ZWN1dGUgYW5vdGhlciBwcm9qZWN0J3MgYXV0b2xvYWRlciBpbiBwcm9jZXNzLAogICAgICogYW5kIHdhbnRzIHRvIGVuc3VyZSBib3RoIHByb2plY3RzIGhhdmUgYWNjZXNzIHRvIHRoZWlyIHZlcnNpb24gb2YgaW5zdGFsbGVkLnBocC4KICAgICAqCiAgICAgKiBBIHR5cGljYWwgY2FzZSB3b3VsZCBiZSBQSFBVbml0LCB3aGVyZSBpdCB3b3VsZCBuZWVkIHRvIG1ha2Ugc3VyZSBpdCByZWFkcyBhbGwKICAgICAqIHRoZSBkYXRhIGl0IG5lZWRzIGZyb20gdGhpcyBjbGFzcywgdGhlbiBjYWxsIHJlbG9hZCgpIHdpdGgKICAgICAqIGByZXF1aXJlICRDV0QvdmVuZG9yL2NvbXBvc2VyL2luc3RhbGxlZC5waHBgIChvciBzaW1pbGFyKSBhcyBpbnB1dCB0byBtYWtlIHN1cmUKICAgICAqIHRoZSBwcm9qZWN0IGluIHdoaWNoIGl0IHJ1bnMgY2FuIHRoZW4gYWxzbyB1c2UgdGhpcyBjbGFzcyBzYWZlbHksIHdpdGhvdXQKICAgICAqIGludGVyZmVyZW5jZSBiZXR3ZWVuIFBIUFVuaXQncyBkZXBlbmRlbmNpZXMgYW5kIHRoZSBwcm9qZWN0J3MgZGVwZW5kZW5jaWVzLgogICAgICoKICAgICAqIEBwYXJhbSAgYXJyYXlbXSAkZGF0YSBBIHZlbmRvci9jb21wb3Nlci9pbnN0YWxsZWQucGhwIGRhdGEgc2V0CiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqCiAgICAgKiBAcHNhbG0tcGFyYW0gYXJyYXl7cm9vdDogYXJyYXl7bmFtZTogc3RyaW5nLCBwcmV0dHlfdmVyc2lvbjogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIHJlZmVyZW5jZTogc3RyaW5nfG51bGwsIHR5cGU6IHN0cmluZywgaW5zdGFsbF9wYXRoOiBzdHJpbmcsIGFsaWFzZXM6IHN0cmluZ1tdLCBkZXY6IGJvb2x9LCB2ZXJzaW9uczogYXJyYXk8c3RyaW5nLCBhcnJheXtwcmV0dHlfdmVyc2lvbj86IHN0cmluZywgdmVyc2lvbj86IHN0cmluZywgcmVmZXJlbmNlPzogc3RyaW5nfG51bGwsIHR5cGU/OiBzdHJpbmcsIGluc3RhbGxfcGF0aD86IHN0cmluZywgYWxpYXNlcz86IHN0cmluZ1tdLCBkZXZfcmVxdWlyZW1lbnQ6IGJvb2wsIHJlcGxhY2VkPzogc3RyaW5nW10sIHByb3ZpZGVkPzogc3RyaW5nW119Pn0gJGRhdGEKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZWxvYWQoJGRhdGEpCiAgICB7CiAgICAgICAgc2VsZjo6JGluc3RhbGxlZCA9ICRkYXRhOwogICAgICAgIHNlbGY6OiRpbnN0YWxsZWRCeVZlbmRvciA9IGFycmF5KCk7CgogICAgICAgIC8vIHdoZW4gdXNpbmcgcmVsb2FkLCB3ZSBkaXNhYmxlIHRoZSBkdXBsaWNhdGUgcHJvdGVjdGlvbiB0byBlbnN1cmUgdGhhdCBzZWxmOjokaW5zdGFsbGVkIGRhdGEgaXMKICAgICAgICAvLyBhbHdheXMgcmV0dXJuZWQsIGJ1dCB3ZSBjYW5ub3Qga25vdyB3aGV0aGVyIGl0IGNvbWVzIGZyb20gdGhlIGluc3RhbGxlZC5waHAgaW4gX19ESVJfXyBvciBub3QsCiAgICAgICAgLy8gc28gd2UgaGF2ZSB0byBhc3N1bWUgaXQgZG9lcyBub3QsIGFuZCB0aGF0IG1heSByZXN1bHQgaW4gZHVwbGljYXRlIGRhdGEgYmVpbmcgcmV0dXJuZWQgd2hlbiBsaXN0aW5nCiAgICAgICAgLy8gYWxsIGluc3RhbGxlZCBwYWNrYWdlcyBmb3IgZXhhbXBsZQogICAgICAgIHNlbGY6OiRpbnN0YWxsZWRJc0xvY2FsRGlyID0gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRTZWxmRGlyKCkKICAgIHsKICAgICAgICBpZiAoc2VsZjo6JHNlbGZEaXIgPT09IG51bGwpIHsKICAgICAgICAgICAgc2VsZjo6JHNlbGZEaXIgPSBzdHJ0cihfX0RJUl9fLCAnXFwnLCAnLycpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHNlbGY6OiRzZWxmRGlyOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBhcnJheVtdCiAgICAgKiBAcHNhbG0tcmV0dXJuIGxpc3Q8YXJyYXl7cm9vdDogYXJyYXl7bmFtZTogc3RyaW5nLCBwcmV0dHlfdmVyc2lvbjogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIHJlZmVyZW5jZTogc3RyaW5nfG51bGwsIHR5cGU6IHN0cmluZywgaW5zdGFsbF9wYXRoOiBzdHJpbmcsIGFsaWFzZXM6IHN0cmluZ1tdLCBkZXY6IGJvb2x9LCB2ZXJzaW9uczogYXJyYXk8c3RyaW5nLCBhcnJheXtwcmV0dHlfdmVyc2lvbj86IHN0cmluZywgdmVyc2lvbj86IHN0cmluZywgcmVmZXJlbmNlPzogc3RyaW5nfG51bGwsIHR5cGU/OiBzdHJpbmcsIGluc3RhbGxfcGF0aD86IHN0cmluZywgYWxpYXNlcz86IHN0cmluZ1tdLCBkZXZfcmVxdWlyZW1lbnQ6IGJvb2wsIHJlcGxhY2VkPzogc3RyaW5nW10sIHByb3ZpZGVkPzogc3RyaW5nW119Pn0+CiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldEluc3RhbGxlZCgpCiAgICB7CiAgICAgICAgaWYgKG51bGwgPT09IHNlbGY6OiRjYW5HZXRWZW5kb3JzKSB7CiAgICAgICAgICAgIHNlbGY6OiRjYW5HZXRWZW5kb3JzID0gbWV0aG9kX2V4aXN0cygnQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXInLCAnZ2V0UmVnaXN0ZXJlZExvYWRlcnMnKTsKICAgICAgICB9CgogICAgICAgICRpbnN0YWxsZWQgPSBhcnJheSgpOwogICAgICAgICRjb3BpZWRMb2NhbERpciA9IGZhbHNlOwoKICAgICAgICBpZiAoc2VsZjo6JGNhbkdldFZlbmRvcnMpIHsKICAgICAgICAgICAgJHNlbGZEaXIgPSBzZWxmOjpnZXRTZWxmRGlyKCk7CiAgICAgICAgICAgIGZvcmVhY2ggKENsYXNzTG9hZGVyOjpnZXRSZWdpc3RlcmVkTG9hZGVycygpIGFzICR2ZW5kb3JEaXIgPT4gJGxvYWRlcikgewogICAgICAgICAgICAgICAgJHZlbmRvckRpciA9IHN0cnRyKCR2ZW5kb3JEaXIsICdcXCcsICcvJyk7CiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoc2VsZjo6JGluc3RhbGxlZEJ5VmVuZG9yWyR2ZW5kb3JEaXJdKSkgewogICAgICAgICAgICAgICAgICAgICRpbnN0YWxsZWRbXSA9IHNlbGY6OiRpbnN0YWxsZWRCeVZlbmRvclskdmVuZG9yRGlyXTsKICAgICAgICAgICAgICAgIH0gZWxzZWlmIChpc19maWxlKCR2ZW5kb3JEaXIuJy9jb21wb3Nlci9pbnN0YWxsZWQucGhwJykpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHZhciBhcnJheXtyb290OiBhcnJheXtuYW1lOiBzdHJpbmcsIHByZXR0eV92ZXJzaW9uOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgcmVmZXJlbmNlOiBzdHJpbmd8bnVsbCwgdHlwZTogc3RyaW5nLCBpbnN0YWxsX3BhdGg6IHN0cmluZywgYWxpYXNlczogc3RyaW5nW10sIGRldjogYm9vbH0sIHZlcnNpb25zOiBhcnJheTxzdHJpbmcsIGFycmF5e3ByZXR0eV92ZXJzaW9uPzogc3RyaW5nLCB2ZXJzaW9uPzogc3RyaW5nLCByZWZlcmVuY2U/OiBzdHJpbmd8bnVsbCwgdHlwZT86IHN0cmluZywgaW5zdGFsbF9wYXRoPzogc3RyaW5nLCBhbGlhc2VzPzogc3RyaW5nW10sIGRldl9yZXF1aXJlbWVudDogYm9vbCwgcmVwbGFjZWQ/OiBzdHJpbmdbXSwgcHJvdmlkZWQ/OiBzdHJpbmdbXX0+fSAkcmVxdWlyZWQgKi8KICAgICAgICAgICAgICAgICAgICAkcmVxdWlyZWQgPSByZXF1aXJlICR2ZW5kb3JEaXIuJy9jb21wb3Nlci9pbnN0YWxsZWQucGhwJzsKICAgICAgICAgICAgICAgICAgICBzZWxmOjokaW5zdGFsbGVkQnlWZW5kb3JbJHZlbmRvckRpcl0gPSAkcmVxdWlyZWQ7CiAgICAgICAgICAgICAgICAgICAgJGluc3RhbGxlZFtdID0gJHJlcXVpcmVkOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmOjokaW5zdGFsbGVkID09PSBudWxsICYmICR2ZW5kb3JEaXIuJy9jb21wb3NlcicgPT09ICRzZWxmRGlyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGY6OiRpbnN0YWxsZWQgPSAkcmVxdWlyZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGY6OiRpbnN0YWxsZWRJc0xvY2FsRGlyID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2VsZjo6JGluc3RhbGxlZElzTG9jYWxEaXIgJiYgJHZlbmRvckRpci4nL2NvbXBvc2VyJyA9PT0gJHNlbGZEaXIpIHsKICAgICAgICAgICAgICAgICAgICAkY29waWVkTG9jYWxEaXIgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAobnVsbCA9PT0gc2VsZjo6JGluc3RhbGxlZCkgewogICAgICAgICAgICAvLyBvbmx5IHJlcXVpcmUgdGhlIGluc3RhbGxlZC5waHAgZmlsZSBpZiB0aGlzIGZpbGUgaXMgbG9hZGVkIGZyb20gaXRzIGR1bXBlZCBsb2NhdGlvbiwKICAgICAgICAgICAgLy8gYW5kIG5vdCBmcm9tIGl0cyBzb3VyY2UgbG9jYXRpb24gaW4gdGhlIGNvbXBvc2VyL2NvbXBvc2VyIHBhY2thZ2UsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvY29tcG9zZXIvaXNzdWVzLzk5MzcKICAgICAgICAgICAgaWYgKHN1YnN0cihfX0RJUl9fLCAtOCwgMSkgIT09ICdDJykgewogICAgICAgICAgICAgICAgLyoqIEB2YXIgYXJyYXl7cm9vdDogYXJyYXl7bmFtZTogc3RyaW5nLCBwcmV0dHlfdmVyc2lvbjogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIHJlZmVyZW5jZTogc3RyaW5nfG51bGwsIHR5cGU6IHN0cmluZywgaW5zdGFsbF9wYXRoOiBzdHJpbmcsIGFsaWFzZXM6IHN0cmluZ1tdLCBkZXY6IGJvb2x9LCB2ZXJzaW9uczogYXJyYXk8c3RyaW5nLCBhcnJheXtwcmV0dHlfdmVyc2lvbj86IHN0cmluZywgdmVyc2lvbj86IHN0cmluZywgcmVmZXJlbmNlPzogc3RyaW5nfG51bGwsIHR5cGU/OiBzdHJpbmcsIGluc3RhbGxfcGF0aD86IHN0cmluZywgYWxpYXNlcz86IHN0cmluZ1tdLCBkZXZfcmVxdWlyZW1lbnQ6IGJvb2wsIHJlcGxhY2VkPzogc3RyaW5nW10sIHByb3ZpZGVkPzogc3RyaW5nW119Pn0gJHJlcXVpcmVkICovCiAgICAgICAgICAgICAgICAkcmVxdWlyZWQgPSByZXF1aXJlIF9fRElSX18gLiAnL2luc3RhbGxlZC5waHAnOwogICAgICAgICAgICAgICAgc2VsZjo6JGluc3RhbGxlZCA9ICRyZXF1aXJlZDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNlbGY6OiRpbnN0YWxsZWQgPSBhcnJheSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoc2VsZjo6JGluc3RhbGxlZCAhPT0gYXJyYXkoKSAmJiAhJGNvcGllZExvY2FsRGlyKSB7CiAgICAgICAgICAgICRpbnN0YWxsZWRbXSA9IHNlbGY6OiRpbnN0YWxsZWQ7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGluc3RhbGxlZDsKICAgIH0KfQp7CiAgICAiJHNjaGVtYSI6ICJodHRwczovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNC9zY2hlbWEjIiwKICAgICJ0aXRsZSI6ICJDb21wb3NlciBMb2NrIEZpbGUiLAogICAgInR5cGUiOiAib2JqZWN0IiwKICAgICJyZXF1aXJlZCI6IFsgImNvbnRlbnQtaGFzaCIsICJwYWNrYWdlcyIsICJwYWNrYWdlcy1kZXYiIF0sCiAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB0cnVlLAogICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgIl9yZWFkbWUiOiB7CiAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSW5mb3JtYXRpb25hbCB0ZXh0IGZvciBodW1hbnMgcmVhZGluZyB0aGUgZmlsZSIKICAgICAgICB9LAogICAgICAgICJjb250ZW50LWhhc2giOiB7CiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJIYXNoIG9mIGFsbCByZWxldmFudCBwcm9wZXJ0aWVzIG9mIHRoZSBjb21wb3Nlci5qc29uIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIHRoaXMgbG9jayBmaWxlLiIKICAgICAgICB9LAogICAgICAgICJwYWNrYWdlcyI6IHsKICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQW4gYXJyYXkgb2YgcGFja2FnZXMgdGhhdCBhcmUgcmVxdWlyZWQuIiwKICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgIiRyZWYiOiAiLi9jb21wb3Nlci1zY2hlbWEuanNvbiIsCiAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBbIm5hbWUiLCAidmVyc2lvbiJdCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJwYWNrYWdlcy1kZXYiOiB7CiAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFuIGFycmF5IG9mIHBhY2thZ2VzIHRoYXQgYXJlIHJlcXVpcmVkIGluIHJlcXVpcmUtZGV2LiIsCiAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICIkcmVmIjogIi4vY29tcG9zZXItc2NoZW1hLmpzb24iCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJhbGlhc2VzIjogewogICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJbmxpbmUgYWxpYXNlcyBkZWZpbmVkIGluIHRoZSByb290IHBhY2thZ2UuIiwKICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsgInBhY2thZ2UiLCAidmVyc2lvbiIsICJhbGlhcyIsICJhbGlhc19ub3JtYWxpemVkIiBdLAogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWxpYXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhbGlhc19ub3JtYWxpemVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAibWluaW11bS1zdGFiaWxpdHkiOiB7CiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgbWluaW11bS1zdGFiaWxpdHkgdXNlZCB0byBnZW5lcmF0ZSB0aGlzIGxvY2sgZmlsZS4iCiAgICAgICAgfSwKICAgICAgICAic3RhYmlsaXR5LWZsYWdzIjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUm9vdCBwYWNrYWdlIHN0YWJpbGl0eSBmbGFncyBjaGFuZ2luZyB0aGUgbWluaW11bS1zdGFiaWxpdHkgZm9yIHNwZWNpZmljIHBhY2thZ2VzLiIsCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJwcmVmZXItc3RhYmxlIjogewogICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdGhlIC0tcHJlZmVyLXN0YWJsZSBmbGFnIHdhcyB1c2VkIHdoZW4gYnVpbGRpbmcgdGhpcyBsb2NrIGZpbGUuIgogICAgICAgIH0sCiAgICAgICAgInByZWZlci1sb3dlc3QiOiB7CiAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciB0aGUgLS1wcmVmZXItbG93ZXN0IGZsYWcgd2FzIHVzZWQgd2hlbiBidWlsZGluZyB0aGlzIGxvY2sgZmlsZS4iCiAgICAgICAgfSwKICAgICAgICAicGxhdGZvcm0iOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQbGF0Zm9ybSByZXF1aXJlbWVudHMgb2YgdGhlIHJvb3QgcGFja2FnZS4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJwbGF0Zm9ybS1kZXYiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQbGF0Zm9ybSBkZXYtcmVxdWlyZW1lbnRzIG9mIHRoZSByb290IHBhY2thZ2UuIiwKICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicGxhdGZvcm0tb3ZlcnJpZGVzIjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUGxhdGZvcm0gY29uZmlnIG92ZXJyaWRlcyBvZiB0aGUgcm9vdCBwYWNrYWdlLiIsCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInBsdWdpbi1hcGktdmVyc2lvbiI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBjb21wb3Nlci1wbHVnaW4tYXBpIHZlcnNpb24gdGhhdCB3YXMgdXNlZCB0byBnZW5lcmF0ZSB0aGlzIGxvY2sgZmlsZS4iCiAgICAgICAgfQogICAgfQp9CnsKICAgICIkc2NoZW1hIjogImh0dHBzOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiLAogICAgInRpdGxlIjogIkNvbXBvc2VyIFBhY2thZ2UgUmVwb3NpdG9yeSIsCiAgICAidHlwZSI6ICJvYmplY3QiLAogICAgIm9uZU9mIjogWwogICAgICAgIHsgInJlcXVpcmVkIjogWyAicGFja2FnZXMiIF0gfSwKICAgICAgICB7ICJyZXF1aXJlZCI6IFsgInByb3ZpZGVycyIgXSB9LAogICAgICAgIHsgInJlcXVpcmVkIjogWyAicHJvdmlkZXItaW5jbHVkZXMiLCAicHJvdmlkZXJzLXVybCIgXSB9LAogICAgICAgIHsgInJlcXVpcmVkIjogWyAibWV0YWRhdGEtdXJsIiBdIH0KICAgIF0sCiAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAicGFja2FnZXMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogWyJvYmplY3QiLCAiYXJyYXkiXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgaGFzaG1hcCBvZiBwYWNrYWdlIG5hbWVzIGluIHRoZSBmb3JtIG9mIDx2ZW5kb3I+LzxuYW1lPi4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdmVyc2lvbnMiIH0KICAgICAgICB9LAogICAgICAgICJtZXRhZGF0YS11cmwiOiB7CiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFbmRwb2ludCB0byByZXRyaWV2ZSBwYWNrYWdlIG1ldGFkYXRhIGRhdGEgZnJvbSwgaW4gQ29tcG9zZXIgdjIgZm9ybWF0LCBlLmcuICcvcDIvJXBhY2thZ2UlLmpzb24nLiIKICAgICAgICB9LAogICAgICAgICJhdmFpbGFibGUtcGFja2FnZXMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgeW91ciByZXBvc2l0b3J5IG9ubHkgaGFzIGEgc21hbGwgbnVtYmVyIG9mIHBhY2thZ2VzLCBhbmQgeW91IHdhbnQgdG8gYXZvaWQgc2VydmluZyBtYW55IDQwNHMsIHNwZWNpZnkgYWxsIHRoZSBwYWNrYWdlIG5hbWVzIHRoYXQgeW91ciByZXBvc2l0b3J5IGNvbnRhaW5zIGhlcmUuIgogICAgICAgIH0sCiAgICAgICAgImF2YWlsYWJsZS1wYWNrYWdlLXBhdHRlcm5zIjogewogICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHlvdXIgcmVwb3NpdG9yeSBvbmx5IGhhcyBhIHNtYWxsIG51bWJlciBvZiBwYWNrYWdlcywgYW5kIHlvdSB3YW50IHRvIGF2b2lkIHNlcnZpbmcgbWFueSA0MDRzLCBzcGVjaWZ5IHBhY2thZ2UgbmFtZSBwYXR0ZXJucyBjb250YWluaW5nIHdpbGRjYXJkcyAoKikgdGhhdCB5b3VyIHJlcG9zaXRvcnkgY29udGFpbnMgaGVyZS4iCiAgICAgICAgfSwKICAgICAgICAic2VjdXJpdHktYWR2aXNvcmllcyI6IHsKICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgInJlcXVpcmVkIjogWyJtZXRhZGF0YSIsICJhcGktdXJsIl0sCiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWV0YWRhdGEiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciBtZXRhZGF0YSBmaWxlcyBjb250YWluIHNlY3VyaXR5IGFkdmlzb3J5IGRhdGEgb3Igd2hldGhlciBpdCBzaG91bGQgYWx3YXlzIGJlIHF1ZXJpZWQgdXNpbmcgdGhlIEFQSSBVUkwuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFwaS11cmwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFbmRwb2ludCB0byBjYWxsIHRvIHJldHJpZXZlIHNlY3VyaXR5IGFkdmlzb3JpZXMgZGF0YS4iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAibWV0YWRhdGEtY2hhbmdlcy11cmwiOiB7CiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFbmRwb2ludCB0byByZXRyaWV2ZSBwYWNrYWdlIG1ldGFkYXRhIHVwZGF0ZXMgZnJvbS4gVGhpcyBzaG91bGQgcmVjZWl2ZSBhIHRpbWVzdGFtcCBzaW5jZSBsYXN0IGNhbGwgdG8gYmUgYWJsZSB0byByZXR1cm4gbmV3IGNoYW5nZXMuIGUuZy4gJy9tZXRhZGF0YS9jaGFuZ2VzLmpzb24nLiIKICAgICAgICB9LAogICAgICAgICJwcm92aWRlcnMtYXBpIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRW5kcG9pbnQgdG8gcmV0cmlldmUgcGFja2FnZSBuYW1lcyBwcm92aWRpbmcgYSBnaXZlbiBuYW1lIGZyb20sIGUuZy4gJy9wcm92aWRlcnMvJXBhY2thZ2UlLmpzb24nLiIKICAgICAgICB9LAogICAgICAgICJub3RpZnktYmF0Y2giOiB7CiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFbmRwb2ludCB0byBjYWxsIGFmdGVyIG11bHRpcGxlIHBhY2thZ2VzIGhhdmUgYmVlbiBpbnN0YWxsZWQsIGUuZy4gJy9kb3dubG9hZHMvJy4iCiAgICAgICAgfSwKICAgICAgICAic2VhcmNoIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRW5kcG9pbnQgdGhhdCBwcm92aWRlcyBzZWFyY2ggY2FwYWJpbGl0aWVzLCBlLmcuICcvc2VhcmNoLmpzb24/cT0lcXVlcnklJnR5cGU9JXR5cGUlJy4iCiAgICAgICAgfSwKICAgICAgICAibGlzdCI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkVuZHBvaW50IHRoYXQgcHJvdmlkZXMgYSBmdWxsIGxpc3Qgb2YgcGFja2FnZXMgcHJlc2VudCBpbiB0aGUgcmVwb3NpdG9yeS4gSXQgc2hvdWxkIGFjY2VwdCBhbiBvcHRpb25hbCBgP2ZpbHRlcj14eGAgcXVlcnkgcGFyYW0sIHdoaWNoIGNhbiBjb250YWluIGAqYCBhcyB3aWxkY2FyZHMgbWF0Y2hpbmcgYW55IHN1YnN0cmluZy4gZS5nLiAnL2xpc3QuanNvbicuIgogICAgICAgIH0sCiAgICAgICAgIndhcm5pbmdzIjogewogICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBbIm1lc3NhZ2UiLCAidmVyc2lvbnMiXSwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBtZXNzYWdlIHRoYXQgd2lsbCBiZSBvdXRwdXQgYnkgQ29tcG9zZXIgYXMgYSB3YXJuaW5nIHdoZW4gdGhpcyBzb3VyY2UgaXMgY29uc3VsdGVkLiIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2ZXJzaW9ucyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgdmVyc2lvbiBjb25zdHJhaW50IHRvIGxpbWl0IHRvIHdoaWNoIENvbXBvc2VyIHZlcnNpb25zIHRoZSB3YXJuaW5nIHNob3VsZCBiZSBzaG93bi4iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiaW5mb3MiOiB7CiAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsibWVzc2FnZSIsICJ2ZXJzaW9ucyJdLAogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIG91dHB1dCBieSBDb21wb3NlciBhcyBpbmZvIHdoZW4gdGhpcyBzb3VyY2UgaXMgY29uc3VsdGVkLiIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJ2ZXJzaW9ucyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgdmVyc2lvbiBjb25zdHJhaW50IHRvIGxpbWl0IHRvIHdoaWNoIENvbXBvc2VyIHZlcnNpb25zIHRoZSBpbmZvIHNob3VsZCBiZSBzaG93bi4iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicHJvdmlkZXJzLXVybCI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRFUFJFQ0FURUQ6IEVuZHBvaW50IHRvIHJldHJpZXZlIHByb3ZpZGVyIGRhdGEgZnJvbSwgZS5nLiAnL3AvJXBhY2thZ2UlJCVoYXNoJS5qc29uJy4iCiAgICAgICAgfSwKICAgICAgICAicHJvdmlkZXItaW5jbHVkZXMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJERVBSRUNBVEVEOiBBIGhhc2htYXAgb2YgcHJvdmlkZXIgbGlzdGluZ3MuIiwKICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3Byb3ZpZGVyIiB9CiAgICAgICAgfSwKICAgICAgICAicHJvdmlkZXJzIjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiREVQUkVDQVRFRDogQSBoYXNobWFwIG9mIHBhY2thZ2UgbmFtZXMgaW4gdGhlIGZvcm0gb2YgPHZlbmRvcj4vPG5hbWU+LiIsCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9wcm92aWRlciIgfQogICAgICAgIH0sCiAgICAgICAgIndhcm5pbmciOiB7CiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJERVBSRUNBVEVEOiBBIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIG91dHB1dCBieSBDb21wb3NlciBhcyBhIHdhcm5pbmcgd2hlbiB0aGlzIHNvdXJjZSBpcyBjb25zdWx0ZWQuIgogICAgICAgIH0sCiAgICAgICAgIndhcm5pbmctdmVyc2lvbnMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJERVBSRUNBVEVEOiBBIHZlcnNpb24gY29uc3RyYWludCB0byBsaW1pdCB0byB3aGljaCBDb21wb3NlciB2ZXJzaW9ucyB0aGUgd2FybmluZyBzaG91bGQgYmUgc2hvd24uIgogICAgICAgIH0sCiAgICAgICAgImluZm8iOiB7CiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJERVBSRUNBVEVEOiBBIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIG91dHB1dCBieSBDb21wb3NlciBhcyBhIGluZm8gd2hlbiB0aGlzIHNvdXJjZSBpcyBjb25zdWx0ZWQuIgogICAgICAgIH0sCiAgICAgICAgImluZm8tdmVyc2lvbnMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJERVBSRUNBVEVEOiBBIHZlcnNpb24gY29uc3RyYWludCB0byBsaW1pdCB0byB3aGljaCBDb21wb3NlciB2ZXJzaW9ucyB0aGUgaW5mbyBzaG91bGQgYmUgc2hvd24uIgogICAgICAgIH0KICAgIH0sCiAgICAiZGVmaW5pdGlvbnMiOiB7CiAgICAgICAgInZlcnNpb25zIjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBoYXNobWFwIG9mIHZlcnNpb25zIGFuZCB0aGVpciBtZXRhZGF0YS4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdmVyc2lvbiIgfQogICAgICAgIH0sCiAgICAgICAgInZlcnNpb24iOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJvbmVPZiI6IFsKICAgICAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9wYWNrYWdlIiB9LAogICAgICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL21ldGFwYWNrYWdlIiB9CiAgICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgICJwYWNrYWdlLWJhc2UiOiB7CiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgIm5hbWUiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICJ0eXBlIjogeyAidHlwZSI6ICJzdHJpbmciIH0sCiAgICAgICAgICAgICAgICAidmVyc2lvbiI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAogICAgICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJOb3JtYWxpemVkIHZlcnNpb24sIG9wdGlvbmFsIGJ1dCBjYW4gc2F2ZSBjb21wdXRhdGlvbmFsIHRpbWUgb24gY2xpZW50IHNpZGUuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhdXRvbG9hZCI6IHsgInR5cGUiOiAib2JqZWN0IiB9LAogICAgICAgICAgICAgICAgInJlcXVpcmUiOiB7ICJ0eXBlIjogIm9iamVjdCIgfSwKICAgICAgICAgICAgICAgICJyZXBsYWNlIjogeyAidHlwZSI6ICJvYmplY3QiIH0sCiAgICAgICAgICAgICAgICAiY29uZmxpY3QiOiB7ICJ0eXBlIjogIm9iamVjdCIgfSwKICAgICAgICAgICAgICAgICJwcm92aWRlIjogeyAidHlwZSI6ICJvYmplY3QiIH0sCiAgICAgICAgICAgICAgICAidGltZSI6IHsgInR5cGUiOiAic3RyaW5nIiB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHRydWUKICAgICAgICB9LAogICAgICAgICJwYWNrYWdlIjogewogICAgICAgICAgICAiYWxsT2YiOiBbCiAgICAgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcGFja2FnZS1iYXNlIiB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAiZGlzdCI6IHsgInR5cGUiOiAib2JqZWN0IiB9LAogICAgICAgICAgICAgICAgICAgICAgICAic291cmNlIjogeyAidHlwZSI6ICJvYmplY3QiIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgeyAib25lT2YiOiBbCiAgICAgICAgICAgICAgICAgICAgeyAicmVxdWlyZWQiOiBbICJuYW1lIiwgInZlcnNpb24iLCAic291cmNlIiBdIH0sCiAgICAgICAgICAgICAgICAgICAgeyAicmVxdWlyZWQiOiBbICJuYW1lIiwgInZlcnNpb24iLCAiZGlzdCIgXSB9CiAgICAgICAgICAgICAgICBdIH0KICAgICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgIm1ldGFwYWNrYWdlIjogewogICAgICAgICAgICAiYWxsT2YiOiBbCiAgICAgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcGFja2FnZS1iYXNlIiB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsgInR5cGUiOiAic3RyaW5nIiwgImVudW0iOiBbICJtZXRhcGFja2FnZSIgXSB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBbICJuYW1lIiwgInZlcnNpb24iLCAidHlwZSIgXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICAicHJvdmlkZXIiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInNoYTI1NiI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJIYXNoIHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgdGhlIHJlc291cmNlLiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQp7CiAgICAiJHNjaGVtYSI6ICJodHRwczovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNC9zY2hlbWEjIiwKICAgICJ0aXRsZSI6ICJDb21wb3NlciBQYWNrYWdlIiwKICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlBhY2thZ2UgbmFtZSwgaW5jbHVkaW5nICd2ZW5kb3ItbmFtZS8nIHByZWZpeC4iLAogICAgICAgICAgICAicGF0dGVybiI6ICJeW2EtejAtOV0oW18uLV0/W2EtejAtOV0rKSpcL1thLXowLTldKChbXy5dfC17MSwyfSk/W2EtejAtOV0rKSokIgogICAgICAgIH0sCiAgICAgICAgImRlc2NyaXB0aW9uIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2hvcnQgcGFja2FnZSBkZXNjcmlwdGlvbi4iCiAgICAgICAgfSwKICAgICAgICAibGljZW5zZSI6IHsKICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJhcnJheSJdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGljZW5zZSBuYW1lLiBPciBhbiBhcnJheSBvZiBsaWNlbnNlIG5hbWVzLiIKICAgICAgICB9LAogICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUGFja2FnZSB0eXBlLCBlaXRoZXIgJ2xpYnJhcnknIGZvciBjb21tb24gcGFja2FnZXMsICdjb21wb3Nlci1wbHVnaW4nIGZvciBwbHVnaW5zLCAnbWV0YXBhY2thZ2UnIGZvciBlbXB0eSBwYWNrYWdlcywgb3IgYSBjdXN0b20gdHlwZSAoW2EtejAtOS1dKykgZGVmaW5lZCBieSB3aGF0ZXZlciBwcm9qZWN0IHRoaXMgcGFja2FnZSBhcHBsaWVzIHRvLiIsCiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICJwYXR0ZXJuIjogIl5bYS16MC05LV0rJCIKICAgICAgICB9LAogICAgICAgICJhYmFuZG9uZWQiOiB7CiAgICAgICAgICAgICJ0eXBlIjogWyJib29sZWFuIiwgInN0cmluZyJdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBwYWNrYWdlIGhhcyBiZWVuIGFiYW5kb25lZCwgaXQgY2FuIGJlIGJvb2xlYW4gb3IgYSBwYWNrYWdlIG5hbWUvVVJMIHBvaW50aW5nIHRvIGEgcmVjb21tZW5kZWQgYWx0ZXJuYXRpdmUuIERlZmF1bHRzIHRvIGZhbHNlLiIKICAgICAgICB9LAogICAgICAgICJ2ZXJzaW9uIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUGFja2FnZSB2ZXJzaW9uLCBzZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzA0LXNjaGVtYS5tZCN2ZXJzaW9uIGZvciBtb3JlIGluZm8gb24gdmFsaWQgc2NoZW1lcy4iLAogICAgICAgICAgICAicGF0dGVybiI6ICJeW3ZWXT9cXGQrKD86Wy4tXVxcZCspezAsM31bLl8tXT8oPzooPzpbc1NdW3RUXVthQV1bYkJdW2xMXVtlRV18W2JCXVtlRV1bdFRdW2FBXXxbYkJdfFtyUl1bY0NdfFthQV1bbExdW3BQXVtoSF1bYUFdfFthQV18W3BQXVthQV1bdFRdW2NDXVtoSF18W3BQXVtsTF18W3BQXSkoPzooPzpbLi1dP1xcZCspKik/KT8oPzpbLi1dP1tkRF1bZUVdW3ZWXXxcXC54LWRldik/KD86XFwrLiopPyR8XmRldi0uKiQiCiAgICAgICAgfSwKICAgICAgICAiZGVmYXVsdC1icmFuY2giOiB7CiAgICAgICAgICAgICJ0eXBlIjogWyJib29sZWFuIl0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJbnRlcm5hbCB1c2Ugb25seSwgZG8gbm90IHNwZWNpZnkgdGhpcyBpbiBjb21wb3Nlci5qc29uLiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHZlcnNpb24gaXMgdGhlIGRlZmF1bHQgYnJhbmNoIG9mIHRoZSBsaW5rZWQgVkNTIHJlcG9zaXRvcnkuIERlZmF1bHRzIHRvIGZhbHNlLiIKICAgICAgICB9LAogICAgICAgICJub24tZmVhdHVyZS1icmFuY2hlcyI6IHsKICAgICAgICAgICAgInR5cGUiOiBbImFycmF5Il0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHNldCBvZiBzdHJpbmcgb3IgcmVnZXggcGF0dGVybnMgZm9yIG5vbi1udW1lcmljIGJyYW5jaCBuYW1lcyB0aGF0IHdpbGwgbm90IGJlIGhhbmRsZWQgYXMgZmVhdHVyZSBicmFuY2hlcy4iLAogICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJrZXl3b3JkcyI6IHsKICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgdGFnL2tleXdvcmQgdGhhdCB0aGlzIHBhY2thZ2UgcmVsYXRlcyB0by4iCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJyZWFkbWUiOiB7CiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJSZWxhdGl2ZSBwYXRoIHRvIHRoZSByZWFkbWUgZG9jdW1lbnQuIgogICAgICAgIH0sCiAgICAgICAgInRpbWUiOiB7CiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQYWNrYWdlIHJlbGVhc2UgZGF0ZSwgaW4gJ1lZWVktTU0tREQnLCAnWVlZWS1NTS1ERCBISDpNTTpTUycgb3IgJ1lZWVktTU0tRERUSEg6TU06U1NaJyBmb3JtYXQuIgogICAgICAgIH0sCiAgICAgICAgImF1dGhvcnMiOiB7CiAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvYXV0aG9ycyIKICAgICAgICB9LAogICAgICAgICJob21lcGFnZSI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkhvbWVwYWdlIFVSTCBmb3IgdGhlIHByb2plY3QuIiwKICAgICAgICAgICAgImZvcm1hdCI6ICJ1cmkiCiAgICAgICAgfSwKICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAiZW1haWwiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRW1haWwgYWRkcmVzcyBmb3Igc3VwcG9ydC4iLAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiAiZW1haWwiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImlzc3VlcyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVUkwgdG8gdGhlIGlzc3VlIHRyYWNrZXIuIiwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogInVyaSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZm9ydW0iOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVVJMIHRvIHRoZSBmb3J1bS4iLAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiAidXJpIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ3aWtpIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlVSTCB0byB0aGUgd2lraS4iLAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiAidXJpIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJpcmMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSVJDIGNoYW5uZWwgZm9yIHN1cHBvcnQsIGFzIGlyYzovL3NlcnZlci9jaGFubmVsLiIsCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6ICJ1cmkiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNoYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVVJMIHRvIHRoZSBzdXBwb3J0IGNoYXQuIiwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogInVyaSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlVSTCB0byBicm93c2Ugb3IgZG93bmxvYWQgdGhlIHNvdXJjZXMuIiwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogInVyaSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZG9jcyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVUkwgdG8gdGhlIGRvY3VtZW50YXRpb24uIiwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogInVyaSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicnNzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlVSTCB0byB0aGUgUlNTIGZlZWQuIiwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogInVyaSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAic2VjdXJpdHkiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVVJMIHRvIHRoZSB2dWxuZXJhYmlsaXR5IGRpc2Nsb3N1cmUgcG9saWN5IChWRFApLiIsCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6ICJ1cmkiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJmdW5kaW5nIjogewogICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2Ygb3B0aW9ucyB0byBmdW5kIHRoZSBkZXZlbG9wbWVudCBhbmQgbWFpbnRlbmFuY2Ugb2YgdGhlIHBhY2thZ2UuIiwKICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVHlwZSBvZiBmdW5kaW5nIG9yIHBsYXRmb3JtIHRocm91Z2ggd2hpY2ggZnVuZGluZyBpcyBwb3NzaWJsZS4iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidXJsIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVVJMIHRvIGEgd2Vic2l0ZSB3aXRoIGRldGFpbHMgb24gZnVuZGluZyBhbmQgYSB3YXkgdG8gZnVuZCB0aGUgcGFja2FnZS4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogInVyaSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvc291cmNlIgogICAgICAgIH0sCiAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZGlzdCIKICAgICAgICB9LAogICAgICAgICJfY29tbWVudCI6IHsKICAgICAgICAgICAgInR5cGUiOiBbImFycmF5IiwgInN0cmluZyJdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBrZXkgdG8gc3RvcmUgY29tbWVudHMgaW4iCiAgICAgICAgfSwKICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgYW4gb2JqZWN0IG9mIHBhY2thZ2UgbmFtZSAoa2V5cykgYW5kIHZlcnNpb24gY29uc3RyYWludHMgKHZhbHVlcykgdGhhdCBhcmUgcmVxdWlyZWQgdG8gcnVuIHRoaXMgcGFja2FnZS4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJyZXF1aXJlLWRldiI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgYW4gb2JqZWN0IG9mIHBhY2thZ2UgbmFtZSAoa2V5cykgYW5kIHZlcnNpb24gY29uc3RyYWludHMgKHZhbHVlcykgdGhhdCB0aGlzIHBhY2thZ2UgcmVxdWlyZXMgZm9yIGRldmVsb3BpbmcgaXQgKHRlc3RpbmcgdG9vbHMgYW5kIHN1Y2gpLiIsCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInJlcGxhY2UiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGlzIGFuIG9iamVjdCBvZiBwYWNrYWdlIG5hbWUgKGtleXMpIGFuZCB2ZXJzaW9uIGNvbnN0cmFpbnRzICh2YWx1ZXMpIHRoYXQgY2FuIGJlIHJlcGxhY2VkIGJ5IHRoaXMgcGFja2FnZS4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJjb25mbGljdCI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgYW4gb2JqZWN0IG9mIHBhY2thZ2UgbmFtZSAoa2V5cykgYW5kIHZlcnNpb24gY29uc3RyYWludHMgKHZhbHVlcykgdGhhdCBjb25mbGljdCB3aXRoIHRoaXMgcGFja2FnZS4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJwcm92aWRlIjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyBhbiBvYmplY3Qgb2YgcGFja2FnZSBuYW1lIChrZXlzKSBhbmQgdmVyc2lvbiBjb25zdHJhaW50cyAodmFsdWVzKSB0aGF0IHRoaXMgcGFja2FnZSBwcm92aWRlcyBpbiBhZGRpdGlvbiB0byB0aGlzIHBhY2thZ2UncyBuYW1lLiIsCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInN1Z2dlc3QiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGlzIGFuIG9iamVjdCBvZiBwYWNrYWdlIG5hbWUgKGtleXMpIGFuZCBkZXNjcmlwdGlvbnMgKHZhbHVlcykgdGhhdCB0aGlzIHBhY2thZ2Ugc3VnZ2VzdHMgd29yayB3ZWxsIHdpdGggaXQgKHRoaXMgd2lsbCBiZSBzdWdnZXN0ZWQgdG8gdGhlIHVzZXIgZHVyaW5nIGluc3RhbGxhdGlvbikuIiwKICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicmVwb3NpdG9yaWVzIjogewogICAgICAgICAgICAidHlwZSI6IFsib2JqZWN0IiwgImFycmF5Il0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHNldCBvZiBhZGRpdGlvbmFsIHJlcG9zaXRvcmllcyB3aGVyZSBwYWNrYWdlcyBjYW4gYmUgZm91bmQuIiwKICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgImFueU9mIjogWwogICAgICAgICAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9hbm9ueW1vdXMtcmVwb3NpdG9yeSIgfSwKICAgICAgICAgICAgICAgICAgICB7ICJ0eXBlIjogImJvb2xlYW4iLCAiZW51bSI6IFtmYWxzZV0gfQogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAiYW55T2YiOiBbCiAgICAgICAgICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3JlcG9zaXRvcnkiIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7ICJ0eXBlIjogImJvb2xlYW4iLCAiZW51bSI6IFtmYWxzZV0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgIm1pblByb3BlcnRpZXMiOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAibWF4UHJvcGVydGllcyI6IDEKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJtaW5pbXVtLXN0YWJpbGl0eSI6IHsKICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyJdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1pbmltdW0gc3RhYmlsaXR5IHRoZSBwYWNrYWdlcyBtdXN0IGhhdmUgdG8gYmUgaW5zdGFsbC1hYmxlLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBkZXYsIGFscGhhLCBiZXRhLCBSQywgc3RhYmxlLiIsCiAgICAgICAgICAgICJlbnVtIjogWyJkZXYiLCAiYWxwaGEiLCAiYmV0YSIsICJyYyIsICJSQyIsICJzdGFibGUiXQogICAgICAgIH0sCiAgICAgICAgInByZWZlci1zdGFibGUiOiB7CiAgICAgICAgICAgICJ0eXBlIjogWyJib29sZWFuIl0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZiBzZXQgdG8gdHJ1ZSwgc3RhYmxlIHBhY2thZ2VzIHdpbGwgYmUgcHJlZmVycmVkIHRvIGRldiBwYWNrYWdlcyB3aGVuIHBvc3NpYmxlLCBldmVuIGlmIHRoZSBtaW5pbXVtLXN0YWJpbGl0eSBhbGxvd3MgdW5zdGFibGUgcGFja2FnZXMuIgogICAgICAgIH0sCiAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2F1dG9sb2FkIgogICAgICAgIH0sCiAgICAgICAgImF1dG9sb2FkLWRldiI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRlc2NyaXB0aW9uIG9mIGFkZGl0aW9uYWwgYXV0b2xvYWQgcnVsZXMgZm9yIGRldmVsb3BtZW50IHB1cnBvc2UgKGVnLiBhIHRlc3Qgc3VpdGUpLiIsCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInBzci0wIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgYW4gb2JqZWN0IG9mIG5hbWVzcGFjZXMgKGtleXMpIGFuZCB0aGUgZGlyZWN0b3JpZXMgdGhleSBjYW4gYmUgZm91bmQgaW50byAodmFsdWVzLCBjYW4gYmUgYXJyYXlzIG9mIHBhdGhzKSBieSB0aGUgYXV0b2xvYWRlci4iLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJhcnJheSJdLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInBzci00IjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgYW4gb2JqZWN0IG9mIG5hbWVzcGFjZXMgKGtleXMpIGFuZCB0aGUgUFNSLTQgZGlyZWN0b3JpZXMgdGhleSBjYW4gbWFwIHRvICh2YWx1ZXMsIGNhbiBiZSBhcnJheXMgb2YgcGF0aHMpIGJ5IHRoZSBhdXRvbG9hZGVyLiIsCiAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsic3RyaW5nIiwgImFycmF5Il0sCiAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY2xhc3NtYXAiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGlzIGFuIGFycmF5IG9mIHBhdGhzIHRoYXQgY29udGFpbiBjbGFzc2VzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBjbGFzcy1tYXAgZ2VuZXJhdGlvbiBwcm9jZXNzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZmlsZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGlzIGFuIGFycmF5IG9mIGZpbGVzIHRoYXQgYXJlIGFsd2F5cyByZXF1aXJlZCBvbiBldmVyeSByZXF1ZXN0LiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInRhcmdldC1kaXIiOiB7CiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJERVBSRUNBVEVEOiBGb3JjZXMgdGhlIHBhY2thZ2UgdG8gYmUgaW5zdGFsbGVkIGludG8gdGhlIGdpdmVuIHN1YmRpcmVjdG9yeSBwYXRoLiBUaGlzIGlzIHVzZWQgZm9yIGF1dG9sb2FkaW5nIFBTUi0wIHBhY2thZ2VzIHRoYXQgZG8gbm90IGNvbnRhaW4gdGhlaXIgZnVsbCBwYXRoLiBVc2UgZm9yd2FyZCBzbGFzaGVzIGZvciBjcm9zcy1wbGF0Zm9ybSBjb21wYXRpYmlsaXR5LiIsCiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICB9LAogICAgICAgICJpbmNsdWRlLXBhdGgiOiB7CiAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSJdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiREVQUkVDQVRFRDogQSBsaXN0IG9mIGRpcmVjdG9yaWVzIHdoaWNoIHNob3VsZCBnZXQgYWRkZWQgdG8gUEhQJ3MgaW5jbHVkZSBwYXRoLiBUaGlzIGlzIG9ubHkgcHJlc2VudCB0byBzdXBwb3J0IGxlZ2FjeSBwcm9qZWN0cywgYW5kIGFsbCBuZXcgY29kZSBzaG91bGQgcHJlZmVyYWJseSB1c2UgYXV0b2xvYWRpbmcuIiwKICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiYmluIjogewogICAgICAgICAgICAidHlwZSI6IFsic3RyaW5nIiwgImFycmF5Il0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHNldCBvZiBmaWxlcywgb3IgYSBzaW5nbGUgZmlsZSwgdGhhdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBiaW5hcmllcyBhbmQgc3ltbGlua2VkIGludG8gYmluLWRpciAoZnJvbSBjb25maWcpLiIsCiAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImFyY2hpdmUiOiB7CiAgICAgICAgICAgICJ0eXBlIjogWyJvYmplY3QiXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9wdGlvbnMgZm9yIGNyZWF0aW5nIHBhY2thZ2UgYXJjaGl2ZXMgZm9yIGRpc3RyaWJ1dGlvbi4iLAogICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgYmFzZSBuYW1lIGZvciBhcmNoaXZlLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZXhjbHVkZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBwYXR0ZXJucyBmb3IgcGF0aHMgdG8gZXhjbHVkZSBvciBpbmNsdWRlIGlmIHByZWZpeGVkIHdpdGggYW4gZXhjbGFtYXRpb24gbWFyay4iCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJwaHAtZXh0IjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2V0dGluZ3MgZm9yIFBIUCBleHRlbnNpb24gcGFja2FnZXMuIiwKICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uLW5hbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgc3BlY2lmaWVkLCB0aGlzIHdpbGwgYmUgdXNlZCBhcyB0aGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uLCB3aGVyZSBuZWVkZWQgYnkgdG9vbGluZy4gSWYgdGhpcyBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZXh0ZW5zaW9uIG5hbWUgd2lsbCBiZSBkZXJpdmVkIGZyb20gdGhlIENvbXBvc2VyIHBhY2thZ2UgbmFtZSAoZS5nLiBgdmVuZG9yL25hbWVgIHdvdWxkIGJlY29tZSBgZXh0LW5hbWVgKS4gVGhlIGV4dGVuc2lvbiBuYW1lIG1heSBiZSBzcGVjaWZpZWQgd2l0aCBvciB3aXRob3V0IHRoZSBgZXh0LWAgcHJlZml4LCBhbmQgdG9vbHMgdGhhdCB1c2UgdGhpcyBtdXN0IG5vcm1hbGlzZSB0aGlzIGFwcHJvcHJpYXRlbHkuIiwKICAgICAgICAgICAgICAgICAgICAiZXhhbXBsZSI6ICJleHQteGRlYnVnIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwcmlvcml0eSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyB1c2VkIHRvIGFkZCBhIHByZWZpeCB0byB0aGUgSU5JIGZpbGUsIGUuZy4gYDkwLXhkZWJ1Zy5pbmlgIHdoaWNoIGFmZmVjdHMgdGhlIGxvYWRpbmcgb3JkZXIuIFRoZSBwcmlvcml0eSBpcyBhIG51bWJlciBpbiB0aGUgcmFuZ2UgMTAtOTkgaW5jbHVzaXZlLCB3aXRoIDEwIGJlaW5nIHRoZSBoaWdoZXN0IHByaW9yaXR5IChpLmUuIHdpbGwgYmUgcHJvY2Vzc2VkIGZpcnN0KSwgYW5kIDk5IGJlaW5nIHRoZSBsb3dlc3QgcHJpb3JpdHkgKGkuZS4gd2lsbCBiZSBwcm9jZXNzZWQgbGFzdCkuIFRoZXJlIGFyZSB0d28gZGlnaXRzIHNvIHRoYXQgdGhlIGZpbGVzIHNvcnQgY29ycmVjdGx5IG9uIGFueSBwbGF0Zm9ybSwgd2hldGhlciB0aGUgc29ydGluZyBpcyBuYXR1cmFsIG9yIG5vdC4iLAogICAgICAgICAgICAgICAgICAgICJtaW5pbXVtIjogMTAsCiAgICAgICAgICAgICAgICAgICAgIm1heGltdW0iOiA5OSwKICAgICAgICAgICAgICAgICAgICAiZXhhbXBsZSI6IDgwLAogICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogODAKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAic3VwcG9ydC16dHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRvZXMgdGhpcyBwYWNrYWdlIHN1cHBvcnQgWmVuZCBUaHJlYWQgU2FmZXR5IiwKICAgICAgICAgICAgICAgICAgICAiZXhhbXBsZSI6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJzdXBwb3J0LW50cyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRG9lcyB0aGlzIHBhY2thZ2Ugc3VwcG9ydCBub24tVGhyZWFkIFNhZmUgbW9kZSIsCiAgICAgICAgICAgICAgICAgICAgImV4YW1wbGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYnVpbGQtcGF0aCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsic3RyaW5nIiwgIm51bGwiXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgc3BlY2lmaWVkLCB0aGlzIGlzIHRoZSBzdWJkaXJlY3RvcnkgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYnVpbGQgdGhlIGV4dGVuc2lvbiBpbnN0ZWFkIG9mIHRoZSByb290IG9mIHRoZSBwcm9qZWN0LiIsCiAgICAgICAgICAgICAgICAgICAgImV4YW1wbGUiOiAibXktZXh0ZW5zaW9uLXNvdXJjZSIsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBudWxsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImRvd25sb2FkLXVybC1tZXRob2QiOiB7CiAgICAgICAgICAgICAgICAgICAgIm9uZU9mIjogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHNwZWNpZmllZCwgdGhpcyB0ZWNobmlxdWUgd2lsbCBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBVUkwgdGhhdCBQSUUgdXNlcyB0byBkb3dubG9hZCB0aGUgYXNzZXQuIFRoZSBkZWZhdWx0LCBpZiBub3Qgc3BlY2lmaWVkLCBpcyBjb21wb3Nlci1kZWZhdWx0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVwcmVjYXRlZCI6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsiY29tcG9zZXItZGVmYXVsdCIsICJwcmUtcGFja2FnZWQtc291cmNlIiwgInByZS1wYWNrYWdlZC1iaW5hcnkiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGFtcGxlIjogImNvbXBvc2VyLWRlZmF1bHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiAiY29tcG9zZXItZGVmYXVsdCIKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk11bHRpcGxlIHRlY2huaXF1ZXMgY2FuIGJlIHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZSBQSUUgd2lsbCB0cnkgZWFjaCBpbiB0dXJuIHVudGlsIG9uZSBzdWNjZWVkcy4gVGhlIGZpcnN0IHRlY2huaXF1ZSB0aGF0IHN1Y2NlZWRzIHdpbGwgYmUgdXNlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHNwZWNpZmllZCwgdGhpcyB0ZWNobmlxdWUgd2lsbCBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBVUkwgdGhhdCBQSUUgdXNlcyB0byBkb3dubG9hZCB0aGUgYXNzZXQuIFRoZSBkZWZhdWx0LCBpZiBub3Qgc3BlY2lmaWVkLCBpcyBjb21wb3Nlci1kZWZhdWx0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbImNvbXBvc2VyLWRlZmF1bHQiLCAicHJlLXBhY2thZ2VkLXNvdXJjZSIsICJwcmUtcGFja2FnZWQtYmluYXJ5Il0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4YW1wbGUiOiBbInByZS1wYWNrYWdlZC1iaW5hcnkiLCAiY29tcG9zZXItZGVmYXVsdCJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pbkl0ZW1zIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogWyJjb21wb3Nlci1kZWZhdWx0Il0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAib3MtZmFtaWxpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJtaW5JdGVtcyI6IDEsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFuIGFycmF5IG9mIE9TIGZhbWlsaWVzIHRvIG1hcmsgYXMgY29tcGF0aWJsZSB3aXRoIHRoZSBleHRlbnNpb24uIFNwZWNpZnlpbmcgdGhpcyBwcm9wZXJ0eSB3aWxsIG1lYW4gdGhpcyBwYWNrYWdlIGlzIG5vdCBpbnN0YWxsYWJsZSB3aXRoIFBJRSBvbiBhbnkgT1MgZmFtaWx5IG5vdCBsaXN0ZWQgaGVyZS4gTXVzdCBub3QgYmUgc3BlY2lmaWVkIGFsb25nc2lkZSBvcy1mYW1pbGllcy1leGNsdWRlLiIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsid2luZG93cyIsICJic2QiLCAiZGFyd2luIiwgInNvbGFyaXMiLCAibGludXgiLCAidW5rbm93biJdLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG5hbWUgb2YgdGhlIE9TIGZhbWlseSB0byBtYXJrIGFzIGNvbXBhdGlibGUuIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAib3MtZmFtaWxpZXMtZXhjbHVkZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgIm1pbkl0ZW1zIjogMSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQW4gYXJyYXkgb2YgT1MgZmFtaWxpZXMgdG8gbWFyayBhcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgZXh0ZW5zaW9uLiBTcGVjaWZ5aW5nIHRoaXMgcHJvcGVydHkgd2lsbCBtZWFuIHRoaXMgcGFja2FnZSBpcyBpbnN0YWxsYWJsZSBvbiBhbnkgT1MgZmFtaWx5IGV4Y2VwdCB0aG9zZSBsaXN0ZWQgaGVyZS4gTXVzdCBub3QgYmUgc3BlY2lmaWVkIGFsb25nc2lkZSBvcy1mYW1pbGllcy4iLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbIndpbmRvd3MiLCAiYnNkIiwgImRhcndpbiIsICJzb2xhcmlzIiwgImxpbnV4IiwgInVua25vd24iXSwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBuYW1lIG9mIHRoZSBPUyBmYW1pbHkgdG8gZXhjbHVkZS4iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjb25maWd1cmUtb3B0aW9ucyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZXNlIGNvbmZpZ3VyZSBvcHRpb25zIG1ha2UgdXAgdGhlIGZsYWdzIHRoYXQgY2FuIGJlIHBhc3NlZCB0byAuL2NvbmZpZ3VyZSB3aGVuIGluc3RhbGxpbmcgdGhlIGV4dGVuc2lvbi4iLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogWyJuYW1lIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG5hbWUgb2YgdGhlIGZsYWcsIHRoaXMgd291bGQgdHlwaWNhbGx5IGJlIHByZWZpeGVkIHdpdGggYC0tYCwgZm9yIGV4YW1wbGUsIHRoZSB2YWx1ZSAndGhlLWZsYWcnIHdvdWxkIGJlIHBhc3NlZCBhcyBgLi9jb25maWd1cmUgLS10aGUtZmxhZ2AuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhhbXBsZSI6ICJ3aXRob3V0LXhkZWJ1Zy1jb21wcmVzc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhdHRlcm4iOiAiXlthLXpBLVowLTldW2EtekEtWjAtOS1fXSokIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWVkcy12YWx1ZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdGhpcyBpcyBzZXQgdG8gdHJ1ZSwgdGhlIGZsYWcgbmVlZHMgYSB2YWx1ZSAoZS5nLiAtLXdpdGgtc29tZWxpYj08cGF0aD4pLCBvdGhlcndpc2UgaXQgaXMgYSBmbGFnIHdpdGhvdXQgYSB2YWx1ZSAoZS5nLiAtLWVuYWJsZS1zb21lLWZlYXR1cmUpLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4YW1wbGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoZSBmbGFnIGRvZXMgb3IgbWVhbnMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhhbXBsZSI6ICJEaXNhYmxlIGNvbXByZXNzaW9uIHRocm91Z2ggemxpYiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImFsbE9mIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJub3QiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsib3MtZmFtaWxpZXMiLCAib3MtZmFtaWxpZXMtZXhjbHVkZSJdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICAiY29uZmlnIjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ29tcG9zZXIgb3B0aW9ucy4iLAogICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJwbGF0Zm9ybSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGlzIGFuIG9iamVjdCBvZiBwYWNrYWdlIG5hbWUgKGtleXMpIGFuZCB2ZXJzaW9uICh2YWx1ZXMpIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vY2sgdGhlIHBsYXRmb3JtIHBhY2thZ2VzIG9uIHRoaXMgbWFjaGluZSwgdGhlIHZlcnNpb24gY2FuIGJlIHNldCB0byBmYWxzZSB0byBtYWtlIGl0IGFwcGVhciBsaWtlIHRoZSBwYWNrYWdlIGlzIG5vdCBwcmVzZW50LiIsCiAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsic3RyaW5nIiwgImJvb2xlYW4iXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYWxsb3ctcGx1Z2lucyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsib2JqZWN0IiwgImJvb2xlYW4iXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyBhbiBvYmplY3Qgb2Yge1wicGF0dGVyblwiOiB0cnVlfGZhbHNlfSB3aXRoIHBhY2thZ2VzIHdoaWNoIGFyZSBhbGxvd2VkIHRvIGJlIGxvYWRlZCBhcyBwbHVnaW5zLCBvciB0cnVlIHRvIGFsbG93IGFsbCwgZmFsc2UgdG8gYWxsb3cgbm9uZS4gRGVmYXVsdHMgdG8ge30gd2hpY2ggcHJvbXB0cyB3aGVuIGFuIHVua25vd24gcGx1Z2luIGlzIGFkZGVkLiIsCiAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsiYm9vbGVhbiJdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwcm9jZXNzLXRpbWVvdXQiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSB0aW1lb3V0IGluIHNlY29uZHMgZm9yIHByb2Nlc3MgZXhlY3V0aW9ucywgZGVmYXVsdHMgdG8gMzAwICg1bWlucykuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ1c2UtaW5jbHVkZS1wYXRoIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZiB0cnVlLCB0aGUgQ29tcG9zZXIgYXV0b2xvYWRlciB3aWxsIGFsc28gbG9vayBmb3IgY2xhc3NlcyBpbiB0aGUgUEhQIGluY2x1ZGUgcGF0aC4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInVzZS1wYXJlbnQtZGlyIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciLCAiYm9vbGVhbiJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGVuIHJ1bm5pbmcgQ29tcG9zZXIgaW4gYSBkaXJlY3Rvcnkgd2hlcmUgdGhlcmUgaXMgbm8gY29tcG9zZXIuanNvbiwgaWYgdGhlcmUgaXMgb25lIHByZXNlbnQgaW4gYSBkaXJlY3RvcnkgYWJvdmUgQ29tcG9zZXIgd2lsbCBieSBkZWZhdWx0IGFzayB5b3Ugd2hldGhlciB5b3Ugd2FudCB0byB1c2UgdGhhdCBkaXJlY3RvcnkncyBjb21wb3Nlci5qc29uIGluc3RlYWQuIE9uZSBvZjogdHJ1ZSAoYWx3YXlzIHVzZSBwYXJlbnQgaWYgbmVlZGVkKSwgZmFsc2UgKG5ldmVyIGFzayBvciB1c2UgaXQpIG9yIFwicHJvbXB0XCIgKGFzayBldmVyeSB0aW1lKSwgZGVmYXVsdHMgdG8gcHJvbXB0LiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicHJlZmVycmVkLWluc3RhbGwiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJvYmplY3QiXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGluc3RhbGwgbWV0aG9kIENvbXBvc2VyIHdpbGwgcHJlZmVyIHRvIHVzZSwgZGVmYXVsdHMgdG8gYXV0byBhbmQgY2FuIGJlIGFueSBvZiBzb3VyY2UsIGRpc3QsIGF1dG8sIG9yIGFuIG9iamVjdCBvZiB7XCJwYXR0ZXJuXCI6IFwicHJlZmVyZW5jZVwifS4iLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyJdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhdWRpdCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTZWN1cml0eSBhdWRpdCBhbmQgdmVyc2lvbiBibG9ja2luZyBjb25maWd1cmF0aW9uIG9wdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAiaWdub3JlIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFueU9mIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBhZHZpc29yeSBpZHMsIHJlbW90ZSBpZHMsIENWRSBpZHMgb3IgcGFja2FnZSBuYW1lcyAoa2V5cykgd2l0aCBlaXRoZXIgZXhwbGFuYXRpb25zIChzdHJpbmcgdmFsdWVzKSBvciBkZXRhaWxlZCBjb25maWd1cmF0aW9uIChvYmplY3QgdmFsdWVzIHdpdGggJ2FwcGx5JyBhbmQgJ3JlYXNvbicgZmllbGRzKSBmb3Igd2h5IHRoZXkncmUgaWdub3JlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW55T2YiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRXhwbGFuYXRpb24gZm9yIGlnbm9yaW5nIHRoaXMgYWR2aXNvcnkgKGFwcGxpZXMgdG8gYXVkaXQgcmVwb3J0cyBhbmQgdmVyc2lvbiBibG9ja2luZykiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRhaWxlZCBjb25maWd1cmF0aW9uIGZvciBpZ25vcmluZyB0aGlzIGFkdmlzb3J5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXBwbHkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsiYXVkaXQiLCAiYmxvY2siLCAiYWxsIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXJlIHRvIGFwcGx5IHRoaXMgaWdub3JlOiAnYXVkaXQnIChvbmx5IGF1ZGl0IHJlcG9ydHMpLCAnYmxvY2snIChvbmx5IHZlcnNpb24gYmxvY2tpbmcpLCBvciAnYWxsJyAoYm90aCkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYXNvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFeHBsYW5hdGlvbiBmb3IgaWdub3JpbmcgdGhpcyBhZHZpc29yeSwgZS5nLiB2dWxuZXJhYmxlIGNvZGUgcGF0aCBub3QgcmVhY2hhYmxlIGluIGFwcGxpY2F0aW9uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWdub3JlIHdpdGhvdXQgZXhwbGFuYXRpb24gKGFwcGxpZXMgdG8gYXVkaXQgcmVwb3J0cyBhbmQgdmVyc2lvbiBibG9ja2luZykiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgc2V0IG9mIGFkdmlzb3J5IGlkcywgcmVtb3RlIGlkcywgQ1ZFIGlkcyBvciBwYWNrYWdlIG5hbWVzIHRoYXQgYXJlIHJlcG9ydGVkIGJ1dCBsZXQgdGhlIGF1ZGl0IGNvbW1hbmQgcGFzcy4gQXBwbGllcyB0byBhdWRpdCByZXBvcnRzIGFuZCB2ZXJzaW9uIGJsb2NraW5nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgImFiYW5kb25lZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogWyJpZ25vcmUiLCAicmVwb3J0IiwgImZhaWwiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIGFiYW5kb25lZCBwYWNrYWdlcyBzaG91bGQgYmUgaWdub3JlZCwgcmVwb3J0ZWQgYXMgcHJvYmxlbXMgb3IgY2F1c2UgYW4gYXVkaXQgZmFpbHVyZS4gQXBwbGllcyBvbmx5IHRvIGF1ZGl0IHJlcG9ydHMsIG5vdCB0byB2ZXJzaW9uIGJsb2NraW5nLiIKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgImlnbm9yZS1zZXZlcml0eSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbnlPZiI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2Ygc2V2ZXJpdGllcyAoa2V5cykgd2l0aCBlaXRoZXIgZXhwbGFuYXRpb25zIChzdHJpbmcgdmFsdWVzKSBvciBkZXRhaWxlZCBjb25maWd1cmF0aW9uIChvYmplY3QgdmFsdWVzIHdpdGggJ2FwcGx5JyBmaWVsZHMpIGZvciB3aHkgdGhleSdyZSBpZ25vcmVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbnlPZiI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFeHBsYW5hdGlvbiBmb3IgaWdub3JpbmcgdGhpcyBzZXZlcml0eSAoYXBwbGllcyB0byBhdWRpdCByZXBvcnRzIGFuZCB2ZXJzaW9uIGJsb2NraW5nKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRldGFpbGVkIGNvbmZpZ3VyYXRpb24gZm9yIGlnbm9yaW5nIHRoaXMgc2V2ZXJpdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcHBseSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogWyJhdWRpdCIsICJibG9jayIsICJhbGwiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hlcmUgdG8gYXBwbHkgdGhpcyBpZ25vcmU6ICdhdWRpdCcgKG9ubHkgYXVkaXQgcmVwb3J0cyksICdibG9jaycgKG9ubHkgdmVyc2lvbiBibG9ja2luZyksIG9yICdhbGwnIChib3RoKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklnbm9yZSB3aXRob3V0IGV4cGxhbmF0aW9uIChhcHBsaWVzIHRvIGF1ZGl0IHJlcG9ydHMgYW5kIHZlcnNpb24gYmxvY2tpbmcpIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2Ygc2V2ZXJpdGllcyBmb3Igd2hpY2ggYWR2aXNvcmllcyB3aXRoIG1hdGNoaW5nIHNldmVyaXR5IHdpbGwgYmUgaWdub3JlZCwgZS5nLiBjcml0aWNhbCwgaGlnaCwgbWVkaXVtLCBsb3csIG9yIG5vbmUuIEFwcGxpZXMgdG8gYXVkaXQgcmVwb3J0cyBhbmQgdmVyc2lvbiBibG9ja2luZy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJpZ25vcmUtdW5yZWFjaGFibGUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHJlcG9zaXRvcmllcyB0aGF0IGFyZSB1bnJlYWNoYWJsZSBvciByZXR1cm4gYSBub24tMjAwIHN0YXR1cyBjb2RlIHNob3VsZCBiZSBpZ25vcmVkIG9yIG5vdC4gQXBwbGllcyBvbmx5IHRvIHRoZSBjb21wb3NlciBhdWRpdCBjb21tYW5kLCBkb2VzIG5vdCBhZmZlY3QgYXVkaXQgcmVwb3J0IHN1bW1hcmllcyBpbiBvdGhlciBjb21tYW5kcyBvciB2ZXJzaW9uIGJsb2NraW5nLiIKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgImJsb2NrLWluc2VjdXJlIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciBpbnNlY3VyZSB2ZXJzaW9ucyBzaG91bGQgYmUgYmxvY2tlZCBkdXJpbmcgYSBjb21wb3NlciB1cGRhdGUvcmVxdWlyZSBjb21tYW5kIG9yIG5vdC4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJibG9jay1hYmFuZG9uZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIGFiYW5kb25lZCBwYWNrYWdlcyBzaG91bGQgYmUgYmxvY2tlZCBkdXJpbmcgYSBjb21wb3NlciB1cGRhdGUvcmVxdWlyZSBjb21tYW5kIG9yIG5vdC4gQXBwbGllcyBvbmx5IGlmIGJsb2NraW5nIG9mIGluc2VjdXJlIHZlcnNpb25zIGlzIGVuYWJsZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgImlnbm9yZS1hYmFuZG9uZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW55T2YiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIGFiYW5kb25lZCBwYWNrYWdlIG5hbWVzIChrZXlzKSB3aXRoIGVpdGhlciBleHBsYW5hdGlvbnMgKHN0cmluZyB2YWx1ZXMpIG9yIGRldGFpbGVkIGNvbmZpZ3VyYXRpb24gKG9iamVjdCB2YWx1ZXMgd2l0aCAnYXBwbHknIGFuZCAncmVhc29uJyBmaWVsZHMpIGZvciB3aHkgdGhleSdyZSBpZ25vcmVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbnlPZiI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFeHBsYW5hdGlvbiBmb3IgaWdub3JpbmcgdGhpcyBhYmFuZG9uZWQgcGFja2FnZSAoYXBwbGllcyB0byBhdWRpdCByZXBvcnRzIGFuZCB2ZXJzaW9uIGJsb2NraW5nKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRldGFpbGVkIGNvbmZpZ3VyYXRpb24gZm9yIGlnbm9yaW5nIHRoaXMgYWJhbmRvbmVkIHBhY2thZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcHBseSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogWyJhdWRpdCIsICJibG9jayIsICJhbGwiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hlcmUgdG8gYXBwbHkgdGhpcyBpZ25vcmU6ICdhdWRpdCcgKG9ubHkgYXVkaXQgcmVwb3J0cyksICdibG9jaycgKG9ubHkgdmVyc2lvbiBibG9ja2luZyksIG9yICdhbGwnIChib3RoKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVhc29uIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkV4cGxhbmF0aW9uIGZvciBpZ25vcmluZyB0aGlzIGFiYW5kb25lZCBwYWNrYWdlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm51bGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWdub3JlIHdpdGhvdXQgZXhwbGFuYXRpb24gKGFwcGxpZXMgdG8gYXVkaXQgcmVwb3J0cyBhbmQgdmVyc2lvbiBibG9ja2luZykiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgc2V0IG9mIGFiYW5kb25lZCBwYWNrYWdlIG5hbWVzIHRoYXQgYXJlIHJlcG9ydGVkIGJ1dCBsZXQgdGhlIGF1ZGl0IGNvbW1hbmQgcGFzcyBhbmQgdGhhdCBhcmUgbm90IGJsb2NrZWQgZHVyaW5nIHVwZGF0ZXMvcmVxdWlyZXMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJub3RpZnktb24taW5zdGFsbCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ29tcG9zZXIgYWxsb3dzIHJlcG9zaXRvcmllcyB0byBkZWZpbmUgYSBub3RpZmljYXRpb24gVVJMLCBzbyB0aGF0IHRoZXkgZ2V0IG5vdGlmaWVkIHdoZW5ldmVyIGEgcGFja2FnZSBmcm9tIHRoYXQgcmVwb3NpdG9yeSBpcyBpbnN0YWxsZWQuIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gZGlzYWJsZSB0aGF0IGJlaGF2aW91ciwgZGVmYXVsdHMgdG8gdHJ1ZS4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImdpdGh1Yi1wcm90b2NvbHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgcHJvdG9jb2xzIHRvIHVzZSBmb3IgZ2l0aHViLmNvbSBjbG9uZXMsIGluIHByaW9yaXR5IG9yZGVyLCBkZWZhdWx0cyB0byBbXCJodHRwc1wiLCBcInNzaFwiLCBcImdpdFwiXS4iLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZ2l0aHViLW9hdXRoIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFuIG9iamVjdCBvZiBkb21haW4gbmFtZSA9PiBnaXRodWIgQVBJIG9hdXRoIHRva2VucywgdHlwaWNhbGx5IHtcImdpdGh1Yi5jb21cIjpcIjx0b2tlbj5cIn0uIiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImdpdGxhYi1vYXV0aCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBvYmplY3Qgb2YgZG9tYWluIG5hbWUgPT4gZ2l0bGFiIEFQSSBvYXV0aCB0b2tlbnMsIHR5cGljYWxseSB7XCJnaXRsYWIuY29tXCI6e1wiZXhwaXJlcy1hdFwiOlwiPGV4cGlyYXRpb24gZGF0ZT5cIiwgXCJyZWZyZXNoLXRva2VuXCI6XCI8cmVmcmVzaCB0b2tlbj5cIiwgXCJ0b2tlblwiOlwiPHRva2VuPlwifX0uIiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciLCAib2JqZWN0Il0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsgInRva2VuIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGlyZXMtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBleHBpcmF0aW9uIGRhdGUgZm9yIHRoaXMgR2l0TGFiIHRva2VuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWZyZXNoLXRva2VuIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSByZWZyZXNoIHRva2VuIHVzZWQgZm9yIEdpdExhYiBhdXRoZW50aWNhdGlvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG9rZW4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHRva2VuIHVzZWQgZm9yIEdpdExhYiBhdXRoZW50aWNhdGlvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZ2l0bGFiLXRva2VuIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFuIG9iamVjdCBvZiBkb21haW4gbmFtZSA9PiBnaXRsYWIgcHJpdmF0ZSB0b2tlbnMsIHR5cGljYWxseSB7XCJnaXRsYWIuY29tXCI6XCI8dG9rZW4+XCJ9LCBvciBhbiBvYmplY3Qgd2l0aCB1c2VybmFtZSBhbmQgdG9rZW4ga2V5cy4iLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJvYmplY3QiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogWyJ1c2VybmFtZSIsICJ0b2tlbiJdLAogICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2VybmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgdXNlcm5hbWUgdXNlZCBmb3IgR2l0TGFiIGF1dGhlbnRpY2F0aW9uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b2tlbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgdG9rZW4gdXNlZCBmb3IgR2l0TGFiIGF1dGhlbnRpY2F0aW9uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJnaXRsYWItcHJvdG9jb2wiOiB7CiAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbImdpdCIsICJodHRwIiwgImh0dHBzIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgcHJvdG9jb2wgdG8gZm9yY2UgdXNlIG9mIHdoZW4gY3JlYXRpbmcgYSByZXBvc2l0b3J5IFVSTCBmb3IgdGhlIGBzb3VyY2VgIHZhbHVlIG9mIHRoZSBwYWNrYWdlIG1ldGFkYXRhLiBPbmUgb2YgYGdpdGAgb3IgYGh0dHBgLiBCeSBkZWZhdWx0LCBDb21wb3NlciB3aWxsIGdlbmVyYXRlIGEgZ2l0IFVSTCBmb3IgcHJpdmF0ZSByZXBvc2l0b3JpZXMgYW5kIGh0dHAgb25lIGZvciBwdWJsaWMgcmVwb3MuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJiZWFyZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQW4gb2JqZWN0IG9mIGRvbWFpbiBuYW1lID0+IGJlYXJlciBhdXRoZW50aWNhdGlvbiB0b2tlbiwgZm9yIGV4YW1wbGUge1wiZXhhbXBsZS5jb21cIjpcIjx0b2tlbj5cIn0uIiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImN1c3RvbS1oZWFkZXJzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkN1c3RvbSBIVFRQIGhlYWRlcnMgZm9yIHNwZWNpZmljIGRvbWFpbnMuIiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGhlYWRlciBpbiBmb3JtYXQgJ0hlYWRlci1OYW1lOiBIZWFkZXItVmFsdWUnIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJmb3JnZWpvLXRva2VuIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFuIG9iamVjdCBvZiBkb21haW4gbmFtZSA9PiBmb3JnZWpvIHVzZXJuYW1lL2FjY2VzcyB0b2tlbiwgdHlwaWNhbGx5IHtcImNvZGViZXJnLm9yZ1wiOntcInVzZXJuYW1lXCI6IFwiPHVzZXJuYW1lPlwiLCBcInRva2VuXCI6IFwiPGFjY2Vzcy10b2tlbj5cIn19LiIsCiAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsib2JqZWN0Il0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsidXNlcm5hbWUiLCAidG9rZW4iXSwKICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlcm5hbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHVzZXJuYW1lIHVzZWQgZm9yIEZvcmdlam8gYXV0aGVudGljYXRpb24iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRva2VuIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBhY2Nlc3MgdG9rZW4gdXNlZCBmb3IgRm9yZ2VqbyBhdXRoZW50aWNhdGlvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZGlzYWJsZS10bHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRlZmF1bHRzIHRvIGBmYWxzZWAuIElmIHNldCB0byB0cnVlIGFsbCBIVFRQUyBVUkxzIHdpbGwgYmUgdHJpZWQgd2l0aCBIVFRQIGluc3RlYWQgYW5kIG5vIG5ldHdvcmsgbGV2ZWwgZW5jcnlwdGlvbiBpcyBwZXJmb3JtZWQuIEVuYWJsaW5nIHRoaXMgaXMgYSBzZWN1cml0eSByaXNrIGFuZCBpcyBOT1QgcmVjb21tZW5kZWQuIFRoZSBiZXR0ZXIgd2F5IGlzIHRvIGVuYWJsZSB0aGUgcGhwX29wZW5zc2wgZXh0ZW5zaW9uIGluIHBocC5pbmkuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJzZWN1cmUtaHR0cCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVmYXVsdHMgdG8gYHRydWVgLiBJZiBzZXQgdG8gdHJ1ZSBvbmx5IEhUVFBTIFVSTHMgYXJlIGFsbG93ZWQgdG8gYmUgZG93bmxvYWRlZCB2aWEgQ29tcG9zZXIuIElmIHlvdSByZWFsbHkgYWJzb2x1dGVseSBuZWVkIEhUVFAgYWNjZXNzIHRvIHNvbWV0aGluZyB0aGVuIHlvdSBjYW4gZGlzYWJsZSBpdCwgYnV0IHVzaW5nIFwiTGV0J3MgRW5jcnlwdFwiIHRvIGdldCBhIGZyZWUgU1NMIGNlcnRpZmljYXRlIGlzIGdlbmVyYWxseSBhIGJldHRlciBhbHRlcm5hdGl2ZS4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInNlY3VyZS1zdm4tZG9tYWlucyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBkb21haW5zIHdoaWNoIHNob3VsZCBiZSB0cnVzdGVkL21hcmtlZCBhcyB1c2luZyBhIHNlY3VyZSBTdWJ2ZXJzaW9uL1NWTiB0cmFuc3BvcnQuIEJ5IGRlZmF1bHQgc3ZuOi8vIHByb3RvY29sIGlzIHNlZW4gYXMgaW5zZWN1cmUgYW5kIHdpbGwgdGhyb3cuIFRoaXMgaXMgYSBiZXR0ZXIvc2FmZXIgYWx0ZXJuYXRpdmUgdG8gZGlzYWJsaW5nIGBzZWN1cmUtaHR0cGAgYWx0b2dldGhlci4iLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY2FmaWxlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgd2F5IHRvIHNldCB0aGUgcGF0aCB0byB0aGUgb3BlbnNzbCBDQSBmaWxlLiBJbiBQSFAgNS42KyB5b3Ugc2hvdWxkIHJhdGhlciBzZXQgdGhpcyB2aWEgb3BlbnNzbC5jYWZpbGUgaW4gcGhwLmluaSwgYWx0aG91Z2ggUEhQIDUuNisgc2hvdWxkIGJlIGFibGUgdG8gZGV0ZWN0IHlvdXIgc3lzdGVtIENBIGZpbGUgYXV0b21hdGljYWxseS4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNhcGF0aCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZiBjYWZpbGUgaXMgbm90IHNwZWNpZmllZCBvciBpZiB0aGUgY2VydGlmaWNhdGUgaXMgbm90IGZvdW5kIHRoZXJlLCB0aGUgZGlyZWN0b3J5IHBvaW50ZWQgdG8gYnkgY2FwYXRoIGlzIHNlYXJjaGVkIGZvciBhIHN1aXRhYmxlIGNlcnRpZmljYXRlLiBjYXBhdGggbXVzdCBiZSBhIGNvcnJlY3RseSBoYXNoZWQgY2VydGlmaWNhdGUgZGlyZWN0b3J5LiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiaHR0cC1iYXNpYyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBvYmplY3Qgb2YgZG9tYWluIG5hbWUgPT4ge1widXNlcm5hbWVcIjogXCIuLi5cIiwgXCJwYXNzd29yZFwiOiBcIi4uLlwifS4iLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogWyJ1c2VybmFtZSIsICJwYXNzd29yZCJdLAogICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2VybmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgdXNlcm5hbWUgdXNlZCBmb3IgSFRUUCBCYXNpYyBhdXRoZW50aWNhdGlvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFzc3dvcmQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHBhc3N3b3JkIHVzZWQgZm9yIEhUVFAgQmFzaWMgYXV0aGVudGljYXRpb24iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNsaWVudC1jZXJ0aWZpY2F0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBvYmplY3Qgb2YgZG9tYWluIG5hbWUgPT4ge1wibG9jYWxfY2VydFwiOiBcIi4uLlwiLCBcImxvY2FsX3BrXCI/OiBcIi4uLlwiLCBcInBhc3NwaHJhc2VcIj86IFwiLi4uXCJ9IHRvIHByb3ZpZGUgY2xpZW50IGNlcnRpZmljYXRlLiIsCiAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBbImxvY2FsX2NlcnQiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9jYWxfY2VydCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQYXRoIHRvIGEgY2VydGlmaWNhdGUgKHBlbSkgb3IgcGFpciBjZXJ0aWZpY2F0ZStrZXkgKHBlbSkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvY2FsX3BrIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlBhdGggdG8gYSBwcml2YXRlIGtleSBmaWxlIChwZW0pIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXNzcGhyYXNlIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlBhc3NwaHJhc2UgZm9yIHByaXZhdGUga2V5IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJzdG9yZS1hdXRocyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsic3RyaW5nIiwgImJvb2xlYW4iXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hhdCB0byBkbyBhZnRlciBwcm9tcHRpbmcgZm9yIGF1dGhlbnRpY2F0aW9uLCBvbmUgb2Y6IHRydWUgKHN0b3JlKSwgZmFsc2UgKGRvIG5vdCBzdG9yZSkgb3IgXCJwcm9tcHRcIiAoYXNrIGV2ZXJ5IHRpbWUpLCBkZWZhdWx0cyB0byBwcm9tcHQuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ2ZW5kb3ItZGlyIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsb2NhdGlvbiB3aGVyZSBhbGwgcGFja2FnZXMgYXJlIGluc3RhbGxlZCwgZGVmYXVsdHMgdG8gXCJ2ZW5kb3JcIi4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImJpbi1kaXIiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGxvY2F0aW9uIHdoZXJlIGFsbCBiaW5hcmllcyBhcmUgbGlua2VkLCBkZWZhdWx0cyB0byBcInZlbmRvci9iaW5cIi4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImRhdGEtZGlyIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsb2NhdGlvbiB3aGVyZSBvbGQgcGhhciBmaWxlcyBhcmUgc3RvcmVkLCBkZWZhdWx0cyB0byBcIiRob21lXCIgZXhjZXB0IG9uIFhERyBCYXNlIERpcmVjdG9yeSBjb21wbGlhbnQgdW5peGVzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY2FjaGUtZGlyIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsb2NhdGlvbiB3aGVyZSBhbGwgY2FjaGVzIGFyZSBsb2NhdGVkLCBkZWZhdWx0cyB0byBcIn4vLmNvbXBvc2VyL2NhY2hlXCIgb24gKm5peCBhbmQgXCIlTE9DQUxBUFBEQVRBJVxcQ29tcG9zZXJcIiBvbiB3aW5kb3dzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY2FjaGUtZmlsZXMtZGlyIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsb2NhdGlvbiB3aGVyZSBmaWxlcyAoemlwIGRvd25sb2FkcykgYXJlIGNhY2hlZCwgZGVmYXVsdHMgdG8gXCJ7JGNhY2hlLWRpcn0vZmlsZXNcIi4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNhY2hlLXJlcG8tZGlyIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsb2NhdGlvbiB3aGVyZSByZXBvIChnaXQvaGcgcmVwbyBjbG9uZXMpIGFyZSBjYWNoZWQsIGRlZmF1bHRzIHRvIFwieyRjYWNoZS1kaXJ9L3JlcG9cIi4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNhY2hlLXZjcy1kaXIiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGxvY2F0aW9uIHdoZXJlIHZjcyBpbmZvcyAoZ2l0IGNsb25lcywgZ2l0aHViIGFwaSBjYWxscywgZXRjLiB3aGVuIHJlYWRpbmcgdmNzIHJlcG9zKSBhcmUgY2FjaGVkLCBkZWZhdWx0cyB0byBcInskY2FjaGUtZGlyfS92Y3NcIi4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNhY2hlLXR0bCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGRlZmF1bHQgY2FjaGUgdGltZS10by1saXZlLCBkZWZhdWx0cyB0byAxNTU1MjAwMCAoNiBtb250aHMpLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY2FjaGUtZmlsZXMtdHRsIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgY2FjaGUgdGltZS10by1saXZlIGZvciBmaWxlcywgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIG9mIGNhY2hlLXR0bC4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNhY2hlLWZpbGVzLW1heHNpemUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJpbnRlZ2VyIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBjYWNoZSBtYXggc2l6ZSBmb3IgdGhlIGZpbGVzIGNhY2hlLCBkZWZhdWx0cyB0byBcIjMwME1pQlwiLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY2FjaGUtcmVhZC1vbmx5IjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJib29sZWFuIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdG8gdXNlIHRoZSBDb21wb3NlciBjYWNoZSBpbiByZWFkLW9ubHkgbW9kZS4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImJpbi1jb21wYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbImF1dG8iLCAiZnVsbCIsICJwcm94eSIsICJzeW1saW5rIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBjb21wYXRpYmlsaXR5IG9mIHRoZSBiaW5hcmllcywgZGVmYXVsdHMgdG8gXCJhdXRvXCIgKGF1dG9tYXRpY2FsbHkgZ3Vlc3NlZCksIGNhbiBiZSBcImZ1bGxcIiAoY29tcGF0aWJsZSB3aXRoIGJvdGggV2luZG93cyBhbmQgVW5peC1iYXNlZCBzeXN0ZW1zKSBhbmQgXCJwcm94eVwiIChvbmx5IGJhc2gtc3R5bGUgcHJveHkpLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZGlzY2FyZC1jaGFuZ2VzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciLCAiYm9vbGVhbiJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgZGVmYXVsdCBzdHlsZSBvZiBoYW5kbGluZyBkaXJ0eSB1cGRhdGVzLCBkZWZhdWx0cyB0byBmYWxzZSBhbmQgY2FuIGJlIGFueSBvZiB0cnVlLCBmYWxzZSBvciBcInN0YXNoXCIuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhdXRvbG9hZGVyLXN1ZmZpeCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPcHRpb25hbCBzdHJpbmcgdG8gYmUgdXNlZCBhcyBhIHN1ZmZpeCBmb3IgdGhlIGdlbmVyYXRlZCBDb21wb3NlciBhdXRvbG9hZGVyLiBXaGVuIG51bGwgYSByYW5kb20gb25lIHdpbGwgYmUgZ2VuZXJhdGVkLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAib3B0aW1pemUtYXV0b2xvYWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWx3YXlzIG9wdGltaXplIHdoZW4gZHVtcGluZyB0aGUgYXV0b2xvYWRlci4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInByZXBlbmQtYXV0b2xvYWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgZmFsc2UsIHRoZSBjb21wb3NlciBhdXRvbG9hZGVyIHdpbGwgbm90IGJlIHByZXBlbmRlZCB0byBleGlzdGluZyBhdXRvbG9hZGVycywgZGVmYXVsdHMgdG8gdHJ1ZS4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNsYXNzbWFwLWF1dGhvcml0YXRpdmUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRydWUsIHRoZSBjb21wb3NlciBhdXRvbG9hZGVyIHdpbGwgbm90IHNjYW4gdGhlIGZpbGVzeXN0ZW0gZm9yIGNsYXNzZXMgdGhhdCBhcmUgbm90IGZvdW5kIGluIHRoZSBjbGFzcyBtYXAsIGRlZmF1bHRzIHRvIGZhbHNlLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXBjdS1hdXRvbG9hZGVyIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZiB0cnVlLCB0aGUgQ29tcG9zZXIgYXV0b2xvYWRlciB3aWxsIGNoZWNrIGZvciBBUEN1IGFuZCB1c2UgaXQgdG8gY2FjaGUgZm91bmQvbm90LWZvdW5kIGNsYXNzZXMgd2hlbiB0aGUgZXh0ZW5zaW9uIGlzIGVuYWJsZWQsIGRlZmF1bHRzIHRvIGZhbHNlLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZ2l0aHViLWRvbWFpbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgZG9tYWlucyB0byB1c2UgaW4gZ2l0aHViIG1vZGUuIFRoaXMgaXMgdXNlZCBmb3IgR2l0SHViIEVudGVycHJpc2Ugc2V0dXBzLCBkZWZhdWx0cyB0byBbXCJnaXRodWIuY29tXCJdLiIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJnaXRodWItZXhwb3NlLWhvc3RuYW1lIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZWZhdWx0cyB0byB0cnVlLiBJZiBzZXQgdG8gZmFsc2UsIHRoZSBPQXV0aCB0b2tlbnMgY3JlYXRlZCB0byBhY2Nlc3MgdGhlIGdpdGh1YiBBUEkgd2lsbCBoYXZlIGEgZGF0ZSBpbnN0ZWFkIG9mIHRoZSBtYWNoaW5lIGhvc3RuYW1lLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZ2l0bGFiLWRvbWFpbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgZG9tYWlucyB0byB1c2UgaW4gZ2l0bGFiIG1vZGUuIFRoaXMgaXMgdXNlZCBmb3IgY3VzdG9tIEdpdExhYiBzZXR1cHMsIGRlZmF1bHRzIHRvIFtcImdpdGxhYi5jb21cIl0uIiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImZvcmdlam8tZG9tYWlucyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBkb21haW5zIHRvIHVzZSBpbiBmb3JnZWpvIG1vZGUuIFRoaXMgaXMgdXNlZCBmb3IgY3VzdG9tIEZvcmdlam8gc2V0dXBzLCBkZWZhdWx0cyB0byBbXCJjb2RlYmVyZy5vcmdcIl0uIiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImJpdGJ1Y2tldC1vYXV0aCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBvYmplY3Qgb2YgZG9tYWluIG5hbWUgPT4ge1wiY29uc3VtZXIta2V5XCI6IFwiLi4uXCIsIFwiY29uc3VtZXItc2VjcmV0XCI6IFwiLi4uXCJ9LiIsCiAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBbImNvbnN1bWVyLWtleSIsICJjb25zdW1lci1zZWNyZXQiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uc3VtZXIta2V5IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBjb25zdW1lci1rZXkgdXNlZCBmb3IgT0F1dGggYXV0aGVudGljYXRpb24iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnN1bWVyLXNlY3JldCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgY29uc3VtZXItc2VjcmV0IHVzZWQgZm9yIE9BdXRoIGF1dGhlbnRpY2F0aW9uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY2Nlc3MtdG9rZW4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIE9BdXRoIHRva2VuIHJldHJpZXZlZCBmcm9tIEJpdGJ1Y2tldCdzIEFQSSwgdGhpcyBpcyB3cml0dGVuIGJ5IENvbXBvc2VyIGFuZCB5b3Ugc2hvdWxkIG5vdCBzZXQgaXQgbm9yIG1vZGlmeSBpdC4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjY2Vzcy10b2tlbi1leHBpcmF0aW9uIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgZ2VuZXJhdGVkIHRva2VuJ3MgZXhwaXJhdGlvbiB0aW1lc3RhbXAsIHRoaXMgaXMgd3JpdHRlbiBieSBDb21wb3NlciBhbmQgeW91IHNob3VsZCBub3Qgc2V0IGl0IG5vciBtb2RpZnkgaXQuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ1c2UtZ2l0aHViLWFwaSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVmYXVsdHMgdG8gdHJ1ZS4gIElmIHNldCB0byBmYWxzZSwgZ2xvYmFsbHkgZGlzYWJsZXMgdGhlIHVzZSBvZiB0aGUgR2l0SHViIEFQSSBmb3IgYWxsIEdpdEh1YiByZXBvc2l0b3JpZXMgYW5kIGNsb25lcyB0aGUgcmVwb3NpdG9yeSBhcyBpdCB3b3VsZCBmb3IgYW55IG90aGVyIHJlcG9zaXRvcnkuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhcmNoaXZlLWZvcm1hdCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgZGVmYXVsdCBhcmNoaXZpbmcgZm9ybWF0IHdoZW4gbm90IHByb3ZpZGVkIG9uIGNsaSwgZGVmYXVsdHMgdG8gXCJ0YXJcIi4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImFyY2hpdmUtZGlyIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBkZWZhdWx0IGFyY2hpdmUgcGF0aCB3aGVuIG5vdCBwcm92aWRlZCBvbiBjbGksIGRlZmF1bHRzIHRvIFwiLlwiLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiaHRhY2Nlc3MtcHJvdGVjdCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVmYXVsdHMgdG8gdHJ1ZS4gSWYgc2V0IHRvIGZhbHNlLCBDb21wb3NlciB3aWxsIG5vdCBjcmVhdGUgLmh0YWNjZXNzIGZpbGVzIGluIHRoZSBjb21wb3NlciBob21lLCBjYWNoZSwgYW5kIGRhdGEgZGlyZWN0b3JpZXMuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJzb3J0LXBhY2thZ2VzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZWZhdWx0cyB0byBmYWxzZS4gSWYgc2V0IHRvIHRydWUsIENvbXBvc2VyIHdpbGwgc29ydCBwYWNrYWdlcyB3aGVuIGFkZGluZy91cGRhdGluZyBhIG5ldyBkZXBlbmRlbmN5LiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibG9jayI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVmYXVsdHMgdG8gdHJ1ZS4gSWYgc2V0IHRvIGZhbHNlLCBDb21wb3NlciB3aWxsIG5vdCBjcmVhdGUgYSBjb21wb3Nlci5sb2NrIGZpbGUuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwbGF0Zm9ybS1jaGVjayI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsiYm9vbGVhbiIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsicGhwLW9ubHkiLCB0cnVlLCBmYWxzZV0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRlZmF1bHRzIHRvIFwicGhwLW9ubHlcIiB3aGljaCBjaGVja3Mgb25seSB0aGUgUEhQIHZlcnNpb24uIFNldHRpbmcgdG8gdHJ1ZSB3aWxsIGFsc28gY2hlY2sgdGhlIHByZXNlbmNlIG9mIHJlcXVpcmVkIFBIUCBleHRlbnNpb25zLiBJZiBzZXQgdG8gZmFsc2UsIENvbXBvc2VyIHdpbGwgbm90IGNyZWF0ZSBhbmQgcmVxdWlyZSBhIHBsYXRmb3JtX2NoZWNrLnBocCBmaWxlIGFzIHBhcnQgb2YgdGhlIGF1dG9sb2FkZXIgYm9vdHN0cmFwLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYnVtcC1hZnRlci11cGRhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJib29sZWFuIl0sCiAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbImRldiIsICJuby1kZXYiLCB0cnVlLCBmYWxzZV0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRlZmF1bHRzIHRvIGZhbHNlIGFuZCBjYW4gYmUgYW55IG9mIHRydWUsIGZhbHNlLCBcImRldlwiYCBvciBcIm5vLWRldlwiYC4gSWYgc2V0IHRvIHRydWUsIENvbXBvc2VyIHdpbGwgcnVuIHRoZSBidW1wIGNvbW1hbmQgYWZ0ZXIgcnVubmluZyB0aGUgdXBkYXRlIGNvbW1hbmQuIElmIHNldCB0byBcImRldlwiIG9yIFwibm8tZGV2XCIgdGhlbiBvbmx5IHRoZSBjb3JyZXNwb25kaW5nIGRlcGVuZGVuY2llcyB3aWxsIGJlIGJ1bXBlZC4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImFsbG93LW1pc3NpbmctcmVxdWlyZW1lbnRzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJib29sZWFuIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRlZmF1bHRzIHRvIGZhbHNlLiBJZiBzZXQgdG8gdHJ1ZSwgQ29tcG9zZXIgd2lsbCBhbGxvdyBpbnN0YWxsIHdoZW4gbG9jayBmaWxlIGlzIG5vdCB1cCB0byBkYXRlIHdpdGggdGhlIGxhdGVzdCBjaGFuZ2VzIGluIGNvbXBvc2VyLmpzb24uIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ1cGRhdGUtd2l0aC1taW5pbWFsLWNoYW5nZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbImJvb2xlYW4iXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVmYXVsdHMgdG8gZmFsc2UuIElmIHNldCB0byB0cnVlLCBDb21wb3NlciB3aWxsIG9ubHkgcGVyZm9ybSBhYnNvbHV0ZWx5IG5lY2Vzc2FyeSBjaGFuZ2VzIHRvIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIGR1cmluZyB1cGRhdGUuIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAgICJ0eXBlIjogWyJvYmplY3QiLCAiYXJyYXkiXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFyYml0cmFyeSBleHRyYSBkYXRhIHRoYXQgY2FuIGJlIHVzZWQgYnkgcGx1Z2lucywgZm9yIGV4YW1wbGUsIHBhY2thZ2Ugb2YgdHlwZSBjb21wb3Nlci1wbHVnaW4gbWF5IGhhdmUgYSAnY2xhc3MnIGtleSBkZWZpbmluZyBhbiBpbnN0YWxsZXIgY2xhc3MgbmFtZS4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAic2NyaXB0cyI6IHsKICAgICAgICAgICAgInR5cGUiOiBbIm9iamVjdCJdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2NyaXB0IGxpc3RlbmVycyB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYmVmb3JlL2FmdGVyIHNvbWUgZXZlbnRzLiIsCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInByZS1pbnN0YWxsLWNtZCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsiYXJyYXkiLCAic3RyaW5nIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9jY3VycyBiZWZvcmUgdGhlIGluc3RhbGwgY29tbWFuZCBpcyBleGVjdXRlZCwgY29udGFpbnMgb25lIG9yIG1vcmUgQ2xhc3M6Om1ldGhvZCBjYWxsYWJsZXMgb3Igc2hlbGwgY29tbWFuZHMuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwb3N0LWluc3RhbGwtY21kIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGFmdGVyIHRoZSBpbnN0YWxsIGNvbW1hbmQgaXMgZXhlY3V0ZWQsIGNvbnRhaW5zIG9uZSBvciBtb3JlIENsYXNzOjptZXRob2QgY2FsbGFibGVzIG9yIHNoZWxsIGNvbW1hbmRzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicHJlLXVwZGF0ZS1jbWQiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbImFycmF5IiwgInN0cmluZyJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPY2N1cnMgYmVmb3JlIHRoZSB1cGRhdGUgY29tbWFuZCBpcyBleGVjdXRlZCwgY29udGFpbnMgb25lIG9yIG1vcmUgQ2xhc3M6Om1ldGhvZCBjYWxsYWJsZXMgb3Igc2hlbGwgY29tbWFuZHMuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwb3N0LXVwZGF0ZS1jbWQiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbImFycmF5IiwgInN0cmluZyJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPY2N1cnMgYWZ0ZXIgdGhlIHVwZGF0ZSBjb21tYW5kIGlzIGV4ZWN1dGVkLCBjb250YWlucyBvbmUgb3IgbW9yZSBDbGFzczo6bWV0aG9kIGNhbGxhYmxlcyBvciBzaGVsbCBjb21tYW5kcy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInByZS1zdGF0dXMtY21kIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGJlZm9yZSB0aGUgc3RhdHVzIGNvbW1hbmQgaXMgZXhlY3V0ZWQsIGNvbnRhaW5zIG9uZSBvciBtb3JlIENsYXNzOjptZXRob2QgY2FsbGFibGVzIG9yIHNoZWxsIGNvbW1hbmRzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicG9zdC1zdGF0dXMtY21kIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGFmdGVyIHRoZSBzdGF0dXMgY29tbWFuZCBpcyBleGVjdXRlZCwgY29udGFpbnMgb25lIG9yIG1vcmUgQ2xhc3M6Om1ldGhvZCBjYWxsYWJsZXMgb3Igc2hlbGwgY29tbWFuZHMuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwcmUtcGFja2FnZS1pbnN0YWxsIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGJlZm9yZSBhIHBhY2thZ2UgaXMgaW5zdGFsbGVkLCBjb250YWlucyBvbmUgb3IgbW9yZSBDbGFzczo6bWV0aG9kIGNhbGxhYmxlcyBvciBzaGVsbCBjb21tYW5kcy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInBvc3QtcGFja2FnZS1pbnN0YWxsIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGFmdGVyIGEgcGFja2FnZSBpcyBpbnN0YWxsZWQsIGNvbnRhaW5zIG9uZSBvciBtb3JlIENsYXNzOjptZXRob2QgY2FsbGFibGVzIG9yIHNoZWxsIGNvbW1hbmRzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicHJlLXBhY2thZ2UtdXBkYXRlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGJlZm9yZSBhIHBhY2thZ2UgaXMgdXBkYXRlZCwgY29udGFpbnMgb25lIG9yIG1vcmUgQ2xhc3M6Om1ldGhvZCBjYWxsYWJsZXMgb3Igc2hlbGwgY29tbWFuZHMuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwb3N0LXBhY2thZ2UtdXBkYXRlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGFmdGVyIGEgcGFja2FnZSBpcyB1cGRhdGVkLCBjb250YWlucyBvbmUgb3IgbW9yZSBDbGFzczo6bWV0aG9kIGNhbGxhYmxlcyBvciBzaGVsbCBjb21tYW5kcy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInByZS1wYWNrYWdlLXVuaW5zdGFsbCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsiYXJyYXkiLCAic3RyaW5nIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9jY3VycyBiZWZvcmUgYSBwYWNrYWdlIGhhcyBiZWVuIHVuaW5zdGFsbGVkLCBjb250YWlucyBvbmUgb3IgbW9yZSBDbGFzczo6bWV0aG9kIGNhbGxhYmxlcyBvciBzaGVsbCBjb21tYW5kcy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInBvc3QtcGFja2FnZS11bmluc3RhbGwiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbImFycmF5IiwgInN0cmluZyJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPY2N1cnMgYWZ0ZXIgYSBwYWNrYWdlIGhhcyBiZWVuIHVuaW5zdGFsbGVkLCBjb250YWlucyBvbmUgb3IgbW9yZSBDbGFzczo6bWV0aG9kIGNhbGxhYmxlcyBvciBzaGVsbCBjb21tYW5kcy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInByZS1hdXRvbG9hZC1kdW1wIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGJlZm9yZSB0aGUgYXV0b2xvYWRlciBpcyBkdW1wZWQsIGNvbnRhaW5zIG9uZSBvciBtb3JlIENsYXNzOjptZXRob2QgY2FsbGFibGVzIG9yIHNoZWxsIGNvbW1hbmRzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicG9zdC1hdXRvbG9hZC1kdW1wIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGFmdGVyIHRoZSBhdXRvbG9hZGVyIGlzIGR1bXBlZCwgY29udGFpbnMgb25lIG9yIG1vcmUgQ2xhc3M6Om1ldGhvZCBjYWxsYWJsZXMgb3Igc2hlbGwgY29tbWFuZHMuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwb3N0LXJvb3QtcGFja2FnZS1pbnN0YWxsIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGFmdGVyIHRoZSByb290LXBhY2thZ2UgaXMgaW5zdGFsbGVkLCBjb250YWlucyBvbmUgb3IgbW9yZSBDbGFzczo6bWV0aG9kIGNhbGxhYmxlcyBvciBzaGVsbCBjb21tYW5kcy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInBvc3QtY3JlYXRlLXByb2plY3QtY21kIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGFmdGVyIHRoZSBjcmVhdGUtcHJvamVjdCBjb21tYW5kIGlzIGV4ZWN1dGVkLCBjb250YWlucyBvbmUgb3IgbW9yZSBDbGFzczo6bWV0aG9kIGNhbGxhYmxlcyBvciBzaGVsbCBjb21tYW5kcy4iCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJzY3JpcHRzLWRlc2NyaXB0aW9ucyI6IHsKICAgICAgICAgICAgInR5cGUiOiBbIm9iamVjdCJdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVzY3JpcHRpb25zIGZvciBjdXN0b20gY29tbWFuZHMsIHNob3duIGluIGNvbnNvbGUgaGVscC4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJzY3JpcHRzLWFsaWFzZXMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogWyJvYmplY3QiXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFsaWFzZXMgZm9yIGN1c3RvbSBjb21tYW5kcy4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0sCiAgICAiZGVmaW5pdGlvbnMiOiB7CiAgICAgICAgImF1dGhvcnMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxpc3Qgb2YgYXV0aG9ycyB0aGF0IGNvbnRyaWJ1dGVkIHRvIHRoZSBwYWNrYWdlLiBUaGlzIGlzIHR5cGljYWxseSB0aGUgbWFpbiBtYWludGFpbmVycywgbm90IHRoZSBmdWxsIGxpc3QuIiwKICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlLAogICAgICAgICAgICAgICAgInJlcXVpcmVkIjogWyAibmFtZSJdLAogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGdWxsIG5hbWUgb2YgdGhlIGF1dGhvci4iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFbWFpbCBhZGRyZXNzIG9mIHRoZSBhdXRob3IuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6ICJlbWFpbCIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkhvbWVwYWdlIFVSTCBmb3IgdGhlIGF1dGhvci4iLAogICAgICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogInVyaSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJyb2xlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQXV0aG9yJ3Mgcm9sZSBpbiB0aGUgcHJvamVjdC4iCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXNjcmlwdGlvbiBvZiBob3cgdGhlIHBhY2thZ2UgY2FuIGJlIGF1dG9sb2FkZWQuIiwKICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAicHNyLTAiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyBhbiBvYmplY3Qgb2YgbmFtZXNwYWNlcyAoa2V5cykgYW5kIHRoZSBkaXJlY3RvcmllcyB0aGV5IGNhbiBiZSBmb3VuZCBpbiAodmFsdWVzLCBjYW4gYmUgYXJyYXlzIG9mIHBhdGhzKSBieSB0aGUgYXV0b2xvYWRlci4iLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJhcnJheSJdLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInBzci00IjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgYW4gb2JqZWN0IG9mIG5hbWVzcGFjZXMgKGtleXMpIGFuZCB0aGUgUFNSLTQgZGlyZWN0b3JpZXMgdGhleSBjYW4gbWFwIHRvICh2YWx1ZXMsIGNhbiBiZSBhcnJheXMgb2YgcGF0aHMpIGJ5IHRoZSBhdXRvbG9hZGVyLiIsCiAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsic3RyaW5nIiwgImFycmF5Il0sCiAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY2xhc3NtYXAiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGlzIGFuIGFycmF5IG9mIHBhdGhzIHRoYXQgY29udGFpbiBjbGFzc2VzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBjbGFzcy1tYXAgZ2VuZXJhdGlvbiBwcm9jZXNzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZmlsZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGlzIGFuIGFycmF5IG9mIGZpbGVzIHRoYXQgYXJlIGFsd2F5cyByZXF1aXJlZCBvbiBldmVyeSByZXF1ZXN0LiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZXhjbHVkZS1mcm9tLWNsYXNzbWFwIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyBhbiBhcnJheSBvZiBwYXR0ZXJucyB0byBleGNsdWRlIGZyb20gYXV0b2xvYWQgY2xhc3NtYXAgZ2VuZXJhdGlvbi4gKGUuZy4gXCJleGNsdWRlLWZyb20tY2xhc3NtYXBcIjogW1wiL3Rlc3QvXCIsIFwiL3Rlc3RzL1wiLCBcIi9UZXN0cy9cIl0iCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJyZXBvc2l0b3J5IjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAiYW55T2YiOiBbCiAgICAgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvY29tcG9zZXItcmVwb3NpdG9yeSIgfSwKICAgICAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy92Y3MtcmVwb3NpdG9yeSIgfSwKICAgICAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9wYXRoLXJlcG9zaXRvcnkiIH0sCiAgICAgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvYXJ0aWZhY3QtcmVwb3NpdG9yeSIgfSwKICAgICAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9wZWFyLXJlcG9zaXRvcnkiIH0sCiAgICAgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcGFja2FnZS1yZXBvc2l0b3J5IiB9CiAgICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgICJhbm9ueW1vdXMtcmVwb3NpdG9yeSI6IHsKICAgICAgICAgICAgImFsbE9mIjogWwogICAgICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3JlcG9zaXRvcnkiIH0sCiAgICAgICAgICAgICAgICB7ICJub3QiOiB7ICJyZXF1aXJlZCI6IFsibmFtZSJdIH0gfQogICAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICAiY29tcG9zZXItcmVwb3NpdG9yeSI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgInJlcXVpcmVkIjogWyJ0eXBlIiwgInVybCJdLAogICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJuYW1lIjogeyAidHlwZSI6ICAic3RyaW5nIiB9LAogICAgICAgICAgICAgICAgInR5cGUiOiB7ICJ0eXBlIjogInN0cmluZyIsICJlbnVtIjogWyJjb21wb3NlciJdIH0sCiAgICAgICAgICAgICAgICAidXJsIjogeyAidHlwZSI6ICJzdHJpbmciIH0sCiAgICAgICAgICAgICAgICAiY2Fub25pY2FsIjogeyAidHlwZSI6ICJib29sZWFuIiB9LAogICAgICAgICAgICAgICAgIm9ubHkiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZXhjbHVkZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJvcHRpb25zIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogdHJ1ZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhbGxvd19zc2xfZG93bmdyYWRlIjogeyAidHlwZSI6ICJib29sZWFuIiB9LAogICAgICAgICAgICAgICAgImZvcmNlLWxhenktcHJvdmlkZXJzIjogeyAidHlwZSI6ICJib29sZWFuIiB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJ2Y3MtcmVwb3NpdG9yeSI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgInJlcXVpcmVkIjogWyJ0eXBlIiwgInVybCJdLAogICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJuYW1lIjogeyAidHlwZSI6ICAic3RyaW5nIiB9LAogICAgICAgICAgICAgICAgInR5cGUiOiB7ICJ0eXBlIjogInN0cmluZyIsICJlbnVtIjogWyJ2Y3MiLCAiZ2l0aHViIiwgImdpdCIsICJnaXRsYWIiLCAiYml0YnVja2V0IiwgImdpdC1iaXRidWNrZXQiLCAiaGciLCAiZm9zc2lsIiwgInBlcmZvcmNlIiwgInN2biIsICJmb3JnZWpvIl0gfSwKICAgICAgICAgICAgICAgICJ1cmwiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICJjYW5vbmljYWwiOiB7ICJ0eXBlIjogImJvb2xlYW4iIH0sCiAgICAgICAgICAgICAgICAib25seSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJleGNsdWRlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm5vLWFwaSI6IHsgInR5cGUiOiAiYm9vbGVhbiIgfSwKICAgICAgICAgICAgICAgICJzZWN1cmUtaHR0cCI6IHsgInR5cGUiOiAiYm9vbGVhbiIgfSwKICAgICAgICAgICAgICAgICJzdm4tY2FjaGUtY3JlZGVudGlhbHMiOiB7ICJ0eXBlIjogImJvb2xlYW4iIH0sCiAgICAgICAgICAgICAgICAidHJ1bmstcGF0aCI6IHsgInR5cGUiOiBbInN0cmluZyIsICJib29sZWFuIl0gfSwKICAgICAgICAgICAgICAgICJicmFuY2hlcy1wYXRoIjogeyAidHlwZSI6IFsic3RyaW5nIiwgImJvb2xlYW4iXSB9LAogICAgICAgICAgICAgICAgInRhZ3MtcGF0aCI6IHsgInR5cGUiOiBbInN0cmluZyIsICJib29sZWFuIl0gfSwKICAgICAgICAgICAgICAgICJwYWNrYWdlLXBhdGgiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICJkZXBvdCI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAogICAgICAgICAgICAgICAgImJyYW5jaCI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAogICAgICAgICAgICAgICAgInVuaXF1ZV9wZXJmb3JjZV9jbGllbnRfbmFtZSI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAogICAgICAgICAgICAgICAgInA0dXNlciI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAogICAgICAgICAgICAgICAgInA0cGFzc3dvcmQiOiB7ICJ0eXBlIjogInN0cmluZyIgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicGF0aC1yZXBvc2l0b3J5IjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAicmVxdWlyZWQiOiBbInR5cGUiLCAidXJsIl0sCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgIm5hbWUiOiB7ICJ0eXBlIjogICJzdHJpbmciIH0sCiAgICAgICAgICAgICAgICAidHlwZSI6IHsgInR5cGUiOiAic3RyaW5nIiwgImVudW0iOiBbInBhdGgiXSB9LAogICAgICAgICAgICAgICAgInVybCI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAogICAgICAgICAgICAgICAgImNhbm9uaWNhbCI6IHsgInR5cGUiOiAiYm9vbGVhbiIgfSwKICAgICAgICAgICAgICAgICJvbmx5IjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImV4Y2x1ZGUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAib3B0aW9ucyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogeyAidHlwZSI6IFsic3RyaW5nIl0sICJlbnVtIjogWyJub25lIiwgImNvbmZpZyIsICJhdXRvIl0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgInN5bWxpbmsiOiB7ICJ0eXBlIjogWyJib29sZWFuIiwgIm51bGwiXSB9LAogICAgICAgICAgICAgICAgICAgICAgICAicmVsYXRpdmUiOiB7ICJ0eXBlIjogWyJib29sZWFuIl0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgInZlcnNpb25zIjogeyAidHlwZSI6ICJvYmplY3QiLCAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7ICJ0eXBlIjogInN0cmluZyIgfSB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB0cnVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJhcnRpZmFjdC1yZXBvc2l0b3J5IjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAicmVxdWlyZWQiOiBbInR5cGUiLCAidXJsIl0sCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgIm5hbWUiOiB7ICJ0eXBlIjogICJzdHJpbmciIH0sCiAgICAgICAgICAgICAgICAidHlwZSI6IHsgInR5cGUiOiAic3RyaW5nIiwgImVudW0iOiBbImFydGlmYWN0Il0gfSwKICAgICAgICAgICAgICAgICJ1cmwiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICJjYW5vbmljYWwiOiB7ICJ0eXBlIjogImJvb2xlYW4iIH0sCiAgICAgICAgICAgICAgICAib25seSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJleGNsdWRlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJwZWFyLXJlcG9zaXRvcnkiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJyZXF1aXJlZCI6IFsidHlwZSIsICJ1cmwiXSwKICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAibmFtZSI6IHsgInR5cGUiOiAgInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICJ0eXBlIjogeyAidHlwZSI6ICJzdHJpbmciLCAiZW51bSI6IFsicGVhciJdIH0sCiAgICAgICAgICAgICAgICAidXJsIjogeyAidHlwZSI6ICJzdHJpbmciIH0sCiAgICAgICAgICAgICAgICAiY2Fub25pY2FsIjogeyAidHlwZSI6ICJib29sZWFuIiB9LAogICAgICAgICAgICAgICAgIm9ubHkiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZXhjbHVkZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ2ZW5kb3ItYWxpYXMiOiB7ICJ0eXBlIjogInN0cmluZyIgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicGFja2FnZS1yZXBvc2l0b3J5IjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAicmVxdWlyZWQiOiBbInR5cGUiLCAicGFja2FnZSJdLAogICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJuYW1lIjogeyAidHlwZSI6ICAic3RyaW5nIiB9LAogICAgICAgICAgICAgICAgInR5cGUiOiB7ICJ0eXBlIjogInN0cmluZyIsICJlbnVtIjogWyJwYWNrYWdlIl0gfSwKICAgICAgICAgICAgICAgICJjYW5vbmljYWwiOiB7ICJ0eXBlIjogImJvb2xlYW4iIH0sCiAgICAgICAgICAgICAgICAib25seSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJleGNsdWRlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInBhY2thZ2UiOiB7CiAgICAgICAgICAgICAgICAgICAgIm9uZU9mIjogWwogICAgICAgICAgICAgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvaW5saW5lLXBhY2thZ2UiIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9pbmxpbmUtcGFja2FnZSIgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiaW5saW5lLXBhY2thZ2UiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJyZXF1aXJlZCI6IFsibmFtZSIsICJ2ZXJzaW9uIl0sCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgIm5hbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUGFja2FnZSBuYW1lLCBpbmNsdWRpbmcgJ3ZlbmRvci1uYW1lLycgcHJlZml4LiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRhcmdldC1kaXIiOiB7CiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRFUFJFQ0FURUQ6IEZvcmNlcyB0aGUgcGFja2FnZSB0byBiZSBpbnN0YWxsZWQgaW50byB0aGUgZ2l2ZW4gc3ViZGlyZWN0b3J5IHBhdGguIFRoaXMgaXMgdXNlZCBmb3IgYXV0b2xvYWRpbmcgUFNSLTAgcGFja2FnZXMgdGhhdCBkbyBub3QgY29udGFpbiB0aGVpciBmdWxsIHBhdGguIFVzZSBmb3J3YXJkIHNsYXNoZXMgZm9yIGNyb3NzLXBsYXRmb3JtIGNvbXBhdGliaWxpdHkuIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAia2V5d29yZHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogInVyaSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidmVyc2lvbiI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInRpbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJsaWNlbnNlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWwogICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImFycmF5IgogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXV0aG9ycyI6IHsKICAgICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2F1dGhvcnMiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInJlcGxhY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNvbmZsaWN0IjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwcm92aWRlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJyZXF1aXJlLWRldiI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAic3VnZ2VzdCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbIm9iamVjdCIsICJhcnJheSJdLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHRydWUKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9hdXRvbG9hZCIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXJjaGl2ZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsib2JqZWN0Il0sCiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJleGNsdWRlIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImJpbiI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsic3RyaW5nIiwgImFycmF5Il0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgc2V0IG9mIGZpbGVzLCBvciBhIHNpbmdsZSBmaWxlLCB0aGF0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGJpbmFyaWVzIGFuZCBzeW1saW5rZWQgaW50byBiaW4tZGlyIChmcm9tIGNvbmZpZykuIiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImluY2x1ZGUtcGF0aCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsiYXJyYXkiXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiREVQUkVDQVRFRDogQSBsaXN0IG9mIGRpcmVjdG9yaWVzIHdoaWNoIHNob3VsZCBnZXQgYWRkZWQgdG8gUEhQJ3MgaW5jbHVkZSBwYXRoLiBUaGlzIGlzIG9ubHkgcHJlc2VudCB0byBzdXBwb3J0IGxlZ2FjeSBwcm9qZWN0cywgYW5kIGFsbCBuZXcgY29kZSBzaG91bGQgcHJlZmVyYWJseSB1c2UgYXV0b2xvYWRpbmcuIiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3NvdXJjZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2Rpc3QiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHRydWUKICAgICAgICB9LAogICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJyZXF1aXJlZCI6IFsidHlwZSIsICJ1cmwiLCAicmVmZXJlbmNlIl0sCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ1cmwiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJtaXJyb3JzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgInJlcXVpcmVkIjogWyJ0eXBlIiwgInVybCJdLAogICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidXJsIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAic2hhc3VtIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibWlycm9ycyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQo8P3BocAoKCgppZiAoUEhQX1ZFUlNJT05fSUQgPCA1MDYwMCkgewppZiAoIWhlYWRlcnNfc2VudCgpKSB7CmhlYWRlcignSFRUUC8xLjEgNTAwIEludGVybmFsIFNlcnZlciBFcnJvcicpOwp9CiRlcnIgPSAnQ29tcG9zZXIgMi4zLjAgZHJvcHBlZCBzdXBwb3J0IGZvciBhdXRvbG9hZGluZyBvbiBQSFAgPDUuNiBhbmQgeW91IGFyZSBydW5uaW5nICcuUEhQX1ZFUlNJT04uJywgcGxlYXNlIHVwZ3JhZGUgUEhQIG9yIHVzZSBDb21wb3NlciAyLjIgTFRTIHZpYSAiY29tcG9zZXIgc2VsZi11cGRhdGUgLS0yLjIiLiBBYm9ydGluZy4nLlBIUF9FT0w7CmlmICghaW5pX2dldCgnZGlzcGxheV9lcnJvcnMnKSkgewppZiAoUEhQX1NBUEkgPT09ICdjbGknIHx8IFBIUF9TQVBJID09PSAncGhwZGJnJykgewpmd3JpdGUoU1RERVJSLCAkZXJyKTsKfSBlbHNlaWYgKCFoZWFkZXJzX3NlbnQoKSkgewplY2hvICRlcnI7Cn0KfQp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigkZXJyKTsKfQoKcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnL2NvbXBvc2VyL2F1dG9sb2FkX3JlYWwucGhwJzsKCnJldHVybiBDb21wb3NlckF1dG9sb2FkZXJJbml0Q29tcG9zZXJQaGFyMTc3ODY1NzMxODo6Z2V0TG9hZGVyKCk7Cjw/cGhwCgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEF1dG9sb2FkOwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIENsYXNzTG9hZGVyCnsKCnByaXZhdGUgc3RhdGljICRpbmNsdWRlRmlsZTsKCgpwcml2YXRlICR2ZW5kb3JEaXI7CgoKCgoKcHJpdmF0ZSAkcHJlZml4TGVuZ3Roc1BzcjQgPSBhcnJheSgpOwoKCgpwcml2YXRlICRwcmVmaXhEaXJzUHNyNCA9IGFycmF5KCk7CgoKCnByaXZhdGUgJGZhbGxiYWNrRGlyc1BzcjQgPSBhcnJheSgpOwoKCgoKCgoKCgpwcml2YXRlICRwcmVmaXhlc1BzcjAgPSBhcnJheSgpOwoKCgpwcml2YXRlICRmYWxsYmFja0RpcnNQc3IwID0gYXJyYXkoKTsKCgpwcml2YXRlICR1c2VJbmNsdWRlUGF0aCA9IGZhbHNlOwoKCgoKcHJpdmF0ZSAkY2xhc3NNYXAgPSBhcnJheSgpOwoKCnByaXZhdGUgJGNsYXNzTWFwQXV0aG9yaXRhdGl2ZSA9IGZhbHNlOwoKCgoKcHJpdmF0ZSAkbWlzc2luZ0NsYXNzZXMgPSBhcnJheSgpOwoKCnByaXZhdGUgJGFwY3VQcmVmaXg7CgoKCgpwcml2YXRlIHN0YXRpYyAkcmVnaXN0ZXJlZExvYWRlcnMgPSBhcnJheSgpOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR2ZW5kb3JEaXIgPSBudWxsKQp7CiR0aGlzLT52ZW5kb3JEaXIgPSAkdmVuZG9yRGlyOwpzZWxmOjppbml0aWFsaXplSW5jbHVkZUNsb3N1cmUoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByZWZpeGVzKCkKewppZiAoIWVtcHR5KCR0aGlzLT5wcmVmaXhlc1BzcjApKSB7CnJldHVybiBjYWxsX3VzZXJfZnVuY19hcnJheSgnYXJyYXlfbWVyZ2UnLCBhcnJheV92YWx1ZXMoJHRoaXMtPnByZWZpeGVzUHNyMCkpOwp9CgpyZXR1cm4gYXJyYXkoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByZWZpeGVzUHNyNCgpCnsKcmV0dXJuICR0aGlzLT5wcmVmaXhEaXJzUHNyNDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZhbGxiYWNrRGlycygpCnsKcmV0dXJuICR0aGlzLT5mYWxsYmFja0RpcnNQc3IwOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmFsbGJhY2tEaXJzUHNyNCgpCnsKcmV0dXJuICR0aGlzLT5mYWxsYmFja0RpcnNQc3I0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2xhc3NNYXAoKQp7CnJldHVybiAkdGhpcy0+Y2xhc3NNYXA7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZENsYXNzTWFwKGFycmF5ICRjbGFzc01hcCkKewppZiAoJHRoaXMtPmNsYXNzTWFwKSB7CiR0aGlzLT5jbGFzc01hcCA9IGFycmF5X21lcmdlKCR0aGlzLT5jbGFzc01hcCwgJGNsYXNzTWFwKTsKfSBlbHNlIHsKJHRoaXMtPmNsYXNzTWFwID0gJGNsYXNzTWFwOwp9Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkKCRwcmVmaXgsICRwYXRocywgJHByZXBlbmQgPSBmYWxzZSkKewokcGF0aHMgPSAoYXJyYXkpICRwYXRoczsKaWYgKCEkcHJlZml4KSB7CmlmICgkcHJlcGVuZCkgewokdGhpcy0+ZmFsbGJhY2tEaXJzUHNyMCA9IGFycmF5X21lcmdlKAokcGF0aHMsCiR0aGlzLT5mYWxsYmFja0RpcnNQc3IwCik7Cn0gZWxzZSB7CiR0aGlzLT5mYWxsYmFja0RpcnNQc3IwID0gYXJyYXlfbWVyZ2UoCiR0aGlzLT5mYWxsYmFja0RpcnNQc3IwLAokcGF0aHMKKTsKfQoKcmV0dXJuOwp9CgokZmlyc3QgPSAkcHJlZml4WzBdOwppZiAoIWlzc2V0KCR0aGlzLT5wcmVmaXhlc1BzcjBbJGZpcnN0XVskcHJlZml4XSkpIHsKJHRoaXMtPnByZWZpeGVzUHNyMFskZmlyc3RdWyRwcmVmaXhdID0gJHBhdGhzOwoKcmV0dXJuOwp9CmlmICgkcHJlcGVuZCkgewokdGhpcy0+cHJlZml4ZXNQc3IwWyRmaXJzdF1bJHByZWZpeF0gPSBhcnJheV9tZXJnZSgKJHBhdGhzLAokdGhpcy0+cHJlZml4ZXNQc3IwWyRmaXJzdF1bJHByZWZpeF0KKTsKfSBlbHNlIHsKJHRoaXMtPnByZWZpeGVzUHNyMFskZmlyc3RdWyRwcmVmaXhdID0gYXJyYXlfbWVyZ2UoCiR0aGlzLT5wcmVmaXhlc1BzcjBbJGZpcnN0XVskcHJlZml4XSwKJHBhdGhzCik7Cn0KfQoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFBzcjQoJHByZWZpeCwgJHBhdGhzLCAkcHJlcGVuZCA9IGZhbHNlKQp7CiRwYXRocyA9IChhcnJheSkgJHBhdGhzOwppZiAoISRwcmVmaXgpIHsKCmlmICgkcHJlcGVuZCkgewokdGhpcy0+ZmFsbGJhY2tEaXJzUHNyNCA9IGFycmF5X21lcmdlKAokcGF0aHMsCiR0aGlzLT5mYWxsYmFja0RpcnNQc3I0Cik7Cn0gZWxzZSB7CiR0aGlzLT5mYWxsYmFja0RpcnNQc3I0ID0gYXJyYXlfbWVyZ2UoCiR0aGlzLT5mYWxsYmFja0RpcnNQc3I0LAokcGF0aHMKKTsKfQp9IGVsc2VpZiAoIWlzc2V0KCR0aGlzLT5wcmVmaXhEaXJzUHNyNFskcHJlZml4XSkpIHsKCiRsZW5ndGggPSBzdHJsZW4oJHByZWZpeCk7CmlmICgnXFwnICE9PSAkcHJlZml4WyRsZW5ndGggLSAxXSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQSBub24tZW1wdHkgUFNSLTQgcHJlZml4IG11c3QgZW5kIHdpdGggYSBuYW1lc3BhY2Ugc2VwYXJhdG9yLiIpOwp9CiR0aGlzLT5wcmVmaXhMZW5ndGhzUHNyNFskcHJlZml4WzBdXVskcHJlZml4XSA9ICRsZW5ndGg7CiR0aGlzLT5wcmVmaXhEaXJzUHNyNFskcHJlZml4XSA9ICRwYXRoczsKfSBlbHNlaWYgKCRwcmVwZW5kKSB7CgokdGhpcy0+cHJlZml4RGlyc1BzcjRbJHByZWZpeF0gPSBhcnJheV9tZXJnZSgKJHBhdGhzLAokdGhpcy0+cHJlZml4RGlyc1BzcjRbJHByZWZpeF0KKTsKfSBlbHNlIHsKCiR0aGlzLT5wcmVmaXhEaXJzUHNyNFskcHJlZml4XSA9IGFycmF5X21lcmdlKAokdGhpcy0+cHJlZml4RGlyc1BzcjRbJHByZWZpeF0sCiRwYXRocwopOwp9Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXQoJHByZWZpeCwgJHBhdGhzKQp7CmlmICghJHByZWZpeCkgewokdGhpcy0+ZmFsbGJhY2tEaXJzUHNyMCA9IChhcnJheSkgJHBhdGhzOwp9IGVsc2UgewokdGhpcy0+cHJlZml4ZXNQc3IwWyRwcmVmaXhbMF1dWyRwcmVmaXhdID0gKGFycmF5KSAkcGF0aHM7Cn0KfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHNyNCgkcHJlZml4LCAkcGF0aHMpCnsKaWYgKCEkcHJlZml4KSB7CiR0aGlzLT5mYWxsYmFja0RpcnNQc3I0ID0gKGFycmF5KSAkcGF0aHM7Cn0gZWxzZSB7CiRsZW5ndGggPSBzdHJsZW4oJHByZWZpeCk7CmlmICgnXFwnICE9PSAkcHJlZml4WyRsZW5ndGggLSAxXSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQSBub24tZW1wdHkgUFNSLTQgcHJlZml4IG11c3QgZW5kIHdpdGggYSBuYW1lc3BhY2Ugc2VwYXJhdG9yLiIpOwp9CiR0aGlzLT5wcmVmaXhMZW5ndGhzUHNyNFskcHJlZml4WzBdXVskcHJlZml4XSA9ICRsZW5ndGg7CiR0aGlzLT5wcmVmaXhEaXJzUHNyNFskcHJlZml4XSA9IChhcnJheSkgJHBhdGhzOwp9Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VXNlSW5jbHVkZVBhdGgoJHVzZUluY2x1ZGVQYXRoKQp7CiR0aGlzLT51c2VJbmNsdWRlUGF0aCA9ICR1c2VJbmNsdWRlUGF0aDsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVzZUluY2x1ZGVQYXRoKCkKewpyZXR1cm4gJHRoaXMtPnVzZUluY2x1ZGVQYXRoOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDbGFzc01hcEF1dGhvcml0YXRpdmUoJGNsYXNzTWFwQXV0aG9yaXRhdGl2ZSkKewokdGhpcy0+Y2xhc3NNYXBBdXRob3JpdGF0aXZlID0gJGNsYXNzTWFwQXV0aG9yaXRhdGl2ZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNDbGFzc01hcEF1dGhvcml0YXRpdmUoKQp7CnJldHVybiAkdGhpcy0+Y2xhc3NNYXBBdXRob3JpdGF0aXZlOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFwY3VQcmVmaXgoJGFwY3VQcmVmaXgpCnsKJHRoaXMtPmFwY3VQcmVmaXggPSBmdW5jdGlvbl9leGlzdHMoJ2FwY3VfZmV0Y2gnKSAmJiBmaWx0ZXJfdmFyKGluaV9nZXQoJ2FwYy5lbmFibGVkJyksIEZJTFRFUl9WQUxJREFURV9CT09MRUFOKSA/ICRhcGN1UHJlZml4IDogbnVsbDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXBjdVByZWZpeCgpCnsKcmV0dXJuICR0aGlzLT5hcGN1UHJlZml4Owp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlZ2lzdGVyKCRwcmVwZW5kID0gZmFsc2UpCnsKc3BsX2F1dG9sb2FkX3JlZ2lzdGVyKGFycmF5KCR0aGlzLCAnbG9hZENsYXNzJyksIHRydWUsICRwcmVwZW5kKTsKCmlmIChudWxsID09PSAkdGhpcy0+dmVuZG9yRGlyKSB7CnJldHVybjsKfQoKaWYgKCRwcmVwZW5kKSB7CnNlbGY6OiRyZWdpc3RlcmVkTG9hZGVycyA9IGFycmF5KCR0aGlzLT52ZW5kb3JEaXIgPT4gJHRoaXMpICsgc2VsZjo6JHJlZ2lzdGVyZWRMb2FkZXJzOwp9IGVsc2Ugewp1bnNldChzZWxmOjokcmVnaXN0ZXJlZExvYWRlcnNbJHRoaXMtPnZlbmRvckRpcl0pOwpzZWxmOjokcmVnaXN0ZXJlZExvYWRlcnNbJHRoaXMtPnZlbmRvckRpcl0gPSAkdGhpczsKfQp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB1bnJlZ2lzdGVyKCkKewpzcGxfYXV0b2xvYWRfdW5yZWdpc3RlcihhcnJheSgkdGhpcywgJ2xvYWRDbGFzcycpKTsKCmlmIChudWxsICE9PSAkdGhpcy0+dmVuZG9yRGlyKSB7CnVuc2V0KHNlbGY6OiRyZWdpc3RlcmVkTG9hZGVyc1skdGhpcy0+dmVuZG9yRGlyXSk7Cn0KfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGxvYWRDbGFzcygkY2xhc3MpCnsKaWYgKCRmaWxlID0gJHRoaXMtPmZpbmRGaWxlKCRjbGFzcykpIHsKJGluY2x1ZGVGaWxlID0gc2VsZjo6JGluY2x1ZGVGaWxlOwokaW5jbHVkZUZpbGUoJGZpbGUpOwoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBudWxsOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmRGaWxlKCRjbGFzcykKewoKaWYgKGlzc2V0KCR0aGlzLT5jbGFzc01hcFskY2xhc3NdKSkgewpyZXR1cm4gJHRoaXMtPmNsYXNzTWFwWyRjbGFzc107Cn0KaWYgKCR0aGlzLT5jbGFzc01hcEF1dGhvcml0YXRpdmUgfHwgaXNzZXQoJHRoaXMtPm1pc3NpbmdDbGFzc2VzWyRjbGFzc10pKSB7CnJldHVybiBmYWxzZTsKfQppZiAobnVsbCAhPT0gJHRoaXMtPmFwY3VQcmVmaXgpIHsKJGZpbGUgPSBhcGN1X2ZldGNoKCR0aGlzLT5hcGN1UHJlZml4LiRjbGFzcywgJGhpdCk7CmlmICgkaGl0KSB7CnJldHVybiAkZmlsZTsKfQp9CgokZmlsZSA9ICR0aGlzLT5maW5kRmlsZVdpdGhFeHRlbnNpb24oJGNsYXNzLCAnLnBocCcpOwoKCmlmIChmYWxzZSA9PT0gJGZpbGUgJiYgZGVmaW5lZCgnSEhWTV9WRVJTSU9OJykpIHsKJGZpbGUgPSAkdGhpcy0+ZmluZEZpbGVXaXRoRXh0ZW5zaW9uKCRjbGFzcywgJy5oaCcpOwp9CgppZiAobnVsbCAhPT0gJHRoaXMtPmFwY3VQcmVmaXgpIHsKYXBjdV9hZGQoJHRoaXMtPmFwY3VQcmVmaXguJGNsYXNzLCAkZmlsZSk7Cn0KCmlmIChmYWxzZSA9PT0gJGZpbGUpIHsKCiR0aGlzLT5taXNzaW5nQ2xhc3Nlc1skY2xhc3NdID0gdHJ1ZTsKfQoKcmV0dXJuICRmaWxlOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UmVnaXN0ZXJlZExvYWRlcnMoKQp7CnJldHVybiBzZWxmOjokcmVnaXN0ZXJlZExvYWRlcnM7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBmaW5kRmlsZVdpdGhFeHRlbnNpb24oJGNsYXNzLCAkZXh0KQp7CgokbG9naWNhbFBhdGhQc3I0ID0gc3RydHIoJGNsYXNzLCAnXFwnLCBESVJFQ1RPUllfU0VQQVJBVE9SKSAuICRleHQ7CgokZmlyc3QgPSAkY2xhc3NbMF07CmlmIChpc3NldCgkdGhpcy0+cHJlZml4TGVuZ3Roc1BzcjRbJGZpcnN0XSkpIHsKJHN1YlBhdGggPSAkY2xhc3M7CndoaWxlIChmYWxzZSAhPT0gJGxhc3RQb3MgPSBzdHJycG9zKCRzdWJQYXRoLCAnXFwnKSkgewokc3ViUGF0aCA9IHN1YnN0cigkc3ViUGF0aCwgMCwgJGxhc3RQb3MpOwokc2VhcmNoID0gJHN1YlBhdGggLiAnXFwnOwppZiAoaXNzZXQoJHRoaXMtPnByZWZpeERpcnNQc3I0WyRzZWFyY2hdKSkgewokcGF0aEVuZCA9IERJUkVDVE9SWV9TRVBBUkFUT1IgLiBzdWJzdHIoJGxvZ2ljYWxQYXRoUHNyNCwgJGxhc3RQb3MgKyAxKTsKZm9yZWFjaCAoJHRoaXMtPnByZWZpeERpcnNQc3I0WyRzZWFyY2hdIGFzICRkaXIpIHsKaWYgKGZpbGVfZXhpc3RzKCRmaWxlID0gJGRpciAuICRwYXRoRW5kKSkgewpyZXR1cm4gJGZpbGU7Cn0KfQp9Cn0KfQoKCmZvcmVhY2ggKCR0aGlzLT5mYWxsYmFja0RpcnNQc3I0IGFzICRkaXIpIHsKaWYgKGZpbGVfZXhpc3RzKCRmaWxlID0gJGRpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkbG9naWNhbFBhdGhQc3I0KSkgewpyZXR1cm4gJGZpbGU7Cn0KfQoKCmlmIChmYWxzZSAhPT0gJHBvcyA9IHN0cnJwb3MoJGNsYXNzLCAnXFwnKSkgewoKJGxvZ2ljYWxQYXRoUHNyMCA9IHN1YnN0cigkbG9naWNhbFBhdGhQc3I0LCAwLCAkcG9zICsgMSkKLiBzdHJ0cihzdWJzdHIoJGxvZ2ljYWxQYXRoUHNyNCwgJHBvcyArIDEpLCAnXycsIERJUkVDVE9SWV9TRVBBUkFUT1IpOwp9IGVsc2UgewoKJGxvZ2ljYWxQYXRoUHNyMCA9IHN0cnRyKCRjbGFzcywgJ18nLCBESVJFQ1RPUllfU0VQQVJBVE9SKSAuICRleHQ7Cn0KCmlmIChpc3NldCgkdGhpcy0+cHJlZml4ZXNQc3IwWyRmaXJzdF0pKSB7CmZvcmVhY2ggKCR0aGlzLT5wcmVmaXhlc1BzcjBbJGZpcnN0XSBhcyAkcHJlZml4ID0+ICRkaXJzKSB7CmlmICgwID09PSBzdHJwb3MoJGNsYXNzLCAkcHJlZml4KSkgewpmb3JlYWNoICgkZGlycyBhcyAkZGlyKSB7CmlmIChmaWxlX2V4aXN0cygkZmlsZSA9ICRkaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGxvZ2ljYWxQYXRoUHNyMCkpIHsKcmV0dXJuICRmaWxlOwp9Cn0KfQp9Cn0KCgpmb3JlYWNoICgkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyMCBhcyAkZGlyKSB7CmlmIChmaWxlX2V4aXN0cygkZmlsZSA9ICRkaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGxvZ2ljYWxQYXRoUHNyMCkpIHsKcmV0dXJuICRmaWxlOwp9Cn0KCgppZiAoJHRoaXMtPnVzZUluY2x1ZGVQYXRoICYmICRmaWxlID0gc3RyZWFtX3Jlc29sdmVfaW5jbHVkZV9wYXRoKCRsb2dpY2FsUGF0aFBzcjApKSB7CnJldHVybiAkZmlsZTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpbml0aWFsaXplSW5jbHVkZUNsb3N1cmUoKQp7CmlmIChzZWxmOjokaW5jbHVkZUZpbGUgIT09IG51bGwpIHsKcmV0dXJuOwp9CgoKCgoKCgoKCnNlbGY6OiRpbmNsdWRlRmlsZSA9IFxDbG9zdXJlOjpiaW5kKHN0YXRpYyBmdW5jdGlvbigkZmlsZSkgewppbmNsdWRlICRmaWxlOwp9LCBudWxsLCBudWxsKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyOwoKdXNlIENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyOwp1c2UgQ29tcG9zZXJcU2VtdmVyXFZlcnNpb25QYXJzZXI7CgoKCgoKCgoKCgpjbGFzcyBJbnN0YWxsZWRWZXJzaW9ucwp7CgoKCgpwcml2YXRlIHN0YXRpYyAkc2VsZkRpciA9IG51bGw7CgoKCgoKcHJpdmF0ZSBzdGF0aWMgJGluc3RhbGxlZDsKCgoKCnByaXZhdGUgc3RhdGljICRpbnN0YWxsZWRJc0xvY2FsRGlyOwoKCgoKcHJpdmF0ZSBzdGF0aWMgJGNhbkdldFZlbmRvcnM7CgoKCgoKcHJpdmF0ZSBzdGF0aWMgJGluc3RhbGxlZEJ5VmVuZG9yID0gYXJyYXkoKTsKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0SW5zdGFsbGVkUGFja2FnZXMoKQp7CiRwYWNrYWdlcyA9IGFycmF5KCk7CmZvcmVhY2ggKHNlbGY6OmdldEluc3RhbGxlZCgpIGFzICRpbnN0YWxsZWQpIHsKJHBhY2thZ2VzW10gPSBhcnJheV9rZXlzKCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ10pOwp9CgppZiAoMSA9PT0gXGNvdW50KCRwYWNrYWdlcykpIHsKcmV0dXJuICRwYWNrYWdlc1swXTsKfQoKcmV0dXJuIGFycmF5X2tleXMoYXJyYXlfZmxpcChcY2FsbF91c2VyX2Z1bmNfYXJyYXkoJ2FycmF5X21lcmdlJywgJHBhY2thZ2VzKSkpOwp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRJbnN0YWxsZWRQYWNrYWdlc0J5VHlwZSgkdHlwZSkKewokcGFja2FnZXNCeVR5cGUgPSBhcnJheSgpOwoKZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewpmb3JlYWNoICgkaW5zdGFsbGVkWyd2ZXJzaW9ucyddIGFzICRuYW1lID0+ICRwYWNrYWdlKSB7CmlmIChpc3NldCgkcGFja2FnZVsndHlwZSddKSAmJiAkcGFja2FnZVsndHlwZSddID09PSAkdHlwZSkgewokcGFja2FnZXNCeVR5cGVbXSA9ICRuYW1lOwp9Cn0KfQoKcmV0dXJuICRwYWNrYWdlc0J5VHlwZTsKfQoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0luc3RhbGxlZCgkcGFja2FnZU5hbWUsICRpbmNsdWRlRGV2UmVxdWlyZW1lbnRzID0gdHJ1ZSkKewpmb3JlYWNoIChzZWxmOjpnZXRJbnN0YWxsZWQoKSBhcyAkaW5zdGFsbGVkKSB7CmlmIChpc3NldCgkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV0pKSB7CnJldHVybiAkaW5jbHVkZURldlJlcXVpcmVtZW50cyB8fCAhaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydkZXZfcmVxdWlyZW1lbnQnXSkgfHwgJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydkZXZfcmVxdWlyZW1lbnQnXSA9PT0gZmFsc2U7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNhdGlzZmllcyhWZXJzaW9uUGFyc2VyICRwYXJzZXIsICRwYWNrYWdlTmFtZSwgJGNvbnN0cmFpbnQpCnsKJGNvbnN0cmFpbnQgPSAkcGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKChzdHJpbmcpICRjb25zdHJhaW50KTsKJHByb3ZpZGVkID0gJHBhcnNlci0+cGFyc2VDb25zdHJhaW50cyhzZWxmOjpnZXRWZXJzaW9uUmFuZ2VzKCRwYWNrYWdlTmFtZSkpOwoKcmV0dXJuICRwcm92aWRlZC0+bWF0Y2hlcygkY29uc3RyYWludCk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VmVyc2lvblJhbmdlcygkcGFja2FnZU5hbWUpCnsKZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewppZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKY29udGludWU7Cn0KCiRyYW5nZXMgPSBhcnJheSgpOwppZiAoaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydwcmV0dHlfdmVyc2lvbiddKSkgewokcmFuZ2VzW10gPSAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ3ByZXR0eV92ZXJzaW9uJ107Cn0KaWYgKGFycmF5X2tleV9leGlzdHMoJ2FsaWFzZXMnLCAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV0pKSB7CiRyYW5nZXMgPSBhcnJheV9tZXJnZSgkcmFuZ2VzLCAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ2FsaWFzZXMnXSk7Cn0KaWYgKGFycmF5X2tleV9leGlzdHMoJ3JlcGxhY2VkJywgJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewokcmFuZ2VzID0gYXJyYXlfbWVyZ2UoJHJhbmdlcywgJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydyZXBsYWNlZCddKTsKfQppZiAoYXJyYXlfa2V5X2V4aXN0cygncHJvdmlkZWQnLCAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV0pKSB7CiRyYW5nZXMgPSBhcnJheV9tZXJnZSgkcmFuZ2VzLCAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ3Byb3ZpZGVkJ10pOwp9CgpyZXR1cm4gaW1wbG9kZSgnIHx8ICcsICRyYW5nZXMpOwp9Cgp0aHJvdyBuZXcgXE91dE9mQm91bmRzRXhjZXB0aW9uKCdQYWNrYWdlICInIC4gJHBhY2thZ2VOYW1lIC4gJyIgaXMgbm90IGluc3RhbGxlZCcpOwp9CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRWZXJzaW9uKCRwYWNrYWdlTmFtZSkKewpmb3JlYWNoIChzZWxmOjpnZXRJbnN0YWxsZWQoKSBhcyAkaW5zdGFsbGVkKSB7CmlmICghaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewpjb250aW51ZTsKfQoKaWYgKCFpc3NldCgkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ3ZlcnNpb24nXSkpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ3ZlcnNpb24nXTsKfQoKdGhyb3cgbmV3IFxPdXRPZkJvdW5kc0V4Y2VwdGlvbignUGFja2FnZSAiJyAuICRwYWNrYWdlTmFtZSAuICciIGlzIG5vdCBpbnN0YWxsZWQnKTsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UHJldHR5VmVyc2lvbigkcGFja2FnZU5hbWUpCnsKZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewppZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKY29udGludWU7Cn0KCmlmICghaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydwcmV0dHlfdmVyc2lvbiddKSkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncHJldHR5X3ZlcnNpb24nXTsKfQoKdGhyb3cgbmV3IFxPdXRPZkJvdW5kc0V4Y2VwdGlvbignUGFja2FnZSAiJyAuICRwYWNrYWdlTmFtZSAuICciIGlzIG5vdCBpbnN0YWxsZWQnKTsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UmVmZXJlbmNlKCRwYWNrYWdlTmFtZSkKewpmb3JlYWNoIChzZWxmOjpnZXRJbnN0YWxsZWQoKSBhcyAkaW5zdGFsbGVkKSB7CmlmICghaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewpjb250aW51ZTsKfQoKaWYgKCFpc3NldCgkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ3JlZmVyZW5jZSddKSkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncmVmZXJlbmNlJ107Cn0KCnRocm93IG5ldyBcT3V0T2ZCb3VuZHNFeGNlcHRpb24oJ1BhY2thZ2UgIicgLiAkcGFja2FnZU5hbWUgLiAnIiBpcyBub3QgaW5zdGFsbGVkJyk7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEluc3RhbGxQYXRoKCRwYWNrYWdlTmFtZSkKewpmb3JlYWNoIChzZWxmOjpnZXRJbnN0YWxsZWQoKSBhcyAkaW5zdGFsbGVkKSB7CmlmICghaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewpjb250aW51ZTsKfQoKcmV0dXJuIGlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsnaW5zdGFsbF9wYXRoJ10pID8gJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydpbnN0YWxsX3BhdGgnXSA6IG51bGw7Cn0KCnRocm93IG5ldyBcT3V0T2ZCb3VuZHNFeGNlcHRpb24oJ1BhY2thZ2UgIicgLiAkcGFja2FnZU5hbWUgLiAnIiBpcyBub3QgaW5zdGFsbGVkJyk7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFJvb3RQYWNrYWdlKCkKewokaW5zdGFsbGVkID0gc2VsZjo6Z2V0SW5zdGFsbGVkKCk7CgpyZXR1cm4gJGluc3RhbGxlZFswXVsncm9vdCddOwp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRSYXdEYXRhKCkKewpAdHJpZ2dlcl9lcnJvcignZ2V0UmF3RGF0YSBvbmx5IHJldHVybnMgdGhlIGZpcnN0IGRhdGFzZXQgbG9hZGVkLCB3aGljaCBtYXkgbm90IGJlIHdoYXQgeW91IGV4cGVjdC4gVXNlIGdldEFsbFJhd0RhdGEoKSBpbnN0ZWFkIHdoaWNoIHJldHVybnMgYWxsIGRhdGFzZXRzIGZvciBhbGwgYXV0b2xvYWRlcnMgcHJlc2VudCBpbiB0aGUgcHJvY2Vzcy4nLCBFX1VTRVJfREVQUkVDQVRFRCk7CgppZiAobnVsbCA9PT0gc2VsZjo6JGluc3RhbGxlZCkgewoKCmlmIChzdWJzdHIoX19ESVJfXywgLTgsIDEpICE9PSAnQycpIHsKc2VsZjo6JGluc3RhbGxlZCA9IGluY2x1ZGUgX19ESVJfXyAuICcvaW5zdGFsbGVkLnBocCc7Cn0gZWxzZSB7CnNlbGY6OiRpbnN0YWxsZWQgPSBhcnJheSgpOwp9Cn0KCnJldHVybiBzZWxmOjokaW5zdGFsbGVkOwp9CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEFsbFJhd0RhdGEoKQp7CnJldHVybiBzZWxmOjpnZXRJbnN0YWxsZWQoKTsKfQoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZWxvYWQoJGRhdGEpCnsKc2VsZjo6JGluc3RhbGxlZCA9ICRkYXRhOwpzZWxmOjokaW5zdGFsbGVkQnlWZW5kb3IgPSBhcnJheSgpOwoKCgoKCnNlbGY6OiRpbnN0YWxsZWRJc0xvY2FsRGlyID0gZmFsc2U7Cn0KCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldFNlbGZEaXIoKQp7CmlmIChzZWxmOjokc2VsZkRpciA9PT0gbnVsbCkgewpzZWxmOjokc2VsZkRpciA9IHN0cnRyKF9fRElSX18sICdcXCcsICcvJyk7Cn0KCnJldHVybiBzZWxmOjokc2VsZkRpcjsKfQoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldEluc3RhbGxlZCgpCnsKaWYgKG51bGwgPT09IHNlbGY6OiRjYW5HZXRWZW5kb3JzKSB7CnNlbGY6OiRjYW5HZXRWZW5kb3JzID0gbWV0aG9kX2V4aXN0cygnQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXInLCAnZ2V0UmVnaXN0ZXJlZExvYWRlcnMnKTsKfQoKJGluc3RhbGxlZCA9IGFycmF5KCk7CiRjb3BpZWRMb2NhbERpciA9IGZhbHNlOwoKaWYgKHNlbGY6OiRjYW5HZXRWZW5kb3JzKSB7CiRzZWxmRGlyID0gc2VsZjo6Z2V0U2VsZkRpcigpOwpmb3JlYWNoIChDbGFzc0xvYWRlcjo6Z2V0UmVnaXN0ZXJlZExvYWRlcnMoKSBhcyAkdmVuZG9yRGlyID0+ICRsb2FkZXIpIHsKJHZlbmRvckRpciA9IHN0cnRyKCR2ZW5kb3JEaXIsICdcXCcsICcvJyk7CmlmIChpc3NldChzZWxmOjokaW5zdGFsbGVkQnlWZW5kb3JbJHZlbmRvckRpcl0pKSB7CiRpbnN0YWxsZWRbXSA9IHNlbGY6OiRpbnN0YWxsZWRCeVZlbmRvclskdmVuZG9yRGlyXTsKfSBlbHNlaWYgKGlzX2ZpbGUoJHZlbmRvckRpci4nL2NvbXBvc2VyL2luc3RhbGxlZC5waHAnKSkgewoKJHJlcXVpcmVkID0gcmVxdWlyZSAkdmVuZG9yRGlyLicvY29tcG9zZXIvaW5zdGFsbGVkLnBocCc7CnNlbGY6OiRpbnN0YWxsZWRCeVZlbmRvclskdmVuZG9yRGlyXSA9ICRyZXF1aXJlZDsKJGluc3RhbGxlZFtdID0gJHJlcXVpcmVkOwppZiAoc2VsZjo6JGluc3RhbGxlZCA9PT0gbnVsbCAmJiAkdmVuZG9yRGlyLicvY29tcG9zZXInID09PSAkc2VsZkRpcikgewpzZWxmOjokaW5zdGFsbGVkID0gJHJlcXVpcmVkOwpzZWxmOjokaW5zdGFsbGVkSXNMb2NhbERpciA9IHRydWU7Cn0KfQppZiAoc2VsZjo6JGluc3RhbGxlZElzTG9jYWxEaXIgJiYgJHZlbmRvckRpci4nL2NvbXBvc2VyJyA9PT0gJHNlbGZEaXIpIHsKJGNvcGllZExvY2FsRGlyID0gdHJ1ZTsKfQp9Cn0KCmlmIChudWxsID09PSBzZWxmOjokaW5zdGFsbGVkKSB7CgoKaWYgKHN1YnN0cihfX0RJUl9fLCAtOCwgMSkgIT09ICdDJykgewoKJHJlcXVpcmVkID0gcmVxdWlyZSBfX0RJUl9fIC4gJy9pbnN0YWxsZWQucGhwJzsKc2VsZjo6JGluc3RhbGxlZCA9ICRyZXF1aXJlZDsKfSBlbHNlIHsKc2VsZjo6JGluc3RhbGxlZCA9IGFycmF5KCk7Cn0KfQoKaWYgKHNlbGY6OiRpbnN0YWxsZWQgIT09IGFycmF5KCkgJiYgISRjb3BpZWRMb2NhbERpcikgewokaW5zdGFsbGVkW10gPSBzZWxmOjokaW5zdGFsbGVkOwp9CgpyZXR1cm4gJGluc3RhbGxlZDsKfQp9Cjw/cGhwCgoKCiR2ZW5kb3JEaXIgPSBkaXJuYW1lKF9fRElSX18pOwokYmFzZURpciA9IGRpcm5hbWUoJHZlbmRvckRpcik7CgpyZXR1cm4gYXJyYXkoCidBdHRyaWJ1dGUnID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvUmVzb3VyY2VzL3N0dWJzL0F0dHJpYnV0ZS5waHAnLAonQ1VSTFN0cmluZ0ZpbGUnID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODEvUmVzb3VyY2VzL3N0dWJzL0NVUkxTdHJpbmdGaWxlLnBocCcsCidDb21wb3NlclxcSW5zdGFsbGVkVmVyc2lvbnMnID0+ICR2ZW5kb3JEaXIgLiAnL2NvbXBvc2VyL0luc3RhbGxlZFZlcnNpb25zLnBocCcsCidEZXByZWNhdGVkJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDg0L1Jlc291cmNlcy9zdHVicy9EZXByZWNhdGVkLnBocCcsCidKc29uRXhjZXB0aW9uJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDczL1Jlc291cmNlcy9zdHVicy9Kc29uRXhjZXB0aW9uLnBocCcsCidOb3JtYWxpemVyJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplci9SZXNvdXJjZXMvc3R1YnMvTm9ybWFsaXplci5waHAnLAonUGRvXFxEYmxpYicgPT4gJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4NC9SZXNvdXJjZXMvc3R1YnMvUGRvL0RibGliLnBocCcsCidQZG9cXEZpcmViaXJkJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDg0L1Jlc291cmNlcy9zdHVicy9QZG8vRmlyZWJpcmQucGhwJywKJ1Bkb1xcTXlzcWwnID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODQvUmVzb3VyY2VzL3N0dWJzL1Bkby9NeXNxbC5waHAnLAonUGRvXFxPZGJjJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDg0L1Jlc291cmNlcy9zdHVicy9QZG8vT2RiYy5waHAnLAonUGRvXFxQZ3NxbCcgPT4gJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4NC9SZXNvdXJjZXMvc3R1YnMvUGRvL1Bnc3FsLnBocCcsCidQZG9cXFNxbGl0ZScgPT4gJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4NC9SZXNvdXJjZXMvc3R1YnMvUGRvL1NxbGl0ZS5waHAnLAonUGhwVG9rZW4nID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvUmVzb3VyY2VzL3N0dWJzL1BocFRva2VuLnBocCcsCidSZWZsZWN0aW9uQ29uc3RhbnQnID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODQvUmVzb3VyY2VzL3N0dWJzL1JlZmxlY3Rpb25Db25zdGFudC5waHAnLAonUmV0dXJuVHlwZVdpbGxDaGFuZ2UnID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODEvUmVzb3VyY2VzL3N0dWJzL1JldHVyblR5cGVXaWxsQ2hhbmdlLnBocCcsCidSb3VuZGluZ01vZGUnID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODQvUmVzb3VyY2VzL3N0dWJzL1JvdW5kaW5nTW9kZS5waHAnLAonU3RyaW5nYWJsZScgPT4gJHZlbmRvckRpciAuICcvbWFyYy1tYWJlL3BocC1lbnVtL3N0dWJzL1N0cmluZ2FibGUucGhwJywKJ1VuaGFuZGxlZE1hdGNoRXJyb3InID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvUmVzb3VyY2VzL3N0dWJzL1VuaGFuZGxlZE1hdGNoRXJyb3IucGhwJywKJ1ZhbHVlRXJyb3InID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvUmVzb3VyY2VzL3N0dWJzL1ZhbHVlRXJyb3IucGhwJywKKTsKPD9waHAKCgoKJHZlbmRvckRpciA9IGRpcm5hbWUoX19ESVJfXyk7CiRiYXNlRGlyID0gZGlybmFtZSgkdmVuZG9yRGlyKTsKCnJldHVybiBhcnJheSgKJ2E0YTExOWE1NmU1MGZiYjI5MzI4MWQ5YTQ4MDA3ZTBlJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgwL2Jvb3RzdHJhcC5waHAnLAonNmUzZmFlMjk2MzFlZjI4MDY2MGIzY2RhZDA2ZjI1YTgnID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvZGVwcmVjYXRpb24tY29udHJhY3RzL2Z1bmN0aW9uLnBocCcsCicwZTZkN2JmNGE1ODExYmZhNWNmNDBjNWNjZDZmYWU2YScgPT4gJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZy9ib290c3RyYXAucGhwJywKJzMyMGNkZTIyZjY2ZGQ0ZjVkM2ZkNjIxZDNlODhiOThmJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLWN0eXBlL2Jvb3RzdHJhcC5waHAnLAonODgyNWVkZTgzZjJmMjg5MTI3NzIyZDRlODQyY2Y3ZTgnID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ncmFwaGVtZS9ib290c3RyYXAucGhwJywKJ2U2OWY3ZjZlZTI4N2I5NjkxOThjM2M5ZDY3NzdiZDM4JyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplci9ib290c3RyYXAucGhwJywKJzBkNTllZTI0MGE0Y2Q5NmRkYmI0ZmYxNjRmY2NlYTRkJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDczL2Jvb3RzdHJhcC5waHAnLAonYjZiOTkxYTU3NjIwZTJmYjZiMmY2NmYwM2ZlOWRkYzInID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvc3RyaW5nL1Jlc291cmNlcy9mdW5jdGlvbnMucGhwJywKJ2FkMTU1ZjhmMWNmMGQ0MThmZTQ5ZTI0OGRiOGM2NjFiJyA9PiAkdmVuZG9yRGlyIC4gJy9yZWFjdC9wcm9taXNlL3NyYy9mdW5jdGlvbnNfaW5jbHVkZS5waHAnLAonMjNjMTgwNDZmNTJiZWYzZWVhMDM0NjU3YmFmZGE1MGYnID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODEvYm9vdHN0cmFwLnBocCcsCic5ZDJiOWZjNmRiMGYxNTNhMGExNDlmZWZiMTgyNDE1ZScgPT4gJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4NC9ib290c3RyYXAucGhwJywKKTsKPD9waHAKCgoKJHZlbmRvckRpciA9IGRpcm5hbWUoX19ESVJfXyk7CiRiYXNlRGlyID0gZGlybmFtZSgkdmVuZG9yRGlyKTsKCnJldHVybiBhcnJheSgKKTsKPD9waHAKCgoKJHZlbmRvckRpciA9IGRpcm5hbWUoX19ESVJfXyk7CiRiYXNlRGlyID0gZGlybmFtZSgkdmVuZG9yRGlyKTsKCnJldHVybiBhcnJheSgKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA4NFxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDg0JyksCidTeW1mb255XFxQb2x5ZmlsbFxcUGhwODFcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4MScpLAonU3ltZm9ueVxcUG9seWZpbGxcXFBocDgwXFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODAnKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA3M1xcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDczJyksCidTeW1mb255XFxQb2x5ZmlsbFxcTWJzdHJpbmdcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZycpLAonU3ltZm9ueVxcUG9seWZpbGxcXEludGxcXE5vcm1hbGl6ZXJcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXInKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxJbnRsXFxHcmFwaGVtZVxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLWludGwtZ3JhcGhlbWUnKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxDdHlwZVxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLWN0eXBlJyksCidTeW1mb255XFxDb250cmFjdHNcXFNlcnZpY2VcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc3ltZm9ueS9zZXJ2aWNlLWNvbnRyYWN0cycpLAonU3ltZm9ueVxcQ29tcG9uZW50XFxTdHJpbmdcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc3ltZm9ueS9zdHJpbmcnKSwKJ1N5bWZvbnlcXENvbXBvbmVudFxcUHJvY2Vzc1xcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9zeW1mb255L3Byb2Nlc3MnKSwKJ1N5bWZvbnlcXENvbXBvbmVudFxcRmluZGVyXFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvZmluZGVyJyksCidTeW1mb255XFxDb21wb25lbnRcXEZpbGVzeXN0ZW1cXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc3ltZm9ueS9maWxlc3lzdGVtJyksCidTeW1mb255XFxDb21wb25lbnRcXENvbnNvbGVcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc3ltZm9ueS9jb25zb2xlJyksCidTZWxkXFxTaWduYWxcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc2VsZC9zaWduYWwtaGFuZGxlci9zcmMnKSwKJ1NlbGRcXFBoYXJVdGlsc1xcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9zZWxkL3BoYXItdXRpbHMvc3JjJyksCidTZWxkXFxKc29uTGludFxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9zZWxkL2pzb25saW50L3NyYy9TZWxkL0pzb25MaW50JyksCidSZWFjdFxcUHJvbWlzZVxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9yZWFjdC9wcm9taXNlL3NyYycpLAonUHNyXFxMb2dcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvcHNyL2xvZy9Qc3IvTG9nJyksCidQc3JcXENvbnRhaW5lclxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9wc3IvY29udGFpbmVyL3NyYycpLAonTWFiZUVudW1cXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvbWFyYy1tYWJlL3BocC1lbnVtL3NyYycpLAonSnNvblNjaGVtYVxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hJyksCidDb21wb3NlclxcWGRlYnVnSGFuZGxlclxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9jb21wb3Nlci94ZGVidWctaGFuZGxlci9zcmMnKSwKJ0NvbXBvc2VyXFxTcGR4XFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL2NvbXBvc2VyL3NwZHgtbGljZW5zZXMvc3JjJyksCidDb21wb3NlclxcU2VtdmVyXFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL2NvbXBvc2VyL3NlbXZlci9zcmMnKSwKJ0NvbXBvc2VyXFxQY3JlXFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL2NvbXBvc2VyL3BjcmUvc3JjJyksCidDb21wb3NlclxcTWV0YWRhdGFNaW5pZmllclxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9jb21wb3Nlci9tZXRhZGF0YS1taW5pZmllci9zcmMnKSwKJ0NvbXBvc2VyXFxDbGFzc01hcEdlbmVyYXRvclxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9jb21wb3Nlci9jbGFzcy1tYXAtZ2VuZXJhdG9yL3NyYycpLAonQ29tcG9zZXJcXENhQnVuZGxlXFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL2NvbXBvc2VyL2NhLWJ1bmRsZS9zcmMnKSwKJ0NvbXBvc2VyXFwnID0+IGFycmF5KCRiYXNlRGlyIC4gJy9zcmMvQ29tcG9zZXInKSwKKTsKPD9waHAKCgoKY2xhc3MgQ29tcG9zZXJBdXRvbG9hZGVySW5pdENvbXBvc2VyUGhhcjE3Nzg2NTczMTgKewpwcml2YXRlIHN0YXRpYyAkbG9hZGVyOwoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBsb2FkQ2xhc3NMb2FkZXIoJGNsYXNzKQp7CmlmICgnQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXInID09PSAkY2xhc3MpIHsKcmVxdWlyZSBfX0RJUl9fIC4gJy9DbGFzc0xvYWRlci5waHAnOwp9Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0TG9hZGVyKCkKewppZiAobnVsbCAhPT0gc2VsZjo6JGxvYWRlcikgewpyZXR1cm4gc2VsZjo6JGxvYWRlcjsKfQoKc3BsX2F1dG9sb2FkX3JlZ2lzdGVyKGFycmF5KCdDb21wb3NlckF1dG9sb2FkZXJJbml0Q29tcG9zZXJQaGFyMTc3ODY1NzMxOCcsICdsb2FkQ2xhc3NMb2FkZXInKSwgdHJ1ZSwgdHJ1ZSk7CnNlbGY6OiRsb2FkZXIgPSAkbG9hZGVyID0gbmV3IFxDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlcihcZGlybmFtZShfX0RJUl9fKSk7CnNwbF9hdXRvbG9hZF91bnJlZ2lzdGVyKGFycmF5KCdDb21wb3NlckF1dG9sb2FkZXJJbml0Q29tcG9zZXJQaGFyMTc3ODY1NzMxOCcsICdsb2FkQ2xhc3NMb2FkZXInKSk7CgpyZXF1aXJlIF9fRElSX18gLiAnL2F1dG9sb2FkX3N0YXRpYy5waHAnOwpjYWxsX3VzZXJfZnVuYyhcQ29tcG9zZXJcQXV0b2xvYWRcQ29tcG9zZXJTdGF0aWNJbml0Q29tcG9zZXJQaGFyMTc3ODY1NzMxODo6Z2V0SW5pdGlhbGl6ZXIoJGxvYWRlcikpOwoKJGxvYWRlci0+cmVnaXN0ZXIodHJ1ZSk7CgokZmlsZXNUb0xvYWQgPSBcQ29tcG9zZXJcQXV0b2xvYWRcQ29tcG9zZXJTdGF0aWNJbml0Q29tcG9zZXJQaGFyMTc3ODY1NzMxODo6JGZpbGVzOwokcmVxdWlyZUZpbGUgPSBcQ2xvc3VyZTo6YmluZChzdGF0aWMgZnVuY3Rpb24gKCRmaWxlSWRlbnRpZmllciwgJGZpbGUpIHsKaWYgKGVtcHR5KCRHTE9CQUxTWydfX2NvbXBvc2VyX2F1dG9sb2FkX2ZpbGVzJ11bJGZpbGVJZGVudGlmaWVyXSkpIHsKJEdMT0JBTFNbJ19fY29tcG9zZXJfYXV0b2xvYWRfZmlsZXMnXVskZmlsZUlkZW50aWZpZXJdID0gdHJ1ZTsKCnJlcXVpcmUgJGZpbGU7Cn0KfSwgbnVsbCwgbnVsbCk7CmZvcmVhY2ggKCRmaWxlc1RvTG9hZCBhcyAkZmlsZUlkZW50aWZpZXIgPT4gJGZpbGUpIHsKJHJlcXVpcmVGaWxlKCRmaWxlSWRlbnRpZmllciwgJGZpbGUpOwp9CgpyZXR1cm4gJGxvYWRlcjsKfQp9Cjw/cGhwCgoKCm5hbWVzcGFjZSBDb21wb3NlclxBdXRvbG9hZDsKCmNsYXNzIENvbXBvc2VyU3RhdGljSW5pdENvbXBvc2VyUGhhcjE3Nzg2NTczMTgKewpwdWJsaWMgc3RhdGljICRmaWxlcyA9IGFycmF5ICgKJ2E0YTExOWE1NmU1MGZiYjI5MzI4MWQ5YTQ4MDA3ZTBlJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvYm9vdHN0cmFwLnBocCcsCic2ZTNmYWUyOTYzMWVmMjgwNjYwYjNjZGFkMDZmMjVhOCcgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L2RlcHJlY2F0aW9uLWNvbnRyYWN0cy9mdW5jdGlvbi5waHAnLAonMGU2ZDdiZjRhNTgxMWJmYTVjZjQwYzVjY2Q2ZmFlNmEnID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZy9ib290c3RyYXAucGhwJywKJzMyMGNkZTIyZjY2ZGQ0ZjVkM2ZkNjIxZDNlODhiOThmJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtY3R5cGUvYm9vdHN0cmFwLnBocCcsCic4ODI1ZWRlODNmMmYyODkxMjc3MjJkNGU4NDJjZjdlOCcgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLWludGwtZ3JhcGhlbWUvYm9vdHN0cmFwLnBocCcsCidlNjlmN2Y2ZWUyODdiOTY5MTk4YzNjOWQ2Nzc3YmQzOCcgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplci9ib290c3RyYXAucGhwJywKJzBkNTllZTI0MGE0Y2Q5NmRkYmI0ZmYxNjRmY2NlYTRkJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwNzMvYm9vdHN0cmFwLnBocCcsCidiNmI5OTFhNTc2MjBlMmZiNmIyZjY2ZjAzZmU5ZGRjMicgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3N0cmluZy9SZXNvdXJjZXMvZnVuY3Rpb25zLnBocCcsCidhZDE1NWY4ZjFjZjBkNDE4ZmU0OWUyNDhkYjhjNjYxYicgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9yZWFjdC9wcm9taXNlL3NyYy9mdW5jdGlvbnNfaW5jbHVkZS5waHAnLAonMjNjMTgwNDZmNTJiZWYzZWVhMDM0NjU3YmFmZGE1MGYnID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4MS9ib290c3RyYXAucGhwJywKJzlkMmI5ZmM2ZGIwZjE1M2EwYTE0OWZlZmIxODI0MTVlJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODQvYm9vdHN0cmFwLnBocCcsCik7CgpwdWJsaWMgc3RhdGljICRwcmVmaXhMZW5ndGhzUHNyNCA9IGFycmF5ICgKJ1MnID0+CmFycmF5ICgKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA4NFxcJyA9PiAyMywKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA4MVxcJyA9PiAyMywKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA4MFxcJyA9PiAyMywKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA3M1xcJyA9PiAyMywKJ1N5bWZvbnlcXFBvbHlmaWxsXFxNYnN0cmluZ1xcJyA9PiAyNiwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxJbnRsXFxOb3JtYWxpemVyXFwnID0+IDMzLAonU3ltZm9ueVxcUG9seWZpbGxcXEludGxcXEdyYXBoZW1lXFwnID0+IDMxLAonU3ltZm9ueVxcUG9seWZpbGxcXEN0eXBlXFwnID0+IDIzLAonU3ltZm9ueVxcQ29udHJhY3RzXFxTZXJ2aWNlXFwnID0+IDI2LAonU3ltZm9ueVxcQ29tcG9uZW50XFxTdHJpbmdcXCcgPT4gMjUsCidTeW1mb255XFxDb21wb25lbnRcXFByb2Nlc3NcXCcgPT4gMjYsCidTeW1mb255XFxDb21wb25lbnRcXEZpbmRlclxcJyA9PiAyNSwKJ1N5bWZvbnlcXENvbXBvbmVudFxcRmlsZXN5c3RlbVxcJyA9PiAyOSwKJ1N5bWZvbnlcXENvbXBvbmVudFxcQ29uc29sZVxcJyA9PiAyNiwKJ1NlbGRcXFNpZ25hbFxcJyA9PiAxMiwKJ1NlbGRcXFBoYXJVdGlsc1xcJyA9PiAxNSwKJ1NlbGRcXEpzb25MaW50XFwnID0+IDE0LAopLAonUicgPT4KYXJyYXkgKAonUmVhY3RcXFByb21pc2VcXCcgPT4gMTQsCiksCidQJyA9PgphcnJheSAoCidQc3JcXExvZ1xcJyA9PiA4LAonUHNyXFxDb250YWluZXJcXCcgPT4gMTQsCiksCidNJyA9PgphcnJheSAoCidNYWJlRW51bVxcJyA9PiA5LAopLAonSicgPT4KYXJyYXkgKAonSnNvblNjaGVtYVxcJyA9PiAxMSwKKSwKJ0MnID0+CmFycmF5ICgKJ0NvbXBvc2VyXFxYZGVidWdIYW5kbGVyXFwnID0+IDIzLAonQ29tcG9zZXJcXFNwZHhcXCcgPT4gMTQsCidDb21wb3NlclxcU2VtdmVyXFwnID0+IDE2LAonQ29tcG9zZXJcXFBjcmVcXCcgPT4gMTQsCidDb21wb3NlclxcTWV0YWRhdGFNaW5pZmllclxcJyA9PiAyNiwKJ0NvbXBvc2VyXFxDbGFzc01hcEdlbmVyYXRvclxcJyA9PiAyNywKJ0NvbXBvc2VyXFxDYUJ1bmRsZVxcJyA9PiAxOCwKJ0NvbXBvc2VyXFwnID0+IDksCiksCik7CgpwdWJsaWMgc3RhdGljICRwcmVmaXhEaXJzUHNyNCA9IGFycmF5ICgKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA4NFxcJyA9PgphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDg0JywKKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA4MVxcJyA9PgphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgxJywKKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA4MFxcJyA9PgphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgwJywKKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA3M1xcJyA9PgphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDczJywKKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxNYnN0cmluZ1xcJyA9PgphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLW1ic3RyaW5nJywKKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxJbnRsXFxOb3JtYWxpemVyXFwnID0+CmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ub3JtYWxpemVyJywKKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxJbnRsXFxHcmFwaGVtZVxcJyA9PgphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLWludGwtZ3JhcGhlbWUnLAopLAonU3ltZm9ueVxcUG9seWZpbGxcXEN0eXBlXFwnID0+CmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtY3R5cGUnLAopLAonU3ltZm9ueVxcQ29udHJhY3RzXFxTZXJ2aWNlXFwnID0+CmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvc2VydmljZS1jb250cmFjdHMnLAopLAonU3ltZm9ueVxcQ29tcG9uZW50XFxTdHJpbmdcXCcgPT4KYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9zdHJpbmcnLAopLAonU3ltZm9ueVxcQ29tcG9uZW50XFxQcm9jZXNzXFwnID0+CmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcHJvY2VzcycsCiksCidTeW1mb255XFxDb21wb25lbnRcXEZpbmRlclxcJyA9PgphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L2ZpbmRlcicsCiksCidTeW1mb255XFxDb21wb25lbnRcXEZpbGVzeXN0ZW1cXCcgPT4KYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9maWxlc3lzdGVtJywKKSwKJ1N5bWZvbnlcXENvbXBvbmVudFxcQ29uc29sZVxcJyA9PgphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L2NvbnNvbGUnLAopLAonU2VsZFxcU2lnbmFsXFwnID0+CmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3NlbGQvc2lnbmFsLWhhbmRsZXIvc3JjJywKKSwKJ1NlbGRcXFBoYXJVdGlsc1xcJyA9PgphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zZWxkL3BoYXItdXRpbHMvc3JjJywKKSwKJ1NlbGRcXEpzb25MaW50XFwnID0+CmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3NlbGQvanNvbmxpbnQvc3JjL1NlbGQvSnNvbkxpbnQnLAopLAonUmVhY3RcXFByb21pc2VcXCcgPT4KYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvcmVhY3QvcHJvbWlzZS9zcmMnLAopLAonUHNyXFxMb2dcXCcgPT4KYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvcHNyL2xvZy9Qc3IvTG9nJywKKSwKJ1BzclxcQ29udGFpbmVyXFwnID0+CmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3Bzci9jb250YWluZXIvc3JjJywKKSwKJ01hYmVFbnVtXFwnID0+CmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL21hcmMtbWFiZS9waHAtZW51bS9zcmMnLAopLAonSnNvblNjaGVtYVxcJyA9PgphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hJywKKSwKJ0NvbXBvc2VyXFxYZGVidWdIYW5kbGVyXFwnID0+CmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL2NvbXBvc2VyL3hkZWJ1Zy1oYW5kbGVyL3NyYycsCiksCidDb21wb3NlclxcU3BkeFxcJyA9PgphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9jb21wb3Nlci9zcGR4LWxpY2Vuc2VzL3NyYycsCiksCidDb21wb3NlclxcU2VtdmVyXFwnID0+CmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL2NvbXBvc2VyL3NlbXZlci9zcmMnLAopLAonQ29tcG9zZXJcXFBjcmVcXCcgPT4KYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvY29tcG9zZXIvcGNyZS9zcmMnLAopLAonQ29tcG9zZXJcXE1ldGFkYXRhTWluaWZpZXJcXCcgPT4KYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvY29tcG9zZXIvbWV0YWRhdGEtbWluaWZpZXIvc3JjJywKKSwKJ0NvbXBvc2VyXFxDbGFzc01hcEdlbmVyYXRvclxcJyA9PgphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9jb21wb3Nlci9jbGFzcy1tYXAtZ2VuZXJhdG9yL3NyYycsCiksCidDb21wb3NlclxcQ2FCdW5kbGVcXCcgPT4KYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvY29tcG9zZXIvY2EtYnVuZGxlL3NyYycsCiksCidDb21wb3NlclxcJyA9PgphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4vLi4nIC4gJy9zcmMvQ29tcG9zZXInLAopLAopOwoKcHVibGljIHN0YXRpYyAkY2xhc3NNYXAgPSBhcnJheSAoCidBdHRyaWJ1dGUnID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4MC9SZXNvdXJjZXMvc3R1YnMvQXR0cmlidXRlLnBocCcsCidDVVJMU3RyaW5nRmlsZScgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgxL1Jlc291cmNlcy9zdHVicy9DVVJMU3RyaW5nRmlsZS5waHAnLAonQ29tcG9zZXJcXEluc3RhbGxlZFZlcnNpb25zJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL2NvbXBvc2VyL0luc3RhbGxlZFZlcnNpb25zLnBocCcsCidEZXByZWNhdGVkJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODQvUmVzb3VyY2VzL3N0dWJzL0RlcHJlY2F0ZWQucGhwJywKJ0pzb25FeGNlcHRpb24nID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA3My9SZXNvdXJjZXMvc3R1YnMvSnNvbkV4Y2VwdGlvbi5waHAnLAonTm9ybWFsaXplcicgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplci9SZXNvdXJjZXMvc3R1YnMvTm9ybWFsaXplci5waHAnLAonUGRvXFxEYmxpYicgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDg0L1Jlc291cmNlcy9zdHVicy9QZG8vRGJsaWIucGhwJywKJ1Bkb1xcRmlyZWJpcmQnID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4NC9SZXNvdXJjZXMvc3R1YnMvUGRvL0ZpcmViaXJkLnBocCcsCidQZG9cXE15c3FsJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODQvUmVzb3VyY2VzL3N0dWJzL1Bkby9NeXNxbC5waHAnLAonUGRvXFxPZGJjJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODQvUmVzb3VyY2VzL3N0dWJzL1Bkby9PZGJjLnBocCcsCidQZG9cXFBnc3FsJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODQvUmVzb3VyY2VzL3N0dWJzL1Bkby9QZ3NxbC5waHAnLAonUGRvXFxTcWxpdGUnID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4NC9SZXNvdXJjZXMvc3R1YnMvUGRvL1NxbGl0ZS5waHAnLAonUGhwVG9rZW4nID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4MC9SZXNvdXJjZXMvc3R1YnMvUGhwVG9rZW4ucGhwJywKJ1JlZmxlY3Rpb25Db25zdGFudCcgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDg0L1Jlc291cmNlcy9zdHVicy9SZWZsZWN0aW9uQ29uc3RhbnQucGhwJywKJ1JldHVyblR5cGVXaWxsQ2hhbmdlJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODEvUmVzb3VyY2VzL3N0dWJzL1JldHVyblR5cGVXaWxsQ2hhbmdlLnBocCcsCidSb3VuZGluZ01vZGUnID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4NC9SZXNvdXJjZXMvc3R1YnMvUm91bmRpbmdNb2RlLnBocCcsCidTdHJpbmdhYmxlJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL21hcmMtbWFiZS9waHAtZW51bS9zdHVicy9TdHJpbmdhYmxlLnBocCcsCidVbmhhbmRsZWRNYXRjaEVycm9yJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvUmVzb3VyY2VzL3N0dWJzL1VuaGFuZGxlZE1hdGNoRXJyb3IucGhwJywKJ1ZhbHVlRXJyb3InID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4MC9SZXNvdXJjZXMvc3R1YnMvVmFsdWVFcnJvci5waHAnLAopOwoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRJbml0aWFsaXplcihDbGFzc0xvYWRlciAkbG9hZGVyKQp7CnJldHVybiBcQ2xvc3VyZTo6YmluZChmdW5jdGlvbiAoKSB1c2UgKCRsb2FkZXIpIHsKJGxvYWRlci0+cHJlZml4TGVuZ3Roc1BzcjQgPSBDb21wb3NlclN0YXRpY0luaXRDb21wb3NlclBoYXIxNzc4NjU3MzE4OjokcHJlZml4TGVuZ3Roc1BzcjQ7CiRsb2FkZXItPnByZWZpeERpcnNQc3I0ID0gQ29tcG9zZXJTdGF0aWNJbml0Q29tcG9zZXJQaGFyMTc3ODY1NzMxODo6JHByZWZpeERpcnNQc3I0OwokbG9hZGVyLT5jbGFzc01hcCA9IENvbXBvc2VyU3RhdGljSW5pdENvbXBvc2VyUGhhcjE3Nzg2NTczMTg6OiRjbGFzc01hcDsKCn0sIG51bGwsIENsYXNzTG9hZGVyOjpjbGFzcyk7Cn0KfQoKQ29weXJpZ2h0IChDKSAyMDE2IENvbXBvc2VyCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCnRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCnRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCnNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFClNPRlRXQVJFLgoKIyMKIyMgQnVuZGxlIG9mIENBIFJvb3QgQ2VydGlmaWNhdGVzCiMjCiMjIENlcnRpZmljYXRlIGRhdGEgZnJvbSBNb3ppbGxhIGxhc3QgdXBkYXRlZCBvbjogV2VkIEZlYiAxMSAxODoyNjozMCAyMDI2IEdNVAojIwojIyBGaW5kIHVwZGF0ZWQgdmVyc2lvbnMgaGVyZTogaHR0cHM6Ly9jdXJsLnNlL2RvY3MvY2FleHRyYWN0Lmh0bWwKIyMKIyMgVGhpcyBpcyBhIGJ1bmRsZSBvZiBYLjUwOSBjZXJ0aWZpY2F0ZXMgb2YgcHVibGljIENlcnRpZmljYXRlIEF1dGhvcml0aWVzCiMjIChDQSkuIFRoZXNlIHdlcmUgYXV0b21hdGljYWxseSBleHRyYWN0ZWQgZnJvbSBNb3ppbGxhJ3Mgcm9vdCBjZXJ0aWZpY2F0ZXMKIyMgZmlsZSAoY2VydGRhdGEudHh0KS4gIFRoaXMgZmlsZSBjYW4gYmUgZm91bmQgaW4gdGhlIG1vemlsbGEgc291cmNlIHRyZWU6CiMjIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9tb3ppbGxhLWZpcmVmb3gvZmlyZWZveC9yZWZzL2hlYWRzL3JlbGVhc2Uvc2VjdXJpdHkvbnNzL2xpYi9ja2Z3L2J1aWx0aW5zL2NlcnRkYXRhLnR4dAojIwojIyBJdCBjb250YWlucyB0aGUgY2VydGlmaWNhdGVzIGluIFBFTSBmb3JtYXQgYW5kIHRoZXJlZm9yZQojIyBjYW4gYmUgZGlyZWN0bHkgdXNlZCB3aXRoIGN1cmwgLyBsaWJjdXJsIC8gcGhwX2N1cmwsIG9yIHdpdGgKIyMgYW4gQXBhY2hlK21vZF9zc2wgd2Vic2VydmVyIGZvciBTU0wgY2xpZW50IGF1dGhlbnRpY2F0aW9uLgojIyBKdXN0IGNvbmZpZ3VyZSB0aGlzIGZpbGUgYXMgdGhlIFNTTENBQ2VydGlmaWNhdGVGaWxlLgojIwojIyBDb252ZXJzaW9uIGRvbmUgd2l0aCBtay1jYS1idW5kbGUucGwgdmVyc2lvbiAxLjMyLgojIyBTSEEyNTY6IDNiOThkNGUzZmY1N2EzMjZkOTU4N2MzMzYzMzAzOWM4YzNhOWNmMGI1NWY3Y2E1ODFkNzU5OGZmMzI5ZWIxZjMKIyMKCgpFbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFa1RDQ0EzbWdBd0lCQWdJRVJXdFFWREFOQmdrcWhraUc5dzBCQVFVRkFEQ0JzREVMTUFrR0ExVUVCaE1DVlZNeEZqQVVCZ05WCkJBb1REVVZ1ZEhKMWMzUXNJRWx1WXk0eE9UQTNCZ05WQkFzVE1IZDNkeTVsYm5SeWRYTjBMbTVsZEM5RFVGTWdhWE1nYVc1amIzSncKYjNKaGRHVmtJR0o1SUhKbFptVnlaVzVqWlRFZk1CMEdBMVVFQ3hNV0tHTXBJREl3TURZZ1JXNTBjblZ6ZEN3Z1NXNWpMakV0TUNzRwpBMVVFQXhNa1JXNTBjblZ6ZENCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVEEyTVRFeU56SXdNak0wCk1sb1hEVEkyTVRFeU56SXdOVE0wTWxvd2diQXhDekFKQmdOVkJBWVRBbFZUTVJZd0ZBWURWUVFLRXcxRmJuUnlkWE4wTENCSmJtTXUKTVRrd053WURWUVFMRXpCM2QzY3VaVzUwY25WemRDNXVaWFF2UTFCVElHbHpJR2x1WTI5eWNHOXlZWFJsWkNCaWVTQnlaV1psY21WdQpZMlV4SHpBZEJnTlZCQXNURmloaktTQXlNREEySUVWdWRISjFjM1FzSUVsdVl5NHhMVEFyQmdOVkJBTVRKRVZ1ZEhKMWMzUWdVbTl2CmRDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUIKQUxhVnRrTkMrc1p0S205STM1Uk1PVmNGN3NONUVVRm9OdTNzL3BvQmo2RTRLUHozRUVabUxrMGVHckVhVHNiUndKV0lzTW4vTVlzegpBOXUzZzNzK0lJUmU3YkpXS0tmNDRMbEFjVGZGeTBjT2x5cG93Q0tWWWhYYlI5bjEwQ3YvZ2t2SnJUN2VUTnVRZ0ZBL0NZcUVBT3d3CkNqMFl6ZnY5S2xtYUk1VVhMRVdlSDI1RGVXME1YSmorU0tmRkkwZGNYdjF1NXg2MDltaEYwWWFEVzZLS2piSGpLWUQrSlhHSXJiNjgKajZ4U2xrdXFVWTNrRXpFWjZFNU5uOXVzczJyVnZEbFVjY3A2ZW4rUTNYMGRnTm1CdTFrbXdoSCs1cFBpOTREa1pmczBOdzRwZ0hCTgpyemlHTHA1L1Y2K2VGNjdySE1zb0lWKzJITmpub2dRaStkUGEyTXNDQXdFQUFhT0JzRENCclRBT0JnTlZIUThCQWY4RUJBTUNBUVl3CkR3WURWUjBUQVFIL0JBVXdBd0VCL3pBckJnTlZIUkFFSkRBaWdBOHlNREEyTVRFeU56SXdNak0wTWxxQkR6SXdNall4TVRJM01qQTEKTXpReVdqQWZCZ05WSFNNRUdEQVdnQlJva09SbnBLWlRnTWVHWnFUeDkwdEQrNFM5YlRBZEJnTlZIUTRFRmdRVWFKRGtaNlNtVTRESApobWFrOGZkTFEvdUV2VzB3SFFZSktvWklodlo5QjBFQUJCQXdEaHNJVmpjdU1UbzBMakFEQWdTUU1BMEdDU3FHU0liM0RRRUJCUVVBCkE0SUJBUUNUMURDdzF3TWdLdEQ1WStpUkRBVWdxVjhaeW50eVR0U3gyOUNXKzFSYUdTd01DUGV5dklXb25YOXRPMUt6S3R2bjFJU00KWS9ZUHl5WUJrVkJzOUY4VTRwTjB3Qk9lTURwUTQ3Umd4Unp3SWtTTmNVZXN5QnJKNlp1YUFHQVQvM0IrWHhGTlNSdXpGVko3eVZUYQp2NTJWcjJ1YTJKN3A4ZVJEamVJUlJEcS9yNzJEUW5OU2k2cTdweW5QOVdRY0NrM1J2S3FzbnlyUS8zOS8ybjNxc2Uwd0pjR0UyalRTClczaURWdXljTnNNbTRoSDJaMGtka3F1TSsrdi9ldTZGU3FkUWdQQ25YRXFVTGw4Rm1UeFNRZUROdEdQUEFVTzZuSVBjajJBNzgxcTAKdEh1dTJndVFPSFh2Z1IxbTB2ZFhjRGF6di93b3IzRWxoVnNUL2g1L1dyUTgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKUXVvVmFkaXMgUm9vdCBDQSAyCj09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnR6Q0NBNStnQXdJQkFnSUNCUWt3RFFZSktvWklodmNOQVFFRkJRQXdSVEVMTUFrR0ExVUVCaE1DUWsweEdUQVhCZ05WQkFvVApFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhHekFaQmdOVkJBTVRFbEYxYjFaaFpHbHpJRkp2YjNRZ1EwRWdNakFlRncwd05qRXhNalF4Ck9ESTNNREJhRncwek1URXhNalF4T0RJek16TmFNRVV4Q3pBSkJnTlZCQVlUQWtKTk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk0KYVcxcGRHVmtNUnN3R1FZRFZRUURFeEpSZFc5V1lXUnBjeUJTYjI5MElFTkJJREl3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQwpEd0F3Z2dJS0FvSUNBUUNhR01wTGxBMEFMYThES1lyd0Q0SElya3daaFIwSW42c3BSSVh6TDRHdE1oNlFScitqaGlZYUh2NStIQmc2ClhKeGdGeW82ZElNek1IMWhWQkhMN2F2ZzV0S2lmdlZyYnhpM0Nnc3QvZWsrN3dyR3N4RHAzTUpHRi9oZC9hVGEvNTVKV3B6bU0rWWsKbHZjL3Vsc3JISG8xd3Rabi9xdG1VSXR0S0dBcjc5ZGd3OGVUdkkwMmtmTi8rTnNSRThTY2QzYkJycmNDYW9GNnFVV0Q0Z1htdVZiQgpsRGVQU0hGakl1d1haUWVWaWt2Zmo4WmFDdVd3NDE5ZWF4R3JEUG1GNjBUcCtBUno4dW4rWEppTTlYT3ZhN1IremRSY0FpdE1PZUd5CmxaVXRRb2ZYMWJPUVE3ZHNFL0hlM2ZiRStJay8wWFgxa3NPUjFZcUkwSkRzM0czZWljSmxjWmFMRFFQOW5MOWJGcXlTMityK2VYeXQKNjYvM0ZzdmJ6U1VyNVIvN21wL2lVY3c2VXd4STVnNjl5YlIyQmxMbUVST0ZjbU1EQk9BRU5pc2dHUUxvZEtjZnRzbFdadkIxSmR4bgp3UTVoWUlpelB0R28vS1BhSGJEUnNTTlUzMFIyYmUxQjJNR3lJclpUSE44MUhkeWhkeW94NUMzMTVlWGJ5T0QvNVlEWEMyT2cvek9oCkQ3b3NGUlhxbDdQU29yVys4b3lXSGhxUEhXeWtZVGU1aG5NejE1ZVduaU45Z3FSTWdlS2gwYnBuWDVVSG95Y1I3aFlRZTd4RlNreXkKQk5Lcjc5WDlERkhPVUdvSU1mbVIyZ3lQWkZ3RHd6cUxJRDl1aldjOU90YitmVnVJeVY3N3pHSGNpek4zMDBReU5RbGlCSklXRU5pZQpKMGY3T3lIaitPc2RXd0lEQVFBQm80R3dNSUd0TUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3Q3dZRFZSMFBCQVFEQWdFR01CMEdBMVVkCkRnUVdCQlFhaEdLOFNFd3pKUVRVN3REMkE4UVpSdEdVYXpCdUJnTlZIU01FWnpCbGdCUWFoR0s4U0V3ekpRVFU3dEQyQThRWlJ0R1UKYTZGSnBFY3dSVEVMTUFrR0ExVUVCaE1DUWsweEdUQVhCZ05WQkFvVEVGRjFiMVpoWkdseklFeHBiV2wwWldReEd6QVpCZ05WQkFNVApFbEYxYjFaaFpHbHpJRkp2YjNRZ1EwRWdNb0lDQlFrd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFENEtGazJmQmx1b3JuRmRMd1V2ClorWVRSWVBFTnZiendDWU1EYlZIWkYzNHRITEpScVVER0NkVmlYaDlkdXFXTklBWElOem5nL2lOL0FlNDJsOU5MbWV5aFAzWlJQeDMKVUlIbWZMVEpEUXR5VS9oMkJ3ZEJSNVlNKytDQ0pwTlZqUDRpSDJCbGZGL25KclAzTXBDWVVOUTNjVlgya2lGNDk1VjUrdmd0Sm9kbQpWakIzcGpkNE0xSVFXSzQvWVk3eWFySHZHSDVLV1dQS2phSlcxYWN2dkZZZnp6bkI0dnNLcUJVc2ZVMTZZOFpzbDBRODBtL0RTaGNLCitKRFNWNklaVWFVdGwwSGFCMCtwVU5xUWpaUkc0VDd3bFAwUUFEajFPK2hBNGJSdVZob2d6RzlZamUwdVJZL1c2Wk0vNTdFczN6clcKSW96Y2hMc2liOUQ0NU1ZNTZRU0lQTU82NjFWNmJZQ1pKUFZzQWZ2NGw3Q1VXK3Y5MG0veGQyZ05OV1FqckxoVm9RUFJUVUlaM1BoMQpXVmFqK2FoSmVmaXZEcmtSb0h5M2F1MDAwTFltWWpnYWh3ejQ2UDB1MDVCL0I1RXFIZForWElXRG1iQTRDRC9wWHZrMUIrVEpZbTVYCmY2ZFFsZmU2eUp2bWpxSUJ4ZFptdjNsaDh6d2M0Ym1DWEYyZ3crbllTTDBab2hFVUdXNnloaHRvUGtnM0dvaTNYWlplbk1mdkoySUkKNHBFWlhOTHhJZDI2RjBLQ2wzR0JVekdwbi9aOVlyOXk0YU9USGN5S0psb0pPTkRPMXcyQUZyUjRwVHFIVEkyS3BkVkdsL0lzRUxtOApWQ0xBQVZCcFE1NzBzdTl0K096YThlT3g3OStSajFRcUN5WEJKaG5FVWhBRlpkV0NFT3JDTWMwdQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpRdW9WYWRpcyBSb290IENBIDMKPT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHblRDQ0JJV2dBd0lCQWdJQ0JjWXdEUVlKS29aSWh2Y05BUUVGQlFBd1JURUxNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9UCkVGRjFiMVpoWkdseklFeHBiV2wwWldReEd6QVpCZ05WQkFNVEVsRjFiMVpoWkdseklGSnZiM1FnUTBFZ016QWVGdzB3TmpFeE1qUXgKT1RFeE1qTmFGdzB6TVRFeE1qUXhPVEEyTkRSYU1FVXhDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTQphVzFwZEdWa01Sc3dHUVlEVlFRREV4SlJkVzlXWVdScGN5QlNiMjkwSUVOQklETXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDCkR3QXdnZ0lLQW9JQ0FRRE1WMElXVkp6bW1OUFRUZTcrN2NlZlF6bEtaYlBvRm9nMDJ3MVprWFRQa3JnRVFLMENTekdydkkyUmFOZ2cKRGhvQjRocDdUaGRkNG9xM1A1a2F6ZXRocThKbHBoKzN0NzIzai96OWNJOExvR2UrQWFKWnozSG1EeWwyLzdGV2VVVXJINTU2Vk9pagpLVFZvcEFGUEQ2UXVOKzhiditPUEVLaHlxMWhYNTFTR3lNbnpXOW9zMmwyT2JqeWpQdHI3Z3VYZDhseXlCVE52aWpiTzBCTk8vNzlLCkREUk1wc01odlZBRVZldXh1NTM3UlI1a0ZkNVZBWXdDZHJYTG9UOUNhYnd2dldoREZsYUpLamRoa2YybXJrN0F5eFJsbERkTGtnYnYKQk5ESW5JamJDM3VCcjdFOUtzUmxPbmkyN3R5QXNkTFRtWnc2N210YWE3T050OVhPbk1LK3BVc3ZGckdlYURzR2I2NTluL2plN013cApwNWlqSlVNdjcvRmZKdUdJVGZoZWJ0ZlpGRzRaTTJtbk80U0prOFJUVlJPaFVYaEErTGpKb3U1N3VsSkNnNTRVN1FWU1dsbFdwNWY4Cm5UOEtLZGpjVDVFT0U3emVsYVRmaTVtK3JKc3ppTysxZ2E4YnhpSlR5UGJIN3BjVXNNVjhlRkxJOE01dWQyQ0VwdWtxZGlEdFdBRVgKTUpQcEdvdmdjMlBaYXBLVVNVNjByVXFGeEtNaU1Qd0o3V2dpYzZhSURGVWhXTVhoT3A4cTNjcmhrT0RaYzZ0c2dMam9DMlNUb0p5TQpHZit6MGd6c2tTYUhpck9pNFhDUExBcmx6VzFvVWV2YVB3Vi9pekxtRTF4ci9sOUE0aUxJdExSa1Q5YTZmVWcrcUdrTTE3dUdjY2x6CnVEODduU1ZMMnY5QTZ3SURBUUFCbzRJQmxUQ0NBWkV3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekNCNFFZRFZSMGdCSUhaTUlIV01JSFQKQmdrckJnRUVBYjVZQUFNd2djVXdnWk1HQ0NzR0FRVUZCd0lDTUlHR0dvR0RRVzU1SUhWelpTQnZaaUIwYUdseklFTmxjblJwWm1sagpZWFJsSUdOdmJuTjBhWFIxZEdWeklHRmpZMlZ3ZEdGdVkyVWdiMllnZEdobElGRjFiMVpoWkdseklGSnZiM1FnUTBFZ015QkRaWEowCmFXWnBZMkYwWlNCUWIyeHBZM2tnTHlCRFpYSjBhV1pwWTJGMGFXOXVJRkJ5WVdOMGFXTmxJRk4wWVhSbGJXVnVkQzR3TFFZSUt3WUIKQlFVSEFnRVdJV2gwZEhBNkx5OTNkM2N1Y1hWdmRtRmthWE5uYkc5aVlXd3VZMjl0TDJOd2N6QUxCZ05WSFE4RUJBTUNBUVl3SFFZRApWUjBPQkJZRUZQTEFFK0NDUXo3NzdpOW5NcFkxWE51NHl3TFFNRzRHQTFVZEl3Um5NR1dBRlBMQUUrQ0NRejc3N2k5bk1wWTFYTnU0Cnl3TFFvVW1rUnpCRk1Rc3dDUVlEVlFRR0V3SkNUVEVaTUJjR0ExVUVDaE1RVVhWdlZtRmthWE1nVEdsdGFYUmxaREViTUJrR0ExVUUKQXhNU1VYVnZWbUZrYVhNZ1VtOXZkQ0JEUVNBemdnSUZ4akFOQmdrcWhraUc5dzBCQVFVRkFBT0NBZ0VBVDYyZ0xFejZ3UEp2OTJaVgpxeU0wN3VjcDJzTmJ0ckNEMmREUTRpSDc4MkNuTzExZ1V5ZWltL1lJSWlybnY2Qnk1WndrYWpHeGtIb24yNFFSaVNlbWQxbzQxNytzCmh2enVYWU84QnNiUmQyc1BiU1F2UzNwc3B3ZVd5dU9FbjYySWl4MnJGbzFiWmhmWkZ2U0xnTkxkK0xKMncvdzRFNm9NM2tKcEsyN3oKUE91QUo5djFwa1FObjFwVldRdlZEVkpJeGE2ZjhpK0F4ZW95VURVU2x5N0I0Zi94STRoUk9KL3labFoyNXc5Umw2VlNERTFKVVpVMgpQYitpU3d3UUhZYVpUS3J6Y2hHVDVPcjJtOXFvWGFkTnQ1NENybk1BeU5vakErajU2aGwwWWdDVXl5SWd2cFNuV2JXQ2FyNlplWHFwCjhrb2tVdmQwL2JwTzVxZ2RBbTZ4RFlCRXdhN1RJemRmdTRWOEs1SXU2SDZsaTkyWjRiOG5ieTFkcW51SC9ncmRTL3lPOVNia2JuQkMKYmpQc01aNTdrOEhreVdrYVBjQnJUaUp0N3F0WVRjYlFRY0VyNms4U2gxN3JSZGhzOVpnQzA2RFlWWW9HbVJtaW9IZlJNSjZzekhYdQpnL1d3WWpuUGJGZmlUTktSQ3c1MUtCdWF2LzBhUS9IS2QvczdqMkc0YVNnV1FnUmVjQ29jSWRpUDRiMGpXeTEwUUpMWll4a05jOTFwCnZHSkh2T0IwSzdMcmZiNUJHN1hBUnNXaElzdGZUc0Vva3Q0WXV0VXFLTHNSaXhlVG1KbGdsRndqejFvbmwxNExCUWFUTng0N2FUYnIKcVo1aEhZOHkybzRNMW5RK2V3a2syZ0YzUjhRN3pUU01tZlhLNFNWaE03SlpHK0p1MXpkWHRnMnBFdG89Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkRpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR0ekNDQXArZ0F3SUJBZ0lRRE9mZzVSZllSdjZQNVdEOEcvQXdPVEFOQmdrcWhraUc5dzBCQVFVRkFEQmxNUXN3Q1FZRFZRUUcKRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObGNuUXVZMjl0TVNRdwpJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZ1EwRXdIaGNOTURZeE1URXdNREF3TURBd1doY05NekV4Ck1URXdNREF3TURBd1dqQmxNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUwKRXhCM2QzY3VaR2xuYVdObGNuUXVZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnZiM1FnUTBFdwpnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDdERoWE81RU9BWExHSDg3ZGcrWEVTcGE3Y0pwU0lxdlRPCjlTQTVLRmhnRFBpQTJxa1ZsVEpoUExXeEtJU0tpdHlmQ2d5REYzcVBrS3lLNTNsVFhER0VLdllQbURJMmRzemUzVHlvb3U5cSt5SHkKVW1IZm55RFhIK0t4MmY0WVpOSVNXMS81V0JnMXZFZk5vVGI1YTMvVXNEZyt3UnZEakRQWjJDOFkvaWdQczZlRDFzTnVSTUJoTlpZVwovbG1jaTNadDEvR2lTdzByL3d0eTJwNWcwSTZRTmNaNFZZY2dvYy9sYlFySVNYd3htRE5zSXVtSDBESmFvcm9UZ2hIdE9SZWRtVHB5Cm9lYjZwTm5WRnpGMXJvVjlJcTQvQVVhRzlpaDV5TEhhNUZjWHhINGNEckMwa3FaV3M3MnlsKzJxcC9DM3hhZy9sUmJRLzZHVzZ3aGYKR0hkUEFnTUJBQUdqWXpCaE1BNEdBMVVkRHdFQi93UUVBd0lCaGpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJSRgo2Nkt2OUpMTGdqRXRVWXVucHlHZDgyM0lEekFmQmdOVkhTTUVHREFXZ0JSRjY2S3Y5SkxMZ2pFdFVZdW5weUdkODIzSUR6QU5CZ2txCmhraUc5dzBCQVFVRkFBT0NBUUVBb2c2ODMrTHQ4T055YzNwa2xMLzNjbWJZTXVSQ2RXS3VoK3Z5MWRuZVZyT2Z6TTRVS0xrTmwyQmMKRWt4WTVOTTlnMGxGV0pjMWFScW9SK3BXeG5tckV0aG5nWVRmZndrOGxPYTRKaXdndlQyektJbjNYLzhpNHBlRUgrbGw3NGZnMzhGbgpTYk5kNjdJSkt1c203WGkrZlQ4cjg3Y21OVzFmaVFHMlNWdWZBUVdicXowbHdjeTJmOEx4YjRiRyttUm82NEV0bE90Q3QvcU1IdDFpCjhiNVFaN2RzdmZQeEgyc01OZ2NXZnpkOHFWdHRldkVTUm1DRDF5Y0V2a3ZPbDc3RFp5cG9FZCtBNXd3elpyOFREUlJ1ODM4Zll4QWUKK28wYkpXMXNqNlczWVFHeDBxTW1vUkJ4bmEzaXcvbkRtVkczS3djSXppN21VTEtuK2dwRkw2THc4Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkRpZ2lDZXJ0IEdsb2JhbCBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEcnpDQ0FwZWdBd0lCQWdJUUNEdmdWcEJDUnJHaGRXckpXWkhIU2pBTkJna3Foa2lHOXcwQkFRVUZBREJoTVFzd0NRWURWUVFHCkV3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmxjblF1WTI5dE1TQXcKSGdZRFZRUURFeGRFYVdkcFEyVnlkQ0JIYkc5aVlXd2dVbTl2ZENCRFFUQWVGdzB3TmpFeE1UQXdNREF3TURCYUZ3MHpNVEV4TVRBdwpNREF3TURCYU1HRXhDekFKQmdOVkJBWVRBbFZUTVJVd0V3WURWUVFLRXd4RWFXZHBRMlZ5ZENCSmJtTXhHVEFYQmdOVkJBc1RFSGQzCmR5NWthV2RwWTJWeWRDNWpiMjB4SURBZUJnTlZCQU1URjBScFoybERaWEowSUVkc2IySmhiQ0JTYjI5MElFTkJNSUlCSWpBTkJna3EKaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUE0anZoRVhMZXFLVFRvMWVxVUtLUEMzZVF5YUtsN2hMT2xsc0JDU0RNQVpPbgpUakMzVS9kRHhHa0FWNTNpalNMZGh3WkFBSUVKenM0Ymc3L2Z6VHR4UnVMV1pzY0ZzM1luRm85N25oNlZmZTYzU0tNSTJ0YXZlZ3c1CkJtVi9TbDBmdkJmNHE3N3VLTmQwZjNwNG1WbUZhRzVjSXpKTHYwN0E2RnB0NDNDL2R4Qy8vQUgyaGRtb1JCQllNcWwxR05YUm9yNUgKNGlkcTlKb3orRWtJWUl2VVg3UTZoTCtocWtwTWZUN1BUMTlzZGw2Z1N6ZVJudHdpNW0zT0ZCcU9hc3YremJNVVpCZkhXeW1lTXIveQo3dnJUQzBMVXE3ZEJNdG9NMU8vNGdkVzdqVmcvdFJ2b1NTaWljTm94Qk4zM3NoYnlUQXBPQjZqdFNqMWV0WCtqa01Pdkp3SURBUUFCCm8yTXdZVEFPQmdOVkhROEJBZjhFQkFNQ0FZWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVBOTVRTlZiUlRMdG0KOEtQaUd4dkRsN0k5MFZVd0h3WURWUjBqQkJnd0ZvQVVBOTVRTlZiUlRMdG04S1BpR3h2RGw3STkwVlV3RFFZSktvWklodmNOQVFFRgpCUUFEZ2dFQkFNdWNONnBJRXhJSyt0MUVuRTlTc1BUZnJnVDFlWGtJb3lRWS9Fc3JoTUF0dWRYSC92VEJIMWpMdUcyY2VuVG5tQ21yCkViWGpjS0NoelV5SW1aT01rWERpcXc4Y3ZwT3AvMlBWNUFkZzA2Ty9uVnNKOGRXTzQxUDBqbVA2UDZmYnRHYmZZbWJXMFc1QmpmSXQKdGVwM1NwK2RXT0lyV2NCQUkrMHRLSUpGUG5sVWtpYVk0SUJJcURmdjhOWjVZQmJlck9nT3pXNnNSQmM0TDBuYTRVVStLcmsyVTg4NgpVQWIzTHVqRVYwbHNZU0VZMVFTdGVEd3NPb0JycCt1dkZSVHAySW5CdVRoczRwRnNpdjlrdVhjbFZ6REFHeVNqNGR6cDMwZDh0YlFrCkNBVXc3QzI5Qzc5RnYxQzVxZlBybUFFU3JjaUl4cGcwWDQwS1BNYnAxWldWYmQ0PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR4VENDQXEyZ0F3SUJBZ0lRQXF4Y0ptb0xRSnVQQzNueXJrWWxkekFOQmdrcWhraUc5dzBCQVFVRkFEQnNNUXN3Q1FZRFZRUUcKRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObGNuUXVZMjl0TVNzdwpLUVlEVlFRREV5SkVhV2RwUTJWeWRDQklhV2RvSUVGemMzVnlZVzVqWlNCRlZpQlNiMjkwSUVOQk1CNFhEVEEyTVRFeE1EQXdNREF3Ck1Gb1hEVE14TVRFeE1EQXdNREF3TUZvd2JERUxNQWtHQTFVRUJoTUNWVk14RlRBVEJnTlZCQW9UREVScFoybERaWEowSUVsdVl6RVoKTUJjR0ExVUVDeE1RZDNkM0xtUnBaMmxqWlhKMExtTnZiVEVyTUNrR0ExVUVBeE1pUkdsbmFVTmxjblFnU0dsbmFDQkJjM04xY21GdQpZMlVnUlZZZ1VtOXZkQ0JEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTWJNNVhQbSs5Uzc1UzB0Ck1xYmY1WUUveWMwbFNiWnhLc1BWbERSbm9nb2NzRjlwcGtDeHhMZXlqOUNZcEtsQldUclQzSlRXUE50ME9LUkt6RTBsZ3ZkS3BWTVMKT083elNXMXhrWDVqdHF1bVg4T2toUGhQWWxHKytNWHMyemlTNHdibENKRU14Q2hCVmZ2TFdva1ZmbkhvTmI5TmNnazl2am80VUZ0MwpNUnVOczhja1JacW5yRzBBRkZvRXQ3b1Q2MUVLbUVGQklrNWxZWWVCUVZDbWVWeUozaGxLVjlVdTVsMGNVeXgrbU0wYUJoYWthSFBRCk5BUVRYS0Z4MDFwOFZkdGVaT0UzaHpCV0JPVVJ0Q21BRXZGNU9ZaWlBaEY4SjJhM2lMZDQ4c29LcURpckNtVEN2MlpkbFlUQm9TVWUKaDEwYVVBc2dFc3hCdTI0TFVUaTRTOHNDQXdFQUFhTmpNR0V3RGdZRFZSMFBBUUgvQkFRREFnR0dNQThHQTFVZEV3RUIvd1FGTUFNQgpBZjh3SFFZRFZSME9CQllFRkxFK3cya0QrTDlIQWRTWUpob0lBdTlqWkN2RE1COEdBMVVkSXdRWU1CYUFGTEUrdzJrRCtMOUhBZFNZCkpob0lBdTlqWkN2RE1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQWNHZ2FYM05lY256eUlaZ1lJVnlIYklVZjRLbWVxdnhneWRrQVEKVjhHSzgzclpFV1dPTmZxZS9FVzFudGxNTVV1NGtlaERMSTZ6ZU03YjQxTjVjZGJsSVpRQjJsV0htaVJrOW9wbXpONmNOODJvTkxGcApteVBJbm5naUszQkQ0MVZITVdFWjcxakZoUzlPTVBhZ01SWWp5T2ZpWlJZenk3OGFHNkE5K01wZWl6R0xZQWlKTFF3R1hGSzN4UGtLCm1ORVZYNThTdm53Mll6aTlSS1IvNUNZckNzU1hhUTNwak9MQUVGZTR5SFlTa1ZYeVNHbll2Q29DV3c5RTFDQXgyL1M2Y0NaZGtHQ2UKdkVzWENTKzB5eDVEYU1rSEo4SFNYUGZxSWJsb0VwdzhuTCtlL0lCY20yUE43RWVxSlNkbm9EZnpBSUo5Vk5lcCtPa3VFNk4zNkI5SwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTd2lzc1NpZ24gR29sZCBDQSAtIEcyCj09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ1akNDQTZLZ0F3SUJBZ0lKQUx0QUhFUDFYayt3TUEwR0NTcUdTSWIzRFFFQkJRVUFNRVV4Q3pBSkJnTlZCQVlUQWtOSU1SVXcKRXdZRFZRUUtFd3hUZDJsemMxTnBaMjRnUVVjeEh6QWRCZ05WQkFNVEZsTjNhWE56VTJsbmJpQkhiMnhrSUVOQklDMGdSekl3SGhjTgpNRFl4TURJMU1EZ3pNRE0xV2hjTk16WXhNREkxTURnek1ETTFXakJGTVFzd0NRWURWUVFHRXdKRFNERVZNQk1HQTFVRUNoTU1VM2RwCmMzTlRhV2R1SUVGSE1SOHdIUVlEVlFRREV4WlRkMmx6YzFOcFoyNGdSMjlzWkNCRFFTQXRJRWN5TUlJQ0lqQU5CZ2txaGtpRzl3MEIKQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBcitUdWZvc2tEaEp1cVZBdEZrUTdrcEpjeXJoZGhKSkNFeXE4WlZlQ1FENVhKTTFRaXlVcQp0Mi84NzZMUXdCOENKRW9UbG84akUrWW9XQUNqUjhjR3A0UWpLN3U5bGl0L1ZjeUx3VmNmRG1KbEQ5MDlWb3B6MnE1K2JicUJISDVDCmpDQTEyVU5OaFBxRTIxSXM4dzRuZHd0cnZ4RXZjbmlmTHRnKzVoZzNXaXB5K2RwaWtKS1Z5aCtjNmJNOEs4dnpBUk8vV3MvQnRRcGcKdmQyMW1XUlR1S0NXczIvaUpuZVJqT0JpRUFLZk5BK2sxWkl6VWQ2K2picUVlbUE4YXR1ZksremUzZ0UvYmszbFVJYkx0Sy90UkVERgp5bHFNMnRJcmZLanV2cWJsQ3FvT3BkOEZVcmRWeHlKZE1tcVhsMk1UMjhuYmVUWjdoVHBLeFZLSitTVG5uWGVwZ3Y5VkhLVnhhU3ZSCkFpVHlzeWJVYTlvRVZlWEJDc2R0TURlUUt1U2VGRE5lRmhkVnhWdTF5elNKa3ZHZEpvK2hCOVRHc25oUTJ3d01DM3dMakVIWHVlbmQKaklqM28wMnlNc3pZRjlyTnQ4NW1uZFQ5WHYrOWx6NHBkZWQrcDJKWXJ5VTBwVUhIUGJ3TlVNb0RBdzhJV2grVmMzaGl2Njl5RkdrTwpwZVVERG5pT0ppaEM4QWNMWWlBUVp6bEcrcWtEekFRNGVtYnZJSU8xakVwV2pwRUEvSTVjZ3Q2SW9NUGlhRzU5amU4ODNXWDBYYXhSCjd5U0FycXBXbDIvNXJYM2FZVCtZZHp5bGtiWWNqQ2JhWmFJSmJjSGlWT081eWt4TWdJOTNlMkNhSHQrMjhrZ2VEcnBPVkcyWTRPR2kKR3FKM1VNL0VZNUxzUnhtZDYrWnJ6c0VDQXdFQUFhT0JyRENCcVRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVdwpBd0VCL3pBZEJnTlZIUTRFRmdRVVd5VjdscVJsVVg2NE9mUEFlR1plNkRybjhPNHdId1lEVlIwakJCZ3dGb0FVV3lWN2xxUmxVWDY0Ck9mUEFlR1plNkRybjhPNHdSZ1lEVlIwZ0JEOHdQVEE3QmdsZ2hYUUJXUUVDQVFFd0xqQXNCZ2dyQmdFRkJRY0NBUllnYUhSMGNEb3YKTDNKbGNHOXphWFJ2Y25rdWMzZHBjM056YVdkdUxtTnZiUzh3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUNlNjQ1Ujg4YTdBM2hmbQo1ZGpWOVZTd2cvUzd6VjRGZTArZmRXYXZQT2hXZnZ4eWVEZ0QyU3RpR3dDNStPbGd6Y3pPVVlySFVERnU0VXArR0M5cFdiWTlaSUVyCjQ0T0U1aUtIam4zZzdnS1pZYmdlOUxncmlCSVdoTUl4a3ppV01hYTVPMU0vd3lTVFZsdHBrdXpGd2JzNEFPUHNGNm00M01kOEFZT2YKTWtlNlVpSTBIVEo2Q1ZhbmZDVTJxVDFMMnNDQ2J3cTdFc2lIU3ljUitSNHR4NU0vbnR0ZkptdFMyUzZLOFJUR1JJMFZxYmUvdmQ2bQpHdTZ1TGZ0SWR4Zit1K3l2R1BVcVVmQTVoSmVWYkc0Ynd5dkVkR0I1SmJBS0o5L2ZYdEk1ejBWOVFrdmZzeXdleGNaZHlsVTZvSnhwCm1vL2E3N0t3UEorSGJCSXJaWEFWVWpFYUpNOXZNU05RSDR4UGp5UERkRUZqSEZXb0ZOMCs0RkZRei9FYk1GWU9rckNDaGRpRHl5SmsKdkMyNEpkVlVvcmdHNnEyU3BDU2d3WWExU2hOcVI4OHVDMWFWVk12T210dHF0S2F5MjBFSWhpZDM5MnFnUW13TE9NN1hkVkF5a3NMZgpLekFpU05EVlFUZ2xYYVRwWFovR2xIWFFSZjB3bDBPUGtLc0t4NFp6WUVwcExkNmxlTmNHMm1xZVN6NTNPaUFUSWdIUXYyaWVZMkJyCk5VMExiYnFoUGNDVDRIOGpzMVd0Y2lWT1J2blNGdSt3Wk1FQm51bktvR3FZRHMvWVlQSXZTYmprUXVFNE5SYjB5RzVQOTRGVzZMcWoKdmlPdnJ2MXZBK0FDT3pCMitodHRRYzhCc2VtNHlXYjAyeWJ6T3FSMDhra2tXOG13MEZmQitqNTY0WmZKCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNlY3VyZVRydXN0IENBCj09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdURDQ0FxQ2dBd0lCQWdJUURQQ09YQWdXcGExQ2YvRHJKeGhaMERBTkJna3Foa2lHOXcwQkFRVUZBREJJTVFzd0NRWURWUVFHCkV3SlZVekVnTUI0R0ExVUVDaE1YVTJWamRYSmxWSEoxYzNRZ1EyOXljRzl5WVhScGIyNHhGekFWQmdOVkJBTVREbE5sWTNWeVpWUnkKZFhOMElFTkJNQjRYRFRBMk1URXdOekU1TXpFeE9Gb1hEVEk1TVRJek1URTVOREExTlZvd1NERUxNQWtHQTFVRUJoTUNWVk14SURBZQpCZ05WQkFvVEYxTmxZM1Z5WlZSeWRYTjBJRU52Y25CdmNtRjBhVzl1TVJjd0ZRWURWUVFERXc1VFpXTjFjbVZVY25WemRDQkRRVENDCkFTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS3VrZ2VXVnpmWDJGSTdDVDhyVTRuaVZXSnhCNFEyWlFDUVgKT1pFelp1bSs0WU92WWx5SjBmd2tXMkd6NEJFUlFSd2RidkM0dS9qZXA0RzZwa2pHbngyOXZvNnBRVDY0bE8wcEd0U08wZ01kQSs5dApEV2NjVjljR3Jjckk5ZjRPcjJZbFNBU1dDMTJqdWhiRENFL1JSdmdVWFBMSVhnR1piZjJJeklhb3dXOHhRbXhTUG1qTDh4azAzN3VICkdGYUFKc1RRM01CdjM5Nmd3cEVXb0dRUlMwUzhIdmJuK21QZVpxeDJwSEdqN0RhVWFIcDNwTEhuRGkrQmV1SzFjb2J2b211TDhBL2IKMDFrL3VuSzhSQ1NjNDNPejk2OVhMMEltbmFsMHVnQlM4a3ZOVTN4SEN6YUZEbWFwQ0pjV05GZkJadmVBNCsxd1ZNZVQ0QzRvRlZtSAp1cnNDQXdFQUFhT0JuVENCbWpBVEJna3JCZ0VFQVlJM0ZBSUVCaDRFQUVNQVFUQUxCZ05WSFE4RUJBTUNBWVl3RHdZRFZSMFRBUUgvCkJBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVVFqSzJGdm9FL2Y1ZFMzckQvZmRNUUIxYVE2OHdOQVlEVlIwZkJDMHdLekFwb0NlZ0pZWWoKYUhSMGNEb3ZMMk55YkM1elpXTjFjbVYwY25WemRDNWpiMjB2VTFSRFFTNWpjbXd3RUFZSkt3WUJCQUdDTnhVQkJBTUNBUUF3RFFZSgpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFERHRUMHJoV0RwU2NsdTFwcU5sR0thN1VUdDM2WjNxMDU5YzRFVmxldzNLVytKd1VMS1VCUlN1ClNjZU5RUWNTYzVSK0RDTWgvYndRZjJBUVduTDFtQTZzN0xsLzNYcHZYZE1jOVArSUJXbENxUVZ4eUxlc0p1Z3V0SXhxLzNIY3VMSGYKbWJ4OElWUXI1RmlpdTFjcHJwNnBveGttRDVrdUNMRHYvV25QbVJvSmplT25ueXZKTmpSN0pMTjRUSlVYcEFZbUhyWmtValpmWUdmWgpuTVVGZEF2blp5UFNDUHlJNmE2TGYrRXc5RGQrL2NZeTJpMmVSREF3Yk80SDN0STAvTkwvUVBaTDlHWkdCbFNtOGpJS1l5WXdhNXZSCjNJdEh1dUc1MVdMUW9xRDBad1Y0S1dNYWJ3VFcrTVpNbzVxeE43U041U2hMSFo0c3dyaG92TzBDN2pFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTZWN1cmUgR2xvYmFsIENBCj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR2RENDQXFTZ0F3SUJBZ0lRQjFZaXBPalVpb2xOOUJQSThQanFwVEFOQmdrcWhraUc5dzBCQVFVRkFEQktNUXN3Q1FZRFZRUUcKRXdKVlV6RWdNQjRHQTFVRUNoTVhVMlZqZFhKbFZISjFjM1FnUTI5eWNHOXlZWFJwYjI0eEdUQVhCZ05WQkFNVEVGTmxZM1Z5WlNCSApiRzlpWVd3Z1EwRXdIaGNOTURZeE1UQTNNVGswTWpJNFdoY05Namt4TWpNeE1UazFNakEyV2pCS01Rc3dDUVlEVlFRR0V3SlZVekVnCk1CNEdBMVVFQ2hNWFUyVmpkWEpsVkhKMWMzUWdRMjl5Y0c5eVlYUnBiMjR4R1RBWEJnTlZCQU1URUZObFkzVnlaU0JIYkc5aVlXd2cKUTBFd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN2TlM3WXJHeFZhUVp4NVJOb0pMTlAyTXdoUi9qeApZRGlKaVFQcHZlcGVSbE1KM0Z6MVd1ajNSU29DNnpGaDF5a3pUTTdIZkFvM2ZnKzZNcGpoSFpldmo4ZmN5VGlXODlzYS9GSHRhTWJRCmJxUjhKTkd1UXNpV1VHTXU0UDUxL3Bpblgwa3VsZU01TTJTT0hxUmZrTkpuUExMWi9rRzVWYWNKam5JRkhvdmRSSVdDUXRCSndCMWcKOE5FWExKWHI5cVhCa3FQRndxY0lZQTFnQkJDV2VaNFdOT2FwdHZvbFJUbklIbVg1ay9XcThWTGNtWmc5cFlZYUREVXora3VsQkFZVgpIREdBNzZvWWE4SjcxOXJPK1RNZzFmVzlhak10Z1FUN3NGelVuS1BpWEIzanFVSjFYbnZVZCs4NVZMckpDaGdiRXBsSkw0aEwvVkJpCjBYUG5qM3BEQWdNQkFBR2pnWjB3Z1pvd0V3WUpLd1lCQkFHQ054UUNCQVllQkFCREFFRXdDd1lEVlIwUEJBUURBZ0dHTUE4R0ExVWQKRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZLOUVCTUpCZmtpRDIwNDVBdXpzaEhybXpzbWtNRFFHQTFVZEh3UXRNQ3N3S2FBbgpvQ1dHSTJoMGRIQTZMeTlqY213dWMyVmpkWEpsZEhKMWMzUXVZMjl0TDFOSFEwRXVZM0pzTUJBR0NTc0dBUVFCZ2pjVkFRUURBZ0VBCk1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQmpHZ2hBZmFSZVV3MTMySHF1SHcwTFVSWUQ3eGg4eU9PdmFsaVRGR0NSc29UY2lFNisKT1lvNjgrYUNpVjBCTjdPckpLUVZEcEkxV2twRVhrNVgrblhPSDBqT1p2UThRQ2FTbUd3YjdpUkdEQmV6VXFYYnBaR1J6emZUYitjbgpDRHBPR1I4NnAxaGNGODk1UDR2a3A5TW1JNTBtRDFocC9FZCtzdENOaTVPL0tVOURhWFIyWjB2UEI0em1BdmUxNGJSRHRVc3RGSi81CjNDWU52NlpIZEFiWWlORTZLVENFenRJNWdHSWJxTWRYU2J4cVZWRm5GVXErTlFmazFYV1lOM2t3Rk5zcG5XekZhY3hIVmFJdzk4eGMKZjhMRG1CeHJUaGFBNjNwNFpVV2lBQnF2REExVlpEUkl1Sks1OGJSUUtmSlBJeC9hYkt3ZlJPSGRJM2hSVzhjVwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDT01PRE8gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFSFRDQ0F3V2dBd0lCQWdJUVRvRXRpb0psNEFzQzdqNDFBa2JsUFRBTkJna3Foa2lHOXcwQkFRVUZBRENCZ1RFTE1Ba0dBMVVFCkJoTUNSMEl4R3pBWkJnTlZCQWdURWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEdBMVVFQnhNSFUyRnNabTl5WkRFYU1CZ0cKQTFVRUNoTVJRMDlOVDBSUElFTkJJRXhwYldsMFpXUXhKekFsQmdOVkJBTVRIa05QVFU5RVR5QkRaWEowYVdacFkyRjBhVzl1SUVGMQpkR2h2Y21sMGVUQWVGdzB3TmpFeU1ERXdNREF3TURCYUZ3MHlPVEV5TXpFeU16VTVOVGxhTUlHQk1Rc3dDUVlEVlFRR0V3SkhRakViCk1Ca0dBMVVFQ0JNU1IzSmxZWFJsY2lCTllXNWphR1Z6ZEdWeU1SQXdEZ1lEVlFRSEV3ZFRZV3htYjNKa01Sb3dHQVlEVlFRS0V4RkQKVDAxUFJFOGdRMEVnVEdsdGFYUmxaREVuTUNVR0ExVUVBeE1lUTA5TlQwUlBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNQpNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTBFQ0xpM0xqa1J2M1VjRWJWQVNZMDZtL3dlYUtYVHVICis3dUl6ZzNqTHo4R2x2Q2lLVkNacnRzN29WZXdkRkZ4emUxQ2tVMUIvcW5JMkdxR2QwUzdXV2FYVUY2MDFDeHdSTS9hTjVWQ2FUd3cKeEhHelV2QWhUYUhZdWpsOEhKNmpKSjN5Z3hhWXFoWjhRNXNWVzdldU5KSCsxR0ltR0VhYVArdkIrZkdRVit1c2VnMkwyM0l3YW1iVgo0RWFqY054bzJmOEVTSWwzM3JYcCsyZHRRZW04T2IweTJXSUM4YkdvUFc0M25PSXY0dE9pSm92R3VGVkRpT0VqUHFYU0pEbHFSNnNBCjFLR3pxU1grRFQrbkhiclRVY0VMcE5xc09POVZVQ1FGWlVhVE5FOHRqYTNHMUNFWjBvN0tCV0Z4QjNOSDVZb1pFcjBFVGM1T25LVkkKckxzbTl3SURBUUFCbzRHT01JR0xNQjBHQTFVZERnUVdCQlFMV09XTHhrd1ZONlJBcVRDcEliNUhObHBXL3pBT0JnTlZIUThCQWY4RQpCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pCSkJnTlZIUjhFUWpCQU1ENmdQS0E2aGpob2RIUndPaTh2WTNKc0xtTnZiVzlrCmIyTmhMbU52YlM5RFQwMVBSRTlEWlhKMGFXWnBZMkYwYVc5dVFYVjBhRzl5YVhSNUxtTnliREFOQmdrcWhraUc5dzBCQVFVRkFBT0MKQVFFQVBwaWVtL1liNmRjNXQzaXVIWElZU2RPSDVFT0M2ei9KcXZXb3RlOVZmQ0ZTWmZuVkRlRnM5RDZNazNPUkxnTEVUZ2R4YjhDUApPR0VJcUI2QkNzQXZJQzlCaTVIY1NFVzg4Y2JldW5ack04Z0FMVEZHVE8zbm5jK0lsUDh6d0Zib0pJWW11Tmc0T044cWE5MFN6TWMvClJ4ZE1vc0lHbGduVzIvNC9QRVpCMzFqaVZnODhPOEVja3pYWk9GS3M3c2pzTGpCT2xEVzBKQjlMZUduYThnSTR6SlZTay9Cd0pWbWMKSUdmRTd2bUxWMkgwa25aOVA0U05WYmZvNWF6VjhmVVpWcVphKzVBY3I1UHI1UnpVWjVkZEJBNitDNE9tRjRPNU1CS2d4VE1WQmJrTgorOGNGZHVQWVNvMzhOQmVqeGlFb3ZqQkZNUjdIZUw1WVlUaXNPK0lCWlE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDT01PRE8gRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNpVENDQWcrZ0F3SUJBZ0lRSDBldnFtSUFjRkJVVEFHZW0yT1pLakFLQmdncWhrak9QUVFEQXpDQmhURUxNQWtHQTFVRUJoTUMKUjBJeEd6QVpCZ05WQkFnVEVrZHlaV0YwWlhJZ1RXRnVZMmhsYzNSbGNqRVFNQTRHQTFVRUJ4TUhVMkZzWm05eVpERWFNQmdHQTFVRQpDaE1SUTA5TlQwUlBJRU5CSUV4cGJXbDBaV1F4S3pBcEJnTlZCQU1USWtOUFRVOUVUeUJGUTBNZ1EyVnlkR2xtYVdOaGRHbHZiaUJCCmRYUm9iM0pwZEhrd0hoY05NRGd3TXpBMk1EQXdNREF3V2hjTk16Z3dNVEU0TWpNMU9UVTVXakNCaFRFTE1Ba0dBMVVFQmhNQ1IwSXgKR3pBWkJnTlZCQWdURWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEdBMVVFQnhNSFUyRnNabTl5WkRFYU1CZ0dBMVVFQ2hNUgpRMDlOVDBSUElFTkJJRXhwYldsMFpXUXhLekFwQmdOVkJBTVRJa05QVFU5RVR5QkZRME1nUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvCmIzSnBkSGt3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBUURSM3N2ZGNtQ0ZZWDdkZVNSRnRTcllwbjFQbElMQnM1QkFIK1gKNFFva1BCMEJCTzQ5MG8wSmx3emdkZVQ2KzNlS0t2VURZRXMyaXhZakZxMEpjZlJLOUNoUXRQNklIRzQvYkM4dkNWbGJwVnNMTTVuaQp3ejJKK1dvczc3TFRCdW1qUWpCQU1CMEdBMVVkRGdRV0JCUjFjYWNaU0JtOG5aM3FRVWZmbE1SSWQ1blRlVEFPQmdOVkhROEJBZjhFCkJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFLQmdncWhrak9QUVFEQXdOb0FEQmxBakVBN3dOYmVxeTNlQXB5dDRqZi83VkcKRkFrSytxRG1mUWpHR29lOUdLaHp2U2JLWUF5ZHpwbWZ6MXdQTU9HK0ZESHFBakFVOUpNOFNhY3plcEJHUjdOamZST2JUcmR2R0RlQQpVLzdkSU9BMW1qYlJ4d0c1NXR6ZDgvOGRMRG9XVjltU09kWT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ2VydGlnbmEKPT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURxRENDQXBDZ0F3SUJBZ0lKQVA3YzR3RVB5VWovTUEwR0NTcUdTSWIzRFFFQkJRVUFNRFF4Q3pBSkJnTlZCQVlUQWtaU01SSXcKRUFZRFZRUUtEQWxFYUdsdGVXOTBhWE14RVRBUEJnTlZCQU1NQ0VObGNuUnBaMjVoTUI0WERUQTNNRFl5T1RFMU1UTXdOVm9YRFRJMwpNRFl5T1RFMU1UTXdOVm93TkRFTE1Ba0dBMVVFQmhNQ1JsSXhFakFRQmdOVkJBb01DVVJvYVcxNWIzUnBjekVSTUE4R0ExVUVBd3dJClEyVnlkR2xuYm1Fd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURJYVBISjF0YXpOSFVtZ2g3c3RMN3EKWE9FbTdSRkhZZUdpZkJaNFFDSGtZSjVheUdQaHhMR1drdjhZYldrajRTdGk5OTNpTmkrUkI3bEl6dzdzZWJZczV6UkxjQWdsb3p5SApHeG55Z1FjUE9KQVoweEgraHJUeTBWNGVIcGJOZ0d6T096R1R0dktnMEttVkVuMmxtc3hyeUlSV2lqT3A1eUlWVXhid3pCZnNWMS9wCm9ncVlDZDdqWDV4djNFampoUXNWV3FhNm42eEk0d215OS9ReTNsNDB2aHg0WFVKYnpnNGlqMDJRMTMweUdMTUxMR3Evamo4VUVZa2cKRG5jVXRUMlVDSWYzSlI3VnNtQUE3RzhxS0NWdUtqNFlZeGNsUHo1RUlCYjJKc2dscmdWS3RPZGpMUE9NRmxOK1hQc1JHZ2pCUm1LZgpJcmp4d28xcDNQbzZXQWJmQWdNQkFBR2pnYnd3Z2Jrd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVUd1MytRVG1RCnRDUlp2Z0h5VXRWRjlsbzUzQkV3WkFZRFZSMGpCRjB3VzRBVUd1MytRVG1RdENSWnZnSHlVdFZGOWxvNTNCR2hPS1EyTURReEN6QUoKQmdOVkJBWVRBa1pTTVJJd0VBWURWUVFLREFsRWFHbHRlVzkwYVhNeEVUQVBCZ05WQkFNTUNFTmxjblJwWjI1aGdna0EvdHpqQVEvSgpTUDh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFCekFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBCmhRTWVrbkgyUXEvaG8yR2U2L1BBRC9LbDFOcVY1dGErYURZOWZtNGZUSXJ2MFE4aGJWNmxVbVBPRXZqdkt0cHY2emYrRXdMSHl6cysKSW12YVlTNS8xSEk5M1REaEhreEFHWXdQMTV6Umd6QjdtRm5jZmNhNURDbE1vVE9pNjJjNlpZVFRsdUx0ZGtWd2o3VXIzdmtqMWtsdQpQQlMxeHA4MUhsRFF3WTlxY0VRQ1lzdXVIV2hCcDZwWDZGT3FCOUlHOXRVVUJndVJBM1VzYkhLMVlaV2FEWXU1RGVmMTMxVE4zdWJZCjFna0lsMlBsd1M2d3QwUW13Q2JBcjFVd25qdlZOaW9aQlBSY0h2L1BMTGYvMFAySFFCSFZFU083U01BaHFhUW9MZjBWK0xCT0svUXcKV3lIOEVaRTB2a0h2ZTUyWGRmK1hsY0NXV0MvcXUwYlh1K1RaTGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgplUEtJIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGc0RDQ0E1aWdBd0lCQWdJUUZjaTlaVWRjcjdpWEFGN2tCdEs4blRBTkJna3Foa2lHOXcwQkFRVUZBREJlTVFzd0NRWURWUVFHCkV3SlVWekVqTUNFR0ExVUVDZ3dhUTJoMWJtZG9kMkVnVkdWc1pXTnZiU0JEYnk0c0lFeDBaQzR4S2pBb0JnTlZCQXNNSVdWUVMwa2cKVW05dmRDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZUZ3MHdOREV5TWpBd01qTXhNamRhRncwek5ERXlNakF3TWpNeApNamRhTUY0eEN6QUpCZ05WQkFZVEFsUlhNU013SVFZRFZRUUtEQnBEYUhWdVoyaDNZU0JVWld4bFkyOXRJRU52TGl3Z1RIUmtMakVxCk1DZ0dBMVVFQ3d3aFpWQkxTU0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUlJQ0lqQU5CZ2txaGtpRzl3MEIKQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBNFNVUDdvM2JpRE4xWjgydEgzMDZUbTJkMHk4VTgyTjB5d0VoYWpmcWhGQUhTeVpiQ1VOcwpJWjVxeU5VRDlXQnBqOHp3SXVRZjUvZHFJakczTEJYeTRQNEFha1AvaDJYR3RSckJwMHh0SW5BaGlqSHlsM1NKQ1JJbUhKN0syUktpCmxUemE2V2UvQ0tCazQ5WkN0MFh2bC9UMjlkZTFTaFVDV0gyWVdFdGd2TTNYRFpvVE0xUFJZZmw2MWRkNHM1b3o5d0NHemgxTmxEaXYKcU94NFVYQ0tYQkNEVVNIM0VUMDBobDdsU00yWGdZSTFUQm5zWmZacnhRV2g3a2NUMXJNaEo1UVFDdGtrTzdxK1JCTkdNRCtYUE5qWAoxMnJ1T3pqaks5U1hEcmtiNXdkSmZ6Y3ErWGQ0ejFUdFcwYWRvNEFPa1VQQjFsdGZGTHFmcG8wa1IwQlp2M0k0c2pac04vK1owVjBPCldRcXJhZmZBc2dSRmVsUUFycjVUOXJYbjRmZzhvekhTcWY0aFVtVEZwbWZ3ZFFjR2xCU0JWY1luNUFHUEY4RnFjZGUrUy91VVdIMSsKRVRPeFF2ZGliQmpXendsb1BuOXM5aDZQWXEybFk5c0pweDhpUWtFZWI1bUtQdGY1UDBCNmViQ2xBWkxTblQwSUZhVVFBUzJ6TW5hbwpsUTJ6ZXByN0J4QjRFVy9oajhlNkR5VWFkQ3JsSEpoQm1kOGhoK2lWQm1vS3MycEhkbVgyT3MrUFloY1pld29velJyU2d4NGh4eXkvCnZ2OWhhTGRuRzd0NFRZM09aK1hrd1k2M0kyYmluWkIxTkppcE5pdUttcFM1bmV6TWlySDRKWWxjV3JZdmpCOXRlU1NuVW1qRGhEWGkKWm8xakRpVk4xUm15NW5rM3B5S2RWREVDQXdFQUFhTnFNR2d3SFFZRFZSME9CQllFRkI0TTk3Wm44dUdTSmdsRndGVTVMbmMvUWtxaQpNQXdHQTFVZEV3UUZNQU1CQWY4d09RWUVaeW9IQUFReE1DOHdMUUlCQURBSkJnVXJEZ01DR2dVQU1BY0dCV2NxQXdBQUJCUkZzTUxICkNsWjg3bHQ0REpYNUdGUEJwaHpZRURBTkJna3Foa2lHOXcwQkFRVUZBQU9DQWdFQUNiT0RVMWtCUHBWSnVmR0J1dmwySUNPMUoyQjAKMUdxWk5GNXNBRlBabi9LbXNTUUhSR29xeHFXT2VCTG9SOWxZR3hNcVhubWJud29xWjZZbFB3WnBWblBEaW1aSSt5bUJWM1FHeXB6cQpLT2c0WnlZcjhkVzFQMldUK0RaZGpvMk5RQ0NIR2Vydko4QTl0RGtQSlh0b1VIUlZuQXhaZlZvOVFaUWxVZ2pnUnl3Vk1SblZ2d2RWCnhyc1N0WmYwWDRPRnVuSEIyV3lCRVhZS0NyQy9ncGYzNmozNit1d3RxU2lVTzFiZDBsRXVyc0M5Q0JXTWQxSTBsdGFick5NZGptRVAKTlh1YnJqbHBDMkpnUUNBMmo2LzdOdTR0Q0VvZHVMK2JYUGpxcFJ1Z2M2YlkrRzdnTXdSZmFLb25oKzNad1pDYzdiM2phald2WTkrcgpHTm02NXVsSzZsQ0tEMkdUSHVJdEdlSXdsRFdTWFE2MkI2OFpnSTlIa0ZGTExrM2RoZUxTQ2xJS0Y1cjhHckJRQXVVQm8yTTNJVXhFCnhKdFJtUkVPYzV3R2oxUXVweWhlUkRtSFZpMDN2WVZFbE9FTVN5eWN3NUtGTkdITEQ3aWJTa05TL2pRNmZianBLZHgycWNndytCUngKZ01ZZU5raDBJa0ZjaDRMb0dIR0xRWWxFNTM1WVc2aTRqUlBwcDJ6RFIrMnpHcDFpcm8yQzZwU2UzVmtRdzYzZDRrM2pNZFhIN09qeQpzUDZTSGhZS0d2elo4L2dudHNtK0hiUnNaSkIvOU9URVc5YzNya0lPM2FRYWIzeUlWTVVXYnVGNmFDNzRPcjhOcER5Sk8zaW5UbU9ECkJDRUlaNDN5Z2tuUVcvMnh6UStEaE5RK0lJWDNTajByblAwcUNnbE42b0g0RVp3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpjZXJ0U0lHTiBST09UIENBCj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURPRENDQWlDZ0F3SUJBZ0lHSUFZRkZuQUNNQTBHQ1NxR1NJYjNEUUVCQlFVQU1Ec3hDekFKQmdOVkJBWVRBbEpQTVJFd0R3WUQKVlFRS0V3aGpaWEowVTBsSFRqRVpNQmNHQTFVRUN4TVFZMlZ5ZEZOSlIwNGdVazlQVkNCRFFUQWVGdzB3TmpBM01EUXhOekl3TURSYQpGdzB6TVRBM01EUXhOekl3TURSYU1Ec3hDekFKQmdOVkJBWVRBbEpQTVJFd0R3WURWUVFLRXdoalpYSjBVMGxIVGpFWk1CY0dBMVVFCkN4TVFZMlZ5ZEZOSlIwNGdVazlQVkNCRFFUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxjenVYN0kKSlVxT3RkdTBLQnVxVjVEbzBTTFRaTHJUaytqVXJJWmhRR3BnVjJoVWhFMjhhbFFDQmYvZm01b3FybDBIajByREtIL3YreXY2ZWZISApyZkFRVXlTUWkyYkpxSWlycjFxakFPbSt1a2J1VzNON0xCZUNnVjVpTEtFQ1piTzl4U3NBZnNUOEF6TlhEZTNpK3M1ZFJkWTR6VFcyCnNzSFFuSUZLcXVTeUFWd2RqMStaeExHdDI0Z2g2NUFJZ29Eek1LTkQ1cENDcmxVb1NlMWIxNmtRT0E3K2oweGJtMGJxUWZXd0NIVEQKMElnenRuelhkTi9jaE5GRERuVTVvU1ZBS09wNHl3NHNMam1kakl0dUZod3ZKb0lRNHVObGxBb0V3RjczWFZ2NEVPTFF1bnBMKzk0MwpBQUFhV3lqajBweHpQaktIbUtISlVTL1gzcXd6czA4Q0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCCkFmOEVCQU1DQWNZd0hRWURWUjBPQkJZRUZPQ01tOXNsU2JQeGZJYldza0tIQzlCcm9ObmtNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUIKQVFBKzBoeUpMalg4K0hYZDVuOWxpUFJ5VE1rczF6Sk84OTBaZVVlOWpqdGJrdzlRU1NRVGF4UUdjdThKMDZHaDQwQ0V5ZWNZTW5ROApTRzRQbjB2VTl4N1RrNFprVkpkamNsRFZWYy82SUpNQ29wdkRJNU5PRmxWMm9IQjViYzBoSDg4dkxid1o0NGd4K0ZrYWdRbklsNlowCngyREVXOHhYanJKMS9Sc0NDZHRaYjNLVGFmY3hRZGFJT0wrSHNyMFdlZm1xNUw2SUpkMWhKeU1jdFRFSEJEYTBHcEM5b0hSeFVJbHQKdkJUakQ0YXU4YXMreDZBSnpLTkkwZURiWk9lU3RjK3Zja053aS9uRGhEd1RxbjZTbTFkVGsvcHd3cEVPTWZtYloxM3BsamhlWDdOegpUb2dWWjk2ZWRoQmlJTDVWYVpWREFEbE45dTZ3V2s1SlJGUllYMEtECi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCk5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVGVENDQXYyZ0F3SUJBZ0lHU1VFczVBQVFNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR25NUXN3Q1FZRFZRUUdFd0pJVlRFUk1BOEcKQTFVRUJ3d0lRblZrWVhCbGMzUXhGVEFUQmdOVkJBb01ERTVsZEV4dlkyc2dTMlowTGpFM01EVUdBMVVFQ3d3dVZHRnV3N3B6dzYxMApkc09oYm5scmFXRmt3N05ySUNoRFpYSjBhV1pwWTJGMGFXOXVJRk5sY25acFkyVnpLVEUxTURNR0ExVUVBd3dzVG1WMFRHOWpheUJCCmNtRnVlU0FvUTJ4aGMzTWdSMjlzWkNrZ1JzV1JkR0Z1dzdwenc2MTBkc09oYm5rd0hoY05NRGd4TWpFeE1UVXdPREl4V2hjTk1qZ3gKTWpBMk1UVXdPREl4V2pDQnB6RUxNQWtHQTFVRUJoTUNTRlV4RVRBUEJnTlZCQWNNQ0VKMVpHRndaWE4wTVJVd0V3WURWUVFLREF4TwpaWFJNYjJOcklFdG1kQzR4TnpBMUJnTlZCQXNNTGxSaGJzTzZjOE90ZEhiRG9XNTVhMmxoWk1PemF5QW9RMlZ5ZEdsbWFXTmhkR2x2CmJpQlRaWEoyYVdObGN5a3hOVEF6QmdOVkJBTU1MRTVsZEV4dlkyc2dRWEpoYm5rZ0tFTnNZWE56SUVkdmJHUXBJRWJGa1hSaGJzTzYKYzhPdGRIYkRvVzU1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF4Q1JlYzc1TGJSVERvZlRqbDVCdQowakJGSGp6dVo5bGs0QnFLZjhvd3lvUGpJTUhqOURyVGxGOGFmRnR0dnpCUGhDZjJueDlKdk1hWkNwRHlEL1YvUTRRM1kxR0xlcVZ3Ci9IcFl6WTZiN2NOR2JJUndYZHJ6QVpBai9FNHdxWDdoSjJQbjdXUThvTGpKTTJQK0ZwRC9zTGo5MTZqQXdKUkRDN2JWV2FhZVZ0QWsKSDNCNXI5czVWQTFsZGRrVlFaUUJyMTdzOW8zeC82MWsvaUNhMTF6ci9xWWZDR1NqaTNaVnJSNDdLR0F1aHlYb3FxOGZ4bVJHSUxkdwpmenplU051V1U3YzVkK1FhNHNjV2hIYVhXeSs3R1JXRitHbUY5Wm1ucWZJMHA2bTJwZ1A4YjRZOVZIeDJCSnRyK1VCZEFEVEhMcGwxCm5lV0lBNnBOK0FQU1FuYkFHd0lEQUtpTG8wVXdRekFTQmdOVkhSTUJBZjhFQ0RBR0FRSC9BZ0VFTUE0R0ExVWREd0VCL3dRRUF3SUIKQmpBZEJnTlZIUTRFRmdRVXpQcG5rL0MydU5DbHdCN3pVLzJNVTkrRDE1WXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBS3QvN2h3VwpxWnc4VVFDZ3dCRUlCYWVaNW04QmlGUmhidkc1R0sxS3JmNkJRQ09VTC90MWZDOG9TMklrZ1lJTDlXSHhIRzY0WVRqcmdmcGlvVHRhCll0T1VaY1RoNW0yQytDOGxjTEloSnNGeVVSK01MTU9Fa01OYWo3clA5S2RscGV1WTBmc0Zza1oxRlNOcWI0VmpNSUR3MVo0ZktSekMKYkxCUVdWMlFXenVvRFREUHYzMS96dkdkZzczSlJtNGdwdmxoVWJvaEwzdStwUlZqb2RTVmgvR2V1Zk9KOHoyRnVMamJ2clc1S2ZuYQpOd1VBU1pRRGhFVG52ME14ejNXTEpkSDBwbVQxa3ZhckJlczk2YVVMTm1MYXpBWmZOb3UyWGpHNEt2dGU5bkhmUkNhZXhPWU5rYlF1CmRaV0FVV3BMTUthd1lxR1Q4WnZZenNSamRUOVpSN0U9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVDakNDQXZLZ0F3SUJBZ0lKQU1KK1F3Uk9SejhaTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdDTVFzd0NRWURWUVFHRXdKSVZURVIKTUE4R0ExVUVCd3dJUW5Wa1lYQmxjM1F4RmpBVUJnTlZCQW9NRFUxcFkzSnZjMlZqSUV4MFpDNHhKekFsQmdOVkJBTU1IazFwWTNKdgpjMlZqSUdVdFUzcHBaMjV2SUZKdmIzUWdRMEVnTWpBd09URWZNQjBHQ1NxR1NJYjNEUUVKQVJZUWFXNW1iMEJsTFhONmFXZHVieTVvCmRUQWVGdzB3T1RBMk1UWXhNVE13TVRoYUZ3MHlPVEV5TXpBeE1UTXdNVGhhTUlHQ01Rc3dDUVlEVlFRR0V3SklWVEVSTUE4R0ExVUUKQnd3SVFuVmtZWEJsYzNReEZqQVVCZ05WQkFvTURVMXBZM0p2YzJWaklFeDBaQzR4SnpBbEJnTlZCQU1NSGsxcFkzSnZjMlZqSUdVdApVM3BwWjI1dklGSnZiM1FnUTBFZ01qQXdPVEVmTUIwR0NTcUdTSWIzRFFFSkFSWVFhVzVtYjBCbExYTjZhV2R1Ynk1b2RUQ0NBU0l3CkRRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFPbjRqL05qcmRxRzJLZmdRdnZQa2Q2bUp2aVpwV053clp1dXlqTkEKZlcyV2JxRU9STzdoRTUyVVFsS2F2WFdGZEN5b0RoMlR0aGkzakN5b3ovdGNjYm5hN1A3b2ZvL2tMeDJ5cUhXSDJMZWg1VHZQbVVwRwowSU1aZmNDaEVoeVZiVXIwMk1lbFRUTXVoVGxBZFg0VWZJQVNtRkRIUVdlNG9JQmhWS1pzVGgvZ25RNEg2Y202TStmK3dGVW9MQUtBCnB4bjFudHhWVXdPWGV3ZEkvNW43TjRva3hGbk1VQkJqanFxcEdyQ0VHb2I1WDd1eFVHNmswUXJNMVhGK0g2Y2JmUFZUYmlKZnl5dm0KMUh4ZHJ0YkN4a3psQlFIWjdWZjh3U041L1BySUpJT1Y4N1ZxVVFIUWQ5YnBFcUg1R29QN2dodTVzSmYwZGdZelEwbWcvd3UxK3JVQwpBd0VBQWFPQmdEQitNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCVExEOGJmClFrUE1QY3UxU0NPaEducW1LcnMwYURBZkJnTlZIU01FR0RBV2dCVExEOGJmUWtQTVBjdTFTQ09oR25xbUtyczBhREFiQmdOVkhSRUUKRkRBU2dSQnBibVp2UUdVdGMzcHBaMjV2TG1oMU1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRREowUTVlTHRYTXMzdyt5L3c5L3cwbwpsWk1FeUwvYXpYbTRRNUR3cEw3djh1OGhtTHpVMUYwRzl1NUM3REJzb0txcHl2R3Zpdm8vQzNOcVB1b3VRSDRmcmxSaGVlc3VDRGZYCkkvT01uNzRkc2VHa2RkdWc0bFFVc2JvY0thUVk5aEs2b2hRVTR6RTF5RUQvdCtBRmRsZkJIRm55K0wvazdTVmlYSVR3Zm40ZnM3NzUKdHlFUnpBTUJWbkNuRUpJZUd6U0JIcTJjR3NNRVBPMENZZFllQnZOZk9vZnlLL0ZGaCtVOXJOSEhWNFM5YTY3YzJQbTJHMkp3Q3owMgp5VUx5TXRkNlllYlMyejNQeUtuSm05emJXRVRYYnppdmYzalRvNjBhZGJvY3dUWjhqeDV0SE1OMVJxNDFCYWIyWEQwaDdsYnd5WUlpCkxYcFVxM0REZlNKbGduQ1cKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR2xvYmFsU2lnbiBSb290IENBIC0gUjMKPT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURYekNDQWtlZ0F3SUJBZ0lMQkFBQUFBQUJJVmhUQ0tJd0RRWUpLb1pJaHZjTkFRRUxCUUF3VERFZ01CNEdBMVVFQ3hNWFIyeHYKWW1Gc1UybG5iaUJTYjI5MElFTkJJQzBnVWpNeEV6QVJCZ05WQkFvVENrZHNiMkpoYkZOcFoyNHhFekFSQmdOVkJBTVRDa2RzYjJKaApiRk5wWjI0d0hoY05NRGt3TXpFNE1UQXdNREF3V2hjTk1qa3dNekU0TVRBd01EQXdXakJNTVNBd0hnWURWUVFMRXhkSGJHOWlZV3hUCmFXZHVJRkp2YjNRZ1EwRWdMU0JTTXpFVE1CRUdBMVVFQ2hNS1IyeHZZbUZzVTJsbmJqRVRNQkVHQTFVRUF4TUtSMnh2WW1Gc1UybG4KYmpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXdsZHBCNUJuZ2lGdlhBZzdhRXlpaWUvUVYyRWNXdAppSEw4UmdKRHg3S0tuUVJmSk1zdVMrRmdna2JoVXFzTWdVZHdiTjFrMGV2MUxLTVBnajBNSzY2WDE3WVVoaEI1dXpzVGdIZU1DT0ZKCjBtcGlMeDllK3BabzM0a25sVGlmQnRjK3ljc21XUTF6M3JESTZTWU9neFhHNzF1TDBnUmd5a21tS1BacE8vYkx5Q2lSNVoyS1lWYzMKckhRVTNIVGdPdTV5THk2Yys5Qzd2L1U5QU9FR00raUNLNjVUcGpvV2M0emRRUTRnT3NDMHA2SHBzaytRTGpKZzZWZkx1UVNTYUdqbApPQ1pnZGJLZmQvK1JGTyt1SUVuOHJVQVZTTkVDTVdFWlhyaVg3NjEzdDJTYWVyOWZ3UlB2bTJMN0RXemdWR2tXcVFQYWJ1bURrM0YyCnhtbUZnaGNDQXdFQUFhTkNNRUF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUUKRkkvd1MzK29Ma1VrcmsxUSttT2FpOTdpM1J1OE1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQkxRTnZBVUtyK3lBenY5NVpVUlVtNwpsZ0FKUWF5ekU0YUdLQWN6eW12bWRMbTZBQzJ1cEFyVDlmSHhENHEvYzJkS2c4ZEVlM2pncjI1c2J3TXBqak01UmNPTzVMbFhiS3I4CkVwYnNVOFl0NUNSc3VaUmorOXhUYUdkV1BvTzR6elVodzhsby9zN2F3bE9xekpDSzZmQmRSb3lWM1hwWUtCb3ZIZDdOQURkQmorMUUKYmRkVEtKZCs4MmNFSGhYWGlwYTAwOTVNSjZSTUczTnpkdlFYbWNJZmVnN2pMUWl0Q2h3cy96eXJWUTRQa1g0MjY4TlhTYjdoTGkxOApZSXZEUVZFVEk1M085ekpybEFHb21lY3NNeDg2T3lYU2hrRE9PeXlHZU1saEx4UzY3dHRWYjkrRTdnVUpUYjBvMkhMTzAySlFaUjdyCmtwZURNZG16dGNwSFdEOWYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKSXplbnBlLmNvbQo9PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGOFRDQ0E5bWdBd0lCQWdJUUFMQzNXaFpJWDcvaHkvV0wxeG5tZlRBTkJna3Foa2lHOXcwQkFRc0ZBREE0TVFzd0NRWURWUVFHCkV3SkZVekVVTUJJR0ExVUVDZ3dMU1ZwRlRsQkZJRk11UVM0eEV6QVJCZ05WQkFNTUNrbDZaVzV3WlM1amIyMHdIaGNOTURjeE1qRXoKTVRNd09ESTRXaGNOTXpjeE1qRXpNRGd5TnpJMVdqQTRNUXN3Q1FZRFZRUUdFd0pGVXpFVU1CSUdBMVVFQ2d3TFNWcEZUbEJGSUZNdQpRUzR4RXpBUkJnTlZCQU1NQ2tsNlpXNXdaUzVqYjIwd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURKCjAzcktEeDZzcDRib0ZtVnFzY0liUlRKeGxkbitFRnZNcitlbGVRR1BpY1BLOGxWeDkzZStkNVR6Y3FRc1JOaWVrcHNVT3FIbkpKQUsKQ2xhT3hkZ21sT0haU09FdFB0b0tjdDJqbVJYYWdhS0g5SHR1Sm5lSldLM1c2d3l5UVhwemJtM2JlbmhCNlFpSUVuNkhMbVlSWTJ4VQorenlkY3NDOEx2L0N0OTBOZHVNNjEvZTBhTDZpOWVPQmJzRkdiMTJONEUzR1ZGV0pHak14Q3JGWHVhT0ttTVBzT3pURmxVRnBmblhDClBDREZZYnBSUjZBZ2tKT2hrRXZ6VG55RlJWU2EwUVVtUWJDMVRSMHp2c1FEeUNWOHdYRGJPL1FKTFZRblNLd3Y0Y1NzUHNqTGtreFQKT1RjajdOTUIrZUFKUkUxTlpNRGhEVnFISXJ5dEc2UCtKclVWODZmOGhCbnA3S0dJdEVScGhJUHppZEYwQnFuTUM5YkMzaWVGVUNiSwpGN2pKZW9kV0xCb0JIbXkrRTYwUXJMVWs5VGlSb2RaTDJ2RzcwdDVIdGZHOGdmWlphODhaVSttTkZjdEt5Nmx2Uk9VYlFjL2hocWZLCjBHcWZ2RXlOQmpOYW9vWGxrRFdnWWx3V1R2RGpvdm9ER3JRc2NiTllMTjU3QzlzYUQrdmVJUjhHZHdZRHNNbnZtZnpBdVU4TGhpaisKMHJucTQ5cWx3MGRwRXVEYjhQWVppKzE3Y05jQzF1MkhHQ2dzQkNSTWQrUklpaHJHTzVyVUQ4cjZkZElCUUZxTmViK0x6MHZQcWhiQgpsZVN0VElvK0Y1SFVzV0xsZ3VXQUJLUURmbzIvMm4raUQ1ZFBETk1OKzlmUjVYSitITWgzLzF1YUQ3ZXVCVWJsOGFnVzdFZWtGd0lECkFRQUJvNEgyTUlIek1JR3dCZ05WSFJFRWdhZ3dnYVdCRDJsdVptOUFhWHBsYm5CbExtTnZiYVNCa1RDQmpqRkhNRVVHQTFVRUNndysKU1ZwRlRsQkZJRk11UVM0Z0xTQkRTVVlnUVRBeE16TTNNall3TFZKTlpYSmpMbFpwZEc5eWFXRXRSMkZ6ZEdWcGVpQlVNVEExTlNCRwpOaklnVXpneFF6QkJCZ05WQkFrTU9rRjJaR0VnWkdWc0lFMWxaR2wwWlhKeVlXNWxieUJGZEc5eVltbGtaV0VnTVRRZ0xTQXdNVEF4Ck1DQldhWFJ2Y21saExVZGhjM1JsYVhvd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME8KQkJZRUZCMGNaUTZvOGlWN3RKSFA1TEd4NXIxVmRHd0ZNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUI0cGd3V1NwOU1pRHJBeXc2bApGbjJmdVVoZkdJOE5ZamIyelJscnJLdlY5cEY5cm5IelA3TU9lSVdibGFRbklVZENTbnhJT3ZWRmZMTU1qbEY0ckpVVDNzYjlmYmdhCmtFeXJrZ1BIN1VJQnpnL1lzZnFpa3VGZ2JhNTZhd21xeGludWFFbG5NSUFrZWpFV09WdCs4Und1M1d3SnJmSXh3WUpPdWJ2NXZyOHEKaFQvQVFLTTZXZnhaU3p3b0pOdTBGWFd1RFlpNkxuUEF2VmlINVVMeTYxN3VIakFpbWNzMzBjUWhiSUhzdm0wbTVoemtRaUNlUjdDcwpnMWx3TERYV3J6WTB0TTA3K0RLbzcrTjRpZnVOUlN6YW5MaCtRQnhoNXo2aWtpeEw4czM2bUxZcC8vUHllNmtmTHFDVFZ5dmVoUVA1CmFUZkxubmhxQmJURk1YaUo3SHFuaGVHNWV6emV2aDU1aE02ZmNBNVp3alV1a0NveDJlUkZla0drTGhPYk5BNW1lMG1yWkpmUVJzTjUKblhKUVk2YVlXd2E5U0czWU9ZTnc2RFh3QmRHcXZPUGJ5QUxxZlAyQzJzSmJVald1bURxdHVqV1RJNmNmU04wMVJwaXlFR2prcFRIQwpDbGd1R1lFUXlWQjEvT3BhRnM0UjErN3ZVSWd0WWY4L1FuTUZsRVBWamp4T0FUb1pwUjlHVG5mUVhlV0JJaUdIL3BSOWhOaVRyZFpvClEwaXkyK3R6Sk9lUmYxU2t0b0ErbmFNOFRITENWOFNnMU13NEo4N1ZCcDZpU05ucG44NkNjRGFUbWp2ZmxpSGpXYmNNMnBFMzhQMVoKV3JPWnlHbHNReVlCTldOZ1ZZa0RPblhZdWtyWlZQL3Uzb0RZTGRFNDFWNHRDNWg5UG16Yi9DYUl4dz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdvIERhZGR5IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHhUQ0NBcTJnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQ0JnekVMTUFrR0ExVUVCaE1DVlZNeEVEQU9CZ05WQkFnVApCMEZ5YVhwdmJtRXhFekFSQmdOVkJBY1RDbE5qYjNSMGMyUmhiR1V4R2pBWUJnTlZCQW9URVVkdlJHRmtaSGt1WTI5dExDQkpibU11Ck1URXdMd1lEVlFRREV5aEhieUJFWVdSa2VTQlNiMjkwSUVObGNuUnBabWxqWVhSbElFRjFkR2h2Y21sMGVTQXRJRWN5TUI0WERUQTUKTURrd01UQXdNREF3TUZvWERUTTNNVEl6TVRJek5UazFPVm93Z1lNeEN6QUpCZ05WQkFZVEFsVlRNUkF3RGdZRFZRUUlFd2RCY21sNgpiMjVoTVJNd0VRWURWUVFIRXdwVFkyOTBkSE5rWVd4bE1Sb3dHQVlEVlFRS0V4RkhiMFJoWkdSNUxtTnZiU3dnU1c1akxqRXhNQzhHCkExVUVBeE1vUjI4Z1JHRmtaSGtnVW05dmRDQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGtnTFNCSE1qQ0NBU0l3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMOXhZZ2p4K2xrMDl4dkpHS1AzZ0VsWTZTS0RFNmJGSUVNQk80VHg1b1ZKbnlmcQo5b1FiVHFDMDIzQ1l4eklCc1FVK0IwN3U5UHBQTDFrd0l1ZXJHVlpyNG9BSC9QTVdkWUE1VVh2bCtUVzJkRTZwallJVDVMWS9xUU9ECitxSytpaFZxZjk0THc3WVpGQVhLNnNPb0JKUTdSbnd5RGZNQVppTElqV2x0Tm93UkdMZlRzaHhndERqNkFvek8wOTFHQjk0S1B1dGQKZk1oOCs3QXJVNlNTWW1sUkpRVmhHa1NCakN5cFE1WWozNnc2Z1pvT0tjVWNxZWxkSHJhZW5qQUtPYzd4aUlEN1MxM01NdXlGWWtNbApOQUpXSndHUnREdHdLajl1c2VpY2lBRjluOVQ1MjFOdFlKMi9MT2RZcTdoZlJ2ek94QnNEUEFuclNURmNhVWF6NEVjQ0F3RUFBYU5DCk1FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZEcWFoUWNRWnlpMjcvYTkKQlVGdUlNR1UyZy9lTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFDWjIxMTUxZm1YV1djRFlmRitPd1l4ZFMyaElJNVBaWWUwOTZhYwp2TmpwTDlEYld1N1BkSXh6dERoQzJnVjcrQUoxdVAybHNkZXU5dGZlRTh0VEVINktSdEdYK3JjdUt4R3JrTEFuZ1Bub24xcnBONStyCjVOOXNzNFVYblQzWkpFOTVrVFhXWHdUcmdJT3JtZ0l0dFJEMDJKREhCSE5BN1hJbG9LbWY3SjZyYUJLWlY4YVBFam9KcEwxRS9RWVYKTjhHYjVES2o3VGpvMkdUekxINFUvQUxxbjgzL0IyZ1gyeUtRT0MxNmpkRlU4V25qWHpQS2VqMTdDdVBLZjE4NTVlSjF1c1YyR0RQTwpMUEF2VEszM3NlZk9UNmpFbTBwVUJzVi9mZFVJRCtJYy9uNFh1S3hlOXRRV3NrTUpERTMycDJ1MG1ZUmx5bnFJNHVKRXZsejM2aHoxCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEM1RDQ0FzV2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURDQmp6RUxNQWtHQTFVRUJoTUNWVk14RURBT0JnTlZCQWdUCkIwRnlhWHB2Ym1FeEV6QVJCZ05WQkFjVENsTmpiM1IwYzJSaGJHVXhKVEFqQmdOVkJBb1RIRk4wWVhKbWFXVnNaQ0JVWldOb2JtOXMKYjJkcFpYTXNJRWx1WXk0eE1qQXdCZ05WQkFNVEtWTjBZWEptYVdWc1pDQlNiMjkwSUVObGNuUnBabWxqWVhSbElFRjFkR2h2Y21sMAplU0F0SUVjeU1CNFhEVEE1TURrd01UQXdNREF3TUZvWERUTTNNVEl6TVRJek5UazFPVm93Z1k4eEN6QUpCZ05WQkFZVEFsVlRNUkF3CkRnWURWUVFJRXdkQmNtbDZiMjVoTVJNd0VRWURWUVFIRXdwVFkyOTBkSE5rWVd4bE1TVXdJd1lEVlFRS0V4eFRkR0Z5Wm1sbGJHUWcKVkdWamFHNXZiRzluYVdWekxDQkpibU11TVRJd01BWURWUVFERXlsVGRHRnlabWxsYkdRZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwWlNCQgpkWFJvYjNKcGRIa2dMU0JITWpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTDN0d1FQODlvLzhBckZ2Clc1OUkyWjE1NHFLM0EyRldHTU5IdHRmS1BUVXVpVVAzb1dtYjNvb2EvUk1nbkxSSmR6SXBWdjI1N0l6ZEl2cHkzQ2RobCs3MldvVHMKYmhtNWlTemNoRnZWZFB0clg4V0pwUkJTaVVaVjlMaDFIT1ovNUZTdVMvaFZjbGNDR2ZnWGNWbnJIaWdIZE1XZFNMNXN0UFNrc1BOawpOM21Td094R1huL2hiVk5NWXEvTkh3dGp1enFkKy94NUFKaGhkTThtZ2tCajg3SnlhaGtObWNyVURuWE1OL3VMaWNGWjhXSi9YN05mClpURDRwN2ROZGxvZWRsNDB3T2lXVnBtS3MvQi9wTTI5M0RJeGZKSFA0RjhSK0d1cVNWelJtWlRSb3VOald3bDJ0VlppNFV0MEhaYlUKSnRRSUJGblFtQTRPNXQ3OHcrd2ZrUEVDQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQwpBUVl3SFFZRFZSME9CQllFRkh3TU1oK24yVEIveEgxb28yS29vYzZyQjFzbk1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQVJXZm9sClR3TnZsSms3bWgrQ2hUblVkZ1dVWHVFb2syMWlYUW5Db0tqVXNIVTQ4VFJxbmVTZmlvWW1VZVlzMGNZdGJwVWdTcElCN0xpS1ozc3gKNG1jdWpKVURKaTVEblVveDlnNjFETHUzNGpkL0lyb0FvdzU3VXZ0cnV6dkUwM2xSVHMyUTlHY0hHY2c4Um5vTkFYM0ZXT2R0NW9VdwpGNW9reEJEZ0JQZmc4bi9VcWdyL1FoMDM3WlRsWkZrU0lIYzQwekkrT0lGMWxuUDZhSSt4eTg0ZnhlejZuSDdQZnJIeEJ5MjIvTC9LCnBML1Fsd1ZLdk9vWUtBS1F2VlI0Q1NGeDA5RjlIZGtXc0tsaFBkQUtBQ0w4eDN2TENXUkZDenRBZ2ZkOWZETDFtTXBZam4wcTdwQloKYzJUNU5uUmVKYUgxWmdVdWZ6a1ZxU3I3VUl1T2hXbjAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU3RhcmZpZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQ3ekNDQXRlZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBRENCbURFTE1Ba0dBMVVFQmhNQ1ZWTXhFREFPQmdOVkJBZ1QKQjBGeWFYcHZibUV4RXpBUkJnTlZCQWNUQ2xOamIzUjBjMlJoYkdVeEpUQWpCZ05WQkFvVEhGTjBZWEptYVdWc1pDQlVaV05vYm05cwpiMmRwWlhNc0lFbHVZeTR4T3pBNUJnTlZCQU1UTWxOMFlYSm1hV1ZzWkNCVFpYSjJhV05sY3lCU2IyOTBJRU5sY25ScFptbGpZWFJsCklFRjFkR2h2Y21sMGVTQXRJRWN5TUI0WERUQTVNRGt3TVRBd01EQXdNRm9YRFRNM01USXpNVEl6TlRrMU9Wb3dnWmd4Q3pBSkJnTlYKQkFZVEFsVlRNUkF3RGdZRFZRUUlFd2RCY21sNmIyNWhNUk13RVFZRFZRUUhFd3BUWTI5MGRITmtZV3hsTVNVd0l3WURWUVFLRXh4VApkR0Z5Wm1sbGJHUWdWR1ZqYUc1dmJHOW5hV1Z6TENCSmJtTXVNVHN3T1FZRFZRUURFekpUZEdGeVptbGxiR1FnVTJWeWRtbGpaWE1nClVtOXZkQ0JEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhrZ0xTQkhNakNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0MKQVFvQ2dnRUJBTlVNT3NRcStVN2k5YjRabDErT2lGT3hIei9MejU4Z0UyMHBPc2dQZlR6M2EzWTRZOWsyWUtpYlhsd0FnTEl2V1gvMgpoL2tsUTRibmFSdFNtcERoY2VQWUxRMU9iL2JJU2RtMjh4cFdyaXUyZEJUcnovc200eHE2SFpZdWFqdFlsSWxIVnY4bG9KTndVNFBhCmhIUVV3MmVlQkdnNjM0NUFXaDFLVHM5RGtUdm5WdFlBY010UzdudDlyanJudkRINVJmYkNZTThUV1FJcmdNdzBSOSs1M3BCbGJRTFAKTEpHbXB1ZmVoUmhKZkdaT296cHRxYlh1TkM2NkRRTzRNOTlINjdGcmpTWFptODZCMFVWR01wWndoOTRDRGtsRGhiWnNjN3RrNm1GQgpyTW5VVk4rSEw4Y2lzaWJNbjFsVWFKLzh2aW92eEZVY2RVQmdGNFVDVlRtTGZ3VUNBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3CkF3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGSnhmQU4rcUFkY3dLemlJb3JodFNwenlFWkdETUEwR0NTcUcKU0liM0RRRUJDd1VBQTRJQkFRQkxOcWFFZDJuZE94bWZaeU1JYnc1aHlmMkUzRi9ZTm9ITjJCdEJMWjlnM2NjYWFOblJib2JoaUNQUApFOTVEeitJMHN3U2RIeW5Wdi9oZXlOWEJ2ZTZTYnpKMDhwR0NMNzJDUW5xdEtyY2dmVTI4ZWxVU3doWHF2ZmRxbFM1c2RKL1BITFR5CnhRR2poZEJ5UHExenF3dWJkUXh0UmJlT2xLeVdON1dnMEk4VlJ3N2o2SVBkai8zdlFRRjN6Q2VwWW9VejhqY0k3M0hQZHdiZXlCa2QKaUVEUGZVWWQveDdINGM3L0k5dkcrbzFWVHFrQzUwY1JSajcwL2IxN0tTYTdxV0ZpTnlpMkxTcjJFSVpreVhDbjBxMjNLWEI1Nmp6YQpZeVdmL1dpM01PeHcrM1dLdDIxZ1o3SWV5TG5wMktodkFvdG5EVTBtVjNIYUlQekJTbENOc1NpNgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBZmZpcm1UcnVzdCBDb21tZXJjaWFsCj09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURURENDQWpTZ0F3SUJBZ0lJZDNjR0p5YXBzWHd3RFFZSktvWklodmNOQVFFTEJRQXdSREVMTUFrR0ExVUVCaE1DVlZNeEZEQVMKQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVI4d0hRWURWUVFEREJaQlptWnBjbTFVY25WemRDQkRiMjF0WlhKamFXRnNNQjRYRFRFdwpNREV5T1RFME1EWXdObG9YRFRNd01USXpNVEUwTURZd05sb3dSREVMTUFrR0ExVUVCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5CmJWUnlkWE4wTVI4d0hRWURWUVFEREJaQlptWnBjbTFVY25WemRDQkRiMjF0WlhKamFXRnNNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUYKQUFPQ0FROEFNSUlCQ2dLQ0FRRUE5aHRQWndjcm9SWDFCaUxMSHdHeTQzTkZCa1JKTEx0SkpSVFd6c08zcXl4UHhrRXlsRmY2RXFkYgpEdUtQSHg2R0dhZXF0UzI1WHcyS3dxK0ZOWGt5TGJzY1lqZnlzVnRLUGNyTmNWL3BRcjZVNk1qZStTSklaTWJscThZcmJhMEY4UHJWCkM4K2E1ZkJRcElzN1I2VWpXM3A2K0RNL3VPK1psK01nd2RZb2ljK1UrN2xGN2VOQUZ4SFVkUEFMTWVJckptcWJURmV1ckNBK3VrVjYKQmZPOW0ya1ZybjFPSUdQRU5YWTZCd0xKTi8zSFIrN284WFlkY3hYeWw2UzF5SHA1MlVLcUszOWMvczRtVDZObWdUV3ZSTHBVSGh3dwpNbVdkNWp5VFhsQk9ldU02MUc3TUd2djUwamV1SkNxclZ3TWlLQTFKZFgrM0tOcDF2NDdqM0E1NU1RSURBUUFCbzBJd1FEQWRCZ05WCkhRNEVGZ1FVblpQR1U0dGV5cTgvbng0UDVabVZ2Q1QybEk4d0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUMKQVFZd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFGaXM5QVFPemNBTi93cjkxTG9XWHltOWUyaVpXRW5TdEIwM1RYOG5mVVlHWFVQRwpoaTQrYzdJbWZVK1RxYmJFS3BxcklaY1VzZDZNMDZ1SkZkaHJKTlR4RnE3WXBGelVmMUdPN1JnQnNaTmp2Yno0WVlDYW5ySE9RbkRpCnFYMEdKWDBub2Y1djdMTWVKTnJqUzFVYUFEczF0RHZaMTEwdy9ZRVRpZkxDQml2dFo4U095VU95WEdzVmlRSzhZdnhPOHJVenFySnYKMHdxaVVPUDJPK2d1Uk1MYlpqaXBNMVpJOFcwYk00ME5qRDlnTjUzVHltMStOSDRObjNKMml4dWZjdjFTTlVGRkFwWXZITEthYzBraApzVWxIUlVlMDcybzBFY2xObXN4WnQ5WUNubHBPWmJXVXJodmZLYkFXOGI4QW5nYzZGMlMxQkxVaklaa0tsVHVYZk84PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBZmZpcm1UcnVzdCBOZXR3b3JraW5nCj09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURURENDQWpTZ0F3SUJBZ0lJZkU4RU9SelVtUzB3RFFZSktvWklodmNOQVFFRkJRQXdSREVMTUFrR0ExVUVCaE1DVlZNeEZEQVMKQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVI4d0hRWURWUVFEREJaQlptWnBjbTFVY25WemRDQk9aWFIzYjNKcmFXNW5NQjRYRFRFdwpNREV5T1RFME1EZ3lORm9YRFRNd01USXpNVEUwTURneU5Gb3dSREVMTUFrR0ExVUVCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5CmJWUnlkWE4wTVI4d0hRWURWUVFEREJaQlptWnBjbTFVY25WemRDQk9aWFIzYjNKcmFXNW5NSUlCSWpBTkJna3Foa2lHOXcwQkFRRUYKQUFPQ0FROEFNSUlCQ2dLQ0FRRUF0SVRNTXhjdWE1UnNhMkZTb091anozbVVUT1dVZ0puTFZXUkVaWTluWk9JRzQxdzNTZll2bTRTRQpIaTN5WUowd1RzeUVoZUlzeng2ZS9qYXJNM2MxUk5nMWxobzlOdWg2RHRqVlI2RnFhWXZaL0xzNnJubGExZlRXY2J1YWtDTnJtcmVJCmRJY01IbCs1bmkzNnExTXIzTHQyUHBOTUNBaU1IcUlqSE5ScXJTSzZtUUV1YldYTHZpUm1WU1JMUUVTeEc5Zmh3b1hBM2hBL1BlMjQKL1BIeEkxUGN2MldYYjluNVFIR05mYjJWMU02K29GNG5JOTc5cHRBbURnQXA2enhHOEQxZ3Z6OVEwdHdtUVZHZUZEZENCS053VjZnYgpoKzB0K252dWpBcmpxV2FKR2N0QitkMUVObUhQNG5kR3lIMzI5SktCTnYzYk5QRnlmdk1NRnIyMEZRSURBUUFCbzBJd1FEQWRCZ05WCkhRNEVGZ1FVQngvUzU1emF3bTZpUUxTd2VsQVFVSFRFeUwwd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUMKQVFZd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFJbFhzaFo2cU1MOTF0bWJtelRDbkxReUZFMm5wTi9zdnFlKytFUGJrVGZPdERJdQpVRlVhTlU1MlEzRWc3NU4zVGhWd0xvZkR3UjF0M011MUo5UXNWdEZTVXpwRTBuUEl4QnNGWlZwaWtwenVRWTB4MitjMDZsa2gxUUY2CjEyUzRaRG5OeWUydjdVc0RTS2VnbVFHQTNHV2pOcTVsV1VoUGdrdklaZkZYSGVWWkxnby9iTmpSOWVVSnRHeFVBQXJnRlUySGRXMjMKV0paYTNXM1NBS0QwbTBpK3d6ZWt1amJnZkllRmx4b1ZvdDR1b2x1OXJ4ajVrRkROY0ZuNEoyZEh5OGVnQnpwOTBTeGRiQms2WnJWOQovWkZ2Z3JHK0NKUGJGRWZ4b2pmSFJaNDh4M2V2WktpVDMvWnBnNEpnOGtsQ05PMWFBRlNGSEJZMmtneGMrcWF0djlzPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBZmZpcm1UcnVzdCBQcmVtaXVtCj09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZSakNDQXk2Z0F3SUJBZ0lJYll3VVJyR21DdTR3RFFZSktvWklodmNOQVFFTUJRQXdRVEVMTUFrR0ExVUVCaE1DVlZNeEZEQVMKQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVJ3d0dnWURWUVFEREJOQlptWnBjbTFVY25WemRDQlFjbVZ0YVhWdE1CNFhEVEV3TURFeQpPVEUwTVRBek5sb1hEVFF3TVRJek1URTBNVEF6Tmxvd1FURUxNQWtHQTFVRUJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHliVlJ5CmRYTjBNUnd3R2dZRFZRUUREQk5CWm1acGNtMVVjblZ6ZENCUWNtVnRhWFZ0TUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEEKTUlJQ0NnS0NBZ0VBeEJMZnFWLytRZDNkOVorSzQvYXM0VHg0bXJ6WThIOTZvRE1xM0kwZ1c2NHRiK2VUMlRad2FtalBqbEdqaFZ0bgpCS0FRSkc5ZEtJTEJsMWZZU0NrVHR1RytrVTNmaFF4VEdKb2VKS0pQai9DaWhRdkw5Q2wvMHFSWTdpWk55YXFvZTVyWitqamVSRmNWCjVmaU15TmxJNGcwV0p4MGV5SU9GSmJlNnFsVkJ6QU1pU3kyUmpZdm1pYTlteCtuL0srazhyTnJTczhQaGFKeUorSG9BVnQ3MFZaVnMKKzdwazNXS0wzd3QzTXV0aXpDYWFtN3VxWW9OTXRBWjZNTWdwdiswR1RaZTVITVF4SzlWZnZGTVNGNXlaVnlsbWQyRWhNUWN1SlVtZApHUEx1OHl0eGpMVzZPUWRKZC96dkxwS1FCWTB0TDNkNzcwTy9OYnVhMlBsenB5enkwRmZ1S0U0bVg0K1FhQWt2dVBqY0J1a3VtajVSCnA5RWl4QXFuT0Voc3Mvbi9mYXVHVitPNjFvVjRkN3BENmtoLzl0aStJMjBldjlFMmJGaGM4ZTZrR1ZRYTlRUFNkdWJoakwwOHM5TkkKUytMSStIK1NxSFpHbkVKbFBxUWV3UWNEV2tZdHVKZnp0OVd5VlNIdnV0eE1BSmY3RkpVbk03L29RMGRHMGdpWkZtQTdtbjdTNXUwNAo2dXdCSGp4SVZra0p4MHczQUo2SURzQno0VzltNlhKSE1ENFE1UXNEeVpwQ0FHekZsSDVoeElyZmY0SWFDMW5FV1RKM3M3eGdhVlk1Ci9iUUdleXpXWkRiWnZVanRoQjkrcFNLUEtyaEM5SUszMUZPUWVFNHRHdjJCYjBUWE93RjBsa0xnQU9JdWErckY3bktzdTcvKzZxcW8KK056MnNubUt0bWNDQXdFQUFhTkNNRUF3SFFZRFZSME9CQllFRkozQVo2WU1JdGttOVVXcnBtVlNFU2ZZUmF4ak1BOEdBMVVkRXdFQgovd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BMEdDU3FHU0liM0RRRUJEQVVBQTRJQ0FRQ3pWMDBRWWs0NjVLenF1Qnl2Ck1pUElzMGxhVVp4MktJMTVxbGRHRjlYMVV2YTNST2dJUkw4WWhOSUxnTTNGRXYwQVZRVmhoMEhjdFNTZVBNVFl5UHR3bmk5NGxvTWcKTnQ1OEQya1RpS1YxTnBnSXBzYmZyTTdqV05hM1B0NjY4K3MwUU5paWdmVjRQeS9WcGZ6Wm90UmVCQTRYcmY1QjhPV3ljdnBFZ2pOQwo2QzFZOTFhTVlqKzZRckNjREZ4K0xtVW1YRk5QQUxKNGZxRU5tUzJOdUIyT29zU3cvV0RRTUtTT3lBUmlxY1R0TmQ1NmwrME9PRjZTCkw1TndwYW1jYjZkOUV4MSt4Z2hJc1Y1bjYxRUlKZW5tSld0U0taR2Mwamx6Q0ZmZW1RYTBXNTBRQnVIQ0FLaTRIRW9DQ2hUUXdVSEsKKzR3MUlYMkNPUEtwVkpFWk5aT1ViV282eGJMUXU0bUdrK2lieVE4NnAzcTRvZkI0UnZyOE55L2xpb1R6My80RTJhRm9vQzhrNGdtVgpCdFdWeXVFa2x1dDg5cE1GdSsxejZTM1JkVG5YNXlUYjJFNWZRNCtlMEJRNXYxVndTSmxYTWJTYzdrcVlBNVl3SDJBRzdoc2ovb0ZnCkl4cEhZb1dsekJrMGdHK3pyQnJqbi9CN1NLM1ZBZGxudHFseWsrb3Racld5dU9ROVBMTHZUSXpxNndlL3F6V2FWWWE4R0thMXFGNjAKZzJ4cmFVRFRuOXp4dzJscnVlRnRDZlR4cWxCMkNucDllaGVoVlpaQ21URUozV0FSalFVd2Z1YU9SdEdkRk5ySEYrUUZsb3pFSkxVYgp6eFFIc2tENG81NUJocndFMEd1V3lDcUFOUDIvN3dhajNWakZoVDArai82ZUtlQzJ1QWxvR1J3WVF3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MKPT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUIvakNDQVlXZ0F3SUJBZ0lJZEpjbGlzYy9lbFF3Q2dZSUtvWkl6ajBFQXdNd1JURUxNQWtHQTFVRUJoTUNWVk14RkRBU0JnTlYKQkFvTUMwRm1abWx5YlZSeWRYTjBNU0F3SGdZRFZRUUREQmRCWm1acGNtMVVjblZ6ZENCUWNtVnRhWFZ0SUVWRFF6QWVGdzB4TURBeApNamt4TkRJd01qUmFGdzAwTURFeU16RXhOREl3TWpSYU1FVXhDekFKQmdOVkJBWVRBbFZUTVJRd0VnWURWUVFLREF0QlptWnBjbTFVCmNuVnpkREVnTUI0R0ExVUVBd3dYUVdabWFYSnRWSEoxYzNRZ1VISmxiV2wxYlNCRlEwTXdkakFRQmdjcWhrak9QUUlCQmdVcmdRUUEKSWdOaUFBUU5NRjRiRlowRDBLRjVOYmM2UEpKNnloVWN6V0x6bkNaY0J6M2xWUHFqMXN3UzZ2UVVYK2lPR2Fzdkxram1yQmhEZUt6UQpOOE85c3MwczVrZmlHdVpqdUQwdUwzakVUOXYwRDZSb1RGVnlhNVVkVGhoQ2xYak1OenlSNHB0bEt5bWpRakJBTUIwR0ExVWREZ1FXCkJCU2FyeWw2d0JFMU5TWlJNQUREYXY1QTFhN1dQREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQUsKQmdncWhrak9QUVFEQXdObkFEQmtBakFYQ2ZPSGlGQmFyOGpBUXI5SFgvVnNhb2JneENkMDVEaFQxd1YvR3pUanhpK3p5Z2s4TjUzWAo1N2hHOGYyaDRuRUNNRUpaaDBQVVVkKzYwd2t5V3M2SWZsYzluRjlDYS9VSExiWHdncFA1V1crdVpQcFk1WXNlNDJPK3RZSE5id0tNCmVRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQQo9PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdXpDQ0FxT2dBd0lCQWdJREJFVEFNQTBHQ1NxR1NJYjNEUUVCQlFVQU1INHhDekFKQmdOVkJBWVRBbEJNTVNJd0lBWURWUVFLCkV4bFZibWw2WlhSdklGUmxZMmh1YjJ4dloybGxjeUJUTGtFdU1TY3dKUVlEVlFRTEV4NURaWEowZFcwZ1EyVnlkR2xtYVdOaGRHbHYKYmlCQmRYUm9iM0pwZEhreElqQWdCZ05WQkFNVEdVTmxjblIxYlNCVWNuVnpkR1ZrSUU1bGRIZHZjbXNnUTBFd0hoY05NRGd4TURJeQpNVEl3TnpNM1doY05Namt4TWpNeE1USXdOek0zV2pCK01Rc3dDUVlEVlFRR0V3SlFUREVpTUNBR0ExVUVDaE1aVlc1cGVtVjBieUJVClpXTm9ibTlzYjJkcFpYTWdVeTVCTGpFbk1DVUdBMVVFQ3hNZVEyVnlkSFZ0SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjUKTVNJd0lBWURWUVFERXhsRFpYSjBkVzBnVkhKMWMzUmxaQ0JPWlhSM2IzSnJJRU5CTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQwpBUThBTUlJQkNnS0NBUUVBNC90OW8zSzZ3dkRKRklmMWF3Rk80VzVBQjdwdEoxMS85MXN0czFySFVWK3JwREttWVllMmJnK0cwakFDCmwvalhhVmVoR0RsZGFtUjV4Z0ZackR3eFNqaDgwZ1RTU3lqb0lGODdCNkxNVFhQYjg2NVB4MWJWV3FlV2lmcnpxMmpVSTRaWko4OEoKSjd5c2JuS0RIREJ5MytDaTZkTGhkSFVadlNxZWV4VlVCQnZYUXptdFZTakY0aHE3OU1Ea3JqaEpNOHgyaFo4NVJkS2tudklTakZINApmT1F0Zi9Xc1grc1duN0V0MGJyTWtVSjNUQ1hKa0RodjIvRE0rNDRlbDFrKzFXQk81Z1VvN1VsNUUwdTZTTnN2K1hMVE9jcitIOWcwCmN2VzBRTTh4QWNQczNoRXRGMTBmdUZEUlhobW5hZDRITXlqS1VKWDVwMVRMVklaUVJhbjVTUUlEQVFBQm8wSXdRREFQQmdOVkhSTUIKQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJRSWRzM0xCLzhrOXNYTjdidVF2T0tFTjBaMTl6QU9CZ05WSFE4QkFmOEVCQU1DQVFZdwpEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBS2FvclNMT0FUMm1vLzlpMEVpZGkxNXlzSGhFNDl3Y3J3bjlJMGo2dlNyRXVWVUV0UkNqCmpTZmVDNEpqME83ZUREZDVRVnNpc3JDYVFWeW1jT0RVMEhmTEk5TUE0R3hXTCtGcERRM1pxcjhoZ1ZEWkJxV28vNVUzMEtyKzRyUDEKbVMxRmhJcmxRZ25YZEFJdjk0blltZW04SjlSSGpib05SaHgzenhTa0hMbWtNY1NjS0hRRE5QOHpHU2FsNlExMHR6Nlh4bmJvSjVhagpadDNocnZKQlc4cVlWb056Y09TR0d0SXhRYm92dmkwVFduWnZUdWhPZ1E0L1d3TWlvQksrWmxnUlNzc0R4TFFxS2kyV0YrQTVWTHhJCjAzWW5uWm90QnFiSjdEblNxOXVmbWdzbkFqVXBzVUNWNS9ub25GV0lHVWJXdHpUMWZzNDVtdGs0OFZIM1R5dz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVFdDQSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGV6Q0NBbU9nQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQmZNUXN3Q1FZRFZRUUdFd0pVVnpFU01CQUdBMVVFQ2d3SgpWRUZKVjBGT0xVTkJNUkF3RGdZRFZRUUxEQWRTYjI5MElFTkJNU293S0FZRFZRUUREQ0ZVVjBOQklGSnZiM1FnUTJWeWRHbG1hV05oCmRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1EZ3dPREk0TURjeU5ETXpXaGNOTXpBeE1qTXhNVFUxT1RVNVdqQmZNUXN3Q1FZRFZRUUcKRXdKVVZ6RVNNQkFHQTFVRUNnd0pWRUZKVjBGT0xVTkJNUkF3RGdZRFZRUUxEQWRTYjI5MElFTkJNU293S0FZRFZRUUREQ0ZVVjBOQgpJRkp2YjNRZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUUN3Zm5LNHBBT1U1cWZlQ1RpUlNoRkFoNmQ4V1dRVWU3VVJFTjMrdjlYQXUxYmloU1gwTlhJUCtGUFFRZUZFQWNLMEhNTXgKUWhaSGhUTWlkcklLYncvbEpWQlBoWWErdjVndUVHY2V2aEVGaGdXUXhGblFmSGdRc0lCY3QrSEhLM1hMZkordXRkR2RJemRqcDl4QwpvaTJTQkJ0UXdYdTRQaHZKVmdTTEwxS2JyYWxXNmNIL3JhbFloekMyZ2ZlWFJmd1pWenNyYitSSDlKbEYvaDN4K0plamlCMDNIRnlQCjRIWWxtbEQ0b0ZUL1JKQjJJOUl5eHNPckJyLzgrNy96clgyU1lnSmJLZE0xbzVPYVEyUmdYYkw2TXY4N0JLOU5RR3I1eCtQdkkvMXIKeStVUGl6Z043Z3I4L2crWW56QXgzV3hTWmZtTGdiNGk0UnhZQTdxUkc0a0hBZ01CQUFHalFqQkFNQTRHQTFVZER3RUIvd1FFQXdJQgpCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJxT0ZzbWpkNkxXdkpQZWxTREdSampDRFdtdWpBTkJna3Foa2lHCjl3MEJBUVVGQUFPQ0FRRUFQTlYzUGRyZmlicUhEQWhVYWlCUWtyNndRVDI1Sm1TRENpL29RTUNYS0NlQ01FckprLzlxNTZZQWY0bEMKbXRZUjVWUE9MOHp5MmdYRS91SlF4RHFHZmN6YWZoQUpPNUkxS2xPeS91c3JCZGxzWGViUTc5TnFacDRWS0lWNjZJSUFyQjZuQ1dsVwpRdE5vVVJpK1ZKcS9SRUc2U2I0Z3VtbGM3cmgzemM1c0g2MkRsaGg5RHJVVU9ZVHhLT2t0bzU1N0hucHlXb096ZVcvdnRQelFDcVZZClQwYmYrMjE1V2ZLRUlsS3VEOHo3ZkR2bmFzcEhZY042K05PU0JCKzRJSVRoTmxRV3gwRGVPNHB6M04vR0NVemY3TnIvMUZOQ29jbnkKWWgwaWd6eVh4ZmtaWWllc1pTTFgwenpHNVk2eVU4eEp6cnd3L25zT001RDc3ZElVa1I4SHJ3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGR6Q0NBbCtnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQmRNUXN3Q1FZRFZRUUdFd0pLVURFbE1DTUdBMVVFQ2hNYwpVMFZEVDAwZ1ZISjFjM1FnVTNsemRHVnRjeUJEVHk0c1RGUkVMakVuTUNVR0ExVUVDeE1lVTJWamRYSnBkSGtnUTI5dGJYVnVhV05oCmRHbHZiaUJTYjI5MFEwRXlNQjRYRFRBNU1EVXlPVEExTURBek9Wb1hEVEk1TURVeU9UQTFNREF6T1Zvd1hURUxNQWtHQTFVRUJoTUMKU2xBeEpUQWpCZ05WQkFvVEhGTkZRMDlOSUZSeWRYTjBJRk41YzNSbGJYTWdRMDh1TEV4VVJDNHhKekFsQmdOVkJBc1RIbE5sWTNWeQphWFI1SUVOdmJXMTFibWxqWVhScGIyNGdVbTl2ZEVOQk1qQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCCkFOQVZPVkt4VXJPNnhWbUN4RjFTcmpwRFpZQkx4L0tXdk5zMmw5YW1aSXlvWHZEakNoejMzNWM5UzY3Mlhld2h0VUdyemJsK2RwKysKK1Q0Mk5LQTd3Zll4RVVWMGt6MVhnTVg1aVpuSzVhdHExTFhhUVpBUXdkYldRb25Ddi9RNEVwVk1WQVgzTnVSRmczc1VaZGJjREUzUgozbjRNcXp2RUZiNDZWcVphYjNacFVxbDZ1Y2pyYXBwZFV0QXRDbXMxRmdrUWhOQnF5am9HQURkSDVINVhUeitMNjJlNGlLckZ2bE5WCnNwSEVmYm13aFJrR2VDN2JZUnI2aGZWS2thSG5GdFdPb2puZmxMaHdIeWcvaS94QVhtT0RQSU1xR3Bscno5NVphanY4YnhiWEgvMUsKRU90T2doWTZyQ2NNVS9HdDFTU3dhd05Rd1MwOEZ0MUVOQ2NhZGZzQ0F3RUFBYU5DTUVBd0hRWURWUjBPQkJZRUZBcUZxWGRsQlpoOApRSUg0RDVjc09QRUs3RHpQTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTBHQ1NxR1NJYjNEUUVCCkN3VUFBNElCQVFCTU9xTkVyTGxGc2NlVGZzZ0xDa0xmWk9vYzdsbHNDTHFKWDJyS1NwV2VlbzhIeGRwRmNvSnhEanJTekcrbnRLRWoKdS9Za244c1gvb3ltenNMUzI4eU4vSEg4QXluQmJGMHpYMlMyWlR1SmJ4aDJlUFhjb2tnZkdUK09rK3Z4K2hmdXpVN2pCQkpWMXVYawozZnMrQlh6aUhWN0dwN3lYVDJnNjlla3VDa08ycjFkY1ltaDh0LzJqaW9TZ3JHSytLd21ITlBCcUFidWJLVlk4L2dBM3p5TnM4VTZxCnRuUkdFbXlSN2pUVjdKcVI1MFMra0RGeTFVa0M5Z0xsOUIvcmZObVdWYW4vN0lyNW1VZi9OVm9DcWdUTGlsdUhjU21SdmFTMGVnMjkKbXZWWEl3QUhJUmMvU2puUkJVa0xwN1kzZ2FWZGpLb3pYb0VvZktkOUorc0FybzAzCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFjdGFsaXMgQXV0aGVudGljYXRpb24gUm9vdCBDQQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ1ekNDQTZPZ0F3SUJBZ0lJVndvUmwwTEU0OHd3RFFZSktvWklodmNOQVFFTEJRQXdhekVMTUFrR0ExVUVCaE1DU1ZReERqQU0KQmdOVkJBY01CVTFwYkdGdU1TTXdJUVlEVlFRS0RCcEJZM1JoYkdseklGTXVjQzVCTGk4d016TTFPRFV5TURrMk56RW5NQ1VHQTFVRQpBd3dlUVdOMFlXeHBjeUJCZFhSb1pXNTBhV05oZEdsdmJpQlNiMjkwSUVOQk1CNFhEVEV4TURreU1qRXhNakl3TWxvWERUTXdNRGt5Ck1qRXhNakl3TWxvd2F6RUxNQWtHQTFVRUJoTUNTVlF4RGpBTUJnTlZCQWNNQlUxcGJHRnVNU013SVFZRFZRUUtEQnBCWTNSaGJHbHoKSUZNdWNDNUJMaTh3TXpNMU9EVXlNRGsyTnpFbk1DVUdBMVVFQXd3ZVFXTjBZV3hwY3lCQmRYUm9aVzUwYVdOaGRHbHZiaUJTYjI5MApJRU5CTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUFwOGJFcFNta0xPL2xHTVd3VUtOdlVUdWZDbHJKCndrZzRDc0ljb0JoL2tiV0h1VUEvM1Ixb0h3aUQxUzBlaUtENGoxYVBiWmtDa3BBVzFWOEliSW5YNGF5OElNS3g0SU5SaW1sTkFKWmEKYnkvQVJINmpEdVNSelZqdTNQdkhIa1ZIM1NlNUNBR2ZwaUVkOVVFdEwwejlLSzNnaXEwaXRGWmxqb1pVajVOREtkNDVSbmlqTUNPNgp6ZkI5RTFmQVhkS0RhMGhNeEt1ZmdGcGJPcjNKcHlJL2dDY3pXdzYzaWd4ZEJ6Y0l5MnpTZWtjaVJEWEZ6TXd1anQwcTdiZDlaZzFmCllWRWlWUnZqUnVQalBkQTFZcHJicnhUSVc2SE1pUnZoTUNiOG9Kc2ZnYWRISHdUcm96bVNCcCtaMDcvVDZrOVFuQm4rbG9jZVBHWDIKb3hna2c0WVE1MVErcURwMkpFK0JJY1hqRHdMNGs1UkhJTHYrMUE3VGFMbmR4SHFFZ3VOVFZIbmQyNXpTOGdlYkxyYThQdTJGYmU4bApFZktYR2tKaDkwcVg2SXV4RUFmNlpZR3lvam5QOXp6L0dQdkc4VnFMV2VJQ3JIdVMwRTRVVDFsRjlneGVLRit3NkQ5Rno4K3ZtMi83CmhOTjNXcFZ2ckpTRW51Njh3RXFQU3BQNFJDSGlNVVZoVUU0UTJPTTFmRXdadE40RnY2TUduOGkxemVRZjF4Y0dEWHFWZEZVTmFCcjgKRUJ0aVpKMXQ0SldndzVRSFZ3MFU1cjBGKzdpZjV0K0w0c2JuZnBiMlU4V0FORkFvV1BBU1VIRVhNTHJtZUdPODlMS3RteXV5L3VFNQpqRjY2Q3lDVTNudUR1UC9qVm8yM0VlazdqUEt4d1YyZHBBdE1LOW15R1BXMW4wc0NBd0VBQWFOak1HRXdIUVlEVlIwT0JCWUVGRkxZCmlEckluM2htN1luemV6aHdsTWtDQWpiUU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0h3WURWUjBqQkJnd0ZvQVVVdGlJT3NpZmVHYnQKaWZON09IQ1V5UUlDTnRBd0RnWURWUjBQQVFIL0JBUURBZ0VHTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFBTGUzS0h3R0NtU1V5SQpXT1lkaVBjVVpFaW0yRmdLRGs4VE5kODFIZFR0QmpISWdUNXExZDA3R2pMdWtEMFIwaTcwanNOakxpTm1zR2UrYjdiQUV6bGdxcUkwCkpaTjFVdDZubmEwT2g0bFNjV29XUEJrZGcvaWFLV1crOUQrYTJmRHpXb2NoY1lCTnkrQTRteis3K3VBd1RjK0cwMlVRR1JqUmx3S3gKSzNKQ2FLeWd2VTVhMmhpL2E1aUIwUDJhdmw0VlNNMFJGYm5BS1Z5MDZJajNQamF1dDJMOUhtTGVjSGdRSEVoYjJyeWtPTHBuN1ZVKwpYbGZmMUFOQVRJR2swazlqcHdsQ0NSVDhBS25DZ0hOUExzQkEyUkY3U09wNkFzRFQ2eWdCSmxoMHdjQnpJbTJUbGYwNWZic3E0L2FDCjR5eVhYMDRma1pUNi9peWoySFlhdUUyeU9FK2IraDFJWUhrbTR2UDlxZENhNkhDUFNYclc1YjBLRHRzdDg0Mi82K09rZmN2SGxYSG8KMnFOOHhjTDRkSklFRzRhc3BDSlRRTGFzL2t4MnovdVVNc0ExbjNZL2J1V1FicUNtSnFLNExMN1JLNFg5cDJqSXVnRXJzV3gwSGJoegpsZWZ1dDhjbDhBQk1BTEordGd1TEhQUEFVSjRsdWVBSTNqWm0vemVsMGJ0VVpDekpKN1ZMa241bC85TXQ0YmxPdkgra1FTR1FRWGVtCk9SL3FudU9mMEdadkJleXFkbjYvYXhhZzY3WEgvSkpVTHlzUkp5VTNlRXhSYXJEenpGaGRGUEZxU0JYL3dnZTJzWTBQamx4UVJyTTkKdndHWVQ3SlpWRWMrTkh0NGJWYVRMblBxWmloNHpSMFV2NkNQTHk2NExvN3lGSXJNNmJWOCsyeWRES1hobGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpCdXlwYXNzIENsYXNzIDIgUm9vdCBDQQo9PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRldUQ0NBMEdnQXdJQkFnSUJBakFOQmdrcWhraUc5dzBCQVFzRkFEQk9NUXN3Q1FZRFZRUUdFd0pPVHpFZE1Cc0dBMVVFQ2d3VQpRblY1Y0dGemN5QkJVeTA1T0RNeE5qTXpNamN4SURBZUJnTlZCQU1NRjBKMWVYQmhjM01nUTJ4aGMzTWdNaUJTYjI5MElFTkJNQjRYCkRURXdNVEF5TmpBNE16Z3dNMW9YRFRRd01UQXlOakE0TXpnd00xb3dUakVMTUFrR0ExVUVCaE1DVGs4eEhUQWJCZ05WQkFvTUZFSjEKZVhCaGMzTWdRVk10T1Rnek1UWXpNekkzTVNBd0hnWURWUVFEREJkQ2RYbHdZWE56SUVOc1lYTnpJRElnVW05dmRDQkRRVENDQWlJdwpEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTmZIWHZmQkI5UjMrME1oOVBUMWFlVHVNZ0hibzRZZjVGa051dWQxCmcxTHI2aHhoRlVpN0hRZktqSzZ3M0phZDZzTmdrb2FDS0hPY1ZnYi9TMlR3RENvM1NiWGx6d3g4N3ZGS3UzTXdaZlBWTDRPMmZ1UG4KOVo2cllQblQ4WjJTZElya0hKYXNXNERwdGZReGg2TlIvTWQrb1crT1UzZlVsOEZWTTVJK0dDOTExSzJHU2N1VnIxUUdiTmdHRTQxYgovK0VtR1ZuQUpMcUJjWG1RUkZCb0pKUmZ1TE1SOFNsQllhTkJ5eU0yMWNIeE1sQVFUbi8waHBQc2hOT092RXUvWEFGT0J6M2NGSXFVCkNxVHFjL3NMVWVnVEJ4ajZEdkVyMFZRVmZUemg5N1FaUW1kaVhuZmdvbFhzdHRscEY5VTZyMFR0U3NXZTVIb25mT1YxMTZyTEplZmYKYXdyYkQwMlRUcWlnelhzdThsa0JhcmNOdUFlQmZvczRHemptQ2xlWlBlNGg2S1AxREJiZGkrdzBqcHdxSEFBVkY0MW9nOUp3bnhnSQp6UkZvMWNsclVzM0VSby9jdGZQWVYzTWU2WlE1QkwvVDNqamV0RlBzYVJ5aWZzU1A1QnR3cmZLaStmdjNGbVJtYVo5SlVhTGlGUmhuCkJrcC8xV3kxVGJNejRHSHJYYjdwbUE4eTF4MUxQQzVhQVZLUkNmTGY2bzNZQmtCanFoSGsvc00zbmhSU1AvVGl6UEpoazlIOVoydlgKVXE2L2FLdEFRNkJYTlZONDhGUDRZVUlIWk1iWGI1dE1PQTFqckdLdk5vdWljd29OOVNHOWRLcE42bklEU2R2SFh4MWlZOGY5M1pIcwpNKzcxYmJSdU1HamV5Tlltc0hWZWU3UUhJSmloZGpLNFRXeFBBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEClZSME9CQllFRk1tQWQrQmlrb0wxUnB6enV2ZE13OTY0bzYwNU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBTkJna3Foa2lHOXcwQkFRc0YKQUFPQ0FnRUFVMThoOWJxd09sSTVMSkt3YkFESjc4NGc3d2J5bHA3cHBIUi9laGI4dC9XMit4VWJQNnVtd0hKZEVMRng3cnhQNDYycwpBMjB1Y1M2dnhPT3RvNzBNRWFlMC8wcXlleEFRSDZkWFFiTEFydlFzV2RaSEVJanpJVkVwTU1wZ2hxOUdxeDN0T2x1d2xONUU0MEVJCm9zSHNIZGI5VDdiV1I5QVVDOHJteXJWN2QzNUJIMTZEeDdhTU9aYXdQNWFCUVc5Z2tPTG8rZnNpY2RsOXN6MUd2N1NFcjVBY0Q0OFMKYXEvdjdoNTZyZ0pLaWhjcmR2NnNWSWtrTEU4L3RyS25Ub3lva1pmN0tjWjdYQzI1eTJhMnQ2aGJFbEdGdFFsK1luaHcvcWxxWUxZZApEbmtNL2NycUpJQnl3NWMvOG5lclF5SUt4K3UyRElTQ0xJQnJRWW9Jd091bGE5K1pFc3VLMVY2QURKSGdKZ2cyU01YNk9CRTEveVdECkxmSjZ2OXI5anY2bHkwVXNIOFNJVTY1M0R0bWFkc1dPTEIyanV0WHNNcTdBcXF6MzBYcE42OVFINGtqM0lvNndwSjlxem82eXNtRDAKb3lMUUkrdVVXbnBwM1ErL1FGZXNhMWxRMmFPWjRXNytqUUY1SnlNVjNwS2Rld2xOV3VkTFNEQmFHT1lLYmVhUDROSzc1dDk4YmlHQwp3V2c1VGJTWVdHWml6RXFRWHNQNkp3U3hlUlYwbWN5K3JTRGVKbUFjNjFaUnBxUHE1S00vcC85aDNQRmFUV3d5STBQdXJLanU3a29TCkNUeGRjY0srZWZyQ2gyZ2RDLzFjYWN3RzBKcDlWSmtxeVRrYUdhOUxLa1B6WTExYVdPSXY0eDNrcWRiUUN0Q2V2OWVCQ2ZISnh5WU4KckpnV1ZxQT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQnV5cGFzcyBDbGFzcyAzIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZXVENDQTBHZ0F3SUJBZ0lCQWpBTkJna3Foa2lHOXcwQkFRc0ZBREJPTVFzd0NRWURWUVFHRXdKT1R6RWRNQnNHQTFVRUNnd1UKUW5WNWNHRnpjeUJCVXkwNU9ETXhOak16TWpjeElEQWVCZ05WQkFNTUYwSjFlWEJoYzNNZ1EyeGhjM01nTXlCU2IyOTBJRU5CTUI0WApEVEV3TVRBeU5qQTRNamcxT0ZvWERUUXdNVEF5TmpBNE1qZzFPRm93VGpFTE1Ba0dBMVVFQmhNQ1RrOHhIVEFiQmdOVkJBb01GRUoxCmVYQmhjM01nUVZNdE9UZ3pNVFl6TXpJM01TQXdIZ1lEVlFRRERCZENkWGx3WVhOeklFTnNZWE56SURNZ1VtOXZkQ0JEUVRDQ0FpSXcKRFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUtYYUNwVVdVT09WOGw2ZGRqRUdNbnFiOFJCMnVBQ2F0VkkyelNSSApzSjhZWkx5YTl2clZlZGlRWWt3aUw5NDRQZGJncU9rY0xOdDRFZW1PYUZFVmNzZnpNNGZrb0YwTFhPQlhCeW93OWMzRU4zY29UUmlSCjVyL1ZVdjF4TFhBKzU4YkVpdVB3S0F2MGRwaWhpNGRWc2pvVC9MYytKemVPSXVPb1R5cnZZTHM5dHpuRERnRkhtVjBTVDl0RCtsZWgKN2ZtZHZoRkhKbHNUbUt0ZEZvcXdOeHhYblVYL2lKWTJ2N3ZLQjN0dmgyUFgwREpxMWwxc0RQR3piam5pYXpFdU9RQW5GTjQ0d093Wgpab1lTNkoxeUZoTmtVc2VwTnh6OWdqRHRoQmdkOUs1Yy8zQVRBT3V4OVRONlM5WlYrQVdOUzJtdzliTW9ObHdVeEZGelRXc0w4VFFICjJ4YzUxOXdvZTJ2MW4vTXV3VThYS2hEenpNcm82LzFycXk2YW55MkNiZ1RVVWdHVExUMkcvSDc4Mys5Q0hhWnI3N2tneHZlOW9LZVYKL2FmbWlTVFl6SXcwYk9Jakw5a1NHaUc1VlpGdkM1RjVHUXl0UUlnTGNPSjYwZzdZYUVpN2doTTVFRmpwMkNvSHhoTGJXTnZTTzFVUQpSd1VWWjJKK0dHT21SajhKRGxReVhyOE5Zbm9uNzREbzI5bExCbG8zV2lYUUNCSjMxRzhKVUpjOXlCM0QzNHhGTUZiRzAyU3JadlBBClhwYWN3OFR2dzN4cml6cDVmN05KenozaWlaK2dNRXVGdVp5VUpIbVBmV3VwUldnUEs5RHgyaHpMYWJqS1NXSnR5TkJqWXQxZ0QxaXEKajZHOEJhVm1vczhiZHJLRVpMRk1PVkxBTUxyd2pFc0NzTGEzQWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRApWUjBPQkJZRUZFZTR6Zi9sYis3NHN1d3ZUZzc1SmJDT1BHdkRNQTRHQTFVZER3RUIvd1FFQXdJQkJqQU5CZ2txaGtpRzl3MEJBUXNGCkFBT0NBZ0VBQUNBalFUVUVrTUpBWW1EdjRqVk0xeitzNGpTUXVLRnZkdm9XRnFSSU55enBrTUx5UFBnS245aUI1YnRiMmlVc3BLZFYKY1NReTlzZ0w4cnhxK0pPc3NnZkNYNS9iek1pS3FyNXFiK0ZKRU13eDE0Qzd1OGpZb2c1a1YrcWk5Y0twTVJYU0lHcnMvQ0lCS00rRwp1SUFlcWN3UnBUenlGck5IbmZ6U2dDSEV5OUJIY0VHaHlvTVpDQ3h0OGwxM25Jb1VFOVEySEpMdzVRWTMzS2Jta0pzNGoxeHJHMGFHClEwSmZQZ0VIVTFSZFpYMzNpbk9obWxSYUh5bERGQ2ZDaFErMWlIc2FPNVMzSFdDbnRaem5LV2xYV3B1VGVrTXdHd1BYWXNoQXBxcjgKWk9SSzE1RlRBYWdnaUc2Y1gwUzV5MkNCTk94djAzM2FTRi9ydEpDOExha2NDNndjMWFKb0lJQUUxdnl4ankrN1NqRU5Tb1ljNitJMgpLU2IxMnRqRThuVmh6MzZ1ZG1OS2VrQmxrNGY0SG9DTWh1V0cxbzhPL0ZNc1lPZ1dZUnFpUGtON3pUbGdWR3IxOG9rbUFXaURTS0l6CjZNa0VrYklSTkJFKzZ0QkRHUjhEazVBTS8xRTlWL1JCYnVITG9MN3J5V1BOYmN6aytEYXFhSjN0dlYyWGNFUU50ZzQxM09FTVhidWcKVVpUTGZoYnJFUytqa2tYSVRISFp2TW1aVWxkR0wxRFB2VFZwOUQwVnpnYWxMQTgrOW9HNmxMdkR1NzlsZU5LR2VmOUpPeHFERFBEZQplT3pJOGsxTUd0NkNLZmpCV3RydDd1WW5YdWhGMEowY1VhaG9xMFRqMEl0cTQvZzd1OXhOMTJUeVViN21xcXRhNlRIdUJyeHp2eE5pCkNwL0h1WmM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHd6Q0NBcXVnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0JnakVMTUFrR0ExVUVCaE1DUkVVeEt6QXBCZ05WQkFvTQpJbFF0VTNsemRHVnRjeUJGYm5SbGNuQnlhWE5sSUZObGNuWnBZMlZ6SUVkdFlrZ3hIekFkQmdOVkJBc01GbFF0VTNsemRHVnRjeUJVCmNuVnpkQ0JEWlc1MFpYSXhKVEFqQmdOVkJBTU1IRlF0VkdWc1pWTmxZeUJIYkc5aVlXeFNiMjkwSUVOc1lYTnpJRE13SGhjTk1EZ3gKTURBeE1UQXlPVFUyV2hjTk16TXhNREF4TWpNMU9UVTVXakNCZ2pFTE1Ba0dBMVVFQmhNQ1JFVXhLekFwQmdOVkJBb01JbFF0VTNsegpkR1Z0Y3lCRmJuUmxjbkJ5YVhObElGTmxjblpwWTJWeklFZHRZa2d4SHpBZEJnTlZCQXNNRmxRdFUzbHpkR1Z0Y3lCVWNuVnpkQ0JEClpXNTBaWEl4SlRBakJnTlZCQU1NSEZRdFZHVnNaVk5sWXlCSGJHOWlZV3hTYjI5MElFTnNZWE56SURNd2dnRWlNQTBHQ1NxR1NJYjMKRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDOWRaUHdZaUp2Sks3Z2VuYXNmYjNaSk5XNHQvek44RUxnNjNpSVZsNmJtbFFkVFF5Swo5dFBQY1BSU3RkaVRCT05HaG5GQlNpdndLaXhWQTlaSXcrQTVPTzN5WER3L1JMeVRQV0dyVHMwTnZ2QWdKMWdPUkg4RUdvZWwxNVlVCk5wRFFTWHVoZGZzYWEzT3grTTZwQ1N6eVU5WERGRVM0aHFYMml5czUycU16Vk5uNmNocjNJaFVjaUpGcmYyYmx3MnFBc0NUejM0WkYKaVAwWmYzV0hIeCt4R3dwekpGdTVaZUFzVk1oZzAyWVhQK0hNVkROemtRSTZwbjk3ZGptaUg1YTJPSzYxeUpOMEhaNjV0T1ZnblM5VwowZURyWGx0TUVuQU1iRVFncXhIWTlCbjIwcHhTTitmNnRzSXhPMHJVRkptdHh4cjFYVi82QjdoOERSL1dneDZ6QWdNQkFBR2pRakJBCk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJTMUEvZDJPMkdDYWhLcUdGUHIKQXlHVXYvN095akFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBVmozdmxOVzkybk95V0w2dWtLMllKNWYrQWJHd1VnQzRUZVFiSVhRYgpmc0R1WG1rcUphOWMxaDNhMG5uSjg1Y3A0SWFIM2dSWkQvRloxR1NGUzVtdkpRUWV5VWFwbDk2Q3NodHduNXoycjNFeDNYc0ZwU3pUCnVjcEg5c3J5OXVldHVVZy92QmEzd1czMDZnbXY3UE8xNXdXZXBoNktVMUhXazRITWRKUDJ1ZHFtSlFWMGVWcCtRRDZDU3lZUk1HN2gKUDBISFJ3QTExZlhUOTFRK2dUM2FTV3Fhcys4UVBlYnJiOUhJSWtmTHpNOEJNWkxaR09NaXZna2VHajVhc3VSckRGUjZmVU5PdUltbAplOWVpUFphR3pQSW1OQzFxa3AyYUd0QXc0bDFPQkxCZml5QitkOEU5bFlMUlJwbzdQSGk0YjZIUURXU2llQjRwVHBQRHBGUVVXdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNekNDQXh1Z0F3SUJBZ0lEQ1lQek1BMEdDU3FHU0liM0RRRUJDd1VBTUUweEN6QUpCZ05WQkFZVEFrUkZNUlV3RXdZRFZRUUsKREF4RUxWUnlkWE4wSUVkdFlrZ3hKekFsQmdOVkJBTU1Ia1F0VkZKVlUxUWdVbTl2ZENCRGJHRnpjeUF6SUVOQklESWdNakF3T1RBZQpGdzB3T1RFeE1EVXdPRE0xTlRoYUZ3MHlPVEV4TURVd09ETTFOVGhhTUUweEN6QUpCZ05WQkFZVEFrUkZNUlV3RXdZRFZRUUtEQXhFCkxWUnlkWE4wSUVkdFlrZ3hKekFsQmdOVkJBTU1Ia1F0VkZKVlUxUWdVbTl2ZENCRGJHRnpjeUF6SUVOQklESWdNakF3T1RDQ0FTSXcKRFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU5PeVNzOTZSKzkxbXlQNk9pL1dVRVdKTlRyR2E5disyd0JvcU9BRApFUjAzVUFpZlRVcG9sRFd6VTlHVVk2Y2dWcS9lVVhqc0tqM3pTRWhRUGdyZlJsV0xKMjNERUUwTmtWSkQySWZnWFU0MnRTSEtYemxBCkJGOWJmc3lqeGl1cFFCN1pOb1RXU1BPU0hqUkdJQ1RCcEZHT1NocnZVRDlwWFJsL1JjUEhBWTlSeVNQb2NxNjB2RllKZnhMTEhMR3YKS1pBS3lWWE1EOU8wR3UxSE5WcEs3Wnh6QkNIUXFyME1FN1VBeWlac3hHc01sRnFWbE5wUW12SC9wU3RtTWFUSk9LRGZIUis0Q1M3egpwK2huVXF1VkgrQkdQdGlrdzhwYXhUR0E2RWlhbjVScC9obmQySE44Z2NxVzNvN3RzeklGWllRMDV1YjlWeEMxWDNhL0w3QVFEY1VDCkF3RUFBYU9DQVJvd2dnRVdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGUDNhRk1TZk1ONGh2UjVDT2Z5cll5TkoKNFBHRU1BNEdBMVVkRHdFQi93UUVBd0lCQmpDQjB3WURWUjBmQklITE1JSElNSUdBb0g2Z2ZJWjZiR1JoY0RvdkwyUnBjbVZqZEc5eQplUzVrTFhSeWRYTjBMbTVsZEM5RFRqMUVMVlJTVlZOVUpUSXdVbTl2ZENVeU1FTnNZWE56SlRJd015VXlNRU5CSlRJd01pVXlNREl3Ck1Ea3NUejFFTFZSeWRYTjBKVEl3UjIxaVNDeERQVVJGUDJObGNuUnBabWxqWVhSbGNtVjJiMk5oZEdsdmJteHBjM1F3UTZCQm9EK0cKUFdoMGRIQTZMeTkzZDNjdVpDMTBjblZ6ZEM1dVpYUXZZM0pzTDJRdGRISjFjM1JmY205dmRGOWpiR0Z6YzE4elgyTmhYekpmTWpBdwpPUzVqY213d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFIK1gyekRJMzZTY2ZTRjZnSERPRkJKcGlCU1ZZRVFCckxMcE1FK2JVTUptCjJINk5NTFZ3TWVuaWFjZnpjTnNnRlliUURmQytyQUYxaE01K24wMi90MkE3blBQS0hlSmVhTmlqblpmbFFHRFNOaUgrMExTNEY5cDAKbzMvVTM3Q1lBcXh2YTJzc0pTUnlvV1h1SlZybDVqTG44dCtyU2ZyemtHa2oyd1RaNTF4WS9HWFVsNzdNL0M0S3pDVXFOUVQ0WUpFVgpkVDFCL3lNZkdjaHM2NEpUQktia1RDSk5qWXk2emx0ejdHUlVVRzNSbkZYN2FjTTJ3NHk4UElXbWF3b21EZUNUbUdDdWZzWWtsNHBoClg1R09acElKaHpiTmk1c3RQdlpSMUZEVVdTaTlnL0xNS0h0VGhtM1lKb2h3MStxUnpUNjV5c0NRYmxyR1huUmwxMXorbytJPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpELVRSVVNUIFJvb3QgQ2xhc3MgMyBDQSAyIEVWIDIwMDkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFUXpDQ0F5dWdBd0lCQWdJRENZUDBNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1GQXhDekFKQmdOVkJBWVRBa1JGTVJVd0V3WURWUVFLCkRBeEVMVlJ5ZFhOMElFZHRZa2d4S2pBb0JnTlZCQU1NSVVRdFZGSlZVMVFnVW05dmRDQkRiR0Z6Y3lBeklFTkJJRElnUlZZZ01qQXcKT1RBZUZ3MHdPVEV4TURVd09EVXdORFphRncweU9URXhNRFV3T0RVd05EWmFNRkF4Q3pBSkJnTlZCQVlUQWtSRk1SVXdFd1lEVlFRSwpEQXhFTFZSeWRYTjBJRWR0WWtneEtqQW9CZ05WQkFNTUlVUXRWRkpWVTFRZ1VtOXZkQ0JEYkdGemN5QXpJRU5CSURJZ1JWWWdNakF3Ck9UQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUpueGhEUnd1aSszTUtDT3ZYd0V6NzVpdkpuOWdwZlMKZWdwbmxqZ0o5aEJPbFNKem1ZM2FGUzNuQmZ3WmN5SzNqcGdBdkR3OXJLRnMrOVo1SlV1dDhNeGsyb2crS2JnUENkTTAzVFAxWXRIaAp6Um5wN2hoUFRGaXU0aDdXREZzVld0ZzZ1TVFZWkI3ak03SzFpWGRPREwvWmxHc1RsMjhTby82WnFRVE1GZXhnYURidENIdTM5YitUCjdXWXhnNHpHY1RTSFRoZnFyNHVSalJ4V1FhNGlOMTQzOGgzWjBTME5MMmxScDc1bXBvbzZLcjNIR3JIaEZQQytPaDI1ejF1eGF2NjAKc1VZZ292c2VPM0R2azVoOWpIT1c4c1h2aFhDdEtTYjhIZ1ErSEtEWUQ4dFNnMko4N290VGxaQ3BWNkxxWVFYWStVM0VKL3B1cmUzNQoxMUgzYTZVQ0F3RUFBYU9DQVNRd2dnRWdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGTk9VaWt4aUV5b1pMc3l2CmNvcDlOdGVhSE54bk1BNEdBMVVkRHdFQi93UUVBd0lCQmpDQjNRWURWUjBmQklIVk1JSFNNSUdIb0lHRW9JR0JobjlzWkdGd09pOHYKWkdseVpXTjBiM0o1TG1RdGRISjFjM1F1Ym1WMEwwTk9QVVF0VkZKVlUxUWxNakJTYjI5MEpUSXdRMnhoYzNNbE1qQXpKVEl3UTBFbApNakF5SlRJd1JWWWxNakF5TURBNUxFODlSQzFVY25WemRDVXlNRWR0WWtnc1F6MUVSVDlqWlhKMGFXWnBZMkYwWlhKbGRtOWpZWFJwCmIyNXNhWE4wTUVhZ1JLQkNoa0JvZEhSd09pOHZkM2QzTG1RdGRISjFjM1F1Ym1WMEwyTnliQzlrTFhSeWRYTjBYM0p2YjNSZlkyeGgKYzNOZk0xOWpZVjh5WDJWMlh6SXdNRGt1WTNKc01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQTA3WHRhUEtTVWlPOGFFWFVITDdQKwpQUG9lVVNicmgvWXAzdUR4MU1Za0NlbkJ6MVVidEREWnpocitCbEdtRmFRdDc3Skx2eUFvSlVuUnBqWjNOT2hrMzFLeEVjZHplczA1Cm5zS3RqSEVoOGxwcnI5ODhUbFd2c29SbEZJbTVkOHNxTWI3UG8yM1BiMGlVTWtadjUzR01vS2FFR1RjSDhnTkZDU3VHZFh6ZlgybFgKQU50dTJLWnlJa3RRMUhXWVZ0KzNHUDlEUTFDdWVrUjc4SGxSMTBNOXA5T0IwL0RKVDduYXhwZUcwSUxENUVKdC9yRGlaRTRPSnVkQQpOQ2ExQ0luWENHTmpPQ2QxSGpQcWJxamRuNWxQZEUyQmlZQkwzWnFYS1Z3dnZvRkJ1WXovNm4xZ0JwN04xejNUTHFNVnZLam1KdVZ2Cnc5eTRBeUhxbnhieExGUzEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ0EgRGlzaWcgUm9vdCBSMgo9PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYVRDQ0ExR2dBd0lCQWdJSkFKSzRpTnV3aXNGak1BMEdDU3FHU0liM0RRRUJDd1VBTUZJeEN6QUpCZ05WQkFZVEFsTkxNUk13CkVRWURWUVFIRXdwQ2NtRjBhWE5zWVhaaE1STXdFUVlEVlFRS0V3cEVhWE5wWnlCaExuTXVNUmt3RndZRFZRUURFeEJEUVNCRWFYTnAKWnlCU2IyOTBJRkl5TUI0WERURXlNRGN4T1RBNU1UVXpNRm9YRFRReU1EY3hPVEE1TVRVek1Gb3dVakVMTUFrR0ExVUVCaE1DVTBzeApFekFSQmdOVkJBY1RDa0p5WVhScGMyeGhkbUV4RXpBUkJnTlZCQW9UQ2tScGMybG5JR0V1Y3k0eEdUQVhCZ05WQkFNVEVFTkJJRVJwCmMybG5JRkp2YjNRZ1VqSXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDaW84UUFDZGFGWFMxdEZQYkMKdzNPZU5jSnhWWDZCKzZ0R1VPREJmRWw0NXF0NVdEemEvM3djbjlpWEFuZythMEVFNlVHOXZnTXNSZll2Wk5TclhhTkhQV1NiNldpYQp4c3diUDdxK3NvczBBaTZZVlJuOGpHK3FYOXBNemswRElhUFkwalNUVnBiTFRBd0FGanhmR3MzSXgyeW1yZE14cDd6bzVlRm0xdEw3CkE3UkJaY2tRcmc0Rlk4YUFhbWt3L2RMdWtPOE5KOStmbFhQMDRTWGFiQmJlUVRnMDZvdjgwZWdFRkdFdFFYNnN4M2RPeTFGVSsxNlMKR0JzRVdtakd5Y1Q2dHhPZ21MY1JLN2ZXVjh4OG5oZlJ5eVgraGs0a0xsWU1lRTJlQVJLbUs2Y0JaVzU4WWgyRWhOL3F3R3UxcFNxVgpnOE5URVF4ekhRdXlScERSUWpyT1FHNlZyZi9HbEsxdWw0U09mVytlaW9BTlNXMXo0bnVTSHNQendmUHJMZ1Z2MlJ2UE4zWUV5TFJhCjVCZW55OTEySDlBWmR1Z3NCYlBXbkRUWWx0eGhoNUVGNUVRSU04SGF1UWhsMUs2eU5nM3J1amk2RE9XYm51dU5adDJaejlhSlFmWUUKa29vcEtXMXJPaHpuZFgwQ2NRN3p3T2U5eXhuZG5XQ3l3bVpndHJFRTdzbm1ocm1hWmtDbzV4SHRnVVVEaS9abldlakJCaEc5M2MrQQpBazlsUUhoY1IxREltK1lmZ1h2a1JLaGJoWnJpM2xyVngvazZSR1pMNURKVWZPUnNuTE1PUFJlaXNqUVMxbjZ5cUVtNzBYb29RTDZpCkZoL2Y1RGNmRVhQN2tBcGxRNklOZlBnR0FWVXpmYkFOdVBUMXJxVkNWM3cyRVl4N1hzUURuWXg1blFJREFRQUJvMEl3UURBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVXRabjRyN0NVOWVNZzFncXR6azVXcEM1dQpRdTB3RFFZSktvWklodmNOQVFFTEJRQURnZ0lCQUNZR1huRG5aVFBJZ203Wm5CYzZHM3Btc2dIMmVEdHBYaS9xLzA3NUtNT1lLbUZNCnRDUVNpbjF0RVJUM25MWEs1cnllSjQ1TUdjaXB2WHJBMXpZT2JZVnlicWpHb20zMituTmpmN3h1ZVFnY25ZcWZHb3BUcHRpNzJUVlYKc1JIRnFRT3pWanU1aEpNaVhuN0I5aEpTaStvc1o3eitOa3oxdU0vUnMwbVNPOU1wRHBrYmx2ZGh1RHZFSzdaNGJMUWpiL0Q5MDdKZQpkUitabGFpczl0cmh4VEY3KzlGR3M5SzhaN1JpVkxvSjkyT3drNkthK2VsU0xvdGdFcXY4OVdCVzd4QmNpOFFhUXR5RFcyUU95N1c4CjFrL0JmRHh1alJOdCszdnJNTkRjVGEvRjFiYWxURnR4eWVneHZ1ZzRCa2loR3VMcTB0NFNPVmdhLzRBT2duWG10OGtIYkE3di96angKbUhIRXQzOE9GZEFsYWIwaW5TdnRCZlpHUjZ6dHdQRFVPK0xzN3BaYmtCTk9IbFk2NjdEdmxydVdJeEc2OGtPR2RHU1Z5Q2gxM3gwMQp1dEkzZ3poVE9EWTd6MnpwK1dzTzBQc0U2RTkzMTJVQmVJWU1lajRoWXZGL1kzRU15WjlFMjZnbm9uVytib0UrMThEckc1Z1BjRncwCnNvck13SVVZNjI1NnMvZGFvUWUvcVVLUzgyQWlsK1FVb1FlYlRuYkFqbjM5cENYSFIrMy9IM09zek1PbDZXOEtqcHRsd2xDRnRhT2cKVXhMTVZZZGg4NEd1RUVaaHZVUWh1TUk5ZE05K0pEWDZIQWNPbXowaXl1OHhMNHlzRXIzdlFDajhLV2Vmc2hOUFppVEVVeG5wSGlrVgo3K1p0c0g4dFovM3piQnQxUnFQbFNoZnBwTmNMCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFDQ1ZSQUlaMQo9PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUgwekNDQmJ1Z0F3SUJBZ0lJWHNPM3BrTi9wT0F3RFFZSktvWklodmNOQVFFRkJRQXdRakVTTUJBR0ExVUVBd3dKUVVORFZsSkIKU1ZveE1SQXdEZ1lEVlFRTERBZFFTMGxCUTBOV01RMHdDd1lEVlFRS0RBUkJRME5XTVFzd0NRWURWUVFHRXdKRlV6QWVGdzB4TVRBMQpNRFV3T1RNM016ZGFGdzB6TURFeU16RXdPVE0zTXpkYU1FSXhFakFRQmdOVkJBTU1DVUZEUTFaU1FVbGFNVEVRTUE0R0ExVUVDd3dIClVFdEpRVU5EVmpFTk1Bc0dBMVVFQ2d3RVFVTkRWakVMTUFrR0ExVUVCaE1DUlZNd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUMKRHdBd2dnSUtBb0lDQVFDYnFhdS9ZVXFYcnkrWFpwcDBYOURabHYzUDR1Um03eDhmUnpQQ1JLUGZtdDRmdFZUZEZYeHBOUkZ2dThnTQpqbW9ZSHRpUDJSYThFRWcyWFBCanM1QmFYQ1EzMTZQV3l3bHh1ZkVCY29Td2ZkdE5nTTM4MDIvSitOcTJEb0xTUllXb0cyaW9QZWowClJHeTlvY0xMQTc2TVBoTUFoTjlLU01Eaklncm82VGVuR0V5eENRMGpWbjhFVGRrWGhCaWx5TnBBbEhQcnpnNVhQQU9CT3AwS29WZEQKYWF4WGJYbVFlT1cxdER2WXZFeU5LS0dubzZlNkFrNGwwU3F1N2E0RElyaHJJQTh3S0ZTVmYrRHV6Z3BtbmRGQUxXNGlyNTBhd1FVWgowbS9BOHAvNGU3TUNRdnRRcVIwdGt3OGpxOGJCRDVMLzBLSVY5Vk1KY1J6L1JST0U1aVplK09DSUhBcjhGcmFvY3dhNDhHT0VBcURHCld1em5kTjl3cnFPREplcld4NWVIazZmR2lvb3psMkEzRUQ2WFBtNHBGZGFoRDlHSUxCS2ZiNnFreGtMclFhTGpsVVBUQVlWdGpyczcKOHlNMngvNDc0S0VsQjBpcnlZbDAvd2lQZ0wvQWxtWHo3dXhMYUwyZGlNTXhzMER4Nk0vMk9MdWM1TkYvMU9WWW0zejYxUE1PbTNXUgo1THBTTGhsKzBmWE5XaG44dWdiMisxS29TNWtFM2ZqNXRJdFFvMDVpaWZDSEpQcURRc0dIK3RVdEtTcGFjWHBrYXRjbllHTU4yODVKCjlZMGZrSWt5Ri9oelE3alNXcE9HWWRiaGRRcnFlV1oyaUU5eDZ3UWwxZ3BhZXBQbHVVc1hRQSt4dHJuMTNrL2M0TE9zT3hGd1lJUksKUTI2WklNQXBjUXJBWlFJREFRQUJvNElDeXpDQ0FzY3dmUVlJS3dZQkJRVUhBUUVFY1RCdk1Fd0dDQ3NHQVFVRkJ6QUNoa0JvZEhSdwpPaTh2ZDNkM0xtRmpZM1l1WlhNdlptbHNaV0ZrYldsdUwwRnlZMmhwZG05ekwyTmxjblJwWm1sallXUnZjeTl5WVdsNllXTmpkakV1ClkzSjBNQjhHQ0NzR0FRVUZCekFCaGhOb2RIUndPaTh2YjJOemNDNWhZMk4yTG1Wek1CMEdBMVVkRGdRV0JCVFNoN1RqM3pjbmsxWDIKVnVxQjVUYk1qQjQvdlRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZOS0h0T1BmTnllVFZmWlc2b0hsTnN5TQpIais5TUlJQmN3WURWUjBnQklJQmFqQ0NBV1l3Z2dGaUJnUlZIU0FBTUlJQldEQ0NBU0lHQ0NzR0FRVUZCd0lDTUlJQkZCNkNBUkFBClFRQjFBSFFBYndCeUFHa0FaQUJoQUdRQUlBQmtBR1VBSUFCREFHVUFjZ0IwQUdrQVpnQnBBR01BWVFCakFHa0E4d0J1QUNBQVVnQmgKQU8wQWVnQWdBR1FBWlFBZ0FHd0FZUUFnQUVFQVF3QkRBRllBSUFBb0FFRUFad0JsQUc0QVl3QnBBR0VBSUFCa0FHVUFJQUJVQUdVQQpZd0J1QUc4QWJBQnZBR2NBN1FCaEFDQUFlUUFnQUVNQVpRQnlBSFFBYVFCbUFHa0FZd0JoQUdNQWFRRHpBRzRBSUFCRkFHd0FaUUJqCkFIUUFjZ0R6QUc0QWFRQmpBR0VBTEFBZ0FFTUFTUUJHQUNBQVVRQTBBRFlBTUFBeEFERUFOUUEyQUVVQUtRQXVBQ0FBUXdCUUFGTUEKSUFCbEFHNEFJQUJvQUhRQWRBQndBRG9BTHdBdkFIY0Fkd0IzQUM0QVlRQmpBR01BZGdBdUFHVUFjekF3QmdnckJnRUZCUWNDQVJZawphSFIwY0RvdkwzZDNkeTVoWTJOMkxtVnpMMnhsWjJsemJHRmphVzl1WDJNdWFIUnRNRlVHQTFVZEh3Uk9NRXd3U3FCSW9FYUdSR2gwCmRIQTZMeTkzZDNjdVlXTmpkaTVsY3k5bWFXeGxZV1J0YVc0dlFYSmphR2wyYjNNdlkyVnlkR2xtYVdOaFpHOXpMM0poYVhwaFkyTjIKTVY5a1pYSXVZM0pzTUE0R0ExVWREd0VCL3dRRUF3SUJCakFYQmdOVkhSRUVFREFPZ1F4aFkyTjJRR0ZqWTNZdVpYTXdEUVlKS29aSQpodmNOQVFFRkJRQURnZ0lCQUpjeEFwL24vVU5uU0VRVTVDbUg3VXdvWnRDUE5kcE5ZYmRLbDAyMTI1RGdCUzRPeG5uUThwZHBENzBFClI5bSsyN1VwMnB2WnJxbVoxZE04TUpQMWphR28vQWFOUlBUS0ZwVjhNOXhpaTZnMytDZllDUzBiNzhnVUp5Q3BaRVQvTHRaMXFteE4KWUVBWlNVTlVZOXJpekxwbTVVOUVlbHZaYW9FclFOVi8rUUVuV0N6STdVaVJmRCttQU0vRUtYTVJOdDZHR1Q2ZDdobUtHOVd3N1k0OQpuQ3JBRGRnOVp1TThEYjNWbEZ6aTRxYzFHd1FBOWo5YWplcER2VitKSGFuQnNNeVo0azBBQ3RySkoxdm5FNUJjNVBVem9sVnQzT0FKClRTK3hKbHNuZFFBSnhHSjNLUWhmbmxtc3RuNnRuMVF3SWdQQkhuRmsvdms0Q3BZWTNRSVVyQ1BMQmh3ZXBIMk5EZDRuUWVpdDJoVzMKc0NQZEs2alQyaVdIN2VoVlJFMkk5RForaEpwNHJQY09Wa2tPMWpNbDFvUlFRbXdnRWgwcTFiNjg4bkNCcEhCZ3ZnVzFtNTRFUkw1aApJNnpwcFNTTUVZQ1VXcUtpdVVuU3dkelJwKzB4RVN5ZUdhYnU0Vlhod09yUERZVGtGN2VpZktYZVZTVUc3c3pBaDF4QTJzeVZQMVhnCk5jZTRoTDYwWGMxNmd3Rnk3b2ZtWHgydXRZWEdKdC9td1pycEhnSkhueXFvYmFsYnoreEZkMytZSjVveVhTcmpoTzdGbUdZdmxpQWQKM2RqREo5ZXcrZjdaZmMzUW40OExGRmhSbnkrTHd6Z3QzdWlQMW8ySHBQVldReGFaTFBTa1ZyUTB1R0UzeWNKWWdCdWdsNkg4V1kzcApFZmJSRDB0Vk5FWXFpNFk3Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClRXQ0EgR2xvYmFsIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlFUQ0NBeW1nQXdJQkFnSUNETDR3RFFZSktvWklodmNOQVFFTEJRQXdVVEVMTUFrR0ExVUVCaE1DVkZjeEVqQVFCZ05WQkFvVApDVlJCU1ZkQlRpMURRVEVRTUE0R0ExVUVDeE1IVW05dmRDQkRRVEVjTUJvR0ExVUVBeE1UVkZkRFFTQkhiRzlpWVd3Z1VtOXZkQ0JEClFUQWVGdzB4TWpBMk1qY3dOakk0TXpOYUZ3MHpNREV5TXpFeE5UVTVOVGxhTUZFeEN6QUpCZ05WQkFZVEFsUlhNUkl3RUFZRFZRUUsKRXdsVVFVbFhRVTR0UTBFeEVEQU9CZ05WQkFzVEIxSnZiM1FnUTBFeEhEQWFCZ05WQkFNVEUxUlhRMEVnUjJ4dlltRnNJRkp2YjNRZwpRMEV3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ3dCZHZJNjR6RWJvb2g3NDVObkhFS0gxSnc3VzJDCm5KZkYxMHhPUlVuTFFFSzFFalJzR2NKMHBERmZoUUtYN0VNekNsUFNuSXlPdDdoNTJ5dlZhdktPWnNUdUt3RUhrdFN6MEFMZlVQWlYKcjJZT3krQkhZQzhyTWprMVVqb29nL2g3RnNZWXVHTFdSeVdSenZBWkVrMnRZL1hUUDNWZktmQ2hNQndxb0ppbUZiM3UvUmsyOE9LUgpRNC82eXRZUUowbE03OTNCOFlWd204cnFxRnBEL0cyR2IzUHBOMFdwOERiSHpJaDFIcnRzQnYrYmF6NFg3R0dxY1h6R0hhTDNTZWtWCnRUeldvV0gxRWZjRmJ4MzlFYjdRTUFmQ0tiQUpUaWJjNDZLb2tXb2Z3cEZGaUZ6bG1MaHhwUlVaeVh4MUVjeHdkRTh0bXgyUlJQMVcKS0tEK3U0WnF5UHBjQzFqY3hrdDJ5S3NpMlhNUHBmUmFBb2svVDU0aWd1NmlkRk1xUFZNbmFSMXNqaklzWkFBbVkyRTJUcU5HdHo5OQpzeTJzYlpDaWxhTE96OXFDNXdjMEdaYnB1Q0dxS1g2bU9MNk9LVW9oWm5rZnM4TzFDV2ZlMXRRSFJ2TXEydVlpTjJETGdiWVBvQS9wCnlKVi92MVdSQlhyUFBSWEFiOTRKbEFHRDF6UWJ6RUNsOExpYlo5V1lrVHVuaEhpVkpxUmFDUGdyZExRQUJEemZ1QlNPNk4rcGpXeG4Ka2pNZHdMZlM3SkxJdmdtL0xDa0Zid0pybnUrOHZ5cThXOEJRajBGd2NZZXlUYmNFcVlTak1xK3U3bXNYaTdLeC9temhrSXlJcUpkSQp6c2hOeS9NR3oxOXFDa0t4SGg1M0w0Nmc1cElPQnZ3Rkl0SW00VEZSZlRMY0R3SURBUUFCb3lNd0lUQU9CZ05WSFE4QkFmOEVCQU1DCkFRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFYelNCZHUrV0hkWGx0ZGtDWTRRV3dhNmcKY0ZHbjkweEhOY2dMMXlnOWlYSFpxak5CNmhRYmJDRUF3R3hDR1g2ZmFWc2dRdCtpMHRyRWZKZExqYkRvck1qdXBXa0VtUXFTcHFzbgpMaHBOZ2IrRTFIQWVyVWYrL1VxZE0rRHl1Y1JGQ0NFSzJtbHBjM0lOdmpUK2xJdXR3eDQxMTZLRDcrVTR4NldGSDZ2UE5Pdy9LUDRNCjhWZUdUc2xWOXh6VTJLVjlCbnB2MWQ4UTM0Rk9JV1d4dHVFWGVaVkZCczVmek54R2lXTm9SSTJUOUdSd29EMmRLQVhET1hDNFluc2cKL2VUYjZRaWh1SjQ5Q2NkUCt5ejRrM1pCM2xMZzRWZlNuUU84ZDU3K25pbGU5OEZSWUIvZTJndXlMWFczUTBpVDUvWjV4b1JkZ0ZsZwpsUHg0bUk4OGsxSHRRSkFIMzJSakpNdE9jUVdoMTVRYWlETHhJblFpcnFXbTJCSnBUR0NqQXU0cjdOUmprZ3Rldmk5MmE2TzJKcnlQCkE5Z0s4a3hrUnIwNVl1V1c2elJqRVNqTWxmR3Q3Ky9jZ0ZoSTZVdTQ2bVdzNmZ5QXRiWElSZm1zd1ovWnVlcGlpSTdFOFV1REVxM20KaTRUV25zTHJneGlmYXJzYkpHQXpjTXpzOXpMelhObDVmZStlcFA3Skk4TWs3aFdTc1QyUlR5YUd2V1p6SkJQcXBLNWp3YTE5aEFNOApFSGlHRzNuanhQUHlCSlVncmlPQ3hMTTZBR0svNWpZazRWZTZ4eDZRZGRWZlA1VmhLOEU3emVXemFHSFFSaWFwSVZKcExlc3V4K3QzCnpxWTZ0UU16VDNiUjUxeFVBVjNMZVBUSkRML1BFbzRYTFNOb2xPZXIvcW15S3diUUJNMD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVGVsaWFTb25lcmEgUm9vdCBDQSB2MQo9PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGT0RDQ0F5Q2dBd0lCQWdJUkFKVytGcUQzTGtieGV6bUNjdnFMelpZd0RRWUpLb1pJaHZjTkFRRUZCUUF3TnpFVU1CSUdBMVVFCkNnd0xWR1ZzYVdGVGIyNWxjbUV4SHpBZEJnTlZCQU1NRmxSbGJHbGhVMjl1WlhKaElGSnZiM1FnUTBFZ2RqRXdIaGNOTURjeE1ERTQKTVRJd01EVXdXaGNOTXpJeE1ERTRNVEl3TURVd1dqQTNNUlF3RWdZRFZRUUtEQXRVWld4cFlWTnZibVZ5WVRFZk1CMEdBMVVFQXd3VwpWR1ZzYVdGVGIyNWxjbUVnVW05dmRDQkRRU0IyTVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTUsrCjZ5ZndJYVB6YVNaVmZwM0ZWUmFSWFAzdkliOVRnSG90MHBHTVl6SHc3Q1R3dzZYU2Nud1FiZlEzdCtYbWZIbnFqTFdDaTY1SXRxd0EKM0dWMTdDcE5YOEdIOVNCbEs0R29SejZKSTVVd0ZwQi82RmNIU09jWnJyOUZaN0UzR3dZcS90NzVySDJEKzE2NjVJK1haNzVMam8xawpCMWM0VldrME5qMFRTTzlQNHRObUhxVFBHcmRlTmpQVXRBYTlHQUg5ZDRSUUFFWDFqRjNvSTd4Ky9qWGg3VkI3cVRDTkdkTUpqbWhuClhiODhseGhUdXlsaXhjcGVjc0hIbHRUYkxhQzBIMmtEN09yaVVQRU1QUENzODFNdDhCejE3V3c1T1hPQUZzaFNzQ1BONEQ3YzNUeEgKb0xzMWl1S1lhSXUrNWI5eTd0TDZwZTBTN2Z5WUdLa21kdHdvU3hBZ0hOTi9GbmN0N1crQTkwbTdVd1c3WFdqSDFNaDFGaitKV292MwpGMGZVVFBIU2lYaytUVDJZcUdIZU9oN1MrRjRENE1ISkhJelRqVTNUbFRhek4xOWpZNXN6RlBBdEptdFRmSW1NTXNKdTdEMGhBRG5KCm9XamlVSU11c0Rvcjh6YWdyQy9rYjJIQ1VRazVQb3RUdWJ0bjJ0eFR1WFpaTnAxRDVTRGdQVEpnaFNKUnQ4Y3p1OTBWTDZSNHBnZDcKZ1VZMkJJYmRlVFhIbFN3N3NLTVhOZVZ6SDdSY1dlL2E2aEJsZTNyUWY1K3p0Q28zTzNDTG0xdTVLN2Zzc2xFU2wxTXBXdFR3RWhEYwpUd0s3RXBJdll0US9hVU44RGRiOFdIVUJpSjFZRmt2ZXVwRC9Sd0dKQm1yMlg3S1Fhck1DcGdLSXY3TkhmaXJaMWZwb2VEVk5BZ01CCkFBR2pQekE5TUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3Q3dZRFZSMFBCQVFEQWdFR01CMEdBMVVkRGdRV0JCVHdqMWs0QUxQMWo1cVcKRE5YcitudXFGK2dURWpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQWdFQXZ1UmNZazRrOUF3SS8vRFRER2prazBraVAwUW5iN3R0M29ObQp6cWpNRGZ6MW1nYmxkeFNSNjUxQmU1a3FoT1gvL0NIQlhmRGtIMWUzZGFtaFh3SW0vOWZIOTA3ZVQvajNIRWJBZWs5QUxDSTE4Qm14CjBHdG5MTENvNE1CQU56WDJoRnhjNDY5Q2VQNm55UTFRNmcyRWR2WlI3NE5UeG5yL0RsWkpMbzk2MWd6bUoxVGpUUXBnY21MTmtRZlcKcGIvSW1XdnR4Qm5tcTB3Uk9NVnZNZUp1U2NnL2RvQW1BeVlwNERiMjlpQlQ0eGR3TkJlZFkyZ2VhK3pEVFlhNEV6QXZYVVlOUjBQVgpHNnBaRHJsY2pRWklyWFNIWDhmOE1WUkJFK0xISVE2ZTRCNE40Y0I3UTRXUXhZcFl4bVVLZUZmeXhpTVBBZGtnUzk0UCs1S0ZkU3BjCmM0MXRleVdSeXU1RnJnWkxBTXpUc1ZsUTJqcUlPeWxEUmw2WEsxVE9VMitOU3VlVytyOXhEa0tMZlAwb29OQkl5dHJFZ1V5N29uT1QKSnNqckROWW1pTGJBSk0rN3ZWdnJkWDNwQ0k2R015eDVkd2xwcFluOHMzQ1FoM2FQMHlLN1FzNjljd3NnSmlyUW16MXdIaVJzellkMgpxUmVXdDg4Tmt2dU9HS21ZU2RHZS9tQkVjaUc1R2UzQzlUSHhPVWlJa0NSMVZCYXR6dlQ0YVJSa09mdWp1THB3UU1jbkhML0VWbFA2ClkyWFE4eHdPRnZWcmhsaE5HTlRrRFk2bG5WdVIzSFlrVUQvR0t2dlp0NXkxMXViUTJlZ1ppeFZ4U0syMzZ0aFppTlNRdnhhejJlbXMKV1dGVXlCeTZ5c0hLNGJrZ1RJODZrNG1sb015LzAvWjFwSFdXYlZZPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpULVRlbGVTZWMgR2xvYmFsUm9vdCBDbGFzcyAyCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR3ekNDQXF1Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBRENCZ2pFTE1Ba0dBMVVFQmhNQ1JFVXhLekFwQmdOVkJBb00KSWxRdFUzbHpkR1Z0Y3lCRmJuUmxjbkJ5YVhObElGTmxjblpwWTJWeklFZHRZa2d4SHpBZEJnTlZCQXNNRmxRdFUzbHpkR1Z0Y3lCVQpjblZ6ZENCRFpXNTBaWEl4SlRBakJnTlZCQU1NSEZRdFZHVnNaVk5sWXlCSGJHOWlZV3hTYjI5MElFTnNZWE56SURJd0hoY05NRGd4Ck1EQXhNVEEwTURFMFdoY05Nek14TURBeE1qTTFPVFU1V2pDQmdqRUxNQWtHQTFVRUJoTUNSRVV4S3pBcEJnTlZCQW9NSWxRdFUzbHoKZEdWdGN5QkZiblJsY25CeWFYTmxJRk5sY25acFkyVnpJRWR0WWtneEh6QWRCZ05WQkFzTUZsUXRVM2x6ZEdWdGN5QlVjblZ6ZENCRApaVzUwWlhJeEpUQWpCZ05WQkFNTUhGUXRWR1ZzWlZObFl5QkhiRzlpWVd4U2IyOTBJRU5zWVhOeklESXdnZ0VpTUEwR0NTcUdTSWIzCkRRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3FYOW9iWCtoemtlWGFYUFNpNWtmbDgyaFZZQVVkQXFTem0xbnpIb3F2TkszOERjTFoKU0JudWFZL0pJUHdocWdjWjdiQmNyR1hIWCswQ2ZIdDhMUnZXdXJtQXdoaUNGb1Q2WnJBSXhsUWpnZVROdVVrLzlrOXVOMGdvT0EvRgp2dWRvY1AwNWwwM1N4NWlSVUtyRVJMTWpmVGxINlZKaTFoS1RYcmN4bGtJRiszYW5IcVAxd3Z6cGVzVnNxWEZQNnN0NHZHQ3Z4OTcwCjJjdStmak9sYnBTRDhEVDZJYXZxam5LZ1A2VGVNRnZ2aGsxcWxWdERSS2dRRlJ6bEFWZkZtUEhtQmlpUnFpREZ0MU1tVVVPeUN4R1YKV09IQUQzYlp3STE4Z2ZOeWNKNXYvaHFPMlY4MXhySnZOSHkrU0UvaVdqblgySjE0bnArR1BnTmVHWXRFb3RYSEFnTUJBQUdqUWpCQQpNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCUy9XU0EyQUhtZ29DSnJqTlh5CllkSzRMTXVDU2pBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQU1RT2lZUXNmZE9oeU5zWnQrVTJlK2lLbzRZRld6ODI3bitxcmtSazQKcjZwOEZVM3p0cU9OcGZTTzlrU3BwK2dobGEwK0FHSVdpUEFDdXZ4aEkrWXptekI2YXpaaWU2MEVJNFJZWmVMYks0cm5KVk0zWWxOZgp2Tm9CWWltaXBpZHg1am9pZnNGdkhaVndJRW9ITk4vcS94V0E1YnJYZXRoYmRYd0ZlaWxIZmtDb01STjN6VUE3dEZGSGVpNFI0MGNSCjNwMW0wSXZWVkdiNmcxWHFmTUlwaVJ2cGI3UE80Z1dFeVM4K2VJVmlic2xmd1hoamRGakFTQmdNbVRucnBNd2F0WGxhalJXYzJCUU4KOW5vSFY4Y2lnd1V0UEpzbEpqMFlzNmxEZk1qSXEyU1BEcU8vbkJ1ZE1OdmEwQmt1cWp6eCt6T0FkdVROclJsUEJTZU9FNkZ1d2c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBdG9zIFRydXN0ZWRSb290IDIwMTEKPT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZHpDQ0FsK2dBd0lCQWdJSVhEUExZaXhmc3pJd0RRWUpLb1pJaHZjTkFRRUxCUUF3UERFZU1Cd0dBMVVFQXd3VlFYUnZjeUJVCmNuVnpkR1ZrVW05dmRDQXlNREV4TVEwd0N3WURWUVFLREFSQmRHOXpNUXN3Q1FZRFZRUUdFd0pFUlRBZUZ3MHhNVEEzTURjeE5EVTQKTXpCYUZ3MHpNREV5TXpFeU16VTVOVGxhTUR3eEhqQWNCZ05WQkFNTUZVRjBiM01nVkhKMWMzUmxaRkp2YjNRZ01qQXhNVEVOTUFzRwpBMVVFQ2d3RVFYUnZjekVMTUFrR0ExVUVCaE1DUkVVd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNWCmhUdVhieW83TGp2UHB2TXBOYjdQR0t3K3F0bjRUYUErR2tlNXZKcmY4djdNUGtmb2VwYkNKSTQxOUtrTS9JTDliY0Z5WWllOTZtdnIKNTRyTVZENlFVTStBMUpYNzZMV0MxQlRGdHFsVkpWZmJzVkQyc0dCa1dYcHB6d08zYncyK3lqNXZkSExxcWpBcWMySytTWkZoeUJIKwpEZ01xOTJvZzNBSVZEVjRWYXZ6amdzRzF4WjFrQ1d5aldaZ0hKOGNibGl0aGRIRnNRL0gzTllrUTRKN3NWYUUzSXFLSEJBVXNSMzIwCkhMbGlLV1lveXJmaGsvV2tsQU9adVhDRnRlWkk2bzFRL05uZXpHOEhEdDBMY3AyQU1CWUhsVDhvRHYzRmRVOVQxblNhdENRdWpnS1IKejNiRm14NVZkSng0SWJId0xmRUxuOExWbGhnZjhGUWllb3dIQWdNQkFBR2pmVEI3TUIwR0ExVWREZ1FXQkJTbnBRYXhMS1lKWU83UgpsK2x3cnJ3N0dXemJJVEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjhHQTFVZEl3UVlNQmFBRktlbEJyRXNwZ2xnN3RHWDZYQ3V2RHNaCmJOc2hNQmdHQTFVZElBUVJNQTh3RFFZTEt3WUJCQUd3TFFNRUFRRXdEZ1lEVlIwUEFRSC9CQVFEQWdHR01BMEdDU3FHU0liM0RRRUIKQ3dVQUE0SUJBUUFtZHpUYmxFaUdLa0dkTEQ0R2tHREVqS3dMVkxnZnVYdlRCem5rK2o1N3NqMU83WjhqdlpmemExenY3djFBcHQraAprNkVLaHF6dklOQjVBYjE0OXhuWUpERTBCQUdtdWhXYXd5ZmMyRThQekJoai81a1BEcEZyZFJiaElmellKc2RIdDZiUFdISnhmcnJoClRaVkhPOG12YmFHMHdleUo5clFQT0xYaVpOd2x6NmJiNjVwY21hSEZDTjc5NXRyVjFscEZETVMzd3JVVTc3UVIvdzRWdGZYMTI4YTkKNjFxbjhGWWlxVHhsVk1ZVnFMMkduczJEbG1oNmNZR0o0UXZoNmhFYmFBak1hWjdzbmtHZVJESW1ldUtIQ25FOTYrUmFwTkxieGMzRwozbUIvdWZOUFJKTHZLcmNZUHFjWjJRdDlzVGRCUXJDNllCM3kvZ2tSc1BDSGU2ZWQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKUXVvVmFkaXMgUm9vdCBDQSAxIEczCj09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRllEQ0NBMGlnQXdJQkFnSVVlRmhmTHEwc0dVdmpOd2MxTkJNb3RaYlVaWk13RFFZSktvWklodmNOQVFFTEJRQXdTREVMTUFrRwpBMVVFQmhNQ1FrMHhHVEFYQmdOVkJBb1RFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhIakFjQmdOVkJBTVRGVkYxYjFaaFpHbHpJRkp2CmIzUWdRMEVnTVNCSE16QWVGdzB4TWpBeE1USXhOekkzTkRSYUZ3MDBNakF4TVRJeE56STNORFJhTUVneEN6QUpCZ05WQkFZVEFrSk4KTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTWFXMXBkR1ZrTVI0d0hBWURWUVFERXhWUmRXOVdZV1JwY3lCU2IyOTBJRU5CSURFZwpSek13Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ2d2bEFRanVueWJFQzBCSnlGdVRISzNDM2tFYWtFClBCdFZ3ZWRZTUIwa3RNUHZoZDZNTE9IQlBkK0M1ayt0UjRkczdGdEp3VXJWdTQvc2g2eC9ncHFHN0QwRG1WSUIwaldlck5yd1U4bG0KUE5Tc0FnSGFKTk03cUFKR3I2UWM0L2h6V0hhMzlnNlFEYlh3ejh6NitjWk01Y09HTUFxTkYzNDE2OFhmdXc2Y3dJMkg0NGc0aFdmNgpQc2VyNEJPY0JSaVl6NVAxc1pLMC9DUFR6OVhFSjBuZ25qeWJDS09MWFNvaDRQdzVxbFBhZlg3UEdnbFR2RjBGQk0raFNvK0xkb0lOCm9malN4eFIzVzVBMkI0R2JQZ2I2VWw1anhhWUEvcVhwVWh0U3RaSTVjZ01KWXIyd1lCWnVwdDBsd2dObTNmTUUwVURpVG91RzlHL2wKZzZBbmhGNEV3ZldRdlRBOXhPK29hYnc0bTZTa2x0RmkybW5BQVphdXk4UlJOT29NcXY4aGpsbVBTbHprWVpxbjB1a3FlSTFSUFRvVgo3cUpaanFsYzNzWDVrQ0xsaUVWeDNaR1piSHFmUFQyWWZGNzJ2aFpvb0Y2dUN5UDhXZytxSW5ZdHlhRVFIZVRUUkNPUWlKL0dLdWJYCjlacXpXQjR2TUlrSUcxU2l0WmdqN0FoM0hKVmRZZEhMaVp4Zm9rcVJtdThocWtrV0NLaTlZU2d4eVhTdGhmYlp4YkdMMGVVUU1rMWYKaXlBNlBFa2ZNNFZaRGR2TENYVkRhWFA3YTNGOThOL0VUSDNHb3k3SWxYbkxjNktPVGswaysxN2tCTDV5RzZZbkxVbGFtWHJYWEFrZwp0MytVdVUveERSeGVpRUliRWJmbmtkdWViUFJxMzR3R21BT3R6Q2p2cFVmelV3SURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFECkFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVVvNWZXODE2aUVPR3JSWjg4RjJRODdnRnduTXd3RFFZSktvWkkKaHZjTkFRRUxCUUFEZ2dJQkFCajZXM1g4UG5ySFgzZkh5dC9QWDhNU3hFQmQxREtxdUdyWDFSVVZScGdqcGVhUVd4aVpUT090UXFPQwpNVGFJemVuN3hBU1dTSXNCeDQwQnoxc3pCcFpHWm5RZFQrM0J0cm0wRFdITVkzN1hMbmVNbGh3cUkyaHJoVmQyY0RNVC91RlBwaU4zCkdQb2FqT2k5WmNuUFAvVEpGOXpyeDd6QUJDNHRSaTlwWnNNYmovN3NQdFBLbEw5MkNpVU5xWHNDSEtuUU8xOEx3SUU2UFdUaHY2Y3QKVHIxTnhOZ3B4aUlZME1Xc2NnS0NQNm82b2pvaWx6SGRDR1BEZFJTNVlDZ3RXMmpnRnFsbWdpTlI5ZXRUMkRHYmUrbTNuVXZyaUJiUAorVjA0aWtrd2orM3g2eG4wZHhveEdFMW5WR3d2YjJYNTJ6M3NJZXhlOVBTTHltQmxWTkZ4WlBUNXBxT0JNell6Y2ZDa2VGOU9yWU1oCjNqUkpqZWhackozeWRsbzI4aFAwcitBSngyRXFiUGZnbmE2N2hrb29ieTd1dEhuTmtEUERzM2I2OWZCc25RR1ErcDZROXB4eXowZmEKd3gva05TQlQ4bFRSMzJHRHBnTGlKVGplaFRJdFhuT1FVbDFDeE00OVMrSDVHWVFkMWFKUXpFSDdRUlREdmRiSldxTmpaZ0tBdlFVNgpPMGVjN0FBbVRQV0lVYitvSTM4WUI3QUw3WXNtb1dUVFlVcnJYSi9lczY5bkE3TWYzVzFkYVdocHExNDY3SHhwdk1jN2hVNmVGYm0wCkZVL0RsWHBZMThsczZXeTU4eWxqWHJRczhDMDk3VnBsNEtsYlFNSkltWUZ0bmg4R0tqd1N0SXNQbTZJazhLYU4xbnJnUzdaa2xtT1YKaE1KS3pSd3VKSWN6WU9YRAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpRdW9WYWRpcyBSb290IENBIDIgRzMKPT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWURDQ0EwaWdBd0lCQWdJVVJGYzBKRnVCaVpzMThzNjRLenRicHlid2RTZ3dEUVlKS29aSWh2Y05BUUVMQlFBd1NERUxNQWtHCkExVUVCaE1DUWsweEdUQVhCZ05WQkFvVEVGRjFiMVpoWkdseklFeHBiV2wwWldReEhqQWNCZ05WQkFNVEZWRjFiMVpoWkdseklGSnYKYjNRZ1EwRWdNaUJITXpBZUZ3MHhNakF4TVRJeE9EVTVNekphRncwME1qQXhNVEl4T0RVNU16SmFNRWd4Q3pBSkJnTlZCQVlUQWtKTgpNUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNYVcxcGRHVmtNUjR3SEFZRFZRUURFeFZSZFc5V1lXUnBjeUJTYjI5MElFTkJJRElnClJ6TXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDaHJpV3lBUmpjVjRnL1J1djVyK0xySTNIaW10RmgKWmlGZnFxOG5VZVZ1R3hiVUxYMVFzRk4zdlhnNllPSmtBcHQ4aHB2V0dvNnQveDhWZjlXVkhoTEw1aFNFQk1IZk5yTVduNHJqeWR1WQpOTTdZTXhjb1J2eW55ZkRTdE5WTkNYSkorZktINDZuYWZhRjlhN0k2SmFsdFVrU3MrTDV1Kzl5bWM1R1FZYVlERkNEeTU0ZWppSzJ0Cm9Jei9wZ3NsVWlYbkZnSFZ5N2cxZ1F5ak8vRGg0ZnhhWGM2QWNXMzRTYXMrTzdxNDE0QUIrNlhyVzdQRlhtQXFNYUN2TitnZ09wK28KTWl3TXpBa2QwNTZPWGJ4TW1PN0ZHbWg3N0ZPbTZSUTFvOS9OZ0o4TVNQc2M5UEcvU3JqNjFZeHhTc2NmcmY1Qm1yT0RYZktFVnUrbApWMFBPS2EyTXExVy94UHRiQWQwaklhRllBSTdEMEdvVDdSUGpFaXVBM0dmbWxiTE5IaUp1S3ZoQjFQTEtGQWVOaWxVU3htbjF1SVpvCkwxTmVzTktxSWNHWTVqRGpaMVhIbTI2c0dhaFZwa1VHMENNNjIrdGxYU29SRWZBN1Q4cHQ5RFRFY2VUL0FGcjJYSzRqWUlWejhlUVEKc1NXdTFaSzdFOEVNNERuYXREbFh0YXMxcW5JaE80TTE1ekhmZWlGdXVESUlmUjB5a1JWS1luTFA0M2Vodk5VUkczWUJad2pnUVF2RAo2eFZ1K0tRWjJhS3JyK0luVWxZckFvb3NGQ1Q1djBJQ3Z5Ykl4by9nYmpoOVV5M2w3Wml6bFdOb2YvazE5TitJeFdBMWtzQjhhUnhoCmxSYlE2OTRMcno0RUVFVmxXRkE0cjBqeVdiWVc4andOa0FMR2NDNEJyVHdWMXdJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQUQKQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVTdlZHZkbHEvWU94Slc4YWxkN3R5Rm5HYnhEMHdEUVlKS29aSQpodmNOQVFFTEJRQURnZ0lCQUpIZmdEOURDWDV4d3ZmcnM0aVA0Vkd5dkQxMStTaGR5THlabTN0ZHF1WEs0UXIzNkxMVG45MW5NWDY2CkFhckhha0U3a05RSVhMSmdhcER3eU00RFl2bUw3ZnR1S3R3R1RUd3BENGtXaWxoTVNBL29oR0hxUEhLbWQrUkNyb2lqUTFoNWZxN0sKcFZNTnFUMXd2U0FaWWFSc09QeERNdUhCUi8vNDdQRVJJaktXbk1MMlcybVdleUFNUTBHYVcvWlpHWWplVllnM1VRdDRYQW9lbzBMOQp4NTJJRDhEeWVBSWtWSk92aVllSXlVcUFIZXJRYmo1aExqYTdOUTRubHYxbU5EdGhjblB4Rmx4SEJsUkpBSHBZRXJBSzc0WDlzYmd6CmRXcVRIQkxtWUY1dkhYL0pIeVBMaEdHZkhvSkUrVit0WWxVa21sS1k3Vkhub1g2WE91WXZIeEhhVTRBc2haNnJOUkRiSWw5cXhWNlgKVS9JeUFna3dvMWp3RFFIVmNzYXhmR2w3dy9VMlJjeGhibDVNbE1WZXJ1Z09Yb3UvOTgzZzdhRU9HelB1VkJqK0Q3N3Zmb1JyUStOdwptTnRkZGJJTldRZUZGU001MXZIZnFTWVAxa2pIczZZaTlUTTNXcFZIbjN1NkdCVnYvOVlVWklOSjBncG5JZHNQTldOZ0tDTGpzWldECnpZV20zUzhQNTJkU2Jyc3ZoWHoxU25QbnhUN0F2U0VTQlQvOHR3TkpBbHZJSmViaVZEajFlWWVNSFZPeVRvVjdCampITFBqNHNIS04KSmVWM1V2UURIRWltVUYrSUlEQnU4b0pEcXoyWGhPZFQreUhCVHc4aW1vYTRXU3IyUnowWmlDM29oZUdlN0lVSWFyRnNOTWtkN0VncgpPM2p0WnNTT2VXbUQzbitNCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClF1b1ZhZGlzIFJvb3QgQ0EgMyBHMwo9PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZZRENDQTBpZ0F3SUJBZ0lVTHZXYkFpaW4yM3IvMWFPcDdyMERvTThTYWgwd0RRWUpLb1pJaHZjTkFRRUxCUUF3U0RFTE1Ba0cKQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4SGpBY0JnTlZCQU1URlZGMWIxWmhaR2x6SUZKdgpiM1FnUTBFZ015QkhNekFlRncweE1qQXhNVEl5TURJMk16SmFGdzAwTWpBeE1USXlNREkyTXpKYU1FZ3hDekFKQmdOVkJBWVRBa0pOCk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk1hVzFwZEdWa01SNHdIQVlEVlFRREV4VlJkVzlXWVdScGN5QlNiMjkwSUVOQklETWcKUnpNd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUN6eXc0UVo0N3FGSmVuTWlvS1ZqWi9hRXpIczI4NgpJeFNSL3hsL3BjcXM3ck4yblhycGl4dXJhekhiK2d0VFRLL0ZwUnA1UElwTS82emZKZDVPMllJeUMwVGV5dHVNcktOdUZvTTdwbVJMCk1vbjdGaFk0ZnV0RDR0TjBTc0ppQ25NSzNVbXpWOUt3Q29XZGNUemVvOHZBTXZNQk9TQkRHelhSVTdPeDdzV1RhWUkrRnJVb1JxSGUKNm9rSjdVTzRCVWFLaHZWWlI3NGJid0VoRUxuOXFkSW95aEE1Q2NvVE5zK2NyYTFBZEhrckFqODAvL29nYVgzVDdtSDF1clBuTU5BMwpJNFp5WVVVcFNGbG9iM2VtTG9HK0IwMXZyODdFUlJPUkZIQUdqeCtmK0lkcHNRN3Z3NGtaNitvY1lmeDZiSXJjMWdNTG5pYTZFdDNVClZEbXJKcU16Nm5XQjJpM05EMC9rQTlIdkZaY2JhNURGQXBDVFpnSWhzVWZlaTVwS2dMbFZqN1dpTDhEV00yZmFmc1NudEFSRTYwZjcKNWxpNTl3endleXV4d0hBcHcwQmlMVHRJYWR3alBFanJld2w1cVczYXFEQ1l6NEJ5QTRpbVcwYXVjbmw4Q0FNaFphNjM0Unlsc1NxaQpNZDVtQlBmQWRPaHgzdjg5V2N5V0poS0xoWlZYR3F0cmRRdEVQUkVvUEh0aHQrS1BaMC9sN0R4TVlJQnBWemdlQVZ1TlZlakgzOERNCmR5TTBTWFY4OXBnUjZ5M2U3VUV1RkFVQ2YrRCtJT3MxNXhHc0lzNVhQZDdKTUcwUUE0WE44ZitNRnJYQnNqNkliR0Iva0UrVjkvWXQKclFFNUJ3VDZkWUI5djBsUTdlL0p4SHdjNjRCKzI3YlEzUlAreWRPYzE3S1hxUUlEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBRApBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVeGhmUXZLanFBa1B5R3dhWlhTdVFJTG5Ybk9Rd0RRWUpLb1pJCmh2Y05BUUVMQlFBRGdnSUJBRFJoMlZhMUVvZFZUZDJqTlRGR3U2UUhjcnhmWVdMb3Bmc0xON0U4dHJQNktaMS9BdldreWFpVHQzcHgKS0dtUGMrRlNrTnJWdmpybHQzWnFWb0FoMzEzbTZUcWU1VDcyb21uSEtncXdHRWZjSUhCOVVxTStXWHpCdXNuSUZVQmh5bkxXY0t6Uwp0L0FjNUlZcDhNN3ZhR1BRdFNDS0ZXR2Fmb2FZdE1uQ2R2dk11akFXektOaHhuUVQ1V3Z2b3hYcUEvNFRpMlRrMDhIUzZJVDdTZEVRClRYbG02NnI5OUkweEhuQVVyZHplWnhOTWdSVmh2TGZaa1hkeEdZRmd1L0JZcGJXY0MvZVBJbFVud0VzQmJUdVpEZFFkbTJObkw5RHUKRGNwbXZKUlBwcTN0L081anJGYy9aU1hQc29hUDBBai91SFlVYnQ3bEoreXJlTFZUdWJZLzZDRDUwcWkrWVViS2g0eUU4L254b0dpYgpJaDZCSnBzUUJKRnh3QVlmM0tEVHVWYW40NWd0ZjRPZDM0d3JuREtPTXBUd0FUd2lLcDlEd2k3RG1Ea0hPSHY4WGdCQ0gvTXlKbm1ECmhQYmw4TUZSRXNBTEhnUWpERlNsVEM5SnhVclJ0bTVnRFd2OGE0dUZKR1MzaVE2ckpVZGJQTTkrU2IzSDZRckcydmQrRGhjSTAwaVgKMEhHUzhBODVQalJxSEgzWThpS3V1Mm4wTTdTbVNGWFJEdzRtNk95MkN5Mm5oVFhOL1ZuSW45SE5QbG9wTkxrOWhNNnhaZFJaa1pGVwpkU0hCZDU3NWV1RmduZE90QkJqMGZPdGVrNDlUU2lJcCtFZ3JQazJHckZ0L3l3YVpXV0RZV0dXVmpVVFI5MzkrSjM5OXJvRDFCMHkyClBweHhWSmtFUy8xWStaajAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IEcyCj09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGxqQ0NBbjZnQXdJQkFnSVFDNU1jT3RZNVorcG5JNy9EcjVyMFN6QU5CZ2txaGtpRzl3MEJBUXNGQURCbE1Rc3dDUVlEVlFRRwpFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sY25RdVkyOXRNU1F3CklnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnZiM1FnUnpJd0hoY05NVE13T0RBeE1USXdNREF3V2hjTk16Z3cKTVRFMU1USXdNREF3V2pCbE1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTApFeEIzZDNjdVpHbG5hV05sY25RdVkyOXRNU1F3SWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdmIzUWdSekl3CmdnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURaNXlndlVqODJja21Ja3pUeitHb2VNVlNBbjYxVVFiVkgKMzVhbzFLK0FMYmtLejNYOWlhVjlKUHJqSWd3cnZKVVhDek8vR1UxQkJwQUF2UXhORVA0SHRlY2NiaUpWTVdXWHZkTVgwaDVpODl2cQpiRkNNUDRRTWxzKzN5d1BneW0yaEZFd2JpZDN0QUxCU2ZLK1JiTEU0RTlIcEVnakFBTEFjS3hIYWQzQTJtNjdPZVlmY2duRG1DWFJ3ClZXbXZvMmlmdjkyMmViUHluWEFwVmZTci81Vmg4OGxBYngzUnZwTzcwNGdxdTUyL2NscFdjVHMvMVBQUkN2NG83NlB1MlptdkE5T1AKWUxmeWtxR3h2WW1KSHpETnc2WXVZak91RmdKM1JGcm5nUW84cDBRdWViZy9CTHhjb0lmaEc2OVJqczNzTFByNC9tM3dPbnlxaStSbgpsVEdOQWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQjBHQTFVZERnUVdCQlRPCncwcTVtVlh5dU50Z3Y2bCt2VmExbHphbjFqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUF5cVZWak9QSVFXNXBKNmQxRWU4OGhqWnYKMHAzR2VEZ2RhWmFpa21rdU9HeWJmUVRVaWFXeE1UZUt5U0hNcTJ6Tml4eWExcjlJMGpKbXdZckE4eTg2NzhEajFKR0cwVkRqQTl0egpkMjlLT1ZQdDNpYkh0WDJ2SzBMUmRXTGpTaXNDeDFCTDRHbmlsbXdPUkdZUVJJK3RCZXY0ZWF5bUcrZzNOSjFUeVdHcW9sS3ZTbkFXCmhzSTZ5TEVUY0RiWXorNzBDalRWVzB6OUI1eWl1dGtCY2x6elRjSGREckVjRGNSanZxMzBGUHVKN0tKQkRrek15RmRBMEc0RHFzME0Kam9tWm1XendQREN2T045dnZLTytLU0FucTNUL0V5SjQzcGRTVlI2RHRWUWdBKzZ1d0U5VzNqZk13MytxQkNlNzAzZTRZdHNYZkp3bwpJaE56Yk04bTlZb3A1dz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkRpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBHMwo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNSakNDQWMyZ0F3SUJBZ0lRQzZGYStoM2ZvTFZKUksvTkpLQnM3REFLQmdncWhrak9QUVFEQXpCbE1Rc3dDUVlEVlFRR0V3SlYKVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sY25RdVkyOXRNU1F3SWdZRApWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnZiM1FnUnpNd0hoY05NVE13T0RBeE1USXdNREF3V2hjTk16Z3dNVEUxCk1USXdNREF3V2pCbE1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjMKZDNjdVpHbG5hV05sY25RdVkyOXRNU1F3SWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdmIzUWdSek13ZGpBUQpCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVFaNTd5c1JHWHR6YmcvV1B1TnNWZXBSQzBGRmZMdkMvOFFkSisxWWxKZlpuNGY1ZHdiClJYa0x6TVpUQ3AyTlhRTFpxVm5lQWxyMmxTb09qVGhLaWtuR3ZNWURPQWRmVmRwK0NXN2lmMTdRUlNBUFdYWVExcUFrOEMzZU52SnMKS1RtalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01CMEdBMVVkRGdRV0JCVEwwTDJwNFpnRgpVYUZOTjZLRGVjNk5IU3JraERBS0JnZ3Foa2pPUFFRREF3Tm5BREJrQWpBbHBJRkZBbXNTUzNWMFQ4Z2o0M0R5ZFhMZWZJbnd6NUZ5CllaNWVFSkpaVnJtRHh4RG5PT2xZSmpaOTFlUTBoamtDTUh3MlUvQXc1V0pqT3BuaXRxTTdtelQ2SHRvUWtuRmVrUk9uM2FSdWtzd3kKMXZVaFpzY3Y2cFpqYW1WRmtwVUJ0QT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkRpZ2lDZXJ0IEdsb2JhbCBSb290IEcyCj09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEampDQ0FuYWdBd0lCQWdJUUF6cng1cWNScWFDN0tHU3hIUW42NVRBTkJna3Foa2lHOXcwQkFRc0ZBREJoTVFzd0NRWURWUVFHCkV3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmxjblF1WTI5dE1TQXcKSGdZRFZRUURFeGRFYVdkcFEyVnlkQ0JIYkc5aVlXd2dVbTl2ZENCSE1qQWVGdzB4TXpBNE1ERXhNakF3TURCYUZ3MHpPREF4TVRVeApNakF3TURCYU1HRXhDekFKQmdOVkJBWVRBbFZUTVJVd0V3WURWUVFLRXd4RWFXZHBRMlZ5ZENCSmJtTXhHVEFYQmdOVkJBc1RFSGQzCmR5NWthV2RwWTJWeWRDNWpiMjB4SURBZUJnTlZCQU1URjBScFoybERaWEowSUVkc2IySmhiQ0JTYjI5MElFY3lNSUlCSWpBTkJna3EKaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF1emZOTk54N2E4bXlhSkN0U25YL1Jyb2hDZ2lOOVJsVXlmdUkyL091OGpxSgprVHg2NXFzR0dtdlByQzNvWGdra1JMcGltbjdXbzZoKzRGUjFJQVdzVUxlY1l4cHNNTnphSHhteDF4N2UvZGZneTVTRE42N3NIME5PCjNYc3MwcjB1cFMva3FiaXRPdFNacExZbDZadHJBR0NTWVA5UElVa1k5MmVRcTJFR25JL3l1dW0wNlpJeWE3WHpWK2hkRzgyTUhhdVYKQkpWSjh6VXRsdU5KYmQxMzQvdEpTN1NzVlFlcGo1V3p0Q083VEcxRjhQYXBzcFV3dFAxTVZZd25TbGNVZklLZHpYT1MweFpLQmd5TQpVTkdQSGdtK0Y2SG1JY3I5ZytVUXZJT2xDc1JuS1BaekZCUTlSbmJEaHhTSklUUk5ydzlGREtaSm9icTduTVd4TTRNcGhRSURBUUFCCm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQmhqQWRCZ05WSFE0RUZnUVVUaUpVSUJpVjV1TnUKNWcvNitya1M3UVlYanprd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFHQm5LSlJ2RGtoajZ6SGQ2bWNZMVlsOVBNV0xTbi9wdnRzcgpGOSt3WDNOM0tqSVRPWUZuUW9RajhrVm5OZXlJdi9pUHNHRU1OS1N1SUV5RXh0djROZUYyMmQrbVFydkhSQWlHZnpaMEpGcmFiQTBVCldUVzk4a25kdGgvSnN3MUhLajJaTDd0Y3U3WFVJT0daWDFOR0ZkdG9tL0R6TU5VK01lS05oSjdqaXRyYWxqNDFFNlZmOFBsd1VIQkgKUVJGWEdVN0FqNjRHeEpVVEZ5OGJKWjkxOHJHT21hRnZFN0ZCY2Y2SUtzaFBFQ0JWMS9NVVJlWGdSUFRxaDVVeWt3NytVMGI2TEozLwppeUs1UzlrSlJhVGVwTGlhV04wYmZWS2ZqbGxEaUlHa25pYlZiNjNkRGNZM2ZlMERraHZsZDE5MjdqeU54RjFXVzZMWlptNnpOVGZsCk1yWT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRGlnaUNlcnQgR2xvYmFsIFJvb3QgRzMKPT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNQekNDQWNXZ0F3SUJBZ0lRQlZWV3ZQSmVwRFUxdzZRUDFhdEZjakFLQmdncWhrak9QUVFEQXpCaE1Rc3dDUVlEVlFRR0V3SlYKVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sY25RdVkyOXRNU0F3SGdZRApWUVFERXhkRWFXZHBRMlZ5ZENCSGJHOWlZV3dnVW05dmRDQkhNekFlRncweE16QTRNREV4TWpBd01EQmFGdzB6T0RBeE1UVXhNakF3Ck1EQmFNR0V4Q3pBSkJnTlZCQVlUQWxWVE1SVXdFd1lEVlFRS0V3eEVhV2RwUTJWeWRDQkpibU14R1RBWEJnTlZCQXNURUhkM2R5NWsKYVdkcFkyVnlkQzVqYjIweElEQWVCZ05WQkFNVEYwUnBaMmxEWlhKMElFZHNiMkpoYkNCU2IyOTBJRWN6TUhZd0VBWUhLb1pJemowQwpBUVlGSzRFRUFDSURZZ0FFM2FmWnU0cTRDL3NMZnlIUzhMNitjL016WFJxOE5PcmV4cHU4MEpYMjhNelFDN3BoVzFGR2ZwNHRuKzZPCll3d1g3QWR3OWMrRUxrQ0RuT2cvUVcwN3JkT2tGRmsyZUowRFErNFFFMnh5M3E2SXA2RnJ0VVBPWjl3ai93TWNvK0krbzBJd1FEQVAKQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQmhqQWRCZ05WSFE0RUZnUVVzOXRJcFBtaHhkaXVOa0hNRVdOcApZaW04UzhZd0NnWUlLb1pJemowRUF3TURhQUF3WlFJeEFLMjg4bXcvRWtyUkxUbkRDZ21YYy9TSU5veUlKN3ZtaUkxUWhhZGorWjR5CjNtYVREL0hNc1FtUDNXeXIrbXQvb0FJd09XWmJ3bVNOdUo1UTNLalZTYUx0eDl6UlNYOFhBYmpJaG85T2pJZ3JxSnFwaXNYUkFMMzQKVk9LYTVWdDhzeWNYCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkRpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNAo9PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZrRENDQTNpZ0F3SUJBZ0lRQlpzYlY1Nk9JVExpT1FlOXAzZDFYREFOQmdrcWhraUc5dzBCQVF3RkFEQmlNUXN3Q1FZRFZRUUcKRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObGNuUXVZMjl0TVNFdwpId1lEVlFRREV4aEVhV2RwUTJWeWRDQlVjblZ6ZEdWa0lGSnZiM1FnUnpRd0hoY05NVE13T0RBeE1USXdNREF3V2hjTk16Z3dNVEUxCk1USXdNREF3V2pCaU1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjMKZDNjdVpHbG5hV05sY25RdVkyOXRNU0V3SHdZRFZRUURFeGhFYVdkcFEyVnlkQ0JVY25WemRHVmtJRkp2YjNRZ1J6UXdnZ0lpTUEwRwpDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQy81cEJ6YU42NzVGMUtQREFpTUdrejdNS25KUzdKSVQzeWl0aFp3dUVwCnB6MVlxM2FhemE1N0c0UU54REFmOHh1a09CYnJWc2FYYlIycnNubnl5aEhTNUYvV0JUeFNEMUlmeHA0VnBYNituNmxYRmxsVmNxOW8KazNEQ3NycDFtV3B6TXBUUkVFUVFMdCtDOHdlRTVuUTdiWEhpTFF3YjdpRFZ5U0FkWXlrdHp1eGVUc2lUK0NGaG16VHJCY1plN0ZzYQp2T3ZKejgyc05FQmZzWHBtN25mSVNLaG1WMWVmVkZpT0RDdTNUNmN3MlZidXludGQ0NjNKVDE3bE5lY3h5OXFUWHR5T2o0RGF0cEdZClFKQjV3M2pIdHJIRXRXb1lPQU1RamRqVU42UXVCWDJJOVlJK0VKRndxMVdDUVRMWDJ3UnpLbTZSQVh3aFROUzhyaHNEZFYxNFp0azYKTVVTYU0wQy9DTmRhU2FUQzVxbWdaOTJrSjd5aFR6bTFFVmdYOXlSY1JvOWs5OEZwaUhhWWRqMVpYVUoyaDRtWGFYcEk4T0NpRWh0bQptblRLM2tzZTV3NWpydWJVNzVLU09wNDkzQURrUlNXSnRwcEVHU3Qrd0pTMDBtRnQ2elBaeGQ5TEJBRE1mUnlWdzQvM0liS3lFYmU3CmYvTFZqSEFzUVdDcXNXTVlSSlVhZG1KKzlvQ3crK2hrcGpQUmlRZmh2YmZtUTZRWXVLWjNBZUVQbEF3aEhiSlVLU1dKYk9VT1VsRkgKZEw0bXJMWkJkZDU2ckYrTlA4bTgwMEVSRWx2bEVGRHJNY1hLY2hZaUNkOThUSFUvWSt3aFg4UWdVV3R2c2F1R2kwL0Mxa1ZmblNEOApvUjdGd0kraXNYNEtKcG4xNUdrdm1CMHQ5ZG1wc2gzbEd3SURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkCkR3RUIvd1FFQXdJQmhqQWRCZ05WSFE0RUZnUVU3TmZqZ3RKeFhXUk0zeTVuUCtlNm1LNGNEMDh3RFFZSktvWklodmNOQVFFTUJRQUQKZ2dJQkFMdGgyWDJwYkw0WHhKRWJ3NkdpQUkzalpHZ1BWczkzcm5ENS9acEttYm5KZUZ3TURGL2s1aFFwVmdzMlNWMUVZK0N0bkpZWQpaaHNqRFQxNTZXMXIxbFQ0MGp6QlEwQ3VIVkQxVXZ5UU83dVltV2xyeDhHbnFHaWtKOXlkK1NldU1JVzU5bWROT2o2UFdUa2lVMFRyCnlGMER5dTFRZW4xaUlRcUF5SE5tMGFBRllGL29wYlNucjZqM2JUV2NmRnFLMXFJNG1mTjRpL1JOMGlBTDNnVHVqSnRIZ1hJTndCUXkKN3pCWkxxN2djZkpXNUdxWGI1SlFiWmFOYUhxYXNqWVVlZ2J5SkxrSkVWRFhDTEc0aVhxRUkyRkNLZVdqemFJZ1FkZlJuR1RaNmlhaAppeFRYVEJteVVFRnhQVDlOY0NPR0RFcmNnZExNTXBTRURRZ0pseHhQd081cklIUXcwdUE1TkJDRklSVUJDT2hWTXQ1eFNka29GMUJOCjVyNU4wWFdzME1yN1FiaERwYXJUd3dWRVR5dzJtK0w2NGtXNEkxTnNCbTluVlg5R3RVdy9iaWhhZVNiU3BLaGlsOUllNHUxS2k3d2IKL1VkS0RkOW5abjZ5VzBIUU8rVDBPL1FFWStudndsUUFVYUNLS3NuT2VNelY2b2NFR0xQT3IwbUlyL09TbWJhejVtRVAwb1VBNTFBYQo1QnVWblJtaHVaeXhtN0VBSHUvUUQwOUNiTWtLdk81RCtqcHhwY2hOSnFVMS9ZbGR2SVZpSFRMU29DdFU3WnBYd2R2NkVNOFp0NHRLCkc0OEJ0aWVWVStpMmlXMWJ2R2pVSStpTFVhSlcrZkNtZ0tEV0hyTzhEdzlUZFNtcTZoTjM1TjZNZ1NHdEJ4QkhFYTJIUFFmUmRielAKODJaKwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDT01PRE8gUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYyRENDQThDZ0F3SUJBZ0lRVEtyNXl0dGpiK0FmOTA3WVd3T0duVEFOQmdrcWhraUc5dzBCQVF3RkFEQ0JoVEVMTUFrR0ExVUUKQmhNQ1IwSXhHekFaQmdOVkJBZ1RFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUVCeE1IVTJGc1ptOXlaREVhTUJnRwpBMVVFQ2hNUlEwOU5UMFJQSUVOQklFeHBiV2wwWldReEt6QXBCZ05WQkFNVElrTlBUVTlFVHlCU1UwRWdRMlZ5ZEdsbWFXTmhkR2x2CmJpQkJkWFJvYjNKcGRIa3dIaGNOTVRBd01URTVNREF3TURBd1doY05Nemd3TVRFNE1qTTFPVFU1V2pDQmhURUxNQWtHQTFVRUJoTUMKUjBJeEd6QVpCZ05WQkFnVEVrZHlaV0YwWlhJZ1RXRnVZMmhsYzNSbGNqRVFNQTRHQTFVRUJ4TUhVMkZzWm05eVpERWFNQmdHQTFVRQpDaE1SUTA5TlQwUlBJRU5CSUV4cGJXbDBaV1F4S3pBcEJnTlZCQU1USWtOUFRVOUVUeUJTVTBFZ1EyVnlkR2xtYVdOaGRHbHZiaUJCCmRYUm9iM0pwZEhrd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNSNkZTUzBncFdzYXdOSk4zRnowUm4KZEprck42TjlJM0FBY2J4VDM4VDZLaEtQUzM4UVZyMmZjSEszWVgvSlN3OFhwejNqc0FSaDd2OFJsOGYwaGo0SytqNWMrWlBtTkhyWgpGR3ZubkxPRm9JSjZkcTl4a05mcy9RMzZuR3o2MzdDQzlCUisrYjdFcGk5UGY1bC90ZnhuUTNLOURBRFdpZXRyTE5QdGo1Z2NGS3QrCjVlTnUvTmlvNUpJazJrTnJZcmhWL2VyQnZHeTJpL01Palpya20yeHBtZmg0U0RCRjFhM2hEVHhGWVB3eWxsRW52R2ZEeWk2MmErcEcKeDhjZ29MRWZaZDVJQ0xxa1RxbnlnMFkzaE92b3pJRklRMmRPY2lxYlhMMU1HeWlLWENKN3RLdVkyZTdnVVlQRENVWk9iVDZaK3BVWAoybnd6VjBFOGpWSHRDN1pjcnl4akd0OVh5RCs4NlYzRW02OUZtZUtqV2lTMHVxbFdQYzl2cXY5SldMN3dxUC8wdUszcE4vdTZ1UFFMCk92bm9RMEllaWRpRXl4UHgyYnZoaVdDNGpDaFdyQlFkbkFybmNldlBEdDA5cVphaFNMMDg5NisxRFNKTXdCR0I3Rlk3OXRPaTRsdTMKc2dRaVVwV0FrMm5vamt4bDhaRURMWEIwQXVxTFp4VXBhVklDdTlmZlVHcFZScitnb3loaGYzRFF3NktxTENHcVI4NG9uQVpGZHIrQwpHQ2UwMWE2MHkxRG1hL1JNaG5FdzZhYmZGb2JnMlA5QTNmdlFRb2gvb3pNNkxsd2VRUkdCWTg0WWNXc3I3S2FLdHpGY09tcEg0TU41CldkWWdHcS95YXBpcWNyeFhTdEpMbmJzUS9MQk1RZVh0SFQxZUtKMmN6TCt6VWRxblIrV0VVd0lEQVFBQm8wSXdRREFkQmdOVkhRNEUKRmdRVXU2OStBajM2cHZFOGhJNnQ3amlZN05reU10UXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4dwpEUVlKS29aSWh2Y05BUUVNQlFBRGdnSUJBQXJ4MVVhRXQ2NVJ1Mnl5VFVFVUFKTk1uTXZsd0ZUUG9DV09Bdm45c0tJTjlTQ1lQQk10CnJGYWlzTlorRVpMcExycWVMcHB5c2IwWlJHeGhOYUthdEJZU2FWcU00ZGMrcEJyb0x3UDBybUVkRUJzcXBJdDZ4ZjRGcHVIQTFzaisKbnE2UEs3bzltZmpZY3dsWVJtNm1uUFRYSjlPVjJqZURjaHpUYytDaVI1a0RPRjNWU1hrQUtSekg3SnNnSEFja2FWZDRzam44T29TZwp0Wng4amI4dWsySW50em5hRnhpdXZUd0phUCtFbXp6VjFnc0Q0MWVlRlBmUjYwL0l2WWNqdDdaSlEzbUZYTHJya2d1aHh1aG9xRXdXCnNScVpDdWhUTEpLN29Ra1lkUXhscUh2TEk3Y2F3aWlGd3h2LzBDdGk3NlI3Q1pHWVo0d1VBYzFvQm1waklYVURnSWlLYm9IR2hmS3AKcEMzbjlLVWtFRWVEeXMzMGpYbFlzUWFiNXhvcTJaMEIxNVI5N1FOS3l2RGI2S2tCUHZWV21ja2Vqa2s5dStVSnVlQlBTWkk5Rm9KQQp6TXhaeHVZNjdSSXVhVHhzbGJIOXFoMTdmNGErSGc0eVJ2djdFNDkxZjB5TFMwWmovZ0EwUUhEQnc3bWgzYVp3NGdTelFienBnSkhxClpKeDY0U0lEcVp4dWJ3NWxUMnlIaDE3emJxRDVkYVdiUU9oVHNpZWRTcm5BZHlHTi80ZnkzcnlNN3hmZnQwa0wwZkp1TUFzYURrNTIKN1JIODllbFdzbjIveDIwS2s0eWwwTUMySGI0NlRwU2kxMjVzQzhLS2ZQb2c4OFRrNWMwTnFNdVJrckY4aGV5MUZHbG1Eb0xuemM3SQpMYVpSZnlIQk5WT0ZCa3BkbjYyN0cxOTAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGM2pDQ0E4YWdBd0lCQWdJUUFmMXRNUHlqeWxHb0c3eGtEalVETFRBTkJna3Foa2lHOXcwQkFRd0ZBRENCaURFTE1Ba0dBMVVFCkJoTUNWVk14RXpBUkJnTlZCQWdUQ2s1bGR5QktaWEp6WlhreEZEQVNCZ05WQkFjVEMwcGxjbk5sZVNCRGFYUjVNUjR3SEFZRFZRUUsKRXhWVWFHVWdWVk5GVWxSU1ZWTlVJRTVsZEhkdmNtc3hMakFzQmdOVkJBTVRKVlZUUlZKVWNuVnpkQ0JTVTBFZ1EyVnlkR2xtYVdOaApkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NVEF3TWpBeE1EQXdNREF3V2hjTk16Z3dNVEU0TWpNMU9UVTVXakNCaURFTE1Ba0dBMVVFCkJoTUNWVk14RXpBUkJnTlZCQWdUQ2s1bGR5QktaWEp6WlhreEZEQVNCZ05WQkFjVEMwcGxjbk5sZVNCRGFYUjVNUjR3SEFZRFZRUUsKRXhWVWFHVWdWVk5GVWxSU1ZWTlVJRTVsZEhkdmNtc3hMakFzQmdOVkJBTVRKVlZUUlZKVWNuVnpkQ0JTVTBFZ1EyVnlkR2xtYVdOaApkR2x2YmlCQmRYUm9iM0pwZEhrd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNBRW1VWE5nN0Qyd2l6CjBLeFhEWGJ0elNmVFRLMVFnMkhpcWlCTkNTMWtDZHpPaVovTVBhbnM5cy9CM1BIVHNkWjdOeWdSSzBmYU9jYThPaG0wWDZhOWZaMmoKWTBLMmR2S3BPeXVSK09KdjBPd1dJSkFKUHVMb2RNa1l0SkhVWW1UYmY2TUc4WWdZYXBBaVBMeitFL0NIRkh2MjVCK08xT1JSeGhGbgpSZ2hSeTRZVVZEKzhNLzUrYkp6L0ZwMFl2VkdPTmFhblpzaHlaOXNoWnJIVW0zZ0R3RkE2Nk16dzNMeWVUUDZ2QlpZMUgxZGF0Ly9PCitUMjNMTGIyVk4zSTV4STZUYTVNaXJkY21yUzNJRDNLZnlJMHJuNDdhR1lCUk9jQlRrWlRtek5nOTVTK1V6ZVFjMFB6TXNOVDc5dXEKL25ST2FjZHJqR0NUM3NUSEROL2hNcTdNa3p0UmVKVm5pKzQ5VnY0TTBHa1BHdy96SlNack0yMzNia2Y2YzBQbGZnNmxackVwZkRLRQpZMVdKeEEzQmsxUXdHUk9zMDMwM3ArdGRPbXcxWE50QjF4TGFxVWtMMzlpQWlnbVRZbzYxWnM4bGlNMkV1TEUvcERrUDJRS2U2eEpNCmxYenphd1dwWGhhRHpMaG40dWdUbmN4Ymd0Tk1zKzFiLzk3bGM2d2pPeTBBdnpWVmRBbEoyRWxZR24rU051WlJrZzd6Sm4wY1RSZTgKeWV4REp0Qy9RVjlBcVVSRTlKbm5WNGVlVUI5WFZLZysvWFJqTDdGUVpRbm1XRUl1UXhwTXRQQWxSMW42QkI2VDFDWkdTbENCc3Q2KwplTGY4WnhYaHlWZUVIZzlqMXVsaXV0WmZWUzdxWE1Zb0NBUWxPYmdPSzZueVRKY2NCejhOVXZYdDd5K0NEd0lEQVFBQm8wSXdRREFkCkJnTlZIUTRFRmdRVVUzbS9XcW9yU3M5VWdPSFltOENkOHJJRFpzc3dEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUYKTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVNQlFBRGdnSUJBRnpVZkEzUDl3RjlRWmxsREhQRlVwL0wrTStaQm44YjJrTVZuNTRDVlZlVwpGUEZTUENlSGxDanRIem9CTjZKMi9GTlF3SVNieG10T3Vvd2hUNktPVldLUjgya1YyTHlJNDhTcUMvM3ZxT2xMVlNvR0lHMVZlQ2taCjdsOHdYRXNrRVZYL0pKcHVYaW9yN2d0Tm4zLzNBVGlVRkpWREJ3bjdZS251SEtzU2pLQ2FYcWVZYWxsdGl6OEkrOGpSUmE4WUZXU1EKRWc5ektDN0Y0aVJPL0ZqczhQUkYvaUt6NnkrTzB0bEZZUVhCbDIrb2RuS1BpNHcycjc4TkJjNXhqZWFtYng5c3BuRml4ZGpRZzNJTQo4V2NSaVF5Y0UweHlOTis4MVhIZnFuSGQ0YmxzakR3U1hXWGF2VmNTdGtOci8rWGVUV1lSVWMrWnJ1d1h0dWh4a1l6ZVNmN2ROWEdpCkZTZVVITTloNHlhN2I2Tm5KU0ZkNXQwZEN5NW9HenVDcit5RFo0WFVtRkYwc2JtWmdJbi9mM2daWEhsS1lDNlNRSzVNTnlvc3ljZGkKeUE1ZDl6WmJ5dUFsSlFHMDNSb0huSGNBUDlEYzFldzkxUHE3UDh5RjFtOS9xUzNmdVFMMzlaZWF0VFhhdzJld2gwcXBLSjRqanY5YwpKMnZoc0UvekIrNEFMdFJaaDh0U1FaWHE5RWZYN21SQlZYeU5XUUtWM1dLZHdybnVXaWgwaEtXYnQ1REhEQWZmOVlrMmRETFdLTUd3CnNBdmduRXpESE5iODQybTFSMGFCTDZLQ3E5TmpSSERFamY4dE03cXRqM3UxY0lpdVBoblBRQ2pZL01pUXUxMlpJdlZTNWxqRkg0Z3gKUSs2SUhkZkdqanhEYWgybkdONTlQUmJ4WXZuS2tLajkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVVNFUlRydXN0IEVDQyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDanpDQ0FoV2dBd0lCQWdJUVhJdVp4VnFVeGRKeFZ0N05pWURNSmpBS0JnZ3Foa2pPUFFRREF6Q0JpREVMTUFrR0ExVUVCaE1DClZWTXhFekFSQmdOVkJBZ1RDazVsZHlCS1pYSnpaWGt4RkRBU0JnTlZCQWNUQzBwbGNuTmxlU0JEYVhSNU1SNHdIQVlEVlFRS0V4VlUKYUdVZ1ZWTkZVbFJTVlZOVUlFNWxkSGR2Y21zeExqQXNCZ05WQkFNVEpWVlRSVkpVY25WemRDQkZRME1nUTJWeWRHbG1hV05oZEdsdgpiaUJCZFhSb2IzSnBkSGt3SGhjTk1UQXdNakF4TURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0JpREVMTUFrR0ExVUVCaE1DClZWTXhFekFSQmdOVkJBZ1RDazVsZHlCS1pYSnpaWGt4RkRBU0JnTlZCQWNUQzBwbGNuTmxlU0JEYVhSNU1SNHdIQVlEVlFRS0V4VlUKYUdVZ1ZWTkZVbFJTVlZOVUlFNWxkSGR2Y21zeExqQXNCZ05WQkFNVEpWVlRSVkpVY25WemRDQkZRME1nUTJWeWRHbG1hV05oZEdsdgpiaUJCZFhSb2IzSnBkSGt3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBUWFyRlJhcWZsb0krZDYxU1J2VThaYTJFdXJ4dFcyCjBlWnpjYTdkbk5ZTVlmM2JvSWtEdUFVVTdGZk83bDAvNGlHenp2ZlVpbm5nbzROK0xaZlFZY1R4bWR3bGtXT3JmekNqdEhEaXg2RXoKblBPL0xseFRzVit6ZlRKL2lqVGplWG1qUWpCQU1CMEdBMVVkRGdRV0JCUTY0UW1HMU04WndwWjJkRWwyM09BMXhtTmptakFPQmdOVgpIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFLQmdncWhrak9QUVFEQXdOb0FEQmxBakEyWjZFV0NOemtsd0JCCkhVNis0V01Cenp1cVFoRmtvSjJVT1FJUmVWeDdIZnBrdWU0V1FyTy9pc0lKeE96a3NVMENNUURwS21GSGpGSktTMDRZY1BiV1JOWnUKOVlPNmJWaTlKTmxXU09ydnhLSkdnWWhxT2tiUnFadE55V0hhMFYxWGFoZz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1Cj09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0hqQ0NBYVNnQXdJQkFnSVJZRmxKNENZdXUxWDVDbmVLY2ZsSzJHd3dDZ1lJS29aSXpqMEVBd013VURFa01DSUdBMVVFQ3hNYgpSMnh2WW1Gc1UybG5iaUJGUTBNZ1VtOXZkQ0JEUVNBdElGSTFNUk13RVFZRFZRUUtFd3BIYkc5aVlXeFRhV2R1TVJNd0VRWURWUVFECkV3cEhiRzlpWVd4VGFXZHVNQjRYRFRFeU1URXhNekF3TURBd01Gb1hEVE00TURFeE9UQXpNVFF3TjFvd1VERWtNQ0lHQTFVRUN4TWIKUjJ4dlltRnNVMmxuYmlCRlEwTWdVbTl2ZENCRFFTQXRJRkkxTVJNd0VRWURWUVFLRXdwSGJHOWlZV3hUYVdkdU1STXdFUVlEVlFRRApFd3BIYkc5aVlXeFRhV2R1TUhZd0VBWUhLb1pJemowQ0FRWUZLNEVFQUNJRFlnQUVSMFVPbHZ0OVhiL3BPZEVoK0o4THR0VjdIcEk2ClNGa2M4R0l4TGNCNktQNGFwMXl6dHN5WDUwWFVXUHJSZDIxRG9zQ0haVFFLSDNyZDZ6d3pvY1dkVGFSdlFaVTRmOGtlaE92Um5rbVMKaDVTSEREcUZTbWFmblZtVFRaZGhCb1pLbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZApCZ05WSFE0RUZnUVVQZVlwU0p2cUI4b2hSRW9tM203ZTBvUFFuMWt3Q2dZSUtvWkl6ajBFQXdNRGFBQXdaUUl4QU9WcEVzbHUyOFl4CnVnbEI0WmY0Ky8yYTRuMFN5ZTE4Wk5QTEJTV0xWdG1nNTE1ZFRndURuRnQyS2FBSkppRnFZZ0l3Y2RLMWoxenFPK0Y0Q1lXb2RaSTcKeUZ6OVNPOE5kQ0tvQ09KdXhVbk94d3k4cDJGcDhmYzc0U3JMK1N2elpwQTMKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKSWRlblRydXN0IENvbW1lcmNpYWwgUm9vdCBDQSAxCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRllEQ0NBMGlnQXdJQkFnSVFDZ0ZDZ0FBQUFVVWp5RVMxQUFBQUFqQU5CZ2txaGtpRzl3MEJBUXNGQURCS01Rc3dDUVlEVlFRRwpFd0pWVXpFU01CQUdBMVVFQ2hNSlNXUmxibFJ5ZFhOME1TY3dKUVlEVlFRREV4NUpaR1Z1VkhKMWMzUWdRMjl0YldWeVkybGhiQ0JTCmIyOTBJRU5CSURFd0hoY05NVFF3TVRFMk1UZ3hNakl6V2hjTk16UXdNVEUyTVRneE1qSXpXakJLTVFzd0NRWURWUVFHRXdKVlV6RVMKTUJBR0ExVUVDaE1KU1dSbGJsUnlkWE4wTVNjd0pRWURWUVFERXg1SlpHVnVWSEoxYzNRZ1EyOXRiV1Z5WTJsaGJDQlNiMjkwSUVOQgpJREV3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ25VQm5lUDVrOTFETkc4VzlSWVlLeXFVK1BaNGxkCmhObFQzUXdvMmRmdy82NlZRM0taK2JWZGZJckJRdUV4VUhUUmdRMTh6WnNocTBQaXJLMWVobTd6Q1lvZldqSzlvdXVVK2VoY0N1ei8KbU5LdmNiTzBVNTlPaCsrU3ZMM3NUekl3aUVzWFhsZkVVOEwyQXBlTjJXSXJ2eVFmWW8zZnc3Z3BTMGw0UEpOZ2lDTDhtZG8yeU1LaQoxQ3hVQUdjMWJuTy9BbGp3cE4zbHNLSW1lc3JnTnFVWkZ2WDl0Kyt1UDBEMWJWb0UvYzQweWlUY2RDTWJYVE1URWwzRUFTWDJNTjBDClhaL2cxVWU5dE9zYm9idEpTZGlmV3dMeml1UWtrT1JpVDAvQnI0c09kQmVvMFhLSWFub0JTY3kwUm5uR0Y3SGFtQjRIV2ZwMUlZVmwKM1pCV3p2dXJwV0NkeEozNVVyQ0x2WWY1anlzakNpTjJPL2N6NGNrQTgybjVTNkxnVHJ4K2t6bUVCL2RFY0g3K0IxcmxzYXpSR016eQpOZVZKU1FqS1ZzazkrdzhZZllzN3dSUENUWS9KVHc0MzZSK2hEbXJmWWk3TE5RWlJlU3pJSlRqMCtrdW5pVnljMHVNTk9ZWktkSHpWCldZZkNQMDRNWEZMMFBmZFNndkhxbzZ6OVNUUWFLUE5CaURvVDd1amUvNWtkWDdyTDZCN3l1VkJnd0RIVGMrWHZ2cUR0TXd0MHZpQWcKeEdkczhBZ0RlbFdBZjBaT2xxZjBIajdoOXRnSjRUTmtLMlBYTWw2ZitjQjdEM2h2bDd5VG12bWNFcEI0ZW9DSEZkZHlkSnhWZEhpeAp1dUZ1Y0FTNlQ2QzZhTU43L3pId2N6MDlsQ3F4QzBFT29QNU5pR1ZyZVRPMDF3SURBUUFCbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DCkFRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVU3VVFad05Qd0JvdnVwSHUrUXVjbVZNaU9Obll3RFFZSktvWkkKaHZjTkFRRUxCUUFEZ2dJQkFBMnVrREwycGt0OFJIWVpZUjRuS00xZVZPOGx2T01Ja1BrcDE2NW9DT0dVQUZqdkxpNStVMUtNdGx3SAo2b2k2bVl0UWxOZUNnTjloQ1FDVHJRMFU1czdCOGplVWVMQmZuTE9pYzdpUEJaTTR6WTArc0xqN3dNK3g4dXd0TFJ2TTdLcWFzNnBnCmdoc3RPOE9FUFZlS2xoNmNkYmpUTU0xZ0NJT1EwNDVVOFUxbXdGMTBBMENqN29WK3doOTNuQWJvd2FjWVhWS1Y3Y25kSlo1dCtxbnQKb3pvMDBGbDcydTFROHpXLzdlc1VUVEhIWVBUYThZZWM0a2ppeHNVMyt3WVErblZaWmpGSEtkcDJtaHpwZ3E3dm1ybFI5NGdqbW1tVgpZanpsVllBMjExUUMvL0c1WGM3VUkyL1lSWVJLVzJYdmlRemRGS2NneXhpbEpiUU4rUUh3b3RMMEFNaDBqcUVxU0k1bDJ4UEU0aVVYCmZldStoMXNYSUZSUmswcFRBd3ZzWGNvejdXTDlSY2N2Vzl4WW9JQTU1dnJYL2hNVXB1MDlsRXBDZE5URGQxbHp6WTlHdmxVNDcvcm8Ka1RMcWwxZ0VJdDQ0dzh5OGJja3pPbW9LYVQrZ3lPcHlqNHhqaGlPOWJUeVducFhnU1V5cW9ya3FHNXcyZ1hqdHcraEc0aVpaUkhVZQoyWFdKVWMwUWhKMWhZTXRkK1pjaVRZNlk1dU4vOWx1N3JzM0tTb0ZyWGd2elVlRjBLK2wrSjZmWm1VbE8rS1dBMnlVUEhHTmlpc2t6CloyczhFSVBHcmQ2b3pSYU9qZkFITjNHZjhxdjhRZlhCaSt3QU4xMEo1VTZBNy9xeFhEZ0dwUnRLNGR3NExUemNxeCtRR3RWS25PN1IKY0d6TTd2UlgrQmk2aEc2SAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWmpDQ0EwNmdBd0lCQWdJUUNnRkNnQUFBQVVVanowWjhBQUFBQWpBTkJna3Foa2lHOXcwQkFRc0ZBREJOTVFzd0NRWURWUVFHCkV3SlZVekVTTUJBR0ExVUVDaE1KU1dSbGJsUnlkWE4wTVNvd0tBWURWUVFERXlGSlpHVnVWSEoxYzNRZ1VIVmliR2xqSUZObFkzUnYKY2lCU2IyOTBJRU5CSURFd0hoY05NVFF3TVRFMk1UYzFNek15V2hjTk16UXdNVEUyTVRjMU16TXlXakJOTVFzd0NRWURWUVFHRXdKVgpVekVTTUJBR0ExVUVDaE1KU1dSbGJsUnlkWE4wTVNvd0tBWURWUVFERXlGSlpHVnVWSEoxYzNRZ1VIVmliR2xqSUZObFkzUnZjaUJTCmIyOTBJRU5CSURFd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUMySXBUOHBFaXY2RWRyQ3ZzbmR1VHkKUDRvN2Vrb3NNU3FNamJDcHd6RnJxSGQyaENhMnJJRkNEUWpyVlZpN2V2aThaWDN5b0cyTHFFZnBZblllRWU0SUZOR3lSQmIwNnRENgpIaTllMjh0elFhNjhBTEJLSzBDeXJPRTdTOEl0bmVTaG0rd2FPaDd3Q0xQUTVDUTFCNStjdE1sU2Jkc0h5bysxVy9DRDgwL0hMYVhJCnJjdVZJS1F4S0ZkWVd1U05HNXFybmcwTThnb3pPU0k1Q3BjdTgxTjN1VVJGL1lUTE5pQ0JXUzJhYjIxSVNHSEtUTjlUMGE5U3ZFU2YKcXk5cmczTHZkWURhQmpNYlhjamFZOFpOemF4bU1jM1IzajZIRURiaHVhUjY3MkJRc3N2S3BsYmdONityTkJNNUplZzVadVNZZXFvUwptSnhaWm9ZK3JmR3d5ajRHRDN2d0VVczNvRVJ0ZTh1b2pISDAxYldSTnN6d0ZjWXIzbEVYc1pkTVVEMnhsVmw4QlgwdElkVUF2d0ZuCm9sNTdwbHp5OXlMeGtBMlQyNnBFVVdiTWZYWUQ2MnFvS2pnWmwzWU5hNHBoK2J6MjduYjljQ3ZkS1R6NENoNWJRaHlMVmk5Vkd4eWgKTHJYSEZ1YjRxanlTam1tMkFjRzFocDJKRHdzNGxGVG82dHllUFNXOFV5YnQxYXM1cXNWQVRGU3JzclRaMmZqWGN0c2N2RzI5WlYvdgppRFVxWmkvdTlyTmw4RE9OZkpoQmFVWVBReHhwK3B1MTBHRnF6Y3BMMlV5UVJxc1ZXYUZIVkNrdWd5aGZITUtpcTNJWEFBYU9SZXlMCjRqTTlmOW9aUk9SaWNzUGZJc2J5VnRUZFg1Vnk3VzFmOTBnRFcvM0ZLcUQyY3lPRUVCc0I1d0lEQVFBQm8wSXdRREFPQmdOVkhROEIKQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVNDNIZ250aW5RdG5iY1pGcmxKUHJ3NlBSRktNdwpEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUJBRWY2M1Fxd0VaRTRyVTFkOStVT2wxUVpna2lIVkl5cVpKbllXdjZJQWNWWXBabXhJMVFqCnQyb2RJRmZsQVdKQkY5TUoyM1hMYmxTUWRmNGFuNEVLd3QzWDl3blFXM0lWNUI0SmFqMHo4eUdhNWhWK3JWSFZEUkR0ZlVMQWorN0EKbWdqVlFkWmNEaUZwYm9CaERoWEF1TS9GU1JKU3pMNDZ6TlF1T0FYZU5mMGZiN2lBYUpnOVRhREtRR1hTYzN6MWk5a0tsVC9ZUHlOdApHdEVxSkJuWmhiTVg3M2h1cVZqUkk5UEhFKzF5Slg5ZHNYTncwSDhHbHdtRUtZQmhIZnBlLzNPc29PT0p1Qnh4RmNiZU1YOFMzT0Z0Cm02L242SjkxZUV5clJqdWF6cjhGR0YxTkZUd1dtaGxRQkpxeW1tOWxpMUpmUEZnRUtDWEFabUV4ZnJuZ2Ria2FxSUhXY2hlenhRTXgKTlJGNGVLTGc2VENNZjREZldOODh1aWVXNG9BMGJlT1kwMlFuckVoK0tIZGN4aVZoSmZpRkRHWDZ4REl2cFpnRjVQZ0xaeFlXeG9LNApNaG41K2JsNTNCL042NityRHQwYjIwWGtldWNDNHBWZC9HbndVMmxobFhWNUMxNVY1amdjbEtsWk01N0ljWFI1ZjFHSnRzaHF1RERJCmFqakRicDdoTnhicUJXSk1XeEpIN2FlMHMxaFd4MG56ZnhKb0NURng4RzM0VGtmNzFvWHV4VmhBR2FRZHAvbExRemZjYUZwUHordkMKWkhUZXRCWFo5RlJVR2k4YzE1ZHhWSkNPMlNDZFV5dC9xNC9pNmpDOFVEZnY4VWUxZlh3c0JPeG9uYlJKUkJEMGNrc2NaT2Y4NW11UQozV2w5YWYwQVZxVzNyTGF0dDhvK0FlK2MKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVQakNDQXlhZ0F3SUJBZ0lFU2xPTUtEQU5CZ2txaGtpRzl3MEJBUXNGQURDQnZqRUxNQWtHQTFVRUJoTUNWVk14RmpBVUJnTlYKQkFvVERVVnVkSEoxYzNRc0lFbHVZeTR4S0RBbUJnTlZCQXNUSDFObFpTQjNkM2N1Wlc1MGNuVnpkQzV1WlhRdmJHVm5ZV3d0ZEdWeQpiWE14T1RBM0JnTlZCQXNUTUNoaktTQXlNREE1SUVWdWRISjFjM1FzSUVsdVl5NGdMU0JtYjNJZ1lYVjBhRzl5YVhwbFpDQjFjMlVnCmIyNXNlVEV5TURBR0ExVUVBeE1wUlc1MGNuVnpkQ0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUMwZ1J6SXcKSGhjTk1Ea3dOekEzTVRjeU5UVTBXaGNOTXpBeE1qQTNNVGMxTlRVMFdqQ0J2akVMTUFrR0ExVUVCaE1DVlZNeEZqQVVCZ05WQkFvVApEVVZ1ZEhKMWMzUXNJRWx1WXk0eEtEQW1CZ05WQkFzVEgxTmxaU0IzZDNjdVpXNTBjblZ6ZEM1dVpYUXZiR1ZuWVd3dGRHVnliWE14Ck9UQTNCZ05WQkFzVE1DaGpLU0F5TURBNUlFVnVkSEoxYzNRc0lFbHVZeTRnTFNCbWIzSWdZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXMKZVRFeU1EQUdBMVVFQXhNcFJXNTBjblZ6ZENCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlDMGdSekl3Z2dFaQpNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUM2aExaeTI1NE1hK0taNlRBQnAzYnFNcmlWUVJySjJtRk9XSExQCi92YUNlYjl6WVFZS3BTZllzMS9UUlU0Y2N0Wk9Ndkp5aWcvM2d4blFhb0NBQUVVZXNNZm5tcjhTVnljY28yZ3ZDb2U5YW1zT1htWHoKSEhmVjFJV05jQ0cwc3pMbmk2TFZoamtDc2JqU1I4N2t5VW5FTzZmZSsxUjlWNzd3Nkc3Q2ViSTZDMVhpVUpnV01oTmNMM2hXd2NLVQpzL0phNUNlYW55VFh4dXpRbXlXQzQ4ekN4RVhGakpkNkJtc3FFWitwQ201SU8yL2IxQkVaUXZlUEI3LzFVMStjUHZRWExPWnByRTR5ClRHSjM2cmZvNWJzMHZCbUxycHhSNTdkK3RWT3hNeUxsYmM5d1BCcjY0cHRudG9QMGphV3ZZa3hONEZpc1pEUVNBL2kyalpSakpLUngKQWdNQkFBR2pRakJBTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJxY2laNgowQjd2ZmVjN2FWSFViSTJma0JKbXF6QU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFlWjhkbHNhMmVUOGlqWWZUaHdNRVlHcHJtaTVaCmlYTVJyRVBSOVJQL2pUa3J3UEs5VDNDTXFTL3FGOFFMVko3VUc1YVlNenlvcldLaUFIYXJXV2x1QmgxK3hMbEVqWml2RXRSaDJ3b1oKUmtmejYvZGp3VUFGUUtYU3QvUzFtamEvcVloMmlBUlZCQ3VjaDM4YU56eCtMYVVhMk5TSlhzcTlyRDFzMkcydjFmTjJEODA3aURnaQpuV3lUbXNROXY0SWJaVCttRDEycS9PV3lGY3ExcmNhOFBkQ0U2T29HY3JCTk9USjR2ejRSbkF1a25ab2g4L0NiQ3pCNDI4SGNoMFArCnZHT2F5c1hDSE1uSGpmODdFbGdJNXJZOTdIb3NUdnVEbHM0TVBHbUhWSE9rYzhLVC8xRVFyQlZVQWRqOEJiR0pvWDkwZzVwSjE5eE8KZTRwSWI0dEY5Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMrVENDQW9DZ0F3SUJBZ0lOQUthTGVTa0FBQUFBVU5DUitUQUtCZ2dxaGtqT1BRUURBekNCdnpFTE1Ba0dBMVVFQmhNQ1ZWTXgKRmpBVUJnTlZCQW9URFVWdWRISjFjM1FzSUVsdVl5NHhLREFtQmdOVkJBc1RIMU5sWlNCM2QzY3VaVzUwY25WemRDNXVaWFF2YkdWbgpZV3d0ZEdWeWJYTXhPVEEzQmdOVkJBc1RNQ2hqS1NBeU1ERXlJRVZ1ZEhKMWMzUXNJRWx1WXk0Z0xTQm1iM0lnWVhWMGFHOXlhWHBsClpDQjFjMlVnYjI1c2VURXpNREVHQTFVRUF4TXFSVzUwY25WemRDQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjUKSUMwZ1JVTXhNQjRYRFRFeU1USXhPREUxTWpVek5sb1hEVE0zTVRJeE9ERTFOVFV6Tmxvd2diOHhDekFKQmdOVkJBWVRBbFZUTVJZdwpGQVlEVlFRS0V3MUZiblJ5ZFhOMExDQkpibU11TVNnd0pnWURWUVFMRXg5VFpXVWdkM2QzTG1WdWRISjFjM1F1Ym1WMEwyeGxaMkZzCkxYUmxjbTF6TVRrd053WURWUVFMRXpBb1l5a2dNakF4TWlCRmJuUnlkWE4wTENCSmJtTXVJQzBnWm05eUlHRjFkR2h2Y21sNlpXUWcKZFhObElHOXViSGt4TXpBeEJnTlZCQU1US2tWdWRISjFjM1FnVW05dmRDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVNBdApJRVZETVRCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCSVFUeWRDNmJVRjc0bXpRNjFWZlpnSWFKUFJiaVdsSDQ3akNmZkh5CkFzV2ZvUFpiMVlzR0dZWlBVeEJ0QnlRbm9hRDQxVWNaWVV4OXlwTW42blFNNzIrV0NmNWo3SEJkTnExbmQ2N0puWHhWUkRxaVkxRWYKOWVOaTFLbEhCejdNSUtOQ01FQXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRQpGTGRqNXhyZGpla0lwbFdEcE9CcVVFRmxFVUpKTUFvR0NDcUdTTTQ5QkFNREEyY0FNR1FDTUdGNTJPVkNSOThjcmxPWkY3WnZISDNoCnZ4R1UwUU9JZGVTTmlhU0tkMGJlYldIdkF2WDd0ZC9NL2s3Ly9xbm1wd0l3VzVuWGhUY0d0WHNJL2VzbmkwcVUrZUg2cDQ0bUNPaDgKa21odGM5aHZKcXdoQXJpWnR5WkJXeVZncnRCSUd1NEcKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ0ZDQSBFViBST09UCj09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmpUQ0NBM1dnQXdJQkFnSUVHRXJNMWpBTkJna3Foa2lHOXcwQkFRc0ZBREJXTVFzd0NRWURWUVFHRXdKRFRqRXdNQzRHQTFVRQpDZ3duUTJocGJtRWdSbWx1WVc1amFXRnNJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1SVXdFd1lEVlFRRERBeERSa05CCklFVldJRkpQVDFRd0hoY05NVEl3T0RBNE1ETXdOekF4V2hjTk1qa3hNak14TURNd056QXhXakJXTVFzd0NRWURWUVFHRXdKRFRqRXcKTUM0R0ExVUVDZ3duUTJocGJtRWdSbWx1WVc1amFXRnNJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1SVXdFd1lEVlFRRApEQXhEUmtOQklFVldJRkpQVDFRd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURYWFd2TkVEOGZCVm5WCkJVMDNzUTdzbUN1T0ZSMzZrMHNYZ2lGeEVGTFhVV1J3RnNKVmFVMk9GVzJmdnd3Ynd1Q2paOVlNck04aXJxOTNWQ3BMVElwVFVuckQKN2k3ZXMzRWx3ZWxkUGU2aEw2UDNLanpKSXgxcXF4MmhwL0h6N0tEVlJNOFZ6M0l2SFdPWDZKbjUvWk9rVklCTVV0UlNxeTVKMzVETgp1RisrUDk2aHlrMGcxQ1hvaENsVHQ3R0lILy82MnBDZkNxa3RRVCt4OFJncDdoWlpMRFJKR3FnRzE2aUkwZ055ZWpMaTZtaE5iaXlXClpYdktXZnJ5NHQzdU1Dejd6RWFzeEdQcmIzODJLelJ6RXBSLzM4d21udkZ5WFZCbFdZOXBzNGRlTW0vREdJcTFsWSt3ZWpmZVdrVTcKeHpiaDcyZlJPZE9YVzNOaUdVZ3RoeHdHKzNTWUlFbHo4QVhTRzdHZ283Y2JjTk9JYWJsYTFqajBZdHdsaTNpLytPaCt1RnpKbFU5ZgpweTI1SUd2UGE5MzFEZlNDdC9TeVppNFFLUGFYV251V0ZvOEJHUzFzYm44NVdBWmtnd0dEZzhOTmt0MHl4b2VrTitrV3pxb3RhSzhLCmdXVTZjTUdiclUxdFZNb3FMVXVGRzdPQTVuQkZEV3RlTmZCL083aWM1QVJ3aVJJbGs5b0ttU0pnYW1OZ1RuWUdtRTY5ZzYwZFdJb2wKaGRMSFpSNHRqc2JmdHNiaGY0b0VJUlVwZFBBK25KQ2REQzd4aWo1YXFnd0pIc2ZWUEtQdGw4TWVOUG80K1FnTzQ4QmRLNFBSVm1ySgp0cWhVVXk1NE1tYzlnbjkwMFB2aHRnVmd1WERiamd2NUUxaHZjV0FRVWhDNXdVRUo3M0lmWnpGNC81WUZqUUlEQVFBQm8yTXdZVEFmCkJnTlZIU01FR0RBV2dCVGovaTM5S05BTHRicTJvc1MvQnFvRmpKUDdMekFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIKL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVNC80dC9TalFDN1c2dHFMRXZ3YXFCWXlUK3k4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQgpBQ1hHdW12cmg4dmVnam1XUGZCRXAydUVjd1BlblN0UHVpQi92SGl5ejVld0c1enoxM2t1OVVpMjB2c1hpT2JUZWovdFV4UFE0aTlxCmVjc0FJeWptSGpkWE5ZbUV3blpQTkRhdFo4UE9RUWFJeGZmdTJCcTQxZ3QvVVArVHFoZExqT3p0VW1DeXBBYnFUdXYwYXhuOTYvVWEKNENVcW10ekhRVGIzeUhRRmhEbVZPZFlMTzZRbitnallYQjc0QkdCU0VTZ29BLy92VTJZQXBVbzBGbVo4L1Fta3JwNW5HbTlCQzJzRwpFNXVQaG5FRnRDK05pV1l6S1haVW1oSDRKL3F5UDVIZ3pnMGI4ekFhcmI4aVhSdlR2eVVGVGVHU0duK1puenhFazhyVVFFbHNnSWZYCkJEckRNbEkxRGxiNHBkMTl4SXNORVI5VHl4NnlGN1pvZDFyZzFNdklCNjcxT2k2T043ZlFBVXRES1hlTU9aZVBnbHI0VWVXSm9Cam4KYUg5ZENpNzdvMGNPUGFZamVzWUJ4NC9JWHI5dGdGYStpaVM2TStxZjRUSVJudkhTVDREMkcwQ3ZPSjRSVUhsekVoTE41bXlkTEloeQpQRENCQnBFaTZsbXQyaGt1SXNLTnVZeUg0R2E4Y3lOZklXUmpnRWoxb0R3WVBaVElTRUVkUUxwZS92NVdPYUhJejE2ZUdXUkdFTm9YCmtiY0ZnS3lMbVpKOTU2TFlCd3MySitkSWVXQ0t3OWNUWFBoeVFOOUt5OCtaQUFvQUN4R1YybFpGQTRnS24yZlExWG14cUkxQWJRM0MKZWtENjgxOWtSNUxMVTdtN1djNVAvZEFWVXdIWTMrdlo1bmJ2MENPN082bDVzOVVDS2MySm81WVBTalhuVGtMQWRjMEh6K1lzNjNzdQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpPSVNURSBXSVNlS2V5IEdsb2JhbCBSb290IEdCIENBCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR0VENDQXAyZ0F3SUJBZ0lRZHJFZ1VuVHdoWWRHcy9nakd2YkN3REFOQmdrcWhraUc5dzBCQVFzRkFEQnRNUXN3Q1FZRFZRUUcKRXdKRFNERVFNQTRHQTFVRUNoTUhWMGxUWlV0bGVURWlNQ0FHQTFVRUN4TVpUMGxUVkVVZ1JtOTFibVJoZEdsdmJpQkZibVJ2Y25ObApaREVvTUNZR0ExVUVBeE1mVDBsVFZFVWdWMGxUWlV0bGVTQkhiRzlpWVd3Z1VtOXZkQ0JIUWlCRFFUQWVGdzB4TkRFeU1ERXhOVEF3Ck16SmFGdzB6T1RFeU1ERXhOVEV3TXpGYU1HMHhDekFKQmdOVkJBWVRBa05JTVJBd0RnWURWUVFLRXdkWFNWTmxTMlY1TVNJd0lBWUQKVlFRTEV4bFBTVk5VUlNCR2IzVnVaR0YwYVc5dUlFVnVaRzl5YzJWa01TZ3dKZ1lEVlFRREV4OVBTVk5VUlNCWFNWTmxTMlY1SUVkcwpiMkpoYkNCU2IyOTBJRWRDSUVOQk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBMkJlM0hFb2tLdGFYCnNjcmlIdnQ5T08rWTliSTVtRTRudUJGZGU5SWxsSWlDRlNacUd6RzdxRnNoSVN2WUQwNmZXdkd4V3VSNTFqSWpLK0ZUekpsRlhIdFAKcmJ5L2gwb0xTNWRhcVBaSTdIMTdEYzBoQnQrZUZmMUJpa2kzSVBTaGVodFgxRjFRLzdwbjJDT1pIOGcvNDk3L2IxdDNzV3R1dU1sawo5K0hLUVVZT0tYSFF1U1A4eVlGZlR2ZHYzNytFclhOa3U3ZENqbW4yMUhZZGZwMm51RmVLVVdkeTE5U291SlZVUUhNRDl1cjA2LzRvClFuYy9uU01ic3JZOWdCUUhUQzVQOTlVS0ZnMjlaa00zZmlORGVjTkFodlZNS2RxT21xME5wUVNIaUI2RjQrbFQxWnZJaXdOamVPdmcKR1VwdXV5OXJNMlJZazYxcHY0OGI3NEpJeHdJREFRQUJvMUV3VHpBTEJnTlZIUThFQkFNQ0FZWXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekFkQmdOVkhRNEVGZ1FVTlEvSU5tTmU0cVBzK1R0bUZjNVJVdU9SbWowd0VBWUpLd1lCQkFHQ054VUJCQU1DQVFBd0RRWUpLb1pJCmh2Y05BUUVMQlFBRGdnRUJBRUJNKzRleW1ZR1FmcDNGc0xBbXpZaDdLektOYnJnaGNWaVhmYTQzRks4KzUvZWE0bjMyY1ppWkJLcEQKZEhpajQwbGhQbk9NVFpUZytYSEV0aFlPVTNnZjFxS0hMd0k1Z1NrOHJ4V1lJVEQrS0pBQWpOSGh5L3BleVAzNEVFWTdvbmhDa1JkMApWUXJlVUdkTlp0R24vLzNad0xXb280ck9adlVQUTgybksxZDdZMFpxcWk1UzJQVHQ0VzJ0S1pCNFNMcmhJNnFqaWV5MXE1YkF0RXVpCkhaZWVldkp1UUhIZmFQRmxUYzU4QmQ5VFphbWw4TEdYQkhBVlJnT1kxTksvVkxTZ1dIMVNiOXBXSm1MVTJOdUpNVzhjOENMQzAySWMKTmMxTWFSVlVHcENZM3VzZVg4cDN4OHVPUFVOcG5KcFkwQ1E3M3h0QWxuNDFyWUhIVG5HNmlCTT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU1pBRklSIFJPT1QgQ0EyCj09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGNqQ0NBbHFnQXdJQkFnSVVQb3BkQit4VjBqTFZ0K08yWHdIckxkemsxdVF3RFFZSktvWklodmNOQVFFTEJRQXdVVEVMTUFrRwpBMVVFQmhNQ1VFd3hLREFtQmdOVkJBb01IMHR5WVdwdmQyRWdTWHBpWVNCU2IzcHNhV042Wlc1cGIzZGhJRk11UVM0eEdEQVdCZ05WCkJBTU1EMU5hUVVaSlVpQlNUMDlVSUVOQk1qQWVGdzB4TlRFd01Ua3dOelF6TXpCYUZ3MHpOVEV3TVRrd056UXpNekJhTUZFeEN6QUoKQmdOVkJBWVRBbEJNTVNnd0pnWURWUVFLREI5TGNtRnFiM2RoSUVsNlltRWdVbTk2YkdsamVtVnVhVzkzWVNCVExrRXVNUmd3RmdZRApWUVFEREE5VFdrRkdTVklnVWs5UFZDQkRRVEl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQzN2RDVRCnFFdk5RTFhPWWVlV3lyU2gyZ3dpc1BxMWUzWUFkNHdMejMyb2hzd21VZVFnUFlVTTFsamo1L1FxR0ozYTBhNG03dXRUM1BTUTFoTksKREpBOHcvVGEwbzROa2pyY3NiSC9PTjdEdWkxZmdMa0N2VXFkR3crMHc4TEJad1BkM0J1Y1BiT3czZ0FlcURSSHU1cnIvZ3NVdlRhRQoyZzBndi9wYnk2a1dJSzA1WU80dmRiYm5sNXo1UHYxK1RXOU5MKytJRFdyNjNmRTliaUNsb0JLMFRYQzV6dGR5TzRtVHA0Q0VIQ2RKCmNrbTEvenVWbnNITXlBSHM2QTZLQ3BibnM2YUg1ZGI1QlNzTmwwQndQTHFzZFZxYzFVMmRBZ3JTUzV0bVMwWUhGMld0bjJ5SUFOd2kKaWVEaFpOUm52REY1WVR5N3lrSE5YR29BeUR3NGpsaXZBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUApBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlF1RnFsS0dMWEx6UFZ2VVBNalgvaGQ1Nnp3eURBTkJna3Foa2lHOXcwQkFRc0ZBQU9DCkFRRUF0WFA0QTl4Wld4MTI2YU1xZTVBb3NrM0FNMCtxbXJIVXVPUW4vNm1XbWM1RzRHMThUS0k0cEFadzhQUkJFZXcvUjQwL2NvZjUKTy8ya2J5dFRBT0QvT2JscUJ3N3JIUnoyb25LUXk0STlFWUtMMHJ1ZktxOGg1bU9HblhrWjcvZTdERFdRdzRydFR3LzF6QkxacEQ2NwpvUHdnbFY5UEppOFJJNE5PZFFjUHY1dlJ0QjNwRUFUK3ltQ1Bva3k0cmMvaGtBL05yZ3JIWFh1M1VOTFVZZnJWRmR2WG40ZFJWT3VsCjQrdkpoYUFsSURmN2pzNE1OSVRoUElHeWQwNURwWWhmaG1laFBlYTBYR0cyUHR2K3R5akZvZ2V1dGNyS2pTb1M3NWZ0d2pDa3lTcDYKKy9OTkl4dVpNelNnTHZXcEN6L1VYZUhQaEovaUdjSmZpdFlnSHVOenR3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyCj09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjBqQ0NBN3FnQXdJQkFnSVFJZGJRU2s4bEQ4a3lOL3lxWGhLTjZUQU5CZ2txaGtpRzl3MEJBUTBGQURDQmdERUxNQWtHQTFVRQpCaE1DVUV3eElqQWdCZ05WQkFvVEdWVnVhWHBsZEc4Z1ZHVmphRzV2Ykc5bmFXVnpJRk11UVM0eEp6QWxCZ05WQkFzVEhrTmxjblIxCmJTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRFa01DSUdBMVVFQXhNYlEyVnlkSFZ0SUZSeWRYTjBaV1FnVG1WMGQyOXkKYXlCRFFTQXlNQ0lZRHpJd01URXhNREEyTURnek9UVTJXaGdQTWpBME5qRXdNRFl3T0RNNU5UWmFNSUdBTVFzd0NRWURWUVFHRXdKUQpUREVpTUNBR0ExVUVDaE1aVlc1cGVtVjBieUJVWldOb2JtOXNiMmRwWlhNZ1V5NUJMakVuTUNVR0ExVUVDeE1lUTJWeWRIVnRJRU5sCmNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNU1F3SWdZRFZRUURFeHREWlhKMGRXMGdWSEoxYzNSbFpDQk9aWFIzYjNKcklFTkIKSURJd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUM5K1hqNDV0V0FER1NkaGh1V1pHYy9Jam9lZFFGOQo3L3RjWjR6SnpGeHJxWkhtdVVMbElFdWIycHQ3dVpsZDJadUFTOWVFUUNzbjAraTZNTHMrQ1JxblNaWHZLMEFrd3BmSHArNmJKZStvCkNnQ1hoVnFxbmR3cHllSTFCK3R3VFVyV3diTld1S0ZCT0p2Uit6Ri9qK0JmNGJFL0Q0NFdTV0RYQm8wWSthb21FS3NxMDlEUlo0MGIKUnI1SE1OVXVjdEhGWTlyblkzbEVma3RqSkltR0xqUS9LVXhTaXlxbndPS1JLSW01d0Z2NUhkbm5KNjMvbWdLWHdjWlFrcHNDTEwycAp1VFJaQ3IrRVN2L2Yvck9mNjltZTRKZ2o3S1pyZHhZcTI4eXRPeHlraDl4R2MxNFpZbWhGVitTUWdrSzdRdGJ3WWVEQm96MW1vMTMwCkdPNkl5WTBYUlNtWk1uVUNNZTRwSnNockF1YTFZa1YvTnhWYUkyaUoxRDdlVGlldzhFQU12RTBYeTAyaXN4N1FCbHJkOXBQUFYzV1oKOWZxR0dtZDRzNytXL2pUY3ZlZFNWdVd6NVhWNzEwR1JCZHhkYWVPVkRVTzUvSU9XT1pWN2JJQmFUeE55eHRkOUtYcEV1bEtrS3RWQgpSZ2tnL2lLZ3Rsc3dqYnlKRE5YWGNQaUhVdjNhNzZ4UkxnZXpUdjdRQ2Rwdzc1ajZWdVp0MjdWWFM5emxMQ1VWeUo0dWVFNzQycHllCmhpektWL01hNWNpU2l4cUNsbnJEdkZBU2FkZ09Xa2FMT3VzbStpUEp0ckNCdmtJQXBQalcvakF1eDlKRzl1V09kZjN5ekxuUWgxdk0KQmhCZ3U0TTF0MTVuM2tmc21VanhwS0VWL3EyTVlvNDVWVTg1RnJteFk1My90d0lEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBRApBUUgvTUIwR0ExVWREZ1FXQkJTMm9WUTVBc09nUDQ2S3ZQclUrQnltMFRvTy9UQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0RRWUpLb1pJCmh2Y05BUUVOQlFBRGdnSUJBSEdsRHM3azZiOC9PTldKV3NRQ1lmdE14UlFYTFl0UFUyc1FGL3hsaE1jUVNaRGUyOGNtazRnbWIzRFcKQWw0NW9QZVBxNWExcFJOY2dSUnREb0dDRVJ1S1RzWlBwZDFpSGtUZkNWbjBXM2NMTittTElNYjRDazR1V0J6ck05RFBobURKMnZ1QQpMNTVNWUlSNFBTRmsxdnRCSHhnUDU4bDFjYjI5WE40MGh6NUJzQTcydWRZL0NST1dGQy9lbWgxYXVWYk9OVHF3WDNCTlh1TXA4U01vCmNsbTJxOEtNWmlZY2R5d21kaldMS0tkcG9Qazc5U1BkaFJCMHlaQURWcEhucjdwSDFCS1hFU0xqb2ttVWJPZTNsRXU2TGFUYU00dE0KcGtUL1dqekdIV1RZdFRIa3BqeDZxRmNMMisxaEdzdnh6bk4zWTZTSGIweFJPTmJrWDhlZnRvRXE1SVZJZVZoZU8vamJBb0pud1RuYgp3M1JMUFRZZStTbVRpR2hicUVRWklmQ242SUVOTE9pVE5yUTNzc3F3R3laNm1pVWZtcHFBbmtzcVAvdWptdjV6TW5IQ25zWnk0WXBvCkovSGtEN1RFVEtWaGsvaVhFQWNxTUNXcHVjaHh1TzlvekMxKzllQitENEtvYjdhNmJJTkRkODJLa2hlaG5sdDRGajFGNGpOeTNlRm0KeXBuVHljVW0vUTFvQkVhdXR0bWJqTDRadnJIRzhobmpYQUxLTE5odlNnZlp5VFhhUUhYeXhLY1piNTVDRUpoMTVwV0xZTHp0eFJMWAppczdWbUZ4V2xnUEY3bmNHTmYvUDVPNC9FMkh1MjlvdGhmRE5ycDJ5R0FsRnc1S2hjaGY4UjdhZ0N5enh4TjVEYUFocVh6dndkbVA3CnpBWXNwc2JpRHJXNXZpU1AKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxNQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHQ3pDQ0EvT2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURDQnBqRUxNQWtHQTFVRUJoTUNSMUl4RHpBTkJnTlZCQWNUCkJrRjBhR1Z1Y3pGRU1FSUdBMVVFQ2hNN1NHVnNiR1Z1YVdNZ1FXTmhaR1Z0YVdNZ1lXNWtJRkpsYzJWaGNtTm9JRWx1YzNScGRIVjAKYVc5dWN5QkRaWEowTGlCQmRYUm9iM0pwZEhreFFEQStCZ05WQkFNVE4waGxiR3hsYm1saklFRmpZV1JsYldsaklHRnVaQ0JTWlhObApZWEpqYUNCSmJuTjBhWFIxZEdsdmJuTWdVbTl2ZEVOQklESXdNVFV3SGhjTk1UVXdOekEzTVRBeE1USXhXaGNOTkRBd05qTXdNVEF4Ck1USXhXakNCcGpFTE1Ba0dBMVVFQmhNQ1IxSXhEekFOQmdOVkJBY1RCa0YwYUdWdWN6RkVNRUlHQTFVRUNoTTdTR1ZzYkdWdWFXTWcKUVdOaFpHVnRhV01nWVc1a0lGSmxjMlZoY21Ob0lFbHVjM1JwZEhWMGFXOXVjeUJEWlhKMExpQkJkWFJvYjNKcGRIa3hRREErQmdOVgpCQU1UTjBobGJHeGxibWxqSUVGallXUmxiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMWRHbHZibk1nVW05dmRFTkJJREl3Ck1UVXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFEQytLay9HNG44UER3RVhUMlFOckNST25rOFpscnYKYlRrQlNScTB0ODkvVFNOVHQ1QUE0eE1xS0tZeDhaRUE0eWpzcmlGQnpoL2EvWDBTV3dHREQ3bXdYNW5oOGhLRGdFMEdQdCtzcitlaAppR3N4ci9DTDBCZ3p1TnRGYWpUMEFvQWtLQW9DRlpWZWRpb05tVG9VVy9iTHkxTzhFMDBCaURlVUpSdEN2Q0xZanFPV1hqclpNdHMrCjZQQVFaZTEwNFMrbmZLOG5OTHNwZlp1Mnp3bkk1ZE1LL0lobFpYUUszSE1jWE0xQXNSelV0b1NNVEZEUGFJNm9XYTdDSjA2Q29qWGQKRlBRZi83SjMxWWN2cW01OUpDZm54c3NtNXVYK1p3ZGoyRVVOM1RwWlpUbFllcEtaY2oyY2hGNklJYmpWOUN6ODJYQlNUM2k0dlR3cgppNVdZOWJQUmFNOGdGSDVNWEYvbmkrWDFOWUVaTjljUkNMZG12dE5Lem9OWEFEckRnZmdYeTVJMlhkR2oySFViNFlzbjZucElRZjFGCkdRYXRKNWxPd1hCSDNiV2ZnVk1TNWJHTVNGMHhReGZqak1aNlk1WkxLVEJPaEU1aUdWNDh6cGVRcFg4QjY1M2crSXVKM1NXWVBaSzIKZnUvWjhWRlJmUzBteUdsWlllQ3NhcmdxTmhFRWVsQzlNb1MrTDl4eTFkY2RGa2ZrUjJZZ1AvU1d4YStPQVhxbEQzcGs5UTBZaDltdQppTlg2aE1FNndHa29MZklOYUZHcTQ2VjN4cVNRRHFFM2l6RWpSOEVKQ090dTkzaWIxNEw4aENDWlNSbTJFa2F4KzBWVkZxbWpaYXljCkJ3L3FhOXdmTGdaeTdJYUlFdVF0MjE4RkwrVHdBOU1tTStlQXdzMUNvUmMwQ3dJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQUQKQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVWNSVm55TWpKdlhWZGN0QTRHR3FkODNFa1ZBc3dEUVlKS29aSQpodmNOQVFFTEJRQURnZ0lCQUhXN2JWUkxxaEJZUmpUeVl0Y1dObDBJWHRWc3lJZTl0QzVHOGpINGZPcEN0Wk1XVmR5aERCS2cybUYrCkQxaFljMlJ5eCtoRmp0eXA4aVkveG5tTXNWTUlNNEd3VmhPKzVsRmMySnNLVDB1Y1ZsTUM2VS8yRFdEcVRVSlY2SHdiSVNIVEd6ck0KZC9LNGtQRm94L2xhL3ZvdDlML0o5VVViempnUUtqZUtlYU8wNHdsc2hZYVQvNG1XSjNpQmoyZmpSblJVanRrTmFlSks5RTEwQS8reQpkKzJWWjVma3NjV3J2Mm9qNk5TVTRrUW9Zc1JMNHZEWTRpbHJHbkIrSkdHVGUwOERNaVVOUlNRcmxyUkdhcjlLQy9lYWo4R3NHc1ZuCjgyODAwdnB6WTR6dkZyQ29wRVlxK09zUzdISzA3L2dyZm94U3dJdUVWUGt2UHVOVnFOeG1zZG5oWDlpempGazBXYVNyVDJ5N0h4amIKZGF2WXk1TE5sRGhoRGdjR0gwdEdFUEVWdm8yRlhEdEtLNEY1RDdScG4wbFFsMDMzRGxaZHdKVnF3amJERzJqSjlTcmNSNXErc3M3RgpKZWo2QTduYStSWnVrWVQxSENqSS9DYk0xeHlRVnFkZmJ6b0V2TTE0aVF1T0R5K2pxaytpR3hJOUZnaEFEL0ZHVE5lcWV3akJDdlZ0Cko5NENqOHJEdFN2SzZldklJVk00cGN3NzJIYzNNS0pQMlcvUjhrQ3RRWG9YeGRaS05ZbTNRZFY4aG45VlRZTktwWE1nd0RxdmtQR2EKSkk3WmpuSEtlN2lHMnJLUG1UNGRFdzBTRWU3VXEvRHBGWFlDNU9EZnFpQWVXMkdGWkVDcGtKY05yVlBTV2gySGFnQ1haV0swdm05cQpwL1VzUXUweXJiWWhucjY4Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDd3pDQ0FrcWdBd0lCQWdJQkFEQUtCZ2dxaGtqT1BRUURBakNCcWpFTE1Ba0dBMVVFQmhNQ1IxSXhEekFOQmdOVkJBY1RCa0YwCmFHVnVjekZFTUVJR0ExVUVDaE03U0dWc2JHVnVhV01nUVdOaFpHVnRhV01nWVc1a0lGSmxjMlZoY21Ob0lFbHVjM1JwZEhWMGFXOXUKY3lCRFpYSjBMaUJCZFhSb2IzSnBkSGt4UkRCQ0JnTlZCQU1UTzBobGJHeGxibWxqSUVGallXUmxiV2xqSUdGdVpDQlNaWE5sWVhKagphQ0JKYm5OMGFYUjFkR2x2Ym5NZ1JVTkRJRkp2YjNSRFFTQXlNREUxTUI0WERURTFNRGN3TnpFd016Y3hNbG9YRFRRd01EWXpNREV3Ck16Y3hNbG93Z2FveEN6QUpCZ05WQkFZVEFrZFNNUTh3RFFZRFZRUUhFd1pCZEdobGJuTXhSREJDQmdOVkJBb1RPMGhsYkd4bGJtbGoKSUVGallXUmxiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMWRHbHZibk1nUTJWeWRDNGdRWFYwYUc5eWFYUjVNVVF3UWdZRApWUVFERXp0SVpXeHNaVzVwWXlCQlkyRmtaVzFwWXlCaGJtUWdVbVZ6WldGeVkyZ2dTVzV6ZEdsMGRYUnBiMjV6SUVWRFF5QlNiMjkwClEwRWdNakF4TlRCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCSktnUWVoTGdvUmM0dmd4RVptR1pFNEpKUytkUVM4S3JqVlAKZEpXeVVXUnJqV3ZtUDNDVjhBVkVSNlp5T0ZCMmxRSmFqcTRvbnZrdFRwbnZMRWh2VENVcDZORnhXOThkd1hVM3ROZjZlM3BDbkdvSwpWbHA4YVF1cWdBa2tiSDdCUnFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPCkJCWUVGTFFpQzRLWkpBRU9uTHZrRHYyLys1Y2drNWtxTUFvR0NDcUdTTTQ5QkFNQ0EyY0FNR1FDTUdmT0ZtSTRvcXhpUmFlcGxTVEEKR2llY01qdkF3Tlc2cWVmNEJFTlRoZTVTSWQ2ZDlTV0RQcDVZU3kvWFp4TU9JUUl3QmVGMUFkNW83U29mVFV3SkNBM3NTNjFrRnlqbgpkYzVGWlhJaEY4c2lRUTZNRTVnNG1sUnRtOHJpZk9vQ1dDS1IKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKSVNSRyBSb290IFgxCj09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmF6Q0NBMU9nQXdJQkFnSVJBSUlRejdEU1FPTlpSR1BndTJPQ2l3QXdEUVlKS29aSWh2Y05BUUVMQlFBd1R6RUxNQWtHQTFVRQpCaE1DVlZNeEtUQW5CZ05WQkFvVElFbHVkR1Z5Ym1WMElGTmxZM1Z5YVhSNUlGSmxjMlZoY21Ob0lFZHliM1Z3TVJVd0V3WURWUVFECkV3eEpVMUpISUZKdmIzUWdXREV3SGhjTk1UVXdOakEwTVRFd05ETTRXaGNOTXpVd05qQTBNVEV3TkRNNFdqQlBNUXN3Q1FZRFZRUUcKRXdKVlV6RXBNQ2NHQTFVRUNoTWdTVzUwWlhKdVpYUWdVMlZqZFhKcGRIa2dVbVZ6WldGeVkyZ2dSM0p2ZFhBeEZUQVRCZ05WQkFNVApERWxUVWtjZ1VtOXZkQ0JZTVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBSzNvSkhQMEZEZnptNTRyClZ5Z2NoNzdjdDk4NGtJeHVQT1pYb0hqM2RjS2kvdlZxYnZZQVR5amIzbWlHYkVTVHRyRmovUlFTYTc4ZjB1b3hteUYrMFRNOHVrajEKM1huZnM3ai9FdkVobWt2QmlvWnhhVXBtWm15UGZqeHd2NjBwSWdiejVNRG1nSzdpUzQrM21YNlVBNS9UUjVkOG1VZ2pVK2c0cms4SwpiNE11MFVsWGpJQjB0dG92MERpTmV3TndJUnQxOGpBOCtvK3UzZHBqcStzV1Q4S09FVXQrend2by83VjNMdlN5ZTByZ1RCSWxESENOCkF5bWc0Vk1rN0JQWjdobS9FTE5LakQrSm8yRlIzcXlIQjVUMFkzSHNMdUp2VzVpQjRZbGNOSGxzZHU4N2tHSjU1dHVrbWk4bXhkQVEKNFE3ZTJSQ09GdnUzOTZqM3grVUNCNWlQTmdpVjUrSTNsZzAyZFo3N0RuS3hIWnU4QS9sSkJkaUIzUVcwS3RaQjZhd0JkcFVLRDlqZgoxYjBTSHpVdktCZHMwcGpCcUFsa2QyNUhON3JPckZsZWFKMS9jdGFKeFFaQktUNVpQdDBtOVNUSkVhZGFvMHhBSDBhaG1iV25PbEZ1CmhqdWVmWEtuRWdWNFdlMCtVWGdWQ3dPUGpkQXZCYkkrZTBvY1MzTUZFdnpHNnVCUUUzeERrM1N6eW5UbmpoOEJDTkF3MUZ0eE5yUUgKdXNFd01GeEl0NEk3bUtaOVlJcWlveW1DekxxOWd3UWJvb01EUWFIV0JmRWJ3cmJ3cUh5R08wYW9TQ3FJM0hhYWRyOGZhcVU5R1kvcgpPUE5rM3NnckRRb28vL2ZiNGhWQzFDTFFKMTNoZWY0WTUzQ0lyVTdtMllzNnh0MG5VVzcvdkdUMU0wTlBBZ01CQUFHalFqQkFNQTRHCkExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlI1dEZubWU3Ymw1QUZ6Z0FpSXlCcFkKOXVtYmJqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFWUjlZcWJ5eXFGRFFETEhZR21rZ0p5a0lyR0YxWElwdStJTGxhUy9WOWxaTAp1Ymh6RUZuVElaZCs1MHh4KzdMU1lLMDVxQXZxRnlGV2hmRlFEbG5yenVCWjZickpGZStHblkrRWdQYms2WkdRM0JlYllodEY4R2FWCjBueHZ3dW83N3gvUHk5YXVKL0dwc01pdS9YMSttdm9pQk92LzJYL3FrU3Npc1JjT2ovS0tORnRZMlB3QnlWUzV1Q2JNaW9nemlVd3QKaER5QzMrNldWd1c2TEx2M3hMZkhUanVDdmpISUluTnprdEhDZ0tRNU9SQXpJNEpNUEorR3NsV1lIYjRwaG93aW01N2lhenRYT29KdwpUZHdKeDRuTENnZE5iT2hkanNudnpxdkh1N1VyVGtYV1N0QW16T1Z5eWdocXBaWGpGYUgzcE8zSkxGK2wrLytzS0FJdXZ0ZDd1K054CmU1QVcwd2RlUmxOOE53ZENqTlBFbHB6Vm1iVXE0SlVhZ0VpdVREa0h6c3hIcEZLVks3cTQrNjNTTTFOOTVSMU5iZFdoc2NkQ2IrWkEKSnpWY295aTNCNDNualRPUTV5T2YrMUNjZVd4RzFiUVZzNVp1ZnBzTWxqcTRVaTAvMWx2aCt3akNoUDRrcUtPSjJxeHE0Umdxc2FoRApZVnZUSDl3N2pYYnlMZWlOZGQ4WE0ydzlVL3Q3eTBGZi85eWkwR0U0NFphNHJGMkxOOWQxMVRQQW1SR3VuVUhCY25XRXZnSkJRbDluCkpFaVUwWnNudmdjL3ViaFBnWFJSNFhxMzdaMGo0cjdnMVNnRUV6d3hBNTdkZW15UHhnY1l4bi9lUjQ0L0tKNEVCcytsVkRSM3ZleUoKbStrWFE5OWIyMS8ramg1WG9zMUFuWDVpSXRyZUdDYz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQUMgUkFJWiBGTk1ULVJDTQo9PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGZ3pDQ0EydWdBd0lCQWdJUFhaT05NR2MyeUFZZEdzZFVoR2tITUEwR0NTcUdTSWIzRFFFQkN3VUFNRHN4Q3pBSkJnTlZCQVlUCkFrVlRNUkV3RHdZRFZRUUtEQWhHVGsxVUxWSkRUVEVaTUJjR0ExVUVDd3dRUVVNZ1VrRkpXaUJHVGsxVUxWSkRUVEFlRncwd09ERXcKTWpreE5UVTVOVFphRncwek1EQXhNREV3TURBd01EQmFNRHN4Q3pBSkJnTlZCQVlUQWtWVE1SRXdEd1lEVlFRS0RBaEdUazFVTFZKRApUVEVaTUJjR0ExVUVDd3dRUVVNZ1VrRkpXaUJHVGsxVUxWSkRUVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DCmdnSUJBTHB4Z0hwTWhtNS95Qk50d01aOUhBQ1hqeXdNSTdzUW1rQ3BHcmVIaVBpYlZtcjc1bnVPaTVLT3B5VmRXUkhiTmk2M1VSY2YKcVFnZkJCY2tXS28zU2hqZjVUblVWLzNYd1N5UkFaSGlJdFFEd0ZqOGQwZnNqejUwUTdxc05JMU5PSFpuanJESWJ6QXpXSEZjdFBWcgpidFFCVUxnVGZteEtvMG5SSUJudXZNQXBHR1duM3Y3djNRcVFJZWNhWjVKQ0VKaGZUekM4UGh4RnRCRFhhRUFVd0VENjUzY1hldVlMCmoyVmJQTm1hVXR1MXZaNUd6ejNya1FVQ3dKYXlka3hORUpZN2t2cWNmdytaMzc0ak5VVWVBbHordGFpYm1TWGFYdk1pd3puMTVDb3UKMDhZZnhHeXF4UnhxQVFWS0w5TEZ3YWcwSmwxbXBkSUNJZmtZdHdiMVRwbHZxS3RNVWVqUFVCakZkOGc1Q1N4SmtqS1pxTHNYRjNtdwpXc1htbzhSWlpVYzFnMTZwNkRVTG1idmt6U0RHbTBvR09iVm8vQ0s2N2xXTUswN3E4N0hqL0xhWm10VkMrbkZOQ00rSEhtcHhmZm5UCnRPbWxjWUY3d2s1SGxxWDJkb1dqS0kvcGdHNkJVNlZ0WDdoSStjTDVOcVl1U2YrNGxzS01CN09iaUZqODZ4c2MzaTF3NHBlU01LR0oKNDd4VnFDZldTKzJRcll2Nll5VlpMYWcxM2NxWE03emx6Y2VkMGV6dlhnNUtrQVltWTYyNTJUVXRCN3AyWlN5c1Y0OTk5QWVVMTRFQwpsbDJqQjBuVmV0QlgrUnZuVTBaMXFyQjVRc3RvY1FqcFlMMDVhYzcwcjhOV1FNZXRVcUlKNUcrR1I0b2Y2eWduWFlNZ3J3VEpiRmFhCmkwYjFBZ01CQUFHamdZTXdnWUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUUKRlBkOXhmM0U2Sm9iZDJTbjlSMmd6TCtIWUpwdE1ENEdBMVVkSUFRM01EVXdNd1lFVlIwZ0FEQXJNQ2tHQ0NzR0FRVUZCd0lCRmgxbwpkSFJ3T2k4dmQzZDNMbU5sY25RdVptNXRkQzVsY3k5a2NHTnpMekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBQjVCSzMvTWpUdkRECm5GRmxtNXdpb29vTWhmTnpLV3ROL2dIaXFReGpBYjhFWjZXZG1GLzlBUlA2N0pwaTZZYit0bUxTYmt5VSs4QjFSWHhsRFBpeU44K3MKRDgrTmIva1o5NC9zSHZKd252REt1TyszLzNZM2RsdjJib2p6cjJJeUlwTU5PbXFPRkdZTUxWTjBWMlVlMWJMZEk0RTdwV1lqSjJjSgpqK0YzcWtQTlpWRUk3VkZZL3VZNStjdEhoS1FWOFhhN3BPNmtPOFJmNzdJemxoRVl0OGxsdmhqaG82VGMraGo1MDd3VG16bDZOTHJUClFmdjZNb29xdHl1R0MybURPTDdOaWk0TGNLMk5KcEx1SHZVQkt3cloxcGViYnVDb0dSdzZJWXNNSGtDdEErZmRabjcxdVNBTkEraVcKK1lKRjFEbmdvQUJkMTVqbWZaNW5jOE9hS3Zlcmk2RTZGTzgwdkZJT2laaWFCRUNFSFg1RmFaTlh6dXZPK0ZCOFR4eHVCRU9iK2RZNwpJeGpwNm83UlRVYU44VHZrYXNxNit5TzNtL3FaQVNsYVdGb3Q0L25VYlE0bXJjRnVOTHd5K0F3RittV2oyenMzZ3lMcDF0eHlNLzFkCjhpQzlkandqMmlqMytSdnJXV1RWM0Y5eWZpRDh6WW0xa0dkTlluby9UcTBkd3puK2V2UW9GdDlCOWtpQUJkY1BVWG1zRUt2VTdBTm0KNW1xd3VqR1NRa0JxdmpyVGN1RnFOMVc4ckIyVnQybGg4a09SZE9hZzB3b2tScUVJcjliYVJSbVcxRk1kVzRSNThNRDNSKytMajhVRwpycDFNWXAzL1JnVDQwOG0yRUNWQWRmNFdxc2xLWUlZdnV1OHdkK1JVNHJpRW1WaUFxaE9MVVRwUFNQYUx0ck09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFtYXpvbiBSb290IENBIDEKPT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFFUQ0NBaW1nQXdJQkFnSVRCbXlmejVtL2pBbzU0dkI0aWtQbWxqWmJ5akFOQmdrcWhraUc5dzBCQVFzRkFEQTVNUXN3Q1FZRApWUVFHRXdKVlV6RVBNQTBHQTFVRUNoTUdRVzFoZW05dU1Sa3dGd1lEVlFRREV4QkJiV0Y2YjI0Z1VtOXZkQ0JEUVNBeE1CNFhEVEUxCk1EVXlOakF3TURBd01Gb1hEVE00TURFeE56QXdNREF3TUZvd09URUxNQWtHQTFVRUJoTUNWVk14RHpBTkJnTlZCQW9UQmtGdFlYcHYKYmpFWk1CY0dBMVVFQXhNUVFXMWhlbTl1SUZKdmIzUWdRMEVnTVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQwpnZ0VCQUxKNGdISEtlTlhqY2E5SGdGQjBmVzdZMTRoMjlKbG85MWdoWVBsMGhBRXZyQUl0aHRPZ1EzcE9zcVRRTnJvQnZvM2JTTWdICkZ6Wk05TzZJSThjKzZ6ZjF0Um40U1dpdzN0ZTVkamdkWVo2ay9vSTJwZVZLVnVSRjRmbjl0QmI2ZE5xY216VTVML3F3SUZBR2JIclEKZ0xLbSthL3NSeG1QVURnSDNLS0hPVmo0dXRXcCtVaG5NSmJ1bEhoZWI0bWpVY0F3aG1haFJXYTZWT3VqdzVINVNOei8wZWd3TFgwdApkSEExMTRnazk1N0VXVzY3YzRjWDhqSkdLTGhEK3JjZHFzcTA4cDhrRGkxTDkzRmNYbW4vNnBVQ3l6aUtybEE0Yjl2N0xXSWJ4Y2NlClZPRjM0R2ZJRDV5SEk5WS9RQ0IvSUlERWdFdytPeVFtamdTdWJKcklxZzBDQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBT0JnTlZIUThCQWY4RUJBTUNBWVl3SFFZRFZSME9CQllFRklRWXpJVTA3THdNbEpRdUNGbWN4N0lRVGdvSU1BMEdDU3FHU0liMwpEUUVCQ3dVQUE0SUJBUUNZOGpkYVFaQ2hHc1YyVVNnZ05pTU9ydVlvdTZyNGxLNUlwREIvRy93a2pVdTB5S0dYOXJieGVuRElVNVBNCkNDamptQ1hQSTZUNTNpSFRmSVVKclU2YWRUckNDMnFKZUhaRVJ4aGxiSTFCamp0L21zdjB0YWRRMXdVc04rZ0RTNjNwWWFBQ2J2WHkKOE1XeTdWdTMzUHFVWEhlZUU2Vi9VcTJWOHZpVE85NkxYRnZLV2xKYllLOFU5MHZ2by91ZlFKVnRNVlQ4UXRQSFJoOGpyZGtQU0hDYQoyWFY0Y2RGeVF6UjFibGRad2dKY0ptQXB6eU1aRm82SVE2WFU1TXNJK3lNUlEraERLWEppb2FsZFhnalVrSzY0Mk00VXd0QlY4b2IyCnhKTkRkMlpod0xub1FkZVhlR0FEYmtweXJxWFJmYm9Rbm9ac0c0cTVXVFA0NjhTUXZ2RzUKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQW1hem9uIFJvb3QgQ0EgMgo9PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGUVRDQ0F5bWdBd0lCQWdJVEJteWYwcFkxaHA4S0QrV0dlUGhiSnJ1S056QU5CZ2txaGtpRzl3MEJBUXdGQURBNU1Rc3dDUVlEClZRUUdFd0pWVXpFUE1BMEdBMVVFQ2hNR1FXMWhlbTl1TVJrd0Z3WURWUVFERXhCQmJXRjZiMjRnVW05dmRDQkRRU0F5TUI0WERURTEKTURVeU5qQXdNREF3TUZvWERUUXdNRFV5TmpBd01EQXdNRm93T1RFTE1Ba0dBMVVFQmhNQ1ZWTXhEekFOQmdOVkJBb1RCa0Z0WVhwdgpiakVaTUJjR0ExVUVBeE1RUVcxaGVtOXVJRkp2YjNRZ1EwRWdNakNDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DCmdnSUJBSzJXbnkyY1NreEtnWGxSbWV5S3kydGdVUk84VFcwRy9MQUlqZDBaRUdySEpndzEyTUJ2SUlUcGxMR2JoUVBEVzl0SzZNajQKa0hiWlcwL2pUT2dHTmszTW1xdzlESkFya3RRR0dXQ3NOMFI1aFlHQ3JWbzM0QTNNbmFaTVVuYnFRNTIzQk5GUTlsWGcxZEttU1lYcApOK25LZnE1Y2xVMUltait1SUZwdGlKWFpOTGhTR2tPUXNMOXNCYm0yZUxmcTBPUTZQQkpUWXY5SzhudStOUVdwRWpUajgyUjBZaXc5CkFFbGFLUDR5Ukx1SDNXVW5BbkU3MmtyM0g5ck45eUZWa0U4UDdLNkM0WjlyMlVYVHUvQmZoKzA4TERtRzJqL2U3SEpWNjNtanJkdmQKZkxDNkhNNzgzazgxZHM4UCtIZ2ZhalpSUmlkaFcrbWV6L0NpVlgxOEpZcHZMN1RGejRRdUsvME5VUkJzKzE4YnZCdCt4YTQ3bUFFeAprdjhMVi9TYXNybFg2YXZ2RFhiUjhPNzB6b2FuNEc3cHRHbWgzMm4yTThacExwY1RucVdIc0ZjUWdUZkpVN083Zi9hUzBaelFHUFNTCmJ0cURUNlpqbVV5bCsxN3ZJV1I2SUY5c1pJVVZ5emZwWWd3TEtoYmNBUzR5Mmo1TDlaNDY5aGRBbE8rZWtRaUcrcjVqcUZvejdNdDAKUTVYNWJHbFNOc2NwYi94VkExd2YrNSs5Uit2blNVZVZDMDZKSWdsSjRQVmhIdkcvTG9weWJvQlovMWM2K1hVeW8wNWY3TzBvWXRsTgpjL0xNZ1JkZzdjM3IzTnVueXNWK0FyM3lWQWhVL2JRdENTd1hWRXFZMFZUaFVXY0kwdTF1Zm04LzBpMkJXU2xteTVBNWxSRWVkQ2YrCjNldXZBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01CMEdBMVVkRGdRV0JCU3cKRFBCTU1QUUZXQUpJL1RQbFVxOUxoT05tVWpBTkJna3Foa2lHOXcwQkFRd0ZBQU9DQWdFQXFxaUFqdzU0bytDaTFNM205Wmg2TytvQQpBN0NYRHBPOFdxajJMSXh5aDZteC9IOXovV054ZUtXSFdjOHc0UTBRc2hOYWJZTDFhdWFBbjZBRkMyamtSMnZIYXQrMi9YY3ljdVVZCitnbjBvSk1zWGRLTWRZVjJaWkFNQTNtM01TTmpyWGlEQ1lab2hNci8rYzhtbXBKNTU4MUx4ZWRocHhmTDg2a1NrNU5ycCtndlU1TEUKWUZpd3pBSlJHRnVGaldKWlk3YXR0TjZhK3liM0FDZkFYVlUzZEpuSlVIL2pXUzVFNHl3bDd1eE1NbmUwbnhycFMxMGd4ZHI5SEljVwp4a1BvMUxzbW1rVndYcWtMTjFQaVJuc24vZUJHOG9tM3pFSzJ5eWdtYnRtbHlUcklRUk5nOTFDTUZhNnliUm9WR2xkNDVwSXEyV1dRCmdqOXNBcSt1RWpvbmxqWUUxeDJpZ0dPcG0vSGx1clI4RkxCT3liRWZkRjg0OWxIcW0vb3NvaEhVcVMwbkdrV3hyN0pPY1EzQVdFYlcKYVFiTFU4dXovbXRCelVGK2ZVd1BmSEo1ZWxuTlhrb09ySnVwbUhONWZMVDB6TG00Qnd5eWRGeTR4MitJb1pDbjlLcjV2MmM2OUJvVgpZaDYzbjc0OXNTbXZaNkVTOGxnUUdWTURNQnU0R29uMm5MMlhBNDZqQ2ZNZGl5SHh0Ti9rSE5HZlpRSUc2bHpXRTdPRTc2S2xYSXgzCkthZG93R3V1UU5Lb3RPck44STFMT0p3Wm1oc29WTGlKa08vS2RZRStIdkprSk1jWXIwNy9SNTRIOWpWbHBOTUtWdi8xRjJSczc2Z2kKSlVtVHR0OEFGOXBZZmwzdXhSdXcwZEZmSVJESCtmTzZBZ29uQjhYeDFzZlQ0UHNKWUd3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBbWF6b24gUm9vdCBDQSAzCj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJ0akNDQVZ1Z0F3SUJBZ0lUQm15ZjFYU1hObVkvT3d1YTJlaWVkZ1B5U2pBS0JnZ3Foa2pPUFFRREFqQTVNUXN3Q1FZRFZRUUcKRXdKVlV6RVBNQTBHQTFVRUNoTUdRVzFoZW05dU1Sa3dGd1lEVlFRREV4QkJiV0Y2YjI0Z1VtOXZkQ0JEUVNBek1CNFhEVEUxTURVeQpOakF3TURBd01Gb1hEVFF3TURVeU5qQXdNREF3TUZvd09URUxNQWtHQTFVRUJoTUNWVk14RHpBTkJnTlZCQW9UQmtGdFlYcHZiakVaCk1CY0dBMVVFQXhNUVFXMWhlbTl1SUZKdmIzUWdRMEVnTXpCWk1CTUdCeXFHU000OUFnRUdDQ3FHU000OUF3RUhBMElBQkNtWHA4WkIKZjhBTm0rZ0JHMWJHOGxLbHVpMnlFdWpTTHRmNnljWFlxbTBmYzRFN081aHJPWHd6cGNWT2hvNkFGMmhpUlZkOVJGZ2RzemZsWndqcgpadDZqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0dHTUIwR0ExVWREZ1FXQkJTcnR0dlhCcDQzCnJEQ0dCNUZ3eDV6RUdiRjR3REFLQmdncWhrak9QUVFEQWdOSkFEQkdBaUVBNElXU294ZTNqZmtyQnFXVHJCcVlhR0Z5K3VHaDBQc2MKZUdDbVE1bkZ1TVFDSVFDY0F1L3hsSnl6bHZucnhpcjR0aXorT3BBVUZ0ZU1ZeVJJSE44d2ZkVm9Pdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFtYXpvbiBSb290IENBIDQKPT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQjhqQ0NBWGlnQXdJQkFnSVRCbXlmMThHN0VFd3BRK1Z4ZTNzc3lCckJEakFLQmdncWhrak9QUVFEQXpBNU1Rc3dDUVlEVlFRRwpFd0pWVXpFUE1BMEdBMVVFQ2hNR1FXMWhlbTl1TVJrd0Z3WURWUVFERXhCQmJXRjZiMjRnVW05dmRDQkRRU0EwTUI0WERURTFNRFV5Ck5qQXdNREF3TUZvWERUUXdNRFV5TmpBd01EQXdNRm93T1RFTE1Ba0dBMVVFQmhNQ1ZWTXhEekFOQmdOVkJBb1RCa0Z0WVhwdmJqRVoKTUJjR0ExVUVBeE1RUVcxaGVtOXVJRkp2YjNRZ1EwRWdOREIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJOS3JpamRQbzFNTgovc0dLZTB1b2UwWkxZN0JpOWkwYjJ3aHhJZElBNkdPOW1pZjc4RGx1WGVvOXBjbUJxcU5iSUpoRlhSYmIvZWdRYmVPYzRPTzlYNFJpCjgzQmtNNkRMSkM5d3VvaWhLcUIxK0lHdVlnYkVnZHM1Ymltd0h2b3VYS05DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlYKSFE4QkFmOEVCQU1DQVlZd0hRWURWUjBPQkJZRUZOUHN4enBsYnN6aDJuYWFWdnVjODRadFYrV0JNQW9HQ0NxR1NNNDlCQU1EQTJnQQpNR1VDTURxTElmRzlmaEd0ME85WWxpL1c2NTEra0kwcnoyWlZ3eXpqS0tsd0NrY084RGRaRXY4dG1aUW9UaXBQTlUweldnSXhBT3AxCkFFNDd4RHFVRXBISldFYWRJUk55cDRpY2l1Uk1TdHVXMUt5TGEydEpFbE16cmRma3ZpVDh0UXAyMUtXOEVBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRVl6Q0NBMHVnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0IwakVMTUFrR0ExVUVCaE1DVkZJeEdEQVdCZ05WQkFjVApEMGRsWW5wbElDMGdTMjlqWVdWc2FURkNNRUFHQTFVRUNoTTVWSFZ5YTJsNVpTQkNhV3hwYlhObGJDQjJaU0JVWld0dWIyeHZhbWxyCklFRnlZWE4wYVhKdFlTQkxkWEoxYlhVZ0xTQlVWVUpKVkVGTE1TMHdLd1lEVlFRTEV5UkxZVzExSUZObGNuUnBabWxyWVhONWIyNGcKVFdWeWEyVjZhU0F0SUV0aGJYVWdVMDB4TmpBMEJnTlZCQU1UTFZSVlFrbFVRVXNnUzJGdGRTQlRUU0JUVTB3Z1MyOXJJRk5sY25ScApabWxyWVhOcElDMGdVM1Z5ZFcwZ01UQWVGdzB4TXpFeE1qVXdPREkxTlRWYUZ3MDBNekV3TWpVd09ESTFOVFZhTUlIU01Rc3dDUVlEClZRUUdFd0pVVWpFWU1CWUdBMVVFQnhNUFIyVmllbVVnTFNCTGIyTmhaV3hwTVVJd1FBWURWUVFLRXpsVWRYSnJhWGxsSUVKcGJHbHQKYzJWc0lIWmxJRlJsYTI1dmJHOXFhV3NnUVhKaGMzUnBjbTFoSUV0MWNuVnRkU0F0SUZSVlFrbFVRVXN4TFRBckJnTlZCQXNUSkV0aApiWFVnVTJWeWRHbG1hV3RoYzNsdmJpQk5aWEpyWlhwcElDMGdTMkZ0ZFNCVFRURTJNRFFHQTFVRUF4TXRWRlZDU1ZSQlN5QkxZVzExCklGTk5JRk5UVENCTGIyc2dVMlZ5ZEdsbWFXdGhjMmtnTFNCVGRYSjFiU0F4TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEEKTUlJQkNnS0NBUUVBcjNVd002cTdhOU9aTEJJM2hObU5lNWVBMDI3bi81dFFsVDZRbFZaQzF4bDhKb1NOa3ZvQkhUb1A0bVE0dDR5OAo2SWo1aXlTckxxUDFOK1JBamhnbGVZTjFIenYvYktqRnhsYjR0TzJLUktPcmJFejhIZERjNzJpOXorU3F6dkJWOTZJMDFJTnJOM3djCnd2NjFBK3hYenJ5MHRjWHRBQTlUTnlwTjlFOE1nL3VHejh2K2pFNjloL21uaXlGWG5IcmZBMmVKTEoyWFlhY1F1RldRZnc0dEp6aDAKMytmOTJrNFM0MDBWSWdMSTRPRDhENjJLMThsVVVNdzdEOG9XZ0lUUVVWYkRqbFovaVNJekwrYUZDcjJscUJzMjN0UGNMRzA3eHhPOQpXU01zNXVXazk5Z0w3ZXFRUUVTb2xidVQxZENBTkxaR2VBNGZBSk5HNGU3cCtleFBGd0lEQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVClpUL0hpb2JHUE4wOFZGdzErRHJ0VWd4SFY4Z3dEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUoKS29aSWh2Y05BUUVMQlFBRGdnRUJBQ28vNGZFeWpxN2htRnhMWHM5ckhtb0owaUtwRXNkZVYzMXpWbVNBaEhxVDVBbTVFTTJmS2lmaApBSGUrU01nMXFJR2Y1TGdzeVg4T3NOSkxOMTNxdWRVTFhqUzk5SE1wdyswbUZaeCtDRk9LV0kzUVN5amZ3YlBmSVBQNTQrTTYzOHljCmxOaE9UOE5yRjdmM2N1aXRaak8xSlZPcjRQaE1xWjM5OGcyNnJyblpxc1pyK1pPN3JxdTRsendER3JwRHhwYTVSWEk0czZlaGxqMlIKZTM3QUlWTk1oKzN5QzFTVlVaUFZJcVVOaXZHVERqNVVEckRZeVU3YzhqRXlWdXBrK2VxMW5SWm1Rbkx6ZjlPeE1VUDhwSTRYOFcwagpxNVJtK0szN0R3aHVKaTEvRndjSnNvejdVTUNmbG8zUHR2MEFuVm9VbXI4Q1JQWEJ3cDhpWHFJUG9lTT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR0RDQSBUcnVzdEFVVEggUjUgUk9PVAo9PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGaURDQ0EzQ2dBd0lCQWdJSWZRbVgvdkJINm5vd0RRWUpLb1pJaHZjTkFRRUxCUUF3WWpFTE1Ba0dBMVVFQmhNQ1EwNHhNakF3CkJnTlZCQW9NS1VkVlFVNUhJRVJQVGtjZ1EwVlNWRWxHU1VOQlZFVWdRVlZVU0U5U1NWUlpJRU5QTGl4TVZFUXVNUjh3SFFZRFZRUUQKREJaSFJFTkJJRlJ5ZFhOMFFWVlVTQ0JTTlNCU1QwOVVNQjRYRFRFME1URXlOakExTVRNeE5Wb1hEVFF3TVRJek1URTFOVGsxT1ZvdwpZakVMTUFrR0ExVUVCaE1DUTA0eE1qQXdCZ05WQkFvTUtVZFZRVTVISUVSUFRrY2dRMFZTVkVsR1NVTkJWRVVnUVZWVVNFOVNTVlJaCklFTlBMaXhNVkVRdU1SOHdIUVlEVlFRRERCWkhSRU5CSUZSeWRYTjBRVlZVU0NCU05TQlNUMDlVTUlJQ0lqQU5CZ2txaGtpRzl3MEIKQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBMmFNVzhNaDBkSGViN3pNTk93WitWZnkxWUk5MmhoSkNmVlptUG9pQzdYSmpEcDZMM1RRcwpBbEZSd3huOVdWU0V5ZkZyczB5dzZlaEdYVGpHb3FjdUVWZTZnaFdpbkk5dHNKbEtDdkxyaVhCalRubkV0MXU5b2wyeDhrRUNLNjJwCk9xUHNlUXJzWHpyai9lK0FQSzAwbXhxcmlDWjdWcUtDaGgvck5ZbURmMSt1S1U0OXRtN3Nyc0h3SjV1dTQvVHM3NjUvOTRZOWNucnIKcGZ0WlRxZnJsWXdpT1huaExRaVB6THlSdUVIM0ZNRWpxY090bWtWRXM3TFhMTTNHS2VKUUVLNWN5NEtPRnhnMmZaZm1pSnF3VFRRSgo5Q3k1V21ZcXNCZWJuaDUyblVwbU1VSGZQL3ZGQnU4YnRuNGFSamIzWkdNNzR6a1lJK2RuZFJUVmRWZVNONzIrYWhzbVVQSTJKZ2FRCnhYQUJaRzEyWnVHUjIyNEh3R0dBTHJJdUw0eHdwOUU3UExPUjVHNjJ4RHR3OG15U2x3bk5SMzBZd1BPN25nL1dpNjRIdGxvUHpnc00KUjZmbFByaTlmY2ViTmFCaGx6cEJkUmZNSzVaM0twSWhIdG1WZGlCbmFNOE52ZC9XSHdscW11TE1jM0drTDMwU2dMZFRNRVplUzFTWgpEMmZKcGNqeUlNR0M3SjBSMzhJQyt4bzcwZTBnbXU5bFpKSVFEU3JpM25EeEdHZUNqR0hldUx6Ukw1ejdEOUFyN1J0MnVlUTVWZmo0Cm9SMjRxb0FBVElMbnNuOEp1THd3b0M4TjlWS2VqdmVTc3dvQUhRQlVsd2Jnc1FmWnh3OWNaWDA4YlZsWDVPMmxqZWxBVTU4VlM2QngKOWhvaDQ5cHdCaUZZRkllRmQzbXFnbmtDQXdFQUFhTkNNRUF3SFFZRFZSME9CQllFRk9MSlFKOU56dWlhb1h6UERqOWx4U21JYWhsUgpNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRRFJTVmZnCnA4eG9XTG9CRHlzWnpZMndZVVdzRWUxalVHbjRIMysrRm8vOW5lc0xxakpIZHRKbkpPMjlmRE15bHlySEJZWm1EUmQ5RkJVYjFPdjkKSDVyMlhwZHB0eG9scEFxemtUOWZOcXlMN0Zlb1B1ZUJpaGhYT1lWMEdrTEg2VnNUWDQvNUNPbVNkSTMxUjlLck85YjdlR1pPTm4zNQo2WkxwQk43OVNXUDhiZnNVY1pObkwwZEt0N24vSGlwemNFWXd2MXJ5TDNtbDRZME0yZm15WXplTU4yV0ZjR3BjV3dseXVhMWpQTEhkCitQd3l2emVHNUx1T21DZCt1aDhXNFhBUjhnUGZKV0l5SnlZWU1vU2Yvd0E2RTdxYVRmUlB1QlJ3SXJIS0s1RE9LY0Z3OUMrZGYvS1EKSHRaYTM3ZEcvT2FHK3N2Z0lIWjZ1cWJMOVh6ZVlxV3hpKzdlZ21hS1Rqb3dIeitBeTYwbnVneGUxOUN4VnNwM2NiSzFkYUZRcVVCRApGOElvMmM5U2kxdklZOVJDUHFBemVrWXU5d29nUmxSK2FrOHg4WUYrUW5RNFpYTW43c1o4dUk3WHBUclhtS0djakJCVjA5dEw3RUNRCjhzMXVWOUppRG54WGs3R25iYzJkZzdzcTUrVzJPM0ZZcmYzUlJieGFrZTVURlcvVFJRbDFicnFRWFI0RXp6ZmZIcWhtc1l6bUlHcnYKL0VoT2RKaENyeWx2TG1ySCszM1JaakVpeklZQWZtYURERUwwdlRTU3d4cnFUOHArY2swTGNJeW1TTHVtb1JUMisxaEVtUlN1cWd1VAphYUFwSlVxbHl5dmRpbVlIRm5nVlYzRWI3UFZIaFBPZU1UZDYxWDhrcmVTOC9mM01ib1BvREtpM1FXd0gzYjA4aHBjdjBnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGM1RDQ0E4V2dBd0lCQWdJSWV5eWIweGFBTXBrd0RRWUpLb1pJaHZjTkFRRUxCUUF3ZkRFTE1Ba0dBMVVFQmhNQ1ZWTXhEakFNCkJnTlZCQWdNQlZSbGVHRnpNUkF3RGdZRFZRUUhEQWRJYjNWemRHOXVNUmd3RmdZRFZRUUtEQTlUVTB3Z1EyOXljRzl5WVhScGIyNHgKTVRBdkJnTlZCQU1NS0ZOVFRDNWpiMjBnVW05dmRDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVNCU1UwRXdIaGNOTVRZdwpNakV5TVRjek9UTTVXaGNOTkRFd01qRXlNVGN6T1RNNVdqQjhNUXN3Q1FZRFZRUUdFd0pWVXpFT01Bd0dBMVVFQ0F3RlZHVjRZWE14CkVEQU9CZ05WQkFjTUIwaHZkWE4wYjI0eEdEQVdCZ05WQkFvTUQxTlRUQ0JEYjNKd2IzSmhkR2x2YmpFeE1DOEdBMVVFQXd3b1UxTk0KTG1OdmJTQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJRkpUUVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRApnZ0lQQURDQ0Fnb0NnZ0lCQVBrUDNhTXJmY3ZRS3Y3c1o0V201eTRidW5maDQvV3ZwT3o2U2wyUnhGZEhheGgzYTNieS9aUGtQUS9DCkZwNExac05XbEo0WGc0WE9WdS95RnYwQVl2VWlDVlRvWlJkT1FibmdUMGFYcWh2SXVHNWlYbW14WDlzcUFuNzhiTXJ6UWRqdDBPajgKUDJGSTdiQURGQjBRRGtzWjRMdE83SVpsL3pielhtY0NDNTJHVldIOWVqanQvdUlaQUxkdm9WQmlkWFE4b1BySUpaSzBibm9peC9nZQpvZU95M1pFeHF5c2RCUCtsU2dRMzZZV2tNeXY5NHRaVk5Id1pwRXBveDdLbzA3ZktvWk9JNjhHWHZJejVIZGtpaENSMHh3UTlhcWtwCms4enJ1RnZoL2w4bHFqUll5TUVqVkowYm1CSERPSngrUFlac3BROUFobndDOUZ3Q1R5akxybkdmRHpySU0vNFJKVFhxL0xyRllEM1oKZkJqVnNxblRkWGdEY2lMS09zTWY3eXpsTHFuNm5peTJVVWI5cndQVzZtQm82b1VXTm11RjZSN0FzOTNFSk55QUtvRkJiWlEreU9ESgpnVUVBbmw2L2Y4VUltS0lZTEVKQXMvbHZPQ2RMVG9EMFBZRkg0SWg4Nmh6T3RYVmNVUzRjSzM4YWNpam5BTFhSZE1iWDVKK3RCNU8yClV6VTEvRGZrdy9aZEZyNGhjOTZTQ3ZpZ1kycThscEpxUHZpOFpWV2IzdlVOaVNZRS9DVWFwaVZweThKdHluemlXVitYck92dkxzaTgKMXh0WlBDdk04aG5JazJzbll4blAvT2ttK01weG0zK1QvalJuaEU2WjYveXplQWt6Y0xwbXBuYnRHM1ByR3FVTnhDSVRJSlJXQ2s0cwpiRTZ4L2MrY0NicWlNKzJIQWdNQkFBR2pZekJoTUIwR0ExVWREZ1FXQkJUZEJBa0hvdlY2ZlZKVEVwS1Y3amlBSlEybVdUQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQjhHQTFVZEl3UVlNQmFBRk4wRUNRZWk5WHA5VWxNU2twWHVPSUFsRGFaWk1BNEdBMVVkRHdFQi93UUUKQXdJQmhqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFJQmdSbENuN0pwMGNIaDV3WWZHVmNwTnhKSzFvazFpT01xOGJzM0FEL0NVcgpkSVdRUFhocTlMbUxwWmM3dFJpUnV4Nm4rVUJia2ZsVm1hOGVFZEJjSGFkbTQ3R1VCd3d5T2FicUc3QjUyQjJjY0VUaml0M0UrWlVmCmlqaERQd0dGcFVlblBVYXl2T1VpYVBkN25OZ3NQZ29oeUMwenJML0ZnWmt4ZE1GMWNjVytzZkFqUmZTZGEvd1pZNTJqdkFUR0dBc2wKdTFPSkQ3T0FVTjVGN2tSL3E1UjRaSmpUOWlqZGg5aHdaWFQ3RHJrVDY2Y1BZYWt5bHN6ZXUrMWpUQmk3cVVEM29GUnVJSWh4ZFJqcQplclEwY3VBakozZGN0cERxaGlWQXErOHpEOHVmZ3I2aUlQdjJ0UzBhNXNLRnNYUVArOGhsQXFSU0FVZmRTU0xCdjlqcmE2eCszdXhqCk14VzNJd2lQeGcrTlFWcmRqc1c1aitWRlAzamJ1dEliUUxIK2NVMC80SUdpdWw2MDdCWGdrOTBJSDM3aFZaa0xJZDZUbmdyNzVxTkoKdlRZdy91ZDNzcUIxbDdVdGdZZ1haU0QzMnBBQW44bFN6RExLTlh6MVBRL1lLOWYxSm16SkJqU1dGdXB3V1JveWVYa0x0b2gvRDFKSQpQYjlzMktKRUx0Rk90M0pZMDRrVGxmNUVxL2pYaXh0dW5Md3NvRnZWYWdDdlh6ZmgxZm9RQzVpY2h1Y21qODd3N0c2S1Z3dUE0MDZ5CndLQmpZWkM2VldnM2RHcTJrdHVmb1lZaXRtVW5EdXkybjBKZzVHZkN0ZHBCQzhUVGkyRWJ2UG9ma1N2WFJBZGV1aW1zMmNYcDcxTkkKV3V1QThTaFlJYzJ3QmxYN0p6OVRrSENwQkI1WEo3az0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDalRDQ0FoU2dBd0lCQWdJSWRlYmZ5OEZvVzZnd0NnWUlLb1pJemowRUF3SXdmREVMTUFrR0ExVUVCaE1DVlZNeERqQU1CZ05WCkJBZ01CVlJsZUdGek1SQXdEZ1lEVlFRSERBZEliM1Z6ZEc5dU1SZ3dGZ1lEVlFRS0RBOVRVMHdnUTI5eWNHOXlZWFJwYjI0eE1UQXYKQmdOVkJBTU1LRk5UVEM1amIyMGdVbTl2ZENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlU0JGUTBNd0hoY05NVFl3TWpFeQpNVGd4TkRBeldoY05OREV3TWpFeU1UZ3hOREF6V2pCOE1Rc3dDUVlEVlFRR0V3SlZVekVPTUF3R0ExVUVDQXdGVkdWNFlYTXhFREFPCkJnTlZCQWNNQjBodmRYTjBiMjR4R0RBV0JnTlZCQW9NRDFOVFRDQkRiM0p3YjNKaGRHbHZiakV4TUM4R0ExVUVBd3dvVTFOTUxtTnYKYlNCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlFVkRRekIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQQpCRVZ1cVZERXBpTTJubDhvalJmTGxpSmtQOXg2amgzTUNMT2ljU1M2amttNUJCdEhsbGlyTFpYSTdaNElOY2duNjRtTVUxanJZb3IrCjhGc1BhekZTWTBFN2ljM3M3TGFOR2RNMEI5eTd4Z1ovd2tXVjdNdC9xQ1BnQ2VtQit2TkgwNk5qTUdFd0hRWURWUjBPQkJZRUZJTFIKaFhNdzV6VUUwNDRDa3Z2bHBOSEVJZWpOTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SHdZRFZSMGpCQmd3Rm9BVWd0R0ZjekRuTlFUVApqZ0tTKytXazBjUWg2TTB3RGdZRFZSMFBBUUgvQkFRREFnR0dNQW9HQ0NxR1NNNDlCQU1DQTJjQU1HUUNNRy9uNjFrUnBHRFBZYkNXCmUrMEYrUzhUa2R6dDVmeFFheEZHUnJNY0lRQml1NzdENStqTkI1bjVEUXRkY2o3RXFnSXdIN3k2QytJd0pQdDhiWUJWQ3BrK2dBMHoKNVdhanM2TzdwZFdMandrc3BsMSs0dkFIQ0dodDBueHBibC9mNVdwbAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUY2ekNDQTlPZ0F3SUJBZ0lJVnJZcHpUUzhlUFl3RFFZSktvWklodmNOQVFFTEJRQXdnWUl4Q3pBSkJnTlZCQVlUQWxWVE1RNHcKREFZRFZRUUlEQVZVWlhoaGN6RVFNQTRHQTFVRUJ3d0hTRzkxYzNSdmJqRVlNQllHQTFVRUNnd1BVMU5NSUVOdmNuQnZjbUYwYVc5dQpNVGN3TlFZRFZRUUREQzVUVTB3dVkyOXRJRVZXSUZKdmIzUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ1VsTkJJRkl5Ck1CNFhEVEUzTURVek1URTRNVFF6TjFvWERUUXlNRFV6TURFNE1UUXpOMW93Z1lJeEN6QUpCZ05WQkFZVEFsVlRNUTR3REFZRFZRUUkKREFWVVpYaGhjekVRTUE0R0ExVUVCd3dIU0c5MWMzUnZiakVZTUJZR0ExVUVDZ3dQVTFOTUlFTnZjbkJ2Y21GMGFXOXVNVGN3TlFZRApWUVFEREM1VFUwd3VZMjl0SUVWV0lGSnZiM1FnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dVbE5CSUZJeU1JSUNJakFOCkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQWp6WmxRT0hXVGNEWHRPbEcybXZxTTBmTlRQbDlmYjY5TFQzdzIzamgKaHFYWnVnbFhhTzFYUHFEUUNFR0Q1eWhCSkIvamNoWFFBUnI3WG5BanNzdWZPZVBQeFU3R2ttMG14bnU3czlvbm5RcUc2WUUzQmY3dwpjWEhzd3h6cFk2SVhGSjN2RzJmVGhWVUNBdFpKeWN4YTRiSDNiektmeWRRN2lFR29uTDNMcTl0dGV3a2Zva3h5a05vckNQelBQRlRPClp3K296MTJXR1F2RTQzTHJyZEY5SFNmdmt1c1F2MXZyTzYvUGdOM0IwcFlFVzNwK3BLazhPSGFrWW82Z09WN3FkODlkQUZtUFppdysKQjZLakJTWVJhWmZxaGJjUGxndEx5RURoVUxvdWlzdjNENW9pNTMrYU54UE44azBUYXlIUndNd2k4cUZHOWtScG5NcGhOUWNBYjlaaApDQkhxdXJqMjZiTmc1VTI1N0o4VVpzbFhXTnZOaDJuNGlvWVNBMGUvWmhOMnJIZDlOQ1NGZzgzWHFweVFHcDhoTEg5NHQyUzQyT2ltCjlIaXpWY3VFMGpMRWVLNmpqMkhkemdoVHJleUkvQlhrbWczbW54cDN6a3lQdUJRVlBXS2NoamdHQUdZUzVGbDJXbFBBQXBpaUVDdG8KUkh1T2VjNHpTbmFxVzRFV0c3V0syTkFBZTE1aXRBbldobU1PcGdXVlNib29pNGlUc2pRYzJLUlZicmNjME42WlZUc2o5Q0xnK1NsbQpKdXdnVUhmYlNndVB2dVVDWUhCQlh0U3VVRGtpRkNiTHNqdHpkRlZIQjNtQk9hZ3dFMFRsQklxdWxoTWxRZys1VThTYi9NM2tITjQ4CitxdldCa29mWjZhWU1CemRMTnZjR0pWWFpzYi9YSXRXOVhjQ0F3RUFBYU5qTUdFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZkJnTlYKSFNNRUdEQVdnQlQ1WUx2VTQ5VTA5cmoxQm9BbHAzUGJSbW1vbmpBZEJnTlZIUTRFRmdRVStXQzcxT1BWTlBhNDlRYUFKYWR6MjBacApxSjR3RGdZRFZSMFBBUUgvQkFRREFnR0dNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUJXczQ3TENwMUpqcitreEpHN1poY0ZVWmgxCisrVlFMSHFlOFJUNnE5T0tQditSS1k5amk5aTBxVlFCRGI2VGhpLzVTbTNIWHZWWCtjcFZIQksrUnc4MnhkOXF0OXQxd2tjbGY3bngKWS9ob0xWVUUwZktOc0tUUHZEeGVIM2pucGFBZ2NMQUV4YmYzY3FmZUlnMjlNeVZHakdTU0p1TStMbU9XMnB1TVBmZ1lDZGNEekgyRwpndURLQkFkUlVOZi9rdFVNNzlxR241blg2N2V2YU9JNUpwUzZhTGUvZzlQcWVtYzlZbWV1SmVWeTZPTGs3SzRTOWtzclBKL3BzRUR6Ck9GU3ovYmRveU5yR2oxRThzdnVSM0J6bm01M2h0dzF5aitLa3hLbDQrZXNVck1aREJjSmxPU2dZQXNPQ3NwMEZ2bVh0bGw5bGREejcKQ1RVdWU1d1QvUnNQWGNkdGdUcFdEOHc3NGE4Q0x5S3NSc3BHUEtBY1ROWkV0RjR1WEJWbUNlRW1LZjdHVW1HNnNYUC93d3ljNVd4cQpsRDhVeWtBV2xZVHpXYW1zWDB4aGsyM1JPOHlpbFF3aXBtZG5SQzY1MmRLS1FiTm1DMXI3ZlNPbDhocXcvOTZiZzVRdTBUL2ZrcmVSCnJ3VTdaY2VnYkxITlloTERrQnZqSmM0MHZHOTNkckVRdy9jRkdzRFdyM1JpU0JkM2ttbVFZUnplbFlCMFZJOFlITVB6QTlDL3BFTjEKaGxNWWVnb3VDUncybjVIOWdvb2lTOUVPVUNYZHl3TU1GOG1EQUFoT05VMktpKzN3QXBSbUxFUi95NVVubGhldENUQ3N0bkVYYm9zWAo5aHdKMUMwN21LVngwMVFUMldEejlVdG1UL3J4N2lBU2piU3NWN0ZGWTZHc2RxbkMrdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2xEQ0NBaHFnQXdJQkFnSUlMQ21jV3hidEJaVXdDZ1lJS29aSXpqMEVBd0l3ZnpFTE1Ba0dBMVVFQmhNQ1ZWTXhEakFNQmdOVgpCQWdNQlZSbGVHRnpNUkF3RGdZRFZRUUhEQWRJYjNWemRHOXVNUmd3RmdZRFZRUUtEQTlUVTB3Z1EyOXljRzl5WVhScGIyNHhOREF5CkJnTlZCQU1NSzFOVFRDNWpiMjBnUlZZZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVTQkZRME13SGhjTk1UWXcKTWpFeU1UZ3hOVEl6V2hjTk5ERXdNakV5TVRneE5USXpXakIvTVFzd0NRWURWUVFHRXdKVlV6RU9NQXdHQTFVRUNBd0ZWR1Y0WVhNeApFREFPQmdOVkJBY01CMGh2ZFhOMGIyNHhHREFXQmdOVkJBb01EMU5UVENCRGIzSndiM0poZEdsdmJqRTBNRElHQTFVRUF3d3JVMU5NCkxtTnZiU0JGVmlCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlFVkRRekIyTUJBR0J5cUdTTTQ5QWdFR0JTdUIKQkFBaUEySUFCS29TUjVDWUcvdnZ3MEFIZ3lCTzhUQ0NvZ2JSOHBLR1lmTDJJV2pLQU1USDZrTUFWSWJjL1IvZkFMaEJZbHpjY0JZeQozaCtaMU16RkI4Z0lIMkVXQjFFOWZWd0hVK00xT0l6ZnpaL1pMZzFLdGhrdVduQmFCdTIrOEtHd3l0QUpLYU5qTUdFd0hRWURWUjBPCkJCWUVGRnZLWHVYZTBvR3F6YWd0WkZHMjJYS2JsK1pQTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SHdZRFZSMGpCQmd3Rm9BVVc4cGUKNWQ3U2dhck5xQzFrVWJiWmNwdVg1azh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQW9HQ0NxR1NNNDlCQU1DQTJnQU1HVUNNUUNLNWtDSgpOK3ZwMVJQWnl0UnJKUE93UFlkR1dCcnNzZDl2KzFhNmNHdkhPTXpvc1l4UEQvZnhaM1lPZzlBZVVZOENNRDMySXlnbVRNWmdoNU1tCm03STFIcnJXOXp6UkhNNzZKVHltR29FVlcvTVNEMnp1WllySmg2ajVCK0JpbW94Y1NnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR2xvYmFsU2lnbiBSb290IENBIC0gUjYKPT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZnekNDQTJ1Z0F3SUJBZ0lPUmVhN0E0TXp3NFZsU09iL1JWRXdEUVlKS29aSWh2Y05BUUVNQlFBd1RERWdNQjRHQTFVRUN4TVgKUjJ4dlltRnNVMmxuYmlCU2IyOTBJRU5CSUMwZ1VqWXhFekFSQmdOVkJBb1RDa2RzYjJKaGJGTnBaMjR4RXpBUkJnTlZCQU1UQ2tkcwpiMkpoYkZOcFoyNHdIaGNOTVRReE1qRXdNREF3TURBd1doY05NelF4TWpFd01EQXdNREF3V2pCTU1TQXdIZ1lEVlFRTEV4ZEhiRzlpCllXeFRhV2R1SUZKdmIzUWdRMEVnTFNCU05qRVRNQkVHQTFVRUNoTUtSMnh2WW1Gc1UybG5iakVUTUJFR0ExVUVBeE1LUjJ4dlltRnMKVTJsbmJqQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUpVSDZIUEtadm5zRk1wN1BQY05DUEcwUlFzcwpnclJJeHV0YlBLNkR1RUdTTXhTa2IzL3BLc3pHc0locnhiYUowY2F5L3hUT1VSUWg3RXJkRzFyRzFvZnVUVG9WQnUxa1pndVNnTXBFCjNuT1VUdk9uaVg5UGVHTUl5QkpRYlVKbUwwMjVlU2hOVWhxS0dvQzNHWUVPZnNTS3ZHUk1JUnhEYU5jOVBJckZzbWJWa0pxM01RYkYKdnVKdE1nYW1Idm01NjZxanVMKytnbU5RMFBBWWlkL2tEM24xNnFJZkt0SndMbnZudkpPN2JWUGlTSHlNRUFjNC8yYXlkMkYrNE9xTQpQS3EwcFBiemxVb1NCMjM5akxLSno5Q2dZWGZJV0hTdzFDTTY5MTA2eXFMYm5RbmVYVVF0a1BHQnpWZVMrbjY4VUFSak5OOXJreGkrCmF6YXlPZVNzSkRhMzhPKzJIQk5YazdiZXN2amloYmR6b3JnMXFrWHk0SjAyb1c5VWl2RnlWbTR1aU1WUlFrUVZsTzZqeFRpV20wNU8KV2d0SDh3WTJTWGN3dkhFMzVhYnNJUWgxL09aaEZqOTMxZG1SbDRRS2JOUUNUWFRBRk8zOU9mdUQ4bDRVb1FTd0Mrbis3by9oYmd1eQpDTE5oWmdscXNRWTZaWlpad1BBMS9jbmFLSTBhRVlkd2dRcW9tblVkbmpxR0JRQ2UyNERXSmZuY0JaNG5XVXgyT1Z2cSthV2gySU1QCjBmL2ZNQkg1aGM4elNQWEtiV1FVTEhwWVQ5TkxDRW5GbFdRYVl3NTVQZld6ak1wWXJaeENSWGx1RG9jWlhGU3haYmEvakp2Y0Ura04KYjdndTNHZHV5WXNSdFlRVWlnQVpjSU41a1plUjFCb252emNlTWdmWUZHTThLRXl2QWdNQkFBR2pZekJoTUE0R0ExVWREd0VCL3dRRQpBd0lCQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJTdWJBV2preFBpb3VmaTF4eld4L0IveUdkVG9EQWZCZ05WCkhTTUVHREFXZ0JTdWJBV2preFBpb3VmaTF4eld4L0IveUdkVG9EQU5CZ2txaGtpRzl3MEJBUXdGQUFPQ0FnRUFneVh0Nk5IOWxWTE4KbnNBRW9KRnA1bHpRaE43Y3JhSlA2RWQ0MW1XWXFWdW9QSWQ4QW9yUmJyY1djK1pmd0ZTWTFYUyt3YzNpRVpHdEl4ZzkzZUZ5UkphMApsVjdBZTQ2WmVCWkRFMVpYczZLek83VjMzRUJ5cktQcm16VStzUWdob2VmRVF6ZDVNcjYxNTV3c1RMeERLWm1PTU5Pc0llRGpIZnJZCkJ6TjJWQUFpS3JsTklDNXdhTnJsVS95RFhOT2Q4djlFREVSbTh0TGp2VVlBR20wQ3VpVmRqYUV4VWQxVVJoeE4yNW1XN3hvY0JGeW0KRmU5NDRIbitYZHMrcWt4Vi9ab1ZxVy9ocHZ2ZmNERHB3KzVDUnUzQ2t3V0orbjFqZXovUWNZRjhBT2lZcmc1NE5NTWwrNjhLbnlCcgozVHNUanhLTTRrRWFTSHB6b0hkcHg3WmNmNExJSHY1WUd5Z3JxR3l0WG0zQUJkSjd0K3VBL2lVMy9nS2JhS3hDWGNQdTljemM4RkIxCjBqWnBuT1o3Qk45dUJtbTIzZ29KU0ZtSDYzc1VZSHBrcW1sRDc1SEhUT3dZM1d6dlV5Mk1tZUZlOG5JK3oxVEl2V2ZzcEE5TVJmL1QKdVRBakIweVBFTCtHbHRtWldyU1pWeHlrekxzVmlWTzZMQVVQNU1TZUdiRVlOTlZNbmJydDl4K3ZKSlVFZUtnRHUrNkI1ZHBmZkl0SwpvWkIwSmFlelBrdklMRmE5eDhqdk9PSmNrdkI1OTV5RXVuUXRZUUVnZm43UjhrOEhXVitMTFVOUzYwWU1sT0gxWmtkNWQ5VlVXeCt0CkpEZkxSVnBPb0VSSXlOaXdtY1VWaEFuMjFrbEp3R1c0NWhweGJxQ284WUxvUlQ1czFnTFhDbWVEQlZySnBCQT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDYVRDQ0FlK2dBd0lCQWdJUUlTcFdESzdhREt0QVJiOHJvaTA2NmpBS0JnZ3Foa2pPUFFRREF6QnRNUXN3Q1FZRFZRUUdFd0pEClNERVFNQTRHQTFVRUNoTUhWMGxUWlV0bGVURWlNQ0FHQTFVRUN4TVpUMGxUVkVVZ1JtOTFibVJoZEdsdmJpQkZibVJ2Y25ObFpERW8KTUNZR0ExVUVBeE1mVDBsVFZFVWdWMGxUWlV0bGVTQkhiRzlpWVd3Z1VtOXZkQ0JIUXlCRFFUQWVGdzB4TnpBMU1Ea3dPVFE0TXpSYQpGdzAwTWpBMU1Ea3dPVFU0TXpOYU1HMHhDekFKQmdOVkJBWVRBa05JTVJBd0RnWURWUVFLRXdkWFNWTmxTMlY1TVNJd0lBWURWUVFMCkV4bFBTVk5VUlNCR2IzVnVaR0YwYVc5dUlFVnVaRzl5YzJWa01TZ3dKZ1lEVlFRREV4OVBTVk5VUlNCWFNWTmxTMlY1SUVkc2IySmgKYkNCU2IyOTBJRWRESUVOQk1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFVE9sUXdNWVBjaGk4MlBHNnM0bmllVXFqRnFkcgpWQ1RiVWYvcTlBa2t3d3Npbjh0cUo0S0JEZExBcnpIa2RJSnV5aVhaakhXZDhkdlFtcUpMSVg0V3AyT1Ewam5Vc1lkNFh4aVdEMUFiCk5UY1Bhc2JjMlJOTnBJNlFOK2E5V3pHUm8xUXdVakFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWQKQmdOVkhRNEVGZ1FVU0ljVXJPUERucEJnT3RmS2llN1RyWXkwVUdZd0VBWUpLd1lCQkFHQ054VUJCQU1DQVFBd0NnWUlLb1pJemowRQpBd01EYUFBd1pRSXdKc2RwVzl6VjU3TG55QXlNak1QZGVZd2JZOVhKVXBST1RZSktjeDZ5Z0lTcEpjQk1XbTFKS1dCNEUrSitTT3RrCkFqRUEyelFnTWdqL21ra0N0b2plRks5ZGJKbHhqUm8vaTlmZ29qYUdIQWVDT25aVC9jS2k3ZTk3c0lCUFdBOUxVem05Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClVDQSBHbG9iYWwgRzIgUm9vdAo9PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZSakNDQXk2Z0F3SUJBZ0lRWGQreDJscWo3VjIrV21VZ1pRT1E3ekFOQmdrcWhraUc5dzBCQVFzRkFEQTlNUXN3Q1FZRFZRUUcKRXdKRFRqRVJNQThHQTFVRUNnd0lWVzVwVkhKMWMzUXhHekFaQmdOVkJBTU1FbFZEUVNCSGJHOWlZV3dnUnpJZ1VtOXZkREFlRncweApOakF6TVRFd01EQXdNREJhRncwME1ERXlNekV3TURBd01EQmFNRDB4Q3pBSkJnTlZCQVlUQWtOT01SRXdEd1lEVlFRS0RBaFZibWxVCmNuVnpkREViTUJrR0ExVUVBd3dTVlVOQklFZHNiMkpoYkNCSE1pQlNiMjkwTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEEKTUlJQ0NnS0NBZ0VBeGVZcmIzenZKZ1VubzRFazJtL0xBZm1abXFreXdpS0hZVUdSTzh2RGFCc0d4VXlwSzhGbkZ5SWRLKzM1S1ltVApvbmk5a211Z293Mmlmc3FUczZiUmpEWFZkZmtYOXM5RnhlVjY3SGVUb0k4anJnNGFBMysrMU5EdExudXJSaU5iL3l6bVZIcVV3Q29WCjhNbU5zSG83Sk9IWGFPSXhQQVl6UnJaVUVhYWxMeUpVS2xnTkFRTHgraFZSWjJ6QSt0ZTJHMy9SVm9ndkdqcU5PN3VDRWVCSEFOQlMKaDZ2N2huNFBKR3RBblRSbnZJM0hMWVp2ZVQ2T3FUd1hTMyt3bWVPd2NXRGNDL1Zrdzg1RHZHMXh1ZExlSjF1SzZOakdydUZaZmM4bwpMVFc0bFZZYThiSllTN2NTTjhoOHMrMUxnT0dOK2pJanRtKzNTSlVJc1VST2hZdzZBbFFnTDkrL1YwODdPcEFoMThFbU5WUWc3TWMvClIrenZXcjlMZXNHdE94ZFFYR0xZRDB0SzNDdjZicnh6a3Mzc3gxRG9RWmJYcVg1dDJPa2RqNHExdVZpU3VrcVNLd3hXL1lEckNQQmUKS1c0YkhBeXZqNU9KcmR1OW81NGh5b2taN04rMXd4cnJGdjU0Tmt6V2J0QStGeHlRRjJzbXV2dDZMNzhSSEJnT0xYTURqNkRsTmFCYQo0a3gxSFhIaE9UaFRlRURNZzVQWENwNmRXNCtLNU9YZ1NPUklza2ZOVGlwMUtudnlJdmJKdmdtUmxsZDZpSWlzN25Dcytkd3A0d3djCk94Sk9STmFuVHJBbXlQUFpHcGVSYU9ydmpVWUcwbFpGV0pvOERBK0R1QVVsd3puUE82UTBpYmQ1RWk5SHhlZXBsMm44cG5kbnRkOTcKOFhwbEZlUmhWbVVDQXdFQUFhTkNNRUF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwTwpCQllFRklIRWpNejE1REQvcFF3SVg0d1ZaeUYwQWQvZk1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRQVRaU0wxaml1dFJPVEwvN2xvCjVzT0FTRDBFZS9vakwzcnROdHF5em0zMjVwN2xYMWlQeXpjeW9jaGx0cTQ0UFRVYlBydzd0Z1RRdlBsSjladjNoY1UydHN1OCtNZzUKMWVSZkI3MFZWSmQweXNydFQ3cTZaSGFmZ2JpRVJVbE1qVytpNjdITTBjT1Uya1RDNXVMcUdPaWlIeWNGdXRmbDFxbk4zZTkybUkwQQpEczBiK2dPM2pvQllEaWMvVXZ1VW9zcGVaY25XaE5xNU5YSHpKc0JQZCthQko5SjNPNW9VYjNuMDl0RGgwNVM2MEZkUnZTY0ZEY0g5CnlCSXc3bStORVNzSW5kVFV2NEJGRkpxSVJOb3c2clNuNCs3dlc0TFZQdGF0ZUpMYlhEenoySzM2dUd0L3hEWW90Z0lWaWxRc25MQVgKYzQ3UU42TVVQSmlWQUF3cEJWdWVTVW14WDhmank4OG5aWTQxRjdkWHlERFpRVnU1Rkxib3dnK1VNYWVVbU14cTY3WGhKL1VRcUFIbwpqaEppNklqTXRYOUdsOENiRUdZNEdqWkdYeUpvUGQvSnhoTW5xMU1HcktJOGhnWmxiN0Yrc1NsRW1xTzZTV2tvYVkvWDVWK3RCSVprCmJ4cWdETVVJWXM2QW85RHo3R2pldmpQSEYxdC9nTVJNVExHbWhJckRPN2dKelJTQnVoampWRmMyL3RzdmZFZWhPalBJK1ZnN1JFK3gKeWdLSkJKWW9hTVZMdUNhSnU5WXpMMURWL3BxSnVoZ3lrbFRHVytDZCtWN2xEU0tiOXRyaXlDR3lZaUdxaGtDeUxtVFRYOGpqZmhGbgpSUjhGL3VPaTc3T29zL045ai9nTUh5SWZMWEMwdUFFMGRqQUE1U040cDFiWFVCK0srd2Ixd2hudzBBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVUNBIEV4dGVuZGVkIFZhbGlkYXRpb24gUm9vdAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGV2pDQ0EwS2dBd0lCQWdJUVQ5SXJqL1ZreURPZVR6UllaaU53WURBTkJna3Foa2lHOXcwQkFRc0ZBREJITVFzd0NRWURWUVFHCkV3SkRUakVSTUE4R0ExVUVDZ3dJVlc1cFZISjFjM1F4SlRBakJnTlZCQU1NSEZWRFFTQkZlSFJsYm1SbFpDQldZV3hwWkdGMGFXOXUKSUZKdmIzUXdIaGNOTVRVd016RXpNREF3TURBd1doY05Nemd4TWpNeE1EQXdNREF3V2pCSE1Rc3dDUVlEVlFRR0V3SkRUakVSTUE4RwpBMVVFQ2d3SVZXNXBWSEoxYzNReEpUQWpCZ05WQkFNTUhGVkRRU0JGZUhSbGJtUmxaQ0JXWVd4cFpHRjBhVzl1SUZKdmIzUXdnZ0lpCk1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ3BDUWNvRXdLd21lQmtxaDVERm5wenNaR2dkVDZvK3VNNEFIcnMKaVdvZ0Q0dkZzSnN6QTFxR3hsaUcxY0dGdTAvR25FQk55cjd1YVphNHJZRXdtbnlTQmVzRks1cEkwTGgyUHBiSUlMdlNzUEdQMkt4RgpSditxWjJDMGQzNXFIendhVW5vRVBRYzhoUTJFMEI5MkN2ZHFGTjl5NHpSOFYwNVdBVDU1OGFvcE8yejYrSTl0VGNnMTM2N3IzQ1R1CmVVV25oYllGaU42SVhTVjhsMlJuQ2RtL1doVUZodk1KSHV4WU1qTVI4M2Rrc0hZZjVCQTFGeHZ5RHJGc3BDcWpjL3dKSHg0eUdWTVIKNTltekxDNTJMcUdqM241cWlBbm84Z2VLK0xMTkVPZmljMENUdXdqUlArSDhDNVN6SmU5OHB0ZlJyNS8vbHByMWtYdVlDM2ZVZnVnSAowbUsxbFRuajgvRnREdzVsaElwalZNV0F0dUNlUzMxSEpxY0JDRjNSaUo3WHd6SkUrb0pLQ21oVWZ6aFRBOHlrQUROa1VWa0xvNEtSCmVsN3NGc0x6S3VaaTJpcmJXV0lRSlVvcWdRdEhCME1HY0lmUytwTVJLWHBJVGV1VXgzQk5yMmZWVWJHQUlBRUJ0SG9JcHBCL1R1RHYKQjBHSHIycWxYb3Y3ejFDeW1sU3Z3NG02V0MzMU1KaXhObkk1ZmtrRS9TbW5USG5rQlZmYmxMa1dVNDFHc3gyVllWZFdmNi93Rmx0aApXRzgyVUJFTDJLd3JsUllhRGg4SXpUWTBaUkJpWnRXQVh4UWdYeTBNb0hnS2FOWXMxK2x2SzlKS0JaUDhubTlyWi8rSThVNmxhVXBTCk53WHF4aGFOMHNTWjBZSXJPN28xZGZkUlVWanp5QWZkNUxRRGZ3SURBUUFCbzBJd1FEQWRCZ05WSFE0RUZnUVUyWFE2NURBOURmY1MKM0g1YUJaOGVOSnIzNFJRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBWVl3RFFZSktvWklodmNOQVFFTApCUUFEZ2dJQkFEYU5sOHhDRldRcE41c21MTmI3cmhWcExHc2FHdmRmdHZrSFRGbnE4OG5JdWE3TXVpNTYzTUQxc0MzQU82K2ZjQVVSCmFwOGxUd0VwY09QbERPSHFXbnpjU2J2QkhpcUI5UlpMY3BISW9qRzVxdHI4blIvelhVQUNFL3hPSEFiS3N4U1FWQmNaRWhyeEg5Y00KYVZyMmNYajBsSDJSQzQ3c2tGU092RytoVEt2OGRHVDljWnI0UVFlaHpaSGtQSnJnbXpJNWM2c3ExV25JZUpFbU1YM2l4ekR4L0JSNApkeElPRS9UZEZwUy9TMmQ3Y0ZPRnlyQzc4emhOTEpBNXdBM0NYV3ZwNHVYVmlJM1dMTCtyRzc2MUtJY1NGM1J1L0gzOGo5Q0hKckFiCis3bHNxK0tlUFJYQk95NW5BbGlSbisvNFFoOHN0MmoxZGEzUHRmYi9FWDNDOENTbHJkUDZvRHlwK2wzY3BhRHZSS1MrMXVqbDVCT1cKRjNzR1BqTHR4N2RDdkhhajJHVTRLemcxVVNFT0RtOHVOQk5BNFN0bkRHMUtRVEFZSTFveVZabkpGK0E4M3Zic2VhMHJXQm1pclN3aQpHcFdPdnBhUVhVSlh4UGtVQXpVckhDMVJWd2luT3Q0LzVNaTBBM1BDd1NhQXV3dENINjBOcnlaeTJzeStzNk9EV0EyQ3hSOUdVZU9jCkdNeU5tNDNzU2V0MVVOV01LRm5LZERUYWpBc2hxeDdxRytYSC9SVSt3QmVxK3lOdUprYkwrdm14Y210cHp5S0VDMklQck5rWkFKU2kKZGp6VUxacnRCSjR0Qm1JUU4xSWNoWEliSitYTXhqSHNOK3hqV1pzTEhYYk1makthaUpVSU5sSzczblpmZGtsSnJYKzlaU0N5eWNFcgpkaGgybjFheAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDZXJ0aWduYSBSb290IENBCj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdXekNDQkVPZ0F3SUJBZ0lSQU1ycEc0bnhWUU1ObytaQmJjVGpwdUV3RFFZSktvWklodmNOQVFFTEJRQXdXakVMTUFrR0ExVUUKQmhNQ1JsSXhFakFRQmdOVkJBb01DVVJvYVcxNWIzUnBjekVjTUJvR0ExVUVDd3dUTURBd01pQTBPREUwTmpNd09ERXdNREF6TmpFWgpNQmNHQTFVRUF3d1FRMlZ5ZEdsbmJtRWdVbTl2ZENCRFFUQWVGdzB4TXpFd01ERXdPRE15TWpkYUZ3MHpNekV3TURFd09ETXlNamRhCk1Gb3hDekFKQmdOVkJBWVRBa1pTTVJJd0VBWURWUVFLREFsRWFHbHRlVzkwYVhNeEhEQWFCZ05WQkFzTUV6QXdNRElnTkRneE5EWXoKTURneE1EQXdNell4R1RBWEJnTlZCQU1NRUVObGNuUnBaMjVoSUZKdmIzUWdRMEV3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQwpEd0F3Z2dJS0FvSUNBUUROR0RsbEdsbXg2bVFXRG95VUpKVjhnOVBGT1NiY0RPOFdWNDNYMkt5alFuK0N5dTNOVzlzT3R5M3RSUWdYCnN0bXp5OVlYVW5JbzI0NU9ub3EyQy9tZWhKcE5kdDRpS1Z6U3M5SUdQakE1cVhTamtsWWNvVzlNQ2lCdG55TjZ0TWJhTE9RZExOeXoKS05BVDhreE9Ba21oVkVDZTV1VUZvQzJFeVArWWJORHJpaHFFQ0I2M2FDUHVJOVZ3em0xUmFSRHVvWHJDMFNJeHdvS0YwdkpWZGxCOApKWHJKaEZ3THJOMUNUaXZuZ3FJa2ljdVFzdER1STdwbVRMdGlwUGxUV21SN2ZKajZvMGllRDVXdXB4ajBhdXd1QTBXdjhIVDRLczE2ClhkRytSQ1l5S2ZIeDlXek1mZ0loQzU5dnBEKytuVlBpejMycExIeFlHcGZoUFRjM0dHWW8wa0RGVVlxTXd5M09VNGdrV0dRd0ZzV3EKNE5ZS3BrRGZlUGIxQkh4cEU0UzgwZEduQnM4QjkyakFxRmU3T21HdEJJeVQ0NjM4OE50RWJWbmNTVm11ckpxWk5qQkJlM1l6SW9lagp3cEtHYnZsdzdxNkhoNVVieEhxOU1mUFUwdVdaLzc1STdIWDFlQllkcG5EQmZ6d2JvWkw3ejhnODFzV1RDby8xVlRwMmxjNVptSW9KCmxYY3ltb082TEFRNmw3M1VMNzdYYkp1aXluMXRKc2xWMWMvRGVWSUlDWmtISkMxa0pXdW1JV21iYXQxMFRXdVhla0c5cXhmNWtCZEkKanpiNUxkWEYyKzZxaFVWQitzMDZSYkZvNWpaTW01Qlg3Q081aHdqQ3hBbnhsNFlxS0UzaWRNRGF4SXpiMytLaEYxbk9KRmwwTWRwLwovVEJ0MmR6aGF1SDhYd0lEQVFBQm80SUJHakNDQVJZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3CkhRWURWUjBPQkJZRUZCaUhWdUJ1ZCs0a05UeE9jNW9mMXVIaWVYNHJNQjhHQTFVZEl3UVlNQmFBRkJpSFZ1QnVkKzRrTlR4T2M1b2YKMXVIaWVYNHJNRVFHQTFVZElBUTlNRHN3T1FZRVZSMGdBREF4TUM4R0NDc0dBUVVGQndJQkZpTm9kSFJ3Y3pvdkwzZDNkM2N1WTJWeQpkR2xuYm1FdVpuSXZZWFYwYjNKcGRHVnpMekJ0QmdOVkhSOEVaakJrTUMrZ0xhQXJoaWxvZEhSd09pOHZZM0pzTG1ObGNuUnBaMjVoCkxtWnlMMk5sY25ScFoyNWhjbTl2ZEdOaExtTnliREF4b0MrZ0xZWXJhSFIwY0RvdkwyTnliQzVrYUdsdGVXOTBhWE11WTI5dEwyTmwKY25ScFoyNWhjbTl2ZEdOaExtTnliREFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBbExpZVQvRGpsUWdpNTgxb1FmY2NWZFY4QU9JdApPb2xkYURndlVTSUxTbzNMNmJ0ZFBydGNQYkVvL3VSVFZSUFBvWkFiQWgxZlprWUpNeWpoRFNTWGNOTVFIK3BrVjVhN1hkcm54SXhQClRHUkdIVnlINDFuZVF0R2JxSDZtaWQyUEhNa3dndTA3bk0zQTZSbmdhdGdDZFRlcjl6UW9LSkh5QkFwUE5lTmdKZ0g2MEJHTStSRnEKN3E4OXcxRFRqMTh6ZVR5R3FITkZrSXdndG5KekZ5TytCMlhsZUpJTnVnSEE2NHdjWnIrc2huY0JsQTJjNXVrNWpSK21VWXlaRERsMwo0YlNiK2h4blYyOXFhbzZwSzB4WGVYcFhJcy9OWDJOR2pWeFpPb2I0TWtkaW8yY05HSkhjKzZacjlVaGhjeU5aamdLbnZFVHE5RW1kCjhWUlkrV0N2Mmhpa0x5aEYzSHFnaUlaZDh6dm4veWsxZ1B4a1E1VG00eHh2dnEwT0ttT1pLOGwraGZaeDZBWURsZjdlajBnY1d0U1MKNkN2dTV6SGJ1Z1JxaDVqbnhWL3ZmYWNpOXdIWVRmbUowQTZhQlZta25walpieXZLY0w1a3dsV2o5T212dzVJcDNJZ1dKSms4alNhWQp0bHUzek02M053ZjlKdG1ZaFNUL1dTTURtdTJkbmFqa1hqak8xMUlOYjlJL2JiRUZhMG5PaXBGR2MvVDJML0NvYzNjT1pheWhqV1pTCmFYNUxhQXpISGpjbmc2V014d0xrRk0xSkFiQnpzLzNHa0RwdjBtenRPKzdza2I2aVExMkxBRXBtSlVSdzNrQVArSHdWOTZMT1BOZGUKRTR5QkZ4Z1gwYjN4ZHhBNjFHVTV3U2VzVnl3bFZQK2kyaytLWVRsZXJqMUtqTDA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCmVtU2lnbiBSb290IENBIC0gRzEKPT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGxEQ0NBbnlnQXdJQkFnSUtNZlhrWWd4c1dPM1cyREFOQmdrcWhraUc5dzBCQVFzRkFEQm5NUXN3Q1FZRFZRUUdFd0pKVGpFVApNQkVHQTFVRUN4TUtaVzFUYVdkdUlGQkxTVEVsTUNNR0ExVUVDaE1jWlUxMVpHaHlZU0JVWldOb2JtOXNiMmRwWlhNZ1RHbHRhWFJsClpERWNNQm9HQTFVRUF4TVRaVzFUYVdkdUlGSnZiM1FnUTBFZ0xTQkhNVEFlRncweE9EQXlNVGd4T0RNd01EQmFGdzAwTXpBeU1UZ3gKT0RNd01EQmFNR2N4Q3pBSkJnTlZCQVlUQWtsT01STXdFUVlEVlFRTEV3cGxiVk5wWjI0Z1VFdEpNU1V3SXdZRFZRUUtFeHhsVFhWawphSEpoSUZSbFkyaHViMnh2WjJsbGN5Qk1hVzFwZEdWa01Sd3dHZ1lEVlFRREV4TmxiVk5wWjI0Z1VtOXZkQ0JEUVNBdElFY3hNSUlCCklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFrMHU3NldhSzdwMWIxVFNUMEJzZXcrZWV1R1F6ZjJONGFMVE4KTG5GMTE1c2d4azBwdkxab1lJcjNJWnBXTlZyemRyM1l6WnIvazFaTHBWa0dvWk0wS2QwV05IVk84b0cweDVaT3JSa1ZVa3IrUEhCMQpjTTJ2SzZzVm1qTThxck9McXMxRC9mWHFjUC90enhFN2xNNU9NaGJUSTBBcWQ3T3ZQQUVzYk8yWkxJdlpUbW1Zc3ZlUFFiQXllR0hXCkRWL0QrcUpBa2gxY0YrWndQalhub3JmQ1l1S3JwRGhNdFRrMWIrb0RhZm82VkdpRmJkYnlMME5WSHBFTkR0alZhcVNXMFJNOExIaFEKNkRxUzBoZFc1VFVhUUJ3K2pTenRPZDlDNElOQmROK2p6Y0tHWUVobzQya0xWQUNMNUhacElRMTVUalFJWGhUQ3pMRzNyZGQ4Y0lySApoUUlEQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVKys4TmhwNnc0OTJwdWZFaEYzOCsvUEIzS3hvd0RnWURWUjBQQVFIL0JBUURBZ0VHCk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFGbi84b3oxaDMxeFBhT2ZHMXZSMnZqVG5HczIKdlp1cFlldmVGaXgwUFo3bWRkclh1cWU4UWhmblBaSHI1WDNkUHB6eHo1S3NiRWpNd2lJL2FUdkZ0aFV2b3pYR2FDb2NWNjg1NzQzUQpOY01ZREhzQVZoek5peGwwM3I0UEV1RFFxcUUvQWpTeGNNNmRHTllJQXdsRzdtRGdmcmJFU1FSUmZYQmd2S3F5LzNseWVxWWRQVjhxCitNcmkvVG0zUjducmZ0OEVJNi82bkFZSDZmdGprNEJBdGNac0NqRW96Z3lmejdNak5ZQkJqV3pFTjN1Qkw0Q2hRRUtGNmRrNGplaWgKVTgwQnYybm9XZ2J5UlF1UStxN2h2NTN5cmxjOHBhNnlWdlNMWlVEcC9UR0JMUFE1Q2RqdWE2ZTBwaDBWcFpqM0FZSFloWDN6VVZ4eAppTjY2ekIrQWZrbz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKZW1TaWduIEVDQyBSb290IENBIC0gRzMKPT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNUakNDQWRPZ0F3SUJBZ0lLUFBZSHFXaHdEdHFMaERBS0JnZ3Foa2pPUFFRREF6QnJNUXN3Q1FZRFZRUUdFd0pKVGpFVE1CRUcKQTFVRUN4TUtaVzFUYVdkdUlGQkxTVEVsTUNNR0ExVUVDaE1jWlUxMVpHaHlZU0JVWldOb2JtOXNiMmRwWlhNZ1RHbHRhWFJsWkRFZwpNQjRHQTFVRUF4TVhaVzFUYVdkdUlFVkRReUJTYjI5MElFTkJJQzBnUnpNd0hoY05NVGd3TWpFNE1UZ3pNREF3V2hjTk5ETXdNakU0Ck1UZ3pNREF3V2pCck1Rc3dDUVlEVlFRR0V3SkpUakVUTUJFR0ExVUVDeE1LWlcxVGFXZHVJRkJMU1RFbE1DTUdBMVVFQ2hNY1pVMTEKWkdoeVlTQlVaV05vYm05c2IyZHBaWE1nVEdsdGFYUmxaREVnTUI0R0ExVUVBeE1YWlcxVGFXZHVJRVZEUXlCU2IyOTBJRU5CSUMwZwpSek13ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBUWpwUXk0TFJMMUtQT3hzdDNpQWhLQW5qbGZTVTJmeVNVMFdYVHN1d1ljCjU4QnlyK2l1TCtGQlZJY1VxRXF5Nkh5QzVsdHF0ZHl6ZGM2TEJ0Q0dJNzlHMVk0UFB3VDAxeHlTZnZhbFk4TDFYNDR1VDZFWUdRSXIKTWdxQ1pIMFdrOUdqUWpCQU1CMEdBMVVkRGdRV0JCUjhYUUtFRTlUTWlwdUJ6aGNjTGlrZW5FaGpRakFPQmdOVkhROEJBZjhFQkFNQwpBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFLQmdncWhrak9QUVFEQXdOcEFEQm1BakVBdnZOaHp3SVFIV1NWQjdnWWJvaUZCUytECkNCZVF5aCtLVE9nTkczcXhyZFdCQ1Vmdk82d0lCSHhjbWJIdFJ3ZlNBakVBbmJwVi9LbEs2TzN0NW5ZQlFudkkrR0RaalZHTFZUdjcKakh2clpRbkQrSmJOUjZpQzhoWlZkeVIrRWhDVkJDeWoKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKZW1TaWduIFJvb3QgQ0EgLSBDMQo9PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEY3pDQ0FsdWdBd0lCQWdJTEFLN1BBTHJFenpMNFE3SXdEUVlKS29aSWh2Y05BUUVMQlFBd1ZqRUxNQWtHQTFVRUJoTUNWVk14CkV6QVJCZ05WQkFzVENtVnRVMmxuYmlCUVMwa3hGREFTQmdOVkJBb1RDMlZOZFdSb2NtRWdTVzVqTVJ3d0dnWURWUVFERXhObGJWTnAKWjI0Z1VtOXZkQ0JEUVNBdElFTXhNQjRYRFRFNE1ESXhPREU0TXpBd01Gb1hEVFF6TURJeE9ERTRNekF3TUZvd1ZqRUxNQWtHQTFVRQpCaE1DVlZNeEV6QVJCZ05WQkFzVENtVnRVMmxuYmlCUVMwa3hGREFTQmdOVkJBb1RDMlZOZFdSb2NtRWdTVzVqTVJ3d0dnWURWUVFECkV4TmxiVk5wWjI0Z1VtOXZkQ0JEUVNBdElFTXhNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXordXAKdWZHWkJjellLQ0ZLODNNMFVZUldFUFdnVHl3UzQvb1RtaWZRei9sNUduUmZIWGs1L0Z2NGNJN2drbEwzNUNYNVZJUFpIZFBJV29VLwpYc2UyQis0K3dNNmFyNnhXUWlvNUpYRFd2N1Y3TnEyczluUGN6ZGNkaW9PbCt5dVFGVGRySENaSDNEc3BWcE5xczhGcU9wMDk5Y0dYCk9GZ0ZpeHdSNCtTMHVGMkZIWVArZUY4TFJXZ1lTS1ZHY3pRNy9nL0lkcnZIR1BNRjBZYnpoZTNudWRreXJWV0l6cWEya2JCUHJINFYKSTViMlAvQWdOQmJlQ3NiRUJFVjVmNmY5dnRLcHBhK2N4U01xOXp3aGJMMnZqMDdGT3JMek5CTDgzNEFhU2FUVXFaWDNub2xlb29tcwpsTXVvYUp1dmltVW56WW51M1l5MWF5bHdRNkJwQytTNUR3SURBUUFCbzBJd1FEQWRCZ05WSFE0RUZnUVUvcUhnY0I0cUF6bFNXa0srClhKR0ZlaGlxVGJVd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTEJRQUQKZ2dFQkFNSktWdm9WSVhzb291bmxIZnY0TGNRNWxrRk1PeWNzeEd3WUZZREdySzlIV1M4bUMrTTJzTzg3L2tPWFNUS1pFaFZiM3hFcAovNnRUK0x2QmVBK3NuRk92Vjcxb2pEMXBNL0Nqb0NOak8yUm5Ja1N0MVhITFZpcDRrcU5QRWpFMk51TGUvZ0RFbzJBUEo2MmdzSXExCk5ucFNvYjBuOUNBbll1aE5sQ1FUNUFvRTZUeXJMc2hEQ1VyR1lRVGxTVFIrMDhUSTlRL0FxdW02VkY3ell5dFBUMURVL3JsN21ZdzkKd0M2OEFpdlR4RURraWdjeEhwdk9KcGtUK3hIcW1pSU1FUm5IWGh1QlVERElsaEp1NTh0QmY1RTdva2UzVklBYjNBRE1tcERxdzhOUQpCbUlNTU1BVlNLZW9XWHpocmlLaTRncDZEL3BpcTFKTTRmSGZ5cjZERFVJPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgplbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMwo9PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0t6Q0NBYkdnQXdJQkFnSUtlM0cyZ2xhNEVueWNxREFLQmdncWhrak9QUVFEQXpCYU1Rc3dDUVlEVlFRR0V3SlZVekVUTUJFRwpBMVVFQ3hNS1pXMVRhV2R1SUZCTFNURVVNQklHQTFVRUNoTUxaVTExWkdoeVlTQkpibU14SURBZUJnTlZCQU1URjJWdFUybG5iaUJGClEwTWdVbTl2ZENCRFFTQXRJRU16TUI0WERURTRNREl4T0RFNE16QXdNRm9YRFRRek1ESXhPREU0TXpBd01Gb3dXakVMTUFrR0ExVUUKQmhNQ1ZWTXhFekFSQmdOVkJBc1RDbVZ0VTJsbmJpQlFTMGt4RkRBU0JnTlZCQW9UQzJWTmRXUm9jbUVnU1c1ak1TQXdIZ1lEVlFRRApFeGRsYlZOcFoyNGdSVU5ESUZKdmIzUWdRMEVnTFNCRE16QjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQlAybFlhNTdKaEFkCjZiY2lNSzRHOUlHenNVSnhsVG04MDFManI2LzU4cGMxa2paR0RvZVZqYms1V3VtNzM5RCt5QWRCUEx0VmI0T2phdnRpc0lHSkFuQjkKU01WSzQra2lWQ0pOazd0Q0RLOTNuQ09tZmRkaEVjNWx4L2gvL3ZYeXFhTkNNRUF3SFFZRFZSME9CQllFRlB0YVNOQ0FJRUR5cU9rQQpCMmtaZDZmbXcvVFBNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01Bb0dDQ3FHU000OUJBTURBMmdBCk1HVUNNUUMwMkM4Q2lmMjJUR0s2UTA0VGhISzFydDBjM3RhMTNGYVBXRUJhTGQ0Z1RDS0R5cE9vZnU0U1FNZldoMC80MzRVQ01Cd1UKWk9SOGxvTVJuTERSV21GTHBnOUowd0Q4b2Z6a3BmOS9yZGN3ME1kM2Y3NkJCMVV3VUNBVTlWYzRDcWd4VVE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpIb25na29uZyBQb3N0IFJvb3QgQ0EgMwo9PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnp6Q0NBN2VnQXdJQkFnSVVDQlpmaWt5bDdBREprMERmeE1hdUk3Z2NXcVF3RFFZSktvWklodmNOQVFFTEJRQXdiekVMTUFrRwpBMVVFQmhNQ1NFc3hFakFRQmdOVkJBZ1RDVWh2Ym1jZ1MyOXVaekVTTUJBR0ExVUVCeE1KU0c5dVp5QkxiMjVuTVJZd0ZBWURWUVFLCkV3MUliMjVuYTI5dVp5QlFiM04wTVNBd0hnWURWUVFERXhkSWIyNW5hMjl1WnlCUWIzTjBJRkp2YjNRZ1EwRWdNekFlRncweE56QTIKTURNd01qSTVORFphRncwME1qQTJNRE13TWpJNU5EWmFNRzh4Q3pBSkJnTlZCQVlUQWtoTE1SSXdFQVlEVlFRSUV3bEliMjVuSUV0dgpibWN4RWpBUUJnTlZCQWNUQ1VodmJtY2dTMjl1WnpFV01CUUdBMVVFQ2hNTlNHOXVaMnR2Ym1jZ1VHOXpkREVnTUI0R0ExVUVBeE1YClNHOXVaMnR2Ym1jZ1VHOXpkQ0JTYjI5MElFTkJJRE13Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ3oKaU5mcXpnOGdUcjdtMWdOdDdsbjh3bGZmS1dpaGd3NCthTWRvV0p3Y1lFdUpRd3k1MUJXeTdzRk9kZW0xcCsvbDZUV1o1TXdjNTB0ZgpqVE13SUROVDJhYTcxVDRUanVrZmgwbXRVQzFReWhpK0FWaWlFM0NXdTRtSVZvQmMrTDBzUE9GTVY0aTcwN21WNzh2SDl0b3hkQ2ltCjVsU0o5VUV4eXVVbUdzMkM0SERhT3ltNzFRUDFtYnBWOVdUUllBNnppVW00aWk4RjBvUkZLSHlQYUZBU2VQd0x0VlBMd3BnY2hLT2UKc0w0anBOcmN5Q3NlMm01RkhvbVkydmtBTGdicEREdHcxVkFsaUpuTHpYTmc5OVgvTldmRm9ieGVxODFLdUVYcnlHZ2VEUTBVUmhMagowbVJpaWtLWXZMVEdDQWo0L2FoTVpKeDJBYjB2cVd3ekQ5Zy9LTGc4YVFGQ2huNXB3Y2tHeXVWNlJtWHB3dFpRUVM0L3QrVHRiTmUvCkpnRVJvaFlwU21zMEJwRHNFOUsyKzJwMjBqenQ4Tll0M2VFVjdLT2JMeXpKUGl2a2FUdi9jaVd4Tm9aYngzOXJpMVViU3NVZ1lUMnUKeTFEaENEcStzSTlqUVZNd0NGazhtQjEzdW1PUmVzb1FVR0MvOE5lOGxZZVBsOFgrbDJvQmxLTjhXNFVkS2prNjBGU2gwVGx4bmYwaAorYlY3OE9MZ0FvOXVsaVFsTEtBZUxLakVpYWZ2N1prR0w3WUtURS9ib3N3M0dxOUhoUzJLWDhRME5Fd0EvUmlUWnhQUk4rWkl0SXNHCnhWZDdHWVlLZWNzQXlWS3ZRdjgzaitHakhubzlVS3RqQnVjVnRUKzJSVGVVTjdGKzhrakRmOFYxL3BlTlJZOGFweHB5S0JwQUR3SUQKQVFBQm8yTXdZVEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWZCZ05WSFNNRUdEQVdnQlFYbmMwZQppOVk1SzNEVFhOU2d1Qit3QVB6RllUQWRCZ05WSFE0RUZnUVVGNTNOSG92V09TdHcwMXpVb0xnZnNBRDh4V0V3RFFZSktvWklodmNOCkFRRUxCUUFEZ2dJQkFGYlZlMjdtSWdIU1Fwc1kxUTdYWmlOYzQvNmd4NUxTNlpTdFM2TEc3Qko4ZE5WSTBsa1VtY0RydWRIcjlFZ3cKVzYyblYzT1pxZFBsdDlFdVdTUlkzR2d1TG1MWWF1UndDeTBnVUNDa01wWFJBSmk3MC8zM012Skpyc1o2NEVlK2JzN0xvM0k2TFdsZAp5OGpvUlRuVStrTEJFVXgzWFpMN2F2OVlST1hyZ1o2dm9KbXR2cWtCWnNzNEhUemZReC8wVFc2MHVoZEcvSDM5aDRGNWFnMHpEL292CitCUzVnTE5kVGFxWDRmbmtHTVg0MVRpTUpqejk4aWppN2xwSmlDemZlVDJPbnBBOHZVRktPdDFiOXBxMHpqOGxNSDh5ZmFJRGxORGMKZXFGUzNtNlRqUmdtL1ZXc3ZZK2Iwcyt2NTRZc3l4OEpiNk52cVlUVWM3OU5vWFFiVGlOZzhzd09xbitrbkV3bHFMSm1PemovMlpRdwo5bktFdm1oVkVBL0djeXdXYVpNSC9yRkY3YnVpVldxdzJyVktBaVVuaGRlM3Q0WkVGb2xzZ0NzK2w2bWMxWDVWVE1iZVJSQWM2dWs3Cm53TlQ3dTU2QVFJV2VOVG93cjVHZG9nVFB5SzdTQklkVWdDMEFuNGhHaDZjSmZUelBWNGUwaHo1c3kyMjl6ZGN4c3NoVHJEM21VY1kKaGNFcnVsV3VCdXJRQjdMY3E5Q0NsblhPMGxEK21lZlBMNS9uZHRGaEt2c2h1ekhRcXA5SHBMSWl5aFk2VUZmRVcwTm54V1ZpQTBrQgo2MFBaMlBpZXJjK3hZdzVGOUtCYUxKc3R4YWJBcmFoSDlDZE1PQTB1RzBrN1V2VG9pSU1yVkNqVThqVlN0REtEWW1sa0RKR2NuNWZxCmRCYjlIeEVHbXB2MAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpNaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDV1RDQ0FkK2dBd0lCQWdJUVp2STlyNGZlaTdGSzZneFhNUUhDN0RBS0JnZ3Foa2pPUFFRREF6QmxNUXN3Q1FZRFZRUUdFd0pWClV6RWVNQndHQTFVRUNoTVZUV2xqY205emIyWjBJRU52Y25CdmNtRjBhVzl1TVRZd05BWURWUVFERXkxTmFXTnliM052Wm5RZ1JVTkQKSUZKdmIzUWdRMlZ5ZEdsbWFXTmhkR1VnUVhWMGFHOXlhWFI1SURJd01UY3dIaGNOTVRreE1qRTRNak13TmpRMVdoY05OREl3TnpFNApNak14TmpBMFdqQmxNUXN3Q1FZRFZRUUdFd0pWVXpFZU1Cd0dBMVVFQ2hNVlRXbGpjbTl6YjJaMElFTnZjbkJ2Y21GMGFXOXVNVFl3Ck5BWURWUVFERXkxTmFXTnliM052Wm5RZ1JVTkRJRkp2YjNRZ1EyVnlkR2xtYVdOaGRHVWdRWFYwYUc5eWFYUjVJREl3TVRjd2RqQVEKQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFUVXZEMENRblZCRXlQTmdBU0dBbEV2YXFpQllndGx6UGJLblI1dlNtWlJvZ1BablpINgp0aGF4akc3ZWZNM2JlYVl2enJ2T2NTL2xwYXNvN0dNRVpwbjQrdktURUFYaGdTaEM0OFpvOU9ZYmhHQktpYS90ZVE4N3p2SDJSUFVCCmVNQ2pWREJTTUE0R0ExVWREd0VCL3dRRUF3SUJoakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlRJeTVseWNGSU0KK09hK3NnUlhLU3JQUWhEdE5UQVFCZ2tyQmdFRUFZSTNGUUVFQXdJQkFEQUtCZ2dxaGtqT1BRUURBd05vQURCbEFqQlk4azNxRFBsZgpYdTVnS2NzNjh0dldNb1FaUDN6Vkw4S3h6Sk91VUxzSk1zYkc3WDdKTnBRUzVHaUZCcUliMEM4Q01RQ1o2UmEwRHZwV1NOU2tNQmFSCmVOdFVqR1VCaXVkUVpzSXh0em02dUJvaUIwNzhhMVFXSVA4cnRlZE1ERTJtVDNNPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpNaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGcURDQ0E1Q2dBd0lCQWdJUUh0T1hDVi9ZdExOSGNCNnF2bjlGc3pBTkJna3Foa2lHOXcwQkFRd0ZBREJsTVFzd0NRWURWUVFHCkV3SlZVekVlTUJ3R0ExVUVDaE1WVFdsamNtOXpiMlowSUVOdmNuQnZjbUYwYVc5dU1UWXdOQVlEVlFRREV5MU5hV055YjNOdlpuUWcKVWxOQklGSnZiM1FnUTJWeWRHbG1hV05oZEdVZ1FYVjBhRzl5YVhSNUlESXdNVGN3SGhjTk1Ua3hNakU0TWpJMU1USXlXaGNOTkRJdwpOekU0TWpNd01ESXpXakJsTVFzd0NRWURWUVFHRXdKVlV6RWVNQndHQTFVRUNoTVZUV2xqY205emIyWjBJRU52Y25CdmNtRjBhVzl1Ck1UWXdOQVlEVlFRREV5MU5hV055YjNOdlpuUWdVbE5CSUZKdmIzUWdRMlZ5ZEdsbWFXTmhkR1VnUVhWMGFHOXlhWFI1SURJd01UY3cKZ2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRREtXNzZVTTR3cGxaRVdDcFc5UjJMQmlmT1pOdDlHa01tbAo3WGhxYjBlUmFQZ25aMUF6SGFHbSsrRGxRNk9FQWxjQlhaeElRSUpURUx5L3h6dG9rTGFDTGVYMFpkRE1iUm5NbGZsN3JFcVVyUTdlClMwTWRod2VTRTVDQWcyUTFPUVQ4NWVsc3M3WWZVSlE0WlZCY0YwYTV0b1cxSExVWDZOWkZuZGl5SnJES3hIQktybUNrM2JQWjdQdzcKMVZkeXZEL0l5YkxlUzJ2NEkyd0R3QVc5bGNmTmN6dG1nR1RqR3F3dStVY0Y4Z2EybTNQMWVETmJ4Nkg3SnlxaHRKcVJqSkhUT29JKwpka0MwelZKaFVYQW9QOFhGV3ZMSmpFbTdGRnROeVA5blRVd1NscTMxL25pb2w0ZlgvVjRnZ055aFN5TDcxSW10dXM1SGwwZFZlNDlGCnlHY29oSlVjYUREdjcwbmdOWHRrNTVpd2xOcE5oVHMrVmNRb3IxZnpuaFBiUmllZkhxSmVSSU9rcGNyVkU3TkxQOFRqd3VhR1lhUlMKTUxsNklFOXZEemhUeXpNTUV5dVAxcHE5S3NndHNSeDlTMUhLUjlGSUozSmRoK3ZWUmVaSVpaMnZVcEM2VzZJWVpWY1NuMmk1MUJWcgpsTVJwSXBqME0rRHQrVkdPUVZESk5FOTJrS3o4T01IWTRYdTU0K09VNFVacHl3NEtVR3NUdXF3UE4xcTNFcldRZ1I1V3JsY2lodG5KCjB0SFhVZU9yTzhaVi9SNE8wM1FLMGRxcTZtbTRseWlQU01RSCtGSkRPdlRLVlRVc3NLWnF3Sno1OG9IaEVtckFSZGxuczg3L0k2S0oKQ2xUVUZMa3FxTmZzK2F2TkpWZ3llWStRVzVnNXhBZ0d3YXgvRGowQXBRSURBUUFCbzFRd1VqQU9CZ05WSFE4QkFmOEVCQU1DQVlZdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVDY3RaZjRheWNJOGF3em5qd05ucHY3dE5zaU13RUFZSkt3WUJCQUdDCk54VUJCQU1DQVFBd0RRWUpLb1pJaHZjTkFRRU1CUUFEZ2dJQkFLeXZQbDNDRVphSmpxUG5rdGFYRmJnVG9xWkNMZ0xORmdWWko4b2cKNkxxNDZCcnNUYWlYVnE1bFE3R1BBSnRTelZYTlV6bHRZa3lMRFZ0OExrUy9neENQODFPQ2dNTlBPc2R1RVQvbTR4YVJoUHR0aEg4MApkSzJKcDg2NTE5ZWZoR1NTdnBXaHJRbFRNOTN1Q3VwS1VZNXZWYXU2dFpSR3JveC8yS0pRSldWZ2dFYmJNd1N1YkxXWWRGUWwzSlBrCitPTlZGVDI0YmNNS3BCTEJhWVZ1MzJUeFU1bmhTblVnblpVUDVOYmNBL0ZaR09oSGliSlhXcFMycWRnWEt4ZEo1WGJMd1ZhWk9qZXgKLzJrc2taR1Q0ZDlNb3pkMlRhR2YrRzBlSGRQNjdQdjBSUjBUYmMvM1dlVWlKM0lyaHZOWHV6RHRKRTNjZlZhN283UDROSG1Kd2VEeQpBbUgzcHZ3UHV4d1hDNjVCMlh5OUo2UDlManJSazVTeGN4MGtpNjliSUltdHQyZG1lZlU2eHFhV00vNVRrc2hHc1JHUnhwbC9qOG5XClpqRWdRUkNITFF6V3dhODBtTXBrZy9zVFY5SEI4RHg2aktYQi9aVWhvSEhCazJkeEV1cVBpQXBwR1dTWkkxYjdyQ291Y0w1bXhBeUUKNytXTDg1TUIrR3FRazJkTHNtaWp0V0tQNlQrTWVqdGVEK2VNdU1aODd6ZjlkT0xJVHpOeTRaUTViYjBTcjc0TVRuQjhHMitOc3pLVApjMFFXYmVqMDkrQ1ZnSStXWFRpazlLdmVDakNIazloTkFIRmlSU2RMT2tLRVczOWx0MmMwVWkyY0ZtdXFxTmg3bzBKTWNjY015ajZECjVLYnZ0d0V3WGxHamVmVndhYVpCUkErR3NDeVJ4ajNxcmcrRQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgplLVN6aWdubyBSb290IENBIDIwMTcKPT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDUURDQ0FlV2dBd0lCQWdJTUFWUkk3eUg5bDFrTjlRUUtNQW9HQ0NxR1NNNDlCQU1DTUhFeEN6QUpCZ05WQkFZVEFraFZNUkV3CkR3WURWUVFIREFoQ2RXUmhjR1Z6ZERFV01CUUdBMVVFQ2d3TlRXbGpjbTl6WldNZ1RIUmtMakVYTUJVR0ExVUVZUXdPVmtGVVNGVXQKTWpNMU9EUTBPVGN4SGpBY0JnTlZCQU1NRldVdFUzcHBaMjV2SUZKdmIzUWdRMEVnTWpBeE56QWVGdzB4TnpBNE1qSXhNakEzTURaYQpGdzAwTWpBNE1qSXhNakEzTURaYU1IRXhDekFKQmdOVkJBWVRBa2hWTVJFd0R3WURWUVFIREFoQ2RXUmhjR1Z6ZERFV01CUUdBMVVFCkNnd05UV2xqY205elpXTWdUSFJrTGpFWE1CVUdBMVVFWVF3T1ZrRlVTRlV0TWpNMU9EUTBPVGN4SGpBY0JnTlZCQU1NRldVdFUzcHAKWjI1dklGSnZiM1FnUTBFZ01qQXhOekJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEEwSUFCSmJjUFlyWXNIdHZ4aWUrUkpDeApzMVlWZTQ1REpIMGFoRm51WTJpeXhsNkgwQlZJSHFpUXJiMVRvdHJlT3BDbVlGOW9NcldHUWQrSFd5eDd4ZjU4ZXRxall6QmhNQThHCkExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlNIRVJVSTBhckJlQXl4cjg3R3laRHYKdnpBRXdEQWZCZ05WSFNNRUdEQVdnQlNIRVJVSTBhckJlQXl4cjg3R3laRHZ2ekFFd0RBS0JnZ3Foa2pPUFFRREFnTkpBREJHQWlFQQp0VmZkMTRwVkN6Ymhoa1Q2MU5sb2piamNJNHFLRGRRdmZlcHo3TDlOYktnQ0lRRExwYlFTK3VlMTZNOStrL3p6Tlk5dlRscDh0THhPCnN2eHlxbHRaK2VmY01RPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKY2VydFNJR04gUm9vdCBDQSBHMgo9PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGUnpDQ0F5K2dBd0lCQWdJSkVRQTB0azdHTmkwMk1BMEdDU3FHU0liM0RRRUJDd1VBTUVFeEN6QUpCZ05WQkFZVEFsSlBNUlF3CkVnWURWUVFLRXd0RFJWSlVVMGxIVGlCVFFURWNNQm9HQTFVRUN4TVRZMlZ5ZEZOSlIwNGdVazlQVkNCRFFTQkhNakFlRncweE56QXkKTURZd09USTNNelZhRncwME1qQXlNRFl3T1RJM016VmFNRUV4Q3pBSkJnTlZCQVlUQWxKUE1SUXdFZ1lEVlFRS0V3dERSVkpVVTBsSApUaUJUUVRFY01Cb0dBMVVFQ3hNVFkyVnlkRk5KUjA0Z1VrOVBWQ0JEUVNCSE1qQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQCkFEQ0NBZ29DZ2dJQkFNREZkUm1SZlVSMGRJZitEanVXM05nQkZzenVZNUhuQzIvT093cHBHbnpDNDYrQ2pvYlhYbzlYNjlNaFdmMDUKTjBJd3ZsRHF0ZytwaU5ndUxXa2g1OUUzR0U1OWtkVVdYMnRiQU1JNVF3MDJoVks1VTJVUEhVTGxqODhGMCs3Y0RCclp1SXQ0SW1mawphYkJveFR6a2JGcEc1ODNIK3UvRTdFdTlhcVNzL2N3b1VlK1N0Q21ycXpXYVRPVEVDTVltelBocG4rU2M4Q25UWFBuR0ZpV2VJOE1nCndUMFBQemhBc1A2Q1JEaXFXaHFLYTJOWU9MUVYwN1lSYVhzZVZPNk1HaUtzY3BjL0kxbWJ5U0tFd1FkUHpIL2lWOG9TY0x1bVpmTnAKZFdPOWxmc2JsODNrcUsvMjBVNm8yWXB4Sk0wMlBieVd4UEZzcWE3bHp3MXVLQTJ3RHJYS1VYdDRGTU1nTDMvN0ZGWGhFWm45MVFxaApuZ0xqWWwvck5Vc3N1SExvUGoxUHJDeTdMb2JpbzNhUDVaTXF6NldyeUZ5TlN3Yi9Fa2FzZU1zVUJ6WGdxZCtMNmE4VlR4YUpXNzMyCmpjWlpyb2lGRHNHSjZ4OW54VVdPLzIwM05pdDRab09SVVNzOS8xRjNkbUtoN0djK1BvR0Q0RmFwVUI4ZmVwbXJZNytFRjNmeERUdmYKOTV4aHN6V1lpanF5N0R3YU56OStqNUxQMlJJVVpOb1FBaFZCLzAvRTZ4eWp5ZnFaOTBicDRSalpzYmd5TGNzVURGRFlnMldEN3JsYwp6OHNGV2t6NkdaZHIxbDBUMDhKY1ZMd3ljNkI0OWZGdEhzdWZwYWFmSXR6UlVaNkNlV1JnS1JNK28vMVBjbXFyNHRUbHVDUlZMRVJMCmlvaEVuTXFFMHlvN0FnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWQKRGdRV0JCU0NJUzFteHRlZzRCWHJ6a3dKZDhSZ25sUnVBekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBWU40YXVPZnlZSUxWQXpPQgp5d2FLOFNKSjZlanFrWC9HTTE1b0dRT0dPME1CendkdzVBZ2VaWVdSNWhFaXQvVUNJNDZ1dVI1OUgzNXM1cjBsMVpVYThnV21yNFVDCmI2NzQxakgvSmNsS3lNZUtxZG1mUzBtYkVWZVpra01SM3JZenBNelhqV1I5MU0wOEtDeTBtcGJxVGZYRVJNUWxxaUNBMkNsVjkrQkIKL0FZbS83azI5VU1VQTJaNDRSR3gyaUJmUmdCNEFDR2xIZ0FvWVhodnFBRUJqNTAwbXYvME9KRDd1Tkd6Y2diSmNlYUJ4WG50QzZaNQo4aE1MblBkZERuc2trN1JJMjRaZjNsQ0dlT2RBNWpHb2tIWndZYStjTnl3UnRZSzNxcTRrTkZ0eURHa056Vm1mOW5Hdm5BdlJDamo1CkJpS0RVeVVNL0ZIRTVyN2lPWlVMSksydjBaWGtsdGQwWkd0eFRnSThxb1h6SUtORE9YWmJiRkQrbXB3VUhtVVVpaFc5bzRKRldrbFcKYXRLY3NXTXk1V0hnVXlJT3B3cEo2c3QrSDZqaVlvRDJFRVZTbUFZWTNxWE5MMytxMU9rK0NITHNJd01DUEthcTJMeG5kRDBVRi90VQpTeGZqMDNrOWJXdEp5U2dPTG5SUXZ3elpSam9RaHNtblArbWc3SC9ycFhkWWFYSG1nd28zOG9aSmFyNTVDSkQyQWhaa1B1WGFUSDRNCk5NbjVYN2F6S0ZHbnB5dXFTZnFOWlNsTzQyc1RwNVNqTFZGdGVBeEV5OS9lQ0cvT28yU3IwNVdFMUxsU1ZISjdsaVhNdkdualNHNE4KME1lZEo1cXErQk9TM1I3Zlk1ODFxUlkyN0l5NGcvUTlpWS9OdEJkZTE3TVhRUkJkSjNOZ2hWZEpJZ2M9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClRydXN0d2F2ZSBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjJqQ0NBOEtnQXdJQkFnSU1CZmNPaHRwSjgwWTFMcnF5TUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdJTVFzd0NRWURWUVFHRXdKVgpVekVSTUE4R0ExVUVDQXdJU1d4c2FXNXZhWE14RURBT0JnTlZCQWNNQjBOb2FXTmhaMjh4SVRBZkJnTlZCQW9NR0ZSeWRYTjBkMkYyClpTQkliMnhrYVc1bmN5d2dTVzVqTGpFeE1DOEdBMVVFQXd3b1ZISjFjM1IzWVhabElFZHNiMkpoYkNCRFpYSjBhV1pwWTJGMGFXOXUKSUVGMWRHaHZjbWwwZVRBZUZ3MHhOekE0TWpNeE9UTTBNVEphRncwME1qQTRNak14T1RNME1USmFNSUdJTVFzd0NRWURWUVFHRXdKVgpVekVSTUE4R0ExVUVDQXdJU1d4c2FXNXZhWE14RURBT0JnTlZCQWNNQjBOb2FXTmhaMjh4SVRBZkJnTlZCQW9NR0ZSeWRYTjBkMkYyClpTQkliMnhrYVc1bmN5d2dTVzVqTGpFeE1DOEdBMVVFQXd3b1ZISjFjM1IzWVhabElFZHNiMkpoYkNCRFpYSjBhV1pwWTJGMGFXOXUKSUVGMWRHaHZjbWwwZVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTGxkVVNoTFBEZVMwWUxPdlIyOQp6ZDI0cTg4S1B1RmQ1ZHlxQ2JsWEFqN21ZMkhmOGcrQ1k2Nmo5Nnh6MFh6bnN3dXZDQUFKV1gvTktTcUlrNGNYR0lEdGlMSzB0aEFmCkxkWmZWYUlUWGRIRzZ3WldpWWorckRLZC9WekRCY2R1N29hSnVvZ0RuWEloaHBDdWp3T2wzSitJS011amtra1A3TkFQNG0xRVQ0QnEKc3RUbm9BcFRBYnFPbDVGMmJyejgxV3MyNWtDSTFuc3ZYd1hvTEcwUjgrZXl2cEpFVE5LWHBQN1Njb0ZEQjV6cEVUNzFpeHBaZlI5bwpXTjBFQUN5VzgwT3pmcGdaZE5tY2M5a1l2a0hITkhuWjlHTENRN216SjdBaXkvazlVc2N3UjdQSlByaHE0dWZvZ1hCZVFvdFBKcVgrCk9zSWdicnY0Rm83TkRLbTBHMngyRU9GWWVVWStWTTZBcUZjSk55a2JtUk9QRE1qV0xCejdCZWdJbFQxbFJ0enV6V25pVFkrSEtFNDAKQ3o3UEZObTczYlpRbXExMzFCblcyaHFJeUU0YkozWFlzZ2p4cm9Nd3VSRU96WWZ3aEkwVmNueWg3OHp5aUdHNjlHbTdESXdMZFZjRQp1RTRxRkM0OUR4d2VNcVppTnU1bTRpSzRCVUJqRUNMek14MTBjb29zOVRrcG9OUG5HNENFTGNVOTQwMngvUnB2dW1VSE8xanNRa1VtCis5amFKWExFOWdDeElubTk0M3haWWtxY0JXODl6dWJXUjJPWnhpUnZjaExJckgrUXRBdVJjT2kzNWhZUWNSZk8zZ1pQU0VGOU5VcWoKaWZMSlMzdEJFVzFudHdpWVRPVVJHYTVDZ056N2tBWFUrRkRLdnVTdHg4S1UxeGFkNWhlUHJ6YjdBZ01CQUFHalFqQkFNQThHQTFVZApFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkpuZ0dXY05ZdHQyczlvOXVGdm8vVUxTTVE2SE1BNEdBMVVkRHdFQi93UUVBd0lCCkJqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFtSE53NHJEVDdUbnNUR0RacVJLR0Z4NlcwT2hVS0R0a0xTR20rSjFXRTJwSVBVL0gKUGluYmJWaURWRDJIZlNNRjFPUWMzT2c0WlliRmRhZGEyelVGdlhmZXV5azNRQVVIdzVSU244cGszZkViSzl4R0NoQUNNZjFLYUEwSApaSkRtSHZVcW9haTdQRjM1b3dnTEVRenhQeTBRbEcvKzRqU0hnOWJQNVJzMWJkSUQ0YkFOcUtDcVJpZUNOcWNWdGdpbVFsUlh0cGxhCjRndDVrTmRYRWxFMUdZaEJhQ1hVTnhlRUZmc0JjdHlWM2xJbUlKZ200bmIxSjIvNkFEdEtZZGtOeTFHVEt2MFdCcGFuSTVvalNQNVIKdmJiRXNMRlV6dDVzUWEwV1ozN2IvVGpOdVRoT3NzRmd5NTBYMzFpZWVtS3lKbzkwbFp2a1d4M1NEOTJZSEp0WnVTUFRNYUNtL3pqZAp6eUJQNlZoV09tZkQwZmFabVoyNk5yYUFMNGhIVDRhL1JEcUE1RGNjcHJycWw1Z1IwSVJpUjJRZXF1NUF2elN4bkk5TzRmS1NUeCtPCjg1Nlgzdk9tZVdxSmNVOUxKeGRJL3V6MFVBOVBTWDNNUmVPOWVrREZRZHhoVmljR2FlVnlRWUhUdGdHSm9DODZjbm4rT2pDL1FlekgKWWo2UlM4ZlpNWFpDK2ZjOFkrd21qSE1NZlJvZDZxaDhoNmpDSjN6aE0wRVB6OC84QUtBaWdKNUtwMjhBc0VGRnR5TEthRWpGUXFLdQozUjN5NEc1T0JWaXh3SkFXS3FROUVFQytqMkpqZzZtY2duMHRBdW1ETUh6TEo4bjlIbVlBc0M3VElTK09NeFpzbU8wUXFBZld6SlBQCjI5RnBIT1RLeWVDMm5Pbk9jWEhlYkQ4V3BIaz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDWURDQ0FnZWdBd0lCQWdJTURXcGZDRDhvWEQ1UmxkOWRNQW9HQ0NxR1NNNDlCQU1DTUlHUk1Rc3dDUVlEVlFRR0V3SlZVekVSCk1BOEdBMVVFQ0JNSVNXeHNhVzV2YVhNeEVEQU9CZ05WQkFjVEIwTm9hV05oWjI4eElUQWZCZ05WQkFvVEdGUnlkWE4wZDJGMlpTQkkKYjJ4a2FXNW5jeXdnU1c1akxqRTZNRGdHQTFVRUF4TXhWSEoxYzNSM1lYWmxJRWRzYjJKaGJDQkZRME1nVURJMU5pQkRaWEowYVdacApZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzB4TnpBNE1qTXhPVE0xTVRCYUZ3MDBNakE0TWpNeE9UTTFNVEJhTUlHUk1Rc3dDUVlEClZRUUdFd0pWVXpFUk1BOEdBMVVFQ0JNSVNXeHNhVzV2YVhNeEVEQU9CZ05WQkFjVEIwTm9hV05oWjI4eElUQWZCZ05WQkFvVEdGUnkKZFhOMGQyRjJaU0JJYjJ4a2FXNW5jeXdnU1c1akxqRTZNRGdHQTFVRUF4TXhWSEoxYzNSM1lYWmxJRWRzYjJKaGJDQkZRME1nVURJMQpOaUJEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJINzdiT1lqCjQzTXlDTXBnNWxPY3VuU05HTEI0a0ZLQTNUakFTaDNScU15VHBKY0dPTW9ORldMR2pnRXFaWjJxM3pTUkxvSEI1RE9TTWNUOUNUcW0KUDYyalF6QkJNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEd1lEVlIwUEFRSC9CQVVEQXdjR0FEQWRCZ05WSFE0RUZnUVVvMEVHckpCdAowVXJyZGFWS0VKbXpzYUdMU3Zjd0NnWUlLb1pJemowRUF3SURSd0F3UkFJZ0IrWlUyZzZnV3JLdUVaK0h4YmIvYWQ0bHZ2aWd0d2p6ClJNNHEzd2doRERjQ0lDMG1BNkFGdld2UjlsejRaY3lHYmJPY05FaGpoQW5GalhjYTRzeWM0WFI3Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClRydXN0d2F2ZSBHbG9iYWwgRUNDIFAzODQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ25UQ0NBaVNnQXdJQkFnSU1DTDJGbDJ5Wko2U0FhRWM3TUFvR0NDcUdTTTQ5QkFNRE1JR1JNUXN3Q1FZRFZRUUdFd0pWVXpFUgpNQThHQTFVRUNCTUlTV3hzYVc1dmFYTXhFREFPQmdOVkJBY1RCME5vYVdOaFoyOHhJVEFmQmdOVkJBb1RHRlJ5ZFhOMGQyRjJaU0JJCmIyeGthVzVuY3l3Z1NXNWpMakU2TURnR0ExVUVBeE14VkhKMWMzUjNZWFpsSUVkc2IySmhiQ0JGUTBNZ1VETTROQ0JEWlhKMGFXWnAKWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncweE56QTRNak14T1RNMk5ETmFGdzAwTWpBNE1qTXhPVE0yTkROYU1JR1JNUXN3Q1FZRApWUVFHRXdKVlV6RVJNQThHQTFVRUNCTUlTV3hzYVc1dmFYTXhFREFPQmdOVkJBY1RCME5vYVdOaFoyOHhJVEFmQmdOVkJBb1RHRlJ5CmRYTjBkMkYyWlNCSWIyeGthVzVuY3l3Z1NXNWpMakU2TURnR0ExVUVBeE14VkhKMWMzUjNZWFpsSUVkc2IySmhiQ0JGUTBNZ1VETTQKTkNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJHdmFEWFUxQ0RGSApCYTVGbVZYeEVSTXVTdmdRTVNPamZvUFRmeWdJT2lZYU9zK1hnaCtBdHljSmo5R09NTVFLbXc2c1dBU3I5elo5bENPa213cUtpNnZyCi9Ua2xadkZlL295dWpVRjVuUWxnemlpcDA0cHQ4OVpGMVBLWWhEaGxvS05ETUVFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBUEJnTlYKSFE4QkFmOEVCUU1EQndZQU1CMEdBMVVkRGdRV0JCUlZxWVNKMHNFeXZSakxiS1lIVHNqbm5iNkNrREFLQmdncWhrak9QUVFEQXdObgpBREJrQWpBM0FaS1hSUkorb1BNK3JSazZjdDMwVUpNREVyNUUwazlCcEl5Y25SK2o5c0tTNTBnVS9rNmJwWkZYcnNZM2Nyc0NNR2NsCkNyRU1YdTZwWTVKdjVaQUwvbVlpeWtmOWlqSDNnLzU2dnhDK0dDc2VqL1lwSHBSWjc0NGhOOHRSbUtWdVN3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZvakNDQTRxZ0F3SUJBZ0lVQVpRd0hxSUwzZlhGTXlxeFEwUngrTlpRVFEwd0RRWUpLb1pJaHZjTkFRRU1CUUF3YVRFTE1Ba0cKQTFVRUJoTUNTMUl4SmpBa0JnTlZCQW9NSFU1QlZrVlNJRUpWVTBsT1JWTlRJRkJNUVZSR1QxSk5JRU52Y25BdU1USXdNQVlEVlFRRApEQ2xPUVZaRlVpQkhiRzlpWVd3Z1VtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzB4TnpBNE1UZ3dPRFU0Ck5ESmFGdzB6TnpBNE1UZ3lNelU1TlRsYU1Ha3hDekFKQmdOVkJBWVRBa3RTTVNZd0pBWURWUVFLREIxT1FWWkZVaUJDVlZOSlRrVlQKVXlCUVRFRlVSazlTVFNCRGIzSndMakV5TURBR0ExVUVBd3dwVGtGV1JWSWdSMnh2WW1Gc0lGSnZiM1FnUTJWeWRHbG1hV05oZEdsdgpiaUJCZFhSb2IzSnBkSGt3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQzIxUEdUWExWQWlRcXJEWkJiClVHT3VrSlIwRjBWeTFudGxXaWxMcDFhZ1M3Z3ZRblhwMlhza1dqRmxxeGNYMFRNNjJSSGNRRGFIMzhkcTZTWmVXWXAzNCtoSW5ERVcKK2o2UnNjckpvK0tmemlGVG93STJNTXRTQXVYYU1sM0R4ZWI1N2hISGk4bEVIb1NUR0VxMG4rVVNaR25RSm9WaUFiYkpBaDIrZzFHNwpYTnI0clJWcW1mZVNWUGMwVyttLzZpbUJFdFJUa1phemtWcmQvcEJ6S1Bzd1JyWEtDQWZIY1hMSlp0TTBsL2FNOUJoSzRkQTlXa1cyCmFhY3AreVBPaU5nU25BQklxS1lQc3p1U2pYRU9kTVdMeUV6NTlKdU91RHhwN1c4N1VDOVk3Y1N3MEJ3YmFneml2RVNxMk0wVVhaUjQKWWI4T2J0b3F2QzhNQzNHbXN4WS9uT2I1eko5VE5lSURvS0FZdjd2eHZ2VFdqSWNOUXZjR3VmRnQ3UVNVcVA2MjB3YkdRR0hmblozegpWSGJPVXpvQnBwSkI3QVNqancyaTFRbksxc3VhOGU5RFhjQ3JwVUhQWEZOd2NNbUlwaTNVYTJGelVDYUdZUTVmRzhJcjRvelZ1NTNCCkEwSzZsTnBmcWJES3pFMEs3MGRwQXk4aSsvRW96cjlkVUdXb2tHMnpkTEFJeDZ5bzBlcytuUHhkR29NdUs4dTE4MFNkT3FjWFlaYWkKY2ROd2xoVk50MHh6N2hsY3hWcytRZjZzZFdBN0cyUE9BTjNhQ0pCaXRPVXQ3a2luYXhlWlZMNkhTdU9wWGdSTTZ4QnRWTmJ2OGVqeQpZaGJMZ0d2dFBlMzFIekNscmt2SkUrMktBUUhKdUZGWXdHWTZzV1pMeE5VeEFtTHBkSVFNMjAxR0xRSURBUUFCbzBJd1FEQWRCZ05WCkhRNEVGZ1FVMHArSTM2SE5MTDNzOVRzQkFaTXpKN0xyWUVzd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUIKQWY4d0RRWUpLb1pJaHZjTkFRRU1CUUFEZ2dJQkFETEtnTE9kUFZRRzNkTFNMdkNrQVNFTFowaktiWTdneUtvTnFvMGhWNC9HUG5ySwoyMUhVVXJQVWxvU2xXR0IvNVF1T0gvWGNDaFdCNVR1MnR5SXZDWndURnJGc0REVUliYXRqY3UzY3Z1ekhWK1l3SUhIVzF4REJFMVVCCmpDcEQ1RUh4enpwNlU1TE9vZ01GRFRqZkFyc1FMdGs3MHB0NndLR20rTFV4NXZSMXlibFRtWFZISWxvVUZjZDRHN2FkNlF6NEczYngKaFlUZW9kb1M3NlRpRUpkNmVONE1VWmVvSVVDTGhyME44RjVPU3phN095QWZpa0pXNFFzYXYzdlFJa01zUkl6NzVTcTBiQndjdXBUZwpFMzRoNXByQ3k4VkNaTFFlbEhzSUpjaHh6SWRGVjRYVG55bGlJb05SbHdBWWwzZHFtSkxKZkdCczMyeDlTdVJ3VE1LZXVCMzMwRFRICkQ4ejdwLzhEdnExd2tOb0wzY2h0bDErYWZ3a3lRZjNOb3N4YWJVenlxa24rWnZqcDJEWHJEaWdlN2tndk90QjVDVGg4cGlLQ2s1WFEKQTc2K0FxQUYzU0FpNDI4ZGlEUmd4dVlLdVFsMUMvQUg2R21XTmNmN0k0R09PRG00UlN0RGVLTFJMQlQvRFNoeWNwV2JYZ25iaVVTWQpxcUZKdTNGUzhyLzIveWVoTnErNHRuZUkzVHFrYlpzMGtOd1VYVEMvdCtzWDVJZTNjZENoMTNjVjFFTFg4dk14bVYyYjNSWnRQK29HCkkvaEdvaUx0ay9iZG11WXFoN0dZVlBFaTkydEY0K0tPZGgyYWpjUUdqVGEzRlBPZFZHbTNqanpWcEcyVGdiZXQ5cjFrZThMSmFEbWcKa3B6Tk5JYVJrUHBrVVozKy91dWw5WFhlaWZkeQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBQyBSQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2JqQ0NBZk9nQXdJQkFnSVFZdll5Yk9YRTQyaGNHMkxkbkM2ZGxUQUtCZ2dxaGtqT1BRUURBekI0TVFzd0NRWURWUVFHRXdKRgpVekVSTUE4R0ExVUVDZ3dJUms1TlZDMVNRMDB4RGpBTUJnTlZCQXNNQlVObGNtVnpNUmd3RmdZRFZRUmhEQTlXUVZSRlV5MVJNamd5Ck5qQXdORW94TERBcUJnTlZCQU1NSTBGRElGSkJTVm9nUms1TlZDMVNRMDBnVTBWU1ZrbEVUMUpGVXlCVFJVZFZVazlUTUI0WERURTQKTVRJeU1EQTVNemN6TTFvWERUUXpNVEl5TURBNU16Y3pNMW93ZURFTE1Ba0dBMVVFQmhNQ1JWTXhFVEFQQmdOVkJBb01DRVpPVFZRdApVa05OTVE0d0RBWURWUVFMREFWRFpYSmxjekVZTUJZR0ExVUVZUXdQVmtGVVJWTXRVVEk0TWpZd01EUktNU3d3S2dZRFZRUUREQ05CClF5QlNRVWxhSUVaT1RWUXRVa05OSUZORlVsWkpSRTlTUlZNZ1UwVkhWVkpQVXpCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUEKQlBhNlYxUEl5cXZmTmtwU0llU1gwb05ubnZCbFVkQmVoOGRIc1ZueVYwZWJBQUtUUkJkcDIwTEhzYkk2R0E2MFhZeXpabDJoTlBrMgpMRW5iODBiOHMwUnBSQk5tL2RmRi9hODJUYzREVFFkeHo2OXFCZEtpUTFvS1VtOEJBMDZPaTZOQ01FQXdEd1lEVlIwVEFRSC9CQVV3CkF3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGQUc1TCsrL0VZWmc4ay9RUVc2cmN4L24wbTVKTUFvR0NDcUcKU000OUJBTURBMmtBTUdZQ01RQ3VTdU1yUU1OMEVmS1ZyUllqM2s0TUd1WmRwU1JlYTBSNy9EamlUOHVjUlJjUlRCUW5KbFU1ZFVvRAp6Qk9RbjVJQ01RRDZTbXhnaUhQejdyaVlZcW5PSzhMWmlxWndNUjJ2c0pSTTYwL0c0OUh6WXFjOC81TXVCMXhKQVdkcEVnSnl2K2M9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdsb2JhbFNpZ24gUm9vdCBSNDYKPT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRldqQ0NBMEtnQXdJQkFnSVNFZEs3dWRjakdKNUFYd3FkTGREZkpXZlJNQTBHQ1NxR1NJYjNEUUVCREFVQU1FWXhDekFKQmdOVgpCQVlUQWtKRk1Sa3dGd1lEVlFRS0V4QkhiRzlpWVd4VGFXZHVJRzUyTFhOaE1Sd3dHZ1lEVlFRREV4TkhiRzlpWVd4VGFXZHVJRkp2CmIzUWdValEyTUI0WERURTVNRE15TURBd01EQXdNRm9YRFRRMk1ETXlNREF3TURBd01Gb3dSakVMTUFrR0ExVUVCaE1DUWtVeEdUQVgKQmdOVkJBb1RFRWRzYjJKaGJGTnBaMjRnYm5ZdGMyRXhIREFhQmdOVkJBTVRFMGRzYjJKaGJGTnBaMjRnVW05dmRDQlNORFl3Z2dJaQpNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNzckhReTZMTmw1YnJ0UXlZZHBva05SYm9waUxLa0hXUGQwOEVzCkNWZUpPYUZWNldjMGR3eHU1RlVkVWlYU0UydGU0UjJwdDMySk1sOE5ucDhzZW1OZ1FCK21zTFo0ajVsVWxnaFlydVFHdkdJRkFoYS8KcjZnakE3YVVEN3h1Yk1MTDFhYTdET24yd1FMN0lkNW0zUmVyZEVMdjhIUXZKZlRxYTFWYmtOdWQzMTZIQ2tEN3JSbHIrL2ZLWUlqZQoyc0dQMXE3VmY5UThnKzdYRmt5RFJUTnJKOUNHMEJ3dGEvT3JmZkdGcWZVbzBxM3Y4NFJMSElmOEU2TTZjcUphRVN2V0ozRW43WUV0CmJXYUJrb2UwRzFoNnpEOEsra1pQVFhoYytDdEk0d1NFeTEzMnRHcXpaZnhDbmxFbUl5RExQUlQ1Z2UxbEZnQlBHbVNYWmdqUGpIdmoKSzhDZCtSVHlHL0ZXYWhhL0xJV0Z6WGc0bXV0Q2FnSTBHSU1YVHBSVytMYUN0Zk9XM1QzenZuOGdkejU3R1NOckxOUnljME5YZmVENAoxMmxQRnpZRStjQ1FZRGRGM3VZTTJIU05ycHlpYlhSZFFyNEc5ZGxrYmdJUXJJbXdURHNIVFVCK0pNV0ttSUo1anFTbmdpQ05JL29uCmNjbmZ4a0Ywb0UzMmtSYmNSb3hmS1dNeFdYRU0yRy9DdGpKOSsrWmRVNlorRmZ5N2RYeGQ3UGoyRnh6c3gyc1p5L043OENzSHBkbHMKZVZSMmJKMGNwbTRPNlhrTXFDTnFvOThiTURHZnNWUjcvbXJMWnFyY1pkQ2lua3FhQnlGcmdZL2J4Rm42M2lMQUJKempxbHMyaytnOQp2WHFoblF0MnNRdkhuZjNQbUtnR3d2Z3FvNkdEb0xjbGNxVUM0d0lEQVFBQm8wSXdRREFPQmdOVkhROEJBZjhFQkFNQ0FZWXdEd1lEClZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVQTF5cmM0R0hxTXl3cHRXVTRqYVdTZjhGbVN3d0RRWUpLb1pJaHZjTkFRRU0KQlFBRGdnSUJBSHg0N1BZQ0xMdGJmcElyWFRuY3Z0Z2Rva0l6VGZudnBDbzdSR2tlck5sRm8wNDhwOWdrVWJKVUhKTk94Tzk3azRWZwpKdW9KU09EMXU4ZnBhTks3YWpGeHpIbXVFYWp3bWYzbEg3d3ZxTXhYNjNiRUlhWkhVMVZOYUw4RnBPN1hKcXRpMmtNM1MrTEd0ZVd5Cmd4azZ4OVBiVFo0SWV2UHV6ejVpKzZ6b1lNelJ4NkZjZzBYRVJjenpGMnNVeVFRQ1B0SWtwbm5wSHM2aTU4RlpGWjhkNGt1YVBwOTIKQ0MxcjJMcFhGTnFENnY2TVZlblFUcW5NZHpHeFJCRjZYTEUrMHhSRkZSaGlKQlBTeTAzT1hJUEJOdklRdFE2SWJiamhWcCtKM3BabQpPVWRrTEc1TnJtSjd2MkIwR2JoV3JKS3NGakx0cldoVi9waTYwelRlOU1saHd3Nkc5a3VFWU80TmU3VXlXSG1SVlN5QlE3TjBIM3FxCkpaNGQxNkdMdWMxQ0xnU2tab05OaVRXMmJLZzJTbmtoZUNMUVFyelJRREdRb2I0RXo4cG43Zlh3Z05OZ3lZTXFJZ1hRQnp0U3Z3eWUKcWl2NXUrWWZqeVc2aFkwWEhnTCtYVkFFVjgvK0xienZYTUFhcTdhZkpNYmZjMmhJa0N3VTlEOVNHdVRTeXhURFlXblA0dmtZeGJvegpueFNqQkYyNWNmZTFsTmoyTThGYXdUU0xmSnZka3pybkU2SndZWit2ait2WXhYWDRNMmJVZEdjNk4zZWM1OTJrRDNaRFpvcEQ4cC83CkRFSjRZOUhpRDI5NzFLRTlkSmVGdDBnNVFkWWcvTkE2cy9yb2I4U0t1bkUzdm91WHNYZ3hUN1BudGdNVHpsU2RyaVZaekg4MVh3ajMKUUVVeGVDcDYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR2xvYmFsU2lnbiBSb290IEU0Ngo9PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDQ3pDQ0FaR2dBd0lCQWdJU0VkSzd1ak51MUx6bUpHakZEWVFkbU9oRE1Bb0dDQ3FHU000OUJBTURNRVl4Q3pBSkJnTlZCQVlUCkFrSkZNUmt3RndZRFZRUUtFeEJIYkc5aVlXeFRhV2R1SUc1MkxYTmhNUnd3R2dZRFZRUURFeE5IYkc5aVlXeFRhV2R1SUZKdmIzUWcKUlRRMk1CNFhEVEU1TURNeU1EQXdNREF3TUZvWERUUTJNRE15TURBd01EQXdNRm93UmpFTE1Ba0dBMVVFQmhNQ1FrVXhHVEFYQmdOVgpCQW9URUVkc2IySmhiRk5wWjI0Z2JuWXRjMkV4SERBYUJnTlZCQU1URTBkc2IySmhiRk5wWjI0Z1VtOXZkQ0JGTkRZd2RqQVFCZ2NxCmhrak9QUUlCQmdVcmdRUUFJZ05pQUFTY0RySFB0K2llVW5kMU5QcWxScWV0TWhreXRBZXBKOHFVdXd6U0NoREgyb213bHd4d0V3a0IKanRqcVIrcStzb0FyemZ3b0RkdXN2S1NHTisxd0NBQjE2cE1MZXk1U25DTm9Jd1pEN0pJdlU0VGIrMGNVQitoZmxHZGR5WHFCUENDagpRakJBTUE0R0ExVWREd0VCL3dRRUF3SUJoakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlF4Q3BDUHRzYWQwa1JMCmdMV2k1aCt4RWs4YmxUQUtCZ2dxaGtqT1BRUURBd05vQURCbEFqRUEzMVNRN1p2dmk1UUNreGVDbWI2em5pejJDNUdNbjBvVXNmWmsKdkx0b1VSTU1BL2NWaTRSZ3VZdi9Vbzduakx3Y0FqQTgrUkhVakU3QXdXSENGVXlxcXgwTE1WODdIT0lBbDBReDV2NXpsaS9hbHRQKwpDQWV6TkltOEJaLzNIb2J1aTNBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHTE9CQUxUUlVTVCAyMDIwCj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZnakNDQTJxZ0F3SUJBZ0lMV2t1OVd2dFBpbHY2WmVVd0RRWUpLb1pJaHZjTkFRRUxCUUF3VFRFTE1Ba0dBMVVFQmhNQ1FWUXgKSXpBaEJnTlZCQW9UR21VdFkyOXRiV1Z5WTJVZ2JXOXVhWFJ2Y21sdVp5QkhiV0pJTVJrd0Z3WURWUVFERXhCSFRFOUNRVXhVVWxWVApWQ0F5TURJd01CNFhEVEl3TURJeE1EQXdNREF3TUZvWERUUXdNRFl4TURBd01EQXdNRm93VFRFTE1Ba0dBMVVFQmhNQ1FWUXhJekFoCkJnTlZCQW9UR21VdFkyOXRiV1Z5WTJVZ2JXOXVhWFJ2Y21sdVp5QkhiV0pJTVJrd0Z3WURWUVFERXhCSFRFOUNRVXhVVWxWVFZDQXkKTURJd01JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBcmk1V3JSc2M3L2FWajZCM0d5dlRZNCtFVFVXaQpENTliUmF0WmUxRTArZXlMaW5qRjNXdXZ2Y1RmazBVZXY1RTRDNjRPRnVkQmMvamJ1OUc0VWVETGd6dHpPRzUzaWc5Wll5Yk5weXJPClZQdTQ0c0I4Ujg1Z2ZEK3ljL0xBR2JhS2tvYzFEWkFvb3VRVkJHTSt1cS91ZkY3TXBvdFFzamozUVdQS3p2OXBqMmdPbFRibHpMbU0KQ2NwTDNUR1Fsc2pNSC8xV2xqVGJqaHpxTEw2RkxtUGRxcW1WMC8wcGxSUHd5SmlUMlMwV1I1QVJnNkk2SXFJb1Y2THIvc0NNS0tDbQpmZWNxUWp1Q2dHT2xZeDhaekh5eVpxakMwMjAzYitKK0JsSFpSWVFmRXM0a1VtU0ZDMGlBVG9leElpSXdxdXV1dnVBQzRFRG9zRUtBCkExR3F0SDZxUk5kRFlmT2lheGFKU2FTanBDdUtBc1I0OUdpS3dlUjZOckZ2RzVZYmQwbU4xTWtHY28vUFUrUGNGNFVnU3R5WUo5T1IKSml0SEhta0hyOTZpNU9UVWF3dXpYbnpVSklCSEtXazdidWlzL1VEcjJPMXhjU3Z5NkZnZDYwR1hJc1VmMURuUUo0K0g0eGowNEtsRwpEZlYwT29JdTBHNHNrYU14WER0RzZuc0VFRlplZ0IzMXBXWG9ndnppQjR4aVJmVWcza1p3aHFHOGs5TWVkS1pzc0N6M0F3eUlETXZVCmNsT0d2R0JHODVocXd2Ry9RL2x3SUhmS04wRjVWVkpqalZzU244Vm94SWlkclBJd3E3ZWpNWmRuclk4WEQyekhjKzBrbEd2SWc1clEKbWpkSkJLdXhGc2hzU1VrdHE2SFFqSkx5UVVwNUlTWGJZOWUybktkK1FtbjdPbU1DQXdFQUFhTmpNR0V3RHdZRFZSMFRBUUgvQkFVdwpBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRk53dUg5RmhOM25rcTlYVnN4SnhhRDFxYUp3aU1COEdBMVVkCkl3UVlNQmFBRk53dUg5RmhOM25rcTlYVnN4SnhhRDFxYUp3aU1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRQ1I4RUlDYUVEdXcyakEKVkMvZjdHTER3NTZLb0RFb3FvT09wRmFXRWhDR1ZycVhjdEpVTUh5dEdkVWRhRy83RkVMWWpRN3p0ZEdsNHdKQ1h0em9SbGdITlFJdwo0THgwU3NGREt2L2JHdEN3cjJ6RC9jdXo5WDl0QXk1WlZwMHRMVFdNc3RaREZ5eVNDc3RkNkl3UFMzQkQwSUwvcU15L3BKVEF2b2U5Cml1T1RlOGFQbXhhZEoyVzhlc1ZDZ214Y0I5Q3B3WWhnUk9tWWhSWmYrSS9LQVJET0pjUDVZQnVneFpmRDB5eUlNYUs5TU96UTBNQVMKOGNFNTQrWDErTlpLM1RUTisyL0JUK01BaTFiaWt2Y29za0ozY2lObnh6OFJGYkxFQXdXK3V4RjdDcitvYnVmL1dFUFBtMmVnZ0FlMgpIY3F0YmVwQkVYNHRkSlA3d3J5K1VVVEY3MmdsSjREanlLRFVFdXpacFRjZE4zeTBrY3JhMUxHV2dlOW9YSFlRU2E5K3BUZUFzUnhTCnZUT0JUSS81M1dYWkZNMktKVmowNHNXRHBRbVExR3dVWTdWQTMrdkEvTVJZZmcwVUZvZFVKMjVXNUhDRXVHd3lFbjZDTVVPKzE5MTgKb2EydTFxc2dFdThLd3hDTVNaWTEzQXQxWHJGUDFVODBEaEVnQjNWRFJlbWpFZHFzbzVuQ3Rua240cm52eU9MMk5TbDZkUHJGZjRJRgpZcVlLNm1peWVVY0didkpYcUJVenh2ZDRTajFDZTJ0Ky92ZEc2dEhyanUrSWFGdm93ZGx4ZnYxazcvOW5SNGhZSlM4K2hnZTkrNmpsCmdxaXNwZE5wUTgweGlFbUVVNUxBc1RrYk9ZTUJNTVR5cWZyUUE3MXlOMkJXSHpaOHZUbVI5VzBOdjN2WGtnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQU5GIFNlY3VyZSBTZXJ2ZXIgUm9vdCBDQQo9PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGN3pDQ0E5ZWdBd0lCQWdJSURkUGp2R3o1YTdFd0RRWUpLb1pJaHZjTkFRRUxCUUF3Z1lReEVqQVFCZ05WQkFVVENVYzJNekk0Ck56VXhNREVMTUFrR0ExVUVCaE1DUlZNeEp6QWxCZ05WQkFvVEhrRk9SaUJCZFhSdmNtbGtZV1FnWkdVZ1EyVnlkR2xtYVdOaFkybHYKYmpFVU1CSUdBMVVFQ3hNTFFVNUdJRU5CSUZKaGFYb3hJakFnQmdOVkJBTVRHVUZPUmlCVFpXTjFjbVVnVTJWeWRtVnlJRkp2YjNRZwpRMEV3SGhjTk1Ua3dPVEEwTVRBd01ETTRXaGNOTXprd09ETXdNVEF3TURNNFdqQ0JoREVTTUJBR0ExVUVCUk1KUnpZek1qZzNOVEV3Ck1Rc3dDUVlEVlFRR0V3SkZVekVuTUNVR0ExVUVDaE1lUVU1R0lFRjFkRzl5YVdSaFpDQmtaU0JEWlhKMGFXWnBZMkZqYVc5dU1SUXcKRWdZRFZRUUxFd3RCVGtZZ1EwRWdVbUZwZWpFaU1DQUdBMVVFQXhNWlFVNUdJRk5sWTNWeVpTQlRaWEoyWlhJZ1VtOXZkQ0JEUVRDQwpBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU52cmF5dm1aRlNWZ3BDamNxUVpBWjJjQzRGZmMwbTZwNnp6CkJFNTdsZ3ZzRWVCYnBoek9HOUlOZ3h3cnVKNGRma1V5WUE4SDZYZFlmcDlxeUdGT3RpYkJUSTMvVE84MHNoOWwyTGw0OWEycGNibnYKVDFnZHBkNTBJSmVoN1doTTNwSVhTN3lyLzJXYW52dEgyVmR5OHdtaHJuWkVFMjZjTFVRNXZQbkhPNlJZUFVHOXRNSkpvOGdOMHBjdgpCMlZTQUtkdXlLOW83UFFVbHJaWEgxYkRPWjhyYmVUelB2WTFaTm9NSEtHRVN5OUxTK0lzSkoxdGswRHJ0U09PTXNwdlJkT29pWHNlCnp4NzZXME9MemMyb0QycktERjY1bmtlUDhObTJDZ3RZWlJjenVTUGtkeGw5eTBvdWtudFBMeEIzc1kwdmFKeGl6T0JRK095UnAxUk0KVnduVmRtUEY2R1VlN20xcXp3bWQrbnhQcldBSS9WYVpEeFVzZTZtQXE0eGhqMG9IZGtMZVBmVGRzaVF6VzdpMW8wVEpySDkzUEIwago3SUtwcHVMSUJrd0MvcXhjbVprTEx4Q0twdlIvMVlkMERWbEpSZmJ3Y1Z3NUtkYS9TaU9MOVY4Qlk5S0hjeWkxU3dyMStLdUNMSDV6CkpUSWRDMk1LRjRFQS83WjJYdWUwc1VES0lidlZnRkhsU0ZKbkxOSmhpUWNORDg1Q2Q4QkVjNXhFVUtEYkVBb3RsUnlCcitRYzVSUWUKOFRaQkFRSXZmWE9uM2tMTVRPbUpEVmIzbjVIVUE4WnN5WS9iMkJ6Z1FKaGRacG1ZZ0c0dC93SEZ6c3RHSDZ3Q3hrUG1ycUtFUE1WTwpIajF0eVJSTTR5NUJ1OG81dnpZOEtobXFRWWRPcGM1TE1ubmRrRWwvQWdNQkFBR2pZekJoTUI4R0ExVWRJd1FZTUJhQUZKeGYwR3hqCm8xK1R5cE9ZQ0syTWg2VXNYTUUzTUIwR0ExVWREZ1FXQkJTY1g5QnNZNk5mazhxVG1BaXRqSWVsTEZ6Qk56QU9CZ05WSFE4QkFmOEUKQkFNQ0FZWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFUaDY1aXNhZ21EOXV3Mm5BYWx4SgpVcXpMSzExNE9NSFZWSVNmay9DSEdUMHNab25yRFVMOHpQQjFoVCtMOUlCZGVlVVhaNzAxZ3VMeVBJNTlXemJMV29BQUtmTE9LeXp4Cmo2cHRCWk5zY3NkVzY5OVFJeWpsUlJBOTZHZWpydzVWRDVBSll1OUxXYUwyVS9IQU5lUXZ3U1M5ZVM5T0lDSTcvUm9nc0tRT0xIRHQKZEQrNEU1VUdVY2pvaHliS3BGdHFGaUdTM1hOZ25oQVkzanlCNnVnWXczeUo4b3RRUHIwUjRoVURxRFo5TXdGc1NCWFhpSkNaQk1YTQo1Z2YwdlBTUTdSUGk2b3ZEajZNekQ4RXBUQk5PMmhWV2NYTnlnbEQybWpOOG9yR29HalIwWlZ6TzBldXJVK0FhZ05qcU9rbmtKakNiCjVSeUtxS2tWTW9hWmtnb1FJMVlTNFBiT1RPSzd2dHVOa25NQlppOWlQckp5SjBVMjdVMVc0NWVaL3pvMVBxVlVTbEpaUzJEYjd2NTQKRVg5SzNCUjVZTFpyWkFQYkZZUGhvcjcySTVkUThBa3pOcWR4bGlYenVVSjkyemcvTEZpczZFTGhEdGpUTzB3dWd1bURMbXN4MmQxSApoazl0bDVFdVQrSW9jVFVXMGZKei9pVXJCMGNrWXlmSStQYlphL3dTTVZZSXdGTkNyNXpRTTM3OEJ2QXhSQU1VOFZqcThtb05xUkd5Cmc3N0ZHcjhINmxuY280ZzE3NXgyTWp4TkJpTE9GZVhkbnRpUDJ0N1N4RG5sRjRIUE9FZnJmNGh0V1J2Zm4wSVVybjdQcUxCbVpkbzMKcjUrcVBlb290dDdWTVZnV2dsdnF1eGwxQW5NYXlrZ2FJWk9RQ282VGhLZDlPeU1Za29tZ2phdz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ2VydHVtIEVDLTM4NCBDQQo9PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDWlRDQ0FldWdBd0lCQWdJUWVJOG5YSUVTVWlDbEJOQXQzYnB6OURBS0JnZ3Foa2pPUFFRREF6QjBNUXN3Q1FZRFZRUUdFd0pRClRERWhNQjhHQTFVRUNoTVlRWE56WldOdklFUmhkR0VnVTNsemRHVnRjeUJUTGtFdU1TY3dKUVlEVlFRTEV4NURaWEowZFcwZ1EyVnkKZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhreEdUQVhCZ05WQkFNVEVFTmxjblIxYlNCRlF5MHpPRFFnUTBFd0hoY05NVGd3TXpJMgpNRGN5TkRVMFdoY05ORE13TXpJMk1EY3lORFUwV2pCME1Rc3dDUVlEVlFRR0V3SlFUREVoTUI4R0ExVUVDaE1ZUVhOelpXTnZJRVJoCmRHRWdVM2x6ZEdWdGN5QlRMa0V1TVNjd0pRWURWUVFMRXg1RFpYSjBkVzBnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3gKR1RBWEJnTlZCQU1URUVObGNuUjFiU0JGUXkwek9EUWdRMEV3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBVEVLSTZyR0Z0cQp2bTVrTjJQa3pleXJPdmZNb2JnT2drblhoaW1mb1pUeTQyQjRtSUY0QmszeTdKb09WMkNEbjdUbUZ5OGFzMTBDVzRralBNSVJCU3FuCmlCTVk4MUNFMTcwMExDZUpWZi9PVE9mZnBoOG94UEJVdzdsOHQxT3Q2OEtqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWUQKVlIwT0JCWUVGSTBHWm5Ra2RqcnppZmU4MXIxSGZTKzhFRjlMTUE0R0ExVWREd0VCL3dRRUF3SUJCakFLQmdncWhrak9QUVFEQXdObwpBREJsQWpBRFZTMm01aGpFZk8vSlVHN0JKdytjaDY5dTFSc0lHTDJTS2NIdmxKRjQwam9jVllsaTVSc0pIcnBrYS9GMnROUUNNUUMwClFvU1ovNnZubnZ1Umx5ZGQzTEJiTUhIT1hqZ2FhdGtsNStyM1laSlcrT3JhTnNLSFpaWXVjaVV2ZjkvREU4az0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ2VydHVtIFRydXN0ZWQgUm9vdCBDQQo9PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGd0RDQ0E2aWdBd0lCQWdJUUhyOVpVTGpKZ0RkTUJ2ZnJWVSsxN1RBTkJna3Foa2lHOXcwQkFRMEZBREI2TVFzd0NRWURWUVFHCkV3SlFUREVoTUI4R0ExVUVDaE1ZUVhOelpXTnZJRVJoZEdFZ1UzbHpkR1Z0Y3lCVExrRXVNU2N3SlFZRFZRUUxFeDVEWlhKMGRXMGcKUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3hIekFkQmdOVkJBTVRGa05sY25SMWJTQlVjblZ6ZEdWa0lGSnZiM1FnUTBFdwpIaGNOTVRnd016RTJNVEl4TURFeldoY05ORE13TXpFMk1USXhNREV6V2pCNk1Rc3dDUVlEVlFRR0V3SlFUREVoTUI4R0ExVUVDaE1ZClFYTnpaV052SUVSaGRHRWdVM2x6ZEdWdGN5QlRMa0V1TVNjd0pRWURWUVFMRXg1RFpYSjBkVzBnUTJWeWRHbG1hV05oZEdsdmJpQkIKZFhSb2IzSnBkSGt4SHpBZEJnTlZCQU1URmtObGNuUjFiU0JVY25WemRHVmtJRkp2YjNRZ1EwRXdnZ0lpTUEwR0NTcUdTSWIzRFFFQgpBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRRFJMWTY3dHpicWJUZVJuMDZUcHdYa0tRTWx6aHlDOTN5Wm4wRUd6ZTJqdXNEYkNTekJmTjhwCmZrdGxMNU9uMUFGckF5Z1lvOWlkQmNFcTJFWHhrZDdmTzlDQUFvelBPQS9xcDF4NEVhVEJ5SVZjSmRQVHN1Y2x6eEZVbDZzMXdCNTIKSE84QVU1ODUzQlNsTENJbHMzSnkvSTJ6NVQ0SUhoUXFOd3VJUE1xdzlNakNvYTY4d2I0cFoxWGkvSzFaWFA2OVZ5eXdrSTNDN1RlMgpmSm1JdGRVRG1qMFZEVDA2cUtoRjhKVk9KVmtkelpocHU5UE1Nc21ONzRIK3JYMkp1N3BnRThwbGxXZWc4eG4yQTFiVWF0TW40cUd0CmcvQktFaUozSEFWejRobHhRc0RzZFVhYWtGamdhbzRycFVZd0JJNFpzaGZqdnFtNmYxYnhKQVBYc2lFb2RnNDJNRXg1MVVHYW1xaTQKTmJvTU92SkVHeUNJOThVbDF6M0c0ejVEM1lmK3hPcjFVejVNWmY4N1NzdDRXbXNYWHczSHcwOU9taXFpN1ZkTkl1SkdtajhQa1RRawpmVlhqakpVMzB4cndDU3NzMHNtTnRBMEFxMmNwS05nQjlSa0V0aDIrZHY1eVhNU0Z5dEtBUWQ4RnFLUFZoSkJQQy9QZ1A1c1owamVKClAvSjdVaHlNOXVIM1BBZVhqQTZpV1lFTXNwQTkwK05aUnUwUHFhZmVnR3RhcWdlMkdjdThWL09YSVhvTXNTdDBQdXZhcDJjdFRNU1kKbmpZSmRtWm0vQm8vNmtoVUhMNHd2WUJRdjN5MXpnRDJER0haNXlRRDRPTUJnUTY5MklVMGlMMnlOcWg3WEFqbFJJQ01iL2d2MVNISwpIUnpRKzhTMWg5RTZUc2QydFRWSXRRSURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCU00reHgxCnZBTFRuMDR1U05uNVlGU3F4TE5QK2pBT0JnTlZIUThCQWY4RUJBTUNBUVl3RFFZSktvWklodmNOQVFFTkJRQURnZ0lCQUVpaTFRQUwKTHRBL3ZCelZ0VlJKSGxwcjlPVHk0RUEzNE13VWU3bkoralcxZFJlVGFnVnBoWnpOVHhsNFd4bUI4Mk0rdzg1YmovVXZYZ0YyRXo4cwpBTG5ObGxJNVNXMEVUc1hwRDRZTjRmcXpYNElTOFRyT1pnWWtOQ3Zvek1ybmFkeUhuY0kwMTNuUjAzZTRxbGxZL3AwbStqaUdQcDJLCmgyUlg1UmM2NHZtTnVlTXplTUdRMkxqZHQ0TlI1TVRNSTlVR2ZPWlIwODAwTWNEMlJyc0xyZnc5RUFVcU8wcVJKZTZNMUlTSGdDcTgKQ1l5cU9oTmY2RFI1VU1FUUdmblRLQjdVMFZFd0tiT3VrR2ZXSHdwanNjV3B4a0l4WXhlVTcybkxML3FNRkgzRVF4aUoyZkF5UU9hQQo0a1pmNWVQQkFGbW8rZWdndklrc0RrYzBDK3BYd2xNMi9LZlVyekhOL2dMbGRmcTVKd241OC9VN3luMmZxU0xMaU1tcTBVYzlObmVvCldXUnJKOC92SjhIakpMV0c5NjUrTWsyd2VXalJPZWlRV01PRHZBOHMxcGZyemd6aElNZmF0ejdEUDc4djNEU2sreXNoeldlUFMvVGoKNnRRLzUwKzZ1YVdUUlJ4bUh5SDZaRjV2NEhhVU1zdDE5VzdsOW8vSHVLVE1xSlo5WlBza1drb0RiR3M0eHVnRFE1cjNWN216S1dtVApPUFFEOHJ2N2dtc0hJTkZTSDVwa0FudVladHRjVFZvUDBJU1ZvRHdVUXdiS3l0dTRRVGJhYWtSbmg2K3Y0MFVSRldrSXNyNFdPWmNrCmJ4SkYwV2RkQ2FqSkZkcjYwcVpmRTJFZnY0V3N0SzJ0QlpRSWd4NTFGOU54TzVOUUkxbWc3VHlSVkoxMkFNWER1RGpiCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClR1blRydXN0IFJvb3QgQ0EKPT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnN6Q0NBNXVnQXdJQkFnSVVFd0xWNGtCTWtrYUdGbWRkdEx1N3NtcysvQk13RFFZSktvWklodmNOQVFFTEJRQXdZVEVMTUFrRwpBMVVFQmhNQ1ZFNHhOekExQmdOVkJBb01Ma0ZuWlc1alpTQk9ZWFJwYjI1aGJHVWdaR1VnUTJWeWRHbG1hV05oZEdsdmJpQkZiR1ZqCmRISnZibWx4ZFdVeEdUQVhCZ05WQkFNTUVGUjFibFJ5ZFhOMElGSnZiM1FnUTBFd0hoY05NVGt3TkRJMk1EZzFOelUyV2hjTk5EUXcKTkRJMk1EZzFOelUyV2pCaE1Rc3dDUVlEVlFRR0V3SlVUakUzTURVR0ExVUVDZ3d1UVdkbGJtTmxJRTVoZEdsdmJtRnNaU0JrWlNCRApaWEowYVdacFkyRjBhVzl1SUVWc1pXTjBjbTl1YVhGMVpURVpNQmNHQTFVRUF3d1FWSFZ1VkhKMWMzUWdVbTl2ZENCRFFUQ0NBaUl3CkRRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFNUE4wL3k5QkZQZERDQTYxWWd1QlV0QjlZT0NmdmRabjU2ZVkraHoKMnZZR3FVOGZ0UGtMSHptTW1pRFFmZ2JVN0RUWmhyeDFXNGVJOE5MWjFLTUtzbXdiNjBrc1BxeGQySlFEb093MDVUREVOWDM3SmswYgpiakJVMlBXQVJadzVyWnpKSlFSTm1wQStUa0J1aW12TktXZkd6QzNnZE9nRlZ3cElVUHA2UTlwKzdGdWFEbUoyL3VxZEhZVnk3Qkc3Ck5lZ2ZKNy9Cb2NlN1NCYmRWdGZNVHFEaHVhemIxWU1aR29YUmxKZlh5cU5sQy9NNCtRS3UzZlpuejhrLzlZb3NSeHFaYndVTi9kQWQKZ2pIOEtjd0FXSmVSVElBQUhET0ZsaS9MUWNLTEVJVERDU1NKSDdVUDJkbDNSeGlTbEdCY3g1a0RQUDczbGFkOVVLR0F3cW1EclZpVwpWU0hiaGxuVXI4YTgzWUZ1Qjl0Z1l2N3NFRzdhYUFIMGd4dXBQcUpiSTlka3h0L2NvbjNZUzdxQzBsSDRacjhHUnVSNUtpWTJlWThmClRwa2RzbzhNRGh6L3lWM0EvWkFRcHJFMzg4MDZKRzYwaFpDL2dMa01qTldiMXNqeFZqOGFnSWw2cWVJYk1sRXNQdkxmZS9aZGVpa1oKanVYSXZUWnhpMTFNd2gwL3JWaWl6ejF3VGFaUW1DWGNJL200V0VFSWNiOVB1SVNnandCVUZmeVJiVmlubGp2clM1WW56V3Vpb1lhcwpEWHhVNW1aTVpsK1F2aUdhQWtZdDVJUENnTG5QU3o3b2Z6d0I3STllelgvU0tFSUJsWXJpbHowUUlYMzJuUnpGTktIc0xBNEtVaXdTClZYQWtQY3ZDRkRWRFhTZE92c0M5cW55VzUveWVZYTFFMHdDWEFnTUJBQUdqWXpCaE1CMEdBMVVkRGdRV0JCUUdtcHNmVTMzeDlhVEkKMDRZK29YTlp0UGRFSVRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZBYWFteDlUZmZIMXBNalRoajZoYzFtMAo5MFFoTUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBcWdWdXR0MFZ5Yit6eGlEMkJrZXdocE1sCjA0MjV5QUEvbC9WU0o0aHh5WFQ5NjhwazIxdnZIbDI2djlIcjdseHB1aGJJODdtUDB6WXVRRWtIRFZuZWl4Q3dTUVhpLzVFL1M3ZmQKQW83NGdTaGN6Tnh0cjE4VW5IMVllQTMyZ0FtNTZRNlhLUm00dCt2NEZzdFZFdVRHZmJ2RTdQaTFIRTQrWjcvRlh4dHRiVWNvcWdSWQpZZFoydnlKLzBBZHFwMlJUOEplTm5ZQS91OEVIMjJXdjVwc3ltc05VazhRY0NNTkUrM3RqRVVQUmFocGhhbmx0a0U4cGprY0Z3UkpwCmFkYkdOakhoL1BxQXVseFB4T3UzTXF6NGRXRVgxeEFadWZIU0NlOTZRcDFiV2d2VXhwVk9LczcvQjlkUGZoZ0dpUEVadGRtWXU2NXgKeEJ6bmRGbFk3d3lKejRzZmRaTWFCQlNTU0ZDcDYxY3BBQmJqTmh6SStML3dNOVZCRDhUTVBOM3BNME1Ca1JBckh0RzVYYzB5R1l1UApqQ0IzMXlMRVF0eUVGcHNsYmVpMFZYRi9zSHl6MDNGSnVjOVNwQVEvM0QyZ3U2OHpuZ293WUk3Ym5WMlVxTDFnNTJLQWRvR0RESXpNCk1FWko0Z3pTcUsvcllYSHY1eUppcWZkY1pHeWZGb3huTmlkRjlRbDd2L1lRQ3ZHd2pWUkRqQVM2b3ovdjRqWEgrWFRnYnpSQjBMOXoKWlZjZytadG5lbVpvSkU2QVpiMFFtUVpaOG1XdnVNWkh1LzJRZUl0QmN5NnZWUi9jTzVKeWJvVFQwR0ZNRGN4MlYrSXRoU0lWTmczcgpBWjNyMk92RWhKbjd3QXpNTXVqamQ5cURSSXVlVlNqQWkxalRrRDVPR3dEeEZhMkRLNW89Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkhBUklDQSBUTFMgUlNBIFJvb3QgQ0EgMjAyMQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZwRENDQTR5Z0F3SUJBZ0lRT2NxVEhPOUQ4OGFPazhmMFpJazRmakFOQmdrcWhraUc5dzBCQVFzRkFEQnNNUXN3Q1FZRFZRUUcKRXdKSFVqRTNNRFVHQTFVRUNnd3VTR1ZzYkdWdWFXTWdRV05oWkdWdGFXTWdZVzVrSUZKbGMyVmhjbU5vSUVsdWMzUnBkSFYwYVc5dQpjeUJEUVRFa01DSUdBMVVFQXd3YlNFRlNTVU5CSUZSTVV5QlNVMEVnVW05dmRDQkRRU0F5TURJeE1CNFhEVEl4TURJeE9URXdOVFV6Ck9Gb1hEVFExTURJeE16RXdOVFV6TjFvd2JERUxNQWtHQTFVRUJoTUNSMUl4TnpBMUJnTlZCQW9NTGtobGJHeGxibWxqSUVGallXUmwKYldsaklHRnVaQ0JTWlhObFlYSmphQ0JKYm5OMGFYUjFkR2x2Ym5NZ1EwRXhKREFpQmdOVkJBTU1HMGhCVWtsRFFTQlVURk1nVWxOQgpJRkp2YjNRZ1EwRWdNakF5TVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBSXZDNTY5bG13Vm5sc2tOCkpMblFEbVQ4enVJa0dDeUVmM2RSeXdRUk5yaGU3V2x4cDU3a0pRbVhaOEZId3MrUkZqWmlQVGdFNFZHQy82elN0R25kTHV3Um8wWHUKYTJzN1RMK01qYVFlblJHNTZUajVlZzRNbU9JakhkRk9ZOVRudUVGRSsydXZhOW9mMDhXUmlGdWtpWkxSZ2VhTU9WaWcxbWxEcWEyWQpVbGh1MndyN2E4OW8rdU9rWGpwRmM1Z0g2bDhDY3Q0TXBiT2ZycWtkdHgyei9JcFo1MjV5WmEzMU1KUWpCL09DRmtzMW1KeFR1eS9LCjVGclp4NDBkL0ppWit5eWtnbXZ3S2grT0MxOXhYRnl1UW5zcGlZSExBNk9aeW9pZUMwQUpRVFBiNWxoNi9hNlpjTUJhRDlZVGhuRXYKZG1uOGtOM2JMVzdSOHB2MUdtdWVieFdNZXZCTEtLQWlPSUFrYkRha08vSXdrZk40RTgvQlB6V3I4UjBSSTdWRElwNEJrcmNZQXVVUgowWUxiRlFETVlUZkJLbnlhNGRDNnMxQkc3b0tzblRINCt5UGlBd0JJY0tNSkpua1ZVMkR6T0Z5dE9PcUJBR01VdVROZTNRdmJvRVVICkdqTUorRTIwcHdLbWFmVENXUVdJWllWV3Jrdkw0TjQ4ZlMwYXlPbjdINk5oU3RZcUU2MTNUQm9ZbTVFUFdOZ0dWTVdYK0tvL0lJcW0KaGFaMzlxYjhIT0x1YnBRektvTlFoQXJsVDRiNFVFVjRBSUhyVzJqakpvM01lMXhSOUJRc1FMNGFZQjE2Y21FZEgyTXRpS3JPb2tXUQpDUHhydnJOUUtscjlxRWdZUnRhUVFKS1FDb1JlYURINDYrME4weDNHZlprWVZWWW5aUzZOUmNVazdNN2pBZ01CQUFHalFqQkFNQThHCkExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkFwSUk2WmdwSklLTStxVFc4Vlg2aVZOdlJMdU1BNEdBMVVkRHdFQi93UUUKQXdJQmhqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFQcEJJcW01aUZTVm1ld3pWakl1Sm5kZnRUZ2Z2bk5BVVgxNVF2V2lXa0tRVQpFYXBvYlFrMU9VQUoydlFKTERTbGUxbUVTU21YZE1nSEhrZHQ4czRjVUNiam5qMUFVei8zZjVaMkVNVkdwZEFnUzFEME5Uc1k5RlZxClFSdEhCbWc4dXdrSVl0bGZWVUtxckZPRnJKVldObGFyNUFXTXhhamFINk5wdlZNUHhQL2N5dU4rOGt5SWhrZEdHdk1BOVlDUm90eEQKUXBTYklQRFJ6YkxyTEZQQ1UzaEtUd1NVUVpxUEp6TEI1VWtadi9IeXdvdW9Damt4S0xSOVlqWXNUZXdmTTdaK2QyMStVUENmRHRjUgpqODhZeGVNbi9pYnZCWjNQenpmRjBIdmFPN0FXaEF3Nms5YStGOXNQUGc0WmVBbkhxUUp5SWt2M04zYTZkY1NGQTFwajFiRjFCY0s1CnZaU3RqQldacDVOOTlzWHpxblRQQklXVW1BRDA0dm5LSkdXLzRHS3Z5TVg2c3NtZVZramFlZjJXZGhXK280NVd4TE0wL0w1SDlNRzAKcVB6Vk1JaG83c3V1eVdQRWRyNnNPQmpoWGx6UHJqb2lVZXZSaTdQekt6TUhWSWY2dExJVGU3cFRCR0lCbmZIQVQrN2hPdFNMSUJENgpBbGZtNzhFTHQ1QkduQmtwak54dm9FcHBhWlMzSkdXZy82dy96Z0g3SVM3OWFQaWI4cVhQTVRoY0Zhcm1sd0RCMzFxbHB6bXE2WVIvClBGR29PdG1VVzR5L1R3aHg1ZHVvWE5UU3B2NEFvOFlXeHcvb2dNNGNLR1IwR1FqVFF1UE9BRjEvc2R3VHNPRUZ5OUVncW9aMG5qbm4Ka2YzL1c5YjNyYVl2QXd0dDQxZFU2M1pUR0kwUm1Mbz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKSEFSSUNBIFRMUyBFQ0MgUm9vdCBDQSAyMDIxCj09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ1ZEQ0NBZHVnQXdJQkFnSVFaM1NkalhmWU8ycmJJdlQvV2VLL3pqQUtCZ2dxaGtqT1BRUURBekJzTVFzd0NRWURWUVFHRXdKSApVakUzTURVR0ExVUVDZ3d1U0dWc2JHVnVhV01nUVdOaFpHVnRhV01nWVc1a0lGSmxjMlZoY21Ob0lFbHVjM1JwZEhWMGFXOXVjeUJEClFURWtNQ0lHQTFVRUF3d2JTRUZTU1VOQklGUk1VeUJGUTBNZ1VtOXZkQ0JEUVNBeU1ESXhNQjRYRFRJeE1ESXhPVEV4TURFeE1Gb1gKRFRRMU1ESXhNekV4TURFd09Wb3diREVMTUFrR0ExVUVCaE1DUjFJeE56QTFCZ05WQkFvTUxraGxiR3hsYm1saklFRmpZV1JsYldsagpJR0Z1WkNCU1pYTmxZWEpqYUNCSmJuTjBhWFIxZEdsdmJuTWdRMEV4SkRBaUJnTlZCQU1NRzBoQlVrbERRU0JVVEZNZ1JVTkRJRkp2CmIzUWdRMEVnTWpBeU1UQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkRnSS9yR2dsdEo2cks5Sk90REE0TU03S0tyeGNtMWwKQUVlSWhQeWFKbXVxUzdwc0JBcUlYaGZ5VllmOE1MQTA0alJZVnhxRVUra3cyYW55bG5URFVSOVlTVEhNbUU1Z0VZZDEwM0tVa0UrYgpFQ1VxcUhndHZwQkJXSkFWY3FlaHQ2TkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVeVJ0VGdSTCtCTlVXCjBhcThtbSszb0pVWmJzb3dEZ1lEVlIwUEFRSC9CQVFEQWdHR01Bb0dDQ3FHU000OUJBTURBMmNBTUdRQ01CSGVydmpjVG9pd3FmQWkKcmNKUlFPOWdjUzN1andMRVhRTndTYVNTNnNVVWlIQ20wdzJ3cXNvc1FKejc2WUp1bWdJd0swZWFCOGJSd29GOHlndVdHRUViby9RdwpDWjYxSXlnTm54UzJQRk9pVEFacGZmcHNrY1lxU1VYbTdMY1Q0VHBzCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2OAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdGRENDQS95Z0F3SUJBZ0lJRzNEcDB2K3ViSEV3RFFZSktvWklodmNOQVFFTEJRQXdVVEVMTUFrR0ExVUVCaE1DUlZNeFFqQkEKQmdOVkJBTU1PVUYxZEc5eWFXUmhaQ0JrWlNCRFpYSjBhV1pwWTJGamFXOXVJRVpwY20xaGNISnZabVZ6YVc5dVlXd2dRMGxHSUVFMgpNall6TkRBMk9EQWVGdzB4TkRBNU1qTXhOVEl5TURkYUZ3MHpOakExTURVeE5USXlNRGRhTUZFeEN6QUpCZ05WQkFZVEFrVlRNVUl3ClFBWURWUVFERERsQmRYUnZjbWxrWVdRZ1pHVWdRMlZ5ZEdsbWFXTmhZMmx2YmlCR2FYSnRZWEJ5YjJabGMybHZibUZzSUVOSlJpQkIKTmpJMk16UXdOamd3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRREtsbXVPNnZqNzhhSTE0SDlNMnVERApVdGQ5dGhESUFsNnpReXJFVDJxeXloeGRLSnA0RVJwcFdWZXZ0U0JDNUlzUDV0OWJwZ09TTC9VUjVHTFhNbkU0MlFRTWNhczlVWDRQCkI5OWpCVnpwdjVSdndTbUN3TFRhVWJEQlBMdXROMHBjeXZGTE5nNGtxNy9EaEhmOXFGRDBzZWZHTDlJdFdZMTZDazZXYVZJQ3FqYVkKN1B6NkZJTU1OeC9Ka2pkLzE0RXQ1Y1M1NEQ0MC9tZjBQbWJSMC9SQXoxNWlOQTl3Qmo0Z0dGck85M0liSld5VGRCU1RvM094RHFxSApFQ05aWHlBRkdVZnRhSTZTRXNwZC9OWXJzcEk4SU0vaFg2OGd2cUIyZjNibDdCcUdZVE0rNTN1MFA2QVBqcUs1YW0rNWh5WnZRV3lJCnBsRDlhbU1MOVpNV0d4bVBzdTJibThtUTlRRU0zeGs5RHo0NEk4a3Zqd3pSQXY0YlZkWk8wSTA4cjArazgvNnZLdE1GblhrSW9jdFgKTWJTY3lKQ3laL1FZRnBNNi9FZlkwWGlXTVIrNkt3eGZYWm10WTRsYUpDQjIyTi85cTA2bUlxcWRYdVluaW4xb0thUG5pcmphRWJzWApMWm1kRXlSRzk4WGkySitPZjhlUGRHMWFzdWh5OWF6dUpCQ3RMeFRhL3kyYVJuRkh2a0xmdXdIYjlIL1RLSTh4V1Z2VHlRS210RkxLCmJwZjdROFVJSm0rSzlMdjlueWlxRGRWRjh4TTZIZGpBZUk5Qlp6d2VsR1N1ZXd2RjZOa0JpRGthbDRaa1FkVTdod3h1K2cvR3ZVZ1UKdnpsTjFKNUJ0bytXSFdPV2s5bVZCbmd4YUo0M0JqdUFpVVZoT1NQSEcwU2pGZVVjK0pJd3V3SURBUUFCbzRIdk1JSHNNQjBHQTFVZApEZ1FXQkJSbHpldXJOUjRBUG43VmRNQWN0SE5IRGhwa0x6QVNCZ05WSFJNQkFmOEVDREFHQVFIL0FnRUJNSUdtQmdOVkhTQUVnWjR3Cmdac3dnWmdHQkZVZElBQXdnWTh3THdZSUt3WUJCUVVIQWdFV0kyaDBkSEE2THk5M2QzY3VabWx5YldGd2NtOW1aWE5wYjI1aGJDNWoKYjIwdlkzQnpNRndHQ0NzR0FRVUZCd0lDTUZBZVRnQlFBR0VBY3dCbEFHOEFJQUJrQUdVQUlBQnNBR0VBSUFCQ0FHOEFiZ0JoQUc0QQpid0IyQUdFQUlBQTBBRGNBSUFCQ0FHRUFjZ0JqQUdVQWJBQnZBRzRBWVFBZ0FEQUFPQUF3QURFQU56QU9CZ05WSFE4QkFmOEVCQU1DCkFRWXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUJBSFNIS0FJcmR4OW1pV1R0ajNRdVJoeTdxUGo0Q3gyRHRqcW42RVdLQjdmZ1BpREwKNFFqYkV3ajRLS0Uxc29DekMxSEEwMWFhalRORlNhOUo4T0E5QjNwRkUxci95SmZZMHhnc2ZaYjQzYUpsUTNDVGtCVzZrTi9vR2JEYgpMSXBnRDdkdmxBY2VIYWJKaGZhOU5QaEFlR0lRY0RxK2ZVczVnYWtRMUpaQnUvaGZIQXNkQ1BLeHNJbDY4dmVnNE1TUGkzaTFPMWlsCkk0NVBWZjQyTytBTXQ4b3FNRUVndElETnJ2eDJabk9vcm03aGZOb0Q2SlFnNWlLajBCK1FYU0JURkNaWDJsU1gzeFpFRUFFZWlHYVAKY2ppVDNTQzNOTDdYOGU1amprZDVLQWI4ODFsRkpXQWlNeHVqWDZpNkt0b2FQYzFBNm96dUJSV1YxYVVzSUMrbm1DanVSZnp4dUlnQQpMSTlDMmxIVm5PVVRhSEZGUTR1ZUN5RThTMXdGM0JxZm1JN2F2U0tlY3MydENzdk1vMmViS0hURW05Y2FQQVJZcG9LZHJjZDdiLytBCmx1bjRqV3E5R0pBZC8wa2FrRkkza3k4OEFsMkNkZ3RSNXhiSFYvZzQrYWZObXlKVTcyT3dGVzFUWlFOS1hrcWdzcWVPU1FCWk9OWEgKOUlCazlXNlZVTGdSZmhWd09FcXdmOURFTW5EQUdmL0pPQzBVTEdiMFFrVG1WWFliZ0JWWC84Q25wNm81cXRqVGNOQXV1dXVVYXZwZgpOSWJuWXJYOWl2QXdoWlRKcnlRQ0wyL1czV2YrNDdCVlR3U1lUNlJCVnVLVDBHcm8xdlA3WmVET2RjUXhXUXp1Z3NnTVlETktHYnFFClp5Y1B2RUpkdlNSVURld2RjQVpmcEx6NklIeFYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKdlRydXMgRUNDIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNEekNDQVpXZ0F3SUJBZ0lVYm1xOFdhcFR2cGc1WjZMU2E2UTc1bTBjMXRvd0NnWUlLb1pJemowRUF3TXdSekVMTUFrR0ExVUUKQmhNQ1EwNHhIREFhQmdOVkJBb1RFMmxVY25WelEyaHBibUVnUTI4dUxFeDBaQzR4R2pBWUJnTlZCQU1URVhaVWNuVnpJRVZEUXlCUwpiMjkwSUVOQk1CNFhEVEU0TURjek1UQTNNalkwTkZvWERUUXpNRGN6TVRBM01qWTBORm93UnpFTE1Ba0dBMVVFQmhNQ1EwNHhIREFhCkJnTlZCQW9URTJsVWNuVnpRMmhwYm1FZ1EyOHVMRXgwWkM0eEdqQVlCZ05WQkFNVEVYWlVjblZ6SUVWRFF5QlNiMjkwSUVOQk1IWXcKRUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRVpWQktyb3g1bGtxcUhBakRvNkxOL2xsV1FYZjlKcFJDdXgzTkNOdHpzbHQxODgrYwpUb0wwdi9oaEpvVnMxb1ZiY25EUy9kdGl0TjlUaTcyeFJGaGlRZ25IK245YkVPZitRUDNBMk1Nck11ZHdwcmVtSUZVZGU0QmRTNDluClRQRVFvMEl3UURBZEJnTlZIUTRFRmdRVW1Ebk52dGl5alBleXErR3RKSzk3ZktIYkg4OHdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU8KQmdOVkhROEJBZjhFQkFNQ0FRWXdDZ1lJS29aSXpqMEVBd01EYUFBd1pRSXdWNTNkVnZISDQrbTRTVkJybTJuRGIrekRmU1hrVjVVVApRSnRTMHp2elFCbThKc2N0QnA2MWV6YWY5U1hVWTJzQUFqRUE2ZFBHbmxhYUtzeWgyai9JWml2VFdKd2doZnFya1lwd2NCRTRZR1FMCllnbVJXQUQ1VGZzMGFOb0pyU0VHR0pUTwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgp2VHJ1cyBSb290IENBCj09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZWakNDQXo2Z0F3SUJBZ0lVUStOeEU5aXpXUlJkdDg2TS9UWDliN3dGalVVd0RRWUpLb1pJaHZjTkFRRUxCUUF3UXpFTE1Ba0cKQTFVRUJoTUNRMDR4SERBYUJnTlZCQW9URTJsVWNuVnpRMmhwYm1FZ1EyOHVMRXgwWkM0eEZqQVVCZ05WQkFNVERYWlVjblZ6SUZKdgpiM1FnUTBFd0hoY05NVGd3TnpNeE1EY3lOREExV2hjTk5ETXdOek14TURjeU5EQTFXakJETVFzd0NRWURWUVFHRXdKRFRqRWNNQm9HCkExVUVDaE1UYVZSeWRYTkRhR2x1WVNCRGJ5NHNUSFJrTGpFV01CUUdBMVVFQXhNTmRsUnlkWE1nVW05dmRDQkRRVENDQWlJd0RRWUoKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTDFWZkdIVHVCMEVZZ1dncm15M2NMUkI2a3NEWGhBL2tGb2NpenV3Wm90cwpTS1ljSXJyVlFKTHVNN0lqV2NtT3ZGamFpNTdRR2ZJdldjYU1ZMXE2bjZNTHNMT2FYTG9SdUJMcERMdlBibXlBaHlrVUF5eU5KSnJJClpJTzFhcXdUTERQeG45d3NZVHdhUDNCVm02MEFVbi9QQkxuK052cWN3QmF1WXY2V1RFTitWUlMrR3JQU2JjS3ZkbWFWYXlxd2xIZUYKWGdRUFloMWpkZmRyNTh0Ym1uRHNQbWNGOFA0SENJRFBLTnNGeGhRbkw0Wjk4Q2ZlLytaK00wam5DeDVZMFNjclV3NVhTbVhYKzZLQQpZUHhNdkRWVEFXcVhjb0t2OFIxdzZKejE3MTdDYk1kSGZscVVoU1pOTzdyclRPaXdDY0psd3AyZENadE90WmNGclBVR29QYzJCWDcwCmtMSnJ4TFQ1Wk9ycEdncklEYWp0SjhuVTU3TzVxNElpa0NjOUt1aDhrTys4VC8zaUNpU24zbVVrcEYzcXdIWXcwM2RRK0EwRW01UTIKQVhQS0JsaW0wenZjK2dSR0UxV0t5VVJIdUZFNUdpN29OT0o1eTFsS0NuKzhwdThmQTJkcVdTc2xZcFBaVXhsbVBDZGlLWVpOcEd2dQovOVJPdXRXMDRvNUlXZ0FaQ2ZFRjJjNlJzZmZyNlRsUDltOEVRNXBWOVQ0RkZMMi9zMW0wMkk0emhLT1FVcXF6QXBWZytReE1hUG51CjFSY04rSEZYdFNYa0tlNWxYYS9SN2p3WEMxcER4YVdHNmlTZTRnVUgzRFJDRXBIV09YU3VURUdDMi9LbVNOR3ptL016cXZPbXdNVk8KOWZTZGRtUG1Bc1lpUzhHVlAxQmtMRlRsdHZBOEtjOVhBZ01CQUFHalFqQkFNQjBHQTFVZERnUVdCQlJVWW5CajhYV0VRMWlPMFJZZwpzY2FzR3J6MmlUQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DCkFnRUFLYnFTU2FldDhQRnd3K1NYOEorcEpkVnJualQrNWhwazlqcHJVcklRZUJxZlROcUsydXdjTjFMZ1FrdjdiSGJLSkFzNUVoV2QKbnhFdC9IbGszT0RnOWQzZ1Y4bWxzblp3VUtUK3R3cHcxYUEwOFhYWFRVbTZFZEd6Mk95Qy8rc094TDlrTFgxamJoZDQ3RjE4aU1qcgpqbGQyMlZrRStyeFNIMFdzOEhxQTdPeHZkcTZSMnhDT0JOeVMzNkQyNXE1SjA4RnNFaHZNS2FyNUNLWGlOeFRLc2JobTd4cUM1UEQ0CjhhY1dhYmZicVdFOG4vVXh5K1FBUnNJdmRMR3gxNEh1cUNhVnZJaXZURFVIS2dMS2VCUnRSeXRBVnVuTEttQ2had09nem95OHNISm4KeERITzJ6VGxKUU5nSlh0eG1PVEFHeXRmZEVMU1M4VlpDQWVIdnNYRGYrZVcyZUhjS0pmV2p3WGo5WnRPeWgxUVJ3VlRzTW81NTRXZwppY0VGT3dFMzB6OUo0bmZySThpSVpqczlPWFloUnZIc1h5TzQ2NkptZFhUQlFQZllhSnFUNGkycExyMGNveDdJZE1ha0xYb2dxenU0CnNFYjliOTFmVWxWMVl2Q1hvSHpYT1AwbDM4MmdteERQaTdnNFhsN0Z0S1lDTnFFZVh4elA0cGFkS2FyOW1LNVM0Zk5CVXZ1cExuS1cKbnlmanFuTjkrQm9qWm5zN3EyV3dNZ0ZMRlQ0OW9rOE1LeldpeHRsbkVqVXd6WFl1RnJPWm5rMVBUaTA3TkVQaG1nNE5wR2FYdXRJYwpTa3dzS291TGdVOXhHcW5kWEh0N0NNVUFEVGRBNDN4N1ZGOHZoVjkyOXZlbnNCeFhWc0Z5NksyaXI0MHpTYm9maXR6bWRIeGdobStICmwzcz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKSVNSRyBSb290IFgyCj09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0d6Q0NBYUdnQXdJQkFnSVFRZEtkMFhMcTdxZUF3U3hzNlMrSFVqQUtCZ2dxaGtqT1BRUURBekJQTVFzd0NRWURWUVFHRXdKVgpVekVwTUNjR0ExVUVDaE1nU1c1MFpYSnVaWFFnVTJWamRYSnBkSGtnVW1WelpXRnlZMmdnUjNKdmRYQXhGVEFUQmdOVkJBTVRERWxUClVrY2dVbTl2ZENCWU1qQWVGdzB5TURBNU1EUXdNREF3TURCYUZ3MDBNREE1TVRjeE5qQXdNREJhTUU4eEN6QUpCZ05WQkFZVEFsVlQKTVNrd0p3WURWUVFLRXlCSmJuUmxjbTVsZENCVFpXTjFjbWwwZVNCU1pYTmxZWEpqYUNCSGNtOTFjREVWTUJNR0ExVUVBeE1NU1ZOUwpSeUJTYjI5MElGZ3lNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRXpadlZuNENEQ3V3SlN2TVdTajVjejNlczNtY0ZEUjBICnR0d1crMXFMRk52aWNXREV1a1dWRVltTzZnYmY5eW9XSEtTNXhjVXk0QVBnSG9JWU9JdlhSZGdLYW03bUFIZjdBbEY5SXRnS2JwcGIKZDkvdytrSHNPZHgxeW1nSERCL3FvMEl3UURBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVgpIUTRFRmdRVWZFS1dydDVMU0R2Nmt2aWVqTTl0aTZseU41VXdDZ1lJS29aSXpqMEVBd01EYUFBd1pRSXdlM2xPUmxDRXdrU0hSaHRGCmNQOVltZDcwL2FUU1ZhWWdMWFRXTkx4Qm8xQmZBU2RXdEw0bmRRYXZFaTUxbUkzOEFqRUFpL1YzYk5USVphcmdDeXp1Rkowbk42VDUKVTZWUjVDbUQxL2lRTVZ0Q253cjEvcTRBYU9lTVNRKzJiMXRiRmZMbgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpIaVBLSSBSb290IENBIC0gRzEKPT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYWpDQ0ExS2dBd0lCQWdJUUxkMnN6bUtYbEtGRDZMRE5kbXBlWURBTkJna3Foa2lHOXcwQkFRc0ZBREJQTVFzd0NRWURWUVFHCkV3SlVWekVqTUNFR0ExVUVDZ3dhUTJoMWJtZG9kMkVnVkdWc1pXTnZiU0JEYnk0c0lFeDBaQzR4R3pBWkJnTlZCQU1NRWtocFVFdEoKSUZKdmIzUWdRMEVnTFNCSE1UQWVGdzB4T1RBeU1qSXdPVFEyTURSYUZ3MHpOekV5TXpFeE5UVTVOVGxhTUU4eEN6QUpCZ05WQkFZVApBbFJYTVNNd0lRWURWUVFLREJwRGFIVnVaMmgzWVNCVVpXeGxZMjl0SUVOdkxpd2dUSFJrTGpFYk1Ca0dBMVVFQXd3U1NHbFFTMGtnClVtOXZkQ0JEUVNBdElFY3hNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQTlCNS9Vbk15REhQa3ZSTjAKbzlRd3FOQ3VTOWkyMzNWSFp2Ujg1emtFSG1wd0lOSmFSM0puVmZTbDZKM1ZIaUdoOEdlNnpDRm92a1JUdjQzNTR0d3ZWY2czUHgrawp3Snl6NUhkY29FYitkL29hb0RqcTdacHkzaXU5bEZjNnV1eDU1MTk5UW1RNWVpWTI5eVR3MVMrNmxaZ1JacTJYTmRaMUFZRGdyL1NFCllZd05IbDk4aDVaZVFhL3JoK3I0WGZFdWlBVStUQ0s3Mmg4cTNWSkdaRG56UXM3Wm5neXpzSGVYWkp6QTlLTXVINVVIc0JmZk1Oc0EKR0paTW9ZRkwzUVJ0VTZNOS9BZXMxTVUzZ3V2a2xRZ1pLSUxTUWpxajJGUHNlWWxnU0dESWNwSlEzQU9QZ3oreVFsZGEyMnJwRVpmZApoU2k4TUV5cjQ4S3hSVVJISCtDS0ZnZVcwaUVQVThEdHFYN1VUdXliQ2V5dlFxd3cxci9SRUVYZ3BoYXlwY1hUVDNPVU0zRUNvV3FqCjFqT1hUeUZqSGx1UDJjRmVSWEYzRDRGZFh5R2FyWVBNK2w3V2pTTmZHejFCcnlCMVpscEs5cC83cXhqM2NjQzJIVEhzT3lEcnkrSzQKOWE2U3N2ZmhoRXZ5b3ZLVG1pS2UweFJ2TmxTOUgxNVpGYmx6cU1GOGIzdGk2UlpzUjFwbDh3NFJtMGJaL1czYzFwekF0SDJsc04wLwpWbStoK2Zia0VrajlCbjhTVjdhcEkwOWJBOFBnY1NvanQvZXdzVHU4bUwzV21LZ01hL2FPRW1lbThySlk1QUlKRXp5cHV4QzAwakJGCjhlejNBQkhmWmZqY0swTlZ2eGFYeEEvVkxHR0VxbktHL3VZNmZzSS9mZTc4THhRKzVvWGRVRyszU2UwQ0F3RUFBYU5DTUVBd0R3WUQKVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVU4bmNYK2w2by92WTljZFZvdXNsR0REallyN0F3RGdZRFZSMFBBUUgvQkFRRApBZ0dHTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFCUVVmQjEzSEFFNC8rcWRkUnhvc3VlajZpcDA2OTF4MVRQT2h3RW1TS3N4QkhpCjd6TktwaU1kRGcxSDJEZkhiNjgwZjArQmF6VlA2WEtsTWVKNDUvZE9sQmhiUUgzUGF5RlVodWFWZXZ2R3l1cWNTRTVYQ1YwdnJQU2wKdEpjeldOV3NlYW5NWC9tRitsTEZqZmlSRk9zNkRSZlFVc0o3NDhKemprWjRCamdzNkZ6YVpzVDBwUEJXR1RNcFdtV1NCVWRHU3F1RQp3eDRub1I4Umtwa25kWk1QdkRZN2wxZVBKbHNNdTV3UDFHNHdCOVRjWHpab1pqbURsaWNtaXNqRU9mNmFJVy9WY29icGYyTGxsMDdRCkpOQkFzTkIxQ0k2OWFPNEkxMjU4RUhCR0czemdpTEtlY29hWkFlTy9uMGtadENXK1ZtV3VGMlBsSHQvby8wZWx2K0VtQllUa3NNQ3YKNXdpWnFBeGVKb0JGMVBob0w1YVBydUpLSEp3V0RCTnZPSWYydThnMFg1SURVWGx3cHQvTDlabE5lYzFPdkZlZlEwNXJMaXNZK0dwegpqTHJGTmU4NWFrRWV6M0dvb3JLR0IxczZ5ZUh2UDJVRWdFY3lSSENWVGpGbmFuUmJFRVYxNnJDZjBPWTEvazZmaTh3cmtrVmJiaVZnCmhVYk4wYXF3ZG1hVGQ1YStnNzQ0dGlST0pndk03WHBXR3VEcFdzWmtyVXg2QUVoRUw3bEF1eE0rdmhWNG5ZV0JTaXBYM3RVWlE5cmIKeWx0SGhvTUxQN1lOZG5oemVTSmVzWUFmejc3UlAxWVFtQ3VWaDZFZm5XUVVZRGtzc3dCVkx1VDFzdzVYeEpGQkFKdy82S1hmNnZiLwp5UEN0YlZLb0Y2dWJZZndTVVRYa0pmMnZxbXFHT1E9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQKPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlCM0RDQ0FZT2dBd0lCQWdJTkFnUGxmdlUvay8ybENTR3lwakFLQmdncWhrak9QUVFEQWpCUU1TUXdJZ1lEVlFRTEV4dEhiRzlpCllXeFRhV2R1SUVWRFF5QlNiMjkwSUVOQklDMGdValF4RXpBUkJnTlZCQW9UQ2tkc2IySmhiRk5wWjI0eEV6QVJCZ05WQkFNVENrZHMKYjJKaGJGTnBaMjR3SGhjTk1USXhNVEV6TURBd01EQXdXaGNOTXpnd01URTVNRE14TkRBM1dqQlFNU1F3SWdZRFZRUUxFeHRIYkc5aQpZV3hUYVdkdUlFVkRReUJTYjI5MElFTkJJQzBnVWpReEV6QVJCZ05WQkFvVENrZHNiMkpoYkZOcFoyNHhFekFSQmdOVkJBTVRDa2RzCmIySmhiRk5wWjI0d1dUQVRCZ2NxaGtqT1BRSUJCZ2dxaGtqT1BRTUJCd05DQUFTNHhublRqMndsRHA4dU9Sa2NBNlN1bXVVNUJ3a1cKeW1PeHVZYjRpbGZCVjg1QytuT2g5MlZDL3g3QkFMSnVjdzcveHlIbEdLU3EyWEUvcU5TNXpvd2RvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQVlZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVVZMQjdyVVc0NGtCLyt3cHUrNzR6eVR5amhOVXdDZ1lJCktvWkl6ajBFQXdJRFJ3QXdSQUlnSWs5MGNybGdyL0htbktBV0JWQmZ3MTQ3Ym1GMDc3NEJ4TDRZU0ZsaGdqSUNJQ2FkVkdOQTNqZGcKVU0vSTJPMmRncTQzbUx5amoweE1xVFFyYk8vN2xac20KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR1RTIFJvb3QgUjEKPT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZWekNDQXorZ0F3SUJBZ0lOQWdQbGsyOHhzQk5KaUd1aUZ6QU5CZ2txaGtpRzl3MEJBUXdGQURCSE1Rc3dDUVlEVlFRR0V3SlYKVXpFaU1DQUdBMVVFQ2hNWlIyOXZaMnhsSUZSeWRYTjBJRk5sY25acFkyVnpJRXhNUXpFVU1CSUdBMVVFQXhNTFIxUlRJRkp2YjNRZwpVakV3SGhjTk1UWXdOakl5TURBd01EQXdXaGNOTXpZd05qSXlNREF3TURBd1dqQkhNUXN3Q1FZRFZRUUdFd0pWVXpFaU1DQUdBMVVFCkNoTVpSMjl2WjJ4bElGUnlkWE4wSUZObGNuWnBZMlZ6SUV4TVF6RVVNQklHQTFVRUF4TUxSMVJUSUZKdmIzUWdVakV3Z2dJaU1BMEcKQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUMyRVFLTEh1T2hkNXM3M0wrVVByZVZwMEE4b2YyQytYMHlCb0p4OXZhTQpmL3ZvMjd4cUxwZVhvNHhMK1N2MnNmbk9oQjJ4K2NXWDN1KzU4cVBwdkJLSlhxZXFVcXY0SXlmTHBMR2NZOXZYbVg3d0NsN3JhS2IwCnhscEhEVTBRTStOT3NST2p5QmhzUyt6OENaRGZuV1FwSlNNSG9iVFNQUzVnNE0vU0NZZTd6VWp3VGNMQ2VvaUt1N3JQV1JuV3I0K3cKQjdDZU1mR0N3Y0RmTHFadGJCa090ZGgrSmhwRkF6MndlYVNVS0swUGZ5YmxxQWorbHVnOGFKUlQ3b002aUNzVmxnbXk0SHFNTG5YVwpuT3VuVm1TUGxrOW9yajJYd29TUHdMeEF3QXRjdmZhSHN6VnNyQmhRZjRUZ1RNMlMweURwTTd4U21hOHl0U216SlNxMFNQbHk0Y3BrCjkrYUNFSTNvbmNLS2lQbzRab3I4WS9rQitYajllMXgzK25hSCt1emZzUTU1bFZlMHZTYnYxZ0hSNnhZS3U0NEx0Y1hGaWxXcjA2enEKa1VzcHpCbWtNaVZPS3ZGbFJOQUN6cXJPU2JUcW4zeURzRUI3NTBPcnAyeWpqMzJKZ2ZwTXBmL1Zqc1BPUytDMTJMT09SYzkyd08xQQpLLzFURDdDbjFUc05zWXFpQTk0eHJjeDM2bTk3UHRiZmtTSVM1cjc2MkRMOEVHTVVVWExlWGRZV2s3MHBhRFB2T21ic0I0b20zeFBYClYyVjRKOTVlU1JRQW9nQi9tcWdodHFteGxiQ2x1UTBXRWRySGJFZzhRT0IrRFZyTlZqelJsd1c1eTB2dE9VdWN4RC9TVlJOdUpMRFcKY2ZyMHdick03UnYxL29GQjJBQ1lQVHJJcm5xWU54Z0ZsUUlEQVFBQm8wSXdRREFPQmdOVkhROEJBZjhFQkFNQ0FZWXdEd1lEVlIwVApBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVNUs4ckpuRWFLMGduaFM5U1ppenY4SWtUY1Q0d0RRWUpLb1pJaHZjTkFRRU1CUUFECmdnSUJBSitxUWliYkM1dSsveDZXa2k0K29tVkthcGk2SXN0OXdUcllnZ29HeHZhbDNzQk9oMlo1b2ZtbVdKeXErYlhtWU9mZzZMRWUKUWtFekN6Yzl6b2x3RmNxMUpLalBhN1hTUUNHWXp5STB6enZGSW9UZ3hRNktmRjJJNURVa3pwcytHbFFlYnR1eWg2Zjg4L3FCVlJSaQpDbG1wSWdVeFBvTFc3dHRYTkx3emxkTVhHK2dub290N1RpWWFlbHBrdHRHc04vSDlvUE00N0hMd0VYV2R5elJTamVaMmF4ZkczNGFyCko0NUpLM1ZtZ1JBaHB1bys5SzRsLzN3VjNzNk1KVC9LWW5BSzl5OEpaZ2ZJUHh6ODhOdEZNTjlpaU1HMUQ1M0RuMHJlV1ZsSHhZY2kKTnVhQ3ArMEt1ZUlIb0kxN2VrbzhjZExpQTZFZk1nZmRHK1JDemd3QVJXR0F0UXNnV1NsNHZmbFZ5MlBGUEV6MHR2L2JhbDh4YTVtZQpMTUZyVUtUWDVoZ1V2WVUvWjZ0R242RC9RcWM2ZjF6TFhiQndIU3MwOWRSMkNRenJlRXhaQmZNelFzTmhGUkFiZDAzT0lvelVoZkpGCmZiZFQ2dTlBV3BRS1hDQmZUa0JkWWlKMjMvL09ZYjJNSTNqU053TGdqdDdSRVRlSjlyL3RTUWRpcnBMc1FCcXZGQW5aMEU2eW92ZSsKN3U3WS85d2FMZDY0Tm5IaS9IbTNsQ1hSU0hOYm9UWG5zNWxuZGNFWk9pdEhUdE5DanYweHlCWm0ydElNUE51empzbWhEWUFQZXhaMwpGTC8vMndtVXNwTzhJRmdWNmR0eFEvUGVFTU1BM0tncWxiYkMxaitRYTNiYmJQNk12UEp3TlF6Y21SazEzTmZJUm1QVk5uR3VWL3UzCmdtM2MKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR1RTIFJvb3QgUjIKPT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZWekNDQXorZ0F3SUJBZ0lOQWdQbHJzV05CQ1VhcXhFbHFqQU5CZ2txaGtpRzl3MEJBUXdGQURCSE1Rc3dDUVlEVlFRR0V3SlYKVXpFaU1DQUdBMVVFQ2hNWlIyOXZaMnhsSUZSeWRYTjBJRk5sY25acFkyVnpJRXhNUXpFVU1CSUdBMVVFQXhNTFIxUlRJRkp2YjNRZwpVakl3SGhjTk1UWXdOakl5TURBd01EQXdXaGNOTXpZd05qSXlNREF3TURBd1dqQkhNUXN3Q1FZRFZRUUdFd0pWVXpFaU1DQUdBMVVFCkNoTVpSMjl2WjJ4bElGUnlkWE4wSUZObGNuWnBZMlZ6SUV4TVF6RVVNQklHQTFVRUF4TUxSMVJUSUZKdmIzUWdVakl3Z2dJaU1BMEcKQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURPM3YybSsrenNGRFE4QndaYWJGbjNHVFhkOThHZFZhclR6VHVrazNMdgpDdnB0bmZid2hZQmJvVWhTbnpuRnQrNG9yTy9MZG1nVXVkK3RBV3laSDhRaUhaLytjbmZnTEZ1djVBUy9UM0tnR2pTWTZEbG83SlVsCmUzYWg1bW01aFJtOWlZeityZTAyNm5POC80UGl5MzNCMHM1S3M0MEZub3RKazkvQlc5QnVYdkF1TUM2Qy9QcTh0QmNLU09XSW04V2IKYTk2d3lyUUQ4TnIwa0xobFpQZGNUSzNvZm1aZW1kZTR3ajdJMEJPZHJlN2tSWHVKVmZlS0gySlNoQkt6d2tDWDQ0b2ZSNUdtZEZyUworTEZqS0JDNHN3bTRWbmRBb2lhWWVjYiszeVh1UHVXZ2Y5UmhEMUZMUEQrTTJ1RndkTmpDYUtINXdRenBvZUovdTFVOGRnYnVhazdNCmtvZ3dUWnE5VHd0SW1vUzFtS1BWKzNQQlYySGRLRloxRTY2SGp1Y01VUWtRZFloTXZJMzVlenpVSWtnZkt0enJhN3RFc2NzemNUSkcKcjYxSzhZem9kRHFzNXhvaWM0RFNNUGNsUXNjaU96c1NyWll1eHNOMkI2b2d0elZKVittU1NlaDJGbkl4Wnl1V2ZvcWp4NVJXSXI5cQpTMzRCSWJJak10L2tta1J0V1Z0ZDlRQ2dISnZHZUplTmtQK2J5S3EwcnhGUk9WN1orMmV0MVZzUm5US2FHNzNWdWx1bHljc2xhVk5WCkoxemd5amJMaUdIN0hyZlF5KzRXKzlPbVRONlNwZFRpMy9VR1ZONHVuVXUwa3pDcWdjN2RHdHhSY3cxUGNPbmx0aFloR1hteTVva0wKZFdUSzFhdThDY0VZb2YvVVZLR0ZQUDBVSkFPeWg5T2t0d0lEQVFBQm8wSXdRREFPQmdOVkhROEJBZjhFQkFNQ0FZWXdEd1lEVlIwVApBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVdS8vS2ppT2ZUNW5LMitKb3BxVVZKeGNlMlE0d0RRWUpLb1pJaHZjTkFRRU1CUUFECmdnSUJBQi9LenQzSHZxR2YyU2RNQzl3WG1CRnFpTjQ5NW5GV2NyS2VHazZjMVN1WUpGMmJhM3V3TTRJSnZkOGxSdXFZbnJZYi9vTTgKMG1KaHdRVHR6dURGeWNnVEUxWG5xR090akhzQi9uY3c0YzVvbXdYNEV1NTVNYUJCUlRVb0NuR2tKRStNM0R5Q0IxOW0zSDBRL2d4aApzd1dWN3VHdWdRK28rTWVQVGFnakFpWnJIWU5TVmM2MUx3REtnRURnNFhTc1lQV0hnSjJ1Tm1TUlhiQm9HT3FLWWNsM3FKZkV5Y2VsCi9GVkw4L0IvdVdVOUoyalF6R3Y2VTUzaGtSckpYUnFXYlRLSDdRTWd5QUxPV3I3WjZ2MnlUY1F2Rzk5ZmV2WDRpOGJ1TVRvbFVWVm4KaldReWUrbWV3NEs2S2kzcEhyVGdTQWFpL0dldkh5SUNjL3NnQ3ErZFZFdWh6ZjlnUjdBL1hlOGJWcjJYSVpZdEN0RmVuVGdDUjJ5NQo5UFlqSmJpZ2Fwb3Jkd2o2eExFb2tDWllDRHppZnFyWFBXKzZNWWdLQmVzbnRhRko3cUJGVkh2bUoyV1pJQ0dvbzd6N0dKYTdVbThNCjdZTlJUT2xaNGlCZ3hjSmxrb0tNOHhBZkRvcVh2bmVDYlQrUEhWMjhTU2U5ekU4UDRjNTJoZ1FqeGNDTUVsdjkyNFNnSlBGSS8yUjgKMEw1Y0Z0SHZtYTNBSC92THJydzRJZ1ltWk5yYWx3NC9LQlZFcUU4QXl2Q2F6TTkwYXJRK1BPdVY3TFhUV3RpQm1lbERHRGZyczd2UgpXR0pCODJiU2o2cDRsVlFndzFvdWRDdlYwYjRZYWNDczFhVFBPYnBSaEFObDZXTEFZdjdZVFZXVzR0QVIra2cwRWV5ZTdRVWQ1TWpXCkhZYkwKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR1RTIFJvb3QgUjMKPT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNDVENDQVk2Z0F3SUJBZ0lOQWdQbHVJTHJJUGdsSjIwOVpqQUtCZ2dxaGtqT1BRUURBekJITVFzd0NRWURWUVFHRXdKVlV6RWkKTUNBR0ExVUVDaE1aUjI5dloyeGxJRlJ5ZFhOMElGTmxjblpwWTJWeklFeE1RekVVTUJJR0ExVUVBeE1MUjFSVElGSnZiM1FnVWpNdwpIaGNOTVRZd05qSXlNREF3TURBd1doY05Nell3TmpJeU1EQXdNREF3V2pCSE1Rc3dDUVlEVlFRR0V3SlZVekVpTUNBR0ExVUVDaE1aClIyOXZaMnhsSUZSeWRYTjBJRk5sY25acFkyVnpJRXhNUXpFVU1CSUdBMVVFQXhNTFIxUlRJRkp2YjNRZ1VqTXdkakFRQmdjcWhrak8KUFFJQkJnVXJnUVFBSWdOaUFBUWZUek9ITXltS29ZVGV5OGNoV0VHSjZsYWRLMHVGeGgxTUo3eC9KbEZ5YitLZjFxUEt6RVVVUm91dAo3MzZHak95eGZpLy9xWEdkR0lSRkJFRlZiaXZxSm4rN2tBSGpTeG02NUZTV1JRbXgxV3lSUksyRUU0NmFqQTJBRERMMjRDZWpRakJBCk1BNEdBMVVkRHdFQi93UUVBd0lCaGpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJUQjhTYTZvQzJ1aFlIUDAvRXEKRXIyNENtZjl2REFLQmdncWhrak9QUVFEQXdOcEFEQm1BakVBOXVFZ2xSUjdWS09RRmhHL2hNanFiMnNYbmg1R21DQ2JuOU1OMmF6VApMODE4K0ZzdVZidS8zWkwzcEF6Y01lR2lBakVBL0pkbVp1VkRGaE9EM2NmZkw3NFVPTzBCenJFWEdoRjE2YjBEanlaK2hPWEpZS2FWCjExUlp0K2NSTEluVXVlNFgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR1RTIFJvb3QgUjQKPT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNDVENDQVk2Z0F3SUJBZ0lOQWdQbHdHanZZeHFjY3BCUVVqQUtCZ2dxaGtqT1BRUURBekJITVFzd0NRWURWUVFHRXdKVlV6RWkKTUNBR0ExVUVDaE1aUjI5dloyeGxJRlJ5ZFhOMElGTmxjblpwWTJWeklFeE1RekVVTUJJR0ExVUVBeE1MUjFSVElGSnZiM1FnVWpRdwpIaGNOTVRZd05qSXlNREF3TURBd1doY05Nell3TmpJeU1EQXdNREF3V2pCSE1Rc3dDUVlEVlFRR0V3SlZVekVpTUNBR0ExVUVDaE1aClIyOXZaMnhsSUZSeWRYTjBJRk5sY25acFkyVnpJRXhNUXpFVU1CSUdBMVVFQXhNTFIxUlRJRkp2YjNRZ1VqUXdkakFRQmdjcWhrak8KUFFJQkJnVXJnUVFBSWdOaUFBVHpkSE9uYUl0Z3JrTzROY1dCTUh0TFNaMzd3V0hPNXQ1R3ZXdlZZUmcxcmtEZGMvZUprVEJhNnp6dQpoWHlpUUhZN3FjYTRSOWdxNTVLUmFuUHBzWEk1bnltZm9walRYMTVZaG1VUG9ZUmxCdEhjaThuSGM4aU1haS9seEt2UkhZcWpRakJBCk1BNEdBMVVkRHdFQi93UUVBd0lCaGpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJTQVROYnJkUDlKTnFQVjJQeTEKUHNWcThKUWRqREFLQmdncWhrak9QUVFEQXdOcEFEQm1BakVBNkVEL2c5NEQ5Sit1SFhxbkxybXZUL2FESFE0dGhRRWQwZGxxN0EvQwpyOGRlVmw1YzFSeFlJaWdMOXpDMkw3RjhBakVBOEdFOHAvU2dndU1oMVlRZGM0YWNMYS9LTkp2eG43a2pOdUs4WUFPZGdMT2FWc2poCjRyc1VlY3JOSWRTVXRVbEQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVGVsaWEgUm9vdCBDQSB2Mgo9PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGZERDQ0ExeWdBd0lCQWdJUEFXZGZKOWIrZXVQa3JMNEpXd1dlTUEwR0NTcUdTSWIzRFFFQkN3VUFNRVF4Q3pBSkJnTlZCQVlUCkFrWkpNUm93R0FZRFZRUUtEQkZVWld4cFlTQkdhVzVzWVc1a0lFOTVhakVaTUJjR0ExVUVBd3dRVkdWc2FXRWdVbTl2ZENCRFFTQjIKTWpBZUZ3MHhPREV4TWpreE1UVTFOVFJhRncwME16RXhNamt4TVRVMU5UUmFNRVF4Q3pBSkJnTlZCQVlUQWtaSk1Sb3dHQVlEVlFRSwpEQkZVWld4cFlTQkdhVzVzWVc1a0lFOTVhakVaTUJjR0ExVUVBd3dRVkdWc2FXRWdVbTl2ZENCRFFTQjJNakNDQWlJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTExRUHdlODRudlFhNW40NG5kcDU4NmRwQU84Z20yaC9vRmxIMHduckk0QXVoWjcKNnpCcUFNQ3pkR2grc3EvSDFXS3plajlReW93MlJDUmowamJwRElYMlEzYlZUS0ZnY21maUtET2x5ekc0T2lJak5MaDl2VllpUUozcQo5SHNEcldqOHNvRlBtTkIwNm8zbGZjMWp3NlAyM3BMQ1dCbmdscnZGeEtrOXBYU1cvcS81aWFxOWxSZFUySGhFOFF4M0ZaTGdtRUtuCnBOYXFJSkxOd2FDemxySTZoRUtOZmRXVjVOYmI2V0xFV0xONXhZelROVE9EbjNXaFVpZGhPUEZaUFk1UTRMMTVQT2RzbHY1ZTJRSmwKdEk1YzBCRTAzMTIvVXFlQkFNTi9tVVdaRmRVWHlBcFQ3R1B6bVgzTWFSS0d3aGZ3QVo2L2hMelJVc3Nia21iT3BGUGxvYi9FMnduVwo1b2xXSzhqamZON2ovNG5sTlc0bzZHd0xJMUdwSlFYclNQamRzY3I2YkFoUjc3Y1liRVRLSnVGenhva0dnZVdLckxEaUtjYTVKTE5yClJCSDBwVVBDVEVQbGNEYU10ak5YZXBVdWdxRDBYQkN6WVlQMkFnV0dMbnd0Yk53RFJtNDFrOVY2bFMvZUlOaGJmcFNRQkdxNldUMEUKQlhXZE42SU9MajNyd2FSU2cvN1FhOVJtanR6RzZSSk9IU3BYcWhDOGZGNkNmYWFteWZJdHVmVVhKNjNSRG9sVUs1WDZ3SzBkbUJSNApNMEtHQ3FsenRmdDBEYmNiTUJuRVdnNGNKN2ZhR05EL2lzZ0Z1dkdxSEtJM3QrWklwRVlzbE9xb2RtSkhpeEJUQjBoWGJPS1NUYmF1CkJjdmN3VXBlajZ3OUdVN0M3V0IxSzl2QnlrTFZBZ01CQUFHall6QmhNQjhHQTFVZEl3UVlNQmFBRkhLczVETjVxa1dIOXYyc0haN1cKeHkrRzJDUTVNQjBHQTFVZERnUVdCQlJ5ck9RemVhcEZoL2I5ckIyZTFzY3ZodGdrT1RBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRApWUjBUQVFIL0JBVXdBd0VCL3pBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQW9EdFpwd21VUGphRTBuNHZPYVdXbC9vUnJmeG44M0VKCjhyS0poR2RFcjdudjdaYnNuR1RiTWpCdlo1cXNmbCt5cXdFMmZvSDY1SVJlMHF3MjRHdGl4WDFMRG9KdDBuWmkwZjZYK0o4d2ZCajUKdEZKM2doMTIyOU1kcWZEQm1nQzliWFhZZmVmNnh6aWpuSERvUm5rRHJ5NTAyM1g0YmxNTUE4aVpHb2sxR1R6VHlWUjhxUEFzNW00SAplVzlxNGVicWtZSnBDaDNEZmxtaW5tdEdGWmhiMDY5R0hXTEl6b0JTU1JFL3lRUVN3eE44UHp1S2x0czhvQjRLdEl0VXNpUm5EZStDCnk3NDhmZEhpZjY0VzFsWll1ZG9nc1lNVm9lK0tUVEp2UVM4VFVvS1UxeHJCZUtKUjNTdHdiYmNhK2ZldzRHZVhWdHQ4WVZNSkF5Z0MKUU1lejJQMmNjR3JHS01PRjZlTHRHcE9nM2t1WW9vUStCWGNCbGozN3RDQVBuSElDZWhJdjFhTzZVWGl2S2l0RVpVNjEvUXJvd2MxNQpoMkVyM29CWFJiOW44WnVSWHFXazdGbElFQTA0eDdENncwUnRCUFY0VUJ5U2xsdmE5Ymd1dWx2UDVmQnFuVXN2V0hNdFR5M0VIRDcwCnN6K3JGUTQ3R1VHS3BNRlhFbVp4VFBwVDQxZnJZcFVKbmxUZDBjSThWenk5T0syWVpMZTRBNXBUVm1CZHM5aENHMXhMRW9vYzYrdDkKeG5wcHh5ZC9wUGlMOHVTVVpvZEw2WlFIQ1JKNWlyTHJkQVRjenZSRVdlQVd5c1VzV05jOGU4OWlobXBRZlRVMlpxZjdOK2NveDlqUQpyYVZwbEkvb3dkOGsrQnNITVllQjJGMzI2Q2pZU2xLQXJCUHVVQlFlbU1jPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpELVRSVVNUIEJSIFJvb3QgQ0EgMSAyMDIwCj09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMyekNDQW1DZ0F3SUJBZ0lRZk1tUEs0VFgzK29QeVdXYTAwdE5sakFLQmdncWhrak9QUVFEQXpCSU1Rc3dDUVlEVlFRR0V3SkUKUlRFVk1CTUdBMVVFQ2hNTVJDMVVjblZ6ZENCSGJXSklNU0l3SUFZRFZRUURFeGxFTFZSU1ZWTlVJRUpTSUZKdmIzUWdRMEVnTVNBeQpNREl3TUI0WERUSXdNREl4TVRBNU5EVXdNRm9YRFRNMU1ESXhNVEE1TkRRMU9Wb3dTREVMTUFrR0ExVUVCaE1DUkVVeEZUQVRCZ05WCkJBb1RERVF0VkhKMWMzUWdSMjFpU0RFaU1DQUdBMVVFQXhNWlJDMVVVbFZUVkNCQ1VpQlNiMjkwSUVOQklERWdNakF5TURCMk1CQUcKQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQk1iTHh5alIrNFQxbXU5Q0ZDRGhRMnR1ZGEzOEt3T0UxSGFUSmRkWk8wRmxheDdtTkNxNwpkUFlTenVodDU2dmtQRTQvUkFpTHpSWnh5NytTbWZTazF6eFFWRktRaFlONGxHZG5veHdKR1QxMU5JWGU3V0I5eHd5MFFWSzVidVh1ClFxT0NBUTB3Z2dFSk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZIT1JFS3YvVmJOYWZBa2wxYks2Q0tCcnF4OXQKTUE0R0ExVWREd0VCL3dRRUF3SUJCakNCeGdZRFZSMGZCSUcrTUlHN01ENmdQS0E2aGpob2RIUndPaTh2WTNKc0xtUXRkSEoxYzNRdQpibVYwTDJOeWJDOWtMWFJ5ZFhOMFgySnlYM0p2YjNSZlkyRmZNVjh5TURJd0xtTnliREI1b0hlZ2RZWnpiR1JoY0RvdkwyUnBjbVZqCmRHOXllUzVrTFhSeWRYTjBMbTVsZEM5RFRqMUVMVlJTVlZOVUpUSXdRbElsTWpCU2IyOTBKVEl3UTBFbE1qQXhKVEl3TWpBeU1DeFAKUFVRdFZISjFjM1FsTWpCSGJXSklMRU05UkVVL1kyVnlkR2xtYVdOaGRHVnlaWFp2WTJGMGFXOXViR2x6ZERBS0JnZ3Foa2pPUFFRRApBd05wQURCbUFqRUFsSkF0RS9yaFkvaGhZK2l0aFhoVWtaeTRremcrR2tIYVFCWlRRZ2pLTDQ3eFBvRld3S3JZN1JqRXNLNzBQdm9tCkFqRUE4eWppeHRzcm1mdTNVYmdrbzZTVWVoby81amJpQTFjemlqRExnc2ZXRkJIVmRXTmJGSldjSHdIUDJOVnlwdzg3Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkQtVFJVU1QgRVYgUm9vdCBDQSAxIDIwMjAKPT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQzJ6Q0NBbUNnQXdJQkFnSVFYd0pCMTNxSGZFd0RvNnlXamZ2LzBEQUtCZ2dxaGtqT1BRUURBekJJTVFzd0NRWURWUVFHRXdKRQpSVEVWTUJNR0ExVUVDaE1NUkMxVWNuVnpkQ0JIYldKSU1TSXdJQVlEVlFRREV4bEVMVlJTVlZOVUlFVldJRkp2YjNRZ1EwRWdNU0F5Ck1ESXdNQjRYRFRJd01ESXhNVEV3TURBd01Gb1hEVE0xTURJeE1UQTVOVGsxT1Zvd1NERUxNQWtHQTFVRUJoTUNSRVV4RlRBVEJnTlYKQkFvVERFUXRWSEoxYzNRZ1IyMWlTREVpTUNBR0ExVUVBeE1aUkMxVVVsVlRWQ0JGVmlCU2IyOTBJRU5CSURFZ01qQXlNREIyTUJBRwpCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCUEVMM1laRElCbmZsNFhvSWtxYno1Mll2N1FGSnNuTDQ2YlNqOFdlZUhzeGlhbUpyU2M4ClpSQ0MvTi9EblU3d015UEUwakwxSExEZk14ZGR4ZkN4aXZudnViY1V5aWxLd2crcGYzVmxTU293Wi9Sazk5WWFkOXJEd3BkaFFudEoKcmFPQ0FRMHdnZ0VKTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkg4UUFSWTNPcVFvNUZENHBQZnNheksyL3VtTApNQTRHQTFVZER3RUIvd1FFQXdJQkJqQ0J4Z1lEVlIwZkJJRytNSUc3TUQ2Z1BLQTZoamhvZEhSd09pOHZZM0pzTG1RdGRISjFjM1F1CmJtVjBMMk55YkM5a0xYUnlkWE4wWDJWMlgzSnZiM1JmWTJGZk1WOHlNREl3TG1OeWJEQjVvSGVnZFlaemJHUmhjRG92TDJScGNtVmoKZEc5eWVTNWtMWFJ5ZFhOMExtNWxkQzlEVGoxRUxWUlNWVk5VSlRJd1JWWWxNakJTYjI5MEpUSXdRMEVsTWpBeEpUSXdNakF5TUN4UApQVVF0VkhKMWMzUWxNakJIYldKSUxFTTlSRVUvWTJWeWRHbG1hV05oZEdWeVpYWnZZMkYwYVc5dWJHbHpkREFLQmdncWhrak9QUVFECkF3TnBBREJtQWpFQXlqekdLblhDWG5WaU9UWUFZRnFMd1pPWnpObmJRVHM3aDVrWE85WE1UOG9pOTZDQXkvbTBzUnRXOVhMUy9CblIKQWpFQWtmY3drejhRUml0eHBOQTdSSnZBS1FJRnNrRjNVZk41V3A2T0ZLQk9RdEpiZ2ZNMGFnUG5JamhRVyswWlQwTVcKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRGlnaUNlcnQgVExTIEVDQyBQMzg0IFJvb3QgRzUKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNHVENDQVorZ0F3SUJBZ0lRQ2VDVFphejMyY2k1UGh3TEJDb3U4ekFLQmdncWhrak9QUVFEQXpCT01Rc3dDUVlEVlFRR0V3SlYKVXpFWE1CVUdBMVVFQ2hNT1JHbG5hVU5sY25Rc0lFbHVZeTR4SmpBa0JnTlZCQU1USFVScFoybERaWEowSUZSTVV5QkZRME1nVURNNApOQ0JTYjI5MElFYzFNQjRYRFRJeE1ERXhOVEF3TURBd01Gb1hEVFEyTURFeE5ESXpOVGsxT1Zvd1RqRUxNQWtHQTFVRUJoTUNWVk14CkZ6QVZCZ05WQkFvVERrUnBaMmxEWlhKMExDQkpibU11TVNZd0pBWURWUVFERXgxRWFXZHBRMlZ5ZENCVVRGTWdSVU5ESUZBek9EUWcKVW05dmRDQkhOVEIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJNRkVvYzhSbDFDYTNpT0NOUWZOME1zWW5kTHhmM2MxVHp2ZApsSEpTN2NJNytPejZlMnRZSU95WnJzbjhhTE4xdWRzSjdNZ1Q5VTdHQ2gxbU1FeTdIMGNLUEdFUVFpbDhwUWdPNENMcDB6Vm96cHRqCm40UzFtVTFZb0k3MVZPZVZ5YU5DTUVBd0hRWURWUjBPQkJZRUZNRlJSVkJacXo3bkxGcjZJQ0lTQjRDSWZCRnFNQTRHQTFVZER3RUIKL3dRRUF3SUJoakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQW9HQ0NxR1NNNDlCQU1EQTJnQU1HVUNNUUNKYW8xSDUrejhibFVEMldkcwpKazZEeHYzSit5c1R2TGQ2akxSbDBtbHBZeE5qT3laUUxnR2hlUWFSblVpL3dyNENNRWZERlh1eG9KR1pTWk9vUEh6b1JnYUxMUEl4CkFKU2RZc2lKdlJtRUZPbWwrd0c0RFhaRGpDNVR5M3pmREJlV1VBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRGlnaUNlcnQgVExTIFJTQTQwOTYgUm9vdCBHNQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWmpDQ0EwNmdBd0lCQWdJUUNQbTBlS2o2ZnRwcU16ZUozbnpQaWpBTkJna3Foa2lHOXcwQkFRd0ZBREJOTVFzd0NRWURWUVFHCkV3SlZVekVYTUJVR0ExVUVDaE1PUkdsbmFVTmxjblFzSUVsdVl5NHhKVEFqQmdOVkJBTVRIRVJwWjJsRFpYSjBJRlJNVXlCU1UwRTAKTURrMklGSnZiM1FnUnpVd0hoY05NakV3TVRFMU1EQXdNREF3V2hjTk5EWXdNVEUwTWpNMU9UVTVXakJOTVFzd0NRWURWUVFHRXdKVgpVekVYTUJVR0ExVUVDaE1PUkdsbmFVTmxjblFzSUVsdVl5NHhKVEFqQmdOVkJBTVRIRVJwWjJsRFpYSjBJRlJNVXlCU1UwRTBNRGsyCklGSnZiM1FnUnpVd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUN6MFBUSmVSR2QvZnhtZ2VmTTFlUzgKN0lFK2FqV09McmZuM3EvNUIwM1BNSjNxQ1F1WnZXeFgyaGhLdUhpc09qbW9wa2lzTG5MbHZldnhHczNucEFPcFB4RzAyQytKRnZ1VQpBVDI3TC9nVEJhRjRISTRvNEVYZ2cvUlpHNVd6cm40RFJlVyt3a0wrN3ZJOHRvVVRtREtkRnFncHdnc2NPTnlmTVhkY3Z5ZWovQ2VzCnR5dTlkSnNYTGZLQjJsMnc0U01YUG9oS0VpUFE2cytkM2dNWHNVSktvQlpNcEcyVDZUODY3anA4blZpZDlFNlAvRHNqeUcyNDRnWGEKek92c3d6SDAxNmNwVklEUFJGdE1iekNlODh6ZEg1UkRuVTEvY0hBTjFEclJOL0Jzblp2QUZKTlk3ODFCT0hXOEV3T1ZmSC9qWE9uVgpEZFhpZkJCaXFtdndQWGJ6UDZQb3NNSDk3NnBYVGF5R3B4aTBLY0VzRHI5a3ZpbU0yQUl0elZ3djhuL3ZGZlFNRmF3S3NQSFREVTlxClRYZVhBYUR4WnJlM3p1L083T3lsZGNxczQrRmo5N2loQk1pOGV6OWRMUllpVnUxSVNmNm5MM2t3Slp1NmF5MC9uVHZFRitjZEx2dnkKejZiODR4UXNscGdoakxTUjZSbGdnL0l3S3daelVOV1lPd2JweDRvTVlJd28rRktiYnVIMlRic0dKSnZYS3lZLy9Tb3ZjZlhXSkw1LwpNWjRQYmVpUFQwMmpQLzgxNnQ5SlhrR1Bodm54ZDNsTEc3U2pYaS83UmdMUVpoTmVYb1ZQenRod2lIdk9BYldXbDlmTmZmMkMrTUlrCndjb0JPVStOb3NFVVFCK2NadFVNQ1ViVzh0RFJTSFpXT2tQTHRnb1JPYnFNRTJ3R3RaN1A2d0lEQVFBQm8wSXdRREFkQmdOVkhRNEUKRmdRVVVUTWM3VFpBcnhmVEpjMXBhUEt2VGlNK3MwRXdEZ1lEVlIwUEFRSC9CQVFEQWdHR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4dwpEUVlKS29aSWh2Y05BUUVNQlFBRGdnSUJBR0NtcjF0ZlY5cUoyMHRRcWNRak5TSC8wR0V3aEpHM1B4RFBKWTdKdjBZMDJjRWhKaHh3CkdYSWVvOG1IL3FsRFpKWTZ5Rk1FQ3JaQnU4UkhBTm1mR0JnN3NnN3pOT29rOTkydklHQ3VraWhmTnVkZDVON0hQTnRRT2EyN1BTaE4KbG54MnhsdjB3ZHNVcGFzWllnY1lRRitYa2R5Y3g2dTFVUTNtYVZOVnpEbDkyc1VSVlhMRk80dUorRFF0cEJmbEYrYVpmVENJSVRmTgpNQmM5dVBLOHFIV2dROXcraVV1UXJtMEQ0Qnlqb0pZSnUzMmp0eW9RUkV0R0J6Umo3VEc1Qk82am01cXU1akY0OU9va1lUdXJXR1QvCnU0Y25ZaVdCMzl5aEwvYnRwLzk2ajFFdU1QaWtBZEtGT1Y4Qm1aWnZXbHR3R1ViK2htQStyWUFRQ2QwNUpTOVlmN3ZTZFBEM1JoOUcKT1VyWVU5RHpManR4cGRSdi9QTm41QWVQM1NZWjRZMWIrcU9URVp2cHlEckRWV2lha3VGU2Rqam80YnE5KzAvVjc3UG5TSU14OElJaAo0N2ErcDZ0djc1L2ZUTThCdUdKcUl6M25DVTJBRzNzd3BNUGRCMzgwdnFRbXN2WkI2QWtkNHlDWXFqZFAvL2Z4NGlsd01VYy9kTkFVCkZ2b2hpZ0xWaWdtVWR5N3lXU2lMZkZDU0NtWjRPSU4xeExWYXFCSEc1Y0dkWmxYUFU4U3YxM1dGcVVJVFZ1d2hkNEdUV2d6cWx0bEoKeXFFSThwYzdiWnNFR0NSRWpud0I4dHdsMkY2R21yRTUyL1dSTW1yUnBuQ0tvdmZlcEVXRkpxZ2VqRjBwVzhoTDJKcHFBMTV3OG9WUApiRXRvTDhwVTlvemFNdjdEYTRNL09NWisKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ2VydGFpbmx5IFJvb3QgUjEKPT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZSekNDQXkrZ0F3SUJBZ0lSQUk0UCtVdVFjV2hsTTFUMDFFUTV0K0F3RFFZSktvWklodmNOQVFFTEJRQXdQVEVMTUFrR0ExVUUKQmhNQ1ZWTXhFakFRQmdOVkJBb1RDVU5sY25SaGFXNXNlVEVhTUJnR0ExVUVBeE1SUTJWeWRHRnBibXg1SUZKdmIzUWdVakV3SGhjTgpNakV3TkRBeE1EQXdNREF3V2hjTk5EWXdOREF4TURBd01EQXdXakE5TVFzd0NRWURWUVFHRXdKVlV6RVNNQkFHQTFVRUNoTUpRMlZ5CmRHRnBibXg1TVJvd0dBWURWUVFERXhGRFpYSjBZV2x1YkhrZ1VtOXZkQ0JTTVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVAKQURDQ0Fnb0NnZ0lCQU5BMjFCL3EzYXZrMGJibSt5TEEzUk1OYW5zaUV4eVhQR2hqWmpLY0E3V05wSUdEMm5nd0VjL2NzaXUra3IrTwo1TVFUdnFSb1ROb0NhQlowdnJMZEJPUnJLdDAzSDJBczIvWDNvWHlWdHd4d2hpN3hPdTlTOTh6VG0vbUx2ZzdmTWJlZGFGeVNwdlhsCjh3bzB0Zjk3b3VTSG9jYXZGd0R2QTVIdHFSeE9jVDNTaTJ5SjlIaUc1bXBKb002MTByQ3JtL2IwMUM3amN2azJ4dXNWdHlXTU92d2wKRGJNaWN5RjB5RXFXWVpMMUx3c1lwZlN0NHU1QnZRRjUrcGFNalJjQ01MVDVyM2dhakxRMkVCQUhCWERROURHUWlsSEZoaVo1c2hHSQpYc1h3Q2xUTlNhYS9BcHpTUktmdDQzanZSbDV0Y2RGNWNCeEdYMUhweVRmY1gzNXBlMEhmTkVYZ080VDBvWW9LTnA0M3pHSlM0WWtOCktQbDZJN0VOUFQyYS9aMkI3eXlRd0h0RVRydEo0QTVLVnBLOHk3WGRlUmVKa2Q1aGlYU1NxT015aGI1T2hhUkxXY3NyeFhpT2NWVFEKQWplWmpPVko2dUJVY3FRUkJpOExqTUZidnJXaHNGTnVuTGhna1I5WmEva3Q5SlFLbDdYc3hYWURWQnRsVXJwTWtsWlJOYUJBMkNuYgpybEoyT3kwd1FKdUswRUpXdExlSUFhU0hPMU9XemFNV2ovTm1xaGV4eDJEZ3dVTUZETzZiVzJCdkJseUhXeWY1UUJHZW5EUEJ0K1UxClZ3Vi9KODRYSUl3Yy9QSDcyakVwU2UzMUM0U25UOEgyVHNJb25QcnU0SzhIK3pNUmVpRlBDeUVRdGtBNnF5STZCSnlMbTRTR2NwclMKcDZYRXRIV1JxU3NqQWdNQkFBR2pRakJBTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZApEZ1FXQkJUZ3FqOGxqWjlFWE1FNjZDNnVkMHlFUG1jTTlEQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUF1VmV2dUJMYVY0T1BhQXN6CkhRTlRWZlNWY09RclBiQTU2L3FKWXYzMzFoZ0VMeUUwM2ZGbzhOV1dXdDdDZ0tQQmpjWnE5MWwzcmhWa3oxdDVCWGRtNm96VGF3M2QKOFZrc3dUT2xNSUFWUlFkRkdqRWl0cElBcTVsTk9vOTNyNmtpeWk5anloWFd4OGJ3UFd6OEhBMllFR0dlRWFJaTF3cnlrWHByT1E0dgpNTU0yU1ovZzZROENSRkEzbEZWOTZwLzJPN3FVcFV6cHZENVJ0T2pLa2paVWJWd2xLTnJkclJUOTArN2lJZ1hyMFBLM2FCTFhXb3BCCkdzYVNwVm83WTBWUHYrRTZkeUl2WEw5RytWb0RoUk5DWDhyZVU5ZGl0YVkxQk1KSC81bjloTjljenVsZWdDaEI4bjNuSHBEWVQzWSsKZ2p3Ti9LVUQrbnNhMlVVZVlOckVqdm44SzhsN2xjVXEvNnFKMzRJeEQzTC9EQ2ZYQ2g1V0FGQWVESkRCbHJYWUZJVzdwdzBXd2ZnSApKQnU2aGFFYUJRbUF1cFZqeVRyc0paOS9uYnFrUnhXYlJIRHhha3ZXT0Y1RDh4aCtVRzdwV2lqbVplWjNHenI5SGI0REpxUGIxT0c3CmZwWW5LeDN1cFB2YUpWUVRBOTQ1eHNNZlRaRHNqeHRLMGh6dGhaVTRVSGxHMXNHUVVER3BYSnB1SGZVelZvdW5tZEx5eUN3ems1SXcKeDA2TVpUTVFaQmY5SkJlVzBZM0NPbW9yNnhPTFJQSWg4MG9hdDNkZjErMklwSExsT1IrVm5iNW53WEFSUGJ2MCtFbTM0eWFYT3AvUwpYM3o3d0psOE9TbmdleDIvRGFlUDBpazBiaVFWeTk2UVhyOGF4R2Jxd3VhNk9WK0ttYWxCV1Fld0xLOD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQ2VydGFpbmx5IFJvb3QgRTEKPT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUI5ekNDQVgyZ0F3SUJBZ0lRQmlVenNVY0RNeWRjK1kyYXViL00rREFLQmdncWhrak9QUVFEQXpBOU1Rc3dDUVlEVlFRR0V3SlYKVXpFU01CQUdBMVVFQ2hNSlEyVnlkR0ZwYm14NU1Sb3dHQVlEVlFRREV4RkRaWEowWVdsdWJIa2dVbTl2ZENCRk1UQWVGdzB5TVRBMApNREV3TURBd01EQmFGdzAwTmpBME1ERXdNREF3TURCYU1EMHhDekFKQmdOVkJBWVRBbFZUTVJJd0VBWURWUVFLRXdsRFpYSjBZV2x1CmJIa3hHakFZQmdOVkJBTVRFVU5sY25SaGFXNXNlU0JTYjI5MElFVXhNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRTNtLzQKZnh6ZjdmbEhoNGF4cE1DSytJS1hnT3FQeUVwZUtuMklhS2NCWWhTUkpIcGNucU1YZllxR0lUUVlVQnNRM3RBM1N5YkhHV0NBNlRTOQpZQmsyUU5ZcGh3azhrWHIydkJNajNWbE9CRjdQeUFJY0dGUEJNZGphSU9sRWplUjJvMEl3UURBT0JnTlZIUThCQWY4RUJBTUNBUVl3CkR3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVTh5Z1l5MlIxN2lrcTYrMnVJMWc0aGV2SUlnY3dDZ1lJS29aSXpqMEUKQXdNRGFBQXdaUUl4QUxHT1dpRERzaGxpVGQ2d1Q5OXUwbkNLOFo5K2Fvem11dDZEYWNwcHM2a0Z0WmFTRjRmQzB1clFlODdZUVZ0OApyZ0l3UnQ3cXkxMmE3RExDWlJhd1REQmNNUFBhVG5PR0J0ak9pUVJJTnpmNDNUTlJuWEN2ZTFYWUFTNTlCV1FPaHJpUgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTZWN1cml0eSBDb21tdW5pY2F0aW9uIEVDQyBSb290Q0ExCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNPRENDQWI2Z0F3SUJBZ0lKQU5aZG03TjRnUzdyTUFvR0NDcUdTTTQ5QkFNRE1HRXhDekFKQmdOVkJBWVRBa3BRTVNVd0l3WUQKVlFRS0V4eFRSVU5QVFNCVWNuVnpkQ0JUZVhOMFpXMXpJRU5QTGl4TVZFUXVNU3N3S1FZRFZRUURFeUpUWldOMWNtbDBlU0JEYjIxdApkVzVwWTJGMGFXOXVJRVZEUXlCU2IyOTBRMEV4TUI0WERURTJNRFl4TmpBMU1UVXlPRm9YRFRNNE1ERXhPREExTVRVeU9Gb3dZVEVMCk1Ba0dBMVVFQmhNQ1NsQXhKVEFqQmdOVkJBb1RIRk5GUTA5TklGUnlkWE4wSUZONWMzUmxiWE1nUTA4dUxFeFVSQzR4S3pBcEJnTlYKQkFNVElsTmxZM1Z5YVhSNUlFTnZiVzExYm1sallYUnBiMjRnUlVORElGSnZiM1JEUVRFd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQQpJZ05pQUFTa3BXOWdBd1BEdlRIMDB4ZWNLNFIxck9YOVBWZHUxMk8vNWdTSmtvNkJuT1BwUjI3S2tCTElFK0NubmZkbGRCOXNFTExvCjVPbnZiWVV5bVVTeFh2M01kaERZVzcyaXh2bldRdVJYZHR5UXdqV3BTNGc4RWtkdFhQOUpUeHBLVUxHalFqQkFNQjBHQTFVZERnUVcKQkJTR0hPZitMYVZLaXdqK0tCSDZ2cU5tK0dCWkx6QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBSwpCZ2dxaGtqT1BRUURBd05vQURCbEFqQVZYVUk5L0xidTl6dXhOdWllOXNSR0tFa3owRmhES21NcHpFMnh0SHFpdVEwNHBWMUlLdjNMCnNuTmRvNGdJeHd3Q01RREFxeTBPYmUwWW90dFQ2U1hiVlFqZ1VNemZSR0VXZ3F0SnNMS0I3SE9IZUxSTXNtSWJFdm9XVFNWTFk3MGUKTjlrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpCSkNBIEdsb2JhbCBSb290IENBMQo9PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmREQ0NBMXlnQXdJQkFnSVFWVzlsNDdUWmtHb2JDZEZzUHNCc0lEQU5CZ2txaGtpRzl3MEJBUXNGQURCVU1Rc3dDUVlEVlFRRwpFd0pEVGpFbU1DUUdBMVVFQ2d3ZFFrVkpTa2xPUnlCRFJWSlVTVVpKUTBGVVJTQkJWVlJJVDFKSlZGa3hIVEFiQmdOVkJBTU1GRUpLClEwRWdSMnh2WW1Gc0lGSnZiM1FnUTBFeE1CNFhEVEU1TVRJeE9UQXpNVFl4TjFvWERUUTBNVEl4TWpBek1UWXhOMW93VkRFTE1Ba0cKQTFVRUJoTUNRMDR4SmpBa0JnTlZCQW9NSFVKRlNVcEpUa2NnUTBWU1ZFbEdTVU5CVkVVZ1FWVlVTRTlTU1ZSWk1SMHdHd1lEVlFRRApEQlJDU2tOQklFZHNiMkpoYkNCU2IyOTBJRU5CTVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBUEZtCkNMM1p4UlZoeTRRRVFhVnBOM2Nkd2JCNytzTjNTSkFUY21UUnVIeVFOWjBZZVlqamx3RThSNEh5RHFLWURaNC9OK0Fac3BEeVJoeVMKc1RwaHp2cTNScDREaHRjemJ1MzNSWXgyTjk1dWxwSDMxMzRyaHhmVml6WHVoSkZ5Vjl4Z3c4TzU1OGRuSkNOUFl3cGo5bVo5UzFXbgpQM2hrU1drU2wrQk1EZE1Kb0RJd092cWZ3UEtjeFJJcUxoeTFCRFBhcERnUmF0N0dHUFpIT2lKQmh5TDh4SWtvVk5pTXBUQUsrQmNXCnlxdzMvWG1ua1JkNE9KbXRXTzJ5M3N5SmZRT2NzNGxsNStNN3NTS0dqd1p0ZUFmOWtSSi9zR3NjaVEzNXVNdDBXd2ZDeVBRMTBXUmoKZXVsdW1paldNTDNtRzkwVnI0VHFuTWZLOVE3cThsMHBoNDlwY3ptK0xpUnZSU0dzeGRScEpRYURyWHBJaFJNc0RRYTRiSGxXL0tObgpNb0gxVjZYS1YwSnA2VndrWWUvaU1CaE9SSmhWYjNyQ2s5Z1p0dDU4UjRvUlRrbEgyeWlVQWd1VVNpejVFdEJQNkRGK2JIcS9waitiCk9UMENGcU1ZczJlc1d6OHNneXRuT1lGY3VYNlUxV1Rkbm85dXJ1aDhXN1RYYWtkSTEzNnoxQzJPVm5aT3oybnhia1JzMUNUcWpTU2gKR0wrOVYvNnBtVFcxMnhCM3VEMUl1dGJCNS9FalB0ZmZoWjBuUE5SQXZRb012ZlhualNYV2dYU0hSdFFwZGFKQ2JQZHppZWQ5djNwSwpIOU1peVJWVno5OXZmRlhRcElzSEVUZGZnNlltVjZZQlczNytXR2dIcWVsNjJibm8vMUFmcThLMHdNN282djBQdlkxTnVMeHhBZ01CCkFBR2pRakJBTUIwR0ExVWREZ1FXQkJURjcrM00ySTBoeGtqazQ5Y1VMcWNXaytXWUFUQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEcKQTFVZER3RUIvd1FFQXdJQkJqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFVb0tzSVRRZkkvS2kyUG00cnpjMklJblJOd1BXYVorNApZUkM2b2pHWVdVZm8wUTBsSGhWQkRPQXFWZFZYVXN2NDVNZHBveDFOY1FKZVh5RkZZRWhjQ1k1SkVNRUUzS2xpYXdMd1E4aE9uVGhKCmRNa3ljRlJ0d1VmOGpyUTJudFNjdmQwZzFsUEpHS20xVnJsMmk1Vm5adTY5bVA2dTc3NXUrMkQyL1ZuR0tocy9JMHFVSkRBbnlJbTgKNjBRa21zczl2ay9WZXM2T0Y4dGl3ZG5lSGc1Ni8wT0dORks4WVQ4OFg3dlpkclJUdkplei9vcE1FaTRyODlmTzRhTC8zWHR3K3p1aApUYVJqQXYwNGw1VS9CWENnYTk5aWdVT0x0RmtOU294VW5NVzdnWi9OZmFYdkN5VWVPaURiSFB3Zm1HY0NDdFJ6UkJQYlVZUWFWUU5XCjRBQitkQWIvT01SeUhkT29QMmd4WGRNSnh5Nk1XMlBnNk53ZTB1eGhIdkxlNWUvMm1YWmdMUjZVY25IR0N5b3l4NUpPMVViWEhmbXAKR1FySStwWE9iU09ZcWdzNHJacFdEVytOOFRFQWlNRVhuTTBaTmpYK1ZWT2c0RHd6WDVaZTRqTHAzek83QmtxcDJJUnp6bmZTeHF4eAo0VnlqSFF5N0N0OWY0cU54Mk5vM1dxQjRLL1RVZmV0MjdmSmhjS1ZsbXRPSk5CaXIrM0krMTdROWVWellINkV6ZTltQ1VBeVRGNnBzCjNNS0N1d0pYTnErWUp5bzVVT0d3aWZVbGwzNUhhQkMwN0hQS3M1ZlJKTnoyWXFBbzA3V2p1R1MzaUdKQ3o1MVR6Wm0rWkdpUFR4NFMKU1BmU0tjT1lLTXJ5TWd1VGpDbFBQR0F5elFXV1llenlyLzZ6Y0N3dXB2ST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQkpDQSBHbG9iYWwgUm9vdCBDQTIKPT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNKVENDQWF1Z0F3SUJBZ0lRTEJjSWZXUXF3UDZGR0ZrR3o3Uks2ekFLQmdncWhrak9QUVFEQXpCVU1Rc3dDUVlEVlFRR0V3SkQKVGpFbU1DUUdBMVVFQ2d3ZFFrVkpTa2xPUnlCRFJWSlVTVVpKUTBGVVJTQkJWVlJJVDFKSlZGa3hIVEFiQmdOVkJBTU1GRUpLUTBFZwpSMnh2WW1Gc0lGSnZiM1FnUTBFeU1CNFhEVEU1TVRJeE9UQXpNVGd5TVZvWERUUTBNVEl4TWpBek1UZ3lNVm93VkRFTE1Ba0dBMVVFCkJoTUNRMDR4SmpBa0JnTlZCQW9NSFVKRlNVcEpUa2NnUTBWU1ZFbEdTVU5CVkVVZ1FWVlVTRTlTU1ZSWk1SMHdHd1lEVlFRRERCUkMKU2tOQklFZHNiMkpoYkNCU2IyOTBJRU5CTWpCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCSjNMZ0pHTlUyZTF1VkN4QS9qbApTUjlCSWdtd1VWSlkxaXMwajhVU1JoVEZpeThzaFA4c2JxalY4UW5qQXlFVXhFTTlmTUVzeEV0cVNzM3BoK0I5OWlLKytrcFJ1RENLCi9lSGVHQklLOWtlMzV4ZS9KNHJVUVV5V1BHQ1d3ZjBWSEtOQ01FQXdIUVlEVlIwT0JCWUVGTkpLc1ZGL0J2RFJnaDlPYmwrcmcveEkKMUxDUk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUFvR0NDcUdTTTQ5QkFNREEyZ0FNR1VDTUJxOApXOWYrcWRKVURrcGQwbTJ4UU56MFE5WFNTcGtaRWxhQTk0TTA0VFZPU0cwRUQxY3hNREF0c2FxZEF6amJCZ0l4QU12TWgxUExldDhnClVYT1F3S2hiWWRERlVEbjloZjdCNDNqNHB0Wkx2WnVIancvbDFsT1dxenpJUU5waDkxT2o5dz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNlY3RpZ28gUHVibGljIFNlcnZlciBBdXRoZW50aWNhdGlvbiBSb290IEU0Ngo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNPakNDQWNHZ0F3SUJBZ0lRUXZMTTJodHBOMFJmRmY1MUtCQzQ5REFLQmdncWhrak9QUVFEQXpCZk1Rc3dDUVlEVlFRR0V3SkgKUWpFWU1CWUdBMVVFQ2hNUFUyVmpkR2xuYnlCTWFXMXBkR1ZrTVRZd05BWURWUVFERXkxVFpXTjBhV2R2SUZCMVlteHBZeUJUWlhKMgpaWElnUVhWMGFHVnVkR2xqWVhScGIyNGdVbTl2ZENCRk5EWXdIaGNOTWpFd016SXlNREF3TURBd1doY05ORFl3TXpJeE1qTTFPVFU1CldqQmZNUXN3Q1FZRFZRUUdFd0pIUWpFWU1CWUdBMVVFQ2hNUFUyVmpkR2xuYnlCTWFXMXBkR1ZrTVRZd05BWURWUVFERXkxVFpXTjAKYVdkdklGQjFZbXhwWXlCVFpYSjJaWElnUVhWMGFHVnVkR2xqWVhScGIyNGdVbTl2ZENCRk5EWXdkakFRQmdjcWhrak9QUUlCQmdVcgpnUVFBSWdOaUFBUjIrcG1wYmlEdCtkZDM0d2M3cU5zOVh6am9xMVdtVmsvV1NPcnNmeTJxdzdMRmVleVpZWDhRZWNjQ1d2a0VOL1UwCk5TdDN6bjhnajFLakFJbnMxYWVpYlZ2alM1S1RvSUQxQVpUYzhHZ0hIczN1L2lWU3RTQkRIQnYrNnhuT1E2T2pRakJBTUIwR0ExVWQKRGdRV0JCVFJJdHBNV2ZGTFh5WTRxcDNXN3VzTncvdXBZVEFPQmdOVkhROEJBZjhFQkFNQ0FZWXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekFLQmdncWhrak9QUVFEQXdObkFEQmtBakFuN3FSYXFDRzc2VWVYbEltbGRDQnRlVS9JdlpOZVdCajdMUm9BYXNtNFBkQ2tUMFJICmxBRldvdmd6SlF4QzM2b0NNQjNxNFM2SUx1SDVweDBDTWs3eW4yeFZkT091cnZ1bEd1N3QwdnpDQXhIclJWeGdFRDFjZjVrRFcyMVUKU0FHS2N3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU2VjdGlnbyBQdWJsaWMgU2VydmVyIEF1dGhlbnRpY2F0aW9uIFJvb3QgUjQ2Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmlqQ0NBM0tnQXdJQkFnSVFkWTM5aTY1OEJ3RDZxU1duNGNldEZEQU5CZ2txaGtpRzl3MEJBUXdGQURCZk1Rc3dDUVlEVlFRRwpFd0pIUWpFWU1CWUdBMVVFQ2hNUFUyVmpkR2xuYnlCTWFXMXBkR1ZrTVRZd05BWURWUVFERXkxVFpXTjBhV2R2SUZCMVlteHBZeUJUClpYSjJaWElnUVhWMGFHVnVkR2xqWVhScGIyNGdVbTl2ZENCU05EWXdIaGNOTWpFd016SXlNREF3TURBd1doY05ORFl3TXpJeE1qTTEKT1RVNVdqQmZNUXN3Q1FZRFZRUUdFd0pIUWpFWU1CWUdBMVVFQ2hNUFUyVmpkR2xuYnlCTWFXMXBkR1ZrTVRZd05BWURWUVFERXkxVApaV04wYVdkdklGQjFZbXhwWXlCVFpYSjJaWElnUVhWMGFHVnVkR2xqWVhScGIyNGdVbTl2ZENCU05EWXdnZ0lpTUEwR0NTcUdTSWIzCkRRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ1R2dFUyVW5YWUFTT2dIRWRDU2U1anRyY2gvY1NWMVVnckpud1VVeERhZWYwcnR5MmsKMUN6NjZqTGRTY0s1dlE5SVBYdGFtRlN2bmwweGRFOEgvRkFoM2FUUGFFOGJFbU50SlpsTUtwbnpTREJoK29GOEhxY0lTdHcrS3h3ZgpHRXh4cWpXTXJmaHU2RHRLMmVXVUF0YUpoQk9xYmNoUE04eFFsamVTTTl4ZmlPZWZWTmxJOEpoRDFtYjlueGM0UThVQlVRdlg0eU1QCkZGMWJGT2RMdnQzMHlOb0ROOUhXT2FFaFVUQ0RzRzNYTUU2V1c1SHdjQ1NydjBXQlpFTU52U0U2THp6cG5nM0xJTFZDSjh6YWI1dnUKWkRDUU9jMlRaWUVoTWJValVETTNJdU00N2ZneE1NeEYvbUw1MFYweWVVS0gzMnJNVmhsQVRjNnF1L20xZGttVThTZjRrYVdENVFhegpZdzZBM09BU1ZZQ21PMmEwT1ljdHlQRFEwUlRwNUExTkR2WmRWM0xGT3h4SFZwM2kxZnVCWVl6TVRZQ1FORnUzMXhSMTNOZ0VTSi9BCndTaUl0T2tjeXFleDhWYTNlMGxNV2VVZ0ZhaUVBaW42T0pScG1ra0dqODBmZVJRWEVneURldDRmc1pmdStaZDRLS1RJUkpMcGZTWUYKcGxoeW0za1QyQkZmcnNVNFlqUm9zb1l3anZpUVlaNHliUFVITnMyaVRHN3NpamJ0OHVhWkZVUnd3M3k4bkRuQXRPRnI5NE1sSTFmWgpFb0RsU2ZCMUQrK042eHliVkNpMElUejhmQXIvNzN0cmRmK0xIYUFaQmF2NitDdUJRdWc0dXJ2N3F2MDk0UFBLMzA2WGx5bnQ4eGhXCjZhV1dyTDNEa0ppeTRQbWkxS1pIUTN4dHp3SURBUUFCbzBJd1FEQWRCZ05WSFE0RUZnUVVWbk5ZWkpYNWtocXdFaW9FWW5taFFCV0kKSVVrd0RnWURWUjBQQVFIL0JBUURBZ0dHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTUJRQURnZ0lCQUM5YwptVHo4Qmw2TWxDNXc2dEl5TVkyMDhGSFZ2QXJ6Wko4SFh0WEJjMmhrZXFLNUR1ajVYWVV0cURkRnFpajBsZ1ZRWUtsSmZwL2ltVFlwCkUwUkhhcDFWSUR6WW0vRURNcnJhUUtGejZvT2h0MFNtRHBrQm0rUzhmNzRUbEg3S3BoNTJnRFk5aEFhTE15WmxiY3ArbnY0ZmpGZzQKZXhxRHNRKzhGeEc3NWdiTVkvcUI4b0ZNMmdzUWE2SDYxU2lsendaQUZ2OTdmUmhlT1JLa1U1NStNa0lRcGlHUnFSeE9GM3lFdkorTQowZWpmNWxHNU5rYy9rTG5IdkFMY1d4eFBEa2pCSllPY0NqK2VzUU16RWhvbnJQY2liQ1RSQVVINFdBUCtKV2dpSDVwYVBIeHNublZJCjg0SHhabWR1VElMQTdycFhEaGp2THByM0V0aWdhK2tGcGFIcGFQaThURDhTSGtYb1VzQ2p2eEluZWJuTU1UekQ5am9pRmdPZ3lZOW0KcEZ1aVRkYUJKUWJwZHFRQUNqN0x6VFdiNE9FNHkyQlRoaWhDUVJ4RVYraW9yYXRGNHlVUXZOcytaVUg3RzZhWEQrdTVkSG41SHJ3ZApWdzFIcjhNdm40ZEdwK3NtV2c5V1k3VmlZRzRBKytNbkVTTG4vcG1QTlBXNTZNT1JjcjNZd3g2NUx2S1JSRkhRVjgwTU5OVklJYi9iCkUvRm1KVU5TMG5BaU5zMmZ4QngxSUsxamNtTUdEdzRuenRKcURieTFPUnJwMFhaNjBWems1MGxKTFZVM2FQQWFPcGcrVkJlSFZPbW0KSjFDSmV5QXZQLysvb1l0S1I1ai9LM3RKUHNNcFJtQVlRcXN6S2JyQUtia1RpZE9JaWpsQk84bjlwdTBmOUdCajM5SXRWUUdMCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNTTC5jb20gVExTIFJTQSBSb290IENBIDIwMjIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmlUQ0NBM0dnQXdJQkFnSVFiNzdhclhPOUNFRGlpMDIrMVBkYmtUQU5CZ2txaGtpRzl3MEJBUXNGQURCT01Rc3dDUVlEVlFRRwpFd0pWVXpFWU1CWUdBMVVFQ2d3UFUxTk1JRU52Y25CdmNtRjBhVzl1TVNVd0l3WURWUVFEREJ4VFUwd3VZMjl0SUZSTVV5QlNVMEVnClVtOXZkQ0JEUVNBeU1ESXlNQjRYRFRJeU1EZ3lOVEUyTXpReU1sb1hEVFEyTURneE9URTJNelF5TVZvd1RqRUxNQWtHQTFVRUJoTUMKVlZNeEdEQVdCZ05WQkFvTUQxTlRUQ0JEYjNKd2IzSmhkR2x2YmpFbE1DTUdBMVVFQXd3Y1UxTk1MbU52YlNCVVRGTWdVbE5CSUZKdgpiM1FnUTBFZ01qQXlNakNDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFOQ2tDWEpQUUlnU1lUNDFJNTd1CjluVFBMM3RZUGM0OERSQW9rQytYOTR4STJLRFlKYkZNc0JGTUYzTlEwQ0pLWTd1QjB5bHUxYlVKUGlZWWY3SVNmNU9ZdDYvd05yL3kKN2hpZW5EdFN4VWNaWFhUelpHYlZYY2RvdEw4YkhBYWp2STlBSTdZZXhvUzlVY1FiT2NHVjBpbnNTNjU3TGI4NS9iUmkzcFo3UWNhYwpvT0FHY3Z2d0I1Y0pPWUYwci9jMFdSRlhDc0pid1NUME1YTXdnc2FkdWdMM1BueEVYNE1OOC9IZElHa1dDVkRpMUZXMjRJQnlkbTVNClI3ZDFWVm0wVTNUWmxNWkJyVmlLTVdZUEhxSWJLVUJPTDk5NzVoWXNMZnkvN1BPMCtyNFk5cHRKMU80RmJ0azA4NXp4N0FHTDBTREcKRDZDMXZCZE9TSHRSd3Z6cFhHazNSMmF6YVBnVktQQzUwNlFWekZwUHVsSndveEpGM2NhNlR2dkMwUGVvVWlkdGJubTFqUHg3ak1FVwpUTzZBZjc3d2RyNUJVeEl6cmxvNFFxdlhEejVCalhZSE10V3JpZlpPWjlteFFuVWpidlBOUXJMOFZmVlRoeGM3d0ROWThWTFMrWUNrCjhPandPNHM0ektUR2tIOFBuUDJMMGFQUDJvT25hY2xRTnRWY0JkSUtRWFRiWXhFM3dhV2dsa3NlakJZU2Q2NlVOSHNlZjhKbUFPU3EKZytxS2tLM09Oa1JOMFZIcHZCL3phZ1g5d0hRZkpSbEFVVzdxZ2xGQTM1dTVDQ29HQXRVakhCUFc2ZHZieHJCNnkzc25tL3ZnMVVZawo3UkJMWTB1bEJZKzZ1QjBycHZxUjRwSlN2ZXpyWjVkdG1pMmZnVElGWnpMN1NBZy8yU1c0QkNVdkFnTUJBQUdqWXpCaE1BOEdBMVVkCkV3RUIvd1FGTUFNQkFmOHdId1lEVlIwakJCZ3dGb0FVK3k0Mzd1T0VlaWN1elJrMXNUTjgvOVJFUXJrd0hRWURWUjBPQkJZRUZQc3UKTis3amhIb25MczBaTmJFemZQL1VSRUs1TUE0R0ExVWREd0VCL3dRRUF3SUJoakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBallsdApoRVVZOFUrem9POW9wTUFkckRDOFoyYXdtczIycXlJWlp0TTdRYlVRblJDNmNtNHBKQ0FjQVpsaTA1Ymc0dnNNUXRmaFdzU1dUVlROCmo4cERVLzBxdU9yNFpjb0J3cTFnYUFhZk9ScFIyZUNOSnZrTFRxVlRKWG9qcEJ6T0NCdmZSNGl5clQ3Z0o0ZUxTWXdmcVVkWWU1YnkKaUIwWXJyUFJwZ3FVK3R2VDVUZ0thM2tTTS90S1dUY1dRQTY3M3ZXSkRQRnMwL2RSYTE0MTlkdkFKdW9TYzA2cGtaQ21GOE5zTHpqVQpvM0tVUXl4aTRVNWNNajI5VEgwWlI2TERTZWVXUDQrYTB6dmtFZGlMQTl6MnRtQlZHS2FCVWZQaHFCVnE2K0FMOEJReDFybU1SVHFvCkVOand1U2ZyOTh0Njd3VnlsclhFajVaenhPaFdjNXk4YVZGanZPOW5IRU1hWDNjWkh4ajRIQ1VwK1VtWktiYVNQYUtETjdFZ2thaWIKTU9scWJMUWprMlVFcXhIekRoMVRKRWxUSGFFL25VaVNFZUo5RFUvMTE3MmlXRDU0blI0ZksvNGh1eG9UdHJFb1pQMndBZ0RIYklDaQp2UlpRSUE5eWdWL01sUCs3bWVhNmtNdnErY1lNd3E3RkdjNHpvV3RjdTM1OE5GY1hyZkEvcnMzcXI1bnNMRlIrak00dUVsWkk3eGM3ClAwcGVZTkxjZERhOHBVTmp5dzlib3dKV0NaNGtMT0dHZ1l6K3F4Y3Mrc2ppTWhvNi80VUl5WU9mOGtwSUVGUjNOKzJpdkVDKzVCQjAKOStSYnU3bnppZm1QUWRqSDVGQ1FOWUErSExoTmtOUFU5OE93b1g2RXluZVNNU3k0a0xHQ2VuUk9teE1tdE5WUVpsUjRybUE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNTTC5jb20gVExTIEVDQyBSb290IENBIDIwMjIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ09qQ0NBY0NnQXdJQkFnSVFGQVAxcS9zM2l4ZEFXK0pEc3FYUnhEQUtCZ2dxaGtqT1BRUURBekJPTVFzd0NRWURWUVFHRXdKVgpVekVZTUJZR0ExVUVDZ3dQVTFOTUlFTnZjbkJ2Y21GMGFXOXVNU1V3SXdZRFZRUUREQnhUVTB3dVkyOXRJRlJNVXlCRlEwTWdVbTl2CmRDQkRRU0F5TURJeU1CNFhEVEl5TURneU5URTJNek0wT0ZvWERUUTJNRGd4T1RFMk16TTBOMW93VGpFTE1Ba0dBMVVFQmhNQ1ZWTXgKR0RBV0JnTlZCQW9NRDFOVFRDQkRiM0p3YjNKaGRHbHZiakVsTUNNR0ExVUVBd3djVTFOTUxtTnZiU0JVVEZNZ1JVTkRJRkp2YjNRZwpRMEVnTWpBeU1qQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkVVcE5YUDZ3cmdqemhSOXFMRk5vRnMyN2lvc1U4TmdDVFd5CkpHWW1hY0N6bGRaZGtrQVpEc2FsRTNEMDd4SlJLRjNuekwzNVBJWEJ6NVNReVN2T2trSllXV2Y5bENjUVpJeFBCTEZOU2VSN1Q1djEKNXdqNEE0ajNwOE9TU3hsVWdhTmpNR0V3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFmQmdOVkhTTUVHREFXZ0JTSmp5K2o2Q3VnRkZSNwo4MWE0Smw5bk9BdWMwREFkQmdOVkhRNEVGZ1FVaVk4dm8rZ3JvQlJVZS9OV3VDWmZaemdMbk5Bd0RnWURWUjBQQVFIL0JBUURBZ0dHCk1Bb0dDQ3FHU000OUJBTURBMmdBTUdVQ01GWGpJbGJwMTVJa1dFOGVsRElQREFJMnd2MnNkREpPNGZzY2dJaWp6UHZYNnl2L04zM3cKN2RlZWRXbzFkbEpGNEFJeEFNZU5iMElnajc2MlRWbnRkMDBweENBZ1JXU0dPbERHeEswdGsvVVlmWEx0cWMvRXJGYzJLQWhsM3p4NQpabjZnNmc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNGVENDQVp1Z0F3SUJBZ0lRUFpnN3BtWTlrR1AzZmlaWE9BVHZBREFLQmdncWhrak9QUVFEQXpCTU1TNHdMQVlEVlFRRERDVkIKZEc5eklGUnlkWE4wWldSU2IyOTBJRkp2YjNRZ1EwRWdSVU5ESUZSTVV5QXlNREl4TVEwd0N3WURWUVFLREFSQmRHOXpNUXN3Q1FZRApWUVFHRXdKRVJUQWVGdzB5TVRBME1qSXdPVEkyTWpOYUZ3MDBNVEEwTVRjd09USTJNakphTUV3eExqQXNCZ05WQkFNTUpVRjBiM01nClZISjFjM1JsWkZKdmIzUWdVbTl2ZENCRFFTQkZRME1nVkV4VElESXdNakV4RFRBTEJnTlZCQW9NQkVGMGIzTXhDekFKQmdOVkJBWVQKQWtSRk1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFbG9aWUtEY0taOUNnM2lRWkdlSGtCUWNmbCszb1pJSzU5c1J4VU02SwpEUC9YdFhhN29XeVRiSU9pYUc2bDJiNHNpSlZCelYzZHNjcURZNFBNd0w1MDJlQ2RwTzVLVGxiZ21DbEJrMUlRMVNRNEFqSm44WlFTCmIrL1h4ZDR1L1JtQW8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlIyS0NYV2ZlQm1tbm9Kc21vN2pqUFgKTnROUG9qQU9CZ05WSFE4QkFmOEVCQU1DQVlZd0NnWUlLb1pJemowRUF3TURhQUF3WlFJd1c1a3A4NXd4dG9scmJOYTlkK0Y4NTFGKwp1RHJOb3paZmZQYzhkejdrVUsybzU5SlpEQ2FPTUR0dUNDckNwMXJJQWpFQW1lTU01NlBEcjlOSkxrYUNJMlpkeVFBVUV2MDQ5T0dZCmEzY3BldHNrejJWQXY5TGNqQkhvOUgxL0lJU3BRdVFvCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBSU0EgVExTIDIwMjEKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlpEQ0NBMHlnQXdJQkFnSVFVOVhQNWhtVEMvc3JCUkxZd2lxaXBEQU5CZ2txaGtpRzl3MEJBUXdGQURCTU1TNHdMQVlEVlFRRApEQ1ZCZEc5eklGUnlkWE4wWldSU2IyOTBJRkp2YjNRZ1EwRWdVbE5CSUZSTVV5QXlNREl4TVEwd0N3WURWUVFLREFSQmRHOXpNUXN3CkNRWURWUVFHRXdKRVJUQWVGdzB5TVRBME1qSXdPVEl4TVRCYUZ3MDBNVEEwTVRjd09USXhNRGxhTUV3eExqQXNCZ05WQkFNTUpVRjAKYjNNZ1ZISjFjM1JsWkZKdmIzUWdVbTl2ZENCRFFTQlNVMEVnVkV4VElESXdNakV4RFRBTEJnTlZCQW9NQkVGMGIzTXhDekFKQmdOVgpCQVlUQWtSRk1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBdG9BT3hIbTlCWXg5c0tPZFRTSk55L0JCCmwwMVo0TkgrVm95WDh0ZTlqMnkzSTQ5ZjFjVFlRY3Z5QWg1eDVlbjJYc3NJS2w0dzhpMW14NFFiWkZjNG5YVXRWc1l2WWUrVy9DQkcKdmV2VWV6OC9mRWM0QktrYnFsTGZFemZURlJWT3ZWOThyNjFqeDNuY0NIdlZvT1gzVzNXc2dGV1prbUdielNvWGZkdVA5TFZxNmhkSwpaQ2htRlNsc0F2RnIxYnFqTTl4YVo2Y0Y0cjlsdGhhd0VPM05VRFBKY0ZEc0dZNnd4L0owVzJ0RXhuMld1WmdJV1diZUtRR2I5Q3B0CjB4VTZrR3BuOGJSclp0a2g2OHJaWW54R0VGemVkVWxubmtMNS9uV3BvNjMvZGdwblFPUEY5NDNIaFpwWm5tS2FhdTFGaDVobnN0VksKUE5lME93QU53SThmNFVERXJtd2gzRWwrZnNxeWpXMjJ2NU12b1Z3K2o4cnRnSTVZNGR0WHo0VTJPTEp4cEFtTWtva0lpRWp4UUdNWQpzbHVNV3VQRDB4ZXFxeG1qTEJ2azFjYmlabnJYZ2htbU94WXNMM0dIWDBXZWxYT1R3a0tCSVJPVzE1MjdrMmdWK3Aya0hZenlnZUJZCkJyM0p0dVAyaVYySitheEVvY3RyK2hieHgxQTlKTnIzdytTSDFWYnhUNUF3K2tVSldkbzB6dUFUSEFSOEFOU2JocVJBdk5uY1RGZCsKcnJjenRsNTI0V1dMWnQrTnl0ZVlyODQybUl5Y2c1a0RjUE92ZE8zR0RqYm52ZXpCYzZlVVdzdVNaSUttQU1Gd29XNHNLZUZZVit4YQpmSmxySmFTUU9vRDBJSjJhenNjdCtiSkxLWldENlRXTnAwbElwdzlNR1pIUTliOFE0SEVDQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvCkJBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVWRFbVowZiswZW1oRmRjTit0TnpNemprejJnZ3dEZ1lEVlIwUEFRSC9CQVFEQWdHR01BMEcKQ1NxR1NJYjNEUUVCREFVQUE0SUNBUUFqUTFNa1lseHQvVDdDejFVQWJNVldpTGtPM1RyaUpRMlZTcGZLZ0ludUtzMWwrTnNXNEFtUwo0QmpIZUppNzgreENVdnVwcElMWFRkaUsvT1JPL2F1UXhEaDFNb1NmLzdPd0t3SXpOc0FRa0c4ZG5LL2hhWlBzbzBVdkZKLzFUQ3BsClEzSU05OFA0bFlzVTg0VWdZdDFVVTkwczNCaVZhVStEUjNCQU0xaDNFZ3lpNjFJeEhrekpxTTdGNzhQUnJlQnJBd0EwSnJSVUlUV1gKQWR4ZkcvRjg1MVg2TFdoM2U5TnB6Tk1PYTdwTmRrVFd3aFdhSnV5d3hmVzcwWHAwd216TnhiVmU5a3ptV3kyQjI3TzNPcGVlN2M5RwpzbEE5aEdDWmNiVXp0VmRGNWtKSGRXb09zQWdNcnIzZTk3c1BXRDJQQXpIb1BZSlF5aTllREYyMGw3NGdOQWYweEJMaDd0ZXcyVmt0CmFmY3hCUFR5K2F2NUV6SDRBWGNPUFVJakpzeWFjbWRSSVhyTVBJV282aUZxTzl0YVBLVTBucHJBTE4rQW5DbmczM2VVMGFLQVF2OXEKVEZzUjBQWE5vcjZ1ekZGY3c5VlVld3l1MXJrR2Q0RGk3d2NhYU14WlVhMStYR2RydWR2aUIwSmJ1QUVGV0RsTjVMdVlvN0V5N05tagoxbStVSS84N3R5bGw1Z2ZwNzdZWjZ1ZkNPQjB5aUpBOEV5dHV6TytyZHdZMGQ0UlBjdVNCaFBtNWREVGVkaytTS2xPeEpUbmJQUC9sClBxWU81V3VlLzl2c0wzU0QzNDYwczZuZUZFMy9NYU5GY3lUNmxTbk1FcGNFb2ppMmpiRHdOL3pJSVg4L3N5UWJQWXR1ekUyd0ZnMlcKSFlNZlJzQ2J2VU9aNThTV0xzNWZ5UT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClRydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMwo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZwVENDQTQyZ0F3SUJBZ0lVWlBZT1pYZGhhcXM3dE9xRmhMdXhpYmh4a3c4d0RRWUpLb1pJaHZjTkFRRU1CUUF3V2pFTE1Ba0cKQTFVRUJoTUNRMDR4SlRBakJnTlZCQW9NSEZSeWRYTjBRWE5wWVNCVVpXTm9ibTlzYjJkcFpYTXNJRWx1WXk0eEpEQWlCZ05WQkFNTQpHMVJ5ZFhOMFFYTnBZU0JIYkc5aVlXd2dVbTl2ZENCRFFTQkhNekFlRncweU1UQTFNakF3TWpFd01UbGFGdzAwTmpBMU1Ua3dNakV3Ck1UbGFNRm94Q3pBSkJnTlZCQVlUQWtOT01TVXdJd1lEVlFRS0RCeFVjblZ6ZEVGemFXRWdWR1ZqYUc1dmJHOW5hV1Z6TENCSmJtTXUKTVNRd0lnWURWUVFEREJ0VWNuVnpkRUZ6YVdFZ1IyeHZZbUZzSUZKdmIzUWdRMEVnUnpNd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQQpBNElDRHdBd2dnSUtBb0lDQVFEQU1ZSmhrdVNVR3dvcVpkQytCcW1ITzFFUzZuQkJydUw3ZE9vS2pibXpUTnlQdHhOU1QxUVk0U3h6CmxaSEZaanRxejZ4amJZZFQ4UGZ4T2JlZ1EyT3d4QU5kVjZublJNN0VvWU5sOWxBK3NYNFd1RHFLQXRDV0h3RE5CU0h2Qm0zZElad1oKUTBXaHhlaUF5c0t0UUdJWEJzYXF2UFBXNXZ4UWZtWkNIenlMcG5sNWhrQTFueUR2UCt1TFJ4K1Bqc1hVanJZc3lVUUU0OVJEZFQvVgpQNjhjekg1R1g2emZaQkNLNzBid2tQQVBMZlNJQzdFcHFxK0Zxa2xZcUw5am9EaVI1clBtZDJqRStTb1poTHNPNGZXdmlleWxMMUFnCmRCNFNRWE1lSk5uS3ppeWhXVFhBeUIxR0oyRmFqL2xOMDNKNVpoNmZGWkFoTGYzdGkxWndBMHBKUG45cE1SSnB4eDVjeW5vVGkram0KOVdBUHpKTXNoSC94L0dyOG0wZWQyNjJJUGZOMmRUUFhTNlRJaS9uMVExaFB5OGdEVkkrbGhYZ0VHdk56OHRlSEhVR2Y1OWdYemhxYwpEMHI4M0VSb1ZHamlRVHorTElTR056ek5QeStpMitmM1ZBTmZXZFAza1hqSGkzZHFGdVZKaFpCRmNuQXZrVjM0UG1WQUN4bVp5U1lnCldtakJOYjlQcDFIeDJCRXJXK0NhbmlnN0Nqb0tIOEdCNVM3d3BybHBwWWlVNW1zVGY5RmtQejJjY0VibG9vVjdXSVFuM01TQVBtZWEKbXNlYU1RNHc3T1lYUUpYWlJlMEJscXEvRFBOTDBXUDNFMWpBdVBQNlo5MmJmVzFLL3pKTXRTVTcveHhuRDRVaVdRV1JrVUYzZ2RDRgpUSWNRY2YrZVF4dXVsWFV0Z1FJREFRQUJvMk13WVRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZFRGs1UElqCjd6aktzSzVYZi9JaE1CWTAyN3lTTUIwR0ExVWREZ1FXQkJSQTVPVHlJKzg0eXJDdVYzL3lJVEFXTk51OGtqQU9CZ05WSFE4QkFmOEUKQkFNQ0FRWXdEUVlKS29aSWh2Y05BUUVNQlFBRGdnSUJBQ1k3VWVGTk9QTXlHTFMwWHVGbFhzU1VUOVNuWWFQNHdNOHpBUUxwdzZvMQpEL0dVRTNkM05aNHRWbEZFYnVIR0xpZ2UvOXJzUjgyWFJCZjM0RXpDNFh4OE1ucG15RnEyWEZORlYxcEYxQVdaTHk0alZlNWphTi9UCkczaW5FcFFHQUhVTmNvVHBMcnhhYXRYZUwxbkhvK3pTaDJiYnQxUzFKS3YwUTNqYlN3VEViOTNtUG1ZK0tmSkxhSEVpaDZENHNUTmoKZHVNTmhYSkVJbFUvSEh6cC9MZ1Y2Rkw2cWo2aklUazFkSW1tYXNJNStualB0cXpuNTlaVy95T1NMbEFMcWJVSE0vUTRYNlJKcHN0bApjSGJvQ29XQVN6WTlNL2VWVkhVbDJxekVjNEpsNlZMMVhQMDRsUUpxYVRERkhBcFhCNjRpcEN6NXhVRzN1T3lmVDBnQStRRUVWY3lzCitUSXh4SFdWQnFCLzBZMG4zYk9wcEhLSC9sbUxtbnAwRnQwV3BXSXA2enFXM0l1bmFGblQ2M2VST2ZqWHk5bVBYMW9uQVgxZGFCbGkKMk1qTjlMZHlSNzVibDg3eXJhS1prNjJVeTVQMkVnbVZ0cXZYTzlBL0Vjc3dGaTU1Z09SbmdTMWQ3WEI0dG1CWnJPRmRSV09QeU45eQphRnZxSGJnQjhYNzc1NHF6NDFTZ09BbmdQTjVDOHNMdExwdnpIelcyTnRqamdLR0x6WmxrRDhLcXE3SEs5VytlUTQyRVZKbXpic0FTClp0aHdFUEVHTlRORHFKd3V1aFF4emhCL0hJYmpqOUxWK0hmc202dnhMMlBaUWwvZ1o0RmtrZkdYTC94dUp2WXorTk8xK01SaXF6RlIKSlFKNitOMXJaZFZ0VFRESVpicG9GR1dzSnd0MGl2S0gKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVHJ1c3RBc2lhIEdsb2JhbCBSb290IENBIEc0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ1ZUQ0NBZHlnQXdJQkFnSVVUeU5rdUk2WFk1N0dVNEhCZGs3TEtuUVYxdGN3Q2dZSUtvWkl6ajBFQXdNd1dqRUxNQWtHQTFVRQpCaE1DUTA0eEpUQWpCZ05WQkFvTUhGUnlkWE4wUVhOcFlTQlVaV05vYm05c2IyZHBaWE1zSUVsdVl5NHhKREFpQmdOVkJBTU1HMVJ5CmRYTjBRWE5wWVNCSGJHOWlZV3dnVW05dmRDQkRRU0JITkRBZUZ3MHlNVEExTWpBd01qRXdNakphRncwME5qQTFNVGt3TWpFd01qSmEKTUZveEN6QUpCZ05WQkFZVEFrTk9NU1V3SXdZRFZRUUtEQnhVY25WemRFRnphV0VnVkdWamFHNXZiRzluYVdWekxDQkpibU11TVNRdwpJZ1lEVlFRRERCdFVjblZ6ZEVGemFXRWdSMnh2WW1Gc0lGSnZiM1FnUTBFZ1J6UXdkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pCkFBVHhzODA0NUNWRDVkNFpDYnVCZWFJVlh4VmpBZDdDcTkyenBodG5TNENEcjVuTHJCZmJLNWJLZkZKVjRocmhQVmJ3THhZSStoVzgKbTd0SDVqL3VxT0ZNalBYVE52azRYYXR3bWtjTjRvRkJCdXRKK2JBcDNUUHNVS1YvZVNtNElKaWpZekJoTUE4R0ExVWRFd0VCL3dRRgpNQU1CQWY4d0h3WURWUjBqQkJnd0ZvQVVwYnRLbDg2ekszK2tNZDZYZzFtRHBtOXh5OTR3SFFZRFZSME9CQllFRktXN1NwZk9zeXQvCnBESGVsNE5aZzZadmNjdmVNQTRHQTFVZER3RUIvd1FFQXdJQkJqQUtCZ2dxaGtqT1BRUURBd05uQURCa0FqQmU4dXNHekVreG4wQUEKYmJkK052Qk5FVS96eTRrNkxIaVJVS05id01wMUp2Sy9rRjBMZ294Z0tKL0djSnBvNVBFQ01GeFlEbFoyejFqRDF4Q011bzZ1NDd4awpkVWZGVlpEai9icFY2d2ZFVTZzM3FlNGhzaUZiWUk4OU12SFZJNVRXV0E9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUZWxla29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNRakNDQWNtZ0F3SUJBZ0lRTmpxV2pNbGNzbGpOMEFGZHhlVlhBREFLQmdncWhrak9QUVFEQXpCak1Rc3dDUVlEVlFRR0V3SkUKUlRFbk1DVUdBMVVFQ2d3ZVJHVjFkSE5qYUdVZ1ZHVnNaV3R2YlNCVFpXTjFjbWwwZVNCSGJXSklNU3N3S1FZRFZRUUREQ0pVWld4bAphMjl0SUZObFkzVnlhWFI1SUZSTVV5QkZRME1nVW05dmRDQXlNREl3TUI0WERUSXdNRGd5TlRBM05EZ3lNRm9YRFRRMU1EZ3lOVEl6Ck5UazFPVm93WXpFTE1Ba0dBMVVFQmhNQ1JFVXhKekFsQmdOVkJBb01Ia1JsZFhSelkyaGxJRlJsYkdWcmIyMGdVMlZqZFhKcGRIa2cKUjIxaVNERXJNQ2tHQTFVRUF3d2lWR1ZzWld0dmJTQlRaV04xY21sMGVTQlVURk1nUlVORElGSnZiM1FnTWpBeU1EQjJNQkFHQnlxRwpTTTQ5QWdFR0JTdUJCQUFpQTJJQUJNNi8vbGVvdjlXcTl4Q2F6YnpSRWFLOVowTE1rT3NWR0pEWm9zME1LaVhyUGsvT3RkS1BEL00xCjJrT0xBb0MrYjFFa0hROXJLOHFmd205UU11VTNJTFlnLzRnTkQyMUp1OXNHcEllUWtwVDBDZERQZjhpQUM4R1hzN3MxSjhuQ0c2TkMKTUVBd0hRWURWUjBPQkJZRUZPTnl6RzZWbVVleDVyTmhUTkhMcStPNnpkNmZNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUApBUUgvQkFRREFnRUdNQW9HQ0NxR1NNNDlCQU1EQTJjQU1HUUNNSFZTaTdla0VFK3VTaENMc29SYlF1SG1LallDMnFCdUdUOGx2OXBaCk1vN2srNURjazJUT3JiUkJSMkRpejZmTEhnSXdOMEdNWnQ5QmE5YURBRUg5TDFyM1VMUm4wU3lvY2RkRHlwd25KSkdEU0EzUHpmZFUKZ2Evc2YrUm4yN2lRN3QwbAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUZWxla29tIFNlY3VyaXR5IFRMUyBSU0EgUm9vdCAyMDIzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZzekNDQTV1Z0F3SUJBZ0lRSVp4VUxlajI3SEYzK2s3b3czQlhsekFOQmdrcWhraUc5dzBCQVF3RkFEQmpNUXN3Q1FZRFZRUUcKRXdKRVJURW5NQ1VHQTFVRUNnd2VSR1YxZEhOamFHVWdWR1ZzWld0dmJTQlRaV04xY21sMGVTQkhiV0pJTVNzd0tRWURWUVFERENKVQpaV3hsYTI5dElGTmxZM1Z5YVhSNUlGUk1VeUJTVTBFZ1VtOXZkQ0F5TURJek1CNFhEVEl6TURNeU9ERXlNVFkwTlZvWERUUTRNRE15Ck56SXpOVGsxT1Zvd1l6RUxNQWtHQTFVRUJoTUNSRVV4SnpBbEJnTlZCQW9NSGtSbGRYUnpZMmhsSUZSbGJHVnJiMjBnVTJWamRYSnAKZEhrZ1IyMWlTREVyTUNrR0ExVUVBd3dpVkdWc1pXdHZiU0JUWldOMWNtbDBlU0JVVEZNZ1VsTkJJRkp2YjNRZ01qQXlNekNDQWlJdwpEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTzAxb1lHQTg4dEthVnZDKzFHRHJpYjk0Vzd6Z1JKOWNVRC9oM1ZDCktTSHRnVklzM3hMQkdZU0p3YjNGS05YVlMyeEUxa3piQjVaS1ZYcktOb0lFTnFpbC9DZjJTZkhWY3A2UitTUFdjSHU3OVp2QjdKUFAKR2VwbGZvaHdvSFA4OXYrMVZtTGhjMm8wbUQ2Q3VLeVZVL1FCb0NjSGNxTUFVNkRrc3F1RE9GY3pKWlNmdmtnZG1PR2p1cDVjelFSeApVWDExZUt2eldhckU0R0MrajROU3VIVWFRVFh0dlBNNlkrbXBGRVhYNWxMUmJ0TGV2T1AxQ3p2bTRNUzlRMlFUcHM3MG1EZHNpcFdvCmw4aEhEL0JlRUl2bkhSeitzVHVnQlROb0JVR0N3UU1yQWNqbmowMnI2TFgyeld0RXRlZmRpK3pxSmJRQUlsZE5zTEd5TWNFV3p2LzkKRklTM1IvcXk4WERlMjR0c05saWtmTE1SMGNOM2YxKzJKZUFOeGRLeitiaTRkOXMzY1hGSDQyQVlUeVMyZFRkNHVhTmlyNzNKY280dgp6THV1MitRVlVoa0hNL3RxdHkxTGtDaUNjLzRZaXpXTjI2Y0Vhcjdxd1UwMk94WTJrVEx2dGtDSmtVUGc4cUtyQkM3bThrd09GalFnCnJJZkJMWDdKWmtjWEZCR2s4L2VoSkltcjJCcklvVnl4by9lTWJjZ0J5VS9KN01UOHJGRXowY2lEMGNtZkhkUkhOQ2sreTdBTytvTUwKS0ZqbEtkdy9mS2lmeWJZS3U2Ym9SaFlQbHVWNzVHcDZTRzEybUFXbDNHMGVRaDVDMmhyZ1V2ZTFnOEFhZTNnMUxEajFILzFKb3k3UwpXV08vZ0xDTWszUExOYWFabFNKaFpRTmcreStUUy9xYW5JQTdBZ01CQUFHall6QmhNQTRHQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WCkhRNEVGZ1FVdHFlWGdqMTBoWnYzUEorVG1wVjVkVktNYlVjd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZkJnTlZIU01FR0RBV2dCUzIKcDVlQ1BYU0ZtL2M4bjVPYWxYbDFVb3h0UnpBTkJna3Foa2lHOXcwQkFRd0ZBQU9DQWdFQXFNeGhwcjUxbmhWUXBHdjdxSEJGZkxwKwpzVnI4V3lQNkNuZjRtSEdDREczZ1hrYXFrL1Flb01QaGs5dExyYkttWGF1dzFHTExYcnRtOVMzdWwwQThZdXRlMWhUV2pPS1dpMEZwCmt6WG11WmxyWXJTaEYyWTBwbXRqeHJsTzhpTHBXQTFXUWRINkRFcndNODA3dTIwaE9xNk9jclhEU3Z2cGZlV3htNGJ1NHVCOXRQY3kKL1NLRThZWEpOM25wdFQrL1hPUjBzbzhSWWdEZEdHYWgyWHNqWC9HTzFXZm9WTnBiT21zMmIvbUJzVE5ITTNkQStWS3EzZFNEejRWNAptWnFUdVhOblFrWVJJZXIrQ3FrYkdtVnBzNCt1RnJiMlMxYXlMZm1seU93N1lxUHRhOUJPMVVBSnBCK1kxenFsa2xrZzVMQjl6VnR6CmFMMXR4S0lURG1jWnVJMUNmbXdNbW02Z0pDM1ZSUnZjeEFJVS9vVmJaWmZLVHBCUUNIcENOZm5xd21iVStBR3VIclMrdzZqdi9uYWEKb3FZZlJ2YUU3ZnpienNRQ3puZElMSXl5N01NQW8rd3NWUmpCZmhudTRTL3lyWU9ibnFzWjM4YUtMNHgzNWJjRjdEdkI3TDZHczRhOAp3UGZjNStwYnJyTE10VFdHUzlEaVA3YlkrQTRBN2wzajk0MVkvOCtMTitsalgyNzNDWEUyd2hKZFYvTEl0TTN6N2dMZkVkeHF1VmVFCkhWbE5qTTdJRGlQQ3R5YWFFQlJ4L3BPeWlyaUE4QTRRbnRPb1VBdzNnaS9xNElxZDRTdzUvN1cwY3dEazkwaW1jNnkvc3Q1M0JJZTAKbzgyYk5TUTMrcENURTRGQ3hwZ21kVGRtUVJDc3UvV1U0OEl4SzYzbkkxYk1OU1dTczFBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpGSVJNQVBST0ZFU0lPTkFMIENBIFJPT1QtQSBXRUIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDZWpDQ0FnQ2dBd0lCQWdJUU1aY2g3YStKUW44MVFZZWhaMVpNYlRBS0JnZ3Foa2pPUFFRREF6QnVNUXN3Q1FZRFZRUUdFd0pGClV6RWNNQm9HQTFVRUNnd1RSbWx5YldGd2NtOW1aWE5wYjI1aGJDQlRRVEVZTUJZR0ExVUVZUXdQVmtGVVJWTXRRVFl5TmpNME1EWTQKTVNjd0pRWURWUVFEREI1R1NWSk5RVkJTVDBaRlUwbFBUa0ZNSUVOQklGSlBUMVF0UVNCWFJVSXdIaGNOTWpJd05EQTJNRGt3TVRNMgpXaGNOTkRjd016TXhNRGt3TVRNMldqQnVNUXN3Q1FZRFZRUUdFd0pGVXpFY01Cb0dBMVVFQ2d3VFJtbHliV0Z3Y205bVpYTnBiMjVoCmJDQlRRVEVZTUJZR0ExVUVZUXdQVmtGVVJWTXRRVFl5TmpNME1EWTRNU2N3SlFZRFZRUUREQjVHU1ZKTlFWQlNUMFpGVTBsUFRrRk0KSUVOQklGSlBUMVF0UVNCWFJVSXdkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFSSFUrb3NFYVIzeHlycTg5WmZlOU1Fa1Z6NgppTVlpdVlNUVluZUVNeTNwQTRqVTREUDM3WGNzU21EcTVHK3RiYlQ0VElxazVCL0s2azg0U2k2Q2N5dkhacHNLakVDY2ZJcjI4amxnCnN0N0w3TGprYitxYlhiZFRrQmd5VmNVZ3Q1U2pZekJoTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SHdZRFZSMGpCQmd3Rm9BVWsrRkQKWTF3OG5kWW44MUxzRjdLcHJ5ejNkdmd3SFFZRFZSME9CQllFRkpQaFEyTmNQSjNXSi9OUzdCZXlxYThzOTNiNE1BNEdBMVVkRHdFQgovd1FFQXdJQkJqQUtCZ2dxaGtqT1BRUURBd05vQURCbEFqQWRmS1I3dzRsMU0rRTdxVVcvUnVucG9kM0pJaGEzUnhFTDJKcTY4Y2dMCmNGQlRBcEZ3aFZtcEhxVG02aU14b0FBQ01RRDk0dml6cnhhNUhuUEVsdVBCTUJuWWZ1YkRsOTRjVDdpSkx6UHJTQThaOTRkR1hTYVEKcFlYRnVYcVVQb2VvdlFBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUV0NBIENZQkVSIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGalRDQ0EzV2dBd0lCQWdJUVFBRTBqTUlBQUFBQUFBQUFBVHp5eGpBTkJna3Foa2lHOXcwQkFRd0ZBREJRTVFzd0NRWURWUVFHCkV3SlVWekVTTUJBR0ExVUVDaE1KVkVGSlYwRk9MVU5CTVJBd0RnWURWUVFMRXdkU2IyOTBJRU5CTVJzd0dRWURWUVFERXhKVVYwTkIKSUVOWlFrVlNJRkp2YjNRZ1EwRXdIaGNOTWpJeE1USXlNRFkxTkRJNVdoY05ORGN4TVRJeU1UVTFPVFU1V2pCUU1Rc3dDUVlEVlFRRwpFd0pVVnpFU01CQUdBMVVFQ2hNSlZFRkpWMEZPTFVOQk1SQXdEZ1lEVlFRTEV3ZFNiMjkwSUVOQk1Sc3dHUVlEVlFRREV4SlVWME5CCklFTlpRa1ZTSUZKdmIzUWdRMEV3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRREcrTW9lMlFrZ2ZoMXMKVHM2UDQwY3pSSnpIeVdtcU9sdDQ3bkRTa3ZnRXMxSlNIV2R5S0tIZmkxMlZDdjdxemUzM0tjN3diMytzelQzdnN4eEZhdmNva1BGaApWOFVNeEtOUVhkN1V0Y3NaeW9DNWRjNHB6dEtGSXV3Q1k4eEVNQ0RhNnBGYlZ1WWRITldkWnNjLzM0YktTMVBFMlkyeUhlcjQzQ2RUCm8wZmhZY3g5dGJENDduT1J4YzV6Yjg3dUVCOGFCcy9wSjJERlR4bms2ODRpSmtYWFlKbmR6azgzNEgvblk2Mnd1Rm00MEFab05XRFQKTnE1eFF3VHhhV1Y0ZlBNZjg4b29uMW9nbFdhMHpiZnVqM2lrUlJqcEppK05teWtvc2FTM09tMjUxQnc0Y2tWWXNWN3I4Q2lidDRMSwovYy9XTXcrZis1ZWVzUnljbnVwZlh0dXEzVlRwTUNFb2JZNTU4M1dTakNiKzNNWDJ3N0RmUkZsRG83WURLUFlJTUtvTk0rSHZuS2tICkl1TlpXMENQMm9pM2FRaW90eU11UkFsWk4xdkg0eGZ5SXV0dU9WTEYzbFNubU1sTElKWGNSb2xmdEJMNWhTbU82OGduRlNEQVM5VE0KZkF4c05Bd21teVl4cGp5bjl0blFTNkprL3p1WlFYTEI0SENYOFNTN0s4UjBJckdzYXlJeUpOTjRLc0RBb1MveFVnWEpQKzkyWnVKRgoyQTA5clpYSXg0a215QSt1cHdNdSs4RmYraURoY0syd1pTQTNNMkN3MWEvWERCekNrSERYU2hpOGZnR3dzT3NWSGtRR3phUlA2QXpSCnd5QVE0VlJsbnJaUjBCcDJhMEphV0hZMDZyYzNHYTR1ZGZtVzVjRlo5NVJYS1NXTk9reXJUWnBCMEY4bUF3SURBUUFCbzJNd1lUQU8KQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWZCZ05WSFNNRUdEQVdnQlNkaFdFVWZNRmliNWRvNUU4MwpRT0d0NEExV056QWRCZ05WSFE0RUZnUVVuWVZoRkh6QlltK1hhT1JQTjBEaHJlQU5WamN3RFFZSktvWklodmNOQVFFTUJRQURnZ0lCCkFHU1Blc1JpRHJXSXpMakhoZzZoU2hiTmNBdTNwNFVMczNhMkQ2Zi9DSXNMSmMrbzFJTjFLcmlXaUxiNzN5MHR0R2xUSVRWWDFvbE4KYzc5cGozQ2pZY3lhMng2YTRDRDRiTHViSXAxZGhER2FMSXJkYXFIWEtHbksvblpWZWtabjY4eERpQmFpQTlhNUYvZ1piRzBqQW4veApYOUFLS1NNNzBhb0s3YWtYSmxRS1RjS2xUZmpGL2JpQnp5c3NlS05uVEtrSG12UGZYdnQ4OVluTmRKZGhFR29ISzRGYTBvNjM1eURSCklHNGtxSVFub1Zlc3FsVllMOXpaeXZwb0JKN3RSQ1Q1ZEVBN0l6T3JnMW9ZSmtLMmJWUzFGbUF3YkxHZytMaEJvRjFKU2RKbEJUcnEKL3AxaHZJYlp2OTdUdWpxeGYzNlNOSTdKQUc3Y21MM2M3SUFGclFJOTMyWHRDd1AzOXhhRUJERzZrNVRZOGhMNGl1Ty9RcStuMU0wUgpGeGJJUWgwVXFFTDIwa0NHb0U4anlwWkZWbUFHemJkVkFhWUJsR1grYmdVSnVyU2txdUx2V0w2OUoxYlk3M054VzBRejhwcHk2ckJlClBtNnBVbHZzY0cyMWg0ODNYanlNbk03azhNNE1aMEhNenZhQXEwN01URmIxd1dGWms3UStwdHE0TnhLZktqTGppN2doN01NclpRenYKSXQ2SUtUdE0xL3IrdCtGSHZwdytQb1A3VVYzMWFQY3VJWVhjdi9GYTRuelh4ZVNEd1dycnVvQmEzbHd0Y0hiNHlPV0hoOHFnbmFIbApJaEluRDBROUhXenExTUtMTDI5NXEzOVFwc1FacDZGNnQ1YjV3UjlpV3FKREIwQmVKc2FzN2E1d0ZzV3F5bktLVGJEUEFZc0RQMjdYCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNlY3VyZVNpZ24gUm9vdCBDQTEyCj09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEY2pDQ0FscWdBd0lCQWdJVVp2bkh3YS9zd2xHMDdWT1g1dWFDd3lzY2tCWXdEUVlKS29aSWh2Y05BUUVMQlFBd1VURUxNQWtHCkExVUVCaE1DU2xBeEl6QWhCZ05WQkFvVEdrTjVZbVZ5ZEhKMWMzUWdTbUZ3WVc0Z1EyOHVMQ0JNZEdRdU1SMHdHd1lEVlFRREV4UlQKWldOMWNtVlRhV2R1SUZKdmIzUWdRMEV4TWpBZUZ3MHlNREEwTURnd05UTTJORFphRncwME1EQTBNRGd3TlRNMk5EWmFNRkV4Q3pBSgpCZ05WQkFZVEFrcFFNU013SVFZRFZRUUtFeHBEZVdKbGNuUnlkWE4wSUVwaGNHRnVJRU52TGl3Z1RIUmtMakVkTUJzR0ExVUVBeE1VClUyVmpkWEpsVTJsbmJpQlNiMjkwSUVOQk1USXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDNk9jRTMKZW1oRkt4UzA2K1FUNjFkMUkwMlBKQzBXNks2T3lYMmtWenNxZGlVemcyenFNb3FVbTA0OGx1VDlVYitaeVpOK3YvbXRwN0pJS3djYwpKL1ZNdkhBU2Q2U0ZWTFg5a0hya28rUlJXQVBORUhsNTdtdVRIMlNPYTJTcm94UGpjZjU5cTV6ZEoxTTNzNm9Zd2xrbTdGc2YwdVpsCmZPK1R2ZGhZWEF2QTQyVnZQTWZLV2VQK2JsK3NnNzc5WFNWT0tpazcxZ3VyRnpKNHBPRStsRWErWW02YjNrYW9zUmJuaFc3MENFQkYKRWFDZVZFU0U5OWcyenZWUVI5d3NNSnZ1d1BXVzB2NEpoc2NHV2E1UHJvNFJtSHZ6QzFLcVlpYXFJZCtPSlRONWx4WkpqZlUrMVVlZgpOekZKTTNJRlRReTJWWXp4VjQrS2g5R3R4UkVTT2FDdEFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQCkFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCUlhOUE4wendSTDFTWG04VUMyTEV6WkxlbWdyVEFOQmdrcWhraUc5dzBCQVFzRkFBT0MKQVFFQVBydmJGeGJTOGhRQklDdzRnMHV0dnNxRmVwcTJtMnVtNGZ5bE9xeXR0Q2c2cjljQmcwa3JZNkxkbW1RT21GeHYzWTY3aWxRaQpMVW9UODY1QVE5dFBrYmVHR3V3QXRFR0JwRS82YW91SXMzWUljaXBKUU1QVHc0V0ptQkNsblc4WnQ3dlBlbVZWMnpmclBJcHlNcGNlCm1paytyWTNtb3h0dDlYVWE1ckJvdVZ1aTdtbEhKeldoaHBtQTh6Tkw0V3VrSnNQdmRGbHNlcUprdGg1RXcxRGdEems5cVRQeHBmUFMKdldLRXJJNGNxYzFhdlRjN2Jnb2l0UFFWNTVGWXhUcEUwNVVvMmNCbDZYTEswQSs5SDdNVjJhbmpwRWNKbnVETE4vdjl2WmZWdmhnYQphYUk1Z2RrYTlhdC95T1BpWnd1ZDlBenFWTi9Tc3EreEl2RWczN3hFSEE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTZWN1cmVTaWduIFJvb3QgQ0ExNAo9PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmNqQ0NBMXFnQXdJQkFnSVVaTnRhRENCTzZOY3BkOGhRSjZKYUo5MHQ4c3N3RFFZSktvWklodmNOQVFFTUJRQXdVVEVMTUFrRwpBMVVFQmhNQ1NsQXhJekFoQmdOVkJBb1RHa041WW1WeWRISjFjM1FnU21Gd1lXNGdRMjh1TENCTWRHUXVNUjB3R3dZRFZRUURFeFJUClpXTjFjbVZUYVdkdUlGSnZiM1FnUTBFeE5EQWVGdzB5TURBME1EZ3dOekEyTVRsYUZ3MDBOVEEwTURnd056QTJNVGxhTUZFeEN6QUoKQmdOVkJBWVRBa3BRTVNNd0lRWURWUVFLRXhwRGVXSmxjblJ5ZFhOMElFcGhjR0Z1SUVOdkxpd2dUSFJrTGpFZE1Cc0dBMVVFQXhNVQpVMlZqZFhKbFUybG5iaUJTYjI5MElFTkJNVFF3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRREYwbnFoCjFvcS9GakhRbU5FNmxQeGF1RzRpd1dMM3B3b243MUQyTHJHZWFCTHdiQ1JqT2ZIdzN4REczcmRTSU5WU1cwS1pudk9ndmxJZlg4eG4KYmFjdVVLTEJsNDIyK0pYMXNMcmNuZUMreTkvM09QSkg5YWFha3BVcVlsbFFDNkt4TmVkbHNtR3k2cEp4YWVRcDhFK0JnUVE4c3FWYgoxTVdvV1dkN1ZSeEpxM3Fkd3VkelRlL05DY0xFVnhMYkFRNGplUWtITzZMby9JclBqOEJHSkp3NEorQ0RuUnVndjNnVkVPdUdUZ3BhCi9kL2FMSUorN3NyMktlSDZjYUgzaUdpY25QQ052ZzlKa2RqcU92bjkwR2h4MittMUswNkNrbTltSCtEdzNFenN5dEhxdW5RRytiT0UKa0pUUlg0NXpHUkJkQXVWd3BjQVEwQkI4YjhWWVNiU3dicHJhZlpYMXpOb0NyN2dzZlhtUHZrUHgrU2dvalFsRCtBamRhOGlMTENTeApqVklIdlhpYnk4cG9zcVRkREV4NVlNYVowWlB4TUJvSDA2NGl3dXJPOFlRSnpPQVVibjgvZnRLQ2hhemNxUlpPaGFCZ3kvYWMxOGl6Cmp1M0dtNWgxRFZYb1grV1Zpd0trcmtNcEtCR2s1aEl3QVV0MWF4NW1uWGt2cFhZdkhVQzBiY2w5ZVFqczBXcTJYU3F5cFdhOWE0WDAKZEZiRDllZDFVaWdzcGY5bVI2WFUvdjZlVkw5bGZnSFdNSStsTnB5aVVCenVPSUFCU01iSGRQVEdyTU5BU1JaaGRDeXZqRzgxN1hzWQpBRnMyUEp4UURjcVNNeER4SmtsdDMzVWtONElpMStpVy9SVkxBcFkrQjNLVmZxczlUQzdYeXZEZjRGZy9MUzhFbWppakFRSURBUUFCCm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVVCcE9qQ2w0b2FUZXEKWVIzcjYvd3RieVBrODZBd0RRWUpLb1pJaHZjTkFRRU1CUUFEZ2dJQkFKYUFjZ2tHZnB6TWt3UVd1NkE2alpKT3R4RWFDbkZ4RU0wRQpyWCtsUlZBUVprNUtRYUlEMlJGUGVqZTVTK0xHanpKbWRTWDc2ODQvQXlrbWpiZ1dIZllmTTI1STV1ajRWN0liZWQ4N2h3cmlaTG9BCnltenZmdEFqNjNpUC8yU2JORGVmTldXaXBBQTlFaU9XV0YzS1k0Zkdvd2VJVGVkcGRvcFR6ZkZQN0VMeWsrT1pwRGM4aDdoaTIvRHMKSHpjL04xOUR6RkdkdGZDWHdyZUZhbWdMUkI3bFVlNlR6a3R1aHNIU0RDUlpOaHFmTEpHUDR4amJsSlVLN1pHcURwbmNsbFBqWVlQRwpGcm9qdXR6ZGZockdlMEsyMlZvRjNKcGYxZCs0MmtkOTJqamJyRG5WSG10c0toZU1ZYzJ4YlhJQnc4TWdBR0pvRmpIVmRxcUd1dzZxCm5zYjU4Tm40RFNFQzVNVW9GbGtSdWRscGN5cVNlTGlTVjVzSThqcmxMNVd3V0xkcklCUnRGTzhLdkg3WVZkaUkyaS82R2FYN2krQi8KT2ZWeUs0WEVMS3p2R1VXU1RMTmhCOXhOSDI3U2dSTmNtdk1TWjRQUG16K0xuNTJrdWFpV0EzckY3aURlTTlvdm5ocDZkQjdoN3N4YQpPZ1Rkc3hvRXFCUmpyTGRIRW9PYWJQWG02UlVWa1JxRUdRNlVST2NTamlWYmdHY1ozR09URUF0bExvcjZDWnBPMm9Zb2ZhcGhOZGdPCnB5Z2F1MUxnZVBoc3VteXdicm1IWHVtWk5UZnhQV1FycWFBMGs4OWpMOVdCMzY1ako2VWVUbzNjS1hoWitQbWhJSXluSmtCdWduTE4KZUxMSWp6d2VjK2ZCSDcvUHpxVXFtOXRFWkRLZ3UzOWNKUk5JdFgrUwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTZWN1cmVTaWduIFJvb3QgQ0ExNQo9PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0l6Q0NBYW1nQXdJQkFnSVVGaFhIdzloSnA3NXBESXFJN2ZCdytkMjNQb2N3Q2dZSUtvWkl6ajBFQXdNd1VURUxNQWtHQTFVRQpCaE1DU2xBeEl6QWhCZ05WQkFvVEdrTjVZbVZ5ZEhKMWMzUWdTbUZ3WVc0Z1EyOHVMQ0JNZEdRdU1SMHdHd1lEVlFRREV4UlRaV04xCmNtVlRhV2R1SUZKdmIzUWdRMEV4TlRBZUZ3MHlNREEwTURnd09ETXlOVFphRncwME5UQTBNRGd3T0RNeU5UWmFNRkV4Q3pBSkJnTlYKQkFZVEFrcFFNU013SVFZRFZRUUtFeHBEZVdKbGNuUnlkWE4wSUVwaGNHRnVJRU52TGl3Z1RIUmtMakVkTUJzR0ExVUVBeE1VVTJWagpkWEpsVTJsbmJpQlNiMjkwSUVOQk1UVXdkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFRTFVIU05aREtabWJQU1lBaTRJbzVHCmRDeDR3Q3RFTFcxZkhjbXVTMUlnZ3oyNEZHMVRoMkNlWDJ5RjJ3WVVsZURIS1ArZFgrU3E4Yk9MYmUxUEwwdkpTcFNSWkhYK0FlekIKMk90NmxIaFdHRU5mYTRITDlyemF0QXkyS1pNSWFZK2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRRApBZ0VHTUIwR0ExVWREZ1FXQkJUclFjaXUvTldlVVVqMXZZdjBoeUNUUVN2VDlEQUtCZ2dxaGtqT1BRUURBd05vQURCbEFqRUEyUzZKCmZsNU9wQkVIdlZuQ0I5NnJNamhUS2taRUJoZDZ6bEhwNFA5bUxRbE80RS8wQmRHRjlqVmczUFZ5czBaOUFqQkVtRVlhZ29VZVlXbUoKU3dkTFpyV2VxcnFnSGtIWkFYUTZia1U2aVlBWmV6S1lWV09yNjJOdWsyMnJHd2xnTVU0PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpELVRSVVNUIEJSIFJvb3QgQ0EgMiAyMDIzCj09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZxVENDQTVHZ0F3SUJBZ0lRY3pzd0JFaGIyVTE0TG5OTHlhSGNaakFOQmdrcWhraUc5dzBCQVEwRkFEQklNUXN3Q1FZRFZRUUcKRXdKRVJURVZNQk1HQTFVRUNoTU1SQzFVY25WemRDQkhiV0pJTVNJd0lBWURWUVFERXhsRUxWUlNWVk5VSUVKU0lGSnZiM1FnUTBFZwpNaUF5TURJek1CNFhEVEl6TURVd09UQTROVFl6TVZvWERUTTRNRFV3T1RBNE5UWXpNRm93U0RFTE1Ba0dBMVVFQmhNQ1JFVXhGVEFUCkJnTlZCQW9UREVRdFZISjFjM1FnUjIxaVNERWlNQ0FHQTFVRUF4TVpSQzFVVWxWVFZDQkNVaUJTYjI5MElFTkJJRElnTWpBeU16Q0MKQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFLNy9DVm1SZ0FwS2FPWWtQN2luNU1nNkNqb1d6Y2tqWWFDVApjZktyaTNPUG9HZGxZTkpVYTJOUmIwa3o0SElIRTMwNHpRYVNCeWxTYTA1M2JBVFRsZnJkVEl6WlhjRmhmVXZuS0xORWdYdFJyOTB6CnNXaDgxazVNL2l0b3VjcG1hY1RzWGxkLzl3M0huRFkyNVFkZ3JNQk02Z2hzN3daOFQxc29lZ2o4azEyYjlweTBpNGE2SWJuMDhPaFoKV2lpaE5JUWFKWkcydFkvdnN2bUErdms5UEJGeTJPTXZobmJGZVN6QnFaQ1RScGhueTROcW9GQWpwenYyZ1RuZzdmQzV2Mlh4Mk10NgorKzl6QTg0QTlIM1g0RjA3WnJqY2pycUR5NGQyQS93bDJlY2pid2I5Wi9QZy80UzhSNysxRmhoR2FSVE1CZmZiMDBtc2E4eXI1TFVMClF5UmVTMnROWjkvV3RUNVBlQitVY1NUcTNuRDg4WlArbnBOYTVKUmFsMVFNTlh0ZmJPNEFIeVRzQTdvQzlYYjBuOVNhN1lVc09DSXYKeDlndmRoRlAvV3hjNlBXT0o0ZC9HVW9oUjVBZGVZMGNXL2pQU29YazdiTmJqYjdFWkNoZFFjUnVyRGhhVHlOMGRLa1N3L2JTdVJFVgpNd2VSMkRzM09tTXdCdEhGSWpZb1lpTVE0RWJNbDZ6V0sxMWtKTlh1SEE3ZSt3aGFkU3IyWTIzT0MwSyswYnB3SEp3aDVROHhhUmZYCi9BcTAzdTJBbk11U3RJdjEzbG1pV0FtbFkwY0w0VUV5TkVIWm1ySFpxTEFiV3Q0TkRmVGlzbDAxZ0xtQjFJUnBrUUxMZGRDTnhiVTkKQ1pFSmp4U2hGSFI1UHRiSkZSMmtXVmtpM1BhS1JUMDhFdFkrWFRJdkFnTUJBQUdqZ1k0d2dZc3dEd1lEVlIwVEFRSC9CQVV3QXdFQgovekFkQmdOVkhRNEVGZ1FVWjVEdzF0NjFHTlZHS1g1Y3EvaWVDTHhrbFJBd0RnWURWUjBQQVFIL0JBUURBZ0VHTUVrR0ExVWRId1JDCk1FQXdQcUE4b0RxR09HaDBkSEE2THk5amNtd3VaQzEwY25WemRDNXVaWFF2WTNKc0wyUXRkSEoxYzNSZlluSmZjbTl2ZEY5allWOHkKWHpJd01qTXVZM0pzTUEwR0NTcUdTSWIzRFFFQkRRVUFBNElDQVFBMDk3TjNVOXN3RnJrdHBTSHhRQ0YxNit0SUZvRTljK0NlSnlycgpkNmtUcEdvS1dsb1VNejFvSDRHdWFmMk1uMlZzTkVMWkxkQi9lQmF4T3F3ak1hMWVmNjducml2NnV2dzhsNVZBazEvRExRT2o3YVJ2ClU5ZjZRQTR3OVFBZ0xBQk1qRHUwb3grMnY1RXlxNitTbU5NVzV0VFJWRnhEV3k2dTcxY3FxTFJ2cE84TlZoVGFJYXNnZHA0RC9DYTQKbmo4K0F5Ym1UTnVkWDBLRVBVVURBeHhaaU1yY0xtRWtXcVRxSnd0ekVyNVNzd3JQTWhmaUhvY2FGcFZJYlZyZzBNOEpraVpta2RpagpZUTZxZ1lGLzZGS0MwVUxuNEIwWStxU0ZOdWVHNEEzcnZOVEoxanhEOFYxSmJuNkJtMm0xaVdLUGlGTFkxLzRud1NQRnl5c0N1N0ZmCi92dERoUU5HdmwzR3lpRW0vOWNDbm5SSzNQZ1RGYkdCVnpiTFpWelJIVEYzNlNYRHc3SXlOOVh4bUFua2JXT0FDS3NHa29IVTZYQ1AKcHoreTdZYU1nbW8xeUVKYWd0RlNHa1VQRmFVQThKUjdaU2RYT1VQUGZIL212VFd6ZS9FWlRONDZscy9wZHU0RDU4SkRVanhxZ2VqQgpXb0M5RVYyVGEvdkg1bVEvdTJrYzZkMGxpNjkweVZSQXlzdVRFd3J0KzJhU0VjcjF3UHJZZzFVRGZOUEZJa1oxY0d0NVNBWXFncHEvCjV1c1dEaUpGQWJ6ZE5wUTBxVFVtaXRlWHVlNEljcjgwa25DRGdLczRxbGxvM1VDa0dKQ3k4OVVEeWliSzc5WEg0STlUanZBQTQ2anQKbi9tdGQrQXJZMCtldys0M3UzZ0poSjY1YnZzcG1aRG9nTk9mSkE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUcnVzdEFzaWEgVExTIEVDQyBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNNVENDQWJlZ0F3SUJBZ0lVTm5UaFRYeGxFOG1zZzFVbG9ENVNmaTlRYU1jd0NnWUlLb1pJemowRUF3TXdXREVMTUFrR0ExVUUKQmhNQ1EwNHhKVEFqQmdOVkJBb1RIRlJ5ZFhOMFFYTnBZU0JVWldOb2JtOXNiMmRwWlhNc0lFbHVZeTR4SWpBZ0JnTlZCQU1UR1ZSeQpkWE4wUVhOcFlTQlVURk1nUlVORElGSnZiM1FnUTBFd0hoY05NalF3TlRFMU1EVTBNVFUyV2hjTk5EUXdOVEUxTURVME1UVTFXakJZCk1Rc3dDUVlEVlFRR0V3SkRUakVsTUNNR0ExVUVDaE1jVkhKMWMzUkJjMmxoSUZSbFkyaHViMnh2WjJsbGN5d2dTVzVqTGpFaU1DQUcKQTFVRUF4TVpWSEoxYzNSQmMybGhJRlJNVXlCRlEwTWdVbTl2ZENCRFFUQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkxoLwpwVnMvQVQ1OThJaHRyaW1ZNFp0Y1U1bmI5d2ovMVdyZ2pzdEVwdkRCakwxUDFNN1VpRlBvWGxmWFRyNHNQL01TcHdEcGd1TXFXeko4ClM1c1VLWjc0TFlPMTY0NHhTVDBtWWVrZGNvdUp0Z3E3bkRNMUQ5cnMzcWxLSDhrenNhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIKL3pBZEJnTlZIUTRFRmdRVUxJVlR1N0ZEelRMcW5xT0gvcUtZcUthVDZSQXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01Bb0dDQ3FHU000OQpCQU1EQTJnQU1HVUNNRlJIMThNdFlZWkk5SGxhVlEwMUwxOE45bWRzZDBBYVJ1ZjRhRnRPSngyNG1IMS9rNzhJVGNUYVJUQ2hEMTVLCmVBSXhBS09SaC9JUk00UER3WXFST2t3clVMRzlJcFJkTllsemc4V2JHZjYwb2VuVW9XYTJBYVUyK2Rob1lTaTNkT0dpTVE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUcnVzdEFzaWEgVExTIFJTQSBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZnRENDQTJpZ0F3SUJBZ0lVSEJqWXorVlRQeUkxUmxOVUpEeHNSOUZjU3B3d0RRWUpLb1pJaHZjTkFRRU1CUUF3V0RFTE1Ba0cKQTFVRUJoTUNRMDR4SlRBakJnTlZCQW9USEZSeWRYTjBRWE5wWVNCVVpXTm9ibTlzYjJkcFpYTXNJRWx1WXk0eElqQWdCZ05WQkFNVApHVlJ5ZFhOMFFYTnBZU0JVVEZNZ1VsTkJJRkp2YjNRZ1EwRXdIaGNOTWpRd05URTFNRFUwTVRVM1doY05ORFF3TlRFMU1EVTBNVFUyCldqQllNUXN3Q1FZRFZRUUdFd0pEVGpFbE1DTUdBMVVFQ2hNY1ZISjFjM1JCYzJsaElGUmxZMmh1YjJ4dloybGxjeXdnU1c1akxqRWkKTUNBR0ExVUVBeE1aVkhKMWMzUkJjMmxoSUZSTVV5QlNVMEVnVW05dmRDQkRRVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUApBRENDQWdvQ2dnSUJBTU1XdUJ0cXBFUno1ZFpPOUxuUFd3dkIwWnFCOVdPd2owUEJ1d2hhR25yaEIzWW1INDlwVnI3K05tRFFESVBOCmxPcm54UzFjTHdVV0FwNEtxQy9sWUNaVWx2aVlRQjJzcnAxMFp5OVUrNVJqbU9NbVNvUEdsYllKUTFETkRYM2VSQTVnRWs5Yk5iMi8KbVRodGZXemE0bWh6SC9reHBSa1Fjd1Vxd3pJWmhlbzBxdDFDSGpDTlA1NjFIbUhWYjcwQWNuS3RFaitxcGtsejhvWVZsUXdRWDFGawp6djkzdU1sdHJPWFZtUEdaTG16anlVVDV0VU1uQ0UzMmZ0NUVlYnV5akJ6YTAwdHNMdGJEZUxkTTFhVGsydHlLamc3L0Q4T21ZQ1lvCnp6YS8rbGNLN0ZzLzZUQVdlOFRieE5Sa29ERDc1ZjBkY1pMZEtZOUJXTjRBclRyOVBYd2FxTEVYOEU0MGVGZ2wxb1VoNjNrZDBOeXIKejJJOHNNZVhpOWJRbjlQK1BON0Y0L3c2ZzNDRUlSMEp3cUg4dXlnaFpWTmdlcEJ0bGpoYi8vSFhlbHR0MDhsd1NVcTZIVHJRVU5veQpJQm5raXovcjFSWW1Oeno3ZFo2d0IzQzRGR0IzM1BZUFhGSUt2RjF0alZFSzJzVVl5SnR0M0xDRHMzK2pUbmhNbUNXcjhuNHVJRjZDCkZhYlcySStzNWMweWhzajU1TnFKNGpzK2s4VVRhdi9IOXhqOFo3WHZHQ3hVcTBEVGJFM3R4Y2kzT0U5a3hKUk1UNkROcnFYR0p5VjEKSjIzRzJweU9zQVdaMVNnUnhTSFV1UHpIbHF0S1pGbGhheFA4Uzh5U3BnK2tVYjhPV0pEWmdvTTVwbCt6K202U3M4MHpEb1dvOFNuVApxMW10MXR2ZTFDdUJBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGTGdIa1hsY0J2UkcvWHRaCnlsb21rYWRGSy9oVE1BNEdBMVVkRHdFQi93UUVBd0lCQmpBTkJna3Foa2lHOXcwQkFRd0ZBQU9DQWdFQUladHFCU0JkR0JhbkVxVDMKUnovTnlqdXVqc0NDenR4SUpYZ1hiT0RnY01UV2x0blo5cjk2bkJPN1U1V1MvOCtTNFBQRkp6VlhxRHVpR2V2NGlxTUUzbW1MNUR3OAp2ZVd2MEJJYjVZbHJjNXR2SlFKTGtJS3ZRTUt0dXBwZ0pGcUJUUVVZbytJemVYb0xINVB0N0RsSzlSTUU3STEwbllFS3FHL29kdjZMClR5dHBFb1lLTkRiZGdwdHZUK0J6M1VsL0tEN0pPNk5YQk5pVDJUd3AyeElRYU9IRWliZ0dJT2NiZXJ5eGsyR2FHVUFSdFdxRlZ3SHgKdGxvdEpuTW5sdm01UDF2UWlKM2tvUDI2VHBVSmczOTMzRkVGbEowZ2NYYXg3UHFKdFp3dWhmRzVXeVJhc1FtcjJzb2FCODJHMzl0cAoyN1JJR0FBdHZLTEVpVVVqcFE3aFJHVStpc0ZxTUIzaVlQZzZxb2NKUXJtQmt0d2xpSmlKOFh3MThXTEs3bm40R1MvK1gvamJoODdxCnFBOE1wdWdMb0R6Z2E1U1luSCt0QnVZYzZrSVFYK0ltRlR3M09mZlh2TzY0NWU4RDdyMGkreWlHTkZqRVduOWhvbmdQWHZQS25id2IKUEtmSUxmYW5JaEhLQTlqblp3cUtEc3MxampRNTJNanFqWjlrNERld2JOZkZqOEdRWVNiYkpJd2VTc0NJM3pXUXpqOEM5R1JoM3NmSQpCNVhlTWhnNmo2SkNRQ1RsMWpOZGZLN3ZzVTFQMUZlUU5XcmNyZ1NYU1lrMGx5NHdCT2VZOTlzTEFaREJId28vK01MK1R2cmJtbk56CkZyd0Z1SG5ZV2E4RzV6OW5PRG14Zkt1VTRDa1VwaWp5MzIzaW10dFVRL2hIV0tOZGRCV2N3YXV3eHpRPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpELVRSVVNUIEVWIFJvb3QgQ0EgMiAyMDIzCj09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZxVENDQTVHZ0F3SUJBZ0lRYVNZSmZvQkxUS0NuakhoaVUxOWFiekFOQmdrcWhraUc5dzBCQVEwRkFEQklNUXN3Q1FZRFZRUUcKRXdKRVJURVZNQk1HQTFVRUNoTU1SQzFVY25WemRDQkhiV0pJTVNJd0lBWURWUVFERXhsRUxWUlNWVk5VSUVWV0lGSnZiM1FnUTBFZwpNaUF5TURJek1CNFhEVEl6TURVd09UQTVNVEF6TTFvWERUTTRNRFV3T1RBNU1UQXpNbG93U0RFTE1Ba0dBMVVFQmhNQ1JFVXhGVEFUCkJnTlZCQW9UREVRdFZISjFjM1FnUjIxaVNERWlNQ0FHQTFVRUF4TVpSQzFVVWxWVFZDQkZWaUJTYjI5MElFTkJJRElnTWpBeU16Q0MKQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFOaU9vNG1BQzdKWFV0eXBVMHczdVg5akZ4UHZwMXNqVzJsMQpzSmtLRjhHTHhOdW80TXd4dXNMeXpWM3B0L2dkcjJyRWxZZlhSOG1WMklJRVVEMkJDUC9rUGJPeDFzV3kvWWdKMjV5RTdDVVhGSWQvCk1IaWJhbGpKdG5Nb1BEVDNtZmQvMDZiNEhFVjhyU3lNbEQvWVp4QlRmaUxOVGlWUjhDVWtOUkZlRU1ic2gyYUpnV2k2ekN1ZFIzTWYKdmMyUnBISnFuS0liR0tCdjdGRDBmVURDcUREUHZYUElFeXNRRXg2TG1xZzZsSFBUR0drS1N2L0JBUVAvZVgrMVNIOTc3dWdwYnpaTQpsV0dHMlBtaWM0cnVyaStXN21qTlBVMG9RdmxGS3pJYlJsVVdhcVpMS2ZtN2xWYS9SaDNzSFpNZHdHV3lINkZEcmxhZW9MR1BheEszCllHMTRDOHFLWE8wZWxnNkRwa2lWalR1akljU3VXTVlBc29TMEk2U1doalc0Mko3WXJEUkptR09WeGN0dFNFZmk4aTRZSHRBeHE5MTAKN1BuY2pMZ2NqbWdqdXREelVOelBaWTl6T2pMSGZQN0tnaUpQdm81aVIyYmx6WWZpNk5VUEdKL2xCSEpMUmp3UThrVENaRlp4VG5YbwpuTWttZE1WOVdkRUtXdzl0L3A1MUhCakdHanA4MkEwRXpNMjNSV1Y2c1krNHJvUklQck42VGFnRDR1SitBUlpaYUJoRE03RFMzTEFhClF6WHVwZHFwUmx5dWhvRkJBVXAwSnV5ZkJyL0NCVGRrZFhncGFQM0Y5ZXYrUi9ua2hiRGhlekdkcG45eW83bkVMQzdNbVZjT0lReEYKQVpSbDYyVUp4bU1pQ3pOSmtrZzgvTTNPc0Q2T25vdjQva25GTlhKSEFnTUJBQUdqZ1k0d2dZc3dEd1lEVlIwVEFRSC9CQVV3QXdFQgovekFkQmdOVkhRNEVGZ1FVcXZ5UkVCdUhrVjhXdWI5UFM1RmVBQnl4TW9Bd0RnWURWUjBQQVFIL0JBUURBZ0VHTUVrR0ExVWRId1JDCk1FQXdQcUE4b0RxR09HaDBkSEE2THk5amNtd3VaQzEwY25WemRDNXVaWFF2WTNKc0wyUXRkSEoxYzNSZlpYWmZjbTl2ZEY5allWOHkKWHpJd01qTXVZM0pzTUEwR0NTcUdTSWIzRFFFQkRRVUFBNElDQVFDVHk2VWZtUkhzbWcxZkxCV1R4aisrRUkxNFF2QnVrRWRIanFPUwpNbzF3ai9aYmpiNkp6a2NCYWhzZ0lJbGJ5SUlRYk9Ebm1hcHJ4aXFnWXpXUmFvVWxyUmM0cFp0K1VQSjI2b1VGS2lkQks3R0IwYUwyClFIV3BEc3Z4VlVqWTdOSHNzK2pPRktFMTdNSmVOUnFycGhZQkJvN3EzQytqaXNvc2tldFNqbDhNbXhmUHkzTUhHY1Jxd25OVTczeEQKVW1QQkVjckNSYkgwTzFQMWFhNDg0Nlhlck9oVXQ3S1IvYXlwSC9LSDVCZkdTYWg4MkFwQjlQSSs1M2MwQkZMZDZJSHlUUzlVUlowVgo0VS9NNWQ0MFZ4REpJM0lYY0kxUWNCOVdiTXk1L3pwYVQyTjZ3MjVsQngyRW9mK3BER09KYmJKQWlEblhIM2RvdGZ5YzFkWm5hVnVvCmROdjhpZlliTXZla0pLWjJ0MGRUNzQxSmo2bTJnMXFsbHBCRllmWGVBMDhtRDZpTDhBT1dzS3dWMEhGYWFudVU1bkNUMnZGcDRMSmkKVFo2UC80bWRtMTNOUmVtVUFpS040RFYvNlBFRWVYRnNWSVA0TTdrRk1odFlWUkZQME9VblIzSHM3ZHBuMW1LbVMwMFBhYUxKdk93aQpTNVRIYUpRWGZ1S09LRDYyeHVyMU5HeWZONGdIT051R2Nmck5sVWhEYnFOUGdvZlhOSmh1UzVONVlIVnBEL0FhMVZQNklRekNQK2svCkh4aU1rbDE0cDNabkdidXk2bi9wY0FsV1ZxT3dEQXN0Tmw3RjZjVFZnOHVHRjVjc2JCTnZoMXF2U2FZZDI4MDRCQzVmNGtvMURpMUwKK0tJa0JJM1k0V05lQXBJMDJwaGhYQnh2V0haa3Mvd0N1UFdkQ2c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTd2lzc1NpZ24gUlNBIFRMUyBSb290IENBIDIwMjIgLSAxCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZrekNDQTN1Z0F3SUJBZ0lVUS9vTVgwNGJnQmhFNzlHMFR6VWZSUFNBN2Nzd0RRWUpLb1pJaHZjTkFRRUxCUUF3VVRFTE1Ba0cKQTFVRUJoTUNRMGd4RlRBVEJnTlZCQW9UREZOM2FYTnpVMmxuYmlCQlJ6RXJNQ2tHQTFVRUF4TWlVM2RwYzNOVGFXZHVJRkpUUVNCVQpURk1nVW05dmRDQkRRU0F5TURJeUlDMGdNVEFlRncweU1qQTJNRGd4TVRBNE1qSmFGdzAwTnpBMk1EZ3hNVEE0TWpKYU1GRXhDekFKCkJnTlZCQVlUQWtOSU1SVXdFd1lEVlFRS0V3eFRkMmx6YzFOcFoyNGdRVWN4S3pBcEJnTlZCQU1USWxOM2FYTnpVMmxuYmlCU1UwRWcKVkV4VElGSnZiM1FnUTBFZ01qQXlNaUF0SURFd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURMS21qaQpDOE5YdkRWanZIQ2xPL09NUEU1WGxtN0RUamFrOWdMS0hxcXV1TjZvcngxMjJybzEwSkZ3QjkrekJ2S0s4aTVWVVh1N0xDVExmNUltCmdLTzBsUGFDb2FUbytuVWRXZk1IYW1GazRzYU1sYStqdTQ1dlZzOXh6RjZCWVExdDhxc0NMcVNYNVhIOGlyQ1JJRnVjZEZKdHJoVW4KV1hqeUNjcGxEbi9MOU92bjNLbE1kL1lyRmdTVnJweHhwVDhxMmtGQzV6eUVFUFRoUFl4cjRpdVJSMVZQdUZhK1JkNGlVVTFPS05sZgpHVUVHanc1TkJ1QndRQ01CYXVUTEU1dHpyRTBVU0pJdC9tMm4rSWRyZVhYaHZoQ3hxb2hBV1ZUWHo4VFFtMFN6T0dsa2pJSFJJMzZxCk9UdzdENTlLZTRMS2EyL0tJajR4MExEUUtoeVNpby9ZR1p4SDVENE11Y0xOdmtFTStLUkhCZHZCRnpBNE9tbmN6Y05wSS8yYUR3TE8KRUdyT3l2aTVLYU0yaVlhdUM4QlBZN2tHV1VsZURzRnBzd3J6ZDM0dW5ZeXpKNWpTbVkwbHB4K0dzNlpVY0RqOGZWM29UNE1NMFpQbApFdVJVMmo3eXJUcmVQanhGOENnUEJybmgyNWQ3bVVXZTNmNlZXUVF2ZFQvVHJvbVpocXdVdEtpRStzaGRPeHRZazhFWGxGWElDK09DCmVZU2Y4d0NFTk83Y01kV1A4dnBQbGt3R3FuajczbVNpSTgwZlBzV012RGRVRHJ0YWNsWHZ5RnUxY3ZoNDN6Y2dURmVSYzVKenJCaDMKUTRJZ2FlenByQ2xHNVF0TytEZHppWmFLSEcyOTc3N1l0dlRLd1AxSDhLNExXQ0RGeUIwMnJwZU5VSU1tSkNuM25Uc1BCUUlEQVFBQgpvMk13WVRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFmQmdOVkhTTUVHREFXZ0JSdmptS0xrME93CjRVRDJwOFA5OFErNER4VTRwVEFkQmdOVkhRNEVGZ1FVYjQ1aWk1TkRzT0ZBOXFmRC9mRVB1QThWT0tVd0RRWUpLb1pJaHZjTkFRRUwKQlFBRGdnSUJBS3dzS1VGOStsejFHcFVZdnl5cGlxa2tWSFgxdUVDcnk2Z2tVU3NZUDJPcHJwaFdLd1ZESXFPMzEwYWV3Q29TUFk2Vwpsa0RmRERPTGF6ZVJPcFc3T1NsdHdBSnNpcFFMQndKTkdENzcrM3YxZGoyYjlsNHdCbGd6SHFwNDFlWlVCRHF5Z2dtTnpoWXpXVVVvCjhhV2psdzVESS8wTElJQ1EvK01tejdoa2tlVUZqeE9nZGczWE53d1FpSmIwUHI2VnZmSERmZkNqdzNsSEMxeVNGV1B0VW5XSzUwWnAKeTFGVkN5cE05ZkprVDZsYy8yY3lqbFV0TW9JY2dDOXFrZmpMdkg0WW9pYW9McU5US0lmdFYrVmxlazRBU2x0T1U4bGlOcjNDamx2cgp6RzRuZ1JoWmkwUmpuOVVNWmZRcFpYK1JMT1YvZnVpSno0OGd5MjBIUWhGUkpqS0tManBIRTdpTnZVY05DZkFXcE8yV2hpNFoyTDZNCk91aEZMaEc2cmxybnViK3h6SS9nb1ArNHM5R0ZlM2xtb3ptMU8yYllRTDdQdDJlTFNNa1pKVlg4dlkzUFh0cE9wdkpwenYxL1RIZlEKd1VZMW1Gd2ptd0pGUTVSYTNieEhyU0wrdWw0dmtTa3BobnNoM201a3Q4c05qemRib3docTYvVGRBbzlRQXdLeHVEZG9sbERydUYvVQpLSXFsSWd5S2hQQlpMdFUzMFdIbFFuTllLb0gzZHR2aTRrME5YL2EzdmdXMHJrNE4zaFk5QTRHekpsNUx1RXNBei8rTUY3cHNZQzBuCmh6Y2s1bnBnTDdYVGd3U3FUME4xb3NHRHNpZVlLN0VPZ0xyQWhWNUN1ZCt4WUpIVDZ4aCtjSGl1ZG9PK2NWclFrT1BLd1JZbFowcncKdG51NjRaeloKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKT0lTVEUgU2VydmVyIFJvb3QgRUNDIEcxCj09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ05UQ0NBYnFnQXdJQkFnSVFJL25EMWpXdmp5aExIL0JVNm42WG5UQUtCZ2dxaGtqT1BRUURBekJMTVFzd0NRWURWUVFHRXdKRApTREVaTUJjR0ExVUVDZ3dRVDBsVFZFVWdSbTkxYm1SaGRHbHZiakVoTUI4R0ExVUVBd3dZVDBsVFZFVWdVMlZ5ZG1WeUlGSnZiM1FnClJVTkRJRWN4TUI0WERUSXpNRFV6TVRFME5ESXlPRm9YRFRRNE1EVXlOREUwTkRJeU4xb3dTekVMTUFrR0ExVUVCaE1DUTBneEdUQVgKQmdOVkJBb01FRTlKVTFSRklFWnZkVzVrWVhScGIyNHhJVEFmQmdOVkJBTU1HRTlKVTFSRklGTmxjblpsY2lCU2IyOTBJRVZEUXlCSApNVEIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJCY3YraEs4ckJqekN2UkUxblpDbnJQb0g3ZDVxVmkyK0dYUk9pRlBxT3VqCnZxUXljdk8yQWNrci9YZUZibFBkcmVxcUxpV1N0dWtoRWFpdnRVd0w4NVpnbWp2bjZocDRMclE5NVNqZUhJQzZYRzROMnhtbDR6K2MKS3JoQVM5M21UNk5qTUdFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZkJnTlZIU01FR0RBV2dCUTNUWWhsei93OWl0V2o4VW5BVGd3UQpiMEswbkRBZEJnTlZIUTRFRmdRVU4wMklaYy84UFlyVm8vRkp3RTRNRUc5Q3RKd3dEZ1lEVlIwUEFRSC9CQVFEQWdHR01Bb0dDQ3FHClNNNDlCQU1EQTJrQU1HWUNNUUNwS2pBZDBNS2ZrRkZSUUQ2VlZDSE5GbWIzVTJ3SUZqblFFbngvWXh2ZjR6Z0FPZGt0VXlCRkN4eGcKWnpGREplMENNUUNTaWE3cFhHS0RZbUg1TFZlclZya1IzU1crYWs1S0dvSnIzTS9UdkVxelBOY3VtOXY0S0dtOGF5M3NNYUU2NDFjPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpPSVNURSBTZXJ2ZXIgUm9vdCBSU0EgRzEKPT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGZ3pDQ0EydWdBd0lCQWdJUVZhWFpaNVFveHUwTStpZmRXd0ZOR0RBTkJna3Foa2lHOXcwQkFRd0ZBREJMTVFzd0NRWURWUVFHCkV3SkRTREVaTUJjR0ExVUVDZ3dRVDBsVFZFVWdSbTkxYm1SaGRHbHZiakVoTUI4R0ExVUVBd3dZVDBsVFZFVWdVMlZ5ZG1WeUlGSnYKYjNRZ1VsTkJJRWN4TUI0WERUSXpNRFV6TVRFME16Y3hObG9YRFRRNE1EVXlOREUwTXpjeE5Wb3dTekVMTUFrR0ExVUVCaE1DUTBneApHVEFYQmdOVkJBb01FRTlKVTFSRklFWnZkVzVrWVhScGIyNHhJVEFmQmdOVkJBTU1HRTlKVTFSRklGTmxjblpsY2lCU2IyOTBJRkpUClFTQkhNVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFLcXU5S3VDei92bE53dm4xWmF0a09oTEtkeFYKWU9QTXZMTzhMWks1NUtONjhZRzBubkp5UTk4L3F3c210TzU3R21uN0tOQnlYRXB0YVpud1l4NE0wckgvMW93MDBPN2JyRWk1NnJBVQpqdGdIcVNTWTNla0p2cWdpRzFrNTBTZUgzQnpOK1B1ejYrbVRlTzBQempkOEpuZHVvZGdzSVV6a2lrL0hFenh1eDlVVGw3S28yeVJwCmcxYlRhY3VDRXJ1ZEcvTDROUEtZS3lxT0JHZjI0NGVoSGExdXpqWjBEbDR6Tzh2YlVaZVVhcFU4emhoYWJrdkcvQWVQTGhxNVN2ZGsKTkNuY3BvMVE0WTJMUytWSUcyNHVnQkEvNUo4YlpUOFJ0T3BYYVorMEFPdUZKSmtrOVNHZGw2cjdOSDhDYXhXUXJidWVXaGwvcEl6WQorbTBvL0RqSDQweXRhczdaVHBPU2pzd01aNzhMUzViT1ptZFRhTXNYRVk1Wjk2eWNHN21PYUVTM0dLL201UTlsM0pVSnNKTVN0UjgrCmxLWEhpSFVoc2Q0SkpDcE00cnpzVEdkSHdpbUl1UXE2K2NGMHpvd1lKbVhhOTIvR2pIdG9YQXZ1WThCZVMvRk96Sjh2RCtIb21ucVQKOGVESTI3OG41bVVwZXpiZ014Vno4cDFyaEFob0t6WUhLeWZNZU5ocWh3NUhkUFNxb0JOZFpINzAyeFN1K3pya0w4Rmw0N2w2UUd6dwpCcmQ3S0p2WDRWODRjNVNzMlhDVExkeUVyMFljb25vc1A0RW1RdWZVMk1Wc2hHWVJpM2RyVkJ5anRkZ1E4SzRwOTJjSWlCZGN1SmQ1Cnorb3JLdTVZTStWdDZTbXFaUUVOZ2hQc0pRdGRMRUJ5RlNuVGtDejNHa1BWYXZCcEFnTUJBQUdqWXpCaE1BOEdBMVVkRXdFQi93UUYKTUFNQkFmOHdId1lEVlIwakJCZ3dGb0FVOHNuQkR3MWpBTHZzUlE1S0g3V3hzemJORG8wd0hRWURWUjBPQkJZRUZQTEp3UThOWXdDNwo3RVVPU2grMXNiTTJ6UTZOTUE0R0ExVWREd0VCL3dRRUF3SUJoakFOQmdrcWhraUc5dzBCQVF3RkFBT0NBZ0VBTkdkNXNqckc1VDMzCkkzSzVDZStTclNjZm9FNEtzdlhhRnd5aWhkSitrbEg5RldYWFhHdGtGdTZLUmNvTVF6WkVOZGwvL25rNkhPakc1RDFyZDlRaEVPUDIKOHlCT3FiNko4eHljcWQrOE1Eb1gwVEpEMEtxS2NoeFJLRXpkTnNqa0xXZDlrWWNjbmJ6OHF5aVdYbUZjdUNJekdFZ1dVT3JLTCttbApTZHgvUEtRWnZEYXRrdUs1OUV2VjZ3aXQ1M2orRjhCZGgzZm9aM2RQQUdhdjlMRURPcjRTZkVFMTVmU21HMGVMeTNuMzFyOFhiazVsCjhQamFWOEdVZ2VWNlZnMjdSbjl2a2YxOTVoZmtnU2U3QlloVzNTQ2w5NWd0a1JscE1WK2JNUEtaclhKQWxzellkMmFidE5VT3NoRCsKRktyRGdIR2RQWTNvZlJSc1lXU0dScWJYVk1XMjE1QVdScVdGeXA0NjQrWVRGcllWSTh5cEtWTDlBTWIya0k1V2o0a0kzWmFxNXROcQpxWVkxOXRWRmVFSktSdndEeUY3WVp2WkZaU1Mwdm9kN1ZTQ2Q5NTIxS3Z5NVlobkxiRHV2MDIwNGJLdDdwaDZOL09tZS9tc1Z1ZHVDCm1zdVkzM09oa0tDZ3hlRG9BYWlqRkp6SXdacXNGVkF6amUxOEtvdHpsVUJESnZ5QnBDcGZPWkMzSjh0UmQvaVdreDdQOG5kOUgwYVQKb2xrZWxVVEZMWFZrc05iNTREeHA2Z1MxSEF2aVJrUk5RenVYU1hFUnZTUzJ3cTF5VkFiK2F4ajVkOXNwTEZLZWJYZDdZdjBQVFk2WQpNakF3Y1JMV0pUWGpuL2h2bkxYcmFodXQ2aERUbGhaeUJpRWx4a3k4ajNDN0RPUmVJb010MHI3K2hWdTA1TDA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCmUtU3ppZ25vIFRMUyBSb290IENBIDIwMjMKPT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ3p6Q0NBakdnQXdJQkFnSU5BT2h2R0h2V09XdVlTa21ZQ2pBS0JnZ3Foa2pPUFFRREJEQjFNUXN3Q1FZRFZRUUdFd0pJVlRFUgpNQThHQTFVRUJ3d0lRblZrWVhCbGMzUXhGakFVQmdOVkJBb01EVTFwWTNKdmMyVmpJRXgwWkM0eEZ6QVZCZ05WQkdFTURsWkJWRWhWCkxUSXpOVGcwTkRrM01TSXdJQVlEVlFRRERCbGxMVk42YVdkdWJ5QlVURk1nVW05dmRDQkRRU0F5TURJek1CNFhEVEl6TURjeE56RTAKTURBd01Gb1hEVE00TURjeE56RTBNREF3TUZvd2RURUxNQWtHQTFVRUJoTUNTRlV4RVRBUEJnTlZCQWNNQ0VKMVpHRndaWE4wTVJZdwpGQVlEVlFRS0RBMU5hV055YjNObFl5Qk1kR1F1TVJjd0ZRWURWUVJoREE1V1FWUklWUzB5TXpVNE5EUTVOekVpTUNBR0ExVUVBd3daClpTMVRlbWxuYm04Z1ZFeFRJRkp2YjNRZ1EwRWdNakF5TXpDQm16QVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUl3T0JoZ0FFQUdnUDM2SjgKUEtwMGlHRUtqY0pNcFFFaUZOVDNZSGRDbkFvNFlLR01aejZ6WStuNmtiQ0xTK1k1M3dMQ01BRlNBTC9mak8xWnJUSmxxd2xaVUxVWgp3bWdjQU9BRlg5cFFKaHpEckFRaXhUcE43K2xYV0RhandSbFRFQXJSelQvdlN6VWFRNDlDRTB5NUxCcWN2akMyeE43Y1M1M2twRHpMCkx0bXQzOTk5Q2Q4dWt2K2hvMk13WVRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEUKRmdRVVdZUUNZbHBHZVBWZDNJOEtFQ2dqM05YVyswVXdId1lEVlIwakJCZ3dGb0FVV1lRQ1lscEdlUFZkM0k4S0VDZ2ozTlhXKzBVdwpDZ1lJS29aSXpqMEVBd1FEZ1lzQU1JR0hBa0lCTGRxdTlTNTR0bWE0bjdad2YyWjB6K3lPZlA3QUFYbWF6bElDNThQUkRIcHR5N1ZlCjdoZWttOXNFZHU0cEtlaXYrNjJzVXZUWEs5WjNoQkM5eGRJb2FEUUNRVFYyV25YemtvWUk5YkllQ3ZabEM5cDJ4MUwvQ3g2QWNDSXcKd3pQYkdPMkUxNHZzN2RPb1k0RzFWbnhIeDFZd2xHaHphOUl1cWJuWkxCd3B2UXk2dVdXTAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ2FCdW5kbGU7Cgp1c2UgUHNyXExvZ1xMb2dnZXJJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFBocFByb2Nlc3M7CgoKCgoKY2xhc3MgQ2FCdW5kbGUKewoKcHJpdmF0ZSBzdGF0aWMgJGNhUGF0aDsKCnByaXZhdGUgc3RhdGljICRjYUZpbGVWYWxpZGl0eSA9IGFycmF5KCk7CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRTeXN0ZW1DYVJvb3RCdW5kbGVQYXRoKD9Mb2dnZXJJbnRlcmZhY2UgJGxvZ2dlciA9IG51bGwpCnsKaWYgKHNlbGY6OiRjYVBhdGggIT09IG51bGwpIHsKcmV0dXJuIHNlbGY6OiRjYVBhdGg7Cn0KJGNhQnVuZGxlUGF0aHMgPSBhcnJheSgpOwoKCgokY2FCdW5kbGVQYXRoc1tdID0gc2VsZjo6Z2V0RW52VmFyaWFibGUoJ1NTTF9DRVJUX0ZJTEUnKTsKCgoKJGNhQnVuZGxlUGF0aHNbXSA9IHNlbGY6OmdldEVudlZhcmlhYmxlKCdTU0xfQ0VSVF9ESVInKTsKCiRjYUJ1bmRsZVBhdGhzW10gPSBpbmlfZ2V0KCdvcGVuc3NsLmNhZmlsZScpOwokY2FCdW5kbGVQYXRoc1tdID0gaW5pX2dldCgnb3BlbnNzbC5jYXBhdGgnKTsKCiRvdGhlckxvY2F0aW9ucyA9IGFycmF5KAonL2V0Yy9wa2kvY2EtdHJ1c3QvZXh0cmFjdGVkL3BlbS90bHMtY2EtYnVuZGxlLnBlbScsIAonL2V0Yy9wa2kvdGxzL2NlcnRzL2NhLWJ1bmRsZS5jcnQnLCAKJy9ldGMvc3NsL2NlcnRzL2NhLWNlcnRpZmljYXRlcy5jcnQnLCAKJy9ldGMvc3NsL2NhLWJ1bmRsZS5wZW0nLCAKJy91c3Ivc3NsL2NlcnRzL2NhLWJ1bmRsZS5jcnQnLCAKJy9vcHQvbG9jYWwvc2hhcmUvY3VybC9jdXJsLWNhLWJ1bmRsZS5jcnQnLCAKJy91c3IvbG9jYWwvc2hhcmUvY3VybC9jdXJsLWNhLWJ1bmRsZS5jcnQnLCAKJy91c3Ivc2hhcmUvc3NsL2NlcnRzL2NhLWJ1bmRsZS5jcnQnLCAKJy9ldGMvc3NsL2NlcnQucGVtJywgCicvdXNyL2xvY2FsL2V0Yy9vcGVuc3NsL2NlcnQucGVtJywgCicvdXNyL2xvY2FsL2V0Yy9vcGVuc3NsQDEuMS9jZXJ0LnBlbScsIAonL29wdC9ob21lYnJldy9ldGMvb3BlbnNzbEAzL2NlcnQucGVtJywgCicvb3B0L2hvbWVicmV3L2V0Yy9vcGVuc3NsQDEuMS9jZXJ0LnBlbScsIAonL2V0Yy9wa2kvdGxzL2NlcnRzJywKJy9ldGMvc3NsL2NlcnRzJywgCik7CgokY2FCdW5kbGVQYXRocyA9IGFycmF5X21lcmdlKCRjYUJ1bmRsZVBhdGhzLCAkb3RoZXJMb2NhdGlvbnMpOwoKZm9yZWFjaCAoJGNhQnVuZGxlUGF0aHMgYXMgJGNhQnVuZGxlKSB7CmlmICgkY2FCdW5kbGUgJiYgc2VsZjo6Y2FGaWxlVXNhYmxlKCRjYUJ1bmRsZSwgJGxvZ2dlcikpIHsKcmV0dXJuIHNlbGY6OiRjYVBhdGggPSAkY2FCdW5kbGU7Cn0KCmlmICgkY2FCdW5kbGUgJiYgc2VsZjo6Y2FEaXJVc2FibGUoJGNhQnVuZGxlLCAkbG9nZ2VyKSkgewpyZXR1cm4gc2VsZjo6JGNhUGF0aCA9ICRjYUJ1bmRsZTsKfQp9CgpyZXR1cm4gc2VsZjo6JGNhUGF0aCA9IHN0YXRpYzo6Z2V0QnVuZGxlZENhQnVuZGxlUGF0aCgpOyAKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0QnVuZGxlZENhQnVuZGxlUGF0aCgpCnsKJGNhQnVuZGxlRmlsZSA9IF9fRElSX18uJy8uLi9yZXMvY2FjZXJ0LnBlbSc7CgoKCmlmICgwID09PSBzdHJwb3MoJGNhQnVuZGxlRmlsZSwgJ3BoYXI6Ly8nKSkgewokdGVtcENhQnVuZGxlRmlsZSA9IHRlbXBuYW0oc3lzX2dldF90ZW1wX2RpcigpLCAnb3BlbnNzbC1jYS1idW5kbGUtJyk7CmlmIChmYWxzZSA9PT0gJHRlbXBDYUJ1bmRsZUZpbGUpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUgdG8gc3RvcmUgdGhlIGJ1bmRsZWQgQ0EgZmlsZScpOwp9CgpmaWxlX3B1dF9jb250ZW50cygKJHRlbXBDYUJ1bmRsZUZpbGUsCmZpbGVfZ2V0X2NvbnRlbnRzKCRjYUJ1bmRsZUZpbGUpCik7CgpyZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbihmdW5jdGlvbigpIHVzZSAoJHRlbXBDYUJ1bmRsZUZpbGUpIHsKQHVubGluaygkdGVtcENhQnVuZGxlRmlsZSk7Cn0pOwoKJGNhQnVuZGxlRmlsZSA9ICR0ZW1wQ2FCdW5kbGVGaWxlOwp9CgpyZXR1cm4gJGNhQnVuZGxlRmlsZTsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHZhbGlkYXRlQ2FGaWxlKCRmaWxlbmFtZSwgP0xvZ2dlckludGVyZmFjZSAkbG9nZ2VyID0gbnVsbCkKewpzdGF0aWMgJHdhcm5lZCA9IGZhbHNlOwoKaWYgKGlzc2V0KHNlbGY6OiRjYUZpbGVWYWxpZGl0eVskZmlsZW5hbWVdKSkgewpyZXR1cm4gc2VsZjo6JGNhRmlsZVZhbGlkaXR5WyRmaWxlbmFtZV07Cn0KCiRjb250ZW50cyA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlbmFtZSk7CgppZiAoaXNfc3RyaW5nKCRjb250ZW50cykgJiYgc3RybGVuKCRjb250ZW50cykgPiAwKSB7CiRjb250ZW50cyA9IHByZWdfcmVwbGFjZSgiL14oXFwtKyg/OkJFR0lOfEVORCkpXFxzK1RSVVNURURcXHMrKENFUlRJRklDQVRFXFwtKylcJC9tIiwgJyQxICQyJywgJGNvbnRlbnRzKTsKaWYgKG51bGwgPT09ICRjb250ZW50cykgewoKJGlzVmFsaWQgPSBmYWxzZTsKfSBlbHNlIHsKJGlzVmFsaWQgPSAoYm9vbCkgb3BlbnNzbF94NTA5X3BhcnNlKCRjb250ZW50cyk7Cn0KfSBlbHNlIHsKJGlzVmFsaWQgPSBmYWxzZTsKfQoKaWYgKCRsb2dnZXIpIHsKJGxvZ2dlci0+ZGVidWcoJ0NoZWNrZWQgQ0EgZmlsZSAnLnJlYWxwYXRoKCRmaWxlbmFtZSkuJzogJy4oJGlzVmFsaWQgPyAndmFsaWQnIDogJ2ludmFsaWQnKSk7Cn0KCnJldHVybiBzZWxmOjokY2FGaWxlVmFsaWRpdHlbJGZpbGVuYW1lXSA9ICRpc1ZhbGlkOwp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNPcGVuc3NsUGFyc2VTYWZlKCkKewpyZXR1cm4gdHJ1ZTsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzZXQoKQp7CnNlbGY6OiRjYUZpbGVWYWxpZGl0eSA9IGFycmF5KCk7CnNlbGY6OiRjYVBhdGggPSBudWxsOwp9CgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0RW52VmFyaWFibGUoJG5hbWUpCnsKaWYgKGlzc2V0KCRfU0VSVkVSWyRuYW1lXSkpIHsKcmV0dXJuIChzdHJpbmcpICRfU0VSVkVSWyRuYW1lXTsKfQoKaWYgKFBIUF9TQVBJID09PSAnY2xpJyAmJiAoJHZhbHVlID0gZ2V0ZW52KCRuYW1lKSkgIT09IGZhbHNlICYmICR2YWx1ZSAhPT0gbnVsbCkgewpyZXR1cm4gKHN0cmluZykgJHZhbHVlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gY2FGaWxlVXNhYmxlKCRjZXJ0RmlsZSwgP0xvZ2dlckludGVyZmFjZSAkbG9nZ2VyID0gbnVsbCkKewpyZXR1cm4gJGNlcnRGaWxlCiYmIHNlbGY6OmlzRmlsZSgkY2VydEZpbGUsICRsb2dnZXIpCiYmIHNlbGY6OmlzUmVhZGFibGUoJGNlcnRGaWxlLCAkbG9nZ2VyKQomJiBzZWxmOjp2YWxpZGF0ZUNhRmlsZSgkY2VydEZpbGUsICRsb2dnZXIpOwp9CgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNhRGlyVXNhYmxlKCRjZXJ0RGlyLCA/TG9nZ2VySW50ZXJmYWNlICRsb2dnZXIgPSBudWxsKQp7CnJldHVybiAkY2VydERpcgomJiBzZWxmOjppc0RpcigkY2VydERpciwgJGxvZ2dlcikKJiYgc2VsZjo6aXNSZWFkYWJsZSgkY2VydERpciwgJGxvZ2dlcikKJiYgc2VsZjo6Z2xvYigkY2VydERpciAuICcvKicsICRsb2dnZXIpOwp9CgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGlzRmlsZSgkY2VydEZpbGUsID9Mb2dnZXJJbnRlcmZhY2UgJGxvZ2dlciA9IG51bGwpCnsKJGlzRmlsZSA9IEBpc19maWxlKCRjZXJ0RmlsZSk7CmlmICghJGlzRmlsZSAmJiAkbG9nZ2VyKSB7CiRsb2dnZXItPmRlYnVnKHNwcmludGYoJ0NoZWNrZWQgQ0EgZmlsZSAlcyBkb2VzIG5vdCBleGlzdCBvciBpdCBpcyBub3QgYSBmaWxlLicsICRjZXJ0RmlsZSkpOwp9CgpyZXR1cm4gJGlzRmlsZTsKfQoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpc0RpcigkY2VydERpciwgP0xvZ2dlckludGVyZmFjZSAkbG9nZ2VyID0gbnVsbCkKewokaXNEaXIgPSBAaXNfZGlyKCRjZXJ0RGlyKTsKaWYgKCEkaXNEaXIgJiYgJGxvZ2dlcikgewokbG9nZ2VyLT5kZWJ1ZyhzcHJpbnRmKCdDaGVja2VkIGRpcmVjdG9yeSAlcyBkb2VzIG5vdCBleGlzdCBvciBpdCBpcyBub3QgYSBkaXJlY3RvcnkuJywgJGNlcnREaXIpKTsKfQoKcmV0dXJuICRpc0RpcjsKfQoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpc1JlYWRhYmxlKCRjZXJ0RmlsZU9yRGlyLCA/TG9nZ2VySW50ZXJmYWNlICRsb2dnZXIgPSBudWxsKQp7CiRpc1JlYWRhYmxlID0gQGlzX3JlYWRhYmxlKCRjZXJ0RmlsZU9yRGlyKTsKaWYgKCEkaXNSZWFkYWJsZSAmJiAkbG9nZ2VyKSB7CiRsb2dnZXItPmRlYnVnKHNwcmludGYoJ0NoZWNrZWQgZmlsZSBvciBkaXJlY3RvcnkgJXMgaXMgbm90IHJlYWRhYmxlLicsICRjZXJ0RmlsZU9yRGlyKSk7Cn0KCnJldHVybiAkaXNSZWFkYWJsZTsKfQoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnbG9iKCRwYXR0ZXJuLCA/TG9nZ2VySW50ZXJmYWNlICRsb2dnZXIgPSBudWxsKQp7CiRjZXJ0cyA9IGdsb2IoJHBhdHRlcm4pOwppZiAoJGNlcnRzID09PSBmYWxzZSkgewppZiAoJGxvZ2dlcikgewokbG9nZ2VyLT5kZWJ1ZyhzcHJpbnRmKCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gZmluZCBjZXJ0aWZpY2F0ZXMgZm9yIHBhdHRlcm46ICVzIiwgJHBhdHRlcm4pKTsKfQpyZXR1cm4gZmFsc2U7Cn0KCmlmIChjb3VudCgkY2VydHMpID09PSAwKSB7CmlmICgkbG9nZ2VyKSB7CiRsb2dnZXItPmRlYnVnKHNwcmludGYoIk5vIENBIGZpbGVzIGZvdW5kIGZvciBwYXR0ZXJuOiAlcyIsICRwYXR0ZXJuKSk7Cn0KcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQp9CgpDb3B5cmlnaHQgKEMpIDIwMjIgQ29tcG9zZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwp1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcwpvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8Kc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuCgo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ2xhc3NNYXBHZW5lcmF0b3I7Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKY2xhc3MgQ2xhc3NNYXAgaW1wbGVtZW50cyBcQ291bnRhYmxlCnsKCgoKcHVibGljICRtYXAgPSBbXTsKCgoKCnByaXZhdGUgJGFtYmlndW91c0NsYXNzZXMgPSBbXTsKCgoKCnByaXZhdGUgJHBzclZpb2xhdGlvbnMgPSBbXTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE1hcCgpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+bWFwOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQc3JWaW9sYXRpb25zKCk6IGFycmF5CnsKaWYgKFxjb3VudCgkdGhpcy0+cHNyVmlvbGF0aW9ucykgPT09IDApIHsKcmV0dXJuIFtdOwp9CgpyZXR1cm4gYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoYXJyYXkgJHZpb2xhdGlvbik6IHN0cmluZyB7CnJldHVybiAkdmlvbGF0aW9uWyd3YXJuaW5nJ107Cn0sIGFycmF5X21lcmdlKC4uLmFycmF5X3ZhbHVlcygkdGhpcy0+cHNyVmlvbGF0aW9ucykpKTsKfQoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBbWJpZ3VvdXNDbGFzc2VzKCRkdXBsaWNhdGVzRmlsdGVyID0gJ3svKHRlc3R8Zml4dHVyZXxleGFtcGxlfHN0dWIpcz8vfWknKTogYXJyYXkKewppZiAoZmFsc2UgPT09ICRkdXBsaWNhdGVzRmlsdGVyKSB7CnJldHVybiAkdGhpcy0+YW1iaWd1b3VzQ2xhc3NlczsKfQoKaWYgKHRydWUgPT09ICRkdXBsaWNhdGVzRmlsdGVyKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCckZHVwbGljYXRlc0ZpbHRlciBzaG91bGQgYmUgZmFsc2Ugb3IgYSBzdHJpbmcgd2l0aCBhIHZhbGlkIHJlZ2V4LCBnb3QgdHJ1ZS4nKTsKfQoKJGFtYmlndW91c0NsYXNzZXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPmFtYmlndW91c0NsYXNzZXMgYXMgJGNsYXNzID0+ICRwYXRocykgewokcGF0aHMgPSBhcnJheV9maWx0ZXIoJHBhdGhzLCBmdW5jdGlvbiAoJHBhdGgpIHVzZSAoJGR1cGxpY2F0ZXNGaWx0ZXIpOiBib29sIHsKcmV0dXJuICFQcmVnOjppc01hdGNoKCRkdXBsaWNhdGVzRmlsdGVyLCBzdHJ0cigkcGF0aCwgJ1xcJywgJy8nKSk7Cn0pOwppZiAoXGNvdW50KCRwYXRocykgPiAwKSB7CiRhbWJpZ3VvdXNDbGFzc2VzWyRjbGFzc10gPSBhcnJheV92YWx1ZXMoJHBhdGhzKTsKfQp9CgpyZXR1cm4gJGFtYmlndW91c0NsYXNzZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzb3J0KCk6IHZvaWQKewprc29ydCgkdGhpcy0+bWFwKTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRDbGFzcyhzdHJpbmcgJGNsYXNzTmFtZSwgc3RyaW5nICRwYXRoKTogdm9pZAp7CnVuc2V0KCR0aGlzLT5wc3JWaW9sYXRpb25zW3N0cnRyKCRwYXRoLCAnXFwnLCAnLycpXSk7CgokdGhpcy0+bWFwWyRjbGFzc05hbWVdID0gJHBhdGg7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2xhc3NQYXRoKHN0cmluZyAkY2xhc3NOYW1lKTogc3RyaW5nCnsKaWYgKCFpc3NldCgkdGhpcy0+bWFwWyRjbGFzc05hbWVdKSkgewp0aHJvdyBuZXcgXE91dE9mQm91bmRzRXhjZXB0aW9uKCdDbGFzcyAnLiRjbGFzc05hbWUuJyBpcyBub3QgcHJlc2VudCBpbiB0aGUgbWFwJyk7Cn0KCnJldHVybiAkdGhpcy0+bWFwWyRjbGFzc05hbWVdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzQ2xhc3Moc3RyaW5nICRjbGFzc05hbWUpOiBib29sCnsKcmV0dXJuIGlzc2V0KCR0aGlzLT5tYXBbJGNsYXNzTmFtZV0pOwp9CgpwdWJsaWMgZnVuY3Rpb24gYWRkUHNyVmlvbGF0aW9uKHN0cmluZyAkd2FybmluZywgc3RyaW5nICRjbGFzc05hbWUsIHN0cmluZyAkcGF0aCk6IHZvaWQKewokcGF0aCA9IHJ0cmltKHN0cnRyKCRwYXRoLCAnXFwnLCAnLycpLCAnLycpOwoKJHRoaXMtPnBzclZpb2xhdGlvbnNbJHBhdGhdW10gPSBbJ3dhcm5pbmcnID0+ICR3YXJuaW5nLCAnY2xhc3NOYW1lJyA9PiAkY2xhc3NOYW1lXTsKfQoKcHVibGljIGZ1bmN0aW9uIGNsZWFyUHNyVmlvbGF0aW9uc0J5UGF0aChzdHJpbmcgJHBhdGhQcmVmaXgpOiB2b2lkCnsKJHBhdGhQcmVmaXggPSBydHJpbShzdHJ0cigkcGF0aFByZWZpeCwgJ1xcJywgJy8nKSwgJy8nKTsKCmZvcmVhY2ggKCR0aGlzLT5wc3JWaW9sYXRpb25zIGFzICRwYXRoID0+ICR2aW9sYXRpb25zKSB7CmlmICgkcGF0aCA9PT0gJHBhdGhQcmVmaXggfHwgMCA9PT0gXHN0cnBvcygkcGF0aCwgJHBhdGhQcmVmaXguJy8nKSkgewp1bnNldCgkdGhpcy0+cHNyVmlvbGF0aW9uc1skcGF0aF0pOwp9Cn0KfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRBbWJpZ3VvdXNDbGFzcyhzdHJpbmcgJGNsYXNzTmFtZSwgc3RyaW5nICRwYXRoKTogdm9pZAp7CiR0aGlzLT5hbWJpZ3VvdXNDbGFzc2VzWyRjbGFzc05hbWVdW10gPSAkcGF0aDsKfQoKcHVibGljIGZ1bmN0aW9uIGNvdW50KCk6IGludAp7CnJldHVybiBcY291bnQoJHRoaXMtPm1hcCk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmF3UHNyVmlvbGF0aW9ucygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cHNyVmlvbGF0aW9uczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDbGFzc01hcEdlbmVyYXRvcjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcRmluZGVyOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CgoKCgoKCgpjbGFzcyBDbGFzc01hcEdlbmVyYXRvcgp7CgoKCnByaXZhdGUgJGV4dGVuc2lvbnM7CgoKCgpwcml2YXRlICRzY2FubmVkRmlsZXMgPSBudWxsOwoKCgoKcHJpdmF0ZSAkY2xhc3NNYXA7CgoKCgpwcml2YXRlICRzdHJlYW1XcmFwcGVyc1JlZ2V4OwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRleHRlbnNpb25zID0gWydwaHAnLCAnaW5jJ10pCnsKJHRoaXMtPmV4dGVuc2lvbnMgPSAkZXh0ZW5zaW9uczsKJHRoaXMtPmNsYXNzTWFwID0gbmV3IENsYXNzTWFwOwokdGhpcy0+c3RyZWFtV3JhcHBlcnNSZWdleCA9IHNwcmludGYoJ3teKD86JXMpOi8vfScsIGltcGxvZGUoJ3wnLCBhcnJheV9tYXAoJ3ByZWdfcXVvdGUnLCBzdHJlYW1fZ2V0X3dyYXBwZXJzKCkpKSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXZvaWREdXBsaWNhdGVTY2Fucyg/RmlsZUxpc3QgJHNjYW5uZWRGaWxlcyA9IG51bGwpOiBzZWxmCnsKJHRoaXMtPnNjYW5uZWRGaWxlcyA9ICRzY2FubmVkRmlsZXMgPz8gbmV3IEZpbGVMaXN0OwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlTWFwKCRwYXRoKTogYXJyYXkKewokZ2VuZXJhdG9yID0gbmV3IHNlbGYoKTsKCiRnZW5lcmF0b3ItPnNjYW5QYXRocygkcGF0aCk7CgpyZXR1cm4gJGdlbmVyYXRvci0+Z2V0Q2xhc3NNYXAoKS0+Z2V0TWFwKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRDbGFzc01hcCgpOiBDbGFzc01hcAp7CnJldHVybiAkdGhpcy0+Y2xhc3NNYXA7Cn0KCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNjYW5QYXRocygkcGF0aCwgP3N0cmluZyAkZXhjbHVkZWQgPSBudWxsLCBzdHJpbmcgJGF1dG9sb2FkVHlwZSA9ICdjbGFzc21hcCcsID9zdHJpbmcgJG5hbWVzcGFjZSA9IG51bGwsIGFycmF5ICRleGNsdWRlZERpcnMgPSBbXSk6IHZvaWQKewppZiAoIWluX2FycmF5KCRhdXRvbG9hZFR5cGUsIFsncHNyLTAnLCAncHNyLTQnLCAnY2xhc3NtYXAnXSwgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJyRhdXRvbG9hZFR5cGUgbXVzdCBiZSBvbmUgb2Y6ICJwc3ItMCIsICJwc3ItNCIgb3IgImNsYXNzbWFwIicpOwp9CgppZiAoJ2NsYXNzbWFwJyAhPT0gJGF1dG9sb2FkVHlwZSkgewppZiAoIWlzX3N0cmluZygkcGF0aCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJyRwYXRoIG11c3QgYmUgYSBzdHJpbmcgd2hlbiBzcGVjaWZ5aW5nIGEgcHNyLTAgb3IgcHNyLTQgYXV0b2xvYWQgdHlwZScpOwp9CmlmICghaXNfc3RyaW5nKCRuYW1lc3BhY2UpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCckbmFtZXNwYWNlIG11c3QgYmUgZ2l2ZW4gKGV2ZW4gaWYgaXQgaXMgYW4gZW1wdHkgc3RyaW5nIGlmIHlvdSBkbyBub3Qgd2FudCB0byBmaWx0ZXIpIHdoZW4gc3BlY2lmeWluZyBhIHBzci0wIG9yIHBzci00IGF1dG9sb2FkIHR5cGUnKTsKfQokYmFzZVBhdGggPSAkcGF0aDsKfQoKaWYgKGlzX3N0cmluZygkcGF0aCkpIHsKaWYgKGlzX2ZpbGUoJHBhdGgpKSB7CiRwYXRoID0gW25ldyBcU3BsRmlsZUluZm8oJHBhdGgpXTsKfSBlbHNlaWYgKGlzX2RpcigkcGF0aCkgfHwgc3RycG9zKCRwYXRoLCAnKicpICE9PSBmYWxzZSkgewokcGF0aCA9IEZpbmRlcjo6Y3JlYXRlKCkKLT5maWxlcygpCi0+Zm9sbG93TGlua3MoKQotPm5hbWUoJy9cLig/OicuaW1wbG9kZSgnfCcsIGFycmF5X21hcCgncHJlZ19xdW90ZScsICR0aGlzLT5leHRlbnNpb25zKSkuJykkLycpCi0+aW4oJHBhdGgpCi0+ZXhjbHVkZSgkZXhjbHVkZWREaXJzKTsKfSBlbHNlIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKAonQ291bGQgbm90IHNjYW4gZm9yIGNsYXNzZXMgaW5zaWRlICInLiRwYXRoLiciIHdoaWNoIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIGZpbGUgbm9yIGEgZm9sZGVyJwopOwp9Cn0KCiRjd2QgPSByZWFscGF0aChzZWxmOjpnZXRDd2QoKSk7Cgpmb3JlYWNoICgkcGF0aCBhcyAkZmlsZSkgewokZmlsZVBhdGggPSAkZmlsZS0+Z2V0UGF0aG5hbWUoKTsKaWYgKCFpbl9hcnJheShwYXRoaW5mbygkZmlsZVBhdGgsIFBBVEhJTkZPX0VYVEVOU0lPTiksICR0aGlzLT5leHRlbnNpb25zLCB0cnVlKSkgewpjb250aW51ZTsKfQoKJGlzU3RyZWFtV3JhcHBlclBhdGggPSBQcmVnOjppc01hdGNoKCR0aGlzLT5zdHJlYW1XcmFwcGVyc1JlZ2V4LCAkZmlsZVBhdGgpOwppZiAoIXNlbGY6OmlzQWJzb2x1dGVQYXRoKCRmaWxlUGF0aCkgJiYgISRpc1N0cmVhbVdyYXBwZXJQYXRoKSB7CiRmaWxlUGF0aCA9ICRjd2QgLiAnLycgLiAkZmlsZVBhdGg7CiRmaWxlUGF0aCA9IHNlbGY6Om5vcm1hbGl6ZVBhdGgoJGZpbGVQYXRoKTsKfSBlbHNlIHsKJGZpbGVQYXRoID0gUHJlZzo6cmVwbGFjZSgneyg/PCE6KVtcXFxcL117Mix9fScsICcvJywgJGZpbGVQYXRoKTsKfQoKaWYgKCcnID09PSAkZmlsZVBhdGgpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignR290IGFuIGVtcHR5ICRmaWxlUGF0aCBmb3IgJy4kZmlsZS0+Z2V0UGF0aG5hbWUoKSk7Cn0KCiRyZWFsUGF0aCA9ICRpc1N0cmVhbVdyYXBwZXJQYXRoCj8gJGZpbGVQYXRoCjogcmVhbHBhdGgoJGZpbGVQYXRoKTsKCgppZiAoZmFsc2UgPT09ICRyZWFsUGF0aCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ3JlYWxwYXRoIG9mICcuJGZpbGVQYXRoLicgZmFpbGVkIHRvIHJlc29sdmUsIGdvdCBmYWxzZScpOwp9CgoKCmlmICgkdGhpcy0+c2Nhbm5lZEZpbGVzICE9PSBudWxsICYmICR0aGlzLT5zY2FubmVkRmlsZXMtPmNvbnRhaW5zKCRyZWFsUGF0aCkpIHsKY29udGludWU7Cn0KCgppZiAobnVsbCAhPT0gJGV4Y2x1ZGVkICYmIFByZWc6OmlzTWF0Y2goJGV4Y2x1ZGVkLCBzdHJ0cigkcmVhbFBhdGgsICdcXCcsICcvJykpKSB7CmNvbnRpbnVlOwp9CgppZiAobnVsbCAhPT0gJGV4Y2x1ZGVkICYmIFByZWc6OmlzTWF0Y2goJGV4Y2x1ZGVkLCBzdHJ0cigkZmlsZVBhdGgsICdcXCcsICcvJykpKSB7CmNvbnRpbnVlOwp9CgokY2xhc3NlcyA9IFBocEZpbGVQYXJzZXI6OmZpbmRDbGFzc2VzKCRmaWxlUGF0aCk7CmlmICgnY2xhc3NtYXAnICE9PSAkYXV0b2xvYWRUeXBlICYmIGlzc2V0KCRuYW1lc3BhY2UpKSB7CiRjbGFzc2VzID0gJHRoaXMtPmZpbHRlckJ5TmFtZXNwYWNlKCRjbGFzc2VzLCAkZmlsZVBhdGgsICRuYW1lc3BhY2UsICRhdXRvbG9hZFR5cGUsICRiYXNlUGF0aCk7CgoKaWYgKFxjb3VudCgkY2xhc3NlcykgPiAwICYmICR0aGlzLT5zY2FubmVkRmlsZXMgIT09IG51bGwpIHsKJHRoaXMtPnNjYW5uZWRGaWxlcy0+YWRkKCRyZWFsUGF0aCk7Cn0KfSBlbHNlaWYgKCR0aGlzLT5zY2FubmVkRmlsZXMgIT09IG51bGwpIHsKCiR0aGlzLT5zY2FubmVkRmlsZXMtPmFkZCgkcmVhbFBhdGgpOwp9Cgpmb3JlYWNoICgkY2xhc3NlcyBhcyAkY2xhc3MpIHsKaWYgKCEkdGhpcy0+Y2xhc3NNYXAtPmhhc0NsYXNzKCRjbGFzcykpIHsKJHRoaXMtPmNsYXNzTWFwLT5hZGRDbGFzcygkY2xhc3MsICRmaWxlUGF0aCk7Cn0gZWxzZWlmICgkZmlsZVBhdGggIT09ICR0aGlzLT5jbGFzc01hcC0+Z2V0Q2xhc3NQYXRoKCRjbGFzcykpIHsKJHRoaXMtPmNsYXNzTWFwLT5hZGRBbWJpZ3VvdXNDbGFzcygkY2xhc3MsICRmaWxlUGF0aCk7Cn0KfQp9Cn0KCgoKCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZmlsdGVyQnlOYW1lc3BhY2UoYXJyYXkgJGNsYXNzZXMsIHN0cmluZyAkZmlsZVBhdGgsIHN0cmluZyAkYmFzZU5hbWVzcGFjZSwgc3RyaW5nICRuYW1lc3BhY2VUeXBlLCBzdHJpbmcgJGJhc2VQYXRoKTogYXJyYXkKewokdmFsaWRDbGFzc2VzID0gW107CiRyZWplY3RlZENsYXNzZXMgPSBbXTsKCiRyZWFsU3ViUGF0aCA9IHN1YnN0cigkZmlsZVBhdGgsIHN0cmxlbigkYmFzZVBhdGgpICsgMSk7CiRkb3RQb3NpdGlvbiA9IHN0cnJwb3MoJHJlYWxTdWJQYXRoLCAnLicpOwokcmVhbFN1YlBhdGggPSBzdWJzdHIoJHJlYWxTdWJQYXRoLCAwLCAkZG90UG9zaXRpb24gPT09IGZhbHNlID8gUEhQX0lOVF9NQVggOiAkZG90UG9zaXRpb24pOwoKZm9yZWFjaCAoJGNsYXNzZXMgYXMgJGNsYXNzKSB7CgppZiAoJ3Bzci0wJyA9PT0gJG5hbWVzcGFjZVR5cGUpIHsKaWYgKCcnICE9PSAkYmFzZU5hbWVzcGFjZSAmJiAhc3RyX3N0YXJ0c193aXRoKCRjbGFzcywgJGJhc2VOYW1lc3BhY2UpKSB7CiRyZWplY3RlZENsYXNzZXNbXSA9ICRjbGFzczsKY29udGludWU7Cn0KCiRuYW1lc3BhY2VMZW5ndGggPSBzdHJycG9zKCRjbGFzcywgJ1xcJyk7CmlmIChmYWxzZSAhPT0gJG5hbWVzcGFjZUxlbmd0aCkgewokbmFtZXNwYWNlID0gc3Vic3RyKCRjbGFzcywgMCwgJG5hbWVzcGFjZUxlbmd0aCArIDEpOwokY2xhc3NOYW1lID0gc3Vic3RyKCRjbGFzcywgJG5hbWVzcGFjZUxlbmd0aCArIDEpOwokc3ViUGF0aCA9IHN0cl9yZXBsYWNlKCdcXCcsIERJUkVDVE9SWV9TRVBBUkFUT1IsICRuYW1lc3BhY2UpCi4gc3RyX3JlcGxhY2UoJ18nLCBESVJFQ1RPUllfU0VQQVJBVE9SLCAkY2xhc3NOYW1lKTsKfSBlbHNlIHsKJHN1YlBhdGggPSBzdHJfcmVwbGFjZSgnXycsIERJUkVDVE9SWV9TRVBBUkFUT1IsICRjbGFzcyk7Cn0KfSBlbHNlaWYgKCdwc3ItNCcgPT09ICRuYW1lc3BhY2VUeXBlKSB7CiRzdWJOYW1lc3BhY2UgPSAoJycgIT09ICRiYXNlTmFtZXNwYWNlKSA/IHN1YnN0cigkY2xhc3MsIHN0cmxlbigkYmFzZU5hbWVzcGFjZSkpIDogJGNsYXNzOwokc3ViUGF0aCA9IHN0cl9yZXBsYWNlKCdcXCcsIERJUkVDVE9SWV9TRVBBUkFUT1IsICRzdWJOYW1lc3BhY2UpOwp9IGVsc2Ugewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignJG5hbWVzcGFjZVR5cGUgbXVzdCBiZSAicHNyLTAiIG9yICJwc3ItNCInKTsKfQppZiAoJHN1YlBhdGggPT09ICRyZWFsU3ViUGF0aCkgewokdmFsaWRDbGFzc2VzW10gPSAkY2xhc3M7Cn0gZWxzZSB7CiRyZWplY3RlZENsYXNzZXNbXSA9ICRjbGFzczsKfQp9CgppZiAoXGNvdW50KCR2YWxpZENsYXNzZXMpID09PSAwKSB7CiRjd2QgPSByZWFscGF0aChzZWxmOjpnZXRDd2QoKSk7CmlmICgkY3dkID09PSBmYWxzZSkgewokY3dkID0gc2VsZjo6Z2V0Q3dkKCk7Cn0KJGN3ZCA9IHNlbGY6Om5vcm1hbGl6ZVBhdGgoJGN3ZCk7CiRzaG9ydFBhdGggPSBQcmVnOjpyZXBsYWNlKCd7XicucHJlZ19xdW90ZSgkY3dkKS4nfScsICcuJywgc2VsZjo6bm9ybWFsaXplUGF0aCgkZmlsZVBhdGgpLCAxKTsKJHNob3J0QmFzZVBhdGggPSBQcmVnOjpyZXBsYWNlKCd7XicucHJlZ19xdW90ZSgkY3dkKS4nfScsICcuJywgc2VsZjo6bm9ybWFsaXplUGF0aCgkYmFzZVBhdGgpLCAxKTsKCmZvcmVhY2ggKCRyZWplY3RlZENsYXNzZXMgYXMgJGNsYXNzKSB7CiR0aGlzLT5jbGFzc01hcC0+YWRkUHNyVmlvbGF0aW9uKCJDbGFzcyAkY2xhc3MgbG9jYXRlZCBpbiAkc2hvcnRQYXRoIGRvZXMgbm90IGNvbXBseSB3aXRoICRuYW1lc3BhY2VUeXBlIGF1dG9sb2FkaW5nIHN0YW5kYXJkIChydWxlOiAkYmFzZU5hbWVzcGFjZSA9PiAkc2hvcnRCYXNlUGF0aCkuIFNraXBwaW5nLiIsICRjbGFzcywgJGZpbGVQYXRoKTsKfQoKcmV0dXJuIFtdOwp9CgpyZXR1cm4gJHZhbGlkQ2xhc3NlczsKfQoKCgoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpc0Fic29sdXRlUGF0aChzdHJpbmcgJHBhdGgpOiBib29sCnsKcmV0dXJuIHN0cnBvcygkcGF0aCwgJy8nKSA9PT0gMCB8fCBzdWJzdHIoJHBhdGgsIDEsIDEpID09PSAnOicgfHwgc3RycG9zKCRwYXRoLCAnXFxcXCcpID09PSAwOwp9CgoKCgoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBub3JtYWxpemVQYXRoKHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CiRwYXJ0cyA9IFtdOwokcGF0aCA9IHN0cnRyKCRwYXRoLCAnXFwnLCAnLycpOwokcHJlZml4ID0gJyc7CiRhYnNvbHV0ZSA9ICcnOwoKCmlmIChzdHJwb3MoJHBhdGgsICcvLycpID09PSAwICYmIFxzdHJsZW4oJHBhdGgpID4gMikgewokYWJzb2x1dGUgPSAnLy8nOwokcGF0aCA9IHN1YnN0cigkcGF0aCwgMik7Cn0KCgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14oIFswLTlhLXpdezIsfSs6ICg/OiAvLyAoPzogW2Etel06ICk/ICk/IHwgW2Etel06ICl9aXgnLCAkcGF0aCwgJG1hdGNoKSkgewokcHJlZml4ID0gJG1hdGNoWzFdOwokcGF0aCA9IHN1YnN0cigkcGF0aCwgXHN0cmxlbigkcHJlZml4KSk7Cn0KCmlmIChzdHJwb3MoJHBhdGgsICcvJykgPT09IDApIHsKJGFic29sdXRlID0gJy8nOwokcGF0aCA9IHN1YnN0cigkcGF0aCwgMSk7Cn0KCiR1cCA9IGZhbHNlOwpmb3JlYWNoIChleHBsb2RlKCcvJywgJHBhdGgpIGFzICRjaHVuaykgewppZiAoJy4uJyA9PT0gJGNodW5rICYmIChcc3RybGVuKCRhYnNvbHV0ZSkgPiAwIHx8ICR1cCkpIHsKYXJyYXlfcG9wKCRwYXJ0cyk7CiR1cCA9ICEoXGNvdW50KCRwYXJ0cykgPT09IDAgfHwgJy4uJyA9PT0gZW5kKCRwYXJ0cykpOwp9IGVsc2VpZiAoJy4nICE9PSAkY2h1bmsgJiYgJycgIT09ICRjaHVuaykgewokcGFydHNbXSA9ICRjaHVuazsKJHVwID0gJy4uJyAhPT0gJGNodW5rOwp9Cn0KCgokcHJlZml4ID0gUHJlZzo6cmVwbGFjZUNhbGxiYWNrKCd7KD86Xnw6Ly8pW2Etel06JH1pJywgZnVuY3Rpb24gKGFycmF5ICRtKSB7IHJldHVybiBzdHJ0b3VwcGVyKChzdHJpbmcpICRtWzBdKTsgfSwgJHByZWZpeCk7CgpyZXR1cm4gJHByZWZpeC4kYWJzb2x1dGUuaW1wbG9kZSgnLycsICRwYXJ0cyk7Cn0KCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldEN3ZCgpOiBzdHJpbmcKewokY3dkID0gZ2V0Y3dkKCk7CgppZiAoZmFsc2UgPT09ICRjd2QpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Jyk7Cn0KCnJldHVybiAkY3dkOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENsYXNzTWFwR2VuZXJhdG9yOwoKCgoKCgpjbGFzcyBGaWxlTGlzdAp7CgoKCnB1YmxpYyAkZmlsZXMgPSBbXTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGQoc3RyaW5nICRwYXRoKTogdm9pZAp7CiR0aGlzLT5maWxlc1skcGF0aF0gPSB0cnVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY29udGFpbnMoc3RyaW5nICRwYXRoKTogYm9vbAp7CnJldHVybiBpc3NldCgkdGhpcy0+ZmlsZXNbJHBhdGhdKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDbGFzc01hcEdlbmVyYXRvcjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgoKY2xhc3MgUGhwRmlsZUNsZWFuZXIKewoKcHJpdmF0ZSBzdGF0aWMgJHR5cGVDb25maWc7CgoKcHJpdmF0ZSBzdGF0aWMgJHJlc3RQYXR0ZXJuOwoKCgoKCnByaXZhdGUgJGNvbnRlbnRzOwoKCgoKCnByaXZhdGUgJGxlbjsKCgoKCgpwcml2YXRlICRtYXhNYXRjaGVzOwoKCnByaXZhdGUgJGluZGV4ID0gMDsKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0VHlwZUNvbmZpZyhhcnJheSAkdHlwZXMpOiB2b2lkCnsKZm9yZWFjaCAoJHR5cGVzIGFzICR0eXBlKSB7CnNlbGY6OiR0eXBlQ29uZmlnWyR0eXBlWzBdXSA9IFsKJ25hbWUnID0+ICR0eXBlLAonbGVuZ3RoJyA9PiBcc3RybGVuKCR0eXBlKSwKJ3BhdHRlcm4nID0+ICd7LlxiKD88IVtcJDo+XSknLiR0eXBlLidccysrW2EtekEtWl9ceDdmLVx4ZmY6XVthLXpBLVowLTlfXHg3Zi1ceGZmOlwtXSorfUFpcycsCl07Cn0KCnNlbGY6OiRyZXN0UGF0dGVybiA9ICd7W14/IlwnPC8nLmltcGxvZGUoJycsIGFycmF5X2tleXMoc2VsZjo6JHR5cGVDb25maWcpKS4nXSt9QSc7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJGNvbnRlbnRzLCBpbnQgJG1heE1hdGNoZXMpCnsKJHRoaXMtPmNvbnRlbnRzID0gJGNvbnRlbnRzOwokdGhpcy0+bGVuID0gXHN0cmxlbigkdGhpcy0+Y29udGVudHMpOwokdGhpcy0+bWF4TWF0Y2hlcyA9ICRtYXhNYXRjaGVzOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2xlYW4oKTogc3RyaW5nCnsKJGNsZWFuID0gJyc7Cgp3aGlsZSAoJHRoaXMtPmluZGV4IDwgJHRoaXMtPmxlbikgewokdGhpcy0+c2tpcFRvUGhwKCk7CiRjbGVhbiAuPSAnPD8nOwoKd2hpbGUgKCR0aGlzLT5pbmRleCA8ICR0aGlzLT5sZW4pIHsKJGNoYXIgPSAkdGhpcy0+Y29udGVudHNbJHRoaXMtPmluZGV4XTsKaWYgKCRjaGFyID09PSAnPycgJiYgJHRoaXMtPnBlZWsoJz4nKSkgewokY2xlYW4gLj0gJz8+JzsKJHRoaXMtPmluZGV4ICs9IDI7CmNvbnRpbnVlIDI7Cn0KCmlmICgkY2hhciA9PT0gJyInKSB7CiR0aGlzLT5za2lwU3RyaW5nKCciJyk7CiRjbGVhbiAuPSAnbnVsbCc7CmNvbnRpbnVlOwp9CgppZiAoJGNoYXIgPT09ICInIikgewokdGhpcy0+c2tpcFN0cmluZygiJyIpOwokY2xlYW4gLj0gJ251bGwnOwpjb250aW51ZTsKfQoKaWYgKCRjaGFyID09PSAiPCIgJiYgJHRoaXMtPnBlZWsoJzwnKSAmJiAkdGhpcy0+bWF0Y2goJ3s8PDxbIFx0XSorKFtcJyJdPykoW2EtekEtWl9ceDgwLVx4ZmZdW2EtekEtWjAtOV9ceDgwLVx4ZmZdKispXFwxKD86XHJcbnxcbnxccil9QScsICRtYXRjaCkpIHsKJHRoaXMtPmluZGV4ICs9IFxzdHJsZW4oJG1hdGNoWzBdKTsKJHRoaXMtPnNraXBIZXJlZG9jKCRtYXRjaFsyXSk7CiRjbGVhbiAuPSAnbnVsbCc7CmNvbnRpbnVlOwp9CgppZiAoJGNoYXIgPT09ICcvJykgewppZiAoJHRoaXMtPnBlZWsoJy8nKSkgewokdGhpcy0+c2tpcFRvTmV3bGluZSgpOwpjb250aW51ZTsKfQoKaWYgKCR0aGlzLT5wZWVrKCcqJykpIHsKJHRoaXMtPnNraXBDb21tZW50KCk7CmNvbnRpbnVlOwp9Cn0KCmlmICgkdGhpcy0+bWF4TWF0Y2hlcyA9PT0gMSAmJiBpc3NldChzZWxmOjokdHlwZUNvbmZpZ1skY2hhcl0pKSB7CiR0eXBlID0gc2VsZjo6JHR5cGVDb25maWdbJGNoYXJdOwppZiAoClxzdWJzdHIoJHRoaXMtPmNvbnRlbnRzLCAkdGhpcy0+aW5kZXgsICR0eXBlWydsZW5ndGgnXSkgPT09ICR0eXBlWyduYW1lJ10KJiYgUHJlZzo6aXNNYXRjaCgkdHlwZVsncGF0dGVybiddLCAkdGhpcy0+Y29udGVudHMsICRtYXRjaCwgMCwgJHRoaXMtPmluZGV4IC0gMSkKKSB7CnJldHVybiAkY2xlYW4gLiAkbWF0Y2hbMF07Cn0KfQoKJHRoaXMtPmluZGV4ICs9IDE7CmlmICgkdGhpcy0+bWF0Y2goc2VsZjo6JHJlc3RQYXR0ZXJuLCAkbWF0Y2gpKSB7CiRjbGVhbiAuPSAkY2hhciAuICRtYXRjaFswXTsKJHRoaXMtPmluZGV4ICs9IFxzdHJsZW4oJG1hdGNoWzBdKTsKfSBlbHNlIHsKJGNsZWFuIC49ICRjaGFyOwp9Cn0KfQoKcmV0dXJuICRjbGVhbjsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBza2lwVG9QaHAoKTogdm9pZAp7CndoaWxlICgkdGhpcy0+aW5kZXggPCAkdGhpcy0+bGVuKSB7CmlmICgkdGhpcy0+Y29udGVudHNbJHRoaXMtPmluZGV4XSA9PT0gJzwnICYmICR0aGlzLT5wZWVrKCc/JykpIHsKJHRoaXMtPmluZGV4ICs9IDI7CmJyZWFrOwp9CgokdGhpcy0+aW5kZXggKz0gMTsKfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIHNraXBTdHJpbmcoc3RyaW5nICRkZWxpbWl0ZXIpOiB2b2lkCnsKJHRoaXMtPmluZGV4ICs9IDE7CndoaWxlICgkdGhpcy0+aW5kZXggPCAkdGhpcy0+bGVuKSB7CmlmICgkdGhpcy0+Y29udGVudHNbJHRoaXMtPmluZGV4XSA9PT0gJ1xcJyAmJiAoJHRoaXMtPnBlZWsoJ1xcJykgfHwgJHRoaXMtPnBlZWsoJGRlbGltaXRlcikpKSB7CiR0aGlzLT5pbmRleCArPSAyOwpjb250aW51ZTsKfQoKaWYgKCR0aGlzLT5jb250ZW50c1skdGhpcy0+aW5kZXhdID09PSAkZGVsaW1pdGVyKSB7CiR0aGlzLT5pbmRleCArPSAxOwpicmVhazsKfQoKJHRoaXMtPmluZGV4ICs9IDE7Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBza2lwQ29tbWVudCgpOiB2b2lkCnsKJHRoaXMtPmluZGV4ICs9IDI7CndoaWxlICgkdGhpcy0+aW5kZXggPCAkdGhpcy0+bGVuKSB7CmlmICgkdGhpcy0+Y29udGVudHNbJHRoaXMtPmluZGV4XSA9PT0gJyonICYmICR0aGlzLT5wZWVrKCcvJykpIHsKJHRoaXMtPmluZGV4ICs9IDI7CmJyZWFrOwp9CgokdGhpcy0+aW5kZXggKz0gMTsKfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIHNraXBUb05ld2xpbmUoKTogdm9pZAp7CndoaWxlICgkdGhpcy0+aW5kZXggPCAkdGhpcy0+bGVuKSB7CmlmICgkdGhpcy0+Y29udGVudHNbJHRoaXMtPmluZGV4XSA9PT0gIlxyIiB8fCAkdGhpcy0+Y29udGVudHNbJHRoaXMtPmluZGV4XSA9PT0gIlxuIikgewpyZXR1cm47Cn0KCiR0aGlzLT5pbmRleCArPSAxOwp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gc2tpcEhlcmVkb2Moc3RyaW5nICRkZWxpbWl0ZXIpOiB2b2lkCnsKJGZpcnN0RGVsaW1pdGVyQ2hhciA9ICRkZWxpbWl0ZXJbMF07CiRkZWxpbWl0ZXJMZW5ndGggPSBcc3RybGVuKCRkZWxpbWl0ZXIpOwokZGVsaW1pdGVyUGF0dGVybiA9ICd7Jy5wcmVnX3F1b3RlKCRkZWxpbWl0ZXIpLicoPyFbYS16QS1aMC05X1x4ODAtXHhmZl0pfUEnOwoKd2hpbGUgKCR0aGlzLT5pbmRleCA8ICR0aGlzLT5sZW4pIHsKCnN3aXRjaCAoJHRoaXMtPmNvbnRlbnRzWyR0aGlzLT5pbmRleF0pIHsKY2FzZSAiXHQiOgpjYXNlICIgIjoKJHRoaXMtPmluZGV4ICs9IDE7CmNvbnRpbnVlIDI7CmNhc2UgJGZpcnN0RGVsaW1pdGVyQ2hhcjoKaWYgKApcc3Vic3RyKCR0aGlzLT5jb250ZW50cywgJHRoaXMtPmluZGV4LCAkZGVsaW1pdGVyTGVuZ3RoKSA9PT0gJGRlbGltaXRlcgomJiAkdGhpcy0+bWF0Y2goJGRlbGltaXRlclBhdHRlcm4pCikgewokdGhpcy0+aW5kZXggKz0gJGRlbGltaXRlckxlbmd0aDsKCnJldHVybjsKfQoKYnJlYWs7Cn0KCgp3aGlsZSAoJHRoaXMtPmluZGV4IDwgJHRoaXMtPmxlbikgewokdGhpcy0+c2tpcFRvTmV3bGluZSgpOwoKCndoaWxlICgkdGhpcy0+aW5kZXggPCAkdGhpcy0+bGVuICYmICgkdGhpcy0+Y29udGVudHNbJHRoaXMtPmluZGV4XSA9PT0gIlxyIiB8fCAkdGhpcy0+Y29udGVudHNbJHRoaXMtPmluZGV4XSA9PT0gIlxuIikpIHsKJHRoaXMtPmluZGV4ICs9IDE7Cn0KCmJyZWFrOwp9Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBwZWVrKHN0cmluZyAkY2hhcik6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmluZGV4ICsgMSA8ICR0aGlzLT5sZW4gJiYgJHRoaXMtPmNvbnRlbnRzWyR0aGlzLT5pbmRleCArIDFdID09PSAkY2hhcjsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIG1hdGNoKHN0cmluZyAkcmVnZXgsID9hcnJheSAmJG1hdGNoID0gbnVsbCk6IGJvb2wKewpyZXR1cm4gUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygkcmVnZXgsICR0aGlzLT5jb250ZW50cywgJG1hdGNoLCAwLCAkdGhpcy0+aW5kZXgpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENsYXNzTWFwR2VuZXJhdG9yOwoKdXNlIFJ1bnRpbWVFeGNlcHRpb247CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgpjbGFzcyBQaHBGaWxlUGFyc2VyCnsKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZmluZENsYXNzZXMoc3RyaW5nICRwYXRoKTogYXJyYXkKewokZXh0cmFUeXBlcyA9IHNlbGY6OmdldEV4dHJhVHlwZXMoKTsKCmlmICghZnVuY3Rpb25fZXhpc3RzKCdwaHBfc3RyaXBfd2hpdGVzcGFjZScpKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdDbGFzc21hcCBnZW5lcmF0aW9uIHJlbGllcyBvbiB0aGUgcGhwX3N0cmlwX3doaXRlc3BhY2UgZnVuY3Rpb24sIGJ1dCBpdCBoYXMgYmVlbiBkaXNhYmxlZCBieSB0aGUgZGlzYWJsZV9mdW5jdGlvbnMgZGlyZWN0aXZlLicpOwp9CgoKCiRjb250ZW50cyA9IEBwaHBfc3RyaXBfd2hpdGVzcGFjZSgkcGF0aCk7CmlmICgnJyA9PT0gJGNvbnRlbnRzKSB7CmlmICghZmlsZV9leGlzdHMoJHBhdGgpKSB7CiRtZXNzYWdlID0gJ0ZpbGUgYXQgIiVzIiBkb2VzIG5vdCBleGlzdCwgY2hlY2sgeW91ciBjbGFzc21hcCBkZWZpbml0aW9ucyc7Cn0gZWxzZWlmICghc2VsZjo6aXNSZWFkYWJsZSgkcGF0aCkpIHsKJG1lc3NhZ2UgPSAnRmlsZSBhdCAiJXMiIGlzIG5vdCByZWFkYWJsZSwgY2hlY2sgaXRzIHBlcm1pc3Npb25zJzsKfSBlbHNlaWYgKCcnID09PSB0cmltKChzdHJpbmcpIGZpbGVfZ2V0X2NvbnRlbnRzKCRwYXRoKSkpIHsKCnJldHVybiBbXTsKfSBlbHNlIHsKJG1lc3NhZ2UgPSAnRmlsZSBhdCAiJXMiIGNvdWxkIG5vdCBiZSBwYXJzZWQgYXMgUEhQLCBpdCBtYXkgYmUgYmluYXJ5IG9yIGNvcnJ1cHRlZCc7Cn0KCiRlcnJvciA9IGVycm9yX2dldF9sYXN0KCk7CmlmIChpc3NldCgkZXJyb3JbJ21lc3NhZ2UnXSkpIHsKJG1lc3NhZ2UgLj0gUEhQX0VPTCAuICdUaGUgZm9sbG93aW5nIG1lc3NhZ2UgbWF5IGJlIGhlbHBmdWw6JyAuIFBIUF9FT0wgLiAkZXJyb3JbJ21lc3NhZ2UnXTsKfQoKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZigkbWVzc2FnZSwgJHBhdGgpKTsKfQoKClByZWc6Om1hdGNoQWxsU3RyaWN0R3JvdXBzKCd7XGIoPzpjbGFzc3xpbnRlcmZhY2V8dHJhaXQnLiRleHRyYVR5cGVzLicpXHN9aScsICRjb250ZW50cywgJG1hdGNoZXMpOwppZiAoW10gPT09ICRtYXRjaGVzWzBdKSB7CnJldHVybiBbXTsKfQoKJHAgPSBuZXcgUGhwRmlsZUNsZWFuZXIoJGNvbnRlbnRzLCBjb3VudCgkbWF0Y2hlc1swXSkpOwokY29udGVudHMgPSAkcC0+Y2xlYW4oKTsKdW5zZXQoJHApOwoKUHJlZzo6bWF0Y2hBbGwoJ3sKICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAgXGIoPzwhW1xcXFwkOj5dKSg/UDx0eXBlPmNsYXNzfGludGVyZmFjZXx0cmFpdCcuJGV4dHJhVHlwZXMuJykgXHMrKyAoP1A8bmFtZT5bYS16QS1aX1x4N2YtXHhmZjpdW2EtekEtWjAtOV9ceDdmLVx4ZmY6XC1dKispCiAgICAgICAgICAgICAgIHwgXGIoPzwhW1xcXFwkOj5dKSg/UDxucz5uYW1lc3BhY2UpICg/UDxuc25hbWU+XHMrK1thLXpBLVpfXHg3Zi1ceGZmXVthLXpBLVowLTlfXHg3Zi1ceGZmXSorKD86XHMqK1xcXFxccyorW2EtekEtWl9ceDdmLVx4ZmZdW2EtekEtWjAtOV9ceDdmLVx4ZmZdKispKispPyBccyorIFtceztdCiAgICAgICAgICAgICkKICAgICAgICB9aXgnLCAkY29udGVudHMsICRtYXRjaGVzKTsKCiRjbGFzc2VzID0gW107CiRuYW1lc3BhY2UgPSAnJzsKCmZvciAoJGkgPSAwLCAkbGVuID0gY291bnQoJG1hdGNoZXNbJ3R5cGUnXSk7ICRpIDwgJGxlbjsgKyskaSkgewppZiAoaXNzZXQoJG1hdGNoZXNbJ25zJ11bJGldKSAmJiAkbWF0Y2hlc1snbnMnXVskaV0gIT09ICcnKSB7CiRuYW1lc3BhY2UgPSBzdHJfcmVwbGFjZShbJyAnLCAiXHQiLCAiXHIiLCAiXG4iXSwgJycsIChzdHJpbmcpICRtYXRjaGVzWyduc25hbWUnXVskaV0pIC4gJ1xcJzsKfSBlbHNlIHsKJG5hbWUgPSAkbWF0Y2hlc1snbmFtZSddWyRpXTsKYXNzZXJ0KGlzX3N0cmluZygkbmFtZSkpOwoKaWYgKCRuYW1lID09PSAnZXh0ZW5kcycpIHsKY29udGludWU7Cn0KaWYgKCRuYW1lID09PSAnaW1wbGVtZW50cycpIHsKY29udGludWU7Cn0KCmlmICgkbmFtZVswXSA9PT0gJzonKSB7CgokbmFtZSA9ICd4aHAnLnN1YnN0cihzdHJfcmVwbGFjZShbJy0nLCAnOiddLCBbJ18nLCAnX18nXSwgJG5hbWUpLCAxKTsKfSBlbHNlaWYgKHN0cnRvbG93ZXIoKHN0cmluZykgJG1hdGNoZXNbJ3R5cGUnXVskaV0pID09PSAnZW51bScpIHsKCgoKCgoKCgokY29sb25Qb3MgPSBzdHJycG9zKCRuYW1lLCAnOicpOwppZiAoZmFsc2UgIT09ICRjb2xvblBvcykgewokbmFtZSA9IHN1YnN0cigkbmFtZSwgMCwgJGNvbG9uUG9zKTsKfQp9CgoKJGNsYXNzTmFtZSA9IGx0cmltKCRuYW1lc3BhY2UgLiAkbmFtZSwgJ1xcJyk7CiRjbGFzc2VzW10gPSAkY2xhc3NOYW1lOwp9Cn0KCnJldHVybiAkY2xhc3NlczsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0RXh0cmFUeXBlcygpOiBzdHJpbmcKewpzdGF0aWMgJGV4dHJhVHlwZXMgPSBudWxsOwoKaWYgKG51bGwgPT09ICRleHRyYVR5cGVzKSB7CiRleHRyYVR5cGVzID0gJyc7CiRleHRyYVR5cGVzQXJyYXkgPSBbXTsKaWYgKFBIUF9WRVJTSU9OX0lEID49IDgwMTAwIHx8IChkZWZpbmVkKCdISFZNX1ZFUlNJT04nKSAmJiB2ZXJzaW9uX2NvbXBhcmUoSEhWTV9WRVJTSU9OLCAnMy4zJywgJz49JykpKSB7CiRleHRyYVR5cGVzIC49ICd8ZW51bSc7CiRleHRyYVR5cGVzQXJyYXkgPSBbJ2VudW0nXTsKfQoKUGhwRmlsZUNsZWFuZXI6OnNldFR5cGVDb25maWcoYXJyYXlfbWVyZ2UoWydjbGFzcycsICdpbnRlcmZhY2UnLCAndHJhaXQnXSwgJGV4dHJhVHlwZXNBcnJheSkpOwp9CgpyZXR1cm4gJGV4dHJhVHlwZXM7Cn0KCgoKCgoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpc1JlYWRhYmxlKHN0cmluZyAkcGF0aCkKewppZiAoaXNfcmVhZGFibGUoJHBhdGgpKSB7CnJldHVybiB0cnVlOwp9CgppZiAoaXNfZmlsZSgkcGF0aCkpIHsKcmV0dXJuIGZhbHNlICE9PSBAZmlsZV9nZXRfY29udGVudHMoJHBhdGgsIGZhbHNlLCBudWxsLCAwLCAxKTsKfQoKCnJldHVybiBmYWxzZTsKfQp9CnsKICAgICJwYWNrYWdlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogImNvbXBvc2VyL2NhLWJ1bmRsZSIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogIjEuNS4xMSIsCiAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiAiMS41LjExLjAiLAogICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0IiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NhLWJ1bmRsZS5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICI2OGZmMzkxNzVlOGU5NGE0YmIxZDI1OTQwN2NlNTFhNmE2MGYwOWU2IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvY29tcG9zZXIvY2EtYnVuZGxlL3ppcGJhbGwvNjhmZjM5MTc1ZThlOTRhNGJiMWQyNTk0MDdjZTUxYTZhNjBmMDllNiIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjY4ZmYzOTE3NWU4ZTk0YTRiYjFkMjU5NDA3Y2U1MWE2YTYwZjA5ZTYiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgImV4dC1vcGVuc3NsIjogIioiLAogICAgICAgICAgICAgICAgImV4dC1wY3JlIjogIioiLAogICAgICAgICAgICAgICAgInBocCI6ICJeNy4yIHx8IF44LjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlLWRldiI6IHsKICAgICAgICAgICAgICAgICJwaHBzdGFuL3BocHN0YW4iOiAiXjEuMTAiLAogICAgICAgICAgICAgICAgInBocHVuaXQvcGhwdW5pdCI6ICJeOCB8fCBeOSIsCiAgICAgICAgICAgICAgICAicHNyL2xvZyI6ICJeMS4wIHx8IF4yLjAgfHwgXjMuMCIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9wcm9jZXNzIjogIl40LjAgfHwgXjUuMCB8fCBeNi4wIHx8IF43LjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjYtMDMtMzBUMDk6MTY6MTArMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImV4dHJhIjogewogICAgICAgICAgICAgICAgImJyYW5jaC1hbGlhcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGV2LW1haW4iOiAiMS54LWRldiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiQ29tcG9zZXJcXENhQnVuZGxlXFwiOiAic3JjIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiSm9yZGkgQm9nZ2lhbm8iLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJqLmJvZ2dpYW5vQHNlbGQuYmUiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwOi8vc2VsZC5iZSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxldHMgeW91IGZpbmQgYSBwYXRoIHRvIHRoZSBzeXN0ZW0gQ0EgYnVuZGxlLCBhbmQgaW5jbHVkZXMgYSBmYWxsYmFjayB0byB0aGUgTW96aWxsYSBDQSBidW5kbGUuIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgImNhYnVuZGxlIiwKICAgICAgICAgICAgICAgICJjYWNlcnQiLAogICAgICAgICAgICAgICAgImNlcnRpZmljYXRlIiwKICAgICAgICAgICAgICAgICJzc2wiLAogICAgICAgICAgICAgICAgInRscyIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInN1cHBvcnQiOiB7CiAgICAgICAgICAgICAgICAiaXJjIjogImlyYzovL2lyYy5mcmVlbm9kZS5vcmcvY29tcG9zZXIiLAogICAgICAgICAgICAgICAgImlzc3VlcyI6ICJodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvY2EtYnVuZGxlL2lzc3VlcyIsCiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9jYS1idW5kbGUvdHJlZS8xLjUuMTEiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmdW5kaW5nIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3QuY29tIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjdXN0b20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi9jYS1idW5kbGUiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogImNvbXBvc2VyL2NsYXNzLW1hcC1nZW5lcmF0b3IiLAogICAgICAgICAgICAidmVyc2lvbiI6ICIxLjcuMiIsCiAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiAiMS43LjIuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvY2xhc3MtbWFwLWdlbmVyYXRvci5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICI2YTljMmYwOTcwMDIyYWIwMGRjNThjMDdkMDY4NWRkNzEyZjIyMzFiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvY29tcG9zZXIvY2xhc3MtbWFwLWdlbmVyYXRvci96aXBiYWxsLzZhOWMyZjA5NzAwMjJhYjAwZGM1OGMwN2QwNjg1ZGQ3MTJmMjIzMWIiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICI2YTljMmYwOTcwMDIyYWIwMGRjNThjMDdkMDY4NWRkNzEyZjIyMzFiIiwKICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgICAgICJjb21wb3Nlci9wY3JlIjogIl4yLjEgfHwgXjMuMSIsCiAgICAgICAgICAgICAgICAicGhwIjogIl43LjIgfHwgXjguMCIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9maW5kZXIiOiAiXjQuNCB8fCBeNS4zIHx8IF42IHx8IF43IHx8IF44IgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZS1kZXYiOiB7CiAgICAgICAgICAgICAgICAicGhwc3Rhbi9waHBzdGFuIjogIl4xLjEyIHx8IF4yIiwKICAgICAgICAgICAgICAgICJwaHBzdGFuL3BocHN0YW4tZGVwcmVjYXRpb24tcnVsZXMiOiAiXjEgfHwgXjIiLAogICAgICAgICAgICAgICAgInBocHN0YW4vcGhwc3Rhbi1waHB1bml0IjogIl4xIHx8IF4yIiwKICAgICAgICAgICAgICAgICJwaHBzdGFuL3BocHN0YW4tc3RyaWN0LXJ1bGVzIjogIl4xLjEgfHwgXjIiLAogICAgICAgICAgICAgICAgInBocHVuaXQvcGhwdW5pdCI6ICJeOCIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9maWxlc3lzdGVtIjogIl41LjQgfHwgXjYgfHwgXjcgfHwgXjgiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjYtMDMtMzBUMTU6MzY6NTYrMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImV4dHJhIjogewogICAgICAgICAgICAgICAgImJyYW5jaC1hbGlhcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGV2LW1haW4iOiAiMS54LWRldiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiQ29tcG9zZXJcXENsYXNzTWFwR2VuZXJhdG9yXFwiOiAic3JjIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiSm9yZGkgQm9nZ2lhbm8iLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJqLmJvZ2dpYW5vQHNlbGQuYmUiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3NlbGQuYmUiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVdGlsaXRpZXMgdG8gc2NhbiBQSFAgY29kZSBhbmQgZ2VuZXJhdGUgY2xhc3MgbWFwcy4iLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAiY2xhc3NtYXAiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgImlzc3VlcyI6ICJodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvY2xhc3MtbWFwLWdlbmVyYXRvci9pc3N1ZXMiLAogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvY2xhc3MtbWFwLWdlbmVyYXRvci90cmVlLzEuNy4yIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZnVuZGluZyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vcGFja2FnaXN0LmNvbSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY3VzdG9tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3NlciIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4vY2xhc3MtbWFwLWdlbmVyYXRvciIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAiY29tcG9zZXIvbWV0YWRhdGEtbWluaWZpZXIiLAogICAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCiAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiAiMS4wLjAuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvbWV0YWRhdGEtbWluaWZpZXIuZ2l0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiYzU0OWQyMzgyOTUzNmYwZDBlOTg0YWFhYmJmMDJhZjkxZjQ0MzIwNyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJ6aXAiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2NvbXBvc2VyL21ldGFkYXRhLW1pbmlmaWVyL3ppcGJhbGwvYzU0OWQyMzgyOTUzNmYwZDBlOTg0YWFhYmJmMDJhZjkxZjQ0MzIwNyIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImM1NDlkMjM4Mjk1MzZmMGQwZTk4NGFhYWJiZjAyYWY5MWY0NDMyMDciLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICJeNS4zLjIgfHwgXjcuMCB8fCBeOC4wIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZS1kZXYiOiB7CiAgICAgICAgICAgICAgICAiY29tcG9zZXIvY29tcG9zZXIiOiAiXjIiLAogICAgICAgICAgICAgICAgInBocHN0YW4vcGhwc3RhbiI6ICJeMC4xMi41NSIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9waHB1bml0LWJyaWRnZSI6ICJeNC4yIHx8IF41IgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDIxLTA0LTA3VDEzOjM3OjMzKzAwOjAwIiwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJleHRyYSI6IHsKICAgICAgICAgICAgICAgICJicmFuY2gtYWxpYXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRldi1tYWluIjogIjEueC1kZXYiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIkNvbXBvc2VyXFxNZXRhZGF0YU1pbmlmaWVyXFwiOiAic3JjIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiSm9yZGkgQm9nZ2lhbm8iLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJqLmJvZ2dpYW5vQHNlbGQuYmUiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwOi8vc2VsZC5iZSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNtYWxsIHV0aWxpdHkgbGlicmFyeSB0aGF0IGhhbmRsZXMgbWV0YWRhdGEgbWluaWZpY2F0aW9uIGFuZCBleHBhbnNpb24uIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgImNvbXBvc2VyIiwKICAgICAgICAgICAgICAgICJjb21wcmVzc2lvbiIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInN1cHBvcnQiOiB7CiAgICAgICAgICAgICAgICAiaXNzdWVzIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9tZXRhZGF0YS1taW5pZmllci9pc3N1ZXMiLAogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvbWV0YWRhdGEtbWluaWZpZXIvdHJlZS8xLjAuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3BhY2thZ2lzdC5jb20iLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImN1c3RvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdGh1YiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3RpZGVsaWZ0LmNvbS9mdW5kaW5nL2dpdGh1Yi9wYWNrYWdpc3QvY29tcG9zZXIvY29tcG9zZXIiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRpZGVsaWZ0IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4vbWV0YWRhdGEtbWluaWZpZXIiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogImNvbXBvc2VyL3BjcmUiLAogICAgICAgICAgICAidmVyc2lvbiI6ICIyLjMuMiIsCiAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiAiMi4zLjIuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvcGNyZS5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJlYmI4MWRmOGY1MmI0MDE3MmQxNDA2MmFlOTZhMDY5MzlkODBhMDY5IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvY29tcG9zZXIvcGNyZS96aXBiYWxsL2ViYjgxZGY4ZjUyYjQwMTcyZDE0MDYyYWU5NmEwNjkzOWQ4MGEwNjkiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJlYmI4MWRmOGY1MmI0MDE3MmQxNDA2MmFlOTZhMDY5MzlkODBhMDY5IiwKICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgICAgICJwaHAiOiAiXjcuMiB8fCBeOC4wIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiY29uZmxpY3QiOiB7CiAgICAgICAgICAgICAgICAicGhwc3Rhbi9waHBzdGFuIjogIjwxLjExLjEwIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZS1kZXYiOiB7CiAgICAgICAgICAgICAgICAicGhwc3Rhbi9waHBzdGFuIjogIl4xLjEyIHx8IF4yIiwKICAgICAgICAgICAgICAgICJwaHBzdGFuL3BocHN0YW4tc3RyaWN0LXJ1bGVzIjogIl4xIHx8IF4yIiwKICAgICAgICAgICAgICAgICJwaHB1bml0L3BocHVuaXQiOiAiXjggfHwgXjkiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjQtMTEtMTJUMTY6MjQ6NDcrMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImV4dHJhIjogewogICAgICAgICAgICAgICAgInBocHN0YW4iOiB7CiAgICAgICAgICAgICAgICAgICAgImluY2x1ZGVzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uLm5lb24iCiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJicmFuY2gtYWxpYXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRldi1tYWluIjogIjIueC1kZXYiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIkNvbXBvc2VyXFxQY3JlXFwiOiAic3JjIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiSm9yZGkgQm9nZ2lhbm8iLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJqLmJvZ2dpYW5vQHNlbGQuYmUiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwOi8vc2VsZC5iZSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlBDUkUgd3JhcHBpbmcgbGlicmFyeSB0aGF0IG9mZmVycyB0eXBlLXNhZmUgcHJlZ18qIHJlcGxhY2VtZW50cy4iLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAiUENSRSIsCiAgICAgICAgICAgICAgICAicHJlZyIsCiAgICAgICAgICAgICAgICAicmVnZXgiLAogICAgICAgICAgICAgICAgInJlZ3VsYXIgZXhwcmVzc2lvbiIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInN1cHBvcnQiOiB7CiAgICAgICAgICAgICAgICAiaXNzdWVzIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9wY3JlL2lzc3VlcyIsCiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9wY3JlL3RyZWUvMi4zLjIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmdW5kaW5nIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3QuY29tIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjdXN0b20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly90aWRlbGlmdC5jb20vZnVuZGluZy9naXRodWIvcGFja2FnaXN0L2NvbXBvc2VyL2NvbXBvc2VyIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0aWRlbGlmdCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImluc3RhbGwtcGF0aCI6ICIuL3BjcmUiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogImNvbXBvc2VyL3NlbXZlciIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogIjMuNC40IiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICIzLjQuNC4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9zZW12ZXIuZ2l0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiMTk4MTY2NjE4OTA2Y2IyZGU2OWI5NWQ3ZDQ3ZTVmYThhYTFiMmI5NSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJ6aXAiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2NvbXBvc2VyL3NlbXZlci96aXBiYWxsLzE5ODE2NjYxODkwNmNiMmRlNjliOTVkN2Q0N2U1ZmE4YWExYjJiOTUiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICIxOTgxNjY2MTg5MDZjYjJkZTY5Yjk1ZDdkNDdlNWZhOGFhMWIyYjk1IiwKICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgICAgICJwaHAiOiAiXjUuMy4yIHx8IF43LjAgfHwgXjguMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUtZGV2IjogewogICAgICAgICAgICAgICAgInBocHN0YW4vcGhwc3RhbiI6ICJeMS4xMSIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9waHB1bml0LWJyaWRnZSI6ICJeMyB8fCBeNyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyNS0wOC0yMFQxOToxNTozMCswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAgICAgICAiYnJhbmNoLWFsaWFzIjogewogICAgICAgICAgICAgICAgICAgICJkZXYtbWFpbiI6ICIzLngtZGV2IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAiaW5zdGFsbGF0aW9uLXNvdXJjZSI6ICJkaXN0IiwKICAgICAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAgICAgInBzci00IjogewogICAgICAgICAgICAgICAgICAgICJDb21wb3NlclxcU2VtdmVyXFwiOiAic3JjIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiTmlscyBBZGVybWFubiIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogIm5hZGVybWFuQG5hZGVybWFuLmRlIiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cDovL3d3dy5uYWRlcm1hbi5kZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiSm9yZGkgQm9nZ2lhbm8iLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJqLmJvZ2dpYW5vQHNlbGQuYmUiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwOi8vc2VsZC5iZSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiUm9iIEJhc3QiLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJyb2IuYmFzdEBnbWFpbC5jb20iLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwOi8vcm9iYmFzdC5ubCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNlbXZlciBsaWJyYXJ5IHRoYXQgb2ZmZXJzIHV0aWxpdGllcywgdmVyc2lvbiBjb25zdHJhaW50IHBhcnNpbmcgYW5kIHZhbGlkYXRpb24uIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgInNlbWFudGljIiwKICAgICAgICAgICAgICAgICJzZW12ZXIiLAogICAgICAgICAgICAgICAgInZhbGlkYXRpb24iLAogICAgICAgICAgICAgICAgInZlcnNpb25pbmciCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgImlyYyI6ICJpcmNzOi8vaXJjLmxpYmVyYS5jaGF0OjY2OTcvY29tcG9zZXIiLAogICAgICAgICAgICAgICAgImlzc3VlcyI6ICJodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvc2VtdmVyL2lzc3VlcyIsCiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9zZW12ZXIvdHJlZS8zLjQuNCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3BhY2thZ2lzdC5jb20iLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImN1c3RvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdGh1YiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImluc3RhbGwtcGF0aCI6ICIuL3NlbXZlciIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAiY29tcG9zZXIvc3BkeC1saWNlbnNlcyIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogIjEuNi4wIiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICIxLjYuMC4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9zcGR4LWxpY2Vuc2VzLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjVlY2QwY2I0MTc3Njk2ZjlmZDQ4ZjE2MDVkZGE4MWRiM2RlZTc4ODkiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9jb21wb3Nlci9zcGR4LWxpY2Vuc2VzL3ppcGJhbGwvNWVjZDBjYjQxNzc2OTZmOWZkNDhmMTYwNWRkYTgxZGIzZGVlNzg4OSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjVlY2QwY2I0MTc3Njk2ZjlmZDQ4ZjE2MDVkZGE4MWRiM2RlZTc4ODkiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICJeNy4yIHx8IF44LjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlLWRldiI6IHsKICAgICAgICAgICAgICAgICJwaHBzdGFuL3BocHN0YW4iOiAiXjEuMTEiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvcGhwdW5pdC1icmlkZ2UiOiAiXjYuNC4yNSB8fCBeNy4zLjMgfHwgXjguMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyNi0wNC0wOFQyMDoxODozOSswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAgICAgICAiYnJhbmNoLWFsaWFzIjogewogICAgICAgICAgICAgICAgICAgICJkZXYtbWFpbiI6ICIxLngtZGV2IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAiaW5zdGFsbGF0aW9uLXNvdXJjZSI6ICJkaXN0IiwKICAgICAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAgICAgInBzci00IjogewogICAgICAgICAgICAgICAgICAgICJDb21wb3NlclxcU3BkeFxcIjogInNyYyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIk5pbHMgQWRlcm1hbm4iLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJuYWRlcm1hbkBuYWRlcm1hbi5kZSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHA6Ly93d3cubmFkZXJtYW4uZGUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIkpvcmRpIEJvZ2dpYW5vIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAiai5ib2dnaWFub0BzZWxkLmJlIiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cDovL3NlbGQuYmUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIlJvYiBCYXN0IiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAicm9iLmJhc3RAZ21haWwuY29tIiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cDovL3JvYmJhc3QubmwiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTUERYIGxpY2Vuc2VzIGxpc3QgYW5kIHZhbGlkYXRpb24gbGlicmFyeS4iLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAibGljZW5zZSIsCiAgICAgICAgICAgICAgICAic3BkeCIsCiAgICAgICAgICAgICAgICAidmFsaWRhdG9yIgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJpcmMiOiAiaXJjczovL2lyYy5saWJlcmEuY2hhdDo2Njk3L2NvbXBvc2VyIiwKICAgICAgICAgICAgICAgICJpc3N1ZXMiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL3NwZHgtbGljZW5zZXMvaXNzdWVzIiwKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL3NwZHgtbGljZW5zZXMvdHJlZS8xLjYuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3BhY2thZ2lzdC5jb20iLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImN1c3RvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdGh1YiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImluc3RhbGwtcGF0aCI6ICIuL3NwZHgtbGljZW5zZXMiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogImNvbXBvc2VyL3hkZWJ1Zy1oYW5kbGVyIiwKICAgICAgICAgICAgInZlcnNpb24iOiAiMy4wLjUiLAogICAgICAgICAgICAidmVyc2lvbl9ub3JtYWxpemVkIjogIjMuMC41LjAiLAogICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0IiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL3hkZWJ1Zy1oYW5kbGVyLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjZjMTkyNTU2MTYzMmU4M2Q2MGE0NDQ5MmUwYjM0NGNmNDhhYjg1ZWYiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9jb21wb3Nlci94ZGVidWctaGFuZGxlci96aXBiYWxsLzZjMTkyNTU2MTYzMmU4M2Q2MGE0NDQ5MmUwYjM0NGNmNDhhYjg1ZWYiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICI2YzE5MjU1NjE2MzJlODNkNjBhNDQ0OTJlMGIzNDRjZjQ4YWI4NWVmIiwKICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgICAgICJjb21wb3Nlci9wY3JlIjogIl4xIHx8IF4yIHx8IF4zIiwKICAgICAgICAgICAgICAgICJwaHAiOiAiXjcuMi41IHx8IF44LjAiLAogICAgICAgICAgICAgICAgInBzci9sb2ciOiAiXjEgfHwgXjIgfHwgXjMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlLWRldiI6IHsKICAgICAgICAgICAgICAgICJwaHBzdGFuL3BocHN0YW4iOiAiXjEuMCIsCiAgICAgICAgICAgICAgICAicGhwc3Rhbi9waHBzdGFuLXN0cmljdC1ydWxlcyI6ICJeMS4xIiwKICAgICAgICAgICAgICAgICJwaHB1bml0L3BocHVuaXQiOiAiXjguNSB8fCBeOS42IHx8IF4xMC41IgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDI0LTA1LTA2VDE2OjM3OjE2KzAwOjAwIiwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIkNvbXBvc2VyXFxYZGVidWdIYW5kbGVyXFwiOiAic3JjIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiSm9obiBTdGV2ZW5zb24iLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJqb2huLXN0ZXZlbnNvbkBibHVleW9uZGVyLmNvLnVrIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUmVzdGFydHMgYSBwcm9jZXNzIHdpdGhvdXQgWGRlYnVnLiIsCiAgICAgICAgICAgICJrZXl3b3JkcyI6IFsKICAgICAgICAgICAgICAgICJYZGVidWciLAogICAgICAgICAgICAgICAgInBlcmZvcm1hbmNlIgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJpcmMiOiAiaXJjczovL2lyYy5saWJlcmEuY2hhdDo2Njk3L2NvbXBvc2VyIiwKICAgICAgICAgICAgICAgICJpc3N1ZXMiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL3hkZWJ1Zy1oYW5kbGVyL2lzc3VlcyIsCiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci94ZGVidWctaGFuZGxlci90cmVlLzMuMC41IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZnVuZGluZyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vcGFja2FnaXN0LmNvbSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY3VzdG9tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3NlciIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViL3BhY2thZ2lzdC9jb21wb3Nlci9jb21wb3NlciIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi94ZGVidWctaGFuZGxlciIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAianVzdGlucmFpbmJvdy9qc29uLXNjaGVtYSIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogIjYuOC4wIiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICI2LjguMC4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9qc29ucmFpbmJvdy9qc29uLXNjaGVtYS5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICI4OWFjOTJiY2ZlNWQwYThhNDQzM2M3Yjg5ZDM5NDU1M2FlNzI1MGNjIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvanNvbnJhaW5ib3cvanNvbi1zY2hlbWEvemlwYmFsbC84OWFjOTJiY2ZlNWQwYThhNDQzM2M3Yjg5ZDM5NDU1M2FlNzI1MGNjIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiODlhYzkyYmNmZTVkMGE4YTQ0MzNjN2I4OWQzOTQ1NTNhZTcyNTBjYyIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAiZXh0LWpzb24iOiAiKiIsCiAgICAgICAgICAgICAgICAibWFyYy1tYWJlL3BocC1lbnVtIjogIl40LjQiLAogICAgICAgICAgICAgICAgInBocCI6ICJeNy4yIHx8IF44LjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlLWRldiI6IHsKICAgICAgICAgICAgICAgICJmcmllbmRzb2ZwaHAvcGhwLWNzLWZpeGVyIjogIjMuMy4wIiwKICAgICAgICAgICAgICAgICJqc29uLXNjaGVtYS9qc29uLXNjaGVtYS10ZXN0LXN1aXRlIjogIl4yMy4yIiwKICAgICAgICAgICAgICAgICJtYXJjLW1hYmUvcGhwLWVudW0tcGhwc3RhbiI6ICJeMi4wIiwKICAgICAgICAgICAgICAgICJwaHBzcGVjL3Byb3BoZWN5IjogIl4xLjE5IiwKICAgICAgICAgICAgICAgICJwaHBzdGFuL3BocHN0YW4iOiAiXjEuMTIiLAogICAgICAgICAgICAgICAgInBocHVuaXQvcGhwdW5pdCI6ICJeOC41IgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDI2LTA0LTAyVDEyOjQzOjExKzAwOjAwIiwKICAgICAgICAgICAgImJpbiI6IFsKICAgICAgICAgICAgICAgICJiaW4vdmFsaWRhdGUtanNvbiIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJleHRyYSI6IHsKICAgICAgICAgICAgICAgICJicmFuY2gtYWxpYXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRldi1tYXN0ZXIiOiAiNi54LWRldiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiSnNvblNjaGVtYVxcIjogInNyYy9Kc29uU2NoZW1hLyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIkJydW5vIFByaWV0byBSZWlzIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAiYnJ1bm8ucC5yZWlzQGdtYWlsLmNvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiSnVzdGluIFJhaW5ib3ciLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJqdXN0aW4ucmFpbmJvd0BnbWFpbC5jb20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIklnb3IgV2llZGxlciIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImlnb3JAd2llZGxlci5jaCIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiUm9iZXJ0IFNjaMO2bnRoYWwiLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJzZXJvc2Nob0Bnb29nbGVtYWlsLmNvbSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlicmFyeSB0byB2YWxpZGF0ZSBhIGpzb24gc2NoZW1hLiIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL2dpdGh1Yi5jb20vanNvbnJhaW5ib3cvanNvbi1zY2hlbWEiLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAianNvbiIsCiAgICAgICAgICAgICAgICAic2NoZW1hIgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJpc3N1ZXMiOiAiaHR0cHM6Ly9naXRodWIuY29tL2pzb25yYWluYm93L2pzb24tc2NoZW1hL2lzc3VlcyIsCiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9qc29ucmFpbmJvdy9qc29uLXNjaGVtYS90cmVlLzYuOC4wIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4uL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogIm1hcmMtbWFiZS9waHAtZW51bSIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogInY0LjcuMiIsCiAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiAiNC43LjIuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vbWFyYy1tYWJlL3BocC1lbnVtLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImJiNDI2ZmNkZDY1YzYwZmIzNjM4ZWY3NDFlODc4MjUwOGZkYTdlZWYiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXJjLW1hYmUvcGhwLWVudW0vemlwYmFsbC9iYjQyNmZjZGQ2NWM2MGZiMzYzOGVmNzQxZTg3ODI1MDhmZGE3ZWVmIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiYmI0MjZmY2RkNjVjNjBmYjM2MzhlZjc0MWU4NzgyNTA4ZmRhN2VlZiIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAiZXh0LXJlZmxlY3Rpb24iOiAiKiIsCiAgICAgICAgICAgICAgICAicGhwIjogIl43LjEgfCBeOC4wIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZS1kZXYiOiB7CiAgICAgICAgICAgICAgICAicGhwYmVuY2gvcGhwYmVuY2giOiAiXjAuMTYuMTAgfHwgXjEuMC40IiwKICAgICAgICAgICAgICAgICJwaHBzdGFuL3BocHN0YW4iOiAiXjEuMy4xIiwKICAgICAgICAgICAgICAgICJwaHB1bml0L3BocHVuaXQiOiAiXjcuNS4yMCB8IF44LjUuMjIgfCBeOS41LjExIiwKICAgICAgICAgICAgICAgICJ2aW1lby9wc2FsbSI6ICJeNC4xNy4wIHwgXjUuMjYuMSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyNS0wOS0xNFQxMToxODozOSswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAgICAgICAiYnJhbmNoLWFsaWFzIjogewogICAgICAgICAgICAgICAgICAgICJkZXYtMy54IjogIjMuMi1kZXYiLAogICAgICAgICAgICAgICAgICAgICJkZXYtbWFzdGVyIjogIjQuNy1kZXYiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIk1hYmVFbnVtXFwiOiAic3JjLyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY2xhc3NtYXAiOiBbCiAgICAgICAgICAgICAgICAgICAgInN0dWJzL1N0cmluZ2FibGUucGhwIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIkJTRC0zLUNsYXVzZSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiTWFyYyBCZW5uZXdpdHoiLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJkZXZAbWFiZS5iZXJsaW4iLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL21hYmUuYmVybGluLyIsCiAgICAgICAgICAgICAgICAgICAgInJvbGUiOiAiTGVhZCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNpbXBsZSBhbmQgZmFzdCBpbXBsZW1lbnRhdGlvbiBvZiBlbnVtZXJhdGlvbnMgd2l0aCBuYXRpdmUgUEhQIiwKICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9tYXJjLW1hYmUvcGhwLWVudW0iLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAiZW51bSIsCiAgICAgICAgICAgICAgICAiZW51bS1tYXAiLAogICAgICAgICAgICAgICAgImVudW0tc2V0IiwKICAgICAgICAgICAgICAgICJlbnVtZXJhdGlvbiIsCiAgICAgICAgICAgICAgICAiZW51bWVyYXRvciIsCiAgICAgICAgICAgICAgICAiZW51bW1hcCIsCiAgICAgICAgICAgICAgICAiZW51bXNldCIsCiAgICAgICAgICAgICAgICAibWFwIiwKICAgICAgICAgICAgICAgICJzZXQiLAogICAgICAgICAgICAgICAgInR5cGUiLAogICAgICAgICAgICAgICAgInR5cGUtaGludCIsCiAgICAgICAgICAgICAgICAidHlwZWhpbnQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgImlzc3VlcyI6ICJodHRwczovL2dpdGh1Yi5jb20vbWFyYy1tYWJlL3BocC1lbnVtL2lzc3VlcyIsCiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9tYXJjLW1hYmUvcGhwLWVudW0vdHJlZS92NC43LjIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vbWFyYy1tYWJlL3BocC1lbnVtIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJwc3IvY29udGFpbmVyIiwKICAgICAgICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAogICAgICAgICAgICAidmVyc2lvbl9ub3JtYWxpemVkIjogIjEuMS4xLjAiLAogICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0IiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3BocC1maWcvY29udGFpbmVyLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjg2MjI1Njc0MDkwMTAyODJiN2FlZWJlNGJiODQxZmU5OGI1OGRjYWYiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9waHAtZmlnL2NvbnRhaW5lci96aXBiYWxsLzg2MjI1Njc0MDkwMTAyODJiN2FlZWJlNGJiODQxZmU5OGI1OGRjYWYiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICI4NjIyNTY3NDA5MDEwMjgyYjdhZWViZTRiYjg0MWZlOThiNThkY2FmIiwKICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgICAgICJwaHAiOiAiPj03LjIuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyMS0wMy0wNVQxNzozNjowNiswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiaW5zdGFsbGF0aW9uLXNvdXJjZSI6ICJkaXN0IiwKICAgICAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAgICAgInBzci00IjogewogICAgICAgICAgICAgICAgICAgICJQc3JcXENvbnRhaW5lclxcIjogInNyYy8iCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJQSFAtRklHIiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly93d3cucGhwLWZpZy5vcmcvIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ29tbW9uIENvbnRhaW5lciBJbnRlcmZhY2UgKFBIUCBGSUcgUFNSLTExKSIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL2dpdGh1Yi5jb20vcGhwLWZpZy9jb250YWluZXIiLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAiUFNSLTExIiwKICAgICAgICAgICAgICAgICJjb250YWluZXIiLAogICAgICAgICAgICAgICAgImNvbnRhaW5lci1pbnRlcmZhY2UiLAogICAgICAgICAgICAgICAgImNvbnRhaW5lci1pbnRlcm9wIiwKICAgICAgICAgICAgICAgICJwc3IiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgImlzc3VlcyI6ICJodHRwczovL2dpdGh1Yi5jb20vcGhwLWZpZy9jb250YWluZXIvaXNzdWVzIiwKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL3BocC1maWcvY29udGFpbmVyL3RyZWUvMS4xLjEiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vcHNyL2NvbnRhaW5lciIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAicHNyL2xvZyIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS40IiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICIxLjEuNC4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9waHAtZmlnL2xvZy5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJkNDk2OTViOTA5YzNiNzYyOGI2Mjg5ZGI1NDc5YTFjMjA0NjAxZjExIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvcGhwLWZpZy9sb2cvemlwYmFsbC9kNDk2OTViOTA5YzNiNzYyOGI2Mjg5ZGI1NDc5YTFjMjA0NjAxZjExIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiZDQ5Njk1YjkwOWMzYjc2MjhiNjI4OWRiNTQ3OWExYzIwNDYwMWYxMSIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAicGhwIjogIj49NS4zLjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjEtMDUtMDNUMTE6MjA6MjcrMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImV4dHJhIjogewogICAgICAgICAgICAgICAgImJyYW5jaC1hbGlhcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGV2LW1hc3RlciI6ICIxLjEueC1kZXYiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlBzclxcTG9nXFwiOiAiUHNyL0xvZy8iCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJQSFAtRklHIiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly93d3cucGhwLWZpZy5vcmcvIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ29tbW9uIGludGVyZmFjZSBmb3IgbG9nZ2luZyBsaWJyYXJpZXMiLAogICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL3BocC1maWcvbG9nIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgImxvZyIsCiAgICAgICAgICAgICAgICAicHNyIiwKICAgICAgICAgICAgICAgICJwc3ItMyIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInN1cHBvcnQiOiB7CiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9waHAtZmlnL2xvZy90cmVlLzEuMS40IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4uL3Bzci9sb2ciCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogInJlYWN0L3Byb21pc2UiLAogICAgICAgICAgICAidmVyc2lvbiI6ICJ2My4zLjAiLAogICAgICAgICAgICAidmVyc2lvbl9ub3JtYWxpemVkIjogIjMuMy4wLjAiLAogICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0IiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0cGhwL3Byb21pc2UuZ2l0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiMjM0NDRmNTNhODEzYTMyOTZjMTM2OGJiMTA0NzkzY2U4ZDg4ZjA0YSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJ6aXAiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL3JlYWN0cGhwL3Byb21pc2UvemlwYmFsbC8yMzQ0NGY1M2E4MTNhMzI5NmMxMzY4YmIxMDQ3OTNjZThkODhmMDRhIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiMjM0NDRmNTNhODEzYTMyOTZjMTM2OGJiMTA0NzkzY2U4ZDg4ZjA0YSIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAicGhwIjogIj49Ny4xLjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlLWRldiI6IHsKICAgICAgICAgICAgICAgICJwaHBzdGFuL3BocHN0YW4iOiAiMS4xMi4yOCB8fCAxLjQuMTAiLAogICAgICAgICAgICAgICAgInBocHVuaXQvcGhwdW5pdCI6ICJeOS42IHx8IF43LjUiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjUtMDgtMTlUMTg6NTc6MDMrMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJmaWxlcyI6IFsKICAgICAgICAgICAgICAgICAgICAic3JjL2Z1bmN0aW9uc19pbmNsdWRlLnBocCIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlJlYWN0XFxQcm9taXNlXFwiOiAic3JjLyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIkphbiBTb3JnYWxsYSIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImpzb3JnYWxsYUBnbWFpbC5jb20iLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3NvcmdhbGxhLmNvbS8iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIkNocmlzdGlhbiBMw7xjayIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImNocmlzdGlhbkBjbHVlLmVuZ2luZWVyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9jbHVlLmVuZ2luZWVyaW5nLyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiQ2Vlcy1KYW4gS2lld2lldCIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogInJlYWN0cGhwQGNlZXNqYW5raWV3aWV0Lm5sIiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly93eXJpaGF4aW11cy5uZXQvIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJDaHJpcyBCb2RlbiIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImNib2RlbkBnbWFpbC5jb20iLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL2Nib2Rlbi5kZXYvIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaWdodHdlaWdodCBpbXBsZW1lbnRhdGlvbiBvZiBDb21tb25KUyBQcm9taXNlcy9BIGZvciBQSFAiLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAicHJvbWlzZSIsCiAgICAgICAgICAgICAgICAicHJvbWlzZXMiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgImlzc3VlcyI6ICJodHRwczovL2dpdGh1Yi5jb20vcmVhY3RwaHAvcHJvbWlzZS9pc3N1ZXMiLAogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vcmVhY3RwaHAvcHJvbWlzZS90cmVlL3YzLjMuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL29wZW5jb2xsZWN0aXZlLmNvbS9yZWFjdHBocCIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib3Blbl9jb2xsZWN0aXZlIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4uL3JlYWN0L3Byb21pc2UiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogInNlbGQvanNvbmxpbnQiLAogICAgICAgICAgICAidmVyc2lvbiI6ICIxLjExLjAiLAogICAgICAgICAgICAidmVyc2lvbl9ub3JtYWxpemVkIjogIjEuMTEuMC4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9TZWxkYWVrL2pzb25saW50LmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjE3NDhhYWY4NDdmYzczMWNmYWQ3NzI1YWVjNDEzZWU0NmYwY2MzYTIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9TZWxkYWVrL2pzb25saW50L3ppcGJhbGwvMTc0OGFhZjg0N2ZjNzMxY2ZhZDc3MjVhZWM0MTNlZTQ2ZjBjYzNhMiIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjE3NDhhYWY4NDdmYzczMWNmYWQ3NzI1YWVjNDEzZWU0NmYwY2MzYTIiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICJeNS4zIHx8IF43LjAgfHwgXjguMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUtZGV2IjogewogICAgICAgICAgICAgICAgInBocHN0YW4vcGhwc3RhbiI6ICJeMS4xMSIsCiAgICAgICAgICAgICAgICAicGhwdW5pdC9waHB1bml0IjogIl40LjguMzUgfHwgXjUuNyB8fCBeNi4wIHx8IF44LjUuMTMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjQtMDctMTFUMTQ6NTU6NDUrMDA6MDAiLAogICAgICAgICAgICAiYmluIjogWwogICAgICAgICAgICAgICAgImJpbi9qc29ubGludCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlNlbGRcXEpzb25MaW50XFwiOiAic3JjL1NlbGQvSnNvbkxpbnQvIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiSm9yZGkgQm9nZ2lhbm8iLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJqLmJvZ2dpYW5vQHNlbGQuYmUiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3NlbGQuYmUiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJKU09OIExpbnRlciIsCiAgICAgICAgICAgICJrZXl3b3JkcyI6IFsKICAgICAgICAgICAgICAgICJqc29uIiwKICAgICAgICAgICAgICAgICJsaW50ZXIiLAogICAgICAgICAgICAgICAgInBhcnNlciIsCiAgICAgICAgICAgICAgICAidmFsaWRhdG9yIgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJpc3N1ZXMiOiAiaHR0cHM6Ly9naXRodWIuY29tL1NlbGRhZWsvanNvbmxpbnQvaXNzdWVzIiwKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL1NlbGRhZWsvanNvbmxpbnQvdHJlZS8xLjExLjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmdW5kaW5nIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL1NlbGRhZWsiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdGh1YiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3RpZGVsaWZ0LmNvbS9mdW5kaW5nL2dpdGh1Yi9wYWNrYWdpc3Qvc2VsZC9qc29ubGludCIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vc2VsZC9qc29ubGludCIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAic2VsZC9waGFyLXV0aWxzIiwKICAgICAgICAgICAgInZlcnNpb24iOiAiMS4yLjEiLAogICAgICAgICAgICAidmVyc2lvbl9ub3JtYWxpemVkIjogIjEuMi4xLjAiLAogICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0IiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL1NlbGRhZWsvcGhhci11dGlscy5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJlYTJmNDAxNGYxNjNjMWJlNGM2MDFiOWI3YmQ2YWY4MWJhOGQ3MDFjIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvU2VsZGFlay9waGFyLXV0aWxzL3ppcGJhbGwvZWEyZjQwMTRmMTYzYzFiZTRjNjAxYjliN2JkNmFmODFiYThkNzAxYyIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImVhMmY0MDE0ZjE2M2MxYmU0YzYwMWI5YjdiZDZhZjgxYmE4ZDcwMWMiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICI+PTUuMyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyMi0wOC0zMVQxMDozMToxOCswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAgICAgICAiYnJhbmNoLWFsaWFzIjogewogICAgICAgICAgICAgICAgICAgICJkZXYtbWFzdGVyIjogIjEueC1kZXYiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlNlbGRcXFBoYXJVdGlsc1xcIjogInNyYy8iCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJKb3JkaSBCb2dnaWFubyIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImouYm9nZ2lhbm9Ac2VsZC5iZSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlBIQVIgZmlsZSBmb3JtYXQgdXRpbGl0aWVzLCBmb3Igd2hlbiBQSFAgcGhhcnMgeW91IHVwIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgInBoYXIiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgImlzc3VlcyI6ICJodHRwczovL2dpdGh1Yi5jb20vU2VsZGFlay9waGFyLXV0aWxzL2lzc3VlcyIsCiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9TZWxkYWVrL3BoYXItdXRpbHMvdHJlZS8xLjIuMSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGwtcGF0aCI6ICIuLi9zZWxkL3BoYXItdXRpbHMiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogInNlbGQvc2lnbmFsLWhhbmRsZXIiLAogICAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMiIsCiAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiAiMi4wLjIuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vU2VsZGFlay9zaWduYWwtaGFuZGxlci5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICIwNGE2MTEyZTg4M2FkNzZjMGFkYThlNGE5Zjc1MjBiYmZkYjZiYjk4IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvU2VsZGFlay9zaWduYWwtaGFuZGxlci96aXBiYWxsLzA0YTYxMTJlODgzYWQ3NmMwYWRhOGU0YTlmNzUyMGJiZmRiNmJiOTgiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICIwNGE2MTEyZTg4M2FkNzZjMGFkYThlNGE5Zjc1MjBiYmZkYjZiYjk4IiwKICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgICAgICJwaHAiOiAiPj03LjIuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUtZGV2IjogewogICAgICAgICAgICAgICAgInBocHN0YW4vcGhwc3RhbiI6ICJeMSIsCiAgICAgICAgICAgICAgICAicGhwc3Rhbi9waHBzdGFuLWRlcHJlY2F0aW9uLXJ1bGVzIjogIl4xLjAiLAogICAgICAgICAgICAgICAgInBocHN0YW4vcGhwc3Rhbi1waHB1bml0IjogIl4xIiwKICAgICAgICAgICAgICAgICJwaHBzdGFuL3BocHN0YW4tc3RyaWN0LXJ1bGVzIjogIl4xLjMiLAogICAgICAgICAgICAgICAgInBocHVuaXQvcGhwdW5pdCI6ICJeNy41LjIwIHx8IF44LjUuMjMiLAogICAgICAgICAgICAgICAgInBzci9sb2ciOiAiXjEgfHwgXjIgfHwgXjMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjMtMDktMDNUMDk6MjQ6MDArMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImV4dHJhIjogewogICAgICAgICAgICAgICAgImJyYW5jaC1hbGlhcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGV2LW1haW4iOiAiMi54LWRldiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiU2VsZFxcU2lnbmFsXFwiOiAic3JjLyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIkpvcmRpIEJvZ2dpYW5vIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAiai5ib2dnaWFub0BzZWxkLmJlIiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cDovL3NlbGQuYmUiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTaW1wbGUgdW5peCBzaWduYWwgaGFuZGxlciB0aGF0IHNpbGVudGx5IGZhaWxzIHdoZXJlIHNpZ25hbHMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIGVhc3kgY3Jvc3MtcGxhdGZvcm0gZGV2ZWxvcG1lbnQiLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAicG9zaXgiLAogICAgICAgICAgICAgICAgInNpZ2ludCIsCiAgICAgICAgICAgICAgICAic2lnbmFsIiwKICAgICAgICAgICAgICAgICJzaWd0ZXJtIiwKICAgICAgICAgICAgICAgICJ1bml4IgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJpc3N1ZXMiOiAiaHR0cHM6Ly9naXRodWIuY29tL1NlbGRhZWsvc2lnbmFsLWhhbmRsZXIvaXNzdWVzIiwKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL1NlbGRhZWsvc2lnbmFsLWhhbmRsZXIvdHJlZS8yLjAuMiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGwtcGF0aCI6ICIuLi9zZWxkL3NpZ25hbC1oYW5kbGVyIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L2NvbnNvbGUiLAogICAgICAgICAgICAidmVyc2lvbiI6ICJ2NS40LjQ3IiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICI1LjQuNDcuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9jb25zb2xlLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImM0YmE5ODBjYTYxYTllYjE4ZWU2YmNjNzNmMjhlNDc1ODUyYmIxZWQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9zeW1mb255L2NvbnNvbGUvemlwYmFsbC9jNGJhOTgwY2E2MWE5ZWIxOGVlNmJjYzczZjI4ZTQ3NTg1MmJiMWVkIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiYzRiYTk4MGNhNjFhOWViMThlZTZiY2M3M2YyOGU0NzU4NTJiYjFlZCIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAicGhwIjogIj49Ny4yLjUiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvZGVwcmVjYXRpb24tY29udHJhY3RzIjogIl4yLjF8XjMiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvcG9seWZpbGwtbWJzdHJpbmciOiAifjEuMCIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9wb2x5ZmlsbC1waHA3MyI6ICJeMS45IiwKICAgICAgICAgICAgICAgICJzeW1mb255L3BvbHlmaWxsLXBocDgwIjogIl4xLjE2IiwKICAgICAgICAgICAgICAgICJzeW1mb255L3NlcnZpY2UtY29udHJhY3RzIjogIl4xLjF8XjJ8XjMiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvc3RyaW5nIjogIl41LjF8XjYuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImNvbmZsaWN0IjogewogICAgICAgICAgICAgICAgInBzci9sb2ciOiAiPj0zIiwKICAgICAgICAgICAgICAgICJzeW1mb255L2RlcGVuZGVuY3ktaW5qZWN0aW9uIjogIjw0LjQiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvZG90ZW52IjogIjw1LjEiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvZXZlbnQtZGlzcGF0Y2hlciI6ICI8NC40IiwKICAgICAgICAgICAgICAgICJzeW1mb255L2xvY2siOiAiPDQuNCIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9wcm9jZXNzIjogIjw0LjQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJwcm92aWRlIjogewogICAgICAgICAgICAgICAgInBzci9sb2ctaW1wbGVtZW50YXRpb24iOiAiMS4wfDIuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUtZGV2IjogewogICAgICAgICAgICAgICAgInBzci9sb2ciOiAiXjF8XjIiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvY29uZmlnIjogIl40LjR8XjUuMHxeNi4wIiwKICAgICAgICAgICAgICAgICJzeW1mb255L2RlcGVuZGVuY3ktaW5qZWN0aW9uIjogIl40LjR8XjUuMHxeNi4wIiwKICAgICAgICAgICAgICAgICJzeW1mb255L2V2ZW50LWRpc3BhdGNoZXIiOiAiXjQuNHxeNS4wfF42LjAiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvbG9jayI6ICJeNC40fF41LjB8XjYuMCIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9wcm9jZXNzIjogIl40LjR8XjUuMHxeNi4wIiwKICAgICAgICAgICAgICAgICJzeW1mb255L3Zhci1kdW1wZXIiOiAiXjQuNHxeNS4wfF42LjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzdWdnZXN0IjogewogICAgICAgICAgICAgICAgInBzci9sb2ciOiAiRm9yIHVzaW5nIHRoZSBjb25zb2xlIGxvZ2dlciIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9ldmVudC1kaXNwYXRjaGVyIjogIiIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9sb2NrIjogIiIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9wcm9jZXNzIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyNC0xMS0wNlQxMTozMDo1NSswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiaW5zdGFsbGF0aW9uLXNvdXJjZSI6ICJkaXN0IiwKICAgICAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAgICAgInBzci00IjogewogICAgICAgICAgICAgICAgICAgICJTeW1mb255XFxDb21wb25lbnRcXENvbnNvbGVcXCI6ICIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImV4Y2x1ZGUtZnJvbS1jbGFzc21hcCI6IFsKICAgICAgICAgICAgICAgICAgICAiL1Rlc3RzLyIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIkZhYmllbiBQb3RlbmNpZXIiLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJmYWJpZW5Ac3ltZm9ueS5jb20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIlN5bWZvbnkgQ29tbXVuaXR5IiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9jb250cmlidXRvcnMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFYXNlcyB0aGUgY3JlYXRpb24gb2YgYmVhdXRpZnVsIGFuZCB0ZXN0YWJsZSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlcyIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgImNsaSIsCiAgICAgICAgICAgICAgICAiY29tbWFuZC1saW5lIiwKICAgICAgICAgICAgICAgICJjb25zb2xlIiwKICAgICAgICAgICAgICAgICJ0ZXJtaW5hbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInN1cHBvcnQiOiB7CiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L2NvbnNvbGUvdHJlZS92NS40LjQ3IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZnVuZGluZyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vc3ltZm9ueS5jb20vc3BvbnNvciIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY3VzdG9tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9mYWJwb3QiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdGh1YiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3RpZGVsaWZ0LmNvbS9mdW5kaW5nL2dpdGh1Yi9wYWNrYWdpc3Qvc3ltZm9ueS9zeW1mb255IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0aWRlbGlmdCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImluc3RhbGwtcGF0aCI6ICIuLi9zeW1mb255L2NvbnNvbGUiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogInN5bWZvbnkvZGVwcmVjYXRpb24tY29udHJhY3RzIiwKICAgICAgICAgICAgInZlcnNpb24iOiAidjIuNS40IiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICIyLjUuNC4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L2RlcHJlY2F0aW9uLWNvbnRyYWN0cy5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICI2MDUzODlmMmE3ZTU2MjVmMjczYjUzOTYwZGM0NmFlYWY5YzYyOTE4IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvc3ltZm9ueS9kZXByZWNhdGlvbi1jb250cmFjdHMvemlwYmFsbC82MDUzODlmMmE3ZTU2MjVmMjczYjUzOTYwZGM0NmFlYWY5YzYyOTE4IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiNjA1Mzg5ZjJhN2U1NjI1ZjI3M2I1Mzk2MGRjNDZhZWFmOWM2MjkxOCIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAicGhwIjogIj49Ny4xIgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDI0LTA5LTI1VDE0OjExOjEzKzAwOjAwIiwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJleHRyYSI6IHsKICAgICAgICAgICAgICAgICJ0aGFua3MiOiB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9jb250cmFjdHMiLAogICAgICAgICAgICAgICAgICAgICJuYW1lIjogInN5bWZvbnkvY29udHJhY3RzIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJicmFuY2gtYWxpYXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRldi1tYWluIjogIjIuNS1kZXYiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAiZmlsZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uLnBocCIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIk5pY29sYXMgR3Jla2FzIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAicEB0Y2h3b3JrLmNvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiU3ltZm9ueSBDb21tdW5pdHkiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tL2NvbnRyaWJ1dG9ycyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgZ2VuZXJpYyBmdW5jdGlvbiBhbmQgY29udmVudGlvbiB0byB0cmlnZ2VyIGRlcHJlY2F0aW9uIG5vdGljZXMiLAogICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbSIsCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9kZXByZWNhdGlvbi1jb250cmFjdHMvdHJlZS92Mi41LjQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmdW5kaW5nIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9zcG9uc29yIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjdXN0b20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2ZhYnBvdCIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViL3BhY2thZ2lzdC9zeW1mb255L3N5bWZvbnkiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRpZGVsaWZ0IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4uL3N5bWZvbnkvZGVwcmVjYXRpb24tY29udHJhY3RzIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L2ZpbGVzeXN0ZW0iLAogICAgICAgICAgICAidmVyc2lvbiI6ICJ2NS40LjQ1IiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICI1LjQuNDUuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9maWxlc3lzdGVtLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjU3YzgyOTRlZDM3ZDRhMDU1Yjc3MDU3ODI3YzY3Zjk1NThjOTVjNTQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9zeW1mb255L2ZpbGVzeXN0ZW0vemlwYmFsbC81N2M4Mjk0ZWQzN2Q0YTA1NWI3NzA1NzgyN2M2N2Y5NTU4Yzk1YzU0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiNTdjODI5NGVkMzdkNGEwNTViNzcwNTc4MjdjNjdmOTU1OGM5NWM1NCIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAicGhwIjogIj49Ny4yLjUiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvcG9seWZpbGwtY3R5cGUiOiAifjEuOCIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZyI6ICJ+MS44IiwKICAgICAgICAgICAgICAgICJzeW1mb255L3BvbHlmaWxsLXBocDgwIjogIl4xLjE2IgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZS1kZXYiOiB7CiAgICAgICAgICAgICAgICAic3ltZm9ueS9wcm9jZXNzIjogIl41LjR8XjYuNCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyNC0xMC0yMlQxMzowNTozNSswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiaW5zdGFsbGF0aW9uLXNvdXJjZSI6ICJkaXN0IiwKICAgICAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAgICAgInBzci00IjogewogICAgICAgICAgICAgICAgICAgICJTeW1mb255XFxDb21wb25lbnRcXEZpbGVzeXN0ZW1cXCI6ICIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImV4Y2x1ZGUtZnJvbS1jbGFzc21hcCI6IFsKICAgICAgICAgICAgICAgICAgICAiL1Rlc3RzLyIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIkZhYmllbiBQb3RlbmNpZXIiLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJmYWJpZW5Ac3ltZm9ueS5jb20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIlN5bWZvbnkgQ29tbXVuaXR5IiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9jb250cmlidXRvcnMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm92aWRlcyBiYXNpYyB1dGlsaXRpZXMgZm9yIHRoZSBmaWxlc3lzdGVtIiwKICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vc3ltZm9ueS5jb20iLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvZmlsZXN5c3RlbS90cmVlL3Y1LjQuNDUiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmdW5kaW5nIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9zcG9uc29yIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjdXN0b20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2ZhYnBvdCIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViL3BhY2thZ2lzdC9zeW1mb255L3N5bWZvbnkiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRpZGVsaWZ0IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4uL3N5bWZvbnkvZmlsZXN5c3RlbSIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAic3ltZm9ueS9maW5kZXIiLAogICAgICAgICAgICAidmVyc2lvbiI6ICJ2NS40LjQ1IiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICI1LjQuNDUuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9maW5kZXIuZ2l0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiNjM3NDE3ODRjZDdiOTk2Nzk3NWVlYzYxMGIyNTZlZWQzZWRlMDIyYiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJ6aXAiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL3N5bWZvbnkvZmluZGVyL3ppcGJhbGwvNjM3NDE3ODRjZDdiOTk2Nzk3NWVlYzYxMGIyNTZlZWQzZWRlMDIyYiIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjYzNzQxNzg0Y2Q3Yjk5Njc5NzVlZWM2MTBiMjU2ZWVkM2VkZTAyMmIiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICI+PTcuMi41IiwKICAgICAgICAgICAgICAgICJzeW1mb255L2RlcHJlY2F0aW9uLWNvbnRyYWN0cyI6ICJeMi4xfF4zIiwKICAgICAgICAgICAgICAgICJzeW1mb255L3BvbHlmaWxsLXBocDgwIjogIl4xLjE2IgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDI0LTA5LTI4VDEzOjMyOjA4KzAwOjAwIiwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlN5bWZvbnlcXENvbXBvbmVudFxcRmluZGVyXFwiOiAiIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJleGNsdWRlLWZyb20tY2xhc3NtYXAiOiBbCiAgICAgICAgICAgICAgICAgICAgIi9UZXN0cy8iCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJGYWJpZW4gUG90ZW5jaWVyIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAiZmFiaWVuQHN5bWZvbnkuY29tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJTeW1mb255IENvbW11bml0eSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vc3ltZm9ueS5jb20vY29udHJpYnV0b3JzIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmluZHMgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHZpYSBhbiBpbnR1aXRpdmUgZmx1ZW50IGludGVyZmFjZSIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tIiwKICAgICAgICAgICAgInN1cHBvcnQiOiB7CiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L2ZpbmRlci90cmVlL3Y1LjQuNDUiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmdW5kaW5nIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9zcG9uc29yIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjdXN0b20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2ZhYnBvdCIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViL3BhY2thZ2lzdC9zeW1mb255L3N5bWZvbnkiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRpZGVsaWZ0IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4uL3N5bWZvbnkvZmluZGVyIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L3BvbHlmaWxsLWN0eXBlIiwKICAgICAgICAgICAgInZlcnNpb24iOiAidjEuMzQuMCIsCiAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiAiMS4zNC4wLjAiLAogICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0IiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvcG9seWZpbGwtY3R5cGUuZ2l0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiMTQxMDQ2YThmOTQ3Nzk0OGZmMjg0ZmE2NWJlMjA5NWJhYWZiOTRmMiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJ6aXAiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL3N5bWZvbnkvcG9seWZpbGwtY3R5cGUvemlwYmFsbC8xNDEwNDZhOGY5NDc3OTQ4ZmYyODRmYTY1YmUyMDk1YmFhZmI5NGYyIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiMTQxMDQ2YThmOTQ3Nzk0OGZmMjg0ZmE2NWJlMjA5NWJhYWZiOTRmMiIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAicGhwIjogIj49Ny4yIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicHJvdmlkZSI6IHsKICAgICAgICAgICAgICAgICJleHQtY3R5cGUiOiAiKiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInN1Z2dlc3QiOiB7CiAgICAgICAgICAgICAgICAiZXh0LWN0eXBlIjogIkZvciBiZXN0IHBlcmZvcm1hbmNlIgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDI2LTA0LTEwVDE2OjE5OjIyKzAwOjAwIiwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJleHRyYSI6IHsKICAgICAgICAgICAgICAgICJ0aGFua3MiOiB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wb2x5ZmlsbCIsCiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAic3ltZm9ueS9wb2x5ZmlsbCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJmaWxlcyI6IFsKICAgICAgICAgICAgICAgICAgICAiYm9vdHN0cmFwLnBocCIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlN5bWZvbnlcXFBvbHlmaWxsXFxDdHlwZVxcIjogIiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIkdlcnQgZGUgUGFndGVyIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAiQmFja0VuZFRlYUBnbWFpbC5jb20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIlN5bWZvbnkgQ29tbXVuaXR5IiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9jb250cmlidXRvcnMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTeW1mb255IHBvbHlmaWxsIGZvciBjdHlwZSBmdW5jdGlvbnMiLAogICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbSIsCiAgICAgICAgICAgICJrZXl3b3JkcyI6IFsKICAgICAgICAgICAgICAgICJjb21wYXRpYmlsaXR5IiwKICAgICAgICAgICAgICAgICJjdHlwZSIsCiAgICAgICAgICAgICAgICAicG9seWZpbGwiLAogICAgICAgICAgICAgICAgInBvcnRhYmxlIgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvcG9seWZpbGwtY3R5cGUvdHJlZS92MS4zNC4wIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZnVuZGluZyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vc3ltZm9ueS5jb20vc3BvbnNvciIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY3VzdG9tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9mYWJwb3QiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdGh1YiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vbmljb2xhcy1ncmVrYXMiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdGh1YiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3RpZGVsaWZ0LmNvbS9mdW5kaW5nL2dpdGh1Yi9wYWNrYWdpc3Qvc3ltZm9ueS9zeW1mb255IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0aWRlbGlmdCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImluc3RhbGwtcGF0aCI6ICIuLi9zeW1mb255L3BvbHlmaWxsLWN0eXBlIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L3BvbHlmaWxsLWludGwtZ3JhcGhlbWUiLAogICAgICAgICAgICAidmVyc2lvbiI6ICJ2MS4zNC4wIiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICIxLjM0LjAuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLWdyYXBoZW1lLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImFkMWI3YjkwOTI5NzZkNmM5NDhiOGExODdjZWM5ZmFhZWE5ZWMxZGYiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9zeW1mb255L3BvbHlmaWxsLWludGwtZ3JhcGhlbWUvemlwYmFsbC9hZDFiN2I5MDkyOTc2ZDZjOTQ4YjhhMTg3Y2VjOWZhYWVhOWVjMWRmIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiYWQxYjdiOTA5Mjk3NmQ2Yzk0OGI4YTE4N2NlYzlmYWFlYTllYzFkZiIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAicGhwIjogIj49Ny4yIgogICAgICAgICAgICB9LAogICAgICAgICAgICAic3VnZ2VzdCI6IHsKICAgICAgICAgICAgICAgICJleHQtaW50bCI6ICJGb3IgYmVzdCBwZXJmb3JtYW5jZSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyNi0wNC0xMFQxNjoxOToyMiswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAgICAgICAidGhhbmtzIjogewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvcG9seWZpbGwiLAogICAgICAgICAgICAgICAgICAgICJuYW1lIjogInN5bWZvbnkvcG9seWZpbGwiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAiZmlsZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImJvb3RzdHJhcC5waHAiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInBzci00IjogewogICAgICAgICAgICAgICAgICAgICJTeW1mb255XFxQb2x5ZmlsbFxcSW50bFxcR3JhcGhlbWVcXCI6ICIiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJOaWNvbGFzIEdyZWthcyIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogInBAdGNod29yay5jb20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIlN5bWZvbnkgQ29tbXVuaXR5IiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9jb250cmlidXRvcnMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTeW1mb255IHBvbHlmaWxsIGZvciBpbnRsJ3MgZ3JhcGhlbWVfKiBmdW5jdGlvbnMiLAogICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbSIsCiAgICAgICAgICAgICJrZXl3b3JkcyI6IFsKICAgICAgICAgICAgICAgICJjb21wYXRpYmlsaXR5IiwKICAgICAgICAgICAgICAgICJncmFwaGVtZSIsCiAgICAgICAgICAgICAgICAiaW50bCIsCiAgICAgICAgICAgICAgICAicG9seWZpbGwiLAogICAgICAgICAgICAgICAgInBvcnRhYmxlIiwKICAgICAgICAgICAgICAgICJzaGltIgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ncmFwaGVtZS90cmVlL3YxLjM0LjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmdW5kaW5nIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9zcG9uc29yIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjdXN0b20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2ZhYnBvdCIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9uaWNvbGFzLWdyZWthcyIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViL3BhY2thZ2lzdC9zeW1mb255L3N5bWZvbnkiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRpZGVsaWZ0IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4uL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ncmFwaGVtZSIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAic3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXIiLAogICAgICAgICAgICAidmVyc2lvbiI6ICJ2MS4zNC4wIiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICIxLjM0LjAuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXIuZ2l0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiMzgzM2Q3MjU1Y2MzMDM1NDY0MzVjYjY1MDMxNmJmZjcwOGExYzc1YyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJ6aXAiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ub3JtYWxpemVyL3ppcGJhbGwvMzgzM2Q3MjU1Y2MzMDM1NDY0MzVjYjY1MDMxNmJmZjcwOGExYzc1YyIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjM4MzNkNzI1NWNjMzAzNTQ2NDM1Y2I2NTAzMTZiZmY3MDhhMWM3NWMiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICI+PTcuMiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInN1Z2dlc3QiOiB7CiAgICAgICAgICAgICAgICAiZXh0LWludGwiOiAiRm9yIGJlc3QgcGVyZm9ybWFuY2UiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjQtMDktMDlUMTE6NDU6MTArMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImV4dHJhIjogewogICAgICAgICAgICAgICAgInRoYW5rcyI6IHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3BvbHlmaWxsIiwKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L3BvbHlmaWxsIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAiaW5zdGFsbGF0aW9uLXNvdXJjZSI6ICJkaXN0IiwKICAgICAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAgICAgImZpbGVzIjogWwogICAgICAgICAgICAgICAgICAgICJib290c3RyYXAucGhwIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiU3ltZm9ueVxcUG9seWZpbGxcXEludGxcXE5vcm1hbGl6ZXJcXCI6ICIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNsYXNzbWFwIjogWwogICAgICAgICAgICAgICAgICAgICJSZXNvdXJjZXMvc3R1YnMiCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJOaWNvbGFzIEdyZWthcyIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogInBAdGNod29yay5jb20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIlN5bWZvbnkgQ29tbXVuaXR5IiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9jb250cmlidXRvcnMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTeW1mb255IHBvbHlmaWxsIGZvciBpbnRsJ3MgTm9ybWFsaXplciBjbGFzcyBhbmQgcmVsYXRlZCBmdW5jdGlvbnMiLAogICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbSIsCiAgICAgICAgICAgICJrZXl3b3JkcyI6IFsKICAgICAgICAgICAgICAgICJjb21wYXRpYmlsaXR5IiwKICAgICAgICAgICAgICAgICJpbnRsIiwKICAgICAgICAgICAgICAgICJub3JtYWxpemVyIiwKICAgICAgICAgICAgICAgICJwb2x5ZmlsbCIsCiAgICAgICAgICAgICAgICAicG9ydGFibGUiLAogICAgICAgICAgICAgICAgInNoaW0iCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXIvdHJlZS92MS4zNC4wIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZnVuZGluZyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vc3ltZm9ueS5jb20vc3BvbnNvciIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY3VzdG9tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9mYWJwb3QiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdGh1YiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vbmljb2xhcy1ncmVrYXMiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdGh1YiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3RpZGVsaWZ0LmNvbS9mdW5kaW5nL2dpdGh1Yi9wYWNrYWdpc3Qvc3ltZm9ueS9zeW1mb255IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0aWRlbGlmdCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImluc3RhbGwtcGF0aCI6ICIuLi9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplciIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAic3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZyIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogInYxLjM0LjAiLAogICAgICAgICAgICAidmVyc2lvbl9ub3JtYWxpemVkIjogIjEuMzQuMC4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3BvbHlmaWxsLW1ic3RyaW5nLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjZhMjFlYjk5YzY5NzMzNTc5NjdmNmNlMzcwOGNkNTVhNmJlYzYzMTUiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9zeW1mb255L3BvbHlmaWxsLW1ic3RyaW5nL3ppcGJhbGwvNmEyMWViOTljNjk3MzM1Nzk2N2Y2Y2UzNzA4Y2Q1NWE2YmVjNjMxNSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjZhMjFlYjk5YzY5NzMzNTc5NjdmNmNlMzcwOGNkNTVhNmJlYzYzMTUiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgImV4dC1pY29udiI6ICIqIiwKICAgICAgICAgICAgICAgICJwaHAiOiAiPj03LjIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJwcm92aWRlIjogewogICAgICAgICAgICAgICAgImV4dC1tYnN0cmluZyI6ICIqIgogICAgICAgICAgICB9LAogICAgICAgICAgICAic3VnZ2VzdCI6IHsKICAgICAgICAgICAgICAgICJleHQtbWJzdHJpbmciOiAiRm9yIGJlc3QgcGVyZm9ybWFuY2UiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjYtMDQtMTBUMTc6MjU6NTgrMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImV4dHJhIjogewogICAgICAgICAgICAgICAgInRoYW5rcyI6IHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3BvbHlmaWxsIiwKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L3BvbHlmaWxsIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAiaW5zdGFsbGF0aW9uLXNvdXJjZSI6ICJkaXN0IiwKICAgICAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAgICAgImZpbGVzIjogWwogICAgICAgICAgICAgICAgICAgICJib290c3RyYXAucGhwIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiU3ltZm9ueVxcUG9seWZpbGxcXE1ic3RyaW5nXFwiOiAiIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiTmljb2xhcyBHcmVrYXMiLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJwQHRjaHdvcmsuY29tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJTeW1mb255IENvbW11bml0eSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vc3ltZm9ueS5jb20vY29udHJpYnV0b3JzIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3ltZm9ueSBwb2x5ZmlsbCBmb3IgdGhlIE1ic3RyaW5nIGV4dGVuc2lvbiIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgImNvbXBhdGliaWxpdHkiLAogICAgICAgICAgICAgICAgIm1ic3RyaW5nIiwKICAgICAgICAgICAgICAgICJwb2x5ZmlsbCIsCiAgICAgICAgICAgICAgICAicG9ydGFibGUiLAogICAgICAgICAgICAgICAgInNoaW0iCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZy90cmVlL3YxLjM0LjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmdW5kaW5nIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9zcG9uc29yIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjdXN0b20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2ZhYnBvdCIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9uaWNvbGFzLWdyZWthcyIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViL3BhY2thZ2lzdC9zeW1mb255L3N5bWZvbnkiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRpZGVsaWZ0IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4uL3N5bWZvbnkvcG9seWZpbGwtbWJzdHJpbmciCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogInN5bWZvbnkvcG9seWZpbGwtcGhwNzMiLAogICAgICAgICAgICAidmVyc2lvbiI6ICJ2MS4zNC4wIiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICIxLjM0LjAuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wb2x5ZmlsbC1waHA3My5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICIwZjY4YzAzNTY1ZGNhYWYyNWE4OTA2Njc1NDJlOGJkNzVmZTdlNWJiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvc3ltZm9ueS9wb2x5ZmlsbC1waHA3My96aXBiYWxsLzBmNjhjMDM1NjVkY2FhZjI1YTg5MDY2NzU0MmU4YmQ3NWZlN2U1YmIiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICIwZjY4YzAzNTY1ZGNhYWYyNWE4OTA2Njc1NDJlOGJkNzVmZTdlNWJiIiwKICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgICAgICJwaHAiOiAiPj03LjIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjQtMDktMDlUMTE6NDU6MTArMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImV4dHJhIjogewogICAgICAgICAgICAgICAgInRoYW5rcyI6IHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3BvbHlmaWxsIiwKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L3BvbHlmaWxsIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAiaW5zdGFsbGF0aW9uLXNvdXJjZSI6ICJkaXN0IiwKICAgICAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAgICAgImZpbGVzIjogWwogICAgICAgICAgICAgICAgICAgICJib290c3RyYXAucGhwIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiU3ltZm9ueVxcUG9seWZpbGxcXFBocDczXFwiOiAiIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjbGFzc21hcCI6IFsKICAgICAgICAgICAgICAgICAgICAiUmVzb3VyY2VzL3N0dWJzIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiTmljb2xhcyBHcmVrYXMiLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJwQHRjaHdvcmsuY29tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJTeW1mb255IENvbW11bml0eSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vc3ltZm9ueS5jb20vY29udHJpYnV0b3JzIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3ltZm9ueSBwb2x5ZmlsbCBiYWNrcG9ydGluZyBzb21lIFBIUCA3LjMrIGZlYXR1cmVzIHRvIGxvd2VyIFBIUCB2ZXJzaW9ucyIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgImNvbXBhdGliaWxpdHkiLAogICAgICAgICAgICAgICAgInBvbHlmaWxsIiwKICAgICAgICAgICAgICAgICJwb3J0YWJsZSIsCiAgICAgICAgICAgICAgICAic2hpbSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInN1cHBvcnQiOiB7CiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3BvbHlmaWxsLXBocDczL3RyZWUvdjEuMzQuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3N5bWZvbnkuY29tL3Nwb25zb3IiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImN1c3RvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vZmFicG90IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL25pY29sYXMtZ3Jla2FzIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly90aWRlbGlmdC5jb20vZnVuZGluZy9naXRodWIvcGFja2FnaXN0L3N5bWZvbnkvc3ltZm9ueSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vc3ltZm9ueS9wb2x5ZmlsbC1waHA3MyIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAic3ltZm9ueS9wb2x5ZmlsbC1waHA4MCIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogInYxLjM0LjAiLAogICAgICAgICAgICAidmVyc2lvbl9ub3JtYWxpemVkIjogIjEuMzQuMC4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3BvbHlmaWxsLXBocDgwLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImRmYjU1NzI2YzNhNzZlYTNiNjQ1OWZjZmRhMWVjMmQ4MGE2ODI0MTEiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9zeW1mb255L3BvbHlmaWxsLXBocDgwL3ppcGJhbGwvZGZiNTU3MjZjM2E3NmVhM2I2NDU5ZmNmZGExZWMyZDgwYTY4MjQxMSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImRmYjU1NzI2YzNhNzZlYTNiNjQ1OWZjZmRhMWVjMmQ4MGE2ODI0MTEiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICI+PTcuMiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyNi0wNC0xMFQxNjoxOToyMiswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAgICAgICAidGhhbmtzIjogewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvcG9seWZpbGwiLAogICAgICAgICAgICAgICAgICAgICJuYW1lIjogInN5bWZvbnkvcG9seWZpbGwiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAiZmlsZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImJvb3RzdHJhcC5waHAiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInBzci00IjogewogICAgICAgICAgICAgICAgICAgICJTeW1mb255XFxQb2x5ZmlsbFxcUGhwODBcXCI6ICIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNsYXNzbWFwIjogWwogICAgICAgICAgICAgICAgICAgICJSZXNvdXJjZXMvc3R1YnMiCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJJb24gQmF6YW4iLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJpb24uYmF6YW5AZ21haWwuY29tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJOaWNvbGFzIEdyZWthcyIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogInBAdGNod29yay5jb20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIlN5bWZvbnkgQ29tbXVuaXR5IiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9jb250cmlidXRvcnMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTeW1mb255IHBvbHlmaWxsIGJhY2twb3J0aW5nIHNvbWUgUEhQIDguMCsgZmVhdHVyZXMgdG8gbG93ZXIgUEhQIHZlcnNpb25zIiwKICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vc3ltZm9ueS5jb20iLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAiY29tcGF0aWJpbGl0eSIsCiAgICAgICAgICAgICAgICAicG9seWZpbGwiLAogICAgICAgICAgICAgICAgInBvcnRhYmxlIiwKICAgICAgICAgICAgICAgICJzaGltIgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvdHJlZS92MS4zNC4wIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZnVuZGluZyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vc3ltZm9ueS5jb20vc3BvbnNvciIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY3VzdG9tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9mYWJwb3QiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdGh1YiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vbmljb2xhcy1ncmVrYXMiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdGh1YiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3RpZGVsaWZ0LmNvbS9mdW5kaW5nL2dpdGh1Yi9wYWNrYWdpc3Qvc3ltZm9ueS9zeW1mb255IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0aWRlbGlmdCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImluc3RhbGwtcGF0aCI6ICIuLi9zeW1mb255L3BvbHlmaWxsLXBocDgwIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L3BvbHlmaWxsLXBocDgxIiwKICAgICAgICAgICAgInZlcnNpb24iOiAidjEuMzQuMCIsCiAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiAiMS4zNC4wLjAiLAogICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0IiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvcG9seWZpbGwtcGhwODEuZ2l0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiNGE0Y2ZjMmQyNTNjMjFhNWFkMGU1MzA3MWRmMjQ4ZWQ0OGM2Y2U1YyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJ6aXAiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL3N5bWZvbnkvcG9seWZpbGwtcGhwODEvemlwYmFsbC80YTRjZmMyZDI1M2MyMWE1YWQwZTUzMDcxZGYyNDhlZDQ4YzZjZTVjIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiNGE0Y2ZjMmQyNTNjMjFhNWFkMGU1MzA3MWRmMjQ4ZWQ0OGM2Y2U1YyIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAicGhwIjogIj49Ny4yIgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDI0LTA5LTA5VDExOjQ1OjEwKzAwOjAwIiwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJleHRyYSI6IHsKICAgICAgICAgICAgICAgICJ0aGFua3MiOiB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wb2x5ZmlsbCIsCiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAic3ltZm9ueS9wb2x5ZmlsbCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJmaWxlcyI6IFsKICAgICAgICAgICAgICAgICAgICAiYm9vdHN0cmFwLnBocCIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlN5bWZvbnlcXFBvbHlmaWxsXFxQaHA4MVxcIjogIiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY2xhc3NtYXAiOiBbCiAgICAgICAgICAgICAgICAgICAgIlJlc291cmNlcy9zdHVicyIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIk5pY29sYXMgR3Jla2FzIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAicEB0Y2h3b3JrLmNvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiU3ltZm9ueSBDb21tdW5pdHkiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tL2NvbnRyaWJ1dG9ycyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlN5bWZvbnkgcG9seWZpbGwgYmFja3BvcnRpbmcgc29tZSBQSFAgOC4xKyBmZWF0dXJlcyB0byBsb3dlciBQSFAgdmVyc2lvbnMiLAogICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbSIsCiAgICAgICAgICAgICJrZXl3b3JkcyI6IFsKICAgICAgICAgICAgICAgICJjb21wYXRpYmlsaXR5IiwKICAgICAgICAgICAgICAgICJwb2x5ZmlsbCIsCiAgICAgICAgICAgICAgICAicG9ydGFibGUiLAogICAgICAgICAgICAgICAgInNoaW0iCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wb2x5ZmlsbC1waHA4MS90cmVlL3YxLjM0LjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmdW5kaW5nIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9zcG9uc29yIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjdXN0b20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2ZhYnBvdCIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9uaWNvbGFzLWdyZWthcyIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViL3BhY2thZ2lzdC9zeW1mb255L3N5bWZvbnkiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRpZGVsaWZ0IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4uL3N5bWZvbnkvcG9seWZpbGwtcGhwODEiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogInN5bWZvbnkvcG9seWZpbGwtcGhwODQiLAogICAgICAgICAgICAidmVyc2lvbiI6ICJ2MS4zNC4wIiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICIxLjM0LjAuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wb2x5ZmlsbC1waHA4NC5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICI4ODQ4NmRiMmMzODliMjkwYmY4N2ZmMWRlN2ViYzFlMTNlNDJiYjA2IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvc3ltZm9ueS9wb2x5ZmlsbC1waHA4NC96aXBiYWxsLzg4NDg2ZGIyYzM4OWIyOTBiZjg3ZmYxZGU3ZWJjMWUxM2U0MmJiMDYiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICI4ODQ4NmRiMmMzODliMjkwYmY4N2ZmMWRlN2ViYzFlMTNlNDJiYjA2IiwKICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgICAgICJwaHAiOiAiPj03LjIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjYtMDQtMTBUMTg6NDc6NDkrMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImV4dHJhIjogewogICAgICAgICAgICAgICAgInRoYW5rcyI6IHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3BvbHlmaWxsIiwKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L3BvbHlmaWxsIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAiaW5zdGFsbGF0aW9uLXNvdXJjZSI6ICJkaXN0IiwKICAgICAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAgICAgImZpbGVzIjogWwogICAgICAgICAgICAgICAgICAgICJib290c3RyYXAucGhwIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiU3ltZm9ueVxcUG9seWZpbGxcXFBocDg0XFwiOiAiIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjbGFzc21hcCI6IFsKICAgICAgICAgICAgICAgICAgICAiUmVzb3VyY2VzL3N0dWJzIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiTmljb2xhcyBHcmVrYXMiLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJwQHRjaHdvcmsuY29tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJTeW1mb255IENvbW11bml0eSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vc3ltZm9ueS5jb20vY29udHJpYnV0b3JzIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3ltZm9ueSBwb2x5ZmlsbCBiYWNrcG9ydGluZyBzb21lIFBIUCA4LjQrIGZlYXR1cmVzIHRvIGxvd2VyIFBIUCB2ZXJzaW9ucyIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgImNvbXBhdGliaWxpdHkiLAogICAgICAgICAgICAgICAgInBvbHlmaWxsIiwKICAgICAgICAgICAgICAgICJwb3J0YWJsZSIsCiAgICAgICAgICAgICAgICAic2hpbSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInN1cHBvcnQiOiB7CiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3BvbHlmaWxsLXBocDg0L3RyZWUvdjEuMzQuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3N5bWZvbnkuY29tL3Nwb25zb3IiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImN1c3RvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vZmFicG90IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL25pY29sYXMtZ3Jla2FzIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly90aWRlbGlmdC5jb20vZnVuZGluZy9naXRodWIvcGFja2FnaXN0L3N5bWZvbnkvc3ltZm9ueSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vc3ltZm9ueS9wb2x5ZmlsbC1waHA4NCIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAic3ltZm9ueS9wcm9jZXNzIiwKICAgICAgICAgICAgInZlcnNpb24iOiAidjUuNC41MSIsCiAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiAiNS40LjUxLjAiLAogICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0IiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvcHJvY2Vzcy5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICI0NjdiZmM1NmYxOGY1ZWY2ZDVjY2IwOTMyNGQ3ZTk4OGMxYzBhOThmIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvc3ltZm9ueS9wcm9jZXNzL3ppcGJhbGwvNDY3YmZjNTZmMThmNWVmNmQ1Y2NiMDkzMjRkN2U5ODhjMWMwYTk4ZiIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjQ2N2JmYzU2ZjE4ZjVlZjZkNWNjYjA5MzI0ZDdlOTg4YzFjMGE5OGYiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICI+PTcuMi41IiwKICAgICAgICAgICAgICAgICJzeW1mb255L3BvbHlmaWxsLXBocDgwIjogIl4xLjE2IgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDI2LTAxLTI2VDE1OjUzOjM3KzAwOjAwIiwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlN5bWZvbnlcXENvbXBvbmVudFxcUHJvY2Vzc1xcIjogIiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZXhjbHVkZS1mcm9tLWNsYXNzbWFwIjogWwogICAgICAgICAgICAgICAgICAgICIvVGVzdHMvIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiRmFiaWVuIFBvdGVuY2llciIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImZhYmllbkBzeW1mb255LmNvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiU3ltZm9ueSBDb21tdW5pdHkiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tL2NvbnRyaWJ1dG9ycyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkV4ZWN1dGVzIGNvbW1hbmRzIGluIHN1Yi1wcm9jZXNzZXMiLAogICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbSIsCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wcm9jZXNzL3RyZWUvdjUuNC41MSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3N5bWZvbnkuY29tL3Nwb25zb3IiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImN1c3RvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vZmFicG90IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL25pY29sYXMtZ3Jla2FzIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly90aWRlbGlmdC5jb20vZnVuZGluZy9naXRodWIvcGFja2FnaXN0L3N5bWZvbnkvc3ltZm9ueSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vc3ltZm9ueS9wcm9jZXNzIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L3NlcnZpY2UtY29udHJhY3RzIiwKICAgICAgICAgICAgInZlcnNpb24iOiAidjIuNS40IiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICIyLjUuNC4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3NlcnZpY2UtY29udHJhY3RzLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImYzN2I0MTlmN2FlYTJlOWFiZjEwYWJkMjYxODMyY2FjZTEyZTMzMDAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9zeW1mb255L3NlcnZpY2UtY29udHJhY3RzL3ppcGJhbGwvZjM3YjQxOWY3YWVhMmU5YWJmMTBhYmQyNjE4MzJjYWNlMTJlMzMwMCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImYzN2I0MTlmN2FlYTJlOWFiZjEwYWJkMjYxODMyY2FjZTEyZTMzMDAiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICI+PTcuMi41IiwKICAgICAgICAgICAgICAgICJwc3IvY29udGFpbmVyIjogIl4xLjEiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvZGVwcmVjYXRpb24tY29udHJhY3RzIjogIl4yLjF8XjMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJjb25mbGljdCI6IHsKICAgICAgICAgICAgICAgICJleHQtcHNyIjogIjwxLjF8Pj0yIgogICAgICAgICAgICB9LAogICAgICAgICAgICAic3VnZ2VzdCI6IHsKICAgICAgICAgICAgICAgICJzeW1mb255L3NlcnZpY2UtaW1wbGVtZW50YXRpb24iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDI0LTA5LTI1VDE0OjExOjEzKzAwOjAwIiwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJleHRyYSI6IHsKICAgICAgICAgICAgICAgICJ0aGFua3MiOiB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9jb250cmFjdHMiLAogICAgICAgICAgICAgICAgICAgICJuYW1lIjogInN5bWZvbnkvY29udHJhY3RzIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJicmFuY2gtYWxpYXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRldi1tYWluIjogIjIuNS1kZXYiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlN5bWZvbnlcXENvbnRyYWN0c1xcU2VydmljZVxcIjogIiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIk5pY29sYXMgR3Jla2FzIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAicEB0Y2h3b3JrLmNvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiU3ltZm9ueSBDb21tdW5pdHkiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tL2NvbnRyaWJ1dG9ycyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkdlbmVyaWMgYWJzdHJhY3Rpb25zIHJlbGF0ZWQgdG8gd3JpdGluZyBzZXJ2aWNlcyIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgImFic3RyYWN0aW9ucyIsCiAgICAgICAgICAgICAgICAiY29udHJhY3RzIiwKICAgICAgICAgICAgICAgICJkZWNvdXBsaW5nIiwKICAgICAgICAgICAgICAgICJpbnRlcmZhY2VzIiwKICAgICAgICAgICAgICAgICJpbnRlcm9wZXJhYmlsaXR5IiwKICAgICAgICAgICAgICAgICJzdGFuZGFyZHMiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9zZXJ2aWNlLWNvbnRyYWN0cy90cmVlL3YyLjUuNCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3N5bWZvbnkuY29tL3Nwb25zb3IiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImN1c3RvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vZmFicG90IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly90aWRlbGlmdC5jb20vZnVuZGluZy9naXRodWIvcGFja2FnaXN0L3N5bWZvbnkvc3ltZm9ueSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vc3ltZm9ueS9zZXJ2aWNlLWNvbnRyYWN0cyIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAic3ltZm9ueS9zdHJpbmciLAogICAgICAgICAgICAidmVyc2lvbiI6ICJ2NS40LjQ3IiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICI1LjQuNDcuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9zdHJpbmcuZ2l0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiMTM2Y2E3ZDcyZjcyYjU5OWYyNjMxYWNhNDc0YTRmOGUyNjcxOTc5OSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJ6aXAiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL3N5bWZvbnkvc3RyaW5nL3ppcGJhbGwvMTM2Y2E3ZDcyZjcyYjU5OWYyNjMxYWNhNDc0YTRmOGUyNjcxOTc5OSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjEzNmNhN2Q3MmY3MmI1OTlmMjYzMWFjYTQ3NGE0ZjhlMjY3MTk3OTkiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICI+PTcuMi41IiwKICAgICAgICAgICAgICAgICJzeW1mb255L3BvbHlmaWxsLWN0eXBlIjogIn4xLjgiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvcG9seWZpbGwtaW50bC1ncmFwaGVtZSI6ICJ+MS4wIiwKICAgICAgICAgICAgICAgICJzeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplciI6ICJ+MS4wIiwKICAgICAgICAgICAgICAgICJzeW1mb255L3BvbHlmaWxsLW1ic3RyaW5nIjogIn4xLjAiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvcG9seWZpbGwtcGhwODAiOiAifjEuMTUiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJjb25mbGljdCI6IHsKICAgICAgICAgICAgICAgICJzeW1mb255L3RyYW5zbGF0aW9uLWNvbnRyYWN0cyI6ICI+PTMuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUtZGV2IjogewogICAgICAgICAgICAgICAgInN5bWZvbnkvZXJyb3ItaGFuZGxlciI6ICJeNC40fF41LjB8XjYuMCIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9odHRwLWNsaWVudCI6ICJeNC40fF41LjB8XjYuMCIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS90cmFuc2xhdGlvbi1jb250cmFjdHMiOiAiXjEuMXxeMiIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS92YXItZXhwb3J0ZXIiOiAiXjQuNHxeNS4wfF42LjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjQtMTEtMTBUMjA6MzM6NTgrMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJmaWxlcyI6IFsKICAgICAgICAgICAgICAgICAgICAiUmVzb3VyY2VzL2Z1bmN0aW9ucy5waHAiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInBzci00IjogewogICAgICAgICAgICAgICAgICAgICJTeW1mb255XFxDb21wb25lbnRcXFN0cmluZ1xcIjogIiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZXhjbHVkZS1mcm9tLWNsYXNzbWFwIjogWwogICAgICAgICAgICAgICAgICAgICIvVGVzdHMvIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiTmljb2xhcyBHcmVrYXMiLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJwQHRjaHdvcmsuY29tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJTeW1mb255IENvbW11bml0eSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vc3ltZm9ueS5jb20vY29udHJpYnV0b3JzIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvdmlkZXMgYW4gb2JqZWN0LW9yaWVudGVkIEFQSSB0byBzdHJpbmdzIGFuZCBkZWFscyB3aXRoIGJ5dGVzLCBVVEYtOCBjb2RlIHBvaW50cyBhbmQgZ3JhcGhlbWUgY2x1c3RlcnMgaW4gYSB1bmlmaWVkIHdheSIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgImdyYXBoZW1lIiwKICAgICAgICAgICAgICAgICJpMThuIiwKICAgICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICAgInVuaWNvZGUiLAogICAgICAgICAgICAgICAgInV0Zi04IiwKICAgICAgICAgICAgICAgICJ1dGY4IgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvc3RyaW5nL3RyZWUvdjUuNC40NyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3N5bWZvbnkuY29tL3Nwb25zb3IiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImN1c3RvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vZmFicG90IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly90aWRlbGlmdC5jb20vZnVuZGluZy9naXRodWIvcGFja2FnaXN0L3N5bWZvbnkvc3ltZm9ueSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vc3ltZm9ueS9zdHJpbmciCiAgICAgICAgfQogICAgXSwKICAgICJkZXYiOiBmYWxzZSwKICAgICJkZXYtcGFja2FnZS1uYW1lcyI6IFtdCn0KPD9waHAgcmV0dXJuIGFycmF5KAoncm9vdCcgPT4gYXJyYXkoCiduYW1lJyA9PiAnY29tcG9zZXIvY29tcG9zZXInLAoncHJldHR5X3ZlcnNpb24nID0+ICcyLjkuOCcsCid2ZXJzaW9uJyA9PiAnMi45LjguMCcsCidyZWZlcmVuY2UnID0+ICczOWVlOGJhZmY4ZTk3YTFiNjU3YmJmY2Q2YTIzNmZmOTNhNWVmYmIyJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vLi4vJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXYnID0+IGZhbHNlLAopLAondmVyc2lvbnMnID0+IGFycmF5KAonY29tcG9zZXIvY2EtYnVuZGxlJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAnMS41LjExJywKJ3ZlcnNpb24nID0+ICcxLjUuMTEuMCcsCidyZWZlcmVuY2UnID0+ICc2OGZmMzkxNzVlOGU5NGE0YmIxZDI1OTQwN2NlNTFhNmE2MGYwOWU2JywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi9jYS1idW5kbGUnLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidjb21wb3Nlci9jbGFzcy1tYXAtZ2VuZXJhdG9yJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAnMS43LjInLAondmVyc2lvbicgPT4gJzEuNy4yLjAnLAoncmVmZXJlbmNlJyA9PiAnNmE5YzJmMDk3MDAyMmFiMDBkYzU4YzA3ZDA2ODVkZDcxMmYyMjMxYicsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4vY2xhc3MtbWFwLWdlbmVyYXRvcicsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ2NvbXBvc2VyL2NvbXBvc2VyJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAnMi45LjgnLAondmVyc2lvbicgPT4gJzIuOS44LjAnLAoncmVmZXJlbmNlJyA9PiAnMzllZThiYWZmOGU5N2ExYjY1N2JiZmNkNmEyMzZmZjkzYTVlZmJiMicsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4uLy4uLycsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ2NvbXBvc2VyL21ldGFkYXRhLW1pbmlmaWVyJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAnMS4wLjAnLAondmVyc2lvbicgPT4gJzEuMC4wLjAnLAoncmVmZXJlbmNlJyA9PiAnYzU0OWQyMzgyOTUzNmYwZDBlOTg0YWFhYmJmMDJhZjkxZjQ0MzIwNycsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4vbWV0YWRhdGEtbWluaWZpZXInLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidjb21wb3Nlci9wY3JlJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAnMi4zLjInLAondmVyc2lvbicgPT4gJzIuMy4yLjAnLAoncmVmZXJlbmNlJyA9PiAnZWJiODFkZjhmNTJiNDAxNzJkMTQwNjJhZTk2YTA2OTM5ZDgwYTA2OScsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4vcGNyZScsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ2NvbXBvc2VyL3NlbXZlcicgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJzMuNC40JywKJ3ZlcnNpb24nID0+ICczLjQuNC4wJywKJ3JlZmVyZW5jZScgPT4gJzE5ODE2NjYxODkwNmNiMmRlNjliOTVkN2Q0N2U1ZmE4YWExYjJiOTUnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uL3NlbXZlcicsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ2NvbXBvc2VyL3NwZHgtbGljZW5zZXMnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICcxLjYuMCcsCid2ZXJzaW9uJyA9PiAnMS42LjAuMCcsCidyZWZlcmVuY2UnID0+ICc1ZWNkMGNiNDE3NzY5NmY5ZmQ0OGYxNjA1ZGRhODFkYjNkZWU3ODg5JywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi9zcGR4LWxpY2Vuc2VzJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonY29tcG9zZXIveGRlYnVnLWhhbmRsZXInID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICczLjAuNScsCid2ZXJzaW9uJyA9PiAnMy4wLjUuMCcsCidyZWZlcmVuY2UnID0+ICc2YzE5MjU1NjE2MzJlODNkNjBhNDQ0OTJlMGIzNDRjZjQ4YWI4NWVmJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi94ZGVidWctaGFuZGxlcicsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICc2LjguMCcsCid2ZXJzaW9uJyA9PiAnNi44LjAuMCcsCidyZWZlcmVuY2UnID0+ICc4OWFjOTJiY2ZlNWQwYThhNDQzM2M3Yjg5ZDM5NDU1M2FlNzI1MGNjJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYScsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ21hcmMtbWFiZS9waHAtZW51bScgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJ3Y0LjcuMicsCid2ZXJzaW9uJyA9PiAnNC43LjIuMCcsCidyZWZlcmVuY2UnID0+ICdiYjQyNmZjZGQ2NWM2MGZiMzYzOGVmNzQxZTg3ODI1MDhmZGE3ZWVmJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vbWFyYy1tYWJlL3BocC1lbnVtJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAoncHNyL2NvbnRhaW5lcicgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJzEuMS4xJywKJ3ZlcnNpb24nID0+ICcxLjEuMS4wJywKJ3JlZmVyZW5jZScgPT4gJzg2MjI1Njc0MDkwMTAyODJiN2FlZWJlNGJiODQxZmU5OGI1OGRjYWYnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9wc3IvY29udGFpbmVyJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAoncHNyL2xvZycgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJzEuMS40JywKJ3ZlcnNpb24nID0+ICcxLjEuNC4wJywKJ3JlZmVyZW5jZScgPT4gJ2Q0OTY5NWI5MDljM2I3NjI4YjYyODlkYjU0NzlhMWMyMDQ2MDFmMTEnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9wc3IvbG9nJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAoncHNyL2xvZy1pbXBsZW1lbnRhdGlvbicgPT4gYXJyYXkoCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAoncHJvdmlkZWQnID0+IGFycmF5KAowID0+ICcxLjB8Mi4wJywKKSwKKSwKJ3JlYWN0L3Byb21pc2UnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICd2My4zLjAnLAondmVyc2lvbicgPT4gJzMuMy4wLjAnLAoncmVmZXJlbmNlJyA9PiAnMjM0NDRmNTNhODEzYTMyOTZjMTM2OGJiMTA0NzkzY2U4ZDg4ZjA0YScsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4uL3JlYWN0L3Byb21pc2UnLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidzZWxkL2pzb25saW50JyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAnMS4xMS4wJywKJ3ZlcnNpb24nID0+ICcxLjExLjAuMCcsCidyZWZlcmVuY2UnID0+ICcxNzQ4YWFmODQ3ZmM3MzFjZmFkNzcyNWFlYzQxM2VlNDZmMGNjM2EyJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vc2VsZC9qc29ubGludCcsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3NlbGQvcGhhci11dGlscycgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJzEuMi4xJywKJ3ZlcnNpb24nID0+ICcxLjIuMS4wJywKJ3JlZmVyZW5jZScgPT4gJ2VhMmY0MDE0ZjE2M2MxYmU0YzYwMWI5YjdiZDZhZjgxYmE4ZDcwMWMnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zZWxkL3BoYXItdXRpbHMnLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidzZWxkL3NpZ25hbC1oYW5kbGVyJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAnMi4wLjInLAondmVyc2lvbicgPT4gJzIuMC4yLjAnLAoncmVmZXJlbmNlJyA9PiAnMDRhNjExMmU4ODNhZDc2YzBhZGE4ZTRhOWY3NTIwYmJmZGI2YmI5OCcsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4uL3NlbGQvc2lnbmFsLWhhbmRsZXInLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidzeW1mb255L2NvbnNvbGUnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICd2NS40LjQ3JywKJ3ZlcnNpb24nID0+ICc1LjQuNDcuMCcsCidyZWZlcmVuY2UnID0+ICdjNGJhOTgwY2E2MWE5ZWIxOGVlNmJjYzczZjI4ZTQ3NTg1MmJiMWVkJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vc3ltZm9ueS9jb25zb2xlJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc3ltZm9ueS9kZXByZWNhdGlvbi1jb250cmFjdHMnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICd2Mi41LjQnLAondmVyc2lvbicgPT4gJzIuNS40LjAnLAoncmVmZXJlbmNlJyA9PiAnNjA1Mzg5ZjJhN2U1NjI1ZjI3M2I1Mzk2MGRjNDZhZWFmOWM2MjkxOCcsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4uL3N5bWZvbnkvZGVwcmVjYXRpb24tY29udHJhY3RzJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc3ltZm9ueS9maWxlc3lzdGVtJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAndjUuNC40NScsCid2ZXJzaW9uJyA9PiAnNS40LjQ1LjAnLAoncmVmZXJlbmNlJyA9PiAnNTdjODI5NGVkMzdkNGEwNTViNzcwNTc4MjdjNjdmOTU1OGM5NWM1NCcsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4uL3N5bWZvbnkvZmlsZXN5c3RlbScsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3N5bWZvbnkvZmluZGVyJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAndjUuNC40NScsCid2ZXJzaW9uJyA9PiAnNS40LjQ1LjAnLAoncmVmZXJlbmNlJyA9PiAnNjM3NDE3ODRjZDdiOTk2Nzk3NWVlYzYxMGIyNTZlZWQzZWRlMDIyYicsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4uL3N5bWZvbnkvZmluZGVyJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc3ltZm9ueS9wb2x5ZmlsbC1jdHlwZScgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJ3YxLjM0LjAnLAondmVyc2lvbicgPT4gJzEuMzQuMC4wJywKJ3JlZmVyZW5jZScgPT4gJzE0MTA0NmE4Zjk0Nzc5NDhmZjI4NGZhNjViZTIwOTViYWFmYjk0ZjInLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L3BvbHlmaWxsLWN0eXBlJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLWdyYXBoZW1lJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAndjEuMzQuMCcsCid2ZXJzaW9uJyA9PiAnMS4zNC4wLjAnLAoncmVmZXJlbmNlJyA9PiAnYWQxYjdiOTA5Mjk3NmQ2Yzk0OGI4YTE4N2NlYzlmYWFlYTllYzFkZicsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4uL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ncmFwaGVtZScsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3N5bWZvbnkvcG9seWZpbGwtaW50bC1ub3JtYWxpemVyJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAndjEuMzQuMCcsCid2ZXJzaW9uJyA9PiAnMS4zNC4wLjAnLAoncmVmZXJlbmNlJyA9PiAnMzgzM2Q3MjU1Y2MzMDM1NDY0MzVjYjY1MDMxNmJmZjcwOGExYzc1YycsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4uL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ub3JtYWxpemVyJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZycgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJ3YxLjM0LjAnLAondmVyc2lvbicgPT4gJzEuMzQuMC4wJywKJ3JlZmVyZW5jZScgPT4gJzZhMjFlYjk5YzY5NzMzNTc5NjdmNmNlMzcwOGNkNTVhNmJlYzYzMTUnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L3BvbHlmaWxsLW1ic3RyaW5nJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc3ltZm9ueS9wb2x5ZmlsbC1waHA3MycgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJ3YxLjM0LjAnLAondmVyc2lvbicgPT4gJzEuMzQuMC4wJywKJ3JlZmVyZW5jZScgPT4gJzBmNjhjMDM1NjVkY2FhZjI1YTg5MDY2NzU0MmU4YmQ3NWZlN2U1YmInLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L3BvbHlmaWxsLXBocDczJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc3ltZm9ueS9wb2x5ZmlsbC1waHA4MCcgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJ3YxLjM0LjAnLAondmVyc2lvbicgPT4gJzEuMzQuMC4wJywKJ3JlZmVyZW5jZScgPT4gJ2RmYjU1NzI2YzNhNzZlYTNiNjQ1OWZjZmRhMWVjMmQ4MGE2ODI0MTEnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L3BvbHlmaWxsLXBocDgwJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc3ltZm9ueS9wb2x5ZmlsbC1waHA4MScgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJ3YxLjM0LjAnLAondmVyc2lvbicgPT4gJzEuMzQuMC4wJywKJ3JlZmVyZW5jZScgPT4gJzRhNGNmYzJkMjUzYzIxYTVhZDBlNTMwNzFkZjI0OGVkNDhjNmNlNWMnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L3BvbHlmaWxsLXBocDgxJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc3ltZm9ueS9wb2x5ZmlsbC1waHA4NCcgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJ3YxLjM0LjAnLAondmVyc2lvbicgPT4gJzEuMzQuMC4wJywKJ3JlZmVyZW5jZScgPT4gJzg4NDg2ZGIyYzM4OWIyOTBiZjg3ZmYxZGU3ZWJjMWUxM2U0MmJiMDYnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L3BvbHlmaWxsLXBocDg0JywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc3ltZm9ueS9wcm9jZXNzJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAndjUuNC41MScsCid2ZXJzaW9uJyA9PiAnNS40LjUxLjAnLAoncmVmZXJlbmNlJyA9PiAnNDY3YmZjNTZmMThmNWVmNmQ1Y2NiMDkzMjRkN2U5ODhjMWMwYTk4ZicsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4uL3N5bWZvbnkvcHJvY2VzcycsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3N5bWZvbnkvc2VydmljZS1jb250cmFjdHMnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICd2Mi41LjQnLAondmVyc2lvbicgPT4gJzIuNS40LjAnLAoncmVmZXJlbmNlJyA9PiAnZjM3YjQxOWY3YWVhMmU5YWJmMTBhYmQyNjE4MzJjYWNlMTJlMzMwMCcsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4uL3N5bWZvbnkvc2VydmljZS1jb250cmFjdHMnLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidzeW1mb255L3N0cmluZycgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJ3Y1LjQuNDcnLAondmVyc2lvbicgPT4gJzUuNC40Ny4wJywKJ3JlZmVyZW5jZScgPT4gJzEzNmNhN2Q3MmY3MmI1OTlmMjYzMWFjYTQ3NGE0ZjhlMjY3MTk3OTknLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L3N0cmluZycsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKKSwKKTsKCkNvcHlyaWdodCAoQykgMjAyMSBDb21wb3NlcgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgp0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgp0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCnVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCm9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbwpzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQpTT0ZUV0FSRS4KCjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcTWV0YWRhdGFNaW5pZmllcjsKCmNsYXNzIE1ldGFkYXRhTWluaWZpZXIKewoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGV4cGFuZChhcnJheSAkdmVyc2lvbnMpCnsKJGV4cGFuZGVkID0gYXJyYXkoKTsKJGV4cGFuZGVkVmVyc2lvbiA9IG51bGw7CmZvcmVhY2ggKCR2ZXJzaW9ucyBhcyAkdmVyc2lvbkRhdGEpIHsKaWYgKCEkZXhwYW5kZWRWZXJzaW9uKSB7CiRleHBhbmRlZFZlcnNpb24gPSAkdmVyc2lvbkRhdGE7CiRleHBhbmRlZFtdID0gJGV4cGFuZGVkVmVyc2lvbjsKY29udGludWU7Cn0KCgpmb3JlYWNoICgkdmVyc2lvbkRhdGEgYXMgJGtleSA9PiAkdmFsKSB7CmlmICgkdmFsID09PSAnX191bnNldCcpIHsKdW5zZXQoJGV4cGFuZGVkVmVyc2lvblska2V5XSk7Cn0gZWxzZSB7CiRleHBhbmRlZFZlcnNpb25bJGtleV0gPSAkdmFsOwp9Cn0KCiRleHBhbmRlZFtdID0gJGV4cGFuZGVkVmVyc2lvbjsKfQoKcmV0dXJuICRleHBhbmRlZDsKfQoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtaW5pZnkoYXJyYXkgJHZlcnNpb25zKQp7CiRtaW5pZmllZFZlcnNpb25zID0gYXJyYXkoKTsKCiRsYXN0S25vd25WZXJzaW9uRGF0YSA9IG51bGw7CmZvcmVhY2ggKCR2ZXJzaW9ucyBhcyAkdmVyc2lvbikgewppZiAoISRsYXN0S25vd25WZXJzaW9uRGF0YSkgewokbGFzdEtub3duVmVyc2lvbkRhdGEgPSAkdmVyc2lvbjsKJG1pbmlmaWVkVmVyc2lvbnNbXSA9ICR2ZXJzaW9uOwpjb250aW51ZTsKfQoKJG1pbmlmaWVkVmVyc2lvbiA9IGFycmF5KCk7CgoKZm9yZWFjaCAoJHZlcnNpb24gYXMgJGtleSA9PiAkdmFsKSB7CmlmICghaXNzZXQoJGxhc3RLbm93blZlcnNpb25EYXRhWyRrZXldKSB8fCAkbGFzdEtub3duVmVyc2lvbkRhdGFbJGtleV0gIT09ICR2YWwpIHsKJG1pbmlmaWVkVmVyc2lvblska2V5XSA9ICR2YWw7CiRsYXN0S25vd25WZXJzaW9uRGF0YVska2V5XSA9ICR2YWw7Cn0KfQoKCmZvcmVhY2ggKCRsYXN0S25vd25WZXJzaW9uRGF0YSBhcyAka2V5ID0+ICR2YWwpIHsKaWYgKCFpc3NldCgkdmVyc2lvblska2V5XSkpIHsKJG1pbmlmaWVkVmVyc2lvblska2V5XSA9ICJfX3Vuc2V0IjsKdW5zZXQoJGxhc3RLbm93blZlcnNpb25EYXRhWyRrZXldKTsKfQp9CgokbWluaWZpZWRWZXJzaW9uc1tdID0gJG1pbmlmaWVkVmVyc2lvbjsKfQoKcmV0dXJuICRtaW5pZmllZFZlcnNpb25zOwp9Cn0KCkNvcHlyaWdodCAoQykgMjAyMSBDb21wb3NlcgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgp0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgp0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCnVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCm9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbwpzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQpTT0ZUV0FSRS4KCjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGNyZTsKCmZpbmFsIGNsYXNzIE1hdGNoQWxsUmVzdWx0CnsKCgoKCgoKcHVibGljICRtYXRjaGVzOwoKCgoKCnB1YmxpYyAkY291bnQ7CgoKCgoKcHVibGljICRtYXRjaGVkOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChpbnQgJGNvdW50LCBhcnJheSAkbWF0Y2hlcykKewokdGhpcy0+bWF0Y2hlcyA9ICRtYXRjaGVzOwokdGhpcy0+bWF0Y2hlZCA9IChib29sKSAkY291bnQ7CiR0aGlzLT5jb3VudCA9ICRjb3VudDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGNyZTsKCmZpbmFsIGNsYXNzIE1hdGNoQWxsU3RyaWN0R3JvdXBzUmVzdWx0CnsKCgoKCgoKcHVibGljICRtYXRjaGVzOwoKCgoKCnB1YmxpYyAkY291bnQ7CgoKCgoKcHVibGljICRtYXRjaGVkOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChpbnQgJGNvdW50LCBhcnJheSAkbWF0Y2hlcykKewokdGhpcy0+bWF0Y2hlcyA9ICRtYXRjaGVzOwokdGhpcy0+bWF0Y2hlZCA9IChib29sKSAkY291bnQ7CiR0aGlzLT5jb3VudCA9ICRjb3VudDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGNyZTsKCmZpbmFsIGNsYXNzIE1hdGNoQWxsV2l0aE9mZnNldHNSZXN1bHQKewoKCgoKCgoKcHVibGljICRtYXRjaGVzOwoKCgoKCnB1YmxpYyAkY291bnQ7CgoKCgoKcHVibGljICRtYXRjaGVkOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoaW50ICRjb3VudCwgYXJyYXkgJG1hdGNoZXMpCnsKJHRoaXMtPm1hdGNoZXMgPSAkbWF0Y2hlczsKJHRoaXMtPm1hdGNoZWQgPSAoYm9vbCkgJGNvdW50OwokdGhpcy0+Y291bnQgPSAkY291bnQ7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBjcmU7CgpmaW5hbCBjbGFzcyBNYXRjaFJlc3VsdAp7CgoKCgoKCnB1YmxpYyAkbWF0Y2hlczsKCgoKCgpwdWJsaWMgJG1hdGNoZWQ7CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGludCAkY291bnQsIGFycmF5ICRtYXRjaGVzKQp7CiR0aGlzLT5tYXRjaGVzID0gJG1hdGNoZXM7CiR0aGlzLT5tYXRjaGVkID0gKGJvb2wpICRjb3VudDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGNyZTsKCmZpbmFsIGNsYXNzIE1hdGNoU3RyaWN0R3JvdXBzUmVzdWx0CnsKCgoKCgoKcHVibGljICRtYXRjaGVzOwoKCgoKCnB1YmxpYyAkbWF0Y2hlZDsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoaW50ICRjb3VudCwgYXJyYXkgJG1hdGNoZXMpCnsKJHRoaXMtPm1hdGNoZXMgPSAkbWF0Y2hlczsKJHRoaXMtPm1hdGNoZWQgPSAoYm9vbCkgJGNvdW50Owp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQY3JlOwoKZmluYWwgY2xhc3MgTWF0Y2hXaXRoT2Zmc2V0c1Jlc3VsdAp7CgoKCgoKCgpwdWJsaWMgJG1hdGNoZXM7CgoKCgoKcHVibGljICRtYXRjaGVkOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoaW50ICRjb3VudCwgYXJyYXkgJG1hdGNoZXMpCnsKJHRoaXMtPm1hdGNoZXMgPSAkbWF0Y2hlczsKJHRoaXMtPm1hdGNoZWQgPSAoYm9vbCkgJGNvdW50Owp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXMgPSAxKTsKCm5hbWVzcGFjZSBDb21wb3NlclxQY3JlXFBIUFN0YW47Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUGNyZVxSZWdleDsKdXNlIENvbXBvc2VyXFBjcmVcUGNyZUV4Y2VwdGlvbjsKdXNlIE5ldHRlXFV0aWxzXFJlZ2V4cEV4Y2VwdGlvbjsKdXNlIE5ldHRlXFV0aWxzXFN0cmluZ3M7CnVzZSBQaHBQYXJzZXJcTm9kZTsKdXNlIFBocFBhcnNlclxOb2RlXEV4cHJcU3RhdGljQ2FsbDsKdXNlIFBocFBhcnNlclxOb2RlXE5hbWVcRnVsbHlRdWFsaWZpZWQ7CnVzZSBQSFBTdGFuXEFuYWx5c2VyXFNjb3BlOwp1c2UgUEhQU3RhblxSdWxlc1xSdWxlOwp1c2UgUEhQU3RhblxSdWxlc1xSdWxlRXJyb3JCdWlsZGVyOwp1c2UgZnVuY3Rpb24gaW5fYXJyYXk7CnVzZSBmdW5jdGlvbiBzcHJpbnRmOwoKCgoKCgpjbGFzcyBJbnZhbGlkUmVnZXhQYXR0ZXJuUnVsZSBpbXBsZW1lbnRzIFJ1bGUKewpwdWJsaWMgZnVuY3Rpb24gZ2V0Tm9kZVR5cGUoKTogc3RyaW5nCnsKcmV0dXJuIFN0YXRpY0NhbGw6OmNsYXNzOwp9CgpwdWJsaWMgZnVuY3Rpb24gcHJvY2Vzc05vZGUoTm9kZSAkbm9kZSwgU2NvcGUgJHNjb3BlKTogYXJyYXkKewokcGF0dGVybnMgPSAkdGhpcy0+ZXh0cmFjdFBhdHRlcm5zKCRub2RlLCAkc2NvcGUpOwoKJGVycm9ycyA9IFtdOwpmb3JlYWNoICgkcGF0dGVybnMgYXMgJHBhdHRlcm4pIHsKJGVycm9yTWVzc2FnZSA9ICR0aGlzLT52YWxpZGF0ZVBhdHRlcm4oJHBhdHRlcm4pOwppZiAoJGVycm9yTWVzc2FnZSA9PT0gbnVsbCkgewpjb250aW51ZTsKfQoKJGVycm9yc1tdID0gUnVsZUVycm9yQnVpbGRlcjo6bWVzc2FnZShzcHJpbnRmKCdSZWdleCBwYXR0ZXJuIGlzIGludmFsaWQ6ICVzJywgJGVycm9yTWVzc2FnZSkpLT5pZGVudGlmaWVyKCdyZWdleHAucGF0dGVybicpLT5idWlsZCgpOwp9CgpyZXR1cm4gJGVycm9yczsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBleHRyYWN0UGF0dGVybnMoU3RhdGljQ2FsbCAkbm9kZSwgU2NvcGUgJHNjb3BlKTogYXJyYXkKewppZiAoISRub2RlLT5jbGFzcyBpbnN0YW5jZW9mIEZ1bGx5UXVhbGlmaWVkKSB7CnJldHVybiBbXTsKfQokaXNSZWdleCA9ICRub2RlLT5jbGFzcy0+dG9TdHJpbmcoKSA9PT0gUmVnZXg6OmNsYXNzOwokaXNQcmVnID0gJG5vZGUtPmNsYXNzLT50b1N0cmluZygpID09PSBQcmVnOjpjbGFzczsKaWYgKCEkaXNSZWdleCAmJiAhJGlzUHJlZykgewpyZXR1cm4gW107Cn0KaWYgKCEkbm9kZS0+bmFtZSBpbnN0YW5jZW9mIE5vZGVcSWRlbnRpZmllciB8fCAhUHJlZzo6aXNNYXRjaCgne14obWF0Y2h8aXNNYXRjaHxncmVwfHJlcGxhY2V8c3BsaXQpfScsICRub2RlLT5uYW1lLT5uYW1lKSkgewpyZXR1cm4gW107Cn0KCiRmdW5jdGlvbk5hbWUgPSAkbm9kZS0+bmFtZS0+bmFtZTsKaWYgKCFpc3NldCgkbm9kZS0+Z2V0QXJncygpWzBdKSkgewpyZXR1cm4gW107Cn0KCiRwYXR0ZXJuTm9kZSA9ICRub2RlLT5nZXRBcmdzKClbMF0tPnZhbHVlOwokcGF0dGVyblR5cGUgPSAkc2NvcGUtPmdldFR5cGUoJHBhdHRlcm5Ob2RlKTsKCiRwYXR0ZXJuU3RyaW5ncyA9IFtdOwoKZm9yZWFjaCAoJHBhdHRlcm5UeXBlLT5nZXRDb25zdGFudFN0cmluZ3MoKSBhcyAkY29uc3RhbnRTdHJpbmdUeXBlKSB7CmlmICgkZnVuY3Rpb25OYW1lID09PSAncmVwbGFjZUNhbGxiYWNrQXJyYXknKSB7CmNvbnRpbnVlOwp9CgokcGF0dGVyblN0cmluZ3NbXSA9ICRjb25zdGFudFN0cmluZ1R5cGUtPmdldFZhbHVlKCk7Cn0KCmZvcmVhY2ggKCRwYXR0ZXJuVHlwZS0+Z2V0Q29uc3RhbnRBcnJheXMoKSBhcyAkY29uc3RhbnRBcnJheVR5cGUpIHsKaWYgKAppbl9hcnJheSgkZnVuY3Rpb25OYW1lLCBbCidyZXBsYWNlJywKJ3JlcGxhY2VDYWxsYmFjaycsCl0sIHRydWUpCikgewpmb3JlYWNoICgkY29uc3RhbnRBcnJheVR5cGUtPmdldFZhbHVlVHlwZXMoKSBhcyAkYXJyYXlLZXlUeXBlKSB7CmZvcmVhY2ggKCRhcnJheUtleVR5cGUtPmdldENvbnN0YW50U3RyaW5ncygpIGFzICRjb25zdGFudFN0cmluZykgewokcGF0dGVyblN0cmluZ3NbXSA9ICRjb25zdGFudFN0cmluZy0+Z2V0VmFsdWUoKTsKfQp9Cn0KCmlmICgkZnVuY3Rpb25OYW1lICE9PSAncmVwbGFjZUNhbGxiYWNrQXJyYXknKSB7CmNvbnRpbnVlOwp9Cgpmb3JlYWNoICgkY29uc3RhbnRBcnJheVR5cGUtPmdldEtleVR5cGVzKCkgYXMgJGFycmF5S2V5VHlwZSkgewpmb3JlYWNoICgkYXJyYXlLZXlUeXBlLT5nZXRDb25zdGFudFN0cmluZ3MoKSBhcyAkY29uc3RhbnRTdHJpbmcpIHsKJHBhdHRlcm5TdHJpbmdzW10gPSAkY29uc3RhbnRTdHJpbmctPmdldFZhbHVlKCk7Cn0KfQp9CgpyZXR1cm4gJHBhdHRlcm5TdHJpbmdzOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHZhbGlkYXRlUGF0dGVybihzdHJpbmcgJHBhdHRlcm4pOiA/c3RyaW5nCnsKdHJ5IHsKJG1zZyA9IG51bGw7CiRwcmV2ID0gc2V0X2Vycm9yX2hhbmRsZXIoZnVuY3Rpb24gKGludCAkc2V2ZXJpdHksIHN0cmluZyAkbWVzc2FnZSwgc3RyaW5nICRmaWxlKSB1c2UgKCYkbXNnKTogYm9vbCB7CiRtc2cgPSBwcmVnX3JlcGxhY2UoIiNecHJlZ19tYXRjaChfYWxsKT9cXCguKj9cXCk6ICMiLCAnJywgJG1lc3NhZ2UpOwoKcmV0dXJuIHRydWU7Cn0pOwoKaWYgKCRwYXR0ZXJuID09PSAnJykgewpyZXR1cm4gJ0VtcHR5IHN0cmluZyBpcyBub3QgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24nOwp9CgpQcmVnOjptYXRjaCgkcGF0dGVybiwgJycpOwppZiAoJG1zZyAhPT0gbnVsbCkgewpyZXR1cm4gJG1zZzsKfQp9IGNhdGNoIChQY3JlRXhjZXB0aW9uICRlKSB7CmlmICgkZS0+Z2V0Q29kZSgpID09PSBQUkVHX0lOVEVSTkFMX0VSUk9SICYmICRtc2cgIT09IG51bGwpIHsKcmV0dXJuICRtc2c7Cn0KCnJldHVybiBwcmVnX3JlcGxhY2UoJ3suKj8gZmFpbGVkIGV4ZWN1dGluZyAiLioiOiB9JywgJycsICRlLT5nZXRNZXNzYWdlKCkpOwp9IGZpbmFsbHkgewpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKfQoKcmV0dXJuIG51bGw7Cn0KCn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgQ29tcG9zZXJcUGNyZVxQSFBTdGFuOwoKdXNlIFBIUFN0YW5cQW5hbHlzZXJcU2NvcGU7CnVzZSBQSFBTdGFuXFR5cGVcQXJyYXlUeXBlOwp1c2UgUEhQU3RhblxUeXBlXENvbnN0YW50XENvbnN0YW50QXJyYXlUeXBlOwp1c2UgUEhQU3RhblxUeXBlXENvbnN0YW50XENvbnN0YW50SW50ZWdlclR5cGU7CnVzZSBQSFBTdGFuXFR5cGVcSW50ZXJzZWN0aW9uVHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxUeXBlQ29tYmluYXRvcjsKdXNlIFBIUFN0YW5cVHlwZVxUeXBlOwp1c2UgUGhwUGFyc2VyXE5vZGVcQXJnOwp1c2UgUEhQU3RhblxUeXBlXFBocFxSZWdleEFycmF5U2hhcGVNYXRjaGVyOwp1c2UgUEhQU3RhblxUeXBlXFR5cGVUcmF2ZXJzZXI7CnVzZSBQSFBTdGFuXFR5cGVcVW5pb25UeXBlOwoKZmluYWwgY2xhc3MgUHJlZ01hdGNoRmxhZ3MKewpzdGF0aWMgcHVibGljIGZ1bmN0aW9uIGdldFR5cGUoP0FyZyAkZmxhZ3NBcmcsIFNjb3BlICRzY29wZSk6ID9UeXBlCnsKaWYgKCRmbGFnc0FyZyA9PT0gbnVsbCkgewpyZXR1cm4gbmV3IENvbnN0YW50SW50ZWdlclR5cGUoUFJFR19VTk1BVENIRURfQVNfTlVMTCB8IFJlZ2V4QXJyYXlTaGFwZU1hdGNoZXI6OlBSRUdfVU5NQVRDSEVEX0FTX05VTExfT05fNzJfNzMpOwp9CgokZmxhZ3NUeXBlID0gJHNjb3BlLT5nZXRUeXBlKCRmbGFnc0FyZy0+dmFsdWUpOwoKJGNvbnN0YW50U2NhbGFycyA9ICRmbGFnc1R5cGUtPmdldENvbnN0YW50U2NhbGFyVmFsdWVzKCk7CmlmICgkY29uc3RhbnRTY2FsYXJzID09PSBbXSkgewpyZXR1cm4gbnVsbDsKfQoKJGludGVybmFsRmxhZ3NUeXBlcyA9IFtdOwpmb3JlYWNoICgkZmxhZ3NUeXBlLT5nZXRDb25zdGFudFNjYWxhclZhbHVlcygpIGFzICRjb25zdGFudFNjYWxhclZhbHVlKSB7CmlmICghaXNfaW50KCRjb25zdGFudFNjYWxhclZhbHVlKSkgewpyZXR1cm4gbnVsbDsKfQoKJGludGVybmFsRmxhZ3NUeXBlc1tdID0gbmV3IENvbnN0YW50SW50ZWdlclR5cGUoJGNvbnN0YW50U2NhbGFyVmFsdWUgfCBQUkVHX1VOTUFUQ0hFRF9BU19OVUxMIHwgUmVnZXhBcnJheVNoYXBlTWF0Y2hlcjo6UFJFR19VTk1BVENIRURfQVNfTlVMTF9PTl83Ml83Myk7Cn0KcmV0dXJuIFR5cGVDb21iaW5hdG9yOjp1bmlvbiguLi4kaW50ZXJuYWxGbGFnc1R5cGVzKTsKfQoKc3RhdGljIHB1YmxpYyBmdW5jdGlvbiByZW1vdmVOdWxsRnJvbU1hdGNoZXMoVHlwZSAkbWF0Y2hlc1R5cGUpOiBUeXBlCnsKcmV0dXJuIFR5cGVUcmF2ZXJzZXI6Om1hcCgkbWF0Y2hlc1R5cGUsIHN0YXRpYyBmdW5jdGlvbiAoVHlwZSAkdHlwZSwgY2FsbGFibGUgJHRyYXZlcnNlKTogVHlwZSB7CmlmICgkdHlwZSBpbnN0YW5jZW9mIFVuaW9uVHlwZSB8fCAkdHlwZSBpbnN0YW5jZW9mIEludGVyc2VjdGlvblR5cGUpIHsKcmV0dXJuICR0cmF2ZXJzZSgkdHlwZSk7Cn0KCmlmICgkdHlwZSBpbnN0YW5jZW9mIENvbnN0YW50QXJyYXlUeXBlKSB7CnJldHVybiBuZXcgQ29uc3RhbnRBcnJheVR5cGUoCiR0eXBlLT5nZXRLZXlUeXBlcygpLAphcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uIChUeXBlICR2YWx1ZVR5cGUpIHVzZSAoJHRyYXZlcnNlKTogVHlwZSB7CnJldHVybiAkdHJhdmVyc2UoJHZhbHVlVHlwZSk7Cn0sICR0eXBlLT5nZXRWYWx1ZVR5cGVzKCkpLAokdHlwZS0+Z2V0TmV4dEF1dG9JbmRleGVzKCksCltdLAokdHlwZS0+aXNMaXN0KCkKKTsKfQoKaWYgKCR0eXBlIGluc3RhbmNlb2YgQXJyYXlUeXBlKSB7CnJldHVybiBuZXcgQXJyYXlUeXBlKCR0eXBlLT5nZXRLZXlUeXBlKCksICR0cmF2ZXJzZSgkdHlwZS0+Z2V0SXRlbVR5cGUoKSkpOwp9CgpyZXR1cm4gVHlwZUNvbWJpbmF0b3I6OnJlbW92ZU51bGwoJHR5cGUpOwp9KTsKfQoKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBDb21wb3NlclxQY3JlXFBIUFN0YW47Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgUGhwUGFyc2VyXE5vZGVcRXhwclxTdGF0aWNDYWxsOwp1c2UgUEhQU3RhblxBbmFseXNlclxTY29wZTsKdXNlIFBIUFN0YW5cUmVmbGVjdGlvblxNZXRob2RSZWZsZWN0aW9uOwp1c2UgUEhQU3RhblxSZWZsZWN0aW9uXFBhcmFtZXRlclJlZmxlY3Rpb247CnVzZSBQSFBTdGFuXFRyaW5hcnlMb2dpYzsKdXNlIFBIUFN0YW5cVHlwZVxQaHBcUmVnZXhBcnJheVNoYXBlTWF0Y2hlcjsKdXNlIFBIUFN0YW5cVHlwZVxTdGF0aWNNZXRob2RQYXJhbWV0ZXJPdXRUeXBlRXh0ZW5zaW9uOwp1c2UgUEhQU3RhblxUeXBlXFR5cGU7CgpmaW5hbCBjbGFzcyBQcmVnTWF0Y2hQYXJhbWV0ZXJPdXRUeXBlRXh0ZW5zaW9uIGltcGxlbWVudHMgU3RhdGljTWV0aG9kUGFyYW1ldGVyT3V0VHlwZUV4dGVuc2lvbgp7CgoKCnByaXZhdGUgJHJlZ2V4U2hhcGVNYXRjaGVyOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KApSZWdleEFycmF5U2hhcGVNYXRjaGVyICRyZWdleFNoYXBlTWF0Y2hlcgopCnsKJHRoaXMtPnJlZ2V4U2hhcGVNYXRjaGVyID0gJHJlZ2V4U2hhcGVNYXRjaGVyOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNTdGF0aWNNZXRob2RTdXBwb3J0ZWQoTWV0aG9kUmVmbGVjdGlvbiAkbWV0aG9kUmVmbGVjdGlvbiwgUGFyYW1ldGVyUmVmbGVjdGlvbiAkcGFyYW1ldGVyKTogYm9vbAp7CnJldHVybgokbWV0aG9kUmVmbGVjdGlvbi0+Z2V0RGVjbGFyaW5nQ2xhc3MoKS0+Z2V0TmFtZSgpID09PSBQcmVnOjpjbGFzcwomJiBpbl9hcnJheSgkbWV0aG9kUmVmbGVjdGlvbi0+Z2V0TmFtZSgpLCBbCidtYXRjaCcsICdpc01hdGNoJywgJ21hdGNoU3RyaWN0R3JvdXBzJywgJ2lzTWF0Y2hTdHJpY3RHcm91cHMnLAonbWF0Y2hBbGwnLCAnaXNNYXRjaEFsbCcsICdtYXRjaEFsbFN0cmljdEdyb3VwcycsICdpc01hdGNoQWxsU3RyaWN0R3JvdXBzJwpdLCB0cnVlKQomJiAkcGFyYW1ldGVyLT5nZXROYW1lKCkgPT09ICdtYXRjaGVzJzsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFBhcmFtZXRlck91dFR5cGVGcm9tU3RhdGljTWV0aG9kQ2FsbChNZXRob2RSZWZsZWN0aW9uICRtZXRob2RSZWZsZWN0aW9uLCBTdGF0aWNDYWxsICRtZXRob2RDYWxsLCBQYXJhbWV0ZXJSZWZsZWN0aW9uICRwYXJhbWV0ZXIsIFNjb3BlICRzY29wZSk6ID9UeXBlCnsKJGFyZ3MgPSAkbWV0aG9kQ2FsbC0+Z2V0QXJncygpOwokcGF0dGVybkFyZyA9ICRhcmdzWzBdID8/IG51bGw7CiRtYXRjaGVzQXJnID0gJGFyZ3NbMl0gPz8gbnVsbDsKJGZsYWdzQXJnID0gJGFyZ3NbM10gPz8gbnVsbDsKCmlmICgKJHBhdHRlcm5BcmcgPT09IG51bGwgfHwgJG1hdGNoZXNBcmcgPT09IG51bGwKKSB7CnJldHVybiBudWxsOwp9CgokZmxhZ3NUeXBlID0gUHJlZ01hdGNoRmxhZ3M6OmdldFR5cGUoJGZsYWdzQXJnLCAkc2NvcGUpOwppZiAoJGZsYWdzVHlwZSA9PT0gbnVsbCkgewpyZXR1cm4gbnVsbDsKfQoKaWYgKHN0cmlwb3MoJG1ldGhvZFJlZmxlY3Rpb24tPmdldE5hbWUoKSwgJ21hdGNoQWxsJykgIT09IGZhbHNlKSB7CnJldHVybiAkdGhpcy0+cmVnZXhTaGFwZU1hdGNoZXItPm1hdGNoQWxsRXhwcigkcGF0dGVybkFyZy0+dmFsdWUsICRmbGFnc1R5cGUsIFRyaW5hcnlMb2dpYzo6Y3JlYXRlTWF5YmUoKSwgJHNjb3BlKTsKfQoKcmV0dXJuICR0aGlzLT5yZWdleFNoYXBlTWF0Y2hlci0+bWF0Y2hFeHByKCRwYXR0ZXJuQXJnLT52YWx1ZSwgJGZsYWdzVHlwZSwgVHJpbmFyeUxvZ2ljOjpjcmVhdGVNYXliZSgpLCAkc2NvcGUpOwp9Cgp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIENvbXBvc2VyXFBjcmVcUEhQU3RhbjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBQaHBQYXJzZXJcTm9kZVxFeHByXFN0YXRpY0NhbGw7CnVzZSBQSFBTdGFuXEFuYWx5c2VyXFNjb3BlOwp1c2UgUEhQU3RhblxBbmFseXNlclxTcGVjaWZpZWRUeXBlczsKdXNlIFBIUFN0YW5cQW5hbHlzZXJcVHlwZVNwZWNpZmllcjsKdXNlIFBIUFN0YW5cQW5hbHlzZXJcVHlwZVNwZWNpZmllckF3YXJlRXh0ZW5zaW9uOwp1c2UgUEhQU3RhblxBbmFseXNlclxUeXBlU3BlY2lmaWVyQ29udGV4dDsKdXNlIFBIUFN0YW5cUmVmbGVjdGlvblxNZXRob2RSZWZsZWN0aW9uOwp1c2UgUEhQU3RhblxUcmluYXJ5TG9naWM7CnVzZSBQSFBTdGFuXFR5cGVcQ29uc3RhbnRcQ29uc3RhbnRBcnJheVR5cGU7CnVzZSBQSFBTdGFuXFR5cGVcUGhwXFJlZ2V4QXJyYXlTaGFwZU1hdGNoZXI7CnVzZSBQSFBTdGFuXFR5cGVcU3RhdGljTWV0aG9kVHlwZVNwZWNpZnlpbmdFeHRlbnNpb247CnVzZSBQSFBTdGFuXFR5cGVcVHlwZUNvbWJpbmF0b3I7CnVzZSBQSFBTdGFuXFR5cGVcVHlwZTsKCmZpbmFsIGNsYXNzIFByZWdNYXRjaFR5cGVTcGVjaWZ5aW5nRXh0ZW5zaW9uIGltcGxlbWVudHMgU3RhdGljTWV0aG9kVHlwZVNwZWNpZnlpbmdFeHRlbnNpb24sIFR5cGVTcGVjaWZpZXJBd2FyZUV4dGVuc2lvbgp7CgoKCnByaXZhdGUgJHR5cGVTcGVjaWZpZXI7CgoKCgpwcml2YXRlICRyZWdleFNoYXBlTWF0Y2hlcjsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChSZWdleEFycmF5U2hhcGVNYXRjaGVyICRyZWdleFNoYXBlTWF0Y2hlcikKewokdGhpcy0+cmVnZXhTaGFwZU1hdGNoZXIgPSAkcmVnZXhTaGFwZU1hdGNoZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRUeXBlU3BlY2lmaWVyKFR5cGVTcGVjaWZpZXIgJHR5cGVTcGVjaWZpZXIpOiB2b2lkCnsKJHRoaXMtPnR5cGVTcGVjaWZpZXIgPSAkdHlwZVNwZWNpZmllcjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldENsYXNzKCk6IHN0cmluZwp7CnJldHVybiBQcmVnOjpjbGFzczsKfQoKcHVibGljIGZ1bmN0aW9uIGlzU3RhdGljTWV0aG9kU3VwcG9ydGVkKE1ldGhvZFJlZmxlY3Rpb24gJG1ldGhvZFJlZmxlY3Rpb24sIFN0YXRpY0NhbGwgJG5vZGUsIFR5cGVTcGVjaWZpZXJDb250ZXh0ICRjb250ZXh0KTogYm9vbAp7CnJldHVybiBpbl9hcnJheSgkbWV0aG9kUmVmbGVjdGlvbi0+Z2V0TmFtZSgpLCBbCidtYXRjaCcsICdpc01hdGNoJywgJ21hdGNoU3RyaWN0R3JvdXBzJywgJ2lzTWF0Y2hTdHJpY3RHcm91cHMnLAonbWF0Y2hBbGwnLCAnaXNNYXRjaEFsbCcsICdtYXRjaEFsbFN0cmljdEdyb3VwcycsICdpc01hdGNoQWxsU3RyaWN0R3JvdXBzJwpdLCB0cnVlKQomJiAhJGNvbnRleHQtPm51bGwoKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNwZWNpZnlUeXBlcyhNZXRob2RSZWZsZWN0aW9uICRtZXRob2RSZWZsZWN0aW9uLCBTdGF0aWNDYWxsICRub2RlLCBTY29wZSAkc2NvcGUsIFR5cGVTcGVjaWZpZXJDb250ZXh0ICRjb250ZXh0KTogU3BlY2lmaWVkVHlwZXMKewokYXJncyA9ICRub2RlLT5nZXRBcmdzKCk7CiRwYXR0ZXJuQXJnID0gJGFyZ3NbMF0gPz8gbnVsbDsKJG1hdGNoZXNBcmcgPSAkYXJnc1syXSA/PyBudWxsOwokZmxhZ3NBcmcgPSAkYXJnc1szXSA/PyBudWxsOwoKaWYgKAokcGF0dGVybkFyZyA9PT0gbnVsbCB8fCAkbWF0Y2hlc0FyZyA9PT0gbnVsbAopIHsKcmV0dXJuIG5ldyBTcGVjaWZpZWRUeXBlcygpOwp9CgokZmxhZ3NUeXBlID0gUHJlZ01hdGNoRmxhZ3M6OmdldFR5cGUoJGZsYWdzQXJnLCAkc2NvcGUpOwppZiAoJGZsYWdzVHlwZSA9PT0gbnVsbCkgewpyZXR1cm4gbmV3IFNwZWNpZmllZFR5cGVzKCk7Cn0KCmlmIChzdHJpcG9zKCRtZXRob2RSZWZsZWN0aW9uLT5nZXROYW1lKCksICdtYXRjaEFsbCcpICE9PSBmYWxzZSkgewokbWF0Y2hlZFR5cGUgPSAkdGhpcy0+cmVnZXhTaGFwZU1hdGNoZXItPm1hdGNoQWxsRXhwcigkcGF0dGVybkFyZy0+dmFsdWUsICRmbGFnc1R5cGUsIFRyaW5hcnlMb2dpYzo6Y3JlYXRlRnJvbUJvb2xlYW4oJGNvbnRleHQtPnRydWUoKSksICRzY29wZSk7Cn0gZWxzZSB7CiRtYXRjaGVkVHlwZSA9ICR0aGlzLT5yZWdleFNoYXBlTWF0Y2hlci0+bWF0Y2hFeHByKCRwYXR0ZXJuQXJnLT52YWx1ZSwgJGZsYWdzVHlwZSwgVHJpbmFyeUxvZ2ljOjpjcmVhdGVGcm9tQm9vbGVhbigkY29udGV4dC0+dHJ1ZSgpKSwgJHNjb3BlKTsKfQoKaWYgKCRtYXRjaGVkVHlwZSA9PT0gbnVsbCkgewpyZXR1cm4gbmV3IFNwZWNpZmllZFR5cGVzKCk7Cn0KCmlmICgKaW5fYXJyYXkoJG1ldGhvZFJlZmxlY3Rpb24tPmdldE5hbWUoKSwgWydtYXRjaFN0cmljdEdyb3VwcycsICdpc01hdGNoU3RyaWN0R3JvdXBzJywgJ21hdGNoQWxsU3RyaWN0R3JvdXBzJywgJ2lzTWF0Y2hBbGxTdHJpY3RHcm91cHMnXSwgdHJ1ZSkKKSB7CiRtYXRjaGVkVHlwZSA9IFByZWdNYXRjaEZsYWdzOjpyZW1vdmVOdWxsRnJvbU1hdGNoZXMoJG1hdGNoZWRUeXBlKTsKfQoKJG92ZXJ3cml0ZSA9IGZhbHNlOwppZiAoJGNvbnRleHQtPmZhbHNlKCkpIHsKJG92ZXJ3cml0ZSA9IHRydWU7CiRjb250ZXh0ID0gJGNvbnRleHQtPm5lZ2F0ZSgpOwp9CgoKaWYgKG1ldGhvZF9leGlzdHMoJ1BIUFN0YW5cQW5hbHlzZXJcU3BlY2lmaWVkVHlwZXMnLCAnc2V0Um9vdEV4cHInKSkgewoKJHR5cGVTcGVjaWZpZXIgPSAkdGhpcy0+dHlwZVNwZWNpZmllci0+Y3JlYXRlKAokbWF0Y2hlc0FyZy0+dmFsdWUsCiRtYXRjaGVkVHlwZSwKJGNvbnRleHQsCgokc2NvcGUKKS0+c2V0Um9vdEV4cHIoJG5vZGUpOwoKcmV0dXJuICRvdmVyd3JpdGUgPyAkdHlwZVNwZWNpZmllci0+c2V0QWx3YXlzT3ZlcndyaXRlVHlwZXMoKSA6ICR0eXBlU3BlY2lmaWVyOwp9CgoKcmV0dXJuICR0aGlzLT50eXBlU3BlY2lmaWVyLT5jcmVhdGUoCiRtYXRjaGVzQXJnLT52YWx1ZSwKJG1hdGNoZWRUeXBlLAokY29udGV4dCwKCiRvdmVyd3JpdGUsCiRzY29wZSwKJG5vZGUKKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIENvbXBvc2VyXFBjcmVcUEhQU3RhbjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxQY3JlXFJlZ2V4Owp1c2UgUGhwUGFyc2VyXE5vZGVcRXhwclxTdGF0aWNDYWxsOwp1c2UgUEhQU3RhblxBbmFseXNlclxTY29wZTsKdXNlIFBIUFN0YW5cUmVmbGVjdGlvblxNZXRob2RSZWZsZWN0aW9uOwp1c2UgUEhQU3RhblxSZWZsZWN0aW9uXE5hdGl2ZVxOYXRpdmVQYXJhbWV0ZXJSZWZsZWN0aW9uOwp1c2UgUEhQU3RhblxSZWZsZWN0aW9uXFBhcmFtZXRlclJlZmxlY3Rpb247CnVzZSBQSFBTdGFuXFRyaW5hcnlMb2dpYzsKdXNlIFBIUFN0YW5cVHlwZVxDbG9zdXJlVHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxQaHBcUmVnZXhBcnJheVNoYXBlTWF0Y2hlcjsKdXNlIFBIUFN0YW5cVHlwZVxTdGF0aWNNZXRob2RQYXJhbWV0ZXJDbG9zdXJlVHlwZUV4dGVuc2lvbjsKdXNlIFBIUFN0YW5cVHlwZVxTdHJpbmdUeXBlOwp1c2UgUEhQU3RhblxUeXBlXFR5cGU7CgpmaW5hbCBjbGFzcyBQcmVnUmVwbGFjZUNhbGxiYWNrQ2xvc3VyZVR5cGVFeHRlbnNpb24gaW1wbGVtZW50cyBTdGF0aWNNZXRob2RQYXJhbWV0ZXJDbG9zdXJlVHlwZUV4dGVuc2lvbgp7CgoKCnByaXZhdGUgJHJlZ2V4U2hhcGVNYXRjaGVyOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFJlZ2V4QXJyYXlTaGFwZU1hdGNoZXIgJHJlZ2V4U2hhcGVNYXRjaGVyKQp7CiR0aGlzLT5yZWdleFNoYXBlTWF0Y2hlciA9ICRyZWdleFNoYXBlTWF0Y2hlcjsKfQoKcHVibGljIGZ1bmN0aW9uIGlzU3RhdGljTWV0aG9kU3VwcG9ydGVkKE1ldGhvZFJlZmxlY3Rpb24gJG1ldGhvZFJlZmxlY3Rpb24sIFBhcmFtZXRlclJlZmxlY3Rpb24gJHBhcmFtZXRlcik6IGJvb2wKewpyZXR1cm4gaW5fYXJyYXkoJG1ldGhvZFJlZmxlY3Rpb24tPmdldERlY2xhcmluZ0NsYXNzKCktPmdldE5hbWUoKSwgW1ByZWc6OmNsYXNzLCBSZWdleDo6Y2xhc3NdLCB0cnVlKQomJiBpbl9hcnJheSgkbWV0aG9kUmVmbGVjdGlvbi0+Z2V0TmFtZSgpLCBbJ3JlcGxhY2VDYWxsYmFjayddLCB0cnVlKQomJiAkcGFyYW1ldGVyLT5nZXROYW1lKCkgPT09ICdyZXBsYWNlbWVudCc7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRUeXBlRnJvbVN0YXRpY01ldGhvZENhbGwoTWV0aG9kUmVmbGVjdGlvbiAkbWV0aG9kUmVmbGVjdGlvbiwgU3RhdGljQ2FsbCAkbWV0aG9kQ2FsbCwgUGFyYW1ldGVyUmVmbGVjdGlvbiAkcGFyYW1ldGVyLCBTY29wZSAkc2NvcGUpOiA/VHlwZQp7CiRhcmdzID0gJG1ldGhvZENhbGwtPmdldEFyZ3MoKTsKJHBhdHRlcm5BcmcgPSAkYXJnc1swXSA/PyBudWxsOwokZmxhZ3NBcmcgPSAkYXJnc1s1XSA/PyBudWxsOwoKaWYgKAokcGF0dGVybkFyZyA9PT0gbnVsbAopIHsKcmV0dXJuIG51bGw7Cn0KCiRmbGFnc1R5cGUgPSBudWxsOwppZiAoJGZsYWdzQXJnICE9PSBudWxsKSB7CiRmbGFnc1R5cGUgPSAkc2NvcGUtPmdldFR5cGUoJGZsYWdzQXJnLT52YWx1ZSk7Cn0KCiRtYXRjaGVzVHlwZSA9ICR0aGlzLT5yZWdleFNoYXBlTWF0Y2hlci0+bWF0Y2hFeHByKCRwYXR0ZXJuQXJnLT52YWx1ZSwgJGZsYWdzVHlwZSwgVHJpbmFyeUxvZ2ljOjpjcmVhdGVZZXMoKSwgJHNjb3BlKTsKaWYgKCRtYXRjaGVzVHlwZSA9PT0gbnVsbCkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuIG5ldyBDbG9zdXJlVHlwZSgKWwpuZXcgTmF0aXZlUGFyYW1ldGVyUmVmbGVjdGlvbigkcGFyYW1ldGVyLT5nZXROYW1lKCksICRwYXJhbWV0ZXItPmlzT3B0aW9uYWwoKSwgJG1hdGNoZXNUeXBlLCAkcGFyYW1ldGVyLT5wYXNzZWRCeVJlZmVyZW5jZSgpLCAkcGFyYW1ldGVyLT5pc1ZhcmlhZGljKCksICRwYXJhbWV0ZXItPmdldERlZmF1bHRWYWx1ZSgpKSwKXSwKbmV3IFN0cmluZ1R5cGUoKQopOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgQ29tcG9zZXJcUGNyZVxQSFBTdGFuOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFBjcmVcUmVnZXg7CnVzZSBQaHBQYXJzZXJcTm9kZTsKdXNlIFBocFBhcnNlclxOb2RlXEV4cHJcU3RhdGljQ2FsbDsKdXNlIFBocFBhcnNlclxOb2RlXE5hbWVcRnVsbHlRdWFsaWZpZWQ7CnVzZSBQSFBTdGFuXEFuYWx5c2VyXFNjb3BlOwp1c2UgUEhQU3RhblxBbmFseXNlclxTcGVjaWZpZWRUeXBlczsKdXNlIFBIUFN0YW5cUnVsZXNcUnVsZTsKdXNlIFBIUFN0YW5cUnVsZXNcUnVsZUVycm9yQnVpbGRlcjsKdXNlIFBIUFN0YW5cVHJpbmFyeUxvZ2ljOwp1c2UgUEhQU3RhblxUeXBlXE9iamVjdFR5cGU7CnVzZSBQSFBTdGFuXFR5cGVcVHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxUeXBlQ29tYmluYXRvcjsKdXNlIFBIUFN0YW5cVHlwZVxQaHBcUmVnZXhBcnJheVNoYXBlTWF0Y2hlcjsKdXNlIGZ1bmN0aW9uIHNwcmludGY7CgoKCgpmaW5hbCBjbGFzcyBVbnNhZmVTdHJpY3RHcm91cHNDYWxsUnVsZSBpbXBsZW1lbnRzIFJ1bGUKewoKCgpwcml2YXRlICRyZWdleFNoYXBlTWF0Y2hlcjsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChSZWdleEFycmF5U2hhcGVNYXRjaGVyICRyZWdleFNoYXBlTWF0Y2hlcikKewokdGhpcy0+cmVnZXhTaGFwZU1hdGNoZXIgPSAkcmVnZXhTaGFwZU1hdGNoZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXROb2RlVHlwZSgpOiBzdHJpbmcKewpyZXR1cm4gU3RhdGljQ2FsbDo6Y2xhc3M7Cn0KCnB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzTm9kZShOb2RlICRub2RlLCBTY29wZSAkc2NvcGUpOiBhcnJheQp7CmlmICghJG5vZGUtPmNsYXNzIGluc3RhbmNlb2YgRnVsbHlRdWFsaWZpZWQpIHsKcmV0dXJuIFtdOwp9CiRpc1JlZ2V4ID0gJG5vZGUtPmNsYXNzLT50b1N0cmluZygpID09PSBSZWdleDo6Y2xhc3M7CiRpc1ByZWcgPSAkbm9kZS0+Y2xhc3MtPnRvU3RyaW5nKCkgPT09IFByZWc6OmNsYXNzOwppZiAoISRpc1JlZ2V4ICYmICEkaXNQcmVnKSB7CnJldHVybiBbXTsKfQppZiAoISRub2RlLT5uYW1lIGluc3RhbmNlb2YgTm9kZVxJZGVudGlmaWVyIHx8ICFpbl9hcnJheSgkbm9kZS0+bmFtZS0+bmFtZSwgWydtYXRjaFN0cmljdEdyb3VwcycsICdpc01hdGNoU3RyaWN0R3JvdXBzJywgJ21hdGNoQWxsU3RyaWN0R3JvdXBzJywgJ2lzTWF0Y2hBbGxTdHJpY3RHcm91cHMnXSwgdHJ1ZSkpIHsKcmV0dXJuIFtdOwp9CgokYXJncyA9ICRub2RlLT5nZXRBcmdzKCk7CmlmICghaXNzZXQoJGFyZ3NbMF0pKSB7CnJldHVybiBbXTsKfQoKJHBhdHRlcm5BcmcgPSAkYXJnc1swXSA/PyBudWxsOwppZiAoJGlzUHJlZykgewppZiAoIWlzc2V0KCRhcmdzWzJdKSkgeyAKcmV0dXJuIFtdOwp9CiRmbGFnc0FyZyA9ICRhcmdzWzNdID8/IG51bGw7Cn0gZWxzZSB7CiRmbGFnc0FyZyA9ICRhcmdzWzJdID8/IG51bGw7Cn0KCmlmICgkcGF0dGVybkFyZyA9PT0gbnVsbCkgewpyZXR1cm4gW107Cn0KCiRmbGFnc1R5cGUgPSBQcmVnTWF0Y2hGbGFnczo6Z2V0VHlwZSgkZmxhZ3NBcmcsICRzY29wZSk7CmlmICgkZmxhZ3NUeXBlID09PSBudWxsKSB7CnJldHVybiBbXTsKfQoKJG1hdGNoZWRUeXBlID0gJHRoaXMtPnJlZ2V4U2hhcGVNYXRjaGVyLT5tYXRjaEV4cHIoJHBhdHRlcm5BcmctPnZhbHVlLCAkZmxhZ3NUeXBlLCBUcmluYXJ5TG9naWM6OmNyZWF0ZVllcygpLCAkc2NvcGUpOwppZiAoJG1hdGNoZWRUeXBlID09PSBudWxsKSB7CnJldHVybiBbClJ1bGVFcnJvckJ1aWxkZXI6Om1lc3NhZ2Uoc3ByaW50ZignVGhlICVzIGNhbGwgaXMgcG90ZW50aWFsbHkgdW5zYWZlIGFzICRtYXRjaGVzXCcgdHlwZSBjb3VsZCBub3QgYmUgaW5mZXJyZWQuJywgJG5vZGUtPm5hbWUtPm5hbWUpKQotPmlkZW50aWZpZXIoJ2NvbXBvc2VyUGNyZS5tYXliZVVuc2FmZVN0cmljdEdyb3VwcycpCi0+YnVpbGQoKSwKXTsKfQoKaWYgKGNvdW50KCRtYXRjaGVkVHlwZS0+Z2V0Q29uc3RhbnRBcnJheXMoKSkgPT09IDEpIHsKJG1hdGNoZWRUeXBlID0gJG1hdGNoZWRUeXBlLT5nZXRDb25zdGFudEFycmF5cygpWzBdOwokbnVsbGFibGVHcm91cHMgPSBbXTsKZm9yZWFjaCAoJG1hdGNoZWRUeXBlLT5nZXRWYWx1ZVR5cGVzKCkgYXMgJGluZGV4ID0+ICR0eXBlKSB7CmlmIChUeXBlQ29tYmluYXRvcjo6Y29udGFpbnNOdWxsKCR0eXBlKSkgewokbnVsbGFibGVHcm91cHNbXSA9ICRtYXRjaGVkVHlwZS0+Z2V0S2V5VHlwZXMoKVskaW5kZXhdLT5nZXRWYWx1ZSgpOwp9Cn0KCmlmIChcY291bnQoJG51bGxhYmxlR3JvdXBzKSA+IDApIHsKcmV0dXJuIFsKUnVsZUVycm9yQnVpbGRlcjo6bWVzc2FnZShzcHJpbnRmKAonVGhlICVzIGNhbGwgaXMgdW5zYWZlIGFzIG1hdGNoIGdyb3VwJXMgIiVzIiAlcyBvcHRpb25hbCBhbmQgbWF5IGJlIG51bGwuJywKJG5vZGUtPm5hbWUtPm5hbWUsClxjb3VudCgkbnVsbGFibGVHcm91cHMpID4gMSA/ICdzJyA6ICcnLAppbXBsb2RlKCciLCAiJywgJG51bGxhYmxlR3JvdXBzKSwKXGNvdW50KCRudWxsYWJsZUdyb3VwcykgPiAxID8gJ2FyZScgOiAnaXMnCikpLT5pZGVudGlmaWVyKCdjb21wb3NlclBjcmUudW5zYWZlU3RyaWN0R3JvdXBzJyktPmJ1aWxkKCksCl07Cn0KfQoKcmV0dXJuIFtdOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQY3JlOwoKY2xhc3MgUGNyZUV4Y2VwdGlvbiBleHRlbmRzIFxSdW50aW1lRXhjZXB0aW9uCnsKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21GdW5jdGlvbigkZnVuY3Rpb24sICRwYXR0ZXJuKQp7CiRjb2RlID0gcHJlZ19sYXN0X2Vycm9yKCk7CgppZiAoaXNfYXJyYXkoJHBhdHRlcm4pKSB7CiRwYXR0ZXJuID0gaW1wbG9kZSgnLCAnLCAkcGF0dGVybik7Cn0KCnJldHVybiBuZXcgUGNyZUV4Y2VwdGlvbigkZnVuY3Rpb24uJygpOiBmYWlsZWQgZXhlY3V0aW5nICInLiRwYXR0ZXJuLiciOiAnLnNlbGY6OnBjcmVMYXN0RXJyb3JNZXNzYWdlKCRjb2RlKSwgJGNvZGUpOwp9CgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gcGNyZUxhc3RFcnJvck1lc3NhZ2UoJGNvZGUpCnsKaWYgKGZ1bmN0aW9uX2V4aXN0cygncHJlZ19sYXN0X2Vycm9yX21zZycpKSB7CnJldHVybiBwcmVnX2xhc3RfZXJyb3JfbXNnKCk7Cn0KCgppZiAoUEhQX1ZFUlNJT05fSUQgPCA3MDIwMSAmJiAkY29kZSA9PT0gMCkgewpyZXR1cm4gJ1VOREVGSU5FRF9FUlJPUic7Cn0KCiRjb25zdGFudHMgPSBnZXRfZGVmaW5lZF9jb25zdGFudHModHJ1ZSk7CmlmICghaXNzZXQoJGNvbnN0YW50c1sncGNyZSddKSB8fCAhaXNfYXJyYXkoJGNvbnN0YW50c1sncGNyZSddKSkgewpyZXR1cm4gJ1VOREVGSU5FRF9FUlJPUic7Cn0KCmZvcmVhY2ggKCRjb25zdGFudHNbJ3BjcmUnXSBhcyAkY29uc3QgPT4gJHZhbCkgewppZiAoJHZhbCA9PT0gJGNvZGUgJiYgc3Vic3RyKCRjb25zdCwgLTYpID09PSAnX0VSUk9SJykgewpyZXR1cm4gJGNvbnN0Owp9Cn0KCnJldHVybiAnVU5ERUZJTkVEX0VSUk9SJzsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGNyZTsKCmNsYXNzIFByZWcKewoKcHVibGljIGNvbnN0IEFSUkFZX01TRyA9ICckc3ViamVjdCBhcyBhbiBhcnJheSBpcyBub3Qgc3VwcG9ydGVkLiBZb3UgY2FuIHVzZSBcJ2ZvcmVhY2hcJyBpbnN0ZWFkLic7CgpwdWJsaWMgY29uc3QgSU5WQUxJRF9UWVBFX01TRyA9ICckc3ViamVjdCBtdXN0IGJlIGEgc3RyaW5nLCAlcyBnaXZlbi4nOwoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1hdGNoKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCA/YXJyYXkgJiRtYXRjaGVzID0gbnVsbCwgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IGludAp7CnNlbGY6OmNoZWNrT2Zmc2V0Q2FwdHVyZSgkZmxhZ3MsICdtYXRjaFdpdGhPZmZzZXRzJyk7CgokcmVzdWx0ID0gc2VsZjo6cHJlZ01hdGNoKCRwYXR0ZXJuLCAkc3ViamVjdCwgJG1hdGNoZXMsICRmbGFncyB8IFBSRUdfVU5NQVRDSEVEX0FTX05VTEwsICRvZmZzZXQpOwppZiAoJHJlc3VsdCA9PT0gZmFsc2UpIHsKdGhyb3cgUGNyZUV4Y2VwdGlvbjo6ZnJvbUZ1bmN0aW9uKCdwcmVnX21hdGNoJywgJHBhdHRlcm4pOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1hdGNoU3RyaWN0R3JvdXBzKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCA/YXJyYXkgJiRtYXRjaGVzID0gbnVsbCwgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IGludAp7CiRyZXN1bHQgPSBzZWxmOjptYXRjaCgkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzSW50ZXJuYWwsICRmbGFncywgJG9mZnNldCk7CiRtYXRjaGVzID0gc2VsZjo6ZW5mb3JjZU5vbk51bGxNYXRjaGVzKCRwYXR0ZXJuLCAkbWF0Y2hlc0ludGVybmFsLCAnbWF0Y2gnKTsKCnJldHVybiAkcmVzdWx0Owp9CgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYXRjaFdpdGhPZmZzZXRzKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCA/YXJyYXkgJiRtYXRjaGVzLCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogaW50CnsKJHJlc3VsdCA9IHNlbGY6OnByZWdNYXRjaCgkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzLCAkZmxhZ3MgfCBQUkVHX1VOTUFUQ0hFRF9BU19OVUxMIHwgUFJFR19PRkZTRVRfQ0FQVFVSRSwgJG9mZnNldCk7CmlmICgkcmVzdWx0ID09PSBmYWxzZSkgewp0aHJvdyBQY3JlRXhjZXB0aW9uOjpmcm9tRnVuY3Rpb24oJ3ByZWdfbWF0Y2gnLCAkcGF0dGVybik7Cn0KCnJldHVybiAkcmVzdWx0Owp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWF0Y2hBbGwoc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsID9hcnJheSAmJG1hdGNoZXMgPSBudWxsLCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogaW50CnsKc2VsZjo6Y2hlY2tPZmZzZXRDYXB0dXJlKCRmbGFncywgJ21hdGNoQWxsV2l0aE9mZnNldHMnKTsKc2VsZjo6Y2hlY2tTZXRPcmRlcigkZmxhZ3MpOwoKJHJlc3VsdCA9IHByZWdfbWF0Y2hfYWxsKCRwYXR0ZXJuLCAkc3ViamVjdCwgJG1hdGNoZXMsICRmbGFncyB8IFBSRUdfVU5NQVRDSEVEX0FTX05VTEwsICRvZmZzZXQpOwppZiAoIWlzX2ludCgkcmVzdWx0KSkgeyAKdGhyb3cgUGNyZUV4Y2VwdGlvbjo6ZnJvbUZ1bmN0aW9uKCdwcmVnX21hdGNoX2FsbCcsICRwYXR0ZXJuKTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYXRjaEFsbFN0cmljdEdyb3VwcyhzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgP2FycmF5ICYkbWF0Y2hlcyA9IG51bGwsIGludCAkZmxhZ3MgPSAwLCBpbnQgJG9mZnNldCA9IDApOiBpbnQKewokcmVzdWx0ID0gc2VsZjo6bWF0Y2hBbGwoJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlc0ludGVybmFsLCAkZmxhZ3MsICRvZmZzZXQpOwokbWF0Y2hlcyA9IHNlbGY6OmVuZm9yY2VOb25OdWxsTWF0Y2hBbGwoJHBhdHRlcm4sICRtYXRjaGVzSW50ZXJuYWwsICdtYXRjaEFsbCcpOwoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1hdGNoQWxsV2l0aE9mZnNldHMoc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsID9hcnJheSAmJG1hdGNoZXMsIGludCAkZmxhZ3MgPSAwLCBpbnQgJG9mZnNldCA9IDApOiBpbnQKewpzZWxmOjpjaGVja1NldE9yZGVyKCRmbGFncyk7CgokcmVzdWx0ID0gcHJlZ19tYXRjaF9hbGwoJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlcywgJGZsYWdzIHwgUFJFR19VTk1BVENIRURfQVNfTlVMTCB8IFBSRUdfT0ZGU0VUX0NBUFRVUkUsICRvZmZzZXQpOwppZiAoIWlzX2ludCgkcmVzdWx0KSkgeyAKdGhyb3cgUGNyZUV4Y2VwdGlvbjo6ZnJvbUZ1bmN0aW9uKCdwcmVnX21hdGNoX2FsbCcsICRwYXR0ZXJuKTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXBsYWNlKCRwYXR0ZXJuLCAkcmVwbGFjZW1lbnQsICRzdWJqZWN0LCBpbnQgJGxpbWl0ID0gLTEsID9pbnQgJiRjb3VudCA9IG51bGwpOiBzdHJpbmcKewppZiAoIWlzX3NjYWxhcigkc3ViamVjdCkpIHsKaWYgKGlzX2FycmF5KCRzdWJqZWN0KSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzdGF0aWM6OkFSUkFZX01TRyk7Cn0KCnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoc3RhdGljOjpJTlZBTElEX1RZUEVfTVNHLCBnZXR0eXBlKCRzdWJqZWN0KSkpOwp9CgokcmVzdWx0ID0gcHJlZ19yZXBsYWNlKCRwYXR0ZXJuLCAkcmVwbGFjZW1lbnQsICRzdWJqZWN0LCAkbGltaXQsICRjb3VudCk7CmlmICgkcmVzdWx0ID09PSBudWxsKSB7CnRocm93IFBjcmVFeGNlcHRpb246OmZyb21GdW5jdGlvbigncHJlZ19yZXBsYWNlJywgJHBhdHRlcm4pOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXBsYWNlQ2FsbGJhY2soJHBhdHRlcm4sIGNhbGxhYmxlICRyZXBsYWNlbWVudCwgJHN1YmplY3QsIGludCAkbGltaXQgPSAtMSwgP2ludCAmJGNvdW50ID0gbnVsbCwgaW50ICRmbGFncyA9IDApOiBzdHJpbmcKewppZiAoIWlzX3NjYWxhcigkc3ViamVjdCkpIHsKaWYgKGlzX2FycmF5KCRzdWJqZWN0KSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzdGF0aWM6OkFSUkFZX01TRyk7Cn0KCnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoc3RhdGljOjpJTlZBTElEX1RZUEVfTVNHLCBnZXR0eXBlKCRzdWJqZWN0KSkpOwp9CgppZiAoUEhQX1ZFUlNJT05fSUQgPj0gNzA0MDApIHsKJHJlc3VsdCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygkcGF0dGVybiwgJHJlcGxhY2VtZW50LCAkc3ViamVjdCwgJGxpbWl0LCAkY291bnQsICRmbGFncyk7Cn0gZWxzZSB7CiRyZXN1bHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJHBhdHRlcm4sICRyZXBsYWNlbWVudCwgJHN1YmplY3QsICRsaW1pdCwgJGNvdW50KTsKfQppZiAoJHJlc3VsdCA9PT0gbnVsbCkgewp0aHJvdyBQY3JlRXhjZXB0aW9uOjpmcm9tRnVuY3Rpb24oJ3ByZWdfcmVwbGFjZV9jYWxsYmFjaycsICRwYXR0ZXJuKTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXBsYWNlQ2FsbGJhY2tBcnJheShhcnJheSAkcGF0dGVybiwgJHN1YmplY3QsIGludCAkbGltaXQgPSAtMSwgP2ludCAmJGNvdW50ID0gbnVsbCwgaW50ICRmbGFncyA9IDApOiBzdHJpbmcKewppZiAoIWlzX3NjYWxhcigkc3ViamVjdCkpIHsKaWYgKGlzX2FycmF5KCRzdWJqZWN0KSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzdGF0aWM6OkFSUkFZX01TRyk7Cn0KCnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoc3RhdGljOjpJTlZBTElEX1RZUEVfTVNHLCBnZXR0eXBlKCRzdWJqZWN0KSkpOwp9CgppZiAoUEhQX1ZFUlNJT05fSUQgPj0gNzA0MDApIHsKJHJlc3VsdCA9IHByZWdfcmVwbGFjZV9jYWxsYmFja19hcnJheSgkcGF0dGVybiwgJHN1YmplY3QsICRsaW1pdCwgJGNvdW50LCAkZmxhZ3MpOwp9IGVsc2UgewokcmVzdWx0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrX2FycmF5KCRwYXR0ZXJuLCAkc3ViamVjdCwgJGxpbWl0LCAkY291bnQpOwp9CmlmICgkcmVzdWx0ID09PSBudWxsKSB7CiRwYXR0ZXJuID0gYXJyYXlfa2V5cygkcGF0dGVybik7CnRocm93IFBjcmVFeGNlcHRpb246OmZyb21GdW5jdGlvbigncHJlZ19yZXBsYWNlX2NhbGxiYWNrX2FycmF5JywgJHBhdHRlcm4pOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3BsaXQoc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsIGludCAkbGltaXQgPSAtMSwgaW50ICRmbGFncyA9IDApOiBhcnJheQp7CmlmICgoJGZsYWdzICYgUFJFR19TUExJVF9PRkZTRVRfQ0FQVFVSRSkgIT09IDApIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1BSRUdfU1BMSVRfT0ZGU0VUX0NBUFRVUkUgaXMgbm90IHN1cHBvcnRlZCBhcyBpdCBjaGFuZ2VzIHRoZSB0eXBlIG9mICRtYXRjaGVzLCB1c2Ugc3BsaXRXaXRoT2Zmc2V0cygpIGluc3RlYWQnKTsKfQoKJHJlc3VsdCA9IHByZWdfc3BsaXQoJHBhdHRlcm4sICRzdWJqZWN0LCAkbGltaXQsICRmbGFncyk7CmlmICgkcmVzdWx0ID09PSBmYWxzZSkgewp0aHJvdyBQY3JlRXhjZXB0aW9uOjpmcm9tRnVuY3Rpb24oJ3ByZWdfc3BsaXQnLCAkcGF0dGVybik7Cn0KCnJldHVybiAkcmVzdWx0Owp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3BsaXRXaXRoT2Zmc2V0cyhzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgaW50ICRsaW1pdCA9IC0xLCBpbnQgJGZsYWdzID0gMCk6IGFycmF5CnsKJHJlc3VsdCA9IHByZWdfc3BsaXQoJHBhdHRlcm4sICRzdWJqZWN0LCAkbGltaXQsICRmbGFncyB8IFBSRUdfU1BMSVRfT0ZGU0VUX0NBUFRVUkUpOwppZiAoJHJlc3VsdCA9PT0gZmFsc2UpIHsKdGhyb3cgUGNyZUV4Y2VwdGlvbjo6ZnJvbUZ1bmN0aW9uKCdwcmVnX3NwbGl0JywgJHBhdHRlcm4pOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ3JlcChzdHJpbmcgJHBhdHRlcm4sIGFycmF5ICRhcnJheSwgaW50ICRmbGFncyA9IDApOiBhcnJheQp7CiRyZXN1bHQgPSBwcmVnX2dyZXAoJHBhdHRlcm4sICRhcnJheSwgJGZsYWdzKTsKaWYgKCRyZXN1bHQgPT09IGZhbHNlKSB7CnRocm93IFBjcmVFeGNlcHRpb246OmZyb21GdW5jdGlvbigncHJlZ19ncmVwJywgJHBhdHRlcm4pOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc01hdGNoKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCA/YXJyYXkgJiRtYXRjaGVzID0gbnVsbCwgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IGJvb2wKewpyZXR1cm4gKGJvb2wpIHN0YXRpYzo6bWF0Y2goJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlcywgJGZsYWdzLCAkb2Zmc2V0KTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNNYXRjaFN0cmljdEdyb3VwcyhzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgP2FycmF5ICYkbWF0Y2hlcyA9IG51bGwsIGludCAkZmxhZ3MgPSAwLCBpbnQgJG9mZnNldCA9IDApOiBib29sCnsKcmV0dXJuIChib29sKSBzZWxmOjptYXRjaFN0cmljdEdyb3VwcygkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzLCAkZmxhZ3MsICRvZmZzZXQpOwp9CgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzTWF0Y2hBbGwoc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsID9hcnJheSAmJG1hdGNoZXMgPSBudWxsLCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogYm9vbAp7CnJldHVybiAoYm9vbCkgc3RhdGljOjptYXRjaEFsbCgkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzLCAkZmxhZ3MsICRvZmZzZXQpOwp9CgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzTWF0Y2hBbGxTdHJpY3RHcm91cHMoc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsID9hcnJheSAmJG1hdGNoZXMgPSBudWxsLCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogYm9vbAp7CnJldHVybiAoYm9vbCkgc2VsZjo6bWF0Y2hBbGxTdHJpY3RHcm91cHMoJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlcywgJGZsYWdzLCAkb2Zmc2V0KTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzTWF0Y2hXaXRoT2Zmc2V0cyhzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgP2FycmF5ICYkbWF0Y2hlcywgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IGJvb2wKewpyZXR1cm4gKGJvb2wpIHN0YXRpYzo6bWF0Y2hXaXRoT2Zmc2V0cygkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzLCAkZmxhZ3MsICRvZmZzZXQpOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNNYXRjaEFsbFdpdGhPZmZzZXRzKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCA/YXJyYXkgJiRtYXRjaGVzLCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogYm9vbAp7CnJldHVybiAoYm9vbCkgc3RhdGljOjptYXRjaEFsbFdpdGhPZmZzZXRzKCRwYXR0ZXJuLCAkc3ViamVjdCwgJG1hdGNoZXMsICRmbGFncywgJG9mZnNldCk7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNoZWNrT2Zmc2V0Q2FwdHVyZShpbnQgJGZsYWdzLCBzdHJpbmcgJHVzZUZ1bmN0aW9uTmFtZSk6IHZvaWQKewppZiAoKCRmbGFncyAmIFBSRUdfT0ZGU0VUX0NBUFRVUkUpICE9PSAwKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQUkVHX09GRlNFVF9DQVBUVVJFIGlzIG5vdCBzdXBwb3J0ZWQgYXMgaXQgY2hhbmdlcyB0aGUgdHlwZSBvZiAkbWF0Y2hlcywgdXNlICcgLiAkdXNlRnVuY3Rpb25OYW1lIC4gJygpIGluc3RlYWQnKTsKfQp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjaGVja1NldE9yZGVyKGludCAkZmxhZ3MpOiB2b2lkCnsKaWYgKCgkZmxhZ3MgJiBQUkVHX1NFVF9PUkRFUikgIT09IDApIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1BSRUdfU0VUX09SREVSIGlzIG5vdCBzdXBwb3J0ZWQgYXMgaXQgY2hhbmdlcyB0aGUgdHlwZSBvZiAkbWF0Y2hlcycpOwp9Cn0KCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZW5mb3JjZU5vbk51bGxNYXRjaGVzKHN0cmluZyAkcGF0dGVybiwgYXJyYXkgJG1hdGNoZXMsIHN0cmluZyAkdmFyaWFudE1ldGhvZCkKewpmb3JlYWNoICgkbWF0Y2hlcyBhcyAkZ3JvdXAgPT4gJG1hdGNoKSB7CmlmIChudWxsID09PSAkbWF0Y2gpIHsKdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsTWF0Y2hFeGNlcHRpb24oJ1BhdHRlcm4gIicuJHBhdHRlcm4uJyIgaGFkIGFuIHVuZXhwZWN0ZWQgdW5tYXRjaGVkIGdyb3VwICInLiRncm91cC4nIiwgbWFrZSBzdXJlIHRoZSBwYXR0ZXJuIGFsd2F5cyBtYXRjaGVzIG9yIHVzZSAnLiR2YXJpYW50TWV0aG9kLicoKSBpbnN0ZWFkLicpOwp9Cn0KCgpyZXR1cm4gJG1hdGNoZXM7Cn0KCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZW5mb3JjZU5vbk51bGxNYXRjaEFsbChzdHJpbmcgJHBhdHRlcm4sIGFycmF5ICRtYXRjaGVzLCBzdHJpbmcgJHZhcmlhbnRNZXRob2QpCnsKZm9yZWFjaCAoJG1hdGNoZXMgYXMgJGdyb3VwID0+ICRncm91cE1hdGNoZXMpIHsKZm9yZWFjaCAoJGdyb3VwTWF0Y2hlcyBhcyAkbWF0Y2gpIHsKaWYgKG51bGwgPT09ICRtYXRjaCkgewp0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxNYXRjaEV4Y2VwdGlvbignUGF0dGVybiAiJy4kcGF0dGVybi4nIiBoYWQgYW4gdW5leHBlY3RlZCB1bm1hdGNoZWQgZ3JvdXAgIicuJGdyb3VwLiciLCBtYWtlIHN1cmUgdGhlIHBhdHRlcm4gYWx3YXlzIG1hdGNoZXMgb3IgdXNlICcuJHZhcmlhbnRNZXRob2QuJygpIGluc3RlYWQuJyk7Cn0KfQp9CgoKcmV0dXJuICRtYXRjaGVzOwp9CgoKCgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHByZWdNYXRjaChzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgP2FycmF5ICYkbWF0Y2hlcyA9IG51bGwsIGludCAkZmxhZ3MgPSAwLCBpbnQgJG9mZnNldCA9IDApCnsKaWYgKFBIUF9WRVJTSU9OX0lEID49IDcwNDAwKSB7CnJldHVybiBwcmVnX21hdGNoKCRwYXR0ZXJuLCAkc3ViamVjdCwgJG1hdGNoZXMsICRmbGFncywgJG9mZnNldCk7Cn0KCgoKCgoKCgokcmVzdWx0ID0gcHJlZ19tYXRjaF9hbGwoJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlc0ludGVybmFsLCAkZmxhZ3MsICRvZmZzZXQpOwppZiAoIWlzX2ludCgkcmVzdWx0KSkgeyAKdGhyb3cgUGNyZUV4Y2VwdGlvbjo6ZnJvbUZ1bmN0aW9uKCdwcmVnX21hdGNoJywgJHBhdHRlcm4pOwp9CgppZiAoJHJlc3VsdCA9PT0gMCkgewokbWF0Y2hlcyA9IFtdOwp9IGVsc2UgewoKJG1hdGNoZXMgPSBhcnJheV9tYXAoZnVuY3Rpb24gKGFycmF5ICRtKSB7CiRmaXJzdCA9IHJlc2V0KCRtKTsKYXNzZXJ0KCRmaXJzdCAhPT0gZmFsc2UpOwpyZXR1cm4gJGZpcnN0Owp9LCAkbWF0Y2hlc0ludGVybmFsKTsKJHJlc3VsdCA9IG1pbigkcmVzdWx0LCAxKTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBjcmU7CgpjbGFzcyBSZWdleAp7CgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNNYXRjaChzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgaW50ICRvZmZzZXQgPSAwKTogYm9vbAp7CnJldHVybiAoYm9vbCkgUHJlZzo6bWF0Y2goJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlcywgMCwgJG9mZnNldCk7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1hdGNoKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogTWF0Y2hSZXN1bHQKewpzZWxmOjpjaGVja09mZnNldENhcHR1cmUoJGZsYWdzLCAnbWF0Y2hXaXRoT2Zmc2V0cycpOwoKJGNvdW50ID0gUHJlZzo6bWF0Y2goJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlcywgJGZsYWdzLCAkb2Zmc2V0KTsKCnJldHVybiBuZXcgTWF0Y2hSZXN1bHQoJGNvdW50LCAkbWF0Y2hlcyk7Cn0KCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1hdGNoU3RyaWN0R3JvdXBzKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogTWF0Y2hTdHJpY3RHcm91cHNSZXN1bHQKewoKJGNvdW50ID0gUHJlZzo6bWF0Y2hTdHJpY3RHcm91cHMoJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlcywgJGZsYWdzLCAkb2Zmc2V0KTsKCnJldHVybiBuZXcgTWF0Y2hTdHJpY3RHcm91cHNSZXN1bHQoJGNvdW50LCAkbWF0Y2hlcyk7Cn0KCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWF0Y2hXaXRoT2Zmc2V0cyhzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IE1hdGNoV2l0aE9mZnNldHNSZXN1bHQKewokY291bnQgPSBQcmVnOjptYXRjaFdpdGhPZmZzZXRzKCRwYXR0ZXJuLCAkc3ViamVjdCwgJG1hdGNoZXMsICRmbGFncywgJG9mZnNldCk7CgpyZXR1cm4gbmV3IE1hdGNoV2l0aE9mZnNldHNSZXN1bHQoJGNvdW50LCAkbWF0Y2hlcyk7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1hdGNoQWxsKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogTWF0Y2hBbGxSZXN1bHQKewpzZWxmOjpjaGVja09mZnNldENhcHR1cmUoJGZsYWdzLCAnbWF0Y2hBbGxXaXRoT2Zmc2V0cycpOwpzZWxmOjpjaGVja1NldE9yZGVyKCRmbGFncyk7CgokY291bnQgPSBQcmVnOjptYXRjaEFsbCgkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzLCAkZmxhZ3MsICRvZmZzZXQpOwoKcmV0dXJuIG5ldyBNYXRjaEFsbFJlc3VsdCgkY291bnQsICRtYXRjaGVzKTsKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWF0Y2hBbGxTdHJpY3RHcm91cHMoc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsIGludCAkZmxhZ3MgPSAwLCBpbnQgJG9mZnNldCA9IDApOiBNYXRjaEFsbFN0cmljdEdyb3Vwc1Jlc3VsdAp7CnNlbGY6OmNoZWNrT2Zmc2V0Q2FwdHVyZSgkZmxhZ3MsICdtYXRjaEFsbFdpdGhPZmZzZXRzJyk7CnNlbGY6OmNoZWNrU2V0T3JkZXIoJGZsYWdzKTsKCgokY291bnQgPSBQcmVnOjptYXRjaEFsbFN0cmljdEdyb3VwcygkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzLCAkZmxhZ3MsICRvZmZzZXQpOwoKcmV0dXJuIG5ldyBNYXRjaEFsbFN0cmljdEdyb3Vwc1Jlc3VsdCgkY291bnQsICRtYXRjaGVzKTsKfQoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYXRjaEFsbFdpdGhPZmZzZXRzKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogTWF0Y2hBbGxXaXRoT2Zmc2V0c1Jlc3VsdAp7CnNlbGY6OmNoZWNrU2V0T3JkZXIoJGZsYWdzKTsKCiRjb3VudCA9IFByZWc6Om1hdGNoQWxsV2l0aE9mZnNldHMoJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlcywgJGZsYWdzLCAkb2Zmc2V0KTsKCnJldHVybiBuZXcgTWF0Y2hBbGxXaXRoT2Zmc2V0c1Jlc3VsdCgkY291bnQsICRtYXRjaGVzKTsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVwbGFjZSgkcGF0dGVybiwgJHJlcGxhY2VtZW50LCAkc3ViamVjdCwgaW50ICRsaW1pdCA9IC0xKTogUmVwbGFjZVJlc3VsdAp7CiRyZXN1bHQgPSBQcmVnOjpyZXBsYWNlKCRwYXR0ZXJuLCAkcmVwbGFjZW1lbnQsICRzdWJqZWN0LCAkbGltaXQsICRjb3VudCk7CgpyZXR1cm4gbmV3IFJlcGxhY2VSZXN1bHQoJGNvdW50LCAkcmVzdWx0KTsKfQoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXBsYWNlQ2FsbGJhY2soJHBhdHRlcm4sIGNhbGxhYmxlICRyZXBsYWNlbWVudCwgJHN1YmplY3QsIGludCAkbGltaXQgPSAtMSwgaW50ICRmbGFncyA9IDApOiBSZXBsYWNlUmVzdWx0CnsKJHJlc3VsdCA9IFByZWc6OnJlcGxhY2VDYWxsYmFjaygkcGF0dGVybiwgJHJlcGxhY2VtZW50LCAkc3ViamVjdCwgJGxpbWl0LCAkY291bnQsICRmbGFncyk7CgpyZXR1cm4gbmV3IFJlcGxhY2VSZXN1bHQoJGNvdW50LCAkcmVzdWx0KTsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlcGxhY2VDYWxsYmFja0FycmF5KGFycmF5ICRwYXR0ZXJuLCAkc3ViamVjdCwgaW50ICRsaW1pdCA9IC0xLCBpbnQgJGZsYWdzID0gMCk6IFJlcGxhY2VSZXN1bHQKewokcmVzdWx0ID0gUHJlZzo6cmVwbGFjZUNhbGxiYWNrQXJyYXkoJHBhdHRlcm4sICRzdWJqZWN0LCAkbGltaXQsICRjb3VudCwgJGZsYWdzKTsKCnJldHVybiBuZXcgUmVwbGFjZVJlc3VsdCgkY291bnQsICRyZXN1bHQpOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjaGVja09mZnNldENhcHR1cmUoaW50ICRmbGFncywgc3RyaW5nICR1c2VGdW5jdGlvbk5hbWUpOiB2b2lkCnsKaWYgKCgkZmxhZ3MgJiBQUkVHX09GRlNFVF9DQVBUVVJFKSAhPT0gMCkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUFJFR19PRkZTRVRfQ0FQVFVSRSBpcyBub3Qgc3VwcG9ydGVkIGFzIGl0IGNoYW5nZXMgdGhlIHJldHVybiB0eXBlLCB1c2UgJy4kdXNlRnVuY3Rpb25OYW1lLicoKSBpbnN0ZWFkJyk7Cn0KfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gY2hlY2tTZXRPcmRlcihpbnQgJGZsYWdzKTogdm9pZAp7CmlmICgoJGZsYWdzICYgUFJFR19TRVRfT1JERVIpICE9PSAwKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQUkVHX1NFVF9PUkRFUiBpcyBub3Qgc3VwcG9ydGVkIGFzIGl0IGNoYW5nZXMgdGhlIHJldHVybiB0eXBlJyk7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGNyZTsKCmZpbmFsIGNsYXNzIFJlcGxhY2VSZXN1bHQKewoKCgoKcHVibGljICRyZXN1bHQ7CgoKCgoKcHVibGljICRjb3VudDsKCgoKCgpwdWJsaWMgJG1hdGNoZWQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoaW50ICRjb3VudCwgc3RyaW5nICRyZXN1bHQpCnsKJHRoaXMtPmNvdW50ID0gJGNvdW50OwokdGhpcy0+bWF0Y2hlZCA9IChib29sKSAkY291bnQ7CiR0aGlzLT5yZXN1bHQgPSAkcmVzdWx0Owp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQY3JlOwoKY2xhc3MgVW5leHBlY3RlZE51bGxNYXRjaEV4Y2VwdGlvbiBleHRlbmRzIFBjcmVFeGNlcHRpb24KewpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21GdW5jdGlvbigkZnVuY3Rpb24sICRwYXR0ZXJuKQp7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ2Zyb21GdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiAnLnNlbGY6OmNsYXNzLicsIHVzZSAnLlBjcmVFeGNlcHRpb246OmNsYXNzKTsKfQp9CgpDb3B5cmlnaHQgKEMpIDIwMTUgQ29tcG9zZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwp1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcwpvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8Kc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFNlbXZlcjsKCnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50OwoKY2xhc3MgQ29tcGFyYXRvcgp7CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBncmVhdGVyVGhhbigkdmVyc2lvbjEsICR2ZXJzaW9uMikKewpyZXR1cm4gc2VsZjo6Y29tcGFyZSgkdmVyc2lvbjEsICc+JywgJHZlcnNpb24yKTsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdyZWF0ZXJUaGFuT3JFcXVhbFRvKCR2ZXJzaW9uMSwgJHZlcnNpb24yKQp7CnJldHVybiBzZWxmOjpjb21wYXJlKCR2ZXJzaW9uMSwgJz49JywgJHZlcnNpb24yKTsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxlc3NUaGFuKCR2ZXJzaW9uMSwgJHZlcnNpb24yKQp7CnJldHVybiBzZWxmOjpjb21wYXJlKCR2ZXJzaW9uMSwgJzwnLCAkdmVyc2lvbjIpOwp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbGVzc1RoYW5PckVxdWFsVG8oJHZlcnNpb24xLCAkdmVyc2lvbjIpCnsKcmV0dXJuIHNlbGY6OmNvbXBhcmUoJHZlcnNpb24xLCAnPD0nLCAkdmVyc2lvbjIpOwp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZXF1YWxUbygkdmVyc2lvbjEsICR2ZXJzaW9uMikKewpyZXR1cm4gc2VsZjo6Y29tcGFyZSgkdmVyc2lvbjEsICc9PScsICR2ZXJzaW9uMik7Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBub3RFcXVhbFRvKCR2ZXJzaW9uMSwgJHZlcnNpb24yKQp7CnJldHVybiBzZWxmOjpjb21wYXJlKCR2ZXJzaW9uMSwgJyE9JywgJHZlcnNpb24yKTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNvbXBhcmUoJHZlcnNpb24xLCAkb3BlcmF0b3IsICR2ZXJzaW9uMikKewokY29uc3RyYWludCA9IG5ldyBDb25zdHJhaW50KCRvcGVyYXRvciwgJHZlcnNpb24yKTsKCnJldHVybiAkY29uc3RyYWludC0+bWF0Y2hTcGVjaWZpYyhuZXcgQ29uc3RyYWludCgnPT0nLCAkdmVyc2lvbjEpLCB0cnVlKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcU2VtdmVyOwoKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50SW50ZXJmYWNlOwoKCgoKY2xhc3MgQ29tcGlsaW5nTWF0Y2hlcgp7CgoKCgpwcml2YXRlIHN0YXRpYyAkY29tcGlsZWRDaGVja2VyQ2FjaGUgPSBhcnJheSgpOwoKCgoKcHJpdmF0ZSBzdGF0aWMgJHJlc3VsdENhY2hlID0gYXJyYXkoKTsKCgpwcml2YXRlIHN0YXRpYyAkZW5hYmxlZDsKCgoKCnByaXZhdGUgc3RhdGljICR0cmFuc09wSW50ID0gYXJyYXkoCkNvbnN0cmFpbnQ6Ok9QX0VRID0+IENvbnN0cmFpbnQ6OlNUUl9PUF9FUSwKQ29uc3RyYWludDo6T1BfTFQgPT4gQ29uc3RyYWludDo6U1RSX09QX0xULApDb25zdHJhaW50OjpPUF9MRSA9PiBDb25zdHJhaW50OjpTVFJfT1BfTEUsCkNvbnN0cmFpbnQ6Ok9QX0dUID0+IENvbnN0cmFpbnQ6OlNUUl9PUF9HVCwKQ29uc3RyYWludDo6T1BfR0UgPT4gQ29uc3RyYWludDo6U1RSX09QX0dFLApDb25zdHJhaW50OjpPUF9ORSA9PiBDb25zdHJhaW50OjpTVFJfT1BfTkUsCik7CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2xlYXIoKQp7CnNlbGY6OiRyZXN1bHRDYWNoZSA9IGFycmF5KCk7CnNlbGY6OiRjb21waWxlZENoZWNrZXJDYWNoZSA9IGFycmF5KCk7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1hdGNoKENvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQsICRvcGVyYXRvciwgJHZlcnNpb24pCnsKJHJlc3VsdENhY2hlS2V5ID0gJG9wZXJhdG9yLiRjb25zdHJhaW50Lic7Jy4kdmVyc2lvbjsKCmlmIChpc3NldChzZWxmOjokcmVzdWx0Q2FjaGVbJHJlc3VsdENhY2hlS2V5XSkpIHsKcmV0dXJuIHNlbGY6OiRyZXN1bHRDYWNoZVskcmVzdWx0Q2FjaGVLZXldOwp9CgppZiAoc2VsZjo6JGVuYWJsZWQgPT09IG51bGwpIHsKc2VsZjo6JGVuYWJsZWQgPSAhXGluX2FycmF5KCdldmFsJywgZXhwbG9kZSgnLCcsIChzdHJpbmcpIGluaV9nZXQoJ2Rpc2FibGVfZnVuY3Rpb25zJykpLCB0cnVlKTsKfQppZiAoIXNlbGY6OiRlbmFibGVkKSB7CnJldHVybiBzZWxmOjokcmVzdWx0Q2FjaGVbJHJlc3VsdENhY2hlS2V5XSA9ICRjb25zdHJhaW50LT5tYXRjaGVzKG5ldyBDb25zdHJhaW50KHNlbGY6OiR0cmFuc09wSW50WyRvcGVyYXRvcl0sICR2ZXJzaW9uKSk7Cn0KCiRjYWNoZUtleSA9ICRvcGVyYXRvci4kY29uc3RyYWludDsKaWYgKCFpc3NldChzZWxmOjokY29tcGlsZWRDaGVja2VyQ2FjaGVbJGNhY2hlS2V5XSkpIHsKJGNvZGUgPSAkY29uc3RyYWludC0+Y29tcGlsZSgkb3BlcmF0b3IpOwpzZWxmOjokY29tcGlsZWRDaGVja2VyQ2FjaGVbJGNhY2hlS2V5XSA9ICRmdW5jdGlvbiA9IGV2YWwoJ3JldHVybiBmdW5jdGlvbigkdiwgJGIpe3JldHVybiAnLiRjb2RlLic7fTsnKTsKfSBlbHNlIHsKJGZ1bmN0aW9uID0gc2VsZjo6JGNvbXBpbGVkQ2hlY2tlckNhY2hlWyRjYWNoZUtleV07Cn0KCnJldHVybiBzZWxmOjokcmVzdWx0Q2FjaGVbJHJlc3VsdENhY2hlS2V5XSA9ICRmdW5jdGlvbigkdmVyc2lvbiwgc3RycG9zKCR2ZXJzaW9uLCAnZGV2LScpID09PSAwKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnQ7CgpjbGFzcyBCb3VuZAp7CgoKCnByaXZhdGUgJHZlcnNpb247CgoKCgpwcml2YXRlICRpc0luY2x1c2l2ZTsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHZlcnNpb24sICRpc0luY2x1c2l2ZSkKewokdGhpcy0+dmVyc2lvbiA9ICR2ZXJzaW9uOwokdGhpcy0+aXNJbmNsdXNpdmUgPSAkaXNJbmNsdXNpdmU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRWZXJzaW9uKCkKewpyZXR1cm4gJHRoaXMtPnZlcnNpb247Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0luY2x1c2l2ZSgpCnsKcmV0dXJuICR0aGlzLT5pc0luY2x1c2l2ZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzWmVybygpCnsKcmV0dXJuICR0aGlzLT5nZXRWZXJzaW9uKCkgPT09ICcwLjAuMC4wLWRldicgJiYgJHRoaXMtPmlzSW5jbHVzaXZlKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1Bvc2l0aXZlSW5maW5pdHkoKQp7CnJldHVybiAkdGhpcy0+Z2V0VmVyc2lvbigpID09PSBQSFBfSU5UX01BWC4nLjAuMC4wJyAmJiAhJHRoaXMtPmlzSW5jbHVzaXZlKCk7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbXBhcmVUbyhCb3VuZCAkb3RoZXIsICRvcGVyYXRvcikKewppZiAoIVxpbl9hcnJheSgkb3BlcmF0b3IsIGFycmF5KCc8JywgJz4nKSwgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0RvZXMgbm90IHN1cHBvcnQgYW55IG90aGVyIG9wZXJhdG9yIG90aGVyIHRoYW4gPiBvciA8LicpOwp9CgoKaWYgKCR0aGlzID09ICRvdGhlcikgewpyZXR1cm4gZmFsc2U7Cn0KCiRjb21wYXJlUmVzdWx0ID0gdmVyc2lvbl9jb21wYXJlKCR0aGlzLT5nZXRWZXJzaW9uKCksICRvdGhlci0+Z2V0VmVyc2lvbigpKTsKCgppZiAoMCAhPT0gJGNvbXBhcmVSZXN1bHQpIHsKcmV0dXJuICgoJz4nID09PSAkb3BlcmF0b3IpID8gMSA6IC0xKSA9PT0gJGNvbXBhcmVSZXN1bHQ7Cn0KCgpyZXR1cm4gJz4nID09PSAkb3BlcmF0b3IgPyAkb3RoZXItPmlzSW5jbHVzaXZlKCkgOiAhJG90aGVyLT5pc0luY2x1c2l2ZSgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpCnsKcmV0dXJuIHNwcmludGYoCiclcyBbJXNdJywKJHRoaXMtPmdldFZlcnNpb24oKSwKJHRoaXMtPmlzSW5jbHVzaXZlKCkgPyAnaW5jbHVzaXZlJyA6ICdleGNsdXNpdmUnCik7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gemVybygpCnsKcmV0dXJuIG5ldyBCb3VuZCgnMC4wLjAuMC1kZXYnLCB0cnVlKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwb3NpdGl2ZUluZmluaXR5KCkKewpyZXR1cm4gbmV3IEJvdW5kKFBIUF9JTlRfTUFYLicuMC4wLjAnLCBmYWxzZSk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50OwoKCgoKY2xhc3MgQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewoKY29uc3QgT1BfRVEgPSAwOwpjb25zdCBPUF9MVCA9IDE7CmNvbnN0IE9QX0xFID0gMjsKY29uc3QgT1BfR1QgPSAzOwpjb25zdCBPUF9HRSA9IDQ7CmNvbnN0IE9QX05FID0gNTsKCgpjb25zdCBTVFJfT1BfRVEgPSAnPT0nOwpjb25zdCBTVFJfT1BfRVFfQUxUID0gJz0nOwpjb25zdCBTVFJfT1BfTFQgPSAnPCc7CmNvbnN0IFNUUl9PUF9MRSA9ICc8PSc7CmNvbnN0IFNUUl9PUF9HVCA9ICc+JzsKY29uc3QgU1RSX09QX0dFID0gJz49JzsKY29uc3QgU1RSX09QX05FID0gJyE9JzsKY29uc3QgU1RSX09QX05FX0FMVCA9ICc8Pic7CgoKCgoKCgpwcml2YXRlIHN0YXRpYyAkdHJhbnNPcFN0ciA9IGFycmF5KAonPScgPT4gc2VsZjo6T1BfRVEsCic9PScgPT4gc2VsZjo6T1BfRVEsCic8JyA9PiBzZWxmOjpPUF9MVCwKJzw9JyA9PiBzZWxmOjpPUF9MRSwKJz4nID0+IHNlbGY6Ok9QX0dULAonPj0nID0+IHNlbGY6Ok9QX0dFLAonPD4nID0+IHNlbGY6Ok9QX05FLAonIT0nID0+IHNlbGY6Ok9QX05FLAopOwoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgJHRyYW5zT3BJbnQgPSBhcnJheSgKc2VsZjo6T1BfRVEgPT4gJz09JywKc2VsZjo6T1BfTFQgPT4gJzwnLApzZWxmOjpPUF9MRSA9PiAnPD0nLApzZWxmOjpPUF9HVCA9PiAnPicsCnNlbGY6Ok9QX0dFID0+ICc+PScsCnNlbGY6Ok9QX05FID0+ICchPScsCik7CgoKCgoKcHJvdGVjdGVkICRvcGVyYXRvcjsKCgpwcm90ZWN0ZWQgJHZlcnNpb247CgoKcHJvdGVjdGVkICRwcmV0dHlTdHJpbmc7CgoKcHJvdGVjdGVkICRsb3dlckJvdW5kOwoKCnByb3RlY3RlZCAkdXBwZXJCb3VuZDsKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG9wZXJhdG9yLCAkdmVyc2lvbikKewppZiAoIWlzc2V0KHNlbGY6OiR0cmFuc09wU3RyWyRvcGVyYXRvcl0pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoCidJbnZhbGlkIG9wZXJhdG9yICIlcyIgZ2l2ZW4sIGV4cGVjdGVkIG9uZSBvZjogJXMnLAokb3BlcmF0b3IsCmltcGxvZGUoJywgJywgc2VsZjo6Z2V0U3VwcG9ydGVkT3BlcmF0b3JzKCkpCikpOwp9CgokdGhpcy0+b3BlcmF0b3IgPSBzZWxmOjokdHJhbnNPcFN0clskb3BlcmF0b3JdOwokdGhpcy0+dmVyc2lvbiA9ICR2ZXJzaW9uOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmVyc2lvbigpCnsKcmV0dXJuICR0aGlzLT52ZXJzaW9uOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPcGVyYXRvcigpCnsKcmV0dXJuIHNlbGY6OiR0cmFuc09wSW50WyR0aGlzLT5vcGVyYXRvcl07Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIG1hdGNoZXMoQ29uc3RyYWludEludGVyZmFjZSAkcHJvdmlkZXIpCnsKaWYgKCRwcm92aWRlciBpbnN0YW5jZW9mIHNlbGYpIHsKcmV0dXJuICR0aGlzLT5tYXRjaFNwZWNpZmljKCRwcm92aWRlcik7Cn0KCgpyZXR1cm4gJHByb3ZpZGVyLT5tYXRjaGVzKCR0aGlzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByZXR0eVN0cmluZygkcHJldHR5U3RyaW5nKQp7CiR0aGlzLT5wcmV0dHlTdHJpbmcgPSAkcHJldHR5U3RyaW5nOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJldHR5U3RyaW5nKCkKewppZiAoJHRoaXMtPnByZXR0eVN0cmluZykgewpyZXR1cm4gJHRoaXMtPnByZXR0eVN0cmluZzsKfQoKcmV0dXJuICR0aGlzLT5fX3RvU3RyaW5nKCk7Cn0KCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFN1cHBvcnRlZE9wZXJhdG9ycygpCnsKcmV0dXJuIGFycmF5X2tleXMoc2VsZjo6JHRyYW5zT3BTdHIpOwp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRPcGVyYXRvckNvbnN0YW50KCRvcGVyYXRvcikKewpyZXR1cm4gc2VsZjo6JHRyYW5zT3BTdHJbJG9wZXJhdG9yXTsKfQoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHZlcnNpb25Db21wYXJlKCRhLCAkYiwgJG9wZXJhdG9yLCAkY29tcGFyZUJyYW5jaGVzID0gZmFsc2UpCnsKaWYgKCFpc3NldChzZWxmOjokdHJhbnNPcFN0clskb3BlcmF0b3JdKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKAonSW52YWxpZCBvcGVyYXRvciAiJXMiIGdpdmVuLCBleHBlY3RlZCBvbmUgb2Y6ICVzJywKJG9wZXJhdG9yLAppbXBsb2RlKCcsICcsIHNlbGY6OmdldFN1cHBvcnRlZE9wZXJhdG9ycygpKQopKTsKfQoKJGFJc0JyYW5jaCA9IHN0cnBvcygkYSwgJ2Rldi0nKSA9PT0gMDsKJGJJc0JyYW5jaCA9IHN0cnBvcygkYiwgJ2Rldi0nKSA9PT0gMDsKCmlmICgkb3BlcmF0b3IgPT09ICchPScgJiYgKCRhSXNCcmFuY2ggfHwgJGJJc0JyYW5jaCkpIHsKcmV0dXJuICRhICE9PSAkYjsKfQoKaWYgKCRhSXNCcmFuY2ggJiYgJGJJc0JyYW5jaCkgewpyZXR1cm4gJG9wZXJhdG9yID09PSAnPT0nICYmICRhID09PSAkYjsKfQoKCmlmICghJGNvbXBhcmVCcmFuY2hlcyAmJiAoJGFJc0JyYW5jaCB8fCAkYklzQnJhbmNoKSkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiBcdmVyc2lvbl9jb21wYXJlKCRhLCAkYiwgJG9wZXJhdG9yKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbXBpbGUoJG90aGVyT3BlcmF0b3IpCnsKaWYgKHN0cnBvcygkdGhpcy0+dmVyc2lvbiwgJ2Rldi0nKSA9PT0gMCkgewppZiAoc2VsZjo6T1BfRVEgPT09ICR0aGlzLT5vcGVyYXRvcikgewppZiAoc2VsZjo6T1BfRVEgPT09ICRvdGhlck9wZXJhdG9yKSB7CnJldHVybiBzcHJpbnRmKCckYiAmJiAkdiA9PT0gJXMnLCBcdmFyX2V4cG9ydCgkdGhpcy0+dmVyc2lvbiwgdHJ1ZSkpOwp9CmlmIChzZWxmOjpPUF9ORSA9PT0gJG90aGVyT3BlcmF0b3IpIHsKcmV0dXJuIHNwcmludGYoJyEkYiB8fCAkdiAhPT0gJXMnLCBcdmFyX2V4cG9ydCgkdGhpcy0+dmVyc2lvbiwgdHJ1ZSkpOwp9CnJldHVybiAnZmFsc2UnOwp9CgppZiAoc2VsZjo6T1BfTkUgPT09ICR0aGlzLT5vcGVyYXRvcikgewppZiAoc2VsZjo6T1BfRVEgPT09ICRvdGhlck9wZXJhdG9yKSB7CnJldHVybiBzcHJpbnRmKCchJGIgfHwgJHYgIT09ICVzJywgXHZhcl9leHBvcnQoJHRoaXMtPnZlcnNpb24sIHRydWUpKTsKfQppZiAoc2VsZjo6T1BfTkUgPT09ICRvdGhlck9wZXJhdG9yKSB7CnJldHVybiAndHJ1ZSc7Cn0KcmV0dXJuICchJGInOwp9CgpyZXR1cm4gJ2ZhbHNlJzsKfQoKaWYgKHNlbGY6Ok9QX0VRID09PSAkdGhpcy0+b3BlcmF0b3IpIHsKaWYgKHNlbGY6Ok9QX0VRID09PSAkb3RoZXJPcGVyYXRvcikgewpyZXR1cm4gc3ByaW50ZignXHZlcnNpb25fY29tcGFyZSgkdiwgJXMsIFwnPT1cJyknLCBcdmFyX2V4cG9ydCgkdGhpcy0+dmVyc2lvbiwgdHJ1ZSkpOwp9CmlmIChzZWxmOjpPUF9ORSA9PT0gJG90aGVyT3BlcmF0b3IpIHsKcmV0dXJuIHNwcmludGYoJyRiIHx8IFx2ZXJzaW9uX2NvbXBhcmUoJHYsICVzLCBcJyE9XCcpJywgXHZhcl9leHBvcnQoJHRoaXMtPnZlcnNpb24sIHRydWUpKTsKfQoKcmV0dXJuIHNwcmludGYoJyEkYiAmJiBcdmVyc2lvbl9jb21wYXJlKCVzLCAkdiwgXCclc1wnKScsIFx2YXJfZXhwb3J0KCR0aGlzLT52ZXJzaW9uLCB0cnVlKSwgc2VsZjo6JHRyYW5zT3BJbnRbJG90aGVyT3BlcmF0b3JdKTsKfQoKaWYgKHNlbGY6Ok9QX05FID09PSAkdGhpcy0+b3BlcmF0b3IpIHsKaWYgKHNlbGY6Ok9QX0VRID09PSAkb3RoZXJPcGVyYXRvcikgewpyZXR1cm4gc3ByaW50ZignJGIgfHwgKCEkYiAmJiBcdmVyc2lvbl9jb21wYXJlKCR2LCAlcywgXCchPVwnKSknLCBcdmFyX2V4cG9ydCgkdGhpcy0+dmVyc2lvbiwgdHJ1ZSkpOwp9CgppZiAoc2VsZjo6T1BfTkUgPT09ICRvdGhlck9wZXJhdG9yKSB7CnJldHVybiAndHJ1ZSc7Cn0KcmV0dXJuICchJGInOwp9CgppZiAoc2VsZjo6T1BfTFQgPT09ICR0aGlzLT5vcGVyYXRvciB8fCBzZWxmOjpPUF9MRSA9PT0gJHRoaXMtPm9wZXJhdG9yKSB7CmlmIChzZWxmOjpPUF9MVCA9PT0gJG90aGVyT3BlcmF0b3IgfHwgc2VsZjo6T1BfTEUgPT09ICRvdGhlck9wZXJhdG9yKSB7CnJldHVybiAnISRiJzsKfQp9IGVsc2UgeyAKaWYgKHNlbGY6Ok9QX0dUID09PSAkb3RoZXJPcGVyYXRvciB8fCBzZWxmOjpPUF9HRSA9PT0gJG90aGVyT3BlcmF0b3IpIHsKcmV0dXJuICchJGInOwp9Cn0KCmlmIChzZWxmOjpPUF9ORSA9PT0gJG90aGVyT3BlcmF0b3IpIHsKcmV0dXJuICd0cnVlJzsKfQoKJGNvZGVDb21wYXJpc29uID0gc3ByaW50ZignXHZlcnNpb25fY29tcGFyZSgkdiwgJXMsIFwnJXNcJyknLCBcdmFyX2V4cG9ydCgkdGhpcy0+dmVyc2lvbiwgdHJ1ZSksIHNlbGY6OiR0cmFuc09wSW50WyR0aGlzLT5vcGVyYXRvcl0pOwppZiAoJHRoaXMtPm9wZXJhdG9yID09PSBzZWxmOjpPUF9MRSkgewppZiAoJG90aGVyT3BlcmF0b3IgPT09IHNlbGY6Ok9QX0dUKSB7CnJldHVybiBzcHJpbnRmKCchJGIgJiYgXHZlcnNpb25fY29tcGFyZSgkdiwgJXMsIFwnIT1cJykgJiYgJywgXHZhcl9leHBvcnQoJHRoaXMtPnZlcnNpb24sIHRydWUpKSAuICRjb2RlQ29tcGFyaXNvbjsKfQp9IGVsc2VpZiAoJHRoaXMtPm9wZXJhdG9yID09PSBzZWxmOjpPUF9HRSkgewppZiAoJG90aGVyT3BlcmF0b3IgPT09IHNlbGY6Ok9QX0xUKSB7CnJldHVybiBzcHJpbnRmKCchJGIgJiYgXHZlcnNpb25fY29tcGFyZSgkdiwgJXMsIFwnIT1cJykgJiYgJywgXHZhcl9leHBvcnQoJHRoaXMtPnZlcnNpb24sIHRydWUpKSAuICRjb2RlQ29tcGFyaXNvbjsKfQp9CgpyZXR1cm4gc3ByaW50ZignISRiICYmICVzJywgJGNvZGVDb21wYXJpc29uKTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG1hdGNoU3BlY2lmaWMoQ29uc3RyYWludCAkcHJvdmlkZXIsICRjb21wYXJlQnJhbmNoZXMgPSBmYWxzZSkKewokbm9FcXVhbE9wID0gc3RyX3JlcGxhY2UoJz0nLCAnJywgc2VsZjo6JHRyYW5zT3BJbnRbJHRoaXMtPm9wZXJhdG9yXSk7CiRwcm92aWRlck5vRXF1YWxPcCA9IHN0cl9yZXBsYWNlKCc9JywgJycsIHNlbGY6OiR0cmFuc09wSW50WyRwcm92aWRlci0+b3BlcmF0b3JdKTsKCiRpc0VxdWFsT3AgPSBzZWxmOjpPUF9FUSA9PT0gJHRoaXMtPm9wZXJhdG9yOwokaXNOb25FcXVhbE9wID0gc2VsZjo6T1BfTkUgPT09ICR0aGlzLT5vcGVyYXRvcjsKJGlzUHJvdmlkZXJFcXVhbE9wID0gc2VsZjo6T1BfRVEgPT09ICRwcm92aWRlci0+b3BlcmF0b3I7CiRpc1Byb3ZpZGVyTm9uRXF1YWxPcCA9IHNlbGY6Ok9QX05FID09PSAkcHJvdmlkZXItPm9wZXJhdG9yOwoKCgppZiAoJGlzTm9uRXF1YWxPcCB8fCAkaXNQcm92aWRlck5vbkVxdWFsT3ApIHsKaWYgKCRpc05vbkVxdWFsT3AgJiYgISRpc1Byb3ZpZGVyTm9uRXF1YWxPcCAmJiAhJGlzUHJvdmlkZXJFcXVhbE9wICYmIHN0cnBvcygkcHJvdmlkZXItPnZlcnNpb24sICdkZXYtJykgPT09IDApIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoJGlzUHJvdmlkZXJOb25FcXVhbE9wICYmICEkaXNOb25FcXVhbE9wICYmICEkaXNFcXVhbE9wICYmIHN0cnBvcygkdGhpcy0+dmVyc2lvbiwgJ2Rldi0nKSA9PT0gMCkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICghJGlzRXF1YWxPcCAmJiAhJGlzUHJvdmlkZXJFcXVhbE9wKSB7CnJldHVybiB0cnVlOwp9CnJldHVybiAkdGhpcy0+dmVyc2lvbkNvbXBhcmUoJHByb3ZpZGVyLT52ZXJzaW9uLCAkdGhpcy0+dmVyc2lvbiwgJyE9JywgJGNvbXBhcmVCcmFuY2hlcyk7Cn0KCgoKaWYgKCR0aGlzLT5vcGVyYXRvciAhPT0gc2VsZjo6T1BfRVEgJiYgJG5vRXF1YWxPcCA9PT0gJHByb3ZpZGVyTm9FcXVhbE9wKSB7CnJldHVybiAhKHN0cnBvcygkdGhpcy0+dmVyc2lvbiwgJ2Rldi0nKSA9PT0gMCB8fCBzdHJwb3MoJHByb3ZpZGVyLT52ZXJzaW9uLCAnZGV2LScpID09PSAwKTsKfQoKJHZlcnNpb24xID0gJGlzRXF1YWxPcCA/ICR0aGlzLT52ZXJzaW9uIDogJHByb3ZpZGVyLT52ZXJzaW9uOwokdmVyc2lvbjIgPSAkaXNFcXVhbE9wID8gJHByb3ZpZGVyLT52ZXJzaW9uIDogJHRoaXMtPnZlcnNpb247CiRvcGVyYXRvciA9ICRpc0VxdWFsT3AgPyAkcHJvdmlkZXItPm9wZXJhdG9yIDogJHRoaXMtPm9wZXJhdG9yOwoKaWYgKCR0aGlzLT52ZXJzaW9uQ29tcGFyZSgkdmVyc2lvbjEsICR2ZXJzaW9uMiwgc2VsZjo6JHRyYW5zT3BJbnRbJG9wZXJhdG9yXSwgJGNvbXBhcmVCcmFuY2hlcykpIHsKCgoKcmV0dXJuICEoc2VsZjo6JHRyYW5zT3BJbnRbJHByb3ZpZGVyLT5vcGVyYXRvcl0gPT09ICRwcm92aWRlck5vRXF1YWxPcAomJiBzZWxmOjokdHJhbnNPcEludFskdGhpcy0+b3BlcmF0b3JdICE9PSAkbm9FcXVhbE9wCiYmIFx2ZXJzaW9uX2NvbXBhcmUoJHByb3ZpZGVyLT52ZXJzaW9uLCAkdGhpcy0+dmVyc2lvbiwgJz09JykpOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCkKewpyZXR1cm4gc2VsZjo6JHRyYW5zT3BJbnRbJHRoaXMtPm9wZXJhdG9yXSAuICcgJyAuICR0aGlzLT52ZXJzaW9uOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG93ZXJCb3VuZCgpCnsKJHRoaXMtPmV4dHJhY3RCb3VuZHMoKTsKCnJldHVybiAkdGhpcy0+bG93ZXJCb3VuZDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVwcGVyQm91bmQoKQp7CiR0aGlzLT5leHRyYWN0Qm91bmRzKCk7CgpyZXR1cm4gJHRoaXMtPnVwcGVyQm91bmQ7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZXh0cmFjdEJvdW5kcygpCnsKaWYgKG51bGwgIT09ICR0aGlzLT5sb3dlckJvdW5kKSB7CnJldHVybjsKfQoKCmlmIChzdHJwb3MoJHRoaXMtPnZlcnNpb24sICdkZXYtJykgPT09IDApIHsKJHRoaXMtPmxvd2VyQm91bmQgPSBCb3VuZDo6emVybygpOwokdGhpcy0+dXBwZXJCb3VuZCA9IEJvdW5kOjpwb3NpdGl2ZUluZmluaXR5KCk7CgpyZXR1cm47Cn0KCnN3aXRjaCAoJHRoaXMtPm9wZXJhdG9yKSB7CmNhc2Ugc2VsZjo6T1BfRVE6CiR0aGlzLT5sb3dlckJvdW5kID0gbmV3IEJvdW5kKCR0aGlzLT52ZXJzaW9uLCB0cnVlKTsKJHRoaXMtPnVwcGVyQm91bmQgPSBuZXcgQm91bmQoJHRoaXMtPnZlcnNpb24sIHRydWUpOwpicmVhazsKY2FzZSBzZWxmOjpPUF9MVDoKJHRoaXMtPmxvd2VyQm91bmQgPSBCb3VuZDo6emVybygpOwokdGhpcy0+dXBwZXJCb3VuZCA9IG5ldyBCb3VuZCgkdGhpcy0+dmVyc2lvbiwgZmFsc2UpOwpicmVhazsKY2FzZSBzZWxmOjpPUF9MRToKJHRoaXMtPmxvd2VyQm91bmQgPSBCb3VuZDo6emVybygpOwokdGhpcy0+dXBwZXJCb3VuZCA9IG5ldyBCb3VuZCgkdGhpcy0+dmVyc2lvbiwgdHJ1ZSk7CmJyZWFrOwpjYXNlIHNlbGY6Ok9QX0dUOgokdGhpcy0+bG93ZXJCb3VuZCA9IG5ldyBCb3VuZCgkdGhpcy0+dmVyc2lvbiwgZmFsc2UpOwokdGhpcy0+dXBwZXJCb3VuZCA9IEJvdW5kOjpwb3NpdGl2ZUluZmluaXR5KCk7CmJyZWFrOwpjYXNlIHNlbGY6Ok9QX0dFOgokdGhpcy0+bG93ZXJCb3VuZCA9IG5ldyBCb3VuZCgkdGhpcy0+dmVyc2lvbiwgdHJ1ZSk7CiR0aGlzLT51cHBlckJvdW5kID0gQm91bmQ6OnBvc2l0aXZlSW5maW5pdHkoKTsKYnJlYWs7CmNhc2Ugc2VsZjo6T1BfTkU6CiR0aGlzLT5sb3dlckJvdW5kID0gQm91bmQ6Onplcm8oKTsKJHRoaXMtPnVwcGVyQm91bmQgPSBCb3VuZDo6cG9zaXRpdmVJbmZpbml0eSgpOwpicmVhazsKfQp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludDsKCgoKCgoKCmludGVyZmFjZSBDb25zdHJhaW50SW50ZXJmYWNlCnsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBtYXRjaGVzKENvbnN0cmFpbnRJbnRlcmZhY2UgJHByb3ZpZGVyKTsKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29tcGlsZSgkb3RoZXJPcGVyYXRvcik7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXBwZXJCb3VuZCgpOwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExvd2VyQm91bmQoKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmV0dHlTdHJpbmcoKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByZXR0eVN0cmluZygkcHJldHR5U3RyaW5nKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludDsKCgoKCgoKY2xhc3MgTWF0Y2hBbGxDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7Cgpwcm90ZWN0ZWQgJHByZXR0eVN0cmluZzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG1hdGNoZXMoQ29uc3RyYWludEludGVyZmFjZSAkcHJvdmlkZXIpCnsKcmV0dXJuIHRydWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb21waWxlKCRvdGhlck9wZXJhdG9yKQp7CnJldHVybiAndHJ1ZSc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQcmV0dHlTdHJpbmcoJHByZXR0eVN0cmluZykKewokdGhpcy0+cHJldHR5U3RyaW5nID0gJHByZXR0eVN0cmluZzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByZXR0eVN0cmluZygpCnsKaWYgKCR0aGlzLT5wcmV0dHlTdHJpbmcpIHsKcmV0dXJuICR0aGlzLT5wcmV0dHlTdHJpbmc7Cn0KCnJldHVybiAoc3RyaW5nKSAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKQp7CnJldHVybiAnKic7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVcHBlckJvdW5kKCkKewpyZXR1cm4gQm91bmQ6OnBvc2l0aXZlSW5maW5pdHkoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExvd2VyQm91bmQoKQp7CnJldHVybiBCb3VuZDo6emVybygpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludDsKCgoKCmNsYXNzIE1hdGNoTm9uZUNvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKCnByb3RlY3RlZCAkcHJldHR5U3RyaW5nOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbWF0Y2hlcyhDb25zdHJhaW50SW50ZXJmYWNlICRwcm92aWRlcikKewpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb21waWxlKCRvdGhlck9wZXJhdG9yKQp7CnJldHVybiAnZmFsc2UnOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJldHR5U3RyaW5nKCRwcmV0dHlTdHJpbmcpCnsKJHRoaXMtPnByZXR0eVN0cmluZyA9ICRwcmV0dHlTdHJpbmc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmV0dHlTdHJpbmcoKQp7CmlmICgkdGhpcy0+cHJldHR5U3RyaW5nKSB7CnJldHVybiAkdGhpcy0+cHJldHR5U3RyaW5nOwp9CgpyZXR1cm4gKHN0cmluZykgJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCkKewpyZXR1cm4gJ1tdJzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVwcGVyQm91bmQoKQp7CnJldHVybiBuZXcgQm91bmQoJzAuMC4wLjAtZGV2JywgZmFsc2UpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG93ZXJCb3VuZCgpCnsKcmV0dXJuIG5ldyBCb3VuZCgnMC4wLjAuMC1kZXYnLCBmYWxzZSk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50OwoKCgoKY2xhc3MgTXVsdGlDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CgoKCgpwcm90ZWN0ZWQgJGNvbnN0cmFpbnRzOwoKCnByb3RlY3RlZCAkcHJldHR5U3RyaW5nOwoKCnByb3RlY3RlZCAkc3RyaW5nOwoKCnByb3RlY3RlZCAkY29uanVuY3RpdmU7CgoKcHJvdGVjdGVkICRsb3dlckJvdW5kOwoKCnByb3RlY3RlZCAkdXBwZXJCb3VuZDsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkY29uc3RyYWludHMsICRjb25qdW5jdGl2ZSA9IHRydWUpCnsKaWYgKFxjb3VudCgkY29uc3RyYWludHMpIDwgMikgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigKJ011c3QgcHJvdmlkZSBhdCBsZWFzdCB0d28gY29uc3RyYWludHMgZm9yIGEgTXVsdGlDb25zdHJhaW50LiBVc2UgJy4KJ3RoZSByZWd1bGFyIENvbnN0cmFpbnQgY2xhc3MgZm9yIG9uZSBjb25zdHJhaW50IG9ubHkgb3IgTWF0Y2hBbGxDb25zdHJhaW50IGZvciBub25lLiBZb3UgbWF5IHVzZSAnLgonTXVsdGlDb25zdHJhaW50OjpjcmVhdGUoKSB3aGljaCBvcHRpbWl6ZXMgYW5kIGhhbmRsZXMgdGhvc2UgY2FzZXMgYXV0b21hdGljYWxseS4nCik7Cn0KCiR0aGlzLT5jb25zdHJhaW50cyA9ICRjb25zdHJhaW50czsKJHRoaXMtPmNvbmp1bmN0aXZlID0gJGNvbmp1bmN0aXZlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29uc3RyYWludHMoKQp7CnJldHVybiAkdGhpcy0+Y29uc3RyYWludHM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0Nvbmp1bmN0aXZlKCkKewpyZXR1cm4gJHRoaXMtPmNvbmp1bmN0aXZlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEaXNqdW5jdGl2ZSgpCnsKcmV0dXJuICEkdGhpcy0+Y29uanVuY3RpdmU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb21waWxlKCRvdGhlck9wZXJhdG9yKQp7CiRwYXJ0cyA9IGFycmF5KCk7CmZvcmVhY2ggKCR0aGlzLT5jb25zdHJhaW50cyBhcyAkY29uc3RyYWludCkgewokY29kZSA9ICRjb25zdHJhaW50LT5jb21waWxlKCRvdGhlck9wZXJhdG9yKTsKaWYgKCRjb2RlID09PSAndHJ1ZScpIHsKaWYgKCEkdGhpcy0+Y29uanVuY3RpdmUpIHsKcmV0dXJuICd0cnVlJzsKfQp9IGVsc2VpZiAoJGNvZGUgPT09ICdmYWxzZScpIHsKaWYgKCR0aGlzLT5jb25qdW5jdGl2ZSkgewpyZXR1cm4gJ2ZhbHNlJzsKfQp9IGVsc2UgewokcGFydHNbXSA9ICcoJy4kY29kZS4nKSc7Cn0KfQoKaWYgKCEkcGFydHMpIHsKcmV0dXJuICR0aGlzLT5jb25qdW5jdGl2ZSA/ICd0cnVlJyA6ICdmYWxzZSc7Cn0KCnJldHVybiAkdGhpcy0+Y29uanVuY3RpdmUgPyBpbXBsb2RlKCcmJicsICRwYXJ0cykgOiBpbXBsb2RlKCd8fCcsICRwYXJ0cyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIG1hdGNoZXMoQ29uc3RyYWludEludGVyZmFjZSAkcHJvdmlkZXIpCnsKaWYgKGZhbHNlID09PSAkdGhpcy0+Y29uanVuY3RpdmUpIHsKZm9yZWFjaCAoJHRoaXMtPmNvbnN0cmFpbnRzIGFzICRjb25zdHJhaW50KSB7CmlmICgkcHJvdmlkZXItPm1hdGNoZXMoJGNvbnN0cmFpbnQpKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKaWYgKCRwcm92aWRlciBpbnN0YW5jZW9mIE11bHRpQ29uc3RyYWludCAmJiAkcHJvdmlkZXItPmlzRGlzanVuY3RpdmUoKSkgewpyZXR1cm4gJHByb3ZpZGVyLT5tYXRjaGVzKCR0aGlzKTsKfQoKZm9yZWFjaCAoJHRoaXMtPmNvbnN0cmFpbnRzIGFzICRjb25zdHJhaW50KSB7CmlmICghJHByb3ZpZGVyLT5tYXRjaGVzKCRjb25zdHJhaW50KSkgewpyZXR1cm4gZmFsc2U7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQcmV0dHlTdHJpbmcoJHByZXR0eVN0cmluZykKewokdGhpcy0+cHJldHR5U3RyaW5nID0gJHByZXR0eVN0cmluZzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByZXR0eVN0cmluZygpCnsKaWYgKCR0aGlzLT5wcmV0dHlTdHJpbmcpIHsKcmV0dXJuICR0aGlzLT5wcmV0dHlTdHJpbmc7Cn0KCnJldHVybiAoc3RyaW5nKSAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKQp7CmlmICgkdGhpcy0+c3RyaW5nICE9PSBudWxsKSB7CnJldHVybiAkdGhpcy0+c3RyaW5nOwp9CgokY29uc3RyYWludHMgPSBhcnJheSgpOwpmb3JlYWNoICgkdGhpcy0+Y29uc3RyYWludHMgYXMgJGNvbnN0cmFpbnQpIHsKJGNvbnN0cmFpbnRzW10gPSAoc3RyaW5nKSAkY29uc3RyYWludDsKfQoKcmV0dXJuICR0aGlzLT5zdHJpbmcgPSAnWycgLiBpbXBsb2RlKCR0aGlzLT5jb25qdW5jdGl2ZSA/ICcgJyA6ICcgfHwgJywgJGNvbnN0cmFpbnRzKSAuICddJzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExvd2VyQm91bmQoKQp7CiR0aGlzLT5leHRyYWN0Qm91bmRzKCk7CgppZiAobnVsbCA9PT0gJHRoaXMtPmxvd2VyQm91bmQpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignZXh0cmFjdEJvdW5kcyBzaG91bGQgaGF2ZSBwb3B1bGF0ZWQgdGhlIGxvd2VyQm91bmQgcHJvcGVydHknKTsKfQoKcmV0dXJuICR0aGlzLT5sb3dlckJvdW5kOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXBwZXJCb3VuZCgpCnsKJHRoaXMtPmV4dHJhY3RCb3VuZHMoKTsKCmlmIChudWxsID09PSAkdGhpcy0+dXBwZXJCb3VuZCkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdleHRyYWN0Qm91bmRzIHNob3VsZCBoYXZlIHBvcHVsYXRlZCB0aGUgdXBwZXJCb3VuZCBwcm9wZXJ0eScpOwp9CgpyZXR1cm4gJHRoaXMtPnVwcGVyQm91bmQ7Cn0KCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGUoYXJyYXkgJGNvbnN0cmFpbnRzLCAkY29uanVuY3RpdmUgPSB0cnVlKQp7CmlmICgwID09PSBcY291bnQoJGNvbnN0cmFpbnRzKSkgewpyZXR1cm4gbmV3IE1hdGNoQWxsQ29uc3RyYWludCgpOwp9CgppZiAoMSA9PT0gXGNvdW50KCRjb25zdHJhaW50cykpIHsKcmV0dXJuICRjb25zdHJhaW50c1swXTsKfQoKJG9wdGltaXplZCA9IHNlbGY6Om9wdGltaXplQ29uc3RyYWludHMoJGNvbnN0cmFpbnRzLCAkY29uanVuY3RpdmUpOwppZiAoJG9wdGltaXplZCAhPT0gbnVsbCkgewpsaXN0KCRjb25zdHJhaW50cywgJGNvbmp1bmN0aXZlKSA9ICRvcHRpbWl6ZWQ7CmlmIChcY291bnQoJGNvbnN0cmFpbnRzKSA9PT0gMSkgewpyZXR1cm4gJGNvbnN0cmFpbnRzWzBdOwp9Cn0KCnJldHVybiBuZXcgc2VsZigkY29uc3RyYWludHMsICRjb25qdW5jdGl2ZSk7Cn0KCgoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBvcHRpbWl6ZUNvbnN0cmFpbnRzKGFycmF5ICRjb25zdHJhaW50cywgJGNvbmp1bmN0aXZlKQp7CgoKCmlmICghJGNvbmp1bmN0aXZlKSB7CiRsZWZ0ID0gJGNvbnN0cmFpbnRzWzBdOwokbWVyZ2VkQ29uc3RyYWludHMgPSBhcnJheSgpOwokb3B0aW1pemVkID0gZmFsc2U7CmZvciAoJGkgPSAxLCAkbCA9IFxjb3VudCgkY29uc3RyYWludHMpOyAkaSA8ICRsOyAkaSsrKSB7CiRyaWdodCA9ICRjb25zdHJhaW50c1skaV07CmlmICgKJGxlZnQgaW5zdGFuY2VvZiBzZWxmCiYmICRsZWZ0LT5jb25qdW5jdGl2ZQomJiAkcmlnaHQgaW5zdGFuY2VvZiBzZWxmCiYmICRyaWdodC0+Y29uanVuY3RpdmUKJiYgXGNvdW50KCRsZWZ0LT5jb25zdHJhaW50cykgPT09IDIKJiYgXGNvdW50KCRyaWdodC0+Y29uc3RyYWludHMpID09PSAyCiYmICgkbGVmdDAgPSAoc3RyaW5nKSAkbGVmdC0+Y29uc3RyYWludHNbMF0pCiYmICRsZWZ0MFswXSA9PT0gJz4nICYmICRsZWZ0MFsxXSA9PT0gJz0nCiYmICgkbGVmdDEgPSAoc3RyaW5nKSAkbGVmdC0+Y29uc3RyYWludHNbMV0pCiYmICRsZWZ0MVswXSA9PT0gJzwnCiYmICgkcmlnaHQwID0gKHN0cmluZykgJHJpZ2h0LT5jb25zdHJhaW50c1swXSkKJiYgJHJpZ2h0MFswXSA9PT0gJz4nICYmICRyaWdodDBbMV0gPT09ICc9JwomJiAoJHJpZ2h0MSA9IChzdHJpbmcpICRyaWdodC0+Y29uc3RyYWludHNbMV0pCiYmICRyaWdodDFbMF0gPT09ICc8JwomJiBzdWJzdHIoJGxlZnQxLCAyKSA9PT0gc3Vic3RyKCRyaWdodDAsIDMpCikgewokb3B0aW1pemVkID0gdHJ1ZTsKJGxlZnQgPSBuZXcgTXVsdGlDb25zdHJhaW50KAphcnJheSgKJGxlZnQtPmNvbnN0cmFpbnRzWzBdLAokcmlnaHQtPmNvbnN0cmFpbnRzWzFdLAopLAp0cnVlKTsKfSBlbHNlIHsKJG1lcmdlZENvbnN0cmFpbnRzW10gPSAkbGVmdDsKJGxlZnQgPSAkcmlnaHQ7Cn0KfQppZiAoJG9wdGltaXplZCkgewokbWVyZ2VkQ29uc3RyYWludHNbXSA9ICRsZWZ0OwpyZXR1cm4gYXJyYXkoJG1lcmdlZENvbnN0cmFpbnRzLCBmYWxzZSk7Cn0KfQoKCgpyZXR1cm4gbnVsbDsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBleHRyYWN0Qm91bmRzKCkKewppZiAobnVsbCAhPT0gJHRoaXMtPmxvd2VyQm91bmQpIHsKcmV0dXJuOwp9Cgpmb3JlYWNoICgkdGhpcy0+Y29uc3RyYWludHMgYXMgJGNvbnN0cmFpbnQpIHsKaWYgKG51bGwgPT09ICR0aGlzLT5sb3dlckJvdW5kIHx8IG51bGwgPT09ICR0aGlzLT51cHBlckJvdW5kKSB7CiR0aGlzLT5sb3dlckJvdW5kID0gJGNvbnN0cmFpbnQtPmdldExvd2VyQm91bmQoKTsKJHRoaXMtPnVwcGVyQm91bmQgPSAkY29uc3RyYWludC0+Z2V0VXBwZXJCb3VuZCgpOwpjb250aW51ZTsKfQoKaWYgKCRjb25zdHJhaW50LT5nZXRMb3dlckJvdW5kKCktPmNvbXBhcmVUbygkdGhpcy0+bG93ZXJCb3VuZCwgJHRoaXMtPmlzQ29uanVuY3RpdmUoKSA/ICc+JyA6ICc8JykpIHsKJHRoaXMtPmxvd2VyQm91bmQgPSAkY29uc3RyYWludC0+Z2V0TG93ZXJCb3VuZCgpOwp9CgppZiAoJGNvbnN0cmFpbnQtPmdldFVwcGVyQm91bmQoKS0+Y29tcGFyZVRvKCR0aGlzLT51cHBlckJvdW5kLCAkdGhpcy0+aXNDb25qdW5jdGl2ZSgpID8gJzwnIDogJz4nKSkgewokdGhpcy0+dXBwZXJCb3VuZCA9ICRjb25zdHJhaW50LT5nZXRVcHBlckJvdW5kKCk7Cn0KfQp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxTZW12ZXI7Cgp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKCmNsYXNzIEludGVydmFsCnsKCnByaXZhdGUgJHN0YXJ0OwoKcHJpdmF0ZSAkZW5kOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KENvbnN0cmFpbnQgJHN0YXJ0LCBDb25zdHJhaW50ICRlbmQpCnsKJHRoaXMtPnN0YXJ0ID0gJHN0YXJ0OwokdGhpcy0+ZW5kID0gJGVuZDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0YXJ0KCkKewpyZXR1cm4gJHRoaXMtPnN0YXJ0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RW5kKCkKewpyZXR1cm4gJHRoaXMtPmVuZDsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tWmVybygpCnsKc3RhdGljICR6ZXJvOwoKaWYgKG51bGwgPT09ICR6ZXJvKSB7CiR6ZXJvID0gbmV3IENvbnN0cmFpbnQoJz49JywgJzAuMC4wLjAtZGV2Jyk7Cn0KCnJldHVybiAkemVybzsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiB1bnRpbFBvc2l0aXZlSW5maW5pdHkoKQp7CnN0YXRpYyAkcG9zaXRpdmVJbmZpbml0eTsKCmlmIChudWxsID09PSAkcG9zaXRpdmVJbmZpbml0eSkgewokcG9zaXRpdmVJbmZpbml0eSA9IG5ldyBDb25zdHJhaW50KCc8JywgUEhQX0lOVF9NQVguJy4wLjAuMCcpOwp9CgpyZXR1cm4gJHBvc2l0aXZlSW5maW5pdHk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYW55KCkKewpyZXR1cm4gbmV3IHNlbGYoc2VsZjo6ZnJvbVplcm8oKSwgc2VsZjo6dW50aWxQb3NpdGl2ZUluZmluaXR5KCkpOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFueURldigpCnsKCnJldHVybiBhcnJheSgnbmFtZXMnID0+IGFycmF5KCksICdleGNsdWRlJyA9PiB0cnVlKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBub0RldigpCnsKCnJldHVybiBhcnJheSgnbmFtZXMnID0+IGFycmF5KCksICdleGNsdWRlJyA9PiBmYWxzZSk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFNlbXZlcjsKCnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE1hdGNoQWxsQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE1hdGNoTm9uZUNvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxNdWx0aUNvbnN0cmFpbnQ7CgoKCgoKCgoKCgoKCgpjbGFzcyBJbnRlcnZhbHMKewoKCgpwcml2YXRlIHN0YXRpYyAkaW50ZXJ2YWxzQ2FjaGUgPSBhcnJheSgpOwoKCgoKcHJpdmF0ZSBzdGF0aWMgJG9wU29ydE9yZGVyID0gYXJyYXkoCic+PScgPT4gLTMsCic8JyA9PiAtMiwKJz4nID0+IDIsCic8PScgPT4gMywKKTsKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjbGVhcigpCnsKc2VsZjo6JGludGVydmFsc0NhY2hlID0gYXJyYXkoKTsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzU3Vic2V0T2YoQ29uc3RyYWludEludGVyZmFjZSAkY2FuZGlkYXRlLCBDb25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50KQp7CmlmICgkY29uc3RyYWludCBpbnN0YW5jZW9mIE1hdGNoQWxsQ29uc3RyYWludCkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKCRjYW5kaWRhdGUgaW5zdGFuY2VvZiBNYXRjaE5vbmVDb25zdHJhaW50IHx8ICRjb25zdHJhaW50IGluc3RhbmNlb2YgTWF0Y2hOb25lQ29uc3RyYWludCkgewpyZXR1cm4gZmFsc2U7Cn0KCiRpbnRlcnNlY3Rpb25JbnRlcnZhbHMgPSBzZWxmOjpnZXQobmV3IE11bHRpQ29uc3RyYWludChhcnJheSgkY2FuZGlkYXRlLCAkY29uc3RyYWludCksIHRydWUpKTsKJGNhbmRpZGF0ZUludGVydmFscyA9IHNlbGY6OmdldCgkY2FuZGlkYXRlKTsKaWYgKFxjb3VudCgkaW50ZXJzZWN0aW9uSW50ZXJ2YWxzWydudW1lcmljJ10pICE9PSBcY291bnQoJGNhbmRpZGF0ZUludGVydmFsc1snbnVtZXJpYyddKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmZvcmVhY2ggKCRpbnRlcnNlY3Rpb25JbnRlcnZhbHNbJ251bWVyaWMnXSBhcyAkaW5kZXggPT4gJGludGVydmFsKSB7CmlmICghaXNzZXQoJGNhbmRpZGF0ZUludGVydmFsc1snbnVtZXJpYyddWyRpbmRleF0pKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKChzdHJpbmcpICRjYW5kaWRhdGVJbnRlcnZhbHNbJ251bWVyaWMnXVskaW5kZXhdLT5nZXRTdGFydCgpICE9PSAoc3RyaW5nKSAkaW50ZXJ2YWwtPmdldFN0YXJ0KCkpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoKHN0cmluZykgJGNhbmRpZGF0ZUludGVydmFsc1snbnVtZXJpYyddWyRpbmRleF0tPmdldEVuZCgpICE9PSAoc3RyaW5nKSAkaW50ZXJ2YWwtPmdldEVuZCgpKSB7CnJldHVybiBmYWxzZTsKfQp9CgppZiAoJGludGVyc2VjdGlvbkludGVydmFsc1snYnJhbmNoZXMnXVsnZXhjbHVkZSddICE9PSAkY2FuZGlkYXRlSW50ZXJ2YWxzWydicmFuY2hlcyddWydleGNsdWRlJ10pIHsKcmV0dXJuIGZhbHNlOwp9CmlmIChcY291bnQoJGludGVyc2VjdGlvbkludGVydmFsc1snYnJhbmNoZXMnXVsnbmFtZXMnXSkgIT09IFxjb3VudCgkY2FuZGlkYXRlSW50ZXJ2YWxzWydicmFuY2hlcyddWyduYW1lcyddKSkgewpyZXR1cm4gZmFsc2U7Cn0KZm9yZWFjaCAoJGludGVyc2VjdGlvbkludGVydmFsc1snYnJhbmNoZXMnXVsnbmFtZXMnXSBhcyAkaW5kZXggPT4gJG5hbWUpIHsKaWYgKCRuYW1lICE9PSAkY2FuZGlkYXRlSW50ZXJ2YWxzWydicmFuY2hlcyddWyduYW1lcyddWyRpbmRleF0pIHsKcmV0dXJuIGZhbHNlOwp9Cn0KCnJldHVybiB0cnVlOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaGF2ZUludGVyc2VjdGlvbnMoQ29uc3RyYWludEludGVyZmFjZSAkYSwgQ29uc3RyYWludEludGVyZmFjZSAkYikKewppZiAoJGEgaW5zdGFuY2VvZiBNYXRjaEFsbENvbnN0cmFpbnQgfHwgJGIgaW5zdGFuY2VvZiBNYXRjaEFsbENvbnN0cmFpbnQpIHsKcmV0dXJuIHRydWU7Cn0KCmlmICgkYSBpbnN0YW5jZW9mIE1hdGNoTm9uZUNvbnN0cmFpbnQgfHwgJGIgaW5zdGFuY2VvZiBNYXRjaE5vbmVDb25zdHJhaW50KSB7CnJldHVybiBmYWxzZTsKfQoKJGludGVyc2VjdGlvbkludGVydmFscyA9IHNlbGY6OmdlbmVyYXRlSW50ZXJ2YWxzKG5ldyBNdWx0aUNvbnN0cmFpbnQoYXJyYXkoJGEsICRiKSwgdHJ1ZSksIHRydWUpOwoKcmV0dXJuIFxjb3VudCgkaW50ZXJzZWN0aW9uSW50ZXJ2YWxzWydudW1lcmljJ10pID4gMCB8fCAkaW50ZXJzZWN0aW9uSW50ZXJ2YWxzWydicmFuY2hlcyddWydleGNsdWRlJ10gfHwgXGNvdW50KCRpbnRlcnNlY3Rpb25JbnRlcnZhbHNbJ2JyYW5jaGVzJ11bJ25hbWVzJ10pID4gMDsKfQoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY29tcGFjdENvbnN0cmFpbnQoQ29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCkKewppZiAoISRjb25zdHJhaW50IGluc3RhbmNlb2YgTXVsdGlDb25zdHJhaW50KSB7CnJldHVybiAkY29uc3RyYWludDsKfQoKJGludGVydmFscyA9IHNlbGY6OmdlbmVyYXRlSW50ZXJ2YWxzKCRjb25zdHJhaW50KTsKJGNvbnN0cmFpbnRzID0gYXJyYXkoKTsKJGhhc051bWVyaWNNYXRjaEFsbCA9IGZhbHNlOwoKaWYgKFxjb3VudCgkaW50ZXJ2YWxzWydudW1lcmljJ10pID09PSAxICYmIChzdHJpbmcpICRpbnRlcnZhbHNbJ251bWVyaWMnXVswXS0+Z2V0U3RhcnQoKSA9PT0gKHN0cmluZykgSW50ZXJ2YWw6OmZyb21aZXJvKCkgJiYgKHN0cmluZykgJGludGVydmFsc1snbnVtZXJpYyddWzBdLT5nZXRFbmQoKSA9PT0gKHN0cmluZykgSW50ZXJ2YWw6OnVudGlsUG9zaXRpdmVJbmZpbml0eSgpKSB7CiRjb25zdHJhaW50c1tdID0gJGludGVydmFsc1snbnVtZXJpYyddWzBdLT5nZXRTdGFydCgpOwokaGFzTnVtZXJpY01hdGNoQWxsID0gdHJ1ZTsKfSBlbHNlIHsKJHVuRXF1YWxDb25zdHJhaW50cyA9IGFycmF5KCk7CmZvciAoJGkgPSAwLCAkY291bnQgPSBcY291bnQoJGludGVydmFsc1snbnVtZXJpYyddKTsgJGkgPCAkY291bnQ7ICRpKyspIHsKJGludGVydmFsID0gJGludGVydmFsc1snbnVtZXJpYyddWyRpXTsKCgoKCgppZiAoJGludGVydmFsLT5nZXRFbmQoKS0+Z2V0T3BlcmF0b3IoKSA9PT0gJzwnICYmICRpKzEgPCAkY291bnQpIHsKJG5leHRJbnRlcnZhbCA9ICRpbnRlcnZhbHNbJ251bWVyaWMnXVskaSsxXTsKaWYgKCRpbnRlcnZhbC0+Z2V0RW5kKCktPmdldFZlcnNpb24oKSA9PT0gJG5leHRJbnRlcnZhbC0+Z2V0U3RhcnQoKS0+Z2V0VmVyc2lvbigpICYmICRuZXh0SW50ZXJ2YWwtPmdldFN0YXJ0KCktPmdldE9wZXJhdG9yKCkgPT09ICc+JykgewoKCgppZiAoXGNvdW50KCR1bkVxdWFsQ29uc3RyYWludHMpID09PSAwICYmIChzdHJpbmcpICRpbnRlcnZhbC0+Z2V0U3RhcnQoKSAhPT0gKHN0cmluZykgSW50ZXJ2YWw6OmZyb21aZXJvKCkpIHsKJHVuRXF1YWxDb25zdHJhaW50c1tdID0gJGludGVydmFsLT5nZXRTdGFydCgpOwp9CiR1bkVxdWFsQ29uc3RyYWludHNbXSA9IG5ldyBDb25zdHJhaW50KCchPScsICRpbnRlcnZhbC0+Z2V0RW5kKCktPmdldFZlcnNpb24oKSk7CmNvbnRpbnVlOwp9Cn0KCmlmIChcY291bnQoJHVuRXF1YWxDb25zdHJhaW50cykgPiAwKSB7CgppZiAoKHN0cmluZykgJGludGVydmFsLT5nZXRFbmQoKSAhPT0gKHN0cmluZykgSW50ZXJ2YWw6OnVudGlsUG9zaXRpdmVJbmZpbml0eSgpKSB7CiR1bkVxdWFsQ29uc3RyYWludHNbXSA9ICRpbnRlcnZhbC0+Z2V0RW5kKCk7Cn0KCgppZiAoXGNvdW50KCR1bkVxdWFsQ29uc3RyYWludHMpID4gMSkgewokY29uc3RyYWludHNbXSA9IG5ldyBNdWx0aUNvbnN0cmFpbnQoJHVuRXF1YWxDb25zdHJhaW50cywgdHJ1ZSk7Cn0gZWxzZSB7CiRjb25zdHJhaW50c1tdID0gJHVuRXF1YWxDb25zdHJhaW50c1swXTsKfQoKJHVuRXF1YWxDb25zdHJhaW50cyA9IGFycmF5KCk7CmNvbnRpbnVlOwp9CgoKaWYgKCRpbnRlcnZhbC0+Z2V0U3RhcnQoKS0+Z2V0VmVyc2lvbigpID09PSAkaW50ZXJ2YWwtPmdldEVuZCgpLT5nZXRWZXJzaW9uKCkgJiYgJGludGVydmFsLT5nZXRTdGFydCgpLT5nZXRPcGVyYXRvcigpID09PSAnPj0nICYmICRpbnRlcnZhbC0+Z2V0RW5kKCktPmdldE9wZXJhdG9yKCkgPT09ICc8PScpIHsKJGNvbnN0cmFpbnRzW10gPSBuZXcgQ29uc3RyYWludCgnPT0nLCAkaW50ZXJ2YWwtPmdldFN0YXJ0KCktPmdldFZlcnNpb24oKSk7CmNvbnRpbnVlOwp9CgppZiAoKHN0cmluZykgJGludGVydmFsLT5nZXRTdGFydCgpID09PSAoc3RyaW5nKSBJbnRlcnZhbDo6ZnJvbVplcm8oKSkgewokY29uc3RyYWludHNbXSA9ICRpbnRlcnZhbC0+Z2V0RW5kKCk7Cn0gZWxzZWlmICgoc3RyaW5nKSAkaW50ZXJ2YWwtPmdldEVuZCgpID09PSAoc3RyaW5nKSBJbnRlcnZhbDo6dW50aWxQb3NpdGl2ZUluZmluaXR5KCkpIHsKJGNvbnN0cmFpbnRzW10gPSAkaW50ZXJ2YWwtPmdldFN0YXJ0KCk7Cn0gZWxzZSB7CiRjb25zdHJhaW50c1tdID0gbmV3IE11bHRpQ29uc3RyYWludChhcnJheSgkaW50ZXJ2YWwtPmdldFN0YXJ0KCksICRpbnRlcnZhbC0+Z2V0RW5kKCkpLCB0cnVlKTsKfQp9Cn0KCiRkZXZDb25zdHJhaW50cyA9IGFycmF5KCk7CgppZiAoMCA9PT0gXGNvdW50KCRpbnRlcnZhbHNbJ2JyYW5jaGVzJ11bJ25hbWVzJ10pKSB7CmlmICgkaW50ZXJ2YWxzWydicmFuY2hlcyddWydleGNsdWRlJ10pIHsKaWYgKCRoYXNOdW1lcmljTWF0Y2hBbGwpIHsKcmV0dXJuIG5ldyBNYXRjaEFsbENvbnN0cmFpbnQ7Cn0KCn0KfSBlbHNlIHsKZm9yZWFjaCAoJGludGVydmFsc1snYnJhbmNoZXMnXVsnbmFtZXMnXSBhcyAkYnJhbmNoTmFtZSkgewppZiAoJGludGVydmFsc1snYnJhbmNoZXMnXVsnZXhjbHVkZSddKSB7CiRkZXZDb25zdHJhaW50c1tdID0gbmV3IENvbnN0cmFpbnQoJyE9JywgJGJyYW5jaE5hbWUpOwp9IGVsc2UgewokZGV2Q29uc3RyYWludHNbXSA9IG5ldyBDb25zdHJhaW50KCc9PScsICRicmFuY2hOYW1lKTsKfQp9CgoKCmlmICgkaW50ZXJ2YWxzWydicmFuY2hlcyddWydleGNsdWRlJ10pIHsKaWYgKFxjb3VudCgkY29uc3RyYWludHMpID4gMSkgewpyZXR1cm4gbmV3IE11bHRpQ29uc3RyYWludChhcnJheV9tZXJnZSgKYXJyYXkobmV3IE11bHRpQ29uc3RyYWludCgkY29uc3RyYWludHMsIGZhbHNlKSksCiRkZXZDb25zdHJhaW50cwopLCB0cnVlKTsKfQoKaWYgKFxjb3VudCgkY29uc3RyYWludHMpID09PSAxICYmIChzdHJpbmcpJGNvbnN0cmFpbnRzWzBdID09PSAoc3RyaW5nKUludGVydmFsOjpmcm9tWmVybygpKSB7CmlmIChcY291bnQoJGRldkNvbnN0cmFpbnRzKSA+IDEpIHsKcmV0dXJuIG5ldyBNdWx0aUNvbnN0cmFpbnQoJGRldkNvbnN0cmFpbnRzLCB0cnVlKTsKfQpyZXR1cm4gJGRldkNvbnN0cmFpbnRzWzBdOwp9CgpyZXR1cm4gbmV3IE11bHRpQ29uc3RyYWludChhcnJheV9tZXJnZSgkY29uc3RyYWludHMsICRkZXZDb25zdHJhaW50cyksIHRydWUpOwp9CgoKCiRjb25zdHJhaW50cyA9IGFycmF5X21lcmdlKCRjb25zdHJhaW50cywgJGRldkNvbnN0cmFpbnRzKTsKfQoKaWYgKFxjb3VudCgkY29uc3RyYWludHMpID4gMSkgewpyZXR1cm4gbmV3IE11bHRpQ29uc3RyYWludCgkY29uc3RyYWludHMsIGZhbHNlKTsKfQoKaWYgKFxjb3VudCgkY29uc3RyYWludHMpID09PSAxKSB7CnJldHVybiAkY29uc3RyYWludHNbMF07Cn0KCnJldHVybiBuZXcgTWF0Y2hOb25lQ29uc3RyYWludDsKfQoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0KENvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQpCnsKJGtleSA9IChzdHJpbmcpICRjb25zdHJhaW50OwoKaWYgKCFpc3NldChzZWxmOjokaW50ZXJ2YWxzQ2FjaGVbJGtleV0pKSB7CnNlbGY6OiRpbnRlcnZhbHNDYWNoZVska2V5XSA9IHNlbGY6OmdlbmVyYXRlSW50ZXJ2YWxzKCRjb25zdHJhaW50KTsKfQoKcmV0dXJuIHNlbGY6OiRpbnRlcnZhbHNDYWNoZVska2V5XTsKfQoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZW5lcmF0ZUludGVydmFscyhDb25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50LCAkc3RvcE9uRmlyc3RWYWxpZEludGVydmFsID0gZmFsc2UpCnsKaWYgKCRjb25zdHJhaW50IGluc3RhbmNlb2YgTWF0Y2hBbGxDb25zdHJhaW50KSB7CnJldHVybiBhcnJheSgnbnVtZXJpYycgPT4gYXJyYXkobmV3IEludGVydmFsKEludGVydmFsOjpmcm9tWmVybygpLCBJbnRlcnZhbDo6dW50aWxQb3NpdGl2ZUluZmluaXR5KCkpKSwgJ2JyYW5jaGVzJyA9PiBJbnRlcnZhbDo6YW55RGV2KCkpOwp9CgppZiAoJGNvbnN0cmFpbnQgaW5zdGFuY2VvZiBNYXRjaE5vbmVDb25zdHJhaW50KSB7CnJldHVybiBhcnJheSgnbnVtZXJpYycgPT4gYXJyYXkoKSwgJ2JyYW5jaGVzJyA9PiBhcnJheSgnbmFtZXMnID0+IGFycmF5KCksICdleGNsdWRlJyA9PiBmYWxzZSkpOwp9CgppZiAoJGNvbnN0cmFpbnQgaW5zdGFuY2VvZiBDb25zdHJhaW50KSB7CnJldHVybiBzZWxmOjpnZW5lcmF0ZVNpbmdsZUNvbnN0cmFpbnRJbnRlcnZhbHMoJGNvbnN0cmFpbnQpOwp9CgppZiAoISRjb25zdHJhaW50IGluc3RhbmNlb2YgTXVsdGlDb25zdHJhaW50KSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdUaGUgY29uc3RyYWludCBwYXNzZWQgaW4gc2hvdWxkIGJlIGFuIE1hdGNoQWxsQ29uc3RyYWludCwgQ29uc3RyYWludCBvciBNdWx0aUNvbnN0cmFpbnQgaW5zdGFuY2UsIGdvdCAnLlxnZXRfY2xhc3MoJGNvbnN0cmFpbnQpLicuJyk7Cn0KCiRjb25zdHJhaW50cyA9ICRjb25zdHJhaW50LT5nZXRDb25zdHJhaW50cygpOwoKJG51bWVyaWNHcm91cHMgPSBhcnJheSgpOwokY29uc3RyYWludEJyYW5jaGVzID0gYXJyYXkoKTsKZm9yZWFjaCAoJGNvbnN0cmFpbnRzIGFzICRjKSB7CiRyZXMgPSBzZWxmOjpnZXQoJGMpOwokbnVtZXJpY0dyb3Vwc1tdID0gJHJlc1snbnVtZXJpYyddOwokY29uc3RyYWludEJyYW5jaGVzW10gPSAkcmVzWydicmFuY2hlcyddOwp9CgppZiAoJGNvbnN0cmFpbnQtPmlzRGlzanVuY3RpdmUoKSkgewokYnJhbmNoZXMgPSBJbnRlcnZhbDo6bm9EZXYoKTsKZm9yZWFjaCAoJGNvbnN0cmFpbnRCcmFuY2hlcyBhcyAkYikgewppZiAoJGJbJ2V4Y2x1ZGUnXSkgewppZiAoJGJyYW5jaGVzWydleGNsdWRlJ10pIHsKCgokYnJhbmNoZXNbJ25hbWVzJ10gPSBhcnJheV9pbnRlcnNlY3QoJGJyYW5jaGVzWyduYW1lcyddLCAkYlsnbmFtZXMnXSk7Cn0gZWxzZSB7CgoKJGJyYW5jaGVzWydleGNsdWRlJ10gPSB0cnVlOwokYnJhbmNoZXNbJ25hbWVzJ10gPSBhcnJheV9kaWZmKCRiWyduYW1lcyddLCAkYnJhbmNoZXNbJ25hbWVzJ10pOwp9Cn0gZWxzZSB7CmlmICgkYnJhbmNoZXNbJ2V4Y2x1ZGUnXSkgewoKCiRicmFuY2hlc1snbmFtZXMnXSA9IGFycmF5X2RpZmYoJGJyYW5jaGVzWyduYW1lcyddLCAkYlsnbmFtZXMnXSk7Cn0gZWxzZSB7CgoKJGJyYW5jaGVzWyduYW1lcyddID0gYXJyYXlfbWVyZ2UoJGJyYW5jaGVzWyduYW1lcyddLCAkYlsnbmFtZXMnXSk7Cn0KfQp9Cn0gZWxzZSB7CiRicmFuY2hlcyA9IEludGVydmFsOjphbnlEZXYoKTsKZm9yZWFjaCAoJGNvbnN0cmFpbnRCcmFuY2hlcyBhcyAkYikgewppZiAoJGJbJ2V4Y2x1ZGUnXSkgewppZiAoJGJyYW5jaGVzWydleGNsdWRlJ10pIHsKCgokYnJhbmNoZXNbJ25hbWVzJ10gPSBhcnJheV9tZXJnZSgkYnJhbmNoZXNbJ25hbWVzJ10sICRiWyduYW1lcyddKTsKfSBlbHNlIHsKCgokYnJhbmNoZXNbJ25hbWVzJ10gPSBhcnJheV9kaWZmKCRicmFuY2hlc1snbmFtZXMnXSwgJGJbJ25hbWVzJ10pOwp9Cn0gZWxzZSB7CmlmICgkYnJhbmNoZXNbJ2V4Y2x1ZGUnXSkgewoKCiRicmFuY2hlc1snbmFtZXMnXSA9IGFycmF5X2RpZmYoJGJbJ25hbWVzJ10sICRicmFuY2hlc1snbmFtZXMnXSk7CiRicmFuY2hlc1snZXhjbHVkZSddID0gZmFsc2U7Cn0gZWxzZSB7CgoKJGJyYW5jaGVzWyduYW1lcyddID0gYXJyYXlfaW50ZXJzZWN0KCRicmFuY2hlc1snbmFtZXMnXSwgJGJbJ25hbWVzJ10pOwp9Cn0KfQp9CgokYnJhbmNoZXNbJ25hbWVzJ10gPSBhcnJheV91bmlxdWUoJGJyYW5jaGVzWyduYW1lcyddKTsKCmlmIChcY291bnQoJG51bWVyaWNHcm91cHMpID09PSAxKSB7CnJldHVybiBhcnJheSgnbnVtZXJpYycgPT4gJG51bWVyaWNHcm91cHNbMF0sICdicmFuY2hlcycgPT4gJGJyYW5jaGVzKTsKfQoKJGJvcmRlcnMgPSBhcnJheSgpOwpmb3JlYWNoICgkbnVtZXJpY0dyb3VwcyBhcyAkZ3JvdXApIHsKZm9yZWFjaCAoJGdyb3VwIGFzICRpbnRlcnZhbCkgewokYm9yZGVyc1tdID0gYXJyYXkoJ3ZlcnNpb24nID0+ICRpbnRlcnZhbC0+Z2V0U3RhcnQoKS0+Z2V0VmVyc2lvbigpLCAnb3BlcmF0b3InID0+ICRpbnRlcnZhbC0+Z2V0U3RhcnQoKS0+Z2V0T3BlcmF0b3IoKSwgJ3NpZGUnID0+ICdzdGFydCcpOwokYm9yZGVyc1tdID0gYXJyYXkoJ3ZlcnNpb24nID0+ICRpbnRlcnZhbC0+Z2V0RW5kKCktPmdldFZlcnNpb24oKSwgJ29wZXJhdG9yJyA9PiAkaW50ZXJ2YWwtPmdldEVuZCgpLT5nZXRPcGVyYXRvcigpLCAnc2lkZScgPT4gJ2VuZCcpOwp9Cn0KCiRvcFNvcnRPcmRlciA9IHNlbGY6OiRvcFNvcnRPcmRlcjsKdXNvcnQoJGJvcmRlcnMsIGZ1bmN0aW9uICgkYSwgJGIpIHVzZSAoJG9wU29ydE9yZGVyKSB7CiRvcmRlciA9IHZlcnNpb25fY29tcGFyZSgkYVsndmVyc2lvbiddLCAkYlsndmVyc2lvbiddKTsKaWYgKCRvcmRlciA9PT0gMCkgewpyZXR1cm4gJG9wU29ydE9yZGVyWyRhWydvcGVyYXRvciddXSAtICRvcFNvcnRPcmRlclskYlsnb3BlcmF0b3InXV07Cn0KCnJldHVybiAkb3JkZXI7Cn0pOwoKJGFjdGl2ZUludGVydmFscyA9IDA7CiRpbnRlcnZhbHMgPSBhcnJheSgpOwokaW5kZXggPSAwOwokYWN0aXZhdGlvblRocmVzaG9sZCA9ICRjb25zdHJhaW50LT5pc0Nvbmp1bmN0aXZlKCkgPyBcY291bnQoJG51bWVyaWNHcm91cHMpIDogMTsKJHN0YXJ0ID0gbnVsbDsKZm9yZWFjaCAoJGJvcmRlcnMgYXMgJGJvcmRlcikgewppZiAoJGJvcmRlclsnc2lkZSddID09PSAnc3RhcnQnKSB7CiRhY3RpdmVJbnRlcnZhbHMrKzsKfSBlbHNlIHsKJGFjdGl2ZUludGVydmFscy0tOwp9CmlmICghJHN0YXJ0ICYmICRhY3RpdmVJbnRlcnZhbHMgPj0gJGFjdGl2YXRpb25UaHJlc2hvbGQpIHsKJHN0YXJ0ID0gbmV3IENvbnN0cmFpbnQoJGJvcmRlclsnb3BlcmF0b3InXSwgJGJvcmRlclsndmVyc2lvbiddKTsKfSBlbHNlaWYgKCRzdGFydCAmJiAkYWN0aXZlSW50ZXJ2YWxzIDwgJGFjdGl2YXRpb25UaHJlc2hvbGQpIHsKCmlmICgKdmVyc2lvbl9jb21wYXJlKCRzdGFydC0+Z2V0VmVyc2lvbigpLCAkYm9yZGVyWyd2ZXJzaW9uJ10sICc9JykKJiYgKAooJHN0YXJ0LT5nZXRPcGVyYXRvcigpID09PSAnPicgJiYgJGJvcmRlclsnb3BlcmF0b3InXSA9PT0gJzw9JykKfHwgKCRzdGFydC0+Z2V0T3BlcmF0b3IoKSA9PT0gJz49JyAmJiAkYm9yZGVyWydvcGVyYXRvciddID09PSAnPCcpCikKKSB7CnVuc2V0KCRpbnRlcnZhbHNbJGluZGV4XSk7Cn0gZWxzZSB7CiRpbnRlcnZhbHNbJGluZGV4XSA9IG5ldyBJbnRlcnZhbCgkc3RhcnQsIG5ldyBDb25zdHJhaW50KCRib3JkZXJbJ29wZXJhdG9yJ10sICRib3JkZXJbJ3ZlcnNpb24nXSkpOwokaW5kZXgrKzsKCmlmICgkc3RvcE9uRmlyc3RWYWxpZEludGVydmFsKSB7CmJyZWFrOwp9Cn0KCiRzdGFydCA9IG51bGw7Cn0KfQoKcmV0dXJuIGFycmF5KCdudW1lcmljJyA9PiAkaW50ZXJ2YWxzLCAnYnJhbmNoZXMnID0+ICRicmFuY2hlcyk7Cn0KCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdlbmVyYXRlU2luZ2xlQ29uc3RyYWludEludGVydmFscyhDb25zdHJhaW50ICRjb25zdHJhaW50KQp7CiRvcCA9ICRjb25zdHJhaW50LT5nZXRPcGVyYXRvcigpOwoKCmlmIChzdHJwb3MoJGNvbnN0cmFpbnQtPmdldFZlcnNpb24oKSwgJ2Rldi0nKSA9PT0gMCkgewokaW50ZXJ2YWxzID0gYXJyYXkoKTsKJGJyYW5jaGVzID0gYXJyYXkoJ25hbWVzJyA9PiBhcnJheSgpLCAnZXhjbHVkZScgPT4gZmFsc2UpOwoKCmlmICgkb3AgPT09ICchPScpIHsKJGludGVydmFsc1tdID0gbmV3IEludGVydmFsKEludGVydmFsOjpmcm9tWmVybygpLCBJbnRlcnZhbDo6dW50aWxQb3NpdGl2ZUluZmluaXR5KCkpOwokYnJhbmNoZXMgPSBhcnJheSgnbmFtZXMnID0+IGFycmF5KCRjb25zdHJhaW50LT5nZXRWZXJzaW9uKCkpLCAnZXhjbHVkZScgPT4gdHJ1ZSk7Cn0gZWxzZWlmICgkb3AgPT09ICc9PScpIHsKJGJyYW5jaGVzWyduYW1lcyddW10gPSAkY29uc3RyYWludC0+Z2V0VmVyc2lvbigpOwp9CgpyZXR1cm4gYXJyYXkoCidudW1lcmljJyA9PiAkaW50ZXJ2YWxzLAonYnJhbmNoZXMnID0+ICRicmFuY2hlcywKKTsKfQoKaWYgKCRvcFswXSA9PT0gJz4nKSB7IApyZXR1cm4gYXJyYXkoJ251bWVyaWMnID0+IGFycmF5KG5ldyBJbnRlcnZhbCgkY29uc3RyYWludCwgSW50ZXJ2YWw6OnVudGlsUG9zaXRpdmVJbmZpbml0eSgpKSksICdicmFuY2hlcycgPT4gSW50ZXJ2YWw6Om5vRGV2KCkpOwp9CmlmICgkb3BbMF0gPT09ICc8JykgeyAKcmV0dXJuIGFycmF5KCdudW1lcmljJyA9PiBhcnJheShuZXcgSW50ZXJ2YWwoSW50ZXJ2YWw6OmZyb21aZXJvKCksICRjb25zdHJhaW50KSksICdicmFuY2hlcycgPT4gSW50ZXJ2YWw6Om5vRGV2KCkpOwp9CmlmICgkb3AgPT09ICchPScpIHsKCnJldHVybiBhcnJheSgnbnVtZXJpYycgPT4gYXJyYXkoCm5ldyBJbnRlcnZhbChJbnRlcnZhbDo6ZnJvbVplcm8oKSwgbmV3IENvbnN0cmFpbnQoJzwnLCAkY29uc3RyYWludC0+Z2V0VmVyc2lvbigpKSksCm5ldyBJbnRlcnZhbChuZXcgQ29uc3RyYWludCgnPicsICRjb25zdHJhaW50LT5nZXRWZXJzaW9uKCkpLCBJbnRlcnZhbDo6dW50aWxQb3NpdGl2ZUluZmluaXR5KCkpLAopLCAnYnJhbmNoZXMnID0+IEludGVydmFsOjphbnlEZXYoKSk7Cn0KCgpyZXR1cm4gYXJyYXkoJ251bWVyaWMnID0+IGFycmF5KApuZXcgSW50ZXJ2YWwobmV3IENvbnN0cmFpbnQoJz49JywgJGNvbnN0cmFpbnQtPmdldFZlcnNpb24oKSksIG5ldyBDb25zdHJhaW50KCc8PScsICRjb25zdHJhaW50LT5nZXRWZXJzaW9uKCkpKSwKKSwgJ2JyYW5jaGVzJyA9PiBJbnRlcnZhbDo6bm9EZXYoKSk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFNlbXZlcjsKCnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50OwoKY2xhc3MgU2VtdmVyCnsKY29uc3QgU09SVF9BU0MgPSAxOwpjb25zdCBTT1JUX0RFU0MgPSAtMTsKCgpwcml2YXRlIHN0YXRpYyAkdmVyc2lvblBhcnNlcjsKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzYXRpc2ZpZXMoJHZlcnNpb24sICRjb25zdHJhaW50cykKewppZiAobnVsbCA9PT0gc2VsZjo6JHZlcnNpb25QYXJzZXIpIHsKc2VsZjo6JHZlcnNpb25QYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwp9CgokdmVyc2lvblBhcnNlciA9IHNlbGY6OiR2ZXJzaW9uUGFyc2VyOwokcHJvdmlkZXIgPSBuZXcgQ29uc3RyYWludCgnPT0nLCAkdmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCR2ZXJzaW9uKSk7CiRwYXJzZWRDb25zdHJhaW50cyA9ICR2ZXJzaW9uUGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCRjb25zdHJhaW50cyk7CgpyZXR1cm4gJHBhcnNlZENvbnN0cmFpbnRzLT5tYXRjaGVzKCRwcm92aWRlcik7Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzYXRpc2ZpZWRCeShhcnJheSAkdmVyc2lvbnMsICRjb25zdHJhaW50cykKewokdmVyc2lvbnMgPSBhcnJheV9maWx0ZXIoJHZlcnNpb25zLCBmdW5jdGlvbiAoJHZlcnNpb24pIHVzZSAoJGNvbnN0cmFpbnRzKSB7CnJldHVybiBTZW12ZXI6OnNhdGlzZmllcygkdmVyc2lvbiwgJGNvbnN0cmFpbnRzKTsKfSk7CgpyZXR1cm4gYXJyYXlfdmFsdWVzKCR2ZXJzaW9ucyk7Cn0KCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNvcnQoYXJyYXkgJHZlcnNpb25zKQp7CnJldHVybiBzZWxmOjp1c29ydCgkdmVyc2lvbnMsIHNlbGY6OlNPUlRfQVNDKTsKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcnNvcnQoYXJyYXkgJHZlcnNpb25zKQp7CnJldHVybiBzZWxmOjp1c29ydCgkdmVyc2lvbnMsIHNlbGY6OlNPUlRfREVTQyk7Cn0KCgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHVzb3J0KGFycmF5ICR2ZXJzaW9ucywgJGRpcmVjdGlvbikKewppZiAobnVsbCA9PT0gc2VsZjo6JHZlcnNpb25QYXJzZXIpIHsKc2VsZjo6JHZlcnNpb25QYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwp9CgokdmVyc2lvblBhcnNlciA9IHNlbGY6OiR2ZXJzaW9uUGFyc2VyOwokbm9ybWFsaXplZCA9IGFycmF5KCk7CgoKCmZvcmVhY2ggKCR2ZXJzaW9ucyBhcyAka2V5ID0+ICR2ZXJzaW9uKSB7CiRub3JtYWxpemVkVmVyc2lvbiA9ICR2ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHZlcnNpb24pOwokbm9ybWFsaXplZFZlcnNpb24gPSAkdmVyc2lvblBhcnNlci0+bm9ybWFsaXplRGVmYXVsdEJyYW5jaCgkbm9ybWFsaXplZFZlcnNpb24pOwokbm9ybWFsaXplZFtdID0gYXJyYXkoJG5vcm1hbGl6ZWRWZXJzaW9uLCAka2V5KTsKfQoKdXNvcnQoJG5vcm1hbGl6ZWQsIGZ1bmN0aW9uIChhcnJheSAkbGVmdCwgYXJyYXkgJHJpZ2h0KSB1c2UgKCRkaXJlY3Rpb24pIHsKaWYgKCRsZWZ0WzBdID09PSAkcmlnaHRbMF0pIHsKcmV0dXJuIDA7Cn0KCmlmIChDb21wYXJhdG9yOjpsZXNzVGhhbigkbGVmdFswXSwgJHJpZ2h0WzBdKSkgewpyZXR1cm4gLSRkaXJlY3Rpb247Cn0KCnJldHVybiAkZGlyZWN0aW9uOwp9KTsKCgokc29ydGVkID0gYXJyYXkoKTsKZm9yZWFjaCAoJG5vcm1hbGl6ZWQgYXMgJGl0ZW0pIHsKJHNvcnRlZFtdID0gJHZlcnNpb25zWyRpdGVtWzFdXTsKfQoKcmV0dXJuICRzb3J0ZWQ7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFNlbXZlcjsKCnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcTWF0Y2hBbGxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcTXVsdGlDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKCgoKCgoKY2xhc3MgVmVyc2lvblBhcnNlcgp7CgoKCgoKCgoKCgoKCgpwcml2YXRlIHN0YXRpYyAkbW9kaWZpZXJSZWdleCA9ICdbLl8tXT8oPzooc3RhYmxlfGJldGF8YnxSQ3xhbHBoYXxhfHBhdGNofHBsfHApKCg/OlsuLV0/XGQrKSorKT8pPyhbLi1dP2Rldik/JzsKCgpwcml2YXRlIHN0YXRpYyAkc3RhYmlsaXRpZXNSZWdleCA9ICdzdGFibGV8UkN8YmV0YXxhbHBoYXxkZXYnOwoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlU3RhYmlsaXR5KCR2ZXJzaW9uKQp7CiR2ZXJzaW9uID0gKHN0cmluZykgcHJlZ19yZXBsYWNlKCd7Iy4rJH0nLCAnJywgKHN0cmluZykgJHZlcnNpb24pOwoKaWYgKHN0cnBvcygkdmVyc2lvbiwgJ2Rldi0nKSA9PT0gMCB8fCAnLWRldicgPT09IHN1YnN0cigkdmVyc2lvbiwgLTQpKSB7CnJldHVybiAnZGV2JzsKfQoKcHJlZ19tYXRjaCgneycgLiBzZWxmOjokbW9kaWZpZXJSZWdleCAuICcoPzpcKy4qKT8kfWknLCBzdHJ0b2xvd2VyKCR2ZXJzaW9uKSwgJG1hdGNoKTsKCmlmICghZW1wdHkoJG1hdGNoWzNdKSkgewpyZXR1cm4gJ2Rldic7Cn0KCmlmICghZW1wdHkoJG1hdGNoWzFdKSkgewppZiAoJ2JldGEnID09PSAkbWF0Y2hbMV0gfHwgJ2InID09PSAkbWF0Y2hbMV0pIHsKcmV0dXJuICdiZXRhJzsKfQppZiAoJ2FscGhhJyA9PT0gJG1hdGNoWzFdIHx8ICdhJyA9PT0gJG1hdGNoWzFdKSB7CnJldHVybiAnYWxwaGEnOwp9CmlmICgncmMnID09PSAkbWF0Y2hbMV0pIHsKcmV0dXJuICdSQyc7Cn0KfQoKcmV0dXJuICdzdGFibGUnOwp9CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG5vcm1hbGl6ZVN0YWJpbGl0eSgkc3RhYmlsaXR5KQp7CiRzdGFiaWxpdHkgPSBzdHJ0b2xvd2VyKChzdHJpbmcpICRzdGFiaWxpdHkpOwoKaWYgKCFpbl9hcnJheSgkc3RhYmlsaXR5LCBhcnJheSgnc3RhYmxlJywgJ3JjJywgJ2JldGEnLCAnYWxwaGEnLCAnZGV2JyksIHRydWUpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIHN0YWJpbGl0eSBzdHJpbmcgIicuJHN0YWJpbGl0eS4nIiwgZXhwZWN0ZWQgb25lIG9mIHN0YWJsZSwgUkMsIGJldGEsIGFscGhhIG9yIGRldicpOwp9CgpyZXR1cm4gJHN0YWJpbGl0eSA9PT0gJ3JjJyA/ICdSQycgOiAkc3RhYmlsaXR5Owp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG5vcm1hbGl6ZSgkdmVyc2lvbiwgJGZ1bGxWZXJzaW9uID0gbnVsbCkKewokdmVyc2lvbiA9IHRyaW0oKHN0cmluZykgJHZlcnNpb24pOwokb3JpZ1ZlcnNpb24gPSAkdmVyc2lvbjsKaWYgKG51bGwgPT09ICRmdWxsVmVyc2lvbikgewokZnVsbFZlcnNpb24gPSAkdmVyc2lvbjsKfQoKCmlmIChwcmVnX21hdGNoKCd7XihbXixcc10rKykgKythcyArKyhbXixcc10rKykkfScsICR2ZXJzaW9uLCAkbWF0Y2gpKSB7CiR2ZXJzaW9uID0gJG1hdGNoWzFdOwp9CgoKaWYgKHByZWdfbWF0Y2goJ3tAKD86JyAuIHNlbGY6OiRzdGFiaWxpdGllc1JlZ2V4IC4gJykkfWknLCAkdmVyc2lvbiwgJG1hdGNoKSkgewokdmVyc2lvbiA9IHN1YnN0cigkdmVyc2lvbiwgMCwgc3RybGVuKCR2ZXJzaW9uKSAtIHN0cmxlbigkbWF0Y2hbMF0pKTsKfQoKCmlmIChcaW5fYXJyYXkoJHZlcnNpb24sIGFycmF5KCdtYXN0ZXInLCAndHJ1bmsnLCAnZGVmYXVsdCcpLCB0cnVlKSkgewokdmVyc2lvbiA9ICdkZXYtJyAuICR2ZXJzaW9uOwp9CgoKaWYgKHN0cmlwb3MoJHZlcnNpb24sICdkZXYtJykgPT09IDApIHsKcmV0dXJuICdkZXYtJyAuIHN1YnN0cigkdmVyc2lvbiwgNCk7Cn0KCgppZiAocHJlZ19tYXRjaCgne14oW14sXHMrXSsrKVwrW15cc10rKyR9JywgJHZlcnNpb24sICRtYXRjaCkpIHsKJHZlcnNpb24gPSAkbWF0Y2hbMV07Cn0KCgppZiAocHJlZ19tYXRjaCgne152PyhcZHsxLDV9KykoXC5cZCsrKT8oXC5cZCsrKT8oXC5cZCsrKT8nIC4gc2VsZjo6JG1vZGlmaWVyUmVnZXggLiAnJH1pJywgJHZlcnNpb24sICRtYXRjaGVzKSkgewokdmVyc2lvbiA9ICRtYXRjaGVzWzFdCi4gKCFlbXB0eSgkbWF0Y2hlc1syXSkgPyAkbWF0Y2hlc1syXSA6ICcuMCcpCi4gKCFlbXB0eSgkbWF0Y2hlc1szXSkgPyAkbWF0Y2hlc1szXSA6ICcuMCcpCi4gKCFlbXB0eSgkbWF0Y2hlc1s0XSkgPyAkbWF0Y2hlc1s0XSA6ICcuMCcpOwokaW5kZXggPSA1OwoKfSBlbHNlaWYgKHByZWdfbWF0Y2goJ3tedj8oXGR7NH0oPzpbLjotXT9cZHsyfSl7MSw2fSg/OlsuOi1dP1xkezEsM30pezAsMn0pJyAuIHNlbGY6OiRtb2RpZmllclJlZ2V4IC4gJyR9aScsICR2ZXJzaW9uLCAkbWF0Y2hlcykpIHsKJHZlcnNpb24gPSAoc3RyaW5nKSBwcmVnX3JlcGxhY2UoJ3tcRH0nLCAnLicsICRtYXRjaGVzWzFdKTsKJGluZGV4ID0gMjsKfQoKCmlmIChpc3NldCgkaW5kZXgpKSB7CmlmICghZW1wdHkoJG1hdGNoZXNbJGluZGV4XSkpIHsKaWYgKCdzdGFibGUnID09PSAkbWF0Y2hlc1skaW5kZXhdKSB7CnJldHVybiAkdmVyc2lvbjsKfQokdmVyc2lvbiAuPSAnLScgLiAkdGhpcy0+ZXhwYW5kU3RhYmlsaXR5KCRtYXRjaGVzWyRpbmRleF0pIC4gKGlzc2V0KCRtYXRjaGVzWyRpbmRleCArIDFdKSAmJiAnJyAhPT0gJG1hdGNoZXNbJGluZGV4ICsgMV0gPyBsdHJpbSgkbWF0Y2hlc1skaW5kZXggKyAxXSwgJy4tJykgOiAnJyk7Cn0KCmlmICghZW1wdHkoJG1hdGNoZXNbJGluZGV4ICsgMl0pKSB7CiR2ZXJzaW9uIC49ICctZGV2JzsKfQoKcmV0dXJuICR2ZXJzaW9uOwp9CgoKaWYgKHByZWdfbWF0Y2goJ3soLio/KVsuLV0/ZGV2JH1pJywgJHZlcnNpb24sICRtYXRjaCkpIHsKdHJ5IHsKJG5vcm1hbGl6ZWQgPSAkdGhpcy0+bm9ybWFsaXplQnJhbmNoKCRtYXRjaFsxXSk7CgoKCmlmIChzdHJwb3MoJG5vcm1hbGl6ZWQsICdkZXYtJykgPT09IGZhbHNlKSB7CnJldHVybiAkbm9ybWFsaXplZDsKfQp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7Cn0KfQoKJGV4dHJhTWVzc2FnZSA9ICcnOwppZiAocHJlZ19tYXRjaCgneyArYXMgKycgLiBwcmVnX3F1b3RlKCR2ZXJzaW9uKSAuICcoPzpAKD86Jy5zZWxmOjokc3RhYmlsaXRpZXNSZWdleC4nKSk/JH0nLCAkZnVsbFZlcnNpb24pKSB7CiRleHRyYU1lc3NhZ2UgPSAnIGluICInIC4gJGZ1bGxWZXJzaW9uIC4gJyIsIHRoZSBhbGlhcyBtdXN0IGJlIGFuIGV4YWN0IHZlcnNpb24nOwp9IGVsc2VpZiAocHJlZ19tYXRjaCgne14nIC4gcHJlZ19xdW90ZSgkdmVyc2lvbikgLiAnKD86QCg/Oicuc2VsZjo6JHN0YWJpbGl0aWVzUmVnZXguJykpPyArYXMgK30nLCAkZnVsbFZlcnNpb24pKSB7CiRleHRyYU1lc3NhZ2UgPSAnIGluICInIC4gJGZ1bGxWZXJzaW9uIC4gJyIsIHRoZSBhbGlhcyBzb3VyY2UgbXVzdCBiZSBhbiBleGFjdCB2ZXJzaW9uLCBpZiBpdCBpcyBhIGJyYW5jaCBuYW1lIHlvdSBzaG91bGQgcHJlZml4IGl0IHdpdGggZGV2LSc7Cn0KCnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdJbnZhbGlkIHZlcnNpb24gc3RyaW5nICInIC4gJG9yaWdWZXJzaW9uIC4gJyInIC4gJGV4dHJhTWVzc2FnZSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcGFyc2VOdW1lcmljQWxpYXNQcmVmaXgoJGJyYW5jaCkKewppZiAocHJlZ19tYXRjaCgne14oP1A8dmVyc2lvbj4oXGQrK1xcLikqXGQrKykoPzpcLngpPy1kZXYkfWknLCAoc3RyaW5nKSAkYnJhbmNoLCAkbWF0Y2hlcykpIHsKcmV0dXJuICRtYXRjaGVzWyd2ZXJzaW9uJ10gLiAnLic7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBub3JtYWxpemVCcmFuY2goJG5hbWUpCnsKJG5hbWUgPSB0cmltKChzdHJpbmcpICRuYW1lKTsKCmlmIChwcmVnX21hdGNoKCd7XnY/KFxkKyspKFwuKD86XGQrK3xbeFgqXSkpPyhcLig/OlxkKyt8W3hYKl0pKT8oXC4oPzpcZCsrfFt4WCpdKSk/JH1pJywgJG5hbWUsICRtYXRjaGVzKSkgewokdmVyc2lvbiA9ICcnOwpmb3IgKCRpID0gMTsgJGkgPCA1OyArKyRpKSB7CiR2ZXJzaW9uIC49IGlzc2V0KCRtYXRjaGVzWyRpXSkgPyBzdHJfcmVwbGFjZShhcnJheSgnKicsICdYJyksICd4JywgJG1hdGNoZXNbJGldKSA6ICcueCc7Cn0KCnJldHVybiBzdHJfcmVwbGFjZSgneCcsICc5OTk5OTk5JywgJHZlcnNpb24pIC4gJy1kZXYnOwp9CgpyZXR1cm4gJ2Rldi0nIC4gJG5hbWU7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBub3JtYWxpemVEZWZhdWx0QnJhbmNoKCRuYW1lKQp7CmlmICgkbmFtZSA9PT0gJ2Rldi1tYXN0ZXInIHx8ICRuYW1lID09PSAnZGV2LWRlZmF1bHQnIHx8ICRuYW1lID09PSAnZGV2LXRydW5rJykgewpyZXR1cm4gJzk5OTk5OTktZGV2JzsKfQoKcmV0dXJuIChzdHJpbmcpICRuYW1lOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHBhcnNlQ29uc3RyYWludHMoJGNvbnN0cmFpbnRzKQp7CiRwcmV0dHlDb25zdHJhaW50ID0gKHN0cmluZykgJGNvbnN0cmFpbnRzOwoKJG9yQ29uc3RyYWludHMgPSBwcmVnX3NwbGl0KCd7XHMqXHxcfD9ccyp9JywgdHJpbSgoc3RyaW5nKSAkY29uc3RyYWludHMpKTsKaWYgKGZhbHNlID09PSAkb3JDb25zdHJhaW50cykgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byBwcmVnX3NwbGl0IHN0cmluZzogJy4kY29uc3RyYWludHMpOwp9CiRvckdyb3VwcyA9IGFycmF5KCk7Cgpmb3JlYWNoICgkb3JDb25zdHJhaW50cyBhcyAkb3JDb25zdHJhaW50KSB7CiRhbmRDb25zdHJhaW50cyA9IHByZWdfc3BsaXQoJ3soPzwhXnxhc3xbPT48ICxdKSAqKD88IS0pWywgXSg/IS0pICooPyEsfGFzfCQpfScsICRvckNvbnN0cmFpbnQpOwppZiAoZmFsc2UgPT09ICRhbmRDb25zdHJhaW50cykgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byBwcmVnX3NwbGl0IHN0cmluZzogJy4kb3JDb25zdHJhaW50KTsKfQppZiAoXGNvdW50KCRhbmRDb25zdHJhaW50cykgPiAxKSB7CiRjb25zdHJhaW50T2JqZWN0cyA9IGFycmF5KCk7CmZvcmVhY2ggKCRhbmRDb25zdHJhaW50cyBhcyAkYW5kQ29uc3RyYWludCkgewpmb3JlYWNoICgkdGhpcy0+cGFyc2VDb25zdHJhaW50KCRhbmRDb25zdHJhaW50KSBhcyAkcGFyc2VkQW5kQ29uc3RyYWludCkgewokY29uc3RyYWludE9iamVjdHNbXSA9ICRwYXJzZWRBbmRDb25zdHJhaW50Owp9Cn0KfSBlbHNlIHsKJGNvbnN0cmFpbnRPYmplY3RzID0gJHRoaXMtPnBhcnNlQ29uc3RyYWludCgkYW5kQ29uc3RyYWludHNbMF0pOwp9CgppZiAoMSA9PT0gXGNvdW50KCRjb25zdHJhaW50T2JqZWN0cykpIHsKJGNvbnN0cmFpbnQgPSAkY29uc3RyYWludE9iamVjdHNbMF07Cn0gZWxzZSB7CiRjb25zdHJhaW50ID0gbmV3IE11bHRpQ29uc3RyYWludCgkY29uc3RyYWludE9iamVjdHMpOwp9Cgokb3JHcm91cHNbXSA9ICRjb25zdHJhaW50Owp9CgokcGFyc2VkQ29uc3RyYWludCA9IE11bHRpQ29uc3RyYWludDo6Y3JlYXRlKCRvckdyb3VwcywgZmFsc2UpOwoKJHBhcnNlZENvbnN0cmFpbnQtPnNldFByZXR0eVN0cmluZygkcHJldHR5Q29uc3RyYWludCk7CgpyZXR1cm4gJHBhcnNlZENvbnN0cmFpbnQ7Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcGFyc2VDb25zdHJhaW50KCRjb25zdHJhaW50KQp7CgppZiAocHJlZ19tYXRjaCgne14oW14sXHNdKyspICsrYXMgKysoW14sXHNdKyspJH0nLCAkY29uc3RyYWludCwgJG1hdGNoKSkgewokY29uc3RyYWludCA9ICRtYXRjaFsxXTsKfQoKCmlmIChwcmVnX21hdGNoKCd7XihbXixcc10qPylAKCcgLiBzZWxmOjokc3RhYmlsaXRpZXNSZWdleCAuICcpJH1pJywgJGNvbnN0cmFpbnQsICRtYXRjaCkpIHsKJGNvbnN0cmFpbnQgPSAnJyAhPT0gJG1hdGNoWzFdID8gJG1hdGNoWzFdIDogJyonOwppZiAoJG1hdGNoWzJdICE9PSAnc3RhYmxlJykgewokc3RhYmlsaXR5TW9kaWZpZXIgPSAkbWF0Y2hbMl07Cn0KfQoKCmlmIChwcmVnX21hdGNoKCd7XihkZXYtW14sXHNAXSs/fFteLFxzQF0rP1wueC1kZXYpIy4rJH1pJywgJGNvbnN0cmFpbnQsICRtYXRjaCkpIHsKJGNvbnN0cmFpbnQgPSAkbWF0Y2hbMV07Cn0KCmlmIChwcmVnX21hdGNoKCd7Xih2KT9beFgqXShcLlt4WCpdKSokfWknLCAkY29uc3RyYWludCwgJG1hdGNoKSkgewppZiAoIWVtcHR5KCRtYXRjaFsxXSkgfHwgIWVtcHR5KCRtYXRjaFsyXSkpIHsKcmV0dXJuIGFycmF5KG5ldyBDb25zdHJhaW50KCc+PScsICcwLjAuMC4wLWRldicpKTsKfQoKcmV0dXJuIGFycmF5KG5ldyBNYXRjaEFsbENvbnN0cmFpbnQoKSk7Cn0KCiR2ZXJzaW9uUmVnZXggPSAndj8oXGQrKykoPzpcLihcZCsrKSk/KD86XC4oXGQrKykpPyg/OlwuKFxkKyspKT8oPzonIC4gc2VsZjo6JG1vZGlmaWVyUmVnZXggLiAnfFwuKFt4WCpdWy4tXT9kZXYpKSg/OlwrW15cc10rKT8nOwoKCgoKCgppZiAocHJlZ19tYXRjaCgne15+Pj8nIC4gJHZlcnNpb25SZWdleCAuICckfWknLCAkY29uc3RyYWludCwgJG1hdGNoZXMpKSB7CmlmIChzdHJwb3MoJGNvbnN0cmFpbnQsICd+PicpID09PSAwKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKAonQ291bGQgbm90IHBhcnNlIHZlcnNpb24gY29uc3RyYWludCAnIC4gJGNvbnN0cmFpbnQgLiAnOiAnIC4KJ0ludmFsaWQgb3BlcmF0b3IgIn4+IiwgeW91IHByb2JhYmx5IG1lYW50IHRvIHVzZSB0aGUgIn4iIG9wZXJhdG9yJwopOwp9CgoKaWYgKGlzc2V0KCRtYXRjaGVzWzRdKSAmJiAnJyAhPT0gJG1hdGNoZXNbNF0gJiYgbnVsbCAhPT0gJG1hdGNoZXNbNF0pIHsKJHBvc2l0aW9uID0gNDsKfSBlbHNlaWYgKGlzc2V0KCRtYXRjaGVzWzNdKSAmJiAnJyAhPT0gJG1hdGNoZXNbM10gJiYgbnVsbCAhPT0gJG1hdGNoZXNbM10pIHsKJHBvc2l0aW9uID0gMzsKfSBlbHNlaWYgKGlzc2V0KCRtYXRjaGVzWzJdKSAmJiAnJyAhPT0gJG1hdGNoZXNbMl0gJiYgbnVsbCAhPT0gJG1hdGNoZXNbMl0pIHsKJHBvc2l0aW9uID0gMjsKfSBlbHNlIHsKJHBvc2l0aW9uID0gMTsKfQoKCmlmICghZW1wdHkoJG1hdGNoZXNbOF0pKSB7CiRwb3NpdGlvbisrOwp9CgoKJHN0YWJpbGl0eVN1ZmZpeCA9ICcnOwppZiAoZW1wdHkoJG1hdGNoZXNbNV0pICYmIGVtcHR5KCRtYXRjaGVzWzddKSAmJiBlbXB0eSgkbWF0Y2hlc1s4XSkpIHsKJHN0YWJpbGl0eVN1ZmZpeCAuPSAnLWRldic7Cn0KCiRsb3dWZXJzaW9uID0gJHRoaXMtPm5vcm1hbGl6ZShzdWJzdHIoJGNvbnN0cmFpbnQgLiAkc3RhYmlsaXR5U3VmZml4LCAxKSk7CiRsb3dlckJvdW5kID0gbmV3IENvbnN0cmFpbnQoJz49JywgJGxvd1ZlcnNpb24pOwoKCgokaGlnaFBvc2l0aW9uID0gbWF4KDEsICRwb3NpdGlvbiAtIDEpOwokaGlnaFZlcnNpb24gPSAkdGhpcy0+bWFuaXB1bGF0ZVZlcnNpb25TdHJpbmcoJG1hdGNoZXMsICRoaWdoUG9zaXRpb24sIDEpIC4gJy1kZXYnOwokdXBwZXJCb3VuZCA9IG5ldyBDb25zdHJhaW50KCc8JywgJGhpZ2hWZXJzaW9uKTsKCnJldHVybiBhcnJheSgKJGxvd2VyQm91bmQsCiR1cHBlckJvdW5kLAopOwp9CgoKCgoKCmlmIChwcmVnX21hdGNoKCd7XlxeJyAuICR2ZXJzaW9uUmVnZXggLiAnKCQpfWknLCAkY29uc3RyYWludCwgJG1hdGNoZXMpKSB7CgppZiAoJzAnICE9PSAkbWF0Y2hlc1sxXSB8fCAnJyA9PT0gJG1hdGNoZXNbMl0gfHwgbnVsbCA9PT0gJG1hdGNoZXNbMl0pIHsKJHBvc2l0aW9uID0gMTsKfSBlbHNlaWYgKCcwJyAhPT0gJG1hdGNoZXNbMl0gfHwgJycgPT09ICRtYXRjaGVzWzNdIHx8IG51bGwgPT09ICRtYXRjaGVzWzNdKSB7CiRwb3NpdGlvbiA9IDI7Cn0gZWxzZSB7CiRwb3NpdGlvbiA9IDM7Cn0KCgokc3RhYmlsaXR5U3VmZml4ID0gJyc7CmlmIChlbXB0eSgkbWF0Y2hlc1s1XSkgJiYgZW1wdHkoJG1hdGNoZXNbN10pICYmIGVtcHR5KCRtYXRjaGVzWzhdKSkgewokc3RhYmlsaXR5U3VmZml4IC49ICctZGV2JzsKfQoKJGxvd1ZlcnNpb24gPSAkdGhpcy0+bm9ybWFsaXplKHN1YnN0cigkY29uc3RyYWludCAuICRzdGFiaWxpdHlTdWZmaXgsIDEpKTsKJGxvd2VyQm91bmQgPSBuZXcgQ29uc3RyYWludCgnPj0nLCAkbG93VmVyc2lvbik7CgoKCiRoaWdoVmVyc2lvbiA9ICR0aGlzLT5tYW5pcHVsYXRlVmVyc2lvblN0cmluZygkbWF0Y2hlcywgJHBvc2l0aW9uLCAxKSAuICctZGV2JzsKJHVwcGVyQm91bmQgPSBuZXcgQ29uc3RyYWludCgnPCcsICRoaWdoVmVyc2lvbik7CgpyZXR1cm4gYXJyYXkoCiRsb3dlckJvdW5kLAokdXBwZXJCb3VuZCwKKTsKfQoKCgoKCmlmIChwcmVnX21hdGNoKCd7XnY/KFxkKyspKD86XC4oXGQrKykpPyg/OlwuKFxkKyspKT8oPzpcLlt4WCpdKSsrJH0nLCAkY29uc3RyYWludCwgJG1hdGNoZXMpKSB7CmlmIChpc3NldCgkbWF0Y2hlc1szXSkgJiYgJycgIT09ICRtYXRjaGVzWzNdICYmIG51bGwgIT09ICRtYXRjaGVzWzNdKSB7CiRwb3NpdGlvbiA9IDM7Cn0gZWxzZWlmIChpc3NldCgkbWF0Y2hlc1syXSkgJiYgJycgIT09ICRtYXRjaGVzWzJdICYmIG51bGwgIT09ICRtYXRjaGVzWzJdKSB7CiRwb3NpdGlvbiA9IDI7Cn0gZWxzZSB7CiRwb3NpdGlvbiA9IDE7Cn0KCiRsb3dWZXJzaW9uID0gJHRoaXMtPm1hbmlwdWxhdGVWZXJzaW9uU3RyaW5nKCRtYXRjaGVzLCAkcG9zaXRpb24pIC4gJy1kZXYnOwokaGlnaFZlcnNpb24gPSAkdGhpcy0+bWFuaXB1bGF0ZVZlcnNpb25TdHJpbmcoJG1hdGNoZXMsICRwb3NpdGlvbiwgMSkgLiAnLWRldic7CgppZiAoJGxvd1ZlcnNpb24gPT09ICcwLjAuMC4wLWRldicpIHsKcmV0dXJuIGFycmF5KG5ldyBDb25zdHJhaW50KCc8JywgJGhpZ2hWZXJzaW9uKSk7Cn0KCnJldHVybiBhcnJheSgKbmV3IENvbnN0cmFpbnQoJz49JywgJGxvd1ZlcnNpb24pLApuZXcgQ29uc3RyYWludCgnPCcsICRoaWdoVmVyc2lvbiksCik7Cn0KCgoKCgoKCmlmIChwcmVnX21hdGNoKCd7Xig/UDxmcm9tPicgLiAkdmVyc2lvblJlZ2V4IC4gJykgKy0gKyg/UDx0bz4nIC4gJHZlcnNpb25SZWdleCAuICcpKCQpfWknLCAkY29uc3RyYWludCwgJG1hdGNoZXMpKSB7CgokbG93U3RhYmlsaXR5U3VmZml4ID0gJyc7CmlmIChlbXB0eSgkbWF0Y2hlc1s2XSkgJiYgZW1wdHkoJG1hdGNoZXNbOF0pICYmIGVtcHR5KCRtYXRjaGVzWzldKSkgewokbG93U3RhYmlsaXR5U3VmZml4ID0gJy1kZXYnOwp9CgokbG93VmVyc2lvbiA9ICR0aGlzLT5ub3JtYWxpemUoJG1hdGNoZXNbJ2Zyb20nXSk7CiRsb3dlckJvdW5kID0gbmV3IENvbnN0cmFpbnQoJz49JywgJGxvd1ZlcnNpb24gLiAkbG93U3RhYmlsaXR5U3VmZml4KTsKCiRlbXB0eSA9IGZ1bmN0aW9uICgkeCkgewpyZXR1cm4gKCR4ID09PSAwIHx8ICR4ID09PSAnMCcpID8gZmFsc2UgOiBlbXB0eSgkeCk7Cn07CgppZiAoKCEkZW1wdHkoJG1hdGNoZXNbMTJdKSAmJiAhJGVtcHR5KCRtYXRjaGVzWzEzXSkpIHx8ICFlbXB0eSgkbWF0Y2hlc1sxNV0pIHx8ICFlbXB0eSgkbWF0Y2hlc1sxN10pIHx8ICFlbXB0eSgkbWF0Y2hlc1sxOF0pKSB7CiRoaWdoVmVyc2lvbiA9ICR0aGlzLT5ub3JtYWxpemUoJG1hdGNoZXNbJ3RvJ10pOwokdXBwZXJCb3VuZCA9IG5ldyBDb25zdHJhaW50KCc8PScsICRoaWdoVmVyc2lvbik7Cn0gZWxzZSB7CiRoaWdoTWF0Y2ggPSBhcnJheSgnJywgJG1hdGNoZXNbMTFdLCAkbWF0Y2hlc1sxMl0sICRtYXRjaGVzWzEzXSwgJG1hdGNoZXNbMTRdKTsKCgokdGhpcy0+bm9ybWFsaXplKCRtYXRjaGVzWyd0byddKTsKCiRoaWdoVmVyc2lvbiA9ICR0aGlzLT5tYW5pcHVsYXRlVmVyc2lvblN0cmluZygkaGlnaE1hdGNoLCAkZW1wdHkoJG1hdGNoZXNbMTJdKSA/IDEgOiAyLCAxKSAuICctZGV2JzsKJHVwcGVyQm91bmQgPSBuZXcgQ29uc3RyYWludCgnPCcsICRoaWdoVmVyc2lvbik7Cn0KCnJldHVybiBhcnJheSgKJGxvd2VyQm91bmQsCiR1cHBlckJvdW5kLAopOwp9CgoKaWYgKHByZWdfbWF0Y2goJ3teKDw+fCE9fD49P3w8PT98PT0/KT9ccyooLiopfScsICRjb25zdHJhaW50LCAkbWF0Y2hlcykpIHsKdHJ5IHsKdHJ5IHsKJHZlcnNpb24gPSAkdGhpcy0+bm9ybWFsaXplKCRtYXRjaGVzWzJdKTsKfSBjYXRjaCAoXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbiAkZSkgewoKCmlmIChzdWJzdHIoJG1hdGNoZXNbMl0sIC00KSA9PT0gJy1kZXYnICYmIHByZWdfbWF0Y2goJ3teWzAtOWEtekEtWi0uL10rJH0nLCAkbWF0Y2hlc1syXSkpIHsKJHZlcnNpb24gPSAkdGhpcy0+bm9ybWFsaXplKCdkZXYtJy5zdWJzdHIoJG1hdGNoZXNbMl0sIDAsIC00KSk7Cn0gZWxzZSB7CnRocm93ICRlOwp9Cn0KCiRvcCA9ICRtYXRjaGVzWzFdID86ICc9JzsKCmlmICgkb3AgIT09ICc9PScgJiYgJG9wICE9PSAnPScgJiYgIWVtcHR5KCRzdGFiaWxpdHlNb2RpZmllcikgJiYgc2VsZjo6cGFyc2VTdGFiaWxpdHkoJHZlcnNpb24pID09PSAnc3RhYmxlJykgewokdmVyc2lvbiAuPSAnLScgLiAkc3RhYmlsaXR5TW9kaWZpZXI7Cn0gZWxzZWlmICgnPCcgPT09ICRvcCB8fCAnPj0nID09PSAkb3ApIHsKaWYgKCFwcmVnX21hdGNoKCcvLScgLiBzZWxmOjokbW9kaWZpZXJSZWdleCAuICckLycsIHN0cnRvbG93ZXIoJG1hdGNoZXNbMl0pKSkgewppZiAoc3RycG9zKCRtYXRjaGVzWzJdLCAnZGV2LScpICE9PSAwKSB7CiR2ZXJzaW9uIC49ICctZGV2JzsKfQp9Cn0KCnJldHVybiBhcnJheShuZXcgQ29uc3RyYWludCgkbWF0Y2hlc1sxXSA/OiAnPScsICR2ZXJzaW9uKSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKfQp9CgokbWVzc2FnZSA9ICdDb3VsZCBub3QgcGFyc2UgdmVyc2lvbiBjb25zdHJhaW50ICcgLiAkY29uc3RyYWludDsKaWYgKGlzc2V0KCRlKSkgewokbWVzc2FnZSAuPSAnOiAnIC4gJGUtPmdldE1lc3NhZ2UoKTsKfQoKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJG1lc3NhZ2UpOwp9CgoKCgoKCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gbWFuaXB1bGF0ZVZlcnNpb25TdHJpbmcoYXJyYXkgJG1hdGNoZXMsICRwb3NpdGlvbiwgJGluY3JlbWVudCA9IDAsICRwYWQgPSAnMCcpCnsKZm9yICgkaSA9IDQ7ICRpID4gMDsgLS0kaSkgewppZiAoJGkgPiAkcG9zaXRpb24pIHsKJG1hdGNoZXNbJGldID0gJHBhZDsKfSBlbHNlaWYgKCRpID09PSAkcG9zaXRpb24gJiYgJGluY3JlbWVudCkgewokbWF0Y2hlc1skaV0gKz0gJGluY3JlbWVudDsKCmlmICgkbWF0Y2hlc1skaV0gPCAwKSB7CiRtYXRjaGVzWyRpXSA9ICRwYWQ7Ci0tJHBvc2l0aW9uOwoKCmlmICgkaSA9PT0gMSkgewpyZXR1cm4gbnVsbDsKfQp9Cn0KfQoKcmV0dXJuICRtYXRjaGVzWzFdIC4gJy4nIC4gJG1hdGNoZXNbMl0gLiAnLicgLiAkbWF0Y2hlc1szXSAuICcuJyAuICRtYXRjaGVzWzRdOwp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBleHBhbmRTdGFiaWxpdHkoJHN0YWJpbGl0eSkKewokc3RhYmlsaXR5ID0gc3RydG9sb3dlcigkc3RhYmlsaXR5KTsKCnN3aXRjaCAoJHN0YWJpbGl0eSkgewpjYXNlICdhJzoKcmV0dXJuICdhbHBoYSc7CmNhc2UgJ2InOgpyZXR1cm4gJ2JldGEnOwpjYXNlICdwJzoKY2FzZSAncGwnOgpyZXR1cm4gJ3BhdGNoJzsKY2FzZSAncmMnOgpyZXR1cm4gJ1JDJzsKZGVmYXVsdDoKcmV0dXJuICRzdGFiaWxpdHk7Cn0KfQp9CgpDb3B5cmlnaHQgKEMpIDIwMTUgQ29tcG9zZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwp1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcwpvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8Kc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuCgp7CiAgICAiMzg5LWV4Y2VwdGlvbiI6IFsKICAgICAgICAiMzg5IERpcmVjdG9yeSBTZXJ2ZXIgRXhjZXB0aW9uIgogICAgXSwKICAgICJBc3Rlcmlzay1leGNlcHRpb24iOiBbCiAgICAgICAgIkFzdGVyaXNrIGV4Y2VwdGlvbiIKICAgIF0sCiAgICAiQXN0ZXJpc2stbGlua2luZy1wcm90b2NvbHMtZXhjZXB0aW9uIjogWwogICAgICAgICJBc3RlcmlzayBsaW5raW5nIHByb3RvY29scyBleGNlcHRpb24iCiAgICBdLAogICAgIkF1dG9jb25mLWV4Y2VwdGlvbi0yLjAiOiBbCiAgICAgICAgIkF1dG9jb25mIGV4Y2VwdGlvbiAyLjAiCiAgICBdLAogICAgIkF1dG9jb25mLWV4Y2VwdGlvbi0zLjAiOiBbCiAgICAgICAgIkF1dG9jb25mIGV4Y2VwdGlvbiAzLjAiCiAgICBdLAogICAgIkF1dG9jb25mLWV4Y2VwdGlvbi1nZW5lcmljIjogWwogICAgICAgICJBdXRvY29uZiBnZW5lcmljIGV4Y2VwdGlvbiIKICAgIF0sCiAgICAiQXV0b2NvbmYtZXhjZXB0aW9uLWdlbmVyaWMtMy4wIjogWwogICAgICAgICJBdXRvY29uZiBnZW5lcmljIGV4Y2VwdGlvbiBmb3IgR1BMLTMuMCIKICAgIF0sCiAgICAiQXV0b2NvbmYtZXhjZXB0aW9uLW1hY3JvIjogWwogICAgICAgICJBdXRvY29uZiBtYWNybyBleGNlcHRpb24iCiAgICBdLAogICAgIkJpc29uLWV4Y2VwdGlvbi0xLjI0IjogWwogICAgICAgICJCaXNvbiBleGNlcHRpb24gMS4yNCIKICAgIF0sCiAgICAiQmlzb24tZXhjZXB0aW9uLTIuMiI6IFsKICAgICAgICAiQmlzb24gZXhjZXB0aW9uIDIuMiIKICAgIF0sCiAgICAiQm9vdGxvYWRlci1leGNlcHRpb24iOiBbCiAgICAgICAgIkJvb3Rsb2FkZXIgRGlzdHJpYnV0aW9uIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiQ0dBTC1saW5raW5nLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiQ0dBTCBMaW5raW5nIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAiOiBbCiAgICAgICAgIkNsYXNzcGF0aCBleGNlcHRpb24gMi4wIgogICAgXSwKICAgICJDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMC1zaG9ydCI6IFsKICAgICAgICAiQ2xhc3NwYXRoIGV4Y2VwdGlvbiAyLjAgLSBzaG9ydCIKICAgIF0sCiAgICAiQ0xJU1AtZXhjZXB0aW9uLTIuMCI6IFsKICAgICAgICAiQ0xJU1AgZXhjZXB0aW9uIDIuMCIKICAgIF0sCiAgICAiY3J5cHRzZXR1cC1PcGVuU1NMLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiY3J5cHRzZXR1cCBPcGVuU1NMIGV4Y2VwdGlvbiIKICAgIF0sCiAgICAiRGlnaWEtUXQtTEdQTC1leGNlcHRpb24tMS4xIjogWwogICAgICAgICJEaWdpYSBRdCBMR1BMIEV4Y2VwdGlvbiB2ZXJzaW9uIDEuMSIKICAgIF0sCiAgICAiRGlnaVJ1bGUtRk9TUy1leGNlcHRpb24iOiBbCiAgICAgICAgIkRpZ2lSdWxlIEZPU1MgTGljZW5zZSBFeGNlcHRpb24iCiAgICBdLAogICAgImVDb3MtZXhjZXB0aW9uLTIuMCI6IFsKICAgICAgICAiZUNvcyBleGNlcHRpb24gMi4wIgogICAgXSwKICAgICJlcmxhbmctb3RwLWxpbmtpbmctZXhjZXB0aW9uIjogWwogICAgICAgICJFcmxhbmcvT1RQIExpbmtpbmcgRXhjZXB0aW9uIgogICAgXSwKICAgICJGYXdrZXMtUnVudGltZS1leGNlcHRpb24iOiBbCiAgICAgICAgIkZhd2tlcyBSdW50aW1lIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiRkxUSy1leGNlcHRpb24iOiBbCiAgICAgICAgIkZMVEsgZXhjZXB0aW9uIgogICAgXSwKICAgICJmbXQtZXhjZXB0aW9uIjogWwogICAgICAgICJmbXQgZXhjZXB0aW9uIgogICAgXSwKICAgICJGb250LWV4Y2VwdGlvbi0yLjAiOiBbCiAgICAgICAgIkZvbnQgZXhjZXB0aW9uIDIuMCIKICAgIF0sCiAgICAiZnJlZXJ0b3MtZXhjZXB0aW9uLTIuMCI6IFsKICAgICAgICAiRnJlZVJUT1MgRXhjZXB0aW9uIDIuMCIKICAgIF0sCiAgICAiR0NDLWV4Y2VwdGlvbi0yLjAiOiBbCiAgICAgICAgIkdDQyBSdW50aW1lIExpYnJhcnkgZXhjZXB0aW9uIDIuMCIKICAgIF0sCiAgICAiR0NDLWV4Y2VwdGlvbi0yLjAtbm90ZSI6IFsKICAgICAgICAiR0NDICAgIFJ1bnRpbWUgTGlicmFyeSBleGNlcHRpb24gMi4wIC0gbm90ZSB2YXJpYW50IgogICAgXSwKICAgICJHQ0MtZXhjZXB0aW9uLTMuMSI6IFsKICAgICAgICAiR0NDIFJ1bnRpbWUgTGlicmFyeSBleGNlcHRpb24gMy4xIgogICAgXSwKICAgICJHbXNoLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiR21zaCBleGNlcHRpb24iCiAgICBdLAogICAgIkdOQVQtZXhjZXB0aW9uIjogWwogICAgICAgICJHTkFUIGV4Y2VwdGlvbiIKICAgIF0sCiAgICAiR05PTUUtZXhhbXBsZXMtZXhjZXB0aW9uIjogWwogICAgICAgICJHTk9NRSBleGFtcGxlcyBleGNlcHRpb24iCiAgICBdLAogICAgIkdOVS1jb21waWxlci1leGNlcHRpb24iOiBbCiAgICAgICAgIkdOVSBDb21waWxlciBFeGNlcHRpb24iCiAgICBdLAogICAgImdudS1qYXZhbWFpbC1leGNlcHRpb24iOiBbCiAgICAgICAgIkdOVSBKYXZhTWFpbCBleGNlcHRpb24iCiAgICBdLAogICAgIkdQTC0zLjAtMzg5LWRzLWJhc2UtZXhjZXB0aW9uIjogWwogICAgICAgICJHUEwtMy4wIDM4OSBEUyBCYXNlIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiR1BMLTMuMC1pbnRlcmZhY2UtZXhjZXB0aW9uIjogWwogICAgICAgICJHUEwtMy4wIEludGVyZmFjZSBFeGNlcHRpb24iCiAgICBdLAogICAgIkdQTC0zLjAtbGlua2luZy1leGNlcHRpb24iOiBbCiAgICAgICAgIkdQTC0zLjAgTGlua2luZyBFeGNlcHRpb24iCiAgICBdLAogICAgIkdQTC0zLjAtbGlua2luZy1zb3VyY2UtZXhjZXB0aW9uIjogWwogICAgICAgICJHUEwtMy4wIExpbmtpbmcgRXhjZXB0aW9uICh3aXRoIENvcnJlc3BvbmRpbmcgU291cmNlKSIKICAgIF0sCiAgICAiR1BMLUNDLTEuMCI6IFsKICAgICAgICAiR1BMIENvb3BlcmF0aW9uIENvbW1pdG1lbnQgMS4wIgogICAgXSwKICAgICJHU3RyZWFtZXItZXhjZXB0aW9uLTIwMDUiOiBbCiAgICAgICAgIkdTdHJlYW1lciBFeGNlcHRpb24gKDIwMDUpIgogICAgXSwKICAgICJHU3RyZWFtZXItZXhjZXB0aW9uLTIwMDgiOiBbCiAgICAgICAgIkdTdHJlYW1lciBFeGNlcHRpb24gKDIwMDgpIgogICAgXSwKICAgICJoYXJib3VyLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiaGFyYm91ciBleGNlcHRpb24iCiAgICBdLAogICAgImkycC1ncGwtamF2YS1leGNlcHRpb24iOiBbCiAgICAgICAgImkycCBHUEwrSmF2YSBFeGNlcHRpb24iCiAgICBdLAogICAgIkluZGVwZW5kZW50LW1vZHVsZXMtZXhjZXB0aW9uIjogWwogICAgICAgICJJbmRlcGVuZGVudCBNb2R1bGUgTGlua2luZyBleGNlcHRpb24iCiAgICBdLAogICAgIktpQ2FkLWxpYnJhcmllcy1leGNlcHRpb24iOiBbCiAgICAgICAgIktpQ2FkIExpYnJhcmllcyBFeGNlcHRpb24iCiAgICBdLAogICAgImt2aXJjLW9wZW5zc2wtZXhjZXB0aW9uIjogWwogICAgICAgICJrdmlyYyBPcGVuU1NMIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiTEdQTC0zLjAtbGlua2luZy1leGNlcHRpb24iOiBbCiAgICAgICAgIkxHUEwtMy4wIExpbmtpbmcgRXhjZXB0aW9uIgogICAgXSwKICAgICJsaWJwcmktT3BlbkgzMjMtZXhjZXB0aW9uIjogWwogICAgICAgICJsaWJwcmkgT3BlbkgzMjMgZXhjZXB0aW9uIgogICAgXSwKICAgICJMaWJ0b29sLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiTGlidG9vbCBFeGNlcHRpb24iCiAgICBdLAogICAgIkxpbnV4LXN5c2NhbGwtbm90ZSI6IFsKICAgICAgICAiTGludXggU3lzY2FsbCBOb3RlIgogICAgXSwKICAgICJMTEdQTCI6IFsKICAgICAgICAiTExHUEwgUHJlYW1ibGUiCiAgICBdLAogICAgIkxMVk0tZXhjZXB0aW9uIjogWwogICAgICAgICJMTFZNIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiTFpNQS1leGNlcHRpb24iOiBbCiAgICAgICAgIkxaTUEgZXhjZXB0aW9uIgogICAgXSwKICAgICJtaWYtZXhjZXB0aW9uIjogWwogICAgICAgICJNYWNyb3MgYW5kIElubGluZSBGdW5jdGlvbnMgRXhjZXB0aW9uIgogICAgXSwKICAgICJteG1sLWV4Y2VwdGlvbiI6IFsKICAgICAgICAibXhtbCBFeGNlcHRpb24iCiAgICBdLAogICAgIk5va2lhLVF0LWV4Y2VwdGlvbi0xLjEiOiBbCiAgICAgICAgIk5va2lhIFF0IExHUEwgZXhjZXB0aW9uIDEuMSIKICAgIF0sCiAgICAiT0NhbWwtTEdQTC1saW5raW5nLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiT0NhbWwgTEdQTCBMaW5raW5nIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiT0NDVC1leGNlcHRpb24tMS4wIjogWwogICAgICAgICJPcGVuIENBU0NBREUgRXhjZXB0aW9uIDEuMCIKICAgIF0sCiAgICAiT3BlbkpESy1hc3NlbWJseS1leGNlcHRpb24tMS4wIjogWwogICAgICAgICJPcGVuSkRLIEFzc2VtYmx5IGV4Y2VwdGlvbiAxLjAiCiAgICBdLAogICAgIm9wZW52cG4tb3BlbnNzbC1leGNlcHRpb24iOiBbCiAgICAgICAgIk9wZW5WUE4gT3BlblNTTCBFeGNlcHRpb24iCiAgICBdLAogICAgIlBDUkUyLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiUENSRTIgZXhjZXB0aW9uIgogICAgXSwKICAgICJwb2x5cGFyc2UtZXhjZXB0aW9uIjogWwogICAgICAgICJQb2x5cGFyc2UgRXhjZXB0aW9uIgogICAgXSwKICAgICJQUy1vci1QREYtZm9udC1leGNlcHRpb24tMjAxNzA4MTciOiBbCiAgICAgICAgIlBTL1BERiBmb250IGV4Y2VwdGlvbiAoMjAxNy0wOC0xNykiCiAgICBdLAogICAgIlFQTC0xLjAtSU5SSUEtMjAwNC1leGNlcHRpb24iOiBbCiAgICAgICAgIklOUklBIFFQTCAxLjAgMjAwNCB2YXJpYW50IGV4Y2VwdGlvbiIKICAgIF0sCiAgICAiUXQtR1BMLWV4Y2VwdGlvbi0xLjAiOiBbCiAgICAgICAgIlF0IEdQTCBleGNlcHRpb24gMS4wIgogICAgXSwKICAgICJRdC1MR1BMLWV4Y2VwdGlvbi0xLjEiOiBbCiAgICAgICAgIlF0IExHUEwgZXhjZXB0aW9uIDEuMSIKICAgIF0sCiAgICAiUXd0LWV4Y2VwdGlvbi0xLjAiOiBbCiAgICAgICAgIlF3dCBleGNlcHRpb24gMS4wIgogICAgXSwKICAgICJyb21pYy1leGNlcHRpb24iOiBbCiAgICAgICAgIlJvbWljIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiUlJEdG9vbC1GTE9TUy1leGNlcHRpb24tMi4wIjogWwogICAgICAgICJSUkR0b29sIEZMT1NTIGV4Y2VwdGlvbiAyLjAiCiAgICBdLAogICAgInJzeW5jLWxpbmtpbmctZXhjZXB0aW9uIjogWwogICAgICAgICJyc3luYyBMaW5raW5nIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiU0FORS1leGNlcHRpb24iOiBbCiAgICAgICAgIlNBTkUgRXhjZXB0aW9uIgogICAgXSwKICAgICJTSEwtMi4wIjogWwogICAgICAgICJTb2xkZXJwYWQgSGFyZHdhcmUgTGljZW5zZSB2Mi4wIgogICAgXSwKICAgICJTSEwtMi4xIjogWwogICAgICAgICJTb2xkZXJwYWQgSGFyZHdhcmUgTGljZW5zZSB2Mi4xIgogICAgXSwKICAgICJTaW1wbGUtTGlicmFyeS1Vc2FnZS1leGNlcHRpb24iOiBbCiAgICAgICAgIlNpbXBsZSBMaWJyYXJ5IFVzYWdlIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAic3FsaXRlc3R1ZGlvLU9wZW5TU0wtZXhjZXB0aW9uIjogWwogICAgICAgICJzcWxpdGVzdHVkaW8gT3BlblNTTCBleGNlcHRpb24iCiAgICBdLAogICAgInN0dW5uZWwtZXhjZXB0aW9uIjogWwogICAgICAgICJzdHVubmVsIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiU1dJLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiU1dJIGV4Y2VwdGlvbiIKICAgIF0sCiAgICAiU3dpZnQtZXhjZXB0aW9uIjogWwogICAgICAgICJTd2lmdCBFeGNlcHRpb24iCiAgICBdLAogICAgIlRleGluZm8tZXhjZXB0aW9uIjogWwogICAgICAgICJUZXhpbmZvIGV4Y2VwdGlvbiIKICAgIF0sCiAgICAidS1ib290LWV4Y2VwdGlvbi0yLjAiOiBbCiAgICAgICAgIlUtQm9vdCBleGNlcHRpb24gMi4wIgogICAgXSwKICAgICJVQkRMLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiVW5tb2RpZmllZCBCaW5hcnkgRGlzdHJpYnV0aW9uIGV4Y2VwdGlvbiIKICAgIF0sCiAgICAiVW5pdmVyc2FsLUZPU1MtZXhjZXB0aW9uLTEuMCI6IFsKICAgICAgICAiVW5pdmVyc2FsIEZPU1MgRXhjZXB0aW9uLCBWZXJzaW9uIDEuMCIKICAgIF0sCiAgICAidnNmdHBkLW9wZW5zc2wtZXhjZXB0aW9uIjogWwogICAgICAgICJ2c2Z0cGQgT3BlblNTTCBleGNlcHRpb24iCiAgICBdLAogICAgIld4V2luZG93cy1leGNlcHRpb24tMy4xIjogWwogICAgICAgICJXeFdpbmRvd3MgTGlicmFyeSBFeGNlcHRpb24gMy4xIgogICAgXSwKICAgICJ4MTF2bmMtb3BlbnNzbC1leGNlcHRpb24iOiBbCiAgICAgICAgIngxMXZuYyBPcGVuU1NMIEV4Y2VwdGlvbiIKICAgIF0KfXsKICAgICIwQlNEIjogWwogICAgICAgICJCU0QgWmVybyBDbGF1c2UgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICIzRC1TbGljZXItMS4wIjogWwogICAgICAgICIzRCBTbGljZXIgTGljZW5zZSB2MS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBQUwiOiBbCiAgICAgICAgIkF0dHJpYnV0aW9uIEFzc3VyYW5jZSBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFic3R5bGVzIjogWwogICAgICAgICJBYnN0eWxlcyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBZGFDb3JlLWRvYyI6IFsKICAgICAgICAiQWRhQ29yZSBEb2MgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQWRvYmUtMjAwNiI6IFsKICAgICAgICAiQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgU291cmNlIENvZGUgTGljZW5zZSBBZ3JlZW1lbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFkb2JlLURpc3BsYXktUG9zdFNjcmlwdCI6IFsKICAgICAgICAiQWRvYmUgRGlzcGxheSBQb3N0U2NyaXB0IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFkb2JlLUdseXBoIjogWwogICAgICAgICJBZG9iZSBHbHlwaCBMaXN0IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFkb2JlLVV0b3BpYSI6IFsKICAgICAgICAiQWRvYmUgVXRvcGlhIEZvbnQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQURTTCI6IFsKICAgICAgICAiQW1hem9uIERpZ2l0YWwgU2VydmljZXMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQWR2YW5jZWQtQ3J5cHRpY3MtRGljdGlvbmFyeSI6IFsKICAgICAgICAiQWR2YW5jZWQgQ3J5cHRpY3MgRGljdGlvbmFyeSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBRkwtMS4xIjogWwogICAgICAgICJBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdjEuMSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBRkwtMS4yIjogWwogICAgICAgICJBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdjEuMiIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBRkwtMi4wIjogWwogICAgICAgICJBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdjIuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBRkwtMi4xIjogWwogICAgICAgICJBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdjIuMSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBRkwtMy4wIjogWwogICAgICAgICJBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdjMuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBZm1wYXJzZSI6IFsKICAgICAgICAiQWZtcGFyc2UgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQUdQTC0xLjAiOiBbCiAgICAgICAgIkFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiQUdQTC0xLjAtb25seSI6IFsKICAgICAgICAiQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjEuMCBvbmx5IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBR1BMLTEuMC1vci1sYXRlciI6IFsKICAgICAgICAiQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjEuMCBvciBsYXRlciIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQUdQTC0zLjAiOiBbCiAgICAgICAgIkdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2My4wIiwKICAgICAgICB0cnVlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiQUdQTC0zLjAtb25seSI6IFsKICAgICAgICAiR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYzLjAgb25seSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBR1BMLTMuMC1vci1sYXRlciI6IFsKICAgICAgICAiR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYzLjAgb3IgbGF0ZXIiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQWxhZGRpbiI6IFsKICAgICAgICAiQWxhZGRpbiBGcmVlIFB1YmxpYyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBTEdMSUItRG9jdW1lbnRhdGlvbiI6IFsKICAgICAgICAiQUxHTElCIERvY3VtZW50YXRpb24gTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBTUQtbmV3bGliIjogWwogICAgICAgICJBTUQgbmV3bGliIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFNRFBMUEEiOiBbCiAgICAgICAgIkFNRCdzIHBscGFfbWFwLmMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQU1MIjogWwogICAgICAgICJBcHBsZSBNSVQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQU1MLWdsc2xhbmciOiBbCiAgICAgICAgIkFNTCBnbHNsYW5nIHZhcmlhbnQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQU1QQVMiOiBbCiAgICAgICAgIkFjYWRlbXkgb2YgTW90aW9uIFBpY3R1cmUgQXJ0cyBhbmQgU2NpZW5jZXMgQlNEIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBTlRMUi1QRCI6IFsKICAgICAgICAiQU5UTFIgU29mdHdhcmUgUmlnaHRzIE5vdGljZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQU5UTFItUEQtZmFsbGJhY2siOiBbCiAgICAgICAgIkFOVExSIFNvZnR3YXJlIFJpZ2h0cyBOb3RpY2Ugd2l0aCBsaWNlbnNlIGZhbGxiYWNrIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJhbnktT1NJIjogWwogICAgICAgICJBbnkgT1NJIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImFueS1PU0ktcGVybC1tb2R1bGVzIjogWwogICAgICAgICJBbnkgT1NJIExpY2Vuc2UgLSBQZXJsIE1vZHVsZXMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFwYWNoZS0xLjAiOiBbCiAgICAgICAgIkFwYWNoZSBMaWNlbnNlIDEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQXBhY2hlLTEuMSI6IFsKICAgICAgICAiQXBhY2hlIExpY2Vuc2UgMS4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFwYWNoZS0yLjAiOiBbCiAgICAgICAgIkFwYWNoZSBMaWNlbnNlIDIuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBUEFGTUwiOiBbCiAgICAgICAgIkFkb2JlIFBvc3RzY3JpcHQgQUZNIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFQTC0xLjAiOiBbCiAgICAgICAgIkFkYXB0aXZlIFB1YmxpYyBMaWNlbnNlIDEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBcHAtczJwIjogWwogICAgICAgICJBcHA6OnMycCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBUFNMLTEuMCI6IFsKICAgICAgICAiQXBwbGUgUHVibGljIFNvdXJjZSBMaWNlbnNlIDEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBUFNMLTEuMSI6IFsKICAgICAgICAiQXBwbGUgUHVibGljIFNvdXJjZSBMaWNlbnNlIDEuMSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBUFNMLTEuMiI6IFsKICAgICAgICAiQXBwbGUgUHVibGljIFNvdXJjZSBMaWNlbnNlIDEuMiIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBUFNMLTIuMCI6IFsKICAgICAgICAiQXBwbGUgUHVibGljIFNvdXJjZSBMaWNlbnNlIDIuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBcnBoaWMtMTk5OSI6IFsKICAgICAgICAiQXJwaGljIFB1YmxpYyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBcnRpc3RpYy0xLjAiOiBbCiAgICAgICAgIkFydGlzdGljIExpY2Vuc2UgMS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFydGlzdGljLTEuMC1jbDgiOiBbCiAgICAgICAgIkFydGlzdGljIExpY2Vuc2UgMS4wIHcvY2xhdXNlIDgiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQXJ0aXN0aWMtMS4wLVBlcmwiOiBbCiAgICAgICAgIkFydGlzdGljIExpY2Vuc2UgMS4wIChQZXJsKSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBcnRpc3RpYy0yLjAiOiBbCiAgICAgICAgIkFydGlzdGljIExpY2Vuc2UgMi4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFydGlzdGljLWRpc3QiOiBbCiAgICAgICAgIkFydGlzdGljIExpY2Vuc2UgMS4wIChkaXN0KSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQXNwZWxsLVJVIjogWwogICAgICAgICJBc3BlbGwgUnVzc2lhbiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBU1dGLURpZ2l0YWwtQXNzZXRzLTEuMCI6IFsKICAgICAgICAiQVNXRiBEaWdpdGFsIEFzc2V0cyBMaWNlbnNlIHZlcnNpb24gMS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBU1dGLURpZ2l0YWwtQXNzZXRzLTEuMSI6IFsKICAgICAgICAiQVNXRiBEaWdpdGFsIEFzc2V0cyBMaWNlbnNlIDEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQmFla211ayI6IFsKICAgICAgICAiQmFla211ayBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCYWh5cGgiOiBbCiAgICAgICAgIkJhaHlwaCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCYXJyIjogWwogICAgICAgICJCYXJyIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImJjcnlwdC1Tb2xhci1EZXNpZ25lciI6IFsKICAgICAgICAiYmNyeXB0IFNvbGFyIERlc2lnbmVyIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJlZXJ3YXJlIjogWwogICAgICAgICJCZWVyd2FyZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCaXRzdHJlYW0tQ2hhcnRlciI6IFsKICAgICAgICAiQml0c3RyZWFtIENoYXJ0ZXIgRm9udCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCaXRzdHJlYW0tVmVyYSI6IFsKICAgICAgICAiQml0c3RyZWFtIFZlcmEgRm9udCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCaXRUb3JyZW50LTEuMCI6IFsKICAgICAgICAiQml0VG9ycmVudCBPcGVuIFNvdXJjZSBMaWNlbnNlIHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJpdFRvcnJlbnQtMS4xIjogWwogICAgICAgICJCaXRUb3JyZW50IE9wZW4gU291cmNlIExpY2Vuc2UgdjEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiYmxlc3NpbmciOiBbCiAgICAgICAgIlNRTGl0ZSBCbGVzc2luZyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQmx1ZU9hay0xLjAuMCI6IFsKICAgICAgICAiQmx1ZSBPYWsgTW9kZWwgTGljZW5zZSAxLjAuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCb2VobS1HQyI6IFsKICAgICAgICAiQm9laG0tRGVtZXJzLVdlaXNlciBHQyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCb2VobS1HQy13aXRob3V0LWZlZSI6IFsKICAgICAgICAiQm9laG0tRGVtZXJzLVdlaXNlciBHQyBMaWNlbnNlICh3aXRob3V0IGZlZSkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJPTEEtMS4xIjogWwogICAgICAgICJCdWVuYSBPbmRhIExpY2Vuc2UgQWdyZWVtZW50IHYxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJvcmNldXgiOiBbCiAgICAgICAgIkJvcmNldXggbGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQnJpYW4tR2xhZG1hbi0yLUNsYXVzZSI6IFsKICAgICAgICAiQnJpYW4gR2xhZG1hbiAyLUNsYXVzZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCcmlhbi1HbGFkbWFuLTMtQ2xhdXNlIjogWwogICAgICAgICJCcmlhbiBHbGFkbWFuIDMtQ2xhdXNlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC0xLUNsYXVzZSI6IFsKICAgICAgICAiQlNEIDEtQ2xhdXNlIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTItQ2xhdXNlIjogWwogICAgICAgICJCU0QgMi1DbGF1c2UgXCJTaW1wbGlmaWVkXCIgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtMi1DbGF1c2UtRGFyd2luIjogWwogICAgICAgICJCU0QgMi1DbGF1c2UgLSBJYW4gRGFyd2luIHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC0yLUNsYXVzZS1maXJzdC1saW5lcyI6IFsKICAgICAgICAiQlNEIDItQ2xhdXNlIC0gZmlyc3QgbGluZXMgcmVxdWlyZW1lbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC0yLUNsYXVzZS1GcmVlQlNEIjogWwogICAgICAgICJCU0QgMi1DbGF1c2UgRnJlZUJTRCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkJTRC0yLUNsYXVzZS1OZXRCU0QiOiBbCiAgICAgICAgIkJTRCAyLUNsYXVzZSBOZXRCU0QgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJCU0QtMi1DbGF1c2UtUGF0ZW50IjogWwogICAgICAgICJCU0QtMi1DbGF1c2UgUGx1cyBQYXRlbnQgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtMi1DbGF1c2UtcGtnY29uZi1kaXNjbGFpbWVyIjogWwogICAgICAgICJCU0QgMi1DbGF1c2UgcGtnY29uZiBkaXNjbGFpbWVyIHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC0yLUNsYXVzZS1WaWV3cyI6IFsKICAgICAgICAiQlNEIDItQ2xhdXNlIHdpdGggdmlld3Mgc2VudGVuY2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC0zLUNsYXVzZSI6IFsKICAgICAgICAiQlNEIDMtQ2xhdXNlIFwiTmV3XCIgb3IgXCJSZXZpc2VkXCIgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtMy1DbGF1c2UtYWNwaWNhIjogWwogICAgICAgICJCU0QgMy1DbGF1c2UgYWNwaWNhIHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC0zLUNsYXVzZS1BdHRyaWJ1dGlvbiI6IFsKICAgICAgICAiQlNEIHdpdGggYXR0cmlidXRpb24iLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC0zLUNsYXVzZS1DbGVhciI6IFsKICAgICAgICAiQlNEIDMtQ2xhdXNlIENsZWFyIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC0zLUNsYXVzZS1mbGV4IjogWwogICAgICAgICJCU0QgMy1DbGF1c2UgRmxleCB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtMy1DbGF1c2UtSFAiOiBbCiAgICAgICAgIkhld2xldHQtUGFja2FyZCBCU0QgdmFyaWFudCBsaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtMy1DbGF1c2UtTEJOTCI6IFsKICAgICAgICAiTGF3cmVuY2UgQmVya2VsZXkgTmF0aW9uYWwgTGFicyBCU0QgdmFyaWFudCBsaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC0zLUNsYXVzZS1Nb2RpZmljYXRpb24iOiBbCiAgICAgICAgIkJTRCAzLUNsYXVzZSBNb2RpZmljYXRpb24iLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC0zLUNsYXVzZS1Oby1NaWxpdGFyeS1MaWNlbnNlIjogWwogICAgICAgICJCU0QgMy1DbGF1c2UgTm8gTWlsaXRhcnkgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTMtQ2xhdXNlLU5vLU51Y2xlYXItTGljZW5zZSI6IFsKICAgICAgICAiQlNEIDMtQ2xhdXNlIE5vIE51Y2xlYXIgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTMtQ2xhdXNlLU5vLU51Y2xlYXItTGljZW5zZS0yMDE0IjogWwogICAgICAgICJCU0QgMy1DbGF1c2UgTm8gTnVjbGVhciBMaWNlbnNlIDIwMTQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC0zLUNsYXVzZS1Oby1OdWNsZWFyLVdhcnJhbnR5IjogWwogICAgICAgICJCU0QgMy1DbGF1c2UgTm8gTnVjbGVhciBXYXJyYW50eSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTMtQ2xhdXNlLU9wZW4tTVBJIjogWwogICAgICAgICJCU0QgMy1DbGF1c2UgT3BlbiBNUEkgdmFyaWFudCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtMy1DbGF1c2UtU3VuIjogWwogICAgICAgICJCU0QgMy1DbGF1c2UgU3VuIE1pY3Jvc3lzdGVtcyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTMtQ2xhdXNlLVRzbyI6IFsKICAgICAgICAiQlNEIDMtQ2xhdXNlIFRzbyB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtNC1DbGF1c2UiOiBbCiAgICAgICAgIkJTRCA0LUNsYXVzZSBcIk9yaWdpbmFsXCIgb3IgXCJPbGRcIiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtNC1DbGF1c2UtU2hvcnRlbmVkIjogWwogICAgICAgICJCU0QgNCBDbGF1c2UgU2hvcnRlbmVkIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtNC1DbGF1c2UtVUMiOiBbCiAgICAgICAgIkJTRC00LUNsYXVzZSAoVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLVNwZWNpZmljKSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTQuM1JFTk8iOiBbCiAgICAgICAgIkJTRCA0LjMgUkVOTyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtNC4zVEFIT0UiOiBbCiAgICAgICAgIkJTRCA0LjMgVEFIT0UgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELUFkdmVydGlzaW5nLUFja25vd2xlZGdlbWVudCI6IFsKICAgICAgICAiQlNEIEFkdmVydGlzaW5nIEFja25vd2xlZGdlbWVudCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtQXR0cmlidXRpb24tSFBORC1kaXNjbGFpbWVyIjogWwogICAgICAgICJCU0Qgd2l0aCBBdHRyaWJ1dGlvbiBhbmQgSFBORCBkaXNjbGFpbWVyIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtSW5mZXJuby1OZXR0dmVyayI6IFsKICAgICAgICAiQlNELUluZmVybm8tTmV0dHZlcmsiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC1NYXJrLU1vZGlmaWNhdGlvbnMiOiBbCiAgICAgICAgIkJTRCBNYXJrIE1vZGlmaWNhdGlvbnMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELVByb3RlY3Rpb24iOiBbCiAgICAgICAgIkJTRCBQcm90ZWN0aW9uIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC1Tb3VyY2UtYmVnaW5uaW5nLWZpbGUiOiBbCiAgICAgICAgIkJTRCBTb3VyY2UgQ29kZSBBdHRyaWJ1dGlvbiAtIGJlZ2lubmluZyBvZiBmaWxlIHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC1Tb3VyY2UtQ29kZSI6IFsKICAgICAgICAiQlNEIFNvdXJjZSBDb2RlIEF0dHJpYnV0aW9uIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtU3lzdGVtaWNzIjogWwogICAgICAgICJTeXN0ZW1pY3MgQlNEIHZhcmlhbnQgbGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELVN5c3RlbWljcy1XM1dvcmtzIjogWwogICAgICAgICJTeXN0ZW1pY3MgVzNXb3JrcyBCU0QgdmFyaWFudCBsaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0wtMS4wIjogWwogICAgICAgICJCb29zdCBTb2Z0d2FyZSBMaWNlbnNlIDEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCdWRkeSI6IFsKICAgICAgICAiQnVkZHkgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlVTTC0xLjEiOiBbCiAgICAgICAgIkJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiYnppcDItMS4wLjUiOiBbCiAgICAgICAgImJ6aXAyIGFuZCBsaWJiemlwMiBMaWNlbnNlIHYxLjAuNSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJiemlwMi0xLjAuNiI6IFsKICAgICAgICAiYnppcDIgYW5kIGxpYmJ6aXAyIExpY2Vuc2UgdjEuMC42IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDLVVEQS0xLjAiOiBbCiAgICAgICAgIkNvbXB1dGF0aW9uYWwgVXNlIG9mIERhdGEgQWdyZWVtZW50IHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNBTC0xLjAiOiBbCiAgICAgICAgIkNyeXB0b2dyYXBoaWMgQXV0b25vbXkgTGljZW5zZSAxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0FMLTEuMC1Db21iaW5lZC1Xb3JrLUV4Y2VwdGlvbiI6IFsKICAgICAgICAiQ3J5cHRvZ3JhcGhpYyBBdXRvbm9teSBMaWNlbnNlIDEuMCAoQ29tYmluZWQgV29yayBFeGNlcHRpb24pIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNhbGRlcmEiOiBbCiAgICAgICAgIkNhbGRlcmEgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ2FsZGVyYS1uby1wcmVhbWJsZSI6IFsKICAgICAgICAiQ2FsZGVyYSBMaWNlbnNlICh3aXRob3V0IHByZWFtYmxlKSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0FQRUMtdG91IjogWwogICAgICAgICJDb21tb24gQXR0YWNrICAgIFBhdHRlcm4gRW51bWVyYXRpb24gYW5kIENsYXNzaWZpY2F0aW9uIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNhdGhhcm9uIjogWwogICAgICAgICJDYXRoYXJvbiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQVRPU0wtMS4xIjogWwogICAgICAgICJDb21wdXRlciBBc3NvY2lhdGVzIFRydXN0ZWQgT3BlbiBTb3VyY2UgTGljZW5zZSAxLjEiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktMS4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDEuMCBHZW5lcmljIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS0yLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMi4wIEdlbmVyaWMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLTIuNSI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAyLjUgR2VuZXJpYyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktMi41LUFVIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDIuNSBBdXN0cmFsaWEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLTMuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAzLjAgVW5wb3J0ZWQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLTMuMC1BVCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAzLjAgQXVzdHJpYSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktMy4wLUFVIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDMuMCBBdXN0cmFsaWEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLTMuMC1ERSI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAzLjAgR2VybWFueSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktMy4wLUlHTyI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAzLjAgSUdPIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS0zLjAtTkwiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMy4wIE5ldGhlcmxhbmRzIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS0zLjAtVVMiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMy4wIFVuaXRlZCBTdGF0ZXMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLTQuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiA0LjAgSW50ZXJuYXRpb25hbCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtMS4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIDEuMCBHZW5lcmljIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy0yLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgMi4wIEdlbmVyaWMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLTIuNSI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCAyLjUgR2VuZXJpYyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtMy4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIDMuMCBVbnBvcnRlZCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtMy4wLURFIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIDMuMCBHZXJtYW55IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy00LjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgNC4wIEludGVybmF0aW9uYWwiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLU5ELTEuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCBObyBEZXJpdmF0aXZlcyAxLjAgR2VuZXJpYyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtTkQtMi4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIE5vIERlcml2YXRpdmVzIDIuMCBHZW5lcmljIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy1ORC0yLjUiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgTm8gRGVyaXZhdGl2ZXMgMi41IEdlbmVyaWMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLU5ELTMuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCBObyBEZXJpdmF0aXZlcyAzLjAgVW5wb3J0ZWQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLU5ELTMuMC1ERSI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCBObyBEZXJpdmF0aXZlcyAzLjAgR2VybWFueSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtTkQtMy4wLUlHTyI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCBObyBEZXJpdmF0aXZlcyAzLjAgSUdPIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy1ORC00LjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgTm8gRGVyaXZhdGl2ZXMgNC4wIEludGVybmF0aW9uYWwiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLVNBLTEuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCBTaGFyZSBBbGlrZSAxLjAgR2VuZXJpYyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtU0EtMi4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIFNoYXJlIEFsaWtlIDIuMCBHZW5lcmljIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy1TQS0yLjAtREUiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgU2hhcmUgQWxpa2UgMi4wIEdlcm1hbnkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLVNBLTIuMC1GUiI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1Ob25Db21tZXJjaWFsLVNoYXJlQWxpa2UgMi4wIEZyYW5jZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtU0EtMi4wLVVLIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIFNoYXJlIEFsaWtlIDIuMCBFbmdsYW5kIGFuZCBXYWxlcyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtU0EtMi41IjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIFNoYXJlIEFsaWtlIDIuNSBHZW5lcmljIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy1TQS0zLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgU2hhcmUgQWxpa2UgMy4wIFVucG9ydGVkIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy1TQS0zLjAtREUiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgU2hhcmUgQWxpa2UgMy4wIEdlcm1hbnkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLVNBLTMuMC1JR08iOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgU2hhcmUgQWxpa2UgMy4wIElHTyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtU0EtNC4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIFNoYXJlIEFsaWtlIDQuMCBJbnRlcm5hdGlvbmFsIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1ORC0xLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm8gRGVyaXZhdGl2ZXMgMS4wIEdlbmVyaWMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5ELTIuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBObyBEZXJpdmF0aXZlcyAyLjAgR2VuZXJpYyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkQtMi41IjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vIERlcml2YXRpdmVzIDIuNSBHZW5lcmljIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1ORC0zLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm8gRGVyaXZhdGl2ZXMgMy4wIFVucG9ydGVkIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1ORC0zLjAtREUiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm8gRGVyaXZhdGl2ZXMgMy4wIEdlcm1hbnkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5ELTQuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBObyBEZXJpdmF0aXZlcyA0LjAgSW50ZXJuYXRpb25hbCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktU0EtMS4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIFNoYXJlIEFsaWtlIDEuMCBHZW5lcmljIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1TQS0yLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gU2hhcmUgQWxpa2UgMi4wIEdlbmVyaWMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLVNBLTIuMC1VSyI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBTaGFyZSBBbGlrZSAyLjAgRW5nbGFuZCBhbmQgV2FsZXMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLVNBLTIuMS1KUCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBTaGFyZSBBbGlrZSAyLjEgSmFwYW4iLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLVNBLTIuNSI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBTaGFyZSBBbGlrZSAyLjUgR2VuZXJpYyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktU0EtMy4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIFNoYXJlIEFsaWtlIDMuMCBVbnBvcnRlZCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktU0EtMy4wLUFUIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIFNoYXJlIEFsaWtlIDMuMCBBdXN0cmlhIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1TQS0zLjAtREUiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gU2hhcmUgQWxpa2UgMy4wIEdlcm1hbnkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLVNBLTMuMC1JR08iOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSAzLjAgSUdPIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1TQS00LjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gU2hhcmUgQWxpa2UgNC4wIEludGVybmF0aW9uYWwiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLVBEREMiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgUHVibGljIERvbWFpbiBEZWRpY2F0aW9uIGFuZCBDZXJ0aWZpY2F0aW9uIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1QRE0tMS4wIjogWwogICAgICAgICJDcmVhdGl2ZSAgICBDb21tb25zIFB1YmxpYyBEb21haW4gTWFyayAxLjAgVW5pdmVyc2FsIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1TQS0xLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgU2hhcmUgQWxpa2UgMS4wIEdlbmVyaWMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDMC0xLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgWmVybyB2MS4wIFVuaXZlcnNhbCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0RETC0xLjAiOiBbCiAgICAgICAgIkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgMS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNEREwtMS4xIjogWwogICAgICAgICJDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIDEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0RMLTEuMCI6IFsKICAgICAgICAiQ29tbW9uIERvY3VtZW50YXRpb24gTGljZW5zZSAxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNETEEtUGVybWlzc2l2ZS0xLjAiOiBbCiAgICAgICAgIkNvbW11bml0eSBEYXRhIExpY2Vuc2UgQWdyZWVtZW50IFBlcm1pc3NpdmUgMS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDRExBLVBlcm1pc3NpdmUtMi4wIjogWwogICAgICAgICJDb21tdW5pdHkgRGF0YSBMaWNlbnNlIEFncmVlbWVudCBQZXJtaXNzaXZlIDIuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0RMQS1TaGFyaW5nLTEuMCI6IFsKICAgICAgICAiQ29tbXVuaXR5IERhdGEgTGljZW5zZSBBZ3JlZW1lbnQgU2hhcmluZyAxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNFQ0lMTC0xLjAiOiBbCiAgICAgICAgIkNlQ0lMTCBGcmVlIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNFQ0lMTC0xLjEiOiBbCiAgICAgICAgIkNlQ0lMTCBGcmVlIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IHYxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNFQ0lMTC0yLjAiOiBbCiAgICAgICAgIkNlQ0lMTCBGcmVlIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IHYyLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNFQ0lMTC0yLjEiOiBbCiAgICAgICAgIkNlQ0lMTCBGcmVlIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IHYyLjEiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0VDSUxMLUIiOiBbCiAgICAgICAgIkNlQ0lMTC1CIEZyZWUgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNFQ0lMTC1DIjogWwogICAgICAgICJDZUNJTEwtQyBGcmVlIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDRVJOLU9ITC0xLjEiOiBbCiAgICAgICAgIkNFUk4gT3BlbiBIYXJkd2FyZSBMaWNlbmNlIHYxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNFUk4tT0hMLTEuMiI6IFsKICAgICAgICAiQ0VSTiBPcGVuIEhhcmR3YXJlIExpY2VuY2UgdjEuMiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0VSTi1PSEwtUC0yLjAiOiBbCiAgICAgICAgIkNFUk4gT3BlbiBIYXJkd2FyZSBMaWNlbmNlIFZlcnNpb24gMiAtIFBlcm1pc3NpdmUiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0VSTi1PSEwtUy0yLjAiOiBbCiAgICAgICAgIkNFUk4gT3BlbiBIYXJkd2FyZSBMaWNlbmNlIFZlcnNpb24gMiAtIFN0cm9uZ2x5IFJlY2lwcm9jYWwiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0VSTi1PSEwtVy0yLjAiOiBbCiAgICAgICAgIkNFUk4gT3BlbiBIYXJkd2FyZSBMaWNlbmNlIFZlcnNpb24gMiAtIFdlYWtseSBSZWNpcHJvY2FsIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNGSVRTSU8iOiBbCiAgICAgICAgIkNGSVRTSU8gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiY2hlY2stY3ZzIjogWwogICAgICAgICJjaGVjay1jdnMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiY2hlY2ttayI6IFsKICAgICAgICAiQ2hlY2ttayBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDbEFydGlzdGljIjogWwogICAgICAgICJDbGFyaWZpZWQgQXJ0aXN0aWMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ2xpcHMiOiBbCiAgICAgICAgIkNsaXBzIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNNVS1NYWNoIjogWwogICAgICAgICJDTVUgTWFjaCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDTVUtTWFjaC1ub2RvYyI6IFsKICAgICAgICAiQ01VICAgIE1hY2ggLSBubyBub3RpY2VzLWluLWRvY3VtZW50YXRpb24gdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ05SSS1KeXRob24iOiBbCiAgICAgICAgIkNOUkkgSnl0aG9uIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNOUkktUHl0aG9uIjogWwogICAgICAgICJDTlJJIFB5dGhvbiBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNOUkktUHl0aG9uLUdQTC1Db21wYXRpYmxlIjogWwogICAgICAgICJDTlJJIFB5dGhvbiBPcGVuIFNvdXJjZSBHUEwgQ29tcGF0aWJsZSBMaWNlbnNlIEFncmVlbWVudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ09JTC0xLjAiOiBbCiAgICAgICAgIkNvcHlmcmVlIE9wZW4gSW5ub3ZhdGlvbiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDb21tdW5pdHktU3BlYy0xLjAiOiBbCiAgICAgICAgIkNvbW11bml0eSBTcGVjaWZpY2F0aW9uIExpY2Vuc2UgMS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDb25kb3ItMS4xIjogWwogICAgICAgICJDb25kb3IgUHVibGljIExpY2Vuc2UgdjEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiY29weWxlZnQtbmV4dC0wLjMuMCI6IFsKICAgICAgICAiY29weWxlZnQtbmV4dCAwLjMuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiY29weWxlZnQtbmV4dC0wLjMuMSI6IFsKICAgICAgICAiY29weWxlZnQtbmV4dCAwLjMuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ29ybmVsbC1Mb3NzbGVzcy1KUEVHIjogWwogICAgICAgICJDb3JuZWxsIExvc3NsZXNzIEpQRUcgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ1BBTC0xLjAiOiBbCiAgICAgICAgIkNvbW1vbiBQdWJsaWMgQXR0cmlidXRpb24gTGljZW5zZSAxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ1BMLTEuMCI6IFsKICAgICAgICAiQ29tbW9uIFB1YmxpYyBMaWNlbnNlIDEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDUE9MLTEuMDIiOiBbCiAgICAgICAgIkNvZGUgUHJvamVjdCBPcGVuIExpY2Vuc2UgMS4wMiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ3Jvbnl4IjogWwogICAgICAgICJDcm9ueXggTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ3Jvc3N3b3JkIjogWwogICAgICAgICJDcm9zc3dvcmQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ3J5cHRvU3dpZnQiOiBbCiAgICAgICAgIkNyeXB0b1N3aWZ0IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNyeXN0YWxTdGFja2VyIjogWwogICAgICAgICJDcnlzdGFsU3RhY2tlciBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDVUEtT1BMLTEuMCI6IFsKICAgICAgICAiQ1VBIE9mZmljZSBQdWJsaWMgTGljZW5zZSB2MS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkN1YmUiOiBbCiAgICAgICAgIkN1YmUgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiY3VybCI6IFsKICAgICAgICAiY3VybCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJjdmUtdG91IjogWwogICAgICAgICJDb21tb24gVnVsbmVyYWJpbGl0eSBFbnVtZXJhdGlvbiBUb1UgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRC1GU0wtMS4wIjogWwogICAgICAgICJEZXV0c2NoZSBGcmVpZSBTb2Z0d2FyZSBMaXplbnoiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkRFQy0zLUNsYXVzZSI6IFsKICAgICAgICAiREVDIDMtQ2xhdXNlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImRpZmZtYXJrIjogWwogICAgICAgICJkaWZmbWFyayBsaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJETC1ERS1CWS0yLjAiOiBbCiAgICAgICAgIkRhdGEgbGljZW5jZSBHZXJtYW55IFx1MjAxMyBhdHRyaWJ1dGlvbiBcdTIwMTMgdmVyc2lvbiAyLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkRMLURFLVpFUk8tMi4wIjogWwogICAgICAgICJEYXRhIGxpY2VuY2UgR2VybWFueSBcdTIwMTMgemVybyBcdTIwMTMgdmVyc2lvbiAyLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkRPQyI6IFsKICAgICAgICAiRE9DIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkRvY0Jvb2stRFREIjogWwogICAgICAgICJEb2NCb29rIERURCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJEb2NCb29rLVNjaGVtYSI6IFsKICAgICAgICAiRG9jQm9vayBTY2hlbWEgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRG9jQm9vay1TdHlsZXNoZWV0IjogWwogICAgICAgICJEb2NCb29rIFN0eWxlc2hlZXQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRG9jQm9vay1YTUwiOiBbCiAgICAgICAgIkRvY0Jvb2sgWE1MIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkRvdHNlcW4iOiBbCiAgICAgICAgIkRvdHNlcW4gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRFJMLTEuMCI6IFsKICAgICAgICAiRGV0ZWN0aW9uIFJ1bGUgTGljZW5zZSAxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkRSTC0xLjEiOiBbCiAgICAgICAgIkRldGVjdGlvbiBSdWxlIExpY2Vuc2UgMS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJEU0RQIjogWwogICAgICAgICJEU0RQIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImR0b2EiOiBbCiAgICAgICAgIkRhdmlkIE0uIEdheSBkdG9hIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImR2aXBkZm0iOiBbCiAgICAgICAgImR2aXBkZm0gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRUNMLTEuMCI6IFsKICAgICAgICAiRWR1Y2F0aW9uYWwgQ29tbXVuaXR5IExpY2Vuc2UgdjEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFQ0wtMi4wIjogWwogICAgICAgICJFZHVjYXRpb25hbCBDb21tdW5pdHkgTGljZW5zZSB2Mi4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImVDb3MtMi4wIjogWwogICAgICAgICJlQ29zIGxpY2Vuc2UgdmVyc2lvbiAyLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiRUZMLTEuMCI6IFsKICAgICAgICAiRWlmZmVsIEZvcnVtIExpY2Vuc2UgdjEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFRkwtMi4wIjogWwogICAgICAgICJFaWZmZWwgRm9ydW0gTGljZW5zZSB2Mi4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImVHZW5peCI6IFsKICAgICAgICAiZUdlbml4LmNvbSBQdWJsaWMgTGljZW5zZSAxLjEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRWxhc3RpYy0yLjAiOiBbCiAgICAgICAgIkVsYXN0aWMgTGljZW5zZSAyLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkVudGVzc2EiOiBbCiAgICAgICAgIkVudGVzc2EgUHVibGljIExpY2Vuc2UgdjEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFUElDUyI6IFsKICAgICAgICAiRVBJQ1MgT3BlbiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFUEwtMS4wIjogWwogICAgICAgICJFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFUEwtMi4wIjogWwogICAgICAgICJFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFcmxQTC0xLjEiOiBbCiAgICAgICAgIkVybGFuZyBQdWJsaWMgTGljZW5zZSB2MS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFU0EtUEwtcGVybWlzc2l2ZS0yLjQiOiBbCiAgICAgICAgIkV1cm9wZWFuIFNwYWNlIEFnZW5jeSBQdWJsaWMgTGljZW5zZSBcdTIwMTMgdjIuNCBcdTIwMTMgUGVybWlzc2l2ZSAoVHlwZSAzKSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRVNBLVBMLXN0cm9uZy1jb3B5bGVmdC0yLjQiOiBbCiAgICAgICAgIkV1cm9wZWFuIFNwYWNlIEFnZW5jeSBQdWJsaWMgTGljZW5zZSAoRVNBLVBMKSAtIFYyLjQgLSBTdHJvbmcgQ29weWxlZnQgKFR5cGUgMSkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkVTQS1QTC13ZWFrLWNvcHlsZWZ0LTIuNCI6IFsKICAgICAgICAiRXVyb3BlYW4gU3BhY2UgQWdlbmN5IFB1YmxpYyBMaWNlbnNlIFx1MjAxMyB2Mi40IFx1MjAxMyBXZWFrIENvcHlsZWZ0IChUeXBlIDIpIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJldGFsYWItMi4wIjogWwogICAgICAgICJFdGFsYWIgT3BlbiBMaWNlbnNlIDIuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRVVEYXRhZ3JpZCI6IFsKICAgICAgICAiRVUgRGF0YUdyaWQgU29mdHdhcmUgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFVVBMLTEuMCI6IFsKICAgICAgICAiRXVyb3BlYW4gVW5pb24gUHVibGljIExpY2Vuc2UgMS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFVVBMLTEuMSI6IFsKICAgICAgICAiRXVyb3BlYW4gVW5pb24gUHVibGljIExpY2Vuc2UgMS4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkVVUEwtMS4yIjogWwogICAgICAgICJFdXJvcGVhbiBVbmlvbiBQdWJsaWMgTGljZW5zZSAxLjIiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRXVyb3N5bSI6IFsKICAgICAgICAiRXVyb3N5bSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJGYWlyIjogWwogICAgICAgICJGYWlyIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRkJNIjogWwogICAgICAgICJGdXp6eSBCaXRtYXAgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRkRLLUFBQyI6IFsKICAgICAgICAiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkZlcmd1c29uLVR3b2Zpc2giOiBbCiAgICAgICAgIkZlcmd1c29uIFR3b2Zpc2ggTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRnJhbWV3b3J4LTEuMCI6IFsKICAgICAgICAiRnJhbWV3b3J4IE9wZW4gTGljZW5zZSAxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRnJlZUJTRC1ET0MiOiBbCiAgICAgICAgIkZyZWVCU0QgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJGcmVlSW1hZ2UiOiBbCiAgICAgICAgIkZyZWVJbWFnZSBQdWJsaWMgTGljZW5zZSB2MS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJGU0ZBUCI6IFsKICAgICAgICAiRlNGIEFsbCBQZXJtaXNzaXZlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkZTRkFQLW5vLXdhcnJhbnR5LWRpc2NsYWltZXIiOiBbCiAgICAgICAgIkZTRiBBbGwgUGVybWlzc2l2ZSBMaWNlbnNlICh3aXRob3V0IFdhcnJhbnR5KSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRlNGVUwiOiBbCiAgICAgICAgIkZTRiBVbmxpbWl0ZWQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRlNGVUxMUiI6IFsKICAgICAgICAiRlNGIFVubGltaXRlZCBMaWNlbnNlICh3aXRoIExpY2Vuc2UgUmV0ZW50aW9uKSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRlNGVUxMUlNEIjogWwogICAgICAgICJGU0YgVW5saW1pdGVkIExpY2Vuc2UgKHdpdGggTGljZW5zZSBSZXRlbnRpb24gYW5kIFNob3J0IERpc2NsYWltZXIpIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJGU0ZVTExSV0QiOiBbCiAgICAgICAgIkZTRiBVbmxpbWl0ZWQgTGljZW5zZSAoV2l0aCBMaWNlbnNlIFJldGVudGlvbiBhbmQgV2FycmFudHkgRGlzY2xhaW1lcikiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkZTTC0xLjEtQUx2MiI6IFsKICAgICAgICAiRnVuY3Rpb25hbCBTb3VyY2UgTGljZW5zZSwgVmVyc2lvbiAxLjEsIEFMdjIgRnV0dXJlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkZTTC0xLjEtTUlUIjogWwogICAgICAgICJGdW5jdGlvbmFsIFNvdXJjZSBMaWNlbnNlLCBWZXJzaW9uIDEuMSwgTUlUIEZ1dHVyZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJGVEwiOiBbCiAgICAgICAgIkZyZWV0eXBlIFByb2plY3QgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRnVydXNldGgiOiBbCiAgICAgICAgIkZ1cnVzZXRoIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImZ3bHciOiBbCiAgICAgICAgImZ3bHcgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR2FtZS1Qcm9ncmFtbWluZy1HZW1zIjogWwogICAgICAgICJHYW1lIFByb2dyYW1taW5nIEdlbXMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0NSLWRvY3MiOiBbCiAgICAgICAgIkdub21lIEdDUiBEb2N1bWVudGF0aW9uIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdEIjogWwogICAgICAgICJHRCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJnZW5lcmljLXh0cyI6IFsKICAgICAgICAiR2VuZXJpYyBYVFMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0ZETC0xLjEiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkdGREwtMS4xLWludmFyaWFudHMtb25seSI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjEgb25seSAtIGludmFyaWFudHMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdGREwtMS4xLWludmFyaWFudHMtb3ItbGF0ZXIiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4xIG9yIGxhdGVyIC0gaW52YXJpYW50cyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0ZETC0xLjEtbm8taW52YXJpYW50cy1vbmx5IjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMSBvbmx5IC0gbm8gaW52YXJpYW50cyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0ZETC0xLjEtbm8taW52YXJpYW50cy1vci1sYXRlciI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjEgb3IgbGF0ZXIgLSBubyBpbnZhcmlhbnRzIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHRkRMLTEuMS1vbmx5IjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMSBvbmx5IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHRkRMLTEuMS1vci1sYXRlciI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjEgb3IgbGF0ZXIiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdGREwtMS4yIjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHRkRMLTEuMi1pbnZhcmlhbnRzLW9ubHkiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4yIG9ubHkgLSBpbnZhcmlhbnRzIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHRkRMLTEuMi1pbnZhcmlhbnRzLW9yLWxhdGVyIjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMiBvciBsYXRlciAtIGludmFyaWFudHMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdGREwtMS4yLW5vLWludmFyaWFudHMtb25seSI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjIgb25seSAtIG5vIGludmFyaWFudHMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdGREwtMS4yLW5vLWludmFyaWFudHMtb3ItbGF0ZXIiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4yIG9yIGxhdGVyIC0gbm8gaW52YXJpYW50cyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0ZETC0xLjItb25seSI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjIgb25seSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0ZETC0xLjItb3ItbGF0ZXIiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4yIG9yIGxhdGVyIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHRkRMLTEuMyI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjMiLAogICAgICAgIGZhbHNlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiR0ZETC0xLjMtaW52YXJpYW50cy1vbmx5IjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMyBvbmx5IC0gaW52YXJpYW50cyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0ZETC0xLjMtaW52YXJpYW50cy1vci1sYXRlciI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjMgb3IgbGF0ZXIgLSBpbnZhcmlhbnRzIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHRkRMLTEuMy1uby1pbnZhcmlhbnRzLW9ubHkiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4zIG9ubHkgLSBubyBpbnZhcmlhbnRzIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHRkRMLTEuMy1uby1pbnZhcmlhbnRzLW9yLWxhdGVyIjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMyBvciBsYXRlciAtIG5vIGludmFyaWFudHMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdGREwtMS4zLW9ubHkiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4zIG9ubHkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdGREwtMS4zLW9yLWxhdGVyIjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMyBvciBsYXRlciIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR2lmdHdhcmUiOiBbCiAgICAgICAgIkdpZnR3YXJlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdMMlBTIjogWwogICAgICAgICJHTDJQUyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHbGlkZSI6IFsKICAgICAgICAiM2RmeCBHbGlkZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHbHVseGUiOiBbCiAgICAgICAgIkdsdWx4ZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHTFdUUEwiOiBbCiAgICAgICAgIkdvb2QgTHVjayBXaXRoIFRoYXQgUHVibGljIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImdudXBsb3QiOiBbCiAgICAgICAgImdudXBsb3QgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR1BMLTEuMCI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjEuMCBvbmx5IiwKICAgICAgICBmYWxzZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkdQTC0xLjArIjogWwogICAgICAgICJHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2MS4wIG9yIGxhdGVyIiwKICAgICAgICBmYWxzZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkdQTC0xLjAtb25seSI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjEuMCBvbmx5IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHUEwtMS4wLW9yLWxhdGVyIjogWwogICAgICAgICJHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2MS4wIG9yIGxhdGVyIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHUEwtMi4wIjogWwogICAgICAgICJHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2Mi4wIG9ubHkiLAogICAgICAgIHRydWUsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHUEwtMi4wKyI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIuMCBvciBsYXRlciIsCiAgICAgICAgdHJ1ZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkdQTC0yLjAtb25seSI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIuMCBvbmx5IiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdQTC0yLjAtb3ItbGF0ZXIiOiBbCiAgICAgICAgIkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyLjAgb3IgbGF0ZXIiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR1BMLTIuMC13aXRoLWF1dG9jb25mLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIuMCB3L0F1dG9jb25mIGV4Y2VwdGlvbiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHUEwtMi4wLXdpdGgtYmlzb24tZXhjZXB0aW9uIjogWwogICAgICAgICJHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2Mi4wIHcvQmlzb24gZXhjZXB0aW9uIiwKICAgICAgICBmYWxzZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkdQTC0yLjAtd2l0aC1jbGFzc3BhdGgtZXhjZXB0aW9uIjogWwogICAgICAgICJHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2Mi4wIHcvQ2xhc3NwYXRoIGV4Y2VwdGlvbiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHUEwtMi4wLXdpdGgtZm9udC1leGNlcHRpb24iOiBbCiAgICAgICAgIkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyLjAgdy9Gb250IGV4Y2VwdGlvbiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHUEwtMi4wLXdpdGgtR0NDLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIuMCB3L0dDQyBSdW50aW1lIExpYnJhcnkgZXhjZXB0aW9uIiwKICAgICAgICBmYWxzZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkdQTC0zLjAiOiBbCiAgICAgICAgIkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYzLjAgb25seSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkdQTC0zLjArIjogWwogICAgICAgICJHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2My4wIG9yIGxhdGVyIiwKICAgICAgICB0cnVlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiR1BMLTMuMC1vbmx5IjogWwogICAgICAgICJHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2My4wIG9ubHkiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR1BMLTMuMC1vci1sYXRlciI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjMuMCBvciBsYXRlciIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHUEwtMy4wLXdpdGgtYXV0b2NvbmYtZXhjZXB0aW9uIjogWwogICAgICAgICJHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2My4wIHcvQXV0b2NvbmYgZXhjZXB0aW9uIiwKICAgICAgICBmYWxzZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkdQTC0zLjAtd2l0aC1HQ0MtZXhjZXB0aW9uIjogWwogICAgICAgICJHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2My4wIHcvR0NDIFJ1bnRpbWUgTGlicmFyeSBleGNlcHRpb24iLAogICAgICAgIHRydWUsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHcmFwaGljcy1HZW1zIjogWwogICAgICAgICJHcmFwaGljcyBHZW1zIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImdTT0FQLTEuM2IiOiBbCiAgICAgICAgImdTT0FQIFB1YmxpYyBMaWNlbnNlIHYxLjNiIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJndGtib29rIjogWwogICAgICAgICJndGtib29rIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkd1dG1hbm4iOiBbCiAgICAgICAgIkd1dG1hbm4gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSGFza2VsbFJlcG9ydCI6IFsKICAgICAgICAiSGFza2VsbCBMYW5ndWFnZSBSZXBvcnQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSERGNSI6IFsKICAgICAgICAiSERGNSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJoZHBhcm0iOiBbCiAgICAgICAgImhkcGFybSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJISURBUEkiOiBbCiAgICAgICAgIkhJREFQSSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIaXBwb2NyYXRpYy0yLjEiOiBbCiAgICAgICAgIkhpcHBvY3JhdGljIExpY2Vuc2UgMi4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIUC0xOTg2IjogWwogICAgICAgICJIZXdsZXR0LVBhY2thcmQgMTk4NiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIUC0xOTg5IjogWwogICAgICAgICJIZXdsZXR0LVBhY2thcmQgMTk4OSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIUE5EIjogWwogICAgICAgICJIaXN0b3JpY2FsIFBlcm1pc3Npb24gTm90aWNlIGFuZCBEaXNjbGFpbWVyIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQTkQtREVDIjogWwogICAgICAgICJIaXN0b3JpY2FsIFBlcm1pc3Npb24gTm90aWNlIGFuZCBEaXNjbGFpbWVyIC0gREVDIHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQTkQtZG9jIjogWwogICAgICAgICJIaXN0b3JpY2FsIFBlcm1pc3Npb24gTm90aWNlIGFuZCBEaXNjbGFpbWVyIC0gZG9jdW1lbnRhdGlvbiB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIUE5ELWRvYy1zZWxsIjogWwogICAgICAgICJIaXN0b3JpY2FsIFBlcm1pc3Npb24gTm90aWNlIGFuZCBEaXNjbGFpbWVyIC0gZG9jdW1lbnRhdGlvbiBzZWxsIHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQTkQtZXhwb3J0LVVTIjogWwogICAgICAgICJIUE5EIHdpdGggVVMgR292ZXJubWVudCBleHBvcnQgY29udHJvbCB3YXJuaW5nIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIUE5ELWV4cG9ydC1VUy1hY2tub3dsZWRnZW1lbnQiOiBbCiAgICAgICAgIkhQTkQgd2l0aCBVUyBHb3Zlcm5tZW50IGV4cG9ydCBjb250cm9sIHdhcm5pbmcgYW5kIGFja25vd2xlZGdtZW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIUE5ELWV4cG9ydC1VUy1tb2RpZnkiOiBbCiAgICAgICAgIkhQTkQgd2l0aCBVUyBHb3Zlcm5tZW50IGV4cG9ydCBjb250cm9sIHdhcm5pbmcgYW5kIG1vZGlmaWNhdGlvbiBycW10IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIUE5ELWV4cG9ydDItVVMiOiBbCiAgICAgICAgIkhQTkQgd2l0aCBVUyBHb3Zlcm5tZW50IGV4cG9ydCBjb250cm9sIGFuZCAyIGRpc2NsYWltZXJzIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIUE5ELUZlbm5lYmVyZy1MaXZpbmdzdG9uIjogWwogICAgICAgICJIaXN0b3JpY2FsIFBlcm1pc3Npb24gTm90aWNlIGFuZCBEaXNjbGFpbWVyIC0gRmVubmViZXJnLUxpdmluZ3N0b24gdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFBORC1JTlJJQS1JTUFHIjogWwogICAgICAgICJIaXN0b3JpY2FsIFBlcm1pc3Npb24gTm90aWNlIGFuZCBEaXNjbGFpbWVyICAgIC0gSU5SSUEtSU1BRyB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIUE5ELUludGVsIjogWwogICAgICAgICJIaXN0b3JpY2FsIFBlcm1pc3Npb24gTm90aWNlIGFuZCBEaXNjbGFpbWVyIC0gSW50ZWwgdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFBORC1LZXZsaW4tSGVubmV5IjogWwogICAgICAgICJIaXN0b3JpY2FsIFBlcm1pc3Npb24gTm90aWNlIGFuZCBEaXNjbGFpbWVyIC0gS2V2bGluIEhlbm5leSB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIUE5ELU1hcmt1cy1LdWhuIjogWwogICAgICAgICJIaXN0b3JpY2FsIFBlcm1pc3Npb24gTm90aWNlIGFuZCBEaXNjbGFpbWVyIC0gTWFya3VzIEt1aG4gdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFBORC1tZXJjaGFudGFiaWxpdHktdmFyaWFudCI6IFsKICAgICAgICAiSGlzdG9yaWNhbCBQZXJtaXNzaW9uIE5vdGljZSBhbmQgRGlzY2xhaW1lciAtIG1lcmNoYW50YWJpbGl0eSB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIUE5ELU1JVC1kaXNjbGFpbWVyIjogWwogICAgICAgICJIaXN0b3JpY2FsIFBlcm1pc3Npb24gTm90aWNlIGFuZCBEaXNjbGFpbWVyIHdpdGggTUlUIGRpc2NsYWltZXIiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQTkQtTmV0cmVrIjogWwogICAgICAgICJIaXN0b3JpY2FsIFBlcm1pc3Npb24gTm90aWNlIGFuZCBEaXNjbGFpbWVyIC0gTmV0cmVrIHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQTkQtUGJtcGx1cyI6IFsKICAgICAgICAiSGlzdG9yaWNhbCBQZXJtaXNzaW9uIE5vdGljZSBhbmQgRGlzY2xhaW1lciAtIFBibXBsdXMgdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFBORC1zZWxsLU1JVC1kaXNjbGFpbWVyLXhzZXJ2ZXIiOiBbCiAgICAgICAgIkhpc3RvcmljYWwgUGVybWlzc2lvbiBOb3RpY2UgYW5kIERpc2NsYWltZXIgLSBzZWxsIHhzZXJ2ZXIgdmFyaWFudCB3aXRoIE1JVCBkaXNjbGFpbWVyIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIUE5ELXNlbGwtcmVnZXhwciI6IFsKICAgICAgICAiSGlzdG9yaWNhbCBQZXJtaXNzaW9uIE5vdGljZSBhbmQgRGlzY2xhaW1lciAtIHNlbGwgcmVnZXhwciB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIUE5ELXNlbGwtdmFyaWFudCI6IFsKICAgICAgICAiSGlzdG9yaWNhbCBQZXJtaXNzaW9uIE5vdGljZSBhbmQgRGlzY2xhaW1lciAtIHNlbGwgdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFBORC1zZWxsLXZhcmlhbnQtY3JpdGljYWwtc3lzdGVtcyI6IFsKICAgICAgICAiSFBORCAtIHNlbGwgdmFyaWFudCB3aXRoIHNhZmV0eSBjcml0aWNhbCBzeXN0ZW1zIGNsYXVzZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFBORC1zZWxsLXZhcmlhbnQtTUlULWRpc2NsYWltZXIiOiBbCiAgICAgICAgIkhQTkQgc2VsbCB2YXJpYW50IHdpdGggTUlUIGRpc2NsYWltZXIiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQTkQtc2VsbC12YXJpYW50LU1JVC1kaXNjbGFpbWVyLXJldiI6IFsKICAgICAgICAiSFBORCBzZWxsIHZhcmlhbnQgd2l0aCBNSVQgZGlzY2xhaW1lciAtIHJldmVyc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQTkQtU01DIjogWwogICAgICAgICJIaXN0b3JpY2FsIFBlcm1pc3Npb24gTm90aWNlIGFuZCBEaXNjbGFpbWVyIC0gU01DIHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQTkQtVUMiOiBbCiAgICAgICAgIkhpc3RvcmljYWwgUGVybWlzc2lvbiBOb3RpY2UgYW5kIERpc2NsYWltZXIgLSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEgdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFBORC1VQy1leHBvcnQtVVMiOiBbCiAgICAgICAgIkhpc3RvcmljYWwgUGVybWlzc2lvbiBOb3RpY2UgYW5kIERpc2NsYWltZXIgLSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIFVTIGV4cG9ydCB3YXJuaW5nIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIVE1MVElEWSI6IFsKICAgICAgICAiSFRNTCBUaWR5IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImh5cGhlbi1idWxnYXJpYW4iOiBbCiAgICAgICAgImh5cGhlbi1idWxnYXJpYW4gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSUJNLXBpYnMiOiBbCiAgICAgICAgIklCTSBQb3dlclBDIEluaXRpYWxpemF0aW9uIGFuZCBCb290IFNvZnR3YXJlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJJQ1UiOiBbCiAgICAgICAgIklDVSBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIklFQy1Db2RlLUNvbXBvbmVudHMtRVVMQSI6IFsKICAgICAgICAiSUVDICAgIENvZGUgQ29tcG9uZW50cyBFbmQtdXNlciBsaWNlbmNlIGFncmVlbWVudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSUpHIjogWwogICAgICAgICJJbmRlcGVuZGVudCBKUEVHIEdyb3VwIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIklKRy1zaG9ydCI6IFsKICAgICAgICAiSW5kZXBlbmRlbnQgSlBFRyBHcm91cCBMaWNlbnNlIC0gc2hvcnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkltYWdlTWFnaWNrIjogWwogICAgICAgICJJbWFnZU1hZ2ljayBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJpTWF0aXgiOiBbCiAgICAgICAgImlNYXRpeCBTdGFuZGFyZCBGdW5jdGlvbiBMaWJyYXJ5IEFncmVlbWVudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSW1saWIyIjogWwogICAgICAgICJJbWxpYjIgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSW5mby1aSVAiOiBbCiAgICAgICAgIkluZm8tWklQIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIklubmVyLU5ldC0yLjAiOiBbCiAgICAgICAgIklubmVyIE5ldCBMaWNlbnNlIHYyLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIklubm9TZXR1cCI6IFsKICAgICAgICAiSW5ubyBTZXR1cCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJJbnRlbCI6IFsKICAgICAgICAiSW50ZWwgT3BlbiBTb3VyY2UgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJJbnRlbC1BQ1BJIjogWwogICAgICAgICJJbnRlbCBBQ1BJIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJJbnRlcmJhc2UtMS4wIjogWwogICAgICAgICJJbnRlcmJhc2UgUHVibGljIExpY2Vuc2UgdjEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSVBBIjogWwogICAgICAgICJJUEEgRm9udCBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIklQTC0xLjAiOiBbCiAgICAgICAgIklCTSBQdWJsaWMgTGljZW5zZSB2MS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIklTQyI6IFsKICAgICAgICAiSVNDIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSVNDLVZlaWxsYXJkIjogWwogICAgICAgICJJU0MgVmVpbGxhcmQgdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSVNPLXBlcm1pc3Npb24iOiBbCiAgICAgICAgIklTTyBwZXJtaXNzaW9uIG5vdGljZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSmFtIjogWwogICAgICAgICJKYW0gTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJKYXNQZXItMi4wIjogWwogICAgICAgICJKYXNQZXIgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiam92ZSI6IFsKICAgICAgICAiSm92ZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJKUEwtaW1hZ2UiOiBbCiAgICAgICAgIkpQTCBJbWFnZSBVc2UgUG9saWN5IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJKUE5JQyI6IFsKICAgICAgICAiSmFwYW4gTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSlNPTiI6IFsKICAgICAgICAiSlNPTiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJLYXN0cnVwIjogWwogICAgICAgICJLYXN0cnVwIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkthemxpYiI6IFsKICAgICAgICAiS2F6bGliIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIktudXRoLUNUQU4iOiBbCiAgICAgICAgIktudXRoIENUQU4gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTEFMLTEuMiI6IFsKICAgICAgICAiTGljZW5jZSBBcnQgTGlicmUgMS4yIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMQUwtMS4zIjogWwogICAgICAgICJMaWNlbmNlIEFydCBMaWJyZSAxLjMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxhdGV4MmUiOiBbCiAgICAgICAgIkxhdGV4MmUgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTGF0ZXgyZS10cmFuc2xhdGVkLW5vdGljZSI6IFsKICAgICAgICAiTGF0ZXgyZSB3aXRoIHRyYW5zbGF0ZWQgbm90aWNlIHBlcm1pc3Npb24iLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxlcHRvbmljYSI6IFsKICAgICAgICAiTGVwdG9uaWNhIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxHUEwtMi4wIjogWwogICAgICAgICJHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyIG9ubHkiLAogICAgICAgIHRydWUsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJMR1BMLTIuMCsiOiBbCiAgICAgICAgIkdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIgb3IgbGF0ZXIiLAogICAgICAgIHRydWUsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJMR1BMLTIuMC1vbmx5IjogWwogICAgICAgICJHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyIG9ubHkiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTEdQTC0yLjAtb3ItbGF0ZXIiOiBbCiAgICAgICAgIkdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIgb3IgbGF0ZXIiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTEdQTC0yLjEiOiBbCiAgICAgICAgIkdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2Mi4xIG9ubHkiLAogICAgICAgIHRydWUsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJMR1BMLTIuMSsiOiBbCiAgICAgICAgIkdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2Mi4xIG9yIGxhdGVyIiwKICAgICAgICB0cnVlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiTEdQTC0yLjEtb25seSI6IFsKICAgICAgICAiR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyLjEgb25seSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMR1BMLTIuMS1vci1sYXRlciI6IFsKICAgICAgICAiR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyLjEgb3IgbGF0ZXIiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTEdQTC0zLjAiOiBbCiAgICAgICAgIkdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2My4wIG9ubHkiLAogICAgICAgIHRydWUsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJMR1BMLTMuMCsiOiBbCiAgICAgICAgIkdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2My4wIG9yIGxhdGVyIiwKICAgICAgICB0cnVlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiTEdQTC0zLjAtb25seSI6IFsKICAgICAgICAiR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYzLjAgb25seSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMR1BMLTMuMC1vci1sYXRlciI6IFsKICAgICAgICAiR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYzLjAgb3IgbGF0ZXIiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTEdQTExSIjogWwogICAgICAgICJMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBGb3IgTGluZ3Vpc3RpYyBSZXNvdXJjZXMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxpYnBuZyI6IFsKICAgICAgICAibGlicG5nIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImxpYnBuZy0xLjYuMzUiOiBbCiAgICAgICAgIlBORyBSZWZlcmVuY2UgTGlicmFyeSBMaWNlbnNlIHYxIChmb3IgbGlicG5nIDAuNSB0aHJvdWdoIDEuNi4zNSkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImxpYnBuZy0yLjAiOiBbCiAgICAgICAgIlBORyBSZWZlcmVuY2UgTGlicmFyeSB2ZXJzaW9uIDIiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImxpYnNlbGludXgtMS4wIjogWwogICAgICAgICJsaWJzZWxpbnV4IHB1YmxpYyBkb21haW4gbm90aWNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJsaWJ0aWZmIjogWwogICAgICAgICJsaWJ0aWZmIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImxpYnV0aWwtRGF2aWQtTnVnZW50IjogWwogICAgICAgICJsaWJ1dGlsIERhdmlkIE51Z2VudCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMaUxpUS1QLTEuMSI6IFsKICAgICAgICAiTGljZW5jZSBMaWJyZSBkdSBRdVx1MDBlOWJlYyBcdTIwMTMgUGVybWlzc2l2ZSB2ZXJzaW9uIDEuMSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMaUxpUS1SLTEuMSI6IFsKICAgICAgICAiTGljZW5jZSBMaWJyZSBkdSBRdVx1MDBlOWJlYyBcdTIwMTMgUlx1MDBlOWNpcHJvY2l0XHUwMGU5IHZlcnNpb24gMS4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxpTGlRLVJwbHVzLTEuMSI6IFsKICAgICAgICAiTGljZW5jZSBMaWJyZSBkdSBRdVx1MDBlOWJlYyBcdTIwMTMgUlx1MDBlOWNpcHJvY2l0XHUwMGU5IGZvcnRlIHZlcnNpb24gMS4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxpbnV4LW1hbi1wYWdlcy0xLXBhcmEiOiBbCiAgICAgICAgIkxpbnV4IG1hbi1wYWdlcyAtIDEgcGFyYWdyYXBoIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMaW51eC1tYW4tcGFnZXMtY29weWxlZnQiOiBbCiAgICAgICAgIkxpbnV4IG1hbi1wYWdlcyBDb3B5bGVmdCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTGludXgtbWFuLXBhZ2VzLWNvcHlsZWZ0LTItcGFyYSI6IFsKICAgICAgICAiTGludXggbWFuLXBhZ2VzIENvcHlsZWZ0IC0gMiBwYXJhZ3JhcGhzIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMaW51eC1tYW4tcGFnZXMtY29weWxlZnQtdmFyIjogWwogICAgICAgICJMaW51eCBtYW4tcGFnZXMgQ29weWxlZnQgVmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTGludXgtT3BlbklCIjogWwogICAgICAgICJMaW51eCBLZXJuZWwgVmFyaWFudCBvZiBPcGVuSUIub3JnIGxpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxPT1AiOiBbCiAgICAgICAgIkNvbW1vbiBMaXNwIExPT1AgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTFBELWRvY3VtZW50IjogWwogICAgICAgICJMUEQgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMUEwtMS4wIjogWwogICAgICAgICJMdWNlbnQgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTFBMLTEuMDIiOiBbCiAgICAgICAgIkx1Y2VudCBQdWJsaWMgTGljZW5zZSB2MS4wMiIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMUFBMLTEuMCI6IFsKICAgICAgICAiTGFUZVggUHJvamVjdCBQdWJsaWMgTGljZW5zZSB2MS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMUFBMLTEuMSI6IFsKICAgICAgICAiTGFUZVggUHJvamVjdCBQdWJsaWMgTGljZW5zZSB2MS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMUFBMLTEuMiI6IFsKICAgICAgICAiTGFUZVggUHJvamVjdCBQdWJsaWMgTGljZW5zZSB2MS4yIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMUFBMLTEuM2EiOiBbCiAgICAgICAgIkxhVGVYIFByb2plY3QgUHVibGljIExpY2Vuc2UgdjEuM2EiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxQUEwtMS4zYyI6IFsKICAgICAgICAiTGFUZVggUHJvamVjdCBQdWJsaWMgTGljZW5zZSB2MS4zYyIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJsc29mIjogWwogICAgICAgICJsc29mIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkx1Y2lkYS1CaXRtYXAtRm9udHMiOiBbCiAgICAgICAgIkx1Y2lkYSBCaXRtYXAgRm9udHMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTFpNQS1TREstOS4xMS10by05LjIwIjogWwogICAgICAgICJMWk1BIFNESyBMaWNlbnNlICh2ZXJzaW9ucyA5LjExIHRvIDkuMjApIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMWk1BLVNESy05LjIyIjogWwogICAgICAgICJMWk1BIFNESyBMaWNlbnNlICh2ZXJzaW9ucyA5LjIyIGFuZCBiZXlvbmQpIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNYWNrZXJyYXMtMy1DbGF1c2UiOiBbCiAgICAgICAgIk1hY2tlcnJhcyAzLUNsYXVzZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNYWNrZXJyYXMtMy1DbGF1c2UtYWNrbm93bGVkZ21lbnQiOiBbCiAgICAgICAgIk1hY2tlcnJhcyAzLUNsYXVzZSAtIGFja25vd2xlZGdtZW50IHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIm1hZ2F6IjogWwogICAgICAgICJtYWdheiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJtYWlscHJpbyI6IFsKICAgICAgICAibWFpbHByaW8gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTWFrZUluZGV4IjogWwogICAgICAgICJNYWtlSW5kZXggTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAibWFuMmh0bWwiOiBbCiAgICAgICAgIm1hbjJodG1sIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1hcnRpbi1CaXJnbWVpZXIiOiBbCiAgICAgICAgIk1hcnRpbiBCaXJnbWVpZXIgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTWNQaGVlLXNsaWRlc2hvdyI6IFsKICAgICAgICAiTWNQaGVlIFNsaWRlc2hvdyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJtZXRhbWFpbCI6IFsKICAgICAgICAibWV0YW1haWwgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTWlucGFjayI6IFsKICAgICAgICAiTWlucGFjayBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNSVBTIjogWwogICAgICAgICJNSVBTIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1pck9TIjogWwogICAgICAgICJUaGUgTWlyT1MgTGljZW5jZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNSVQiOiBbCiAgICAgICAgIk1JVCBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1JVC0wIjogWwogICAgICAgICJNSVQgTm8gQXR0cmlidXRpb24iLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTUlULWFkdmVydGlzaW5nIjogWwogICAgICAgICJFbmxpZ2h0ZW5tZW50IExpY2Vuc2UgKGUxNikiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1JVC1DbGljayI6IFsKICAgICAgICAiTUlUIENsaWNrIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1JVC1DTVUiOiBbCiAgICAgICAgIkNNVSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNSVQtZW5uYSI6IFsKICAgICAgICAiZW5uYSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNSVQtZmVoIjogWwogICAgICAgICJmZWggTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTUlULUZlc3RpdmFsIjogWwogICAgICAgICJNSVQgRmVzdGl2YWwgVmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTUlULUtocm9ub3Mtb2xkIjogWwogICAgICAgICJNSVQgS2hyb25vcyAtIG9sZCB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNSVQtTW9kZXJuLVZhcmlhbnQiOiBbCiAgICAgICAgIk1JVCBMaWNlbnNlIE1vZGVybiBWYXJpYW50IiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1JVC1vcGVuLWdyb3VwIjogWwogICAgICAgICJNSVQgT3BlbiBHcm91cCB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNSVQtU1RLIjogWwogICAgICAgICJNSVQtU1RLIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1JVC10ZXN0cmVnZXgiOiBbCiAgICAgICAgIk1JVCB0ZXN0cmVnZXggVmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTUlULVd1IjogWwogICAgICAgICJNSVQgVG9tIFd1IFZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1JVE5GQSI6IFsKICAgICAgICAiTUlUICtuby1mYWxzZS1hdHRyaWJzIGxpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1NSVh3YXJlIjogWwogICAgICAgICJNTUlYd2FyZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNTVBMLTEuMC4xIjogWwogICAgICAgICJNaW5lY3JhZnQgTW9kIFB1YmxpYyBMaWNlbnNlIHYxLjAuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTW90b3NvdG8iOiBbCiAgICAgICAgIk1vdG9zb3RvIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTVBFRy1TU0ciOiBbCiAgICAgICAgIk1QRUcgU29mdHdhcmUgU2ltdWxhdGlvbiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAibXBpLXBlcm1pc3NpdmUiOiBbCiAgICAgICAgIm1waSBQZXJtaXNzaXZlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIm1waWNoMiI6IFsKICAgICAgICAibXBpY2gyIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1QTC0xLjAiOiBbCiAgICAgICAgIk1vemlsbGEgUHVibGljIExpY2Vuc2UgMS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1QTC0xLjEiOiBbCiAgICAgICAgIk1vemlsbGEgUHVibGljIExpY2Vuc2UgMS4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1QTC0yLjAiOiBbCiAgICAgICAgIk1vemlsbGEgUHVibGljIExpY2Vuc2UgMi4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1QTC0yLjAtbm8tY29weWxlZnQtZXhjZXB0aW9uIjogWwogICAgICAgICJNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIDIuMCAobm8gY29weWxlZnQgZXhjZXB0aW9uKSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJtcGx1cyI6IFsKICAgICAgICAibXBsdXMgRm9udCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNUy1MUEwiOiBbCiAgICAgICAgIk1pY3Jvc29mdCBMaW1pdGVkIFB1YmxpYyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNUy1QTCI6IFsKICAgICAgICAiTWljcm9zb2Z0IFB1YmxpYyBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1TLVJMIjogWwogICAgICAgICJNaWNyb3NvZnQgUmVjaXByb2NhbCBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1UTEwiOiBbCiAgICAgICAgIk1hdHJpeCBUZW1wbGF0ZSBMaWJyYXJ5IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk11bGFuUFNMLTEuMCI6IFsKICAgICAgICAiTXVsYW4gUGVybWlzc2l2ZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk11bGFuUFNMLTIuMCI6IFsKICAgICAgICAiTXVsYW4gUGVybWlzc2l2ZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTXVsdGljcyI6IFsKICAgICAgICAiTXVsdGljcyBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk11cCI6IFsKICAgICAgICAiTXVwIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5BSVNULTIwMDMiOiBbCiAgICAgICAgIk5hcmEgSW5zdGl0dXRlIG9mIFNjaWVuY2UgYW5kIFRlY2hub2xvZ3kgTGljZW5zZSAoMjAwMykiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5BU0EtMS4zIjogWwogICAgICAgICJOQVNBIE9wZW4gU291cmNlIEFncmVlbWVudCAxLjMiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTmF1bWVuIjogWwogICAgICAgICJOYXVtZW4gUHVibGljIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTkJQTC0xLjAiOiBbCiAgICAgICAgIk5ldCBCb29sZWFuIFB1YmxpYyBMaWNlbnNlIHYxIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOQ0JJLVBEIjogWwogICAgICAgICJOQ0JJIFB1YmxpYyBEb21haW4gTm90aWNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOQ0dMLVVLLTIuMCI6IFsKICAgICAgICAiTm9uLUNvbW1lcmNpYWwgR292ZXJubWVudCBMaWNlbmNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOQ0wiOiBbCiAgICAgICAgIk5DTCBTb3VyY2UgQ29kZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOQ1NBIjogWwogICAgICAgICJVbml2ZXJzaXR5IG9mIElsbGlub2lzL05DU0EgT3BlbiBTb3VyY2UgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOZXQtU05NUCI6IFsKICAgICAgICAiTmV0LVNOTVAgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJOZXRDREYiOiBbCiAgICAgICAgIk5ldENERiBsaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOZXdzbGV0ciI6IFsKICAgICAgICAiTmV3c2xldHIgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTkdQTCI6IFsKICAgICAgICAiTmV0aGFjayBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIm5ncmVwIjogWwogICAgICAgICJuZ3JlcCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOSUNUQS0xLjAiOiBbCiAgICAgICAgIk5JQ1RBIFB1YmxpYyBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTklTVC1QRCI6IFsKICAgICAgICAiTklTVCBQdWJsaWMgRG9tYWluIE5vdGljZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTklTVC1QRC1mYWxsYmFjayI6IFsKICAgICAgICAiTklTVCBQdWJsaWMgRG9tYWluIE5vdGljZSB3aXRoIGxpY2Vuc2UgZmFsbGJhY2siLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5JU1QtUEQtVE5UIjogWwogICAgICAgICJOSVNUICAgIFB1YmxpYyBEb21haW4gTm90aWNlIFROVCB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOSVNULVNvZnR3YXJlIjogWwogICAgICAgICJOSVNUIFNvZnR3YXJlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5MT0QtMS4wIjogWwogICAgICAgICJOb3J3ZWdpYW4gTGljZW5jZSBmb3IgT3BlbiBHb3Zlcm5tZW50IERhdGEgKE5MT0QpIDEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTkxPRC0yLjAiOiBbCiAgICAgICAgIk5vcndlZ2lhbiBMaWNlbmNlIGZvciBPcGVuIEdvdmVybm1lbnQgRGF0YSAoTkxPRCkgMi4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOTFBMIjogWwogICAgICAgICJObyBMaW1pdCBQdWJsaWMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTm9raWEiOiBbCiAgICAgICAgIk5va2lhIE9wZW4gU291cmNlIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTk9TTCI6IFsKICAgICAgICAiTmV0aXplbiBPcGVuIFNvdXJjZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOb3dlYiI6IFsKICAgICAgICAiTm93ZWIgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTlBMLTEuMCI6IFsKICAgICAgICAiTmV0c2NhcGUgUHVibGljIExpY2Vuc2UgdjEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTlBMLTEuMSI6IFsKICAgICAgICAiTmV0c2NhcGUgUHVibGljIExpY2Vuc2UgdjEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTlBPU0wtMy4wIjogWwogICAgICAgICJOb24tUHJvZml0IE9wZW4gU29mdHdhcmUgTGljZW5zZSAzLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTlJMIjogWwogICAgICAgICJOUkwgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTlRJQS1QRCI6IFsKICAgICAgICAiTlRJQSBQdWJsaWMgRG9tYWluIE5vdGljZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTlRQIjogWwogICAgICAgICJOVFAgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOVFAtMCI6IFsKICAgICAgICAiTlRQIE5vIEF0dHJpYnV0aW9uIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOdW5pdCI6IFsKICAgICAgICAiTnVuaXQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJPLVVEQS0xLjAiOiBbCiAgICAgICAgIk9wZW4gVXNlIG9mIERhdGEgQWdyZWVtZW50IHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9BUiI6IFsKICAgICAgICAiT0FSIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9DQ1QtUEwiOiBbCiAgICAgICAgIk9wZW4gQ0FTQ0FERSBUZWNobm9sb2d5IFB1YmxpYyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPQ0xDLTIuMCI6IFsKICAgICAgICAiT0NMQyBSZXNlYXJjaCBQdWJsaWMgTGljZW5zZSAyLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0RiTC0xLjAiOiBbCiAgICAgICAgIk9wZW4gRGF0YSBDb21tb25zIE9wZW4gRGF0YWJhc2UgTGljZW5zZSB2MS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPREMtQnktMS4wIjogWwogICAgICAgICJPcGVuIERhdGEgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9GRklTIjogWwogICAgICAgICJPRkZJUyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPRkwtMS4wIjogWwogICAgICAgICJTSUwgT3BlbiBGb250IExpY2Vuc2UgMS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPRkwtMS4wLW5vLVJGTiI6IFsKICAgICAgICAiU0lMIE9wZW4gRm9udCBMaWNlbnNlIDEuMCB3aXRoIG5vIFJlc2VydmVkIEZvbnQgTmFtZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0ZMLTEuMC1SRk4iOiBbCiAgICAgICAgIlNJTCBPcGVuIEZvbnQgTGljZW5zZSAxLjAgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9GTC0xLjEiOiBbCiAgICAgICAgIlNJTCBPcGVuIEZvbnQgTGljZW5zZSAxLjEiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0ZMLTEuMS1uby1SRk4iOiBbCiAgICAgICAgIlNJTCBPcGVuIEZvbnQgTGljZW5zZSAxLjEgd2l0aCBubyBSZXNlcnZlZCBGb250IE5hbWUiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0ZMLTEuMS1SRk4iOiBbCiAgICAgICAgIlNJTCBPcGVuIEZvbnQgTGljZW5zZSAxLjEgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0dDLTEuMCI6IFsKICAgICAgICAiT0dDIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPR0RMLVRhaXdhbi0xLjAiOiBbCiAgICAgICAgIlRhaXdhbiBPcGVuIEdvdmVybm1lbnQgRGF0YSBMaWNlbnNlLCB2ZXJzaW9uIDEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0dMLUNhbmFkYS0yLjAiOiBbCiAgICAgICAgIk9wZW4gR292ZXJubWVudCBMaWNlbmNlIC0gQ2FuYWRhIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPR0wtVUstMS4wIjogWwogICAgICAgICJPcGVuIEdvdmVybm1lbnQgTGljZW5jZSB2MS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPR0wtVUstMi4wIjogWwogICAgICAgICJPcGVuIEdvdmVybm1lbnQgTGljZW5jZSB2Mi4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPR0wtVUstMy4wIjogWwogICAgICAgICJPcGVuIEdvdmVybm1lbnQgTGljZW5jZSB2My4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPR1RTTCI6IFsKICAgICAgICAiT3BlbiBHcm91cCBUZXN0IFN1aXRlIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMS4xIjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMS4yIjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjEuMiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMS4zIjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjEuMyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMS40IjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjEuNCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMi4wIjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjIuMCAob3IgcG9zc2libHkgMi4wQSBhbmQgMi4wQikiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9MREFQLTIuMC4xIjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjIuMC4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPTERBUC0yLjEiOiBbCiAgICAgICAgIk9wZW4gTERBUCBQdWJsaWMgTGljZW5zZSB2Mi4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPTERBUC0yLjIiOiBbCiAgICAgICAgIk9wZW4gTERBUCBQdWJsaWMgTGljZW5zZSB2Mi4yIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPTERBUC0yLjIuMSI6IFsKICAgICAgICAiT3BlbiBMREFQIFB1YmxpYyBMaWNlbnNlIHYyLjIuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMi4yLjIiOiBbCiAgICAgICAgIk9wZW4gTERBUCBQdWJsaWMgTGljZW5zZSAyLjIuMiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMi4zIjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjIuMyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMi40IjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjIuNCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMi41IjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjIuNSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMi42IjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjIuNiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMi43IjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjIuNyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMi44IjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjIuOCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPTEZMLTEuMyI6IFsKICAgICAgICAiT3BlbiBMb2dpc3RpY3MgRm91bmRhdGlvbiBMaWNlbnNlIFZlcnNpb24gMS4zIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9NTCI6IFsKICAgICAgICAiT3BlbiBNYXJrZXQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT3Blbk1EVy0xLjAiOiBbCiAgICAgICAgIk9wZW5NRFcgTGljZW5zZSBBZ3JlZW1lbnQgdjEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT3BlblBCUy0yLjMiOiBbCiAgICAgICAgIk9wZW5QQlMgdjIuMyBTb2Z0d2FyZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPcGVuU1NMIjogWwogICAgICAgICJPcGVuU1NMIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9wZW5TU0wtc3RhbmRhbG9uZSI6IFsKICAgICAgICAiT3BlblNTTCBMaWNlbnNlIC0gc3RhbmRhbG9uZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT3BlblZpc2lvbiI6IFsKICAgICAgICAiT3BlblZpc2lvbiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPUEwtMS4wIjogWwogICAgICAgICJPcGVuIFB1YmxpYyBMaWNlbnNlIHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9QTC1VSy0zLjAiOiBbCiAgICAgICAgIlVuaXRlZCAgICBLaW5nZG9tIE9wZW4gUGFybGlhbWVudCBMaWNlbmNlIHYzLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9QVUJMLTEuMCI6IFsKICAgICAgICAiT3BlbiBQdWJsaWNhdGlvbiBMaWNlbnNlIHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9TQy0xLjAiOiBbCiAgICAgICAgIk9TQyBMaWNlbnNlIDEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPU0VULVBMLTIuMSI6IFsKICAgICAgICAiT1NFVCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPU0wtMS4wIjogWwogICAgICAgICJPcGVuIFNvZnR3YXJlIExpY2Vuc2UgMS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9TTC0xLjEiOiBbCiAgICAgICAgIk9wZW4gU29mdHdhcmUgTGljZW5zZSAxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9TTC0yLjAiOiBbCiAgICAgICAgIk9wZW4gU29mdHdhcmUgTGljZW5zZSAyLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT1NMLTIuMSI6IFsKICAgICAgICAiT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIDIuMSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPU0wtMy4wIjogWwogICAgICAgICJPcGVuIFNvZnR3YXJlIExpY2Vuc2UgMy4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9TU1AiOiBbCiAgICAgICAgIk9TU1AgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUEFETCI6IFsKICAgICAgICAiUEFETCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJQYXJhVHlwZS1GcmVlLUZvbnQtMS4zIjogWwogICAgICAgICJQYXJhVHlwZSBGcmVlIEZvbnQgTGljZW5zaW5nIEFncmVlbWVudCB2MS4zIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJQYXJpdHktNi4wLjAiOiBbCiAgICAgICAgIlRoZSBQYXJpdHkgUHVibGljIExpY2Vuc2UgNi4wLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlBhcml0eS03LjAuMCI6IFsKICAgICAgICAiVGhlIFBhcml0eSBQdWJsaWMgTGljZW5zZSA3LjAuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUERETC0xLjAiOiBbCiAgICAgICAgIk9wZW4gRGF0YSBDb21tb25zIFB1YmxpYyBEb21haW4gRGVkaWNhdGlvbiAmIExpY2Vuc2UgMS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJQSFAtMy4wIjogWwogICAgICAgICJQSFAgTGljZW5zZSB2My4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlBIUC0zLjAxIjogWwogICAgICAgICJQSFAgTGljZW5zZSB2My4wMSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJQaXhhciI6IFsKICAgICAgICAiUGl4YXIgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAicGtnY29uZiI6IFsKICAgICAgICAicGtnY29uZiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJQbGV4dXMiOiBbCiAgICAgICAgIlBsZXh1cyBDbGFzc3dvcmxkcyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJwbm1zdGl0Y2giOiBbCiAgICAgICAgInBubXN0aXRjaCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJQb2x5Rm9ybS1Ob25jb21tZXJjaWFsLTEuMC4wIjogWwogICAgICAgICJQb2x5Rm9ybSBOb25jb21tZXJjaWFsIExpY2Vuc2UgMS4wLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlBvbHlGb3JtLVNtYWxsLUJ1c2luZXNzLTEuMC4wIjogWwogICAgICAgICJQb2x5Rm9ybSBTbWFsbCBCdXNpbmVzcyBMaWNlbnNlIDEuMC4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJQb3N0Z3JlU1FMIjogWwogICAgICAgICJQb3N0Z3JlU1FMIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUFBMIjogWwogICAgICAgICJQZWVyIFByb2R1Y3Rpb24gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUFNGLTIuMCI6IFsKICAgICAgICAiUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gTGljZW5zZSAyLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgInBzZnJhZyI6IFsKICAgICAgICAicHNmcmFnIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgInBzdXRpbHMiOiBbCiAgICAgICAgInBzdXRpbHMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUHl0aG9uLTIuMCI6IFsKICAgICAgICAiUHl0aG9uIExpY2Vuc2UgMi4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlB5dGhvbi0yLjAuMSI6IFsKICAgICAgICAiUHl0aG9uIExpY2Vuc2UgMi4wLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgInB5dGhvbi1sZGFwIjogWwogICAgICAgICJQeXRob24gbGRhcCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJRaHVsbCI6IFsKICAgICAgICAiUWh1bGwgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUVBMLTEuMCI6IFsKICAgICAgICAiUSBQdWJsaWMgTGljZW5zZSAxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUVBMLTEuMC1JTlJJQS0yMDA0IjogWwogICAgICAgICJRIFB1YmxpYyBMaWNlbnNlIDEuMCAtIElOUklBIDIwMDQgdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAicmFkdmQiOiBbCiAgICAgICAgInJhZHZkIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlJkaXNjIjogWwogICAgICAgICJSZGlzYyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJSSGVDb3MtMS4xIjogWwogICAgICAgICJSZWQgSGF0IGVDb3MgUHVibGljIExpY2Vuc2UgdjEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUlBMLTEuMSI6IFsKICAgICAgICAiUmVjaXByb2NhbCBQdWJsaWMgTGljZW5zZSAxLjEiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUlBMLTEuNSI6IFsKICAgICAgICAiUmVjaXByb2NhbCBQdWJsaWMgTGljZW5zZSAxLjUiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUlBTTC0xLjAiOiBbCiAgICAgICAgIlJlYWxOZXR3b3JrcyBQdWJsaWMgU291cmNlIExpY2Vuc2UgdjEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJSU0EtTUQiOiBbCiAgICAgICAgIlJTQSBNZXNzYWdlLURpZ2VzdCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJSU0NQTCI6IFsKICAgICAgICAiUmljb2ggU291cmNlIENvZGUgUHVibGljIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUnVieSI6IFsKICAgICAgICAiUnVieSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJSdWJ5LXB0eSI6IFsKICAgICAgICAiUnVieSBwdHkgZXh0ZW5zaW9uIGxpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNBWC1QRCI6IFsKICAgICAgICAiU2F4IFB1YmxpYyBEb21haW4gTm90aWNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTQVgtUEQtMi4wIjogWwogICAgICAgICJTYXggUHVibGljIERvbWFpbiBOb3RpY2UgMi4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTYXhwYXRoIjogWwogICAgICAgICJTYXhwYXRoIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNDRUEiOiBbCiAgICAgICAgIlNDRUEgU2hhcmVkIFNvdXJjZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTY2hlbWVSZXBvcnQiOiBbCiAgICAgICAgIlNjaGVtZSBMYW5ndWFnZSBSZXBvcnQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU2VuZG1haWwiOiBbCiAgICAgICAgIlNlbmRtYWlsIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNlbmRtYWlsLTguMjMiOiBbCiAgICAgICAgIlNlbmRtYWlsIExpY2Vuc2UgOC4yMyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU2VuZG1haWwtT3Blbi1Tb3VyY2UtMS4xIjogWwogICAgICAgICJTZW5kbWFpbCBPcGVuIFNvdXJjZSBMaWNlbnNlIHYxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNHSS1CLTEuMCI6IFsKICAgICAgICAiU0dJIEZyZWUgU29mdHdhcmUgTGljZW5zZSBCIHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNHSS1CLTEuMSI6IFsKICAgICAgICAiU0dJIEZyZWUgU29mdHdhcmUgTGljZW5zZSBCIHYxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNHSS1CLTIuMCI6IFsKICAgICAgICAiU0dJIEZyZWUgU29mdHdhcmUgTGljZW5zZSBCIHYyLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNHSS1PcGVuR0wiOiBbCiAgICAgICAgIlNHSSBPcGVuR0wgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU0dNTFVHLVBNIjogWwogICAgICAgICJTR01MVUcgUGFyc2VyIE1hdGVyaWFscyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTR1A0IjogWwogICAgICAgICJTR1A0IFBlcm1pc3Npb24gTm90aWNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTSEwtMC41IjogWwogICAgICAgICJTb2xkZXJwYWQgSGFyZHdhcmUgTGljZW5zZSB2MC41IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTSEwtMC41MSI6IFsKICAgICAgICAiU29sZGVycGFkIEhhcmR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMC41MSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU2ltUEwtMi4wIjogWwogICAgICAgICJTaW1wbGUgUHVibGljIExpY2Vuc2UgMi4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNJU1NMIjogWwogICAgICAgICJTdW4gSW5kdXN0cnkgU3RhbmRhcmRzIFNvdXJjZSBMaWNlbnNlIHYxLjEiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU0lTU0wtMS4yIjogWwogICAgICAgICJTdW4gSW5kdXN0cnkgU3RhbmRhcmRzIFNvdXJjZSBMaWNlbnNlIHYxLjIiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNMIjogWwogICAgICAgICJTTCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTbGVlcHljYXQiOiBbCiAgICAgICAgIlNsZWVweWNhdCBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNNQUlMLUdQTCI6IFsKICAgICAgICAiU01BSUwgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU01MTkoiOiBbCiAgICAgICAgIlN0YW5kYXJkIE1MIG9mIE5ldyBKZXJzZXkgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU01QUEwiOiBbCiAgICAgICAgIlNlY3VyZSBNZXNzYWdpbmcgUHJvdG9jb2wgUHVibGljIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNOSUEiOiBbCiAgICAgICAgIlNOSUEgUHVibGljIExpY2Vuc2UgMS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJzbnByaW50ZiI6IFsKICAgICAgICAic25wcmludGYgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU09GQSI6IFsKICAgICAgICAiU09GQSBTb2Z0d2FyZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJzb2Z0U3VyZmVyIjogWwogICAgICAgICJzb2Z0U3VyZmVyIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNvdW5kZXgiOiBbCiAgICAgICAgIlNvdW5kZXggTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU3BlbmNlci04NiI6IFsKICAgICAgICAiU3BlbmNlciBMaWNlbnNlIDg2IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTcGVuY2VyLTk0IjogWwogICAgICAgICJTcGVuY2VyIExpY2Vuc2UgOTQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNwZW5jZXItOTkiOiBbCiAgICAgICAgIlNwZW5jZXIgTGljZW5zZSA5OSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU1BMLTEuMCI6IFsKICAgICAgICAiU3VuIFB1YmxpYyBMaWNlbnNlIHYxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAic3NoLWtleXNjYW4iOiBbCiAgICAgICAgInNzaC1rZXlzY2FuIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNTSC1PcGVuU1NIIjogWwogICAgICAgICJTU0ggT3BlblNTSCBsaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTU0gtc2hvcnQiOiBbCiAgICAgICAgIlNTSCBzaG9ydCBub3RpY2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNTTGVheS1zdGFuZGFsb25lIjogWwogICAgICAgICJTU0xlYXkgTGljZW5zZSAtIHN0YW5kYWxvbmUiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNTUEwtMS4wIjogWwogICAgICAgICJTZXJ2ZXIgU2lkZSBQdWJsaWMgTGljZW5zZSwgdiAxIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTdGFuZGFyZE1MLU5KIjogWwogICAgICAgICJTdGFuZGFyZCBNTCBvZiBOZXcgSmVyc2V5IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiU3VnYXJDUk0tMS4xLjMiOiBbCiAgICAgICAgIlN1Z2FyQ1JNIFB1YmxpYyBMaWNlbnNlIHYxLjEuMyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU1VMLTEuMCI6IFsKICAgICAgICAiU3VzdGFpbmFibGUgVXNlIExpY2Vuc2UgdjEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU3VuLVBQUCI6IFsKICAgICAgICAiU3VuIFBQUCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTdW4tUFBQLTIwMDAiOiBbCiAgICAgICAgIlN1biBQUFAgTGljZW5zZSAoMjAwMCkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlN1blBybyI6IFsKICAgICAgICAiU3VuUHJvIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNXTCI6IFsKICAgICAgICAiU2NoZW1lIFdpZGdldCBMaWJyYXJ5IChTV0wpIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJzd3J1bGUiOiBbCiAgICAgICAgInN3cnVsZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTeW1saW5rcyI6IFsKICAgICAgICAiU3ltbGlua3MgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVEFQUi1PSEwtMS4wIjogWwogICAgICAgICJUQVBSIE9wZW4gSGFyZHdhcmUgTGljZW5zZSB2MS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJUQ0wiOiBbCiAgICAgICAgIlRDTC9USyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJUQ1Atd3JhcHBlcnMiOiBbCiAgICAgICAgIlRDUCBXcmFwcGVycyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJUZWtIVkMiOiBbCiAgICAgICAgIlRla0hWQyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJUZXJtUmVhZEtleSI6IFsKICAgICAgICAiVGVybVJlYWRLZXkgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVEdQUEwtMS4wIjogWwogICAgICAgICJUcmFuc2l0aXZlIEdyYWNlIFBlcmlvZCBQdWJsaWMgTGljZW5jZSAxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlRoaXJkRXllIjogWwogICAgICAgICJUaGlyZEV5ZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJ0aHJlZXBhcnR0YWJsZSI6IFsKICAgICAgICAidGhyZWVwYXJ0dGFibGUgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVE1hdGUiOiBbCiAgICAgICAgIlRNYXRlIE9wZW4gU291cmNlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlRPUlFVRS0xLjEiOiBbCiAgICAgICAgIlRPUlFVRSB2Mi41KyBTb2Z0d2FyZSBMaWNlbnNlIHYxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlRPU0wiOiBbCiAgICAgICAgIlRydXNzdGVyIE9wZW4gU291cmNlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlRQREwiOiBbCiAgICAgICAgIlRpbWU6OlBhcnNlRGF0ZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJUUEwtMS4wIjogWwogICAgICAgICJUSE9SIFB1YmxpYyBMaWNlbnNlIDEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVHJ1c3RlZFFTTCI6IFsKICAgICAgICAiVHJ1c3RlZFFTTCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJUVFdMIjogWwogICAgICAgICJUZXh0LVRhYnMrV3JhcCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJUVFlQMCI6IFsKICAgICAgICAiVFRZUDAgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVFUtQmVybGluLTEuMCI6IFsKICAgICAgICAiVGVjaG5pc2NoZSBVbml2ZXJzaXRhZXQgQmVybGluIExpY2Vuc2UgMS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJUVS1CZXJsaW4tMi4wIjogWwogICAgICAgICJUZWNobmlzY2hlIFVuaXZlcnNpdGFldCBCZXJsaW4gTGljZW5zZSAyLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlVidW50dS1mb250LTEuMCI6IFsKICAgICAgICAiVWJ1bnR1IEZvbnQgTGljZW5jZSB2MS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJVQ0FSIjogWwogICAgICAgICJVQ0FSIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlVDTC0xLjAiOiBbCiAgICAgICAgIlVwc3RyZWFtIENvbXBhdGliaWxpdHkgTGljZW5zZSB2MS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgInVsZW0iOiBbCiAgICAgICAgInVsZW0gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVU1pY2gtTWVyaXQiOiBbCiAgICAgICAgIk1pY2hpZ2FuL01lcml0IE5ldHdvcmtzIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlVuaWNvZGUtMy4wIjogWwogICAgICAgICJVbmljb2RlIExpY2Vuc2UgdjMiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVW5pY29kZS1ERlMtMjAxNSI6IFsKICAgICAgICAiVW5pY29kZSBMaWNlbnNlIEFncmVlbWVudCAtIERhdGEgRmlsZXMgYW5kIFNvZnR3YXJlICgyMDE1KSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVW5pY29kZS1ERlMtMjAxNiI6IFsKICAgICAgICAiVW5pY29kZSBMaWNlbnNlIEFncmVlbWVudCAtIERhdGEgRmlsZXMgYW5kIFNvZnR3YXJlICgyMDE2KSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJVbmljb2RlLVRPVSI6IFsKICAgICAgICAiVW5pY29kZSBUZXJtcyBvZiBVc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlVuaXhDcnlwdCI6IFsKICAgICAgICAiVW5peENyeXB0IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlVubGljZW5zZSI6IFsKICAgICAgICAiVGhlIFVubGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJVbmxpY2Vuc2UtbGlidGVsbmV0IjogWwogICAgICAgICJVbmxpY2Vuc2UgLSBsaWJ0ZWxuZXQgdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVW5saWNlbnNlLWxpYndoaXJscG9vbCI6IFsKICAgICAgICAiVW5saWNlbnNlIC0gbGlid2hpcmxwb29sIHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlVuUkFSIjogWwogICAgICAgICJVblJBUiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJVUEwtMS4wIjogWwogICAgICAgICJVbml2ZXJzYWwgUGVybWlzc2l2ZSBMaWNlbnNlIHYxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVVJULVJMRSI6IFsKICAgICAgICAiVXRhaCBSYXN0ZXIgVG9vbGtpdCBSdW4gTGVuZ3RoIEVuY29kZWQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVmltIjogWwogICAgICAgICJWaW0gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVml4aWUtQ3JvbiI6IFsKICAgICAgICAiVml4aWUgQ3JvbiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJWT1NUUk9NIjogWwogICAgICAgICJWT1NUUk9NIFB1YmxpYyBMaWNlbnNlIGZvciBPcGVuIFNvdXJjZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVlNMLTEuMCI6IFsKICAgICAgICAiVm92aWRhIFNvZnR3YXJlIExpY2Vuc2UgdjEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJXM0MiOiBbCiAgICAgICAgIlczQyBTb2Z0d2FyZSBOb3RpY2UgYW5kIExpY2Vuc2UgKDIwMDItMTItMzEpIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlczQy0xOTk4MDcyMCI6IFsKICAgICAgICAiVzNDIFNvZnR3YXJlIE5vdGljZSBhbmQgTGljZW5zZSAoMTk5OC0wNy0yMCkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlczQy0yMDE1MDUxMyI6IFsKICAgICAgICAiVzNDIFNvZnR3YXJlIE5vdGljZSBhbmQgRG9jdW1lbnQgTGljZW5zZSAoMjAxNS0wNS0xMykiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAidzNtIjogWwogICAgICAgICJ3M20gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiV2F0Y29tLTEuMCI6IFsKICAgICAgICAiU3liYXNlIE9wZW4gV2F0Y29tIFB1YmxpYyBMaWNlbnNlIDEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJXaWRnZXQtV29ya3Nob3AiOiBbCiAgICAgICAgIldpZGdldCBXb3Jrc2hvcCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJXb3JkTmV0IjogWwogICAgICAgICJXb3JkTmV0IExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiV3N1aXBhIjogWwogICAgICAgICJXc3VpcGEgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiV1RGTk1GUEwiOiBbCiAgICAgICAgIkRvIFdoYXQgVGhlIEYqY2sgWW91IFdhbnQgVG8gQnV0IEl0J3MgTm90IE15IEZhdWx0IFB1YmxpYyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJXVEZQTCI6IFsKICAgICAgICAiRG8gV2hhdCBUaGUgRipjayBZb3UgV2FudCBUbyBQdWJsaWMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAid3dsIjogWwogICAgICAgICJXV0wgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAid3hXaW5kb3dzIjogWwogICAgICAgICJ3eFdpbmRvd3MgTGlicmFyeSBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiWDExIjogWwogICAgICAgICJYMTEgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiWDExLWRpc3RyaWJ1dGUtbW9kaWZpY2F0aW9ucy12YXJpYW50IjogWwogICAgICAgICJYMTEgTGljZW5zZSBEaXN0cmlidXRpb24gTW9kaWZpY2F0aW9uIFZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlgxMS1uby1wZXJtaXQtcGVyc29ucyI6IFsKICAgICAgICAiWDExIG5vIHBlcm1pdCBwZXJzb25zIGNsYXVzZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiWDExLXN3YXBwZWQiOiBbCiAgICAgICAgIlgxMSBzd2FwcGVkIGZpbmFsIHBhcmFncmFwaHMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlhkZWJ1Zy0xLjAzIjogWwogICAgICAgICJYZGVidWcgTGljZW5zZSB2IDEuMDMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlhlcm94IjogWwogICAgICAgICJYZXJveCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJYZmlnIjogWwogICAgICAgICJYZmlnIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlhGcmVlODYtMS4xIjogWwogICAgICAgICJYRnJlZTg2IExpY2Vuc2UgMS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJ4aW5ldGQiOiBbCiAgICAgICAgInhpbmV0ZCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJ4a2V5Ym9hcmQtY29uZmlnLVppbm92aWV2IjogWwogICAgICAgICJ4a2V5Ym9hcmQtY29uZmlnIFppbm92aWV2IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgInhsb2NrIjogWwogICAgICAgICJ4bG9jayBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJYbmV0IjogWwogICAgICAgICJYLk5ldCBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgInhwcCI6IFsKICAgICAgICAiWFBQIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlhTa2F0IjogWwogICAgICAgICJYU2thdCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJ4em9vbSI6IFsKICAgICAgICAieHpvb20gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiWVBMLTEuMCI6IFsKICAgICAgICAiWWFob28hIFB1YmxpYyBMaWNlbnNlIHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIllQTC0xLjEiOiBbCiAgICAgICAgIllhaG9vISBQdWJsaWMgTGljZW5zZSB2MS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJaZWQiOiBbCiAgICAgICAgIlplZCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJaZWVmZiI6IFsKICAgICAgICAiWmVlZmYgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiWmVuZC0yLjAiOiBbCiAgICAgICAgIlplbmQgTGljZW5zZSB2Mi4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJaaW1icmEtMS4zIjogWwogICAgICAgICJaaW1icmEgUHVibGljIExpY2Vuc2UgdjEuMyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiWmltYnJhLTEuNCI6IFsKICAgICAgICAiWmltYnJhIFB1YmxpYyBMaWNlbnNlIHYxLjQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlpsaWIiOiBbCiAgICAgICAgInpsaWIgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJ6bGliLWFja25vd2xlZGdlbWVudCI6IFsKICAgICAgICAiemxpYi9saWJwbmcgTGljZW5zZSB3aXRoIEFja25vd2xlZGdlbWVudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiWlBMLTEuMSI6IFsKICAgICAgICAiWm9wZSBQdWJsaWMgTGljZW5zZSAxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlpQTC0yLjAiOiBbCiAgICAgICAgIlpvcGUgUHVibGljIExpY2Vuc2UgMi4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlpQTC0yLjEiOiBbCiAgICAgICAgIlpvcGUgUHVibGljIExpY2Vuc2UgMi4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdCn08P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxTcGR4OwoKY2xhc3MgU3BkeExpY2Vuc2VzCnsKCnB1YmxpYyBjb25zdCBMSUNFTlNFU19GSUxFID0gJ3NwZHgtbGljZW5zZXMuanNvbic7CgoKcHVibGljIGNvbnN0IEVYQ0VQVElPTlNfRklMRSA9ICdzcGR4LWV4Y2VwdGlvbnMuanNvbic7CgoKCgoKCgoKCgoKCgoKcHJpdmF0ZSAkbGljZW5zZXM7CgoKCgpwcml2YXRlICRsaWNlbnNlc0V4cHJlc3Npb247CgoKCgoKCgoKCgoKCgoKcHJpdmF0ZSAkZXhjZXB0aW9uczsKCgoKCnByaXZhdGUgJGV4Y2VwdGlvbnNFeHByZXNzaW9uOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKewokdGhpcy0+bG9hZExpY2Vuc2VzKCk7CiR0aGlzLT5sb2FkRXhjZXB0aW9ucygpOwp9CgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TGljZW5zZUJ5SWRlbnRpZmllcigkaWRlbnRpZmllcikKewoka2V5ID0gc3RydG9sb3dlcigkaWRlbnRpZmllcik7CgppZiAoIWlzc2V0KCR0aGlzLT5saWNlbnNlc1ska2V5XSkpIHsKcmV0dXJuIG51bGw7Cn0KClskaWRlbnRpZmllciwgJG5hbWUsICRpc09zaUFwcHJvdmVkLCAkaXNEZXByZWNhdGVkTGljZW5zZUlkXSA9ICR0aGlzLT5saWNlbnNlc1ska2V5XTsKCnJldHVybiBbCiRuYW1lLAokaXNPc2lBcHByb3ZlZCwKJ2h0dHBzOi8vc3BkeC5vcmcvbGljZW5zZXMvJyAuICRpZGVudGlmaWVyIC4gJy5odG1sI2xpY2Vuc2VUZXh0JywKJGlzRGVwcmVjYXRlZExpY2Vuc2VJZCwKXTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TGljZW5zZXMoKQp7CnJldHVybiAkdGhpcy0+bGljZW5zZXM7Cn0KCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFeGNlcHRpb25CeUlkZW50aWZpZXIoJGlkZW50aWZpZXIpCnsKJGtleSA9IHN0cnRvbG93ZXIoJGlkZW50aWZpZXIpOwoKaWYgKCFpc3NldCgkdGhpcy0+ZXhjZXB0aW9uc1ska2V5XSkpIHsKcmV0dXJuIG51bGw7Cn0KClskaWRlbnRpZmllciwgJG5hbWVdID0gJHRoaXMtPmV4Y2VwdGlvbnNbJGtleV07CgpyZXR1cm4gWwokbmFtZSwKJ2h0dHBzOi8vc3BkeC5vcmcvbGljZW5zZXMvJyAuICRpZGVudGlmaWVyIC4gJy5odG1sI2xpY2Vuc2VFeGNlcHRpb25UZXh0JywKXTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJZGVudGlmaWVyQnlOYW1lKCRuYW1lKQp7CmZvcmVhY2ggKCR0aGlzLT5saWNlbnNlcyBhcyAkbGljZW5zZURhdGEpIHsKaWYgKCRsaWNlbnNlRGF0YVsxXSA9PT0gJG5hbWUpIHsKcmV0dXJuICRsaWNlbnNlRGF0YVswXTsKfQp9Cgpmb3JlYWNoICgkdGhpcy0+ZXhjZXB0aW9ucyBhcyAkbGljZW5zZURhdGEpIHsKaWYgKCRsaWNlbnNlRGF0YVsxXSA9PT0gJG5hbWUpIHsKcmV0dXJuICRsaWNlbnNlRGF0YVswXTsKfQp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc09zaUFwcHJvdmVkQnlJZGVudGlmaWVyKCRpZGVudGlmaWVyKQp7CnJldHVybiAkdGhpcy0+bGljZW5zZXNbc3RydG9sb3dlcigkaWRlbnRpZmllcildWzJdOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGVwcmVjYXRlZEJ5SWRlbnRpZmllcigkaWRlbnRpZmllcikKewpyZXR1cm4gJHRoaXMtPmxpY2Vuc2VzW3N0cnRvbG93ZXIoJGlkZW50aWZpZXIpXVszXTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZSgkbGljZW5zZSkKewppZiAoaXNfYXJyYXkoJGxpY2Vuc2UpKSB7CiRjb3VudCA9IGNvdW50KCRsaWNlbnNlKTsKaWYgKCRjb3VudCAhPT0gY291bnQoYXJyYXlfZmlsdGVyKCRsaWNlbnNlLCAnaXNfc3RyaW5nJykpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdBcnJheSBvZiBzdHJpbmdzIGV4cGVjdGVkLicpOwp9CiRsaWNlbnNlID0gJGNvdW50ID4gMSA/ICcoJyAuIGltcGxvZGUoJyBPUiAnLCAkbGljZW5zZSkgLiAnKScgOiAoc3RyaW5nKSByZXNldCgkbGljZW5zZSk7Cn0KCmlmICghaXNfc3RyaW5nKCRsaWNlbnNlKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKAonQXJyYXkgb3IgU3RyaW5nIGV4cGVjdGVkLCAlcyBnaXZlbi4nLApnZXR0eXBlKCRsaWNlbnNlKQopKTsKfQoKcmV0dXJuICR0aGlzLT5pc1ZhbGlkTGljZW5zZVN0cmluZygkbGljZW5zZSk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UmVzb3VyY2VzRGlyKCkKewpyZXR1cm4gZGlybmFtZShfX0RJUl9fKSAuICcvcmVzJzsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBsb2FkTGljZW5zZXMoKQp7CmlmIChudWxsICE9PSAkdGhpcy0+bGljZW5zZXMpIHsKcmV0dXJuOwp9CgokanNvbiA9IGZpbGVfZ2V0X2NvbnRlbnRzKHNlbGY6OmdldFJlc291cmNlc0RpcigpIC4gJy8nIC4gc2VsZjo6TElDRU5TRVNfRklMRSk7CmlmIChmYWxzZSA9PT0gJGpzb24pIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdNaXNzaW5nIGxpY2Vuc2UgZmlsZSBpbiAnIC4gc2VsZjo6Z2V0UmVzb3VyY2VzRGlyKCkgLiAnLycgLiBzZWxmOjpMSUNFTlNFU19GSUxFKTsKfQokdGhpcy0+bGljZW5zZXMgPSBbXTsKCmZvcmVhY2ggKGpzb25fZGVjb2RlKCRqc29uLCB0cnVlKSBhcyAkaWRlbnRpZmllciA9PiAkbGljZW5zZSkgewokdGhpcy0+bGljZW5zZXNbc3RydG9sb3dlcigkaWRlbnRpZmllcildID0gWyRpZGVudGlmaWVyLCAkbGljZW5zZVswXSwgJGxpY2Vuc2VbMV0sICRsaWNlbnNlWzJdXTsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGxvYWRFeGNlcHRpb25zKCkKewppZiAobnVsbCAhPT0gJHRoaXMtPmV4Y2VwdGlvbnMpIHsKcmV0dXJuOwp9CgokanNvbiA9IGZpbGVfZ2V0X2NvbnRlbnRzKHNlbGY6OmdldFJlc291cmNlc0RpcigpIC4gJy8nIC4gc2VsZjo6RVhDRVBUSU9OU19GSUxFKTsKaWYgKGZhbHNlID09PSAkanNvbikgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ01pc3NpbmcgZXhjZXB0aW9ucyBmaWxlIGluICcgLiBzZWxmOjpnZXRSZXNvdXJjZXNEaXIoKSAuICcvJyAuIHNlbGY6OkVYQ0VQVElPTlNfRklMRSk7Cn0KJHRoaXMtPmV4Y2VwdGlvbnMgPSBbXTsKCmZvcmVhY2ggKGpzb25fZGVjb2RlKCRqc29uLCB0cnVlKSBhcyAkaWRlbnRpZmllciA9PiAkZXhjZXB0aW9uKSB7CiR0aGlzLT5leGNlcHRpb25zW3N0cnRvbG93ZXIoJGlkZW50aWZpZXIpXSA9IFskaWRlbnRpZmllciwgJGV4Y2VwdGlvblswXV07Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRMaWNlbnNlc0V4cHJlc3Npb24oKQp7CmlmIChudWxsID09PSAkdGhpcy0+bGljZW5zZXNFeHByZXNzaW9uKSB7CiRsaWNlbnNlcyA9IGFycmF5X21hcCgncHJlZ19xdW90ZScsIGFycmF5X2tleXMoJHRoaXMtPmxpY2Vuc2VzKSk7CnJzb3J0KCRsaWNlbnNlcyk7CiRsaWNlbnNlcyA9IGltcGxvZGUoJ3wnLCAkbGljZW5zZXMpOwokdGhpcy0+bGljZW5zZXNFeHByZXNzaW9uID0gJGxpY2Vuc2VzOwp9CgpyZXR1cm4gJHRoaXMtPmxpY2Vuc2VzRXhwcmVzc2lvbjsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRFeGNlcHRpb25zRXhwcmVzc2lvbigpCnsKaWYgKG51bGwgPT09ICR0aGlzLT5leGNlcHRpb25zRXhwcmVzc2lvbikgewokZXhjZXB0aW9ucyA9IGFycmF5X21hcCgncHJlZ19xdW90ZScsIGFycmF5X2tleXMoJHRoaXMtPmV4Y2VwdGlvbnMpKTsKcnNvcnQoJGV4Y2VwdGlvbnMpOwokZXhjZXB0aW9ucyA9IGltcGxvZGUoJ3wnLCAkZXhjZXB0aW9ucyk7CiR0aGlzLT5leGNlcHRpb25zRXhwcmVzc2lvbiA9ICRleGNlcHRpb25zOwp9CgpyZXR1cm4gJHRoaXMtPmV4Y2VwdGlvbnNFeHByZXNzaW9uOwp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpc1ZhbGlkTGljZW5zZVN0cmluZygkbGljZW5zZSkKewppZiAoaXNzZXQoJHRoaXMtPmxpY2Vuc2VzW3N0cnRvbG93ZXIoJGxpY2Vuc2UpXSkpIHsKcmV0dXJuIHRydWU7Cn0KCiRsaWNlbnNlcyA9ICR0aGlzLT5nZXRMaWNlbnNlc0V4cHJlc3Npb24oKTsKJGV4Y2VwdGlvbnMgPSAkdGhpcy0+Z2V0RXhjZXB0aW9uc0V4cHJlc3Npb24oKTsKCiRyZWdleCA9IDw8PFJFR0VYCnsKKD8oREVGSU5FKQogICAgIyBpZHN0cmluZzogMSooIEFMUEhBIC8gRElHSVQgLyAtIC8gLiApCiAgICAoPzxpZHN0cmluZz5bXHBMXHBOLi1dezEsfSkKCiAgICAjIGxpY2Vuc2UtaWQ6IHRha2VuIGZyb20gbGlzdAogICAgKD88bGljZW5zZWlkPnskbGljZW5zZXN9KQoKICAgICMgbGljZW5zZS1leGNlcHRpb24taWQ6IHRha2VuIGZyb20gbGlzdAogICAgKD88bGljZW5zZWV4Y2VwdGlvbmlkPnskZXhjZXB0aW9uc30pCgogICAgIyBsaWNlbnNlLXJlZjogW0RvY3VtZW50UmVmLTEqKGlkc3RyaW5nKTpdTGljZW5zZVJlZi0xKihpZHN0cmluZykKICAgICg/PGxpY2Vuc2VyZWY+KD86RG9jdW1lbnRSZWYtKD8maWRzdHJpbmcpOik/TGljZW5zZVJlZi0oPyZpZHN0cmluZykpCgogICAgIyBzaW1wbGUtZXhwcmVzc3Npb246IGxpY2Vuc2UtaWQgLyBsaWNlbnNlLWlkKyAvIGxpY2Vuc2UtcmVmCiAgICAoPzxzaW1wbGVfZXhwcmVzc2lvbj4oPyZsaWNlbnNlaWQpXCs/IHwgKD8mbGljZW5zZWlkKSB8ICg/JmxpY2Vuc2VyZWYpKQoKICAgICMgY29tcG91bmQtZXhwcmVzc2lvbjogMSooCiAgICAjICAgc2ltcGxlLWV4cHJlc3Npb24gLwogICAgIyAgIHNpbXBsZS1leHByZXNzaW9uIFdJVEggbGljZW5zZS1leGNlcHRpb24taWQgLwogICAgIyAgIGNvbXBvdW5kLWV4cHJlc3Npb24gQU5EIGNvbXBvdW5kLWV4cHJlc3Npb24gLwogICAgIyAgIGNvbXBvdW5kLWV4cHJlc3Npb24gT1IgY29tcG91bmQtZXhwcmVzc2lvbgogICAgIyApIC8gKCBjb21wb3VuZC1leHByZXNzaW9uICkgKQogICAgKD88Y29tcG91bmRfaGVhZD4KICAgICAgICAoPyZzaW1wbGVfZXhwcmVzc2lvbikgKCBccysgV0lUSCBccysgKD8mbGljZW5zZWV4Y2VwdGlvbmlkKSk/CiAgICAgICAgICAgIHwgXCggXHMqICg/JmNvbXBvdW5kX2V4cHJlc3Npb24pIFxzKiBcKQogICAgKQogICAgKD88Y29tcG91bmRfZXhwcmVzc2lvbj4KICAgICAgICAoPyZjb21wb3VuZF9oZWFkKSAoPzogXHMrICg/OkFORHxPUikgXHMrICg/JmNvbXBvdW5kX2V4cHJlc3Npb24pKT8KICAgICkKCiAgICAjIGxpY2Vuc2UtZXhwcmVzc2lvbjogMSoxKHNpbXBsZS1leHByZXNzaW9uIC8gY29tcG91bmQtZXhwcmVzc2lvbikKICAgICg/PGxpY2Vuc2VfZXhwcmVzc2lvbj4oPyZjb21wb3VuZF9leHByZXNzaW9uKSB8ICg/JnNpbXBsZV9leHByZXNzaW9uKSkKKSAjIGVuZCBvZiBkZWZpbmUKCl4oTk9ORSB8IE5PQVNTRVJUSU9OIHwgKD8mbGljZW5zZV9leHByZXNzaW9uKSkkCn14aQpSRUdFWDsKCiRtYXRjaCA9IHByZWdfbWF0Y2goJHJlZ2V4LCAkbGljZW5zZSk7CgppZiAoMCA9PT0gJG1hdGNoKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKGZhbHNlID09PSAkbWF0Y2gpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdSZWdleCBmYWlsZWQgdG8gY29tcGlsZS9ydW4uJyk7Cn0KCnJldHVybiB0cnVlOwp9Cn0KCk1JVCBMaWNlbnNlCgpDb3B5cmlnaHQgKGMpIDIwMTcgQ29tcG9zZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwpmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuCgo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcWGRlYnVnSGFuZGxlcjsKCgoKCgoKY2xhc3MgUGhwQ29uZmlnCnsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdXNlT3JpZ2luYWwoKTogYXJyYXkKewokdGhpcy0+Z2V0RGF0YUFuZFJlc2V0KCk7CnJldHVybiBbXTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdXNlU3RhbmRhcmQoKTogYXJyYXkKewokZGF0YSA9ICR0aGlzLT5nZXREYXRhQW5kUmVzZXQoKTsKaWYgKCRkYXRhICE9PSBudWxsKSB7CnJldHVybiBbJy1uJywgJy1jJywgJGRhdGFbJ3RtcEluaSddXTsKfQoKcmV0dXJuIFtdOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB1c2VQZXJzaXN0ZW50KCk6IGFycmF5CnsKJGRhdGEgPSAkdGhpcy0+Z2V0RGF0YUFuZFJlc2V0KCk7CmlmICgkZGF0YSAhPT0gbnVsbCkgewokdGhpcy0+dXBkYXRlRW52KCdQSFBSQycsICRkYXRhWyd0bXBJbmknXSk7CiR0aGlzLT51cGRhdGVFbnYoJ1BIUF9JTklfU0NBTl9ESVInLCAnJyk7Cn0KCnJldHVybiBbXTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldERhdGFBbmRSZXNldCgpOiA/YXJyYXkKewokZGF0YSA9IFhkZWJ1Z0hhbmRsZXI6OmdldFJlc3RhcnRTZXR0aW5ncygpOwppZiAoJGRhdGEgIT09IG51bGwpIHsKJHRoaXMtPnVwZGF0ZUVudignUEhQUkMnLCAkZGF0YVsncGhwcmMnXSk7CiR0aGlzLT51cGRhdGVFbnYoJ1BIUF9JTklfU0NBTl9ESVInLCAkZGF0YVsnc2NhbkRpciddKTsKfQoKcmV0dXJuICRkYXRhOwp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHVwZGF0ZUVudihzdHJpbmcgJG5hbWUsICR2YWx1ZSk6IHZvaWQKewpQcm9jZXNzOjpzZXRFbnYoJG5hbWUsIGZhbHNlICE9PSAkdmFsdWUgPyAkdmFsdWUgOiBudWxsKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBDb21wb3NlclxYZGVidWdIYW5kbGVyOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCgoKY2xhc3MgUHJvY2Vzcwp7CgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGVzY2FwZShzdHJpbmcgJGFyZywgYm9vbCAkbWV0YSA9IHRydWUsIGJvb2wgJG1vZHVsZSA9IGZhbHNlKTogc3RyaW5nCnsKaWYgKCFkZWZpbmVkKCdQSFBfV0lORE9XU19WRVJTSU9OX0JVSUxEJykpIHsKcmV0dXJuICInIi5zdHJfcmVwbGFjZSgiJyIsICInXFwnJyIsICRhcmcpLiInIjsKfQoKJHF1b3RlID0gc3RycGJyaygkYXJnLCAiIFx0IikgIT09IGZhbHNlIHx8ICRhcmcgPT09ICcnOwoKJGFyZyA9IFByZWc6OnJlcGxhY2UoJy8oXFxcXCopIi8nLCAnJDEkMVxcIicsICRhcmcsIC0xLCAkZHF1b3Rlcyk7CiRkcXVvdGVzID0gKGJvb2wpICRkcXVvdGVzOwoKaWYgKCRtZXRhKSB7CiRtZXRhID0gJGRxdW90ZXMgfHwgUHJlZzo6aXNNYXRjaCgnLyVbXiVdKyUvJywgJGFyZyk7CgppZiAoISRtZXRhKSB7CiRxdW90ZSA9ICRxdW90ZSB8fCBzdHJwYnJrKCRhcmcsICdeJnw8PigpJykgIT09IGZhbHNlOwp9IGVsc2VpZiAoJG1vZHVsZSAmJiAhJGRxdW90ZXMgJiYgJHF1b3RlKSB7CiRtZXRhID0gZmFsc2U7Cn0KfQoKaWYgKCRxdW90ZSkgewokYXJnID0gJyInLihQcmVnOjpyZXBsYWNlKCcvKFxcXFwqKSQvJywgJyQxJDEnLCAkYXJnKSkuJyInOwp9CgppZiAoJG1ldGEpIHsKJGFyZyA9IFByZWc6OnJlcGxhY2UoJy8oWyJeJnw8PigpJV0pLycsICdeJDEnLCAkYXJnKTsKfQoKcmV0dXJuICRhcmc7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBlc2NhcGVTaGVsbENvbW1hbmQoYXJyYXkgJGFyZ3MpOiBzdHJpbmcKewokY29tbWFuZCA9ICcnOwokbW9kdWxlID0gYXJyYXlfc2hpZnQoJGFyZ3MpOwoKaWYgKCRtb2R1bGUgIT09IG51bGwpIHsKJGNvbW1hbmQgPSBzZWxmOjplc2NhcGUoJG1vZHVsZSwgdHJ1ZSwgdHJ1ZSk7Cgpmb3JlYWNoICgkYXJncyBhcyAkYXJnKSB7CiRjb21tYW5kIC49ICcgJy5zZWxmOjplc2NhcGUoJGFyZyk7Cn0KfQoKcmV0dXJuICRjb21tYW5kOwp9CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldEVudihzdHJpbmcgJG5hbWUsID9zdHJpbmcgJHZhbHVlID0gbnVsbCk6IGJvb2wKewokdW5zZXQgPSBudWxsID09PSAkdmFsdWU7CgppZiAoIXB1dGVudigkdW5zZXQgPyAkbmFtZSA6ICRuYW1lLic9Jy4kdmFsdWUpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCR1bnNldCkgewp1bnNldCgkX1NFUlZFUlskbmFtZV0pOwp9IGVsc2UgewokX1NFUlZFUlskbmFtZV0gPSAkdmFsdWU7Cn0KCgppZiAoZmFsc2UgIT09IHN0cmlwb3MoKHN0cmluZykgaW5pX2dldCgndmFyaWFibGVzX29yZGVyJyksICdFJykpIHsKaWYgKCR1bnNldCkgewp1bnNldCgkX0VOVlskbmFtZV0pOwp9IGVsc2UgewokX0VOVlskbmFtZV0gPSAkdmFsdWU7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KfQo8P3BocAoKCgoKCgoKCgoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgQ29tcG9zZXJcWGRlYnVnSGFuZGxlcjsKCnVzZSBQc3JcTG9nXExvZ2dlckludGVyZmFjZTsKdXNlIFBzclxMb2dcTG9nTGV2ZWw7CgoKCgoKY2xhc3MgU3RhdHVzCnsKY29uc3QgRU5WX1JFU1RBUlQgPSAnWERFQlVHX0hBTkRMRVJfUkVTVEFSVCc7CmNvbnN0IENIRUNLID0gJ0NoZWNrJzsKY29uc3QgRVJST1IgPSAnRXJyb3InOwpjb25zdCBJTkZPID0gJ0luZm8nOwpjb25zdCBOT1JFU1RBUlQgPSAnTm9SZXN0YXJ0JzsKY29uc3QgUkVTVEFSVCA9ICdSZXN0YXJ0JzsKY29uc3QgUkVTVEFSVElORyA9ICdSZXN0YXJ0aW5nJzsKY29uc3QgUkVTVEFSVEVEID0gJ1Jlc3RhcnRlZCc7CgoKcHJpdmF0ZSAkZGVidWc7CgoKcHJpdmF0ZSAkZW52QWxsb3dYZGVidWc7CgoKcHJpdmF0ZSAkbG9hZGVkOwoKCnByaXZhdGUgJGxvZ2dlcjsKCgpwcml2YXRlICRtb2RlT2ZmOwoKCnByaXZhdGUgJHRpbWU7CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkZW52QWxsb3dYZGVidWcsIGJvb2wgJGRlYnVnKQp7CiRzdGFydCA9IGdldGVudihzZWxmOjpFTlZfUkVTVEFSVCk7ClByb2Nlc3M6OnNldEVudihzZWxmOjpFTlZfUkVTVEFSVCk7CiR0aGlzLT50aW1lID0gaXNfbnVtZXJpYygkc3RhcnQpID8gcm91bmQoKG1pY3JvdGltZSh0cnVlKSAtICRzdGFydCkgKiAxMDAwKSA6IDA7CgokdGhpcy0+ZW52QWxsb3dYZGVidWcgPSAkZW52QWxsb3dYZGVidWc7CiR0aGlzLT5kZWJ1ZyA9ICRkZWJ1ZyAmJiBkZWZpbmVkKCdTVERFUlInKTsKJHRoaXMtPm1vZGVPZmYgPSBmYWxzZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0TG9nZ2VyKExvZ2dlckludGVyZmFjZSAkbG9nZ2VyKTogdm9pZAp7CiR0aGlzLT5sb2dnZXIgPSAkbG9nZ2VyOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXBvcnQoc3RyaW5nICRvcCwgP3N0cmluZyAkZGF0YSk6IHZvaWQKewppZiAoJHRoaXMtPmxvZ2dlciAhPT0gbnVsbCB8fCAkdGhpcy0+ZGVidWcpIHsKJHBhcmFtID0gKHN0cmluZykgJGRhdGE7Cgpzd2l0Y2goJG9wKSB7CmNhc2Ugc2VsZjo6Q0hFQ0s6CiR0aGlzLT5yZXBvcnRDaGVjaygkcGFyYW0pOwpicmVhazsKY2FzZSBzZWxmOjpFUlJPUjoKJHRoaXMtPnJlcG9ydEVycm9yKCRwYXJhbSk7CmJyZWFrOwpjYXNlIHNlbGY6OklORk86CiR0aGlzLT5yZXBvcnRJbmZvKCRwYXJhbSk7CmJyZWFrOwpjYXNlIHNlbGY6Ok5PUkVTVEFSVDoKJHRoaXMtPnJlcG9ydE5vUmVzdGFydCgpOwpicmVhazsKY2FzZSBzZWxmOjpSRVNUQVJUOgokdGhpcy0+cmVwb3J0UmVzdGFydCgpOwpicmVhazsKY2FzZSBzZWxmOjpSRVNUQVJURUQ6CiR0aGlzLT5yZXBvcnRSZXN0YXJ0ZWQoKTsKYnJlYWs7CmNhc2Ugc2VsZjo6UkVTVEFSVElORzoKJHRoaXMtPnJlcG9ydFJlc3RhcnRpbmcoJHBhcmFtKTsKYnJlYWs7CmRlZmF1bHQ6CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdVbmtub3duIG9wIGhhbmRsZXI6ICcuJG9wKTsKfQp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gb3V0cHV0KHN0cmluZyAkdGV4dCwgP3N0cmluZyAkbGV2ZWwgPSBudWxsKTogdm9pZAp7CmlmICgkdGhpcy0+bG9nZ2VyICE9PSBudWxsKSB7CiR0aGlzLT5sb2dnZXItPmxvZygkbGV2ZWwgIT09IG51bGwgPyAkbGV2ZWw6IExvZ0xldmVsOjpERUJVRywgJHRleHQpOwp9CgppZiAoJHRoaXMtPmRlYnVnKSB7CmZ3cml0ZShTVERFUlIsIHNwcmludGYoJ3hkZWJ1Zy1oYW5kbGVyWyVkXSAlcycsIGdldG15cGlkKCksICR0ZXh0LlBIUF9FT0wpKTsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlcG9ydENoZWNrKHN0cmluZyAkbG9hZGVkKTogdm9pZAp7Cmxpc3QoJHZlcnNpb24sICRtb2RlKSA9IGV4cGxvZGUoJ3wnLCAkbG9hZGVkKTsKCmlmICgkdmVyc2lvbiAhPT0gJycpIHsKJHRoaXMtPmxvYWRlZCA9ICcoJy4kdmVyc2lvbi4nKScuKCRtb2RlICE9PSAnJyA/ICcgeGRlYnVnLm1vZGU9Jy4kbW9kZSA6ICcnKTsKfQokdGhpcy0+bW9kZU9mZiA9ICRtb2RlID09PSAnb2ZmJzsKJHRoaXMtPm91dHB1dCgnQ2hlY2tpbmcgJy4kdGhpcy0+ZW52QWxsb3dYZGVidWcpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlcG9ydEVycm9yKHN0cmluZyAkZXJyb3IpOiB2b2lkCnsKJHRoaXMtPm91dHB1dChzcHJpbnRmKCdObyByZXN0YXJ0ICglcyknLCAkZXJyb3IpLCBMb2dMZXZlbDo6V0FSTklORyk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVwb3J0SW5mbyhzdHJpbmcgJGluZm8pOiB2b2lkCnsKJHRoaXMtPm91dHB1dCgkaW5mbyk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVwb3J0Tm9SZXN0YXJ0KCk6IHZvaWQKewokdGhpcy0+b3V0cHV0KCR0aGlzLT5nZXRMb2FkZWRNZXNzYWdlKCkpOwoKaWYgKCR0aGlzLT5sb2FkZWQgIT09IG51bGwpIHsKJHRleHQgPSBzcHJpbnRmKCdObyByZXN0YXJ0ICglcyknLCAkdGhpcy0+Z2V0RW52QWxsb3coKSk7CmlmICghKChib29sKSBnZXRlbnYoJHRoaXMtPmVudkFsbG93WGRlYnVnKSkpIHsKJHRleHQgLj0gJyBBbGxvd2VkIGJ5ICcuKCR0aGlzLT5tb2RlT2ZmID8gJ3hkZWJ1Zy5tb2RlJyA6ICdhcHBsaWNhdGlvbicpOwp9CiR0aGlzLT5vdXRwdXQoJHRleHQpOwp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVwb3J0UmVzdGFydCgpOiB2b2lkCnsKJHRoaXMtPm91dHB1dCgkdGhpcy0+Z2V0TG9hZGVkTWVzc2FnZSgpKTsKUHJvY2Vzczo6c2V0RW52KHNlbGY6OkVOVl9SRVNUQVJULCAoc3RyaW5nKSBtaWNyb3RpbWUodHJ1ZSkpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlcG9ydFJlc3RhcnRlZCgpOiB2b2lkCnsKJGxvYWRlZCA9ICR0aGlzLT5nZXRMb2FkZWRNZXNzYWdlKCk7CiR0ZXh0ID0gc3ByaW50ZignUmVzdGFydGVkICglZCBtcykuICVzJywgJHRoaXMtPnRpbWUsICRsb2FkZWQpOwokbGV2ZWwgPSAkdGhpcy0+bG9hZGVkICE9PSBudWxsID8gTG9nTGV2ZWw6OldBUk5JTkcgOiBudWxsOwokdGhpcy0+b3V0cHV0KCR0ZXh0LCAkbGV2ZWwpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlcG9ydFJlc3RhcnRpbmcoc3RyaW5nICRjb21tYW5kKTogdm9pZAp7CiR0ZXh0ID0gc3ByaW50ZignUHJvY2VzcyByZXN0YXJ0aW5nICglcyknLCAkdGhpcy0+Z2V0RW52QWxsb3coKSk7CiR0aGlzLT5vdXRwdXQoJHRleHQpOwokdGV4dCA9ICdSdW5uaW5nOiAnLiRjb21tYW5kOwokdGhpcy0+b3V0cHV0KCR0ZXh0KTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRFbnZBbGxvdygpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmVudkFsbG93WGRlYnVnLic9Jy5nZXRlbnYoJHRoaXMtPmVudkFsbG93WGRlYnVnKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRMb2FkZWRNZXNzYWdlKCk6IHN0cmluZwp7CiRsb2FkZWQgPSAkdGhpcy0+bG9hZGVkICE9PSBudWxsID8gc3ByaW50ZignbG9hZGVkICVzJywgJHRoaXMtPmxvYWRlZCkgOiAnbm90IGxvYWRlZCc7CnJldHVybiAnVGhlIFhkZWJ1ZyBleHRlbnNpb24gaXMgJy4kbG9hZGVkOwp9Cn0KPD9waHAKCgoKCgoKCgoKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIENvbXBvc2VyXFhkZWJ1Z0hhbmRsZXI7Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgUHNyXExvZ1xMb2dnZXJJbnRlcmZhY2U7CgoKCgoKCmNsYXNzIFhkZWJ1Z0hhbmRsZXIKewpjb25zdCBTVUZGSVhfQUxMT1cgPSAnX0FMTE9XX1hERUJVRyc7CmNvbnN0IFNVRkZJWF9JTklTID0gJ19PUklHSU5BTF9JTklTJzsKY29uc3QgUkVTVEFSVF9JRCA9ICdpbnRlcm5hbCc7CmNvbnN0IFJFU1RBUlRfU0VUVElOR1MgPSAnWERFQlVHX0hBTkRMRVJfU0VUVElOR1MnOwpjb25zdCBERUJVRyA9ICdYREVCVUdfSEFORExFUl9ERUJVRyc7CgoKcHJvdGVjdGVkICR0bXBJbmk7CgoKcHJpdmF0ZSBzdGF0aWMgJGluUmVzdGFydDsKCgpwcml2YXRlIHN0YXRpYyAkbmFtZTsKCgpwcml2YXRlIHN0YXRpYyAkc2tpcHBlZDsKCgpwcml2YXRlIHN0YXRpYyAkeGRlYnVnQWN0aXZlOwoKCnByaXZhdGUgc3RhdGljICR4ZGVidWdNb2RlOwoKCnByaXZhdGUgc3RhdGljICR4ZGVidWdWZXJzaW9uOwoKCnByaXZhdGUgJGNsaTsKCgpwcml2YXRlICRkZWJ1ZzsKCgpwcml2YXRlICRlbnZBbGxvd1hkZWJ1ZzsKCgpwcml2YXRlICRlbnZPcmlnaW5hbEluaXM7CgoKcHJpdmF0ZSAkcGVyc2lzdGVudDsKCgpwcml2YXRlICRzY3JpcHQ7CgoKcHJpdmF0ZSAkc3RhdHVzV3JpdGVyOwoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJGVudlByZWZpeCkKewppZiAoJGVudlByZWZpeCA9PT0gJycpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdJbnZhbGlkIGNvbnN0cnVjdG9yIHBhcmFtZXRlcicpOwp9CgpzZWxmOjokbmFtZSA9IHN0cnRvdXBwZXIoJGVudlByZWZpeCk7CiR0aGlzLT5lbnZBbGxvd1hkZWJ1ZyA9IHNlbGY6OiRuYW1lLnNlbGY6OlNVRkZJWF9BTExPVzsKJHRoaXMtPmVudk9yaWdpbmFsSW5pcyA9IHNlbGY6OiRuYW1lLnNlbGY6OlNVRkZJWF9JTklTOwoKc2VsZjo6c2V0WGRlYnVnRGV0YWlscygpOwpzZWxmOjokaW5SZXN0YXJ0ID0gZmFsc2U7CgppZiAoJHRoaXMtPmNsaSA9IFBIUF9TQVBJID09PSAnY2xpJykgewokdGhpcy0+ZGVidWcgPSAoc3RyaW5nKSBnZXRlbnYoc2VsZjo6REVCVUcpOwp9CgokdGhpcy0+c3RhdHVzV3JpdGVyID0gbmV3IFN0YXR1cygkdGhpcy0+ZW52QWxsb3dYZGVidWcsIChib29sKSAkdGhpcy0+ZGVidWcpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0TG9nZ2VyKExvZ2dlckludGVyZmFjZSAkbG9nZ2VyKTogc2VsZgp7CiR0aGlzLT5zdGF0dXNXcml0ZXItPnNldExvZ2dlcigkbG9nZ2VyKTsKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0TWFpblNjcmlwdChzdHJpbmcgJHNjcmlwdCk6IHNlbGYKewokdGhpcy0+c2NyaXB0ID0gJHNjcmlwdDsKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UGVyc2lzdGVudCgpOiBzZWxmCnsKJHRoaXMtPnBlcnNpc3RlbnQgPSB0cnVlOwpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soKTogdm9pZAp7CiR0aGlzLT5ub3RpZnkoU3RhdHVzOjpDSEVDSywgc2VsZjo6JHhkZWJ1Z1ZlcnNpb24uJ3wnLnNlbGY6OiR4ZGVidWdNb2RlKTsKJGVudkFyZ3MgPSBleHBsb2RlKCd8JywgKHN0cmluZykgZ2V0ZW52KCR0aGlzLT5lbnZBbGxvd1hkZWJ1ZykpOwoKaWYgKCEoKGJvb2wpICRlbnZBcmdzWzBdKSAmJiAkdGhpcy0+cmVxdWlyZXNSZXN0YXJ0KHNlbGY6OiR4ZGVidWdBY3RpdmUpKSB7CgokdGhpcy0+bm90aWZ5KFN0YXR1czo6UkVTVEFSVCk7CiRjb21tYW5kID0gJHRoaXMtPnByZXBhcmVSZXN0YXJ0KCk7CgppZiAoJGNvbW1hbmQgIT09IG51bGwpIHsKJHRoaXMtPnJlc3RhcnQoJGNvbW1hbmQpOwp9CnJldHVybjsKfQoKaWYgKHNlbGY6OlJFU1RBUlRfSUQgPT09ICRlbnZBcmdzWzBdICYmIGNvdW50KCRlbnZBcmdzKSA9PT0gNSkgewoKJHRoaXMtPm5vdGlmeShTdGF0dXM6OlJFU1RBUlRFRCk7CgpQcm9jZXNzOjpzZXRFbnYoJHRoaXMtPmVudkFsbG93WGRlYnVnKTsKc2VsZjo6JGluUmVzdGFydCA9IHRydWU7CgppZiAoc2VsZjo6JHhkZWJ1Z1ZlcnNpb24gPT09IG51bGwpIHsKCnNlbGY6OiRza2lwcGVkID0gJGVudkFyZ3NbMV07Cn0KCiR0aGlzLT50cnlFbmFibGVTaWduYWxzKCk7CgoKJHRoaXMtPnNldEVudlJlc3RhcnRTZXR0aW5ncygkZW52QXJncyk7CnJldHVybjsKfQoKJHRoaXMtPm5vdGlmeShTdGF0dXM6Ok5PUkVTVEFSVCk7CiRzZXR0aW5ncyA9IHNlbGY6OmdldFJlc3RhcnRTZXR0aW5ncygpOwoKaWYgKCRzZXR0aW5ncyAhPT0gbnVsbCkgewoKJHRoaXMtPnN5bmNTZXR0aW5ncygkc2V0dGluZ3MpOwp9Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRBbGxJbmlGaWxlcygpOiBhcnJheQp7CmlmIChzZWxmOjokbmFtZSAhPT0gbnVsbCkgewokZW52ID0gZ2V0ZW52KHNlbGY6OiRuYW1lLnNlbGY6OlNVRkZJWF9JTklTKTsKCmlmIChmYWxzZSAhPT0gJGVudikgewpyZXR1cm4gZXhwbG9kZShQQVRIX1NFUEFSQVRPUiwgJGVudik7Cn0KfQoKJHBhdGhzID0gWyhzdHJpbmcpIHBocF9pbmlfbG9hZGVkX2ZpbGUoKV07CiRzY2FubmVkID0gcGhwX2luaV9zY2FubmVkX2ZpbGVzKCk7CgppZiAoJHNjYW5uZWQgIT09IGZhbHNlKSB7CiRwYXRocyA9IGFycmF5X21lcmdlKCRwYXRocywgYXJyYXlfbWFwKCd0cmltJywgZXhwbG9kZSgnLCcsICRzY2FubmVkKSkpOwp9CgpyZXR1cm4gJHBhdGhzOwp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UmVzdGFydFNldHRpbmdzKCk6ID9hcnJheQp7CiRlbnZBcmdzID0gZXhwbG9kZSgnfCcsIChzdHJpbmcpIGdldGVudihzZWxmOjpSRVNUQVJUX1NFVFRJTkdTKSk7CgppZiAoY291bnQoJGVudkFyZ3MpICE9PSA2Cnx8ICghc2VsZjo6JGluUmVzdGFydCAmJiBwaHBfaW5pX2xvYWRlZF9maWxlKCkgIT09ICRlbnZBcmdzWzBdKSkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuIFsKJ3RtcEluaScgPT4gJGVudkFyZ3NbMF0sCidzY2FubmVkSW5pcycgPT4gKGJvb2wpICRlbnZBcmdzWzFdLAonc2NhbkRpcicgPT4gJyonID09PSAkZW52QXJnc1syXSA/IGZhbHNlIDogJGVudkFyZ3NbMl0sCidwaHByYycgPT4gJyonID09PSAkZW52QXJnc1szXSA/IGZhbHNlIDogJGVudkFyZ3NbM10sCidpbmlzJyA9PiBleHBsb2RlKFBBVEhfU0VQQVJBVE9SLCAkZW52QXJnc1s0XSksCidza2lwcGVkJyA9PiAkZW52QXJnc1s1XSwKXTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRTa2lwcGVkVmVyc2lvbigpOiBzdHJpbmcKewpyZXR1cm4gKHN0cmluZykgc2VsZjo6JHNraXBwZWQ7Cn0KCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNYZGVidWdBY3RpdmUoKTogYm9vbAp7CnNlbGY6OnNldFhkZWJ1Z0RldGFpbHMoKTsKcmV0dXJuIHNlbGY6OiR4ZGVidWdBY3RpdmU7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHJlcXVpcmVzUmVzdGFydChib29sICRkZWZhdWx0KTogYm9vbAp7CnJldHVybiAkZGVmYXVsdDsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcmVzdGFydChhcnJheSAkY29tbWFuZCk6IHZvaWQKewokdGhpcy0+ZG9SZXN0YXJ0KCRjb21tYW5kKTsKfQoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkb1Jlc3RhcnQoYXJyYXkgJGNvbW1hbmQpOiB2b2lkCnsKaWYgKFBIUF9WRVJTSU9OX0lEID49IDcwNDAwKSB7CiRjbWQgPSAkY29tbWFuZDsKJGRpc3BsYXlDbWQgPSBzcHJpbnRmKCdbJXNdJywgaW1wbG9kZSgnLCAnLCAkY21kKSk7Cn0gZWxzZSB7CiRjbWQgPSBQcm9jZXNzOjplc2NhcGVTaGVsbENvbW1hbmQoJGNvbW1hbmQpOwppZiAoZGVmaW5lZCgnUEhQX1dJTkRPV1NfVkVSU0lPTl9CVUlMRCcpKSB7CgokY21kID0gJyInLiRjbWQuJyInOwp9CiRkaXNwbGF5Q21kID0gJGNtZDsKfQoKJHRoaXMtPnRyeUVuYWJsZVNpZ25hbHMoKTsKJHRoaXMtPm5vdGlmeShTdGF0dXM6OlJFU1RBUlRJTkcsICRkaXNwbGF5Q21kKTsKCiRwcm9jZXNzID0gcHJvY19vcGVuKCRjbWQsIFtdLCAkcGlwZXMpOwppZiAoaXNfcmVzb3VyY2UoJHByb2Nlc3MpKSB7CiRleGl0Q29kZSA9IHByb2NfY2xvc2UoJHByb2Nlc3MpOwp9CgppZiAoIWlzc2V0KCRleGl0Q29kZSkpIHsKCiR0aGlzLT5ub3RpZnkoU3RhdHVzOjpFUlJPUiwgJ1VuYWJsZSB0byByZXN0YXJ0IHByb2Nlc3MnKTsKJGV4aXRDb2RlID0gLTE7Cn0gZWxzZSB7CiR0aGlzLT5ub3RpZnkoU3RhdHVzOjpJTkZPLCAnUmVzdGFydGVkIHByb2Nlc3MgZXhpdGVkICcuJGV4aXRDb2RlKTsKfQoKaWYgKCR0aGlzLT5kZWJ1ZyA9PT0gJzInKSB7CiR0aGlzLT5ub3RpZnkoU3RhdHVzOjpJTkZPLCAnVGVtcCBpbmkgc2F2ZWQ6ICcuJHRoaXMtPnRtcEluaSk7Cn0gZWxzZSB7CkB1bmxpbmsoKHN0cmluZykgJHRoaXMtPnRtcEluaSk7Cn0KCmV4aXQoJGV4aXRDb2RlKTsKfQoKCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcHJlcGFyZVJlc3RhcnQoKTogP2FycmF5CnsKaWYgKCEkdGhpcy0+Y2xpKSB7CiR0aGlzLT5ub3RpZnkoU3RhdHVzOjpFUlJPUiwgJ1Vuc3VwcG9ydGVkIFNBUEk6ICcuUEhQX1NBUEkpOwpyZXR1cm4gbnVsbDsKfQoKaWYgKCgkYXJndiA9ICR0aGlzLT5jaGVja1NlcnZlckFyZ3YoKSkgPT09IG51bGwpIHsKJHRoaXMtPm5vdGlmeShTdGF0dXM6OkVSUk9SLCAnJF9TRVJWRVJbYXJndl0gaXMgbm90IGFzIGV4cGVjdGVkJyk7CnJldHVybiBudWxsOwp9CgppZiAoISR0aGlzLT5jaGVja0NvbmZpZ3VyYXRpb24oJGluZm8pKSB7CiR0aGlzLT5ub3RpZnkoU3RhdHVzOjpFUlJPUiwgJGluZm8pOwpyZXR1cm4gbnVsbDsKfQoKJG1haW5TY3JpcHQgPSAoc3RyaW5nKSAkdGhpcy0+c2NyaXB0OwppZiAoISR0aGlzLT5jaGVja01haW5TY3JpcHQoJG1haW5TY3JpcHQsICRhcmd2KSkgewokdGhpcy0+bm90aWZ5KFN0YXR1czo6RVJST1IsICdVbmFibGUgdG8gYWNjZXNzIG1haW4gc2NyaXB0OiAnLiRtYWluU2NyaXB0KTsKcmV0dXJuIG51bGw7Cn0KCiR0bXBEaXIgPSBzeXNfZ2V0X3RlbXBfZGlyKCk7CiRpbmlFcnJvciA9ICdVbmFibGUgdG8gY3JlYXRlIHRlbXAgaW5pIGZpbGUgYXQ6ICcuJHRtcERpcjsKCmlmICgoJHRtcGZpbGUgPSBAdGVtcG5hbSgkdG1wRGlyLCAnJykpID09PSBmYWxzZSkgewokdGhpcy0+bm90aWZ5KFN0YXR1czo6RVJST1IsICRpbmlFcnJvcik7CnJldHVybiBudWxsOwp9CgokZXJyb3IgPSBudWxsOwokaW5pRmlsZXMgPSBzZWxmOjpnZXRBbGxJbmlGaWxlcygpOwokc2Nhbm5lZEluaXMgPSBjb3VudCgkaW5pRmlsZXMpID4gMTsKCmlmICghJHRoaXMtPndyaXRlVG1wSW5pKCR0bXBmaWxlLCAkaW5pRmlsZXMsICRlcnJvcikpIHsKJHRoaXMtPm5vdGlmeShTdGF0dXM6OkVSUk9SLCAkZXJyb3IgPz8gJGluaUVycm9yKTsKQHVubGluaygkdG1wZmlsZSk7CnJldHVybiBudWxsOwp9CgppZiAoISR0aGlzLT5zZXRFbnZpcm9ubWVudCgkc2Nhbm5lZEluaXMsICRpbmlGaWxlcywgJHRtcGZpbGUpKSB7CiR0aGlzLT5ub3RpZnkoU3RhdHVzOjpFUlJPUiwgJ1VuYWJsZSB0byBzZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzJyk7CkB1bmxpbmsoJHRtcGZpbGUpOwpyZXR1cm4gbnVsbDsKfQoKJHRoaXMtPnRtcEluaSA9ICR0bXBmaWxlOwoKcmV0dXJuICR0aGlzLT5nZXRDb21tYW5kKCRhcmd2LCAkdG1wZmlsZSwgJG1haW5TY3JpcHQpOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gd3JpdGVUbXBJbmkoc3RyaW5nICR0bXBGaWxlLCBhcnJheSAkaW5pRmlsZXMsID9zdHJpbmcgJiRlcnJvcik6IGJvb2wKewoKaWYgKCRpbmlGaWxlc1swXSA9PT0gJycpIHsKYXJyYXlfc2hpZnQoJGluaUZpbGVzKTsKfQoKJGNvbnRlbnQgPSAnJzsKJHNlY3Rpb25SZWdleCA9ICcvXlxzKlxbKD86UEFUSHxIT1NUKVxzKj0vbWknOwokeGRlYnVnUmVnZXggPSAnL15ccyooemVuZF9leHRlbnNpb25ccyo9Lip4ZGVidWcuKikkL21pJzsKCmZvcmVhY2ggKCRpbmlGaWxlcyBhcyAkZmlsZSkgewoKaWYgKCgkZGF0YSA9IEBmaWxlX2dldF9jb250ZW50cygkZmlsZSkpID09PSBmYWxzZSkgewokZXJyb3IgPSAnVW5hYmxlIHRvIHJlYWQgaW5pOiAnLiRmaWxlOwpyZXR1cm4gZmFsc2U7Cn0KCmlmIChQcmVnOjppc01hdGNoV2l0aE9mZnNldHMoJHNlY3Rpb25SZWdleCwgJGRhdGEsICRtYXRjaGVzKSkgewokZGF0YSA9IHN1YnN0cigkZGF0YSwgMCwgJG1hdGNoZXNbMF1bMV0pOwp9CiRjb250ZW50IC49IFByZWc6OnJlcGxhY2UoJHhkZWJ1Z1JlZ2V4LCAnOyQxJywgJGRhdGEpLlBIUF9FT0w7Cn0KCgokY29uZmlnID0gcGFyc2VfaW5pX3N0cmluZygkY29udGVudCk7CiRsb2FkZWQgPSBpbmlfZ2V0X2FsbChudWxsLCBmYWxzZSk7CgppZiAoZmFsc2UgPT09ICRjb25maWcgfHwgZmFsc2UgPT09ICRsb2FkZWQpIHsKJGVycm9yID0gJ1VuYWJsZSB0byBwYXJzZSBpbmkgZGF0YSc7CnJldHVybiBmYWxzZTsKfQoKJGNvbnRlbnQgLj0gJHRoaXMtPm1lcmdlTG9hZGVkQ29uZmlnKCRsb2FkZWQsICRjb25maWcpOwoKCiRjb250ZW50IC49ICdvcGNhY2hlLmVuYWJsZV9jbGk9MCcuUEhQX0VPTDsKCnJldHVybiAoYm9vbCkgQGZpbGVfcHV0X2NvbnRlbnRzKCR0bXBGaWxlLCAkY29udGVudCk7Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0Q29tbWFuZChhcnJheSAkYXJndiwgc3RyaW5nICR0bXBJbmksIHN0cmluZyAkbWFpblNjcmlwdCk6IGFycmF5CnsKJHBocCA9IFtQSFBfQklOQVJZXTsKJGFyZ3MgPSBhcnJheV9zbGljZSgkYXJndiwgMSk7CgppZiAoISR0aGlzLT5wZXJzaXN0ZW50KSB7CgphcnJheV9wdXNoKCRwaHAsICctbicsICctYycsICR0bXBJbmkpOwp9CgpyZXR1cm4gYXJyYXlfbWVyZ2UoJHBocCwgWyRtYWluU2NyaXB0XSwgJGFyZ3MpOwp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzZXRFbnZpcm9ubWVudChib29sICRzY2FubmVkSW5pcywgYXJyYXkgJGluaUZpbGVzLCBzdHJpbmcgJHRtcEluaSk6IGJvb2wKewokc2NhbkRpciA9IGdldGVudignUEhQX0lOSV9TQ0FOX0RJUicpOwokcGhwcmMgPSBnZXRlbnYoJ1BIUFJDJyk7CgoKaWYgKCFwdXRlbnYoJHRoaXMtPmVudk9yaWdpbmFsSW5pcy4nPScuaW1wbG9kZShQQVRIX1NFUEFSQVRPUiwgJGluaUZpbGVzKSkpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoJHRoaXMtPnBlcnNpc3RlbnQpIHsKCmlmICghcHV0ZW52KCdQSFBfSU5JX1NDQU5fRElSPScpIHx8ICFwdXRlbnYoJ1BIUFJDPScuJHRtcEluaSkpIHsKcmV0dXJuIGZhbHNlOwp9Cn0KCgokZW52QXJncyA9IFsKc2VsZjo6UkVTVEFSVF9JRCwKc2VsZjo6JHhkZWJ1Z1ZlcnNpb24sCihpbnQpICRzY2FubmVkSW5pcywKZmFsc2UgPT09ICRzY2FuRGlyID8gJyonIDogJHNjYW5EaXIsCmZhbHNlID09PSAkcGhwcmMgPyAnKicgOiAkcGhwcmMsCl07CgpyZXR1cm4gcHV0ZW52KCR0aGlzLT5lbnZBbGxvd1hkZWJ1Zy4nPScuaW1wbG9kZSgnfCcsICRlbnZBcmdzKSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gbm90aWZ5KHN0cmluZyAkb3AsID9zdHJpbmcgJGRhdGEgPSBudWxsKTogdm9pZAp7CiR0aGlzLT5zdGF0dXNXcml0ZXItPnJlcG9ydCgkb3AsICRkYXRhKTsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gbWVyZ2VMb2FkZWRDb25maWcoYXJyYXkgJGxvYWRlZENvbmZpZywgYXJyYXkgJGluaUNvbmZpZyk6IHN0cmluZwp7CiRjb250ZW50ID0gJyc7Cgpmb3JlYWNoICgkbG9hZGVkQ29uZmlnIGFzICRuYW1lID0+ICR2YWx1ZSkgewoKaWYgKCFpc19zdHJpbmcoJHZhbHVlKQp8fCBzdHJwb3MoJG5hbWUsICd4ZGVidWcnKSA9PT0gMAp8fCAkbmFtZSA9PT0gJ2FwYy5tbWFwX2ZpbGVfbWFzaycpIHsKY29udGludWU7Cn0KCmlmICghaXNzZXQoJGluaUNvbmZpZ1skbmFtZV0pIHx8ICRpbmlDb25maWdbJG5hbWVdICE9PSAkdmFsdWUpIHsKCiRjb250ZW50IC49ICRuYW1lLic9IicuYWRkY3NsYXNoZXMoJHZhbHVlLCAnXFwiJykuJyInLlBIUF9FT0w7Cn0KfQoKcmV0dXJuICRjb250ZW50Owp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gY2hlY2tNYWluU2NyaXB0KHN0cmluZyAmJG1haW5TY3JpcHQsIGFycmF5ICRhcmd2KTogYm9vbAp7CmlmICgkbWFpblNjcmlwdCAhPT0gJycpIHsKCnJldHVybiBmaWxlX2V4aXN0cygkbWFpblNjcmlwdCkgfHwgJy0tJyA9PT0gJG1haW5TY3JpcHQ7Cn0KCmlmIChmaWxlX2V4aXN0cygkbWFpblNjcmlwdCA9ICRhcmd2WzBdKSkgewpyZXR1cm4gdHJ1ZTsKfQoKCiR0cmFjZSA9IGRlYnVnX2JhY2t0cmFjZShERUJVR19CQUNLVFJBQ0VfSUdOT1JFX0FSR1MpOwokbWFpbiA9IGVuZCgkdHJhY2UpOwoKaWYgKCRtYWluICE9PSBmYWxzZSAmJiBpc3NldCgkbWFpblsnZmlsZSddKSkgewpyZXR1cm4gZmlsZV9leGlzdHMoJG1haW5TY3JpcHQgPSAkbWFpblsnZmlsZSddKTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gc2V0RW52UmVzdGFydFNldHRpbmdzKGFycmF5ICRlbnZBcmdzKTogdm9pZAp7CiRzZXR0aW5ncyA9IFsKcGhwX2luaV9sb2FkZWRfZmlsZSgpLAokZW52QXJnc1syXSwKJGVudkFyZ3NbM10sCiRlbnZBcmdzWzRdLApnZXRlbnYoJHRoaXMtPmVudk9yaWdpbmFsSW5pcyksCnNlbGY6OiRza2lwcGVkLApdOwoKUHJvY2Vzczo6c2V0RW52KHNlbGY6OlJFU1RBUlRfU0VUVElOR1MsIGltcGxvZGUoJ3wnLCAkc2V0dGluZ3MpKTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHN5bmNTZXR0aW5ncyhhcnJheSAkc2V0dGluZ3MpOiB2b2lkCnsKaWYgKGZhbHNlID09PSBnZXRlbnYoJHRoaXMtPmVudk9yaWdpbmFsSW5pcykpIHsKClByb2Nlc3M6OnNldEVudigkdGhpcy0+ZW52T3JpZ2luYWxJbmlzLCBpbXBsb2RlKFBBVEhfU0VQQVJBVE9SLCAkc2V0dGluZ3NbJ2luaXMnXSkpOwp9CgpzZWxmOjokc2tpcHBlZCA9ICRzZXR0aW5nc1snc2tpcHBlZCddOwokdGhpcy0+bm90aWZ5KFN0YXR1czo6SU5GTywgJ1Byb2Nlc3MgY2FsbGVkIHdpdGggZXhpc3RpbmcgcmVzdGFydCBzZXR0aW5ncycpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNoZWNrQ29uZmlndXJhdGlvbig/c3RyaW5nICYkaW5mbyk6IGJvb2wKewppZiAoIWZ1bmN0aW9uX2V4aXN0cygncHJvY19vcGVuJykpIHsKJGluZm8gPSAncHJvY19vcGVuIGZ1bmN0aW9uIGlzIGRpc2FibGVkJzsKcmV0dXJuIGZhbHNlOwp9CgppZiAoIWZpbGVfZXhpc3RzKFBIUF9CSU5BUlkpKSB7CiRpbmZvID0gJ1BIUF9CSU5BUlkgaXMgbm90IGF2YWlsYWJsZSc7CnJldHVybiBmYWxzZTsKfQoKaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ3VvcHonKSAmJiAhKChib29sKSBpbmlfZ2V0KCd1b3B6LmRpc2FibGUnKSkpIHsKCmlmIChmdW5jdGlvbl9leGlzdHMoJ3VvcHpfYWxsb3dfZXhpdCcpKSB7CkB1b3B6X2FsbG93X2V4aXQodHJ1ZSk7Cn0gZWxzZSB7CiRpbmZvID0gJ3VvcHogZXh0ZW5zaW9uIGlzIG5vdCBjb21wYXRpYmxlJzsKcmV0dXJuIGZhbHNlOwp9Cn0KCgppZiAoZGVmaW5lZCgnUEhQX1dJTkRPV1NfVkVSU0lPTl9CVUlMRCcpICYmIFBIUF9WRVJTSU9OX0lEIDwgNzA0MDApIHsKJHdvcmtpbmdEaXIgPSBnZXRjd2QoKTsKCmlmICgkd29ya2luZ0RpciA9PT0gZmFsc2UpIHsKJGluZm8gPSAndW5hYmxlIHRvIGRldGVybWluZSB3b3JraW5nIGRpcmVjdG9yeSc7CnJldHVybiBmYWxzZTsKfQoKaWYgKDAgPT09IHN0cnBvcygkd29ya2luZ0RpciwgJ1xcXFwnKSkgewokaW5mbyA9ICdjbWQuZXhlIGRvZXMgbm90IHN1cHBvcnQgVU5DIHBhdGhzOiAnLiR3b3JraW5nRGlyOwpyZXR1cm4gZmFsc2U7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB0cnlFbmFibGVTaWduYWxzKCk6IHZvaWQKewppZiAoZnVuY3Rpb25fZXhpc3RzKCdwY250bF9hc3luY19zaWduYWxzJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdwY250bF9zaWduYWwnKSkgewpwY250bF9hc3luY19zaWduYWxzKHRydWUpOwokbWVzc2FnZSA9ICdBc3luYyBzaWduYWxzIGVuYWJsZWQnOwoKaWYgKCFzZWxmOjokaW5SZXN0YXJ0KSB7CgpwY250bF9zaWduYWwoU0lHSU5ULCBTSUdfSUdOKTsKfSBlbHNlaWYgKGlzX2ludChwY250bF9zaWduYWxfZ2V0X2hhbmRsZXIoU0lHSU5UKSkpIHsKCnBjbnRsX3NpZ25hbChTSUdJTlQsIFNJR19ERkwpOwp9Cn0KCmlmICghc2VsZjo6JGluUmVzdGFydCAmJiBmdW5jdGlvbl9leGlzdHMoJ3NhcGlfd2luZG93c19zZXRfY3RybF9oYW5kbGVyJykpIHsKCgoKc2FwaV93aW5kb3dzX3NldF9jdHJsX2hhbmRsZXIoZnVuY3Rpb24gKCRldnQpIHt9KTsKfQp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gY2hlY2tTZXJ2ZXJBcmd2KCk6ID9hcnJheQp7CiRyZXN1bHQgPSBbXTsKCmlmIChpc3NldCgkX1NFUlZFUlsnYXJndiddKSAmJiBpc19hcnJheSgkX1NFUlZFUlsnYXJndiddKSkgewpmb3JlYWNoICgkX1NFUlZFUlsnYXJndiddIGFzICR2YWx1ZSkgewppZiAoIWlzX3N0cmluZygkdmFsdWUpKSB7CnJldHVybiBudWxsOwp9CgokcmVzdWx0W10gPSAkdmFsdWU7Cn0KfQoKcmV0dXJuIGNvdW50KCRyZXN1bHQpID4gMCA/ICRyZXN1bHQgOiBudWxsOwp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBzZXRYZGVidWdEZXRhaWxzKCk6IHZvaWQKewppZiAoc2VsZjo6JHhkZWJ1Z0FjdGl2ZSAhPT0gbnVsbCkgewpyZXR1cm47Cn0KCnNlbGY6OiR4ZGVidWdBY3RpdmUgPSBmYWxzZTsKaWYgKCFleHRlbnNpb25fbG9hZGVkKCd4ZGVidWcnKSkgewpyZXR1cm47Cn0KCiR2ZXJzaW9uID0gcGhwdmVyc2lvbigneGRlYnVnJyk7CnNlbGY6OiR4ZGVidWdWZXJzaW9uID0gJHZlcnNpb24gIT09IGZhbHNlID8gJHZlcnNpb24gOiAndW5rbm93bic7CgppZiAodmVyc2lvbl9jb21wYXJlKHNlbGY6OiR4ZGVidWdWZXJzaW9uLCAnMy4xJywgJz49JykpIHsKJG1vZGVzID0geGRlYnVnX2luZm8oJ21vZGUnKTsKc2VsZjo6JHhkZWJ1Z01vZGUgPSBjb3VudCgkbW9kZXMpID09PSAwID8gJ29mZicgOiBpbXBsb2RlKCcsJywgJG1vZGVzKTsKc2VsZjo6JHhkZWJ1Z0FjdGl2ZSA9IHNlbGY6OiR4ZGVidWdNb2RlICE9PSAnb2ZmJzsKcmV0dXJuOwp9CgoKJGluaU1vZGUgPSBpbmlfZ2V0KCd4ZGVidWcubW9kZScpOwppZiAoJGluaU1vZGUgPT09IGZhbHNlKSB7CnNlbGY6OiR4ZGVidWdBY3RpdmUgPSB0cnVlOwpyZXR1cm47Cn0KCgokZW52TW9kZSA9IChzdHJpbmcpIGdldGVudignWERFQlVHX01PREUnKTsKaWYgKCRlbnZNb2RlICE9PSAnJykgewpzZWxmOjokeGRlYnVnTW9kZSA9ICRlbnZNb2RlOwp9IGVsc2UgewpzZWxmOjokeGRlYnVnTW9kZSA9ICRpbmlNb2RlICE9PSAnJyA/ICRpbmlNb2RlIDogJ29mZic7Cn0KCgppZiAoUHJlZzo6aXNNYXRjaCgnL14sKyQvJywgc3RyX3JlcGxhY2UoJyAnLCAnJywgc2VsZjo6JHhkZWJ1Z01vZGUpKSkgewpzZWxmOjokeGRlYnVnTW9kZSA9ICdvZmYnOwp9CgpzZWxmOjokeGRlYnVnQWN0aXZlID0gc2VsZjo6JHhkZWJ1Z01vZGUgIT09ICdvZmYnOwp9Cn0KCk1JVCBMaWNlbnNlCgpDb3B5cmlnaHQgKGMpIDIwMTYKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwpmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuCgo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYTsKCnVzZSBKc29uU2NoZW1hXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CgpjbGFzcyBDb25zdHJhaW50RXJyb3IgZXh0ZW5kcyBFbnVtCnsKcHVibGljIGNvbnN0IEFERElUSU9OQUxfSVRFTVMgPSAnYWRkaXRpb25hbEl0ZW1zJzsKcHVibGljIGNvbnN0IEFERElUSU9OQUxfUFJPUEVSVElFUyA9ICdhZGRpdGlvbmFsUHJvcCc7CnB1YmxpYyBjb25zdCBBTExfT0YgPSAnYWxsT2YnOwpwdWJsaWMgY29uc3QgQU5ZX09GID0gJ2FueU9mJzsKcHVibGljIGNvbnN0IERFUEVOREVOQ0lFUyA9ICdkZXBlbmRlbmNpZXMnOwpwdWJsaWMgY29uc3QgRElTQUxMT1cgPSAnZGlzYWxsb3cnOwpwdWJsaWMgY29uc3QgRElWSVNJQkxFX0JZID0gJ2RpdmlzaWJsZUJ5JzsKcHVibGljIGNvbnN0IEVOVU0gPSAnZW51bSc7CnB1YmxpYyBjb25zdCBDT05TVEFOVCA9ICdjb25zdCc7CnB1YmxpYyBjb25zdCBDT05UQUlOUyA9ICdjb250YWlucyc7CnB1YmxpYyBjb25zdCBFWENMVVNJVkVfTUlOSU1VTSA9ICdleGNsdXNpdmVNaW5pbXVtJzsKcHVibGljIGNvbnN0IEVYQ0xVU0lWRV9NQVhJTVVNID0gJ2V4Y2x1c2l2ZU1heGltdW0nOwpwdWJsaWMgY29uc3QgRkFMU0UgPSAnZmFsc2UnOwpwdWJsaWMgY29uc3QgRk9STUFUX0NPTE9SID0gJ2NvbG9yRm9ybWF0JzsKcHVibGljIGNvbnN0IEZPUk1BVF9EQVRFID0gJ2RhdGVGb3JtYXQnOwpwdWJsaWMgY29uc3QgRk9STUFUX0RBVEVfVElNRSA9ICdkYXRlVGltZUZvcm1hdCc7CnB1YmxpYyBjb25zdCBGT1JNQVRfREFURV9VVEMgPSAnZGF0ZVV0Y0Zvcm1hdCc7CnB1YmxpYyBjb25zdCBGT1JNQVRfRU1BSUwgPSAnZW1haWxGb3JtYXQnOwpwdWJsaWMgY29uc3QgRk9STUFUX0hPU1ROQU1FID0gJ3N0eWxlSG9zdE5hbWUnOwpwdWJsaWMgY29uc3QgRk9STUFUX0lQID0gJ2lwRm9ybWF0JzsKcHVibGljIGNvbnN0IEZPUk1BVF9KU09OX1BPSU5URVIgPSAnanNvblBvaW50ZXJGb3JtYXQnOwpwdWJsaWMgY29uc3QgRk9STUFUX1BIT05FID0gJ3Bob25lRm9ybWF0JzsKcHVibGljIGNvbnN0IEZPUk1BVF9SRUdFWD0gJ3JlZ2V4Rm9ybWF0JzsKcHVibGljIGNvbnN0IEZPUk1BVF9TVFlMRSA9ICdzdHlsZUZvcm1hdCc7CnB1YmxpYyBjb25zdCBGT1JNQVRfVElNRSA9ICd0aW1lRm9ybWF0JzsKcHVibGljIGNvbnN0IEZPUk1BVF9VUklfVEVNUExBVEUgPSAndXJpVGVtcGxhdGVGb3JtYXQnOwpwdWJsaWMgY29uc3QgRk9STUFUX1VSTCA9ICd1cmxGb3JtYXQnOwpwdWJsaWMgY29uc3QgRk9STUFUX1VSTF9SRUYgPSAndXJsUmVmRm9ybWF0JzsKcHVibGljIGNvbnN0IElOVkFMSURfU0NIRU1BID0gJ2ludmFsaWRTY2hlbWEnOwpwdWJsaWMgY29uc3QgTEVOR1RIX01BWCA9ICdtYXhMZW5ndGgnOwpwdWJsaWMgY29uc3QgTEVOR1RIX01JTiA9ICdtaW5MZW5ndGgnOwpwdWJsaWMgY29uc3QgTUFYSU1VTSA9ICdtYXhpbXVtJzsKcHVibGljIGNvbnN0IE1JTl9JVEVNUyA9ICdtaW5JdGVtcyc7CnB1YmxpYyBjb25zdCBNSU5JTVVNID0gJ21pbmltdW0nOwpwdWJsaWMgY29uc3QgTUlTU0lOR19FUlJPUiA9ICdtaXNzaW5nRXJyb3InOwpwdWJsaWMgY29uc3QgTUlTU0lOR19NQVhJTVVNID0gJ21pc3NpbmdNYXhpbXVtJzsKcHVibGljIGNvbnN0IE1JU1NJTkdfTUlOSU1VTSA9ICdtaXNzaW5nTWluaW11bSc7CnB1YmxpYyBjb25zdCBNQVhfSVRFTVMgPSAnbWF4SXRlbXMnOwpwdWJsaWMgY29uc3QgTVVMVElQTEVfT0YgPSAnbXVsdGlwbGVPZic7CnB1YmxpYyBjb25zdCBOT1QgPSAnbm90JzsKcHVibGljIGNvbnN0IE9ORV9PRiA9ICdvbmVPZic7CnB1YmxpYyBjb25zdCBSRVFVSVJFRCA9ICdyZXF1aXJlZCc7CnB1YmxpYyBjb25zdCBSRVFVSVJFUyA9ICdyZXF1aXJlcyc7CnB1YmxpYyBjb25zdCBQQVRURVJOID0gJ3BhdHRlcm4nOwpwdWJsaWMgY29uc3QgUFJFR0VYX0lOVkFMSUQgPSAncHJlZ3JleCc7CnB1YmxpYyBjb25zdCBQUk9QRVJUSUVTX01JTiA9ICdtaW5Qcm9wZXJ0aWVzJzsKcHVibGljIGNvbnN0IFBST1BFUlRJRVNfTUFYID0gJ21heFByb3BlcnRpZXMnOwpwdWJsaWMgY29uc3QgUFJPUEVSVFlfTkFNRVMgPSAncHJvcGVydHlOYW1lcyc7CnB1YmxpYyBjb25zdCBUWVBFID0gJ3R5cGUnOwpwdWJsaWMgY29uc3QgVU5JUVVFX0lURU1TID0gJ3VuaXF1ZUl0ZW1zJzsKcHVibGljIGNvbnN0IENPTlRFTlRfTUVESUFfVFlQRSA9ICdjb250ZW50TWVkaWFUeXBlJzsKcHVibGljIGNvbnN0IENPTlRFTlRfRU5DT0RJTkcgPSAnY29udGVudEVuY29kaW5nJzsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRNZXNzYWdlKCkKewokbmFtZSA9ICR0aGlzLT5nZXRWYWx1ZSgpOwpzdGF0aWMgJG1lc3NhZ2VzID0gWwpzZWxmOjpBRERJVElPTkFMX0lURU1TID0+ICdUaGUgaXRlbSAlc1slc10gaXMgbm90IGRlZmluZWQgYW5kIHRoZSBkZWZpbml0aW9uIGRvZXMgbm90IGFsbG93IGFkZGl0aW9uYWwgaXRlbXMnLApzZWxmOjpBRERJVElPTkFMX1BST1BFUlRJRVMgPT4gJ1RoZSBwcm9wZXJ0eSAlcyBpcyBub3QgZGVmaW5lZCBhbmQgdGhlIGRlZmluaXRpb24gZG9lcyBub3QgYWxsb3cgYWRkaXRpb25hbCBwcm9wZXJ0aWVzJywKc2VsZjo6QUxMX09GID0+ICdGYWlsZWQgdG8gbWF0Y2ggYWxsIHNjaGVtYXMnLApzZWxmOjpBTllfT0YgPT4gJ0ZhaWxlZCB0byBtYXRjaCBhdCBsZWFzdCBvbmUgc2NoZW1hJywKc2VsZjo6REVQRU5ERU5DSUVTID0+ICclcyBkZXBlbmRzIG9uICVzLCB3aGljaCBpcyBtaXNzaW5nJywKc2VsZjo6RElTQUxMT1cgPT4gJ0Rpc2FsbG93ZWQgdmFsdWUgd2FzIG1hdGNoZWQnLApzZWxmOjpESVZJU0lCTEVfQlkgPT4gJ0lzIG5vdCBkaXZpc2libGUgYnkgJWQnLApzZWxmOjpFTlVNID0+ICdEb2VzIG5vdCBoYXZlIGEgdmFsdWUgaW4gdGhlIGVudW1lcmF0aW9uICVzJywKc2VsZjo6Q09OU1RBTlQgPT4gJ0RvZXMgbm90IGhhdmUgYSB2YWx1ZSBlcXVhbCB0byAlcycsCnNlbGY6OkNPTlRBSU5TID0+ICdEb2VzIG5vdCBoYXZlIGEgdmFsdWUgdmFsaWQgdG8gY29udGFpbnMgc2NoZW1hJywKc2VsZjo6RVhDTFVTSVZFX01JTklNVU0gPT4gJ011c3QgaGF2ZSBhIG1pbmltdW0gdmFsdWUgZ3JlYXRlciB0aGFuICVkJywKc2VsZjo6RVhDTFVTSVZFX01BWElNVU0gPT4gJ011c3QgaGF2ZSBhIG1heGltdW0gdmFsdWUgbGVzcyB0aGFuICVkJywKc2VsZjo6RkFMU0UgPT4gJ0Jvb2xlYW4gc2NoZW1hIGZhbHNlJywKc2VsZjo6Rk9STUFUX0NPTE9SID0+ICdJbnZhbGlkIGNvbG9yJywKc2VsZjo6Rk9STUFUX0RBVEUgPT4gJ0ludmFsaWQgZGF0ZSAlcywgZXhwZWN0ZWQgZm9ybWF0IFlZWVktTU0tREQnLApzZWxmOjpGT1JNQVRfREFURV9USU1FID0+ICdJbnZhbGlkIGRhdGUtdGltZSAlcywgZXhwZWN0ZWQgZm9ybWF0IFlZWVktTU0tRERUaGg6bW06c3NaIG9yIFlZWVktTU0tRERUaGg6bW06c3MraGg6bW0nLApzZWxmOjpGT1JNQVRfREFURV9VVEMgPT4gJ0ludmFsaWQgdGltZSAlcywgZXhwZWN0ZWQgaW50ZWdlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgRXBvY2gnLApzZWxmOjpGT1JNQVRfRU1BSUwgPT4gJ0ludmFsaWQgZW1haWwnLApzZWxmOjpGT1JNQVRfSE9TVE5BTUUgPT4gJ0ludmFsaWQgaG9zdG5hbWUnLApzZWxmOjpGT1JNQVRfSVAgPT4gJ0ludmFsaWQgSVAgYWRkcmVzcycsCnNlbGY6OkZPUk1BVF9KU09OX1BPSU5URVIgPT4gJ0ludmFsaWQgSlNPTiBwb2ludGVyJywKc2VsZjo6Rk9STUFUX1BIT05FID0+ICdJbnZhbGlkIHBob25lIG51bWJlcicsCnNlbGY6OkZPUk1BVF9SRUdFWD0+ICdJbnZhbGlkIHJlZ2V4IGZvcm1hdCAlcycsCnNlbGY6OkZPUk1BVF9TVFlMRSA9PiAnSW52YWxpZCBzdHlsZScsCnNlbGY6OkZPUk1BVF9USU1FID0+ICdJbnZhbGlkIHRpbWUgJXMsIGV4cGVjdGVkIGZvcm1hdCBoaDptbTpzcycsCnNlbGY6OkZPUk1BVF9VUklfVEVNUExBVEUgPT4gJ0ludmFsaWQgVVJJIHRlbXBsYXRlIGZvcm1hdCcsCnNlbGY6OkZPUk1BVF9VUkwgPT4gJ0ludmFsaWQgVVJMIGZvcm1hdCcsCnNlbGY6OkZPUk1BVF9VUkxfUkVGID0+ICdJbnZhbGlkIFVSTCByZWZlcmVuY2UgZm9ybWF0JywKc2VsZjo6TEVOR1RIX01BWCA9PiAnTXVzdCBiZSBhdCBtb3N0ICVkIGNoYXJhY3RlcnMgbG9uZycsCnNlbGY6OklOVkFMSURfU0NIRU1BID0+ICdTY2hlbWEgaXMgbm90IHZhbGlkJywKc2VsZjo6TEVOR1RIX01JTiA9PiAnTXVzdCBiZSBhdCBsZWFzdCAlZCBjaGFyYWN0ZXJzIGxvbmcnLApzZWxmOjpNQVhfSVRFTVMgPT4gJ1RoZXJlIG11c3QgYmUgYSBtYXhpbXVtIG9mICVkIGl0ZW1zIGluIHRoZSBhcnJheSwgJWQgZm91bmQnLApzZWxmOjpNQVhJTVVNID0+ICdNdXN0IGhhdmUgYSBtYXhpbXVtIHZhbHVlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlZCcsCnNlbGY6Ok1JTl9JVEVNUyA9PiAnVGhlcmUgbXVzdCBiZSBhIG1pbmltdW0gb2YgJWQgaXRlbXMgaW4gdGhlIGFycmF5LCAlZCBmb3VuZCcsCnNlbGY6Ok1JTklNVU0gPT4gJ011c3QgaGF2ZSBhIG1pbmltdW0gdmFsdWUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVkJywKc2VsZjo6TUlTU0lOR19NQVhJTVVNID0+ICdVc2Ugb2YgZXhjbHVzaXZlTWF4aW11bSByZXF1aXJlcyBwcmVzZW5jZSBvZiBtYXhpbXVtJywKc2VsZjo6TUlTU0lOR19NSU5JTVVNID0+ICdVc2Ugb2YgZXhjbHVzaXZlTWluaW11bSByZXF1aXJlcyBwcmVzZW5jZSBvZiBtaW5pbXVtJywKCnNlbGY6Ok1VTFRJUExFX09GID0+ICdNdXN0IGJlIGEgbXVsdGlwbGUgb2YgJXMnLApzZWxmOjpOT1QgPT4gJ01hdGNoZWQgYSBzY2hlbWEgd2hpY2ggaXQgc2hvdWxkIG5vdCcsCnNlbGY6Ok9ORV9PRiA9PiAnRmFpbGVkIHRvIG1hdGNoIGV4YWN0bHkgb25lIHNjaGVtYScsCnNlbGY6OlJFUVVJUkVEID0+ICdUaGUgcHJvcGVydHkgJXMgaXMgcmVxdWlyZWQnLApzZWxmOjpSRVFVSVJFUyA9PiAnVGhlIHByZXNlbmNlIG9mIHRoZSBwcm9wZXJ0eSAlcyByZXF1aXJlcyB0aGF0ICVzIGFsc28gYmUgcHJlc2VudCcsCnNlbGY6OlBBVFRFUk4gPT4gJ0RvZXMgbm90IG1hdGNoIHRoZSByZWdleCBwYXR0ZXJuICVzJywKc2VsZjo6UFJFR0VYX0lOVkFMSUQgPT4gJ1RoZSBwYXR0ZXJuICVzIGlzIGludmFsaWQnLApzZWxmOjpQUk9QRVJUSUVTX01JTiA9PiAnTXVzdCBjb250YWluIGEgbWluaW11bSBvZiAlZCBwcm9wZXJ0aWVzJywKc2VsZjo6UFJPUEVSVElFU19NQVggPT4gJ011c3QgY29udGFpbiBubyBtb3JlIHRoYW4gJWQgcHJvcGVydGllcycsCnNlbGY6OlBST1BFUlRZX05BTUVTID0+ICdQcm9wZXJ0eSBuYW1lICVzIGlzIGludmFsaWQnLApzZWxmOjpUWVBFID0+ICclcyB2YWx1ZSBmb3VuZCwgYnV0ICVzIGlzIHJlcXVpcmVkJywKc2VsZjo6VU5JUVVFX0lURU1TID0+ICdUaGVyZSBhcmUgbm8gZHVwbGljYXRlcyBhbGxvd2VkIGluIHRoZSBhcnJheScsCnNlbGY6OkNPTlRFTlRfTUVESUFfVFlQRSA9PiAnVmFsdWUgaXMgbm90IHZhbGlkIHdpdGggY29udGVudCBtZWRpYSB0eXBlJywKc2VsZjo6Q09OVEVOVF9FTkNPRElORyA9PiAnVmFsdWUgaXMgbm90IHZhbGlkIHdpdGggY29udGVudCBlbmNvZGluZycsCl07CgppZiAoIWlzc2V0KCRtZXNzYWdlc1skbmFtZV0pKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ01pc3NpbmcgZXJyb3IgbWVzc2FnZSBmb3IgJyAuICRuYW1lKTsKfQoKcmV0dXJuICRtZXNzYWdlc1skbmFtZV07Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50czsKCnVzZSBjb25zdCBKU09OX0VSUk9SX05PTkU7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cVmFsaWRhdGlvbkV4Y2VwdGlvbjsKdXNlIEpzb25TY2hlbWFcVmFsaWRhdG9yOwoKCgoKCmNsYXNzIEJhc2VDb25zdHJhaW50CnsKCgoKcHJvdGVjdGVkICRlcnJvcnMgPSBbXTsKCgoKCgpwcm90ZWN0ZWQgJGVycm9yTWFzayA9IFZhbGlkYXRvcjo6RVJST1JfTk9ORTsKCgoKCnByb3RlY3RlZCAkZmFjdG9yeTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmZhY3RvcnkgPSAkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gYWRkRXJyb3IoQ29uc3RyYWludEVycm9yICRjb25zdHJhaW50LCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCBhcnJheSAkbW9yZSA9IFtdKTogdm9pZAp7CiRtZXNzYWdlID0gJGNvbnN0cmFpbnQtPmdldE1lc3NhZ2UoKTsKJG5hbWUgPSAkY29uc3RyYWludC0+Z2V0VmFsdWUoKTsKJGVycm9yID0gWwoncHJvcGVydHknID0+ICR0aGlzLT5jb252ZXJ0SnNvblBvaW50ZXJJbnRvUHJvcGVydHlQYXRoKCRwYXRoID86IG5ldyBKc29uUG9pbnRlcignJykpLAoncG9pbnRlcicgPT4gbHRyaW0oKHN0cmluZykgKCRwYXRoID86IG5ldyBKc29uUG9pbnRlcignJykpLCAnIycpLAonbWVzc2FnZScgPT4gdWNmaXJzdCh2c3ByaW50ZigkbWVzc2FnZSwgYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewppZiAoaXNfc2NhbGFyKCR2YWwpKSB7CnJldHVybiBpc19ib29sKCR2YWwpID8gdmFyX2V4cG9ydCgkdmFsLCB0cnVlKSA6ICR2YWw7Cn0KCnJldHVybiBqc29uX2VuY29kZSgkdmFsKTsKfSwgYXJyYXlfdmFsdWVzKCRtb3JlKSkpKSwKJ2NvbnN0cmFpbnQnID0+IFsKJ25hbWUnID0+ICRuYW1lLAoncGFyYW1zJyA9PiAkbW9yZQpdLAonY29udGV4dCcgPT4gJHRoaXMtPmZhY3RvcnktPmdldEVycm9yQ29udGV4dCgpLApdOwoKaWYgKCR0aGlzLT5mYWN0b3J5LT5nZXRDb25maWcoQ29uc3RyYWludDo6Q0hFQ0tfTU9ERV9FWENFUFRJT05TKSkgewp0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihzcHJpbnRmKCdFcnJvciB2YWxpZGF0aW5nICVzOiAlcycsICRlcnJvclsncG9pbnRlciddLCAkZXJyb3JbJ21lc3NhZ2UnXSkpOwp9CgokdGhpcy0+ZXJyb3JzW10gPSAkZXJyb3I7CiR0aGlzLT5lcnJvck1hc2sgfD0gJGVycm9yWydjb250ZXh0J107Cn0KCnB1YmxpYyBmdW5jdGlvbiBhZGRFcnJvcnMoYXJyYXkgJGVycm9ycyk6IHZvaWQKewppZiAoJGVycm9ycykgewokdGhpcy0+ZXJyb3JzID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmVycm9ycywgJGVycm9ycyk7CiRlcnJvck1hc2sgPSAmJHRoaXMtPmVycm9yTWFzazsKYXJyYXlfd2FsaygkZXJyb3JzLCBzdGF0aWMgZnVuY3Rpb24gKCRlcnJvcikgdXNlICgmJGVycm9yTWFzaykgewppZiAoaXNzZXQoJGVycm9yWydjb250ZXh0J10pKSB7CiRlcnJvck1hc2sgfD0gJGVycm9yWydjb250ZXh0J107Cn0KfSk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEVycm9ycyhpbnQgJGVycm9yQ29udGV4dCA9IFZhbGlkYXRvcjo6RVJST1JfQUxMKTogYXJyYXkKewppZiAoJGVycm9yQ29udGV4dCA9PT0gVmFsaWRhdG9yOjpFUlJPUl9BTEwpIHsKcmV0dXJuICR0aGlzLT5lcnJvcnM7Cn0KCnJldHVybiBhcnJheV9maWx0ZXIoJHRoaXMtPmVycm9ycywgc3RhdGljIGZ1bmN0aW9uICgkZXJyb3IpIHVzZSAoJGVycm9yQ29udGV4dCkgewpyZXR1cm4gKGJvb2wpICgkZXJyb3JDb250ZXh0ICYgJGVycm9yWydjb250ZXh0J10pOwp9KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG51bUVycm9ycyhpbnQgJGVycm9yQ29udGV4dCA9IFZhbGlkYXRvcjo6RVJST1JfQUxMKTogaW50CnsKaWYgKCRlcnJvckNvbnRleHQgPT09IFZhbGlkYXRvcjo6RVJST1JfQUxMKSB7CnJldHVybiBjb3VudCgkdGhpcy0+ZXJyb3JzKTsKfQoKcmV0dXJuIGNvdW50KCR0aGlzLT5nZXRFcnJvcnMoJGVycm9yQ29udGV4dCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNWYWxpZCgpOiBib29sCnsKcmV0dXJuICEkdGhpcy0+Z2V0RXJyb3JzKCk7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzZXQoKTogdm9pZAp7CiR0aGlzLT5lcnJvcnMgPSBbXTsKJHRoaXMtPmVycm9yTWFzayA9IFZhbGlkYXRvcjo6RVJST1JfTk9ORTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXJyb3JNYXNrKCk6IGludAp7CnJldHVybiAkdGhpcy0+ZXJyb3JNYXNrOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFycmF5VG9PYmplY3RSZWN1cnNpdmUoYXJyYXkgJGFycmF5KTogb2JqZWN0CnsKJGpzb24gPSBqc29uX2VuY29kZSgkYXJyYXkpOwppZiAoanNvbl9sYXN0X2Vycm9yKCkgIT09IEpTT05fRVJST1JfTk9ORSkgewokbWVzc2FnZSA9ICdVbmFibGUgdG8gZW5jb2RlIHNjaGVtYSBhcnJheSBhcyBKU09OJzsKaWYgKGZ1bmN0aW9uX2V4aXN0cygnanNvbl9sYXN0X2Vycm9yX21zZycpKSB7CiRtZXNzYWdlIC49ICc6ICcgLiBqc29uX2xhc3RfZXJyb3JfbXNnKCk7Cn0KdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigkbWVzc2FnZSk7Cn0KCnJldHVybiAob2JqZWN0KSBqc29uX2RlY29kZSgkanNvbiwgZmFsc2UpOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGpzb25QYXR0ZXJuVG9QaHBSZWdleChzdHJpbmcgJHBhdHRlcm4pOiBzdHJpbmcKewpyZXR1cm4gJ34nIC4gc3RyX3JlcGxhY2UoJ34nLCAnXFx+JywgJHBhdHRlcm4pIC4gJ351JzsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbnZlcnRKc29uUG9pbnRlckludG9Qcm9wZXJ0eVBhdGgoSnNvblBvaW50ZXIgJHBvaW50ZXIpOiBzdHJpbmcKewokcmVzdWx0ID0gYXJyYXlfbWFwKApzdGF0aWMgZnVuY3Rpb24gKCRwYXRoKSB7CnJldHVybiBzcHJpbnRmKGlzX251bWVyaWMoJHBhdGgpID8gJ1slZF0nIDogJy4lcycsICRwYXRoKTsKfSwKJHBvaW50ZXItPmdldFByb3BlcnR5UGF0aHMoKQopOwoKcmV0dXJuIHRyaW0oaW1wbG9kZSgnJywgJHJlc3VsdCksICcuJyk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHM7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKdXNlIEpzb25TY2hlbWFcVG9vbFxEZWVwQ29tcGFyZXI7CgoKCgoKCgpjbGFzcyBDb2xsZWN0aW9uQ29uc3RyYWludCBleHRlbmRzIENvbnN0cmFpbnQKewoKCgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewoKaWYgKGlzc2V0KCRzY2hlbWEtPm1pbkl0ZW1zKSAmJiBjb3VudCgkdmFsdWUpIDwgJHNjaGVtYS0+bWluSXRlbXMpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6TUlOX0lURU1TKCksICRwYXRoLCBbJ21pbkl0ZW1zJyA9PiAkc2NoZW1hLT5taW5JdGVtcywgJ2ZvdW5kJyA9PiBjb3VudCgkdmFsdWUpXSk7Cn0KCgppZiAoaXNzZXQoJHNjaGVtYS0+bWF4SXRlbXMpICYmIGNvdW50KCR2YWx1ZSkgPiAkc2NoZW1hLT5tYXhJdGVtcykgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpNQVhfSVRFTVMoKSwgJHBhdGgsIFsnbWF4SXRlbXMnID0+ICRzY2hlbWEtPm1heEl0ZW1zLCAnZm91bmQnID0+IGNvdW50KCR2YWx1ZSldKTsKfQoKCmlmIChpc3NldCgkc2NoZW1hLT51bmlxdWVJdGVtcykgJiYgJHNjaGVtYS0+dW5pcXVlSXRlbXMpIHsKJGNvdW50ID0gY291bnQoJHZhbHVlKTsKZm9yICgkeCA9IDA7ICR4IDwgJGNvdW50IC0gMTsgJHgrKykgewpmb3IgKCR5ID0gJHggKyAxOyAkeSA8ICRjb3VudDsgJHkrKykgewppZiAoRGVlcENvbXBhcmVyOjppc0VxdWFsKCR2YWx1ZVskeF0sICR2YWx1ZVskeV0pKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OlVOSVFVRV9JVEVNUygpLCAkcGF0aCk7CmJyZWFrIDI7Cn0KfQp9Cn0KCiR0aGlzLT52YWxpZGF0ZUl0ZW1zKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB2YWxpZGF0ZUl0ZW1zKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKFxpc19udWxsKCRzY2hlbWEpIHx8ICFpc3NldCgkc2NoZW1hLT5pdGVtcykpIHsKcmV0dXJuOwp9CgppZiAoJHNjaGVtYS0+aXRlbXMgPT09IHRydWUpIHsKcmV0dXJuOwp9CgppZiAoaXNfb2JqZWN0KCRzY2hlbWEtPml0ZW1zKSkgewoKZm9yZWFjaCAoJHZhbHVlIGFzICRrID0+ICYkdikgewokaW5pdEVycm9ycyA9ICR0aGlzLT5nZXRFcnJvcnMoKTsKCgokdGhpcy0+Y2hlY2tVbmRlZmluZWQoJHYsICRzY2hlbWEtPml0ZW1zLCAkcGF0aCwgJGspOwoKCmlmIChjb3VudCgkaW5pdEVycm9ycykgPCBjb3VudCgkdGhpcy0+Z2V0RXJyb3JzKCkpICYmIChpc3NldCgkc2NoZW1hLT5hZGRpdGlvbmFsSXRlbXMpICYmICRzY2hlbWEtPmFkZGl0aW9uYWxJdGVtcyAhPT0gZmFsc2UpKSB7CiRzZWNvbmRFcnJvcnMgPSAkdGhpcy0+Z2V0RXJyb3JzKCk7CiR0aGlzLT5jaGVja1VuZGVmaW5lZCgkdiwgJHNjaGVtYS0+YWRkaXRpb25hbEl0ZW1zLCAkcGF0aCwgJGspOwp9CgoKaWYgKGlzc2V0KCRzZWNvbmRFcnJvcnMpICYmIGNvdW50KCRzZWNvbmRFcnJvcnMpIDwgY291bnQoJHRoaXMtPmdldEVycm9ycygpKSkgewokdGhpcy0+ZXJyb3JzID0gJHNlY29uZEVycm9yczsKfSBlbHNlaWYgKGlzc2V0KCRzZWNvbmRFcnJvcnMpICYmIGNvdW50KCRzZWNvbmRFcnJvcnMpID09PSBjb3VudCgkdGhpcy0+Z2V0RXJyb3JzKCkpKSB7CiR0aGlzLT5lcnJvcnMgPSAkaW5pdEVycm9yczsKfQp9CnVuc2V0KCR2KTsgCgp9IGVsc2UgewoKZm9yZWFjaCAoJHZhbHVlIGFzICRrID0+ICYkdikgewppZiAoYXJyYXlfa2V5X2V4aXN0cygkaywgJHNjaGVtYS0+aXRlbXMpKSB7CiR0aGlzLT5jaGVja1VuZGVmaW5lZCgkdiwgJHNjaGVtYS0+aXRlbXNbJGtdLCAkcGF0aCwgJGspOwp9IGVsc2UgewoKaWYgKHByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnYWRkaXRpb25hbEl0ZW1zJykpIHsKaWYgKCRzY2hlbWEtPmFkZGl0aW9uYWxJdGVtcyAhPT0gZmFsc2UpIHsKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCR2LCAkc2NoZW1hLT5hZGRpdGlvbmFsSXRlbXMsICRwYXRoLCAkayk7Cn0gZWxzZSB7CiR0aGlzLT5hZGRFcnJvcigKQ29uc3RyYWludEVycm9yOjpBRERJVElPTkFMX0lURU1TKCksCiRwYXRoLApbCidpdGVtJyA9PiAkaSwKJ3Byb3BlcnR5JyA9PiAkaywKJ2FkZGl0aW9uYWxJdGVtcycgPT4gJHNjaGVtYS0+YWRkaXRpb25hbEl0ZW1zCl0KKTsKfQp9IGVsc2UgewoKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCR2LCBuZXcgXHN0ZENsYXNzKCksICRwYXRoLCAkayk7Cn0KfQp9CnVuc2V0KCR2KTsgCgoKCmlmIChjb3VudCgkdmFsdWUpID4gMCkgewpmb3IgKCRrID0gY291bnQoJHZhbHVlKTsgJGsgPCBjb3VudCgkc2NoZW1hLT5pdGVtcyk7ICRrKyspIHsKJHVuZGVmaW5lZEluc3RhbmNlID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCd1bmRlZmluZWQnKTsKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCR1bmRlZmluZWRJbnN0YW5jZSwgJHNjaGVtYS0+aXRlbXNbJGtdLCAkcGF0aCwgJGspOwp9Cn0KfQp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzOwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CnVzZSBKc29uU2NoZW1hXFRvb2xcRGVlcENvbXBhcmVyOwoKCgoKCgpjbGFzcyBDb25zdENvbnN0cmFpbnQgZXh0ZW5kcyBDb25zdHJhaW50CnsKCgoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkZWxlbWVudCwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewoKaWYgKCRlbGVtZW50IGluc3RhbmNlb2YgVW5kZWZpbmVkQ29uc3RyYWludCAmJiAoIWlzc2V0KCRzY2hlbWEtPnJlcXVpcmVkKSB8fCAhJHNjaGVtYS0+cmVxdWlyZWQpKSB7CnJldHVybjsKfQokY29uc3QgPSAkc2NoZW1hLT5jb25zdDsKCiR0eXBlID0gZ2V0dHlwZSgkZWxlbWVudCk7CiRjb25zdFR5cGUgPSBnZXR0eXBlKCRjb25zdCk7CgppZiAoJHRoaXMtPmZhY3RvcnktPmdldENvbmZpZyhzZWxmOjpDSEVDS19NT0RFX1RZUEVfQ0FTVCkgJiYgJHR5cGUgPT09ICdhcnJheScgJiYgJGNvbnN0VHlwZSA9PT0gJ29iamVjdCcpIHsKaWYgKERlZXBDb21wYXJlcjo6aXNFcXVhbCgob2JqZWN0KSAkZWxlbWVudCwgJGNvbnN0KSkgewpyZXR1cm47Cn0KfQoKaWYgKERlZXBDb21wYXJlcjo6aXNFcXVhbCgkZWxlbWVudCwgJGNvbnN0KSkgewpyZXR1cm47Cn0KCiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkNPTlNUQU5UKCksICRwYXRoLCBbJ2NvbnN0JyA9PiAkc2NoZW1hLT5jb25zdF0pOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHM7Cgp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgphYnN0cmFjdCBjbGFzcyBDb25zdHJhaW50IGV4dGVuZHMgQmFzZUNvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKCnByb3RlY3RlZCAkaW5saW5lU2NoZW1hUHJvcGVydHkgPSAnJHNjaGVtYSc7CgoKcHVibGljIGNvbnN0IENIRUNLX01PREVfTk9ORSA9IDB4MDAwMDAwMDA7CnB1YmxpYyBjb25zdCBDSEVDS19NT0RFX05PUk1BTCA9IDB4MDAwMDAwMDE7CnB1YmxpYyBjb25zdCBDSEVDS19NT0RFX1RZUEVfQ0FTVCA9IDB4MDAwMDAwMDI7CnB1YmxpYyBjb25zdCBDSEVDS19NT0RFX0NPRVJDRV9UWVBFUyA9IDB4MDAwMDAwMDQ7CnB1YmxpYyBjb25zdCBDSEVDS19NT0RFX0FQUExZX0RFRkFVTFRTID0gMHgwMDAwMDAwODsKcHVibGljIGNvbnN0IENIRUNLX01PREVfRVhDRVBUSU9OUyA9IDB4MDAwMDAwMTA7CnB1YmxpYyBjb25zdCBDSEVDS19NT0RFX0RJU0FCTEVfRk9STUFUID0gMHgwMDAwMDAyMDsKcHVibGljIGNvbnN0IENIRUNLX01PREVfRUFSTFlfQ09FUkNFID0gMHgwMDAwMDA0MDsKcHVibGljIGNvbnN0IENIRUNLX01PREVfT05MWV9SRVFVSVJFRF9ERUZBVUxUUyA9IDB4MDAwMDAwODA7CnB1YmxpYyBjb25zdCBDSEVDS19NT0RFX1ZBTElEQVRFX1NDSEVNQSA9IDB4MDAwMDAxMDA7CnB1YmxpYyBjb25zdCBDSEVDS19NT0RFX1NUUklDVCA9IDB4MDAwMDAyMDA7CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5jcmVtZW50UGF0aCg/SnNvblBvaW50ZXIgJHBhdGgsICRpKTogSnNvblBvaW50ZXIKewokcGF0aCA9ICRwYXRoID8/IG5ldyBKc29uUG9pbnRlcignJyk7CgppZiAoJGkgPT09IG51bGwgfHwgJGkgPT09ICcnKSB7CnJldHVybiAkcGF0aDsKfQoKcmV0dXJuICRwYXRoLT53aXRoUHJvcGVydHlQYXRocygKYXJyYXlfbWVyZ2UoCiRwYXRoLT5nZXRQcm9wZXJ0eVBhdGhzKCksClskaV0KKQopOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNoZWNrQXJyYXkoJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewokdmFsaWRhdG9yID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCdjb2xsZWN0aW9uJyk7CiR2YWxpZGF0b3ItPmNoZWNrKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKCiR0aGlzLT5hZGRFcnJvcnMoJHZhbGlkYXRvci0+Z2V0RXJyb3JzKCkpOwp9CgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNoZWNrT2JqZWN0KAomJHZhbHVlLAokc2NoZW1hID0gbnVsbCwKP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwKJHByb3BlcnRpZXMgPSBudWxsLAokYWRkaXRpb25hbFByb3BlcnRpZXMgPSBudWxsLAokcGF0dGVyblByb3BlcnRpZXMgPSBudWxsLAphcnJheSAkYXBwbGllZERlZmF1bHRzID0gW10KKTogdm9pZCB7CgokdmFsaWRhdG9yID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCdvYmplY3QnKTsKJHZhbGlkYXRvci0+Y2hlY2soJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJHByb3BlcnRpZXMsICRhZGRpdGlvbmFsUHJvcGVydGllcywgJHBhdHRlcm5Qcm9wZXJ0aWVzLCAkYXBwbGllZERlZmF1bHRzKTsKCiR0aGlzLT5hZGRFcnJvcnMoJHZhbGlkYXRvci0+Z2V0RXJyb3JzKCkpOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNoZWNrVHlwZSgmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CiR2YWxpZGF0b3IgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ3R5cGUnKTsKJHZhbGlkYXRvci0+Y2hlY2soJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwoKJHRoaXMtPmFkZEVycm9ycygkdmFsaWRhdG9yLT5nZXRFcnJvcnMoKSk7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2hlY2tVbmRlZmluZWQoJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCwgYm9vbCAkZnJvbURlZmF1bHQgPSBmYWxzZSk6IHZvaWQKewoKJHZhbGlkYXRvciA9ICR0aGlzLT5mYWN0b3J5LT5jcmVhdGVJbnN0YW5jZUZvcigndW5kZWZpbmVkJyk7CgokdmFsaWRhdG9yLT5jaGVjaygkdmFsdWUsICR0aGlzLT5mYWN0b3J5LT5nZXRTY2hlbWFTdG9yYWdlKCktPnJlc29sdmVSZWZTY2hlbWEoJHNjaGVtYSksICRwYXRoLCAkaSwgJGZyb21EZWZhdWx0KTsKCiR0aGlzLT5hZGRFcnJvcnMoJHZhbGlkYXRvci0+Z2V0RXJyb3JzKCkpOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNoZWNrU3RyaW5nKCR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewokdmFsaWRhdG9yID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCdzdHJpbmcnKTsKJHZhbGlkYXRvci0+Y2hlY2soJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwoKJHRoaXMtPmFkZEVycm9ycygkdmFsaWRhdG9yLT5nZXRFcnJvcnMoKSk7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2hlY2tOdW1iZXIoJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CiR2YWxpZGF0b3IgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ251bWJlcicpOwokdmFsaWRhdG9yLT5jaGVjaygkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CgokdGhpcy0+YWRkRXJyb3JzKCR2YWxpZGF0b3ItPmdldEVycm9ycygpKTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjaGVja0VudW0oJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CiR2YWxpZGF0b3IgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ2VudW0nKTsKJHZhbGlkYXRvci0+Y2hlY2soJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwoKJHRoaXMtPmFkZEVycm9ycygkdmFsaWRhdG9yLT5nZXRFcnJvcnMoKSk7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2hlY2tDb25zdCgkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKJHZhbGlkYXRvciA9ICR0aGlzLT5mYWN0b3J5LT5jcmVhdGVJbnN0YW5jZUZvcignY29uc3QnKTsKJHZhbGlkYXRvci0+Y2hlY2soJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwoKJHRoaXMtPmFkZEVycm9ycygkdmFsaWRhdG9yLT5nZXRFcnJvcnMoKSk7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2hlY2tGb3JtYXQoJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CiR2YWxpZGF0b3IgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ2Zvcm1hdCcpOwokdmFsaWRhdG9yLT5jaGVjaygkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CgokdGhpcy0+YWRkRXJyb3JzKCR2YWxpZGF0b3ItPmdldEVycm9ycygpKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFR5cGVDaGVjaygpOiBUeXBlQ2hlY2tcVHlwZUNoZWNrSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5mYWN0b3J5LT5nZXRUeXBlQ2hlY2soKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50czsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKCgoKCgppbnRlcmZhY2UgQ29uc3RyYWludEludGVyZmFjZQp7CgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFcnJvcnMoKTogYXJyYXk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkRXJyb3JzKGFycmF5ICRlcnJvcnMpOiB2b2lkOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZEVycm9yKENvbnN0cmFpbnRFcnJvciAkY29uc3RyYWludCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgYXJyYXkgJG1vcmUgPSBbXSk6IHZvaWQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWYWxpZCgpOiBib29sOwoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQ7Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDY7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBBZGRpdGlvbmFsSXRlbXNDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKCnByaXZhdGUgJGZhY3Rvcnk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5mYWN0b3J5ID0gJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKTsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkdGhpcy0+ZmFjdG9yeSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdhZGRpdGlvbmFsSXRlbXMnKSkgewpyZXR1cm47Cn0KCmlmICgkc2NoZW1hLT5hZGRpdGlvbmFsSXRlbXMgPT09IHRydWUpIHsKcmV0dXJuOwp9CmlmICgkc2NoZW1hLT5hZGRpdGlvbmFsSXRlbXMgPT09IGZhbHNlICYmICFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ2l0ZW1zJykpIHsKcmV0dXJuOwp9CgppZiAoIWlzX2FycmF5KCR2YWx1ZSkpIHsKcmV0dXJuOwp9CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdpdGVtcycpKSB7CnJldHVybjsKfQppZiAocHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdpdGVtcycpICYmIGlzX29iamVjdCgkc2NoZW1hLT5pdGVtcykpIHsKcmV0dXJuOwp9CgokYWRkaXRpb25hbEl0ZW1zID0gYXJyYXlfZGlmZl9rZXkoJHZhbHVlLCBwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ2l0ZW1zJykgPyAkc2NoZW1hLT5pdGVtcyA6IFtdKTsKCmZvcmVhY2ggKCRhZGRpdGlvbmFsSXRlbXMgYXMgJHByb3BlcnR5TmFtZSA9PiAkcHJvcGVydHlWYWx1ZSkgewokc2NoZW1hQ29uc3RyYWludCA9ICR0aGlzLT5mYWN0b3J5LT5jcmVhdGVJbnN0YW5jZUZvcignc2NoZW1hJyk7CiRzY2hlbWFDb25zdHJhaW50LT5jaGVjaygkcHJvcGVydHlWYWx1ZSwgJHNjaGVtYS0+YWRkaXRpb25hbEl0ZW1zLCAkcGF0aCwgJGkpOwoKaWYgKCRzY2hlbWFDb25zdHJhaW50LT5pc1ZhbGlkKCkpIHsKY29udGludWU7Cn0KCiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkFERElUSU9OQUxfSVRFTVMoKSwgJHBhdGgsIFsnaXRlbScgPT4gJGksICdwcm9wZXJ0eScgPT4gJHByb3BlcnR5TmFtZSwgJ2FkZGl0aW9uYWxJdGVtcycgPT4gJHNjaGVtYS0+YWRkaXRpb25hbEl0ZW1zXSk7Cn0KfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA2OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKY2xhc3MgQWRkaXRpb25hbFByb3BlcnRpZXNDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKCnByaXZhdGUgJGZhY3Rvcnk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5mYWN0b3J5ID0gJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKTsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkdGhpcy0+ZmFjdG9yeSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdhZGRpdGlvbmFsUHJvcGVydGllcycpKSB7CnJldHVybjsKfQoKaWYgKCRzY2hlbWEtPmFkZGl0aW9uYWxQcm9wZXJ0aWVzID09PSB0cnVlKSB7CnJldHVybjsKfQoKaWYgKCFpc19vYmplY3QoJHZhbHVlKSkgewpyZXR1cm47Cn0KCiRhZGRpdGlvbmFsUHJvcGVydGllcyA9IGdldF9vYmplY3RfdmFycygkdmFsdWUpOwoKaWYgKGlzc2V0KCRzY2hlbWEtPnByb3BlcnRpZXMpKSB7CiRhZGRpdGlvbmFsUHJvcGVydGllcyA9IGFycmF5X2RpZmZfa2V5KCRhZGRpdGlvbmFsUHJvcGVydGllcywgKGFycmF5KSAkc2NoZW1hLT5wcm9wZXJ0aWVzKTsKfQoKaWYgKGlzc2V0KCRzY2hlbWEtPnBhdHRlcm5Qcm9wZXJ0aWVzKSkgewokcGF0dGVybnMgPSBhcnJheV9rZXlzKGdldF9vYmplY3RfdmFycygkc2NoZW1hLT5wYXR0ZXJuUHJvcGVydGllcykpOwoKZm9yZWFjaCAoJGFkZGl0aW9uYWxQcm9wZXJ0aWVzIGFzICRrZXkgPT4gJF8pIHsKZm9yZWFjaCAoJHBhdHRlcm5zIGFzICRwYXR0ZXJuKSB7CmlmIChwcmVnX21hdGNoKCR0aGlzLT5jcmVhdGVQcmVnTWF0Y2hQYXR0ZXJuKCRwYXR0ZXJuKSwgKHN0cmluZykgJGtleSkpIHsKdW5zZXQoJGFkZGl0aW9uYWxQcm9wZXJ0aWVzWyRrZXldKTsKYnJlYWs7Cn0KfQp9Cn0KCmlmIChpc19vYmplY3QoJHNjaGVtYS0+YWRkaXRpb25hbFByb3BlcnRpZXMpKSB7CmZvcmVhY2ggKCRhZGRpdGlvbmFsUHJvcGVydGllcyBhcyAka2V5ID0+ICRhZGRpdGlvbmFsUHJvcGVydGllc1ZhbHVlKSB7CiRzY2hlbWFDb25zdHJhaW50ID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCdzY2hlbWEnKTsKJHNjaGVtYUNvbnN0cmFpbnQtPmNoZWNrKCRhZGRpdGlvbmFsUHJvcGVydGllc1ZhbHVlLCAkc2NoZW1hLT5hZGRpdGlvbmFsUHJvcGVydGllcywgJHBhdGgsICRpKTsgCmlmICgkc2NoZW1hQ29uc3RyYWludC0+aXNWYWxpZCgpKSB7CnVuc2V0KCRhZGRpdGlvbmFsUHJvcGVydGllc1ska2V5XSk7Cn0KfQp9Cgpmb3JlYWNoICgkYWRkaXRpb25hbFByb3BlcnRpZXMgYXMgJGtleSA9PiAkYWRkaXRpb25hbFByb3BlcnRpZXNWYWx1ZSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpBRERJVElPTkFMX1BST1BFUlRJRVMoKSwgJHBhdGgsIFsnZm91bmQnID0+ICRhZGRpdGlvbmFsUHJvcGVydGllc1ZhbHVlXSk7Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVQcmVnTWF0Y2hQYXR0ZXJuKHN0cmluZyAkcGF0dGVybik6IHN0cmluZwp7CiRyZXBsYWNlbWVudHMgPSBbCgoKJ1xwe2RpZ2l0fScgPT4gJ1xwe05kfScsCgoKCidccHtMZXR0ZXJ9JyA9PiAnXHB7TH0nLCAKXTsKCiRwYXR0ZXJuID0gc3RyX3JlcGxhY2UoCmFycmF5X2tleXMoJHJlcGxhY2VtZW50cyksCmFycmF5X3ZhbHVlcygkcmVwbGFjZW1lbnRzKSwKJHBhdHRlcm4KKTsKCnJldHVybiAnLycgLiBzdHJfcmVwbGFjZSgnLycsICdcLycsICRwYXR0ZXJuKSAuICcvdSc7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNjsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCmNsYXNzIEFsbE9mQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewp1c2UgRXJyb3JCYWdQcm94eTsKCgpwcml2YXRlICRmYWN0b3J5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+ZmFjdG9yeSA9ICRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCk7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJHRoaXMtPmZhY3RvcnkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnYWxsT2YnKSkgewpyZXR1cm47Cn0KCmZvcmVhY2ggKCRzY2hlbWEtPmFsbE9mIGFzICRhbGxPZlNjaGVtYSkgewokc2NoZW1hQ29uc3RyYWludCA9ICR0aGlzLT5mYWN0b3J5LT5jcmVhdGVJbnN0YW5jZUZvcignc2NoZW1hJyk7CiRzY2hlbWFDb25zdHJhaW50LT5jaGVjaygkdmFsdWUsICRhbGxPZlNjaGVtYSwgJHBhdGgsICRpKTsKCmlmICgkc2NoZW1hQ29uc3RyYWludC0+aXNWYWxpZCgpKSB7CmNvbnRpbnVlOwp9CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkFMTF9PRigpLCAkcGF0aCk7CiR0aGlzLT5hZGRFcnJvcnMoJHNjaGVtYUNvbnN0cmFpbnQtPmdldEVycm9ycygpKTsKfQp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDY7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CnVzZSBKc29uU2NoZW1hXEV4Y2VwdGlvblxWYWxpZGF0aW9uRXhjZXB0aW9uOwoKY2xhc3MgQW55T2ZDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKCnByaXZhdGUgJGZhY3Rvcnk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5mYWN0b3J5ID0gJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKTsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkdGhpcy0+ZmFjdG9yeSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdhbnlPZicpKSB7CnJldHVybjsKfQoKZm9yZWFjaCAoJHNjaGVtYS0+YW55T2YgYXMgJGFueU9mU2NoZW1hKSB7CiRzY2hlbWFDb25zdHJhaW50ID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCdzY2hlbWEnKTsKCnRyeSB7CiRzY2hlbWFDb25zdHJhaW50LT5jaGVjaygkdmFsdWUsICRhbnlPZlNjaGVtYSwgJHBhdGgsICRpKTsKCmlmICgkc2NoZW1hQ29uc3RyYWludC0+aXNWYWxpZCgpKSB7CiR0aGlzLT5lcnJvckJhZygpLT5yZXNldCgpOwoKcmV0dXJuOwp9CgokdGhpcy0+YWRkRXJyb3JzKCRzY2hlbWFDb25zdHJhaW50LT5nZXRFcnJvcnMoKSk7Cn0gY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gJGUpIHsKfQp9CgokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpBTllfT0YoKSwgJHBhdGgpOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDY7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXEZhY3Rvcnk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CnVzZSBKc29uU2NoZW1hXFRvb2xcRGVlcENvbXBhcmVyOwoKY2xhc3MgQ29uc3RDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnY29uc3QnKSkgewpyZXR1cm47Cn0KCmlmIChEZWVwQ29tcGFyZXI6OmlzRXF1YWwoJHZhbHVlLCAkc2NoZW1hLT5jb25zdCkpIHsKcmV0dXJuOwp9CgokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpDT05TVEFOVCgpLCAkcGF0aCwgWydjb25zdCcgPT4gJHNjaGVtYS0+Y29uc3RdKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA2OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKY2xhc3MgQ29udGFpbnNDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKCnByaXZhdGUgJGZhY3Rvcnk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5mYWN0b3J5ID0gJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKTsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkdGhpcy0+ZmFjdG9yeSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdjb250YWlucycpKSB7CnJldHVybjsKfQoKJHByb3BlcnRpZXMgPSBbXTsKaWYgKCFpc19hcnJheSgkdmFsdWUpKSB7CnJldHVybjsKfQoKZm9yZWFjaCAoJHZhbHVlIGFzICRwcm9wZXJ0eU5hbWUgPT4gJHByb3BlcnR5VmFsdWUpIHsKJHNjaGVtYUNvbnN0cmFpbnQgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ3NjaGVtYScpOwoKJHNjaGVtYUNvbnN0cmFpbnQtPmNoZWNrKCRwcm9wZXJ0eVZhbHVlLCAkc2NoZW1hLT5jb250YWlucywgJHBhdGgsICRpKTsKaWYgKCRzY2hlbWFDb25zdHJhaW50LT5pc1ZhbGlkKCkpIHsKcmV0dXJuOwp9Cn0KCiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkNPTlRBSU5TKCksICRwYXRoLCBbJ2NvbnRhaW5zJyA9PiAkc2NoZW1hLT5jb250YWluc10pOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDY7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBEZXBlbmRlbmNpZXNDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKCnByaXZhdGUgJGZhY3Rvcnk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5mYWN0b3J5ID0gJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKTsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkdGhpcy0+ZmFjdG9yeSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdkZXBlbmRlbmNpZXMnKSkgewpyZXR1cm47Cn0KCmlmICghaXNfb2JqZWN0KCR2YWx1ZSkpIHsKcmV0dXJuOwp9Cgpmb3JlYWNoICgkc2NoZW1hLT5kZXBlbmRlbmNpZXMgYXMgJGRlcGVuZGFudCA9PiAkZGVwZW5kZW5jaWVzKSB7CmlmICghcHJvcGVydHlfZXhpc3RzKCR2YWx1ZSwgJGRlcGVuZGFudCkpIHsKY29udGludWU7Cn0KaWYgKCRkZXBlbmRlbmNpZXMgPT09IHRydWUpIHsKY29udGludWU7Cn0KaWYgKCRkZXBlbmRlbmNpZXMgPT09IGZhbHNlKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZBTFNFKCksICRwYXRoLCBbJ2RlcGVuZGFudCcgPT4gJGRlcGVuZGFudF0pOwpjb250aW51ZTsKfQoKaWYgKGlzX2FycmF5KCRkZXBlbmRlbmNpZXMpKSB7CmZvcmVhY2ggKCRkZXBlbmRlbmNpZXMgYXMgJGRlcGVuZGVuY3kpIHsKaWYgKHByb3BlcnR5X2V4aXN0cygkdmFsdWUsICRkZXBlbmRhbnQpICYmICFwcm9wZXJ0eV9leGlzdHMoJHZhbHVlLCAkZGVwZW5kZW5jeSkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6REVQRU5ERU5DSUVTKCksICRwYXRoLCBbJ2RlcGVuZGFudCcgPT4gJGRlcGVuZGFudCwgJ2RlcGVuZGVuY3knID0+ICRkZXBlbmRlbmN5XSk7Cn0KfQp9CgppZiAoaXNfb2JqZWN0KCRkZXBlbmRlbmNpZXMpKSB7CiRzY2hlbWFDb25zdHJhaW50ID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCdzY2hlbWEnKTsKJHNjaGVtYUNvbnN0cmFpbnQtPmNoZWNrKCR2YWx1ZSwgJGRlcGVuZGVuY2llcywgJHBhdGgsICRpKTsKaWYgKCEkc2NoZW1hQ29uc3RyYWludC0+aXNWYWxpZCgpKSB7CiR0aGlzLT5hZGRFcnJvcnMoJHNjaGVtYUNvbnN0cmFpbnQtPmdldEVycm9ycygpKTsKfQp9Cn0KfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA2OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CnVzZSBKc29uU2NoZW1hXFNjaGVtYVN0b3JhZ2U7CnVzZSBKc29uU2NoZW1hXFVyaVxVcmlSZXRyaWV2ZXI7CgpjbGFzcyBEcmFmdDA2Q29uc3RyYWludCBleHRlbmRzIENvbnN0cmFpbnQKewpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP1xKc29uU2NoZW1hXENvbnN0cmFpbnRzXEZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QobmV3IEZhY3RvcnkoCiRmYWN0b3J5ID8gJGZhY3RvcnktPmdldFNjaGVtYVN0b3JhZ2UoKSA6IG5ldyBTY2hlbWFTdG9yYWdlKCksCiRmYWN0b3J5ID8gJGZhY3RvcnktPmdldFVyaVJldHJpZXZlcigpIDogbmV3IFVyaVJldHJpZXZlcigpLAokZmFjdG9yeSA/ICRmYWN0b3J5LT5nZXRDb25maWcoKSA6IENvbnN0cmFpbnQ6OkNIRUNLX01PREVfTk9STUFMCikpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoaXNfYm9vbCgkc2NoZW1hKSkgewppZiAoJHNjaGVtYSA9PT0gZmFsc2UpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6RkFMU0UoKSwgJHBhdGgsIFtdKTsKfQoKcmV0dXJuOwp9CgoKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgncmVmJywgJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwokdGhpcy0+Y2hlY2tGb3JLZXl3b3JkKCdyZXF1aXJlZCcsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnY29udGFpbnMnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ3Byb3BlcnRpZXMnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ3Byb3BlcnR5TmFtZXMnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ3BhdHRlcm5Qcm9wZXJ0aWVzJywgJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwokdGhpcy0+Y2hlY2tGb3JLZXl3b3JkKCd0eXBlJywgJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwokdGhpcy0+Y2hlY2tGb3JLZXl3b3JkKCdub3QnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ2RlcGVuZGVuY2llcycsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnYWxsT2YnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ2FueU9mJywgJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwokdGhpcy0+Y2hlY2tGb3JLZXl3b3JkKCdvbmVPZicsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKCiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ2FkZGl0aW9uYWxQcm9wZXJ0aWVzJywgJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwokdGhpcy0+Y2hlY2tGb3JLZXl3b3JkKCdpdGVtcycsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnYWRkaXRpb25hbEl0ZW1zJywgJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwokdGhpcy0+Y2hlY2tGb3JLZXl3b3JkKCd1bmlxdWVJdGVtcycsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnbWluSXRlbXMnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ21pblByb3BlcnRpZXMnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ21heFByb3BlcnRpZXMnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ21pbmltdW0nLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ21heGltdW0nLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ21pbkxlbmd0aCcsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnZXhjbHVzaXZlTWluaW11bScsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnbWF4SXRlbXMnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ21heExlbmd0aCcsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnZXhjbHVzaXZlTWF4aW11bScsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnZW51bScsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnY29uc3QnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ211bHRpcGxlT2YnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ2Zvcm1hdCcsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgncGF0dGVybicsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2hlY2tGb3JLZXl3b3JkKHN0cmluZyAka2V5d29yZCwgJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CiR2YWxpZGF0b3IgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJGtleXdvcmQpOwokdmFsaWRhdG9yLT5jaGVjaygkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CgokdGhpcy0+YWRkRXJyb3JzKCR2YWxpZGF0b3ItPmdldEVycm9ycygpKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA2OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xGYWN0b3J5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwp1c2UgSnNvblNjaGVtYVxUb29sXERlZXBDb21wYXJlcjsKCmNsYXNzIEVudW1Db25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnZW51bScpKSB7CnJldHVybjsKfQoKZm9yZWFjaCAoJHNjaGVtYS0+ZW51bSBhcyAkZW51bUNhc2UpIHsKaWYgKERlZXBDb21wYXJlcjo6aXNFcXVhbCgkdmFsdWUsICRlbnVtQ2FzZSkpIHsKcmV0dXJuOwp9CgppZiAoaXNfbnVtZXJpYygkdmFsdWUpICYmIGlzX251bWVyaWMoJGVudW1DYXNlKSAmJiBEZWVwQ29tcGFyZXI6OmlzRXF1YWwoKGZsb2F0KSAkdmFsdWUsIChmbG9hdCkgJGVudW1DYXNlKSkgewpyZXR1cm47Cn0KfQoKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6RU5VTSgpLCAkcGF0aCwgWydlbnVtJyA9PiAkc2NoZW1hLT5lbnVtXSk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNjsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRmFjdG9yeTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCmNsYXNzIEV4Y2x1c2l2ZU1heGltdW1Db25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnZXhjbHVzaXZlTWF4aW11bScpKSB7CnJldHVybjsKfQoKaWYgKCFpc19udW1lcmljKCR2YWx1ZSkpIHsKcmV0dXJuOwp9CgppZiAoJHZhbHVlIDwgJHNjaGVtYS0+ZXhjbHVzaXZlTWF4aW11bSkgewpyZXR1cm47Cn0KCiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkVYQ0xVU0lWRV9NQVhJTVVNKCksICRwYXRoLCBbJ2V4Y2x1c2l2ZU1heGltdW0nID0+ICRzY2hlbWEtPmV4Y2x1c2l2ZU1heGltdW0sICdmb3VuZCcgPT4gJHZhbHVlXSk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNjsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRmFjdG9yeTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCmNsYXNzIEV4Y2x1c2l2ZU1pbmltdW1Db25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnZXhjbHVzaXZlTWluaW11bScpKSB7CnJldHVybjsKfQoKaWYgKCFpc19udW1lcmljKCR2YWx1ZSkpIHsKcmV0dXJuOwp9CgppZiAoJHZhbHVlID4gJHNjaGVtYS0+ZXhjbHVzaXZlTWluaW11bSkgewpyZXR1cm47Cn0KCiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkVYQ0xVU0lWRV9NSU5JTVVNKCksICRwYXRoLCBbJ2V4Y2x1c2l2ZU1pbmltdW0nID0+ICRzY2hlbWEtPmV4Y2x1c2l2ZU1pbmltdW0sICdmb3VuZCcgPT4gJHZhbHVlXSk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNjsKCmNsYXNzIEZhY3RvcnkgZXh0ZW5kcyBcSnNvblNjaGVtYVxDb25zdHJhaW50c1xGYWN0b3J5CnsKCgoKcHJvdGVjdGVkICRjb25zdHJhaW50TWFwID0gWwonc2NoZW1hJyA9PiBEcmFmdDA2Q29uc3RyYWludDo6Y2xhc3MsCidhZGRpdGlvbmFsUHJvcGVydGllcycgPT4gQWRkaXRpb25hbFByb3BlcnRpZXNDb25zdHJhaW50OjpjbGFzcywKJ2FkZGl0aW9uYWxJdGVtcycgPT4gQWRkaXRpb25hbEl0ZW1zQ29uc3RyYWludDo6Y2xhc3MsCidkZXBlbmRlbmNpZXMnID0+IERlcGVuZGVuY2llc0NvbnN0cmFpbnQ6OmNsYXNzLAondHlwZScgPT4gVHlwZUNvbnN0cmFpbnQ6OmNsYXNzLAonY29uc3QnID0+IENvbnN0Q29uc3RyYWludDo6Y2xhc3MsCidlbnVtJyA9PiBFbnVtQ29uc3RyYWludDo6Y2xhc3MsCid1bmlxdWVJdGVtcycgPT4gVW5pcXVlSXRlbXNDb25zdHJhaW50OjpjbGFzcywKJ21pbkl0ZW1zJyA9PiBNaW5JdGVtc0NvbnN0cmFpbnQ6OmNsYXNzLAonbWluUHJvcGVydGllcycgPT4gTWluUHJvcGVydGllc0NvbnN0cmFpbnQ6OmNsYXNzLAonbWF4UHJvcGVydGllcycgPT4gTWF4UHJvcGVydGllc0NvbnN0cmFpbnQ6OmNsYXNzLAonbWluaW11bScgPT4gTWluaW11bUNvbnN0cmFpbnQ6OmNsYXNzLAonbWF4aW11bScgPT4gTWF4aW11bUNvbnN0cmFpbnQ6OmNsYXNzLAonZXhjbHVzaXZlTWluaW11bScgPT4gRXhjbHVzaXZlTWluaW11bUNvbnN0cmFpbnQ6OmNsYXNzLAonbWluTGVuZ3RoJyA9PiBNaW5MZW5ndGhDb25zdHJhaW50OjpjbGFzcywKJ21heExlbmd0aCcgPT4gTWF4TGVuZ3RoQ29uc3RyYWludDo6Y2xhc3MsCidtYXhJdGVtcycgPT4gTWF4SXRlbXNDb25zdHJhaW50OjpjbGFzcywKJ2V4Y2x1c2l2ZU1heGltdW0nID0+IEV4Y2x1c2l2ZU1heGltdW1Db25zdHJhaW50OjpjbGFzcywKJ211bHRpcGxlT2YnID0+IE11bHRpcGxlT2ZDb25zdHJhaW50OjpjbGFzcywKJ3JlcXVpcmVkJyA9PiBSZXF1aXJlZENvbnN0cmFpbnQ6OmNsYXNzLAonZm9ybWF0JyA9PiBGb3JtYXRDb25zdHJhaW50OjpjbGFzcywKJ2FueU9mJyA9PiBBbnlPZkNvbnN0cmFpbnQ6OmNsYXNzLAonYWxsT2YnID0+IEFsbE9mQ29uc3RyYWludDo6Y2xhc3MsCidvbmVPZicgPT4gT25lT2ZDb25zdHJhaW50OjpjbGFzcywKJ25vdCcgPT4gTm90Q29uc3RyYWludDo6Y2xhc3MsCidjb250YWlucycgPT4gQ29udGFpbnNDb25zdHJhaW50OjpjbGFzcywKJ3Byb3BlcnR5TmFtZXMnID0+IFByb3BlcnRpZXNOYW1lc0NvbnN0cmFpbnQ6OmNsYXNzLAoncGF0dGVyblByb3BlcnRpZXMnID0+IFBhdHRlcm5Qcm9wZXJ0aWVzQ29uc3RyYWludDo6Y2xhc3MsCidwYXR0ZXJuJyA9PiBQYXR0ZXJuQ29uc3RyYWludDo6Y2xhc3MsCidwcm9wZXJ0aWVzJyA9PiBQcm9wZXJ0aWVzQ29uc3RyYWludDo6Y2xhc3MsCidpdGVtcycgPT4gSXRlbXNDb25zdHJhaW50OjpjbGFzcywKJ3JlZicgPT4gUmVmQ29uc3RyYWludDo6Y2xhc3MsCl07Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDY7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXEZhY3Rvcnk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CnVzZSBKc29uU2NoZW1hXFJmYzMzMzk7CnVzZSBKc29uU2NoZW1hXFRvb2xcVmFsaWRhdG9yXFJlbGF0aXZlUmVmZXJlbmNlVmFsaWRhdG9yOwp1c2UgSnNvblNjaGVtYVxUb29sXFZhbGlkYXRvclxVcmlWYWxpZGF0b3I7CgpjbGFzcyBGb3JtYXRDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnZm9ybWF0JykpIHsKcmV0dXJuOwp9CgppZiAoIWlzX3N0cmluZygkdmFsdWUpKSB7CnJldHVybjsKfQoKc3dpdGNoICgkc2NoZW1hLT5mb3JtYXQpIHsKY2FzZSAnZGF0ZSc6CmlmICghJHRoaXMtPnZhbGlkYXRlRGF0ZVRpbWUoJHZhbHVlLCAnWS1tLWQnKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfREFURSgpLCAkcGF0aCwgWydkYXRlJyA9PiAkdmFsdWUsICdmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwpjYXNlICd0aW1lJzoKaWYgKCEkdGhpcy0+dmFsaWRhdGVEYXRlVGltZSgkdmFsdWUsICdIOmk6cycpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9USU1FKCksICRwYXRoLCBbJ3RpbWUnID0+ICR2YWx1ZSwgJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0XSk7Cn0KYnJlYWs7CmNhc2UgJ2RhdGUtdGltZSc6CmlmICghJHRoaXMtPnZhbGlkYXRlUmZjMzMzOURhdGVUaW1lKCR2YWx1ZSkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX0RBVEVfVElNRSgpLCAkcGF0aCwgWydkYXRlVGltZScgPT4gJHZhbHVlLCAnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXRdKTsKfQpicmVhazsKY2FzZSAndXRjLW1pbGxpc2VjJzoKaWYgKCEkdGhpcy0+dmFsaWRhdGVEYXRlVGltZSgkdmFsdWUsICdVJykpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX0RBVEVfVVRDKCksICRwYXRoLCBbJ3ZhbHVlJyA9PiAkdmFsdWUsICdmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwpjYXNlICdyZWdleCc6CmlmICghJHRoaXMtPnZhbGlkYXRlUmVnZXgoJHZhbHVlKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfUkVHRVgoKSwgJHBhdGgsIFsndmFsdWUnID0+ICR2YWx1ZSwgJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0XSk7Cn0KYnJlYWs7CmNhc2UgJ2lwLWFkZHJlc3MnOgpjYXNlICdpcHY0JzoKaWYgKGZpbHRlcl92YXIoJHZhbHVlLCBGSUxURVJfVkFMSURBVEVfSVAsIEZJTFRFUl9OVUxMX09OX0ZBSUxVUkUgfCBGSUxURVJfRkxBR19JUFY0KSA9PT0gbnVsbCkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfSVAoKSwgJHBhdGgsIFsnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXRdKTsKfQpicmVhazsKY2FzZSAnaXB2Nic6CmlmIChmaWx0ZXJfdmFyKCR2YWx1ZSwgRklMVEVSX1ZBTElEQVRFX0lQLCBGSUxURVJfTlVMTF9PTl9GQUlMVVJFIHwgRklMVEVSX0ZMQUdfSVBWNikgPT09IG51bGwpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX0lQKCksICRwYXRoLCBbJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0XSk7Cn0KYnJlYWs7CmNhc2UgJ2NvbG9yJzoKaWYgKCEkdGhpcy0+dmFsaWRhdGVDb2xvcigkdmFsdWUpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9DT0xPUigpLCAkcGF0aCwgWydmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwpjYXNlICdzdHlsZSc6CmlmICghJHRoaXMtPnZhbGlkYXRlU3R5bGUoJHZhbHVlKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfU1RZTEUoKSwgJHBhdGgsIFsnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXRdKTsKfQpicmVhazsKY2FzZSAncGhvbmUnOgppZiAoISR0aGlzLT52YWxpZGF0ZVBob25lKCR2YWx1ZSkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX1BIT05FKCksICRwYXRoLCBbJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0XSk7Cn0KYnJlYWs7CmNhc2UgJ3VyaSc6CmlmICghVXJpVmFsaWRhdG9yOjppc1ZhbGlkKCR2YWx1ZSkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX1VSTCgpLCAkcGF0aCwgWydmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwoKY2FzZSAndXJpcmVmJzoKY2FzZSAndXJpLXJlZmVyZW5jZSc6CmlmICghKFVyaVZhbGlkYXRvcjo6aXNWYWxpZCgkdmFsdWUpIHx8IFJlbGF0aXZlUmVmZXJlbmNlVmFsaWRhdG9yOjppc1ZhbGlkKCR2YWx1ZSkpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9VUkwoKSwgJHBhdGgsIFsnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXRdKTsKfQpicmVhazsKY2FzZSAndXJpLXRlbXBsYXRlJzoKaWYgKCEkdGhpcy0+dmFsaWRhdGVVcmlUZW1wbGF0ZSgkdmFsdWUpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9VUklfVEVNUExBVEUoKSwgJHBhdGgsIFsnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXRdKTsKfQpicmVhazsKCmNhc2UgJ2VtYWlsJzoKaWYgKGZpbHRlcl92YXIoJHZhbHVlLCBGSUxURVJfVkFMSURBVEVfRU1BSUwsIEZJTFRFUl9OVUxMX09OX0ZBSUxVUkUgfCBGSUxURVJfRkxBR19FTUFJTF9VTklDT0RFKSA9PT0gbnVsbCkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfRU1BSUwoKSwgJHBhdGgsIFsnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXRdKTsKfQpicmVhazsKY2FzZSAnaG9zdC1uYW1lJzoKY2FzZSAnaG9zdG5hbWUnOgppZiAoISR0aGlzLT52YWxpZGF0ZUhvc3RuYW1lKCR2YWx1ZSkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX0hPU1ROQU1FKCksICRwYXRoLCBbJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0XSk7Cn0KYnJlYWs7CmNhc2UgJ2pzb24tcG9pbnRlcic6CmlmICghJHRoaXMtPnZhbGlkYXRlSnNvblBvaW50ZXIoJHZhbHVlKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfSlNPTl9QT0lOVEVSKCksICRwYXRoLCBbJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0XSk7Cn0KYnJlYWs7CmRlZmF1bHQ6CmJyZWFrOwp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gdmFsaWRhdGVEYXRlVGltZShzdHJpbmcgJGRhdGV0aW1lLCBzdHJpbmcgJGZvcm1hdCk6IGJvb2wKewokZHQgPSBcRGF0ZVRpbWU6OmNyZWF0ZUZyb21Gb3JtYXQoJGZvcm1hdCwgJGRhdGV0aW1lKTsKCmlmICghJGR0KSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuICRkYXRldGltZSA9PT0gJGR0LT5mb3JtYXQoJGZvcm1hdCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gdmFsaWRhdGVSZWdleChzdHJpbmcgJHJlZ2V4KTogYm9vbAp7CnJldHVybiBwcmVnX21hdGNoKHNlbGY6Ompzb25QYXR0ZXJuVG9QaHBSZWdleCgkcmVnZXgpLCAnJykgIT09IGZhbHNlOwp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBqc29uUGF0dGVyblRvUGhwUmVnZXgoc3RyaW5nICRwYXR0ZXJuKTogc3RyaW5nCnsKcmV0dXJuICd+JyAuIHN0cl9yZXBsYWNlKCd+JywgJ1xcficsICRwYXR0ZXJuKSAuICd+dSc7Cn0KCnByaXZhdGUgZnVuY3Rpb24gdmFsaWRhdGVDb2xvcihzdHJpbmcgJGNvbG9yKTogYm9vbAp7CmlmIChpbl9hcnJheShzdHJ0b2xvd2VyKCRjb2xvciksIFsnYXF1YScsICdibGFjaycsICdibHVlJywgJ2Z1Y2hzaWEnLAonZ3JheScsICdncmVlbicsICdsaW1lJywgJ21hcm9vbicsICduYXZ5JywgJ29saXZlJywgJ29yYW5nZScsICdwdXJwbGUnLAoncmVkJywgJ3NpbHZlcicsICd0ZWFsJywgJ3doaXRlJywgJ3llbGxvdyddKSkgewpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIHByZWdfbWF0Y2goJy9eIyhbYS1mMC05XXszfXxbYS1mMC05XXs2fSkkL2knLCAkY29sb3IpICE9PSBmYWxzZTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZVN0eWxlKHN0cmluZyAkc3R5bGUpOiBib29sCnsKJHByb3BlcnRpZXMgPSBleHBsb2RlKCc7JywgcnRyaW0oJHN0eWxlLCAnOycpKTsKJGludmFsaWRFbnRyaWVzID0gcHJlZ19ncmVwKCcvXlxzKlstYS16XStccyo6XHMqLiskL2knLCAkcHJvcGVydGllcywgUFJFR19HUkVQX0lOVkVSVCk7CgpyZXR1cm4gZW1wdHkoJGludmFsaWRFbnRyaWVzKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZVBob25lKHN0cmluZyAkcGhvbmUpOiBib29sCnsKcmV0dXJuIHByZWdfbWF0Y2goJy9eXCs/KFwoXGR7M31cKXxcZHszfSkgXGR7M30gXGR7NH0kLycsICRwaG9uZSkgIT09IGZhbHNlOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHZhbGlkYXRlSG9zdG5hbWUoc3RyaW5nICRob3N0KTogYm9vbAp7CiRob3N0bmFtZVJlZ2V4ID0gJy9eKD8hLSkoPyEuKj9bXkEtWmEtejAtOVwtXC5dKSg/Oig/IS0pW0EtWmEtejAtOV0oPzpbQS1aYS16MC05XC1dezAsNjF9W0EtWmEtejAtOV0pP1wuKSooPyEtKVtBLVphLXowLTldKD86W0EtWmEtejAtOVwtXXswLDYxfVtBLVphLXowLTldKT8kLyc7CgpyZXR1cm4gcHJlZ19tYXRjaCgkaG9zdG5hbWVSZWdleCwgJGhvc3QpID09PSAxOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHZhbGlkYXRlSnNvblBvaW50ZXIoc3RyaW5nICR2YWx1ZSk6IGJvb2wKewoKaWYgKCR2YWx1ZSAhPT0gJycgJiYgJHZhbHVlWzBdICE9PSAnLycpIHsKcmV0dXJuIGZhbHNlOwp9CgoKJHRva2VucyA9IGV4cGxvZGUoJy8nLCAkdmFsdWUpOwphcnJheV9zaGlmdCgkdG9rZW5zKTsgCgpmb3JlYWNoICgkdG9rZW5zIGFzICR0b2tlbikgewoKaWYgKHByZWdfbWF0Y2goJy9+KD8hWzAxXSkvJywgJHRva2VuKSkgewpyZXR1cm4gZmFsc2U7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KCnByaXZhdGUgZnVuY3Rpb24gdmFsaWRhdGVSZmMzMzM5RGF0ZVRpbWUoc3RyaW5nICR2YWx1ZSk6IGJvb2wKewokZGF0ZVRpbWUgPSBSZmMzMzM5OjpjcmVhdGVGcm9tU3RyaW5nKCR2YWx1ZSk7CmlmIChpc19udWxsKCRkYXRlVGltZSkpIHsKcmV0dXJuIGZhbHNlOwp9CgoKcmV0dXJuIHRydWU7Cn0KCnByaXZhdGUgZnVuY3Rpb24gdmFsaWRhdGVVcmlUZW1wbGF0ZShzdHJpbmcgJHZhbHVlKTogYm9vbAp7CnJldHVybiBwcmVnX21hdGNoKAonL14oPzpbXlx7XH1dKnxce1thLXpBLVowLTlfOiVcL1wuflwtXCtcKl0rXH0pKiQvJywKJHZhbHVlCikgPT09IDE7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNjsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBJdGVtc0NvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgoKcHJpdmF0ZSAkZmFjdG9yeTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmZhY3RvcnkgPSAkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpOwokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCR0aGlzLT5mYWN0b3J5KTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ2l0ZW1zJykpIHsKcmV0dXJuOwp9CgppZiAoIWlzX2FycmF5KCR2YWx1ZSkpIHsKcmV0dXJuOwp9Cgpmb3JlYWNoICgkdmFsdWUgYXMgJHByb3BlcnR5TmFtZSA9PiAkcHJvcGVydHlWYWx1ZSkgewokaXRlbVNjaGVtYSA9ICRzY2hlbWEtPml0ZW1zOwppZiAoaXNfYXJyYXkoJGl0ZW1TY2hlbWEpKSB7CmlmICghYXJyYXlfa2V5X2V4aXN0cygkcHJvcGVydHlOYW1lLCAkaXRlbVNjaGVtYSkpIHsKY29udGludWU7Cn0KCiRpdGVtU2NoZW1hID0gJGl0ZW1TY2hlbWFbJHByb3BlcnR5TmFtZV07Cn0KJHNjaGVtYUNvbnN0cmFpbnQgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ3NjaGVtYScpOwokc2NoZW1hQ29uc3RyYWludC0+Y2hlY2soJHByb3BlcnR5VmFsdWUsICRpdGVtU2NoZW1hLCAkcGF0aCwgJGkpOwppZiAoJHNjaGVtYUNvbnN0cmFpbnQtPmlzVmFsaWQoKSkgewpjb250aW51ZTsKfQoKJHRoaXMtPmFkZEVycm9ycygkc2NoZW1hQ29uc3RyYWludC0+Z2V0RXJyb3JzKCkpOwp9Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNjsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRmFjdG9yeTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCmNsYXNzIE1heEl0ZW1zQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewp1c2UgRXJyb3JCYWdQcm94eTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpKTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ21heEl0ZW1zJykpIHsKcmV0dXJuOwp9CgppZiAoIWlzX2FycmF5KCR2YWx1ZSkpIHsKcmV0dXJuOwp9CgokY291bnQgPSBjb3VudCgkdmFsdWUpOwppZiAoJGNvdW50IDw9ICRzY2hlbWEtPm1heEl0ZW1zKSB7CnJldHVybjsKfQoKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6TUFYX0lURU1TKCksICRwYXRoLCBbJ21heEl0ZW1zJyA9PiAkc2NoZW1hLT5tYXhJdGVtcywgJ2ZvdW5kJyA9PiAkY291bnRdKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA2OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xGYWN0b3J5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKY2xhc3MgTWF4TGVuZ3RoQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewp1c2UgRXJyb3JCYWdQcm94eTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpKTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ21heExlbmd0aCcpKSB7CnJldHVybjsKfQoKaWYgKCFpc19zdHJpbmcoJHZhbHVlKSkgewpyZXR1cm47Cn0KCiRsZW5ndGggPSBtYl9zdHJsZW4oJHZhbHVlKTsKaWYgKCRsZW5ndGggPD0gJHNjaGVtYS0+bWF4TGVuZ3RoKSB7CnJldHVybjsKfQoKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6TEVOR1RIX01BWCgpLCAkcGF0aCwgWydtYXhMZW5ndGgnID0+ICRzY2hlbWEtPm1heExlbmd0aCwgJ2ZvdW5kJyA9PiAkbGVuZ3RoXSk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNjsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRmFjdG9yeTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCmNsYXNzIE1heFByb3BlcnRpZXNDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnbWF4UHJvcGVydGllcycpKSB7CnJldHVybjsKfQoKaWYgKCFpc19vYmplY3QoJHZhbHVlKSkgewpyZXR1cm47Cn0KCiRjb3VudCA9IGNvdW50KGdldF9vYmplY3RfdmFycygkdmFsdWUpKTsKaWYgKCRjb3VudCA8PSAkc2NoZW1hLT5tYXhQcm9wZXJ0aWVzKSB7CnJldHVybjsKfQoKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6UFJPUEVSVElFU19NQVgoKSwgJHBhdGgsIFsnbWF4UHJvcGVydGllcycgPT4gJHNjaGVtYS0+bWF4UHJvcGVydGllcywgJ2ZvdW5kJyA9PiAkY291bnRdKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA2OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xGYWN0b3J5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKY2xhc3MgTWF4aW11bUNvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdtYXhpbXVtJykpIHsKcmV0dXJuOwp9CgppZiAoIWlzX251bWVyaWMoJHZhbHVlKSkgewpyZXR1cm47Cn0KCmlmICgkdmFsdWUgPD0gJHNjaGVtYS0+bWF4aW11bSkgewpyZXR1cm47Cn0KCiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6Ok1BWElNVU0oKSwgJHBhdGgsIFsnbWF4aW11bScgPT4gJHNjaGVtYS0+bWF4aW11bSwgJ2ZvdW5kJyA9PiAkdmFsdWVdKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA2OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xGYWN0b3J5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKY2xhc3MgTWluSXRlbXNDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnbWluSXRlbXMnKSkgewpyZXR1cm47Cn0KCmlmICghaXNfYXJyYXkoJHZhbHVlKSkgewpyZXR1cm47Cn0KCiRjb3VudCA9IGNvdW50KCR2YWx1ZSk7CmlmICgkY291bnQgPj0gJHNjaGVtYS0+bWluSXRlbXMpIHsKcmV0dXJuOwp9CgokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpNSU5fSVRFTVMoKSwgJHBhdGgsIFsnbWluSXRlbXMnID0+ICRzY2hlbWEtPm1pbkl0ZW1zLCAnZm91bmQnID0+ICRjb3VudF0pOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDY7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXEZhY3Rvcnk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBNaW5MZW5ndGhDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnbWluTGVuZ3RoJykpIHsKcmV0dXJuOwp9CgppZiAoIWlzX3N0cmluZygkdmFsdWUpKSB7CnJldHVybjsKfQoKJGxlbmd0aCA9IG1iX3N0cmxlbigkdmFsdWUpOwppZiAoJGxlbmd0aCA+PSAkc2NoZW1hLT5taW5MZW5ndGgpIHsKcmV0dXJuOwp9CgokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpMRU5HVEhfTUlOKCksICRwYXRoLCBbJ21pbkxlbmd0aCcgPT4gJHNjaGVtYS0+bWluTGVuZ3RoLCAnZm91bmQnID0+ICRsZW5ndGhdKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA2OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xGYWN0b3J5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKY2xhc3MgTWluUHJvcGVydGllc0NvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdtaW5Qcm9wZXJ0aWVzJykpIHsKcmV0dXJuOwp9CgppZiAoIWlzX29iamVjdCgkdmFsdWUpKSB7CnJldHVybjsKfQoKJGNvdW50ID0gY291bnQoZ2V0X29iamVjdF92YXJzKCR2YWx1ZSkpOwppZiAoJGNvdW50ID49ICRzY2hlbWEtPm1pblByb3BlcnRpZXMpIHsKcmV0dXJuOwp9CgokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpQUk9QRVJUSUVTX01JTigpLCAkcGF0aCwgWydtaW5Qcm9wZXJ0aWVzJyA9PiAkc2NoZW1hLT5taW5Qcm9wZXJ0aWVzLCAnZm91bmQnID0+ICRjb3VudF0pOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDY7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXEZhY3Rvcnk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBNaW5pbXVtQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewp1c2UgRXJyb3JCYWdQcm94eTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpKTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ21pbmltdW0nKSkgewpyZXR1cm47Cn0KCmlmICghaXNfbnVtZXJpYygkdmFsdWUpKSB7CnJldHVybjsKfQoKaWYgKCR2YWx1ZSA+PSAkc2NoZW1hLT5taW5pbXVtKSB7CnJldHVybjsKfQoKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6TUlOSU1VTSgpLCAkcGF0aCwgWydtaW5pbXVtJyA9PiAkc2NoZW1hLT5taW5pbXVtLCAnZm91bmQnID0+ICR2YWx1ZV0pOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDY7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXEZhY3Rvcnk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBNdWx0aXBsZU9mQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewp1c2UgRXJyb3JCYWdQcm94eTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpKTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ211bHRpcGxlT2YnKSkgewpyZXR1cm47Cn0KCmlmICghaXNfaW50KCRzY2hlbWEtPm11bHRpcGxlT2YpICYmICFpc19mbG9hdCgkc2NoZW1hLT5tdWx0aXBsZU9mKSAmJiAkc2NoZW1hLT5tdWx0aXBsZU9mIDw9IDAuMCkgewpyZXR1cm47Cn0KCmlmICghaXNfaW50KCR2YWx1ZSkgJiYgIWlzX2Zsb2F0KCR2YWx1ZSkpIHsKcmV0dXJuOwp9CgppZiAoJHRoaXMtPmlzTXVsdGlwbGVPZigkdmFsdWUsICRzY2hlbWEtPm11bHRpcGxlT2YpKSB7CnJldHVybjsKfQoKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6TVVMVElQTEVfT0YoKSwgJHBhdGgsIFsnbXVsdGlwbGVPZicgPT4gJHNjaGVtYS0+bXVsdGlwbGVPZiwgJ2ZvdW5kJyA9PiAkdmFsdWVdKTsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gaXNNdWx0aXBsZU9mKCRudW1iZXIxLCAkbnVtYmVyMik6IGJvb2wKewokbW9kdWx1cyA9ICgkbnVtYmVyMSAtIHJvdW5kKCRudW1iZXIxIC8gJG51bWJlcjIpICogJG51bWJlcjIpOwokcHJlY2lzaW9uID0gMC4wMDAwMDAwMDAxOwoKcmV0dXJuIC0kcHJlY2lzaW9uIDwgJG1vZHVsdXMgJiYgJG1vZHVsdXMgPCAkcHJlY2lzaW9uOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDY7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBOb3RDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKCnByaXZhdGUgJGZhY3Rvcnk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5mYWN0b3J5ID0gJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKTsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkdGhpcy0+ZmFjdG9yeSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdub3QnKSkgewpyZXR1cm47Cn0KCiRzY2hlbWFDb25zdHJhaW50ID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCdzY2hlbWEnKTsKJHNjaGVtYUNvbnN0cmFpbnQtPmNoZWNrKCR2YWx1ZSwgJHNjaGVtYS0+bm90LCAkcGF0aCwgJGkpOwoKaWYgKCEkc2NoZW1hQ29uc3RyYWludC0+aXNWYWxpZCgpKSB7CnJldHVybjsKfQoKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Tk9UKCksICRwYXRoKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA2OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKY2xhc3MgT25lT2ZDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKCnByaXZhdGUgJGZhY3Rvcnk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5mYWN0b3J5ID0gJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKTsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkdGhpcy0+ZmFjdG9yeSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdvbmVPZicpKSB7CnJldHVybjsKfQoKJG1hdGNoZWRTY2hlbWEgPSAwOwpmb3JlYWNoICgkc2NoZW1hLT5vbmVPZiBhcyAkb25lT2ZTY2hlbWEpIHsKJHNjaGVtYUNvbnN0cmFpbnQgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ3NjaGVtYScpOwokc2NoZW1hQ29uc3RyYWludC0+Y2hlY2soJHZhbHVlLCAkb25lT2ZTY2hlbWEsICRwYXRoLCAkaSk7CgppZiAoJHNjaGVtYUNvbnN0cmFpbnQtPmlzVmFsaWQoKSkgewokbWF0Y2hlZFNjaGVtYSsrOwpjb250aW51ZTsKfQoKJHRoaXMtPmFkZEVycm9ycygkc2NoZW1hQ29uc3RyYWludC0+Z2V0RXJyb3JzKCkpOwp9CgppZiAoJG1hdGNoZWRTY2hlbWEgIT09IDEpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6T05FX09GKCksICRwYXRoKTsKfSBlbHNlIHsKJHRoaXMtPmVycm9yQmFnKCktPnJlc2V0KCk7Cn0KfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA2OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKY2xhc3MgUGF0dGVybkNvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgoKcHJpdmF0ZSAkZmFjdG9yeTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmZhY3RvcnkgPSAkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpOwokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCR0aGlzLT5mYWN0b3J5KTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ3BhdHRlcm4nKSkgewpyZXR1cm47Cn0KCmlmICghaXNfc3RyaW5nKCR2YWx1ZSkpIHsKcmV0dXJuOwp9CgokbWF0Y2hQYXR0ZXJuID0gJHRoaXMtPmNyZWF0ZVByZWdNYXRjaFBhdHRlcm4oJHNjaGVtYS0+cGF0dGVybik7CmlmIChwcmVnX21hdGNoKCRtYXRjaFBhdHRlcm4sICR2YWx1ZSkgPT09IDEpIHsKcmV0dXJuOwp9CgokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpQQVRURVJOKCksICRwYXRoLCBbJ2ZvdW5kJyA9PiAkdmFsdWUsICdwYXR0ZXJuJyA9PiAkc2NoZW1hLT5wYXR0ZXJuXSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gY3JlYXRlUHJlZ01hdGNoUGF0dGVybihzdHJpbmcgJHBhdHRlcm4pOiBzdHJpbmcKewokcmVwbGFjZW1lbnRzID0gWwonXEQnID0+ICdbXjAtOV0nLAonXGQnID0+ICdbMC05XScsCidccHtkaWdpdH0nID0+ICdbMC05XScsCidcdycgPT4gJ1tBLVphLXowLTlfXScsCidcVycgPT4gJ1teQS1aYS16MC05X10nLAonXHMnID0+ICdbXHNceHsyMDBCfV0nLCAKJ1xwe0xldHRlcn0nID0+ICdccHtMfScsIApdOwoKJHBhdHRlcm4gPSBzdHJfcmVwbGFjZSgKYXJyYXlfa2V5cygkcmVwbGFjZW1lbnRzKSwKYXJyYXlfdmFsdWVzKCRyZXBsYWNlbWVudHMpLAokcGF0dGVybgopOwoKcmV0dXJuICcvJyAuIHN0cl9yZXBsYWNlKCcvJywgJ1wvJywgJHBhdHRlcm4pIC4gJy91JzsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA2OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCmNsYXNzIFBhdHRlcm5Qcm9wZXJ0aWVzQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewp1c2UgRXJyb3JCYWdQcm94eTsKCgpwcml2YXRlICRmYWN0b3J5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+ZmFjdG9yeSA9ICRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCk7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJHRoaXMtPmZhY3RvcnkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAncGF0dGVyblByb3BlcnRpZXMnKSkgewpyZXR1cm47Cn0KCmlmICghaXNfb2JqZWN0KCR2YWx1ZSkpIHsKcmV0dXJuOwp9CgokcHJvcGVydGllcyA9IGdldF9vYmplY3RfdmFycygkdmFsdWUpOwoKZm9yZWFjaCAoJHByb3BlcnRpZXMgYXMgJHByb3BlcnR5TmFtZSA9PiAkcHJvcGVydHlWYWx1ZSkgewpmb3JlYWNoICgkc2NoZW1hLT5wYXR0ZXJuUHJvcGVydGllcyBhcyAkcGF0dGVyblByb3BlcnR5UmVnZXggPT4gJHBhdHRlcm5Qcm9wZXJ0eVNjaGVtYSkgewokbWF0Y2hQYXR0ZXJuID0gJHRoaXMtPmNyZWF0ZVByZWdNYXRjaFBhdHRlcm4oJHBhdHRlcm5Qcm9wZXJ0eVJlZ2V4KTsKaWYgKHByZWdfbWF0Y2goJG1hdGNoUGF0dGVybiwgKHN0cmluZykgJHByb3BlcnR5TmFtZSkpIHsKJHNjaGVtYUNvbnN0cmFpbnQgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ3NjaGVtYScpOwokc2NoZW1hQ29uc3RyYWludC0+Y2hlY2soJHByb3BlcnR5VmFsdWUsICRwYXR0ZXJuUHJvcGVydHlTY2hlbWEsICRwYXRoLCAkaSk7CmlmICgkc2NoZW1hQ29uc3RyYWludC0+aXNWYWxpZCgpKSB7CmNvbnRpbnVlOwp9CgokdGhpcy0+YWRkRXJyb3JzKCRzY2hlbWFDb25zdHJhaW50LT5nZXRFcnJvcnMoKSk7Cn0KfQp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gY3JlYXRlUHJlZ01hdGNoUGF0dGVybihzdHJpbmcgJHBhdHRlcm4pOiBzdHJpbmcKewokcmVwbGFjZW1lbnRzID0gWwoKJ1xkJyA9PiAnWzAtOV0nLAonXHB7ZGlnaXR9JyA9PiAnWzAtOV0nLAoKCgonXHB7TGV0dGVyfScgPT4gJ1xwe0x9JywgCl07CgokcGF0dGVybiA9IHN0cl9yZXBsYWNlKAphcnJheV9rZXlzKCRyZXBsYWNlbWVudHMpLAphcnJheV92YWx1ZXMoJHJlcGxhY2VtZW50cyksCiRwYXR0ZXJuCik7CgpyZXR1cm4gJy8nIC4gc3RyX3JlcGxhY2UoJy8nLCAnXC8nLCAkcGF0dGVybikgLiAnL3UnOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDY7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKY2xhc3MgUHJvcGVydGllc0NvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgoKcHJpdmF0ZSAkZmFjdG9yeTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmZhY3RvcnkgPSAkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpOwokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCR0aGlzLT5mYWN0b3J5KTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ3Byb3BlcnRpZXMnKSkgewpyZXR1cm47Cn0KCmlmICghaXNfb2JqZWN0KCR2YWx1ZSkpIHsKcmV0dXJuOwp9Cgpmb3JlYWNoICgkc2NoZW1hLT5wcm9wZXJ0aWVzIGFzICRwcm9wZXJ0eU5hbWUgPT4gJHByb3BlcnR5U2NoZW1hKSB7CiRzY2hlbWFDb25zdHJhaW50ID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCdzY2hlbWEnKTsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHZhbHVlLCAkcHJvcGVydHlOYW1lKSkgewpjb250aW51ZTsKfQoKJHNjaGVtYUNvbnN0cmFpbnQtPmNoZWNrKCR2YWx1ZS0+eyRwcm9wZXJ0eU5hbWV9LCAkcHJvcGVydHlTY2hlbWEsICRwYXRoLCAkaSk7CmlmICgkc2NoZW1hQ29uc3RyYWludC0+aXNWYWxpZCgpKSB7CmNvbnRpbnVlOwp9CgokdGhpcy0+YWRkRXJyb3JzKCRzY2hlbWFDb25zdHJhaW50LT5nZXRFcnJvcnMoKSk7Cn0KfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA2OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKY2xhc3MgUHJvcGVydGllc05hbWVzQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewp1c2UgRXJyb3JCYWdQcm94eTsKCgpwcml2YXRlICRmYWN0b3J5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+ZmFjdG9yeSA9ICRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCk7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJHRoaXMtPmZhY3RvcnkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAncHJvcGVydHlOYW1lcycpKSB7CnJldHVybjsKfQoKaWYgKCFpc19vYmplY3QoJHZhbHVlKSkgewpyZXR1cm47Cn0KaWYgKCRzY2hlbWEtPnByb3BlcnR5TmFtZXMgPT09IHRydWUpIHsKcmV0dXJuOwp9CgokcHJvcGVydHlOYW1lcyA9IGdldF9vYmplY3RfdmFycygkdmFsdWUpOwoKaWYgKCRzY2hlbWEtPnByb3BlcnR5TmFtZXMgPT09IGZhbHNlKSB7CmZvcmVhY2ggKCRwcm9wZXJ0eU5hbWVzIGFzICRwcm9wZXJ0eU5hbWUgPT4gJF8pIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6UFJPUEVSVFlfTkFNRVMoKSwgJHBhdGgsIFsncHJvcGVydHlOYW1lcycgPT4gJHNjaGVtYS0+cHJvcGVydHlOYW1lcywgJ3Zpb2xhdGluZycgPT4gJ2ZhbHNlJywgJ25hbWUnID0+ICRwcm9wZXJ0eU5hbWVdKTsKfQoKcmV0dXJuOwp9CgppZiAocHJvcGVydHlfZXhpc3RzKCRzY2hlbWEtPnByb3BlcnR5TmFtZXMsICdtYXhMZW5ndGgnKSkgewpmb3JlYWNoICgkcHJvcGVydHlOYW1lcyBhcyAkcHJvcGVydHlOYW1lID0+ICRfKSB7CiRsZW5ndGggPSBtYl9zdHJsZW4oJHByb3BlcnR5TmFtZSk7CmlmICgkbGVuZ3RoID4gJHNjaGVtYS0+cHJvcGVydHlOYW1lcy0+bWF4TGVuZ3RoKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OlBST1BFUlRZX05BTUVTKCksICRwYXRoLCBbJ3Byb3BlcnR5TmFtZXMnID0+ICRzY2hlbWEtPnByb3BlcnR5TmFtZXMsICd2aW9sYXRpbmcnID0+ICdtYXhMZW5ndGgnLCAnbGVuZ3RoJyA9PiAkbGVuZ3RoLCAnbmFtZScgPT4gJHByb3BlcnR5TmFtZV0pOwp9Cn0KfQoKaWYgKHByb3BlcnR5X2V4aXN0cygkc2NoZW1hLT5wcm9wZXJ0eU5hbWVzLCAncGF0dGVybicpKSB7CmZvcmVhY2ggKCRwcm9wZXJ0eU5hbWVzIGFzICRwcm9wZXJ0eU5hbWUgPT4gJF8pIHsKaWYgKCFwcmVnX21hdGNoKCcvJyAuIHN0cl9yZXBsYWNlKCcvJywgJ1wvJywgJHNjaGVtYS0+cHJvcGVydHlOYW1lcy0+cGF0dGVybikgLiAnLycsICRwcm9wZXJ0eU5hbWUpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OlBST1BFUlRZX05BTUVTKCksICRwYXRoLCBbJ3Byb3BlcnR5TmFtZXMnID0+ICRzY2hlbWEtPnByb3BlcnR5TmFtZXMsICd2aW9sYXRpbmcnID0+ICdwYXR0ZXJuJywgJ25hbWUnID0+ICRwcm9wZXJ0eU5hbWVdKTsKfQp9Cn0KfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA2OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCmNsYXNzIFJlZkNvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgoKcHJpdmF0ZSAkZmFjdG9yeTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmZhY3RvcnkgPSAkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpOwokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCR0aGlzLT5mYWN0b3J5KTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJyRyZWYnKSkgewpyZXR1cm47Cn0KCnRyeSB7CiRyZWZTY2hlbWEgPSAkdGhpcy0+ZmFjdG9yeS0+Z2V0U2NoZW1hU3RvcmFnZSgpLT5yZXNvbHZlUmVmU2NoZW1hKCRzY2hlbWEpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CnJldHVybjsKfQoKJHNjaGVtYUNvbnN0cmFpbnQgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ3NjaGVtYScpOwokc2NoZW1hQ29uc3RyYWludC0+Y2hlY2soJHZhbHVlLCAkcmVmU2NoZW1hLCAkcGF0aCwgJGkpOwoKaWYgKCRzY2hlbWFDb25zdHJhaW50LT5pc1ZhbGlkKCkpIHsKcmV0dXJuOwp9CgokdGhpcy0+YWRkRXJyb3JzKCRzY2hlbWFDb25zdHJhaW50LT5nZXRFcnJvcnMoKSk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNjsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRmFjdG9yeTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCmNsYXNzIFJlcXVpcmVkQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewp1c2UgRXJyb3JCYWdQcm94eTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpKTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ3JlcXVpcmVkJykpIHsKcmV0dXJuOwp9CgppZiAoIWlzX29iamVjdCgkdmFsdWUpKSB7CnJldHVybjsKfQoKZm9yZWFjaCAoJHNjaGVtYS0+cmVxdWlyZWQgYXMgJHJlcXVpcmVkKSB7CmlmIChwcm9wZXJ0eV9leGlzdHMoJHZhbHVlLCAkcmVxdWlyZWQpKSB7CmNvbnRpbnVlOwp9CgokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpSRVFVSVJFRCgpLCAkdGhpcy0+aW5jcmVtZW50UGF0aCgkcGF0aCwgJHJlcXVpcmVkKSwgWydwcm9wZXJ0eScgPT4gJHJlcXVpcmVkXSk7Cn0KfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpbmNyZW1lbnRQYXRoKD9Kc29uUG9pbnRlciAkcGF0aCwgJGkpOiBKc29uUG9pbnRlcgp7CiRwYXRoID0gJHBhdGggPz8gbmV3IEpzb25Qb2ludGVyKCcnKTsKCmlmICgkaSA9PT0gbnVsbCB8fCAkaSA9PT0gJycpIHsKcmV0dXJuICRwYXRoOwp9CgpyZXR1cm4gJHBhdGgtPndpdGhQcm9wZXJ0eVBhdGhzKGFycmF5X21lcmdlKCRwYXRoLT5nZXRQcm9wZXJ0eVBhdGhzKCksIFskaV0pKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA2OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xGYWN0b3J5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKY2xhc3MgVHlwZUNvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICd0eXBlJykpIHsKcmV0dXJuOwp9Cgokc2NoZW1hVHlwZXMgPSAoYXJyYXkpICRzY2hlbWEtPnR5cGU7CiR2YWx1ZVR5cGUgPSBzdHJ0b2xvd2VyKGdldHR5cGUoJHZhbHVlKSk7CgokdmFsdWVJc051bWJlciA9ICR2YWx1ZVR5cGUgPT09ICdkb3VibGUnIHx8ICR2YWx1ZVR5cGUgPT09ICdpbnRlZ2VyJzsKCiRpc0ludGVnZXIgPSAkdmFsdWVJc051bWJlciAmJiBmbW9kKCR2YWx1ZSwgMS4wKSA9PT0gMC4wOwoKZm9yZWFjaCAoJHNjaGVtYVR5cGVzIGFzICR0eXBlKSB7CmlmICgkdmFsdWVUeXBlID09PSAkdHlwZSkgewpyZXR1cm47Cn0KCmlmICgkdHlwZSA9PT0gJ251bWJlcicgJiYgJHZhbHVlSXNOdW1iZXIpIHsKcmV0dXJuOwp9CmlmICgkdHlwZSA9PT0gJ2ludGVnZXInICYmICRpc0ludGVnZXIpIHsKcmV0dXJuOwp9Cn0KCiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OlRZUEUoKSwgJHBhdGgsIFsnZm91bmQnID0+ICR2YWx1ZVR5cGUsICdleHBlY3RlZCcgPT4gaW1wbG9kZSgnLCAnLCAkc2NoZW1hVHlwZXMpXSk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNjsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRmFjdG9yeTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKdXNlIEpzb25TY2hlbWFcVG9vbFxEZWVwQ29tcGFyZXI7CgpjbGFzcyBVbmlxdWVJdGVtc0NvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICd1bmlxdWVJdGVtcycpKSB7CnJldHVybjsKfQppZiAoIWlzX2FycmF5KCR2YWx1ZSkpIHsKcmV0dXJuOwp9CgppZiAoJHNjaGVtYS0+dW5pcXVlSXRlbXMgIT09IHRydWUpIHsKCnJldHVybjsKfQoKJGNvdW50ID0gY291bnQoJHZhbHVlKTsKZm9yICgkeCA9IDA7ICR4IDwgJGNvdW50IC0gMTsgJHgrKykgewpmb3IgKCR5ID0gJHggKyAxOyAkeSA8ICRjb3VudDsgJHkrKykgewppZiAoRGVlcENvbXBhcmVyOjppc0VxdWFsKCR2YWx1ZVskeF0sICR2YWx1ZVskeV0pKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OlVOSVFVRV9JVEVNUygpLCAkcGF0aCk7CgpyZXR1cm47Cn0KfQp9Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNzsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCmNsYXNzIEFkZGl0aW9uYWxJdGVtc0NvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgoKcHJpdmF0ZSAkZmFjdG9yeTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmZhY3RvcnkgPSAkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpOwokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCR0aGlzLT5mYWN0b3J5KTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ2FkZGl0aW9uYWxJdGVtcycpKSB7CnJldHVybjsKfQoKaWYgKCRzY2hlbWEtPmFkZGl0aW9uYWxJdGVtcyA9PT0gdHJ1ZSkgewpyZXR1cm47Cn0KaWYgKCRzY2hlbWEtPmFkZGl0aW9uYWxJdGVtcyA9PT0gZmFsc2UgJiYgIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnaXRlbXMnKSkgewpyZXR1cm47Cn0KCmlmICghaXNfYXJyYXkoJHZhbHVlKSkgewpyZXR1cm47Cn0KaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ2l0ZW1zJykpIHsKcmV0dXJuOwp9CmlmIChwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ2l0ZW1zJykgJiYgaXNfb2JqZWN0KCRzY2hlbWEtPml0ZW1zKSkgewpyZXR1cm47Cn0KCiRhZGRpdGlvbmFsSXRlbXMgPSBhcnJheV9kaWZmX2tleSgkdmFsdWUsIHByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnaXRlbXMnKSA/ICRzY2hlbWEtPml0ZW1zIDogW10pOwoKZm9yZWFjaCAoJGFkZGl0aW9uYWxJdGVtcyBhcyAkcHJvcGVydHlOYW1lID0+ICRwcm9wZXJ0eVZhbHVlKSB7CiRzY2hlbWFDb25zdHJhaW50ID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCdzY2hlbWEnKTsKJHNjaGVtYUNvbnN0cmFpbnQtPmNoZWNrKCRwcm9wZXJ0eVZhbHVlLCAkc2NoZW1hLT5hZGRpdGlvbmFsSXRlbXMsICRwYXRoLCAkaSk7CgppZiAoJHNjaGVtYUNvbnN0cmFpbnQtPmlzVmFsaWQoKSkgewpjb250aW51ZTsKfQoKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6QURESVRJT05BTF9JVEVNUygpLCAkcGF0aCwgWydpdGVtJyA9PiAkaSwgJ3Byb3BlcnR5JyA9PiAkcHJvcGVydHlOYW1lLCAnYWRkaXRpb25hbEl0ZW1zJyA9PiAkc2NoZW1hLT5hZGRpdGlvbmFsSXRlbXNdKTsKfQp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDc7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBBZGRpdGlvbmFsUHJvcGVydGllc0NvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgoKcHJpdmF0ZSAkZmFjdG9yeTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmZhY3RvcnkgPSAkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpOwokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCR0aGlzLT5mYWN0b3J5KTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ2FkZGl0aW9uYWxQcm9wZXJ0aWVzJykpIHsKcmV0dXJuOwp9CgppZiAoJHNjaGVtYS0+YWRkaXRpb25hbFByb3BlcnRpZXMgPT09IHRydWUpIHsKcmV0dXJuOwp9CgppZiAoIWlzX29iamVjdCgkdmFsdWUpKSB7CnJldHVybjsKfQoKJGFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gZ2V0X29iamVjdF92YXJzKCR2YWx1ZSk7CgppZiAoaXNzZXQoJHNjaGVtYS0+cHJvcGVydGllcykpIHsKJGFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gYXJyYXlfZGlmZl9rZXkoJGFkZGl0aW9uYWxQcm9wZXJ0aWVzLCAoYXJyYXkpICRzY2hlbWEtPnByb3BlcnRpZXMpOwp9CgppZiAoaXNzZXQoJHNjaGVtYS0+cGF0dGVyblByb3BlcnRpZXMpKSB7CiRwYXR0ZXJucyA9IGFycmF5X2tleXMoZ2V0X29iamVjdF92YXJzKCRzY2hlbWEtPnBhdHRlcm5Qcm9wZXJ0aWVzKSk7Cgpmb3JlYWNoICgkYWRkaXRpb25hbFByb3BlcnRpZXMgYXMgJGtleSA9PiAkXykgewpmb3JlYWNoICgkcGF0dGVybnMgYXMgJHBhdHRlcm4pIHsKaWYgKHByZWdfbWF0Y2goJHRoaXMtPmNyZWF0ZVByZWdNYXRjaFBhdHRlcm4oJHBhdHRlcm4pLCAoc3RyaW5nKSAka2V5KSkgewp1bnNldCgkYWRkaXRpb25hbFByb3BlcnRpZXNbJGtleV0pOwpicmVhazsKfQp9Cn0KfQoKaWYgKGlzX29iamVjdCgkc2NoZW1hLT5hZGRpdGlvbmFsUHJvcGVydGllcykpIHsKZm9yZWFjaCAoJGFkZGl0aW9uYWxQcm9wZXJ0aWVzIGFzICRrZXkgPT4gJGFkZGl0aW9uYWxQcm9wZXJ0aWVzVmFsdWUpIHsKJHNjaGVtYUNvbnN0cmFpbnQgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ3NjaGVtYScpOwokc2NoZW1hQ29uc3RyYWludC0+Y2hlY2soJGFkZGl0aW9uYWxQcm9wZXJ0aWVzVmFsdWUsICRzY2hlbWEtPmFkZGl0aW9uYWxQcm9wZXJ0aWVzLCAkcGF0aCwgJGkpOyAKaWYgKCRzY2hlbWFDb25zdHJhaW50LT5pc1ZhbGlkKCkpIHsKdW5zZXQoJGFkZGl0aW9uYWxQcm9wZXJ0aWVzWyRrZXldKTsKfQp9Cn0KCmZvcmVhY2ggKCRhZGRpdGlvbmFsUHJvcGVydGllcyBhcyAka2V5ID0+ICRhZGRpdGlvbmFsUHJvcGVydGllc1ZhbHVlKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkFERElUSU9OQUxfUFJPUEVSVElFUygpLCAkcGF0aCwgWydmb3VuZCcgPT4gJGFkZGl0aW9uYWxQcm9wZXJ0aWVzVmFsdWVdKTsKfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZVByZWdNYXRjaFBhdHRlcm4oc3RyaW5nICRwYXR0ZXJuKTogc3RyaW5nCnsKJHJlcGxhY2VtZW50cyA9IFsKCgonXHB7ZGlnaXR9JyA9PiAnXHB7TmR9JywKCgoKJ1xwe0xldHRlcn0nID0+ICdccHtMfScsIApdOwoKJHBhdHRlcm4gPSBzdHJfcmVwbGFjZSgKYXJyYXlfa2V5cygkcmVwbGFjZW1lbnRzKSwKYXJyYXlfdmFsdWVzKCRyZXBsYWNlbWVudHMpLAokcGF0dGVybgopOwoKcmV0dXJuICcvJyAuIHN0cl9yZXBsYWNlKCcvJywgJ1wvJywgJHBhdHRlcm4pIC4gJy91JzsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA3OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKY2xhc3MgQWxsT2ZDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKCnByaXZhdGUgJGZhY3Rvcnk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5mYWN0b3J5ID0gJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKTsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkdGhpcy0+ZmFjdG9yeSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdhbGxPZicpKSB7CnJldHVybjsKfQoKZm9yZWFjaCAoJHNjaGVtYS0+YWxsT2YgYXMgJGFsbE9mU2NoZW1hKSB7CiRzY2hlbWFDb25zdHJhaW50ID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCdzY2hlbWEnKTsKJHNjaGVtYUNvbnN0cmFpbnQtPmNoZWNrKCR2YWx1ZSwgJGFsbE9mU2NoZW1hLCAkcGF0aCwgJGkpOwoKaWYgKCRzY2hlbWFDb25zdHJhaW50LT5pc1ZhbGlkKCkpIHsKY29udGludWU7Cn0KJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6QUxMX09GKCksICRwYXRoKTsKJHRoaXMtPmFkZEVycm9ycygkc2NoZW1hQ29uc3RyYWludC0+Z2V0RXJyb3JzKCkpOwp9Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNzsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXFZhbGlkYXRpb25FeGNlcHRpb247CgpjbGFzcyBBbnlPZkNvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgoKcHJpdmF0ZSAkZmFjdG9yeTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmZhY3RvcnkgPSAkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpOwokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCR0aGlzLT5mYWN0b3J5KTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ2FueU9mJykpIHsKcmV0dXJuOwp9Cgpmb3JlYWNoICgkc2NoZW1hLT5hbnlPZiBhcyAkYW55T2ZTY2hlbWEpIHsKJHNjaGVtYUNvbnN0cmFpbnQgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ3NjaGVtYScpOwoKdHJ5IHsKJHNjaGVtYUNvbnN0cmFpbnQtPmNoZWNrKCR2YWx1ZSwgJGFueU9mU2NoZW1hLCAkcGF0aCwgJGkpOwoKaWYgKCRzY2hlbWFDb25zdHJhaW50LT5pc1ZhbGlkKCkpIHsKJHRoaXMtPmVycm9yQmFnKCktPnJlc2V0KCk7CgpyZXR1cm47Cn0KCiR0aGlzLT5hZGRFcnJvcnMoJHNjaGVtYUNvbnN0cmFpbnQtPmdldEVycm9ycygpKTsKfSBjYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiAkZSkgewp9Cn0KCiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkFOWV9PRigpLCAkcGF0aCk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNzsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRmFjdG9yeTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKdXNlIEpzb25TY2hlbWFcVG9vbFxEZWVwQ29tcGFyZXI7CgpjbGFzcyBDb25zdENvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdjb25zdCcpKSB7CnJldHVybjsKfQoKaWYgKERlZXBDb21wYXJlcjo6aXNFcXVhbCgkdmFsdWUsICRzY2hlbWEtPmNvbnN0KSkgewpyZXR1cm47Cn0KCiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkNPTlNUQU5UKCksICRwYXRoLCBbJ2NvbnN0JyA9PiAkc2NoZW1hLT5jb25zdF0pOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDc7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBDb250YWluc0NvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgoKcHJpdmF0ZSAkZmFjdG9yeTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmZhY3RvcnkgPSAkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpOwokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCR0aGlzLT5mYWN0b3J5KTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ2NvbnRhaW5zJykpIHsKcmV0dXJuOwp9CgokcHJvcGVydGllcyA9IFtdOwppZiAoIWlzX2FycmF5KCR2YWx1ZSkpIHsKcmV0dXJuOwp9Cgpmb3JlYWNoICgkdmFsdWUgYXMgJHByb3BlcnR5TmFtZSA9PiAkcHJvcGVydHlWYWx1ZSkgewokc2NoZW1hQ29uc3RyYWludCA9ICR0aGlzLT5mYWN0b3J5LT5jcmVhdGVJbnN0YW5jZUZvcignc2NoZW1hJyk7Cgokc2NoZW1hQ29uc3RyYWludC0+Y2hlY2soJHByb3BlcnR5VmFsdWUsICRzY2hlbWEtPmNvbnRhaW5zLCAkcGF0aCwgJGkpOwppZiAoJHNjaGVtYUNvbnN0cmFpbnQtPmlzVmFsaWQoKSkgewpyZXR1cm47Cn0KfQoKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Q09OVEFJTlMoKSwgJHBhdGgsIFsnY29udGFpbnMnID0+ICRzY2hlbWEtPmNvbnRhaW5zXSk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNzsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRmFjdG9yeTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCmNsYXNzIENvbnRlbnRDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnY29udGVudE1lZGlhVHlwZScpICYmICFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ2NvbnRlbnRFbmNvZGluZycpKSB7CnJldHVybjsKfQppZiAoIWlzX3N0cmluZygkdmFsdWUpKSB7CnJldHVybjsKfQoKJGRlY29kZWRWYWx1ZSA9ICR2YWx1ZTsKCmlmIChwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ2NvbnRlbnRFbmNvZGluZycpKSB7CmlmICgkc2NoZW1hLT5jb250ZW50RW5jb2RpbmcgPT09ICdiYXNlNjQnKSB7CmlmICghcHJlZ19tYXRjaCgnL15bQS1aYS16MC05K1wvPV0rJC8nLCAkZGVjb2RlZFZhbHVlKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpDT05URU5UX0VOQ09ESU5HKCksICRwYXRoLCBbJ2NvbnRlbnRFbmNvZGluZycgPT4gJHNjaGVtYS0+Y29udGVudEVuY29kaW5nXSk7CgpyZXR1cm47Cn0KJGRlY29kZWRWYWx1ZSA9IGJhc2U2NF9kZWNvZGUoJGRlY29kZWRWYWx1ZSk7Cn0KfQoKaWYgKHByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnY29udGVudE1lZGlhVHlwZScpKSB7CmlmICgkc2NoZW1hLT5jb250ZW50TWVkaWFUeXBlID09PSAnYXBwbGljYXRpb24vanNvbicpIHsKanNvbl9kZWNvZGUoJGRlY29kZWRWYWx1ZSwgZmFsc2UpOwppZiAoanNvbl9sYXN0X2Vycm9yKCkgPT09IEpTT05fRVJST1JfTk9ORSkgewpyZXR1cm47Cn0KfQoKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Q09OVEVOVF9NRURJQV9UWVBFKCksICRwYXRoLCBbJ2NvbnRlbnRNZWRpYVR5cGUnID0+ICRzY2hlbWEtPmNvbnRlbnRNZWRpYVR5cGVdKTsKfQp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDc7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBEZXBlbmRlbmNpZXNDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKCnByaXZhdGUgJGZhY3Rvcnk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5mYWN0b3J5ID0gJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKTsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkdGhpcy0+ZmFjdG9yeSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdkZXBlbmRlbmNpZXMnKSkgewpyZXR1cm47Cn0KCmlmICghaXNfb2JqZWN0KCR2YWx1ZSkpIHsKcmV0dXJuOwp9Cgpmb3JlYWNoICgkc2NoZW1hLT5kZXBlbmRlbmNpZXMgYXMgJGRlcGVuZGFudCA9PiAkZGVwZW5kZW5jaWVzKSB7CmlmICghcHJvcGVydHlfZXhpc3RzKCR2YWx1ZSwgJGRlcGVuZGFudCkpIHsKY29udGludWU7Cn0KaWYgKCRkZXBlbmRlbmNpZXMgPT09IHRydWUpIHsKY29udGludWU7Cn0KaWYgKCRkZXBlbmRlbmNpZXMgPT09IGZhbHNlKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZBTFNFKCksICRwYXRoLCBbJ2RlcGVuZGFudCcgPT4gJGRlcGVuZGFudF0pOwpjb250aW51ZTsKfQoKaWYgKGlzX2FycmF5KCRkZXBlbmRlbmNpZXMpKSB7CmZvcmVhY2ggKCRkZXBlbmRlbmNpZXMgYXMgJGRlcGVuZGVuY3kpIHsKaWYgKHByb3BlcnR5X2V4aXN0cygkdmFsdWUsICRkZXBlbmRhbnQpICYmICFwcm9wZXJ0eV9leGlzdHMoJHZhbHVlLCAkZGVwZW5kZW5jeSkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6REVQRU5ERU5DSUVTKCksICRwYXRoLCBbJ2RlcGVuZGFudCcgPT4gJGRlcGVuZGFudCwgJ2RlcGVuZGVuY3knID0+ICRkZXBlbmRlbmN5XSk7Cn0KfQp9CgppZiAoaXNfb2JqZWN0KCRkZXBlbmRlbmNpZXMpKSB7CiRzY2hlbWFDb25zdHJhaW50ID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCdzY2hlbWEnKTsKJHNjaGVtYUNvbnN0cmFpbnQtPmNoZWNrKCR2YWx1ZSwgJGRlcGVuZGVuY2llcywgJHBhdGgsICRpKTsKaWYgKCEkc2NoZW1hQ29uc3RyYWludC0+aXNWYWxpZCgpKSB7CiR0aGlzLT5hZGRFcnJvcnMoJHNjaGVtYUNvbnN0cmFpbnQtPmdldEVycm9ycygpKTsKfQp9Cn0KfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA3OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CnVzZSBKc29uU2NoZW1hXFNjaGVtYVN0b3JhZ2U7CnVzZSBKc29uU2NoZW1hXFVyaVxVcmlSZXRyaWV2ZXI7CgpjbGFzcyBEcmFmdDA3Q29uc3RyYWludCBleHRlbmRzIENvbnN0cmFpbnQKewpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP1xKc29uU2NoZW1hXENvbnN0cmFpbnRzXEZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QobmV3IEZhY3RvcnkoCiRmYWN0b3J5ID8gJGZhY3RvcnktPmdldFNjaGVtYVN0b3JhZ2UoKSA6IG5ldyBTY2hlbWFTdG9yYWdlKCksCiRmYWN0b3J5ID8gJGZhY3RvcnktPmdldFVyaVJldHJpZXZlcigpIDogbmV3IFVyaVJldHJpZXZlcigpLAokZmFjdG9yeSA/ICRmYWN0b3J5LT5nZXRDb25maWcoKSA6IENvbnN0cmFpbnQ6OkNIRUNLX01PREVfTk9STUFMCikpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoaXNfYm9vbCgkc2NoZW1hKSkgewppZiAoJHNjaGVtYSA9PT0gZmFsc2UpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6RkFMU0UoKSwgJHBhdGgsIFtdKTsKfQoKcmV0dXJuOwp9CgoKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgncmVmJywgJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwokdGhpcy0+Y2hlY2tGb3JLZXl3b3JkKCdyZXF1aXJlZCcsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnY29udGFpbnMnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ3Byb3BlcnRpZXMnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ3Byb3BlcnR5TmFtZXMnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ3BhdHRlcm5Qcm9wZXJ0aWVzJywgJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwokdGhpcy0+Y2hlY2tGb3JLZXl3b3JkKCd0eXBlJywgJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwokdGhpcy0+Y2hlY2tGb3JLZXl3b3JkKCdub3QnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ2RlcGVuZGVuY2llcycsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnYWxsT2YnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ2FueU9mJywgJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwokdGhpcy0+Y2hlY2tGb3JLZXl3b3JkKCdvbmVPZicsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnaWZUaGVuRWxzZScsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKCiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ2FkZGl0aW9uYWxQcm9wZXJ0aWVzJywgJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwokdGhpcy0+Y2hlY2tGb3JLZXl3b3JkKCdpdGVtcycsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnYWRkaXRpb25hbEl0ZW1zJywgJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwokdGhpcy0+Y2hlY2tGb3JLZXl3b3JkKCd1bmlxdWVJdGVtcycsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnbWluSXRlbXMnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ21pblByb3BlcnRpZXMnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ21heFByb3BlcnRpZXMnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ21pbmltdW0nLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ21heGltdW0nLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ21pbkxlbmd0aCcsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnZXhjbHVzaXZlTWluaW11bScsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnbWF4SXRlbXMnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ21heExlbmd0aCcsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnZXhjbHVzaXZlTWF4aW11bScsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnZW51bScsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnY29uc3QnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ211bHRpcGxlT2YnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ2Zvcm1hdCcsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgncGF0dGVybicsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnY29udGVudCcsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2hlY2tGb3JLZXl3b3JkKHN0cmluZyAka2V5d29yZCwgJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CiR2YWxpZGF0b3IgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJGtleXdvcmQpOwokdmFsaWRhdG9yLT5jaGVjaygkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CgokdGhpcy0+YWRkRXJyb3JzKCR2YWxpZGF0b3ItPmdldEVycm9ycygpKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA3OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xGYWN0b3J5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwp1c2UgSnNvblNjaGVtYVxUb29sXERlZXBDb21wYXJlcjsKCmNsYXNzIEVudW1Db25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnZW51bScpKSB7CnJldHVybjsKfQoKZm9yZWFjaCAoJHNjaGVtYS0+ZW51bSBhcyAkZW51bUNhc2UpIHsKaWYgKERlZXBDb21wYXJlcjo6aXNFcXVhbCgkdmFsdWUsICRlbnVtQ2FzZSkpIHsKcmV0dXJuOwp9CgppZiAoaXNfbnVtZXJpYygkdmFsdWUpICYmIGlzX251bWVyaWMoJGVudW1DYXNlKSAmJiBEZWVwQ29tcGFyZXI6OmlzRXF1YWwoKGZsb2F0KSAkdmFsdWUsIChmbG9hdCkgJGVudW1DYXNlKSkgewpyZXR1cm47Cn0KfQoKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6RU5VTSgpLCAkcGF0aCwgWydlbnVtJyA9PiAkc2NoZW1hLT5lbnVtXSk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNzsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRmFjdG9yeTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCmNsYXNzIEV4Y2x1c2l2ZU1heGltdW1Db25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnZXhjbHVzaXZlTWF4aW11bScpKSB7CnJldHVybjsKfQoKaWYgKCFpc19udW1lcmljKCR2YWx1ZSkpIHsKcmV0dXJuOwp9CgppZiAoJHZhbHVlIDwgJHNjaGVtYS0+ZXhjbHVzaXZlTWF4aW11bSkgewpyZXR1cm47Cn0KCiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkVYQ0xVU0lWRV9NQVhJTVVNKCksICRwYXRoLCBbJ2V4Y2x1c2l2ZU1heGltdW0nID0+ICRzY2hlbWEtPmV4Y2x1c2l2ZU1heGltdW0sICdmb3VuZCcgPT4gJHZhbHVlXSk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNzsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRmFjdG9yeTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCmNsYXNzIEV4Y2x1c2l2ZU1pbmltdW1Db25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnZXhjbHVzaXZlTWluaW11bScpKSB7CnJldHVybjsKfQoKaWYgKCFpc19udW1lcmljKCR2YWx1ZSkpIHsKcmV0dXJuOwp9CgppZiAoJHZhbHVlID4gJHNjaGVtYS0+ZXhjbHVzaXZlTWluaW11bSkgewpyZXR1cm47Cn0KCiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkVYQ0xVU0lWRV9NSU5JTVVNKCksICRwYXRoLCBbJ2V4Y2x1c2l2ZU1pbmltdW0nID0+ICRzY2hlbWEtPmV4Y2x1c2l2ZU1pbmltdW0sICdmb3VuZCcgPT4gJHZhbHVlXSk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNzsKCmNsYXNzIEZhY3RvcnkgZXh0ZW5kcyBcSnNvblNjaGVtYVxDb25zdHJhaW50c1xGYWN0b3J5CnsKCgoKcHJvdGVjdGVkICRjb25zdHJhaW50TWFwID0gWwonc2NoZW1hJyA9PiBEcmFmdDA3Q29uc3RyYWludDo6Y2xhc3MsCidhZGRpdGlvbmFsUHJvcGVydGllcycgPT4gQWRkaXRpb25hbFByb3BlcnRpZXNDb25zdHJhaW50OjpjbGFzcywKJ2FkZGl0aW9uYWxJdGVtcycgPT4gQWRkaXRpb25hbEl0ZW1zQ29uc3RyYWludDo6Y2xhc3MsCidkZXBlbmRlbmNpZXMnID0+IERlcGVuZGVuY2llc0NvbnN0cmFpbnQ6OmNsYXNzLAondHlwZScgPT4gVHlwZUNvbnN0cmFpbnQ6OmNsYXNzLAonY29uc3QnID0+IENvbnN0Q29uc3RyYWludDo6Y2xhc3MsCidlbnVtJyA9PiBFbnVtQ29uc3RyYWludDo6Y2xhc3MsCid1bmlxdWVJdGVtcycgPT4gVW5pcXVlSXRlbXNDb25zdHJhaW50OjpjbGFzcywKJ21pbkl0ZW1zJyA9PiBNaW5JdGVtc0NvbnN0cmFpbnQ6OmNsYXNzLAonbWluUHJvcGVydGllcycgPT4gTWluUHJvcGVydGllc0NvbnN0cmFpbnQ6OmNsYXNzLAonbWF4UHJvcGVydGllcycgPT4gTWF4UHJvcGVydGllc0NvbnN0cmFpbnQ6OmNsYXNzLAonbWluaW11bScgPT4gTWluaW11bUNvbnN0cmFpbnQ6OmNsYXNzLAonbWF4aW11bScgPT4gTWF4aW11bUNvbnN0cmFpbnQ6OmNsYXNzLAonZXhjbHVzaXZlTWluaW11bScgPT4gRXhjbHVzaXZlTWluaW11bUNvbnN0cmFpbnQ6OmNsYXNzLAonbWluTGVuZ3RoJyA9PiBNaW5MZW5ndGhDb25zdHJhaW50OjpjbGFzcywKJ21heExlbmd0aCcgPT4gTWF4TGVuZ3RoQ29uc3RyYWludDo6Y2xhc3MsCidtYXhJdGVtcycgPT4gTWF4SXRlbXNDb25zdHJhaW50OjpjbGFzcywKJ2V4Y2x1c2l2ZU1heGltdW0nID0+IEV4Y2x1c2l2ZU1heGltdW1Db25zdHJhaW50OjpjbGFzcywKJ211bHRpcGxlT2YnID0+IE11bHRpcGxlT2ZDb25zdHJhaW50OjpjbGFzcywKJ3JlcXVpcmVkJyA9PiBSZXF1aXJlZENvbnN0cmFpbnQ6OmNsYXNzLAonZm9ybWF0JyA9PiBGb3JtYXRDb25zdHJhaW50OjpjbGFzcywKJ2FueU9mJyA9PiBBbnlPZkNvbnN0cmFpbnQ6OmNsYXNzLAonYWxsT2YnID0+IEFsbE9mQ29uc3RyYWludDo6Y2xhc3MsCidvbmVPZicgPT4gT25lT2ZDb25zdHJhaW50OjpjbGFzcywKJ25vdCcgPT4gTm90Q29uc3RyYWludDo6Y2xhc3MsCidpZlRoZW5FbHNlJyA9PiBJZlRoZW5FbHNlQ29uc3RyYWludDo6Y2xhc3MsCidjb250YWlucycgPT4gQ29udGFpbnNDb25zdHJhaW50OjpjbGFzcywKJ3Byb3BlcnR5TmFtZXMnID0+IFByb3BlcnRpZXNOYW1lc0NvbnN0cmFpbnQ6OmNsYXNzLAoncGF0dGVyblByb3BlcnRpZXMnID0+IFBhdHRlcm5Qcm9wZXJ0aWVzQ29uc3RyYWludDo6Y2xhc3MsCidwYXR0ZXJuJyA9PiBQYXR0ZXJuQ29uc3RyYWludDo6Y2xhc3MsCidwcm9wZXJ0aWVzJyA9PiBQcm9wZXJ0aWVzQ29uc3RyYWludDo6Y2xhc3MsCidpdGVtcycgPT4gSXRlbXNDb25zdHJhaW50OjpjbGFzcywKJ3JlZicgPT4gUmVmQ29uc3RyYWludDo6Y2xhc3MsCidjb250ZW50JyA9PiBDb250ZW50Q29uc3RyYWludDo6Y2xhc3MsCl07Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDc7Cgp1c2UgRGF0ZVRpbWVab25lOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXEZhY3Rvcnk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CnVzZSBKc29uU2NoZW1hXFJmYzMzMzk7CnVzZSBKc29uU2NoZW1hXFRvb2xcVmFsaWRhdG9yXFJlbGF0aXZlUmVmZXJlbmNlVmFsaWRhdG9yOwp1c2UgSnNvblNjaGVtYVxUb29sXFZhbGlkYXRvclxVcmlWYWxpZGF0b3I7CgpjbGFzcyBGb3JtYXRDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnZm9ybWF0JykpIHsKcmV0dXJuOwp9CgppZiAoIWlzX3N0cmluZygkdmFsdWUpKSB7CnJldHVybjsKfQoKc3dpdGNoICgkc2NoZW1hLT5mb3JtYXQpIHsKY2FzZSAnZGF0ZSc6CmlmICghJHRoaXMtPnZhbGlkYXRlRGF0ZVRpbWUoJHZhbHVlLCAnWS1tLWQnKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfREFURSgpLCAkcGF0aCwgWydkYXRlJyA9PiAkdmFsdWUsICdmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwpjYXNlICd0aW1lJzoKaWYgKCEkdGhpcy0+dmFsaWRhdGVEYXRlVGltZSgkdmFsdWUsICdIOmk6c3AnKSAmJiAhJHRoaXMtPnZhbGlkYXRlRGF0ZVRpbWUoJHZhbHVlLCAnSDppOnMudXAnKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfVElNRSgpLCAkcGF0aCwgWyd0aW1lJyA9PiAkdmFsdWUsICdmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwpjYXNlICdkYXRlLXRpbWUnOgppZiAoISR0aGlzLT52YWxpZGF0ZVJmYzMzMzlEYXRlVGltZSgkdmFsdWUpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9EQVRFX1RJTUUoKSwgJHBhdGgsIFsnZGF0ZVRpbWUnID0+ICR2YWx1ZSwgJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0XSk7Cn0KYnJlYWs7CmNhc2UgJ3V0Yy1taWxsaXNlYyc6CmlmICghJHRoaXMtPnZhbGlkYXRlRGF0ZVRpbWUoJHZhbHVlLCAnVScpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9EQVRFX1VUQygpLCAkcGF0aCwgWyd2YWx1ZScgPT4gJHZhbHVlLCAnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXRdKTsKfQpicmVhazsKY2FzZSAncmVnZXgnOgppZiAoISR0aGlzLT52YWxpZGF0ZVJlZ2V4KCR2YWx1ZSkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX1JFR0VYKCksICRwYXRoLCBbJ3ZhbHVlJyA9PiAkdmFsdWUsICdmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwpjYXNlICdpcC1hZGRyZXNzJzoKY2FzZSAnaXB2NCc6CmlmIChmaWx0ZXJfdmFyKCR2YWx1ZSwgRklMVEVSX1ZBTElEQVRFX0lQLCBGSUxURVJfTlVMTF9PTl9GQUlMVVJFIHwgRklMVEVSX0ZMQUdfSVBWNCkgPT09IG51bGwpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX0lQKCksICRwYXRoLCBbJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0XSk7Cn0KYnJlYWs7CmNhc2UgJ2lwdjYnOgppZiAoZmlsdGVyX3ZhcigkdmFsdWUsIEZJTFRFUl9WQUxJREFURV9JUCwgRklMVEVSX05VTExfT05fRkFJTFVSRSB8IEZJTFRFUl9GTEFHX0lQVjYpID09PSBudWxsKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9JUCgpLCAkcGF0aCwgWydmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwpjYXNlICdjb2xvcic6CmlmICghJHRoaXMtPnZhbGlkYXRlQ29sb3IoJHZhbHVlKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfQ09MT1IoKSwgJHBhdGgsIFsnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXRdKTsKfQpicmVhazsKY2FzZSAnc3R5bGUnOgppZiAoISR0aGlzLT52YWxpZGF0ZVN0eWxlKCR2YWx1ZSkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX1NUWUxFKCksICRwYXRoLCBbJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0XSk7Cn0KYnJlYWs7CmNhc2UgJ3Bob25lJzoKaWYgKCEkdGhpcy0+dmFsaWRhdGVQaG9uZSgkdmFsdWUpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9QSE9ORSgpLCAkcGF0aCwgWydmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwpjYXNlICd1cmknOgppZiAoIVVyaVZhbGlkYXRvcjo6aXNWYWxpZCgkdmFsdWUpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9VUkwoKSwgJHBhdGgsIFsnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXRdKTsKfQpicmVhazsKCmNhc2UgJ3VyaXJlZic6CmNhc2UgJ3VyaS1yZWZlcmVuY2UnOgppZiAoIShVcmlWYWxpZGF0b3I6OmlzVmFsaWQoJHZhbHVlKSB8fCBSZWxhdGl2ZVJlZmVyZW5jZVZhbGlkYXRvcjo6aXNWYWxpZCgkdmFsdWUpKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfVVJMKCksICRwYXRoLCBbJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0XSk7Cn0KYnJlYWs7CmNhc2UgJ3VyaS10ZW1wbGF0ZSc6CmlmICghJHRoaXMtPnZhbGlkYXRlVXJpVGVtcGxhdGUoJHZhbHVlKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfVVJJX1RFTVBMQVRFKCksICRwYXRoLCBbJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0XSk7Cn0KYnJlYWs7CgpjYXNlICdlbWFpbCc6CmlmIChmaWx0ZXJfdmFyKCR2YWx1ZSwgRklMVEVSX1ZBTElEQVRFX0VNQUlMLCBGSUxURVJfTlVMTF9PTl9GQUlMVVJFIHwgRklMVEVSX0ZMQUdfRU1BSUxfVU5JQ09ERSkgPT09IG51bGwpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX0VNQUlMKCksICRwYXRoLCBbJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0XSk7Cn0KYnJlYWs7CmNhc2UgJ2hvc3QtbmFtZSc6CmNhc2UgJ2hvc3RuYW1lJzoKaWYgKCEkdGhpcy0+dmFsaWRhdGVIb3N0bmFtZSgkdmFsdWUpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9IT1NUTkFNRSgpLCAkcGF0aCwgWydmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwpjYXNlICdpZG4taG9zdG5hbWUnOgppZiAoISR0aGlzLT52YWxpZGF0ZUludGVybmF0aW9uYWxpemVkSG9zdG5hbWUoJHZhbHVlKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfSE9TVE5BTUUoKSwgJHBhdGgsIFsnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXRdKTsKfQpicmVhazsKY2FzZSAnanNvbi1wb2ludGVyJzoKaWYgKCEkdGhpcy0+dmFsaWRhdGVKc29uUG9pbnRlcigkdmFsdWUpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9KU09OX1BPSU5URVIoKSwgJHBhdGgsIFsnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXRdKTsKfQpicmVhazsKZGVmYXVsdDoKYnJlYWs7Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZURhdGVUaW1lKHN0cmluZyAkZGF0ZXRpbWUsIHN0cmluZyAkZm9ybWF0KTogYm9vbAp7CiRkYXRldGltZSA9IHN0cnRvdXBwZXIoJGRhdGV0aW1lKTsgCiRpc0xlYXAgPSBzdWJzdHIoJGRhdGV0aW1lLCA2LCAyKSA9PT0gJzYwJzsKJGlucHV0ID0gJGRhdGV0aW1lOwoKCmlmICgkaXNMZWFwKSB7CiRpbnB1dCA9IHNwcmludGYoJyVzNTklcycsIHN1YnN0cigkZGF0ZXRpbWUsIDAsIDYpLCBzdWJzdHIoJGRhdGV0aW1lLCA4KSk7Cn0KCiRkdCA9IFxEYXRlVGltZUltbXV0YWJsZTo6Y3JlYXRlRnJvbUZvcm1hdCgkZm9ybWF0LCAkaW5wdXQpOwppZiAoISRkdCkgewpyZXR1cm4gZmFsc2U7Cn0KCgokdGltZXpvbmVPZmZzZXQgPSAkZHQtPmdldFRpbWV6b25lKCktPmdldE9mZnNldCgkZHQpOwppZiAoJHRpbWV6b25lT2Zmc2V0ID49IDg2NDAwIHx8ICR0aW1lem9uZU9mZnNldCA8PSAtODY0MDApIHsKcmV0dXJuIGZhbHNlOwp9CgokZXhwZWN0ZWQgPSAkZHQtPmZvcm1hdCgkZm9ybWF0KTsKCmlmICgkZm9ybWF0ID09PSAnSDppOnMudXAnKSB7CiRleHBlY3RlZCA9IHNwcmludGYoCiclcyVzJywKcnRyaW0oJGR0LT5mb3JtYXQoJ0g6aTpzLnUnKSwgJzAnKSwKJGR0LT5mb3JtYXQoJ3AnKQopOwp9CgppZiAoJGlzTGVhcCkgewoKJHV0Y0RUID0gJGR0LT5zZXRUaW1lem9uZShuZXcgRGF0ZVRpbWVab25lKCdVVEMnKSk7CmlmICgkdXRjRFQtPmZvcm1hdCgnSDppOnMnKSAhPT0gJzIzOjU5OjU5JykgewpyZXR1cm4gZmFsc2U7Cn0KCiRleHBlY3RlZCA9IHNwcmludGYoJyVzNjAlcycsIHN1YnN0cigkZXhwZWN0ZWQsIDAsIDYpLCBzdWJzdHIoJGV4cGVjdGVkLCA4KSk7Cn0KCnJldHVybiAkZGF0ZXRpbWUgPT09ICRleHBlY3RlZDsKfQoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZVJlZ2V4KHN0cmluZyAkcmVnZXgpOiBib29sCnsKcmV0dXJuIHByZWdfbWF0Y2goc2VsZjo6anNvblBhdHRlcm5Ub1BocFJlZ2V4KCRyZWdleCksICcnKSAhPT0gZmFsc2U7Cn0KCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGpzb25QYXR0ZXJuVG9QaHBSZWdleChzdHJpbmcgJHBhdHRlcm4pOiBzdHJpbmcKewpyZXR1cm4gJ34nIC4gc3RyX3JlcGxhY2UoJ34nLCAnXFx+JywgJHBhdHRlcm4pIC4gJ351JzsKfQoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZUNvbG9yKHN0cmluZyAkY29sb3IpOiBib29sCnsKaWYgKGluX2FycmF5KHN0cnRvbG93ZXIoJGNvbG9yKSwgWydhcXVhJywgJ2JsYWNrJywgJ2JsdWUnLCAnZnVjaHNpYScsCidncmF5JywgJ2dyZWVuJywgJ2xpbWUnLCAnbWFyb29uJywgJ25hdnknLCAnb2xpdmUnLCAnb3JhbmdlJywgJ3B1cnBsZScsCidyZWQnLCAnc2lsdmVyJywgJ3RlYWwnLCAnd2hpdGUnLCAneWVsbG93J10pKSB7CnJldHVybiB0cnVlOwp9CgpyZXR1cm4gcHJlZ19tYXRjaCgnL14jKFthLWYwLTldezN9fFthLWYwLTldezZ9KSQvaScsICRjb2xvcikgIT09IGZhbHNlOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHZhbGlkYXRlU3R5bGUoc3RyaW5nICRzdHlsZSk6IGJvb2wKewokcHJvcGVydGllcyA9IGV4cGxvZGUoJzsnLCBydHJpbSgkc3R5bGUsICc7JykpOwokaW52YWxpZEVudHJpZXMgPSBwcmVnX2dyZXAoJy9eXHMqWy1hLXpdK1xzKjpccyouKyQvaScsICRwcm9wZXJ0aWVzLCBQUkVHX0dSRVBfSU5WRVJUKTsKCnJldHVybiBlbXB0eSgkaW52YWxpZEVudHJpZXMpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHZhbGlkYXRlUGhvbmUoc3RyaW5nICRwaG9uZSk6IGJvb2wKewpyZXR1cm4gcHJlZ19tYXRjaCgnL15cKz8oXChcZHszfVwpfFxkezN9KSBcZHszfSBcZHs0fSQvJywgJHBob25lKSAhPT0gZmFsc2U7Cn0KCnByaXZhdGUgZnVuY3Rpb24gdmFsaWRhdGVIb3N0bmFtZShzdHJpbmcgJGhvc3QpOiBib29sCnsKJGhvc3RuYW1lUmVnZXggPSAnL14oPyEtKSg/IS4qP1teQS1aYS16MC05XC1cLl0pKD86KD8hLSlbQS1aYS16MC05XSg/OltBLVphLXowLTlcLV17MCw2MX1bQS1aYS16MC05XSk/XC4pKig/IS0pW0EtWmEtejAtOV0oPzpbQS1aYS16MC05XC1dezAsNjF9W0EtWmEtejAtOV0pPyQvJzsKCnJldHVybiBwcmVnX21hdGNoKCRob3N0bmFtZVJlZ2V4LCAkaG9zdCkgPT09IDE7Cn0KCnByaXZhdGUgZnVuY3Rpb24gdmFsaWRhdGVJbnRlcm5hdGlvbmFsaXplZEhvc3RuYW1lKHN0cmluZyAkaG9zdCk6IGJvb2wKewppZiAoJGhvc3QgPT09ICcnKSB7CnJldHVybiBmYWxzZTsKfQokaG9zdCA9IHJ0cmltKCRob3N0LCAnLicpOwokbGFiZWxzID0gZXhwbG9kZSgnLicsICRob3N0KTsKJGFzY2lpTGFiZWxzID0gW107CgppZiAoJGxhYmVscyA9PT0gZmFsc2UpIHsKcmV0dXJuIGZhbHNlOwp9Cgpmb3JlYWNoICgkbGFiZWxzIGFzICRsYWJlbCkgewppZiAoJGxhYmVsID09PSAnJykgewpyZXR1cm4gZmFsc2U7Cn0KCgppZiAoCgpwcmVnX21hdGNoKCcvXHh7MDM3NX0vdScsICRsYWJlbCkgJiYKIXByZWdfbWF0Y2goJy9ceHswMzc1fVtceHswMzcwfS1ceHswM0ZGfV0vdScsICRsYWJlbCkKKSB7CnJldHVybiBmYWxzZTsKfQoKCmlmIChwcmVnX21hdGNoKCcvW1x4ezA1RjN9XHh7MDVGNH1dL3UnLCAkbGFiZWwpICYmCiFwcmVnX21hdGNoKCcvW1x4ezA1OTB9LVx4ezA1RkZ9XVtceHswNUYzfVx4ezA1RjR9XS91JywgJGxhYmVsKQopIHsKcmV0dXJuIGZhbHNlOwp9CgoKaWYgKHN0cl9jb250YWlucygkbGFiZWwsICJcdXszMEZCfSIpICYmCiFwcmVnX21hdGNoKCcvW1x4ezMwQTB9LVx4ezMwRkZ9XS91JywgJGxhYmVsKQopIHsKcmV0dXJuIGZhbHNlOwp9CgoKJGhhc0FyYWJpY0luZGljID0gcHJlZ19tYXRjaCgnL1tceHswNjYwfS1ceHswNjY5fV0vdScsICRsYWJlbCk7CiRoYXNFeHRBcmFiaWNJbmRpYyA9IHByZWdfbWF0Y2goJy9bXHh7MDZGMH0tXHh7MDZGOX1dL3UnLCAkbGFiZWwpOwppZiAoJGhhc0FyYWJpY0luZGljICYmICRoYXNFeHRBcmFiaWNJbmRpYykgewpyZXR1cm4gZmFsc2U7Cn0KCgppZiAocHJlZ19tYXRjaCgnL1tceHswOTY0fVx4ezA5NjV9XS91JywgJGxhYmVsKSAmJgohcHJlZ19tYXRjaCgnL1tceHswOTAwfS1ceHswOTdGfV0vdScsICRsYWJlbCkKKSB7CnJldHVybiBmYWxzZTsKfQoKCmlmIChwcmVnX21hdGNoKCcvW1x4ezIwMEN9XHh7MjAwRH1dL3UnLCAkbGFiZWwpKSB7CnJldHVybiBmYWxzZTsKfQoKJGFzY2lpID0gaWRuX3RvX2FzY2lpKCRsYWJlbCwgSUROQV9ERUZBVUxULCBJTlRMX0lETkFfVkFSSUFOVF9VVFM0Nik7CmlmICgkYXNjaWkgPT09IGZhbHNlKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKHN0cmxlbigkYXNjaWkpID4gNjMpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoIXByZWdfbWF0Y2goJy9eW2EtejAtOV0oPzpbYS16MC05LV0qW2EtejAtOV0pPyQvaScsICRhc2NpaSkpIHsKcmV0dXJuIGZhbHNlOwp9CiRhc2NpaUxhYmVsc1tdID0gJGFzY2lpOwp9CgoKJGFzY2lpSG9zdCA9IGltcGxvZGUoJy4nLCAkYXNjaWlMYWJlbHMpOwoKcmV0dXJuIHN0cmxlbigkYXNjaWlIb3N0KSA8PSAyNTM7Cn0KCnByaXZhdGUgZnVuY3Rpb24gdmFsaWRhdGVKc29uUG9pbnRlcihzdHJpbmcgJHZhbHVlKTogYm9vbAp7CgppZiAoJHZhbHVlICE9PSAnJyAmJiAkdmFsdWVbMF0gIT09ICcvJykgewpyZXR1cm4gZmFsc2U7Cn0KCgokdG9rZW5zID0gZXhwbG9kZSgnLycsICR2YWx1ZSk7CmFycmF5X3NoaWZ0KCR0b2tlbnMpOyAKCmZvcmVhY2ggKCR0b2tlbnMgYXMgJHRva2VuKSB7CgppZiAocHJlZ19tYXRjaCgnL34oPyFbMDFdKS8nLCAkdG9rZW4pKSB7CnJldHVybiBmYWxzZTsKfQp9CgpyZXR1cm4gdHJ1ZTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZVJmYzMzMzlEYXRlVGltZShzdHJpbmcgJHZhbHVlKTogYm9vbAp7CiRkYXRlVGltZSA9IFJmYzMzMzk6OmNyZWF0ZUZyb21TdHJpbmcoJHZhbHVlKTsKaWYgKGlzX251bGwoJGRhdGVUaW1lKSkgewpyZXR1cm4gZmFsc2U7Cn0KCgpyZXR1cm4gdHJ1ZTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZVVyaVRlbXBsYXRlKHN0cmluZyAkdmFsdWUpOiBib29sCnsKcmV0dXJuIHByZWdfbWF0Y2goCicvXig/OlteXHtcfV0qfFx7W2EtekEtWjAtOV86JVwvXC5+XC1cK1wqXStcfSkqJC8nLAokdmFsdWUKKSA9PT0gMTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA3OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCmNsYXNzIElmVGhlbkVsc2VDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKCnByaXZhdGUgJGZhY3Rvcnk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5mYWN0b3J5ID0gJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKTsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkdGhpcy0+ZmFjdG9yeSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdpZicpKSB7CnJldHVybjsKfQoKJHNjaGVtYUNvbnN0cmFpbnQgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ3NjaGVtYScpOwokaWZTY2hlbWEgPSAkc2NoZW1hLT5pZjsKCmlmICghaXNfYm9vbCgkaWZTY2hlbWEpKSB7CiRzY2hlbWFDb25zdHJhaW50LT5jaGVjaygkdmFsdWUsICRpZlNjaGVtYSwgJHBhdGgsICRpKTsKJG1lZXRzSWZDb25kaXRpb25zID0gJHNjaGVtYUNvbnN0cmFpbnQtPmlzVmFsaWQoKTsKJHNjaGVtYUNvbnN0cmFpbnQtPnJlc2V0KCk7Cn0gZWxzZSB7CiRtZWV0c0lmQ29uZGl0aW9ucyA9ICRpZlNjaGVtYTsKfQoKaWYgKCRtZWV0c0lmQ29uZGl0aW9ucykgewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAndGhlbicpKSB7CnJldHVybjsKfQoKJHNjaGVtYUNvbnN0cmFpbnQtPmNoZWNrKCR2YWx1ZSwgJHNjaGVtYS0+dGhlbiwgJHBhdGgsICRpKTsKaWYgKCRzY2hlbWFDb25zdHJhaW50LT5pc1ZhbGlkKCkpIHsKcmV0dXJuOwp9CgokdGhpcy0+YWRkRXJyb3JzKCRzY2hlbWFDb25zdHJhaW50LT5nZXRFcnJvcnMoKSk7CgpyZXR1cm47Cn0KCmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdlbHNlJykpIHsKcmV0dXJuOwp9Cgokc2NoZW1hQ29uc3RyYWludC0+Y2hlY2soJHZhbHVlLCAkc2NoZW1hLT5lbHNlLCAkcGF0aCwgJGkpOwppZiAoJHNjaGVtYUNvbnN0cmFpbnQtPmlzVmFsaWQoKSkgewpyZXR1cm47Cn0KCiR0aGlzLT5hZGRFcnJvcnMoJHNjaGVtYUNvbnN0cmFpbnQtPmdldEVycm9ycygpKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA3OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCmNsYXNzIEl0ZW1zQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewp1c2UgRXJyb3JCYWdQcm94eTsKCgpwcml2YXRlICRmYWN0b3J5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+ZmFjdG9yeSA9ICRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCk7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJHRoaXMtPmZhY3RvcnkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnaXRlbXMnKSkgewpyZXR1cm47Cn0KCmlmICghaXNfYXJyYXkoJHZhbHVlKSkgewpyZXR1cm47Cn0KCmZvcmVhY2ggKCR2YWx1ZSBhcyAkcHJvcGVydHlOYW1lID0+ICRwcm9wZXJ0eVZhbHVlKSB7CiRpdGVtU2NoZW1hID0gJHNjaGVtYS0+aXRlbXM7CmlmIChpc19hcnJheSgkaXRlbVNjaGVtYSkpIHsKaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRwcm9wZXJ0eU5hbWUsICRpdGVtU2NoZW1hKSkgewpjb250aW51ZTsKfQoKJGl0ZW1TY2hlbWEgPSAkaXRlbVNjaGVtYVskcHJvcGVydHlOYW1lXTsKfQokc2NoZW1hQ29uc3RyYWludCA9ICR0aGlzLT5mYWN0b3J5LT5jcmVhdGVJbnN0YW5jZUZvcignc2NoZW1hJyk7CiRzY2hlbWFDb25zdHJhaW50LT5jaGVjaygkcHJvcGVydHlWYWx1ZSwgJGl0ZW1TY2hlbWEsICRwYXRoLCAkaSk7CmlmICgkc2NoZW1hQ29uc3RyYWludC0+aXNWYWxpZCgpKSB7CmNvbnRpbnVlOwp9CgokdGhpcy0+YWRkRXJyb3JzKCRzY2hlbWFDb25zdHJhaW50LT5nZXRFcnJvcnMoKSk7Cn0KfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA3OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xGYWN0b3J5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKY2xhc3MgTWF4SXRlbXNDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnbWF4SXRlbXMnKSkgewpyZXR1cm47Cn0KCmlmICghaXNfYXJyYXkoJHZhbHVlKSkgewpyZXR1cm47Cn0KCiRjb3VudCA9IGNvdW50KCR2YWx1ZSk7CmlmICgkY291bnQgPD0gJHNjaGVtYS0+bWF4SXRlbXMpIHsKcmV0dXJuOwp9CgokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpNQVhfSVRFTVMoKSwgJHBhdGgsIFsnbWF4SXRlbXMnID0+ICRzY2hlbWEtPm1heEl0ZW1zLCAnZm91bmQnID0+ICRjb3VudF0pOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDc7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXEZhY3Rvcnk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBNYXhMZW5ndGhDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnbWF4TGVuZ3RoJykpIHsKcmV0dXJuOwp9CgppZiAoIWlzX3N0cmluZygkdmFsdWUpKSB7CnJldHVybjsKfQoKJGxlbmd0aCA9IG1iX3N0cmxlbigkdmFsdWUpOwppZiAoJGxlbmd0aCA8PSAkc2NoZW1hLT5tYXhMZW5ndGgpIHsKcmV0dXJuOwp9CgokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpMRU5HVEhfTUFYKCksICRwYXRoLCBbJ21heExlbmd0aCcgPT4gJHNjaGVtYS0+bWF4TGVuZ3RoLCAnZm91bmQnID0+ICRsZW5ndGhdKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA3OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xGYWN0b3J5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKY2xhc3MgTWF4UHJvcGVydGllc0NvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdtYXhQcm9wZXJ0aWVzJykpIHsKcmV0dXJuOwp9CgppZiAoIWlzX29iamVjdCgkdmFsdWUpKSB7CnJldHVybjsKfQoKJGNvdW50ID0gY291bnQoZ2V0X29iamVjdF92YXJzKCR2YWx1ZSkpOwppZiAoJGNvdW50IDw9ICRzY2hlbWEtPm1heFByb3BlcnRpZXMpIHsKcmV0dXJuOwp9CgokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpQUk9QRVJUSUVTX01BWCgpLCAkcGF0aCwgWydtYXhQcm9wZXJ0aWVzJyA9PiAkc2NoZW1hLT5tYXhQcm9wZXJ0aWVzLCAnZm91bmQnID0+ICRjb3VudF0pOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDc7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXEZhY3Rvcnk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBNYXhpbXVtQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewp1c2UgRXJyb3JCYWdQcm94eTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpKTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ21heGltdW0nKSkgewpyZXR1cm47Cn0KCmlmICghaXNfbnVtZXJpYygkdmFsdWUpKSB7CnJldHVybjsKfQoKaWYgKCR2YWx1ZSA8PSAkc2NoZW1hLT5tYXhpbXVtKSB7CnJldHVybjsKfQoKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6TUFYSU1VTSgpLCAkcGF0aCwgWydtYXhpbXVtJyA9PiAkc2NoZW1hLT5tYXhpbXVtLCAnZm91bmQnID0+ICR2YWx1ZV0pOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDc7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXEZhY3Rvcnk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBNaW5JdGVtc0NvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdtaW5JdGVtcycpKSB7CnJldHVybjsKfQoKaWYgKCFpc19hcnJheSgkdmFsdWUpKSB7CnJldHVybjsKfQoKJGNvdW50ID0gY291bnQoJHZhbHVlKTsKaWYgKCRjb3VudCA+PSAkc2NoZW1hLT5taW5JdGVtcykgewpyZXR1cm47Cn0KCiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6Ok1JTl9JVEVNUygpLCAkcGF0aCwgWydtaW5JdGVtcycgPT4gJHNjaGVtYS0+bWluSXRlbXMsICdmb3VuZCcgPT4gJGNvdW50XSk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNzsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRmFjdG9yeTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCmNsYXNzIE1pbkxlbmd0aENvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdtaW5MZW5ndGgnKSkgewpyZXR1cm47Cn0KCmlmICghaXNfc3RyaW5nKCR2YWx1ZSkpIHsKcmV0dXJuOwp9CgokbGVuZ3RoID0gbWJfc3RybGVuKCR2YWx1ZSk7CmlmICgkbGVuZ3RoID49ICRzY2hlbWEtPm1pbkxlbmd0aCkgewpyZXR1cm47Cn0KCiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkxFTkdUSF9NSU4oKSwgJHBhdGgsIFsnbWluTGVuZ3RoJyA9PiAkc2NoZW1hLT5taW5MZW5ndGgsICdmb3VuZCcgPT4gJGxlbmd0aF0pOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDc7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXEZhY3Rvcnk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBNaW5Qcm9wZXJ0aWVzQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewp1c2UgRXJyb3JCYWdQcm94eTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpKTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ21pblByb3BlcnRpZXMnKSkgewpyZXR1cm47Cn0KCmlmICghaXNfb2JqZWN0KCR2YWx1ZSkpIHsKcmV0dXJuOwp9CgokY291bnQgPSBjb3VudChnZXRfb2JqZWN0X3ZhcnMoJHZhbHVlKSk7CmlmICgkY291bnQgPj0gJHNjaGVtYS0+bWluUHJvcGVydGllcykgewpyZXR1cm47Cn0KCiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OlBST1BFUlRJRVNfTUlOKCksICRwYXRoLCBbJ21pblByb3BlcnRpZXMnID0+ICRzY2hlbWEtPm1pblByb3BlcnRpZXMsICdmb3VuZCcgPT4gJGNvdW50XSk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNzsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRmFjdG9yeTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCmNsYXNzIE1pbmltdW1Db25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnbWluaW11bScpKSB7CnJldHVybjsKfQoKaWYgKCFpc19udW1lcmljKCR2YWx1ZSkpIHsKcmV0dXJuOwp9CgppZiAoJHZhbHVlID49ICRzY2hlbWEtPm1pbmltdW0pIHsKcmV0dXJuOwp9CgokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpNSU5JTVVNKCksICRwYXRoLCBbJ21pbmltdW0nID0+ICRzY2hlbWEtPm1pbmltdW0sICdmb3VuZCcgPT4gJHZhbHVlXSk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNzsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRmFjdG9yeTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCmNsYXNzIE11bHRpcGxlT2ZDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnbXVsdGlwbGVPZicpKSB7CnJldHVybjsKfQoKaWYgKCFpc19pbnQoJHNjaGVtYS0+bXVsdGlwbGVPZikgJiYgIWlzX2Zsb2F0KCRzY2hlbWEtPm11bHRpcGxlT2YpICYmICRzY2hlbWEtPm11bHRpcGxlT2YgPD0gMC4wKSB7CnJldHVybjsKfQoKaWYgKCFpc19pbnQoJHZhbHVlKSAmJiAhaXNfZmxvYXQoJHZhbHVlKSkgewpyZXR1cm47Cn0KCmlmICgkdGhpcy0+aXNNdWx0aXBsZU9mKCR2YWx1ZSwgJHNjaGVtYS0+bXVsdGlwbGVPZikpIHsKcmV0dXJuOwp9CgokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpNVUxUSVBMRV9PRigpLCAkcGF0aCwgWydtdWx0aXBsZU9mJyA9PiAkc2NoZW1hLT5tdWx0aXBsZU9mLCAnZm91bmQnID0+ICR2YWx1ZV0pOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpc011bHRpcGxlT2YoJG51bWJlcjEsICRudW1iZXIyKTogYm9vbAp7CiRtb2R1bHVzID0gKCRudW1iZXIxIC0gcm91bmQoJG51bWJlcjEgLyAkbnVtYmVyMikgKiAkbnVtYmVyMik7CiRwcmVjaXNpb24gPSAwLjAwMDAwMDAwMDE7CgpyZXR1cm4gLSRwcmVjaXNpb24gPCAkbW9kdWx1cyAmJiAkbW9kdWx1cyA8ICRwcmVjaXNpb247Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNzsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCmNsYXNzIE5vdENvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgoKcHJpdmF0ZSAkZmFjdG9yeTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmZhY3RvcnkgPSAkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpOwokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCR0aGlzLT5mYWN0b3J5KTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ25vdCcpKSB7CnJldHVybjsKfQoKJHNjaGVtYUNvbnN0cmFpbnQgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ3NjaGVtYScpOwokc2NoZW1hQ29uc3RyYWludC0+Y2hlY2soJHZhbHVlLCAkc2NoZW1hLT5ub3QsICRwYXRoLCAkaSk7CgppZiAoISRzY2hlbWFDb25zdHJhaW50LT5pc1ZhbGlkKCkpIHsKcmV0dXJuOwp9CgokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpOT1QoKSwgJHBhdGgpOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDc7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBPbmVPZkNvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgoKcHJpdmF0ZSAkZmFjdG9yeTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmZhY3RvcnkgPSAkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpOwokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCR0aGlzLT5mYWN0b3J5KTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ29uZU9mJykpIHsKcmV0dXJuOwp9CgokbWF0Y2hlZFNjaGVtYSA9IDA7CmZvcmVhY2ggKCRzY2hlbWEtPm9uZU9mIGFzICRvbmVPZlNjaGVtYSkgewokc2NoZW1hQ29uc3RyYWludCA9ICR0aGlzLT5mYWN0b3J5LT5jcmVhdGVJbnN0YW5jZUZvcignc2NoZW1hJyk7CiRzY2hlbWFDb25zdHJhaW50LT5jaGVjaygkdmFsdWUsICRvbmVPZlNjaGVtYSwgJHBhdGgsICRpKTsKCmlmICgkc2NoZW1hQ29uc3RyYWludC0+aXNWYWxpZCgpKSB7CiRtYXRjaGVkU2NoZW1hKys7CmNvbnRpbnVlOwp9CgokdGhpcy0+YWRkRXJyb3JzKCRzY2hlbWFDb25zdHJhaW50LT5nZXRFcnJvcnMoKSk7Cn0KCmlmICgkbWF0Y2hlZFNjaGVtYSAhPT0gMSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpPTkVfT0YoKSwgJHBhdGgpOwp9IGVsc2UgewokdGhpcy0+ZXJyb3JCYWcoKS0+cmVzZXQoKTsKfQp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDc7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBQYXR0ZXJuQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewp1c2UgRXJyb3JCYWdQcm94eTsKCgpwcml2YXRlICRmYWN0b3J5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+ZmFjdG9yeSA9ICRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCk7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJHRoaXMtPmZhY3RvcnkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAncGF0dGVybicpKSB7CnJldHVybjsKfQoKaWYgKCFpc19zdHJpbmcoJHZhbHVlKSkgewpyZXR1cm47Cn0KCiRtYXRjaFBhdHRlcm4gPSAkdGhpcy0+Y3JlYXRlUHJlZ01hdGNoUGF0dGVybigkc2NoZW1hLT5wYXR0ZXJuKTsKaWYgKHByZWdfbWF0Y2goJG1hdGNoUGF0dGVybiwgJHZhbHVlKSA9PT0gMSkgewpyZXR1cm47Cn0KCiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OlBBVFRFUk4oKSwgJHBhdGgsIFsnZm91bmQnID0+ICR2YWx1ZSwgJ3BhdHRlcm4nID0+ICRzY2hlbWEtPnBhdHRlcm5dKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVQcmVnTWF0Y2hQYXR0ZXJuKHN0cmluZyAkcGF0dGVybik6IHN0cmluZwp7CiRyZXBsYWNlbWVudHMgPSBbCidcRCcgPT4gJ1teMC05XScsCidcZCcgPT4gJ1swLTldJywKJ1xwe2RpZ2l0fScgPT4gJ1swLTldJywKJ1x3JyA9PiAnW0EtWmEtejAtOV9dJywKJ1xXJyA9PiAnW15BLVphLXowLTlfXScsCidccycgPT4gJ1tcc1x4ezIwMEJ9XScsIAonXHB7TGV0dGVyfScgPT4gJ1xwe0x9JywgCl07CgokcGF0dGVybiA9IHN0cl9yZXBsYWNlKAphcnJheV9rZXlzKCRyZXBsYWNlbWVudHMpLAphcnJheV92YWx1ZXMoJHJlcGxhY2VtZW50cyksCiRwYXR0ZXJuCik7CgpyZXR1cm4gJy8nIC4gc3RyX3JlcGxhY2UoJy8nLCAnXC8nLCAkcGF0dGVybikgLiAnL3UnOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDc7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKY2xhc3MgUGF0dGVyblByb3BlcnRpZXNDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKCnByaXZhdGUgJGZhY3Rvcnk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5mYWN0b3J5ID0gJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKTsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkdGhpcy0+ZmFjdG9yeSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdwYXR0ZXJuUHJvcGVydGllcycpKSB7CnJldHVybjsKfQoKaWYgKCFpc19vYmplY3QoJHZhbHVlKSkgewpyZXR1cm47Cn0KCiRwcm9wZXJ0aWVzID0gZ2V0X29iamVjdF92YXJzKCR2YWx1ZSk7Cgpmb3JlYWNoICgkcHJvcGVydGllcyBhcyAkcHJvcGVydHlOYW1lID0+ICRwcm9wZXJ0eVZhbHVlKSB7CmZvcmVhY2ggKCRzY2hlbWEtPnBhdHRlcm5Qcm9wZXJ0aWVzIGFzICRwYXR0ZXJuUHJvcGVydHlSZWdleCA9PiAkcGF0dGVyblByb3BlcnR5U2NoZW1hKSB7CiRtYXRjaFBhdHRlcm4gPSAkdGhpcy0+Y3JlYXRlUHJlZ01hdGNoUGF0dGVybigkcGF0dGVyblByb3BlcnR5UmVnZXgpOwppZiAocHJlZ19tYXRjaCgkbWF0Y2hQYXR0ZXJuLCAoc3RyaW5nKSAkcHJvcGVydHlOYW1lKSkgewokc2NoZW1hQ29uc3RyYWludCA9ICR0aGlzLT5mYWN0b3J5LT5jcmVhdGVJbnN0YW5jZUZvcignc2NoZW1hJyk7CiRzY2hlbWFDb25zdHJhaW50LT5jaGVjaygkcHJvcGVydHlWYWx1ZSwgJHBhdHRlcm5Qcm9wZXJ0eVNjaGVtYSwgJHBhdGgsICRpKTsKaWYgKCRzY2hlbWFDb25zdHJhaW50LT5pc1ZhbGlkKCkpIHsKY29udGludWU7Cn0KCiR0aGlzLT5hZGRFcnJvcnMoJHNjaGVtYUNvbnN0cmFpbnQtPmdldEVycm9ycygpKTsKfQp9Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVQcmVnTWF0Y2hQYXR0ZXJuKHN0cmluZyAkcGF0dGVybik6IHN0cmluZwp7CiRyZXBsYWNlbWVudHMgPSBbCgonXGQnID0+ICdbMC05XScsCidccHtkaWdpdH0nID0+ICdbMC05XScsCgoKCidccHtMZXR0ZXJ9JyA9PiAnXHB7TH0nLCAKXTsKCiRwYXR0ZXJuID0gc3RyX3JlcGxhY2UoCmFycmF5X2tleXMoJHJlcGxhY2VtZW50cyksCmFycmF5X3ZhbHVlcygkcmVwbGFjZW1lbnRzKSwKJHBhdHRlcm4KKTsKCnJldHVybiAnLycgLiBzdHJfcmVwbGFjZSgnLycsICdcLycsICRwYXR0ZXJuKSAuICcvdSc7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNzsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBQcm9wZXJ0aWVzQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewp1c2UgRXJyb3JCYWdQcm94eTsKCgpwcml2YXRlICRmYWN0b3J5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+ZmFjdG9yeSA9ICRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCk7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJHRoaXMtPmZhY3RvcnkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAncHJvcGVydGllcycpKSB7CnJldHVybjsKfQoKaWYgKCFpc19vYmplY3QoJHZhbHVlKSkgewpyZXR1cm47Cn0KCmZvcmVhY2ggKCRzY2hlbWEtPnByb3BlcnRpZXMgYXMgJHByb3BlcnR5TmFtZSA9PiAkcHJvcGVydHlTY2hlbWEpIHsKJHNjaGVtYUNvbnN0cmFpbnQgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ3NjaGVtYScpOwppZiAoIXByb3BlcnR5X2V4aXN0cygkdmFsdWUsICRwcm9wZXJ0eU5hbWUpKSB7CmNvbnRpbnVlOwp9Cgokc2NoZW1hQ29uc3RyYWludC0+Y2hlY2soJHZhbHVlLT57JHByb3BlcnR5TmFtZX0sICRwcm9wZXJ0eVNjaGVtYSwgJHBhdGgsICRpKTsKaWYgKCRzY2hlbWFDb25zdHJhaW50LT5pc1ZhbGlkKCkpIHsKY29udGludWU7Cn0KCiR0aGlzLT5hZGRFcnJvcnMoJHNjaGVtYUNvbnN0cmFpbnQtPmdldEVycm9ycygpKTsKfQp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDc7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBQcm9wZXJ0aWVzTmFtZXNDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKCnByaXZhdGUgJGZhY3Rvcnk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5mYWN0b3J5ID0gJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKTsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkdGhpcy0+ZmFjdG9yeSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdwcm9wZXJ0eU5hbWVzJykpIHsKcmV0dXJuOwp9CgppZiAoIWlzX29iamVjdCgkdmFsdWUpKSB7CnJldHVybjsKfQppZiAoJHNjaGVtYS0+cHJvcGVydHlOYW1lcyA9PT0gdHJ1ZSkgewpyZXR1cm47Cn0KCiRwcm9wZXJ0eU5hbWVzID0gZ2V0X29iamVjdF92YXJzKCR2YWx1ZSk7CgppZiAoJHNjaGVtYS0+cHJvcGVydHlOYW1lcyA9PT0gZmFsc2UpIHsKZm9yZWFjaCAoJHByb3BlcnR5TmFtZXMgYXMgJHByb3BlcnR5TmFtZSA9PiAkXykgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpQUk9QRVJUWV9OQU1FUygpLCAkcGF0aCwgWydwcm9wZXJ0eU5hbWVzJyA9PiAkc2NoZW1hLT5wcm9wZXJ0eU5hbWVzLCAndmlvbGF0aW5nJyA9PiAnZmFsc2UnLCAnbmFtZScgPT4gJHByb3BlcnR5TmFtZV0pOwp9CgpyZXR1cm47Cn0KCmlmIChwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYS0+cHJvcGVydHlOYW1lcywgJ21heExlbmd0aCcpKSB7CmZvcmVhY2ggKCRwcm9wZXJ0eU5hbWVzIGFzICRwcm9wZXJ0eU5hbWUgPT4gJF8pIHsKJGxlbmd0aCA9IG1iX3N0cmxlbigkcHJvcGVydHlOYW1lKTsKaWYgKCRsZW5ndGggPiAkc2NoZW1hLT5wcm9wZXJ0eU5hbWVzLT5tYXhMZW5ndGgpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6UFJPUEVSVFlfTkFNRVMoKSwgJHBhdGgsIFsncHJvcGVydHlOYW1lcycgPT4gJHNjaGVtYS0+cHJvcGVydHlOYW1lcywgJ3Zpb2xhdGluZycgPT4gJ21heExlbmd0aCcsICdsZW5ndGgnID0+ICRsZW5ndGgsICduYW1lJyA9PiAkcHJvcGVydHlOYW1lXSk7Cn0KfQp9CgppZiAocHJvcGVydHlfZXhpc3RzKCRzY2hlbWEtPnByb3BlcnR5TmFtZXMsICdwYXR0ZXJuJykpIHsKZm9yZWFjaCAoJHByb3BlcnR5TmFtZXMgYXMgJHByb3BlcnR5TmFtZSA9PiAkXykgewppZiAoIXByZWdfbWF0Y2goJy8nIC4gc3RyX3JlcGxhY2UoJy8nLCAnXC8nLCAkc2NoZW1hLT5wcm9wZXJ0eU5hbWVzLT5wYXR0ZXJuKSAuICcvJywgJHByb3BlcnR5TmFtZSkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6UFJPUEVSVFlfTkFNRVMoKSwgJHBhdGgsIFsncHJvcGVydHlOYW1lcycgPT4gJHNjaGVtYS0+cHJvcGVydHlOYW1lcywgJ3Zpb2xhdGluZycgPT4gJ3BhdHRlcm4nLCAnbmFtZScgPT4gJHByb3BlcnR5TmFtZV0pOwp9Cn0KfQp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDc7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKY2xhc3MgUmVmQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewp1c2UgRXJyb3JCYWdQcm94eTsKCgpwcml2YXRlICRmYWN0b3J5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+ZmFjdG9yeSA9ICRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCk7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJHRoaXMtPmZhY3RvcnkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnJHJlZicpKSB7CnJldHVybjsKfQoKdHJ5IHsKJHJlZlNjaGVtYSA9ICR0aGlzLT5mYWN0b3J5LT5nZXRTY2hlbWFTdG9yYWdlKCktPnJlc29sdmVSZWZTY2hlbWEoJHNjaGVtYSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKcmV0dXJuOwp9Cgokc2NoZW1hQ29uc3RyYWludCA9ICR0aGlzLT5mYWN0b3J5LT5jcmVhdGVJbnN0YW5jZUZvcignc2NoZW1hJyk7CiRzY2hlbWFDb25zdHJhaW50LT5jaGVjaygkdmFsdWUsICRyZWZTY2hlbWEsICRwYXRoLCAkaSk7CgppZiAoJHNjaGVtYUNvbnN0cmFpbnQtPmlzVmFsaWQoKSkgewpyZXR1cm47Cn0KCiR0aGlzLT5hZGRFcnJvcnMoJHNjaGVtYUNvbnN0cmFpbnQtPmdldEVycm9ycygpKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA3OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xGYWN0b3J5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKY2xhc3MgUmVxdWlyZWRDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAncmVxdWlyZWQnKSkgewpyZXR1cm47Cn0KCmlmICghaXNfb2JqZWN0KCR2YWx1ZSkpIHsKcmV0dXJuOwp9Cgpmb3JlYWNoICgkc2NoZW1hLT5yZXF1aXJlZCBhcyAkcmVxdWlyZWQpIHsKaWYgKHByb3BlcnR5X2V4aXN0cygkdmFsdWUsICRyZXF1aXJlZCkpIHsKY29udGludWU7Cn0KCiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OlJFUVVJUkVEKCksICR0aGlzLT5pbmNyZW1lbnRQYXRoKCRwYXRoLCAkcmVxdWlyZWQpLCBbJ3Byb3BlcnR5JyA9PiAkcmVxdWlyZWRdKTsKfQp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluY3JlbWVudFBhdGgoP0pzb25Qb2ludGVyICRwYXRoLCAkaSk6IEpzb25Qb2ludGVyCnsKJHBhdGggPSAkcGF0aCA/PyBuZXcgSnNvblBvaW50ZXIoJycpOwoKaWYgKCRpID09PSBudWxsIHx8ICRpID09PSAnJykgewpyZXR1cm4gJHBhdGg7Cn0KCnJldHVybiAkcGF0aC0+d2l0aFByb3BlcnR5UGF0aHMoYXJyYXlfbWVyZ2UoJHBhdGgtPmdldFByb3BlcnR5UGF0aHMoKSwgWyRpXSkpOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDc7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXEZhY3Rvcnk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBUeXBlQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewp1c2UgRXJyb3JCYWdQcm94eTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpKTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ3R5cGUnKSkgewpyZXR1cm47Cn0KCiRzY2hlbWFUeXBlcyA9IChhcnJheSkgJHNjaGVtYS0+dHlwZTsKJHZhbHVlVHlwZSA9IHN0cnRvbG93ZXIoZ2V0dHlwZSgkdmFsdWUpKTsKCiR2YWx1ZUlzTnVtYmVyID0gJHZhbHVlVHlwZSA9PT0gJ2RvdWJsZScgfHwgJHZhbHVlVHlwZSA9PT0gJ2ludGVnZXInOwoKJGlzSW50ZWdlciA9ICR2YWx1ZUlzTnVtYmVyICYmIGZtb2QoJHZhbHVlLCAxLjApID09PSAwLjA7Cgpmb3JlYWNoICgkc2NoZW1hVHlwZXMgYXMgJHR5cGUpIHsKaWYgKCR2YWx1ZVR5cGUgPT09ICR0eXBlKSB7CnJldHVybjsKfQoKaWYgKCR0eXBlID09PSAnbnVtYmVyJyAmJiAkdmFsdWVJc051bWJlcikgewpyZXR1cm47Cn0KaWYgKCR0eXBlID09PSAnaW50ZWdlcicgJiYgJGlzSW50ZWdlcikgewpyZXR1cm47Cn0KfQoKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6VFlQRSgpLCAkcGF0aCwgWydmb3VuZCcgPT4gJHZhbHVlVHlwZSwgJ2V4cGVjdGVkJyA9PiBpbXBsb2RlKCcsICcsICRzY2hlbWFUeXBlcyldKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA3OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xGYWN0b3J5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwp1c2UgSnNvblNjaGVtYVxUb29sXERlZXBDb21wYXJlcjsKCmNsYXNzIFVuaXF1ZUl0ZW1zQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewp1c2UgRXJyb3JCYWdQcm94eTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpKTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ3VuaXF1ZUl0ZW1zJykpIHsKcmV0dXJuOwp9CmlmICghaXNfYXJyYXkoJHZhbHVlKSkgewpyZXR1cm47Cn0KCmlmICgkc2NoZW1hLT51bmlxdWVJdGVtcyAhPT0gdHJ1ZSkgewoKcmV0dXJuOwp9CgokY291bnQgPSBjb3VudCgkdmFsdWUpOwpmb3IgKCR4ID0gMDsgJHggPCAkY291bnQgLSAxOyAkeCsrKSB7CmZvciAoJHkgPSAkeCArIDE7ICR5IDwgJGNvdW50OyAkeSsrKSB7CmlmIChEZWVwQ29tcGFyZXI6OmlzRXF1YWwoJHZhbHVlWyR4XSwgJHZhbHVlWyR5XSkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6VU5JUVVFX0lURU1TKCksICRwYXRoKTsKCnJldHVybjsKfQp9Cn0KfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50czsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwp1c2UgSnNvblNjaGVtYVxUb29sXERlZXBDb21wYXJlcjsKCgoKCgoKCmNsYXNzIEVudW1Db25zdHJhaW50IGV4dGVuZHMgQ29uc3RyYWludAp7CgoKCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJGVsZW1lbnQsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKCmlmICgkZWxlbWVudCBpbnN0YW5jZW9mIFVuZGVmaW5lZENvbnN0cmFpbnQgJiYgKCFpc3NldCgkc2NoZW1hLT5yZXF1aXJlZCkgfHwgISRzY2hlbWEtPnJlcXVpcmVkKSkgewpyZXR1cm47Cn0KJHR5cGUgPSBnZXR0eXBlKCRlbGVtZW50KTsKCmZvcmVhY2ggKCRzY2hlbWEtPmVudW0gYXMgJGVudW0pIHsKJGVudW1UeXBlID0gZ2V0dHlwZSgkZW51bSk7CgppZiAoJGVudW1UeXBlID09PSAnb2JqZWN0JwomJiAkdHlwZSA9PT0gJ2FycmF5JwomJiAkdGhpcy0+ZmFjdG9yeS0+Z2V0Q29uZmlnKHNlbGY6OkNIRUNLX01PREVfVFlQRV9DQVNUKQomJiBEZWVwQ29tcGFyZXI6OmlzRXF1YWwoKG9iamVjdCkgJGVsZW1lbnQsICRlbnVtKQopIHsKcmV0dXJuOwp9CgppZiAoKCR0eXBlID09PSAkZW51bVR5cGUpICYmIERlZXBDb21wYXJlcjo6aXNFcXVhbCgkZWxlbWVudCwgJGVudW0pKSB7CnJldHVybjsKfQoKaWYgKGlzX251bWVyaWMoJGVsZW1lbnQpICYmIGlzX251bWVyaWMoJGVudW0pICYmIERlZXBDb21wYXJlcjo6aXNFcXVhbCgoZmxvYXQpICRlbGVtZW50LCAoZmxvYXQpICRlbnVtKSkgewpyZXR1cm47Cn0KfQoKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6RU5VTSgpLCAkcGF0aCwgWydlbnVtJyA9PiAkc2NoZW1hLT5lbnVtXSk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHM7Cgp1c2UgSnNvblNjaGVtYVxEcmFmdElkZW50aWZpZXJzOwp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgSnNvblNjaGVtYVxTY2hlbWFTdG9yYWdlOwp1c2UgSnNvblNjaGVtYVxTY2hlbWFTdG9yYWdlSW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxVcmlcVXJpUmV0cmlldmVyOwp1c2UgSnNvblNjaGVtYVxVcmlSZXRyaWV2ZXJJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXFZhbGlkYXRvcjsKCgoKCmNsYXNzIEZhY3RvcnkKewoKCgpwcm90ZWN0ZWQgJHNjaGVtYVN0b3JhZ2U7CgoKCgpwcm90ZWN0ZWQgJHVyaVJldHJpZXZlcjsKCgoKCgpwcml2YXRlICRjaGVja01vZGUgPSBDb25zdHJhaW50OjpDSEVDS19NT0RFX05PUk1BTDsKCgoKCgpwcml2YXRlICR0eXBlQ2hlY2sgPSBbXTsKCgoKCnByb3RlY3RlZCAkZXJyb3JDb250ZXh0ID0gVmFsaWRhdG9yOjpFUlJPUl9ET0NVTUVOVF9WQUxJREFUSU9OOwoKCgoKCgpwcml2YXRlICRkZWZhdWx0RGlhbGVjdCA9IERyYWZ0SWRlbnRpZmllcnM6OkRSQUZUXzY7CgoKCgpwcm90ZWN0ZWQgJGNvbnN0cmFpbnRNYXAgPSBbCidhcnJheScgPT4gJ0pzb25TY2hlbWFcQ29uc3RyYWludHNcQ29sbGVjdGlvbkNvbnN0cmFpbnQnLAonY29sbGVjdGlvbicgPT4gJ0pzb25TY2hlbWFcQ29uc3RyYWludHNcQ29sbGVjdGlvbkNvbnN0cmFpbnQnLAonb2JqZWN0JyA9PiAnSnNvblNjaGVtYVxDb25zdHJhaW50c1xPYmplY3RDb25zdHJhaW50JywKJ3R5cGUnID0+ICdKc29uU2NoZW1hXENvbnN0cmFpbnRzXFR5cGVDb25zdHJhaW50JywKJ3VuZGVmaW5lZCcgPT4gJ0pzb25TY2hlbWFcQ29uc3RyYWludHNcVW5kZWZpbmVkQ29uc3RyYWludCcsCidzdHJpbmcnID0+ICdKc29uU2NoZW1hXENvbnN0cmFpbnRzXFN0cmluZ0NvbnN0cmFpbnQnLAonbnVtYmVyJyA9PiAnSnNvblNjaGVtYVxDb25zdHJhaW50c1xOdW1iZXJDb25zdHJhaW50JywKJ2VudW0nID0+ICdKc29uU2NoZW1hXENvbnN0cmFpbnRzXEVudW1Db25zdHJhaW50JywKJ2NvbnN0JyA9PiAnSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdENvbnN0cmFpbnQnLAonZm9ybWF0JyA9PiAnSnNvblNjaGVtYVxDb25zdHJhaW50c1xGb3JtYXRDb25zdHJhaW50JywKJ3NjaGVtYScgPT4gJ0pzb25TY2hlbWFcQ29uc3RyYWludHNcU2NoZW1hQ29uc3RyYWludCcsCid2YWxpZGF0b3InID0+ICdKc29uU2NoZW1hXFZhbGlkYXRvcicsCidkcmFmdDA2JyA9PiBEcmFmdHNcRHJhZnQwNlxEcmFmdDA2Q29uc3RyYWludDo6Y2xhc3MsCidkcmFmdDA3JyA9PiBEcmFmdHNcRHJhZnQwN1xEcmFmdDA3Q29uc3RyYWludDo6Y2xhc3MsCl07CgoKCgpwcml2YXRlICRpbnN0YW5jZUNhY2hlID0gW107CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCj9TY2hlbWFTdG9yYWdlSW50ZXJmYWNlICRzY2hlbWFTdG9yYWdlID0gbnVsbCwKP1VyaVJldHJpZXZlckludGVyZmFjZSAkdXJpUmV0cmlldmVyID0gbnVsbCwKaW50ICRjaGVja01vZGUgPSBDb25zdHJhaW50OjpDSEVDS19NT0RFX05PUk1BTAopIHsKCiR0aGlzLT5zZXRDb25maWcoJGNoZWNrTW9kZSk7CgokdGhpcy0+dXJpUmV0cmlldmVyID0gJHVyaVJldHJpZXZlciA/OiBuZXcgVXJpUmV0cmlldmVyKCk7CiR0aGlzLT5zY2hlbWFTdG9yYWdlID0gJHNjaGVtYVN0b3JhZ2UgPzogbmV3IFNjaGVtYVN0b3JhZ2UoJHRoaXMtPnVyaVJldHJpZXZlcik7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDb25maWcoaW50ICRjaGVja01vZGUgPSBDb25zdHJhaW50OjpDSEVDS19NT0RFX05PUk1BTCk6IHZvaWQKewokdGhpcy0+Y2hlY2tNb2RlID0gJGNoZWNrTW9kZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkQ29uZmlnKGludCAkb3B0aW9ucyk6IHZvaWQKewokdGhpcy0+Y2hlY2tNb2RlIHw9ICRvcHRpb25zOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVDb25maWcoaW50ICRvcHRpb25zKTogdm9pZAp7CiR0aGlzLT5jaGVja01vZGUgJj0gfiRvcHRpb25zOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb25maWcoP2ludCAkb3B0aW9ucyA9IG51bGwpOiBpbnQKewppZiAoJG9wdGlvbnMgPT09IG51bGwpIHsKcmV0dXJuICR0aGlzLT5jaGVja01vZGU7Cn0KCnJldHVybiAkdGhpcy0+Y2hlY2tNb2RlICYgJG9wdGlvbnM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRVcmlSZXRyaWV2ZXIoKTogVXJpUmV0cmlldmVySW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT51cmlSZXRyaWV2ZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTY2hlbWFTdG9yYWdlKCk6IFNjaGVtYVN0b3JhZ2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPnNjaGVtYVN0b3JhZ2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRUeXBlQ2hlY2soKTogVHlwZUNoZWNrXFR5cGVDaGVja0ludGVyZmFjZQp7CmlmICghaXNzZXQoJHRoaXMtPnR5cGVDaGVja1skdGhpcy0+Y2hlY2tNb2RlXSkpIHsKJHRoaXMtPnR5cGVDaGVja1skdGhpcy0+Y2hlY2tNb2RlXSA9ICgkdGhpcy0+Y2hlY2tNb2RlICYgQ29uc3RyYWludDo6Q0hFQ0tfTU9ERV9UWVBFX0NBU1QpCj8gbmV3IFR5cGVDaGVja1xMb29zZVR5cGVDaGVjaygpCjogbmV3IFR5cGVDaGVja1xTdHJpY3RUeXBlQ2hlY2soKTsKfQoKcmV0dXJuICR0aGlzLT50eXBlQ2hlY2tbJHRoaXMtPmNoZWNrTW9kZV07Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRDb25zdHJhaW50Q2xhc3Moc3RyaW5nICRuYW1lLCBzdHJpbmcgJGNsYXNzKTogRmFjdG9yeQp7CgppZiAoIWNsYXNzX2V4aXN0cygkY2xhc3MpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1Vua25vd24gY29uc3RyYWludCAnIC4gJG5hbWUpOwp9CgppZiAoIWluX2FycmF5KCdKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2UnLCBjbGFzc19pbXBsZW1lbnRzKCRjbGFzcykpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgY2xhc3MgJyAuICRuYW1lKTsKfQokdGhpcy0+Y29uc3RyYWludE1hcFskbmFtZV0gPSAkY2xhc3M7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VGb3IoJGNvbnN0cmFpbnROYW1lKQp7CmlmICghaXNzZXQoJHRoaXMtPmNvbnN0cmFpbnRNYXBbJGNvbnN0cmFpbnROYW1lXSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVW5rbm93biBjb25zdHJhaW50ICcgLiAkY29uc3RyYWludE5hbWUpOwp9CgppZiAoIWlzc2V0KCR0aGlzLT5pbnN0YW5jZUNhY2hlWyRjb25zdHJhaW50TmFtZV0pKSB7CiR0aGlzLT5pbnN0YW5jZUNhY2hlWyRjb25zdHJhaW50TmFtZV0gPSBuZXcgJHRoaXMtPmNvbnN0cmFpbnRNYXBbJGNvbnN0cmFpbnROYW1lXSgkdGhpcyk7Cn0KCnJldHVybiBjbG9uZSAkdGhpcy0+aW5zdGFuY2VDYWNoZVskY29uc3RyYWludE5hbWVdOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFcnJvckNvbnRleHQoKTogaW50CnsKcmV0dXJuICR0aGlzLT5lcnJvckNvbnRleHQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEVycm9yQ29udGV4dChpbnQgJGVycm9yQ29udGV4dCk6IHZvaWQKewokdGhpcy0+ZXJyb3JDb250ZXh0ID0gJGVycm9yQ29udGV4dDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldERlZmF1bHREaWFsZWN0KCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+ZGVmYXVsdERpYWxlY3Q7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXREZWZhdWx0RGlhbGVjdChzdHJpbmcgJGRlZmF1bHREaWFsZWN0KTogdm9pZAp7CiR0aGlzLT5kZWZhdWx0RGlhbGVjdCA9ICRkZWZhdWx0RGlhbGVjdDsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50czsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwp1c2UgSnNvblNjaGVtYVxSZmMzMzM5Owp1c2UgSnNvblNjaGVtYVxUb29sXFZhbGlkYXRvclxSZWxhdGl2ZVJlZmVyZW5jZVZhbGlkYXRvcjsKdXNlIEpzb25TY2hlbWFcVG9vbFxWYWxpZGF0b3JcVXJpVmFsaWRhdG9yOwoKCgoKCgoKCmNsYXNzIEZvcm1hdENvbnN0cmFpbnQgZXh0ZW5kcyBDb25zdHJhaW50CnsKCgoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkZWxlbWVudCwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIWlzc2V0KCRzY2hlbWEtPmZvcm1hdCkgfHwgJHRoaXMtPmZhY3RvcnktPmdldENvbmZpZyhzZWxmOjpDSEVDS19NT0RFX0RJU0FCTEVfRk9STUFUKSkgewpyZXR1cm47Cn0KCnN3aXRjaCAoJHNjaGVtYS0+Zm9ybWF0KSB7CmNhc2UgJ2RhdGUnOgppZiAoaXNfc3RyaW5nKCRlbGVtZW50KSAmJiAhJGRhdGUgPSAkdGhpcy0+dmFsaWRhdGVEYXRlVGltZSgkZWxlbWVudCwgJ1ktbS1kJykpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX0RBVEUoKSwgJHBhdGgsIFsKJ2RhdGUnID0+ICRlbGVtZW50LAonZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXQKXQopOwp9CmJyZWFrOwoKY2FzZSAndGltZSc6CmlmIChpc19zdHJpbmcoJGVsZW1lbnQpICYmICEkdGhpcy0+dmFsaWRhdGVEYXRlVGltZSgkZWxlbWVudCwgJ0g6aTpzJykpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX1RJTUUoKSwgJHBhdGgsIFsKJ3RpbWUnID0+IGpzb25fZW5jb2RlKCRlbGVtZW50KSwKJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0LApdCik7Cn0KYnJlYWs7CgpjYXNlICdkYXRlLXRpbWUnOgppZiAoaXNfc3RyaW5nKCRlbGVtZW50KSAmJiBudWxsID09PSBSZmMzMzM5OjpjcmVhdGVGcm9tU3RyaW5nKCRlbGVtZW50KSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfREFURV9USU1FKCksICRwYXRoLCBbCidkYXRlVGltZScgPT4ganNvbl9lbmNvZGUoJGVsZW1lbnQpLAonZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXQKXQopOwp9CmJyZWFrOwoKY2FzZSAndXRjLW1pbGxpc2VjJzoKaWYgKCEkdGhpcy0+dmFsaWRhdGVEYXRlVGltZSgkZWxlbWVudCwgJ1UnKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfREFURV9VVEMoKSwgJHBhdGgsIFsKJ3ZhbHVlJyA9PiAkZWxlbWVudCwKJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0XSk7Cn0KYnJlYWs7CgpjYXNlICdyZWdleCc6CmlmICghJHRoaXMtPnZhbGlkYXRlUmVnZXgoJGVsZW1lbnQpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9SRUdFWCgpLCAkcGF0aCwgWwondmFsdWUnID0+ICRlbGVtZW50LAonZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXQKXQopOwp9CmJyZWFrOwoKY2FzZSAnY29sb3InOgppZiAoISR0aGlzLT52YWxpZGF0ZUNvbG9yKCRlbGVtZW50KSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfQ09MT1IoKSwgJHBhdGgsIFsnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXRdKTsKfQpicmVhazsKCmNhc2UgJ3N0eWxlJzoKaWYgKCEkdGhpcy0+dmFsaWRhdGVTdHlsZSgkZWxlbWVudCkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX1NUWUxFKCksICRwYXRoLCBbJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0XSk7Cn0KYnJlYWs7CgpjYXNlICdwaG9uZSc6CmlmICghJHRoaXMtPnZhbGlkYXRlUGhvbmUoJGVsZW1lbnQpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9QSE9ORSgpLCAkcGF0aCwgWydmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwoKY2FzZSAndXJpJzoKaWYgKGlzX3N0cmluZygkZWxlbWVudCkgJiYgIVVyaVZhbGlkYXRvcjo6aXNWYWxpZCgkZWxlbWVudCkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX1VSTCgpLCAkcGF0aCwgWydmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwoKY2FzZSAndXJpcmVmJzoKY2FzZSAndXJpLXJlZmVyZW5jZSc6CmlmIChpc19zdHJpbmcoJGVsZW1lbnQpICYmICEoVXJpVmFsaWRhdG9yOjppc1ZhbGlkKCRlbGVtZW50KSB8fCBSZWxhdGl2ZVJlZmVyZW5jZVZhbGlkYXRvcjo6aXNWYWxpZCgkZWxlbWVudCkpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9VUkwoKSwgJHBhdGgsIFsnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXRdKTsKfQpicmVhazsKCmNhc2UgJ2VtYWlsJzoKaWYgKGlzX3N0cmluZygkZWxlbWVudCkgJiYgbnVsbCA9PT0gZmlsdGVyX3ZhcigkZWxlbWVudCwgRklMVEVSX1ZBTElEQVRFX0VNQUlMLCBGSUxURVJfTlVMTF9PTl9GQUlMVVJFIHwgRklMVEVSX0ZMQUdfRU1BSUxfVU5JQ09ERSkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX0VNQUlMKCksICRwYXRoLCBbJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0XSk7Cn0KYnJlYWs7CgpjYXNlICdpcC1hZGRyZXNzJzoKY2FzZSAnaXB2NCc6CmlmIChpc19zdHJpbmcoJGVsZW1lbnQpICYmIG51bGwgPT09IGZpbHRlcl92YXIoJGVsZW1lbnQsIEZJTFRFUl9WQUxJREFURV9JUCwgRklMVEVSX05VTExfT05fRkFJTFVSRSB8IEZJTFRFUl9GTEFHX0lQVjQpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9JUCgpLCAkcGF0aCwgWydmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwoKY2FzZSAnaXB2Nic6CmlmIChpc19zdHJpbmcoJGVsZW1lbnQpICYmIG51bGwgPT09IGZpbHRlcl92YXIoJGVsZW1lbnQsIEZJTFRFUl9WQUxJREFURV9JUCwgRklMVEVSX05VTExfT05fRkFJTFVSRSB8IEZJTFRFUl9GTEFHX0lQVjYpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9JUCgpLCAkcGF0aCwgWydmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwoKY2FzZSAnaG9zdC1uYW1lJzoKY2FzZSAnaG9zdG5hbWUnOgppZiAoISR0aGlzLT52YWxpZGF0ZUhvc3RuYW1lKCRlbGVtZW50KSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfSE9TVE5BTUUoKSwgJHBhdGgsIFsnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXRdKTsKfQpicmVhazsKCmRlZmF1bHQ6CgoKCgoKCmJyZWFrOwp9Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiB2YWxpZGF0ZURhdGVUaW1lKCRkYXRldGltZSwgJGZvcm1hdCkKewokZHQgPSBcRGF0ZVRpbWU6OmNyZWF0ZUZyb21Gb3JtYXQoJGZvcm1hdCwgKHN0cmluZykgJGRhdGV0aW1lKTsKCmlmICghJGR0KSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCRkYXRldGltZSA9PT0gJGR0LT5mb3JtYXQoJGZvcm1hdCkpIHsKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlUmVnZXgoJHJlZ2V4KQp7CmlmICghaXNfc3RyaW5nKCRyZWdleCkpIHsKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZSAhPT0gQHByZWdfbWF0Y2goc2VsZjo6anNvblBhdHRlcm5Ub1BocFJlZ2V4KCRyZWdleCksICcnKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlQ29sb3IoJGNvbG9yKQp7CmlmICghaXNfc3RyaW5nKCRjb2xvcikpIHsKcmV0dXJuIHRydWU7Cn0KCmlmIChpbl9hcnJheShzdHJ0b2xvd2VyKCRjb2xvciksIFsnYXF1YScsICdibGFjaycsICdibHVlJywgJ2Z1Y2hzaWEnLAonZ3JheScsICdncmVlbicsICdsaW1lJywgJ21hcm9vbicsICduYXZ5JywgJ29saXZlJywgJ29yYW5nZScsICdwdXJwbGUnLAoncmVkJywgJ3NpbHZlcicsICd0ZWFsJywgJ3doaXRlJywgJ3llbGxvdyddKSkgewpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIHByZWdfbWF0Y2goJy9eIyhbYS1mMC05XXszfXxbYS1mMC05XXs2fSkkL2knLCAkY29sb3IpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gdmFsaWRhdGVTdHlsZSgkc3R5bGUpCnsKJHByb3BlcnRpZXMgPSBleHBsb2RlKCc7JywgcnRyaW0oJHN0eWxlLCAnOycpKTsKJGludmFsaWRFbnRyaWVzID0gcHJlZ19ncmVwKCcvXlxzKlstYS16XStccyo6XHMqLiskL2knLCAkcHJvcGVydGllcywgUFJFR19HUkVQX0lOVkVSVCk7CgpyZXR1cm4gZW1wdHkoJGludmFsaWRFbnRyaWVzKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlUGhvbmUoJHBob25lKQp7CnJldHVybiBwcmVnX21hdGNoKCcvXlwrPyhcKFxkezN9XCl8XGR7M30pIFxkezN9IFxkezR9JC8nLCAkcGhvbmUpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gdmFsaWRhdGVIb3N0bmFtZSgkaG9zdCkKewppZiAoIWlzX3N0cmluZygkaG9zdCkpIHsKcmV0dXJuIHRydWU7Cn0KCgokaG9zdG5hbWVSZWdleCA9ICcvXig/IS0pKD8hLio/W15BLVphLXowLTlcLVwuXSkoPzooPyEtKVtBLVphLXowLTldKD86W0EtWmEtejAtOVwtXXswLDYxfVtBLVphLXowLTldKT9cLikqKD8hLSlbQS1aYS16MC05XSg/OltBLVphLXowLTlcLV17MCw2MX1bQS1aYS16MC05XSk/JC8nOwoKcmV0dXJuIHByZWdfbWF0Y2goJGhvc3RuYW1lUmVnZXgsICRob3N0KTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50czsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKCgoKCgoKY2xhc3MgTnVtYmVyQ29uc3RyYWludCBleHRlbmRzIENvbnN0cmFpbnQKewoKCgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiRlbGVtZW50LCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CgppZiAoaXNzZXQoJHNjaGVtYS0+ZXhjbHVzaXZlTWluaW11bSkpIHsKaWYgKGlzc2V0KCRzY2hlbWEtPm1pbmltdW0pKSB7CmlmICgkc2NoZW1hLT5leGNsdXNpdmVNaW5pbXVtICYmICRlbGVtZW50IDw9ICRzY2hlbWEtPm1pbmltdW0pIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6RVhDTFVTSVZFX01JTklNVU0oKSwgJHBhdGgsIFsnbWluaW11bScgPT4gJHNjaGVtYS0+bWluaW11bV0pOwp9IGVsc2VpZiAoJGVsZW1lbnQgPCAkc2NoZW1hLT5taW5pbXVtKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6Ok1JTklNVU0oKSwgJHBhdGgsIFsnbWluaW11bScgPT4gJHNjaGVtYS0+bWluaW11bV0pOwp9Cn0gZWxzZSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6Ok1JU1NJTkdfTUlOSU1VTSgpLCAkcGF0aCk7Cn0KfSBlbHNlaWYgKGlzc2V0KCRzY2hlbWEtPm1pbmltdW0pICYmICRlbGVtZW50IDwgJHNjaGVtYS0+bWluaW11bSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpNSU5JTVVNKCksICRwYXRoLCBbJ21pbmltdW0nID0+ICRzY2hlbWEtPm1pbmltdW1dKTsKfQoKCmlmIChpc3NldCgkc2NoZW1hLT5leGNsdXNpdmVNYXhpbXVtKSkgewppZiAoaXNzZXQoJHNjaGVtYS0+bWF4aW11bSkpIHsKaWYgKCRzY2hlbWEtPmV4Y2x1c2l2ZU1heGltdW0gJiYgJGVsZW1lbnQgPj0gJHNjaGVtYS0+bWF4aW11bSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpFWENMVVNJVkVfTUFYSU1VTSgpLCAkcGF0aCwgWydtYXhpbXVtJyA9PiAkc2NoZW1hLT5tYXhpbXVtXSk7Cn0gZWxzZWlmICgkZWxlbWVudCA+ICRzY2hlbWEtPm1heGltdW0pIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6TUFYSU1VTSgpLCAkcGF0aCwgWydtYXhpbXVtJyA9PiAkc2NoZW1hLT5tYXhpbXVtXSk7Cn0KfSBlbHNlIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6TUlTU0lOR19NQVhJTVVNKCksICRwYXRoKTsKfQp9IGVsc2VpZiAoaXNzZXQoJHNjaGVtYS0+bWF4aW11bSkgJiYgJGVsZW1lbnQgPiAkc2NoZW1hLT5tYXhpbXVtKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6Ok1BWElNVU0oKSwgJHBhdGgsIFsnbWF4aW11bScgPT4gJHNjaGVtYS0+bWF4aW11bV0pOwp9CgoKaWYgKGlzc2V0KCRzY2hlbWEtPmRpdmlzaWJsZUJ5KSAmJiAkdGhpcy0+Zm1vZCgkZWxlbWVudCwgJHNjaGVtYS0+ZGl2aXNpYmxlQnkpICE9IDApIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6RElWSVNJQkxFX0JZKCksICRwYXRoLCBbJ2RpdmlzaWJsZUJ5JyA9PiAkc2NoZW1hLT5kaXZpc2libGVCeV0pOwp9CgoKaWYgKGlzc2V0KCRzY2hlbWEtPm11bHRpcGxlT2YpICYmICR0aGlzLT5mbW9kKCRlbGVtZW50LCAkc2NoZW1hLT5tdWx0aXBsZU9mKSAhPSAwKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6Ok1VTFRJUExFX09GKCksICRwYXRoLCBbJ211bHRpcGxlT2YnID0+ICRzY2hlbWEtPm11bHRpcGxlT2ZdKTsKfQoKJHRoaXMtPmNoZWNrRm9ybWF0KCRlbGVtZW50LCAkc2NoZW1hLCAkcGF0aCwgJGkpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGZtb2QoJG51bWJlcjEsICRudW1iZXIyKQp7CiRtb2R1bHVzID0gKCRudW1iZXIxIC0gcm91bmQoJG51bWJlcjEgLyAkbnVtYmVyMikgKiAkbnVtYmVyMik7CiRwcmVjaXNpb24gPSAwLjAwMDAwMDAwMDE7CgppZiAoLSRwcmVjaXNpb24gPCAkbW9kdWx1cyAmJiAkbW9kdWx1cyA8ICRwcmVjaXNpb24pIHsKcmV0dXJuIDAuMDsKfQoKcmV0dXJuICRtb2R1bHVzOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHM7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCmNsYXNzIE9iamVjdENvbnN0cmFpbnQgZXh0ZW5kcyBDb25zdHJhaW50CnsKCgoKcHJvdGVjdGVkICRhcHBsaWVkRGVmYXVsdHMgPSBbXTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKAomJGVsZW1lbnQsCiRzY2hlbWEgPSBudWxsLAo/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLAokcHJvcGVydGllcyA9IG51bGwsCiRhZGRpdGlvbmFsUHJvcCA9IG51bGwsCiRwYXR0ZXJuUHJvcGVydGllcyA9IG51bGwsCiRhcHBsaWVkRGVmYXVsdHMgPSBbXQopOiB2b2lkIHsKaWYgKCRlbGVtZW50IGluc3RhbmNlb2YgVW5kZWZpbmVkQ29uc3RyYWludCkgewpyZXR1cm47Cn0KCiR0aGlzLT5hcHBsaWVkRGVmYXVsdHMgPSAkYXBwbGllZERlZmF1bHRzOwoKJG1hdGNoZXMgPSBbXTsKaWYgKCRwYXR0ZXJuUHJvcGVydGllcykgewoKJG1hdGNoZXMgPSAkdGhpcy0+dmFsaWRhdGVQYXR0ZXJuUHJvcGVydGllcygkZWxlbWVudCwgJHBhdGgsICRwYXR0ZXJuUHJvcGVydGllcyk7Cn0KCmlmICgkcHJvcGVydGllcykgewoKJHRoaXMtPnZhbGlkYXRlUHJvcGVydGllcygkZWxlbWVudCwgJHByb3BlcnRpZXMsICRwYXRoKTsKfQoKCiR0aGlzLT52YWxpZGF0ZUVsZW1lbnQoJGVsZW1lbnQsICRtYXRjaGVzLCAkc2NoZW1hLCAkcGF0aCwgJHByb3BlcnRpZXMsICRhZGRpdGlvbmFsUHJvcCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZVBhdHRlcm5Qcm9wZXJ0aWVzKCRlbGVtZW50LCA/SnNvblBvaW50ZXIgJHBhdGgsICRwYXR0ZXJuUHJvcGVydGllcykKewokbWF0Y2hlcyA9IFtdOwpmb3JlYWNoICgkcGF0dGVyblByb3BlcnRpZXMgYXMgJHByZWdleCA9PiAkc2NoZW1hKSB7CiRmdWxsUmVnZXggPSBzZWxmOjpqc29uUGF0dGVyblRvUGhwUmVnZXgoJHByZWdleCk7CgoKaWYgKEBwcmVnX21hdGNoKCRmdWxsUmVnZXgsICcnKSA9PT0gZmFsc2UpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6UFJFR0VYX0lOVkFMSUQoKSwgJHBhdGgsIFsncHJlZ2V4JyA9PiAkcHJlZ2V4XSk7CmNvbnRpbnVlOwp9CmZvcmVhY2ggKCRlbGVtZW50IGFzICRpID0+ICR2YWx1ZSkgewppZiAocHJlZ19tYXRjaCgkZnVsbFJlZ2V4LCAoc3RyaW5nKSAkaSkpIHsKJG1hdGNoZXNbXSA9ICRpOwokdGhpcy0+Y2hlY2tVbmRlZmluZWQoJHZhbHVlLCAkc2NoZW1hID86IG5ldyBcc3RkQ2xhc3MoKSwgJHBhdGgsICRpLCBpbl9hcnJheSgkaSwgJHRoaXMtPmFwcGxpZWREZWZhdWx0cykpOwp9Cn0KfQoKcmV0dXJuICRtYXRjaGVzOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHZhbGlkYXRlRWxlbWVudCgkZWxlbWVudCwgJG1hdGNoZXMsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLAokcHJvcGVydGllcyA9IG51bGwsICRhZGRpdGlvbmFsUHJvcCA9IG51bGwpCnsKJHRoaXMtPnZhbGlkYXRlTWluTWF4Q29uc3RyYWludCgkZWxlbWVudCwgJHNjaGVtYSwgJHBhdGgpOwoKZm9yZWFjaCAoJGVsZW1lbnQgYXMgJGkgPT4gJHZhbHVlKSB7CiRkZWZpbml0aW9uID0gJHRoaXMtPmdldFByb3BlcnR5KCRwcm9wZXJ0aWVzLCAkaSk7CgoKaWYgKCFpbl9hcnJheSgkaSwgJG1hdGNoZXMpICYmICRhZGRpdGlvbmFsUHJvcCA9PT0gZmFsc2UgJiYgJHRoaXMtPmlubGluZVNjaGVtYVByb3BlcnR5ICE9PSAkaSAmJiAhJGRlZmluaXRpb24pIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6QURESVRJT05BTF9QUk9QRVJUSUVTKCksICRwYXRoLCBbJ3Byb3BlcnR5JyA9PiAkaV0pOwp9CgoKaWYgKCFpbl9hcnJheSgkaSwgJG1hdGNoZXMpICYmICRhZGRpdGlvbmFsUHJvcCAmJiAhJGRlZmluaXRpb24pIHsKaWYgKCRhZGRpdGlvbmFsUHJvcCA9PT0gdHJ1ZSkgewokdGhpcy0+Y2hlY2tVbmRlZmluZWQoJHZhbHVlLCBudWxsLCAkcGF0aCwgJGksIGluX2FycmF5KCRpLCAkdGhpcy0+YXBwbGllZERlZmF1bHRzKSk7Cn0gZWxzZSB7CiR0aGlzLT5jaGVja1VuZGVmaW5lZCgkdmFsdWUsICRhZGRpdGlvbmFsUHJvcCwgJHBhdGgsICRpLCBpbl9hcnJheSgkaSwgJHRoaXMtPmFwcGxpZWREZWZhdWx0cykpOwp9Cn0KCgokcmVxdWlyZSA9ICR0aGlzLT5nZXRQcm9wZXJ0eSgkZGVmaW5pdGlvbiwgJ3JlcXVpcmVzJyk7CmlmICgkcmVxdWlyZSAmJiAhJHRoaXMtPmdldFByb3BlcnR5KCRlbGVtZW50LCAkcmVxdWlyZSkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6UkVRVUlSRVMoKSwgJHBhdGgsIFsKJ3Byb3BlcnR5JyA9PiAkaSwKJ3JlcXVpcmVkUHJvcGVydHknID0+ICRyZXF1aXJlCl0pOwp9CgokcHJvcGVydHkgPSAkdGhpcy0+Z2V0UHJvcGVydHkoJGVsZW1lbnQsICRpLCAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ3VuZGVmaW5lZCcpKTsKaWYgKGlzX29iamVjdCgkcHJvcGVydHkpKSB7CiR0aGlzLT52YWxpZGF0ZU1pbk1heENvbnN0cmFpbnQoISgkcHJvcGVydHkgaW5zdGFuY2VvZiBVbmRlZmluZWRDb25zdHJhaW50KSA/ICRwcm9wZXJ0eSA6ICRlbGVtZW50LCAkZGVmaW5pdGlvbiwgJHBhdGgpOwp9Cn0KfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnRpZXMoJiRlbGVtZW50LCAkcHJvcGVydGllcyA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwpCnsKJHVuZGVmaW5lZENvbnN0cmFpbnQgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ3VuZGVmaW5lZCcpOwoKZm9yZWFjaCAoJHByb3BlcnRpZXMgYXMgJGkgPT4gJHZhbHVlKSB7CiRwcm9wZXJ0eSA9ICYkdGhpcy0+Z2V0UHJvcGVydHkoJGVsZW1lbnQsICRpLCAkdW5kZWZpbmVkQ29uc3RyYWludCk7CiRkZWZpbml0aW9uID0gJHRoaXMtPmdldFByb3BlcnR5KCRwcm9wZXJ0aWVzLCAkaSk7CgppZiAoaXNfb2JqZWN0KCRkZWZpbml0aW9uKSkgewoKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCRwcm9wZXJ0eSwgJGRlZmluaXRpb24sICRwYXRoLCAkaSwgaW5fYXJyYXkoJGksICR0aGlzLT5hcHBsaWVkRGVmYXVsdHMpKTsKfQp9Cn0KCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiAmZ2V0UHJvcGVydHkoJiRlbGVtZW50LCAkcHJvcGVydHksICRmYWxsYmFjayA9IG51bGwpCnsKaWYgKGlzX2FycmF5KCRlbGVtZW50KSAmJiAoaXNzZXQoJGVsZW1lbnRbJHByb3BlcnR5XSkgfHwgYXJyYXlfa2V5X2V4aXN0cygkcHJvcGVydHksICRlbGVtZW50KSkgKSB7CnJldHVybiAkZWxlbWVudFskcHJvcGVydHldOwp9IGVsc2VpZiAoaXNfb2JqZWN0KCRlbGVtZW50KSAmJiBwcm9wZXJ0eV9leGlzdHMoJGVsZW1lbnQsIChzdHJpbmcpICRwcm9wZXJ0eSkpIHsKcmV0dXJuICRlbGVtZW50LT4kcHJvcGVydHk7Cn0KCnJldHVybiAkZmFsbGJhY2s7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdmFsaWRhdGVNaW5NYXhDb25zdHJhaW50KCRlbGVtZW50LCAkb2JqZWN0RGVmaW5pdGlvbiwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCkKewppZiAoISR0aGlzLT5nZXRUeXBlQ2hlY2soKTo6aXNPYmplY3QoJGVsZW1lbnQpKSB7CnJldHVybjsKfQoKCmlmIChpc3NldCgkb2JqZWN0RGVmaW5pdGlvbi0+bWluUHJvcGVydGllcykgJiYgaXNfaW50KCRvYmplY3REZWZpbml0aW9uLT5taW5Qcm9wZXJ0aWVzKSkgewppZiAoJHRoaXMtPmdldFR5cGVDaGVjaygpLT5wcm9wZXJ0eUNvdW50KCRlbGVtZW50KSA8IG1heCgwLCAkb2JqZWN0RGVmaW5pdGlvbi0+bWluUHJvcGVydGllcykpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6UFJPUEVSVElFU19NSU4oKSwgJHBhdGgsIFsnbWluUHJvcGVydGllcycgPT4gJG9iamVjdERlZmluaXRpb24tPm1pblByb3BlcnRpZXNdKTsKfQp9CgppZiAoaXNzZXQoJG9iamVjdERlZmluaXRpb24tPm1heFByb3BlcnRpZXMpICYmIGlzX2ludCgkb2JqZWN0RGVmaW5pdGlvbi0+bWF4UHJvcGVydGllcykpIHsKaWYgKCR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+cHJvcGVydHlDb3VudCgkZWxlbWVudCkgPiBtYXgoMCwgJG9iamVjdERlZmluaXRpb24tPm1heFByb3BlcnRpZXMpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OlBST1BFUlRJRVNfTUFYKCksICRwYXRoLCBbJ21heFByb3BlcnRpZXMnID0+ICRvYmplY3REZWZpbml0aW9uLT5tYXhQcm9wZXJ0aWVzXSk7Cn0KfQp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzOwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxEcmFmdElkZW50aWZpZXJzOwp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CnVzZSBKc29uU2NoZW1hXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBKc29uU2NoZW1hXEV4Y2VwdGlvblxJbnZhbGlkU2NoZW1hRXhjZXB0aW9uOwp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cUnVudGltZUV4Y2VwdGlvbjsKdXNlIEpzb25TY2hlbWFcVmFsaWRhdG9yOwoKCgoKCgoKY2xhc3MgU2NoZW1hQ29uc3RyYWludCBleHRlbmRzIENvbnN0cmFpbnQKewpwcml2YXRlIGNvbnN0IERFRkFVTFRfU0NIRU1BX1NQRUMgPSBEcmFmdElkZW50aWZpZXJzOjpEUkFGVF80OwoKCgoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkZWxlbWVudCwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoJHNjaGVtYSAhPT0gbnVsbCkgewoKJHZhbGlkYXRpb25TY2hlbWEgPSAkc2NoZW1hOwp9IGVsc2VpZiAoJHRoaXMtPmdldFR5cGVDaGVjaygpLT5wcm9wZXJ0eUV4aXN0cygkZWxlbWVudCwgJHRoaXMtPmlubGluZVNjaGVtYVByb3BlcnR5KSkgewoKJHZhbGlkYXRpb25TY2hlbWEgPSAkdGhpcy0+Z2V0VHlwZUNoZWNrKCktPnByb3BlcnR5R2V0KCRlbGVtZW50LCAkdGhpcy0+aW5saW5lU2NoZW1hUHJvcGVydHkpOwp9IGVsc2Ugewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdubyBzY2hlbWEgZm91bmQgdG8gdmVyaWZ5IGFnYWluc3QnKTsKfQoKCmlmIChpc19hcnJheSgkdmFsaWRhdGlvblNjaGVtYSkpIHsKJHZhbGlkYXRpb25TY2hlbWEgPSBCYXNlQ29uc3RyYWludDo6YXJyYXlUb09iamVjdFJlY3Vyc2l2ZSgkdmFsaWRhdGlvblNjaGVtYSk7Cn0KCgoKaWYgKCR0aGlzLT5mYWN0b3J5LT5nZXRDb25maWcoc2VsZjo6Q0hFQ0tfTU9ERV9WQUxJREFURV9TQ0hFTUEpKSB7CmlmICghJHRoaXMtPmdldFR5cGVDaGVjaygpLT5pc09iamVjdCgkdmFsaWRhdGlvblNjaGVtYSkpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ0Nhbm5vdCB2YWxpZGF0ZSB0aGUgc2NoZW1hIG9mIGEgbm9uLW9iamVjdCcpOwp9CmlmICgkdGhpcy0+Z2V0VHlwZUNoZWNrKCktPnByb3BlcnR5RXhpc3RzKCR2YWxpZGF0aW9uU2NoZW1hLCAnJHNjaGVtYScpKSB7CiRzY2hlbWFTcGVjID0gJHRoaXMtPmdldFR5cGVDaGVjaygpLT5wcm9wZXJ0eUdldCgkdmFsaWRhdGlvblNjaGVtYSwgJyRzY2hlbWEnKTsKfSBlbHNlIHsKJHNjaGVtYVNwZWMgPSBzZWxmOjpERUZBVUxUX1NDSEVNQV9TUEVDOwp9CgoKJHNjaGVtYVN0b3JhZ2UgPSAkdGhpcy0+ZmFjdG9yeS0+Z2V0U2NoZW1hU3RvcmFnZSgpOwppZiAoISR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+aXNPYmplY3QoJHNjaGVtYVNwZWMpKSB7CiRzY2hlbWFTcGVjID0gJHNjaGVtYVN0b3JhZ2UtPmdldFNjaGVtYSgkc2NoZW1hU3BlYyk7Cn0KCgokaW5pdGlhbEVycm9yQ291bnQgPSAkdGhpcy0+bnVtRXJyb3JzKCk7CiRpbml0aWFsQ29uZmlnID0gJHRoaXMtPmZhY3RvcnktPmdldENvbmZpZygpOwokaW5pdGlhbENvbnRleHQgPSAkdGhpcy0+ZmFjdG9yeS0+Z2V0RXJyb3JDb250ZXh0KCk7CiR0aGlzLT5mYWN0b3J5LT5yZW1vdmVDb25maWcoc2VsZjo6Q0hFQ0tfTU9ERV9WQUxJREFURV9TQ0hFTUEgfCBzZWxmOjpDSEVDS19NT0RFX0FQUExZX0RFRkFVTFRTKTsKJHRoaXMtPmZhY3RvcnktPmFkZENvbmZpZyhzZWxmOjpDSEVDS19NT0RFX1RZUEVfQ0FTVCk7CiR0aGlzLT5mYWN0b3J5LT5zZXRFcnJvckNvbnRleHQoVmFsaWRhdG9yOjpFUlJPUl9TQ0hFTUFfVkFMSURBVElPTik7CgoKdHJ5IHsKJHRoaXMtPmNoZWNrKCR2YWxpZGF0aW9uU2NoZW1hLCAkc2NoZW1hU3BlYyk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKaWYgKCR0aGlzLT5mYWN0b3J5LT5nZXRDb25maWcoc2VsZjo6Q0hFQ0tfTU9ERV9FWENFUFRJT05TKSkgewp0aHJvdyBuZXcgSW52YWxpZFNjaGVtYUV4Y2VwdGlvbignU2NoZW1hIGRpZCBub3QgcGFzcyB2YWxpZGF0aW9uJywgMCwgJGUpOwp9Cn0KaWYgKCR0aGlzLT5udW1FcnJvcnMoKSA+ICRpbml0aWFsRXJyb3JDb3VudCkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpJTlZBTElEX1NDSEVNQSgpLCAkcGF0aCk7Cn0KCgokdGhpcy0+ZmFjdG9yeS0+c2V0Q29uZmlnKCRpbml0aWFsQ29uZmlnKTsKJHRoaXMtPmZhY3RvcnktPnNldEVycm9yQ29udGV4dCgkaW5pdGlhbENvbnRleHQpOwp9CgoKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCRlbGVtZW50LCAkdmFsaWRhdGlvblNjaGVtYSwgJHBhdGgsICRpKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50czsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKCgoKCgoKY2xhc3MgU3RyaW5nQ29uc3RyYWludCBleHRlbmRzIENvbnN0cmFpbnQKewoKCgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiRlbGVtZW50LCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CgppZiAoaXNzZXQoJHNjaGVtYS0+bWF4TGVuZ3RoKSAmJiAkdGhpcy0+c3RybGVuKCRlbGVtZW50KSA+ICRzY2hlbWEtPm1heExlbmd0aCkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpMRU5HVEhfTUFYKCksICRwYXRoLCBbCidtYXhMZW5ndGgnID0+ICRzY2hlbWEtPm1heExlbmd0aCwKXSk7Cn0KCgppZiAoaXNzZXQoJHNjaGVtYS0+bWluTGVuZ3RoKSAmJiAkdGhpcy0+c3RybGVuKCRlbGVtZW50KSA8ICRzY2hlbWEtPm1pbkxlbmd0aCkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpMRU5HVEhfTUlOKCksICRwYXRoLCBbCidtaW5MZW5ndGgnID0+ICRzY2hlbWEtPm1pbkxlbmd0aCwKXSk7Cn0KCgppZiAoaXNzZXQoJHNjaGVtYS0+cGF0dGVybikgJiYgIXByZWdfbWF0Y2goc2VsZjo6anNvblBhdHRlcm5Ub1BocFJlZ2V4KCRzY2hlbWEtPnBhdHRlcm4pLCAkZWxlbWVudCkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6UEFUVEVSTigpLCAkcGF0aCwgWwoncGF0dGVybicgPT4gJHNjaGVtYS0+cGF0dGVybiwKXSk7Cn0KCiR0aGlzLT5jaGVja0Zvcm1hdCgkZWxlbWVudCwgJHNjaGVtYSwgJHBhdGgsICRpKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBzdHJsZW4oJHN0cmluZykKewppZiAoZXh0ZW5zaW9uX2xvYWRlZCgnbWJzdHJpbmcnKSkgewpyZXR1cm4gbWJfc3RybGVuKCRzdHJpbmcsIG1iX2RldGVjdF9lbmNvZGluZygkc3RyaW5nKSk7Cn0KCgpyZXR1cm4gc3RybGVuKCRzdHJpbmcpOyAKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXFR5cGVDaGVjazsKCmNsYXNzIExvb3NlVHlwZUNoZWNrIGltcGxlbWVudHMgVHlwZUNoZWNrSW50ZXJmYWNlCnsKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc09iamVjdCgkdmFsdWUpCnsKcmV0dXJuCmlzX29iamVjdCgkdmFsdWUpIHx8Cihpc19hcnJheSgkdmFsdWUpICYmIChjb3VudCgkdmFsdWUpID09IDAgfHwgc2VsZjo6aXNBc3NvY2lhdGl2ZUFycmF5KCR2YWx1ZSkpKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0FycmF5KCR2YWx1ZSkKewpyZXR1cm4KaXNfYXJyYXkoJHZhbHVlKSAmJgooY291bnQoJHZhbHVlKSA9PSAwIHx8ICFzZWxmOjppc0Fzc29jaWF0aXZlQXJyYXkoJHZhbHVlKSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJvcGVydHlHZXQoJHZhbHVlLCAkcHJvcGVydHkpCnsKaWYgKGlzX29iamVjdCgkdmFsdWUpKSB7CnJldHVybiAkdmFsdWUtPnskcHJvcGVydHl9Owp9CgpyZXR1cm4gJHZhbHVlWyRwcm9wZXJ0eV07Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJvcGVydHlTZXQoJiR2YWx1ZSwgJHByb3BlcnR5LCAkZGF0YSkKewppZiAoaXNfb2JqZWN0KCR2YWx1ZSkpIHsKJHZhbHVlLT57JHByb3BlcnR5fSA9ICRkYXRhOwp9IGVsc2UgewokdmFsdWVbJHByb3BlcnR5XSA9ICRkYXRhOwp9Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJvcGVydHlFeGlzdHMoJHZhbHVlLCAkcHJvcGVydHkpCnsKaWYgKGlzX29iamVjdCgkdmFsdWUpKSB7CnJldHVybiBwcm9wZXJ0eV9leGlzdHMoJHZhbHVlLCAkcHJvcGVydHkpOwp9CgpyZXR1cm4gaXNfYXJyYXkoJHZhbHVlKSAmJiBhcnJheV9rZXlfZXhpc3RzKCRwcm9wZXJ0eSwgJHZhbHVlKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcm9wZXJ0eUNvdW50KCR2YWx1ZSkKewppZiAoaXNfb2JqZWN0KCR2YWx1ZSkpIHsKcmV0dXJuIGNvdW50KGdldF9vYmplY3RfdmFycygkdmFsdWUpKTsKfQoKcmV0dXJuIGNvdW50KCR2YWx1ZSk7Cn0KCgoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpc0Fzc29jaWF0aXZlQXJyYXkoJGFycikKewpyZXR1cm4gYXJyYXlfa2V5cygkYXJyKSAhPT0gcmFuZ2UoMCwgY291bnQoJGFycikgLSAxKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXFR5cGVDaGVjazsKCmNsYXNzIFN0cmljdFR5cGVDaGVjayBpbXBsZW1lbnRzIFR5cGVDaGVja0ludGVyZmFjZQp7CnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNPYmplY3QoJHZhbHVlKQp7CnJldHVybiBpc19vYmplY3QoJHZhbHVlKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0FycmF5KCR2YWx1ZSkKewpyZXR1cm4gaXNfYXJyYXkoJHZhbHVlKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcm9wZXJ0eUdldCgkdmFsdWUsICRwcm9wZXJ0eSkKewpyZXR1cm4gJHZhbHVlLT57JHByb3BlcnR5fTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcm9wZXJ0eVNldCgmJHZhbHVlLCAkcHJvcGVydHksICRkYXRhKQp7CiR2YWx1ZS0+eyRwcm9wZXJ0eX0gPSAkZGF0YTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcm9wZXJ0eUV4aXN0cygkdmFsdWUsICRwcm9wZXJ0eSkKewpyZXR1cm4gcHJvcGVydHlfZXhpc3RzKCR2YWx1ZSwgJHByb3BlcnR5KTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcm9wZXJ0eUNvdW50KCR2YWx1ZSkKewppZiAoIWlzX29iamVjdCgkdmFsdWUpKSB7CnJldHVybiAwOwp9CgpyZXR1cm4gY291bnQoZ2V0X29iamVjdF92YXJzKCR2YWx1ZSkpOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcVHlwZUNoZWNrOwoKaW50ZXJmYWNlIFR5cGVDaGVja0ludGVyZmFjZQp7CnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNPYmplY3QoJHZhbHVlKTsKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNBcnJheSgkdmFsdWUpOwoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcm9wZXJ0eUdldCgkdmFsdWUsICRwcm9wZXJ0eSk7CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByb3BlcnR5U2V0KCYkdmFsdWUsICRwcm9wZXJ0eSwgJGRhdGEpOwoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcm9wZXJ0eUV4aXN0cygkdmFsdWUsICRwcm9wZXJ0eSk7CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByb3BlcnR5Q291bnQoJHZhbHVlKTsKfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHM7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbiBhcyBTdGFuZGFyZFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbjsKCgoKCgoKCmNsYXNzIFR5cGVDb25zdHJhaW50IGV4dGVuZHMgQ29uc3RyYWludAp7CgoKCnB1YmxpYyBzdGF0aWMgJHdvcmRpbmcgPSBbCidpbnRlZ2VyJyA9PiAnYW4gaW50ZWdlcicsCidudW1iZXInID0+ICdhIG51bWJlcicsCidib29sZWFuJyA9PiAnYSBib29sZWFuJywKJ29iamVjdCcgPT4gJ2FuIG9iamVjdCcsCidhcnJheScgPT4gJ2FuIGFycmF5JywKJ3N0cmluZycgPT4gJ2Egc3RyaW5nJywKJ251bGwnID0+ICdhIG51bGwnLAonYW55JyA9PiBudWxsLCAKMCA9PiBudWxsLCAKXTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlID0gbnVsbCwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewokdHlwZSA9IGlzc2V0KCRzY2hlbWEtPnR5cGUpID8gJHNjaGVtYS0+dHlwZSA6IG51bGw7CiRpc1ZhbGlkID0gZmFsc2U7CiRjb2VyY2UgPSAkdGhpcy0+ZmFjdG9yeS0+Z2V0Q29uZmlnKHNlbGY6OkNIRUNLX01PREVfQ09FUkNFX1RZUEVTKTsKJGVhcmx5Q29lcmNlID0gJHRoaXMtPmZhY3RvcnktPmdldENvbmZpZyhzZWxmOjpDSEVDS19NT0RFX0VBUkxZX0NPRVJDRSk7CiR3b3JkaW5nID0gW107CgppZiAoaXNfYXJyYXkoJHR5cGUpKSB7CiR0aGlzLT52YWxpZGF0ZVR5cGVzQXJyYXkoJHZhbHVlLCAkdHlwZSwgJHdvcmRpbmcsICRpc1ZhbGlkLCAkcGF0aCwgJGNvZXJjZSAmJiAkZWFybHlDb2VyY2UpOwppZiAoISRpc1ZhbGlkICYmICRjb2VyY2UgJiYgISRlYXJseUNvZXJjZSkgewokdGhpcy0+dmFsaWRhdGVUeXBlc0FycmF5KCR2YWx1ZSwgJHR5cGUsICR3b3JkaW5nLCAkaXNWYWxpZCwgJHBhdGgsIHRydWUpOwp9Cn0gZWxzZWlmIChpc19vYmplY3QoJHR5cGUpKSB7CiR0aGlzLT5jaGVja1VuZGVmaW5lZCgkdmFsdWUsICR0eXBlLCAkcGF0aCk7CgpyZXR1cm47Cn0gZWxzZSB7CiRpc1ZhbGlkID0gJHRoaXMtPnZhbGlkYXRlVHlwZSgkdmFsdWUsICR0eXBlLCAkY29lcmNlICYmICRlYXJseUNvZXJjZSk7CmlmICghJGlzVmFsaWQgJiYgJGNvZXJjZSAmJiAhJGVhcmx5Q29lcmNlKSB7CiRpc1ZhbGlkID0gJHRoaXMtPnZhbGlkYXRlVHlwZSgkdmFsdWUsICR0eXBlLCB0cnVlKTsKfQp9CgppZiAoJGlzVmFsaWQgPT09IGZhbHNlKSB7CmlmICghaXNfYXJyYXkoJHR5cGUpKSB7CiR0aGlzLT52YWxpZGF0ZVR5cGVOYW1lV29yZGluZygkdHlwZSk7CiR3b3JkaW5nW10gPSBzZWxmOjokd29yZGluZ1skdHlwZV07Cn0KJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6VFlQRSgpLCAkcGF0aCwgWwonZm91bmQnID0+IGdldHR5cGUoJHZhbHVlKSwKJ2V4cGVjdGVkJyA9PiAkdGhpcy0+aW1wbG9kZVdpdGgoJHdvcmRpbmcsICcsICcsICdvcicpCl0pOwp9Cn0KCgoKCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB2YWxpZGF0ZVR5cGVzQXJyYXkoJiR2YWx1ZSwgYXJyYXkgJHR5cGUsICYkdmFsaWRUeXBlc1dvcmRpbmcsICYkaXNWYWxpZCwgJHBhdGgsICRjb2VyY2UgPSBmYWxzZSkKewpmb3JlYWNoICgkdHlwZSBhcyAkdHApIHsKCmlmICgkaXNWYWxpZCkgewpyZXR1cm47Cn0KCgoKaWYgKGlzX29iamVjdCgkdHApKSB7CmlmICghJGlzVmFsaWQpIHsKJHZhbGlkYXRvciA9ICR0aGlzLT5mYWN0b3J5LT5jcmVhdGVJbnN0YW5jZUZvcigndHlwZScpOwokc3ViU2NoZW1hID0gbmV3IFxzdGRDbGFzcygpOwokc3ViU2NoZW1hLT50eXBlID0gJHRwOwokdmFsaWRhdG9yLT5jaGVjaygkdmFsdWUsICRzdWJTY2hlbWEsICRwYXRoLCBudWxsKTsKJGVycm9yID0gJHZhbGlkYXRvci0+Z2V0RXJyb3JzKCk7CiRpc1ZhbGlkID0gIShib29sKSAkZXJyb3I7CiR2YWxpZFR5cGVzV29yZGluZ1tdID0gc2VsZjo6JHdvcmRpbmdbJ29iamVjdCddOwp9Cn0gZWxzZSB7CiR0aGlzLT52YWxpZGF0ZVR5cGVOYW1lV29yZGluZygkdHApOwokdmFsaWRUeXBlc1dvcmRpbmdbXSA9IHNlbGY6OiR3b3JkaW5nWyR0cF07CmlmICghJGlzVmFsaWQpIHsKJGlzVmFsaWQgPSAkdGhpcy0+dmFsaWRhdGVUeXBlKCR2YWx1ZSwgJHRwLCAkY29lcmNlKTsKfQp9Cn0KfQoKCgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW1wbG9kZVdpdGgoYXJyYXkgJGVsZW1lbnRzLCAkZGVsaW1pdGVyID0gJywgJywgJGxpc3RFbmQgPSBmYWxzZSkKewppZiAoJGxpc3RFbmQgPT09IGZhbHNlIHx8ICFpc3NldCgkZWxlbWVudHNbMV0pKSB7CnJldHVybiBpbXBsb2RlKCRkZWxpbWl0ZXIsICRlbGVtZW50cyk7Cn0KJGxhc3RFbGVtZW50ID0gYXJyYXlfc2xpY2UoJGVsZW1lbnRzLCAtMSk7CiRmaXJzRWxlbWVudHMgPSBqb2luKCRkZWxpbWl0ZXIsIGFycmF5X3NsaWNlKCRlbGVtZW50cywgMCwgLTEpKTsKJGltcGxvZGVkRWxlbWVudHMgPSBhcnJheV9tZXJnZShbJGZpcnNFbGVtZW50c10sICRsYXN0RWxlbWVudCk7CgpyZXR1cm4gam9pbigiICRsaXN0RW5kICIsICRpbXBsb2RlZEVsZW1lbnRzKTsKfQoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdmFsaWRhdGVUeXBlTmFtZVdvcmRpbmcoJHR5cGUpCnsKaWYgKCFhcnJheV9rZXlfZXhpc3RzKCR0eXBlLCBzZWxmOjokd29yZGluZykpIHsKdGhyb3cgbmV3IFN0YW5kYXJkVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKApzcHJpbnRmKAonTm8gd29yZGluZyBmb3IgJXMgYXZhaWxhYmxlLCBleHBlY3RlZCB3b3JkaW5ncyBhcmU6IFslc10nLAp2YXJfZXhwb3J0KCR0eXBlLCB0cnVlKSwKaW1wbG9kZSgnLCAnLCBhcnJheV9maWx0ZXIoc2VsZjo6JHdvcmRpbmcpKSkKKTsKfQp9CgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlVHlwZSgmJHZhbHVlLCAkdHlwZSwgJGNvZXJjZSA9IGZhbHNlKQp7CgppZiAoISR0eXBlKSB7CnJldHVybiB0cnVlOwp9CgppZiAoJ2FueScgPT09ICR0eXBlKSB7CnJldHVybiB0cnVlOwp9CgppZiAoJ29iamVjdCcgPT09ICR0eXBlKSB7CnJldHVybiAkdGhpcy0+Z2V0VHlwZUNoZWNrKCktPmlzT2JqZWN0KCR2YWx1ZSk7Cn0KCmlmICgnYXJyYXknID09PSAkdHlwZSkgewppZiAoJGNvZXJjZSkgewokdmFsdWUgPSAkdGhpcy0+dG9BcnJheSgkdmFsdWUpOwp9CgpyZXR1cm4gJHRoaXMtPmdldFR5cGVDaGVjaygpLT5pc0FycmF5KCR2YWx1ZSk7Cn0KCmlmICgnaW50ZWdlcicgPT09ICR0eXBlKSB7CmlmICgkY29lcmNlKSB7CiR2YWx1ZSA9ICR0aGlzLT50b0ludGVnZXIoJHZhbHVlKTsKfQoKcmV0dXJuIGlzX2ludCgkdmFsdWUpOwp9CgppZiAoJ251bWJlcicgPT09ICR0eXBlKSB7CmlmICgkY29lcmNlKSB7CiR2YWx1ZSA9ICR0aGlzLT50b051bWJlcigkdmFsdWUpOwp9CgpyZXR1cm4gaXNfbnVtZXJpYygkdmFsdWUpICYmICFpc19zdHJpbmcoJHZhbHVlKTsKfQoKaWYgKCdib29sZWFuJyA9PT0gJHR5cGUpIHsKaWYgKCRjb2VyY2UpIHsKJHZhbHVlID0gJHRoaXMtPnRvQm9vbGVhbigkdmFsdWUpOwp9CgpyZXR1cm4gaXNfYm9vbCgkdmFsdWUpOwp9CgppZiAoJ3N0cmluZycgPT09ICR0eXBlKSB7CmlmICgkY29lcmNlKSB7CiR2YWx1ZSA9ICR0aGlzLT50b1N0cmluZygkdmFsdWUpOwp9CgpyZXR1cm4gaXNfc3RyaW5nKCR2YWx1ZSk7Cn0KCmlmICgnbnVsbCcgPT09ICR0eXBlKSB7CmlmICgkY29lcmNlKSB7CiR2YWx1ZSA9ICR0aGlzLT50b051bGwoJHZhbHVlKTsKfQoKcmV0dXJuIGlzX251bGwoJHZhbHVlKTsKfQoKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigoaXNfb2JqZWN0KCR2YWx1ZSkgPyAnb2JqZWN0JyA6ICR2YWx1ZSkgLiAnIGlzIGFuIGludmFsaWQgdHlwZSBmb3IgJyAuICR0eXBlKTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB0b0Jvb2xlYW4oJHZhbHVlKQp7CmlmICgkdmFsdWUgPT09IDEgfHwgJHZhbHVlID09PSAndHJ1ZScpIHsKcmV0dXJuIHRydWU7Cn0KaWYgKGlzX251bGwoJHZhbHVlKSB8fCAkdmFsdWUgPT09IDAgfHwgJHZhbHVlID09PSAnZmFsc2UnKSB7CnJldHVybiBmYWxzZTsKfQppZiAoJHRoaXMtPmdldFR5cGVDaGVjaygpLT5pc0FycmF5KCR2YWx1ZSkgJiYgY291bnQoJHZhbHVlKSA9PT0gMSkgewpyZXR1cm4gJHRoaXMtPnRvQm9vbGVhbihyZXNldCgkdmFsdWUpKTsKfQoKcmV0dXJuICR2YWx1ZTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB0b051bWJlcigkdmFsdWUpCnsKaWYgKGlzX251bWVyaWMoJHZhbHVlKSkgewpyZXR1cm4gJHZhbHVlICsgMDsgCn0KaWYgKGlzX2Jvb2woJHZhbHVlKSB8fCBpc19udWxsKCR2YWx1ZSkpIHsKcmV0dXJuIChpbnQpICR2YWx1ZTsKfQppZiAoJHRoaXMtPmdldFR5cGVDaGVjaygpLT5pc0FycmF5KCR2YWx1ZSkgJiYgY291bnQoJHZhbHVlKSA9PT0gMSkgewpyZXR1cm4gJHRoaXMtPnRvTnVtYmVyKHJlc2V0KCR2YWx1ZSkpOwp9CgpyZXR1cm4gJHZhbHVlOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHRvSW50ZWdlcigkdmFsdWUpCnsKJG51bWJlclZhbHVlID0gJHRoaXMtPnRvTnVtYmVyKCR2YWx1ZSk7CmlmIChpc19udW1lcmljKCRudW1iZXJWYWx1ZSkgJiYgKGludCkgJG51bWJlclZhbHVlID09ICRudW1iZXJWYWx1ZSkgewpyZXR1cm4gKGludCkgJG51bWJlclZhbHVlOyAKfQoKcmV0dXJuICR2YWx1ZTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB0b0FycmF5KCR2YWx1ZSkKewppZiAoaXNfc2NhbGFyKCR2YWx1ZSkgfHwgaXNfbnVsbCgkdmFsdWUpKSB7CnJldHVybiBbJHZhbHVlXTsKfQoKcmV0dXJuICR2YWx1ZTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB0b1N0cmluZygkdmFsdWUpCnsKaWYgKGlzX251bWVyaWMoJHZhbHVlKSkgewpyZXR1cm4gIiR2YWx1ZSI7Cn0KaWYgKCR2YWx1ZSA9PT0gdHJ1ZSkgewpyZXR1cm4gJ3RydWUnOwp9CmlmICgkdmFsdWUgPT09IGZhbHNlKSB7CnJldHVybiAnZmFsc2UnOwp9CmlmIChpc19udWxsKCR2YWx1ZSkpIHsKcmV0dXJuICcnOwp9CmlmICgkdGhpcy0+Z2V0VHlwZUNoZWNrKCktPmlzQXJyYXkoJHZhbHVlKSAmJiBjb3VudCgkdmFsdWUpID09PSAxKSB7CnJldHVybiAkdGhpcy0+dG9TdHJpbmcocmVzZXQoJHZhbHVlKSk7Cn0KCnJldHVybiAkdmFsdWU7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdG9OdWxsKCR2YWx1ZSkKewppZiAoJHZhbHVlID09PSAwIHx8ICR2YWx1ZSA9PT0gZmFsc2UgfHwgJHZhbHVlID09PSAnJykgewpyZXR1cm4gbnVsbDsKfQppZiAoJHRoaXMtPmdldFR5cGVDaGVjaygpLT5pc0FycmF5KCR2YWx1ZSkgJiYgY291bnQoJHZhbHVlKSA9PT0gMSkgewpyZXR1cm4gJHRoaXMtPnRvTnVsbChyZXNldCgkdmFsdWUpKTsKfQoKcmV0dXJuICR2YWx1ZTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzOwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xUeXBlQ2hlY2tcTG9vc2VUeXBlQ2hlY2s7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXFZhbGlkYXRpb25FeGNlcHRpb247CnVzZSBKc29uU2NoZW1hXFRvb2xcRGVlcENvcHk7CnVzZSBKc29uU2NoZW1hXFVyaVxVcmlSZXNvbHZlcjsKCiNbXEFsbG93RHluYW1pY1Byb3BlcnRpZXNdCmNsYXNzIFVuZGVmaW5lZENvbnN0cmFpbnQgZXh0ZW5kcyBDb25zdHJhaW50CnsKCgoKcHJvdGVjdGVkICRhcHBsaWVkRGVmYXVsdHMgPSBbXTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsLCBib29sICRmcm9tRGVmYXVsdCA9IGZhbHNlKTogdm9pZAp7CmlmIChpc19udWxsKCRzY2hlbWEpIHx8ICFpc19vYmplY3QoJHNjaGVtYSkpIHsKcmV0dXJuOwp9CgokcGF0aCA9ICR0aGlzLT5pbmNyZW1lbnRQYXRoKCRwYXRoLCAkaSk7CmlmICgkZnJvbURlZmF1bHQpIHsKJHBhdGgtPnNldEZyb21EZWZhdWx0KCk7Cn0KCgokdGhpcy0+dmFsaWRhdGVDb21tb25Qcm9wZXJ0aWVzKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKCgokdGhpcy0+dmFsaWRhdGVPZlByb3BlcnRpZXMoJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJycpOwoKCiR0aGlzLT52YWxpZGF0ZVR5cGVzKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGVUeXBlcygmJHZhbHVlLCAkc2NoZW1hLCBKc29uUG9pbnRlciAkcGF0aCwgJGkgPSBudWxsKQp7CgppZiAoJHRoaXMtPmdldFR5cGVDaGVjaygpLT5pc0FycmF5KCR2YWx1ZSkpIHsKJHRoaXMtPmNoZWNrQXJyYXkoJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwp9CgoKaWYgKExvb3NlVHlwZUNoZWNrOjppc09iamVjdCgkdmFsdWUpKSB7CgoKCiR0aGlzLT5jaGVja09iamVjdCgKJHZhbHVlLAokc2NoZW1hLAokcGF0aCwKaXNzZXQoJHNjaGVtYS0+cHJvcGVydGllcykgPyAkc2NoZW1hLT5wcm9wZXJ0aWVzIDogbnVsbCwKaXNzZXQoJHNjaGVtYS0+YWRkaXRpb25hbFByb3BlcnRpZXMpID8gJHNjaGVtYS0+YWRkaXRpb25hbFByb3BlcnRpZXMgOiBudWxsLAppc3NldCgkc2NoZW1hLT5wYXR0ZXJuUHJvcGVydGllcykgPyAkc2NoZW1hLT5wYXR0ZXJuUHJvcGVydGllcyA6IG51bGwsCiR0aGlzLT5hcHBsaWVkRGVmYXVsdHMKKTsKfQoKCmlmIChpc19zdHJpbmcoJHZhbHVlKSkgewokdGhpcy0+Y2hlY2tTdHJpbmcoJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwp9CgoKaWYgKGlzX251bWVyaWMoJHZhbHVlKSkgewokdGhpcy0+Y2hlY2tOdW1iZXIoJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwp9CgoKaWYgKGlzc2V0KCRzY2hlbWEtPmVudW0pKSB7CiR0aGlzLT5jaGVja0VudW0oJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwp9CgoKaWYgKGlzc2V0KCRzY2hlbWEtPmNvbnN0KSkgewokdGhpcy0+Y2hlY2tDb25zdCgkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7Cn0KfQoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdmFsaWRhdGVDb21tb25Qcm9wZXJ0aWVzKCYkdmFsdWUsICRzY2hlbWEsIEpzb25Qb2ludGVyICRwYXRoLCAkaSA9ICcnKQp7CgppZiAoaXNzZXQoJHNjaGVtYS0+ZXh0ZW5kcykpIHsKaWYgKGlzX3N0cmluZygkc2NoZW1hLT5leHRlbmRzKSkgewokc2NoZW1hLT5leHRlbmRzID0gJHRoaXMtPnZhbGlkYXRlVXJpKCRzY2hlbWEsICRzY2hlbWEtPmV4dGVuZHMpOwp9CmlmIChpc19hcnJheSgkc2NoZW1hLT5leHRlbmRzKSkgewpmb3JlYWNoICgkc2NoZW1hLT5leHRlbmRzIGFzICRleHRlbmRzKSB7CiR0aGlzLT5jaGVja1VuZGVmaW5lZCgkdmFsdWUsICRleHRlbmRzLCAkcGF0aCwgJGkpOwp9Cn0gZWxzZSB7CiR0aGlzLT5jaGVja1VuZGVmaW5lZCgkdmFsdWUsICRzY2hlbWEtPmV4dGVuZHMsICRwYXRoLCAkaSk7Cn0KfQoKCmlmICghJHBhdGgtPmZyb21EZWZhdWx0KCkpIHsKJHRoaXMtPmFwcGx5RGVmYXVsdFZhbHVlcygkdmFsdWUsICRzY2hlbWEsICRwYXRoKTsKfQoKCmlmICgkdGhpcy0+Z2V0VHlwZUNoZWNrKCktPmlzT2JqZWN0KCR2YWx1ZSkpIHsKaWYgKCEoJHZhbHVlIGluc3RhbmNlb2Ygc2VsZikgJiYgaXNzZXQoJHNjaGVtYS0+cmVxdWlyZWQpICYmIGlzX2FycmF5KCRzY2hlbWEtPnJlcXVpcmVkKSkgewoKZm9yZWFjaCAoJHNjaGVtYS0+cmVxdWlyZWQgYXMgJHJlcXVpcmVkKSB7CmlmICghJHRoaXMtPmdldFR5cGVDaGVjaygpLT5wcm9wZXJ0eUV4aXN0cygkdmFsdWUsICRyZXF1aXJlZCkpIHsKJHRoaXMtPmFkZEVycm9yKApDb25zdHJhaW50RXJyb3I6OlJFUVVJUkVEKCksCiR0aGlzLT5pbmNyZW1lbnRQYXRoKCRwYXRoLCAkcmVxdWlyZWQpLCBbCidwcm9wZXJ0eScgPT4gJHJlcXVpcmVkCl0KKTsKfQp9Cn0gZWxzZWlmIChpc3NldCgkc2NoZW1hLT5yZXF1aXJlZCkgJiYgIWlzX2FycmF5KCRzY2hlbWEtPnJlcXVpcmVkKSkgewoKaWYgKCRzY2hlbWEtPnJlcXVpcmVkICYmICR2YWx1ZSBpbnN0YW5jZW9mIHNlbGYpIHsKJHByb3BlcnR5UGF0aHMgPSAkcGF0aC0+Z2V0UHJvcGVydHlQYXRocygpOwokcHJvcGVydHlOYW1lID0gZW5kKCRwcm9wZXJ0eVBhdGhzKTsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6UkVRVUlSRUQoKSwgJHBhdGgsIFsncHJvcGVydHknID0+ICRwcm9wZXJ0eU5hbWVdKTsKfQp9IGVsc2UgewoKCmlmICgkdmFsdWUgaW5zdGFuY2VvZiBzZWxmKSB7CnJldHVybjsKfQp9Cn0KCgppZiAoISgkdmFsdWUgaW5zdGFuY2VvZiBzZWxmKSkgewokdGhpcy0+Y2hlY2tUeXBlKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKfQoKCmlmIChpc3NldCgkc2NoZW1hLT5kaXNhbGxvdykpIHsKJGluaXRFcnJvcnMgPSAkdGhpcy0+Z2V0RXJyb3JzKCk7CgokdHlwZVNjaGVtYSA9IG5ldyBcc3RkQ2xhc3MoKTsKJHR5cGVTY2hlbWEtPnR5cGUgPSAkc2NoZW1hLT5kaXNhbGxvdzsKJHRoaXMtPmNoZWNrVHlwZSgkdmFsdWUsICR0eXBlU2NoZW1hLCAkcGF0aCk7CgoKaWYgKGNvdW50KCR0aGlzLT5nZXRFcnJvcnMoKSkgPT0gY291bnQoJGluaXRFcnJvcnMpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkRJU0FMTE9XKCksICRwYXRoKTsKfSBlbHNlIHsKJHRoaXMtPmVycm9ycyA9ICRpbml0RXJyb3JzOwp9Cn0KCmlmIChpc3NldCgkc2NoZW1hLT5ub3QpKSB7CiRpbml0RXJyb3JzID0gJHRoaXMtPmdldEVycm9ycygpOwokdGhpcy0+Y2hlY2tVbmRlZmluZWQoJHZhbHVlLCAkc2NoZW1hLT5ub3QsICRwYXRoLCAkaSk7CgoKaWYgKGNvdW50KCR0aGlzLT5nZXRFcnJvcnMoKSkgPT0gY291bnQoJGluaXRFcnJvcnMpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6Ok5PVCgpLCAkcGF0aCk7Cn0gZWxzZSB7CiR0aGlzLT5lcnJvcnMgPSAkaW5pdEVycm9yczsKfQp9CgoKaWYgKGlzc2V0KCRzY2hlbWEtPmRlcGVuZGVuY2llcykgJiYgJHRoaXMtPmdldFR5cGVDaGVjaygpLT5pc09iamVjdCgkdmFsdWUpKSB7CiR0aGlzLT52YWxpZGF0ZURlcGVuZGVuY2llcygkdmFsdWUsICRzY2hlbWEtPmRlcGVuZGVuY2llcywgJHBhdGgpOwp9Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gc2hvdWxkQXBwbHlEZWZhdWx0VmFsdWUoJHJlcXVpcmVkT25seSwgJHNjaGVtYSwgJG5hbWUgPSBudWxsLCAkcGFyZW50U2NoZW1hID0gbnVsbCkKewoKaWYgKCEkcmVxdWlyZWRPbmx5KSB7CnJldHVybiB0cnVlOwp9CgppZiAoCiRuYW1lICE9PSBudWxsCiYmIGlzc2V0KCRwYXJlbnRTY2hlbWEtPnJlcXVpcmVkKQomJiBpc19hcnJheSgkcGFyZW50U2NoZW1hLT5yZXF1aXJlZCkKJiYgaW5fYXJyYXkoJG5hbWUsICRwYXJlbnRTY2hlbWEtPnJlcXVpcmVkKQopIHsKcmV0dXJuIHRydWU7Cn0KCmlmIChpc3NldCgkc2NoZW1hLT5yZXF1aXJlZCkgJiYgIWlzX2FycmF5KCRzY2hlbWEtPnJlcXVpcmVkKSAmJiAkc2NoZW1hLT5yZXF1aXJlZCkgewpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGFwcGx5RGVmYXVsdFZhbHVlcygmJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCk6IHZvaWQKewoKaWYgKCEkdGhpcy0+ZmFjdG9yeS0+Z2V0Q29uZmlnKHNlbGY6OkNIRUNLX01PREVfQVBQTFlfREVGQVVMVFMpKSB7CnJldHVybjsKfQoKaWYgKGlzX2Jvb2woJHNjaGVtYSkpIHsKcmV0dXJuOwp9CgoKJHJlcXVpcmVkT25seSA9IChib29sKSAkdGhpcy0+ZmFjdG9yeS0+Z2V0Q29uZmlnKHNlbGY6OkNIRUNLX01PREVfT05MWV9SRVFVSVJFRF9ERUZBVUxUUyk7CmlmIChpc3NldCgkc2NoZW1hLT5wcm9wZXJ0aWVzKSAmJiBMb29zZVR5cGVDaGVjazo6aXNPYmplY3QoJHZhbHVlKSkgewoKZm9yZWFjaCAoJHNjaGVtYS0+cHJvcGVydGllcyBhcyAkY3VycmVudFByb3BlcnR5ID0+ICRwcm9wZXJ0eURlZmluaXRpb24pIHsKJHByb3BlcnR5RGVmaW5pdGlvbiA9ICR0aGlzLT5mYWN0b3J5LT5nZXRTY2hlbWFTdG9yYWdlKCktPnJlc29sdmVSZWZTY2hlbWEoJHByb3BlcnR5RGVmaW5pdGlvbik7CmlmIChpc19ib29sKCRwcm9wZXJ0eURlZmluaXRpb24pKSB7CmNvbnRpbnVlOwp9CmlmICgKIUxvb3NlVHlwZUNoZWNrOjpwcm9wZXJ0eUV4aXN0cygkdmFsdWUsICRjdXJyZW50UHJvcGVydHkpCiYmIHByb3BlcnR5X2V4aXN0cygkcHJvcGVydHlEZWZpbml0aW9uLCAnZGVmYXVsdCcpCiYmICR0aGlzLT5zaG91bGRBcHBseURlZmF1bHRWYWx1ZSgkcmVxdWlyZWRPbmx5LCAkcHJvcGVydHlEZWZpbml0aW9uLCAkY3VycmVudFByb3BlcnR5LCAkc2NoZW1hKQopIHsKCmlmIChpc19vYmplY3QoJHByb3BlcnR5RGVmaW5pdGlvbi0+ZGVmYXVsdCkpIHsKTG9vc2VUeXBlQ2hlY2s6OnByb3BlcnR5U2V0KCR2YWx1ZSwgJGN1cnJlbnRQcm9wZXJ0eSwgY2xvbmUgJHByb3BlcnR5RGVmaW5pdGlvbi0+ZGVmYXVsdCk7Cn0gZWxzZSB7Ckxvb3NlVHlwZUNoZWNrOjpwcm9wZXJ0eVNldCgkdmFsdWUsICRjdXJyZW50UHJvcGVydHksICRwcm9wZXJ0eURlZmluaXRpb24tPmRlZmF1bHQpOwp9CiR0aGlzLT5hcHBsaWVkRGVmYXVsdHNbXSA9ICRjdXJyZW50UHJvcGVydHk7Cn0KfQp9IGVsc2VpZiAoaXNzZXQoJHNjaGVtYS0+aXRlbXMpICYmIExvb3NlVHlwZUNoZWNrOjppc0FycmF5KCR2YWx1ZSkpIHsKJGl0ZW1zID0gW107CmlmIChMb29zZVR5cGVDaGVjazo6aXNBcnJheSgkc2NoZW1hLT5pdGVtcykpIHsKJGl0ZW1zID0gJHNjaGVtYS0+aXRlbXM7Cn0gZWxzZWlmIChpc3NldCgkc2NoZW1hLT5taW5JdGVtcykgJiYgY291bnQoJHZhbHVlKSA8ICRzY2hlbWEtPm1pbkl0ZW1zKSB7CiRpdGVtcyA9IGFycmF5X2ZpbGwoY291bnQoJHZhbHVlKSwgJHNjaGVtYS0+bWluSXRlbXMgLSBjb3VudCgkdmFsdWUpLCAkc2NoZW1hLT5pdGVtcyk7Cn0KCmZvcmVhY2ggKCRpdGVtcyBhcyAkY3VycmVudEl0ZW0gPT4gJGl0ZW1EZWZpbml0aW9uKSB7CiRpdGVtRGVmaW5pdGlvbiA9ICR0aGlzLT5mYWN0b3J5LT5nZXRTY2hlbWFTdG9yYWdlKCktPnJlc29sdmVSZWZTY2hlbWEoJGl0ZW1EZWZpbml0aW9uKTsKaWYgKGlzX2Jvb2woJGl0ZW1EZWZpbml0aW9uKSkgewpjb250aW51ZTsKfQoKaWYgKAohYXJyYXlfa2V5X2V4aXN0cygkY3VycmVudEl0ZW0sICR2YWx1ZSkKJiYgcHJvcGVydHlfZXhpc3RzKCRpdGVtRGVmaW5pdGlvbiwgJ2RlZmF1bHQnKQomJiAkdGhpcy0+c2hvdWxkQXBwbHlEZWZhdWx0VmFsdWUoJHJlcXVpcmVkT25seSwgJGl0ZW1EZWZpbml0aW9uKSkgewppZiAoaXNfb2JqZWN0KCRpdGVtRGVmaW5pdGlvbi0+ZGVmYXVsdCkpIHsKJHZhbHVlWyRjdXJyZW50SXRlbV0gPSBjbG9uZSAkaXRlbURlZmluaXRpb24tPmRlZmF1bHQ7Cn0gZWxzZSB7CiR2YWx1ZVskY3VycmVudEl0ZW1dID0gJGl0ZW1EZWZpbml0aW9uLT5kZWZhdWx0Owp9Cn0KJHBhdGgtPnNldEZyb21EZWZhdWx0KCk7Cn0KfSBlbHNlaWYgKAokdmFsdWUgaW5zdGFuY2VvZiBzZWxmCiYmIHByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnZGVmYXVsdCcpCiYmICR0aGlzLT5zaG91bGRBcHBseURlZmF1bHRWYWx1ZSgkcmVxdWlyZWRPbmx5LCAkc2NoZW1hKSkgewoKJHZhbHVlID0gaXNfb2JqZWN0KCRzY2hlbWEtPmRlZmF1bHQpID8gY2xvbmUgJHNjaGVtYS0+ZGVmYXVsdCA6ICRzY2hlbWEtPmRlZmF1bHQ7CiRwYXRoLT5zZXRGcm9tRGVmYXVsdCgpOwp9Cn0KCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlT2ZQcm9wZXJ0aWVzKCYkdmFsdWUsICRzY2hlbWEsIEpzb25Qb2ludGVyICRwYXRoLCAkaSA9ICcnKQp7CgppZiAoJHZhbHVlIGluc3RhbmNlb2Ygc2VsZikgewpyZXR1cm47Cn0KCmlmIChpc3NldCgkc2NoZW1hLT5hbGxPZikpIHsKJGlzVmFsaWQgPSB0cnVlOwpmb3JlYWNoICgkc2NoZW1hLT5hbGxPZiBhcyAkYWxsT2YpIHsKJGluaXRFcnJvcnMgPSAkdGhpcy0+Z2V0RXJyb3JzKCk7CiR0aGlzLT5jaGVja1VuZGVmaW5lZCgkdmFsdWUsICRhbGxPZiwgJHBhdGgsICRpKTsKJGlzVmFsaWQgPSAkaXNWYWxpZCAmJiAoY291bnQoJHRoaXMtPmdldEVycm9ycygpKSA9PSBjb3VudCgkaW5pdEVycm9ycykpOwp9CmlmICghJGlzVmFsaWQpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6QUxMX09GKCksICRwYXRoKTsKfQp9CgppZiAoaXNzZXQoJHNjaGVtYS0+YW55T2YpKSB7CiRpc1ZhbGlkID0gZmFsc2U7CiRzdGFydEVycm9ycyA9ICR0aGlzLT5nZXRFcnJvcnMoKTsKJGNvZXJjZU9yRGVmYXVsdHMgPSAkdGhpcy0+ZmFjdG9yeS0+Z2V0Q29uZmlnKHNlbGY6OkNIRUNLX01PREVfQ09FUkNFX1RZUEVTIHwgc2VsZjo6Q0hFQ0tfTU9ERV9BUFBMWV9ERUZBVUxUUyk7Cgpmb3JlYWNoICgkc2NoZW1hLT5hbnlPZiBhcyAkYW55T2YpIHsKJGluaXRFcnJvcnMgPSAkdGhpcy0+Z2V0RXJyb3JzKCk7CnRyeSB7CiRhbnlPZlZhbHVlID0gJGNvZXJjZU9yRGVmYXVsdHMgPyBEZWVwQ29weTo6Y29weU9mKCR2YWx1ZSkgOiAkdmFsdWU7CiR0aGlzLT5jaGVja1VuZGVmaW5lZCgkYW55T2ZWYWx1ZSwgJGFueU9mLCAkcGF0aCwgJGkpOwppZiAoJGlzVmFsaWQgPSAoY291bnQoJHRoaXMtPmdldEVycm9ycygpKSA9PT0gY291bnQoJGluaXRFcnJvcnMpKSkgewokdmFsdWUgPSAkYW55T2ZWYWx1ZTsKYnJlYWs7Cn0KfSBjYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiAkZSkgewokaXNWYWxpZCA9IGZhbHNlOwp9Cn0KaWYgKCEkaXNWYWxpZCkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpBTllfT0YoKSwgJHBhdGgpOwp9IGVsc2UgewokdGhpcy0+ZXJyb3JzID0gJHN0YXJ0RXJyb3JzOwp9Cn0KCmlmIChpc3NldCgkc2NoZW1hLT5vbmVPZikpIHsKJGFsbEVycm9ycyA9IFtdOwokbWF0Y2hlZFNjaGVtYXMgPSBbXTsKJHN0YXJ0RXJyb3JzID0gJHRoaXMtPmdldEVycm9ycygpOwokY29lcmNlT3JEZWZhdWx0cyA9ICR0aGlzLT5mYWN0b3J5LT5nZXRDb25maWcoc2VsZjo6Q0hFQ0tfTU9ERV9DT0VSQ0VfVFlQRVMgfCBzZWxmOjpDSEVDS19NT0RFX0FQUExZX0RFRkFVTFRTKTsKCmZvcmVhY2ggKCRzY2hlbWEtPm9uZU9mIGFzICRvbmVPZikgewp0cnkgewokdGhpcy0+ZXJyb3JzID0gW107Cgokb25lT2ZWYWx1ZSA9ICRjb2VyY2VPckRlZmF1bHRzID8gRGVlcENvcHk6OmNvcHlPZigkdmFsdWUpIDogJHZhbHVlOwokdGhpcy0+Y2hlY2tVbmRlZmluZWQoJG9uZU9mVmFsdWUsICRvbmVPZiwgJHBhdGgsICRpKTsKaWYgKGNvdW50KCR0aGlzLT5nZXRFcnJvcnMoKSkgPT09IDApIHsKJG1hdGNoZWRTY2hlbWFzW10gPSBbJ3NjaGVtYScgPT4gJG9uZU9mLCAndmFsdWUnID0+ICRvbmVPZlZhbHVlXTsKfQokYWxsRXJyb3JzID0gYXJyYXlfbWVyZ2UoJGFsbEVycm9ycywgYXJyYXlfdmFsdWVzKCR0aGlzLT5nZXRFcnJvcnMoKSkpOwp9IGNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uICRlKSB7CgoKfQp9CmlmIChjb3VudCgkbWF0Y2hlZFNjaGVtYXMpICE9PSAxKSB7CiR0aGlzLT5hZGRFcnJvcnMoYXJyYXlfbWVyZ2UoJGFsbEVycm9ycywgJHN0YXJ0RXJyb3JzKSk7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6Ok9ORV9PRigpLCAkcGF0aCk7Cn0gZWxzZSB7CiR0aGlzLT5lcnJvcnMgPSAkc3RhcnRFcnJvcnM7CiR2YWx1ZSA9ICRtYXRjaGVkU2NoZW1hc1swXVsndmFsdWUnXTsKfQp9Cn0KCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlRGVwZW5kZW5jaWVzKCR2YWx1ZSwgJGRlcGVuZGVuY2llcywgSnNvblBvaW50ZXIgJHBhdGgsICRpID0gJycpCnsKZm9yZWFjaCAoJGRlcGVuZGVuY2llcyBhcyAka2V5ID0+ICRkZXBlbmRlbmN5KSB7CmlmICgkdGhpcy0+Z2V0VHlwZUNoZWNrKCktPnByb3BlcnR5RXhpc3RzKCR2YWx1ZSwgJGtleSkpIHsKaWYgKGlzX3N0cmluZygkZGVwZW5kZW5jeSkpIHsKCmlmICghJHRoaXMtPmdldFR5cGVDaGVjaygpLT5wcm9wZXJ0eUV4aXN0cygkdmFsdWUsICRkZXBlbmRlbmN5KSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpERVBFTkRFTkNJRVMoKSwgJHBhdGgsIFsKJ2tleScgPT4gJGtleSwKJ2RlcGVuZGVuY3knID0+ICRkZXBlbmRlbmN5Cl0pOwp9Cn0gZWxzZWlmIChpc19hcnJheSgkZGVwZW5kZW5jeSkpIHsKCmZvcmVhY2ggKCRkZXBlbmRlbmN5IGFzICRkKSB7CmlmICghJHRoaXMtPmdldFR5cGVDaGVjaygpLT5wcm9wZXJ0eUV4aXN0cygkdmFsdWUsICRkKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpERVBFTkRFTkNJRVMoKSwgJHBhdGgsIFsKJ2tleScgPT4gJGtleSwKJ2RlcGVuZGVuY3knID0+ICRkZXBlbmRlbmN5Cl0pOwp9Cn0KfSBlbHNlaWYgKGlzX29iamVjdCgkZGVwZW5kZW5jeSkpIHsKCiR0aGlzLT5jaGVja1VuZGVmaW5lZCgkdmFsdWUsICRkZXBlbmRlbmN5LCAkcGF0aCwgJGkpOwp9Cn0KfQp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gdmFsaWRhdGVVcmkoJHNjaGVtYSwgJHNjaGVtYVVyaSA9IG51bGwpCnsKJHJlc29sdmVyID0gbmV3IFVyaVJlc29sdmVyKCk7CiRyZXRyaWV2ZXIgPSAkdGhpcy0+ZmFjdG9yeS0+Z2V0VXJpUmV0cmlldmVyKCk7CgokanNvblNjaGVtYSA9IG51bGw7CmlmICgkcmVzb2x2ZXItPmlzVmFsaWQoJHNjaGVtYVVyaSkpIHsKJHNjaGVtYUlkID0gcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdpZCcpID8gJHNjaGVtYS0+aWQgOiBudWxsOwokanNvblNjaGVtYSA9ICRyZXRyaWV2ZXItPnJldHJpZXZlKCRzY2hlbWFJZCwgJHNjaGVtYVVyaSk7Cn0KCnJldHVybiAkanNvblNjaGVtYTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hOwoKCgoKCgoKCgpjbGFzcyBEcmFmdElkZW50aWZpZXJzIGV4dGVuZHMgRW51bQp7CnB1YmxpYyBjb25zdCBEUkFGVF8zID0gJ2h0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDMvc2NoZW1hIyc7CnB1YmxpYyBjb25zdCBEUkFGVF80ID0gJ2h0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyc7CnB1YmxpYyBjb25zdCBEUkFGVF82ID0gJ2h0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDYvc2NoZW1hIyc7CnB1YmxpYyBjb25zdCBEUkFGVF83ID0gJ2h0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDcvc2NoZW1hIyc7CnB1YmxpYyBjb25zdCBEUkFGVF8yMDE5XzA5ID0gJ2h0dHBzOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LzIwMTktMDkvc2NoZW1hJzsKcHVibGljIGNvbnN0IERSQUZUXzIwMjBfMTIgPSAnaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQvMjAyMC0xMi9zY2hlbWEnOwoKCnByaXZhdGUgY29uc3QgTUFQUElORyA9IFsKc2VsZjo6RFJBRlRfMyA9PiAnZHJhZnQwMycsCnNlbGY6OkRSQUZUXzQgPT4gJ2RyYWZ0MDQnLApzZWxmOjpEUkFGVF82ID0+ICdkcmFmdDA2JywKc2VsZjo6RFJBRlRfNyA9PiAnZHJhZnQwNycsCnNlbGY6OkRSQUZUXzIwMTlfMDkgPT4gJ2RyYWZ0MjAxOS0wOScsCnNlbGY6OkRSQUZUXzIwMjBfMTIgPT4gJ2RyYWZ0MjAyMC0xMicsCl07Cgpwcml2YXRlIGNvbnN0IEZBTExCQUNLX01BUFBJTkcgPSBbCidkcmFmdDMnID0+IHNlbGY6OkRSQUZUXzMsCidkcmFmdDQnID0+IHNlbGY6OkRSQUZUXzQsCidkcmFmdDYnID0+IHNlbGY6OkRSQUZUXzYsCidkcmFmdDcnID0+IHNlbGY6OkRSQUZUXzcsCl07CgpwdWJsaWMgZnVuY3Rpb24gdG9Db25zdHJhaW50TmFtZSgpOiBzdHJpbmcKewpyZXR1cm4gc2VsZjo6TUFQUElOR1skdGhpcy0+Z2V0VmFsdWUoKV07Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnJvbUNvbnN0cmFpbnROYW1lKHN0cmluZyAkbmFtZSk6IERyYWZ0SWRlbnRpZmllcnMKewokcmV2ZXJzZU1hcCA9IGFycmF5X2ZsaXAoc2VsZjo6TUFQUElORyk7CmlmICghYXJyYXlfa2V5X2V4aXN0cygkbmFtZSwgJHJldmVyc2VNYXApKSB7CmlmIChhcnJheV9rZXlfZXhpc3RzKCRuYW1lLCBzZWxmOjpGQUxMQkFDS19NQVBQSU5HKSkgewpyZXR1cm4gRHJhZnRJZGVudGlmaWVyczo6YnlWYWx1ZShzZWxmOjpGQUxMQkFDS19NQVBQSU5HWyRuYW1lXSk7Cn0KdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIiRuYW1lIGlzIG5vdCBhIHZhbGlkIGNvbnN0cmFpbnQgbmFtZS4iKTsKfQoKcmV0dXJuIERyYWZ0SWRlbnRpZmllcnM6OmJ5VmFsdWUoJHJldmVyc2VNYXBbJG5hbWVdKTsKfQoKcHVibGljIGZ1bmN0aW9uIHdpdGhvdXRGcmFnbWVudCgpOiBzdHJpbmcKewpyZXR1cm4gcnRyaW0oJHRoaXMtPmdldFZhbHVlKCksICcjJyk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxFbnRpdHk7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnQ7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXEZhY3Rvcnk7CnVzZSBKc29uU2NoZW1hXEV4Y2VwdGlvblxWYWxpZGF0aW9uRXhjZXB0aW9uOwp1c2UgSnNvblNjaGVtYVxWYWxpZGF0b3I7CgoKCgoKCgoKCgoKY2xhc3MgRXJyb3JCYWcKewoKcHJpdmF0ZSAkZmFjdG9yeTsKCgpwcml2YXRlICRlcnJvcnMgPSBbXTsKCgoKCnByb3RlY3RlZCAkZXJyb3JNYXNrID0gVmFsaWRhdG9yOjpFUlJPUl9OT05FOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KEZhY3RvcnkgJGZhY3RvcnkpCnsKJHRoaXMtPmZhY3RvcnkgPSAkZmFjdG9yeTsKfQoKcHVibGljIGZ1bmN0aW9uIHJlc2V0KCk6IHZvaWQKewokdGhpcy0+ZXJyb3JzID0gW107CiR0aGlzLT5lcnJvck1hc2sgPSBWYWxpZGF0b3I6OkVSUk9SX05PTkU7Cn0KCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXJyb3JzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5lcnJvcnM7Cn0KCgpwdWJsaWMgZnVuY3Rpb24gYWRkRXJyb3IoQ29uc3RyYWludEVycm9yICRjb25zdHJhaW50LCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCBhcnJheSAkbW9yZSA9IFtdKTogdm9pZAp7CiRtZXNzYWdlID0gJGNvbnN0cmFpbnQtPmdldE1lc3NhZ2UoKTsKJG5hbWUgPSAkY29uc3RyYWludC0+Z2V0VmFsdWUoKTsKCiRlcnJvciA9IFsKJ3Byb3BlcnR5JyA9PiAkdGhpcy0+Y29udmVydEpzb25Qb2ludGVySW50b1Byb3BlcnR5UGF0aCgkcGF0aCA/OiBuZXcgSnNvblBvaW50ZXIoJycpKSwKJ3BvaW50ZXInID0+IGx0cmltKChzdHJpbmcpICgkcGF0aCA/OiBuZXcgSnNvblBvaW50ZXIoJycpKSwgJyMnKSwKJ21lc3NhZ2UnID0+IHVjZmlyc3QodnNwcmludGYoJG1lc3NhZ2UsIGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKaWYgKGlzX3NjYWxhcigkdmFsKSkgewpyZXR1cm4gaXNfYm9vbCgkdmFsKSA/IHZhcl9leHBvcnQoJHZhbCwgdHJ1ZSkgOiAkdmFsOwp9CgpyZXR1cm4ganNvbl9lbmNvZGUoJHZhbCk7Cn0sIGFycmF5X3ZhbHVlcygkbW9yZSkpKSksCidjb25zdHJhaW50JyA9PiBbCiduYW1lJyA9PiAkbmFtZSwKJ3BhcmFtcycgPT4gJG1vcmUKXSwKJ2NvbnRleHQnID0+ICR0aGlzLT5mYWN0b3J5LT5nZXRFcnJvckNvbnRleHQoKSwKXTsKCmlmICgkdGhpcy0+ZmFjdG9yeS0+Z2V0Q29uZmlnKENvbnN0cmFpbnQ6OkNIRUNLX01PREVfRVhDRVBUSU9OUykpIHsKdGhyb3cgbmV3IFZhbGlkYXRpb25FeGNlcHRpb24oc3ByaW50ZignRXJyb3IgdmFsaWRhdGluZyAlczogJXMnLCAkZXJyb3JbJ3BvaW50ZXInXSwgJGVycm9yWydtZXNzYWdlJ10pKTsKfQokdGhpcy0+ZXJyb3JzW10gPSAkZXJyb3I7CgokdGhpcy0+ZXJyb3JNYXNrIHw9ICRlcnJvclsnY29udGV4dCddOyAKfQoKCnB1YmxpYyBmdW5jdGlvbiBhZGRFcnJvcnMoYXJyYXkgJGVycm9ycyk6IHZvaWQKewppZiAoISRlcnJvcnMpIHsKcmV0dXJuOwp9CgokdGhpcy0+ZXJyb3JzID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmVycm9ycywgJGVycm9ycyk7CiRlcnJvck1hc2sgPSAmJHRoaXMtPmVycm9yTWFzazsKYXJyYXlfd2FsaygkZXJyb3JzLCBzdGF0aWMgZnVuY3Rpb24gKCRlcnJvcikgdXNlICgmJGVycm9yTWFzaykgewokZXJyb3JNYXNrIHw9ICRlcnJvclsnY29udGV4dCddOwp9KTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjb252ZXJ0SnNvblBvaW50ZXJJbnRvUHJvcGVydHlQYXRoKEpzb25Qb2ludGVyICRwb2ludGVyKTogc3RyaW5nCnsKJHJlc3VsdCA9IGFycmF5X21hcCgKc3RhdGljIGZ1bmN0aW9uICgkcGF0aCkgewpyZXR1cm4gc3ByaW50Zihpc19udW1lcmljKCRwYXRoKSA/ICdbJWRdJyA6ICcuJXMnLCAkcGF0aCk7Cn0sCiRwb2ludGVyLT5nZXRQcm9wZXJ0eVBhdGhzKCkKKTsKCnJldHVybiB0cmltKGltcGxvZGUoJycsICRyZXN1bHQpLCAnLicpOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcRW50aXR5OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xGYWN0b3J5OwoKCgoKCnRyYWl0IEVycm9yQmFnUHJveHkKewoKcHJvdGVjdGVkICRlcnJvckJhZyA9IG51bGw7CgoKcHVibGljIGZ1bmN0aW9uIGdldEVycm9ycygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+ZXJyb3JCYWcoKS0+Z2V0RXJyb3JzKCk7Cn0KCgpwdWJsaWMgZnVuY3Rpb24gYWRkRXJyb3JzKGFycmF5ICRlcnJvcnMpOiB2b2lkCnsKJHRoaXMtPmVycm9yQmFnKCktPmFkZEVycm9ycygkZXJyb3JzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZEVycm9yKENvbnN0cmFpbnRFcnJvciAkY29uc3RyYWludCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgYXJyYXkgJG1vcmUgPSBbXSk6IHZvaWQKewokdGhpcy0+ZXJyb3JCYWcoKS0+YWRkRXJyb3IoJGNvbnN0cmFpbnQsICRwYXRoLCAkbW9yZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc1ZhbGlkKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmVycm9yQmFnKCktPmdldEVycm9ycygpID09PSBbXTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluaXRpYWxpc2VFcnJvckJhZyhGYWN0b3J5ICRmYWN0b3J5KTogRXJyb3JCYWcKewppZiAoaXNfbnVsbCgkdGhpcy0+ZXJyb3JCYWcpKSB7CiR0aGlzLT5lcnJvckJhZyA9IG5ldyBFcnJvckJhZygkZmFjdG9yeSk7Cn0KCnJldHVybiAkdGhpcy0+ZXJyb3JCYWc7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBlcnJvckJhZygpOiBFcnJvckJhZwp7CmlmIChpc19udWxsKCR0aGlzLT5lcnJvckJhZykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdFcnJvckJhZyBub3QgaW5pdGlhbGl6ZWQnKTsKfQoKcmV0dXJuICR0aGlzLT5lcnJvckJhZzsKfQoKcHVibGljIGZ1bmN0aW9uIF9fY2xvbmUoKQp7CiR0aGlzLT5lcnJvckJhZygpLT5yZXNldCgpOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXEVudGl0eTsKCnVzZSBKc29uU2NoZW1hXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CgoKCgoKCmNsYXNzIEpzb25Qb2ludGVyCnsKCnByaXZhdGUgJGZpbGVuYW1lOwoKCnByaXZhdGUgJHByb3BlcnR5UGF0aHMgPSBbXTsKCgoKCnByaXZhdGUgJGZyb21EZWZhdWx0ID0gZmFsc2U7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdmFsdWUpCnsKaWYgKCFpc19zdHJpbmcoJHZhbHVlKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdSZWYgdmFsdWUgbXVzdCBiZSBhIHN0cmluZycpOwp9Cgokc3BsaXRSZWYgPSBleHBsb2RlKCcjJywgJHZhbHVlLCAyKTsKJHRoaXMtPmZpbGVuYW1lID0gJHNwbGl0UmVmWzBdOwppZiAoYXJyYXlfa2V5X2V4aXN0cygxLCAkc3BsaXRSZWYpKSB7CiR0aGlzLT5wcm9wZXJ0eVBhdGhzID0gJHRoaXMtPmRlY29kZVByb3BlcnR5UGF0aHMoJHNwbGl0UmVmWzFdKTsKfQp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZGVjb2RlUHJvcGVydHlQYXRocygkcHJvcGVydHlQYXRoU3RyaW5nKQp7CiRwYXRocyA9IFtdOwpmb3JlYWNoIChleHBsb2RlKCcvJywgdHJpbSgkcHJvcGVydHlQYXRoU3RyaW5nLCAnLycpKSBhcyAkcGF0aCkgewokcGF0aCA9ICR0aGlzLT5kZWNvZGVQYXRoKCRwYXRoKTsKaWYgKGlzX3N0cmluZygkcGF0aCkgJiYgJycgIT09ICRwYXRoKSB7CiRwYXRoc1tdID0gJHBhdGg7Cn0KfQoKcmV0dXJuICRwYXRoczsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBlbmNvZGVQcm9wZXJ0eVBhdGhzKCkKewpyZXR1cm4gYXJyYXlfbWFwKApbJHRoaXMsICdlbmNvZGVQYXRoJ10sCiR0aGlzLT5nZXRQcm9wZXJ0eVBhdGhzKCkKKTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRlY29kZVBhdGgoJHBhdGgpCnsKcmV0dXJuIHN0cnRyKCRwYXRoLCBbJ34xJyA9PiAnLycsICd+MCcgPT4gJ34nLCAnJTI1JyA9PiAnJSddKTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGVuY29kZVBhdGgoJHBhdGgpCnsKcmV0dXJuIHN0cnRyKCRwYXRoLCBbJy8nID0+ICd+MScsICd+JyA9PiAnfjAnLCAnJScgPT4gJyUyNSddKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZpbGVuYW1lKCkKewpyZXR1cm4gJHRoaXMtPmZpbGVuYW1lOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvcGVydHlQYXRocygpCnsKcmV0dXJuICR0aGlzLT5wcm9wZXJ0eVBhdGhzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3aXRoUHJvcGVydHlQYXRocyhhcnJheSAkcHJvcGVydHlQYXRocykKewokbmV3ID0gY2xvbmUgJHRoaXM7CiRuZXctPnByb3BlcnR5UGF0aHMgPSBhcnJheV9tYXAoZnVuY3Rpb24gKCRwKTogc3RyaW5nIHsgcmV0dXJuIChzdHJpbmcpICRwOyB9LCAkcHJvcGVydHlQYXRocyk7CgpyZXR1cm4gJG5ldzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByb3BlcnR5UGF0aEFzU3RyaW5nKCkKewpyZXR1cm4gcnRyaW0oJyMvJyAuIGltcGxvZGUoJy8nLCAkdGhpcy0+ZW5jb2RlUHJvcGVydHlQYXRocygpKSwgJy8nKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKQp7CnJldHVybiAkdGhpcy0+Z2V0RmlsZW5hbWUoKSAuICR0aGlzLT5nZXRQcm9wZXJ0eVBhdGhBc1N0cmluZygpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RnJvbURlZmF1bHQoKTogdm9pZAp7CiR0aGlzLT5mcm9tRGVmYXVsdCA9IHRydWU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZyb21EZWZhdWx0KCkKewpyZXR1cm4gJHRoaXMtPmZyb21EZWZhdWx0Owp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWE7CgphYnN0cmFjdCBjbGFzcyBFbnVtIGV4dGVuZHMgXE1hYmVFbnVtXEVudW0Kewp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXEV4Y2VwdGlvbjsKCmludGVyZmFjZSBFeGNlcHRpb25JbnRlcmZhY2UKewp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxFeGNlcHRpb247CgoKCgpjbGFzcyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uSW50ZXJmYWNlCnsKfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcRXhjZXB0aW9uOwoKCgoKY2xhc3MgSW52YWxpZENvbmZpZ0V4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24Kewp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxFeGNlcHRpb247CgoKCgpjbGFzcyBJbnZhbGlkU2NoZW1hRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgp7Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXEV4Y2VwdGlvbjsKCgoKCmNsYXNzIEludmFsaWRTY2hlbWFNZWRpYVR5cGVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCnsKfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcRXhjZXB0aW9uOwoKCgoKY2xhc3MgSW52YWxpZFNvdXJjZVVyaUV4Y2VwdGlvbiBleHRlbmRzIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgp7Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXEV4Y2VwdGlvbjsKCgoKCmNsYXNzIEpzb25EZWNvZGluZ0V4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24KewpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGNvZGUgPSBKU09OX0VSUk9SX05PTkUsID9cRXhjZXB0aW9uICRwcmV2aW91cyA9IG51bGwpCnsKc3dpdGNoICgkY29kZSkgewpjYXNlIEpTT05fRVJST1JfREVQVEg6CiRtZXNzYWdlID0gJ1RoZSBtYXhpbXVtIHN0YWNrIGRlcHRoIGhhcyBiZWVuIGV4Y2VlZGVkJzsKYnJlYWs7CmNhc2UgSlNPTl9FUlJPUl9TVEFURV9NSVNNQVRDSDoKJG1lc3NhZ2UgPSAnSW52YWxpZCBvciBtYWxmb3JtZWQgSlNPTic7CmJyZWFrOwpjYXNlIEpTT05fRVJST1JfQ1RSTF9DSEFSOgokbWVzc2FnZSA9ICdDb250cm9sIGNoYXJhY3RlciBlcnJvciwgcG9zc2libHkgaW5jb3JyZWN0bHkgZW5jb2RlZCc7CmJyZWFrOwpjYXNlIEpTT05fRVJST1JfVVRGODoKJG1lc3NhZ2UgPSAnTWFsZm9ybWVkIFVURi04IGNoYXJhY3RlcnMsIHBvc3NpYmx5IGluY29ycmVjdGx5IGVuY29kZWQnOwpicmVhazsKY2FzZSBKU09OX0VSUk9SX1NZTlRBWDoKJG1lc3NhZ2UgPSAnSlNPTiBzeW50YXggaXMgbWFsZm9ybWVkJzsKYnJlYWs7CmRlZmF1bHQ6CiRtZXNzYWdlID0gJ1N5bnRheCBlcnJvcic7Cn0KcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUsICRwcmV2aW91cyk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcRXhjZXB0aW9uOwoKCgoKY2xhc3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24Kewp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxFeGNlcHRpb247CgoKCgpjbGFzcyBSdW50aW1lRXhjZXB0aW9uIGV4dGVuZHMgXFJ1bnRpbWVFeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb25JbnRlcmZhY2UKewp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxFeGNlcHRpb247CgoKCgoKCmNsYXNzIFVucmVzb2x2YWJsZUpzb25Qb2ludGVyRXhjZXB0aW9uIGV4dGVuZHMgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uCnsKfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcRXhjZXB0aW9uOwoKCgoKY2xhc3MgVXJpUmVzb2x2ZXJFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCnsKfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcRXhjZXB0aW9uOwoKY2xhc3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24Kewp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxJdGVyYXRvcjsKCgoKCgoKY2xhc3MgT2JqZWN0SXRlcmF0b3IgaW1wbGVtZW50cyBcSXRlcmF0b3IsIFxDb3VudGFibGUKewoKcHJpdmF0ZSAkb2JqZWN0OwoKCnByaXZhdGUgJHBvc2l0aW9uID0gMDsKCgpwcml2YXRlICRkYXRhID0gW107CgoKcHJpdmF0ZSAkaW5pdGlhbGl6ZWQgPSBmYWxzZTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkb2JqZWN0KQp7CiR0aGlzLT5vYmplY3QgPSAkb2JqZWN0Owp9CgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGN1cnJlbnQoKQp7CiR0aGlzLT5pbml0aWFsaXplKCk7CgpyZXR1cm4gJHRoaXMtPmRhdGFbJHRoaXMtPnBvc2l0aW9uXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG5leHQoKTogdm9pZAp7CiR0aGlzLT5pbml0aWFsaXplKCk7CiR0aGlzLT5wb3NpdGlvbisrOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24ga2V5KCk6IGludAp7CiR0aGlzLT5pbml0aWFsaXplKCk7CgpyZXR1cm4gJHRoaXMtPnBvc2l0aW9uOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdmFsaWQoKTogYm9vbAp7CiR0aGlzLT5pbml0aWFsaXplKCk7CgpyZXR1cm4gaXNzZXQoJHRoaXMtPmRhdGFbJHRoaXMtPnBvc2l0aW9uXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZXdpbmQoKTogdm9pZAp7CiR0aGlzLT5pbml0aWFsaXplKCk7CiR0aGlzLT5wb3NpdGlvbiA9IDA7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb3VudCgpOiBpbnQKewokdGhpcy0+aW5pdGlhbGl6ZSgpOwoKcmV0dXJuIGNvdW50KCR0aGlzLT5kYXRhKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpbml0aWFsaXplKCkKewppZiAoISR0aGlzLT5pbml0aWFsaXplZCkgewokdGhpcy0+ZGF0YSA9ICR0aGlzLT5idWlsZERhdGFGcm9tT2JqZWN0KCR0aGlzLT5vYmplY3QpOwokdGhpcy0+aW5pdGlhbGl6ZWQgPSB0cnVlOwp9Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBidWlsZERhdGFGcm9tT2JqZWN0KCRvYmplY3QpCnsKJHJlc3VsdCA9IFtdOwoKJHN0YWNrID0gbmV3IFxTcGxTdGFjaygpOwokc3RhY2stPnB1c2goJG9iamVjdCk7Cgp3aGlsZSAoISRzdGFjay0+aXNFbXB0eSgpKSB7CiRjdXJyZW50ID0gJHN0YWNrLT5wb3AoKTsKaWYgKGlzX29iamVjdCgkY3VycmVudCkpIHsKYXJyYXlfcHVzaCgkcmVzdWx0LCAkY3VycmVudCk7Cn0KCmZvcmVhY2ggKCR0aGlzLT5nZXREYXRhRnJvbUl0ZW0oJGN1cnJlbnQpIGFzICRwcm9wZXJ0eU5hbWUgPT4gJHByb3BlcnR5VmFsdWUpIHsKaWYgKGlzX29iamVjdCgkcHJvcGVydHlWYWx1ZSkgfHwgaXNfYXJyYXkoJHByb3BlcnR5VmFsdWUpKSB7CiRzdGFjay0+cHVzaCgkcHJvcGVydHlWYWx1ZSk7Cn0KfQp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldERhdGFGcm9tSXRlbSgkaXRlbSkKewppZiAoIWlzX29iamVjdCgkaXRlbSkgJiYgIWlzX2FycmF5KCRpdGVtKSkgewpyZXR1cm4gW107Cn0KCnJldHVybiBpc19vYmplY3QoJGl0ZW0pID8gZ2V0X29iamVjdF92YXJzKCRpdGVtKSA6ICRpdGVtOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWE7CgpjbGFzcyBSZmMzMzM5CnsKcHJpdmF0ZSBjb25zdCBSRUdFWCA9ICcvXihcZHs0fS1cZHsyfS1cZHsyfVtUIF0oMFswLTldfDFbMC05XXwyWzAtM10pOihbMC01XVswLTldKTooKD86WzAtNV1bMC05XXw2MCkpKShcLlxkKyk/KFp8KFsrLV0oMFswLTldfDFbMC05XXwyWzAtM10pKSg6KT8oWzAtNV1bMC05XSkpJC8nOwoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlRnJvbVN0cmluZygkaW5wdXQpOiA/XERhdGVUaW1lCnsKaWYgKCFwcmVnX21hdGNoKHNlbGY6OlJFR0VYLCBzdHJ0b3VwcGVyKCRpbnB1dCksICRtYXRjaGVzKSkgewpyZXR1cm4gbnVsbDsKfQoKJGlucHV0ID0gc3RydG91cHBlcigkaW5wdXQpOyAKJGlucHV0SGFzVFNlcGFyYXRvciA9IHN0cnBvcygkaW5wdXQsICdUJyk7CgokZGF0ZUFuZFRpbWUgPSAkbWF0Y2hlc1sxXTsKJG1pY3Jvc2Vjb25kcyA9ICRtYXRjaGVzWzVdID86ICcuMDAwMDAwJzsKJHRpbWVab25lID0gJ1onICE9PSAkbWF0Y2hlc1s2XSA/ICRtYXRjaGVzWzZdIDogJyswMDowMCc7CiRkYXRlRm9ybWF0ID0gJGlucHV0SGFzVFNlcGFyYXRvciA9PT0gZmFsc2UgPyAnWS1tLWQgSDppOnMudVAnIDogJ1ktbS1kXFRIOmk6cy51UCc7CiRkYXRlVGltZSA9IFxEYXRlVGltZUltbXV0YWJsZTo6Y3JlYXRlRnJvbUZvcm1hdCgkZGF0ZUZvcm1hdCwgJGRhdGVBbmRUaW1lIC4gJG1pY3Jvc2Vjb25kcyAuICR0aW1lWm9uZSwgbmV3IFxEYXRlVGltZVpvbmUoJ1VUQycpKTsKCmlmICgkZGF0ZVRpbWUgPT09IGZhbHNlKSB7CnJldHVybiBudWxsOwp9CgokdXRjRGF0ZVRpbWUgPSAkZGF0ZVRpbWUtPnNldFRpbWV6b25lKG5ldyBcRGF0ZVRpbWVab25lKCcrMDA6MDAnKSk7CiRvbmVTZWNvbmQgPSBuZXcgXERhdGVJbnRlcnZhbCgnUFQxUycpOwoKCmlmICgkbWF0Y2hlc1s0XSA9PT0gJzYwJyAmJiAkdXRjRGF0ZVRpbWUtPnN1Yigkb25lU2Vjb25kKS0+Zm9ybWF0KCdIOmk6cycpID09PSAnMjM6NTk6NTknKSB7CiRkYXRlVGltZSA9ICRkYXRlVGltZS0+c3ViKCRvbmVTZWNvbmQpOwokbWF0Y2hlc1sxXSA9IHN0cl9yZXBsYWNlKCc6NjAnLCAnOjU5JywgJG1hdGNoZXNbMV0pOwp9CgoKaWYgKCRkYXRlVGltZS0+Zm9ybWF0KCRpbnB1dEhhc1RTZXBhcmF0b3IgPyAnWS1tLWRcVEg6aTpzJyA6ICdZLW0tZCBIOmk6cycpICE9PSAkbWF0Y2hlc1sxXSkgewpyZXR1cm4gbnVsbDsKfQoKJG11dGFibGUgPSBcRGF0ZVRpbWU6OmNyZWF0ZUZyb21Gb3JtYXQoJ1UudScsICRkYXRlVGltZS0+Zm9ybWF0KCdVLnUnKSk7CmlmICgkbXV0YWJsZSA9PT0gZmFsc2UpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdVbmFibGUgdG8gY3JlYXRlIERhdGVUaW1lIGZyb20gRGF0ZVRpbWVJbW11dGFibGUnKTsKfQoKJG11dGFibGUtPnNldFRpbWV6b25lKCRkYXRlVGltZS0+Z2V0VGltZXpvbmUoKSk7CgpyZXR1cm4gJG11dGFibGU7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYTsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXEJhc2VDb25zdHJhaW50Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CnVzZSBKc29uU2NoZW1hXEV4Y2VwdGlvblxVbnJlc29sdmFibGVKc29uUG9pbnRlckV4Y2VwdGlvbjsKdXNlIEpzb25TY2hlbWFcVXJpXFVyaVJlc29sdmVyOwp1c2UgSnNvblNjaGVtYVxVcmlcVXJpUmV0cmlldmVyOwoKY2xhc3MgU2NoZW1hU3RvcmFnZSBpbXBsZW1lbnRzIFNjaGVtYVN0b3JhZ2VJbnRlcmZhY2UKewpwdWJsaWMgY29uc3QgSU5URVJOQUxfUFJPVklERURfU0NIRU1BX1VSSSA9ICdpbnRlcm5hbDovL3Byb3ZpZGVkLXNjaGVtYS8nOwoKcHJvdGVjdGVkICR1cmlSZXRyaWV2ZXI7CnByb3RlY3RlZCAkdXJpUmVzb2x2ZXI7CnByb3RlY3RlZCAkc2NoZW1hcyA9IFtdOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KAo/VXJpUmV0cmlldmVySW50ZXJmYWNlICR1cmlSZXRyaWV2ZXIgPSBudWxsLAo/VXJpUmVzb2x2ZXJJbnRlcmZhY2UgJHVyaVJlc29sdmVyID0gbnVsbAopIHsKJHRoaXMtPnVyaVJldHJpZXZlciA9ICR1cmlSZXRyaWV2ZXIgPzogbmV3IFVyaVJldHJpZXZlcigpOwokdGhpcy0+dXJpUmVzb2x2ZXIgPSAkdXJpUmVzb2x2ZXIgPzogbmV3IFVyaVJlc29sdmVyKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVcmlSZXRyaWV2ZXIoKQp7CnJldHVybiAkdGhpcy0+dXJpUmV0cmlldmVyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXJpUmVzb2x2ZXIoKQp7CnJldHVybiAkdGhpcy0+dXJpUmVzb2x2ZXI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRTY2hlbWEoc3RyaW5nICRpZCwgJHNjaGVtYSA9IG51bGwpOiB2b2lkCnsKaWYgKGlzX251bGwoJHNjaGVtYSkgJiYgJGlkICE9PSBzZWxmOjpJTlRFUk5BTF9QUk9WSURFRF9TQ0hFTUFfVVJJKSB7CgoKCiRzY2hlbWEgPSAkdGhpcy0+dXJpUmV0cmlldmVyLT5yZXRyaWV2ZSgkaWQpOwp9CgoKaWYgKGlzX2FycmF5KCRzY2hlbWEpKSB7CiRzY2hlbWEgPSBCYXNlQ29uc3RyYWludDo6YXJyYXlUb09iamVjdFJlY3Vyc2l2ZSgkc2NoZW1hKTsKfQoKCgppZiAoaXNfb2JqZWN0KCRzY2hlbWEpICYmIHByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnaWQnKSkgewppZiAoJHNjaGVtYS0+aWQgPT09IERyYWZ0SWRlbnRpZmllcnM6OkRSQUZUXzQpIHsKJHNjaGVtYS0+cHJvcGVydGllcy0+aWQtPmZvcm1hdCA9ICd1cmktcmVmZXJlbmNlJzsKfSBlbHNlaWYgKCRzY2hlbWEtPmlkID09PSBEcmFmdElkZW50aWZpZXJzOjpEUkFGVF8zKSB7CiRzY2hlbWEtPnByb3BlcnRpZXMtPmlkLT5mb3JtYXQgPSAndXJpLXJlZmVyZW5jZSc7CiRzY2hlbWEtPnByb3BlcnRpZXMtPnsnJHJlZid9LT5mb3JtYXQgPSAndXJpLXJlZmVyZW5jZSc7Cn0KfQoKJHRoaXMtPnNjYW5Gb3JTdWJzY2hlbWFzKCRzY2hlbWEsICRpZCk7CgoKJHRoaXMtPmV4cGFuZFJlZnMoJHNjaGVtYSwgJGlkKTsKCiR0aGlzLT5zY2hlbWFzWyRpZF0gPSAkc2NoZW1hOwp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGV4cGFuZFJlZnMoJiRzY2hlbWEsID9zdHJpbmcgJHBhcmVudElkID0gbnVsbCwgYXJyYXkgJHByb3BlcnR5U3RhY2sgPSBbXSk6IHZvaWQKewppZiAoIWlzX29iamVjdCgkc2NoZW1hKSkgewppZiAoaXNfYXJyYXkoJHNjaGVtYSkpIHsKZm9yZWFjaCAoJHNjaGVtYSBhcyAmJG1lbWJlcikgewokdGhpcy0+ZXhwYW5kUmVmcygkbWVtYmVyLCAkcGFyZW50SWQpOwp9Cn0KCnJldHVybjsKfQoKaWYgKHByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnJHJlZicpICYmIGlzX3N0cmluZygkc2NoZW1hLT57JyRyZWYnfSkpIHsKJHJlZlBvaW50ZXIgPSBuZXcgSnNvblBvaW50ZXIoJHRoaXMtPnVyaVJlc29sdmVyLT5yZXNvbHZlKCRzY2hlbWEtPnsnJHJlZid9LCAkcGFyZW50SWQpKTsKJHNjaGVtYS0+eyckcmVmJ30gPSAoc3RyaW5nKSAkcmVmUG9pbnRlcjsKfQoKJHBhcmVudFByb3BlcnR5ID0gYXJyYXlfc2xpY2UoJHByb3BlcnR5U3RhY2ssIC0xKVswXSA/PyAnJzsKZm9yZWFjaCAoJHNjaGVtYSBhcyAkcHJvcGVydHlOYW1lID0+ICYkbWVtYmVyKSB7CmlmICgkcGFyZW50UHJvcGVydHkgIT09ICdwcm9wZXJ0aWVzJyAmJiBpbl9hcnJheSgkcHJvcGVydHlOYW1lLCBbJ2VudW0nLCAnY29uc3QnXSkpIHsKCmNvbnRpbnVlOwp9Cgokc2NoZW1hSWQgPSAkdGhpcy0+ZmluZFNjaGVtYUlkSW5PYmplY3QoJHNjaGVtYSk7CiRjaGlsZElkID0gJHBhcmVudElkOwppZiAoaXNfc3RyaW5nKCRzY2hlbWFJZCkgJiYgJGNoaWxkSWQgIT09ICRzY2hlbWFJZCkgewokY2hpbGRJZCA9ICR0aGlzLT51cmlSZXNvbHZlci0+cmVzb2x2ZSgkc2NoZW1hSWQsICRjaGlsZElkKTsKfQoKJGNsb25lZFByb3BlcnR5U3RhY2sgPSAkcHJvcGVydHlTdGFjazsKJGNsb25lZFByb3BlcnR5U3RhY2tbXSA9ICRwcm9wZXJ0eU5hbWU7CiR0aGlzLT5leHBhbmRSZWZzKCRtZW1iZXIsICRjaGlsZElkLCAkY2xvbmVkUHJvcGVydHlTdGFjayk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNjaGVtYShzdHJpbmcgJGlkKQp7CmlmICghYXJyYXlfa2V5X2V4aXN0cygkaWQsICR0aGlzLT5zY2hlbWFzKSkgewokdGhpcy0+YWRkU2NoZW1hKCRpZCk7Cn0KCnJldHVybiAkdGhpcy0+c2NoZW1hc1skaWRdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzb2x2ZVJlZihzdHJpbmcgJHJlZiwgJHJlc29sdmVTdGFjayA9IFtdKQp7CiRqc29uUG9pbnRlciA9IG5ldyBKc29uUG9pbnRlcigkcmVmKTsKCgokZmlsZU5hbWUgPSAkanNvblBvaW50ZXItPmdldEZpbGVuYW1lKCk7CmlmICghc3RybGVuKCRmaWxlTmFtZSkpIHsKdGhyb3cgbmV3IFVucmVzb2x2YWJsZUpzb25Qb2ludGVyRXhjZXB0aW9uKHNwcmludGYoCiJDb3VsZCBub3QgcmVzb2x2ZSBmcmFnbWVudCAnJXMnOiBubyBmaWxlIGlzIGRlZmluZWQiLAokanNvblBvaW50ZXItPmdldFByb3BlcnR5UGF0aEFzU3RyaW5nKCkKKSk7Cn0KCgokcmVmU2NoZW1hID0gJHRoaXMtPmdldFNjaGVtYSgkZmlsZU5hbWUpOwpmb3JlYWNoICgkanNvblBvaW50ZXItPmdldFByb3BlcnR5UGF0aHMoKSBhcyAkcGF0aCkgewokcGF0aCA9IHVybGRlY29kZSgkcGF0aCk7CmlmIChpc19vYmplY3QoJHJlZlNjaGVtYSkgJiYgcHJvcGVydHlfZXhpc3RzKCRyZWZTY2hlbWEsICRwYXRoKSkgewokcmVmU2NoZW1hID0gJHRoaXMtPnJlc29sdmVSZWZTY2hlbWEoJHJlZlNjaGVtYS0+eyRwYXRofSwgJHJlc29sdmVTdGFjayk7Cn0gZWxzZWlmIChpc19hcnJheSgkcmVmU2NoZW1hKSAmJiBhcnJheV9rZXlfZXhpc3RzKCRwYXRoLCAkcmVmU2NoZW1hKSkgewokcmVmU2NoZW1hID0gJHRoaXMtPnJlc29sdmVSZWZTY2hlbWEoJHJlZlNjaGVtYVskcGF0aF0sICRyZXNvbHZlU3RhY2spOwp9IGVsc2Ugewp0aHJvdyBuZXcgVW5yZXNvbHZhYmxlSnNvblBvaW50ZXJFeGNlcHRpb24oc3ByaW50ZigKJ0ZpbGU6ICVzIGlzIGZvdW5kLCBidXQgY291bGQgbm90IHJlc29sdmUgZnJhZ21lbnQ6ICVzJywKJGpzb25Qb2ludGVyLT5nZXRGaWxlbmFtZSgpLAokanNvblBvaW50ZXItPmdldFByb3BlcnR5UGF0aEFzU3RyaW5nKCkKKSk7Cn0KfQoKcmV0dXJuICRyZWZTY2hlbWE7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZXNvbHZlUmVmU2NoZW1hKCRyZWZTY2hlbWEsICRyZXNvbHZlU3RhY2sgPSBbXSkKewppZiAoaXNfb2JqZWN0KCRyZWZTY2hlbWEpICYmIHByb3BlcnR5X2V4aXN0cygkcmVmU2NoZW1hLCAnJHJlZicpICYmIGlzX3N0cmluZygkcmVmU2NoZW1hLT57JyRyZWYnfSkpIHsKaWYgKGluX2FycmF5KCRyZWZTY2hlbWEsICRyZXNvbHZlU3RhY2ssIHRydWUpKSB7CnRocm93IG5ldyBVbnJlc29sdmFibGVKc29uUG9pbnRlckV4Y2VwdGlvbihzcHJpbnRmKAonRGVyZWZlcmVuY2luZyBhIHBvaW50ZXIgdG8gJXMgcmVzdWx0cyBpbiBhbiBpbmZpbml0ZSBsb29wJywKJHJlZlNjaGVtYS0+eyckcmVmJ30KKSk7Cn0KJHJlc29sdmVTdGFja1tdID0gJHJlZlNjaGVtYTsKCnJldHVybiAkdGhpcy0+cmVzb2x2ZVJlZigkcmVmU2NoZW1hLT57JyRyZWYnfSwgJHJlc29sdmVTdGFjayk7Cn0KCmlmIChpc19vYmplY3QoJHJlZlNjaGVtYSkgJiYgYXJyYXlfa2V5cyhnZXRfb2JqZWN0X3ZhcnMoJHJlZlNjaGVtYSkpID09PSBbJyddKSB7CiRyZWZTY2hlbWEgPSBnZXRfb2JqZWN0X3ZhcnMoJHJlZlNjaGVtYSlbJyddOwp9CgpyZXR1cm4gJHJlZlNjaGVtYTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzY2FuRm9yU3Vic2NoZW1hcygkc2NoZW1hLCBzdHJpbmcgJHBhcmVudElkKTogdm9pZAp7CmlmICghJHNjaGVtYSBpbnN0YW5jZW9mIFxzdGRDbGFzcyAmJiAhaXNfYXJyYXkoJHNjaGVtYSkpIHsKcmV0dXJuOwp9Cgpmb3JlYWNoICgkc2NoZW1hIGFzICRwcm9wZXJ0eU5hbWUgPT4gJHBvdGVudGlhbFN1YlNjaGVtYSkgewppZiAoIWlzX29iamVjdCgkcG90ZW50aWFsU3ViU2NoZW1hKSkgewppZiAoaXNfYXJyYXkoJHBvdGVudGlhbFN1YlNjaGVtYSkpIHsKZm9yZWFjaCAoJHBvdGVudGlhbFN1YlNjaGVtYSBhcyAkcG90ZW50aWFsU3ViU2NoZW1hSXRlbSkgewokdGhpcy0+c2NhbkZvclN1YnNjaGVtYXMoJHBvdGVudGlhbFN1YlNjaGVtYUl0ZW0sICRwYXJlbnRJZCk7Cn0KfQpjb250aW51ZTsKfQoKJHBvdGVudGlhbFN1YlNjaGVtYUlkID0gJHRoaXMtPmZpbmRTY2hlbWFJZEluT2JqZWN0KCRwb3RlbnRpYWxTdWJTY2hlbWEpOwppZiAoaXNfc3RyaW5nKCRwb3RlbnRpYWxTdWJTY2hlbWFJZCkgJiYgcHJvcGVydHlfZXhpc3RzKCRwb3RlbnRpYWxTdWJTY2hlbWEsICd0eXBlJykpIHsKCmlmIChpbl9hcnJheSgkcHJvcGVydHlOYW1lLCBbJ2VudW0nLCAnY29uc3QnXSkpIHsKY29udGludWU7Cn0KCgppZiAoaW5fYXJyYXkoJHByb3BlcnR5TmFtZSwgW10pKSB7CmNvbnRpbnVlOwp9CgoKJHRoaXMtPmFkZFNjaGVtYSgkdGhpcy0+dXJpUmVzb2x2ZXItPnJlc29sdmUoJHBvdGVudGlhbFN1YlNjaGVtYUlkLCAkcGFyZW50SWQpLCAkcG90ZW50aWFsU3ViU2NoZW1hKTsKfQoKJHRoaXMtPnNjYW5Gb3JTdWJzY2hlbWFzKCRwb3RlbnRpYWxTdWJTY2hlbWEsICRwYXJlbnRJZCk7Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBmaW5kU2NoZW1hSWRJbk9iamVjdChvYmplY3QgJHNjaGVtYSk6ID9zdHJpbmcKewppZiAocHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdpZCcpICYmIGlzX3N0cmluZygkc2NoZW1hLT5pZCkpIHsKcmV0dXJuICRzY2hlbWEtPmlkOwp9CmlmIChwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJyRpZCcpICYmIGlzX3N0cmluZygkc2NoZW1hLT57JyRpZCd9KSkgewpyZXR1cm4gJHNjaGVtYS0+eyckaWQnfTsKfQoKcmV0dXJuIG51bGw7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYTsKCmludGVyZmFjZSBTY2hlbWFTdG9yYWdlSW50ZXJmYWNlCnsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkU2NoZW1hKHN0cmluZyAkaWQsICRzY2hlbWEgPSBudWxsKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNjaGVtYShzdHJpbmcgJGlkKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlc29sdmVSZWYoc3RyaW5nICRyZWYpOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXNvbHZlUmVmU2NoZW1hKCRyZWZTY2hlbWEpOwp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXFRvb2w7CgpjbGFzcyBEZWVwQ29tcGFyZXIKewoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0VxdWFsKCRsZWZ0LCAkcmlnaHQpOiBib29sCnsKaWYgKCRsZWZ0ID09PSBudWxsICYmICRyaWdodCA9PT0gbnVsbCkgewpyZXR1cm4gdHJ1ZTsKfQoKJGlzTGVmdFNjYWxhciA9IGlzX3NjYWxhcigkbGVmdCk7CiRpc0xlZnROdW1iZXIgPSBpc19pbnQoJGxlZnQpIHx8IGlzX2Zsb2F0KCRsZWZ0KTsKJGlzUmlnaHRTY2FsYXIgPSBpc19zY2FsYXIoJHJpZ2h0KTsKJGlzUmlnaHROdW1iZXIgPSBpc19pbnQoJHJpZ2h0KSB8fCBpc19mbG9hdCgkcmlnaHQpOwoKaWYgKCRpc0xlZnRTY2FsYXIgJiYgJGlzUmlnaHRTY2FsYXIpIHsKCgoKaWYgKCRpc0xlZnROdW1iZXIgJiYgJGlzUmlnaHROdW1iZXIgJiYgKGZsb2F0KSAkbGVmdCA9PT0gKGZsb2F0KSAkcmlnaHQpIHsKcmV0dXJuIHRydWU7Cn0KCnJldHVybiAkbGVmdCA9PT0gJHJpZ2h0Owp9CgppZiAoJGlzTGVmdFNjYWxhciAhPT0gJGlzUmlnaHRTY2FsYXIpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoaXNfYXJyYXkoJGxlZnQpICYmIGlzX2FycmF5KCRyaWdodCkpIHsKcmV0dXJuIHNlbGY6OmlzQXJyYXlFcXVhbCgkbGVmdCwgJHJpZ2h0KTsKfQoKaWYgKCRsZWZ0IGluc3RhbmNlb2YgXHN0ZENsYXNzICYmICRyaWdodCBpbnN0YW5jZW9mIFxzdGRDbGFzcykgewpyZXR1cm4gc2VsZjo6aXNBcnJheUVxdWFsKChhcnJheSkgJGxlZnQsIChhcnJheSkgJHJpZ2h0KTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaXNBcnJheUVxdWFsKGFycmF5ICRsZWZ0LCBhcnJheSAkcmlnaHQpOiBib29sCnsKaWYgKGNvdW50KCRsZWZ0KSAhPT0gY291bnQoJHJpZ2h0KSkgewpyZXR1cm4gZmFsc2U7Cn0KZm9yZWFjaCAoJGxlZnQgYXMgJGtleSA9PiAkdmFsdWUpIHsKaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRrZXksICRyaWdodCkpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoIXNlbGY6OmlzRXF1YWwoJHZhbHVlLCAkcmlnaHRbJGtleV0pKSB7CnJldHVybiBmYWxzZTsKfQp9CgpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXFRvb2w7Cgp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cSnNvbkRlY29kaW5nRXhjZXB0aW9uOwp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cUnVudGltZUV4Y2VwdGlvbjsKCmNsYXNzIERlZXBDb3B5CnsKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNvcHlPZigkaW5wdXQpCnsKJGpzb24gPSBqc29uX2VuY29kZSgkaW5wdXQpOwppZiAoSlNPTl9FUlJPUl9OT05FIDwgJGVycm9yID0ganNvbl9sYXN0X2Vycm9yKCkpIHsKdGhyb3cgbmV3IEpzb25EZWNvZGluZ0V4Y2VwdGlvbigkZXJyb3IpOwp9CgppZiAoJGpzb24gPT09IGZhbHNlKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gZW5jb2RlIGlucHV0IHRvIEpTT046ICcgLiBqc29uX2xhc3RfZXJyb3JfbXNnKCkpOwp9CgpyZXR1cm4ganNvbl9kZWNvZGUoJGpzb24sIHNlbGY6OmlzQXNzb2NpYXRpdmVBcnJheSgkaW5wdXQpKTsKfQoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaXNBc3NvY2lhdGl2ZUFycmF5KCRpbnB1dCk6IGJvb2wKewpyZXR1cm4gaXNfYXJyYXkoJGlucHV0KSAmJiBhcnJheV9rZXlzKCRpbnB1dCkgIT09IHJhbmdlKDAsIGNvdW50KCRpbnB1dCkgLSAxKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXFRvb2xcVmFsaWRhdG9yOwoKY2xhc3MgUmVsYXRpdmVSZWZlcmVuY2VWYWxpZGF0b3IKewpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzVmFsaWQoc3RyaW5nICRyZWYpOiBib29sCnsKCiRwYXR0ZXJuID0gJy9eKChbXlwvPyNdKyk6KT8oXC9cLyhbXlwvPyNdKikpPyhbXj8jXSopKFw/KFteI10qKSk/KCMoLiopKT8kLyc7CgppZiAocHJlZ19tYXRjaCgkcGF0dGVybiwgJHJlZikgIT09IDEpIHsKcmV0dXJuIGZhbHNlOwp9CgoKaWYgKHN0cnBvcygkcmVmLCAnXFwnKSAhPT0gZmFsc2UpIHsKcmV0dXJuIGZhbHNlOyAKfQoKaWYgKHByZWdfbWF0Y2goJy9eKGh0dHB8aHR0cHMpOlwvXC8vJywgJHJlZikpIHsKcmV0dXJuIGZhbHNlOyAKfQoKaWYgKHByZWdfbWF0Y2goJy9eOlwvXC8vJywgJHJlZikpIHsKcmV0dXJuIGZhbHNlOyAKfQoKaWYgKHByZWdfbWF0Y2goJy9eOlwvLycsICRyZWYpKSB7CnJldHVybiBmYWxzZTsgCn0KCmlmIChwcmVnX21hdGNoKCcvXlwvXC8kLycsICRyZWYpKSB7CnJldHVybiBmYWxzZTsgCn0KCmlmIChwcmVnX21hdGNoKCcvXlwvXC9cL1teXC9dLycsICRyZWYpKSB7CnJldHVybiBmYWxzZTsgCn0KCmlmIChwcmVnX21hdGNoKCcvXHMvJywgJHJlZikpIHsKcmV0dXJuIGZhbHNlOyAKfQoKaWYgKHByZWdfbWF0Y2goJy9eXD8jfF4jJC8nLCAkcmVmKSkgewpyZXR1cm4gZmFsc2U7IAp9CgppZiAoJHJlZiA9PT0gJyMnIHx8ICRyZWYgPT09ICc/JykgewpyZXR1cm4gZmFsc2U7IAp9CgpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXFRvb2xcVmFsaWRhdG9yOwoKY2xhc3MgVXJpVmFsaWRhdG9yCnsKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1ZhbGlkKHN0cmluZyAkdXJpKTogYm9vbAp7CgokaGllcmFyY2hpY2FsUGF0dGVybiA9ICcvXgogICAgICAgICAgICAoW2Etel1bYS16MC05K1wtLl0qKTpcL1wvICAgICAgICAgICAgICAgICMgU2NoZW1lIChodHRwLCBodHRwcywgZnRwLCBldGMuKQogICAgICAgICAgICAoPzooW146QFwvPyNdKykoPzo6KFteQFwvPyNdKikpP0ApPyAgICAgICMgT3B0aW9uYWwgdXNlcmluZm8gKHVzZXI6cGFzc0ApCiAgICAgICAgICAgIChbYS16MC05Ll9+LV0rfFxbW2EtZjAtOTouXStcXSkgICAgICAgICAgIyBIb3N0bmFtZSBvciBJUHY2IGluIGJyYWNrZXRzCiAgICAgICAgICAgICg/OjooXGR7MSw1fSkpPyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBPcHRpb25hbCBwb3J0CiAgICAgICAgICAgIChcL1thLXpBLVowLTkuX34hJCZcJygpKissOz06QFwvJS1dKikqICAgIyBQYXRoICh2YWxpZCBjaGFyYWN0ZXJzIG9ubHkpCiAgICAgICAgICAgIChcPyhbXiNdKikpPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBPcHRpb25hbCBxdWVyeQogICAgICAgICAgICAoXCMoLiopKT8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgT3B0aW9uYWwgZnJhZ21lbnQKICAgICAgICAkL2l4JzsKCgokbm9uSGllcmFyY2hpY2FsUGF0dGVybiA9ICcvXgogICAgICAgICAgICAgICAgKG1haWx0b3xkYXRhfHVybnxuZXdzfHRlbHxmaWxlKTogICAgICMgT25seSBhbGxvdyBrbm93biBub24taGllcmFyY2hpY2FsIHNjaGVtZXMKICAgICAgICAgICAgICAgICguKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGFmdGVyIHNjaGVtZQogICAgICAgICQvaXgnOwoKCiRuZXdzR3JvdXBQYXR0ZXJuID0gJy9eW2EtejAtOV0rKFwuW2EtejAtOV0rKSokL2knOwokdGVsUGF0dGVybiA9ICcvXlwrP1swLTkuXC0oKSBdKyQvJzsgCgoKJGVtYWlsUGF0dGVybiA9ICcvXlthLXpBLVowLTkuXyUrLV0rQFthLXpBLVowLTkuLV0rXC5bYS16QS1aXXsyLH0kLyc7CgoKaWYgKHByZWdfbWF0Y2goJGhpZXJhcmNoaWNhbFBhdHRlcm4sICR1cmksICRtYXRjaGVzKSA9PT0gMSkgewoKaWYgKCFlbXB0eSgkbWF0Y2hlc1s0XSkgJiYgcHJlZ19tYXRjaCgnL1wuXC4vJywgJG1hdGNoZXNbNF0pKSB7CnJldHVybiBmYWxzZTsKfQoKCmlmICghZW1wdHkoJG1hdGNoZXNbNV0pICYmICgkbWF0Y2hlc1s1XSA8IDEgfHwgJG1hdGNoZXNbNV0gPiA2NTUzNSkpIHsKcmV0dXJuIGZhbHNlOwp9CgoKaWYgKCFlbXB0eSgkbWF0Y2hlc1s2XSkgJiYgcHJlZ19tYXRjaCgnL1s8Pnt9fFxcXF5gXS8nLCAkbWF0Y2hlc1s2XSkpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCmlmIChwcmVnX21hdGNoKCRub25IaWVyYXJjaGljYWxQYXR0ZXJuLCAkdXJpLCAkbWF0Y2hlcykgPT09IDEpIHsKJHNjaGVtZSA9IHN0cnRvbG93ZXIoJG1hdGNoZXNbMV0pOyAKCgppZiAoJHNjaGVtZSA9PT0gJ21haWx0bycpIHsKcmV0dXJuIHByZWdfbWF0Y2goJGVtYWlsUGF0dGVybiwgJG1hdGNoZXNbMl0pID09PSAxOwp9CgppZiAoJHNjaGVtZSA9PT0gJ25ld3MnKSB7CnJldHVybiBwcmVnX21hdGNoKCRuZXdzR3JvdXBQYXR0ZXJuLCAkbWF0Y2hlc1syXSkgPT09IDE7Cn0KCmlmICgkc2NoZW1lID09PSAndGVsJykgewpyZXR1cm4gcHJlZ19tYXRjaCgkdGVsUGF0dGVybiwgJG1hdGNoZXNbMl0pID09PSAxOwp9CgpyZXR1cm4gdHJ1ZTsgCn0KCnJldHVybiBmYWxzZTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXFVyaVxSZXRyaWV2ZXJzOwoKCgoKCgoKYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXRyaWV2ZXIgaW1wbGVtZW50cyBVcmlSZXRyaWV2ZXJJbnRlcmZhY2UKewoKCgoKCnByb3RlY3RlZCAkY29udGVudFR5cGU7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb250ZW50VHlwZSgpCnsKcmV0dXJuICR0aGlzLT5jb250ZW50VHlwZTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxVcmlcUmV0cmlldmVyczsKCnVzZSBKc29uU2NoZW1hXEV4Y2VwdGlvblxSdW50aW1lRXhjZXB0aW9uOwp1c2UgSnNvblNjaGVtYVxWYWxpZGF0b3I7CgoKCgoKCmNsYXNzIEN1cmwgZXh0ZW5kcyBBYnN0cmFjdFJldHJpZXZlcgp7CnByb3RlY3RlZCAkbWVzc2FnZUJvZHk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7CmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdXJsX2luaXQnKSkgewoKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ2NVUkwgbm90IGluc3RhbGxlZCcpOyAKfQp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXRyaWV2ZSgkdXJpKQp7CiRjaCA9IGN1cmxfaW5pdCgpOwoKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJHVyaSk7CmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9IRUFERVIsIHRydWUpOwpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIHRydWUpOwpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSFRUUEhFQURFUiwgWydBY2NlcHQ6ICcgLiBWYWxpZGF0b3I6OlNDSEVNQV9NRURJQV9UWVBFXSk7CgokcmVzcG9uc2UgPSBjdXJsX2V4ZWMoJGNoKTsKaWYgKGZhbHNlID09PSAkcmVzcG9uc2UpIHsKdGhyb3cgbmV3IFxKc29uU2NoZW1hXEV4Y2VwdGlvblxSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKCdKU09OIHNjaGVtYSBub3QgZm91bmQnKTsKfQoKJHRoaXMtPmZldGNoTWVzc2FnZUJvZHkoJHJlc3BvbnNlKTsKJHRoaXMtPmZldGNoQ29udGVudFR5cGUoJHJlc3BvbnNlKTsKCmlmIChQSFBfVkVSU0lPTl9JRCA8IDgwMDAwKSB7CmN1cmxfY2xvc2UoJGNoKTsKfQoKcmV0dXJuICR0aGlzLT5tZXNzYWdlQm9keTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBmZXRjaE1lc3NhZ2VCb2R5KCRyZXNwb25zZSkKewpwcmVnX21hdGNoKCIvKD86XHJcbil7Mn0oLiopJC9tcyIsICRyZXNwb25zZSwgJG1hdGNoKTsKJHRoaXMtPm1lc3NhZ2VCb2R5ID0gJG1hdGNoWzFdOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBmZXRjaENvbnRlbnRUeXBlKCRyZXNwb25zZSkKewppZiAoMCA8IHByZWdfbWF0Y2goIi9Db250ZW50LVR5cGU6KFxWKikvaW1zIiwgJHJlc3BvbnNlLCAkbWF0Y2gpKSB7CiR0aGlzLT5jb250ZW50VHlwZSA9IHRyaW0oJG1hdGNoWzFdKTsKCnJldHVybiB0cnVlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcVXJpXFJldHJpZXZlcnM7Cgp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKCgoKCgoKY2xhc3MgRmlsZUdldENvbnRlbnRzIGV4dGVuZHMgQWJzdHJhY3RSZXRyaWV2ZXIKewpwcm90ZWN0ZWQgJG1lc3NhZ2VCb2R5OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmV0cmlldmUoJHVyaSkKewppZiAoZnVuY3Rpb25fZXhpc3RzKCdodHRwX2NsZWFyX2xhc3RfcmVzcG9uc2VfaGVhZGVycycpKSB7Cmh0dHBfY2xlYXJfbGFzdF9yZXNwb25zZV9oZWFkZXJzKCk7Cn0KCiRlcnJvck1lc3NhZ2UgPSBudWxsOwpzZXRfZXJyb3JfaGFuZGxlcihmdW5jdGlvbiAoJGVycm5vLCAkZXJyc3RyKSB1c2UgKCYkZXJyb3JNZXNzYWdlKSB7CiRlcnJvck1lc3NhZ2UgPSAkZXJyc3RyOwp9KTsKJHJlc3BvbnNlID0gZmlsZV9nZXRfY29udGVudHMoJHVyaSk7CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwoKaWYgKCRlcnJvck1lc3NhZ2UpIHsKdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oJGVycm9yTWVzc2FnZSk7Cn0KCmlmIChmYWxzZSA9PT0gJHJlc3BvbnNlKSB7CnRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKCdKU09OIHNjaGVtYSBub3QgZm91bmQgYXQgJyAuICR1cmkpOwp9CgppZiAoJHJlc3BvbnNlID09ICcnCiYmIHN1YnN0cigkdXJpLCAwLCA3KSA9PSAnZmlsZTovLycgJiYgc3Vic3RyKCR1cmksIC0xKSA9PSAnLycKKSB7CnRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKCdKU09OIHNjaGVtYSBub3QgZm91bmQgYXQgJyAuICR1cmkpOwp9CgokdGhpcy0+bWVzc2FnZUJvZHkgPSAkcmVzcG9uc2U7CgppZiAoZnVuY3Rpb25fZXhpc3RzKCdodHRwX2dldF9sYXN0X3Jlc3BvbnNlX2hlYWRlcnMnKSkgewoKCiRodHRwUmVzcG9uc2VIZWFkZXJzID0gaHR0cF9nZXRfbGFzdF9yZXNwb25zZV9oZWFkZXJzKCk7Cn0gZWxzZSB7CgokaHR0cFJlc3BvbnNlSGVhZGVycyA9ICRodHRwX3Jlc3BvbnNlX2hlYWRlciA/PyBbXTsKfQoKaWYgKCFlbXB0eSgkaHR0cFJlc3BvbnNlSGVhZGVycykpIHsKJHRoaXMtPmZldGNoQ29udGVudFR5cGUoJGh0dHBSZXNwb25zZUhlYWRlcnMpOwp9IGVsc2UgewokdGhpcy0+Y29udGVudFR5cGUgPSBudWxsOwp9CgpyZXR1cm4gJHRoaXMtPm1lc3NhZ2VCb2R5Owp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZmV0Y2hDb250ZW50VHlwZShhcnJheSAkaGVhZGVycyk6IGJvb2wKewpmb3JlYWNoIChhcnJheV9yZXZlcnNlKCRoZWFkZXJzKSBhcyAkaGVhZGVyKSB7CmlmICgkdGhpcy0+Y29udGVudFR5cGUgPSBzZWxmOjpnZXRDb250ZW50VHlwZU1hdGNoSW5IZWFkZXIoJGhlYWRlcikpIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKCnByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gZ2V0Q29udGVudFR5cGVNYXRjaEluSGVhZGVyKCRoZWFkZXIpCnsKaWYgKDAgPCBwcmVnX21hdGNoKCIvQ29udGVudC1UeXBlOihcViopL2ltcyIsICRoZWFkZXIsICRtYXRjaCkpIHsKcmV0dXJuIHRyaW0oJG1hdGNoWzFdKTsKfQoKcmV0dXJuIG51bGw7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxVcmlcUmV0cmlldmVyczsKCnVzZSBKc29uU2NoZW1hXFZhbGlkYXRvcjsKCgoKCgoKCgoKCgoKCmNsYXNzIFByZWRlZmluZWRBcnJheSBleHRlbmRzIEFic3RyYWN0UmV0cmlldmVyCnsKCgoKCgpwcml2YXRlICRzY2hlbWFzOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRzY2hlbWFzLCAkY29udGVudFR5cGUgPSBWYWxpZGF0b3I6OlNDSEVNQV9NRURJQV9UWVBFKQp7CiR0aGlzLT5zY2hlbWFzID0gJHNjaGVtYXM7CiR0aGlzLT5jb250ZW50VHlwZSA9ICRjb250ZW50VHlwZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmV0cmlldmUoJHVyaSkKewppZiAoIWFycmF5X2tleV9leGlzdHMoJHVyaSwgJHRoaXMtPnNjaGVtYXMpKSB7CnRocm93IG5ldyBcSnNvblNjaGVtYVxFeGNlcHRpb25cUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihzcHJpbnRmKAonVGhlIEpTT04gc2NoZW1hICIlcyIgd2FzIG5vdCBmb3VuZC4nLAokdXJpCikpOwp9CgpyZXR1cm4gJHRoaXMtPnNjaGVtYXNbJHVyaV07Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcVXJpXFJldHJpZXZlcnM7CgoKCgoKCmludGVyZmFjZSBVcmlSZXRyaWV2ZXJJbnRlcmZhY2UKewoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmV0cmlldmUoJHVyaSk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb250ZW50VHlwZSgpOwp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxVcmk7Cgp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cVXJpUmVzb2x2ZXJFeGNlcHRpb247CnVzZSBKc29uU2NoZW1hXFVyaVJlc29sdmVySW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBVcmlSZXNvbHZlciBpbXBsZW1lbnRzIFVyaVJlc29sdmVySW50ZXJmYWNlCnsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwYXJzZSgkdXJpKQp7CnByZWdfbWF0Y2goJ3xeKChbXjovPyNdKyk6KT8oLy8oW14vPyNdKikpPyhbXj8jXSopKFw/KFteI10qKSk/KCMoLiopKT98JywgKHN0cmluZykgJHVyaSwgJG1hdGNoKTsKCiRjb21wb25lbnRzID0gW107CmlmICg1IDwgY291bnQoJG1hdGNoKSkgewokY29tcG9uZW50cyA9IFsKJ3NjaGVtZScgPT4gJG1hdGNoWzJdLAonYXV0aG9yaXR5JyA9PiAkbWF0Y2hbNF0sCidwYXRoJyA9PiAkbWF0Y2hbNV0KXTsKfQppZiAoNyA8IGNvdW50KCRtYXRjaCkpIHsKJGNvbXBvbmVudHNbJ3F1ZXJ5J10gPSAkbWF0Y2hbN107Cn0KaWYgKDkgPCBjb3VudCgkbWF0Y2gpKSB7CiRjb21wb25lbnRzWydmcmFnbWVudCddID0gJG1hdGNoWzldOwp9CgpyZXR1cm4gJGNvbXBvbmVudHM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2VuZXJhdGUoYXJyYXkgJGNvbXBvbmVudHMpCnsKJHVyaSA9ICRjb21wb25lbnRzWydzY2hlbWUnXSAuICc6Ly8nCi4gJGNvbXBvbmVudHNbJ2F1dGhvcml0eSddCi4gJGNvbXBvbmVudHNbJ3BhdGgnXTsKCmlmIChhcnJheV9rZXlfZXhpc3RzKCdxdWVyeScsICRjb21wb25lbnRzKSAmJiBzdHJsZW4oJGNvbXBvbmVudHNbJ3F1ZXJ5J10pKSB7CiR1cmkgLj0gJz8nIC4gJGNvbXBvbmVudHNbJ3F1ZXJ5J107Cn0KaWYgKGFycmF5X2tleV9leGlzdHMoJ2ZyYWdtZW50JywgJGNvbXBvbmVudHMpKSB7CiR1cmkgLj0gJyMnIC4gJGNvbXBvbmVudHNbJ2ZyYWdtZW50J107Cn0KCnJldHVybiAkdXJpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzb2x2ZSgkdXJpLCAkYmFzZVVyaSA9IG51bGwpCnsKCmlmICgKIWlzX251bGwoJGJhc2VVcmkpICYmCiFmaWx0ZXJfdmFyKCRiYXNlVXJpLCBcRklMVEVSX1ZBTElEQVRFX1VSTCkgJiYKIXByZWdfbWF0Y2goJ3xeW14vXSs6Ly98dScsICRiYXNlVXJpKQopIHsKaWYgKGlzX2ZpbGUoJGJhc2VVcmkpKSB7CiRiYXNlVXJpID0gJ2ZpbGU6Ly8nIC4gcmVhbHBhdGgoJGJhc2VVcmkpOwp9IGVsc2VpZiAoaXNfZGlyKCRiYXNlVXJpKSkgewokYmFzZVVyaSA9ICdmaWxlOi8vJyAuIHJlYWxwYXRoKCRiYXNlVXJpKSAuICcvJzsKfSBlbHNlIHsKJGJhc2VVcmkgPSAnZmlsZTovLycgLiBnZXRjd2QoKSAuICcvJyAuICRiYXNlVXJpOwp9Cn0KCmlmICgkdXJpID09ICcnKSB7CnJldHVybiAkYmFzZVVyaTsKfQoKJGNvbXBvbmVudHMgPSAkdGhpcy0+cGFyc2UoJHVyaSk7CiRwYXRoID0gJGNvbXBvbmVudHNbJ3BhdGgnXTsKCmlmICghZW1wdHkoJGNvbXBvbmVudHNbJ3NjaGVtZSddKSkgewpyZXR1cm4gJHVyaTsKfQokYmFzZUNvbXBvbmVudHMgPSAkdGhpcy0+cGFyc2UoJGJhc2VVcmkpOwokYmFzZVBhdGggPSAkYmFzZUNvbXBvbmVudHNbJ3BhdGgnXTsKCiRiYXNlQ29tcG9uZW50c1sncGF0aCddID0gc2VsZjo6Y29tYmluZVJlbGF0aXZlUGF0aFdpdGhCYXNlUGF0aCgkcGF0aCwgJGJhc2VQYXRoKTsKaWYgKGlzc2V0KCRjb21wb25lbnRzWydmcmFnbWVudCddKSkgewokYmFzZUNvbXBvbmVudHNbJ2ZyYWdtZW50J10gPSAkY29tcG9uZW50c1snZnJhZ21lbnQnXTsKfQoKcmV0dXJuICR0aGlzLT5nZW5lcmF0ZSgkYmFzZUNvbXBvbmVudHMpOwp9CgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjb21iaW5lUmVsYXRpdmVQYXRoV2l0aEJhc2VQYXRoKCRyZWxhdGl2ZVBhdGgsICRiYXNlUGF0aCkKewokcmVsYXRpdmVQYXRoID0gc2VsZjo6bm9ybWFsaXplUGF0aCgkcmVsYXRpdmVQYXRoKTsKaWYgKCEkcmVsYXRpdmVQYXRoKSB7CnJldHVybiAkYmFzZVBhdGg7Cn0KaWYgKCRyZWxhdGl2ZVBhdGhbMF0gPT09ICcvJykgewpyZXR1cm4gJHJlbGF0aXZlUGF0aDsKfQppZiAoISRiYXNlUGF0aCkgewp0aHJvdyBuZXcgVXJpUmVzb2x2ZXJFeGNlcHRpb24oc3ByaW50ZigiVW5hYmxlIHRvIHJlc29sdmUgVVJJICclcycgZnJvbSBiYXNlICclcyciLCAkcmVsYXRpdmVQYXRoLCAkYmFzZVBhdGgpKTsKfQoKJGRpcm5hbWUgPSAkYmFzZVBhdGhbc3RybGVuKCRiYXNlUGF0aCkgLSAxXSA9PT0gJy8nID8gJGJhc2VQYXRoIDogZGlybmFtZSgkYmFzZVBhdGgpOwokY29tYmluZWQgPSBydHJpbSgkZGlybmFtZSwgJy8nKSAuICcvJyAuIGx0cmltKCRyZWxhdGl2ZVBhdGgsICcvJyk7CiRjb21iaW5lZFNlZ21lbnRzID0gZXhwbG9kZSgnLycsICRjb21iaW5lZCk7CiRjb2xsYXBzZWRTZWdtZW50cyA9IFtdOwp3aGlsZSAoJGNvbWJpbmVkU2VnbWVudHMpIHsKJHNlZ21lbnQgPSBhcnJheV9zaGlmdCgkY29tYmluZWRTZWdtZW50cyk7CmlmICgkc2VnbWVudCA9PT0gJy4uJykgewppZiAoY291bnQoJGNvbGxhcHNlZFNlZ21lbnRzKSA8PSAxKSB7CgoKCgp0aHJvdyBuZXcgVXJpUmVzb2x2ZXJFeGNlcHRpb24oc3ByaW50ZigiVW5hYmxlIHRvIHJlc29sdmUgVVJJICclcycgZnJvbSBiYXNlICclcyciLCAkcmVsYXRpdmVQYXRoLCAkYmFzZVBhdGgpKTsKfQphcnJheV9wb3AoJGNvbGxhcHNlZFNlZ21lbnRzKTsKfSBlbHNlIHsKJGNvbGxhcHNlZFNlZ21lbnRzW10gPSAkc2VnbWVudDsKfQp9CgpyZXR1cm4gaW1wbG9kZSgnLycsICRjb2xsYXBzZWRTZWdtZW50cyk7Cn0KCgoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBub3JtYWxpemVQYXRoKCRwYXRoKQp7CiRwYXRoID0gcHJlZ19yZXBsYWNlKCd8KCg/PCFcLilcLi8pKnwnLCAnJywgJHBhdGgpOwokcGF0aCA9IHByZWdfcmVwbGFjZSgnfC8vfCcsICcvJywgJHBhdGgpOwoKcmV0dXJuICRwYXRoOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZhbGlkKCR1cmkpCnsKJGNvbXBvbmVudHMgPSAkdGhpcy0+cGFyc2UoJHVyaSk7CgpyZXR1cm4gIWVtcHR5KCRjb21wb25lbnRzKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxVcmk7Cgp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cSW52YWxpZFNjaGVtYU1lZGlhVHlwZUV4Y2VwdGlvbjsKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXEpzb25EZWNvZGluZ0V4Y2VwdGlvbjsKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXFJlc291cmNlTm90Rm91bmRFeGNlcHRpb247CnVzZSBKc29uU2NoZW1hXFVyaVxSZXRyaWV2ZXJzXEZpbGVHZXRDb250ZW50czsKdXNlIEpzb25TY2hlbWFcVXJpXFJldHJpZXZlcnNcVXJpUmV0cmlldmVySW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxVcmlSZXRyaWV2ZXJJbnRlcmZhY2UgYXMgQmFzZVVyaVJldHJpZXZlckludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcVmFsaWRhdG9yOwoKCgoKCgpjbGFzcyBVcmlSZXRyaWV2ZXIgaW1wbGVtZW50cyBCYXNlVXJpUmV0cmlldmVySW50ZXJmYWNlCnsKCgoKcHJvdGVjdGVkICR0cmFuc2xhdGlvbk1hcCA9IFsKCid8Xmh0dHBzPzovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0oMFszNDY3XSkvc2NoZW1hIz98JyA9PiAncGFja2FnZTovL2Rpc3Qvc2NoZW1hL2pzb24tc2NoZW1hLWRyYWZ0LSQxLmpzb24nCl07CgoKCgpwcm90ZWN0ZWQgJGFsbG93ZWRJbnZhbGlkQ29udGVudFR5cGVFbmRwb2ludHMgPSBbCidodHRwOi8vanNvbi1zY2hlbWEub3JnLycsCidodHRwczovL2pzb24tc2NoZW1hLm9yZy8nCl07CgoKCgpwcm90ZWN0ZWQgJHVyaVJldHJpZXZlciA9IG51bGw7CgoKCgoKCnByaXZhdGUgJHNjaGVtYUNhY2hlID0gW107CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRJbnZhbGlkQ29udGVudFR5cGVFbmRwb2ludCgkZW5kcG9pbnQpCnsKJHRoaXMtPmFsbG93ZWRJbnZhbGlkQ29udGVudFR5cGVFbmRwb2ludHNbXSA9ICRlbmRwb2ludDsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29uZmlybU1lZGlhVHlwZSgkdXJpUmV0cmlldmVyLCAkdXJpKQp7CiRjb250ZW50VHlwZSA9ICR1cmlSZXRyaWV2ZXItPmdldENvbnRlbnRUeXBlKCk7CgppZiAoaXNfbnVsbCgkY29udGVudFR5cGUpKSB7CgpyZXR1cm47Cn0KCmlmIChpbl9hcnJheSgkY29udGVudFR5cGUsIFtWYWxpZGF0b3I6OlNDSEVNQV9NRURJQV9UWVBFLCAnYXBwbGljYXRpb24vanNvbiddKSkgewpyZXR1cm47Cn0KCmZvcmVhY2ggKCR0aGlzLT5hbGxvd2VkSW52YWxpZENvbnRlbnRUeXBlRW5kcG9pbnRzIGFzICRlbmRwb2ludCkgewppZiAoIVxpc19udWxsKCR1cmkpICYmIHN0cnBvcygkdXJpLCAkZW5kcG9pbnQpID09PSAwKSB7CnJldHVybiB0cnVlOwp9Cn0KCnRocm93IG5ldyBJbnZhbGlkU2NoZW1hTWVkaWFUeXBlRXhjZXB0aW9uKHNwcmludGYoJ01lZGlhIHR5cGUgJXMgZXhwZWN0ZWQsIGJ1dCAlcyBnaXZlbicsIFZhbGlkYXRvcjo6U0NIRU1BX01FRElBX1RZUEUsICRjb250ZW50VHlwZSkpOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVcmlSZXRyaWV2ZXIoKQp7CmlmIChpc19udWxsKCR0aGlzLT51cmlSZXRyaWV2ZXIpKSB7CiR0aGlzLT5zZXRVcmlSZXRyaWV2ZXIobmV3IEZpbGVHZXRDb250ZW50cygpKTsKfQoKcmV0dXJuICR0aGlzLT51cmlSZXRyaWV2ZXI7Cn0KCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlc29sdmVQb2ludGVyKCRqc29uU2NoZW1hLCAkdXJpKQp7CiRyZXNvbHZlciA9IG5ldyBVcmlSZXNvbHZlcigpOwokcGFyc2VkID0gJHJlc29sdmVyLT5wYXJzZSgkdXJpKTsKaWYgKGVtcHR5KCRwYXJzZWRbJ2ZyYWdtZW50J10pKSB7CnJldHVybiAkanNvblNjaGVtYTsKfQoKJHBhdGggPSBleHBsb2RlKCcvJywgJHBhcnNlZFsnZnJhZ21lbnQnXSk7CndoaWxlICgkcGF0aCkgewokcGF0aEVsZW1lbnQgPSBhcnJheV9zaGlmdCgkcGF0aCk7CmlmICghZW1wdHkoJHBhdGhFbGVtZW50KSkgewokcGF0aEVsZW1lbnQgPSBzdHJfcmVwbGFjZSgnfjEnLCAnLycsICRwYXRoRWxlbWVudCk7CiRwYXRoRWxlbWVudCA9IHN0cl9yZXBsYWNlKCd+MCcsICd+JywgJHBhdGhFbGVtZW50KTsKaWYgKCFlbXB0eSgkanNvblNjaGVtYS0+JHBhdGhFbGVtZW50KSkgewokanNvblNjaGVtYSA9ICRqc29uU2NoZW1hLT4kcGF0aEVsZW1lbnQ7Cn0gZWxzZSB7CnRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKAonRnJhZ21lbnQgIicgLiAkcGFyc2VkWydmcmFnbWVudCddIC4gJyIgbm90IGZvdW5kJwouICcgaW4gJyAuICR1cmkKKTsKfQoKaWYgKCFpc19vYmplY3QoJGpzb25TY2hlbWEpKSB7CnRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKAonRnJhZ21lbnQgcGFydCAiJyAuICRwYXRoRWxlbWVudCAuICciIGlzIG5vIG9iamVjdCAnCi4gJyBpbiAnIC4gJHVyaQopOwp9Cn0KfQoKcmV0dXJuICRqc29uU2NoZW1hOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmV0cmlldmUoJHVyaSwgJGJhc2VVcmkgPSBudWxsLCAkdHJhbnNsYXRlID0gdHJ1ZSkKewokcmVzb2x2ZXIgPSBuZXcgVXJpUmVzb2x2ZXIoKTsKJHJlc29sdmVkVXJpID0gJGZldGNoVXJpID0gJHJlc29sdmVyLT5yZXNvbHZlKCR1cmksICRiYXNlVXJpKTsKCgokYXJQYXJ0cyA9ICRyZXNvbHZlci0+cGFyc2UoJHJlc29sdmVkVXJpKTsKaWYgKGlzc2V0KCRhclBhcnRzWydmcmFnbWVudCddKSkgewp1bnNldCgkYXJQYXJ0c1snZnJhZ21lbnQnXSk7CiRmZXRjaFVyaSA9ICRyZXNvbHZlci0+Z2VuZXJhdGUoJGFyUGFydHMpOwp9CgoKaWYgKCR0cmFuc2xhdGUpIHsKJGZldGNoVXJpID0gJHRoaXMtPnRyYW5zbGF0ZSgkZmV0Y2hVcmkpOwp9CgokanNvblNjaGVtYSA9ICR0aGlzLT5sb2FkU2NoZW1hKCRmZXRjaFVyaSk7CgoKJGpzb25TY2hlbWEgPSAkdGhpcy0+cmVzb2x2ZVBvaW50ZXIoJGpzb25TY2hlbWEsICRyZXNvbHZlZFVyaSk7CgppZiAoJGpzb25TY2hlbWEgaW5zdGFuY2VvZiBcc3RkQ2xhc3MpIHsKJGpzb25TY2hlbWEtPmlkID0gJHJlc29sdmVkVXJpOwp9CgpyZXR1cm4gJGpzb25TY2hlbWE7Cn0KCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGxvYWRTY2hlbWEoJGZldGNoVXJpKQp7CmlmIChpc3NldCgkdGhpcy0+c2NoZW1hQ2FjaGVbJGZldGNoVXJpXSkpIHsKcmV0dXJuICR0aGlzLT5zY2hlbWFDYWNoZVskZmV0Y2hVcmldOwp9CgokdXJpUmV0cmlldmVyID0gJHRoaXMtPmdldFVyaVJldHJpZXZlcigpOwokY29udGVudHMgPSAkdGhpcy0+dXJpUmV0cmlldmVyLT5yZXRyaWV2ZSgkZmV0Y2hVcmkpOwokdGhpcy0+Y29uZmlybU1lZGlhVHlwZSgkdXJpUmV0cmlldmVyLCAkZmV0Y2hVcmkpOwokanNvblNjaGVtYSA9IGpzb25fZGVjb2RlKCRjb250ZW50cyk7CgppZiAoSlNPTl9FUlJPUl9OT05FIDwgJGVycm9yID0ganNvbl9sYXN0X2Vycm9yKCkpIHsKdGhyb3cgbmV3IEpzb25EZWNvZGluZ0V4Y2VwdGlvbigkZXJyb3IpOwp9CgokdGhpcy0+c2NoZW1hQ2FjaGVbJGZldGNoVXJpXSA9ICRqc29uU2NoZW1hOwoKcmV0dXJuICRqc29uU2NoZW1hOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFVyaVJldHJpZXZlcihVcmlSZXRyaWV2ZXJJbnRlcmZhY2UgJHVyaVJldHJpZXZlcikKewokdGhpcy0+dXJpUmV0cmlldmVyID0gJHVyaVJldHJpZXZlcjsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwYXJzZSgkdXJpKQp7CnByZWdfbWF0Y2goJ3xeKChbXjovPyNdKyk6KT8oLy8oW14vPyNdKikpPyhbXj8jXSopKFw/KFteI10qKSk/KCMoLiopKT98JywgJHVyaSwgJG1hdGNoKTsKCiRjb21wb25lbnRzID0gW107CmlmICg1IDwgY291bnQoJG1hdGNoKSkgewokY29tcG9uZW50cyA9IFsKJ3NjaGVtZScgPT4gJG1hdGNoWzJdLAonYXV0aG9yaXR5JyA9PiAkbWF0Y2hbNF0sCidwYXRoJyA9PiAkbWF0Y2hbNV0KXTsKfQoKaWYgKDcgPCBjb3VudCgkbWF0Y2gpKSB7CiRjb21wb25lbnRzWydxdWVyeSddID0gJG1hdGNoWzddOwp9CgppZiAoOSA8IGNvdW50KCRtYXRjaCkpIHsKJGNvbXBvbmVudHNbJ2ZyYWdtZW50J10gPSAkbWF0Y2hbOV07Cn0KCnJldHVybiAkY29tcG9uZW50czsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZW5lcmF0ZShhcnJheSAkY29tcG9uZW50cykKewokdXJpID0gJGNvbXBvbmVudHNbJ3NjaGVtZSddIC4gJzovLycKLiAkY29tcG9uZW50c1snYXV0aG9yaXR5J10KLiAkY29tcG9uZW50c1sncGF0aCddOwoKaWYgKGFycmF5X2tleV9leGlzdHMoJ3F1ZXJ5JywgJGNvbXBvbmVudHMpKSB7CiR1cmkgLj0gJGNvbXBvbmVudHNbJ3F1ZXJ5J107Cn0KCmlmIChhcnJheV9rZXlfZXhpc3RzKCdmcmFnbWVudCcsICRjb21wb25lbnRzKSkgewokdXJpIC49ICRjb21wb25lbnRzWydmcmFnbWVudCddOwp9CgpyZXR1cm4gJHVyaTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzb2x2ZSgkdXJpLCAkYmFzZVVyaSA9IG51bGwpCnsKJGNvbXBvbmVudHMgPSAkdGhpcy0+cGFyc2UoJHVyaSk7CiRwYXRoID0gJGNvbXBvbmVudHNbJ3BhdGgnXTsKCmlmICgoYXJyYXlfa2V5X2V4aXN0cygnc2NoZW1lJywgJGNvbXBvbmVudHMpKSAmJiAoJ2h0dHAnID09PSAkY29tcG9uZW50c1snc2NoZW1lJ10pKSB7CnJldHVybiAkdXJpOwp9CgokYmFzZUNvbXBvbmVudHMgPSAkdGhpcy0+cGFyc2UoJGJhc2VVcmkpOwokYmFzZVBhdGggPSAkYmFzZUNvbXBvbmVudHNbJ3BhdGgnXTsKCiRiYXNlQ29tcG9uZW50c1sncGF0aCddID0gVXJpUmVzb2x2ZXI6OmNvbWJpbmVSZWxhdGl2ZVBhdGhXaXRoQmFzZVBhdGgoJHBhdGgsICRiYXNlUGF0aCk7CgpyZXR1cm4gJHRoaXMtPmdlbmVyYXRlKCRiYXNlQ29tcG9uZW50cyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVmFsaWQoJHVyaSkKewokY29tcG9uZW50cyA9ICR0aGlzLT5wYXJzZSgkdXJpKTsKCnJldHVybiAhZW1wdHkoJGNvbXBvbmVudHMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VHJhbnNsYXRpb24oJGZyb20sICR0bykKewokdGhpcy0+dHJhbnNsYXRpb25NYXBbJGZyb21dID0gJHRvOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdHJhbnNsYXRlKCR1cmkpCnsKZm9yZWFjaCAoJHRoaXMtPnRyYW5zbGF0aW9uTWFwIGFzICRmcm9tID0+ICR0bykgewokdXJpID0gcHJlZ19yZXBsYWNlKCRmcm9tLCAkdG8sICR1cmkpOwp9CgoKJHVyaSA9IHByZWdfcmVwbGFjZSgnfF5wYWNrYWdlOi8vfCcsIHNwcmludGYoJ2ZpbGU6Ly8lcy8nLCByZWFscGF0aChfX0RJUl9fIC4gJy8uLi8uLi8uLicpKSwgJHVyaSk7CgpyZXR1cm4gJHVyaTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYTsKCgoKCmludGVyZmFjZSBVcmlSZXNvbHZlckludGVyZmFjZQp7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlc29sdmUoJHVyaSwgJGJhc2VVcmkgPSBudWxsKTsKfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWE7CgoKCgppbnRlcmZhY2UgVXJpUmV0cmlldmVySW50ZXJmYWNlCnsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmV0cmlldmUoJHVyaSwgJGJhc2VVcmkgPSBudWxsKTsKfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWE7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xCYXNlQ29uc3RyYWludDsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludDsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcVHlwZUNoZWNrXExvb3NlVHlwZUNoZWNrOwoKCgoKCgoKCgpjbGFzcyBWYWxpZGF0b3IgZXh0ZW5kcyBCYXNlQ29uc3RyYWludAp7CnB1YmxpYyBjb25zdCBTQ0hFTUFfTUVESUFfVFlQRSA9ICdhcHBsaWNhdGlvbi9zY2hlbWEranNvbic7CgpwdWJsaWMgY29uc3QgRVJST1JfTk9ORSA9IDA7CnB1YmxpYyBjb25zdCBFUlJPUl9BTEwgPSAtMTsKcHVibGljIGNvbnN0IEVSUk9SX0RPQ1VNRU5UX1ZBTElEQVRJT04gPSAxOwpwdWJsaWMgY29uc3QgRVJST1JfU0NIRU1BX1ZBTElEQVRJT04gPSAyOwoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZSgmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP2ludCAkY2hlY2tNb2RlID0gbnVsbCk6IGludAp7CgokdGhpcy0+cmVzZXQoKTsKCgokaW5pdGlhbENoZWNrTW9kZSA9ICR0aGlzLT5mYWN0b3J5LT5nZXRDb25maWcoKTsKaWYgKCRjaGVja01vZGUgIT09IG51bGwpIHsKJHRoaXMtPmZhY3RvcnktPnNldENvbmZpZygkY2hlY2tNb2RlKTsKfQoKCiRzY2hlbWFVUkkgPSBTY2hlbWFTdG9yYWdlOjpJTlRFUk5BTF9QUk9WSURFRF9TQ0hFTUFfVVJJOwppZiAoTG9vc2VUeXBlQ2hlY2s6OnByb3BlcnR5RXhpc3RzKCRzY2hlbWEsICdpZCcpKSB7CiRzY2hlbWFVUkkgPSBMb29zZVR5cGVDaGVjazo6cHJvcGVydHlHZXQoJHNjaGVtYSwgJ2lkJyk7Cn0KaWYgKExvb3NlVHlwZUNoZWNrOjpwcm9wZXJ0eUV4aXN0cygkc2NoZW1hLCAnJGlkJykpIHsKJHNjaGVtYVVSSSA9IExvb3NlVHlwZUNoZWNrOjpwcm9wZXJ0eUdldCgkc2NoZW1hLCAnJGlkJyk7Cn0KJHRoaXMtPmZhY3RvcnktPmdldFNjaGVtYVN0b3JhZ2UoKS0+YWRkU2NoZW1hKCRzY2hlbWFVUkksICRzY2hlbWEpOwoKJHZhbGlkYXRvciA9ICR0aGlzLT5mYWN0b3J5LT5jcmVhdGVJbnN0YW5jZUZvcignc2NoZW1hJyk7CiRzY2hlbWEgPSAkdGhpcy0+ZmFjdG9yeS0+Z2V0U2NoZW1hU3RvcmFnZSgpLT5nZXRTY2hlbWEoJHNjaGVtYVVSSSk7CgoKaWYgKGlzX2Jvb2woJHNjaGVtYSkpIHsKaWYgKCRzY2hlbWEgPT09IGZhbHNlKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZBTFNFKCkpOwp9CgpyZXR1cm4gJHRoaXMtPmdldEVycm9yTWFzaygpOwp9CgppZiAoJHRoaXMtPmZhY3RvcnktPmdldENvbmZpZyhDb25zdHJhaW50OjpDSEVDS19NT0RFX1NUUklDVCkpIHsKJGRpYWxlY3QgPSAkdGhpcy0+ZmFjdG9yeS0+Z2V0RGVmYXVsdERpYWxlY3QoKTsKaWYgKHByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnJHNjaGVtYScpKSB7CiRkaWFsZWN0ID0gJHNjaGVtYS0+eyckc2NoZW1hJ307Cn0KCiR2YWxpZGF0b3IgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoCkRyYWZ0SWRlbnRpZmllcnM6OmJ5VmFsdWUoJGRpYWxlY3QpLT50b0NvbnN0cmFpbnROYW1lKCkKKTsKfQoKJHZhbGlkYXRvci0+Y2hlY2soJHZhbHVlLCAkc2NoZW1hKTsKCiR0aGlzLT5mYWN0b3J5LT5zZXRDb25maWcoJGluaXRpYWxDaGVja01vZGUpOwoKJHRoaXMtPmFkZEVycm9ycyhhcnJheV91bmlxdWUoJHZhbGlkYXRvci0+Z2V0RXJyb3JzKCksIFNPUlRfUkVHVUxBUikpOwoKcmV0dXJuICR2YWxpZGF0b3ItPmdldEVycm9yTWFzaygpOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCR2YWx1ZSwgJHNjaGVtYSk6IGludAp7CnJldHVybiAkdGhpcy0+dmFsaWRhdGUoJHZhbHVlLCAkc2NoZW1hKTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb2VyY2UoJiR2YWx1ZSwgJHNjaGVtYSk6IGludAp7CnJldHVybiAkdGhpcy0+dmFsaWRhdGUoJHZhbHVlLCAkc2NoZW1hLCBDb25zdHJhaW50OjpDSEVDS19NT0RFX0NPRVJDRV9UWVBFUyk7Cn0KfQpDb3B5cmlnaHQgKGMpIDIwMjAsIE1hcmMgQmVubmV3aXR6CkFsbCByaWdodHMgcmVzZXJ2ZWQuCgpSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAphcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CgogICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgICAKICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogICAgCiAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIG9yZ2FuaXNhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgoKVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORApBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRApXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCkRJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIE1hYmVFbnVtOwoKdXNlIFJlZmxlY3Rpb25DbGFzczsKdXNlIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIExvZ2ljRXhjZXB0aW9uOwoKCgoKCgoKCgoKYWJzdHJhY3QgY2xhc3MgRW51bSBpbXBsZW1lbnRzIFxTdHJpbmdhYmxlCnsKCgoKCgpwcml2YXRlICR2YWx1ZTsKCgoKCgoKcHJpdmF0ZSAkb3JkaW5hbDsKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgJGNvbnN0YW50cyA9IFtdOwoKCgoKCgpwcml2YXRlIHN0YXRpYyAkbmFtZXMgPSBbXTsKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgJGluc3RhbmNlcyA9IFtdOwoKCgoKCgoKZmluYWwgcHJpdmF0ZSBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdmFsdWUsICRvcmRpbmFsID0gbnVsbCkKewokdGhpcy0+dmFsdWUgPSAkdmFsdWU7CiR0aGlzLT5vcmRpbmFsID0gJG9yZGluYWw7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+Z2V0TmFtZSgpOwp9CgoKCgoKZmluYWwgcHVibGljIGZ1bmN0aW9uIF9fY2xvbmUoKQp7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignRW51bXMgYXJlIG5vdCBjbG9uZWFibGUnKTsKfQoKCgoKCgpmaW5hbCBwdWJsaWMgZnVuY3Rpb24gX19zbGVlcCgpCnsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdTZXJpYWxpemF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgZGVmYXVsdCBpbiB0aGlzIHBzZXVkby1lbnVtIGltcGxlbWVudGF0aW9uJyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fc2VyaWFsaXplKCk6IGFycmF5CnsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdTZXJpYWxpemF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgZGVmYXVsdCBpbiB0aGlzIHBzZXVkby1lbnVtIGltcGxlbWVudGF0aW9uJyk7Cn0KCgoKCgoKZmluYWwgcHVibGljIGZ1bmN0aW9uIF9fd2FrZXVwKCkKewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ1NlcmlhbGl6YXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBkZWZhdWx0IGluIHRoaXMgcHNldWRvLWVudW0gaW1wbGVtZW50YXRpb24nKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX191bnNlcmlhbGl6ZShhcnJheSAkZGF0YSk6IHZvaWQKewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ1NlcmlhbGl6YXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBkZWZhdWx0IGluIHRoaXMgcHNldWRvLWVudW0gaW1wbGVtZW50YXRpb24nKTsKfQoKCgoKCgpmaW5hbCBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFsdWUoKQp7CnJldHVybiAkdGhpcy0+dmFsdWU7Cn0KCgoKCgoKCgoKZmluYWwgcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKQp7CnJldHVybiBzZWxmOjokbmFtZXNbc3RhdGljOjpjbGFzc11bJHRoaXMtPm9yZGluYWwgPz8gJHRoaXMtPmdldE9yZGluYWwoKV07Cn0KCgoKCgoKZmluYWwgcHVibGljIGZ1bmN0aW9uIGdldE9yZGluYWwoKQp7CmlmICgkdGhpcy0+b3JkaW5hbCA9PT0gbnVsbCkgewokb3JkaW5hbCA9IDA7CiR2YWx1ZSA9ICR0aGlzLT52YWx1ZTsKJGNvbnN0YW50cyA9IHNlbGY6OiRjb25zdGFudHNbc3RhdGljOjpjbGFzc10gPz8gc3RhdGljOjpnZXRDb25zdGFudHMoKTsKZm9yZWFjaCAoJGNvbnN0YW50cyBhcyAkY29uc3RWYWx1ZSkgewppZiAoJHZhbHVlID09PSAkY29uc3RWYWx1ZSkgewpicmVhazsKfQorKyRvcmRpbmFsOwp9CgokdGhpcy0+b3JkaW5hbCA9ICRvcmRpbmFsOwp9CgpyZXR1cm4gJHRoaXMtPm9yZGluYWw7Cn0KCgoKCgoKCmZpbmFsIHB1YmxpYyBmdW5jdGlvbiBpcygkZW51bWVyYXRvcikKewpyZXR1cm4gJHRoaXMgPT09ICRlbnVtZXJhdG9yIHx8ICR0aGlzLT52YWx1ZSA9PT0gJGVudW1lcmF0b3IKCgp8fCAoJGVudW1lcmF0b3IgaW5zdGFuY2VvZiBzdGF0aWMKJiYgXGdldF9jbGFzcygkZW51bWVyYXRvcikgPT09IHN0YXRpYzo6Y2xhc3MKJiYgJGVudW1lcmF0b3ItPnZhbHVlID09PSAkdGhpcy0+dmFsdWUKKTsKfQoKCgoKCgoKCgoKCmZpbmFsIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0KCRlbnVtZXJhdG9yKQp7CmlmICgkZW51bWVyYXRvciBpbnN0YW5jZW9mIHN0YXRpYykgewppZiAoXGdldF9jbGFzcygkZW51bWVyYXRvcikgIT09IHN0YXRpYzo6Y2xhc3MpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKAonSW52YWxpZCB2YWx1ZSBvZiB0eXBlICVzIGZvciBlbnVtZXJhdGlvbiAlcycsClxnZXRfY2xhc3MoJGVudW1lcmF0b3IpLApzdGF0aWM6OmNsYXNzCikpOwp9CgpyZXR1cm4gJGVudW1lcmF0b3I7Cn0KCnJldHVybiBzdGF0aWM6OmJ5VmFsdWUoJGVudW1lcmF0b3IpOwp9CgoKCgoKCgoKCgoKZmluYWwgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBieVZhbHVlKCR2YWx1ZSkKewoKCiRjb25zdGFudHMgPSBzZWxmOjokY29uc3RhbnRzW3N0YXRpYzo6Y2xhc3NdID8/IHN0YXRpYzo6Z2V0Q29uc3RhbnRzKCk7CgokbmFtZSA9IFxhcnJheV9zZWFyY2goJHZhbHVlLCAkY29uc3RhbnRzLCB0cnVlKTsKaWYgKCRuYW1lID09PSBmYWxzZSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoCidVbmtub3duIHZhbHVlICVzIGZvciBlbnVtZXJhdGlvbiAlcycsClxpc19zY2FsYXIoJHZhbHVlKQo/IFx2YXJfZXhwb3J0KCR2YWx1ZSwgdHJ1ZSkKOiAnb2YgdHlwZSAnIC4gKFxpc19vYmplY3QoJHZhbHVlKSA/IFxnZXRfY2xhc3MoJHZhbHVlKSA6IFxnZXR0eXBlKCR2YWx1ZSkpLApzdGF0aWM6OmNsYXNzCikpOwp9CgoKJGluc3RhbmNlID0gc2VsZjo6JGluc3RhbmNlc1tzdGF0aWM6OmNsYXNzXVskbmFtZV0KPz8gc2VsZjo6JGluc3RhbmNlc1tzdGF0aWM6OmNsYXNzXVskbmFtZV0gPSBuZXcgc3RhdGljKCRjb25zdGFudHNbJG5hbWVdKTsKCnJldHVybiAkaW5zdGFuY2U7Cn0KCgoKCgoKCgoKCgpmaW5hbCBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGJ5TmFtZShzdHJpbmcgJG5hbWUpCnsKaWYgKGlzc2V0KHNlbGY6OiRpbnN0YW5jZXNbc3RhdGljOjpjbGFzc11bJG5hbWVdKSkgewoKJGluc3RhbmNlID0gc2VsZjo6JGluc3RhbmNlc1tzdGF0aWM6OmNsYXNzXVskbmFtZV07CnJldHVybiAkaW5zdGFuY2U7Cn0KCiRjb25zdCA9IHN0YXRpYzo6Y2xhc3MgLiAiOjp7JG5hbWV9IjsKaWYgKCFcZGVmaW5lZCgkY29uc3QpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oInskY29uc3R9IG5vdCBkZWZpbmVkIik7Cn0KCmFzc2VydCgKc2VsZjo6bm9BbWJpZ3VvdXNWYWx1ZXMoc3RhdGljOjpnZXRDb25zdGFudHMoKSksCidBbWJpZ3VvdXMgZW51bWVyYXRvciB2YWx1ZXMgZGV0ZWN0ZWQgZm9yICcgLiBzdGF0aWM6OmNsYXNzCik7CgoKJHZhbHVlID0gXGNvbnN0YW50KCRjb25zdCk7CnJldHVybiBzZWxmOjokaW5zdGFuY2VzW3N0YXRpYzo6Y2xhc3NdWyRuYW1lXSA9IG5ldyBzdGF0aWMoJHZhbHVlKTsKfQoKCgoKCgoKCgoKCmZpbmFsIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYnlPcmRpbmFsKGludCAkb3JkaW5hbCkKewokY29uc3RhbnRzID0gc2VsZjo6JGNvbnN0YW50c1tzdGF0aWM6OmNsYXNzXSA/PyBzdGF0aWM6OmdldENvbnN0YW50cygpOwoKaWYgKCFpc3NldChzZWxmOjokbmFtZXNbc3RhdGljOjpjbGFzc11bJG9yZGluYWxdKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKFxzcHJpbnRmKAonSW52YWxpZCBvcmRpbmFsIG51bWJlciAlcywgbXVzdCBiZXR3ZWVuIDAgYW5kICVzJywKJG9yZGluYWwsClxjb3VudChzZWxmOjokbmFtZXNbc3RhdGljOjpjbGFzc10pIC0gMQopKTsKfQoKJG5hbWUgPSBzZWxmOjokbmFtZXNbc3RhdGljOjpjbGFzc11bJG9yZGluYWxdOwoKCiRpbnN0YW5jZSA9IHNlbGY6OiRpbnN0YW5jZXNbc3RhdGljOjpjbGFzc11bJG5hbWVdCj8/IHNlbGY6OiRpbnN0YW5jZXNbc3RhdGljOjpjbGFzc11bJG5hbWVdID0gbmV3IHN0YXRpYygkY29uc3RhbnRzWyRuYW1lXSwgJG9yZGluYWwpOwoKcmV0dXJuICRpbnN0YW5jZTsKfQoKCgoKCgoKCgoKZmluYWwgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRFbnVtZXJhdG9ycygpCnsKaWYgKCFpc3NldChzZWxmOjokbmFtZXNbc3RhdGljOjpjbGFzc10pKSB7CnN0YXRpYzo6Z2V0Q29uc3RhbnRzKCk7Cn0KCgokYnlOYW1lRm4gPSBbc3RhdGljOjpjbGFzcywgJ2J5TmFtZSddOwpyZXR1cm4gXGFycmF5X21hcCgkYnlOYW1lRm4sIHNlbGY6OiRuYW1lc1tzdGF0aWM6OmNsYXNzXSk7Cn0KCgoKCgoKCgoKCmZpbmFsIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VmFsdWVzKCkKewpyZXR1cm4gXGFycmF5X3ZhbHVlcyhzZWxmOjokY29uc3RhbnRzW3N0YXRpYzo6Y2xhc3NdID8/IHN0YXRpYzo6Z2V0Q29uc3RhbnRzKCkpOwp9CgoKCgoKCgoKCgpmaW5hbCBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldE5hbWVzKCkKewppZiAoIWlzc2V0KHNlbGY6OiRuYW1lc1tzdGF0aWM6OmNsYXNzXSkpIHsKc3RhdGljOjpnZXRDb25zdGFudHMoKTsKfQpyZXR1cm4gc2VsZjo6JG5hbWVzW3N0YXRpYzo6Y2xhc3NdOwp9CgoKCgoKCgoKCgpmaW5hbCBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldE9yZGluYWxzKCkKewokY291bnQgPSBcY291bnQoc2VsZjo6JGNvbnN0YW50c1tzdGF0aWM6OmNsYXNzXSA/PyBzdGF0aWM6OmdldENvbnN0YW50cygpKTsKcmV0dXJuICRjb3VudCA/IFxyYW5nZSgwLCAkY291bnQgLSAxKSA6IFtdOwp9CgoKCgoKCgoKCgoKZmluYWwgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRDb25zdGFudHMoKQp7CmlmIChpc3NldChzZWxmOjokY29uc3RhbnRzW3N0YXRpYzo6Y2xhc3NdKSkgewpyZXR1cm4gc2VsZjo6JGNvbnN0YW50c1tzdGF0aWM6OmNsYXNzXTsKfQoKJHJlZmxlY3Rpb24gPSBuZXcgUmVmbGVjdGlvbkNsYXNzKHN0YXRpYzo6Y2xhc3MpOwokY29uc3RhbnRzID0gW107CgpkbyB7CiRzY29wZUNvbnN0YW50cyA9IFtdOwoKZm9yZWFjaCAoJHJlZmxlY3Rpb24tPmdldFJlZmxlY3Rpb25Db25zdGFudHMoKSBhcyAkcmVmbENvbnN0YW50KSB7CmlmICgkcmVmbENvbnN0YW50LT5pc1B1YmxpYygpKSB7CiRzY29wZUNvbnN0YW50c1sgJHJlZmxDb25zdGFudC0+Z2V0TmFtZSgpIF0gPSAkcmVmbENvbnN0YW50LT5nZXRWYWx1ZSgpOwp9Cn0KCiRjb25zdGFudHMgPSAkc2NvcGVDb25zdGFudHMgKyAkY29uc3RhbnRzOwp9IHdoaWxlICgoJHJlZmxlY3Rpb24gPSAkcmVmbGVjdGlvbi0+Z2V0UGFyZW50Q2xhc3MoKSkgJiYgJHJlZmxlY3Rpb24tPm5hbWUgIT09IF9fQ0xBU1NfXyk7CgoKCmFzc2VydCgKc2VsZjo6bm9BbWJpZ3VvdXNWYWx1ZXMoJGNvbnN0YW50cyksCidBbWJpZ3VvdXMgZW51bWVyYXRvciB2YWx1ZXMgZGV0ZWN0ZWQgZm9yICcgLiBzdGF0aWM6OmNsYXNzCik7CgpzZWxmOjokbmFtZXNbc3RhdGljOjpjbGFzc10gPSBcYXJyYXlfa2V5cygkY29uc3RhbnRzKTsKcmV0dXJuIHNlbGY6OiRjb25zdGFudHNbc3RhdGljOjpjbGFzc10gPSAkY29uc3RhbnRzOwp9CgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIG5vQW1iaWd1b3VzVmFsdWVzKCRjb25zdGFudHMpCnsKZm9yZWFjaCAoJGNvbnN0YW50cyBhcyAkdmFsdWUpIHsKJG5hbWVzID0gXGFycmF5X2tleXMoJGNvbnN0YW50cywgJHZhbHVlLCB0cnVlKTsKaWYgKFxjb3VudCgkbmFtZXMpID4gMSkgewpyZXR1cm4gZmFsc2U7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KCgoKCgoKCgoKZmluYWwgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBoYXMoJGVudW1lcmF0b3IpCnsKaWYgKCRlbnVtZXJhdG9yIGluc3RhbmNlb2Ygc3RhdGljKSB7CnJldHVybiBcZ2V0X2NsYXNzKCRlbnVtZXJhdG9yKSA9PT0gc3RhdGljOjpjbGFzczsKfQoKcmV0dXJuIHN0YXRpYzo6aGFzVmFsdWUoJGVudW1lcmF0b3IpOwp9CgoKCgoKCgoKCmZpbmFsIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaGFzVmFsdWUoJHZhbHVlKQp7CnJldHVybiBcaW5fYXJyYXkoJHZhbHVlLCBzZWxmOjokY29uc3RhbnRzW3N0YXRpYzo6Y2xhc3NdID8/IHN0YXRpYzo6Z2V0Q29uc3RhbnRzKCksIHRydWUpOwp9CgoKCgoKCgoKCmZpbmFsIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaGFzTmFtZShzdHJpbmcgJG5hbWUpCnsKcmV0dXJuIFxkZWZpbmVkKCJzdGF0aWM6OnskbmFtZX0iKTsKfQoKCgoKCgoKCgoKCgoKCgpmaW5hbCBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIF9fY2FsbFN0YXRpYyhzdHJpbmcgJG1ldGhvZCwgYXJyYXkgJGFyZ3MpCnsKcmV0dXJuIHN0YXRpYzo6YnlOYW1lKCRtZXRob2QpOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIE1hYmVFbnVtOwoKdXNlIEFycmF5QWNjZXNzOwp1c2UgQ291bnRhYmxlOwp1c2UgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgSXRlcmF0b3I7CnVzZSBJdGVyYXRvckFnZ3JlZ2F0ZTsKdXNlIFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbjsKCgoKCgoKCgoKCgoKY2xhc3MgRW51bU1hcCBpbXBsZW1lbnRzIEFycmF5QWNjZXNzLCBDb3VudGFibGUsIEl0ZXJhdG9yQWdncmVnYXRlCnsKCgoKCnByaXZhdGUgJGVudW1lcmF0aW9uOwoKCgoKCnByaXZhdGUgJG1hcCA9IFtdOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkZW51bWVyYXRpb24sID9pdGVyYWJsZSAkbWFwID0gbnVsbCkKewppZiAoIVxpc19zdWJjbGFzc19vZigkZW51bWVyYXRpb24sIEVudW06OmNsYXNzKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKFxzcHJpbnRmKAonJXMgY2FuIGhhbmRsZSBzdWJjbGFzc2VzIG9mICVzIG9ubHknLApfX0NMQVNTX18sCkVudW06OmNsYXNzCikpOwp9CiR0aGlzLT5lbnVtZXJhdGlvbiA9ICRlbnVtZXJhdGlvbjsKCmlmICgkbWFwKSB7CiR0aGlzLT5hZGRJdGVyYWJsZSgkbWFwKTsKfQp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2RlYnVnSW5mbygpOiBhcnJheSB7CiRkYmcgPSAoYXJyYXkpJHRoaXM7CiRkYmdbIlwwIiAuIHNlbGY6OmNsYXNzIC4gIlwwX19wYWlycyJdID0gYXJyYXlfbWFwKGZ1bmN0aW9uICgkaywgJHYpIHsKcmV0dXJuIFskaywgJHZdOwp9LCAkdGhpcy0+Z2V0S2V5cygpLCAkdGhpcy0+Z2V0VmFsdWVzKCkpOwpyZXR1cm4gJGRiZzsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZCgkZW51bWVyYXRvciwgJHZhbHVlKTogdm9pZAp7CiRvcmQgPSAoJHRoaXMtPmVudW1lcmF0aW9uKTo6Z2V0KCRlbnVtZXJhdG9yKS0+Z2V0T3JkaW5hbCgpOwokdGhpcy0+bWFwWyRvcmRdID0gJHZhbHVlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRJdGVyYWJsZShpdGVyYWJsZSAkbWFwKTogdm9pZAp7CiRpbm5lck1hcCA9ICR0aGlzLT5tYXA7CmZvcmVhY2ggKCRtYXAgYXMgJGVudW1lcmF0b3IgPT4gJHZhbHVlKSB7CiRvcmQgPSAoJHRoaXMtPmVudW1lcmF0aW9uKTo6Z2V0KCRlbnVtZXJhdG9yKS0+Z2V0T3JkaW5hbCgpOwokaW5uZXJNYXBbJG9yZF0gPSAkdmFsdWU7Cn0KJHRoaXMtPm1hcCA9ICRpbm5lck1hcDsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZSgkZW51bWVyYXRvcik6IHZvaWQKewokb3JkID0gKCR0aGlzLT5lbnVtZXJhdGlvbik6OmdldCgkZW51bWVyYXRvciktPmdldE9yZGluYWwoKTsKdW5zZXQoJHRoaXMtPm1hcFskb3JkXSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZUl0ZXJhYmxlKGl0ZXJhYmxlICRlbnVtZXJhdG9ycyk6IHZvaWQKewokbWFwID0gJHRoaXMtPm1hcDsKZm9yZWFjaCAoJGVudW1lcmF0b3JzIGFzICRlbnVtZXJhdG9yKSB7CiRvcmQgPSAoJHRoaXMtPmVudW1lcmF0aW9uKTo6Z2V0KCRlbnVtZXJhdG9yKS0+Z2V0T3JkaW5hbCgpOwp1bnNldCgkbWFwWyRvcmRdKTsKfQoKJHRoaXMtPm1hcCA9ICRtYXA7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3aXRoKCRlbnVtZXJhdG9yLCAkdmFsdWUpOiBzZWxmCnsKJGNsb25lID0gY2xvbmUgJHRoaXM7CiRjbG9uZS0+YWRkKCRlbnVtZXJhdG9yLCAkdmFsdWUpOwpyZXR1cm4gJGNsb25lOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2l0aEl0ZXJhYmxlKGl0ZXJhYmxlICRtYXApOiBzZWxmCnsKJGNsb25lID0gY2xvbmUgJHRoaXM7CiRjbG9uZS0+YWRkSXRlcmFibGUoJG1hcCk7CnJldHVybiAkY2xvbmU7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3aXRob3V0KCRlbnVtZXJhdG9yKTogc2VsZgp7CiRjbG9uZSA9IGNsb25lICR0aGlzOwokY2xvbmUtPnJlbW92ZSgkZW51bWVyYXRvcik7CnJldHVybiAkY2xvbmU7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3aXRob3V0SXRlcmFibGUoaXRlcmFibGUgJGVudW1lcmF0b3JzKTogc2VsZgp7CiRjbG9uZSA9IGNsb25lICR0aGlzOwokY2xvbmUtPnJlbW92ZUl0ZXJhYmxlKCRlbnVtZXJhdG9ycyk7CnJldHVybiAkY2xvbmU7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFbnVtZXJhdGlvbigpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmVudW1lcmF0aW9uOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXQoJGVudW1lcmF0b3IpCnsKJGVudW1lcmF0b3IgPSAoJHRoaXMtPmVudW1lcmF0aW9uKTo6Z2V0KCRlbnVtZXJhdG9yKTsKJG9yZCA9ICRlbnVtZXJhdG9yLT5nZXRPcmRpbmFsKCk7CmlmICghXGFycmF5X2tleV9leGlzdHMoJG9yZCwgJHRoaXMtPm1hcCkpIHsKdGhyb3cgbmV3IFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbihzcHJpbnRmKAonRW51bWVyYXRvciAlcyBjb3VsZCBub3QgYmUgZm91bmQnLApcdmFyX2V4cG9ydCgkZW51bWVyYXRvci0+Z2V0VmFsdWUoKSwgdHJ1ZSkKKSk7Cn0KCnJldHVybiAkdGhpcy0+bWFwWyRvcmRdOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEtleXMoKTogYXJyYXkKewoKJGJ5T3JkaW5hbEZuID0gWyR0aGlzLT5lbnVtZXJhdGlvbiwgJ2J5T3JkaW5hbCddOwoKcmV0dXJuIFxhcnJheV9tYXAoJGJ5T3JkaW5hbEZuLCBcYXJyYXlfa2V5cygkdGhpcy0+bWFwKSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmFsdWVzKCk6IGFycmF5CnsKcmV0dXJuIFxhcnJheV92YWx1ZXMoJHRoaXMtPm1hcCk7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZWFyY2goJHZhbHVlLCBib29sICRzdHJpY3QgPSBmYWxzZSkKewoKJG9yZCA9IFxhcnJheV9zZWFyY2goJHZhbHVlLCAkdGhpcy0+bWFwLCAkc3RyaWN0KTsKaWYgKCRvcmQgIT09IGZhbHNlKSB7CnJldHVybiAoJHRoaXMtPmVudW1lcmF0aW9uKTo6YnlPcmRpbmFsKCRvcmQpOwp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhcygkZW51bWVyYXRvcik6IGJvb2wKewp0cnkgewokb3JkID0gKCR0aGlzLT5lbnVtZXJhdGlvbik6OmdldCgkZW51bWVyYXRvciktPmdldE9yZGluYWwoKTsKcmV0dXJuIFxhcnJheV9rZXlfZXhpc3RzKCRvcmQsICR0aGlzLT5tYXApOwp9IGNhdGNoIChJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gJGUpIHsKCnJldHVybiBmYWxzZTsKfQp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb250YWlucygkZW51bWVyYXRvcik6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmhhcygkZW51bWVyYXRvcik7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG9mZnNldEV4aXN0cygkZW51bWVyYXRvcik6IGJvb2wKewp0cnkgewpyZXR1cm4gaXNzZXQoJHRoaXMtPm1hcFsoJHRoaXMtPmVudW1lcmF0aW9uKTo6Z2V0KCRlbnVtZXJhdG9yKS0+Z2V0T3JkaW5hbCgpXSk7Cn0gY2F0Y2ggKEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiAkZSkgewoKcmV0dXJuIGZhbHNlOwp9Cn0KCgoKCgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIG9mZnNldEdldCgkZW51bWVyYXRvcikKewp0cnkgewpyZXR1cm4gJHRoaXMtPmdldCgkZW51bWVyYXRvcik7Cn0gY2F0Y2ggKFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbiAkZSkgewpyZXR1cm4gbnVsbDsKfQp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBvZmZzZXRTZXQoJGVudW1lcmF0b3IsICR2YWx1ZSA9IG51bGwpOiB2b2lkCnsKJHRoaXMtPmFkZCgkZW51bWVyYXRvciwgJHZhbHVlKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBvZmZzZXRVbnNldCgkZW51bWVyYXRvcik6IHZvaWQKewokdGhpcy0+cmVtb3ZlKCRlbnVtZXJhdG9yKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJdGVyYXRvcigpOiBJdGVyYXRvcgp7CiRtYXAgPSAkdGhpcy0+bWFwOwpmb3JlYWNoICgkbWFwIGFzICRvcmRpbmFsID0+ICR2YWx1ZSkgewp5aWVsZCAoJHRoaXMtPmVudW1lcmF0aW9uKTo6YnlPcmRpbmFsKCRvcmRpbmFsKSA9PiAkdmFsdWU7Cn0KfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb3VudCgpOiBpbnQKewpyZXR1cm4gXGNvdW50KCR0aGlzLT5tYXApOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0VtcHR5KCk6IGJvb2wKewpyZXR1cm4gZW1wdHkoJHRoaXMtPm1hcCk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgTWFiZUVudW07Cgp1c2UgUnVudGltZUV4Y2VwdGlvbjsKdXNlIExvZ2ljRXhjZXB0aW9uOwoKCgoKCgoKCgoKCgoKCnRyYWl0IEVudW1TZXJpYWxpemFibGVUcmFpdAp7CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFsdWUoKTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3NlcmlhbGl6ZSgpOiBhcnJheQp7CnJldHVybiBbJ3ZhbHVlJyA9PiAkdGhpcy0+Z2V0VmFsdWUoKV07Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX191bnNlcmlhbGl6ZShhcnJheSAkZGF0YSk6IHZvaWQKewppZiAoIVxhcnJheV9rZXlfZXhpc3RzKCd2YWx1ZScsICRkYXRhKSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignTWlzc2luZyBhcnJheSBrZXkgInZhbHVlIicpOwp9CgoKJHZhbHVlID0gJGRhdGFbJ3ZhbHVlJ107CiRjb25zdGFudHMgPSBzZWxmOjpnZXRDb25zdGFudHMoKTsKJG5hbWUgPSBcYXJyYXlfc2VhcmNoKCR2YWx1ZSwgJGNvbnN0YW50cywgdHJ1ZSk7CmlmICgkbmFtZSA9PT0gZmFsc2UpIHsKJG1lc3NhZ2UgPSBcaXNfc2NhbGFyKCR2YWx1ZSkKPyAnVW5rbm93biB2YWx1ZSAnIC4gXHZhcl9leHBvcnQoJHZhbHVlLCB0cnVlKQo6ICdJbnZhbGlkIHZhbHVlIG9mIHR5cGUgJyAuIChcaXNfb2JqZWN0KCR2YWx1ZSkgPyBcZ2V0X2NsYXNzKCR2YWx1ZSkgOiBcZ2V0dHlwZSgkdmFsdWUpKTsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJG1lc3NhZ2UpOwp9CgokY2xhc3MgPSBzdGF0aWM6OmNsYXNzOwokZW51bWVyYXRvciA9ICR0aGlzOwokY2xvc3VyZSA9IGZ1bmN0aW9uICgpIHVzZSAoJGNsYXNzLCAkbmFtZSwgJHZhbHVlLCAkZW51bWVyYXRvcikgewppZiAoJHZhbHVlICE9PSBudWxsICYmICR0aGlzLT52YWx1ZSAhPT0gbnVsbCkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ0RvIG5vdCBjYWxsIHRoaXMgZGlyZWN0bHkgLSBwbGVhc2UgdXNlIHVuc2VyaWFsaXplKCRlbnVtKSBpbnN0ZWFkJyk7Cn0KCiR0aGlzLT52YWx1ZSA9ICR2YWx1ZTsKCmlmICghaXNzZXQoc2VsZjo6JGluc3RhbmNlc1skY2xhc3NdWyRuYW1lXSkpIHsKc2VsZjo6JGluc3RhbmNlc1skY2xhc3NdWyRuYW1lXSA9ICRlbnVtZXJhdG9yOwp9Cn07CiRjbG9zdXJlLT5iaW5kVG8oJHRoaXMsIEVudW06OmNsYXNzKSgpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNlcmlhbGl6ZSgpOiBzdHJpbmcKewpyZXR1cm4gXHNlcmlhbGl6ZSgkdGhpcy0+Z2V0VmFsdWUoKSk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB1bnNlcmlhbGl6ZSgkc2VyaWFsaXplZCk6IHZvaWQKewokdGhpcy0+X191bnNlcmlhbGl6ZShbJ3ZhbHVlJyA9PiBcdW5zZXJpYWxpemUoJHNlcmlhbGl6ZWQpXSk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgTWFiZUVudW07Cgp1c2UgQ291bnRhYmxlOwp1c2UgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgSXRlcmF0b3I7CnVzZSBJdGVyYXRvckFnZ3JlZ2F0ZTsKCgoKCgoKCgoKCgoKY2xhc3MgRW51bVNldCBpbXBsZW1lbnRzIEl0ZXJhdG9yQWdncmVnYXRlLCBDb3VudGFibGUKewoKCgoKcHJpdmF0ZSAkZW51bWVyYXRpb247CgoKCgoKcHJpdmF0ZSAkZW51bWVyYXRpb25Db3VudDsKCgoKCgpwcml2YXRlICRiaXRzZXQgPSAwOwoKCgoKCgpwcml2YXRlICRlbXB0eUJpdHNldCA9IDA7CgoKCgoKCgoKCnByaXZhdGUgJGZuRG9HZXRJdGVyYXRvciA9ICdkb0dldEl0ZXJhdG9ySW50JzsKCgpwcml2YXRlICRmbkRvQ291bnQgPSAnZG9Db3VudEludCc7CgoKcHJpdmF0ZSAkZm5Eb0dldE9yZGluYWxzID0gJ2RvR2V0T3JkaW5hbHNJbnQnOwoKCnByaXZhdGUgJGZuRG9HZXRCaXQgPSAnZG9HZXRCaXRJbnQnOwoKCnByaXZhdGUgJGZuRG9TZXRCaXQgPSAnZG9TZXRCaXRJbnQnOwoKCnByaXZhdGUgJGZuRG9VbnNldEJpdCA9ICdkb1Vuc2V0Qml0SW50JzsKCgpwcml2YXRlICRmbkRvR2V0QmluYXJ5Qml0c2V0TGUgPSAnZG9HZXRCaW5hcnlCaXRzZXRMZUludCc7CgoKcHJpdmF0ZSAkZm5Eb1NldEJpbmFyeUJpdHNldExlID0gJ2RvU2V0QmluYXJ5Qml0c2V0TGVJbnQnOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRlbnVtZXJhdGlvbiwgP2l0ZXJhYmxlICRlbnVtZXJhdG9ycyA9IG51bGwpCnsKaWYgKCFcaXNfc3ViY2xhc3Nfb2YoJGVudW1lcmF0aW9uLCBFbnVtOjpjbGFzcykpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihcc3ByaW50ZigKJyVzIGNhbiBoYW5kbGUgc3ViY2xhc3NlcyBvZiAlcyBvbmx5JywKX19NRVRIT0RfXywKRW51bTo6Y2xhc3MKKSk7Cn0KCiR0aGlzLT5lbnVtZXJhdGlvbiA9ICRlbnVtZXJhdGlvbjsKJHRoaXMtPmVudW1lcmF0aW9uQ291bnQgPSBcY291bnQoJGVudW1lcmF0aW9uOjpnZXRDb25zdGFudHMoKSk7CgoKCgppZiAoJHRoaXMtPmVudW1lcmF0aW9uQ291bnQgPiBcUEhQX0lOVF9TSVpFICogOCkgewoKJHRoaXMtPmJpdHNldCA9ICR0aGlzLT5lbXB0eUJpdHNldCA9IFxzdHJfcmVwZWF0KCJcMCIsIChpbnQpXGNlaWwoJHRoaXMtPmVudW1lcmF0aW9uQ291bnQgLyA4KSk7CgoKJHRoaXMtPmZuRG9HZXRJdGVyYXRvciA9ICdkb0dldEl0ZXJhdG9yQmluJzsKJHRoaXMtPmZuRG9Db3VudCA9ICdkb0NvdW50QmluJzsKJHRoaXMtPmZuRG9HZXRPcmRpbmFscyA9ICdkb0dldE9yZGluYWxzQmluJzsKJHRoaXMtPmZuRG9HZXRCaXQgPSAnZG9HZXRCaXRCaW4nOwokdGhpcy0+Zm5Eb1NldEJpdCA9ICdkb1NldEJpdEJpbic7CiR0aGlzLT5mbkRvVW5zZXRCaXQgPSAnZG9VbnNldEJpdEJpbic7CiR0aGlzLT5mbkRvR2V0QmluYXJ5Qml0c2V0TGUgPSAnZG9HZXRCaW5hcnlCaXRzZXRMZUJpbic7CiR0aGlzLT5mbkRvU2V0QmluYXJ5Qml0c2V0TGUgPSAnZG9TZXRCaW5hcnlCaXRzZXRMZUJpbic7Cn0KCmlmICgkZW51bWVyYXRvcnMgIT09IG51bGwpIHsKZm9yZWFjaCAoJGVudW1lcmF0b3JzIGFzICRlbnVtZXJhdG9yKSB7CiR0aGlzLT57JHRoaXMtPmZuRG9TZXRCaXR9KCRlbnVtZXJhdGlvbjo6Z2V0KCRlbnVtZXJhdG9yKS0+Z2V0T3JkaW5hbCgpKTsKfQp9Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2RlYnVnSW5mbygpIHsKJGRiZyA9IChhcnJheSkkdGhpczsKJGRiZ1siXDAiIC4gc2VsZjo6Y2xhc3MgLiAiXDBfX2VudW1lcmF0b3JzIl0gPSAkdGhpcy0+Z2V0VmFsdWVzKCk7CnJldHVybiAkZGJnOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEVudW1lcmF0aW9uKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+ZW51bWVyYXRpb247Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZCgkZW51bWVyYXRvcik6IHZvaWQKewokdGhpcy0+eyR0aGlzLT5mbkRvU2V0Qml0fSgoJHRoaXMtPmVudW1lcmF0aW9uKTo6Z2V0KCRlbnVtZXJhdG9yKS0+Z2V0T3JkaW5hbCgpKTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZEl0ZXJhYmxlKGl0ZXJhYmxlICRlbnVtZXJhdG9ycyk6IHZvaWQKewokYml0c2V0ID0gJHRoaXMtPmJpdHNldDsKCnRyeSB7CmZvcmVhY2ggKCRlbnVtZXJhdG9ycyBhcyAkZW51bWVyYXRvcikgewokdGhpcy0+eyR0aGlzLT5mbkRvU2V0Qml0fSgoJHRoaXMtPmVudW1lcmF0aW9uKTo6Z2V0KCRlbnVtZXJhdG9yKS0+Z2V0T3JkaW5hbCgpKTsKfQp9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7CgokdGhpcy0+Yml0c2V0ID0gJGJpdHNldDsKdGhyb3cgJGU7Cn0KfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZSgkZW51bWVyYXRvcik6IHZvaWQKewokdGhpcy0+eyR0aGlzLT5mbkRvVW5zZXRCaXR9KCgkdGhpcy0+ZW51bWVyYXRpb24pOjpnZXQoJGVudW1lcmF0b3IpLT5nZXRPcmRpbmFsKCkpOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXR0YWNoKCRlbnVtZXJhdG9yKTogdm9pZAp7CiR0aGlzLT5hZGQoJGVudW1lcmF0b3IpOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGV0YWNoKCRlbnVtZXJhdG9yKTogdm9pZAp7CiR0aGlzLT5yZW1vdmUoJGVudW1lcmF0b3IpOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlSXRlcmFibGUoaXRlcmFibGUgJGVudW1lcmF0b3JzKTogdm9pZAp7CiRiaXRzZXQgPSAkdGhpcy0+Yml0c2V0OwoKdHJ5IHsKZm9yZWFjaCAoJGVudW1lcmF0b3JzIGFzICRlbnVtZXJhdG9yKSB7CiR0aGlzLT57JHRoaXMtPmZuRG9VbnNldEJpdH0oKCR0aGlzLT5lbnVtZXJhdGlvbik6OmdldCgkZW51bWVyYXRvciktPmdldE9yZGluYWwoKSk7Cn0KfSBjYXRjaCAoXFRocm93YWJsZSAkZSkgewoKJHRoaXMtPmJpdHNldCA9ICRiaXRzZXQ7CnRocm93ICRlOwp9Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VW5pb24oRW51bVNldCAkb3RoZXIpOiB2b2lkCnsKaWYgKCR0aGlzLT5lbnVtZXJhdGlvbiAhPT0gJG90aGVyLT5lbnVtZXJhdGlvbikgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKFxzcHJpbnRmKAonT3RoZXIgc2hvdWxkIGJlIG9mIHRoZSBzYW1lIGVudW1lcmF0aW9uIGFzIHRoaXMgJXMnLAokdGhpcy0+ZW51bWVyYXRpb24KKSk7Cn0KCiR0aGlzLT5iaXRzZXQgPSAkdGhpcy0+Yml0c2V0IHwgJG90aGVyLT5iaXRzZXQ7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SW50ZXJzZWN0KEVudW1TZXQgJG90aGVyKTogdm9pZAp7CmlmICgkdGhpcy0+ZW51bWVyYXRpb24gIT09ICRvdGhlci0+ZW51bWVyYXRpb24pIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihcc3ByaW50ZigKJ090aGVyIHNob3VsZCBiZSBvZiB0aGUgc2FtZSBlbnVtZXJhdGlvbiBhcyB0aGlzICVzJywKJHRoaXMtPmVudW1lcmF0aW9uCikpOwp9CgokdGhpcy0+Yml0c2V0ID0gJHRoaXMtPmJpdHNldCAmICRvdGhlci0+Yml0c2V0Owp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERpZmYoRW51bVNldCAkb3RoZXIpOiB2b2lkCnsKaWYgKCR0aGlzLT5lbnVtZXJhdGlvbiAhPT0gJG90aGVyLT5lbnVtZXJhdGlvbikgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKFxzcHJpbnRmKAonT3RoZXIgc2hvdWxkIGJlIG9mIHRoZSBzYW1lIGVudW1lcmF0aW9uIGFzIHRoaXMgJXMnLAokdGhpcy0+ZW51bWVyYXRpb24KKSk7Cn0KCiR0aGlzLT5iaXRzZXQgPSAkdGhpcy0+Yml0c2V0ICYgfiRvdGhlci0+Yml0c2V0Owp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFN5bURpZmYoRW51bVNldCAkb3RoZXIpOiB2b2lkCnsKaWYgKCR0aGlzLT5lbnVtZXJhdGlvbiAhPT0gJG90aGVyLT5lbnVtZXJhdGlvbikgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKFxzcHJpbnRmKAonT3RoZXIgc2hvdWxkIGJlIG9mIHRoZSBzYW1lIGVudW1lcmF0aW9uIGFzIHRoaXMgJXMnLAokdGhpcy0+ZW51bWVyYXRpb24KKSk7Cn0KCiR0aGlzLT5iaXRzZXQgPSAkdGhpcy0+Yml0c2V0IF4gJG90aGVyLT5iaXRzZXQ7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRCaW5hcnlCaXRzZXRMZShzdHJpbmcgJGJpdHNldCk6IHZvaWQKewokdGhpcy0+eyR0aGlzLT5mbkRvU2V0QmluYXJ5Qml0c2V0TGV9KCRiaXRzZXQpOwp9CgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRvU2V0QmluYXJ5Qml0c2V0TGVCaW4oJGJpdHNldCk6IHZvaWQKewoKJHRoaXNCaXRzZXQgPSAkdGhpcy0+Yml0c2V0OwoKJHNpemUgPSBcc3RybGVuKCR0aGlzQml0c2V0KTsKJHNpemVJbiA9IFxzdHJsZW4oJGJpdHNldCk7CgppZiAoJHNpemVJbiA8ICRzaXplKSB7CgokYml0c2V0IC49IFxzdHJfcmVwZWF0KCJcMCIsICRzaXplIC0gJHNpemVJbik7Cn0gZWxzZWlmICgkc2l6ZUluID4gJHNpemUpIHsKaWYgKFxsdHJpbShcc3Vic3RyKCRiaXRzZXQsICRzaXplKSwgIlwwIikgIT09ICcnKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ291dC1vZi1yYW5nZSBiaXRzIGRldGVjdGVkJyk7Cn0KJGJpdHNldCA9IFxzdWJzdHIoJGJpdHNldCwgMCwgJHNpemUpOwp9CgoKJGxhc3RCeXRlTWF4T3JkID0gJHRoaXMtPmVudW1lcmF0aW9uQ291bnQgJSA4OwppZiAoJGxhc3RCeXRlTWF4T3JkICE9PSAwKSB7CiRsYXN0Qnl0ZSA9ICRiaXRzZXRbLTFdOwokbGFzdEJ5dGVFeHBlY3RlZCA9IFxjaHIoKDEgPDwgJGxhc3RCeXRlTWF4T3JkKSAtIDEpICYgJGxhc3RCeXRlOwppZiAoJGxhc3RCeXRlICE9PSAkbGFzdEJ5dGVFeHBlY3RlZCkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdvdXQtb2YtcmFuZ2UgYml0cyBkZXRlY3RlZCcpOwp9CgokdGhpcy0+Yml0c2V0ID0gXHN1YnN0cigkYml0c2V0LCAwLCAtMSkgLiAkbGFzdEJ5dGVFeHBlY3RlZDsKfQoKJHRoaXMtPmJpdHNldCA9ICRiaXRzZXQ7Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9TZXRCaW5hcnlCaXRzZXRMZUludCgkYml0c2V0KTogdm9pZAp7CiRsZW4gPSBcc3RybGVuKCRiaXRzZXQpOwokaW50ID0gMDsKZm9yICgkaSA9IDA7ICRpIDwgJGxlbjsgKyskaSkgewokb3JkID0gXG9yZCgkYml0c2V0WyRpXSk7CgppZiAoJG9yZCAmJiAkaSA+IFxQSFBfSU5UX1NJWkUgLSAxKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ291dC1vZi1yYW5nZSBiaXRzIGRldGVjdGVkJyk7Cn0KCiRpbnQgfD0gJG9yZCA8PCAoOCAqICRpKTsKfQoKaWYgKCRpbnQgJiAofjAgPDwgJHRoaXMtPmVudW1lcmF0aW9uQ291bnQpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ291dC1vZi1yYW5nZSBiaXRzIGRldGVjdGVkJyk7Cn0KCiR0aGlzLT5iaXRzZXQgPSAkaW50Owp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEJpbmFyeUJpdHNldEJlKHN0cmluZyAkYml0c2V0KTogdm9pZAp7CiR0aGlzLT57JHRoaXMtPmZuRG9TZXRCaW5hcnlCaXRzZXRMZX0oXHN0cnJldigkYml0c2V0KSk7Cn0KCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRCaXQoaW50ICRvcmRpbmFsLCBib29sICRiaXQpOiB2b2lkCnsKaWYgKCRvcmRpbmFsIDwgMCB8fCAkb3JkaW5hbCA+ICR0aGlzLT5lbnVtZXJhdGlvbkNvdW50KSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIk9yZGluYWwgbnVtYmVyIG11c3QgYmUgYmV0d2VlbiAwIGFuZCB7JHRoaXMtPmVudW1lcmF0aW9uQ291bnR9Iik7Cn0KCmlmICgkYml0KSB7CiR0aGlzLT57JHRoaXMtPmZuRG9TZXRCaXR9KCRvcmRpbmFsKTsKfSBlbHNlIHsKJHRoaXMtPnskdGhpcy0+Zm5Eb1Vuc2V0Qml0fSgkb3JkaW5hbCk7Cn0KfQoKCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9TZXRCaXRCaW4oJG9yZGluYWwpOiB2b2lkCnsKCiR0aGlzQml0c2V0ID0gJHRoaXMtPmJpdHNldDsKCiRieXRlID0gKGludCkgKCRvcmRpbmFsIC8gOCk7CiR0aGlzQml0c2V0WyRieXRlXSA9ICR0aGlzQml0c2V0WyRieXRlXSB8IFxjaHIoMSA8PCAoJG9yZGluYWwgJSA4KSk7CgokdGhpcy0+Yml0c2V0ID0gJHRoaXNCaXRzZXQ7Cn0KCgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRvU2V0Qml0SW50KCRvcmRpbmFsKTogdm9pZAp7CgokdGhpc0JpdHNldCA9ICR0aGlzLT5iaXRzZXQ7CgokdGhpcy0+Yml0c2V0ID0gJHRoaXNCaXRzZXQgfCAoMSA8PCAkb3JkaW5hbCk7Cn0KCgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRvVW5zZXRCaXRCaW4oJG9yZGluYWwpOiB2b2lkCnsKCiR0aGlzQml0c2V0ID0gJHRoaXMtPmJpdHNldDsKCiRieXRlID0gKGludCkgKCRvcmRpbmFsIC8gOCk7CiR0aGlzQml0c2V0WyRieXRlXSA9ICR0aGlzQml0c2V0WyRieXRlXSAmIFxjaHIofigxIDw8ICgkb3JkaW5hbCAlIDgpKSk7CgokdGhpcy0+Yml0c2V0ID0gJHRoaXNCaXRzZXQ7Cn0KCgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRvVW5zZXRCaXRJbnQoJG9yZGluYWwpOiB2b2lkCnsKCiR0aGlzQml0c2V0ID0gJHRoaXMtPmJpdHNldDsKCiR0aGlzLT5iaXRzZXQgPSAkdGhpc0JpdHNldCAmIH4oMSA8PCAkb3JkaW5hbCk7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdpdGgoJGVudW1lcmF0b3IpOiBzZWxmCnsKJGNsb25lID0gY2xvbmUgJHRoaXM7CiRjbG9uZS0+eyR0aGlzLT5mbkRvU2V0Qml0fSgoJHRoaXMtPmVudW1lcmF0aW9uKTo6Z2V0KCRlbnVtZXJhdG9yKS0+Z2V0T3JkaW5hbCgpKTsKcmV0dXJuICRjbG9uZTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdpdGhJdGVyYWJsZShpdGVyYWJsZSAkZW51bWVyYXRvcnMpOiBzZWxmCnsKJGNsb25lID0gY2xvbmUgJHRoaXM7CmZvcmVhY2ggKCRlbnVtZXJhdG9ycyBhcyAkZW51bWVyYXRvcikgewokY2xvbmUtPnskdGhpcy0+Zm5Eb1NldEJpdH0oKCR0aGlzLT5lbnVtZXJhdGlvbik6OmdldCgkZW51bWVyYXRvciktPmdldE9yZGluYWwoKSk7Cn0KcmV0dXJuICRjbG9uZTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdpdGhvdXQoJGVudW1lcmF0b3IpOiBzZWxmCnsKJGNsb25lID0gY2xvbmUgJHRoaXM7CiRjbG9uZS0+eyR0aGlzLT5mbkRvVW5zZXRCaXR9KCgkdGhpcy0+ZW51bWVyYXRpb24pOjpnZXQoJGVudW1lcmF0b3IpLT5nZXRPcmRpbmFsKCkpOwpyZXR1cm4gJGNsb25lOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2l0aG91dEl0ZXJhYmxlKGl0ZXJhYmxlICRlbnVtZXJhdG9ycyk6IHNlbGYKewokY2xvbmUgPSBjbG9uZSAkdGhpczsKZm9yZWFjaCAoJGVudW1lcmF0b3JzIGFzICRlbnVtZXJhdG9yKSB7CiRjbG9uZS0+eyR0aGlzLT5mbkRvVW5zZXRCaXR9KCgkdGhpcy0+ZW51bWVyYXRpb24pOjpnZXQoJGVudW1lcmF0b3IpLT5nZXRPcmRpbmFsKCkpOwp9CnJldHVybiAkY2xvbmU7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2l0aFVuaW9uKEVudW1TZXQgJG90aGVyKTogc2VsZgp7CiRjbG9uZSA9IGNsb25lICR0aGlzOwokY2xvbmUtPnNldFVuaW9uKCRvdGhlcik7CnJldHVybiAkY2xvbmU7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdW5pb24oRW51bVNldCAkb3RoZXIpOiBzZWxmCnsKcmV0dXJuICR0aGlzLT53aXRoVW5pb24oJG90aGVyKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3aXRoSW50ZXJzZWN0KEVudW1TZXQgJG90aGVyKTogc2VsZgp7CiRjbG9uZSA9IGNsb25lICR0aGlzOwokY2xvbmUtPnNldEludGVyc2VjdCgkb3RoZXIpOwpyZXR1cm4gJGNsb25lOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGludGVyc2VjdChFbnVtU2V0ICRvdGhlcik6IHNlbGYKewpyZXR1cm4gJHRoaXMtPndpdGhJbnRlcnNlY3QoJG90aGVyKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3aXRoRGlmZihFbnVtU2V0ICRvdGhlcik6IHNlbGYKewokY2xvbmUgPSBjbG9uZSAkdGhpczsKJGNsb25lLT5zZXREaWZmKCRvdGhlcik7CnJldHVybiAkY2xvbmU7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGlmZihFbnVtU2V0ICRvdGhlcik6IHNlbGYKewpyZXR1cm4gJHRoaXMtPndpdGhEaWZmKCRvdGhlcik7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2l0aFN5bURpZmYoRW51bVNldCAkb3RoZXIpOiBzZWxmCnsKJGNsb25lID0gY2xvbmUgJHRoaXM7CiRjbG9uZS0+c2V0U3ltRGlmZigkb3RoZXIpOwpyZXR1cm4gJGNsb25lOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHN5bURpZmYoRW51bVNldCAkb3RoZXIpOiBzZWxmCnsKcmV0dXJuICR0aGlzLT53aXRoU3ltRGlmZigkb3RoZXIpOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2l0aEJpbmFyeUJpdHNldExlKHN0cmluZyAkYml0c2V0KTogc2VsZgp7CiRjbG9uZSA9IGNsb25lICR0aGlzOwokY2xvbmUtPnskdGhpcy0+Zm5Eb1NldEJpbmFyeUJpdHNldExlfSgkYml0c2V0KTsKcmV0dXJuICRjbG9uZTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3aXRoQmluYXJ5Qml0c2V0QmUoc3RyaW5nICRiaXRzZXQpOiBzZWxmCnsKJGNsb25lID0gJHRoaXM7CiRjbG9uZS0+eyR0aGlzLT5mbkRvU2V0QmluYXJ5Qml0c2V0TGV9KFxzdHJyZXYoJGJpdHNldCkpOwpyZXR1cm4gJGNsb25lOwp9CgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2l0aEJpdChpbnQgJG9yZGluYWwsIGJvb2wgJGJpdCk6IHNlbGYKewokY2xvbmUgPSBjbG9uZSAkdGhpczsKJGNsb25lLT5zZXRCaXQoJG9yZGluYWwsICRiaXQpOwpyZXR1cm4gJGNsb25lOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhcygkZW51bWVyYXRvcik6IGJvb2wKewpyZXR1cm4gJHRoaXMtPnskdGhpcy0+Zm5Eb0dldEJpdH0oKCR0aGlzLT5lbnVtZXJhdGlvbik6OmdldCgkZW51bWVyYXRvciktPmdldE9yZGluYWwoKSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29udGFpbnMoJGVudW1lcmF0b3IpOiBib29sCnsKcmV0dXJuICR0aGlzLT5oYXMoJGVudW1lcmF0b3IpOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJdGVyYXRvcigpOiBJdGVyYXRvcgp7CnJldHVybiAkdGhpcy0+eyR0aGlzLT5mbkRvR2V0SXRlcmF0b3J9KCk7Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9HZXRJdGVyYXRvckJpbigpCnsKCiRiaXRzZXQgPSAkdGhpcy0+Yml0c2V0OwokYnl0ZUxlbiA9IFxzdHJsZW4oJGJpdHNldCk7CmZvciAoJGJ5dGVQb3MgPSAwOyAkYnl0ZVBvcyA8ICRieXRlTGVuOyArKyRieXRlUG9zKSB7CmlmICgkYml0c2V0WyRieXRlUG9zXSA9PT0gIlwwIikgewoKY29udGludWU7Cn0KCiRvcmQgPSBcb3JkKCRiaXRzZXRbJGJ5dGVQb3NdKTsKZm9yICgkYml0UG9zID0gMDsgJGJpdFBvcyA8IDg7ICsrJGJpdFBvcykgewppZiAoJG9yZCAmICgxIDw8ICRiaXRQb3MpKSB7CiRvcmRpbmFsID0gJGJ5dGVQb3MgKiA4ICsgJGJpdFBvczsKeWllbGQgJG9yZGluYWwgPT4gKCR0aGlzLT5lbnVtZXJhdGlvbik6OmJ5T3JkaW5hbCgkb3JkaW5hbCk7Cn0KfQp9Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9HZXRJdGVyYXRvckludCgpCnsKCiRiaXRzZXQgPSAkdGhpcy0+Yml0c2V0OwokY291bnQgPSAkdGhpcy0+ZW51bWVyYXRpb25Db3VudDsKZm9yICgkb3JkaW5hbCA9IDA7ICRvcmRpbmFsIDwgJGNvdW50OyArKyRvcmRpbmFsKSB7CmlmICgkYml0c2V0ICYgKDEgPDwgJG9yZGluYWwpKSB7CnlpZWxkICRvcmRpbmFsID0+ICgkdGhpcy0+ZW51bWVyYXRpb24pOjpieU9yZGluYWwoJG9yZGluYWwpOwp9Cn0KfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvdW50KCk6IGludAp7CnJldHVybiAkdGhpcy0+eyR0aGlzLT5mbkRvQ291bnR9KCk7Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9Db3VudEJpbigpCnsKCiRiaXRzZXQgPSAkdGhpcy0+Yml0c2V0OwokY291bnQgPSAwOwokYnl0ZUxlbiA9IFxzdHJsZW4oJGJpdHNldCk7CmZvciAoJGJ5dGVQb3MgPSAwOyAkYnl0ZVBvcyA8ICRieXRlTGVuOyArKyRieXRlUG9zKSB7CmlmICgkYml0c2V0WyRieXRlUG9zXSA9PT0gIlwwIikgewoKY29udGludWU7Cn0KCiRvcmQgPSBcb3JkKCRiaXRzZXRbJGJ5dGVQb3NdKTsKaWYgKCRvcmQgJiAwYjAwMDAwMDAxKSArKyRjb3VudDsKaWYgKCRvcmQgJiAwYjAwMDAwMDEwKSArKyRjb3VudDsKaWYgKCRvcmQgJiAwYjAwMDAwMTAwKSArKyRjb3VudDsKaWYgKCRvcmQgJiAwYjAwMDAxMDAwKSArKyRjb3VudDsKaWYgKCRvcmQgJiAwYjAwMDEwMDAwKSArKyRjb3VudDsKaWYgKCRvcmQgJiAwYjAwMTAwMDAwKSArKyRjb3VudDsKaWYgKCRvcmQgJiAwYjAxMDAwMDAwKSArKyRjb3VudDsKaWYgKCRvcmQgJiAwYjEwMDAwMDAwKSArKyRjb3VudDsKfQpyZXR1cm4gJGNvdW50Owp9CgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRvQ291bnRJbnQoKQp7CgokYml0c2V0ID0gJHRoaXMtPmJpdHNldDsKJGNvdW50ID0gMDsKCgppZiAoJGJpdHNldCA8IDApIHsKJGNvdW50ID0gMTsKJGJpdHNldCA9ICRiaXRzZXQgJiBcUEhQX0lOVF9NQVg7Cn0KCgokcGhwSW50Qml0U2l6ZSA9IFxQSFBfSU5UX1NJWkUgKiA4Owpmb3IgKCRiaXRQb3MgPSAwOyAkYml0UG9zIDwgJHBocEludEJpdFNpemU7ICRiaXRQb3MgKz0gOCkgewokYml0Q2hrID0gMHhmZiA8PCAkYml0UG9zOwokYnl0ZSA9ICRiaXRzZXQgJiAkYml0Q2hrOwppZiAoJGJ5dGUpIHsKJGJ5dGUgPSAkYnl0ZSA+PiAkYml0UG9zOwppZiAoJGJ5dGUgJiAwYjAwMDAwMDAxKSArKyRjb3VudDsKaWYgKCRieXRlICYgMGIwMDAwMDAxMCkgKyskY291bnQ7CmlmICgkYnl0ZSAmIDBiMDAwMDAxMDApICsrJGNvdW50OwppZiAoJGJ5dGUgJiAwYjAwMDAxMDAwKSArKyRjb3VudDsKaWYgKCRieXRlICYgMGIwMDAxMDAwMCkgKyskY291bnQ7CmlmICgkYnl0ZSAmIDBiMDAxMDAwMDApICsrJGNvdW50OwppZiAoJGJ5dGUgJiAwYjAxMDAwMDAwKSArKyRjb3VudDsKaWYgKCRieXRlICYgMGIxMDAwMDAwMCkgKyskY291bnQ7Cn0KCmlmICgkYml0c2V0IDw9ICRiaXRDaGspIHsKYnJlYWs7Cn0KfQoKcmV0dXJuICRjb3VudDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNFcXVhbChFbnVtU2V0ICRvdGhlcik6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmVudW1lcmF0aW9uID09PSAkb3RoZXItPmVudW1lcmF0aW9uCiYmICR0aGlzLT5iaXRzZXQgPT09ICRvdGhlci0+Yml0c2V0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1N1YnNldChFbnVtU2V0ICRvdGhlcik6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmVudW1lcmF0aW9uID09PSAkb3RoZXItPmVudW1lcmF0aW9uCiYmICgkdGhpcy0+Yml0c2V0ICYgJG90aGVyLT5iaXRzZXQpID09PSAkdGhpcy0+Yml0c2V0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1N1cGVyc2V0KEVudW1TZXQgJG90aGVyKTogYm9vbAp7CnJldHVybiAkdGhpcy0+ZW51bWVyYXRpb24gPT09ICRvdGhlci0+ZW51bWVyYXRpb24KJiYgKCR0aGlzLT5iaXRzZXQgfCAkb3RoZXItPmJpdHNldCkgPT09ICR0aGlzLT5iaXRzZXQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRW1wdHkoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+Yml0c2V0ID09PSAkdGhpcy0+ZW1wdHlCaXRzZXQ7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPcmRpbmFscygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+eyR0aGlzLT5mbkRvR2V0T3JkaW5hbHN9KCk7Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9HZXRPcmRpbmFsc0JpbigpCnsKCiRiaXRzZXQgPSAkdGhpcy0+Yml0c2V0Owokb3JkaW5hbHMgPSBbXTsKJGJ5dGVMZW4gPSBcc3RybGVuKCRiaXRzZXQpOwpmb3IgKCRieXRlUG9zID0gMDsgJGJ5dGVQb3MgPCAkYnl0ZUxlbjsgKyskYnl0ZVBvcykgewppZiAoJGJpdHNldFskYnl0ZVBvc10gPT09ICJcMCIpIHsKCmNvbnRpbnVlOwp9Cgokb3JkID0gXG9yZCgkYml0c2V0WyRieXRlUG9zXSk7CmZvciAoJGJpdFBvcyA9IDA7ICRiaXRQb3MgPCA4OyArKyRiaXRQb3MpIHsKaWYgKCRvcmQgJiAoMSA8PCAkYml0UG9zKSkgewokb3JkaW5hbHNbXSA9ICRieXRlUG9zICogOCArICRiaXRQb3M7Cn0KfQp9CnJldHVybiAkb3JkaW5hbHM7Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9HZXRPcmRpbmFsc0ludCgpCnsKCiRiaXRzZXQgPSAkdGhpcy0+Yml0c2V0Owokb3JkaW5hbHMgPSBbXTsKJGNvdW50ID0gJHRoaXMtPmVudW1lcmF0aW9uQ291bnQ7CmZvciAoJG9yZGluYWwgPSAwOyAkb3JkaW5hbCA8ICRjb3VudDsgKyskb3JkaW5hbCkgewppZiAoJGJpdHNldCAmICgxIDw8ICRvcmRpbmFsKSkgewokb3JkaW5hbHNbXSA9ICRvcmRpbmFsOwp9Cn0KcmV0dXJuICRvcmRpbmFsczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRWYWx1ZXMoKTogYXJyYXkKewokZW51bWVyYXRpb24gPSAkdGhpcy0+ZW51bWVyYXRpb247CiR2YWx1ZXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPmdldE9yZGluYWxzKCkgYXMgJG9yZCkgewokdmFsdWVzW10gPSAkZW51bWVyYXRpb246OmJ5T3JkaW5hbCgkb3JkKS0+Z2V0VmFsdWUoKTsKfQpyZXR1cm4gJHZhbHVlczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lcygpOiBhcnJheQp7CiRlbnVtZXJhdGlvbiA9ICR0aGlzLT5lbnVtZXJhdGlvbjsKJG5hbWVzID0gW107CmZvcmVhY2ggKCR0aGlzLT5nZXRPcmRpbmFscygpIGFzICRvcmQpIHsKJG5hbWVzW10gPSAkZW51bWVyYXRpb246OmJ5T3JkaW5hbCgkb3JkKS0+Z2V0TmFtZSgpOwp9CnJldHVybiAkbmFtZXM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RW51bWVyYXRvcnMoKTogYXJyYXkKewokZW51bWVyYXRpb24gPSAkdGhpcy0+ZW51bWVyYXRpb247CiRlbnVtZXJhdG9ycyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+Z2V0T3JkaW5hbHMoKSBhcyAkb3JkKSB7CiRlbnVtZXJhdG9yc1tdID0gJGVudW1lcmF0aW9uOjpieU9yZGluYWwoJG9yZCk7Cn0KcmV0dXJuICRlbnVtZXJhdG9yczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRCaW5hcnlCaXRzZXRMZSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnskdGhpcy0+Zm5Eb0dldEJpbmFyeUJpdHNldExlfSgpOwp9CgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRvR2V0QmluYXJ5Qml0c2V0TGVCaW4oKQp7CgokYml0c2V0ID0gJHRoaXMtPmJpdHNldDsKCnJldHVybiAkYml0c2V0Owp9CgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRvR2V0QmluYXJ5Qml0c2V0TGVJbnQoKQp7CiRiaW4gPSBccGFjayhcUEhQX0lOVF9TSVpFID09PSA4ID8gJ1AnIDogJ1YnLCAkdGhpcy0+Yml0c2V0KTsKcmV0dXJuIFxzdWJzdHIoJGJpbiwgMCwgKGludClcY2VpbCgkdGhpcy0+ZW51bWVyYXRpb25Db3VudCAvIDgpKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QmluYXJ5Qml0c2V0QmUoKTogc3RyaW5nCnsKcmV0dXJuIFxzdHJyZXYoJHRoaXMtPmdldEJpbmFyeUJpdHNldExlKCkpOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Qml0KGludCAkb3JkaW5hbCk6IGJvb2wKewppZiAoJG9yZGluYWwgPCAwIHx8ICRvcmRpbmFsID4gJHRoaXMtPmVudW1lcmF0aW9uQ291bnQpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiT3JkaW5hbCBudW1iZXIgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIHskdGhpcy0+ZW51bWVyYXRpb25Db3VudH0iKTsKfQoKcmV0dXJuICR0aGlzLT57JHRoaXMtPmZuRG9HZXRCaXR9KCRvcmRpbmFsKTsKfQoKCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9HZXRCaXRCaW4oJG9yZGluYWwpCnsKCiRiaXRzZXQgPSAkdGhpcy0+Yml0c2V0OwoKcmV0dXJuIChcb3JkKCRiaXRzZXRbKGludCkgKCRvcmRpbmFsIC8gOCldKSAmIDEgPDwgKCRvcmRpbmFsICUgOCkpICE9PSAwOwp9CgoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkb0dldEJpdEludCgkb3JkaW5hbCkKewoKJGJpdHNldCA9ICR0aGlzLT5iaXRzZXQ7CgpyZXR1cm4gKGJvb2wpKCRiaXRzZXQgJiAoMSA8PCAkb3JkaW5hbCkpOwp9Cn0KPD9waHAKCmlmIChcUEhQX1ZFUlNJT05fSUQgPCA4MDAwMCkgewppbnRlcmZhY2UgU3RyaW5nYWJsZQp7CgoKCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk7Cn0KfQoKVGhlIE1JVCBMaWNlbnNlIChNSVQpCgpDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNiBjb250YWluZXItaW50ZXJvcApDb3B5cmlnaHQgKGMpIDIwMTYgUEhQIEZyYW1ld29yayBJbnRlcm9wZXJhYmlsaXR5IEdyb3VwCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCnRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCnRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLApzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCkNPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgpJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgpDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKPD9waHAKCm5hbWVzcGFjZSBQc3JcQ29udGFpbmVyOwoKCgoKaW50ZXJmYWNlIENvbnRhaW5lckV4Y2VwdGlvbkludGVyZmFjZQp7Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIFBzclxDb250YWluZXI7CgoKCgppbnRlcmZhY2UgQ29udGFpbmVySW50ZXJmYWNlCnsKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXQoc3RyaW5nICRpZCk7CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXMoc3RyaW5nICRpZCk7Cn0KPD9waHAKCm5hbWVzcGFjZSBQc3JcQ29udGFpbmVyOwoKCgoKaW50ZXJmYWNlIE5vdEZvdW5kRXhjZXB0aW9uSW50ZXJmYWNlIGV4dGVuZHMgQ29udGFpbmVyRXhjZXB0aW9uSW50ZXJmYWNlCnsKfQoKQ29weXJpZ2h0IChjKSAyMDEyIFBIUCBGcmFtZXdvcmsgSW50ZXJvcGVyYWJpbGl0eSBHcm91cAoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSAKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyAKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIApmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKPD9waHAKCm5hbWVzcGFjZSBQc3JcTG9nOwoKCgoKCgoKCmFic3RyYWN0IGNsYXNzIEFic3RyYWN0TG9nZ2VyIGltcGxlbWVudHMgTG9nZ2VySW50ZXJmYWNlCnsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZW1lcmdlbmN5KCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6RU1FUkdFTkNZLCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhbGVydCgkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OkFMRVJULCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNyaXRpY2FsKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6Q1JJVElDQUwsICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBlcnJvcigkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OkVSUk9SLCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3YXJuaW5nKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6V0FSTklORywgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbm90aWNlKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6Tk9USUNFLCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGluZm8oJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSkKewokdGhpcy0+bG9nKExvZ0xldmVsOjpJTkZPLCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkZWJ1ZygkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OkRFQlVHLCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9Cn0KPD9waHAKCm5hbWVzcGFjZSBQc3JcTG9nOwoKY2xhc3MgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGV4dGVuZHMgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgp7Cn0KPD9waHAKCm5hbWVzcGFjZSBQc3JcTG9nOwoKCgoKY2xhc3MgTG9nTGV2ZWwKewpjb25zdCBFTUVSR0VOQ1kgPSAnZW1lcmdlbmN5JzsKY29uc3QgQUxFUlQgPSAnYWxlcnQnOwpjb25zdCBDUklUSUNBTCA9ICdjcml0aWNhbCc7CmNvbnN0IEVSUk9SID0gJ2Vycm9yJzsKY29uc3QgV0FSTklORyA9ICd3YXJuaW5nJzsKY29uc3QgTk9USUNFID0gJ25vdGljZSc7CmNvbnN0IElORk8gPSAnaW5mbyc7CmNvbnN0IERFQlVHID0gJ2RlYnVnJzsKfQo8P3BocAoKbmFtZXNwYWNlIFBzclxMb2c7CgoKCgppbnRlcmZhY2UgTG9nZ2VyQXdhcmVJbnRlcmZhY2UKewoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldExvZ2dlcihMb2dnZXJJbnRlcmZhY2UgJGxvZ2dlcik7Cn0KPD9waHAKCm5hbWVzcGFjZSBQc3JcTG9nOwoKCgoKdHJhaXQgTG9nZ2VyQXdhcmVUcmFpdAp7CgoKCgoKcHJvdGVjdGVkICRsb2dnZXI7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRMb2dnZXIoTG9nZ2VySW50ZXJmYWNlICRsb2dnZXIpCnsKJHRoaXMtPmxvZ2dlciA9ICRsb2dnZXI7Cn0KfQo8P3BocAoKbmFtZXNwYWNlIFBzclxMb2c7CgoKCgoKCgoKCgoKCgoKCgppbnRlcmZhY2UgTG9nZ2VySW50ZXJmYWNlCnsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZW1lcmdlbmN5KCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpOwoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWxlcnQoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSk7CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNyaXRpY2FsKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpOwoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGVycm9yKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpOwoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2FybmluZygkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKTsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG5vdGljZSgkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKTsKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5mbygkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKTsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRlYnVnKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpOwoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbG9nKCRsZXZlbCwgJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSk7Cn0KPD9waHAKCm5hbWVzcGFjZSBQc3JcTG9nOwoKCgoKCgoKCgp0cmFpdCBMb2dnZXJUcmFpdAp7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGVtZXJnZW5jeSgkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OkVNRVJHRU5DWSwgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWxlcnQoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSkKewokdGhpcy0+bG9nKExvZ0xldmVsOjpBTEVSVCwgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjcml0aWNhbCgkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OkNSSVRJQ0FMLCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXJyb3IoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSkKewokdGhpcy0+bG9nKExvZ0xldmVsOjpFUlJPUiwgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2FybmluZygkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OldBUk5JTkcsICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG5vdGljZSgkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6Ok5PVElDRSwgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbmZvKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6SU5GTywgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGVidWcoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSkKewokdGhpcy0+bG9nKExvZ0xldmVsOjpERUJVRywgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKCgoKCgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gbG9nKCRsZXZlbCwgJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSk7Cn0KPD9waHAKCm5hbWVzcGFjZSBQc3JcTG9nOwoKCgoKCgoKCgpjbGFzcyBOdWxsTG9nZ2VyIGV4dGVuZHMgQWJzdHJhY3RMb2dnZXIKewoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2coJGxldmVsLCAkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQp7Cgp9Cn0KPD9waHAKCm5hbWVzcGFjZSBQc3JcTG9nXFRlc3Q7CgoKCgoKCgoKY2xhc3MgRHVtbXlUZXN0CnsKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKQp7CnJldHVybiAnRHVtbXlUZXN0JzsKfQp9Cjw/cGhwCgpuYW1lc3BhY2UgUHNyXExvZ1xUZXN0OwoKdXNlIFBzclxMb2dcTG9nZ2VySW50ZXJmYWNlOwp1c2UgUHNyXExvZ1xMb2dMZXZlbDsKdXNlIFBIUFVuaXRcRnJhbWV3b3JrXFRlc3RDYXNlOwoKCgoKCgoKYWJzdHJhY3QgY2xhc3MgTG9nZ2VySW50ZXJmYWNlVGVzdCBleHRlbmRzIFRlc3RDYXNlCnsKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGdldExvZ2dlcigpOwoKCgoKCgoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGdldExvZ3MoKTsKCnB1YmxpYyBmdW5jdGlvbiB0ZXN0SW1wbGVtZW50cygpCnsKJHRoaXMtPmFzc2VydEluc3RhbmNlT2YoJ1BzclxMb2dcTG9nZ2VySW50ZXJmYWNlJywgJHRoaXMtPmdldExvZ2dlcigpKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHRlc3RMb2dzQXRBbGxMZXZlbHMoJGxldmVsLCAkbWVzc2FnZSkKewokbG9nZ2VyID0gJHRoaXMtPmdldExvZ2dlcigpOwokbG9nZ2VyLT57JGxldmVsfSgkbWVzc2FnZSwgYXJyYXkoJ3VzZXInID0+ICdCb2InKSk7CiRsb2dnZXItPmxvZygkbGV2ZWwsICRtZXNzYWdlLCBhcnJheSgndXNlcicgPT4gJ0JvYicpKTsKCiRleHBlY3RlZCA9IGFycmF5KAokbGV2ZWwuJyBtZXNzYWdlIG9mIGxldmVsICcuJGxldmVsLicgd2l0aCBjb250ZXh0OiBCb2InLAokbGV2ZWwuJyBtZXNzYWdlIG9mIGxldmVsICcuJGxldmVsLicgd2l0aCBjb250ZXh0OiBCb2InLAopOwokdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJHRoaXMtPmdldExvZ3MoKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBwcm92aWRlTGV2ZWxzQW5kTWVzc2FnZXMoKQp7CnJldHVybiBhcnJheSgKTG9nTGV2ZWw6OkVNRVJHRU5DWSA9PiBhcnJheShMb2dMZXZlbDo6RU1FUkdFTkNZLCAnbWVzc2FnZSBvZiBsZXZlbCBlbWVyZ2VuY3kgd2l0aCBjb250ZXh0OiB7dXNlcn0nKSwKTG9nTGV2ZWw6OkFMRVJUID0+IGFycmF5KExvZ0xldmVsOjpBTEVSVCwgJ21lc3NhZ2Ugb2YgbGV2ZWwgYWxlcnQgd2l0aCBjb250ZXh0OiB7dXNlcn0nKSwKTG9nTGV2ZWw6OkNSSVRJQ0FMID0+IGFycmF5KExvZ0xldmVsOjpDUklUSUNBTCwgJ21lc3NhZ2Ugb2YgbGV2ZWwgY3JpdGljYWwgd2l0aCBjb250ZXh0OiB7dXNlcn0nKSwKTG9nTGV2ZWw6OkVSUk9SID0+IGFycmF5KExvZ0xldmVsOjpFUlJPUiwgJ21lc3NhZ2Ugb2YgbGV2ZWwgZXJyb3Igd2l0aCBjb250ZXh0OiB7dXNlcn0nKSwKTG9nTGV2ZWw6OldBUk5JTkcgPT4gYXJyYXkoTG9nTGV2ZWw6OldBUk5JTkcsICdtZXNzYWdlIG9mIGxldmVsIHdhcm5pbmcgd2l0aCBjb250ZXh0OiB7dXNlcn0nKSwKTG9nTGV2ZWw6Ok5PVElDRSA9PiBhcnJheShMb2dMZXZlbDo6Tk9USUNFLCAnbWVzc2FnZSBvZiBsZXZlbCBub3RpY2Ugd2l0aCBjb250ZXh0OiB7dXNlcn0nKSwKTG9nTGV2ZWw6OklORk8gPT4gYXJyYXkoTG9nTGV2ZWw6OklORk8sICdtZXNzYWdlIG9mIGxldmVsIGluZm8gd2l0aCBjb250ZXh0OiB7dXNlcn0nKSwKTG9nTGV2ZWw6OkRFQlVHID0+IGFycmF5KExvZ0xldmVsOjpERUJVRywgJ21lc3NhZ2Ugb2YgbGV2ZWwgZGVidWcgd2l0aCBjb250ZXh0OiB7dXNlcn0nKSwKKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHRlc3RUaHJvd3NPbkludmFsaWRMZXZlbCgpCnsKJGxvZ2dlciA9ICR0aGlzLT5nZXRMb2dnZXIoKTsKJGxvZ2dlci0+bG9nKCdpbnZhbGlkIGxldmVsJywgJ0ZvbycpOwp9CgpwdWJsaWMgZnVuY3Rpb24gdGVzdENvbnRleHRSZXBsYWNlbWVudCgpCnsKJGxvZ2dlciA9ICR0aGlzLT5nZXRMb2dnZXIoKTsKJGxvZ2dlci0+aW5mbygne01lc3NhZ2Uge25vdGhpbmd9IHt1c2VyfSB7Zm9vLmJhcn0gYX0nLCBhcnJheSgndXNlcicgPT4gJ0JvYicsICdmb28uYmFyJyA9PiAnQmFyJykpOwoKJGV4cGVjdGVkID0gYXJyYXkoJ2luZm8ge01lc3NhZ2Uge25vdGhpbmd9IEJvYiBCYXIgYX0nKTsKJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICR0aGlzLT5nZXRMb2dzKCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gdGVzdE9iamVjdENhc3RUb1N0cmluZygpCnsKaWYgKG1ldGhvZF9leGlzdHMoJHRoaXMsICdjcmVhdGVQYXJ0aWFsTW9jaycpKSB7CiRkdW1teSA9ICR0aGlzLT5jcmVhdGVQYXJ0aWFsTW9jaygnUHNyXExvZ1xUZXN0XER1bW15VGVzdCcsIGFycmF5KCdfX3RvU3RyaW5nJykpOwp9IGVsc2UgewokZHVtbXkgPSAkdGhpcy0+Z2V0TW9jaygnUHNyXExvZ1xUZXN0XER1bW15VGVzdCcsIGFycmF5KCdfX3RvU3RyaW5nJykpOwp9CiRkdW1teS0+ZXhwZWN0cygkdGhpcy0+b25jZSgpKQotPm1ldGhvZCgnX190b1N0cmluZycpCi0+d2lsbCgkdGhpcy0+cmV0dXJuVmFsdWUoJ0RVTU1ZJykpOwoKJHRoaXMtPmdldExvZ2dlcigpLT53YXJuaW5nKCRkdW1teSk7CgokZXhwZWN0ZWQgPSBhcnJheSgnd2FybmluZyBEVU1NWScpOwokdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJHRoaXMtPmdldExvZ3MoKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0ZXN0Q29udGV4dENhbkNvbnRhaW5Bbnl0aGluZygpCnsKJGNsb3NlZCA9IGZvcGVuKCdwaHA6Ly9tZW1vcnknLCAncicpOwpmY2xvc2UoJGNsb3NlZCk7CgokY29udGV4dCA9IGFycmF5KAonYm9vbCcgPT4gdHJ1ZSwKJ251bGwnID0+IG51bGwsCidzdHJpbmcnID0+ICdGb28nLAonaW50JyA9PiAwLAonZmxvYXQnID0+IDAuNSwKJ25lc3RlZCcgPT4gYXJyYXkoJ3dpdGggb2JqZWN0JyA9PiBuZXcgRHVtbXlUZXN0KSwKJ29iamVjdCcgPT4gbmV3IFxEYXRlVGltZSwKJ3Jlc291cmNlJyA9PiBmb3BlbigncGhwOi8vbWVtb3J5JywgJ3InKSwKJ2Nsb3NlZCcgPT4gJGNsb3NlZCwKKTsKCiR0aGlzLT5nZXRMb2dnZXIoKS0+d2FybmluZygnQ3JhenkgY29udGV4dCBkYXRhJywgJGNvbnRleHQpOwoKJGV4cGVjdGVkID0gYXJyYXkoJ3dhcm5pbmcgQ3JhenkgY29udGV4dCBkYXRhJyk7CiR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkdGhpcy0+Z2V0TG9ncygpKTsKfQoKcHVibGljIGZ1bmN0aW9uIHRlc3RDb250ZXh0RXhjZXB0aW9uS2V5Q2FuQmVFeGNlcHRpb25Pck90aGVyVmFsdWVzKCkKewokbG9nZ2VyID0gJHRoaXMtPmdldExvZ2dlcigpOwokbG9nZ2VyLT53YXJuaW5nKCdSYW5kb20gbWVzc2FnZScsIGFycmF5KCdleGNlcHRpb24nID0+ICdvb3BzJykpOwokbG9nZ2VyLT5jcml0aWNhbCgnVW5jYXVnaHQgRXhjZXB0aW9uIScsIGFycmF5KCdleGNlcHRpb24nID0+IG5ldyBcTG9naWNFeGNlcHRpb24oJ0ZhaWwnKSkpOwoKJGV4cGVjdGVkID0gYXJyYXkoCid3YXJuaW5nIFJhbmRvbSBtZXNzYWdlJywKJ2NyaXRpY2FsIFVuY2F1Z2h0IEV4Y2VwdGlvbiEnCik7CiR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkdGhpcy0+Z2V0TG9ncygpKTsKfQp9Cjw/cGhwCgpuYW1lc3BhY2UgUHNyXExvZ1xUZXN0OwoKdXNlIFBzclxMb2dcQWJzdHJhY3RMb2dnZXI7CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIFRlc3RMb2dnZXIgZXh0ZW5kcyBBYnN0cmFjdExvZ2dlcgp7CgoKCnB1YmxpYyAkcmVjb3JkcyA9IFtdOwoKcHVibGljICRyZWNvcmRzQnlMZXZlbCA9IFtdOwoKCgoKcHVibGljIGZ1bmN0aW9uIGxvZygkbGV2ZWwsICRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IFtdKQp7CiRyZWNvcmQgPSBbCidsZXZlbCcgPT4gJGxldmVsLAonbWVzc2FnZScgPT4gJG1lc3NhZ2UsCidjb250ZXh0JyA9PiAkY29udGV4dCwKXTsKCiR0aGlzLT5yZWNvcmRzQnlMZXZlbFskcmVjb3JkWydsZXZlbCddXVtdID0gJHJlY29yZDsKJHRoaXMtPnJlY29yZHNbXSA9ICRyZWNvcmQ7Cn0KCnB1YmxpYyBmdW5jdGlvbiBoYXNSZWNvcmRzKCRsZXZlbCkKewpyZXR1cm4gaXNzZXQoJHRoaXMtPnJlY29yZHNCeUxldmVsWyRsZXZlbF0pOwp9CgpwdWJsaWMgZnVuY3Rpb24gaGFzUmVjb3JkKCRyZWNvcmQsICRsZXZlbCkKewppZiAoaXNfc3RyaW5nKCRyZWNvcmQpKSB7CiRyZWNvcmQgPSBbJ21lc3NhZ2UnID0+ICRyZWNvcmRdOwp9CnJldHVybiAkdGhpcy0+aGFzUmVjb3JkVGhhdFBhc3NlcyhmdW5jdGlvbiAoJHJlYykgdXNlICgkcmVjb3JkKSB7CmlmICgkcmVjWydtZXNzYWdlJ10gIT09ICRyZWNvcmRbJ21lc3NhZ2UnXSkgewpyZXR1cm4gZmFsc2U7Cn0KaWYgKGlzc2V0KCRyZWNvcmRbJ2NvbnRleHQnXSkgJiYgJHJlY1snY29udGV4dCddICE9PSAkcmVjb3JkWydjb250ZXh0J10pIHsKcmV0dXJuIGZhbHNlOwp9CnJldHVybiB0cnVlOwp9LCAkbGV2ZWwpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaGFzUmVjb3JkVGhhdENvbnRhaW5zKCRtZXNzYWdlLCAkbGV2ZWwpCnsKcmV0dXJuICR0aGlzLT5oYXNSZWNvcmRUaGF0UGFzc2VzKGZ1bmN0aW9uICgkcmVjKSB1c2UgKCRtZXNzYWdlKSB7CnJldHVybiBzdHJwb3MoJHJlY1snbWVzc2FnZSddLCAkbWVzc2FnZSkgIT09IGZhbHNlOwp9LCAkbGV2ZWwpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaGFzUmVjb3JkVGhhdE1hdGNoZXMoJHJlZ2V4LCAkbGV2ZWwpCnsKcmV0dXJuICR0aGlzLT5oYXNSZWNvcmRUaGF0UGFzc2VzKGZ1bmN0aW9uICgkcmVjKSB1c2UgKCRyZWdleCkgewpyZXR1cm4gcHJlZ19tYXRjaCgkcmVnZXgsICRyZWNbJ21lc3NhZ2UnXSkgPiAwOwp9LCAkbGV2ZWwpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaGFzUmVjb3JkVGhhdFBhc3NlcyhjYWxsYWJsZSAkcHJlZGljYXRlLCAkbGV2ZWwpCnsKaWYgKCFpc3NldCgkdGhpcy0+cmVjb3Jkc0J5TGV2ZWxbJGxldmVsXSkpIHsKcmV0dXJuIGZhbHNlOwp9CmZvcmVhY2ggKCR0aGlzLT5yZWNvcmRzQnlMZXZlbFskbGV2ZWxdIGFzICRpID0+ICRyZWMpIHsKaWYgKGNhbGxfdXNlcl9mdW5jKCRwcmVkaWNhdGUsICRyZWMsICRpKSkgewpyZXR1cm4gdHJ1ZTsKfQp9CnJldHVybiBmYWxzZTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fY2FsbCgkbWV0aG9kLCAkYXJncykKewppZiAocHJlZ19tYXRjaCgnLyguKikoRGVidWd8SW5mb3xOb3RpY2V8V2FybmluZ3xFcnJvcnxDcml0aWNhbHxBbGVydHxFbWVyZ2VuY3kpKC4qKS8nLCAkbWV0aG9kLCAkbWF0Y2hlcykgPiAwKSB7CiRnZW5lcmljTWV0aG9kID0gJG1hdGNoZXNbMV0gLiAoJ1JlY29yZHMnICE9PSAkbWF0Y2hlc1szXSA/ICdSZWNvcmQnIDogJycpIC4gJG1hdGNoZXNbM107CiRsZXZlbCA9IHN0cnRvbG93ZXIoJG1hdGNoZXNbMl0pOwppZiAobWV0aG9kX2V4aXN0cygkdGhpcywgJGdlbmVyaWNNZXRob2QpKSB7CiRhcmdzW10gPSAkbGV2ZWw7CnJldHVybiBjYWxsX3VzZXJfZnVuY19hcnJheShbJHRoaXMsICRnZW5lcmljTWV0aG9kXSwgJGFyZ3MpOwp9Cn0KdGhyb3cgbmV3IFxCYWRNZXRob2RDYWxsRXhjZXB0aW9uKCdDYWxsIHRvIHVuZGVmaW5lZCBtZXRob2QgJyAuIGdldF9jbGFzcygkdGhpcykgLiAnOjonIC4gJG1ldGhvZCAuICcoKScpOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVzZXQoKQp7CiR0aGlzLT5yZWNvcmRzID0gW107CiR0aGlzLT5yZWNvcmRzQnlMZXZlbCA9IFtdOwp9Cn0KClRoZSBNSVQgTGljZW5zZSAoTUlUKQoKQ29weXJpZ2h0IChjKSAyMDEyIEphbiBTb3JnYWxsYSwgQ2hyaXN0aWFuIEzDvGNrLCBDZWVzLUphbiBLaWV3aWV0LCBDaHJpcyBCb2RlbgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24Kb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dApyZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlClNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCmNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQppbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELApFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCldIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwpGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCk9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCjw/cGhwCgpuYW1lc3BhY2UgUmVhY3RcUHJvbWlzZTsKCgoKCmZpbmFsIGNsYXNzIERlZmVycmVkCnsKCgoKcHJpdmF0ZSAkcHJvbWlzZTsKCgpwcml2YXRlICRyZXNvbHZlQ2FsbGJhY2s7CgoKcHJpdmF0ZSAkcmVqZWN0Q2FsbGJhY2s7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP2NhbGxhYmxlICRjYW5jZWxsZXIgPSBudWxsKQp7CiR0aGlzLT5wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKCRyZXNvbHZlLCAkcmVqZWN0KTogdm9pZCB7CiR0aGlzLT5yZXNvbHZlQ2FsbGJhY2sgPSAkcmVzb2x2ZTsKJHRoaXMtPnJlamVjdENhbGxiYWNrID0gJHJlamVjdDsKfSwgJGNhbmNlbGxlcik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBwcm9taXNlKCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPnByb21pc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZXNvbHZlKCR2YWx1ZSk6IHZvaWQKewooJHRoaXMtPnJlc29sdmVDYWxsYmFjaykoJHZhbHVlKTsKfQoKcHVibGljIGZ1bmN0aW9uIHJlamVjdChcVGhyb3dhYmxlICRyZWFzb24pOiB2b2lkCnsKKCR0aGlzLT5yZWplY3RDYWxsYmFjaykoJHJlYXNvbik7Cn0KfQo8P3BocAoKbmFtZXNwYWNlIFJlYWN0XFByb21pc2VcRXhjZXB0aW9uOwoKCgoKCgoKCmNsYXNzIENvbXBvc2l0ZUV4Y2VwdGlvbiBleHRlbmRzIFxFeGNlcHRpb24KewoKcHJpdmF0ZSAkdGhyb3dhYmxlczsKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJHRocm93YWJsZXMsIHN0cmluZyAkbWVzc2FnZSA9ICcnLCBpbnQgJGNvZGUgPSAwLCA/XFRocm93YWJsZSAkcHJldmlvdXMgPSBudWxsKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRjb2RlLCAkcHJldmlvdXMpOwoKJHRoaXMtPnRocm93YWJsZXMgPSAkdGhyb3dhYmxlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRocm93YWJsZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnRocm93YWJsZXM7Cn0KfQo8P3BocAoKbmFtZXNwYWNlIFJlYWN0XFByb21pc2VcRXhjZXB0aW9uOwoKY2xhc3MgTGVuZ3RoRXhjZXB0aW9uIGV4dGVuZHMgXExlbmd0aEV4Y2VwdGlvbgp7Cn0KPD9waHAKCm5hbWVzcGFjZSBSZWFjdFxQcm9taXNlXEludGVybmFsOwoKCgoKZmluYWwgY2xhc3MgQ2FuY2VsbGF0aW9uUXVldWUKewoKcHJpdmF0ZSAkc3RhcnRlZCA9IGZhbHNlOwoKCnByaXZhdGUgJHF1ZXVlID0gW107CgpwdWJsaWMgZnVuY3Rpb24gX19pbnZva2UoKTogdm9pZAp7CmlmICgkdGhpcy0+c3RhcnRlZCkgewpyZXR1cm47Cn0KCiR0aGlzLT5zdGFydGVkID0gdHJ1ZTsKJHRoaXMtPmRyYWluKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBlbnF1ZXVlKCRjYW5jZWxsYWJsZSk6IHZvaWQKewppZiAoIVxpc19vYmplY3QoJGNhbmNlbGxhYmxlKSB8fCAhXG1ldGhvZF9leGlzdHMoJGNhbmNlbGxhYmxlLCAndGhlbicpIHx8ICFcbWV0aG9kX2V4aXN0cygkY2FuY2VsbGFibGUsICdjYW5jZWwnKSkgewpyZXR1cm47Cn0KCiRsZW5ndGggPSBcYXJyYXlfcHVzaCgkdGhpcy0+cXVldWUsICRjYW5jZWxsYWJsZSk7CgppZiAoJHRoaXMtPnN0YXJ0ZWQgJiYgMSA9PT0gJGxlbmd0aCkgewokdGhpcy0+ZHJhaW4oKTsKfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIGRyYWluKCk6IHZvaWQKewpmb3IgKCRpID0gXGtleSgkdGhpcy0+cXVldWUpOyBpc3NldCgkdGhpcy0+cXVldWVbJGldKTsgJGkrKykgewokY2FuY2VsbGFibGUgPSAkdGhpcy0+cXVldWVbJGldOwphc3NlcnQoXG1ldGhvZF9leGlzdHMoJGNhbmNlbGxhYmxlLCAnY2FuY2VsJykpOwoKJGV4Y2VwdGlvbiA9IG51bGw7Cgp0cnkgewokY2FuY2VsbGFibGUtPmNhbmNlbCgpOwp9IGNhdGNoIChcVGhyb3dhYmxlICRleGNlcHRpb24pIHsKfQoKdW5zZXQoJHRoaXMtPnF1ZXVlWyRpXSk7CgppZiAoJGV4Y2VwdGlvbikgewp0aHJvdyAkZXhjZXB0aW9uOwp9Cn0KCiR0aGlzLT5xdWV1ZSA9IFtdOwp9Cn0KPD9waHAKCm5hbWVzcGFjZSBSZWFjdFxQcm9taXNlXEludGVybmFsOwoKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKdXNlIGZ1bmN0aW9uIFJlYWN0XFByb21pc2VccmVzb2x2ZTsKCgoKCgoKCmZpbmFsIGNsYXNzIEZ1bGZpbGxlZFByb21pc2UgaW1wbGVtZW50cyBQcm9taXNlSW50ZXJmYWNlCnsKCnByaXZhdGUgJHZhbHVlOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdmFsdWUgPSBudWxsKQp7CmlmICgkdmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlSW50ZXJmYWNlKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdZb3UgY2Fubm90IGNyZWF0ZSBSZWFjdFxQcm9taXNlXEZ1bGZpbGxlZFByb21pc2Ugd2l0aCBhIHByb21pc2UuIFVzZSBSZWFjdFxQcm9taXNlXHJlc29sdmUoJHByb21pc2VPclZhbHVlKSBpbnN0ZWFkLicpOwp9CgokdGhpcy0+dmFsdWUgPSAkdmFsdWU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHRoZW4oP2NhbGxhYmxlICRvbkZ1bGZpbGxlZCA9IG51bGwsID9jYWxsYWJsZSAkb25SZWplY3RlZCA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlCnsKaWYgKG51bGwgPT09ICRvbkZ1bGZpbGxlZCkgewpyZXR1cm4gJHRoaXM7Cn0KCnRyeSB7CgoKCiRyZXN1bHQgPSAkb25GdWxmaWxsZWQoJHRoaXMtPnZhbHVlKTsKcmV0dXJuIHJlc29sdmUoJHJlc3VsdCk7Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGV4Y2VwdGlvbikgewpyZXR1cm4gbmV3IFJlamVjdGVkUHJvbWlzZSgkZXhjZXB0aW9uKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gY2F0Y2goY2FsbGFibGUgJG9uUmVqZWN0ZWQpOiBQcm9taXNlSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzOwp9CgpwdWJsaWMgZnVuY3Rpb24gZmluYWxseShjYWxsYWJsZSAkb25GdWxmaWxsZWRPclJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+dGhlbihmdW5jdGlvbiAoJHZhbHVlKSB1c2UgKCRvbkZ1bGZpbGxlZE9yUmVqZWN0ZWQpOiBQcm9taXNlSW50ZXJmYWNlIHsKCnJldHVybiByZXNvbHZlKCRvbkZ1bGZpbGxlZE9yUmVqZWN0ZWQoKSktPnRoZW4oZnVuY3Rpb24gKCkgdXNlICgkdmFsdWUpIHsKcmV0dXJuICR2YWx1ZTsKfSk7Cn0pOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2FuY2VsKCk6IHZvaWQKewp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIG90aGVyd2lzZShjYWxsYWJsZSAkb25SZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmNhdGNoKCRvblJlamVjdGVkKTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhbHdheXMoY2FsbGFibGUgJG9uRnVsZmlsbGVkT3JSZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmZpbmFsbHkoJG9uRnVsZmlsbGVkT3JSZWplY3RlZCk7Cn0KfQo8P3BocAoKbmFtZXNwYWNlIFJlYWN0XFByb21pc2VcSW50ZXJuYWw7Cgp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwp1c2UgZnVuY3Rpb24gUmVhY3RcUHJvbWlzZVxfY2hlY2tUeXBlaGludDsKdXNlIGZ1bmN0aW9uIFJlYWN0XFByb21pc2VccmVzb2x2ZTsKdXNlIGZ1bmN0aW9uIFJlYWN0XFByb21pc2Vcc2V0X3JlamVjdGlvbl9oYW5kbGVyOwoKCgoKCgpmaW5hbCBjbGFzcyBSZWplY3RlZFByb21pc2UgaW1wbGVtZW50cyBQcm9taXNlSW50ZXJmYWNlCnsKCnByaXZhdGUgJHJlYXNvbjsKCgpwcml2YXRlICRoYW5kbGVkID0gZmFsc2U7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoXFRocm93YWJsZSAkcmVhc29uKQp7CiR0aGlzLT5yZWFzb24gPSAkcmVhc29uOwp9CgoKcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKQp7CmlmICgkdGhpcy0+aGFuZGxlZCkgewpyZXR1cm47Cn0KCiRoYW5kbGVyID0gc2V0X3JlamVjdGlvbl9oYW5kbGVyKG51bGwpOwppZiAoJGhhbmRsZXIgPT09IG51bGwpIHsKJG1lc3NhZ2UgPSAnVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIHdpdGggJyAuICR0aGlzLT5yZWFzb247CgpcZXJyb3JfbG9nKCRtZXNzYWdlKTsKcmV0dXJuOwp9Cgp0cnkgewokaGFuZGxlcigkdGhpcy0+cmVhc29uKTsKfSBjYXRjaCAoXFRocm93YWJsZSAkZSkgewpccHJlZ19tYXRjaCgnL14oW146XHNdKyspKC4qKykkL3NtJywgKHN0cmluZykgJGUsICRtYXRjaCk7Clxhc3NlcnQoaXNzZXQoJG1hdGNoWzFdLCAkbWF0Y2hbMl0pKTsKJG1lc3NhZ2UgPSAnRmF0YWwgZXJyb3I6IFVuY2F1Z2h0ICcgLiAkbWF0Y2hbMV0gLiAnIGZyb20gdW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIGhhbmRsZXInIC4gJG1hdGNoWzJdOwoKXGVycm9yX2xvZygkbWVzc2FnZSk7CmV4aXQoMjU1KTsKfQp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdGhlbig/Y2FsbGFibGUgJG9uRnVsZmlsbGVkID0gbnVsbCwgP2NhbGxhYmxlICRvblJlamVjdGVkID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewppZiAobnVsbCA9PT0gJG9uUmVqZWN0ZWQpIHsKcmV0dXJuICR0aGlzOwp9CgokdGhpcy0+aGFuZGxlZCA9IHRydWU7Cgp0cnkgewpyZXR1cm4gcmVzb2x2ZSgkb25SZWplY3RlZCgkdGhpcy0+cmVhc29uKSk7Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGV4Y2VwdGlvbikgewpyZXR1cm4gbmV3IFJlamVjdGVkUHJvbWlzZSgkZXhjZXB0aW9uKTsKfQp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2F0Y2goY2FsbGFibGUgJG9uUmVqZWN0ZWQpOiBQcm9taXNlSW50ZXJmYWNlCnsKaWYgKCFfY2hlY2tUeXBlaGludCgkb25SZWplY3RlZCwgJHRoaXMtPnJlYXNvbikpIHsKcmV0dXJuICR0aGlzOwp9CgoKCgpyZXR1cm4gJHRoaXMtPnRoZW4obnVsbCwgJG9uUmVqZWN0ZWQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZmluYWxseShjYWxsYWJsZSAkb25GdWxmaWxsZWRPclJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+dGhlbihudWxsLCBmdW5jdGlvbiAoXFRocm93YWJsZSAkcmVhc29uKSB1c2UgKCRvbkZ1bGZpbGxlZE9yUmVqZWN0ZWQpOiBQcm9taXNlSW50ZXJmYWNlIHsKcmV0dXJuIHJlc29sdmUoJG9uRnVsZmlsbGVkT3JSZWplY3RlZCgpKS0+dGhlbihmdW5jdGlvbiAoKSB1c2UgKCRyZWFzb24pOiBQcm9taXNlSW50ZXJmYWNlIHsKcmV0dXJuIG5ldyBSZWplY3RlZFByb21pc2UoJHJlYXNvbik7Cn0pOwp9KTsKfQoKcHVibGljIGZ1bmN0aW9uIGNhbmNlbCgpOiB2b2lkCnsKJHRoaXMtPmhhbmRsZWQgPSB0cnVlOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIG90aGVyd2lzZShjYWxsYWJsZSAkb25SZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmNhdGNoKCRvblJlamVjdGVkKTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhbHdheXMoY2FsbGFibGUgJG9uRnVsZmlsbGVkT3JSZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmZpbmFsbHkoJG9uRnVsZmlsbGVkT3JSZWplY3RlZCk7Cn0KfQo8P3BocAoKbmFtZXNwYWNlIFJlYWN0XFByb21pc2U7Cgp1c2UgUmVhY3RcUHJvbWlzZVxJbnRlcm5hbFxSZWplY3RlZFByb21pc2U7CgoKCgoKZmluYWwgY2xhc3MgUHJvbWlzZSBpbXBsZW1lbnRzIFByb21pc2VJbnRlcmZhY2UKewoKcHJpdmF0ZSAkY2FuY2VsbGVyOwoKCnByaXZhdGUgJHJlc3VsdDsKCgpwcml2YXRlICRoYW5kbGVycyA9IFtdOwoKCnByaXZhdGUgJHJlcXVpcmVkQ2FuY2VsUmVxdWVzdHMgPSAwOwoKCnByaXZhdGUgJGNhbmNlbGxlZCA9IGZhbHNlOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChjYWxsYWJsZSAkcmVzb2x2ZXIsID9jYWxsYWJsZSAkY2FuY2VsbGVyID0gbnVsbCkKewokdGhpcy0+Y2FuY2VsbGVyID0gJGNhbmNlbGxlcjsKCgoKCiRjYiA9ICRyZXNvbHZlcjsKJHJlc29sdmVyID0gJGNhbmNlbGxlciA9IG51bGw7CiR0aGlzLT5jYWxsKCRjYik7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0aGVuKD9jYWxsYWJsZSAkb25GdWxmaWxsZWQgPSBudWxsLCA/Y2FsbGFibGUgJG9uUmVqZWN0ZWQgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CmlmIChudWxsICE9PSAkdGhpcy0+cmVzdWx0KSB7CnJldHVybiAkdGhpcy0+cmVzdWx0LT50aGVuKCRvbkZ1bGZpbGxlZCwgJG9uUmVqZWN0ZWQpOwp9CgppZiAobnVsbCA9PT0gJHRoaXMtPmNhbmNlbGxlcikgewpyZXR1cm4gbmV3IHN0YXRpYygkdGhpcy0+cmVzb2x2ZXIoJG9uRnVsZmlsbGVkLCAkb25SZWplY3RlZCkpOwp9CgoKCgoKCiRwYXJlbnQgPSAkdGhpczsKKyskcGFyZW50LT5yZXF1aXJlZENhbmNlbFJlcXVlc3RzOwoKcmV0dXJuIG5ldyBzdGF0aWMoCiR0aGlzLT5yZXNvbHZlcigkb25GdWxmaWxsZWQsICRvblJlamVjdGVkKSwKc3RhdGljIGZ1bmN0aW9uICgpIHVzZSAoJiRwYXJlbnQpOiB2b2lkIHsKYXNzZXJ0KCRwYXJlbnQgaW5zdGFuY2VvZiBzZWxmKTsKLS0kcGFyZW50LT5yZXF1aXJlZENhbmNlbFJlcXVlc3RzOwoKaWYgKCRwYXJlbnQtPnJlcXVpcmVkQ2FuY2VsUmVxdWVzdHMgPD0gMCkgewokcGFyZW50LT5jYW5jZWwoKTsKfQoKJHBhcmVudCA9IG51bGw7Cn0KKTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNhdGNoKGNhbGxhYmxlICRvblJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+dGhlbihudWxsLCBzdGF0aWMgZnVuY3Rpb24gKFxUaHJvd2FibGUgJHJlYXNvbikgdXNlICgkb25SZWplY3RlZCkgewppZiAoIV9jaGVja1R5cGVoaW50KCRvblJlamVjdGVkLCAkcmVhc29uKSkgewpyZXR1cm4gbmV3IFJlamVjdGVkUHJvbWlzZSgkcmVhc29uKTsKfQoKCgoKcmV0dXJuICRvblJlamVjdGVkKCRyZWFzb24pOwp9KTsKfQoKcHVibGljIGZ1bmN0aW9uIGZpbmFsbHkoY2FsbGFibGUgJG9uRnVsZmlsbGVkT3JSZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPnRoZW4oc3RhdGljIGZ1bmN0aW9uICgkdmFsdWUpIHVzZSAoJG9uRnVsZmlsbGVkT3JSZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2UgewoKcmV0dXJuIHJlc29sdmUoJG9uRnVsZmlsbGVkT3JSZWplY3RlZCgpKS0+dGhlbihmdW5jdGlvbiAoKSB1c2UgKCR2YWx1ZSkgewpyZXR1cm4gJHZhbHVlOwp9KTsKfSwgc3RhdGljIGZ1bmN0aW9uIChcVGhyb3dhYmxlICRyZWFzb24pIHVzZSAoJG9uRnVsZmlsbGVkT3JSZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2UgewpyZXR1cm4gcmVzb2x2ZSgkb25GdWxmaWxsZWRPclJlamVjdGVkKCkpLT50aGVuKGZ1bmN0aW9uICgpIHVzZSAoJHJlYXNvbik6IFJlamVjdGVkUHJvbWlzZSB7CnJldHVybiBuZXcgUmVqZWN0ZWRQcm9taXNlKCRyZWFzb24pOwp9KTsKfSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjYW5jZWwoKTogdm9pZAp7CiR0aGlzLT5jYW5jZWxsZWQgPSB0cnVlOwokY2FuY2VsbGVyID0gJHRoaXMtPmNhbmNlbGxlcjsKJHRoaXMtPmNhbmNlbGxlciA9IG51bGw7CgokcGFyZW50Q2FuY2VsbGVyID0gbnVsbDsKCmlmIChudWxsICE9PSAkdGhpcy0+cmVzdWx0KSB7CgppZiAoJHRoaXMtPnJlc3VsdCBpbnN0YW5jZW9mIFJlamVjdGVkUHJvbWlzZSkgewokdGhpcy0+cmVzdWx0LT5jYW5jZWwoKTsKfQoKCgokcm9vdCA9ICR0aGlzLT51bndyYXAoJHRoaXMtPnJlc3VsdCk7CgoKCmlmICghJHJvb3QgaW5zdGFuY2VvZiBzZWxmIHx8IG51bGwgIT09ICRyb290LT5yZXN1bHQpIHsKcmV0dXJuOwp9Cgokcm9vdC0+cmVxdWlyZWRDYW5jZWxSZXF1ZXN0cy0tOwoKaWYgKCRyb290LT5yZXF1aXJlZENhbmNlbFJlcXVlc3RzIDw9IDApIHsKJHBhcmVudENhbmNlbGxlciA9IFskcm9vdCwgJ2NhbmNlbCddOwp9Cn0KCmlmIChudWxsICE9PSAkY2FuY2VsbGVyKSB7CiR0aGlzLT5jYWxsKCRjYW5jZWxsZXIpOwp9CgoKaWYgKCRwYXJlbnRDYW5jZWxsZXIpIHsKJHBhcmVudENhbmNlbGxlcigpOwp9Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gb3RoZXJ3aXNlKGNhbGxhYmxlICRvblJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+Y2F0Y2goJG9uUmVqZWN0ZWQpOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGFsd2F5cyhjYWxsYWJsZSAkb25GdWxmaWxsZWRPclJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+ZmluYWxseSgkb25GdWxmaWxsZWRPclJlamVjdGVkKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiByZXNvbHZlcig/Y2FsbGFibGUgJG9uRnVsZmlsbGVkID0gbnVsbCwgP2NhbGxhYmxlICRvblJlamVjdGVkID0gbnVsbCk6IGNhbGxhYmxlCnsKcmV0dXJuIGZ1bmN0aW9uIChjYWxsYWJsZSAkcmVzb2x2ZSwgY2FsbGFibGUgJHJlamVjdCkgdXNlICgkb25GdWxmaWxsZWQsICRvblJlamVjdGVkKTogdm9pZCB7CiR0aGlzLT5oYW5kbGVyc1tdID0gc3RhdGljIGZ1bmN0aW9uIChQcm9taXNlSW50ZXJmYWNlICRwcm9taXNlKSB1c2UgKCRvbkZ1bGZpbGxlZCwgJG9uUmVqZWN0ZWQsICRyZXNvbHZlLCAkcmVqZWN0KTogdm9pZCB7CiRwcm9taXNlID0gJHByb21pc2UtPnRoZW4oJG9uRnVsZmlsbGVkLCAkb25SZWplY3RlZCk7CgppZiAoJHByb21pc2UgaW5zdGFuY2VvZiBzZWxmICYmICRwcm9taXNlLT5yZXN1bHQgPT09IG51bGwpIHsKJHByb21pc2UtPmhhbmRsZXJzW10gPSBzdGF0aWMgZnVuY3Rpb24gKFByb21pc2VJbnRlcmZhY2UgJHByb21pc2UpIHVzZSAoJHJlc29sdmUsICRyZWplY3QpOiB2b2lkIHsKJHByb21pc2UtPnRoZW4oJHJlc29sdmUsICRyZWplY3QpOwp9Owp9IGVsc2UgewokcHJvbWlzZS0+dGhlbigkcmVzb2x2ZSwgJHJlamVjdCk7Cn0KfTsKfTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiByZWplY3QoXFRocm93YWJsZSAkcmVhc29uKTogdm9pZAp7CmlmIChudWxsICE9PSAkdGhpcy0+cmVzdWx0KSB7CnJldHVybjsKfQoKJHRoaXMtPnNldHRsZShyZWplY3QoJHJlYXNvbikpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHNldHRsZShQcm9taXNlSW50ZXJmYWNlICRyZXN1bHQpOiB2b2lkCnsKJHJlc3VsdCA9ICR0aGlzLT51bndyYXAoJHJlc3VsdCk7CgppZiAoJHJlc3VsdCA9PT0gJHRoaXMpIHsKJHJlc3VsdCA9IG5ldyBSZWplY3RlZFByb21pc2UoCm5ldyBcTG9naWNFeGNlcHRpb24oJ0Nhbm5vdCByZXNvbHZlIGEgcHJvbWlzZSB3aXRoIGl0c2VsZi4nKQopOwp9CgppZiAoJHJlc3VsdCBpbnN0YW5jZW9mIHNlbGYpIHsKJHJlc3VsdC0+cmVxdWlyZWRDYW5jZWxSZXF1ZXN0cysrOwp9IGVsc2UgewoKJHRoaXMtPmNhbmNlbGxlciA9IG51bGw7Cn0KCiRoYW5kbGVycyA9ICR0aGlzLT5oYW5kbGVyczsKCiR0aGlzLT5oYW5kbGVycyA9IFtdOwokdGhpcy0+cmVzdWx0ID0gJHJlc3VsdDsKCmZvcmVhY2ggKCRoYW5kbGVycyBhcyAkaGFuZGxlcikgewokaGFuZGxlcigkcmVzdWx0KTsKfQoKCmlmICgkdGhpcy0+Y2FuY2VsbGVkICYmICRyZXN1bHQgaW5zdGFuY2VvZiBSZWplY3RlZFByb21pc2UpIHsKJHJlc3VsdC0+Y2FuY2VsKCk7Cn0KfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gdW53cmFwKFByb21pc2VJbnRlcmZhY2UgJHByb21pc2UpOiBQcm9taXNlSW50ZXJmYWNlCnsKd2hpbGUgKCRwcm9taXNlIGluc3RhbmNlb2Ygc2VsZiAmJiBudWxsICE9PSAkcHJvbWlzZS0+cmVzdWx0KSB7CgokcHJvbWlzZSA9ICRwcm9taXNlLT5yZXN1bHQ7Cn0KCnJldHVybiAkcHJvbWlzZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjYWxsKGNhbGxhYmxlICRjYik6IHZvaWQKewoKCiRjYWxsYmFjayA9ICRjYjsKJGNiID0gbnVsbDsKCgoKCgoKaWYgKFxpc19hcnJheSgkY2FsbGJhY2spKSB7CiRyZWYgPSBuZXcgXFJlZmxlY3Rpb25NZXRob2QoJGNhbGxiYWNrWzBdLCAkY2FsbGJhY2tbMV0pOwp9IGVsc2VpZiAoXGlzX29iamVjdCgkY2FsbGJhY2spICYmICEkY2FsbGJhY2sgaW5zdGFuY2VvZiBcQ2xvc3VyZSkgewokcmVmID0gbmV3IFxSZWZsZWN0aW9uTWV0aG9kKCRjYWxsYmFjaywgJ19faW52b2tlJyk7Cn0gZWxzZSB7CmFzc2VydCgkY2FsbGJhY2sgaW5zdGFuY2VvZiBcQ2xvc3VyZSB8fCBcaXNfc3RyaW5nKCRjYWxsYmFjaykpOwokcmVmID0gbmV3IFxSZWZsZWN0aW9uRnVuY3Rpb24oJGNhbGxiYWNrKTsKfQokYXJncyA9ICRyZWYtPmdldE51bWJlck9mUGFyYW1ldGVycygpOwoKdHJ5IHsKaWYgKCRhcmdzID09PSAwKSB7CiRjYWxsYmFjaygpOwp9IGVsc2UgewoKCgoKCgoKCiR0YXJnZXQgPSYgJHRoaXM7CgokY2FsbGJhY2soCnN0YXRpYyBmdW5jdGlvbiAoJHZhbHVlKSB1c2UgKCYkdGFyZ2V0KTogdm9pZCB7CmlmICgkdGFyZ2V0ICE9PSBudWxsKSB7CiR0YXJnZXQtPnNldHRsZShyZXNvbHZlKCR2YWx1ZSkpOwokdGFyZ2V0ID0gbnVsbDsKfQp9LApzdGF0aWMgZnVuY3Rpb24gKFxUaHJvd2FibGUgJHJlYXNvbikgdXNlICgmJHRhcmdldCk6IHZvaWQgewppZiAoJHRhcmdldCAhPT0gbnVsbCkgewokdGFyZ2V0LT5yZWplY3QoJHJlYXNvbik7CiR0YXJnZXQgPSBudWxsOwp9Cn0KKTsKfQp9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7CiR0YXJnZXQgPSBudWxsOwokdGhpcy0+cmVqZWN0KCRlKTsKfQp9Cn0KPD9waHAKCm5hbWVzcGFjZSBSZWFjdFxQcm9taXNlOwoKCgoKaW50ZXJmYWNlIFByb21pc2VJbnRlcmZhY2UKewoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdGhlbig/Y2FsbGFibGUgJG9uRnVsZmlsbGVkID0gbnVsbCwgP2NhbGxhYmxlICRvblJlamVjdGVkID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2U7CgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2F0Y2goY2FsbGFibGUgJG9uUmVqZWN0ZWQpOiBQcm9taXNlSW50ZXJmYWNlOwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmFsbHkoY2FsbGFibGUgJG9uRnVsZmlsbGVkT3JSZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2U7CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2FuY2VsKCk6IHZvaWQ7CgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBvdGhlcndpc2UoY2FsbGFibGUgJG9uUmVqZWN0ZWQpOiBQcm9taXNlSW50ZXJmYWNlOwoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFsd2F5cyhjYWxsYWJsZSAkb25GdWxmaWxsZWRPclJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZTsKfQo8P3BocAoKbmFtZXNwYWNlIFJlYWN0XFByb21pc2U7Cgp1c2UgUmVhY3RcUHJvbWlzZVxFeGNlcHRpb25cQ29tcG9zaXRlRXhjZXB0aW9uOwp1c2UgUmVhY3RcUHJvbWlzZVxJbnRlcm5hbFxGdWxmaWxsZWRQcm9taXNlOwp1c2UgUmVhY3RcUHJvbWlzZVxJbnRlcm5hbFxSZWplY3RlZFByb21pc2U7CgoKCgoKCgoKCgoKCgoKCgpmdW5jdGlvbiByZXNvbHZlKCRwcm9taXNlT3JWYWx1ZSk6IFByb21pc2VJbnRlcmZhY2UKewppZiAoJHByb21pc2VPclZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZUludGVyZmFjZSkgewpyZXR1cm4gJHByb21pc2VPclZhbHVlOwp9CgppZiAoXGlzX29iamVjdCgkcHJvbWlzZU9yVmFsdWUpICYmIFxtZXRob2RfZXhpc3RzKCRwcm9taXNlT3JWYWx1ZSwgJ3RoZW4nKSkgewokY2FuY2VsbGVyID0gbnVsbDsKCmlmIChcbWV0aG9kX2V4aXN0cygkcHJvbWlzZU9yVmFsdWUsICdjYW5jZWwnKSkgewokY2FuY2VsbGVyID0gWyRwcm9taXNlT3JWYWx1ZSwgJ2NhbmNlbCddOwphc3NlcnQoXGlzX2NhbGxhYmxlKCRjYW5jZWxsZXIpKTsKfQoKCnJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoY2FsbGFibGUgJHJlc29sdmUsIGNhbGxhYmxlICRyZWplY3QpIHVzZSAoJHByb21pc2VPclZhbHVlKTogdm9pZCB7CiRwcm9taXNlT3JWYWx1ZS0+dGhlbigkcmVzb2x2ZSwgJHJlamVjdCk7Cn0sICRjYW5jZWxsZXIpOwp9CgpyZXR1cm4gbmV3IEZ1bGZpbGxlZFByb21pc2UoJHByb21pc2VPclZhbHVlKTsKfQoKCgoKCgoKCgoKCgoKCgoKZnVuY3Rpb24gcmVqZWN0KFxUaHJvd2FibGUgJHJlYXNvbik6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gbmV3IFJlamVjdGVkUHJvbWlzZSgkcmVhc29uKTsKfQoKCgoKCgoKCgoKCmZ1bmN0aW9uIGFsbChpdGVyYWJsZSAkcHJvbWlzZXNPclZhbHVlcyk6IFByb21pc2VJbnRlcmZhY2UKewokY2FuY2VsbGF0aW9uUXVldWUgPSBuZXcgSW50ZXJuYWxcQ2FuY2VsbGF0aW9uUXVldWUoKTsKCgpyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGNhbGxhYmxlICRyZXNvbHZlLCBjYWxsYWJsZSAkcmVqZWN0KSB1c2UgKCRwcm9taXNlc09yVmFsdWVzLCAkY2FuY2VsbGF0aW9uUXVldWUpOiB2b2lkIHsKJHRvUmVzb2x2ZSA9IDA7CgokY29udGludWUgPSB0cnVlOwokdmFsdWVzID0gW107Cgpmb3JlYWNoICgkcHJvbWlzZXNPclZhbHVlcyBhcyAkaSA9PiAkcHJvbWlzZU9yVmFsdWUpIHsKJGNhbmNlbGxhdGlvblF1ZXVlLT5lbnF1ZXVlKCRwcm9taXNlT3JWYWx1ZSk7CiR2YWx1ZXNbJGldID0gbnVsbDsKKyskdG9SZXNvbHZlOwoKcmVzb2x2ZSgkcHJvbWlzZU9yVmFsdWUpLT50aGVuKApmdW5jdGlvbiAoJHZhbHVlKSB1c2UgKCRpLCAmJHZhbHVlcywgJiR0b1Jlc29sdmUsICYkY29udGludWUsICRyZXNvbHZlKTogdm9pZCB7CiR2YWx1ZXNbJGldID0gJHZhbHVlOwoKaWYgKDAgPT09IC0tJHRvUmVzb2x2ZSAmJiAhJGNvbnRpbnVlKSB7CiRyZXNvbHZlKCR2YWx1ZXMpOwp9Cn0sCmZ1bmN0aW9uIChcVGhyb3dhYmxlICRyZWFzb24pIHVzZSAoJiRjb250aW51ZSwgJHJlamVjdCk6IHZvaWQgewokY29udGludWUgPSBmYWxzZTsKJHJlamVjdCgkcmVhc29uKTsKfQopOwoKaWYgKCEkY29udGludWUgJiYgIVxpc19hcnJheSgkcHJvbWlzZXNPclZhbHVlcykpIHsKYnJlYWs7Cn0KfQoKJGNvbnRpbnVlID0gZmFsc2U7CmlmICgkdG9SZXNvbHZlID09PSAwKSB7CiRyZXNvbHZlKCR2YWx1ZXMpOwp9Cn0sICRjYW5jZWxsYXRpb25RdWV1ZSk7Cn0KCgoKCgoKCgoKCgoKZnVuY3Rpb24gcmFjZShpdGVyYWJsZSAkcHJvbWlzZXNPclZhbHVlcyk6IFByb21pc2VJbnRlcmZhY2UKewokY2FuY2VsbGF0aW9uUXVldWUgPSBuZXcgSW50ZXJuYWxcQ2FuY2VsbGF0aW9uUXVldWUoKTsKCgpyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGNhbGxhYmxlICRyZXNvbHZlLCBjYWxsYWJsZSAkcmVqZWN0KSB1c2UgKCRwcm9taXNlc09yVmFsdWVzLCAkY2FuY2VsbGF0aW9uUXVldWUpOiB2b2lkIHsKJGNvbnRpbnVlID0gdHJ1ZTsKCmZvcmVhY2ggKCRwcm9taXNlc09yVmFsdWVzIGFzICRwcm9taXNlT3JWYWx1ZSkgewokY2FuY2VsbGF0aW9uUXVldWUtPmVucXVldWUoJHByb21pc2VPclZhbHVlKTsKCnJlc29sdmUoJHByb21pc2VPclZhbHVlKS0+dGhlbigkcmVzb2x2ZSwgJHJlamVjdCktPmZpbmFsbHkoZnVuY3Rpb24gKCkgdXNlICgmJGNvbnRpbnVlKTogdm9pZCB7CiRjb250aW51ZSA9IGZhbHNlOwp9KTsKCmlmICghJGNvbnRpbnVlICYmICFcaXNfYXJyYXkoJHByb21pc2VzT3JWYWx1ZXMpKSB7CmJyZWFrOwp9Cn0KfSwgJGNhbmNlbGxhdGlvblF1ZXVlKTsKfQoKCgoKCgoKCgoKCgoKCgoKZnVuY3Rpb24gYW55KGl0ZXJhYmxlICRwcm9taXNlc09yVmFsdWVzKTogUHJvbWlzZUludGVyZmFjZQp7CiRjYW5jZWxsYXRpb25RdWV1ZSA9IG5ldyBJbnRlcm5hbFxDYW5jZWxsYXRpb25RdWV1ZSgpOwoKCnJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoY2FsbGFibGUgJHJlc29sdmUsIGNhbGxhYmxlICRyZWplY3QpIHVzZSAoJHByb21pc2VzT3JWYWx1ZXMsICRjYW5jZWxsYXRpb25RdWV1ZSk6IHZvaWQgewokdG9SZWplY3QgPSAwOwokY29udGludWUgPSB0cnVlOwokcmVhc29ucyA9IFtdOwoKZm9yZWFjaCAoJHByb21pc2VzT3JWYWx1ZXMgYXMgJGkgPT4gJHByb21pc2VPclZhbHVlKSB7CiRjYW5jZWxsYXRpb25RdWV1ZS0+ZW5xdWV1ZSgkcHJvbWlzZU9yVmFsdWUpOworKyR0b1JlamVjdDsKCnJlc29sdmUoJHByb21pc2VPclZhbHVlKS0+dGhlbigKZnVuY3Rpb24gKCR2YWx1ZSkgdXNlICgkcmVzb2x2ZSwgJiRjb250aW51ZSk6IHZvaWQgewokY29udGludWUgPSBmYWxzZTsKJHJlc29sdmUoJHZhbHVlKTsKfSwKZnVuY3Rpb24gKFxUaHJvd2FibGUgJHJlYXNvbikgdXNlICgkaSwgJiRyZWFzb25zLCAmJHRvUmVqZWN0LCAkcmVqZWN0LCAmJGNvbnRpbnVlKTogdm9pZCB7CiRyZWFzb25zWyRpXSA9ICRyZWFzb247CgppZiAoMCA9PT0gLS0kdG9SZWplY3QgJiYgISRjb250aW51ZSkgewokcmVqZWN0KG5ldyBDb21wb3NpdGVFeGNlcHRpb24oCiRyZWFzb25zLAonQWxsIHByb21pc2VzIHJlamVjdGVkLicKKSk7Cn0KfQopOwoKaWYgKCEkY29udGludWUgJiYgIVxpc19hcnJheSgkcHJvbWlzZXNPclZhbHVlcykpIHsKYnJlYWs7Cn0KfQoKJGNvbnRpbnVlID0gZmFsc2U7CmlmICgkdG9SZWplY3QgPT09IDAgJiYgISRyZWFzb25zKSB7CiRyZWplY3QobmV3IEV4Y2VwdGlvblxMZW5ndGhFeGNlcHRpb24oCidNdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBpdGVtIGJ1dCBjb250YWlucyBvbmx5IDAgaXRlbXMuJwopKTsKfSBlbHNlaWYgKCR0b1JlamVjdCA9PT0gMCkgewokcmVqZWN0KG5ldyBDb21wb3NpdGVFeGNlcHRpb24oCiRyZWFzb25zLAonQWxsIHByb21pc2VzIHJlamVjdGVkLicKKSk7Cn0KfSwgJGNhbmNlbGxhdGlvblF1ZXVlKTsKfQoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpmdW5jdGlvbiBzZXRfcmVqZWN0aW9uX2hhbmRsZXIoP2NhbGxhYmxlICRjYWxsYmFjayk6ID9jYWxsYWJsZQp7CnN0YXRpYyAkY3VycmVudCA9IG51bGw7CiRwcmV2aW91cyA9ICRjdXJyZW50OwokY3VycmVudCA9ICRjYWxsYmFjazsKCnJldHVybiAkcHJldmlvdXM7Cn0KCgoKCmZ1bmN0aW9uIF9jaGVja1R5cGVoaW50KGNhbGxhYmxlICRjYWxsYmFjaywgXFRocm93YWJsZSAkcmVhc29uKTogYm9vbAp7CmlmIChcaXNfYXJyYXkoJGNhbGxiYWNrKSkgewokY2FsbGJhY2tSZWZsZWN0aW9uID0gbmV3IFxSZWZsZWN0aW9uTWV0aG9kKCRjYWxsYmFja1swXSwgJGNhbGxiYWNrWzFdKTsKfSBlbHNlaWYgKFxpc19vYmplY3QoJGNhbGxiYWNrKSAmJiAhJGNhbGxiYWNrIGluc3RhbmNlb2YgXENsb3N1cmUpIHsKJGNhbGxiYWNrUmVmbGVjdGlvbiA9IG5ldyBcUmVmbGVjdGlvbk1ldGhvZCgkY2FsbGJhY2ssICdfX2ludm9rZScpOwp9IGVsc2Ugewphc3NlcnQoJGNhbGxiYWNrIGluc3RhbmNlb2YgXENsb3N1cmUgfHwgXGlzX3N0cmluZygkY2FsbGJhY2spKTsKJGNhbGxiYWNrUmVmbGVjdGlvbiA9IG5ldyBcUmVmbGVjdGlvbkZ1bmN0aW9uKCRjYWxsYmFjayk7Cn0KCiRwYXJhbWV0ZXJzID0gJGNhbGxiYWNrUmVmbGVjdGlvbi0+Z2V0UGFyYW1ldGVycygpOwoKaWYgKCFpc3NldCgkcGFyYW1ldGVyc1swXSkpIHsKcmV0dXJuIHRydWU7Cn0KCiRleHBlY3RlZEV4Y2VwdGlvbiA9ICRwYXJhbWV0ZXJzWzBdOwoKCiR0eXBlID0gJGV4cGVjdGVkRXhjZXB0aW9uLT5nZXRUeXBlKCk7CgokaXNUeXBlVW5pb24gPSB0cnVlOwokdHlwZXMgPSBbXTsKCnN3aXRjaCAodHJ1ZSkgewpjYXNlICR0eXBlID09PSBudWxsOgpicmVhazsKY2FzZSAkdHlwZSBpbnN0YW5jZW9mIFxSZWZsZWN0aW9uTmFtZWRUeXBlOgokdHlwZXMgPSBbJHR5cGVdOwpicmVhazsKY2FzZSAkdHlwZSBpbnN0YW5jZW9mIFxSZWZsZWN0aW9uSW50ZXJzZWN0aW9uVHlwZToKJGlzVHlwZVVuaW9uID0gZmFsc2U7CmNhc2UgJHR5cGUgaW5zdGFuY2VvZiBcUmVmbGVjdGlvblVuaW9uVHlwZToKJHR5cGVzID0gJHR5cGUtPmdldFR5cGVzKCk7CmJyZWFrOwpkZWZhdWx0Ogp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdVbmV4cGVjdGVkIHJldHVybiB2YWx1ZSBvZiBSZWZsZWN0aW9uUGFyYW1ldGVyOjpnZXRUeXBlJyk7Cn0KCgppZiAoZW1wdHkoJHR5cGVzKSkgewpyZXR1cm4gdHJ1ZTsKfQoKZm9yZWFjaCAoJHR5cGVzIGFzICR0eXBlKSB7CgppZiAoJHR5cGUgaW5zdGFuY2VvZiBcUmVmbGVjdGlvbkludGVyc2VjdGlvblR5cGUpIHsKZm9yZWFjaCAoJHR5cGUtPmdldFR5cGVzKCkgYXMgJHR5cGVUb01hdGNoKSB7CmFzc2VydCgkdHlwZVRvTWF0Y2ggaW5zdGFuY2VvZiBcUmVmbGVjdGlvbk5hbWVkVHlwZSk7CiRuYW1lID0gJHR5cGVUb01hdGNoLT5nZXROYW1lKCk7CmlmICghKCRtYXRjaGVzID0gKCEkdHlwZVRvTWF0Y2gtPmlzQnVpbHRpbigpICYmICRyZWFzb24gaW5zdGFuY2VvZiAkbmFtZSkpKSB7CmJyZWFrOwp9Cn0KYXNzZXJ0KGlzc2V0KCRtYXRjaGVzKSk7Cn0gZWxzZSB7CmFzc2VydCgkdHlwZSBpbnN0YW5jZW9mIFxSZWZsZWN0aW9uTmFtZWRUeXBlKTsKJG5hbWUgPSAkdHlwZS0+Z2V0TmFtZSgpOwokbWF0Y2hlcyA9ICEkdHlwZS0+aXNCdWlsdGluKCkgJiYgJHJlYXNvbiBpbnN0YW5jZW9mICRuYW1lOwp9CgoKCmlmICgkbWF0Y2hlcykgewppZiAoJGlzVHlwZVVuaW9uKSB7CnJldHVybiB0cnVlOwp9Cn0gZWxzZSB7CmlmICghJGlzVHlwZVVuaW9uKSB7CnJldHVybiBmYWxzZTsKfQp9Cn0KCgoKcmV0dXJuICRpc1R5cGVVbmlvbiA/IGZhbHNlIDogdHJ1ZTsKfQo8P3BocAoKaWYgKCFcZnVuY3Rpb25fZXhpc3RzKCdSZWFjdFxQcm9taXNlXHJlc29sdmUnKSkgewpyZXF1aXJlIF9fRElSX18uJy9mdW5jdGlvbnMucGhwJzsKfQoKQ29weXJpZ2h0IChjKSAyMDExIEpvcmRpIEJvZ2dpYW5vCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCnRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTZWxkXEpzb25MaW50OwoKY2xhc3MgRHVwbGljYXRlS2V5RXhjZXB0aW9uIGV4dGVuZHMgUGFyc2luZ0V4Y2VwdGlvbgp7CgoKCnByb3RlY3RlZCAkZGV0YWlsczsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlLCAka2V5LCBhcnJheSAkZGV0YWlscykKewokZGV0YWlsc1sna2V5J10gPSAka2V5OwpwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlLCAkZGV0YWlscyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRLZXkoKQp7CnJldHVybiAkdGhpcy0+ZGV0YWlsc1sna2V5J107Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXRhaWxzKCkKewpyZXR1cm4gJHRoaXMtPmRldGFpbHM7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFNlbGRcSnNvbkxpbnQ7CnVzZSBzdGRDbGFzczsKCgoKCgoKCgoKCgoKCgpjbGFzcyBKc29uUGFyc2VyCnsKY29uc3QgREVURUNUX0tFWV9DT05GTElDVFMgPSAxOwpjb25zdCBBTExPV19EVVBMSUNBVEVfS0VZUyA9IDI7CmNvbnN0IFBBUlNFX1RPX0FTU09DID0gNDsKY29uc3QgQUxMT1dfQ09NTUVOVFMgPSA4Owpjb25zdCBBTExPV19EVVBMSUNBVEVfS0VZU19UT19BUlJBWSA9IDE2OwoKCnByaXZhdGUgJGxleGVyOwoKCgoKCnByaXZhdGUgJGZsYWdzOwoKcHJpdmF0ZSAkc3RhY2s7Cgpwcml2YXRlICR2c3RhY2s7IAoKcHJpdmF0ZSAkbHN0YWNrOyAKCgoKCnByaXZhdGUgJHN5bWJvbHMgPSBhcnJheSgKJ2Vycm9yJyA9PiAyLAonSlNPTlN0cmluZycgPT4gMywKJ1NUUklORycgPT4gNCwKJ0pTT05OdW1iZXInID0+IDUsCidOVU1CRVInID0+IDYsCidKU09OTnVsbExpdGVyYWwnID0+IDcsCidOVUxMJyA9PiA4LAonSlNPTkJvb2xlYW5MaXRlcmFsJyA9PiA5LAonVFJVRScgPT4gMTAsCidGQUxTRScgPT4gMTEsCidKU09OVGV4dCcgPT4gMTIsCidKU09OVmFsdWUnID0+IDEzLAonRU9GJyA9PiAxNCwKJ0pTT05PYmplY3QnID0+IDE1LAonSlNPTkFycmF5JyA9PiAxNiwKJ3snID0+IDE3LAonfScgPT4gMTgsCidKU09OTWVtYmVyTGlzdCcgPT4gMTksCidKU09OTWVtYmVyJyA9PiAyMCwKJzonID0+IDIxLAonLCcgPT4gMjIsCidbJyA9PiAyMywKJ10nID0+IDI0LAonSlNPTkVsZW1lbnRMaXN0JyA9PiAyNSwKJyRhY2NlcHQnID0+IDAsCickZW5kJyA9PiAxLAopOwoKCgoKCnByaXZhdGUgJHRlcm1pbmFsc18gPSBhcnJheSgKMiA9PiAiZXJyb3IiLAo0ID0+ICJTVFJJTkciLAo2ID0+ICJOVU1CRVIiLAo4ID0+ICJOVUxMIiwKMTAgPT4gIlRSVUUiLAoxMSA9PiAiRkFMU0UiLAoxNCA9PiAiRU9GIiwKMTcgPT4gInsiLAoxOCA9PiAifSIsCjIxID0+ICI6IiwKMjIgPT4gIiwiLAoyMyA9PiAiWyIsCjI0ID0+ICJdIiwKKTsKCgoKCgpwcml2YXRlICRwcm9kdWN0aW9uc18gPSBhcnJheSgKMSA9PiBhcnJheSgzLCAxKSwKMiA9PiBhcnJheSg1LCAxKSwKMyA9PiBhcnJheSg3LCAxKSwKNCA9PiBhcnJheSg5LCAxKSwKNSA9PiBhcnJheSg5LCAxKSwKNiA9PiBhcnJheSgxMiwgMiksCjcgPT4gYXJyYXkoMTMsIDEpLAo4ID0+IGFycmF5KDEzLCAxKSwKOSA9PiBhcnJheSgxMywgMSksCjEwID0+IGFycmF5KDEzLCAxKSwKMTEgPT4gYXJyYXkoMTMsIDEpLAoxMiA9PiBhcnJheSgxMywgMSksCjEzID0+IGFycmF5KDE1LCAyKSwKMTQgPT4gYXJyYXkoMTUsIDMpLAoxNSA9PiBhcnJheSgyMCwgMyksCjE2ID0+IGFycmF5KDE5LCAxKSwKMTcgPT4gYXJyYXkoMTksIDMpLAoxOCA9PiBhcnJheSgxNiwgMiksCjE5ID0+IGFycmF5KDE2LCAzKSwKMjAgPT4gYXJyYXkoMjUsIDEpLAoyMSA9PiBhcnJheSgyNSwgMykKKTsKCgoKCgpwcml2YXRlICR0YWJsZSA9IGFycmF5KAowID0+IGFycmF5KCAzID0+IDUsIDQgPT4gYXJyYXkoMSwxMiksIDUgPT4gNiwgNiA9PiBhcnJheSgxLDEzKSwgNyA9PiAzLCA4ID0+IGFycmF5KDEsOSksIDkgPT4gNCwgMTAgPT4gYXJyYXkoMSwxMCksIDExID0+IGFycmF5KDEsMTEpLCAxMiA9PiAxLCAxMyA9PiAyLCAxNSA9PiA3LCAxNiA9PiA4LCAxNyA9PiBhcnJheSgxLDE0KSwgMjMgPT4gYXJyYXkoMSwxNSkpLAoxID0+IGFycmF5KCAxID0+IGFycmF5KDMpKSwKMiA9PiBhcnJheSggMTQgPT4gYXJyYXkoMSwxNikpLAozID0+IGFycmF5KCAxNCA9PiBhcnJheSgyLDcpLCAxOCA9PiBhcnJheSgyLDcpLCAyMiA9PiBhcnJheSgyLDcpLCAyNCA9PiBhcnJheSgyLDcpKSwKNCA9PiBhcnJheSggMTQgPT4gYXJyYXkoMiw4KSwgMTggPT4gYXJyYXkoMiw4KSwgMjIgPT4gYXJyYXkoMiw4KSwgMjQgPT4gYXJyYXkoMiw4KSksCjUgPT4gYXJyYXkoIDE0ID0+IGFycmF5KDIsOSksIDE4ID0+IGFycmF5KDIsOSksIDIyID0+IGFycmF5KDIsOSksIDI0ID0+IGFycmF5KDIsOSkpLAo2ID0+IGFycmF5KCAxNCA9PiBhcnJheSgyLDEwKSwgMTggPT4gYXJyYXkoMiwxMCksIDIyID0+IGFycmF5KDIsMTApLCAyNCA9PiBhcnJheSgyLDEwKSksCjcgPT4gYXJyYXkoIDE0ID0+IGFycmF5KDIsMTEpLCAxOCA9PiBhcnJheSgyLDExKSwgMjIgPT4gYXJyYXkoMiwxMSksIDI0ID0+IGFycmF5KDIsMTEpKSwKOCA9PiBhcnJheSggMTQgPT4gYXJyYXkoMiwxMiksIDE4ID0+IGFycmF5KDIsMTIpLCAyMiA9PiBhcnJheSgyLDEyKSwgMjQgPT4gYXJyYXkoMiwxMikpLAo5ID0+IGFycmF5KCAxNCA9PiBhcnJheSgyLDMpLCAxOCA9PiBhcnJheSgyLDMpLCAyMiA9PiBhcnJheSgyLDMpLCAyNCA9PiBhcnJheSgyLDMpKSwKMTAgPT4gYXJyYXkoIDE0ID0+IGFycmF5KDIsNCksIDE4ID0+IGFycmF5KDIsNCksIDIyID0+IGFycmF5KDIsNCksIDI0ID0+IGFycmF5KDIsNCkpLAoxMSA9PiBhcnJheSggMTQgPT4gYXJyYXkoMiw1KSwgMTggPT4gYXJyYXkoMiw1KSwgMjIgPT4gYXJyYXkoMiw1KSwgMjQgPT4gYXJyYXkoMiw1KSksCjEyID0+IGFycmF5KCAxNCA9PiBhcnJheSgyLDEpLCAxOCA9PiBhcnJheSgyLDEpLCAyMSA9PiBhcnJheSgyLDEpLCAyMiA9PiBhcnJheSgyLDEpLCAyNCA9PiBhcnJheSgyLDEpKSwKMTMgPT4gYXJyYXkoIDE0ID0+IGFycmF5KDIsMiksIDE4ID0+IGFycmF5KDIsMiksIDIyID0+IGFycmF5KDIsMiksIDI0ID0+IGFycmF5KDIsMikpLAoxNCA9PiBhcnJheSggMyA9PiAyMCwgNCA9PiBhcnJheSgxLDEyKSwgMTggPT4gYXJyYXkoMSwxNyksIDE5ID0+IDE4LCAyMCA9PiAxOSApLAoxNSA9PiBhcnJheSggMyA9PiA1LCA0ID0+IGFycmF5KDEsMTIpLCA1ID0+IDYsIDYgPT4gYXJyYXkoMSwxMyksIDcgPT4gMywgOCA9PiBhcnJheSgxLDkpLCA5ID0+IDQsIDEwID0+IGFycmF5KDEsMTApLCAxMSA9PiBhcnJheSgxLDExKSwgMTMgPT4gMjMsIDE1ID0+IDcsIDE2ID0+IDgsIDE3ID0+IGFycmF5KDEsMTQpLCAyMyA9PiBhcnJheSgxLDE1KSwgMjQgPT4gYXJyYXkoMSwyMSksIDI1ID0+IDIyICksCjE2ID0+IGFycmF5KCAxID0+IGFycmF5KDIsNikpLAoxNyA9PiBhcnJheSggMTQgPT4gYXJyYXkoMiwxMyksIDE4ID0+IGFycmF5KDIsMTMpLCAyMiA9PiBhcnJheSgyLDEzKSwgMjQgPT4gYXJyYXkoMiwxMykpLAoxOCA9PiBhcnJheSggMTggPT4gYXJyYXkoMSwyNCksIDIyID0+IGFycmF5KDEsMjUpKSwKMTkgPT4gYXJyYXkoIDE4ID0+IGFycmF5KDIsMTYpLCAyMiA9PiBhcnJheSgyLDE2KSksCjIwID0+IGFycmF5KCAyMSA9PiBhcnJheSgxLDI2KSksCjIxID0+IGFycmF5KCAxNCA9PiBhcnJheSgyLDE4KSwgMTggPT4gYXJyYXkoMiwxOCksIDIyID0+IGFycmF5KDIsMTgpLCAyNCA9PiBhcnJheSgyLDE4KSksCjIyID0+IGFycmF5KCAyMiA9PiBhcnJheSgxLDI4KSwgMjQgPT4gYXJyYXkoMSwyNykpLAoyMyA9PiBhcnJheSggMjIgPT4gYXJyYXkoMiwyMCksIDI0ID0+IGFycmF5KDIsMjApKSwKMjQgPT4gYXJyYXkoIDE0ID0+IGFycmF5KDIsMTQpLCAxOCA9PiBhcnJheSgyLDE0KSwgMjIgPT4gYXJyYXkoMiwxNCksIDI0ID0+IGFycmF5KDIsMTQpKSwKMjUgPT4gYXJyYXkoIDMgPT4gMjAsIDQgPT4gYXJyYXkoMSwxMiksIDIwID0+IDI5ICksCjI2ID0+IGFycmF5KCAzID0+IDUsIDQgPT4gYXJyYXkoMSwxMiksIDUgPT4gNiwgNiA9PiBhcnJheSgxLDEzKSwgNyA9PiAzLCA4ID0+IGFycmF5KDEsOSksIDkgPT4gNCwgMTAgPT4gYXJyYXkoMSwxMCksIDExID0+IGFycmF5KDEsMTEpLCAxMyA9PiAzMCwgMTUgPT4gNywgMTYgPT4gOCwgMTcgPT4gYXJyYXkoMSwxNCksIDIzID0+IGFycmF5KDEsMTUpKSwKMjcgPT4gYXJyYXkoIDE0ID0+IGFycmF5KDIsMTkpLCAxOCA9PiBhcnJheSgyLDE5KSwgMjIgPT4gYXJyYXkoMiwxOSksIDI0ID0+IGFycmF5KDIsMTkpKSwKMjggPT4gYXJyYXkoIDMgPT4gNSwgNCA9PiBhcnJheSgxLDEyKSwgNSA9PiA2LCA2ID0+IGFycmF5KDEsMTMpLCA3ID0+IDMsIDggPT4gYXJyYXkoMSw5KSwgOSA9PiA0LCAxMCA9PiBhcnJheSgxLDEwKSwgMTEgPT4gYXJyYXkoMSwxMSksIDEzID0+IDMxLCAxNSA9PiA3LCAxNiA9PiA4LCAxNyA9PiBhcnJheSgxLDE0KSwgMjMgPT4gYXJyYXkoMSwxNSkpLAoyOSA9PiBhcnJheSggMTggPT4gYXJyYXkoMiwxNyksIDIyID0+IGFycmF5KDIsMTcpKSwKMzAgPT4gYXJyYXkoIDE4ID0+IGFycmF5KDIsMTUpLCAyMiA9PiBhcnJheSgyLDE1KSksCjMxID0+IGFycmF5KCAyMiA9PiBhcnJheSgyLDIxKSwgMjQgPT4gYXJyYXkoMiwyMSkpLAopOwoKCgoKCnByaXZhdGUgJGRlZmF1bHRBY3Rpb25zID0gYXJyYXkoCjE2ID0+IGFycmF5KDIsIDYpCik7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGxpbnQoJGlucHV0LCAkZmxhZ3MgPSAwKQp7CnRyeSB7CiR0aGlzLT5wYXJzZSgkaW5wdXQsICRmbGFncyk7Cn0gY2F0Y2ggKFBhcnNpbmdFeGNlcHRpb24gJGUpIHsKcmV0dXJuICRlOwp9CnJldHVybiBudWxsOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwYXJzZSgkaW5wdXQsICRmbGFncyA9IDApCnsKaWYgKCgkZmxhZ3MgJiBzZWxmOjpBTExPV19EVVBMSUNBVEVfS0VZU19UT19BUlJBWSkgJiYgKCRmbGFncyAmIHNlbGY6OkFMTE9XX0RVUExJQ0FURV9LRVlTKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignT25seSBvbmUgb2YgQUxMT1dfRFVQTElDQVRFX0tFWVMgYW5kIEFMTE9XX0RVUExJQ0FURV9LRVlTX1RPX0FSUkFZIGNhbiBiZSB1c2VkLCB5b3UgcGFzc2VkIGluIGJvdGguJyk7Cn0KCiR0aGlzLT5mYWlsT25CT00oJGlucHV0KTsKCiR0aGlzLT5mbGFncyA9ICRmbGFnczsKCiR0aGlzLT5zdGFjayA9IGFycmF5KDApOwokdGhpcy0+dnN0YWNrID0gYXJyYXkobnVsbCk7CiR0aGlzLT5sc3RhY2sgPSBhcnJheSgpOwoKJHl5dGV4dCA9ICcnOwokeXlsaW5lbm8gPSAwOwokeXlsZW5nID0gMDsKCiRyZWNvdmVyaW5nID0gMDsKCiR0aGlzLT5sZXhlciA9IG5ldyBMZXhlcigkZmxhZ3MpOwokdGhpcy0+bGV4ZXItPnNldElucHV0KCRpbnB1dCk7CgokeXlsb2MgPSAkdGhpcy0+bGV4ZXItPnl5bGxvYzsKJHRoaXMtPmxzdGFja1tdID0gJHl5bG9jOwoKJHN5bWJvbCA9IG51bGw7CiRwcmVFcnJvclN5bWJvbCA9IG51bGw7CiRhY3Rpb24gPSBudWxsOwokYSA9IG51bGw7CiRyID0gbnVsbDsKJHAgPSBudWxsOwokbGVuID0gbnVsbDsKJG5ld1N0YXRlID0gbnVsbDsKJGV4cGVjdGVkID0gbnVsbDsKCiRlcnJTdHIgPSBudWxsOwoKd2hpbGUgKHRydWUpIHsKCiRzdGF0ZSA9ICR0aGlzLT5zdGFja1tcY291bnQoJHRoaXMtPnN0YWNrKS0xXTsKCgppZiAoaXNzZXQoJHRoaXMtPmRlZmF1bHRBY3Rpb25zWyRzdGF0ZV0pKSB7CiRhY3Rpb24gPSAkdGhpcy0+ZGVmYXVsdEFjdGlvbnNbJHN0YXRlXTsKfSBlbHNlIHsKaWYgKCRzeW1ib2wgPT09IG51bGwpIHsKJHN5bWJvbCA9ICR0aGlzLT5sZXhlci0+bGV4KCk7Cn0KCgokYWN0aW9uID0gaXNzZXQoJHRoaXMtPnRhYmxlWyRzdGF0ZV1bJHN5bWJvbF0pID8gJHRoaXMtPnRhYmxlWyRzdGF0ZV1bJHN5bWJvbF0gOiBmYWxzZTsKfQoKCmlmICghJGFjdGlvbiB8fCAhJGFjdGlvblswXSkgewphc3NlcnQoaXNzZXQoJHN5bWJvbCkpOwppZiAoISRyZWNvdmVyaW5nKSB7CgokZXhwZWN0ZWQgPSBhcnJheSgpOwpmb3JlYWNoICgkdGhpcy0+dGFibGVbJHN0YXRlXSBhcyAkcCA9PiAkaWdub3JlKSB7CmlmIChpc3NldCgkdGhpcy0+dGVybWluYWxzX1skcF0pICYmICRwID4gMikgewokZXhwZWN0ZWRbXSA9ICInIiAuICR0aGlzLT50ZXJtaW5hbHNfWyRwXSAuICInIjsKfQp9CgokbWVzc2FnZSA9IG51bGw7CmlmIChcaW5fYXJyYXkoIidTVFJJTkcnIiwgJGV4cGVjdGVkKSAmJiBcaW5fYXJyYXkoc3Vic3RyKCR0aGlzLT5sZXhlci0+bWF0Y2gsIDAsIDEpLCBhcnJheSgnIicsICInIikpKSB7CiRtZXNzYWdlID0gIkludmFsaWQgc3RyaW5nIjsKaWYgKCInIiA9PT0gc3Vic3RyKCR0aGlzLT5sZXhlci0+bWF0Y2gsIDAsIDEpKSB7CiRtZXNzYWdlIC49ICIsIGl0IGFwcGVhcnMgeW91IHVzZWQgc2luZ2xlIHF1b3RlcyBpbnN0ZWFkIG9mIGRvdWJsZSBxdW90ZXMiOwp9IGVsc2VpZiAocHJlZ19tYXRjaCgneyIuKz8oXFxcXFteImJmbnJ0L1xcXFx1XSguLi4pPyl9JywgJHRoaXMtPmxleGVyLT5nZXRGdWxsVXBjb21pbmdJbnB1dCgpLCAkbWF0Y2gpKSB7CiRtZXNzYWdlIC49ICIsIGl0IGFwcGVhcnMgeW91IGhhdmUgYW4gdW5lc2NhcGVkIGJhY2tzbGFzaCBhdDogIi4kbWF0Y2hbMV07Cn0gZWxzZWlmIChwcmVnX21hdGNoKCd7Iig/OlteIl0rfFxcXFwiKSokfW0nLCAkdGhpcy0+bGV4ZXItPmdldEZ1bGxVcGNvbWluZ0lucHV0KCkpKSB7CiRtZXNzYWdlIC49ICIsIGl0IGFwcGVhcnMgeW91IGZvcmdvdCB0byB0ZXJtaW5hdGUgYSBzdHJpbmcsIG9yIGF0dGVtcHRlZCB0byB3cml0ZSBhIG11bHRpbGluZSBzdHJpbmcgd2hpY2ggaXMgaW52YWxpZCI7Cn0KfQoKJGVyclN0ciA9ICdQYXJzZSBlcnJvciBvbiBsaW5lICcgLiAoJHl5bGluZW5vKzEpIC4gIjpcbiI7CiRlcnJTdHIgLj0gJHRoaXMtPmxleGVyLT5zaG93UG9zaXRpb24oKSAuICJcbiI7CmlmICgkbWVzc2FnZSkgewokZXJyU3RyIC49ICRtZXNzYWdlOwp9IGVsc2UgewokZXJyU3RyIC49IChcY291bnQoJGV4cGVjdGVkKSA+IDEpID8gIkV4cGVjdGVkIG9uZSBvZjogIiA6ICJFeHBlY3RlZDogIjsKJGVyclN0ciAuPSBpbXBsb2RlKCcsICcsICRleHBlY3RlZCk7Cn0KCmlmICgnLCcgPT09IHN1YnN0cih0cmltKCR0aGlzLT5sZXhlci0+Z2V0UGFzdElucHV0KCkpLCAtMSkpIHsKJGVyclN0ciAuPSAiIC0gSXQgYXBwZWFycyB5b3UgaGF2ZSBhbiBleHRyYSB0cmFpbGluZyBjb21tYSI7Cn0KCiR0aGlzLT5wYXJzZUVycm9yKCRlcnJTdHIsIGFycmF5KAondGV4dCcgPT4gJHRoaXMtPmxleGVyLT5tYXRjaCwKJ3Rva2VuJyA9PiBpc3NldCgkdGhpcy0+dGVybWluYWxzX1skc3ltYm9sXSkgPyAkdGhpcy0+dGVybWluYWxzX1skc3ltYm9sXSA6ICRzeW1ib2wsCidsaW5lJyA9PiAkdGhpcy0+bGV4ZXItPnl5bGluZW5vLAonbG9jJyA9PiAkeXlsb2MsCidleHBlY3RlZCcgPT4gJGV4cGVjdGVkLAopKTsKfQoKCmlmICgkcmVjb3ZlcmluZyA9PSAzKSB7CmlmICgkc3ltYm9sID09PSBMZXhlcjo6RU9GKSB7CnRocm93IG5ldyBQYXJzaW5nRXhjZXB0aW9uKCRlcnJTdHIgPzogJ1BhcnNpbmcgaGFsdGVkLicpOwp9CgoKJHl5bGVuZyA9ICR0aGlzLT5sZXhlci0+eXlsZW5nOwokeXl0ZXh0ID0gJHRoaXMtPmxleGVyLT55eXRleHQ7CiR5eWxpbmVubyA9ICR0aGlzLT5sZXhlci0+eXlsaW5lbm87CiR5eWxvYyA9ICR0aGlzLT5sZXhlci0+eXlsbG9jOwokc3ltYm9sID0gJHRoaXMtPmxleGVyLT5sZXgoKTsKfQoKCndoaWxlICh0cnVlKSB7CgppZiAoXGFycmF5X2tleV9leGlzdHMoTGV4ZXI6OlRfRVJST1IsICR0aGlzLT50YWJsZVskc3RhdGVdKSkgewpicmVhazsKfQppZiAoJHN0YXRlID09IDApIHsKdGhyb3cgbmV3IFBhcnNpbmdFeGNlcHRpb24oJGVyclN0ciA/OiAnUGFyc2luZyBoYWx0ZWQuJyk7Cn0KJHRoaXMtPnBvcFN0YWNrKDEpOwokc3RhdGUgPSAkdGhpcy0+c3RhY2tbXGNvdW50KCR0aGlzLT5zdGFjayktMV07Cn0KCiRwcmVFcnJvclN5bWJvbCA9ICRzeW1ib2w7IAokc3ltYm9sID0gTGV4ZXI6OlRfRVJST1I7IAokc3RhdGUgPSAkdGhpcy0+c3RhY2tbXGNvdW50KCR0aGlzLT5zdGFjayktMV07CgokYWN0aW9uID0gaXNzZXQoJHRoaXMtPnRhYmxlWyRzdGF0ZV1bTGV4ZXI6OlRfRVJST1JdKSA/ICR0aGlzLT50YWJsZVskc3RhdGVdW0xleGVyOjpUX0VSUk9SXSA6IGZhbHNlOwppZiAoJGFjdGlvbiA9PT0gZmFsc2UpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignTm8gdGFibGUgdmFsdWUgZm91bmQgZm9yICcuJHN0YXRlLicgPT4gJy5MZXhlcjo6VF9FUlJPUik7Cn0KJHJlY292ZXJpbmcgPSAzOyAKfQoKCmlmIChcaXNfYXJyYXkoJGFjdGlvblswXSkgJiYgXGNvdW50KCRhY3Rpb24pID4gMSkgewp0aHJvdyBuZXcgUGFyc2luZ0V4Y2VwdGlvbignUGFyc2UgRXJyb3I6IG11bHRpcGxlIGFjdGlvbnMgcG9zc2libGUgYXQgc3RhdGU6ICcgLiAkc3RhdGUgLiAnLCB0b2tlbjogJyAuICRzeW1ib2wpOwp9Cgpzd2l0Y2ggKCRhY3Rpb25bMF0pIHsKY2FzZSAxOiAKYXNzZXJ0KGlzc2V0KCRzeW1ib2wpKTsKJHRoaXMtPnN0YWNrW10gPSAkc3ltYm9sOwokdGhpcy0+dnN0YWNrW10gPSAkdGhpcy0+bGV4ZXItPnl5dGV4dDsKJHRoaXMtPmxzdGFja1tdID0gJHRoaXMtPmxleGVyLT55eWxsb2M7CiR0aGlzLT5zdGFja1tdID0gJGFjdGlvblsxXTsgCiRzeW1ib2wgPSBudWxsOwppZiAoISRwcmVFcnJvclN5bWJvbCkgeyAKJHl5bGVuZyA9ICR0aGlzLT5sZXhlci0+eXlsZW5nOwokeXl0ZXh0ID0gJHRoaXMtPmxleGVyLT55eXRleHQ7CiR5eWxpbmVubyA9ICR0aGlzLT5sZXhlci0+eXlsaW5lbm87CiR5eWxvYyA9ICR0aGlzLT5sZXhlci0+eXlsbG9jOwppZiAoJHJlY292ZXJpbmcgPiAwKSB7CiRyZWNvdmVyaW5nLS07Cn0KfSBlbHNlIHsgCiRzeW1ib2wgPSAkcHJlRXJyb3JTeW1ib2w7CiRwcmVFcnJvclN5bWJvbCA9IG51bGw7Cn0KYnJlYWs7CgpjYXNlIDI6IAokbGVuID0gJHRoaXMtPnByb2R1Y3Rpb25zX1skYWN0aW9uWzFdXVsxXTsKCgokY3VycmVudFRva2VuID0gJHRoaXMtPnZzdGFja1tcY291bnQoJHRoaXMtPnZzdGFjaykgLSAkbGVuXTsgCgokcG9zaXRpb24gPSBhcnJheSggCidmaXJzdF9saW5lJyA9PiAkdGhpcy0+bHN0YWNrW1xjb3VudCgkdGhpcy0+bHN0YWNrKSAtICgkbGVuID86IDEpXVsnZmlyc3RfbGluZSddLAonbGFzdF9saW5lJyA9PiAkdGhpcy0+bHN0YWNrW1xjb3VudCgkdGhpcy0+bHN0YWNrKSAtIDFdWydsYXN0X2xpbmUnXSwKJ2ZpcnN0X2NvbHVtbicgPT4gJHRoaXMtPmxzdGFja1tcY291bnQoJHRoaXMtPmxzdGFjaykgLSAoJGxlbiA/OiAxKV1bJ2ZpcnN0X2NvbHVtbiddLAonbGFzdF9jb2x1bW4nID0+ICR0aGlzLT5sc3RhY2tbXGNvdW50KCR0aGlzLT5sc3RhY2spIC0gMV1bJ2xhc3RfY29sdW1uJ10sCik7Cmxpc3QoJG5ld1Rva2VuLCAkYWN0aW9uUmVzdWx0KSA9ICR0aGlzLT5wZXJmb3JtQWN0aW9uKCRjdXJyZW50VG9rZW4sICR5eXRleHQsICR5eWxlbmcsICR5eWxpbmVubywgJGFjdGlvblsxXSk7CgppZiAoISRhY3Rpb25SZXN1bHQgaW5zdGFuY2VvZiBVbmRlZmluZWQpIHsKcmV0dXJuICRhY3Rpb25SZXN1bHQ7Cn0KCmlmICgkbGVuKSB7CiR0aGlzLT5wb3BTdGFjaygkbGVuKTsKfQoKJHRoaXMtPnN0YWNrW10gPSAkdGhpcy0+cHJvZHVjdGlvbnNfWyRhY3Rpb25bMV1dWzBdOyAKJHRoaXMtPnZzdGFja1tdID0gJG5ld1Rva2VuOwokdGhpcy0+bHN0YWNrW10gPSAkcG9zaXRpb247CgokbmV3U3RhdGUgPSAkdGhpcy0+dGFibGVbJHRoaXMtPnN0YWNrW1xjb3VudCgkdGhpcy0+c3RhY2spLTJdXVskdGhpcy0+c3RhY2tbXGNvdW50KCR0aGlzLT5zdGFjayktMV1dOwokdGhpcy0+c3RhY2tbXSA9ICRuZXdTdGF0ZTsKYnJlYWs7CgpjYXNlIDM6IAoKcmV0dXJuIHRydWU7Cn0KfQp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwYXJzZUVycm9yKCRzdHIsICRoYXNoID0gbnVsbCkKewp0aHJvdyBuZXcgUGFyc2luZ0V4Y2VwdGlvbigkc3RyLCAkaGFzaCA/OiBhcnJheSgpKTsKfQoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHBlcmZvcm1BY3Rpb24oJGN1cnJlbnRUb2tlbiwgJHl5dGV4dCwgJHl5bGVuZywgJHl5bGluZW5vLCAkeXlzdGF0ZSkKewokdG9rZW4gPSAkY3VycmVudFRva2VuOwoKJGxlbiA9IFxjb3VudCgkdGhpcy0+dnN0YWNrKSAtIDE7CnN3aXRjaCAoJHl5c3RhdGUpIHsKY2FzZSAxOgokeXl0ZXh0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCd7KD86XFxcXFsiYmZucnQvXFxcXF18XFxcXHVbYS1mQS1GMC05XXs0fSl9JywgYXJyYXkoJHRoaXMsICdzdHJpbmdJbnRlcnBvbGF0aW9uJyksICR5eXRleHQpOwokdG9rZW4gPSAkeXl0ZXh0OwpicmVhazsKY2FzZSAyOgppZiAoc3RycG9zKCR5eXRleHQsICdlJykgIT09IGZhbHNlIHx8IHN0cnBvcygkeXl0ZXh0LCAnRScpICE9PSBmYWxzZSkgewokdG9rZW4gPSBcZmxvYXR2YWwoJHl5dGV4dCk7Cn0gZWxzZSB7CiR0b2tlbiA9IHN0cnBvcygkeXl0ZXh0LCAnLicpID09PSBmYWxzZSA/IFxpbnR2YWwoJHl5dGV4dCkgOiBcZmxvYXR2YWwoJHl5dGV4dCk7Cn0KYnJlYWs7CmNhc2UgMzoKJHRva2VuID0gbnVsbDsKYnJlYWs7CmNhc2UgNDoKJHRva2VuID0gdHJ1ZTsKYnJlYWs7CmNhc2UgNToKJHRva2VuID0gZmFsc2U7CmJyZWFrOwpjYXNlIDY6CiR0b2tlbiA9ICR0aGlzLT52c3RhY2tbJGxlbi0xXTsKCnJldHVybiBhcnJheSgkdG9rZW4sICR0b2tlbik7CmNhc2UgMTM6CmlmICgkdGhpcy0+ZmxhZ3MgJiBzZWxmOjpQQVJTRV9UT19BU1NPQykgewokdG9rZW4gPSBhcnJheSgpOwp9IGVsc2UgewokdG9rZW4gPSBuZXcgc3RkQ2xhc3M7Cn0KYnJlYWs7CmNhc2UgMTQ6CiR0b2tlbiA9ICR0aGlzLT52c3RhY2tbJGxlbi0xXTsKYnJlYWs7CmNhc2UgMTU6CiR0b2tlbiA9IGFycmF5KCR0aGlzLT52c3RhY2tbJGxlbi0yXSwgJHRoaXMtPnZzdGFja1skbGVuXSk7CmJyZWFrOwpjYXNlIDE2Ogphc3NlcnQoXGlzX2FycmF5KCR0aGlzLT52c3RhY2tbJGxlbl0pKTsKaWYgKFBIUF9WRVJTSU9OX0lEIDwgNzAxMDApIHsKJHByb3BlcnR5ID0gJHRoaXMtPnZzdGFja1skbGVuXVswXSA9PT0gJycgPyAnX2VtcHR5XycgOiAkdGhpcy0+dnN0YWNrWyRsZW5dWzBdOwp9IGVsc2UgewokcHJvcGVydHkgPSAkdGhpcy0+dnN0YWNrWyRsZW5dWzBdOwp9CmlmICgkdGhpcy0+ZmxhZ3MgJiBzZWxmOjpQQVJTRV9UT19BU1NPQykgewokdG9rZW4gPSBhcnJheSgpOwokdG9rZW5bJHByb3BlcnR5XSA9ICR0aGlzLT52c3RhY2tbJGxlbl1bMV07Cn0gZWxzZSB7CiR0b2tlbiA9IG5ldyBzdGRDbGFzczsKJHRva2VuLT4kcHJvcGVydHkgPSAkdGhpcy0+dnN0YWNrWyRsZW5dWzFdOwp9CmJyZWFrOwpjYXNlIDE3Ogphc3NlcnQoXGlzX2FycmF5KCR0aGlzLT52c3RhY2tbJGxlbl0pKTsKaWYgKCR0aGlzLT5mbGFncyAmIHNlbGY6OlBBUlNFX1RPX0FTU09DKSB7CmFzc2VydChcaXNfYXJyYXkoJHRoaXMtPnZzdGFja1skbGVuLTJdKSk7CiR0b2tlbiA9JiAkdGhpcy0+dnN0YWNrWyRsZW4tMl07CiRrZXkgPSAkdGhpcy0+dnN0YWNrWyRsZW5dWzBdOwppZiAoKCR0aGlzLT5mbGFncyAmIHNlbGY6OkRFVEVDVF9LRVlfQ09ORkxJQ1RTKSAmJiBpc3NldCgkdGhpcy0+dnN0YWNrWyRsZW4tMl1bJGtleV0pKSB7CiRlcnJTdHIgPSAnUGFyc2UgZXJyb3Igb24gbGluZSAnIC4gKCR5eWxpbmVubysxKSAuICI6XG4iOwokZXJyU3RyIC49ICR0aGlzLT5sZXhlci0+c2hvd1Bvc2l0aW9uKCkgLiAiXG4iOwokZXJyU3RyIC49ICJEdXBsaWNhdGUga2V5OiAiLiR0aGlzLT52c3RhY2tbJGxlbl1bMF07CnRocm93IG5ldyBEdXBsaWNhdGVLZXlFeGNlcHRpb24oJGVyclN0ciwgJHRoaXMtPnZzdGFja1skbGVuXVswXSwgYXJyYXkoJ2xpbmUnID0+ICR5eWxpbmVubysxKSk7Cn0KaWYgKCgkdGhpcy0+ZmxhZ3MgJiBzZWxmOjpBTExPV19EVVBMSUNBVEVfS0VZUykgJiYgaXNzZXQoJHRoaXMtPnZzdGFja1skbGVuLTJdWyRrZXldKSkgewokZHVwbGljYXRlQ291bnQgPSAxOwpkbyB7CiRkdXBsaWNhdGVLZXkgPSAka2V5IC4gJy4nIC4gJGR1cGxpY2F0ZUNvdW50Kys7Cn0gd2hpbGUgKGlzc2V0KCR0aGlzLT52c3RhY2tbJGxlbi0yXVskZHVwbGljYXRlS2V5XSkpOwokdGhpcy0+dnN0YWNrWyRsZW4tMl1bJGR1cGxpY2F0ZUtleV0gPSAkdGhpcy0+dnN0YWNrWyRsZW5dWzFdOwp9IGVsc2VpZiAoKCR0aGlzLT5mbGFncyAmIHNlbGY6OkFMTE9XX0RVUExJQ0FURV9LRVlTX1RPX0FSUkFZKSAmJiBpc3NldCgkdGhpcy0+dnN0YWNrWyRsZW4tMl1bJGtleV0pKSB7CmlmICghaXNzZXQoJHRoaXMtPnZzdGFja1skbGVuLTJdWyRrZXldWydfX2R1cGxpY2F0ZXNfXyddKSB8fCAhaXNfYXJyYXkoJHRoaXMtPnZzdGFja1skbGVuLTJdWyRrZXldWydfX2R1cGxpY2F0ZXNfXyddKSkgewokdGhpcy0+dnN0YWNrWyRsZW4tMl1bJGtleV0gPSBhcnJheSgnX19kdXBsaWNhdGVzX18nID0+IGFycmF5KCR0aGlzLT52c3RhY2tbJGxlbi0yXVska2V5XSkpOwp9CiR0aGlzLT52c3RhY2tbJGxlbi0yXVska2V5XVsnX19kdXBsaWNhdGVzX18nXVtdID0gJHRoaXMtPnZzdGFja1skbGVuXVsxXTsKfSBlbHNlIHsKJHRoaXMtPnZzdGFja1skbGVuLTJdWyRrZXldID0gJHRoaXMtPnZzdGFja1skbGVuXVsxXTsKfQp9IGVsc2Ugewphc3NlcnQoJHRoaXMtPnZzdGFja1skbGVuLTJdIGluc3RhbmNlb2Ygc3RkQ2xhc3MpOwokdG9rZW4gPSAkdGhpcy0+dnN0YWNrWyRsZW4tMl07CmlmIChQSFBfVkVSU0lPTl9JRCA8IDcwMTAwKSB7CiRrZXkgPSAkdGhpcy0+dnN0YWNrWyRsZW5dWzBdID09PSAnJyA/ICdfZW1wdHlfJyA6ICR0aGlzLT52c3RhY2tbJGxlbl1bMF07Cn0gZWxzZSB7CiRrZXkgPSAkdGhpcy0+dnN0YWNrWyRsZW5dWzBdOwp9CmlmICgoJHRoaXMtPmZsYWdzICYgc2VsZjo6REVURUNUX0tFWV9DT05GTElDVFMpICYmIGlzc2V0KCR0aGlzLT52c3RhY2tbJGxlbi0yXS0+JGtleSkpIHsKJGVyclN0ciA9ICdQYXJzZSBlcnJvciBvbiBsaW5lICcgLiAoJHl5bGluZW5vKzEpIC4gIjpcbiI7CiRlcnJTdHIgLj0gJHRoaXMtPmxleGVyLT5zaG93UG9zaXRpb24oKSAuICJcbiI7CiRlcnJTdHIgLj0gIkR1cGxpY2F0ZSBrZXk6ICIuJHRoaXMtPnZzdGFja1skbGVuXVswXTsKdGhyb3cgbmV3IER1cGxpY2F0ZUtleUV4Y2VwdGlvbigkZXJyU3RyLCAkdGhpcy0+dnN0YWNrWyRsZW5dWzBdLCBhcnJheSgnbGluZScgPT4gJHl5bGluZW5vKzEpKTsKfQppZiAoKCR0aGlzLT5mbGFncyAmIHNlbGY6OkFMTE9XX0RVUExJQ0FURV9LRVlTKSAmJiBpc3NldCgkdGhpcy0+dnN0YWNrWyRsZW4tMl0tPiRrZXkpKSB7CiRkdXBsaWNhdGVDb3VudCA9IDE7CmRvIHsKJGR1cGxpY2F0ZUtleSA9ICRrZXkgLiAnLicgLiAkZHVwbGljYXRlQ291bnQrKzsKfSB3aGlsZSAoaXNzZXQoJHRoaXMtPnZzdGFja1skbGVuLTJdLT4kZHVwbGljYXRlS2V5KSk7CiR0aGlzLT52c3RhY2tbJGxlbi0yXS0+JGR1cGxpY2F0ZUtleSA9ICR0aGlzLT52c3RhY2tbJGxlbl1bMV07Cn0gZWxzZWlmICgoJHRoaXMtPmZsYWdzICYgc2VsZjo6QUxMT1dfRFVQTElDQVRFX0tFWVNfVE9fQVJSQVkpICYmIGlzc2V0KCR0aGlzLT52c3RhY2tbJGxlbi0yXS0+JGtleSkpIHsKaWYgKCFpc3NldCgkdGhpcy0+dnN0YWNrWyRsZW4tMl0tPiRrZXktPl9fZHVwbGljYXRlc19fKSkgewokdGhpcy0+dnN0YWNrWyRsZW4tMl0tPiRrZXkgPSAob2JqZWN0KSBhcnJheSgnX19kdXBsaWNhdGVzX18nID0+IGFycmF5KCR0aGlzLT52c3RhY2tbJGxlbi0yXS0+JGtleSkpOwp9CiR0aGlzLT52c3RhY2tbJGxlbi0yXS0+JGtleS0+X19kdXBsaWNhdGVzX19bXSA9ICR0aGlzLT52c3RhY2tbJGxlbl1bMV07Cn0gZWxzZSB7CiR0aGlzLT52c3RhY2tbJGxlbi0yXS0+JGtleSA9ICR0aGlzLT52c3RhY2tbJGxlbl1bMV07Cn0KfQpicmVhazsKY2FzZSAxODoKJHRva2VuID0gYXJyYXkoKTsKYnJlYWs7CmNhc2UgMTk6CiR0b2tlbiA9ICR0aGlzLT52c3RhY2tbJGxlbi0xXTsKYnJlYWs7CmNhc2UgMjA6CiR0b2tlbiA9IGFycmF5KCR0aGlzLT52c3RhY2tbJGxlbl0pOwpicmVhazsKY2FzZSAyMToKYXNzZXJ0KFxpc19hcnJheSgkdGhpcy0+dnN0YWNrWyRsZW4tMl0pKTsKJHRoaXMtPnZzdGFja1skbGVuLTJdW10gPSAkdGhpcy0+dnN0YWNrWyRsZW5dOwokdG9rZW4gPSAkdGhpcy0+dnN0YWNrWyRsZW4tMl07CmJyZWFrOwp9CgpyZXR1cm4gYXJyYXkoJHRva2VuLCBuZXcgVW5kZWZpbmVkKCkpOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzdHJpbmdJbnRlcnBvbGF0aW9uKCRtYXRjaCkKewpzd2l0Y2ggKCRtYXRjaFswXSkgewpjYXNlICdcXFxcJzoKcmV0dXJuICdcXCc7CmNhc2UgJ1wiJzoKcmV0dXJuICciJzsKY2FzZSAnXGInOgpyZXR1cm4gXGNocig4KTsKY2FzZSAnXGYnOgpyZXR1cm4gXGNocigxMik7CmNhc2UgJ1xuJzoKcmV0dXJuICJcbiI7CmNhc2UgJ1xyJzoKcmV0dXJuICJcciI7CmNhc2UgJ1x0JzoKcmV0dXJuICJcdCI7CmNhc2UgJ1wvJzoKcmV0dXJuICIvIjsKZGVmYXVsdDoKcmV0dXJuIGh0bWxfZW50aXR5X2RlY29kZSgnJiN4Jy5sdHJpbShzdWJzdHIoJG1hdGNoWzBdLCAyKSwgJzAnKS4nOycsIEVOVF9RVU9URVMsICdVVEYtOCcpOwp9Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHBvcFN0YWNrKCRuKQp7CiR0aGlzLT5zdGFjayA9IFxhcnJheV9zbGljZSgkdGhpcy0+c3RhY2ssIDAsIC0gKDIgKiAkbikpOwokdGhpcy0+dnN0YWNrID0gXGFycmF5X3NsaWNlKCR0aGlzLT52c3RhY2ssIDAsIC0gJG4pOwokdGhpcy0+bHN0YWNrID0gXGFycmF5X3NsaWNlKCR0aGlzLT5sc3RhY2ssIDAsIC0gJG4pOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBmYWlsT25CT00oJGlucHV0KQp7CgokYm9tID0gIlx4RUZceEJCXHhCRiI7CgppZiAoc3Vic3RyKCRpbnB1dCwgMCwgMykgPT09ICRib20pIHsKJHRoaXMtPnBhcnNlRXJyb3IoIkJPTSBkZXRlY3RlZCwgbWFrZSBzdXJlIHlvdXIgaW5wdXQgZG9lcyBub3QgaW5jbHVkZSBhIFVuaWNvZGUgQnl0ZS1PcmRlci1NYXJrIik7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU2VsZFxKc29uTGludDsKCgoKCgoKY2xhc3MgTGV4ZXIKewoKY29uc3QgRU9GID0gMTsKCmNvbnN0IFRfSU5WQUxJRCA9IC0xOwpjb25zdCBUX1NLSVBfV0hJVEVTUEFDRSA9IDA7CmNvbnN0IFRfRVJST1IgPSAyOwoKY29uc3QgVF9CUkVBS19MSU5FID0gMzsKCmNvbnN0IFRfQ09NTUVOVCA9IDMwOwoKY29uc3QgVF9PUEVOX0NPTU1FTlQgPSAzMTsKCmNvbnN0IFRfQ0xPU0VfQ09NTUVOVCA9IDMyOwoKCgoKCnByaXZhdGUgJHJ1bGVzID0gYXJyYXkoCjAgPT4gJy9cR1xzKlxuXHI/LycsCjEgPT4gJy9cR1xzKy8nLAoyID0+ICcvXEctPyhbMC05XXxbMS05XVswLTldKykoXC5bMC05XSspPyhbZUVdWystXT9bMC05XSspP1xiLycsCjMgPT4gJ3tcRyIoPz5cXFxcWyJiZm5ydC9cXFxcXXxcXFxcdVthLWZBLUYwLTldezR9fFteXDAtXHgxZlxcXFwiXSsrKSorIn0nLAo0ID0+ICcvXEdcey8nLAo1ID0+ICcvXEdcfS8nLAo2ID0+ICcvXEdcWy8nLAo3ID0+ICcvXEdcXS8nLAo4ID0+ICcvXEcsLycsCjkgPT4gJy9cRzovJywKMTAgPT4gJy9cR3RydWVcYi8nLAoxMSA9PiAnL1xHZmFsc2VcYi8nLAoxMiA9PiAnL1xHbnVsbFxiLycsCjEzID0+ICcvXEckLycsCjE0ID0+ICcvXEdcL1wvLycsCjE1ID0+ICcvXEdcL1wqLycsCjE2ID0+ICcvXEdcKlwvLycsCjE3ID0+ICcvXEcuLycsCik7CgoKcHJpdmF0ZSAkaW5wdXQ7Cgpwcml2YXRlICRtb3JlOwoKcHJpdmF0ZSAkZG9uZTsKCnByaXZhdGUgJG9mZnNldDsKCnByaXZhdGUgJGZsYWdzOwoKCnB1YmxpYyAkbWF0Y2g7CgpwdWJsaWMgJHl5bGluZW5vOwoKcHVibGljICR5eWxlbmc7CgpwdWJsaWMgJHl5dGV4dDsKCnB1YmxpYyAkeXlsbG9jOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRmbGFncyA9IDApCnsKJHRoaXMtPmZsYWdzID0gJGZsYWdzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbGV4KCkKewp3aGlsZSAodHJ1ZSkgewokc3ltYm9sID0gJHRoaXMtPm5leHQoKTsKc3dpdGNoICgkc3ltYm9sKSB7CmNhc2Ugc2VsZjo6VF9TS0lQX1dISVRFU1BBQ0U6CmNhc2Ugc2VsZjo6VF9CUkVBS19MSU5FOgpicmVhazsKY2FzZSBzZWxmOjpUX0NPTU1FTlQ6CmNhc2Ugc2VsZjo6VF9PUEVOX0NPTU1FTlQ6CmlmICghKCR0aGlzLT5mbGFncyAmIEpzb25QYXJzZXI6OkFMTE9XX0NPTU1FTlRTKSkgewokdGhpcy0+cGFyc2VFcnJvcignTGV4aWNhbCBlcnJvciBvbiBsaW5lICcgLiAoJHRoaXMtPnl5bGluZW5vKzEpIC4gIi4gQ29tbWVudHMgYXJlIG5vdCBhbGxvd2VkLlxuIiAuICR0aGlzLT5zaG93UG9zaXRpb24oKSk7Cn0KJHRoaXMtPnNraXBVbnRpbCgkc3ltYm9sID09PSBzZWxmOjpUX0NPTU1FTlQgPyBzZWxmOjpUX0JSRUFLX0xJTkUgOiBzZWxmOjpUX0NMT1NFX0NPTU1FTlQpOwppZiAoJHRoaXMtPmRvbmUpIHsKCnJldHVybiAxNDsKfQpicmVhazsKY2FzZSBzZWxmOjpUX0NMT1NFX0NPTU1FTlQ6CiR0aGlzLT5wYXJzZUVycm9yKCdMZXhpY2FsIGVycm9yIG9uIGxpbmUgJyAuICgkdGhpcy0+eXlsaW5lbm8rMSkgLiAiLiBVbmV4cGVjdGVkIHRva2VuLlxuIiAuICR0aGlzLT5zaG93UG9zaXRpb24oKSk7CmRlZmF1bHQ6CnJldHVybiAkc3ltYm9sOwp9Cn0KfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRJbnB1dCgkaW5wdXQpCnsKJHRoaXMtPmlucHV0ID0gJGlucHV0OwokdGhpcy0+bW9yZSA9IGZhbHNlOwokdGhpcy0+ZG9uZSA9IGZhbHNlOwokdGhpcy0+b2Zmc2V0ID0gMDsKJHRoaXMtPnl5bGluZW5vID0gJHRoaXMtPnl5bGVuZyA9IDA7CiR0aGlzLT55eXRleHQgPSAkdGhpcy0+bWF0Y2ggPSAnJzsKJHRoaXMtPnl5bGxvYyA9IGFycmF5KCdmaXJzdF9saW5lJyA9PiAxLCAnZmlyc3RfY29sdW1uJyA9PiAwLCAnbGFzdF9saW5lJyA9PiAxLCAnbGFzdF9jb2x1bW4nID0+IDApOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2hvd1Bvc2l0aW9uKCkKewppZiAoJHRoaXMtPnl5bGluZW5vID09PSAwICYmICR0aGlzLT5vZmZzZXQgPT09IDEgJiYgJHRoaXMtPm1hdGNoICE9PSAneycpIHsKcmV0dXJuICR0aGlzLT5tYXRjaC4nLi4uJyAuICJcbl4iOwp9CgokcHJlID0gc3RyX3JlcGxhY2UoIlxuIiwgJycsICR0aGlzLT5nZXRQYXN0SW5wdXQoKSk7CiRjID0gc3RyX3JlcGVhdCgnLScsIG1heCgwLCBcc3RybGVuKCRwcmUpIC0gMSkpOyAKCnJldHVybiAkcHJlIC4gc3RyX3JlcGxhY2UoIlxuIiwgJycsICR0aGlzLT5nZXRVcGNvbWluZ0lucHV0KCkpIC4gIlxuIiAuICRjIC4gIl4iOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFzdElucHV0KCkKewokcGFzdExlbmd0aCA9ICR0aGlzLT5vZmZzZXQgLSBcc3RybGVuKCR0aGlzLT5tYXRjaCk7CgpyZXR1cm4gKCRwYXN0TGVuZ3RoID4gMjAgPyAnLi4uJyA6ICcnKSAuIHN1YnN0cigkdGhpcy0+aW5wdXQsIG1heCgwLCAkcGFzdExlbmd0aCAtIDIwKSwgbWluKDIwLCAkcGFzdExlbmd0aCkpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXBjb21pbmdJbnB1dCgpCnsKJG5leHQgPSAkdGhpcy0+bWF0Y2g7CmlmIChcc3RybGVuKCRuZXh0KSA8IDIwKSB7CiRuZXh0IC49IHN1YnN0cigkdGhpcy0+aW5wdXQsICR0aGlzLT5vZmZzZXQsIDIwIC0gXHN0cmxlbigkbmV4dCkpOwp9CgpyZXR1cm4gc3Vic3RyKCRuZXh0LCAwLCAyMCkgLiAoXHN0cmxlbigkbmV4dCkgPiAyMCA/ICcuLi4nIDogJycpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RnVsbFVwY29taW5nSW5wdXQoKQp7CiRuZXh0ID0gJHRoaXMtPm1hdGNoOwppZiAoc3Vic3RyKCRuZXh0LCAwLCAxKSA9PT0gJyInICYmIHN1YnN0cl9jb3VudCgkbmV4dCwgJyInKSA9PT0gMSkgewokbGVuID0gXHN0cmxlbigkdGhpcy0+aW5wdXQpOwppZiAoJGxlbiA9PT0gJHRoaXMtPm9mZnNldCkgewokc3RyRW5kID0gJGxlbjsKfSBlbHNlIHsKJHN0ckVuZCA9IG1pbihzdHJwb3MoJHRoaXMtPmlucHV0LCAnIicsICR0aGlzLT5vZmZzZXQgKyAxKSA/OiAkbGVuLCBzdHJwb3MoJHRoaXMtPmlucHV0LCAiXG4iLCAkdGhpcy0+b2Zmc2V0ICsgMSkgPzogJGxlbik7Cn0KJG5leHQgLj0gc3Vic3RyKCR0aGlzLT5pbnB1dCwgJHRoaXMtPm9mZnNldCwgJHN0ckVuZCAtICR0aGlzLT5vZmZzZXQpOwp9IGVsc2VpZiAoXHN0cmxlbigkbmV4dCkgPCAyMCkgewokbmV4dCAuPSBzdWJzdHIoJHRoaXMtPmlucHV0LCAkdGhpcy0+b2Zmc2V0LCAyMCAtIFxzdHJsZW4oJG5leHQpKTsKfQoKcmV0dXJuICRuZXh0Owp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHBhcnNlRXJyb3IoJHN0cikKewp0aHJvdyBuZXcgUGFyc2luZ0V4Y2VwdGlvbigkc3RyKTsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gc2tpcFVudGlsKCR0b2tlbikKewokc3ltYm9sID0gJHRoaXMtPm5leHQoKTsKd2hpbGUgKCRzeW1ib2wgIT09ICR0b2tlbiAmJiBmYWxzZSA9PT0gJHRoaXMtPmRvbmUpIHsKJHN5bWJvbCA9ICR0aGlzLT5uZXh0KCk7Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBuZXh0KCkKewppZiAoJHRoaXMtPmRvbmUpIHsKcmV0dXJuIHNlbGY6OkVPRjsKfQppZiAoJHRoaXMtPm9mZnNldCA9PT0gXHN0cmxlbigkdGhpcy0+aW5wdXQpKSB7CiR0aGlzLT5kb25lID0gdHJ1ZTsKfQoKJHRva2VuID0gbnVsbDsKJG1hdGNoID0gbnVsbDsKJGNvbCA9IG51bGw7CiRsaW5lcyA9IG51bGw7CgppZiAoISR0aGlzLT5tb3JlKSB7CiR0aGlzLT55eXRleHQgPSAnJzsKJHRoaXMtPm1hdGNoID0gJyc7Cn0KCiRydWxlc0xlbiA9IGNvdW50KCR0aGlzLT5ydWxlcyk7Cgpmb3IgKCRpPTA7ICRpIDwgJHJ1bGVzTGVuOyAkaSsrKSB7CmlmIChwcmVnX21hdGNoKCR0aGlzLT5ydWxlc1skaV0sICR0aGlzLT5pbnB1dCwgJG1hdGNoLCAwLCAkdGhpcy0+b2Zmc2V0KSkgewokbGluZXMgPSBleHBsb2RlKCJcbiIsICRtYXRjaFswXSk7CmFycmF5X3NoaWZ0KCRsaW5lcyk7CiRsaW5lQ291bnQgPSBcY291bnQoJGxpbmVzKTsKJHRoaXMtPnl5bGluZW5vICs9ICRsaW5lQ291bnQ7CiR0aGlzLT55eWxsb2MgPSBhcnJheSgKJ2ZpcnN0X2xpbmUnID0+ICR0aGlzLT55eWxsb2NbJ2xhc3RfbGluZSddLAonbGFzdF9saW5lJyA9PiAkdGhpcy0+eXlsaW5lbm8rMSwKJ2ZpcnN0X2NvbHVtbicgPT4gJHRoaXMtPnl5bGxvY1snbGFzdF9jb2x1bW4nXSwKJ2xhc3RfY29sdW1uJyA9PiAkbGluZUNvdW50ID4gMCA/IFxzdHJsZW4oJGxpbmVzWyRsaW5lQ291bnQgLSAxXSkgOiAkdGhpcy0+eXlsbG9jWydsYXN0X2NvbHVtbiddICsgXHN0cmxlbigkbWF0Y2hbMF0pLAopOwokdGhpcy0+eXl0ZXh0IC49ICRtYXRjaFswXTsKJHRoaXMtPm1hdGNoIC49ICRtYXRjaFswXTsKJHRoaXMtPnl5bGVuZyA9IFxzdHJsZW4oJHRoaXMtPnl5dGV4dCk7CiR0aGlzLT5tb3JlID0gZmFsc2U7CiR0aGlzLT5vZmZzZXQgKz0gXHN0cmxlbigkbWF0Y2hbMF0pOwpyZXR1cm4gJHRoaXMtPnBlcmZvcm1BY3Rpb24oJGkpOwp9Cn0KCmlmICgkdGhpcy0+b2Zmc2V0ID09PSBcc3RybGVuKCR0aGlzLT5pbnB1dCkpIHsKcmV0dXJuIHNlbGY6OkVPRjsKfQoKJHRoaXMtPnBhcnNlRXJyb3IoCidMZXhpY2FsIGVycm9yIG9uIGxpbmUgJyAuICgkdGhpcy0+eXlsaW5lbm8rMSkgLiAiLiBVbnJlY29nbml6ZWQgdGV4dC5cbiIgLiAkdGhpcy0+c2hvd1Bvc2l0aW9uKCkKKTsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcGVyZm9ybUFjdGlvbigkcnVsZSkKewpzd2l0Y2ggKCRydWxlKSB7CmNhc2UgMDoKcmV0dXJuIHNlbGY6OlRfQlJFQUtfTElORTsKY2FzZSAxOgpyZXR1cm4gc2VsZjo6VF9TS0lQX1dISVRFU1BBQ0U7CmNhc2UgMjoKcmV0dXJuIDY7CmNhc2UgMzoKJHRoaXMtPnl5dGV4dCA9IHN1YnN0cigkdGhpcy0+eXl0ZXh0LCAxLCAkdGhpcy0+eXlsZW5nLTIpOwpyZXR1cm4gNDsKY2FzZSA0OgpyZXR1cm4gMTc7CmNhc2UgNToKcmV0dXJuIDE4OwpjYXNlIDY6CnJldHVybiAyMzsKY2FzZSA3OgpyZXR1cm4gMjQ7CmNhc2UgODoKcmV0dXJuIDIyOwpjYXNlIDk6CnJldHVybiAyMTsKY2FzZSAxMDoKcmV0dXJuIDEwOwpjYXNlIDExOgpyZXR1cm4gMTE7CmNhc2UgMTI6CnJldHVybiA4OwpjYXNlIDEzOgpyZXR1cm4gMTQ7CmNhc2UgMTQ6CnJldHVybiBzZWxmOjpUX0NPTU1FTlQ7CmNhc2UgMTU6CnJldHVybiBzZWxmOjpUX09QRU5fQ09NTUVOVDsKY2FzZSAxNjoKcmV0dXJuIHNlbGY6OlRfQ0xPU0VfQ09NTUVOVDsKY2FzZSAxNzoKcmV0dXJuIHNlbGY6OlRfSU5WQUxJRDsKZGVmYXVsdDoKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignVW5zdXBwb3J0ZWQgcnVsZSAnLiRydWxlKTsKfQp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTZWxkXEpzb25MaW50OwoKY2xhc3MgUGFyc2luZ0V4Y2VwdGlvbiBleHRlbmRzIFxFeGNlcHRpb24KewoKCgpwcm90ZWN0ZWQgJGRldGFpbHM7CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlLCAkZGV0YWlscyA9IGFycmF5KCkpCnsKJHRoaXMtPmRldGFpbHMgPSAkZGV0YWlsczsKcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXRhaWxzKCkKewpyZXR1cm4gJHRoaXMtPmRldGFpbHM7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFNlbGRcSnNvbkxpbnQ7CgpjbGFzcyBVbmRlZmluZWQKewp9CgpDb3B5cmlnaHQgKGMpIDIwMTUgSm9yZGkgQm9nZ2lhbm8KClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFNlbGRcUGhhclV0aWxzOwoKY2xhc3MgTGludGVyCnsKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBsaW50KCRwYXRoLCBhcnJheSAkZXhjbHVkZWRQYXRocyA9IGFycmF5KCkpCnsKJHBocCA9IGRlZmluZWQoJ1BIUF9CSU5BUlknKSA/IFBIUF9CSU5BUlkgOiAncGhwJzsKCmlmICgkaXNXaW5kb3dzID0gZGVmaW5lZCgnUEhQX1dJTkRPV1NfVkVSU0lPTl9CVUlMRCcpKSB7CiR0bXBGaWxlID0gQHRlbXBuYW0oc3lzX2dldF90ZW1wX2RpcigpLCAnJyk7CgppZiAoISR0bXBGaWxlIHx8ICFpc193cml0YWJsZSgkdG1wRmlsZSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdVbmFibGUgdG8gY3JlYXRlIHRlbXAgZmlsZScpOwp9CgokcGhwID0gc2VsZjo6ZXNjYXBlV2luZG93c1BhdGgoJHBocCk7CiR0bXBGaWxlID0gc2VsZjo6ZXNjYXBlV2luZG93c1BhdGgoJHRtcEZpbGUpOwoKCmlmIChQSFBfVkVSU0lPTl9JRCA+PSA4MDAwMCkgewokZm9ybWF0ID0gJyVzIC1sICVzJzsKfSBlbHNlIHsKJGZvcm1hdCA9ICciJXMgLWwgJXMiJzsKfQoKJGNvbW1hbmQgPSBzcHJpbnRmKCRmb3JtYXQsICRwaHAsICR0bXBGaWxlKTsKfSBlbHNlIHsKJGNvbW1hbmQgPSAiJyIuJHBocC4iJyAtbCI7Cn0KCiRkZXNjcmlwdG9yc3BlYyA9IGFycmF5KAowID0+IGFycmF5KCdwaXBlJywgJ3InKSwKMSA9PiBhcnJheSgncGlwZScsICd3JyksCjIgPT4gYXJyYXkoJ3BpcGUnLCAndycpCik7CgoKJGJhc2VMZW4gPSBzdHJsZW4ocmVhbHBhdGgoJHBhdGgpKSArIDcgKyAxOwpmb3JlYWNoIChuZXcgXFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IobmV3IFxQaGFyKCRwYXRoKSkgYXMgJGZpbGUpIHsKaWYgKCRmaWxlLT5pc0RpcigpKSB7CmNvbnRpbnVlOwp9CmlmIChzdWJzdHIoJGZpbGUsIC00KSA9PT0gJy5waHAnKSB7CiRmaWxlbmFtZSA9IChzdHJpbmcpICRmaWxlOwppZiAoaW5fYXJyYXkoc3Vic3RyKCRmaWxlbmFtZSwgJGJhc2VMZW4pLCAkZXhjbHVkZWRQYXRocywgdHJ1ZSkpIHsKY29udGludWU7Cn0KaWYgKCRpc1dpbmRvd3MpIHsKZmlsZV9wdXRfY29udGVudHMoJHRtcEZpbGUsIGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlbmFtZSkpOwp9CgokcHJvY2VzcyA9IHByb2Nfb3BlbigkY29tbWFuZCwgJGRlc2NyaXB0b3JzcGVjLCAkcGlwZXMpOwppZiAoaXNfcmVzb3VyY2UoJHByb2Nlc3MpKSB7CmlmICghJGlzV2luZG93cykgewpmd3JpdGUoJHBpcGVzWzBdLCBmaWxlX2dldF9jb250ZW50cygkZmlsZW5hbWUpKTsKfQpmY2xvc2UoJHBpcGVzWzBdKTsKCiRzdGRvdXQgPSBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRwaXBlc1sxXSk7CmZjbG9zZSgkcGlwZXNbMV0pOwokc3RkZXJyID0gc3RyZWFtX2dldF9jb250ZW50cygkcGlwZXNbMl0pOwpmY2xvc2UoJHBpcGVzWzJdKTsKCiRleGl0Q29kZSA9IHByb2NfY2xvc2UoJHByb2Nlc3MpOwoKaWYgKCRleGl0Q29kZSAhPT0gMCkgewppZiAoJGlzV2luZG93cykgewokc3RkZXJyID0gc3RyX3JlcGxhY2UoJHRtcEZpbGUsICRmaWxlbmFtZSwgJHN0ZGVycik7Cn0KdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0ZhaWxlZCBsaW50aW5nICcuJGZpbGUuJzogJy4kc3RkZXJyKTsKfQp9IGVsc2Ugewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBzdGFydCBsaW50ZXIgcHJvY2VzcycpOwp9Cn0KfQoKaWYgKCRpc1dpbmRvd3MpIHsKQHVubGluaygkdG1wRmlsZSk7Cn0KfQoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZXNjYXBlV2luZG93c1BhdGgoJHBhdGgpCnsKCmlmIChzdHJwYnJrKCRwYXRoLCAiICgpIikgIT09IGZhbHNlKSB7CiRwYXRoID0gJyInLiRwYXRoLiciJzsKfQoKcmV0dXJuICRwYXRoOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTZWxkXFBoYXJVdGlsczsKCmNsYXNzIFRpbWVzdGFtcHMKewpwcml2YXRlICRjb250ZW50czsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkZmlsZSkKewokdGhpcy0+Y29udGVudHMgPSBmaWxlX2dldF9jb250ZW50cygkZmlsZSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdXBkYXRlVGltZXN0YW1wcygkdGltZXN0YW1wID0gbnVsbCkKewppZiAoJHRpbWVzdGFtcCBpbnN0YW5jZW9mIFxEYXRlVGltZSB8fCAkdGltZXN0YW1wIGluc3RhbmNlb2YgXERhdGVUaW1lSW50ZXJmYWNlKSB7CiR0aW1lc3RhbXAgPSAkdGltZXN0YW1wLT5nZXRUaW1lc3RhbXAoKTsKfSBlbHNlaWYgKGlzX3N0cmluZygkdGltZXN0YW1wKSkgewokdGltZXN0YW1wID0gc3RydG90aW1lKCR0aW1lc3RhbXApOwp9IGVsc2VpZiAoIWlzX2ludCgkdGltZXN0YW1wKSkgewokdGltZXN0YW1wID0gc3RydG90aW1lKCcxOTg0LTEyLTI0VDAwOjAwOjAwWicpOwp9CgoKaWYgKCFwcmVnX21hdGNoKCd7X19IQUxUX0NPTVBJTEVSXChcKTsoPzogK1w/Pik/XHI/XG59JywgJHRoaXMtPmNvbnRlbnRzLCAkbWF0Y2gsIFBSRUdfT0ZGU0VUX0NBUFRVUkUpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IGRldGVjdCB0aGUgc3R1YlwncyBlbmQgaW4gdGhlIHBoYXInKTsKfQoKCiRwb3MgPSAkbWF0Y2hbMF1bMV0gKyBzdHJsZW4oJG1hdGNoWzBdWzBdKTsKJHN0dWJFbmQgPSAkcG9zICsgJHRoaXMtPnJlYWRVaW50KCRwb3MsIDQpOwokcG9zICs9IDQ7CgokbnVtRmlsZXMgPSAkdGhpcy0+cmVhZFVpbnQoJHBvcywgNCk7CiRwb3MgKz0gNDsKCgokcG9zICs9IDI7CgoKJHBvcyArPSA0OwoKJGFsaWFzTGVuZ3RoID0gJHRoaXMtPnJlYWRVaW50KCRwb3MsIDQpOwokcG9zICs9IDQgKyAkYWxpYXNMZW5ndGg7CgokbWV0YWRhdGFMZW5ndGggPSAkdGhpcy0+cmVhZFVpbnQoJHBvcywgNCk7CiRwb3MgKz0gNCArICRtZXRhZGF0YUxlbmd0aDsKCndoaWxlICgkcG9zIDwgJHN0dWJFbmQpIHsKJGZpbGVuYW1lTGVuZ3RoID0gJHRoaXMtPnJlYWRVaW50KCRwb3MsIDQpOwokcG9zICs9IDQgKyAkZmlsZW5hbWVMZW5ndGg7CgoKJHBvcyArPSA0OwoKCiR0aW1lU3RhbXBCeXRlcyA9IHBhY2soJ0wnLCAkdGltZXN0YW1wKTsKJHRoaXMtPmNvbnRlbnRzWyRwb3MgKyAwXSA9ICR0aW1lU3RhbXBCeXRlc1swXTsKJHRoaXMtPmNvbnRlbnRzWyRwb3MgKyAxXSA9ICR0aW1lU3RhbXBCeXRlc1sxXTsKJHRoaXMtPmNvbnRlbnRzWyRwb3MgKyAyXSA9ICR0aW1lU3RhbXBCeXRlc1syXTsKJHRoaXMtPmNvbnRlbnRzWyRwb3MgKyAzXSA9ICR0aW1lU3RhbXBCeXRlc1szXTsKCgokcG9zICs9IDQqNDsKCiRtZXRhZGF0YUxlbmd0aCA9ICR0aGlzLT5yZWFkVWludCgkcG9zLCA0KTsKJHBvcyArPSA0ICsgJG1ldGFkYXRhTGVuZ3RoOwoKJG51bUZpbGVzLS07Cn0KCmlmICgkbnVtRmlsZXMgIT09IDApIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignQWxsIGZpbGVzIHdlcmUgbm90IHByb2Nlc3NlZCwgc29tZXRoaW5nIG11c3QgaGF2ZSBnb25lIHdyb25nJyk7Cn0KfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzYXZlKCRwYXRoLCAkc2lnbmF0dXJlQWxnbykKewokcG9zID0gJHRoaXMtPmRldGVybWluZVNpZ25hdHVyZUJlZ2luKCk7CgokYWxnb3MgPSBhcnJheSgKXFBoYXI6Ok1ENSA9PiAnbWQ1JywKXFBoYXI6OlNIQTEgPT4gJ3NoYTEnLApcUGhhcjo6U0hBMjU2ID0+ICdzaGEyNTYnLApcUGhhcjo6U0hBNTEyID0+ICdzaGE1MTInLAopOwoKaWYgKCFpc3NldCgkYWxnb3NbJHNpZ25hdHVyZUFsZ29dKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignSW52YWxpZCBoYXNoIGFsZ29yaXRobSBnaXZlbjogJy4kc2lnbmF0dXJlQWxnby4nIGV4cGVjdGVkIG9uZSBvZiBQaGFyOjpNRDUsIFBoYXI6OlNIQTEsIFBoYXI6OlNIQTI1NiBvciBQaGFyOjpTSEE1MTInKTsKfQokYWxnbyA9ICRhbGdvc1skc2lnbmF0dXJlQWxnb107CgoKCiRzaWduYXR1cmUgPSBoYXNoKCRhbGdvLCBzdWJzdHIoJHRoaXMtPmNvbnRlbnRzLCAwLCAkcG9zKSwgdHJ1ZSkKCi4gcGFjaygnTCcsICRzaWduYXR1cmVBbGdvKQoKLiAnR0JNQic7CgokdGhpcy0+Y29udGVudHMgPSBzdWJzdHIoJHRoaXMtPmNvbnRlbnRzLCAwLCAkcG9zKSAuICRzaWduYXR1cmU7CgpyZXR1cm4gZmlsZV9wdXRfY29udGVudHMoJHBhdGgsICR0aGlzLT5jb250ZW50cyk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gcmVhZFVpbnQoJHBvcywgJGJ5dGVzKQp7CiRyZXMgPSB1bnBhY2soJ1YnLCBzdWJzdHIoJHRoaXMtPmNvbnRlbnRzLCAkcG9zLCAkYnl0ZXMpKTsKCnJldHVybiAkcmVzWzFdOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZGV0ZXJtaW5lU2lnbmF0dXJlQmVnaW4oKQp7CgppZiAoIXByZWdfbWF0Y2goJ3tfX0hBTFRfQ09NUElMRVJcKFwpOyg/OiArXD8+KT9ccj9cbn0nLCAkdGhpcy0+Y29udGVudHMsICRtYXRjaCwgUFJFR19PRkZTRVRfQ0FQVFVSRSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgZGV0ZWN0IHRoZSBzdHViXCdzIGVuZCBpbiB0aGUgcGhhcicpOwp9CgoKJHBvcyA9ICRtYXRjaFswXVsxXSArIHN0cmxlbigkbWF0Y2hbMF1bMF0pOwokbWFuaWZlc3RFbmQgPSAkcG9zICsgNCArICR0aGlzLT5yZWFkVWludCgkcG9zLCA0KTsKCiRwb3MgKz0gNDsKJG51bUZpbGVzID0gJHRoaXMtPnJlYWRVaW50KCRwb3MsIDQpOwoKJHBvcyArPSA0OwoKCiRwb3MgKz0gMjsKCgokcG9zICs9IDQ7CgokYWxpYXNMZW5ndGggPSAkdGhpcy0+cmVhZFVpbnQoJHBvcywgNCk7CiRwb3MgKz0gNCArICRhbGlhc0xlbmd0aDsKCiRtZXRhZGF0YUxlbmd0aCA9ICR0aGlzLT5yZWFkVWludCgkcG9zLCA0KTsKJHBvcyArPSA0ICsgJG1ldGFkYXRhTGVuZ3RoOwoKJGNvbXByZXNzZWRTaXplcyA9IDA7CndoaWxlICgoJG51bUZpbGVzID4gMCkgJiYgKCRwb3MgPCAkbWFuaWZlc3RFbmQgLSAyNCkpIHsKJGZpbGVuYW1lTGVuZ3RoID0gJHRoaXMtPnJlYWRVaW50KCRwb3MsIDQpOwokcG9zICs9IDQgKyAkZmlsZW5hbWVMZW5ndGg7CgoKJHBvcyArPSAyKjQ7CgokY29tcHJlc3NlZFNpemVzICs9ICR0aGlzLT5yZWFkVWludCgkcG9zLCA0KTsKCiRwb3MgKz0gMyo0OwoKJG1ldGFkYXRhTGVuZ3RoID0gJHRoaXMtPnJlYWRVaW50KCRwb3MsIDQpOwokcG9zICs9IDQgKyAkbWV0YWRhdGFMZW5ndGg7CgokbnVtRmlsZXMtLTsKfQoKaWYgKCRudW1GaWxlcyAhPT0gMCkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdBbGwgZmlsZXMgd2VyZSBub3QgcHJvY2Vzc2VkLCBzb21ldGhpbmcgbXVzdCBoYXZlIGdvbmUgd3JvbmcnKTsKfQoKcmV0dXJuICRtYW5pZmVzdEVuZCArICRjb21wcmVzc2VkU2l6ZXM7Cn0KfQoKQ29weXJpZ2h0IChjKSAyMDE1IEpvcmRpIEJvZ2dpYW5vCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCnRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTZWxkXFNpZ25hbDsKCnVzZSBQc3JcTG9nXExvZ2dlckludGVyZmFjZTsKdXNlIENsb3N1cmU7CnVzZSBXZWFrUmVmZXJlbmNlOwoKCgoKZmluYWwgY2xhc3MgU2lnbmFsSGFuZGxlcgp7CgoKCgoKCgpwdWJsaWMgY29uc3QgU0lHSFVQID0gJ1NJR0hVUCc7CgoKCgoKCgoKcHVibGljIGNvbnN0IFNJR0lOVCA9ICdTSUdJTlQnOwoKCgoKCnB1YmxpYyBjb25zdCBTSUdRVUlUID0gJ1NJR1FVSVQnOwoKCgoKCnB1YmxpYyBjb25zdCBTSUdJTEwgPSAnU0lHSUxMJzsKCgoKCgoKcHVibGljIGNvbnN0IFNJR1RSQVAgPSAnU0lHVFJBUCc7CgoKCgoKCnB1YmxpYyBjb25zdCBTSUdBQlJUID0gJ1NJR0FCUlQnOwoKcHVibGljIGNvbnN0IFNJR0lPVCA9ICdTSUdJT1QnOwoKCgoKCnB1YmxpYyBjb25zdCBTSUdCVVMgPSAnU0lHQlVTJzsKCnB1YmxpYyBjb25zdCBTSUdGUEUgPSAnU0lHRlBFJzsKCgoKCgoKcHVibGljIGNvbnN0IFNJR0tJTEwgPSAnU0lHS0lMTCc7CgoKCgpwdWJsaWMgY29uc3QgU0lHVVNSMSA9ICdTSUdVU1IxJzsKCgoKCnB1YmxpYyBjb25zdCBTSUdVU1IyID0gJ1NJR1VTUjInOwoKCgoKCnB1YmxpYyBjb25zdCBTSUdTRUdWID0gJ1NJR1NFR1YnOwoKCgoKCnB1YmxpYyBjb25zdCBTSUdQSVBFID0gJ1NJR1BJUEUnOwoKCgoKCgoKcHVibGljIGNvbnN0IFNJR0FMUk0gPSAnU0lHQUxSTSc7CgoKCgoKCnB1YmxpYyBjb25zdCBTSUdURVJNID0gJ1NJR1RFUk0nOwoKcHVibGljIGNvbnN0IFNJR1NUS0ZMVCA9ICdTSUdTVEtGTFQnOwpwdWJsaWMgY29uc3QgU0lHQ0xEID0gJ1NJR0NMRCc7CgoKCgoKCnB1YmxpYyBjb25zdCBTSUdDSExEID0gJ1NJR0NITEQnOwoKCgoKCnB1YmxpYyBjb25zdCBTSUdDT05UID0gJ1NJR0NPTlQnOwoKCgoKcHVibGljIGNvbnN0IFNJR1NUT1AgPSAnU0lHU1RPUCc7CgoKCgoKCnB1YmxpYyBjb25zdCBTSUdUU1RQID0gJ1NJR1RTVFAnOwoKCgoKCnB1YmxpYyBjb25zdCBTSUdUVElOID0gJ1NJR1RUSU4nOwoKCgoKCnB1YmxpYyBjb25zdCBTSUdUVE9VID0gJ1NJR1RUT1UnOwoKCgoKcHVibGljIGNvbnN0IFNJR1VSRyA9ICdTSUdVUkcnOwoKCgoKCgoKcHVibGljIGNvbnN0IFNJR1hDUFUgPSAnU0lHWENQVSc7CgoKCgpwdWJsaWMgY29uc3QgU0lHWEZTWiA9ICdTSUdYRlNaJzsKCgoKCgpwdWJsaWMgY29uc3QgU0lHVlRBTFJNID0gJ1NJR1ZUQUxSTSc7CgoKCgoKCnB1YmxpYyBjb25zdCBTSUdQUk9GID0gJ1NJR1BST0YnOwoKCgoKcHVibGljIGNvbnN0IFNJR1dJTkNIID0gJ1NJR1dJTkNIJzsKCgoKCgoKcHVibGljIGNvbnN0IFNJR1BPTEwgPSAnU0lHUE9MTCc7CgpwdWJsaWMgY29uc3QgU0lHSU8gPSAnU0lHSU8nOwoKCgoKcHVibGljIGNvbnN0IFNJR1BXUiA9ICdTSUdQV1InOwoKCgoKCnB1YmxpYyBjb25zdCBTSUdTWVMgPSAnU0lHU1lTJzsKCnB1YmxpYyBjb25zdCBTSUdCQUJZID0gJ1NJR0JBQlknOwoKCgoKcHVibGljIGNvbnN0IFNJR0JSRUFLID0gJ1NJR0JSRUFLJzsKCnByaXZhdGUgY29uc3QgQUxMX1NJR05BTFMgPSBbCnNlbGY6OlNJR0hVUCwgc2VsZjo6U0lHSU5ULCBzZWxmOjpTSUdRVUlULCBzZWxmOjpTSUdJTEwsIHNlbGY6OlNJR1RSQVAsIHNlbGY6OlNJR0FCUlQsIHNlbGY6OlNJR0lPVCwgc2VsZjo6U0lHQlVTLApzZWxmOjpTSUdGUEUsIHNlbGY6OlNJR0tJTEwsIHNlbGY6OlNJR1VTUjEsIHNlbGY6OlNJR1VTUjIsIHNlbGY6OlNJR1NFR1YsIHNlbGY6OlNJR1BJUEUsIHNlbGY6OlNJR0FMUk0sIHNlbGY6OlNJR1RFUk0sCnNlbGY6OlNJR1NUS0ZMVCwgc2VsZjo6U0lHQ0xELCBzZWxmOjpTSUdDSExELCBzZWxmOjpTSUdDT05ULCBzZWxmOjpTSUdTVE9QLCBzZWxmOjpTSUdUU1RQLCBzZWxmOjpTSUdUVElOLCBzZWxmOjpTSUdUVE9VLApzZWxmOjpTSUdVUkcsIHNlbGY6OlNJR1hDUFUsIHNlbGY6OlNJR1hGU1osIHNlbGY6OlNJR1ZUQUxSTSwgc2VsZjo6U0lHUFJPRiwgc2VsZjo6U0lHV0lOQ0gsIHNlbGY6OlNJR1BPTEwsIHNlbGY6OlNJR0lPLApzZWxmOjpTSUdQV1IsIHNlbGY6OlNJR1NZUywgc2VsZjo6U0lHQkFCWSwgc2VsZjo6U0lHQlJFQUsKXTsKCgoKCnByaXZhdGUgJHRyaWdnZXJlZCA9IG51bGw7CgoKCgoKcHJpdmF0ZSAkc2lnbmFsczsKCgoKCgpwcml2YXRlICRsb2dnZXJPckNhbGxiYWNrOwoKCgoKcHJpdmF0ZSBzdGF0aWMgJGhhbmRsZXJzID0gW107CgoKcHJpdmF0ZSBzdGF0aWMgJHdpbmRvd3NIYW5kbGVyID0gbnVsbDsKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRzaWduYWxzLCAkbG9nZ2VyT3JDYWxsYmFjaykKewppZiAoIWlzX2NhbGxhYmxlKCRsb2dnZXJPckNhbGxiYWNrKSAmJiAhJGxvZ2dlck9yQ2FsbGJhY2sgaW5zdGFuY2VvZiBMb2dnZXJJbnRlcmZhY2UgJiYgJGxvZ2dlck9yQ2FsbGJhY2sgIT09IG51bGwpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJyRsb2dnZXJPckNhbGxiYWNrIG11c3QgYmUgYSAnLkxvZ2dlckludGVyZmFjZTo6Y2xhc3MuJyBpbnN0YW5jZSwgYSBjYWxsYWJsZSwgb3IgbnVsbCwgJy4oaXNfb2JqZWN0KCRsb2dnZXJPckNhbGxiYWNrKSA/IGdldF9jbGFzcygkbG9nZ2VyT3JDYWxsYmFjaykgOiBnZXR0eXBlKCRsb2dnZXJPckNhbGxiYWNrKSkuJyByZWNlaXZlZC4nKTsKfQoKJHRoaXMtPnNpZ25hbHMgPSAkc2lnbmFsczsKJHRoaXMtPmxvZ2dlck9yQ2FsbGJhY2sgPSAkbG9nZ2VyT3JDYWxsYmFjazsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB0cmlnZ2VyKHN0cmluZyAkc2lnbmFsTmFtZSk6IHZvaWQKewokdGhpcy0+dHJpZ2dlcmVkID0gJHNpZ25hbE5hbWU7CgppZiAoJHRoaXMtPmxvZ2dlck9yQ2FsbGJhY2sgaW5zdGFuY2VvZiBMb2dnZXJJbnRlcmZhY2UpIHsKJHRoaXMtPmxvZ2dlck9yQ2FsbGJhY2stPmluZm8oJ1JlY2VpdmVkICcuJHNpZ25hbE5hbWUpOwp9IGVsc2VpZiAoJHRoaXMtPmxvZ2dlck9yQ2FsbGJhY2sgIT09IG51bGwpIHsKKCR0aGlzLT5sb2dnZXJPckNhbGxiYWNrKSgkc2lnbmFsTmFtZSwgJHRoaXMpOwp9Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVHJpZ2dlcmVkKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPnRyaWdnZXJlZCAhPT0gbnVsbDsKfQoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGV4aXRXaXRoTGFzdFNpZ25hbCgpOiB2b2lkCnsKJHNpZ25hbCA9ICR0aGlzLT50cmlnZ2VyZWQgPz8gJ1NJR0lOVCc7CiRzaWduYWwgPSBkZWZpbmVkKCRzaWduYWwpID8gY29uc3RhbnQoJHNpZ25hbCkgOiAyOwoKaWYgKGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfa2lsbCcpICYmIGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0cGlkJykpIHsKcGNudGxfc2lnbmFsKCRzaWduYWwsIFNJR19ERkwpOwpwb3NpeF9raWxsKHBvc2l4X2dldHBpZCgpLCAkc2lnbmFsKTsKfQoKCgpleGl0KDEyOCArICRzaWduYWwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzZXQoKTogdm9pZAp7CiR0aGlzLT50cmlnZ2VyZWQgPSBudWxsOwp9CgpwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCgpCnsKJHRoaXMtPnVucmVnaXN0ZXIoKTsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZSg/YXJyYXkgJHNpZ25hbHMgPSBudWxsLCAkbG9nZ2VyT3JDYWxsYmFjayA9IG51bGwpOiBzZWxmCnsKaWYgKCRzaWduYWxzID09PSBudWxsKSB7CiRzaWduYWxzID0gW3NlbGY6OlNJR0lOVCwgc2VsZjo6U0lHVEVSTV07Cn0KJHNpZ25hbHMgPSBhcnJheV9tYXAoZnVuY3Rpb24gKCRzaWduYWwpIHsKaWYgKGlzX2ludCgkc2lnbmFsKSkgewpyZXR1cm4gc2VsZjo6Z2V0U2lnbmFsTmFtZSgkc2lnbmFsKTsKfSBlbHNlaWYgKCFpbl9hcnJheSgkc2lnbmFsLCBzZWxmOjpBTExfU0lHTkFMUywgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJyRzaWduYWxzIG11c3QgYmUgYW4gYXJyYXkgb2YgU0lHKiBjb25zdGFudHMgb3Igc2VsZjo6U0lHKiBjb25zdGFudHMsIGdvdCAnLnZhcl9leHBvcnQoJHNpZ25hbCwgdHJ1ZSkpOwp9CnJldHVybiAkc2lnbmFsOwp9LCAoYXJyYXkpICRzaWduYWxzKTsKCiRoYW5kbGVyID0gbmV3IHNlbGYoJHNpZ25hbHMsICRsb2dnZXJPckNhbGxiYWNrKTsKCmlmIChQSFBfVkVSU0lPTl9JRCA+PSA4MDAwMCkgewphcnJheV91bnNoaWZ0KHNlbGY6OiRoYW5kbGVycywgV2Vha1JlZmVyZW5jZTo6Y3JlYXRlKCRoYW5kbGVyKSk7Cn0gZWxzZSB7CmFycmF5X3Vuc2hpZnQoc2VsZjo6JGhhbmRsZXJzLCAkaGFuZGxlcik7Cn0KCmlmIChmdW5jdGlvbl9leGlzdHMoJ3NhcGlfd2luZG93c19zZXRfY3RybF9oYW5kbGVyJykgJiYgUEhQX1NBUEkgPT09ICdjbGknICYmIChpbl9hcnJheShzZWxmOjpTSUdJTlQsICRzaWduYWxzLCB0cnVlKSB8fCBpbl9hcnJheShzZWxmOjpTSUdCUkVBSywgJHNpZ25hbHMsIHRydWUpKSkgewppZiAobnVsbCA9PT0gc2VsZjo6JHdpbmRvd3NIYW5kbGVyKSB7CnNlbGY6OiR3aW5kb3dzSGFuZGxlciA9IENsb3N1cmU6OmZyb21DYWxsYWJsZShbc2VsZjo6Y2xhc3MsICdoYW5kbGVXaW5kb3dzU2lnbmFsJ10pOwpzYXBpX3dpbmRvd3Nfc2V0X2N0cmxfaGFuZGxlcihzZWxmOjokd2luZG93c0hhbmRsZXIpOwp9Cn0KCmlmIChmdW5jdGlvbl9leGlzdHMoJ3BjbnRsX3NpZ25hbCcpICYmIGZ1bmN0aW9uX2V4aXN0cygncGNudGxfYXN5bmNfc2lnbmFscycpKSB7CnBjbnRsX2FzeW5jX3NpZ25hbHModHJ1ZSk7CgpzZWxmOjpyZWdpc3RlclBjbnRsSGFuZGxlcigkc2lnbmFscyk7Cn0KCnJldHVybiAkaGFuZGxlcjsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdW5yZWdpc3RlcigpOiB2b2lkCnsKJHNpZ25hbHMgPSAkdGhpcy0+c2lnbmFsczsKCiRpbmRleCA9IGZhbHNlOwpmb3JlYWNoIChzZWxmOjokaGFuZGxlcnMgYXMgJGtleSA9PiAkaGFuZGxlcikgewppZiAoKCRoYW5kbGVyIGluc3RhbmNlb2YgV2Vha1JlZmVyZW5jZSAmJiAkaGFuZGxlci0+Z2V0KCkgPT09ICR0aGlzKSB8fCAkaGFuZGxlciA9PT0gJHRoaXMpIHsKJGluZGV4ID0gJGtleTsKYnJlYWs7Cn0KfQppZiAoJGluZGV4ID09PSBmYWxzZSkgewoKcmV0dXJuOwp9Cgp1bnNldChzZWxmOjokaGFuZGxlcnNbJGluZGV4XSk7CgppZiAoc2VsZjo6JHdpbmRvd3NIYW5kbGVyICE9PSBudWxsICYmIChpbl9hcnJheShzZWxmOjpTSUdJTlQsICRzaWduYWxzLCB0cnVlKSB8fCBpbl9hcnJheShzZWxmOjpTSUdCUkVBSywgJHNpZ25hbHMsIHRydWUpKSkgewppZiAoc2VsZjo6Z2V0SGFuZGxlckZvcihzZWxmOjpTSUdJTlQpID09PSBudWxsICYmIHNlbGY6OmdldEhhbmRsZXJGb3Ioc2VsZjo6U0lHQlJFQUspID09PSBudWxsKSB7CnNhcGlfd2luZG93c19zZXRfY3RybF9oYW5kbGVyKHNlbGY6OiR3aW5kb3dzSGFuZGxlciwgZmFsc2UpOwpzZWxmOjokd2luZG93c0hhbmRsZXIgPSBudWxsOwp9Cn0KCmlmIChmdW5jdGlvbl9leGlzdHMoJ3BjbnRsX3NpZ25hbCcpKSB7CmZvcmVhY2ggKCRzaWduYWxzIGFzICRzaWduYWwpIHsKCmlmICghZGVmaW5lZCgkc2lnbmFsKSkgewpjb250aW51ZTsKfQoKCmlmIChzZWxmOjpnZXRIYW5kbGVyRm9yKCRzaWduYWwpICE9PSBudWxsKSB7CmNvbnRpbnVlOwp9CgpwY250bF9zaWduYWwoY29uc3RhbnQoJHNpZ25hbCksIFNJR19ERkwpOwp9Cn0KfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHVucmVnaXN0ZXJBbGwoKTogdm9pZAp7CmlmIChzZWxmOjokd2luZG93c0hhbmRsZXIgIT09IG51bGwpIHsKc2FwaV93aW5kb3dzX3NldF9jdHJsX2hhbmRsZXIoc2VsZjo6JHdpbmRvd3NIYW5kbGVyLCBmYWxzZSk7CnNlbGY6OiR3aW5kb3dzSGFuZGxlciA9IG51bGw7Cn0KCmZvcmVhY2ggKHNlbGY6OiRoYW5kbGVycyBhcyAka2V5ID0+ICRoYW5kbGVyKSB7CmlmICgkaGFuZGxlciBpbnN0YW5jZW9mIFdlYWtSZWZlcmVuY2UpIHsKJGhhbmRsZXIgPSAkaGFuZGxlci0+Z2V0KCk7CmlmICgkaGFuZGxlciA9PT0gbnVsbCkgewp1bnNldChzZWxmOjokaGFuZGxlcnNbJGtleV0pOwpjb250aW51ZTsKfQp9CiRoYW5kbGVyLT51bnJlZ2lzdGVyKCk7Cn0KfQoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gcmVnaXN0ZXJQY250bEhhbmRsZXIoYXJyYXkgJHNpZ25hbHMpOiB2b2lkCnsKc3RhdGljICRjYWxsYWJsZTsKaWYgKCRjYWxsYWJsZSA9PT0gbnVsbCkgewokY2FsbGFibGUgPSBDbG9zdXJlOjpmcm9tQ2FsbGFibGUoW3NlbGY6OmNsYXNzLCAnaGFuZGxlUGNudGxTaWduYWwnXSk7Cn0KZm9yZWFjaCAoJHNpZ25hbHMgYXMgJHNpZ25hbCkgewoKaWYgKCFkZWZpbmVkKCRzaWduYWwpKSB7CmNvbnRpbnVlOwp9CgpwY250bF9zaWduYWwoY29uc3RhbnQoJHNpZ25hbCksICRjYWxsYWJsZSk7Cn0KfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaGFuZGxlV2luZG93c1NpZ25hbChpbnQgJGV2ZW50KTogdm9pZAp7CmlmIChQSFBfV0lORE9XU19FVkVOVF9DVFJMX0MgPT09ICRldmVudCkgewpzZWxmOjpjYWxsSGFuZGxlckZvcihzZWxmOjpTSUdJTlQpOwp9IGVsc2VpZiAoUEhQX1dJTkRPV1NfRVZFTlRfQ1RSTF9CUkVBSyA9PT0gJGV2ZW50KSB7CnNlbGY6OmNhbGxIYW5kbGVyRm9yKHNlbGY6OlNJR0JSRUFLKTsKfQp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBoYW5kbGVQY250bFNpZ25hbChpbnQgJHNpZ25hbCk6IHZvaWQKewpzZWxmOjpjYWxsSGFuZGxlckZvcihzZWxmOjpnZXRTaWduYWxOYW1lKCRzaWduYWwpKTsKfQoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjYWxsSGFuZGxlckZvcihzdHJpbmcgJHNpZ25hbCk6IHZvaWQKewokaGFuZGxlciA9IHNlbGY6OmdldEhhbmRsZXJGb3IoJHNpZ25hbCk7CmlmICgkaGFuZGxlciAhPT0gbnVsbCkgewokaGFuZGxlci0+dHJpZ2dlcigkc2lnbmFsKTsKfQp9CgoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRIYW5kbGVyRm9yKHN0cmluZyAkc2lnbmFsKTogP3NlbGYKewpmb3JlYWNoIChzZWxmOjokaGFuZGxlcnMgYXMgJGtleSA9PiAkaGFuZGxlcikgewppZiAoJGhhbmRsZXIgaW5zdGFuY2VvZiBXZWFrUmVmZXJlbmNlKSB7CiRoYW5kbGVyID0gJGhhbmRsZXItPmdldCgpOwppZiAoJGhhbmRsZXIgPT09IG51bGwpIHsKdW5zZXQoc2VsZjo6JGhhbmRsZXJzWyRrZXldKTsKY29udGludWU7Cn0KfQppZiAoaW5fYXJyYXkoJHNpZ25hbCwgJGhhbmRsZXItPnNpZ25hbHMsIHRydWUpKSB7CnJldHVybiAkaGFuZGxlcjsKfQp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0U2lnbmFsTmFtZShpbnQgJHNpZ25vKTogc3RyaW5nCnsKc3RhdGljICRzaWduYWxzID0gbnVsbDsKaWYgKCRzaWduYWxzID09PSBudWxsKSB7CiRzaWduYWxzID0gW107CmZvcmVhY2ggKHNlbGY6OkFMTF9TSUdOQUxTIGFzICR2YWx1ZSkgewppZiAoZGVmaW5lZCgkdmFsdWUpKSB7CiRzaWduYWxzW2NvbnN0YW50KCR2YWx1ZSldID0gJHZhbHVlOwp9Cn0KfQoKaWYgKGlzc2V0KCRzaWduYWxzWyRzaWdub10pKSB7CnJldHVybiAkc2lnbmFsc1skc2lnbm9dOwp9Cgp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVW5rbm93biBzaWduYWwgIycuJHNpZ25vKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZTsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21wbGV0ZUNvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcRHVtcENvbXBsZXRpb25Db21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXEhlbHBDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXExhenlDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXExpc3RDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXFNpZ25hbGFibGVDb21tYW5kSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kTG9hZGVyXENvbW1hbmRMb2FkZXJJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvbklucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25TdWdnZXN0aW9uczsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXZlbnRcQ29uc29sZUNvbW1hbmRFdmVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXZlbnRcQ29uc29sZUVycm9yRXZlbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV2ZW50XENvbnNvbGVTaWduYWxFdmVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXZlbnRcQ29uc29sZVRlcm1pbmF0ZUV2ZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cQ29tbWFuZE5vdEZvdW5kRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cRXhjZXB0aW9uSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cTG9naWNFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxOYW1lc3BhY2VOb3RGb3VuZEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXFJ1bnRpbWVFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxEZWJ1Z0Zvcm1hdHRlckhlbHBlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXEZvcm1hdHRlckhlbHBlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXEhlbHBlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXEhlbHBlclNldDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFByb2Nlc3NIZWxwZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxRdWVzdGlvbkhlbHBlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcQXJndklucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxBcnJheUlucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEF3YXJlSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dERlZmluaXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVPdXRwdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxDb25zb2xlT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxTaWduYWxSZWdpc3RyeVxTaWduYWxSZWdpc3RyeTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcU3R5bGVcU3ltZm9ueVN0eWxlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRXJyb3JIYW5kbGVyXEVycm9ySGFuZGxlcjsKdXNlIFN5bWZvbnlcQ29udHJhY3RzXEV2ZW50RGlzcGF0Y2hlclxFdmVudERpc3BhdGNoZXJJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbnRyYWN0c1xTZXJ2aWNlXFJlc2V0SW50ZXJmYWNlOwoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgQXBwbGljYXRpb24gaW1wbGVtZW50cyBSZXNldEludGVyZmFjZQp7CnByaXZhdGUgJGNvbW1hbmRzID0gW107CnByaXZhdGUgJHdhbnRIZWxwcyA9IGZhbHNlOwpwcml2YXRlICRydW5uaW5nQ29tbWFuZDsKcHJpdmF0ZSAkbmFtZTsKcHJpdmF0ZSAkdmVyc2lvbjsKcHJpdmF0ZSAkY29tbWFuZExvYWRlcjsKcHJpdmF0ZSAkY2F0Y2hFeGNlcHRpb25zID0gdHJ1ZTsKcHJpdmF0ZSAkYXV0b0V4aXQgPSB0cnVlOwpwcml2YXRlICRkZWZpbml0aW9uOwpwcml2YXRlICRoZWxwZXJTZXQ7CnByaXZhdGUgJGRpc3BhdGNoZXI7CnByaXZhdGUgJHRlcm1pbmFsOwpwcml2YXRlICRkZWZhdWx0Q29tbWFuZDsKcHJpdmF0ZSAkc2luZ2xlQ29tbWFuZCA9IGZhbHNlOwpwcml2YXRlICRpbml0aWFsaXplZDsKcHJpdmF0ZSAkc2lnbmFsUmVnaXN0cnk7CnByaXZhdGUgJHNpZ25hbHNUb0Rpc3BhdGNoRXZlbnQgPSBbXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG5hbWUgPSAnVU5LTk9XTicsIHN0cmluZyAkdmVyc2lvbiA9ICdVTktOT1dOJykKewokdGhpcy0+bmFtZSA9ICRuYW1lOwokdGhpcy0+dmVyc2lvbiA9ICR2ZXJzaW9uOwokdGhpcy0+dGVybWluYWwgPSBuZXcgVGVybWluYWwoKTsKJHRoaXMtPmRlZmF1bHRDb21tYW5kID0gJ2xpc3QnOwppZiAoXGRlZmluZWQoJ1NJR0lOVCcpICYmIFNpZ25hbFJlZ2lzdHJ5Ojppc1N1cHBvcnRlZCgpKSB7CiR0aGlzLT5zaWduYWxSZWdpc3RyeSA9IG5ldyBTaWduYWxSZWdpc3RyeSgpOwokdGhpcy0+c2lnbmFsc1RvRGlzcGF0Y2hFdmVudCA9IFtcU0lHSU5ULCBcU0lHVEVSTSwgXFNJR1VTUjEsIFxTSUdVU1IyXTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGlzcGF0Y2hlcihFdmVudERpc3BhdGNoZXJJbnRlcmZhY2UgJGRpc3BhdGNoZXIpCnsKJHRoaXMtPmRpc3BhdGNoZXIgPSAkZGlzcGF0Y2hlcjsKfQoKcHVibGljIGZ1bmN0aW9uIHNldENvbW1hbmRMb2FkZXIoQ29tbWFuZExvYWRlckludGVyZmFjZSAkY29tbWFuZExvYWRlcikKewokdGhpcy0+Y29tbWFuZExvYWRlciA9ICRjb21tYW5kTG9hZGVyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U2lnbmFsUmVnaXN0cnkoKTogU2lnbmFsUmVnaXN0cnkKewppZiAoISR0aGlzLT5zaWduYWxSZWdpc3RyeSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignU2lnbmFscyBhcmUgbm90IHN1cHBvcnRlZC4gTWFrZSBzdXJlIHRoYXQgdGhlIGBwY250bGAgZXh0ZW5zaW9uIGlzIGluc3RhbGxlZCBhbmQgdGhhdCAicGNudGxfKiIgZnVuY3Rpb25zIGFyZSBub3QgZGlzYWJsZWQgYnkgeW91ciBwaHAuaW5pXCdzICJkaXNhYmxlX2Z1bmN0aW9ucyIgZGlyZWN0aXZlLicpOwp9CgpyZXR1cm4gJHRoaXMtPnNpZ25hbFJlZ2lzdHJ5Owp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0U2lnbmFsc1RvRGlzcGF0Y2hFdmVudChpbnQgLi4uJHNpZ25hbHNUb0Rpc3BhdGNoRXZlbnQpCnsKJHRoaXMtPnNpZ25hbHNUb0Rpc3BhdGNoRXZlbnQgPSAkc2lnbmFsc1RvRGlzcGF0Y2hFdmVudDsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBydW4oP0lucHV0SW50ZXJmYWNlICRpbnB1dCA9IG51bGwsID9PdXRwdXRJbnRlcmZhY2UgJG91dHB1dCA9IG51bGwpCnsKaWYgKFxmdW5jdGlvbl9leGlzdHMoJ3B1dGVudicpKSB7CkBwdXRlbnYoJ0xJTkVTPScuJHRoaXMtPnRlcm1pbmFsLT5nZXRIZWlnaHQoKSk7CkBwdXRlbnYoJ0NPTFVNTlM9Jy4kdGhpcy0+dGVybWluYWwtPmdldFdpZHRoKCkpOwp9CgppZiAobnVsbCA9PT0gJGlucHV0KSB7CiRpbnB1dCA9IG5ldyBBcmd2SW5wdXQoKTsKfQoKaWYgKG51bGwgPT09ICRvdXRwdXQpIHsKJG91dHB1dCA9IG5ldyBDb25zb2xlT3V0cHV0KCk7Cn0KCiRyZW5kZXJFeGNlcHRpb24gPSBmdW5jdGlvbiAoXFRocm93YWJsZSAkZSkgdXNlICgkb3V0cHV0KSB7CmlmICgkb3V0cHV0IGluc3RhbmNlb2YgQ29uc29sZU91dHB1dEludGVyZmFjZSkgewokdGhpcy0+cmVuZGVyVGhyb3dhYmxlKCRlLCAkb3V0cHV0LT5nZXRFcnJvck91dHB1dCgpKTsKfSBlbHNlIHsKJHRoaXMtPnJlbmRlclRocm93YWJsZSgkZSwgJG91dHB1dCk7Cn0KfTsKaWYgKCRwaHBIYW5kbGVyID0gc2V0X2V4Y2VwdGlvbl9oYW5kbGVyKCRyZW5kZXJFeGNlcHRpb24pKSB7CnJlc3RvcmVfZXhjZXB0aW9uX2hhbmRsZXIoKTsKaWYgKCFcaXNfYXJyYXkoJHBocEhhbmRsZXIpIHx8ICEkcGhwSGFuZGxlclswXSBpbnN0YW5jZW9mIEVycm9ySGFuZGxlcikgewokZXJyb3JIYW5kbGVyID0gdHJ1ZTsKfSBlbHNlaWYgKCRlcnJvckhhbmRsZXIgPSAkcGhwSGFuZGxlclswXS0+c2V0RXhjZXB0aW9uSGFuZGxlcigkcmVuZGVyRXhjZXB0aW9uKSkgewokcGhwSGFuZGxlclswXS0+c2V0RXhjZXB0aW9uSGFuZGxlcigkZXJyb3JIYW5kbGVyKTsKfQp9Cgp0cnkgewokdGhpcy0+Y29uZmlndXJlSU8oJGlucHV0LCAkb3V0cHV0KTsKCiRleGl0Q29kZSA9ICR0aGlzLT5kb1J1bigkaW5wdXQsICRvdXRwdXQpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmlmICghJHRoaXMtPmNhdGNoRXhjZXB0aW9ucykgewp0aHJvdyAkZTsKfQoKJHJlbmRlckV4Y2VwdGlvbigkZSk7CgokZXhpdENvZGUgPSAkZS0+Z2V0Q29kZSgpOwppZiAoaXNfbnVtZXJpYygkZXhpdENvZGUpKSB7CiRleGl0Q29kZSA9IChpbnQpICRleGl0Q29kZTsKaWYgKCRleGl0Q29kZSA8PSAwKSB7CiRleGl0Q29kZSA9IDE7Cn0KfSBlbHNlIHsKJGV4aXRDb2RlID0gMTsKfQp9IGZpbmFsbHkgewoKCmlmICghJHBocEhhbmRsZXIpIHsKaWYgKHNldF9leGNlcHRpb25faGFuZGxlcigkcmVuZGVyRXhjZXB0aW9uKSA9PT0gJHJlbmRlckV4Y2VwdGlvbikgewpyZXN0b3JlX2V4Y2VwdGlvbl9oYW5kbGVyKCk7Cn0KcmVzdG9yZV9leGNlcHRpb25faGFuZGxlcigpOwp9IGVsc2VpZiAoISRlcnJvckhhbmRsZXIpIHsKJGZpbmFsSGFuZGxlciA9ICRwaHBIYW5kbGVyWzBdLT5zZXRFeGNlcHRpb25IYW5kbGVyKG51bGwpOwppZiAoJGZpbmFsSGFuZGxlciAhPT0gJHJlbmRlckV4Y2VwdGlvbikgewokcGhwSGFuZGxlclswXS0+c2V0RXhjZXB0aW9uSGFuZGxlcigkZmluYWxIYW5kbGVyKTsKfQp9Cn0KCmlmICgkdGhpcy0+YXV0b0V4aXQpIHsKaWYgKCRleGl0Q29kZSA+IDI1NSkgewokZXhpdENvZGUgPSAyNTU7Cn0KCmV4aXQoJGV4aXRDb2RlKTsKfQoKcmV0dXJuICRleGl0Q29kZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZG9SdW4oSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewppZiAodHJ1ZSA9PT0gJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oWyctLXZlcnNpb24nLCAnLVYnXSwgdHJ1ZSkpIHsKJG91dHB1dC0+d3JpdGVsbigkdGhpcy0+Z2V0TG9uZ1ZlcnNpb24oKSk7CgpyZXR1cm4gMDsKfQoKdHJ5IHsKCiRpbnB1dC0+YmluZCgkdGhpcy0+Z2V0RGVmaW5pdGlvbigpKTsKfSBjYXRjaCAoRXhjZXB0aW9uSW50ZXJmYWNlICRlKSB7Cgp9CgokbmFtZSA9ICR0aGlzLT5nZXRDb21tYW5kTmFtZSgkaW5wdXQpOwppZiAodHJ1ZSA9PT0gJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oWyctLWhlbHAnLCAnLWgnXSwgdHJ1ZSkpIHsKaWYgKCEkbmFtZSkgewokbmFtZSA9ICdoZWxwJzsKJGlucHV0ID0gbmV3IEFycmF5SW5wdXQoWydjb21tYW5kX25hbWUnID0+ICR0aGlzLT5kZWZhdWx0Q29tbWFuZF0pOwp9IGVsc2UgewokdGhpcy0+d2FudEhlbHBzID0gdHJ1ZTsKfQp9CgppZiAoISRuYW1lKSB7CiRuYW1lID0gJHRoaXMtPmRlZmF1bHRDb21tYW5kOwokZGVmaW5pdGlvbiA9ICR0aGlzLT5nZXREZWZpbml0aW9uKCk7CiRkZWZpbml0aW9uLT5zZXRBcmd1bWVudHMoYXJyYXlfbWVyZ2UoCiRkZWZpbml0aW9uLT5nZXRBcmd1bWVudHMoKSwKWwonY29tbWFuZCcgPT4gbmV3IElucHV0QXJndW1lbnQoJ2NvbW1hbmQnLCBJbnB1dEFyZ3VtZW50OjpPUFRJT05BTCwgJGRlZmluaXRpb24tPmdldEFyZ3VtZW50KCdjb21tYW5kJyktPmdldERlc2NyaXB0aW9uKCksICRuYW1lKSwKXQopKTsKfQoKdHJ5IHsKJHRoaXMtPnJ1bm5pbmdDb21tYW5kID0gbnVsbDsKCiRjb21tYW5kID0gJHRoaXMtPmZpbmQoJG5hbWUpOwp9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7CmlmICghKCRlIGluc3RhbmNlb2YgQ29tbWFuZE5vdEZvdW5kRXhjZXB0aW9uICYmICEkZSBpbnN0YW5jZW9mIE5hbWVzcGFjZU5vdEZvdW5kRXhjZXB0aW9uKSB8fCAxICE9PSBcY291bnQoJGFsdGVybmF0aXZlcyA9ICRlLT5nZXRBbHRlcm5hdGl2ZXMoKSkgfHwgISRpbnB1dC0+aXNJbnRlcmFjdGl2ZSgpKSB7CmlmIChudWxsICE9PSAkdGhpcy0+ZGlzcGF0Y2hlcikgewokZXZlbnQgPSBuZXcgQ29uc29sZUVycm9yRXZlbnQoJGlucHV0LCAkb3V0cHV0LCAkZSk7CiR0aGlzLT5kaXNwYXRjaGVyLT5kaXNwYXRjaCgkZXZlbnQsIENvbnNvbGVFdmVudHM6OkVSUk9SKTsKCmlmICgwID09PSAkZXZlbnQtPmdldEV4aXRDb2RlKCkpIHsKcmV0dXJuIDA7Cn0KCiRlID0gJGV2ZW50LT5nZXRFcnJvcigpOwp9Cgp0aHJvdyAkZTsKfQoKJGFsdGVybmF0aXZlID0gJGFsdGVybmF0aXZlc1swXTsKCiRzdHlsZSA9IG5ldyBTeW1mb255U3R5bGUoJGlucHV0LCAkb3V0cHV0KTsKJG91dHB1dC0+d3JpdGVsbignJyk7CiRmb3JtYXR0ZWRCbG9jayA9IChuZXcgRm9ybWF0dGVySGVscGVyKCkpLT5mb3JtYXRCbG9jayhzcHJpbnRmKCdDb21tYW5kICIlcyIgaXMgbm90IGRlZmluZWQuJywgJG5hbWUpLCAnZXJyb3InLCB0cnVlKTsKJG91dHB1dC0+d3JpdGVsbigkZm9ybWF0dGVkQmxvY2spOwppZiAoISRzdHlsZS0+Y29uZmlybShzcHJpbnRmKCdEbyB5b3Ugd2FudCB0byBydW4gIiVzIiBpbnN0ZWFkPyAnLCAkYWx0ZXJuYXRpdmUpLCBmYWxzZSkpIHsKaWYgKG51bGwgIT09ICR0aGlzLT5kaXNwYXRjaGVyKSB7CiRldmVudCA9IG5ldyBDb25zb2xlRXJyb3JFdmVudCgkaW5wdXQsICRvdXRwdXQsICRlKTsKJHRoaXMtPmRpc3BhdGNoZXItPmRpc3BhdGNoKCRldmVudCwgQ29uc29sZUV2ZW50czo6RVJST1IpOwoKcmV0dXJuICRldmVudC0+Z2V0RXhpdENvZGUoKTsKfQoKcmV0dXJuIDE7Cn0KCiRjb21tYW5kID0gJHRoaXMtPmZpbmQoJGFsdGVybmF0aXZlKTsKfQoKaWYgKCRjb21tYW5kIGluc3RhbmNlb2YgTGF6eUNvbW1hbmQpIHsKJGNvbW1hbmQgPSAkY29tbWFuZC0+Z2V0Q29tbWFuZCgpOwp9CgokdGhpcy0+cnVubmluZ0NvbW1hbmQgPSAkY29tbWFuZDsKJGV4aXRDb2RlID0gJHRoaXMtPmRvUnVuQ29tbWFuZCgkY29tbWFuZCwgJGlucHV0LCAkb3V0cHV0KTsKJHRoaXMtPnJ1bm5pbmdDb21tYW5kID0gbnVsbDsKCnJldHVybiAkZXhpdENvZGU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZXNldCgpCnsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEhlbHBlclNldChIZWxwZXJTZXQgJGhlbHBlclNldCkKewokdGhpcy0+aGVscGVyU2V0ID0gJGhlbHBlclNldDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SGVscGVyU2V0KCkKewppZiAoISR0aGlzLT5oZWxwZXJTZXQpIHsKJHRoaXMtPmhlbHBlclNldCA9ICR0aGlzLT5nZXREZWZhdWx0SGVscGVyU2V0KCk7Cn0KCnJldHVybiAkdGhpcy0+aGVscGVyU2V0Owp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0RGVmaW5pdGlvbihJbnB1dERlZmluaXRpb24gJGRlZmluaXRpb24pCnsKJHRoaXMtPmRlZmluaXRpb24gPSAkZGVmaW5pdGlvbjsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGVmaW5pdGlvbigpCnsKaWYgKCEkdGhpcy0+ZGVmaW5pdGlvbikgewokdGhpcy0+ZGVmaW5pdGlvbiA9ICR0aGlzLT5nZXREZWZhdWx0SW5wdXREZWZpbml0aW9uKCk7Cn0KCmlmICgkdGhpcy0+c2luZ2xlQ29tbWFuZCkgewokaW5wdXREZWZpbml0aW9uID0gJHRoaXMtPmRlZmluaXRpb247CiRpbnB1dERlZmluaXRpb24tPnNldEFyZ3VtZW50cygpOwoKcmV0dXJuICRpbnB1dERlZmluaXRpb247Cn0KCnJldHVybiAkdGhpcy0+ZGVmaW5pdGlvbjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbXBsZXRlKENvbXBsZXRpb25JbnB1dCAkaW5wdXQsIENvbXBsZXRpb25TdWdnZXN0aW9ucyAkc3VnZ2VzdGlvbnMpOiB2b2lkCnsKaWYgKApDb21wbGV0aW9uSW5wdXQ6OlRZUEVfQVJHVU1FTlRfVkFMVUUgPT09ICRpbnB1dC0+Z2V0Q29tcGxldGlvblR5cGUoKQomJiAnY29tbWFuZCcgPT09ICRpbnB1dC0+Z2V0Q29tcGxldGlvbk5hbWUoKQopIHsKJGNvbW1hbmROYW1lcyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+YWxsKCkgYXMgJG5hbWUgPT4gJGNvbW1hbmQpIHsKCmlmICgkY29tbWFuZC0+aXNIaWRkZW4oKSB8fCAkY29tbWFuZC0+Z2V0TmFtZSgpICE9PSAkbmFtZSkgewpjb250aW51ZTsKfQokY29tbWFuZE5hbWVzW10gPSAkY29tbWFuZC0+Z2V0TmFtZSgpOwpmb3JlYWNoICgkY29tbWFuZC0+Z2V0QWxpYXNlcygpIGFzICRuYW1lKSB7CiRjb21tYW5kTmFtZXNbXSA9ICRuYW1lOwp9Cn0KJHN1Z2dlc3Rpb25zLT5zdWdnZXN0VmFsdWVzKGFycmF5X2ZpbHRlcigkY29tbWFuZE5hbWVzKSk7CgpyZXR1cm47Cn0KCmlmIChDb21wbGV0aW9uSW5wdXQ6OlRZUEVfT1BUSU9OX05BTUUgPT09ICRpbnB1dC0+Z2V0Q29tcGxldGlvblR5cGUoKSkgewokc3VnZ2VzdGlvbnMtPnN1Z2dlc3RPcHRpb25zKCR0aGlzLT5nZXREZWZpbml0aW9uKCktPmdldE9wdGlvbnMoKSk7CgpyZXR1cm47Cn0KfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SGVscCgpCnsKcmV0dXJuICR0aGlzLT5nZXRMb25nVmVyc2lvbigpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhcmVFeGNlcHRpb25zQ2F1Z2h0KCkKewpyZXR1cm4gJHRoaXMtPmNhdGNoRXhjZXB0aW9uczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldENhdGNoRXhjZXB0aW9ucyhib29sICRib29sZWFuKQp7CiR0aGlzLT5jYXRjaEV4Y2VwdGlvbnMgPSAkYm9vbGVhbjsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNBdXRvRXhpdEVuYWJsZWQoKQp7CnJldHVybiAkdGhpcy0+YXV0b0V4aXQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBdXRvRXhpdChib29sICRib29sZWFuKQp7CiR0aGlzLT5hdXRvRXhpdCA9ICRib29sZWFuOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCkKewpyZXR1cm4gJHRoaXMtPm5hbWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXROYW1lKHN0cmluZyAkbmFtZSkKewokdGhpcy0+bmFtZSA9ICRuYW1lOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRWZXJzaW9uKCkKewpyZXR1cm4gJHRoaXMtPnZlcnNpb247Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRWZXJzaW9uKHN0cmluZyAkdmVyc2lvbikKewokdGhpcy0+dmVyc2lvbiA9ICR2ZXJzaW9uOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMb25nVmVyc2lvbigpCnsKaWYgKCdVTktOT1dOJyAhPT0gJHRoaXMtPmdldE5hbWUoKSkgewppZiAoJ1VOS05PV04nICE9PSAkdGhpcy0+Z2V0VmVyc2lvbigpKSB7CnJldHVybiBzcHJpbnRmKCclcyA8aW5mbz4lczwvaW5mbz4nLCAkdGhpcy0+Z2V0TmFtZSgpLCAkdGhpcy0+Z2V0VmVyc2lvbigpKTsKfQoKcmV0dXJuICR0aGlzLT5nZXROYW1lKCk7Cn0KCnJldHVybiAnQ29uc29sZSBUb29sJzsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXIoc3RyaW5nICRuYW1lKQp7CnJldHVybiAkdGhpcy0+YWRkKG5ldyBDb21tYW5kKCRuYW1lKSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkQ29tbWFuZHMoYXJyYXkgJGNvbW1hbmRzKQp7CmZvcmVhY2ggKCRjb21tYW5kcyBhcyAkY29tbWFuZCkgewokdGhpcy0+YWRkKCRjb21tYW5kKTsKfQp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGQoQ29tbWFuZCAkY29tbWFuZCkKewokdGhpcy0+aW5pdCgpOwoKJGNvbW1hbmQtPnNldEFwcGxpY2F0aW9uKCR0aGlzKTsKCmlmICghJGNvbW1hbmQtPmlzRW5hYmxlZCgpKSB7CiRjb21tYW5kLT5zZXRBcHBsaWNhdGlvbihudWxsKTsKCnJldHVybiBudWxsOwp9CgppZiAoISRjb21tYW5kIGluc3RhbmNlb2YgTGF6eUNvbW1hbmQpIHsKCiRjb21tYW5kLT5nZXREZWZpbml0aW9uKCk7Cn0KCmlmICghJGNvbW1hbmQtPmdldE5hbWUoKSkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oc3ByaW50ZignVGhlIGNvbW1hbmQgZGVmaW5lZCBpbiAiJXMiIGNhbm5vdCBoYXZlIGFuIGVtcHR5IG5hbWUuJywgZ2V0X2RlYnVnX3R5cGUoJGNvbW1hbmQpKSk7Cn0KCiR0aGlzLT5jb21tYW5kc1skY29tbWFuZC0+Z2V0TmFtZSgpXSA9ICRjb21tYW5kOwoKZm9yZWFjaCAoJGNvbW1hbmQtPmdldEFsaWFzZXMoKSBhcyAkYWxpYXMpIHsKJHRoaXMtPmNvbW1hbmRzWyRhbGlhc10gPSAkY29tbWFuZDsKfQoKcmV0dXJuICRjb21tYW5kOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldChzdHJpbmcgJG5hbWUpCnsKJHRoaXMtPmluaXQoKTsKCmlmICghJHRoaXMtPmhhcygkbmFtZSkpIHsKdGhyb3cgbmV3IENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgY29tbWFuZCAiJXMiIGRvZXMgbm90IGV4aXN0LicsICRuYW1lKSk7Cn0KCgppZiAoIWlzc2V0KCR0aGlzLT5jb21tYW5kc1skbmFtZV0pKSB7CnRocm93IG5ldyBDb21tYW5kTm90Rm91bmRFeGNlcHRpb24oc3ByaW50ZignVGhlICIlcyIgY29tbWFuZCBjYW5ub3QgYmUgZm91bmQgYmVjYXVzZSBpdCBpcyByZWdpc3RlcmVkIHVuZGVyIG11bHRpcGxlIG5hbWVzLiBNYWtlIHN1cmUgeW91IGRvblwndCBzZXQgYSBkaWZmZXJlbnQgbmFtZSB2aWEgY29uc3RydWN0b3Igb3IgInNldE5hbWUoKSIuJywgJG5hbWUpKTsKfQoKJGNvbW1hbmQgPSAkdGhpcy0+Y29tbWFuZHNbJG5hbWVdOwoKaWYgKCR0aGlzLT53YW50SGVscHMpIHsKJHRoaXMtPndhbnRIZWxwcyA9IGZhbHNlOwoKJGhlbHBDb21tYW5kID0gJHRoaXMtPmdldCgnaGVscCcpOwokaGVscENvbW1hbmQtPnNldENvbW1hbmQoJGNvbW1hbmQpOwoKcmV0dXJuICRoZWxwQ29tbWFuZDsKfQoKcmV0dXJuICRjb21tYW5kOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXMoc3RyaW5nICRuYW1lKQp7CiR0aGlzLT5pbml0KCk7CgpyZXR1cm4gaXNzZXQoJHRoaXMtPmNvbW1hbmRzWyRuYW1lXSkgfHwgKCR0aGlzLT5jb21tYW5kTG9hZGVyICYmICR0aGlzLT5jb21tYW5kTG9hZGVyLT5oYXMoJG5hbWUpICYmICR0aGlzLT5hZGQoJHRoaXMtPmNvbW1hbmRMb2FkZXItPmdldCgkbmFtZSkpKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lc3BhY2VzKCkKewokbmFtZXNwYWNlcyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+YWxsKCkgYXMgJGNvbW1hbmQpIHsKaWYgKCRjb21tYW5kLT5pc0hpZGRlbigpKSB7CmNvbnRpbnVlOwp9CgokbmFtZXNwYWNlc1tdID0gJHRoaXMtPmV4dHJhY3RBbGxOYW1lc3BhY2VzKCRjb21tYW5kLT5nZXROYW1lKCkpOwoKZm9yZWFjaCAoJGNvbW1hbmQtPmdldEFsaWFzZXMoKSBhcyAkYWxpYXMpIHsKJG5hbWVzcGFjZXNbXSA9ICR0aGlzLT5leHRyYWN0QWxsTmFtZXNwYWNlcygkYWxpYXMpOwp9Cn0KCnJldHVybiBhcnJheV92YWx1ZXMoYXJyYXlfdW5pcXVlKGFycmF5X2ZpbHRlcihhcnJheV9tZXJnZShbXSwgLi4uJG5hbWVzcGFjZXMpKSkpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmROYW1lc3BhY2Uoc3RyaW5nICRuYW1lc3BhY2UpCnsKJGFsbE5hbWVzcGFjZXMgPSAkdGhpcy0+Z2V0TmFtZXNwYWNlcygpOwokZXhwciA9IGltcGxvZGUoJ1teOl0qOicsIGFycmF5X21hcCgncHJlZ19xdW90ZScsIGV4cGxvZGUoJzonLCAkbmFtZXNwYWNlKSkpLidbXjpdKic7CiRuYW1lc3BhY2VzID0gcHJlZ19ncmVwKCd7XicuJGV4cHIuJ30nLCAkYWxsTmFtZXNwYWNlcyk7CgppZiAoZW1wdHkoJG5hbWVzcGFjZXMpKSB7CiRtZXNzYWdlID0gc3ByaW50ZignVGhlcmUgYXJlIG5vIGNvbW1hbmRzIGRlZmluZWQgaW4gdGhlICIlcyIgbmFtZXNwYWNlLicsICRuYW1lc3BhY2UpOwoKaWYgKCRhbHRlcm5hdGl2ZXMgPSAkdGhpcy0+ZmluZEFsdGVybmF0aXZlcygkbmFtZXNwYWNlLCAkYWxsTmFtZXNwYWNlcykpIHsKaWYgKDEgPT0gXGNvdW50KCRhbHRlcm5hdGl2ZXMpKSB7CiRtZXNzYWdlIC49ICJcblxuRGlkIHlvdSBtZWFuIHRoaXM/XG4gICAgIjsKfSBlbHNlIHsKJG1lc3NhZ2UgLj0gIlxuXG5EaWQgeW91IG1lYW4gb25lIG9mIHRoZXNlP1xuICAgICI7Cn0KCiRtZXNzYWdlIC49IGltcGxvZGUoIlxuICAgICIsICRhbHRlcm5hdGl2ZXMpOwp9Cgp0aHJvdyBuZXcgTmFtZXNwYWNlTm90Rm91bmRFeGNlcHRpb24oJG1lc3NhZ2UsICRhbHRlcm5hdGl2ZXMpOwp9CgokZXhhY3QgPSBcaW5fYXJyYXkoJG5hbWVzcGFjZSwgJG5hbWVzcGFjZXMsIHRydWUpOwppZiAoXGNvdW50KCRuYW1lc3BhY2VzKSA+IDEgJiYgISRleGFjdCkgewp0aHJvdyBuZXcgTmFtZXNwYWNlTm90Rm91bmRFeGNlcHRpb24oc3ByaW50ZigiVGhlIG5hbWVzcGFjZSBcIiVzXCIgaXMgYW1iaWd1b3VzLlxuRGlkIHlvdSBtZWFuIG9uZSBvZiB0aGVzZT9cbiVzLiIsICRuYW1lc3BhY2UsICR0aGlzLT5nZXRBYmJyZXZpYXRpb25TdWdnZXN0aW9ucyhhcnJheV92YWx1ZXMoJG5hbWVzcGFjZXMpKSksIGFycmF5X3ZhbHVlcygkbmFtZXNwYWNlcykpOwp9CgpyZXR1cm4gJGV4YWN0ID8gJG5hbWVzcGFjZSA6IHJlc2V0KCRuYW1lc3BhY2VzKTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kKHN0cmluZyAkbmFtZSkKewokdGhpcy0+aW5pdCgpOwoKJGFsaWFzZXMgPSBbXTsKCmZvcmVhY2ggKCR0aGlzLT5jb21tYW5kcyBhcyAkY29tbWFuZCkgewpmb3JlYWNoICgkY29tbWFuZC0+Z2V0QWxpYXNlcygpIGFzICRhbGlhcykgewppZiAoISR0aGlzLT5oYXMoJGFsaWFzKSkgewokdGhpcy0+Y29tbWFuZHNbJGFsaWFzXSA9ICRjb21tYW5kOwp9Cn0KfQoKaWYgKCR0aGlzLT5oYXMoJG5hbWUpKSB7CnJldHVybiAkdGhpcy0+Z2V0KCRuYW1lKTsKfQoKJGFsbENvbW1hbmRzID0gJHRoaXMtPmNvbW1hbmRMb2FkZXIgPyBhcnJheV9tZXJnZSgkdGhpcy0+Y29tbWFuZExvYWRlci0+Z2V0TmFtZXMoKSwgYXJyYXlfa2V5cygkdGhpcy0+Y29tbWFuZHMpKSA6IGFycmF5X2tleXMoJHRoaXMtPmNvbW1hbmRzKTsKJGV4cHIgPSBpbXBsb2RlKCdbXjpdKjonLCBhcnJheV9tYXAoJ3ByZWdfcXVvdGUnLCBleHBsb2RlKCc6JywgJG5hbWUpKSkuJ1teOl0qJzsKJGNvbW1hbmRzID0gcHJlZ19ncmVwKCd7XicuJGV4cHIuJ30nLCAkYWxsQ29tbWFuZHMpOwoKaWYgKGVtcHR5KCRjb21tYW5kcykpIHsKJGNvbW1hbmRzID0gcHJlZ19ncmVwKCd7XicuJGV4cHIuJ31pJywgJGFsbENvbW1hbmRzKTsKfQoKCmlmIChlbXB0eSgkY29tbWFuZHMpIHx8IFxjb3VudChwcmVnX2dyZXAoJ3teJy4kZXhwci4nJH1pJywgJGNvbW1hbmRzKSkgPCAxKSB7CmlmIChmYWxzZSAhPT0gJHBvcyA9IHN0cnJwb3MoJG5hbWUsICc6JykpIHsKCiR0aGlzLT5maW5kTmFtZXNwYWNlKHN1YnN0cigkbmFtZSwgMCwgJHBvcykpOwp9CgokbWVzc2FnZSA9IHNwcmludGYoJ0NvbW1hbmQgIiVzIiBpcyBub3QgZGVmaW5lZC4nLCAkbmFtZSk7CgppZiAoJGFsdGVybmF0aXZlcyA9ICR0aGlzLT5maW5kQWx0ZXJuYXRpdmVzKCRuYW1lLCAkYWxsQ29tbWFuZHMpKSB7CgokYWx0ZXJuYXRpdmVzID0gYXJyYXlfZmlsdGVyKCRhbHRlcm5hdGl2ZXMsIGZ1bmN0aW9uICgkbmFtZSkgewpyZXR1cm4gISR0aGlzLT5nZXQoJG5hbWUpLT5pc0hpZGRlbigpOwp9KTsKCmlmICgxID09IFxjb3VudCgkYWx0ZXJuYXRpdmVzKSkgewokbWVzc2FnZSAuPSAiXG5cbkRpZCB5b3UgbWVhbiB0aGlzP1xuICAgICI7Cn0gZWxzZSB7CiRtZXNzYWdlIC49ICJcblxuRGlkIHlvdSBtZWFuIG9uZSBvZiB0aGVzZT9cbiAgICAiOwp9CiRtZXNzYWdlIC49IGltcGxvZGUoIlxuICAgICIsICRhbHRlcm5hdGl2ZXMpOwp9Cgp0aHJvdyBuZXcgQ29tbWFuZE5vdEZvdW5kRXhjZXB0aW9uKCRtZXNzYWdlLCBhcnJheV92YWx1ZXMoJGFsdGVybmF0aXZlcykpOwp9CgoKaWYgKFxjb3VudCgkY29tbWFuZHMpID4gMSkgewokY29tbWFuZExpc3QgPSAkdGhpcy0+Y29tbWFuZExvYWRlciA/IGFycmF5X21lcmdlKGFycmF5X2ZsaXAoJHRoaXMtPmNvbW1hbmRMb2FkZXItPmdldE5hbWVzKCkpLCAkdGhpcy0+Y29tbWFuZHMpIDogJHRoaXMtPmNvbW1hbmRzOwokY29tbWFuZHMgPSBhcnJheV91bmlxdWUoYXJyYXlfZmlsdGVyKCRjb21tYW5kcywgZnVuY3Rpb24gKCRuYW1lT3JBbGlhcykgdXNlICgmJGNvbW1hbmRMaXN0LCAkY29tbWFuZHMsICYkYWxpYXNlcykgewppZiAoISRjb21tYW5kTGlzdFskbmFtZU9yQWxpYXNdIGluc3RhbmNlb2YgQ29tbWFuZCkgewokY29tbWFuZExpc3RbJG5hbWVPckFsaWFzXSA9ICR0aGlzLT5jb21tYW5kTG9hZGVyLT5nZXQoJG5hbWVPckFsaWFzKTsKfQoKJGNvbW1hbmROYW1lID0gJGNvbW1hbmRMaXN0WyRuYW1lT3JBbGlhc10tPmdldE5hbWUoKTsKCiRhbGlhc2VzWyRuYW1lT3JBbGlhc10gPSAkY29tbWFuZE5hbWU7CgpyZXR1cm4gJGNvbW1hbmROYW1lID09PSAkbmFtZU9yQWxpYXMgfHwgIVxpbl9hcnJheSgkY29tbWFuZE5hbWUsICRjb21tYW5kcyk7Cn0pKTsKfQoKaWYgKFxjb3VudCgkY29tbWFuZHMpID4gMSkgewokdXNhYmxlV2lkdGggPSAkdGhpcy0+dGVybWluYWwtPmdldFdpZHRoKCkgLSAxMDsKJGFiYnJldnMgPSBhcnJheV92YWx1ZXMoJGNvbW1hbmRzKTsKJG1heExlbiA9IDA7CmZvcmVhY2ggKCRhYmJyZXZzIGFzICRhYmJyZXYpIHsKJG1heExlbiA9IG1heChIZWxwZXI6OndpZHRoKCRhYmJyZXYpLCAkbWF4TGVuKTsKfQokYWJicmV2cyA9IGFycmF5X21hcChmdW5jdGlvbiAoJGNtZCkgdXNlICgkY29tbWFuZExpc3QsICR1c2FibGVXaWR0aCwgJG1heExlbiwgJiRjb21tYW5kcykgewppZiAoJGNvbW1hbmRMaXN0WyRjbWRdLT5pc0hpZGRlbigpKSB7CnVuc2V0KCRjb21tYW5kc1thcnJheV9zZWFyY2goJGNtZCwgJGNvbW1hbmRzKV0pOwoKcmV0dXJuIGZhbHNlOwp9CgokYWJicmV2ID0gc3RyX3BhZCgkY21kLCAkbWF4TGVuLCAnICcpLicgJy4kY29tbWFuZExpc3RbJGNtZF0tPmdldERlc2NyaXB0aW9uKCk7CgpyZXR1cm4gSGVscGVyOjp3aWR0aCgkYWJicmV2KSA+ICR1c2FibGVXaWR0aCA/IEhlbHBlcjo6c3Vic3RyKCRhYmJyZXYsIDAsICR1c2FibGVXaWR0aCAtIDMpLicuLi4nIDogJGFiYnJldjsKfSwgYXJyYXlfdmFsdWVzKCRjb21tYW5kcykpOwoKaWYgKFxjb3VudCgkY29tbWFuZHMpID4gMSkgewokc3VnZ2VzdGlvbnMgPSAkdGhpcy0+Z2V0QWJicmV2aWF0aW9uU3VnZ2VzdGlvbnMoYXJyYXlfZmlsdGVyKCRhYmJyZXZzKSk7Cgp0aHJvdyBuZXcgQ29tbWFuZE5vdEZvdW5kRXhjZXB0aW9uKHNwcmludGYoIkNvbW1hbmQgXCIlc1wiIGlzIGFtYmlndW91cy5cbkRpZCB5b3UgbWVhbiBvbmUgb2YgdGhlc2U/XG4lcy4iLCAkbmFtZSwgJHN1Z2dlc3Rpb25zKSwgYXJyYXlfdmFsdWVzKCRjb21tYW5kcykpOwp9Cn0KCiRjb21tYW5kID0gJHRoaXMtPmdldChyZXNldCgkY29tbWFuZHMpKTsKCmlmICgkY29tbWFuZC0+aXNIaWRkZW4oKSkgewp0aHJvdyBuZXcgQ29tbWFuZE5vdEZvdW5kRXhjZXB0aW9uKHNwcmludGYoJ1RoZSBjb21tYW5kICIlcyIgZG9lcyBub3QgZXhpc3QuJywgJG5hbWUpKTsKfQoKcmV0dXJuICRjb21tYW5kOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFsbCg/c3RyaW5nICRuYW1lc3BhY2UgPSBudWxsKQp7CiR0aGlzLT5pbml0KCk7CgppZiAobnVsbCA9PT0gJG5hbWVzcGFjZSkgewppZiAoISR0aGlzLT5jb21tYW5kTG9hZGVyKSB7CnJldHVybiAkdGhpcy0+Y29tbWFuZHM7Cn0KCiRjb21tYW5kcyA9ICR0aGlzLT5jb21tYW5kczsKZm9yZWFjaCAoJHRoaXMtPmNvbW1hbmRMb2FkZXItPmdldE5hbWVzKCkgYXMgJG5hbWUpIHsKaWYgKCFpc3NldCgkY29tbWFuZHNbJG5hbWVdKSAmJiAkdGhpcy0+aGFzKCRuYW1lKSkgewokY29tbWFuZHNbJG5hbWVdID0gJHRoaXMtPmdldCgkbmFtZSk7Cn0KfQoKcmV0dXJuICRjb21tYW5kczsKfQoKJGNvbW1hbmRzID0gW107CmZvcmVhY2ggKCR0aGlzLT5jb21tYW5kcyBhcyAkbmFtZSA9PiAkY29tbWFuZCkgewppZiAoJG5hbWVzcGFjZSA9PT0gJHRoaXMtPmV4dHJhY3ROYW1lc3BhY2UoJG5hbWUsIHN1YnN0cl9jb3VudCgkbmFtZXNwYWNlLCAnOicpICsgMSkpIHsKJGNvbW1hbmRzWyRuYW1lXSA9ICRjb21tYW5kOwp9Cn0KCmlmICgkdGhpcy0+Y29tbWFuZExvYWRlcikgewpmb3JlYWNoICgkdGhpcy0+Y29tbWFuZExvYWRlci0+Z2V0TmFtZXMoKSBhcyAkbmFtZSkgewppZiAoIWlzc2V0KCRjb21tYW5kc1skbmFtZV0pICYmICRuYW1lc3BhY2UgPT09ICR0aGlzLT5leHRyYWN0TmFtZXNwYWNlKCRuYW1lLCBzdWJzdHJfY291bnQoJG5hbWVzcGFjZSwgJzonKSArIDEpICYmICR0aGlzLT5oYXMoJG5hbWUpKSB7CiRjb21tYW5kc1skbmFtZV0gPSAkdGhpcy0+Z2V0KCRuYW1lKTsKfQp9Cn0KCnJldHVybiAkY29tbWFuZHM7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRBYmJyZXZpYXRpb25zKGFycmF5ICRuYW1lcykKewokYWJicmV2cyA9IFtdOwpmb3JlYWNoICgkbmFtZXMgYXMgJG5hbWUpIHsKZm9yICgkbGVuID0gXHN0cmxlbigkbmFtZSk7ICRsZW4gPiAwOyAtLSRsZW4pIHsKJGFiYnJldiA9IHN1YnN0cigkbmFtZSwgMCwgJGxlbik7CiRhYmJyZXZzWyRhYmJyZXZdW10gPSAkbmFtZTsKfQp9CgpyZXR1cm4gJGFiYnJldnM7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZW5kZXJUaHJvd2FibGUoXFRocm93YWJsZSAkZSwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiB2b2lkCnsKJG91dHB1dC0+d3JpdGVsbignJywgT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfUVVJRVQpOwoKJHRoaXMtPmRvUmVuZGVyVGhyb3dhYmxlKCRlLCAkb3V0cHV0KTsKCmlmIChudWxsICE9PSAkdGhpcy0+cnVubmluZ0NvbW1hbmQpIHsKJG91dHB1dC0+d3JpdGVsbihzcHJpbnRmKCc8aW5mbz4lczwvaW5mbz4nLCBPdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZShzcHJpbnRmKCR0aGlzLT5ydW5uaW5nQ29tbWFuZC0+Z2V0U3lub3BzaXMoKSwgJHRoaXMtPmdldE5hbWUoKSkpKSwgT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfUVVJRVQpOwokb3V0cHV0LT53cml0ZWxuKCcnLCBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9RVUlFVCk7Cn0KfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvUmVuZGVyVGhyb3dhYmxlKFxUaHJvd2FibGUgJGUsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogdm9pZAp7CmRvIHsKJG1lc3NhZ2UgPSB0cmltKCRlLT5nZXRNZXNzYWdlKCkpOwppZiAoJycgPT09ICRtZXNzYWdlIHx8IE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1ZFUkJPU0UgPD0gJG91dHB1dC0+Z2V0VmVyYm9zaXR5KCkpIHsKJGNsYXNzID0gZ2V0X2RlYnVnX3R5cGUoJGUpOwokdGl0bGUgPSBzcHJpbnRmKCcgIFslcyVzXSAgJywgJGNsYXNzLCAwICE9PSAoJGNvZGUgPSAkZS0+Z2V0Q29kZSgpKSA/ICcgKCcuJGNvZGUuJyknIDogJycpOwokbGVuID0gSGVscGVyOjp3aWR0aCgkdGl0bGUpOwp9IGVsc2UgewokbGVuID0gMDsKfQoKaWYgKHN0cl9jb250YWlucygkbWVzc2FnZSwgIkBhbm9ueW1vdXNcMCIpKSB7CiRtZXNzYWdlID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcvW2EtekEtWl9ceDdmLVx4ZmZdW1xcXFxhLXpBLVowLTlfXHg3Zi1ceGZmXSorQGFub255bW91c1x4MDAuKj9cLnBocCg/OjB4P3w6WzAtOV0rK1wkKT9bMC05YS1mQS1GXSsrLycsIGZ1bmN0aW9uICgkbSkgewpyZXR1cm4gY2xhc3NfZXhpc3RzKCRtWzBdLCBmYWxzZSkgPyAoZ2V0X3BhcmVudF9jbGFzcygkbVswXSkgPzoga2V5KGNsYXNzX2ltcGxlbWVudHMoJG1bMF0pKSA/OiAnY2xhc3MnKS4nQGFub255bW91cycgOiAkbVswXTsKfSwgJG1lc3NhZ2UpOwp9Cgokd2lkdGggPSAkdGhpcy0+dGVybWluYWwtPmdldFdpZHRoKCkgPyAkdGhpcy0+dGVybWluYWwtPmdldFdpZHRoKCkgLSAxIDogXFBIUF9JTlRfTUFYOwokbGluZXMgPSBbXTsKZm9yZWFjaCAoJycgIT09ICRtZXNzYWdlID8gcHJlZ19zcGxpdCgnL1xyP1xuLycsICRtZXNzYWdlKSA6IFtdIGFzICRsaW5lKSB7CmZvcmVhY2ggKCR0aGlzLT5zcGxpdFN0cmluZ0J5V2lkdGgoJGxpbmUsICR3aWR0aCAtIDQpIGFzICRsaW5lKSB7CgokbGluZUxlbmd0aCA9IEhlbHBlcjo6d2lkdGgoJGxpbmUpICsgNDsKJGxpbmVzW10gPSBbJGxpbmUsICRsaW5lTGVuZ3RoXTsKCiRsZW4gPSBtYXgoJGxpbmVMZW5ndGgsICRsZW4pOwp9Cn0KCiRtZXNzYWdlcyA9IFtdOwppZiAoISRlIGluc3RhbmNlb2YgRXhjZXB0aW9uSW50ZXJmYWNlIHx8IE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1ZFUkJPU0UgPD0gJG91dHB1dC0+Z2V0VmVyYm9zaXR5KCkpIHsKJG1lc3NhZ2VzW10gPSBzcHJpbnRmKCc8Y29tbWVudD4lczwvY29tbWVudD4nLCBPdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZShzcHJpbnRmKCdJbiAlcyBsaW5lICVzOicsIGJhc2VuYW1lKCRlLT5nZXRGaWxlKCkpID86ICduL2EnLCAkZS0+Z2V0TGluZSgpID86ICduL2EnKSkpOwp9CiRtZXNzYWdlc1tdID0gJGVtcHR5TGluZSA9IHNwcmludGYoJzxlcnJvcj4lczwvZXJyb3I+Jywgc3RyX3JlcGVhdCgnICcsICRsZW4pKTsKaWYgKCcnID09PSAkbWVzc2FnZSB8fCBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9WRVJCT1NFIDw9ICRvdXRwdXQtPmdldFZlcmJvc2l0eSgpKSB7CiRtZXNzYWdlc1tdID0gc3ByaW50ZignPGVycm9yPiVzJXM8L2Vycm9yPicsICR0aXRsZSwgc3RyX3JlcGVhdCgnICcsIG1heCgwLCAkbGVuIC0gSGVscGVyOjp3aWR0aCgkdGl0bGUpKSkpOwp9CmZvcmVhY2ggKCRsaW5lcyBhcyAkbGluZSkgewokbWVzc2FnZXNbXSA9IHNwcmludGYoJzxlcnJvcj4gICVzICAlczwvZXJyb3I+JywgT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJGxpbmVbMF0pLCBzdHJfcmVwZWF0KCcgJywgJGxlbiAtICRsaW5lWzFdKSk7Cn0KJG1lc3NhZ2VzW10gPSAkZW1wdHlMaW5lOwokbWVzc2FnZXNbXSA9ICcnOwoKJG91dHB1dC0+d3JpdGVsbigkbWVzc2FnZXMsIE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1FVSUVUKTsKCmlmIChPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9WRVJCT1NFIDw9ICRvdXRwdXQtPmdldFZlcmJvc2l0eSgpKSB7CiRvdXRwdXQtPndyaXRlbG4oJzxjb21tZW50PkV4Y2VwdGlvbiB0cmFjZTo8L2NvbW1lbnQ+JywgT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfUVVJRVQpOwoKCiR0cmFjZSA9ICRlLT5nZXRUcmFjZSgpOwoKYXJyYXlfdW5zaGlmdCgkdHJhY2UsIFsKJ2Z1bmN0aW9uJyA9PiAnJywKJ2ZpbGUnID0+ICRlLT5nZXRGaWxlKCkgPzogJ24vYScsCidsaW5lJyA9PiAkZS0+Z2V0TGluZSgpID86ICduL2EnLAonYXJncycgPT4gW10sCl0pOwoKZm9yICgkaSA9IDAsICRjb3VudCA9IFxjb3VudCgkdHJhY2UpOyAkaSA8ICRjb3VudDsgKyskaSkgewokY2xhc3MgPSAkdHJhY2VbJGldWydjbGFzcyddID8/ICcnOwokdHlwZSA9ICR0cmFjZVskaV1bJ3R5cGUnXSA/PyAnJzsKJGZ1bmN0aW9uID0gJHRyYWNlWyRpXVsnZnVuY3Rpb24nXSA/PyAnJzsKJGZpbGUgPSAkdHJhY2VbJGldWydmaWxlJ10gPz8gJ24vYSc7CiRsaW5lID0gJHRyYWNlWyRpXVsnbGluZSddID8/ICduL2EnOwoKJG91dHB1dC0+d3JpdGVsbihzcHJpbnRmKCcgJXMlcyBhdCA8aW5mbz4lczolczwvaW5mbz4nLCAkY2xhc3MsICRmdW5jdGlvbiA/ICR0eXBlLiRmdW5jdGlvbi4nKCknIDogJycsICRmaWxlLCAkbGluZSksIE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1FVSUVUKTsKfQoKJG91dHB1dC0+d3JpdGVsbignJywgT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfUVVJRVQpOwp9Cn0gd2hpbGUgKCRlID0gJGUtPmdldFByZXZpb3VzKCkpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlSU8oSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewppZiAodHJ1ZSA9PT0gJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oWyctLWFuc2knXSwgdHJ1ZSkpIHsKJG91dHB1dC0+c2V0RGVjb3JhdGVkKHRydWUpOwp9IGVsc2VpZiAodHJ1ZSA9PT0gJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oWyctLW5vLWFuc2knXSwgdHJ1ZSkpIHsKJG91dHB1dC0+c2V0RGVjb3JhdGVkKGZhbHNlKTsKfQoKaWYgKHRydWUgPT09ICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKFsnLS1uby1pbnRlcmFjdGlvbicsICctbiddLCB0cnVlKSkgewokaW5wdXQtPnNldEludGVyYWN0aXZlKGZhbHNlKTsKfQoKc3dpdGNoICgkc2hlbGxWZXJib3NpdHkgPSAoaW50KSBnZXRlbnYoJ1NIRUxMX1ZFUkJPU0lUWScpKSB7CmNhc2UgLTE6CiRvdXRwdXQtPnNldFZlcmJvc2l0eShPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9RVUlFVCk7CmJyZWFrOwpjYXNlIDE6CiRvdXRwdXQtPnNldFZlcmJvc2l0eShPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9WRVJCT1NFKTsKYnJlYWs7CmNhc2UgMjoKJG91dHB1dC0+c2V0VmVyYm9zaXR5KE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1ZFUllfVkVSQk9TRSk7CmJyZWFrOwpjYXNlIDM6CiRvdXRwdXQtPnNldFZlcmJvc2l0eShPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9ERUJVRyk7CmJyZWFrOwpkZWZhdWx0Ogokc2hlbGxWZXJib3NpdHkgPSAwOwpicmVhazsKfQoKaWYgKHRydWUgPT09ICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKFsnLS1xdWlldCcsICctcSddLCB0cnVlKSkgewokb3V0cHV0LT5zZXRWZXJib3NpdHkoT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfUVVJRVQpOwokc2hlbGxWZXJib3NpdHkgPSAtMTsKfSBlbHNlIHsKaWYgKCRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKCctdnZ2JywgdHJ1ZSkgfHwgJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oJy0tdmVyYm9zZT0zJywgdHJ1ZSkgfHwgMyA9PT0gJGlucHV0LT5nZXRQYXJhbWV0ZXJPcHRpb24oJy0tdmVyYm9zZScsIGZhbHNlLCB0cnVlKSkgewokb3V0cHV0LT5zZXRWZXJib3NpdHkoT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfREVCVUcpOwokc2hlbGxWZXJib3NpdHkgPSAzOwp9IGVsc2VpZiAoJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oJy12dicsIHRydWUpIHx8ICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKCctLXZlcmJvc2U9MicsIHRydWUpIHx8IDIgPT09ICRpbnB1dC0+Z2V0UGFyYW1ldGVyT3B0aW9uKCctLXZlcmJvc2UnLCBmYWxzZSwgdHJ1ZSkpIHsKJG91dHB1dC0+c2V0VmVyYm9zaXR5KE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1ZFUllfVkVSQk9TRSk7CiRzaGVsbFZlcmJvc2l0eSA9IDI7Cn0gZWxzZWlmICgkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbignLXYnLCB0cnVlKSB8fCAkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbignLS12ZXJib3NlPTEnLCB0cnVlKSB8fCAkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbignLS12ZXJib3NlJywgdHJ1ZSkgfHwgJGlucHV0LT5nZXRQYXJhbWV0ZXJPcHRpb24oJy0tdmVyYm9zZScsIGZhbHNlLCB0cnVlKSkgewokb3V0cHV0LT5zZXRWZXJib3NpdHkoT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfVkVSQk9TRSk7CiRzaGVsbFZlcmJvc2l0eSA9IDE7Cn0KfQoKaWYgKC0xID09PSAkc2hlbGxWZXJib3NpdHkpIHsKJGlucHV0LT5zZXRJbnRlcmFjdGl2ZShmYWxzZSk7Cn0KCmlmIChcZnVuY3Rpb25fZXhpc3RzKCdwdXRlbnYnKSkgewpAcHV0ZW52KCdTSEVMTF9WRVJCT1NJVFk9Jy4kc2hlbGxWZXJib3NpdHkpOwp9CiRfRU5WWydTSEVMTF9WRVJCT1NJVFknXSA9ICRzaGVsbFZlcmJvc2l0eTsKJF9TRVJWRVJbJ1NIRUxMX1ZFUkJPU0lUWSddID0gJHNoZWxsVmVyYm9zaXR5Owp9CgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb1J1bkNvbW1hbmQoQ29tbWFuZCAkY29tbWFuZCwgSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewpmb3JlYWNoICgkY29tbWFuZC0+Z2V0SGVscGVyU2V0KCkgYXMgJGhlbHBlcikgewppZiAoJGhlbHBlciBpbnN0YW5jZW9mIElucHV0QXdhcmVJbnRlcmZhY2UpIHsKJGhlbHBlci0+c2V0SW5wdXQoJGlucHV0KTsKfQp9CgppZiAoJHRoaXMtPnNpZ25hbHNUb0Rpc3BhdGNoRXZlbnQpIHsKJGNvbW1hbmRTaWduYWxzID0gJGNvbW1hbmQgaW5zdGFuY2VvZiBTaWduYWxhYmxlQ29tbWFuZEludGVyZmFjZSA/ICRjb21tYW5kLT5nZXRTdWJzY3JpYmVkU2lnbmFscygpIDogW107CgppZiAoJGNvbW1hbmRTaWduYWxzIHx8IG51bGwgIT09ICR0aGlzLT5kaXNwYXRjaGVyKSB7CmlmICghJHRoaXMtPnNpZ25hbFJlZ2lzdHJ5KSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdVbmFibGUgdG8gc3Vic2NyaWJlIHRvIHNpZ25hbCBldmVudHMuIE1ha2Ugc3VyZSB0aGF0IHRoZSBgcGNudGxgIGV4dGVuc2lvbiBpcyBpbnN0YWxsZWQgYW5kIHRoYXQgInBjbnRsXyoiIGZ1bmN0aW9ucyBhcmUgbm90IGRpc2FibGVkIGJ5IHlvdXIgcGhwLmluaVwncyAiZGlzYWJsZV9mdW5jdGlvbnMiIGRpcmVjdGl2ZS4nKTsKfQoKaWYgKFRlcm1pbmFsOjpoYXNTdHR5QXZhaWxhYmxlKCkpIHsKJHN0dHlNb2RlID0gc2hlbGxfZXhlYygnc3R0eSAtZycpOwoKZm9yZWFjaCAoW1xTSUdJTlQsIFxTSUdURVJNXSBhcyAkc2lnbmFsKSB7CiR0aGlzLT5zaWduYWxSZWdpc3RyeS0+cmVnaXN0ZXIoJHNpZ25hbCwgc3RhdGljIGZ1bmN0aW9uICgpIHVzZSAoJHN0dHlNb2RlKSB7CnNoZWxsX2V4ZWMoJ3N0dHkgJy4kc3R0eU1vZGUpOwp9KTsKfQp9Cn0KCmlmIChudWxsICE9PSAkdGhpcy0+ZGlzcGF0Y2hlcikgewpmb3JlYWNoICgkdGhpcy0+c2lnbmFsc1RvRGlzcGF0Y2hFdmVudCBhcyAkc2lnbmFsKSB7CiRldmVudCA9IG5ldyBDb25zb2xlU2lnbmFsRXZlbnQoJGNvbW1hbmQsICRpbnB1dCwgJG91dHB1dCwgJHNpZ25hbCk7CgokdGhpcy0+c2lnbmFsUmVnaXN0cnktPnJlZ2lzdGVyKCRzaWduYWwsIGZ1bmN0aW9uICgkc2lnbmFsLCAkaGFzTmV4dCkgdXNlICgkZXZlbnQpIHsKJHRoaXMtPmRpc3BhdGNoZXItPmRpc3BhdGNoKCRldmVudCwgQ29uc29sZUV2ZW50czo6U0lHTkFMKTsKCgppZiAoISRoYXNOZXh0KSB7CmlmICghXGluX2FycmF5KCRzaWduYWwsIFtcU0lHVVNSMSwgXFNJR1VTUjJdLCB0cnVlKSkgewpleGl0KDApOwp9Cn0KfSk7Cn0KfQoKZm9yZWFjaCAoJGNvbW1hbmRTaWduYWxzIGFzICRzaWduYWwpIHsKJHRoaXMtPnNpZ25hbFJlZ2lzdHJ5LT5yZWdpc3Rlcigkc2lnbmFsLCBbJGNvbW1hbmQsICdoYW5kbGVTaWduYWwnXSk7Cn0KfQoKaWYgKG51bGwgPT09ICR0aGlzLT5kaXNwYXRjaGVyKSB7CnJldHVybiAkY29tbWFuZC0+cnVuKCRpbnB1dCwgJG91dHB1dCk7Cn0KCgp0cnkgewokY29tbWFuZC0+bWVyZ2VBcHBsaWNhdGlvbkRlZmluaXRpb24oKTsKJGlucHV0LT5iaW5kKCRjb21tYW5kLT5nZXREZWZpbml0aW9uKCkpOwp9IGNhdGNoIChFeGNlcHRpb25JbnRlcmZhY2UgJGUpIHsKCn0KCiRldmVudCA9IG5ldyBDb25zb2xlQ29tbWFuZEV2ZW50KCRjb21tYW5kLCAkaW5wdXQsICRvdXRwdXQpOwokZSA9IG51bGw7Cgp0cnkgewokdGhpcy0+ZGlzcGF0Y2hlci0+ZGlzcGF0Y2goJGV2ZW50LCBDb25zb2xlRXZlbnRzOjpDT01NQU5EKTsKCmlmICgkZXZlbnQtPmNvbW1hbmRTaG91bGRSdW4oKSkgewokZXhpdENvZGUgPSAkY29tbWFuZC0+cnVuKCRpbnB1dCwgJG91dHB1dCk7Cn0gZWxzZSB7CiRleGl0Q29kZSA9IENvbnNvbGVDb21tYW5kRXZlbnQ6OlJFVFVSTl9DT0RFX0RJU0FCTEVEOwp9Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGUpIHsKJGV2ZW50ID0gbmV3IENvbnNvbGVFcnJvckV2ZW50KCRpbnB1dCwgJG91dHB1dCwgJGUsICRjb21tYW5kKTsKJHRoaXMtPmRpc3BhdGNoZXItPmRpc3BhdGNoKCRldmVudCwgQ29uc29sZUV2ZW50czo6RVJST1IpOwokZSA9ICRldmVudC0+Z2V0RXJyb3IoKTsKCmlmICgwID09PSAkZXhpdENvZGUgPSAkZXZlbnQtPmdldEV4aXRDb2RlKCkpIHsKJGUgPSBudWxsOwp9Cn0KCiRldmVudCA9IG5ldyBDb25zb2xlVGVybWluYXRlRXZlbnQoJGNvbW1hbmQsICRpbnB1dCwgJG91dHB1dCwgJGV4aXRDb2RlKTsKJHRoaXMtPmRpc3BhdGNoZXItPmRpc3BhdGNoKCRldmVudCwgQ29uc29sZUV2ZW50czo6VEVSTUlOQVRFKTsKCmlmIChudWxsICE9PSAkZSkgewp0aHJvdyAkZTsKfQoKcmV0dXJuICRldmVudC0+Z2V0RXhpdENvZGUoKTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Q29tbWFuZE5hbWUoSW5wdXRJbnRlcmZhY2UgJGlucHV0KQp7CnJldHVybiAkdGhpcy0+c2luZ2xlQ29tbWFuZCA/ICR0aGlzLT5kZWZhdWx0Q29tbWFuZCA6ICRpbnB1dC0+Z2V0Rmlyc3RBcmd1bWVudCgpOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXREZWZhdWx0SW5wdXREZWZpbml0aW9uKCkKewpyZXR1cm4gbmV3IElucHV0RGVmaW5pdGlvbihbCm5ldyBJbnB1dEFyZ3VtZW50KCdjb21tYW5kJywgSW5wdXRBcmd1bWVudDo6UkVRVUlSRUQsICdUaGUgY29tbWFuZCB0byBleGVjdXRlJyksCm5ldyBJbnB1dE9wdGlvbignLS1oZWxwJywgJy1oJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNwbGF5IGhlbHAgZm9yIHRoZSBnaXZlbiBjb21tYW5kLiBXaGVuIG5vIGNvbW1hbmQgaXMgZ2l2ZW4gZGlzcGxheSBoZWxwIGZvciB0aGUgPGluZm8+Jy4kdGhpcy0+ZGVmYXVsdENvbW1hbmQuJzwvaW5mbz4gY29tbWFuZCcpLApuZXcgSW5wdXRPcHRpb24oJy0tcXVpZXQnLCAnLXEnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RvIG5vdCBvdXRwdXQgYW55IG1lc3NhZ2UnKSwKbmV3IElucHV0T3B0aW9uKCctLXZlcmJvc2UnLCAnLXZ8dnZ8dnZ2JywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdJbmNyZWFzZSB0aGUgdmVyYm9zaXR5IG9mIG1lc3NhZ2VzOiAxIGZvciBub3JtYWwgb3V0cHV0LCAyIGZvciBtb3JlIHZlcmJvc2Ugb3V0cHV0IGFuZCAzIGZvciBkZWJ1ZycpLApuZXcgSW5wdXRPcHRpb24oJy0tdmVyc2lvbicsICctVicsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRGlzcGxheSB0aGlzIGFwcGxpY2F0aW9uIHZlcnNpb24nKSwKbmV3IElucHV0T3B0aW9uKCctLWFuc2knLCAnJywgSW5wdXRPcHRpb246OlZBTFVFX05FR0FUQUJMRSwgJ0ZvcmNlIChvciBkaXNhYmxlIC0tbm8tYW5zaSkgQU5TSSBvdXRwdXQnLCBudWxsKSwKbmV3IElucHV0T3B0aW9uKCctLW5vLWludGVyYWN0aW9uJywgJy1uJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEbyBub3QgYXNrIGFueSBpbnRlcmFjdGl2ZSBxdWVzdGlvbicpLApdKTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0RGVmYXVsdENvbW1hbmRzKCkKewpyZXR1cm4gW25ldyBIZWxwQ29tbWFuZCgpLCBuZXcgTGlzdENvbW1hbmQoKSwgbmV3IENvbXBsZXRlQ29tbWFuZCgpLCBuZXcgRHVtcENvbXBsZXRpb25Db21tYW5kKCldOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXREZWZhdWx0SGVscGVyU2V0KCkKewpyZXR1cm4gbmV3IEhlbHBlclNldChbCm5ldyBGb3JtYXR0ZXJIZWxwZXIoKSwKbmV3IERlYnVnRm9ybWF0dGVySGVscGVyKCksCm5ldyBQcm9jZXNzSGVscGVyKCksCm5ldyBRdWVzdGlvbkhlbHBlcigpLApdKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRBYmJyZXZpYXRpb25TdWdnZXN0aW9ucyhhcnJheSAkYWJicmV2cyk6IHN0cmluZwp7CnJldHVybiAnICAgICcuaW1wbG9kZSgiXG4gICAgIiwgJGFiYnJldnMpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGV4dHJhY3ROYW1lc3BhY2Uoc3RyaW5nICRuYW1lLCA/aW50ICRsaW1pdCA9IG51bGwpCnsKJHBhcnRzID0gZXhwbG9kZSgnOicsICRuYW1lLCAtMSk7CgpyZXR1cm4gaW1wbG9kZSgnOicsIG51bGwgPT09ICRsaW1pdCA/ICRwYXJ0cyA6IFxhcnJheV9zbGljZSgkcGFydHMsIDAsICRsaW1pdCkpOwp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGZpbmRBbHRlcm5hdGl2ZXMoc3RyaW5nICRuYW1lLCBpdGVyYWJsZSAkY29sbGVjdGlvbik6IGFycmF5CnsKJHRocmVzaG9sZCA9IDFlMzsKJGFsdGVybmF0aXZlcyA9IFtdOwoKJGNvbGxlY3Rpb25QYXJ0cyA9IFtdOwpmb3JlYWNoICgkY29sbGVjdGlvbiBhcyAkaXRlbSkgewokY29sbGVjdGlvblBhcnRzWyRpdGVtXSA9IGV4cGxvZGUoJzonLCAkaXRlbSk7Cn0KCmZvcmVhY2ggKGV4cGxvZGUoJzonLCAkbmFtZSkgYXMgJGkgPT4gJHN1Ym5hbWUpIHsKZm9yZWFjaCAoJGNvbGxlY3Rpb25QYXJ0cyBhcyAkY29sbGVjdGlvbk5hbWUgPT4gJHBhcnRzKSB7CiRleGlzdHMgPSBpc3NldCgkYWx0ZXJuYXRpdmVzWyRjb2xsZWN0aW9uTmFtZV0pOwppZiAoIWlzc2V0KCRwYXJ0c1skaV0pICYmICRleGlzdHMpIHsKJGFsdGVybmF0aXZlc1skY29sbGVjdGlvbk5hbWVdICs9ICR0aHJlc2hvbGQ7CmNvbnRpbnVlOwp9IGVsc2VpZiAoIWlzc2V0KCRwYXJ0c1skaV0pKSB7CmNvbnRpbnVlOwp9CgokbGV2ID0gbGV2ZW5zaHRlaW4oJHN1Ym5hbWUsICRwYXJ0c1skaV0pOwppZiAoJGxldiA8PSBcc3RybGVuKCRzdWJuYW1lKSAvIDMgfHwgJycgIT09ICRzdWJuYW1lICYmIHN0cl9jb250YWlucygkcGFydHNbJGldLCAkc3VibmFtZSkpIHsKJGFsdGVybmF0aXZlc1skY29sbGVjdGlvbk5hbWVdID0gJGV4aXN0cyA/ICRhbHRlcm5hdGl2ZXNbJGNvbGxlY3Rpb25OYW1lXSArICRsZXYgOiAkbGV2Owp9IGVsc2VpZiAoJGV4aXN0cykgewokYWx0ZXJuYXRpdmVzWyRjb2xsZWN0aW9uTmFtZV0gKz0gJHRocmVzaG9sZDsKfQp9Cn0KCmZvcmVhY2ggKCRjb2xsZWN0aW9uIGFzICRpdGVtKSB7CiRsZXYgPSBsZXZlbnNodGVpbigkbmFtZSwgJGl0ZW0pOwppZiAoJGxldiA8PSBcc3RybGVuKCRuYW1lKSAvIDMgfHwgc3RyX2NvbnRhaW5zKCRpdGVtLCAkbmFtZSkpIHsKJGFsdGVybmF0aXZlc1skaXRlbV0gPSBpc3NldCgkYWx0ZXJuYXRpdmVzWyRpdGVtXSkgPyAkYWx0ZXJuYXRpdmVzWyRpdGVtXSAtICRsZXYgOiAkbGV2Owp9Cn0KCiRhbHRlcm5hdGl2ZXMgPSBhcnJheV9maWx0ZXIoJGFsdGVybmF0aXZlcywgZnVuY3Rpb24gKCRsZXYpIHVzZSAoJHRocmVzaG9sZCkgeyByZXR1cm4gJGxldiA8IDIgKiAkdGhyZXNob2xkOyB9KTsKa3NvcnQoJGFsdGVybmF0aXZlcywgXFNPUlRfTkFUVVJBTCB8IFxTT1JUX0ZMQUdfQ0FTRSk7CgpyZXR1cm4gYXJyYXlfa2V5cygkYWx0ZXJuYXRpdmVzKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGVmYXVsdENvbW1hbmQoc3RyaW5nICRjb21tYW5kTmFtZSwgYm9vbCAkaXNTaW5nbGVDb21tYW5kID0gZmFsc2UpCnsKJHRoaXMtPmRlZmF1bHRDb21tYW5kID0gZXhwbG9kZSgnfCcsIGx0cmltKCRjb21tYW5kTmFtZSwgJ3wnKSlbMF07CgppZiAoJGlzU2luZ2xlQ29tbWFuZCkgewoKJHRoaXMtPmZpbmQoJGNvbW1hbmROYW1lKTsKCiR0aGlzLT5zaW5nbGVDb21tYW5kID0gdHJ1ZTsKfQoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNTaW5nbGVDb21tYW5kKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPnNpbmdsZUNvbW1hbmQ7Cn0KCnByaXZhdGUgZnVuY3Rpb24gc3BsaXRTdHJpbmdCeVdpZHRoKHN0cmluZyAkc3RyaW5nLCBpbnQgJHdpZHRoKTogYXJyYXkKewoKCgppZiAoZmFsc2UgPT09ICRlbmNvZGluZyA9IG1iX2RldGVjdF9lbmNvZGluZygkc3RyaW5nLCBudWxsLCB0cnVlKSkgewpyZXR1cm4gc3RyX3NwbGl0KCRzdHJpbmcsICR3aWR0aCk7Cn0KCiR1dGY4U3RyaW5nID0gbWJfY29udmVydF9lbmNvZGluZygkc3RyaW5nLCAndXRmOCcsICRlbmNvZGluZyk7CiRsaW5lcyA9IFtdOwokbGluZSA9ICcnOwoKJG9mZnNldCA9IDA7CndoaWxlIChwcmVnX21hdGNoKCcvLnsxLDEwMDAwfS91JywgJHV0ZjhTdHJpbmcsICRtLCAwLCAkb2Zmc2V0KSkgewokb2Zmc2V0ICs9IFxzdHJsZW4oJG1bMF0pOwoKZm9yZWFjaCAocHJlZ19zcGxpdCgnLy91JywgJG1bMF0pIGFzICRjaGFyKSB7CgppZiAobWJfc3Ryd2lkdGgoJGxpbmUuJGNoYXIsICd1dGY4JykgPD0gJHdpZHRoKSB7CiRsaW5lIC49ICRjaGFyOwpjb250aW51ZTsKfQoKJGxpbmVzW10gPSBzdHJfcGFkKCRsaW5lLCAkd2lkdGgpOwokbGluZSA9ICRjaGFyOwp9Cn0KCiRsaW5lc1tdID0gXGNvdW50KCRsaW5lcykgPyBzdHJfcGFkKCRsaW5lLCAkd2lkdGgpIDogJGxpbmU7CgptYl9jb252ZXJ0X3ZhcmlhYmxlcygkZW5jb2RpbmcsICd1dGY4JywgJGxpbmVzKTsKCnJldHVybiAkbGluZXM7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBleHRyYWN0QWxsTmFtZXNwYWNlcyhzdHJpbmcgJG5hbWUpOiBhcnJheQp7CgokcGFydHMgPSBleHBsb2RlKCc6JywgJG5hbWUsIC0xKTsKJG5hbWVzcGFjZXMgPSBbXTsKCmZvcmVhY2ggKCRwYXJ0cyBhcyAkcGFydCkgewppZiAoXGNvdW50KCRuYW1lc3BhY2VzKSkgewokbmFtZXNwYWNlc1tdID0gZW5kKCRuYW1lc3BhY2VzKS4nOicuJHBhcnQ7Cn0gZWxzZSB7CiRuYW1lc3BhY2VzW10gPSAkcGFydDsKfQp9CgpyZXR1cm4gJG5hbWVzcGFjZXM7Cn0KCnByaXZhdGUgZnVuY3Rpb24gaW5pdCgpCnsKaWYgKCR0aGlzLT5pbml0aWFsaXplZCkgewpyZXR1cm47Cn0KJHRoaXMtPmluaXRpYWxpemVkID0gdHJ1ZTsKCmZvcmVhY2ggKCR0aGlzLT5nZXREZWZhdWx0Q29tbWFuZHMoKSBhcyAkY29tbWFuZCkgewokdGhpcy0+YWRkKCRjb21tYW5kKTsKfQp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEF0dHJpYnV0ZTsKCgoKCiNbXEF0dHJpYnV0ZShcQXR0cmlidXRlOjpUQVJHRVRfQ0xBU1MpXQpjbGFzcyBBc0NvbW1hbmQKewpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCnB1YmxpYyBzdHJpbmcgJG5hbWUsCnB1YmxpYyA/c3RyaW5nICRkZXNjcmlwdGlvbiA9IG51bGwsCmFycmF5ICRhbGlhc2VzID0gW10sCmJvb2wgJGhpZGRlbiA9IGZhbHNlLAopIHsKaWYgKCEkaGlkZGVuICYmICEkYWxpYXNlcykgewpyZXR1cm47Cn0KCiRuYW1lID0gZXhwbG9kZSgnfCcsICRuYW1lKTsKJG5hbWUgPSBhcnJheV9tZXJnZSgkbmFtZSwgJGFsaWFzZXMpOwoKaWYgKCRoaWRkZW4gJiYgJycgIT09ICRuYW1lWzBdKSB7CmFycmF5X3Vuc2hpZnQoJG5hbWUsICcnKTsKfQoKJHRoaXMtPm5hbWUgPSBpbXBsb2RlKCd8JywgJG5hbWUpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENJOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKY2xhc3MgR2l0aHViQWN0aW9uUmVwb3J0ZXIKewpwcml2YXRlICRvdXRwdXQ7CgoKCgpwcml2YXRlIGNvbnN0IEVTQ0FQRURfREFUQSA9IFsKJyUnID0+ICclMjUnLAoiXHIiID0+ICclMEQnLAoiXG4iID0+ICclMEEnLApdOwoKCgoKcHJpdmF0ZSBjb25zdCBFU0NBUEVEX1BST1BFUlRJRVMgPSBbCiclJyA9PiAnJTI1JywKIlxyIiA9PiAnJTBEJywKIlxuIiA9PiAnJTBBJywKJzonID0+ICclM0EnLAonLCcgPT4gJyUyQycsCl07CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpCnsKJHRoaXMtPm91dHB1dCA9ICRvdXRwdXQ7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNHaXRodWJBY3Rpb25FbnZpcm9ubWVudCgpOiBib29sCnsKcmV0dXJuIGZhbHNlICE9PSBnZXRlbnYoJ0dJVEhVQl9BQ1RJT05TJyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGVycm9yKHN0cmluZyAkbWVzc2FnZSwgP3N0cmluZyAkZmlsZSA9IG51bGwsID9pbnQgJGxpbmUgPSBudWxsLCA/aW50ICRjb2wgPSBudWxsKTogdm9pZAp7CiR0aGlzLT5sb2coJ2Vycm9yJywgJG1lc3NhZ2UsICRmaWxlLCAkbGluZSwgJGNvbCk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdhcm5pbmcoc3RyaW5nICRtZXNzYWdlLCA/c3RyaW5nICRmaWxlID0gbnVsbCwgP2ludCAkbGluZSA9IG51bGwsID9pbnQgJGNvbCA9IG51bGwpOiB2b2lkCnsKJHRoaXMtPmxvZygnd2FybmluZycsICRtZXNzYWdlLCAkZmlsZSwgJGxpbmUsICRjb2wpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkZWJ1ZyhzdHJpbmcgJG1lc3NhZ2UsID9zdHJpbmcgJGZpbGUgPSBudWxsLCA/aW50ICRsaW5lID0gbnVsbCwgP2ludCAkY29sID0gbnVsbCk6IHZvaWQKewokdGhpcy0+bG9nKCdkZWJ1ZycsICRtZXNzYWdlLCAkZmlsZSwgJGxpbmUsICRjb2wpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGxvZyhzdHJpbmcgJHR5cGUsIHN0cmluZyAkbWVzc2FnZSwgP3N0cmluZyAkZmlsZSA9IG51bGwsID9pbnQgJGxpbmUgPSBudWxsLCA/aW50ICRjb2wgPSBudWxsKTogdm9pZAp7CgokbWVzc2FnZSA9IHN0cnRyKCRtZXNzYWdlLCBzZWxmOjpFU0NBUEVEX0RBVEEpOwoKaWYgKCEkZmlsZSkgewoKJHRoaXMtPm91dHB1dC0+d3JpdGVsbihzcHJpbnRmKCc6OiVzOjolcycsICR0eXBlLCAkbWVzc2FnZSkpOwoKcmV0dXJuOwp9CgokdGhpcy0+b3V0cHV0LT53cml0ZWxuKHNwcmludGYoJzo6JXMgZmlsZT0lcyxsaW5lPSVzLGNvbD0lczo6JXMnLCAkdHlwZSwgc3RydHIoJGZpbGUsIHNlbGY6OkVTQ0FQRURfUFJPUEVSVElFUyksIHN0cnRyKCRsaW5lID8/IDEsIHNlbGY6OkVTQ0FQRURfUFJPUEVSVElFUyksIHN0cnRyKCRjb2wgPz8gMCwgc2VsZjo6RVNDQVBFRF9QUk9QRVJUSUVTKSwgJG1lc3NhZ2UpKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZTsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CgoKCgpmaW5hbCBjbGFzcyBDb2xvcgp7CnByaXZhdGUgY29uc3QgQ09MT1JTID0gWwonYmxhY2snID0+IDAsCidyZWQnID0+IDEsCidncmVlbicgPT4gMiwKJ3llbGxvdycgPT4gMywKJ2JsdWUnID0+IDQsCidtYWdlbnRhJyA9PiA1LAonY3lhbicgPT4gNiwKJ3doaXRlJyA9PiA3LAonZGVmYXVsdCcgPT4gOSwKXTsKCnByaXZhdGUgY29uc3QgQlJJR0hUX0NPTE9SUyA9IFsKJ2dyYXknID0+IDAsCidicmlnaHQtcmVkJyA9PiAxLAonYnJpZ2h0LWdyZWVuJyA9PiAyLAonYnJpZ2h0LXllbGxvdycgPT4gMywKJ2JyaWdodC1ibHVlJyA9PiA0LAonYnJpZ2h0LW1hZ2VudGEnID0+IDUsCidicmlnaHQtY3lhbicgPT4gNiwKJ2JyaWdodC13aGl0ZScgPT4gNywKXTsKCnByaXZhdGUgY29uc3QgQVZBSUxBQkxFX09QVElPTlMgPSBbCidib2xkJyA9PiBbJ3NldCcgPT4gMSwgJ3Vuc2V0JyA9PiAyMl0sCid1bmRlcnNjb3JlJyA9PiBbJ3NldCcgPT4gNCwgJ3Vuc2V0JyA9PiAyNF0sCidibGluaycgPT4gWydzZXQnID0+IDUsICd1bnNldCcgPT4gMjVdLAoncmV2ZXJzZScgPT4gWydzZXQnID0+IDcsICd1bnNldCcgPT4gMjddLAonY29uY2VhbCcgPT4gWydzZXQnID0+IDgsICd1bnNldCcgPT4gMjhdLApdOwoKcHJpdmF0ZSAkZm9yZWdyb3VuZDsKcHJpdmF0ZSAkYmFja2dyb3VuZDsKcHJpdmF0ZSAkb3B0aW9ucyA9IFtdOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkZm9yZWdyb3VuZCA9ICcnLCBzdHJpbmcgJGJhY2tncm91bmQgPSAnJywgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokdGhpcy0+Zm9yZWdyb3VuZCA9ICR0aGlzLT5wYXJzZUNvbG9yKCRmb3JlZ3JvdW5kKTsKJHRoaXMtPmJhY2tncm91bmQgPSAkdGhpcy0+cGFyc2VDb2xvcigkYmFja2dyb3VuZCwgdHJ1ZSk7Cgpmb3JlYWNoICgkb3B0aW9ucyBhcyAkb3B0aW9uKSB7CmlmICghaXNzZXQoc2VsZjo6QVZBSUxBQkxFX09QVElPTlNbJG9wdGlvbl0pKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignSW52YWxpZCBvcHRpb24gc3BlY2lmaWVkOiAiJXMiLiBFeHBlY3RlZCBvbmUgb2YgKCVzKS4nLCAkb3B0aW9uLCBpbXBsb2RlKCcsICcsIGFycmF5X2tleXMoc2VsZjo6QVZBSUxBQkxFX09QVElPTlMpKSkpOwp9CgokdGhpcy0+b3B0aW9uc1skb3B0aW9uXSA9IHNlbGY6OkFWQUlMQUJMRV9PUFRJT05TWyRvcHRpb25dOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBhcHBseShzdHJpbmcgJHRleHQpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnNldCgpLiR0ZXh0LiR0aGlzLT51bnNldCgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0KCk6IHN0cmluZwp7CiRzZXRDb2RlcyA9IFtdOwppZiAoJycgIT09ICR0aGlzLT5mb3JlZ3JvdW5kKSB7CiRzZXRDb2Rlc1tdID0gJHRoaXMtPmZvcmVncm91bmQ7Cn0KaWYgKCcnICE9PSAkdGhpcy0+YmFja2dyb3VuZCkgewokc2V0Q29kZXNbXSA9ICR0aGlzLT5iYWNrZ3JvdW5kOwp9CmZvcmVhY2ggKCR0aGlzLT5vcHRpb25zIGFzICRvcHRpb24pIHsKJHNldENvZGVzW10gPSAkb3B0aW9uWydzZXQnXTsKfQppZiAoMCA9PT0gXGNvdW50KCRzZXRDb2RlcykpIHsKcmV0dXJuICcnOwp9CgpyZXR1cm4gc3ByaW50ZigiXDAzM1slc20iLCBpbXBsb2RlKCc7JywgJHNldENvZGVzKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiB1bnNldCgpOiBzdHJpbmcKewokdW5zZXRDb2RlcyA9IFtdOwppZiAoJycgIT09ICR0aGlzLT5mb3JlZ3JvdW5kKSB7CiR1bnNldENvZGVzW10gPSAzOTsKfQppZiAoJycgIT09ICR0aGlzLT5iYWNrZ3JvdW5kKSB7CiR1bnNldENvZGVzW10gPSA0OTsKfQpmb3JlYWNoICgkdGhpcy0+b3B0aW9ucyBhcyAkb3B0aW9uKSB7CiR1bnNldENvZGVzW10gPSAkb3B0aW9uWyd1bnNldCddOwp9CmlmICgwID09PSBcY291bnQoJHVuc2V0Q29kZXMpKSB7CnJldHVybiAnJzsKfQoKcmV0dXJuIHNwcmludGYoIlwwMzNbJXNtIiwgaW1wbG9kZSgnOycsICR1bnNldENvZGVzKSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gcGFyc2VDb2xvcihzdHJpbmcgJGNvbG9yLCBib29sICRiYWNrZ3JvdW5kID0gZmFsc2UpOiBzdHJpbmcKewppZiAoJycgPT09ICRjb2xvcikgewpyZXR1cm4gJyc7Cn0KCmlmICgnIycgPT09ICRjb2xvclswXSkgewokY29sb3IgPSBzdWJzdHIoJGNvbG9yLCAxKTsKCmlmICgzID09PSBcc3RybGVuKCRjb2xvcikpIHsKJGNvbG9yID0gJGNvbG9yWzBdLiRjb2xvclswXS4kY29sb3JbMV0uJGNvbG9yWzFdLiRjb2xvclsyXS4kY29sb3JbMl07Cn0KCmlmICg2ICE9PSBcc3RybGVuKCRjb2xvcikpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdJbnZhbGlkICIlcyIgY29sb3IuJywgJGNvbG9yKSk7Cn0KCnJldHVybiAoJGJhY2tncm91bmQgPyAnNCcgOiAnMycpLiR0aGlzLT5jb252ZXJ0SGV4Q29sb3JUb0Fuc2koaGV4ZGVjKCRjb2xvcikpOwp9CgppZiAoaXNzZXQoc2VsZjo6Q09MT1JTWyRjb2xvcl0pKSB7CnJldHVybiAoJGJhY2tncm91bmQgPyAnNCcgOiAnMycpLnNlbGY6OkNPTE9SU1skY29sb3JdOwp9CgppZiAoaXNzZXQoc2VsZjo6QlJJR0hUX0NPTE9SU1skY29sb3JdKSkgewpyZXR1cm4gKCRiYWNrZ3JvdW5kID8gJzEwJyA6ICc5Jykuc2VsZjo6QlJJR0hUX0NPTE9SU1skY29sb3JdOwp9Cgp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ0ludmFsaWQgIiVzIiBjb2xvcjsgZXhwZWN0ZWQgb25lIG9mICglcykuJywgJGNvbG9yLCBpbXBsb2RlKCcsICcsIGFycmF5X21lcmdlKGFycmF5X2tleXMoc2VsZjo6Q09MT1JTKSwgYXJyYXlfa2V5cyhzZWxmOjpCUklHSFRfQ09MT1JTKSkpKSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gY29udmVydEhleENvbG9yVG9BbnNpKGludCAkY29sb3IpOiBzdHJpbmcKewokciA9ICgkY29sb3IgPj4gMTYpICYgMjU1OwokZyA9ICgkY29sb3IgPj4gOCkgJiAyNTU7CiRiID0gJGNvbG9yICYgMjU1OwoKCmlmICgndHJ1ZWNvbG9yJyAhPT0gZ2V0ZW52KCdDT0xPUlRFUk0nKSkgewpyZXR1cm4gKHN0cmluZykgJHRoaXMtPmRlZ3JhZGVIZXhDb2xvclRvQW5zaSgkciwgJGcsICRiKTsKfQoKcmV0dXJuIHNwcmludGYoJzg7MjslZDslZDslZCcsICRyLCAkZywgJGIpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGRlZ3JhZGVIZXhDb2xvclRvQW5zaShpbnQgJHIsIGludCAkZywgaW50ICRiKTogaW50CnsKaWYgKDAgPT09IHJvdW5kKCR0aGlzLT5nZXRTYXR1cmF0aW9uKCRyLCAkZywgJGIpIC8gNTApKSB7CnJldHVybiAwOwp9CgpyZXR1cm4gKHJvdW5kKCRiIC8gMjU1KSA8PCAyKSB8IChyb3VuZCgkZyAvIDI1NSkgPDwgMSkgfCByb3VuZCgkciAvIDI1NSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0U2F0dXJhdGlvbihpbnQgJHIsIGludCAkZywgaW50ICRiKTogaW50CnsKJHIgPSAkciAvIDI1NTsKJGcgPSAkZyAvIDI1NTsKJGIgPSAkYiAvIDI1NTsKJHYgPSBtYXgoJHIsICRnLCAkYik7CgppZiAoMCA9PT0gJGRpZmYgPSAkdiAtIG1pbigkciwgJGcsICRiKSkgewpyZXR1cm4gMDsKfQoKcmV0dXJuIChpbnQpICRkaWZmICogMTAwIC8gJHY7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEFwcGxpY2F0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxBdHRyaWJ1dGVcQXNDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25JbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uU3VnZ2VzdGlvbnM7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxFeGNlcHRpb25JbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxMb2dpY0V4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXEhlbHBlclNldDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXREZWZpbml0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCmNsYXNzIENvbW1hbmQKewoKcHVibGljIGNvbnN0IFNVQ0NFU1MgPSAwOwpwdWJsaWMgY29uc3QgRkFJTFVSRSA9IDE7CnB1YmxpYyBjb25zdCBJTlZBTElEID0gMjsKCgoKCnByb3RlY3RlZCBzdGF0aWMgJGRlZmF1bHROYW1lOwoKCgoKcHJvdGVjdGVkIHN0YXRpYyAkZGVmYXVsdERlc2NyaXB0aW9uOwoKcHJpdmF0ZSAkYXBwbGljYXRpb247CnByaXZhdGUgJG5hbWU7CnByaXZhdGUgJHByb2Nlc3NUaXRsZTsKcHJpdmF0ZSAkYWxpYXNlcyA9IFtdOwpwcml2YXRlICRkZWZpbml0aW9uOwpwcml2YXRlICRoaWRkZW4gPSBmYWxzZTsKcHJpdmF0ZSAkaGVscCA9ICcnOwpwcml2YXRlICRkZXNjcmlwdGlvbiA9ICcnOwpwcml2YXRlICRmdWxsRGVmaW5pdGlvbjsKcHJpdmF0ZSAkaWdub3JlVmFsaWRhdGlvbkVycm9ycyA9IGZhbHNlOwpwcml2YXRlICRjb2RlOwpwcml2YXRlICRzeW5vcHNpcyA9IFtdOwpwcml2YXRlICR1c2FnZXMgPSBbXTsKcHJpdmF0ZSAkaGVscGVyU2V0OwoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXREZWZhdWx0TmFtZSgpCnsKJGNsYXNzID0gc3RhdGljOjpjbGFzczsKCmlmIChcUEhQX1ZFUlNJT05fSUQgPj0gODAwMDAgJiYgJGF0dHJpYnV0ZSA9IChuZXcgXFJlZmxlY3Rpb25DbGFzcygkY2xhc3MpKS0+Z2V0QXR0cmlidXRlcyhBc0NvbW1hbmQ6OmNsYXNzKSkgewpyZXR1cm4gJGF0dHJpYnV0ZVswXS0+bmV3SW5zdGFuY2UoKS0+bmFtZTsKfQoKJHIgPSBuZXcgXFJlZmxlY3Rpb25Qcm9wZXJ0eSgkY2xhc3MsICdkZWZhdWx0TmFtZScpOwoKcmV0dXJuICRjbGFzcyA9PT0gJHItPmNsYXNzID8gc3RhdGljOjokZGVmYXVsdE5hbWUgOiBudWxsOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldERlZmF1bHREZXNjcmlwdGlvbigpOiA/c3RyaW5nCnsKJGNsYXNzID0gc3RhdGljOjpjbGFzczsKCmlmIChcUEhQX1ZFUlNJT05fSUQgPj0gODAwMDAgJiYgJGF0dHJpYnV0ZSA9IChuZXcgXFJlZmxlY3Rpb25DbGFzcygkY2xhc3MpKS0+Z2V0QXR0cmlidXRlcyhBc0NvbW1hbmQ6OmNsYXNzKSkgewpyZXR1cm4gJGF0dHJpYnV0ZVswXS0+bmV3SW5zdGFuY2UoKS0+ZGVzY3JpcHRpb247Cn0KCiRyID0gbmV3IFxSZWZsZWN0aW9uUHJvcGVydHkoJGNsYXNzLCAnZGVmYXVsdERlc2NyaXB0aW9uJyk7CgpyZXR1cm4gJGNsYXNzID09PSAkci0+Y2xhc3MgPyBzdGF0aWM6OiRkZWZhdWx0RGVzY3JpcHRpb24gOiBudWxsOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/c3RyaW5nICRuYW1lID0gbnVsbCkKewokdGhpcy0+ZGVmaW5pdGlvbiA9IG5ldyBJbnB1dERlZmluaXRpb24oKTsKCmlmIChudWxsID09PSAkbmFtZSAmJiBudWxsICE9PSAkbmFtZSA9IHN0YXRpYzo6Z2V0RGVmYXVsdE5hbWUoKSkgewokYWxpYXNlcyA9IGV4cGxvZGUoJ3wnLCAkbmFtZSk7CgppZiAoJycgPT09ICRuYW1lID0gYXJyYXlfc2hpZnQoJGFsaWFzZXMpKSB7CiR0aGlzLT5zZXRIaWRkZW4odHJ1ZSk7CiRuYW1lID0gYXJyYXlfc2hpZnQoJGFsaWFzZXMpOwp9CgokdGhpcy0+c2V0QWxpYXNlcygkYWxpYXNlcyk7Cn0KCmlmIChudWxsICE9PSAkbmFtZSkgewokdGhpcy0+c2V0TmFtZSgkbmFtZSk7Cn0KCmlmICgnJyA9PT0gJHRoaXMtPmRlc2NyaXB0aW9uKSB7CiR0aGlzLT5zZXREZXNjcmlwdGlvbihzdGF0aWM6OmdldERlZmF1bHREZXNjcmlwdGlvbigpID8/ICcnKTsKfQoKJHRoaXMtPmNvbmZpZ3VyZSgpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpZ25vcmVWYWxpZGF0aW9uRXJyb3JzKCkKewokdGhpcy0+aWdub3JlVmFsaWRhdGlvbkVycm9ycyA9IHRydWU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRBcHBsaWNhdGlvbig/QXBwbGljYXRpb24gJGFwcGxpY2F0aW9uID0gbnVsbCkKewokdGhpcy0+YXBwbGljYXRpb24gPSAkYXBwbGljYXRpb247CmlmICgkYXBwbGljYXRpb24pIHsKJHRoaXMtPnNldEhlbHBlclNldCgkYXBwbGljYXRpb24tPmdldEhlbHBlclNldCgpKTsKfSBlbHNlIHsKJHRoaXMtPmhlbHBlclNldCA9IG51bGw7Cn0KCiR0aGlzLT5mdWxsRGVmaW5pdGlvbiA9IG51bGw7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRIZWxwZXJTZXQoSGVscGVyU2V0ICRoZWxwZXJTZXQpCnsKJHRoaXMtPmhlbHBlclNldCA9ICRoZWxwZXJTZXQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEhlbHBlclNldCgpCnsKcmV0dXJuICR0aGlzLT5oZWxwZXJTZXQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFwcGxpY2F0aW9uKCkKewpyZXR1cm4gJHRoaXMtPmFwcGxpY2F0aW9uOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0VuYWJsZWQoKQp7CnJldHVybiB0cnVlOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCkKewp9CgoKCgoKCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpCnsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdZb3UgbXVzdCBvdmVycmlkZSB0aGUgZXhlY3V0ZSgpIG1ldGhvZCBpbiB0aGUgY29uY3JldGUgY29tbWFuZCBjbGFzcy4nKTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpbnRlcmFjdChJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KQp7Cn0KCgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdGlhbGl6ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KQp7Cn0KCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJ1bihJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KQp7CgokdGhpcy0+bWVyZ2VBcHBsaWNhdGlvbkRlZmluaXRpb24oKTsKCgp0cnkgewokaW5wdXQtPmJpbmQoJHRoaXMtPmdldERlZmluaXRpb24oKSk7Cn0gY2F0Y2ggKEV4Y2VwdGlvbkludGVyZmFjZSAkZSkgewppZiAoISR0aGlzLT5pZ25vcmVWYWxpZGF0aW9uRXJyb3JzKSB7CnRocm93ICRlOwp9Cn0KCiR0aGlzLT5pbml0aWFsaXplKCRpbnB1dCwgJG91dHB1dCk7CgppZiAobnVsbCAhPT0gJHRoaXMtPnByb2Nlc3NUaXRsZSkgewppZiAoXGZ1bmN0aW9uX2V4aXN0cygnY2xpX3NldF9wcm9jZXNzX3RpdGxlJykpIHsKaWYgKCFAY2xpX3NldF9wcm9jZXNzX3RpdGxlKCR0aGlzLT5wcm9jZXNzVGl0bGUpKSB7CmlmICgnRGFyd2luJyA9PT0gXFBIUF9PUykgewokb3V0cHV0LT53cml0ZWxuKCc8Y29tbWVudD5SdW5uaW5nICJjbGlfc2V0X3Byb2Nlc3NfdGl0bGUiIGFzIGFuIHVucHJpdmlsZWdlZCB1c2VyIGlzIG5vdCBzdXBwb3J0ZWQgb24gTWFjT1MuPC9jb21tZW50PicsIE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1ZFUllfVkVSQk9TRSk7Cn0gZWxzZSB7CmNsaV9zZXRfcHJvY2Vzc190aXRsZSgkdGhpcy0+cHJvY2Vzc1RpdGxlKTsKfQp9Cn0gZWxzZWlmIChcZnVuY3Rpb25fZXhpc3RzKCdzZXRwcm9jdGl0bGUnKSkgewpzZXRwcm9jdGl0bGUoJHRoaXMtPnByb2Nlc3NUaXRsZSk7Cn0gZWxzZWlmIChPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9WRVJZX1ZFUkJPU0UgPT09ICRvdXRwdXQtPmdldFZlcmJvc2l0eSgpKSB7CiRvdXRwdXQtPndyaXRlbG4oJzxjb21tZW50Pkluc3RhbGwgdGhlIHByb2N0aXRsZSBQRUNMIHRvIGJlIGFibGUgdG8gY2hhbmdlIHRoZSBwcm9jZXNzIHRpdGxlLjwvY29tbWVudD4nKTsKfQp9CgppZiAoJGlucHV0LT5pc0ludGVyYWN0aXZlKCkpIHsKJHRoaXMtPmludGVyYWN0KCRpbnB1dCwgJG91dHB1dCk7Cn0KCgoKCmlmICgkaW5wdXQtPmhhc0FyZ3VtZW50KCdjb21tYW5kJykgJiYgbnVsbCA9PT0gJGlucHV0LT5nZXRBcmd1bWVudCgnY29tbWFuZCcpKSB7CiRpbnB1dC0+c2V0QXJndW1lbnQoJ2NvbW1hbmQnLCAkdGhpcy0+Z2V0TmFtZSgpKTsKfQoKJGlucHV0LT52YWxpZGF0ZSgpOwoKaWYgKCR0aGlzLT5jb2RlKSB7CiRzdGF0dXNDb2RlID0gKCR0aGlzLT5jb2RlKSgkaW5wdXQsICRvdXRwdXQpOwp9IGVsc2Ugewokc3RhdHVzQ29kZSA9ICR0aGlzLT5leGVjdXRlKCRpbnB1dCwgJG91dHB1dCk7CgppZiAoIVxpc19pbnQoJHN0YXR1c0NvZGUpKSB7CnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoJ1JldHVybiB2YWx1ZSBvZiAiJXM6OmV4ZWN1dGUoKSIgbXVzdCBiZSBvZiB0aGUgdHlwZSBpbnQsICIlcyIgcmV0dXJuZWQuJywgc3RhdGljOjpjbGFzcywgZ2V0X2RlYnVnX3R5cGUoJHN0YXR1c0NvZGUpKSk7Cn0KfQoKcmV0dXJuIGlzX251bWVyaWMoJHN0YXR1c0NvZGUpID8gKGludCkgJHN0YXR1c0NvZGUgOiAwOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY29tcGxldGUoQ29tcGxldGlvbklucHV0ICRpbnB1dCwgQ29tcGxldGlvblN1Z2dlc3Rpb25zICRzdWdnZXN0aW9ucyk6IHZvaWQKewp9CgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDb2RlKGNhbGxhYmxlICRjb2RlKQp7CmlmICgkY29kZSBpbnN0YW5jZW9mIFxDbG9zdXJlKSB7CiRyID0gbmV3IFxSZWZsZWN0aW9uRnVuY3Rpb24oJGNvZGUpOwppZiAobnVsbCA9PT0gJHItPmdldENsb3N1cmVUaGlzKCkpIHsKc2V0X2Vycm9yX2hhbmRsZXIoc3RhdGljIGZ1bmN0aW9uICgpIHt9KTsKdHJ5IHsKaWYgKCRjID0gXENsb3N1cmU6OmJpbmQoJGNvZGUsICR0aGlzKSkgewokY29kZSA9ICRjOwp9Cn0gZmluYWxseSB7CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwp9Cn0KfQoKJHRoaXMtPmNvZGUgPSAkY29kZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG1lcmdlQXBwbGljYXRpb25EZWZpbml0aW9uKGJvb2wgJG1lcmdlQXJncyA9IHRydWUpCnsKaWYgKG51bGwgPT09ICR0aGlzLT5hcHBsaWNhdGlvbikgewpyZXR1cm47Cn0KCiR0aGlzLT5mdWxsRGVmaW5pdGlvbiA9IG5ldyBJbnB1dERlZmluaXRpb24oKTsKJHRoaXMtPmZ1bGxEZWZpbml0aW9uLT5zZXRPcHRpb25zKCR0aGlzLT5kZWZpbml0aW9uLT5nZXRPcHRpb25zKCkpOwokdGhpcy0+ZnVsbERlZmluaXRpb24tPmFkZE9wdGlvbnMoJHRoaXMtPmFwcGxpY2F0aW9uLT5nZXREZWZpbml0aW9uKCktPmdldE9wdGlvbnMoKSk7CgppZiAoJG1lcmdlQXJncykgewokdGhpcy0+ZnVsbERlZmluaXRpb24tPnNldEFyZ3VtZW50cygkdGhpcy0+YXBwbGljYXRpb24tPmdldERlZmluaXRpb24oKS0+Z2V0QXJndW1lbnRzKCkpOwokdGhpcy0+ZnVsbERlZmluaXRpb24tPmFkZEFyZ3VtZW50cygkdGhpcy0+ZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnRzKCkpOwp9IGVsc2UgewokdGhpcy0+ZnVsbERlZmluaXRpb24tPnNldEFyZ3VtZW50cygkdGhpcy0+ZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnRzKCkpOwp9Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGVmaW5pdGlvbigkZGVmaW5pdGlvbikKewppZiAoJGRlZmluaXRpb24gaW5zdGFuY2VvZiBJbnB1dERlZmluaXRpb24pIHsKJHRoaXMtPmRlZmluaXRpb24gPSAkZGVmaW5pdGlvbjsKfSBlbHNlIHsKJHRoaXMtPmRlZmluaXRpb24tPnNldERlZmluaXRpb24oJGRlZmluaXRpb24pOwp9CgokdGhpcy0+ZnVsbERlZmluaXRpb24gPSBudWxsOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZWZpbml0aW9uKCkKewpyZXR1cm4gJHRoaXMtPmZ1bGxEZWZpbml0aW9uID8/ICR0aGlzLT5nZXROYXRpdmVEZWZpbml0aW9uKCk7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmF0aXZlRGVmaW5pdGlvbigpCnsKaWYgKG51bGwgPT09ICR0aGlzLT5kZWZpbml0aW9uKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKCdDb21tYW5kIGNsYXNzICIlcyIgaXMgbm90IGNvcnJlY3RseSBpbml0aWFsaXplZC4gWW91IHByb2JhYmx5IGZvcmdvdCB0byBjYWxsIHRoZSBwYXJlbnQgY29uc3RydWN0b3IuJywgc3RhdGljOjpjbGFzcykpOwp9CgpyZXR1cm4gJHRoaXMtPmRlZmluaXRpb247Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkQXJndW1lbnQoc3RyaW5nICRuYW1lLCA/aW50ICRtb2RlID0gbnVsbCwgc3RyaW5nICRkZXNjcmlwdGlvbiA9ICcnLCAkZGVmYXVsdCA9IG51bGwpCnsKJHRoaXMtPmRlZmluaXRpb24tPmFkZEFyZ3VtZW50KG5ldyBJbnB1dEFyZ3VtZW50KCRuYW1lLCAkbW9kZSwgJGRlc2NyaXB0aW9uLCAkZGVmYXVsdCkpOwppZiAobnVsbCAhPT0gJHRoaXMtPmZ1bGxEZWZpbml0aW9uKSB7CiR0aGlzLT5mdWxsRGVmaW5pdGlvbi0+YWRkQXJndW1lbnQobmV3IElucHV0QXJndW1lbnQoJG5hbWUsICRtb2RlLCAkZGVzY3JpcHRpb24sICRkZWZhdWx0KSk7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkT3B0aW9uKHN0cmluZyAkbmFtZSwgJHNob3J0Y3V0ID0gbnVsbCwgP2ludCAkbW9kZSA9IG51bGwsIHN0cmluZyAkZGVzY3JpcHRpb24gPSAnJywgJGRlZmF1bHQgPSBudWxsKQp7CiR0aGlzLT5kZWZpbml0aW9uLT5hZGRPcHRpb24obmV3IElucHV0T3B0aW9uKCRuYW1lLCAkc2hvcnRjdXQsICRtb2RlLCAkZGVzY3JpcHRpb24sICRkZWZhdWx0KSk7CmlmIChudWxsICE9PSAkdGhpcy0+ZnVsbERlZmluaXRpb24pIHsKJHRoaXMtPmZ1bGxEZWZpbml0aW9uLT5hZGRPcHRpb24obmV3IElucHV0T3B0aW9uKCRuYW1lLCAkc2hvcnRjdXQsICRtb2RlLCAkZGVzY3JpcHRpb24sICRkZWZhdWx0KSk7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE5hbWUoc3RyaW5nICRuYW1lKQp7CiR0aGlzLT52YWxpZGF0ZU5hbWUoJG5hbWUpOwoKJHRoaXMtPm5hbWUgPSAkbmFtZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJvY2Vzc1RpdGxlKHN0cmluZyAkdGl0bGUpCnsKJHRoaXMtPnByb2Nlc3NUaXRsZSA9ICR0aXRsZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpCnsKcmV0dXJuICR0aGlzLT5uYW1lOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRIaWRkZW4oYm9vbCAkaGlkZGVuICkKewokdGhpcy0+aGlkZGVuID0gJGhpZGRlbjsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzSGlkZGVuKCkKewpyZXR1cm4gJHRoaXMtPmhpZGRlbjsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGVzY3JpcHRpb24oc3RyaW5nICRkZXNjcmlwdGlvbikKewokdGhpcy0+ZGVzY3JpcHRpb24gPSAkZGVzY3JpcHRpb247CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERlc2NyaXB0aW9uKCkKewpyZXR1cm4gJHRoaXMtPmRlc2NyaXB0aW9uOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRIZWxwKHN0cmluZyAkaGVscCkKewokdGhpcy0+aGVscCA9ICRoZWxwOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRIZWxwKCkKewpyZXR1cm4gJHRoaXMtPmhlbHA7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm9jZXNzZWRIZWxwKCkKewokbmFtZSA9ICR0aGlzLT5uYW1lOwokaXNTaW5nbGVDb21tYW5kID0gJHRoaXMtPmFwcGxpY2F0aW9uICYmICR0aGlzLT5hcHBsaWNhdGlvbi0+aXNTaW5nbGVDb21tYW5kKCk7CgokcGxhY2Vob2xkZXJzID0gWwonJWNvbW1hbmQubmFtZSUnLAonJWNvbW1hbmQuZnVsbF9uYW1lJScsCl07CiRyZXBsYWNlbWVudHMgPSBbCiRuYW1lLAokaXNTaW5nbGVDb21tYW5kID8gJF9TRVJWRVJbJ1BIUF9TRUxGJ10gOiAkX1NFUlZFUlsnUEhQX1NFTEYnXS4nICcuJG5hbWUsCl07CgpyZXR1cm4gc3RyX3JlcGxhY2UoJHBsYWNlaG9sZGVycywgJHJlcGxhY2VtZW50cywgJHRoaXMtPmdldEhlbHAoKSA/OiAkdGhpcy0+Z2V0RGVzY3JpcHRpb24oKSk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBbGlhc2VzKGl0ZXJhYmxlICRhbGlhc2VzKQp7CiRsaXN0ID0gW107Cgpmb3JlYWNoICgkYWxpYXNlcyBhcyAkYWxpYXMpIHsKJHRoaXMtPnZhbGlkYXRlTmFtZSgkYWxpYXMpOwokbGlzdFtdID0gJGFsaWFzOwp9CgokdGhpcy0+YWxpYXNlcyA9IFxpc19hcnJheSgkYWxpYXNlcykgPyAkYWxpYXNlcyA6ICRsaXN0OwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBbGlhc2VzKCkKewpyZXR1cm4gJHRoaXMtPmFsaWFzZXM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3lub3BzaXMoYm9vbCAkc2hvcnQgPSBmYWxzZSkKewoka2V5ID0gJHNob3J0ID8gJ3Nob3J0JyA6ICdsb25nJzsKCmlmICghaXNzZXQoJHRoaXMtPnN5bm9wc2lzWyRrZXldKSkgewokdGhpcy0+c3lub3BzaXNbJGtleV0gPSB0cmltKHNwcmludGYoJyVzICVzJywgJHRoaXMtPm5hbWUsICR0aGlzLT5kZWZpbml0aW9uLT5nZXRTeW5vcHNpcygkc2hvcnQpKSk7Cn0KCnJldHVybiAkdGhpcy0+c3lub3BzaXNbJGtleV07Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFVzYWdlKHN0cmluZyAkdXNhZ2UpCnsKaWYgKCFzdHJfc3RhcnRzX3dpdGgoJHVzYWdlLCAkdGhpcy0+bmFtZSkpIHsKJHVzYWdlID0gc3ByaW50ZignJXMgJXMnLCAkdGhpcy0+bmFtZSwgJHVzYWdlKTsKfQoKJHRoaXMtPnVzYWdlc1tdID0gJHVzYWdlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVc2FnZXMoKQp7CnJldHVybiAkdGhpcy0+dXNhZ2VzOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRIZWxwZXIoc3RyaW5nICRuYW1lKQp7CmlmIChudWxsID09PSAkdGhpcy0+aGVscGVyU2V0KSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKCdDYW5ub3QgcmV0cmlldmUgaGVscGVyICIlcyIgYmVjYXVzZSB0aGVyZSBpcyBubyBIZWxwZXJTZXQgZGVmaW5lZC4gRGlkIHlvdSBmb3JnZXQgdG8gYWRkIHlvdXIgY29tbWFuZCB0byB0aGUgYXBwbGljYXRpb24gb3IgdG8gc2V0IHRoZSBhcHBsaWNhdGlvbiBvbiB0aGUgY29tbWFuZCB1c2luZyB0aGUgc2V0QXBwbGljYXRpb24oKSBtZXRob2Q/IFlvdSBjYW4gYWxzbyBzZXQgdGhlIEhlbHBlclNldCBkaXJlY3RseSB1c2luZyB0aGUgc2V0SGVscGVyU2V0KCkgbWV0aG9kLicsICRuYW1lKSk7Cn0KCnJldHVybiAkdGhpcy0+aGVscGVyU2V0LT5nZXQoJG5hbWUpOwp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZU5hbWUoc3RyaW5nICRuYW1lKQp7CmlmICghcHJlZ19tYXRjaCgnL15bXlw6XSsrKFw6W15cOl0rKykqJC8nLCAkbmFtZSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdDb21tYW5kIG5hbWUgIiVzIiBpcyBpbnZhbGlkLicsICRuYW1lKSk7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uSW5wdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvblN1Z2dlc3Rpb25zOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXE91dHB1dFxCYXNoQ29tcGxldGlvbk91dHB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxPdXRwdXRcQ29tcGxldGlvbk91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEV4Y2VwdGlvbkludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKCgpmaW5hbCBjbGFzcyBDb21wbGV0ZUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kCnsKcHJvdGVjdGVkIHN0YXRpYyAkZGVmYXVsdE5hbWUgPSAnfF9jb21wbGV0ZSc7CnByb3RlY3RlZCBzdGF0aWMgJGRlZmF1bHREZXNjcmlwdGlvbiA9ICdJbnRlcm5hbCBjb21tYW5kIHRvIHByb3ZpZGUgc2hlbGwgY29tcGxldGlvbiBzdWdnZXN0aW9ucyc7Cgpwcml2YXRlICRjb21wbGV0aW9uT3V0cHV0czsKCnByaXZhdGUgJGlzRGVidWcgPSBmYWxzZTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkY29tcGxldGlvbk91dHB1dHMgPSBbXSkKewoKJHRoaXMtPmNvbXBsZXRpb25PdXRwdXRzID0gJGNvbXBsZXRpb25PdXRwdXRzICsgWydiYXNoJyA9PiBCYXNoQ29tcGxldGlvbk91dHB1dDo6Y2xhc3NdOwoKcGFyZW50OjpfX2NvbnN0cnVjdCgpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPmFkZE9wdGlvbignc2hlbGwnLCAncycsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1RoZSBzaGVsbCB0eXBlICgiJy5pbXBsb2RlKCciLCAiJywgYXJyYXlfa2V5cygkdGhpcy0+Y29tcGxldGlvbk91dHB1dHMpKS4nIiknKQotPmFkZE9wdGlvbignaW5wdXQnLCAnaScsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCB8IElucHV0T3B0aW9uOjpWQUxVRV9JU19BUlJBWSwgJ0FuIGFycmF5IG9mIGlucHV0IHRva2VucyAoZS5nLiBDT01QX1dPUkRTIG9yIGFyZ3YpJykKLT5hZGRPcHRpb24oJ2N1cnJlbnQnLCAnYycsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1RoZSBpbmRleCBvZiB0aGUgImlucHV0IiBhcnJheSB0aGF0IHRoZSBjdXJzb3IgaXMgaW4gKGUuZy4gQ09NUF9DV09SRCknKQotPmFkZE9wdGlvbignc3ltZm9ueScsICdTJywgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnVGhlIHZlcnNpb24gb2YgdGhlIGNvbXBsZXRpb24gc2NyaXB0JykKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdGlhbGl6ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KQp7CiR0aGlzLT5pc0RlYnVnID0gZmlsdGVyX3ZhcihnZXRlbnYoJ1NZTUZPTllfQ09NUExFVElPTl9ERUJVRycpLCBcRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4pOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKdHJ5IHsKCgoKCgoKCgoKCgokc2hlbGwgPSAkaW5wdXQtPmdldE9wdGlvbignc2hlbGwnKTsKaWYgKCEkc2hlbGwpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgIi0tc2hlbGwiIG9wdGlvbiBtdXN0IGJlIHNldC4nKTsKfQoKaWYgKCEkY29tcGxldGlvbk91dHB1dCA9ICR0aGlzLT5jb21wbGV0aW9uT3V0cHV0c1skc2hlbGxdID8/IGZhbHNlKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdTaGVsbCBjb21wbGV0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHlvdXIgc2hlbGw6ICIlcyIgKHN1cHBvcnRlZDogIiVzIikuJywgJHNoZWxsLCBpbXBsb2RlKCciLCAiJywgYXJyYXlfa2V5cygkdGhpcy0+Y29tcGxldGlvbk91dHB1dHMpKSkpOwp9CgokY29tcGxldGlvbklucHV0ID0gJHRoaXMtPmNyZWF0ZUNvbXBsZXRpb25JbnB1dCgkaW5wdXQpOwokc3VnZ2VzdGlvbnMgPSBuZXcgQ29tcGxldGlvblN1Z2dlc3Rpb25zKCk7CgokdGhpcy0+bG9nKFsKJycsCic8Y29tbWVudD4nLmRhdGUoJ1ktbS1kIEg6aTpzJykuJzwvPicsCic8aW5mbz5JbnB1dDo8Lz4gPGNvbW1lbnQ+KCJ8IiBpbmRpY2F0ZXMgdGhlIGN1cnNvciBwb3NpdGlvbik8Lz4nLAonICAnLihzdHJpbmcpICRjb21wbGV0aW9uSW5wdXQsCic8aW5mbz5Db21tYW5kOjwvPicsCicgICcuKHN0cmluZykgaW1wbG9kZSgnICcsICRfU0VSVkVSWydhcmd2J10pLAonPGluZm8+TWVzc2FnZXM6PC8+JywKXSk7CgokY29tbWFuZCA9ICR0aGlzLT5maW5kQ29tbWFuZCgkY29tcGxldGlvbklucHV0LCAkb3V0cHV0KTsKaWYgKG51bGwgPT09ICRjb21tYW5kKSB7CiR0aGlzLT5sb2coJyAgTm8gY29tbWFuZCBmb3VuZCwgY29tcGxldGluZyB1c2luZyB0aGUgQXBwbGljYXRpb24gY2xhc3MuJyk7CgokdGhpcy0+Z2V0QXBwbGljYXRpb24oKS0+Y29tcGxldGUoJGNvbXBsZXRpb25JbnB1dCwgJHN1Z2dlc3Rpb25zKTsKfSBlbHNlaWYgKAokY29tcGxldGlvbklucHV0LT5tdXN0U3VnZ2VzdEFyZ3VtZW50VmFsdWVzRm9yKCdjb21tYW5kJykKJiYgJGNvbW1hbmQtPmdldE5hbWUoKSAhPT0gJGNvbXBsZXRpb25JbnB1dC0+Z2V0Q29tcGxldGlvblZhbHVlKCkKJiYgIVxpbl9hcnJheSgkY29tcGxldGlvbklucHV0LT5nZXRDb21wbGV0aW9uVmFsdWUoKSwgJGNvbW1hbmQtPmdldEFsaWFzZXMoKSwgdHJ1ZSkKKSB7CiR0aGlzLT5sb2coJyAgTm8gY29tbWFuZCBmb3VuZCwgY29tcGxldGluZyB1c2luZyB0aGUgQXBwbGljYXRpb24gY2xhc3MuJyk7CgoKJHN1Z2dlc3Rpb25zLT5zdWdnZXN0VmFsdWVzKGFycmF5X2ZpbHRlcihhcnJheV9tZXJnZShbJGNvbW1hbmQtPmdldE5hbWUoKV0sICRjb21tYW5kLT5nZXRBbGlhc2VzKCkpKSk7Cn0gZWxzZSB7CiRjb21tYW5kLT5tZXJnZUFwcGxpY2F0aW9uRGVmaW5pdGlvbigpOwokY29tcGxldGlvbklucHV0LT5iaW5kKCRjb21tYW5kLT5nZXREZWZpbml0aW9uKCkpOwoKaWYgKENvbXBsZXRpb25JbnB1dDo6VFlQRV9PUFRJT05fTkFNRSA9PT0gJGNvbXBsZXRpb25JbnB1dC0+Z2V0Q29tcGxldGlvblR5cGUoKSkgewokdGhpcy0+bG9nKCcgIENvbXBsZXRpbmcgb3B0aW9uIG5hbWVzIGZvciB0aGUgPGNvbW1lbnQ+Jy5cZ2V0X2NsYXNzKCRjb21tYW5kIGluc3RhbmNlb2YgTGF6eUNvbW1hbmQgPyAkY29tbWFuZC0+Z2V0Q29tbWFuZCgpIDogJGNvbW1hbmQpLic8Lz4gY29tbWFuZC4nKTsKCiRzdWdnZXN0aW9ucy0+c3VnZ2VzdE9wdGlvbnMoJGNvbW1hbmQtPmdldERlZmluaXRpb24oKS0+Z2V0T3B0aW9ucygpKTsKfSBlbHNlIHsKJHRoaXMtPmxvZyhbCicgIENvbXBsZXRpbmcgdXNpbmcgdGhlIDxjb21tZW50PicuXGdldF9jbGFzcygkY29tbWFuZCBpbnN0YW5jZW9mIExhenlDb21tYW5kID8gJGNvbW1hbmQtPmdldENvbW1hbmQoKSA6ICRjb21tYW5kKS4nPC8+IGNsYXNzLicsCicgIENvbXBsZXRpbmcgPGNvbW1lbnQ+Jy4kY29tcGxldGlvbklucHV0LT5nZXRDb21wbGV0aW9uVHlwZSgpLic8Lz4gZm9yIDxjb21tZW50PicuJGNvbXBsZXRpb25JbnB1dC0+Z2V0Q29tcGxldGlvbk5hbWUoKS4nPC8+JywKXSk7CmlmIChudWxsICE9PSAkY29tcHZhbCA9ICRjb21wbGV0aW9uSW5wdXQtPmdldENvbXBsZXRpb25WYWx1ZSgpKSB7CiR0aGlzLT5sb2coJyAgQ3VycmVudCB2YWx1ZTogPGNvbW1lbnQ+Jy4kY29tcHZhbC4nPC8+Jyk7Cn0KCiRjb21tYW5kLT5jb21wbGV0ZSgkY29tcGxldGlvbklucHV0LCAkc3VnZ2VzdGlvbnMpOwp9Cn0KCgokY29tcGxldGlvbk91dHB1dCA9IG5ldyAkY29tcGxldGlvbk91dHB1dCgpOwoKJHRoaXMtPmxvZygnPGluZm8+U3VnZ2VzdGlvbnM6PC8+Jyk7CmlmICgkb3B0aW9ucyA9ICRzdWdnZXN0aW9ucy0+Z2V0T3B0aW9uU3VnZ2VzdGlvbnMoKSkgewokdGhpcy0+bG9nKCcgIC0tJy5pbXBsb2RlKCcgLS0nLCBhcnJheV9tYXAoZnVuY3Rpb24gKCRvKSB7IHJldHVybiAkby0+Z2V0TmFtZSgpOyB9LCAkb3B0aW9ucykpKTsKfSBlbHNlaWYgKCR2YWx1ZXMgPSAkc3VnZ2VzdGlvbnMtPmdldFZhbHVlU3VnZ2VzdGlvbnMoKSkgewokdGhpcy0+bG9nKCcgICcuaW1wbG9kZSgnICcsICR2YWx1ZXMpKTsKfSBlbHNlIHsKJHRoaXMtPmxvZygnICA8Y29tbWVudD5ObyBzdWdnZXN0aW9ucyB3ZXJlIHByb3ZpZGVkPC8+Jyk7Cn0KCiRjb21wbGV0aW9uT3V0cHV0LT53cml0ZSgkc3VnZ2VzdGlvbnMsICRvdXRwdXQpOwp9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7CiR0aGlzLT5sb2coWwonPGVycm9yPkVycm9yITwvZXJyb3I+JywKKHN0cmluZykgJGUsCl0pOwoKaWYgKCRvdXRwdXQtPmlzRGVidWcoKSkgewp0aHJvdyAkZTsKfQoKcmV0dXJuIDI7Cn0KCnJldHVybiAwOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZUNvbXBsZXRpb25JbnB1dChJbnB1dEludGVyZmFjZSAkaW5wdXQpOiBDb21wbGV0aW9uSW5wdXQKewokY3VycmVudEluZGV4ID0gJGlucHV0LT5nZXRPcHRpb24oJ2N1cnJlbnQnKTsKaWYgKCEkY3VycmVudEluZGV4IHx8ICFjdHlwZV9kaWdpdCgkY3VycmVudEluZGV4KSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSAiLS1jdXJyZW50IiBvcHRpb24gbXVzdCBiZSBzZXQgYW5kIGl0IG11c3QgYmUgYW4gaW50ZWdlci4nKTsKfQoKJGNvbXBsZXRpb25JbnB1dCA9IENvbXBsZXRpb25JbnB1dDo6ZnJvbVRva2VucygkaW5wdXQtPmdldE9wdGlvbignaW5wdXQnKSwgKGludCkgJGN1cnJlbnRJbmRleCk7Cgp0cnkgewokY29tcGxldGlvbklucHV0LT5iaW5kKCR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5nZXREZWZpbml0aW9uKCkpOwp9IGNhdGNoIChFeGNlcHRpb25JbnRlcmZhY2UgJGUpIHsKfQoKcmV0dXJuICRjb21wbGV0aW9uSW5wdXQ7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZmluZENvbW1hbmQoQ29tcGxldGlvbklucHV0ICRjb21wbGV0aW9uSW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogP0NvbW1hbmQKewp0cnkgewokaW5wdXROYW1lID0gJGNvbXBsZXRpb25JbnB1dC0+Z2V0Rmlyc3RBcmd1bWVudCgpOwppZiAobnVsbCA9PT0gJGlucHV0TmFtZSkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5maW5kKCRpbnB1dE5hbWUpOwp9IGNhdGNoIChDb21tYW5kTm90Rm91bmRFeGNlcHRpb24gJGUpIHsKfQoKcmV0dXJuIG51bGw7Cn0KCnByaXZhdGUgZnVuY3Rpb24gbG9nKCRtZXNzYWdlcyk6IHZvaWQKewppZiAoISR0aGlzLT5pc0RlYnVnKSB7CnJldHVybjsKfQoKJGNvbW1hbmROYW1lID0gYmFzZW5hbWUoJF9TRVJWRVJbJ2FyZ3YnXVswXSk7CmZpbGVfcHV0X2NvbnRlbnRzKHN5c19nZXRfdGVtcF9kaXIoKS4nL3NmXycuJGNvbW1hbmROYW1lLicubG9nJywgaW1wbG9kZShcUEhQX0VPTCwgKGFycmF5KSAkbWVzc2FnZXMpLlxQSFBfRU9MLCBcRklMRV9BUFBFTkQpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25JbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uU3VnZ2VzdGlvbnM7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFByb2Nlc3M7CgoKCgoKCmZpbmFsIGNsYXNzIER1bXBDb21wbGV0aW9uQ29tbWFuZCBleHRlbmRzIENvbW1hbmQKewpwcm90ZWN0ZWQgc3RhdGljICRkZWZhdWx0TmFtZSA9ICdjb21wbGV0aW9uJzsKcHJvdGVjdGVkIHN0YXRpYyAkZGVmYXVsdERlc2NyaXB0aW9uID0gJ0R1bXAgdGhlIHNoZWxsIGNvbXBsZXRpb24gc2NyaXB0JzsKCnB1YmxpYyBmdW5jdGlvbiBjb21wbGV0ZShDb21wbGV0aW9uSW5wdXQgJGlucHV0LCBDb21wbGV0aW9uU3VnZ2VzdGlvbnMgJHN1Z2dlc3Rpb25zKTogdm9pZAp7CmlmICgkaW5wdXQtPm11c3RTdWdnZXN0QXJndW1lbnRWYWx1ZXNGb3IoJ3NoZWxsJykpIHsKJHN1Z2dlc3Rpb25zLT5zdWdnZXN0VmFsdWVzKCR0aGlzLT5nZXRTdXBwb3J0ZWRTaGVsbHMoKSk7Cn0KfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpCnsKJGZ1bGxDb21tYW5kID0gJF9TRVJWRVJbJ1BIUF9TRUxGJ107CiRjb21tYW5kTmFtZSA9IGJhc2VuYW1lKCRmdWxsQ29tbWFuZCk7CiRmdWxsQ29tbWFuZCA9IEByZWFscGF0aCgkZnVsbENvbW1hbmQpID86ICRmdWxsQ29tbWFuZDsKCiR0aGlzCi0+c2V0SGVscCg8PDxFT0gKVGhlIDxpbmZvPiVjb21tYW5kLm5hbWUlPC8+IGNvbW1hbmQgZHVtcHMgdGhlIHNoZWxsIGNvbXBsZXRpb24gc2NyaXB0IHJlcXVpcmVkCnRvIHVzZSBzaGVsbCBhdXRvY29tcGxldGlvbiAoY3VycmVudGx5IG9ubHkgYmFzaCBjb21wbGV0aW9uIGlzIHN1cHBvcnRlZCkuCgo8Y29tbWVudD5TdGF0aWMgaW5zdGFsbGF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS08Lz4KCkR1bXAgdGhlIHNjcmlwdCB0byBhIGdsb2JhbCBjb21wbGV0aW9uIGZpbGUgYW5kIHJlc3RhcnQgeW91ciBzaGVsbDoKCiAgICA8aW5mbz4lY29tbWFuZC5mdWxsX25hbWUlIGJhc2ggfCBzdWRvIHRlZSAvZXRjL2Jhc2hfY29tcGxldGlvbi5kL3skY29tbWFuZE5hbWV9PC8+CgpPciBkdW1wIHRoZSBzY3JpcHQgdG8gYSBsb2NhbCBmaWxlIGFuZCBzb3VyY2UgaXQ6CgogICAgPGluZm8+JWNvbW1hbmQuZnVsbF9uYW1lJSBiYXNoID4gY29tcGxldGlvbi5zaDwvPgoKICAgIDxjb21tZW50PiMgc291cmNlIHRoZSBmaWxlIHdoZW5ldmVyIHlvdSB1c2UgdGhlIHByb2plY3Q8Lz4KICAgIDxpbmZvPnNvdXJjZSBjb21wbGV0aW9uLnNoPC8+CgogICAgPGNvbW1lbnQ+IyBvciBhZGQgdGhpcyBsaW5lIGF0IHRoZSBlbmQgb2YgeW91ciAifi8uYmFzaHJjIiBmaWxlOjwvPgogICAgPGluZm8+c291cmNlIC9wYXRoL3RvL2NvbXBsZXRpb24uc2g8Lz4KCjxjb21tZW50PkR5bmFtaWMgaW5zdGFsbGF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tPC8+CgpBZGQgdGhpcyB0byB0aGUgZW5kIG9mIHlvdXIgc2hlbGwgY29uZmlndXJhdGlvbiBmaWxlIChlLmcuIDxpbmZvPiJ+Ly5iYXNocmMiPC8+KToKCiAgICA8aW5mbz5ldmFsICIkKHskZnVsbENvbW1hbmR9IGNvbXBsZXRpb24gYmFzaCkiPC8+CkVPSAopCi0+YWRkQXJndW1lbnQoJ3NoZWxsJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdUaGUgc2hlbGwgdHlwZSAoZS5nLiAiYmFzaCIpLCB0aGUgdmFsdWUgb2YgdGhlICIkU0hFTEwiIGVudiB2YXIgd2lsbCBiZSB1c2VkIGlmIHRoaXMgaXMgbm90IGdpdmVuJykKLT5hZGRPcHRpb24oJ2RlYnVnJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdUYWlsIHRoZSBjb21wbGV0aW9uIGRlYnVnIGxvZycpCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRjb21tYW5kTmFtZSA9IGJhc2VuYW1lKCRfU0VSVkVSWydhcmd2J11bMF0pOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdkZWJ1ZycpKSB7CiR0aGlzLT50YWlsRGVidWdMb2coJGNvbW1hbmROYW1lLCAkb3V0cHV0KTsKCnJldHVybiAwOwp9Cgokc2hlbGwgPSAkaW5wdXQtPmdldEFyZ3VtZW50KCdzaGVsbCcpID8/IHNlbGY6Omd1ZXNzU2hlbGwoKTsKJGNvbXBsZXRpb25GaWxlID0gX19ESVJfXy4nLy4uL1Jlc291cmNlcy9jb21wbGV0aW9uLicuJHNoZWxsOwppZiAoIWZpbGVfZXhpc3RzKCRjb21wbGV0aW9uRmlsZSkpIHsKJHN1cHBvcnRlZFNoZWxscyA9ICR0aGlzLT5nZXRTdXBwb3J0ZWRTaGVsbHMoKTsKCmlmICgkb3V0cHV0IGluc3RhbmNlb2YgQ29uc29sZU91dHB1dEludGVyZmFjZSkgewokb3V0cHV0ID0gJG91dHB1dC0+Z2V0RXJyb3JPdXRwdXQoKTsKfQppZiAoJHNoZWxsKSB7CiRvdXRwdXQtPndyaXRlbG4oc3ByaW50ZignPGVycm9yPkRldGVjdGVkIHNoZWxsICIlcyIsIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgU3ltZm9ueSBzaGVsbCBjb21wbGV0aW9uIChzdXBwb3J0ZWQgc2hlbGxzOiAiJXMiKS48Lz4nLCAkc2hlbGwsIGltcGxvZGUoJyIsICInLCAkc3VwcG9ydGVkU2hlbGxzKSkpOwp9IGVsc2Ugewokb3V0cHV0LT53cml0ZWxuKHNwcmludGYoJzxlcnJvcj5TaGVsbCBub3QgZGV0ZWN0ZWQsIFN5bWZvbnkgc2hlbGwgY29tcGxldGlvbiBvbmx5IHN1cHBvcnRzICIlcyIpLjwvPicsIGltcGxvZGUoJyIsICInLCAkc3VwcG9ydGVkU2hlbGxzKSkpOwp9CgpyZXR1cm4gMjsKfQoKJG91dHB1dC0+d3JpdGUoc3RyX3JlcGxhY2UoWyd7eyBDT01NQU5EX05BTUUgfX0nLCAne3sgVkVSU0lPTiB9fSddLCBbJGNvbW1hbmROYW1lLCAkdGhpcy0+Z2V0QXBwbGljYXRpb24oKS0+Z2V0VmVyc2lvbigpXSwgZmlsZV9nZXRfY29udGVudHMoJGNvbXBsZXRpb25GaWxlKSkpOwoKcmV0dXJuIDA7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGd1ZXNzU2hlbGwoKTogc3RyaW5nCnsKcmV0dXJuIGJhc2VuYW1lKCRfU0VSVkVSWydTSEVMTCddID8/ICcnKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiB0YWlsRGVidWdMb2coc3RyaW5nICRjb21tYW5kTmFtZSwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiB2b2lkCnsKJGRlYnVnRmlsZSA9IHN5c19nZXRfdGVtcF9kaXIoKS4nL3NmXycuJGNvbW1hbmROYW1lLicubG9nJzsKaWYgKCFmaWxlX2V4aXN0cygkZGVidWdGaWxlKSkgewp0b3VjaCgkZGVidWdGaWxlKTsKfQokcHJvY2VzcyA9IG5ldyBQcm9jZXNzKFsndGFpbCcsICctZicsICRkZWJ1Z0ZpbGVdLCBudWxsLCBudWxsLCBudWxsLCAwKTsKJHByb2Nlc3MtPnJ1bihmdW5jdGlvbiAoc3RyaW5nICR0eXBlLCBzdHJpbmcgJGxpbmUpIHVzZSAoJG91dHB1dCk6IHZvaWQgewokb3V0cHV0LT53cml0ZSgkbGluZSk7Cn0pOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFN1cHBvcnRlZFNoZWxscygpOiBhcnJheQp7CiRzaGVsbHMgPSBbXTsKCmZvcmVhY2ggKG5ldyBcRGlyZWN0b3J5SXRlcmF0b3IoX19ESVJfXy4nLy4uL1Jlc291cmNlcy8nKSBhcyAkZmlsZSkgewppZiAoc3RyX3N0YXJ0c193aXRoKCRmaWxlLT5nZXRCYXNlbmFtZSgpLCAnY29tcGxldGlvbi4nKSAmJiAkZmlsZS0+aXNGaWxlKCkpIHsKJHNoZWxsc1tdID0gJGZpbGUtPmdldEV4dGVuc2lvbigpOwp9Cn0KCnJldHVybiAkc2hlbGxzOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25JbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uU3VnZ2VzdGlvbnM7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXERlc2NyaXB0b3JcQXBwbGljYXRpb25EZXNjcmlwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXERlc2NyaXB0b3JIZWxwZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKY2xhc3MgSGVscENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kCnsKcHJpdmF0ZSAkY29tbWFuZDsKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKQp7CiR0aGlzLT5pZ25vcmVWYWxpZGF0aW9uRXJyb3JzKCk7CgokdGhpcwotPnNldE5hbWUoJ2hlbHAnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRBcmd1bWVudCgnY29tbWFuZF9uYW1lJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdUaGUgY29tbWFuZCBuYW1lJywgJ2hlbHAnKSwKbmV3IElucHV0T3B0aW9uKCdmb3JtYXQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdUaGUgb3V0cHV0IGZvcm1hdCAodHh0LCB4bWwsIGpzb24sIG9yIG1kKScsICd0eHQnKSwKbmV3IElucHV0T3B0aW9uKCdyYXcnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1RvIG91dHB1dCByYXcgY29tbWFuZCBoZWxwJyksCl0pCi0+c2V0RGVzY3JpcHRpb24oJ0Rpc3BsYXkgaGVscCBmb3IgYSBjb21tYW5kJykKLT5zZXRIZWxwKDw8PCdFT0YnClRoZSA8aW5mbz4lY29tbWFuZC5uYW1lJTwvaW5mbz4gY29tbWFuZCBkaXNwbGF5cyBoZWxwIGZvciBhIGdpdmVuIGNvbW1hbmQ6CgogIDxpbmZvPiVjb21tYW5kLmZ1bGxfbmFtZSUgbGlzdDwvaW5mbz4KCllvdSBjYW4gYWxzbyBvdXRwdXQgdGhlIGhlbHAgaW4gb3RoZXIgZm9ybWF0cyBieSB1c2luZyB0aGUgPGNvbW1lbnQ+LS1mb3JtYXQ8L2NvbW1lbnQ+IG9wdGlvbjoKCiAgPGluZm8+JWNvbW1hbmQuZnVsbF9uYW1lJSAtLWZvcm1hdD14bWwgbGlzdDwvaW5mbz4KClRvIGRpc3BsYXkgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGNvbW1hbmRzLCBwbGVhc2UgdXNlIHRoZSA8aW5mbz5saXN0PC9pbmZvPiBjb21tYW5kLgpFT0YKKQo7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRDb21tYW5kKENvbW1hbmQgJGNvbW1hbmQpCnsKJHRoaXMtPmNvbW1hbmQgPSAkY29tbWFuZDsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewppZiAobnVsbCA9PT0gJHRoaXMtPmNvbW1hbmQpIHsKJHRoaXMtPmNvbW1hbmQgPSAkdGhpcy0+Z2V0QXBwbGljYXRpb24oKS0+ZmluZCgkaW5wdXQtPmdldEFyZ3VtZW50KCdjb21tYW5kX25hbWUnKSk7Cn0KCiRoZWxwZXIgPSBuZXcgRGVzY3JpcHRvckhlbHBlcigpOwokaGVscGVyLT5kZXNjcmliZSgkb3V0cHV0LCAkdGhpcy0+Y29tbWFuZCwgWwonZm9ybWF0JyA9PiAkaW5wdXQtPmdldE9wdGlvbignZm9ybWF0JyksCidyYXdfdGV4dCcgPT4gJGlucHV0LT5nZXRPcHRpb24oJ3JhdycpLApdKTsKCiR0aGlzLT5jb21tYW5kID0gbnVsbDsKCnJldHVybiAwOwp9CgpwdWJsaWMgZnVuY3Rpb24gY29tcGxldGUoQ29tcGxldGlvbklucHV0ICRpbnB1dCwgQ29tcGxldGlvblN1Z2dlc3Rpb25zICRzdWdnZXN0aW9ucyk6IHZvaWQKewppZiAoJGlucHV0LT5tdXN0U3VnZ2VzdEFyZ3VtZW50VmFsdWVzRm9yKCdjb21tYW5kX25hbWUnKSkgewokZGVzY3JpcHRvciA9IG5ldyBBcHBsaWNhdGlvbkRlc2NyaXB0aW9uKCR0aGlzLT5nZXRBcHBsaWNhdGlvbigpKTsKJHN1Z2dlc3Rpb25zLT5zdWdnZXN0VmFsdWVzKGFycmF5X2tleXMoJGRlc2NyaXB0b3ItPmdldENvbW1hbmRzKCkpKTsKCnJldHVybjsKfQoKaWYgKCRpbnB1dC0+bXVzdFN1Z2dlc3RPcHRpb25WYWx1ZXNGb3IoJ2Zvcm1hdCcpKSB7CiRoZWxwZXIgPSBuZXcgRGVzY3JpcHRvckhlbHBlcigpOwokc3VnZ2VzdGlvbnMtPnN1Z2dlc3RWYWx1ZXMoJGhlbHBlci0+Z2V0Rm9ybWF0cygpKTsKfQp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxBcHBsaWNhdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uSW5wdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvblN1Z2dlc3Rpb25zOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcSGVscGVyU2V0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dERlZmluaXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKZmluYWwgY2xhc3MgTGF6eUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kCnsKcHJpdmF0ZSAkY29tbWFuZDsKcHJpdmF0ZSAkaXNFbmFibGVkOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSwgYXJyYXkgJGFsaWFzZXMsIHN0cmluZyAkZGVzY3JpcHRpb24sIGJvb2wgJGlzSGlkZGVuLCBcQ2xvc3VyZSAkY29tbWFuZEZhY3RvcnksID9ib29sICRpc0VuYWJsZWQgPSB0cnVlKQp7CiR0aGlzLT5zZXROYW1lKCRuYW1lKQotPnNldEFsaWFzZXMoJGFsaWFzZXMpCi0+c2V0SGlkZGVuKCRpc0hpZGRlbikKLT5zZXREZXNjcmlwdGlvbigkZGVzY3JpcHRpb24pOwoKJHRoaXMtPmNvbW1hbmQgPSAkY29tbWFuZEZhY3Rvcnk7CiR0aGlzLT5pc0VuYWJsZWQgPSAkaXNFbmFibGVkOwp9CgpwdWJsaWMgZnVuY3Rpb24gaWdub3JlVmFsaWRhdGlvbkVycm9ycygpOiB2b2lkCnsKJHRoaXMtPmdldENvbW1hbmQoKS0+aWdub3JlVmFsaWRhdGlvbkVycm9ycygpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0QXBwbGljYXRpb24oP0FwcGxpY2F0aW9uICRhcHBsaWNhdGlvbiA9IG51bGwpOiB2b2lkCnsKaWYgKCR0aGlzLT5jb21tYW5kIGluc3RhbmNlb2YgcGFyZW50KSB7CiR0aGlzLT5jb21tYW5kLT5zZXRBcHBsaWNhdGlvbigkYXBwbGljYXRpb24pOwp9CgpwYXJlbnQ6OnNldEFwcGxpY2F0aW9uKCRhcHBsaWNhdGlvbik7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRIZWxwZXJTZXQoSGVscGVyU2V0ICRoZWxwZXJTZXQpOiB2b2lkCnsKaWYgKCR0aGlzLT5jb21tYW5kIGluc3RhbmNlb2YgcGFyZW50KSB7CiR0aGlzLT5jb21tYW5kLT5zZXRIZWxwZXJTZXQoJGhlbHBlclNldCk7Cn0KCnBhcmVudDo6c2V0SGVscGVyU2V0KCRoZWxwZXJTZXQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNFbmFibGVkKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmlzRW5hYmxlZCA/PyAkdGhpcy0+Z2V0Q29tbWFuZCgpLT5pc0VuYWJsZWQoKTsKfQoKcHVibGljIGZ1bmN0aW9uIHJ1bihJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKcmV0dXJuICR0aGlzLT5nZXRDb21tYW5kKCktPnJ1bigkaW5wdXQsICRvdXRwdXQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY29tcGxldGUoQ29tcGxldGlvbklucHV0ICRpbnB1dCwgQ29tcGxldGlvblN1Z2dlc3Rpb25zICRzdWdnZXN0aW9ucyk6IHZvaWQKewokdGhpcy0+Z2V0Q29tbWFuZCgpLT5jb21wbGV0ZSgkaW5wdXQsICRzdWdnZXN0aW9ucyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDb2RlKGNhbGxhYmxlICRjb2RlKTogc2VsZgp7CiR0aGlzLT5nZXRDb21tYW5kKCktPnNldENvZGUoJGNvZGUpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbWVyZ2VBcHBsaWNhdGlvbkRlZmluaXRpb24oYm9vbCAkbWVyZ2VBcmdzID0gdHJ1ZSk6IHZvaWQKewokdGhpcy0+Z2V0Q29tbWFuZCgpLT5tZXJnZUFwcGxpY2F0aW9uRGVmaW5pdGlvbigkbWVyZ2VBcmdzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERlZmluaXRpb24oJGRlZmluaXRpb24pOiBzZWxmCnsKJHRoaXMtPmdldENvbW1hbmQoKS0+c2V0RGVmaW5pdGlvbigkZGVmaW5pdGlvbik7CgpyZXR1cm4gJHRoaXM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXREZWZpbml0aW9uKCk6IElucHV0RGVmaW5pdGlvbgp7CnJldHVybiAkdGhpcy0+Z2V0Q29tbWFuZCgpLT5nZXREZWZpbml0aW9uKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXROYXRpdmVEZWZpbml0aW9uKCk6IElucHV0RGVmaW5pdGlvbgp7CnJldHVybiAkdGhpcy0+Z2V0Q29tbWFuZCgpLT5nZXROYXRpdmVEZWZpbml0aW9uKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRBcmd1bWVudChzdHJpbmcgJG5hbWUsID9pbnQgJG1vZGUgPSBudWxsLCBzdHJpbmcgJGRlc2NyaXB0aW9uID0gJycsICRkZWZhdWx0ID0gbnVsbCk6IHNlbGYKewokdGhpcy0+Z2V0Q29tbWFuZCgpLT5hZGRBcmd1bWVudCgkbmFtZSwgJG1vZGUsICRkZXNjcmlwdGlvbiwgJGRlZmF1bHQpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkT3B0aW9uKHN0cmluZyAkbmFtZSwgJHNob3J0Y3V0ID0gbnVsbCwgP2ludCAkbW9kZSA9IG51bGwsIHN0cmluZyAkZGVzY3JpcHRpb24gPSAnJywgJGRlZmF1bHQgPSBudWxsKTogc2VsZgp7CiR0aGlzLT5nZXRDb21tYW5kKCktPmFkZE9wdGlvbigkbmFtZSwgJHNob3J0Y3V0LCAkbW9kZSwgJGRlc2NyaXB0aW9uLCAkZGVmYXVsdCk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQcm9jZXNzVGl0bGUoc3RyaW5nICR0aXRsZSk6IHNlbGYKewokdGhpcy0+Z2V0Q29tbWFuZCgpLT5zZXRQcm9jZXNzVGl0bGUoJHRpdGxlKTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEhlbHAoc3RyaW5nICRoZWxwKTogc2VsZgp7CiR0aGlzLT5nZXRDb21tYW5kKCktPnNldEhlbHAoJGhlbHApOwoKcmV0dXJuICR0aGlzOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SGVscCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmdldENvbW1hbmQoKS0+Z2V0SGVscCgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvY2Vzc2VkSGVscCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmdldENvbW1hbmQoKS0+Z2V0UHJvY2Vzc2VkSGVscCgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3lub3BzaXMoYm9vbCAkc2hvcnQgPSBmYWxzZSk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+Z2V0Q29tbWFuZCgpLT5nZXRTeW5vcHNpcygkc2hvcnQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkVXNhZ2Uoc3RyaW5nICR1c2FnZSk6IHNlbGYKewokdGhpcy0+Z2V0Q29tbWFuZCgpLT5hZGRVc2FnZSgkdXNhZ2UpOwoKcmV0dXJuICR0aGlzOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXNhZ2VzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5nZXRDb21tYW5kKCktPmdldFVzYWdlcygpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SGVscGVyKHN0cmluZyAkbmFtZSkKewpyZXR1cm4gJHRoaXMtPmdldENvbW1hbmQoKS0+Z2V0SGVscGVyKCRuYW1lKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldENvbW1hbmQoKTogcGFyZW50CnsKaWYgKCEkdGhpcy0+Y29tbWFuZCBpbnN0YW5jZW9mIFxDbG9zdXJlKSB7CnJldHVybiAkdGhpcy0+Y29tbWFuZDsKfQoKJGNvbW1hbmQgPSAkdGhpcy0+Y29tbWFuZCA9ICgkdGhpcy0+Y29tbWFuZCkoKTsKJGNvbW1hbmQtPnNldEFwcGxpY2F0aW9uKCR0aGlzLT5nZXRBcHBsaWNhdGlvbigpKTsKCmlmIChudWxsICE9PSAkdGhpcy0+Z2V0SGVscGVyU2V0KCkpIHsKJGNvbW1hbmQtPnNldEhlbHBlclNldCgkdGhpcy0+Z2V0SGVscGVyU2V0KCkpOwp9CgokY29tbWFuZC0+c2V0TmFtZSgkdGhpcy0+Z2V0TmFtZSgpKQotPnNldEFsaWFzZXMoJHRoaXMtPmdldEFsaWFzZXMoKSkKLT5zZXRIaWRkZW4oJHRoaXMtPmlzSGlkZGVuKCkpCi0+c2V0RGVzY3JpcHRpb24oJHRoaXMtPmdldERlc2NyaXB0aW9uKCkpOwoKCiRjb21tYW5kLT5nZXREZWZpbml0aW9uKCk7CgpyZXR1cm4gJGNvbW1hbmQ7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvbklucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25TdWdnZXN0aW9uczsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRGVzY3JpcHRvclxBcHBsaWNhdGlvbkRlc2NyaXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcRGVzY3JpcHRvckhlbHBlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBMaXN0Q29tbWFuZCBleHRlbmRzIENvbW1hbmQKewoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCkKewokdGhpcwotPnNldE5hbWUoJ2xpc3QnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRBcmd1bWVudCgnbmFtZXNwYWNlJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdUaGUgbmFtZXNwYWNlIG5hbWUnKSwKbmV3IElucHV0T3B0aW9uKCdyYXcnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1RvIG91dHB1dCByYXcgY29tbWFuZCBsaXN0JyksCm5ldyBJbnB1dE9wdGlvbignZm9ybWF0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnVGhlIG91dHB1dCBmb3JtYXQgKHR4dCwgeG1sLCBqc29uLCBvciBtZCknLCAndHh0JyksCm5ldyBJbnB1dE9wdGlvbignc2hvcnQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1RvIHNraXAgZGVzY3JpYmluZyBjb21tYW5kc1wnIGFyZ3VtZW50cycpLApdKQotPnNldERlc2NyaXB0aW9uKCdMaXN0IGNvbW1hbmRzJykKLT5zZXRIZWxwKDw8PCdFT0YnClRoZSA8aW5mbz4lY29tbWFuZC5uYW1lJTwvaW5mbz4gY29tbWFuZCBsaXN0cyBhbGwgY29tbWFuZHM6CgogIDxpbmZvPiVjb21tYW5kLmZ1bGxfbmFtZSU8L2luZm8+CgpZb3UgY2FuIGFsc28gZGlzcGxheSB0aGUgY29tbWFuZHMgZm9yIGEgc3BlY2lmaWMgbmFtZXNwYWNlOgoKICA8aW5mbz4lY29tbWFuZC5mdWxsX25hbWUlIHRlc3Q8L2luZm8+CgpZb3UgY2FuIGFsc28gb3V0cHV0IHRoZSBpbmZvcm1hdGlvbiBpbiBvdGhlciBmb3JtYXRzIGJ5IHVzaW5nIHRoZSA8Y29tbWVudD4tLWZvcm1hdDwvY29tbWVudD4gb3B0aW9uOgoKICA8aW5mbz4lY29tbWFuZC5mdWxsX25hbWUlIC0tZm9ybWF0PXhtbDwvaW5mbz4KCkl0J3MgYWxzbyBwb3NzaWJsZSB0byBnZXQgcmF3IGxpc3Qgb2YgY29tbWFuZHMgKHVzZWZ1bCBmb3IgZW1iZWRkaW5nIGNvbW1hbmQgcnVubmVyKToKCiAgPGluZm8+JWNvbW1hbmQuZnVsbF9uYW1lJSAtLXJhdzwvaW5mbz4KRU9GCikKOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KQp7CiRoZWxwZXIgPSBuZXcgRGVzY3JpcHRvckhlbHBlcigpOwokaGVscGVyLT5kZXNjcmliZSgkb3V0cHV0LCAkdGhpcy0+Z2V0QXBwbGljYXRpb24oKSwgWwonZm9ybWF0JyA9PiAkaW5wdXQtPmdldE9wdGlvbignZm9ybWF0JyksCidyYXdfdGV4dCcgPT4gJGlucHV0LT5nZXRPcHRpb24oJ3JhdycpLAonbmFtZXNwYWNlJyA9PiAkaW5wdXQtPmdldEFyZ3VtZW50KCduYW1lc3BhY2UnKSwKJ3Nob3J0JyA9PiAkaW5wdXQtPmdldE9wdGlvbignc2hvcnQnKSwKXSk7CgpyZXR1cm4gMDsKfQoKcHVibGljIGZ1bmN0aW9uIGNvbXBsZXRlKENvbXBsZXRpb25JbnB1dCAkaW5wdXQsIENvbXBsZXRpb25TdWdnZXN0aW9ucyAkc3VnZ2VzdGlvbnMpOiB2b2lkCnsKaWYgKCRpbnB1dC0+bXVzdFN1Z2dlc3RBcmd1bWVudFZhbHVlc0ZvcignbmFtZXNwYWNlJykpIHsKJGRlc2NyaXB0b3IgPSBuZXcgQXBwbGljYXRpb25EZXNjcmlwdGlvbigkdGhpcy0+Z2V0QXBwbGljYXRpb24oKSk7CiRzdWdnZXN0aW9ucy0+c3VnZ2VzdFZhbHVlcyhhcnJheV9rZXlzKCRkZXNjcmlwdG9yLT5nZXROYW1lc3BhY2VzKCkpKTsKCnJldHVybjsKfQoKaWYgKCRpbnB1dC0+bXVzdFN1Z2dlc3RPcHRpb25WYWx1ZXNGb3IoJ2Zvcm1hdCcpKSB7CiRoZWxwZXIgPSBuZXcgRGVzY3JpcHRvckhlbHBlcigpOwokc3VnZ2VzdGlvbnMtPnN1Z2dlc3RWYWx1ZXMoJGhlbHBlci0+Z2V0Rm9ybWF0cygpKTsKfQp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cTG9naWNFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxMb2NrXExvY2tGYWN0b3J5Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcTG9ja1xMb2NrSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcTG9ja1xTdG9yZVxGbG9ja1N0b3JlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcTG9ja1xTdG9yZVxTZW1hcGhvcmVTdG9yZTsKCgoKCgoKdHJhaXQgTG9ja2FibGVUcmFpdAp7Cgpwcml2YXRlICRsb2NrOwoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBsb2NrKD9zdHJpbmcgJG5hbWUgPSBudWxsLCBib29sICRibG9ja2luZyA9IGZhbHNlKTogYm9vbAp7CmlmICghY2xhc3NfZXhpc3RzKFNlbWFwaG9yZVN0b3JlOjpjbGFzcykpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdUbyBlbmFibGUgdGhlIGxvY2tpbmcgZmVhdHVyZSB5b3UgbXVzdCBpbnN0YWxsIHRoZSBzeW1mb255L2xvY2sgY29tcG9uZW50LicpOwp9CgppZiAobnVsbCAhPT0gJHRoaXMtPmxvY2spIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdBIGxvY2sgaXMgYWxyZWFkeSBpbiBwbGFjZS4nKTsKfQoKaWYgKFNlbWFwaG9yZVN0b3JlOjppc1N1cHBvcnRlZCgpKSB7CiRzdG9yZSA9IG5ldyBTZW1hcGhvcmVTdG9yZSgpOwp9IGVsc2Ugewokc3RvcmUgPSBuZXcgRmxvY2tTdG9yZSgpOwp9CgokdGhpcy0+bG9jayA9IChuZXcgTG9ja0ZhY3RvcnkoJHN0b3JlKSktPmNyZWF0ZUxvY2soJG5hbWUgPzogJHRoaXMtPmdldE5hbWUoKSk7CmlmICghJHRoaXMtPmxvY2stPmFjcXVpcmUoJGJsb2NraW5nKSkgewokdGhpcy0+bG9jayA9IG51bGw7CgpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiB0cnVlOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlbGVhc2UoKQp7CmlmICgkdGhpcy0+bG9jaykgewokdGhpcy0+bG9jay0+cmVsZWFzZSgpOwokdGhpcy0+bG9jayA9IG51bGw7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kOwoKCgoKCgppbnRlcmZhY2UgU2lnbmFsYWJsZUNvbW1hbmRJbnRlcmZhY2UKewoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3Vic2NyaWJlZFNpZ25hbHMoKTogYXJyYXk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFuZGxlU2lnbmFsKGludCAkc2lnbmFsKTogdm9pZDsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZExvYWRlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbjsKCgoKCmludGVyZmFjZSBDb21tYW5kTG9hZGVySW50ZXJmYWNlCnsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXQoc3RyaW5nICRuYW1lKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhcyhzdHJpbmcgJG5hbWUpOwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWVzKCk7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRMb2FkZXI7Cgp1c2UgUHNyXENvbnRhaW5lclxDb250YWluZXJJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxDb21tYW5kTm90Rm91bmRFeGNlcHRpb247CgoKCgoKCmNsYXNzIENvbnRhaW5lckNvbW1hbmRMb2FkZXIgaW1wbGVtZW50cyBDb21tYW5kTG9hZGVySW50ZXJmYWNlCnsKcHJpdmF0ZSAkY29udGFpbmVyOwpwcml2YXRlICRjb21tYW5kTWFwOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KENvbnRhaW5lckludGVyZmFjZSAkY29udGFpbmVyLCBhcnJheSAkY29tbWFuZE1hcCkKewokdGhpcy0+Y29udGFpbmVyID0gJGNvbnRhaW5lcjsKJHRoaXMtPmNvbW1hbmRNYXAgPSAkY29tbWFuZE1hcDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldChzdHJpbmcgJG5hbWUpCnsKaWYgKCEkdGhpcy0+aGFzKCRuYW1lKSkgewp0aHJvdyBuZXcgQ29tbWFuZE5vdEZvdW5kRXhjZXB0aW9uKHNwcmludGYoJ0NvbW1hbmQgIiVzIiBkb2VzIG5vdCBleGlzdC4nLCAkbmFtZSkpOwp9CgpyZXR1cm4gJHRoaXMtPmNvbnRhaW5lci0+Z2V0KCR0aGlzLT5jb21tYW5kTWFwWyRuYW1lXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXMoc3RyaW5nICRuYW1lKQp7CnJldHVybiBpc3NldCgkdGhpcy0+Y29tbWFuZE1hcFskbmFtZV0pICYmICR0aGlzLT5jb250YWluZXItPmhhcygkdGhpcy0+Y29tbWFuZE1hcFskbmFtZV0pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZXMoKQp7CnJldHVybiBhcnJheV9rZXlzKCR0aGlzLT5jb21tYW5kTWFwKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kTG9hZGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbjsKCgoKCgoKY2xhc3MgRmFjdG9yeUNvbW1hbmRMb2FkZXIgaW1wbGVtZW50cyBDb21tYW5kTG9hZGVySW50ZXJmYWNlCnsKcHJpdmF0ZSAkZmFjdG9yaWVzOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRmYWN0b3JpZXMpCnsKJHRoaXMtPmZhY3RvcmllcyA9ICRmYWN0b3JpZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXMoc3RyaW5nICRuYW1lKQp7CnJldHVybiBpc3NldCgkdGhpcy0+ZmFjdG9yaWVzWyRuYW1lXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXQoc3RyaW5nICRuYW1lKQp7CmlmICghaXNzZXQoJHRoaXMtPmZhY3Rvcmllc1skbmFtZV0pKSB7CnRocm93IG5ldyBDb21tYW5kTm90Rm91bmRFeGNlcHRpb24oc3ByaW50ZignQ29tbWFuZCAiJXMiIGRvZXMgbm90IGV4aXN0LicsICRuYW1lKSk7Cn0KCiRmYWN0b3J5ID0gJHRoaXMtPmZhY3Rvcmllc1skbmFtZV07CgpyZXR1cm4gJGZhY3RvcnkoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWVzKCkKewpyZXR1cm4gYXJyYXlfa2V5cygkdGhpcy0+ZmFjdG9yaWVzKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXFJ1bnRpbWVFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XEFyZ3ZJbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXREZWZpbml0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKCgoKCgoKCgoKZmluYWwgY2xhc3MgQ29tcGxldGlvbklucHV0IGV4dGVuZHMgQXJndklucHV0CnsKcHVibGljIGNvbnN0IFRZUEVfQVJHVU1FTlRfVkFMVUUgPSAnYXJndW1lbnRfdmFsdWUnOwpwdWJsaWMgY29uc3QgVFlQRV9PUFRJT05fVkFMVUUgPSAnb3B0aW9uX3ZhbHVlJzsKcHVibGljIGNvbnN0IFRZUEVfT1BUSU9OX05BTUUgPSAnb3B0aW9uX25hbWUnOwpwdWJsaWMgY29uc3QgVFlQRV9OT05FID0gJ25vbmUnOwoKcHJpdmF0ZSAkdG9rZW5zOwpwcml2YXRlICRjdXJyZW50SW5kZXg7CnByaXZhdGUgJGNvbXBsZXRpb25UeXBlOwpwcml2YXRlICRjb21wbGV0aW9uTmFtZSA9IG51bGw7CnByaXZhdGUgJGNvbXBsZXRpb25WYWx1ZSA9ICcnOwoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21TdHJpbmcoc3RyaW5nICRpbnB1dFN0ciwgaW50ICRjdXJyZW50SW5kZXgpOiBzZWxmCnsKcHJlZ19tYXRjaF9hbGwoJy8oPzw9XnxccykoW1wnIl0/KSguKz8pKD88IVxcXFwpXDEoPz0kfFxzKS8nLCAkaW5wdXRTdHIsICR0b2tlbnMpOwoKcmV0dXJuIHNlbGY6OmZyb21Ub2tlbnMoJHRva2Vuc1swXSwgJGN1cnJlbnRJbmRleCk7Cn0KCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnJvbVRva2VucyhhcnJheSAkdG9rZW5zLCBpbnQgJGN1cnJlbnRJbmRleCk6IHNlbGYKewokaW5wdXQgPSBuZXcgc2VsZigkdG9rZW5zKTsKJGlucHV0LT50b2tlbnMgPSAkdG9rZW5zOwokaW5wdXQtPmN1cnJlbnRJbmRleCA9ICRjdXJyZW50SW5kZXg7CgpyZXR1cm4gJGlucHV0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYmluZChJbnB1dERlZmluaXRpb24gJGRlZmluaXRpb24pOiB2b2lkCnsKcGFyZW50OjpiaW5kKCRkZWZpbml0aW9uKTsKCiRyZWxldmFudFRva2VuID0gJHRoaXMtPmdldFJlbGV2YW50VG9rZW4oKTsKaWYgKCctJyA9PT0gJHJlbGV2YW50VG9rZW5bMF0pIHsKClskb3B0aW9uVG9rZW4sICRvcHRpb25WYWx1ZV0gPSBleHBsb2RlKCc9JywgJHJlbGV2YW50VG9rZW4sIDIpICsgWycnLCAnJ107Cgokb3B0aW9uID0gJHRoaXMtPmdldE9wdGlvbkZyb21Ub2tlbigkb3B0aW9uVG9rZW4pOwppZiAobnVsbCA9PT0gJG9wdGlvbiAmJiAhJHRoaXMtPmlzQ3Vyc29yRnJlZSgpKSB7CiR0aGlzLT5jb21wbGV0aW9uVHlwZSA9IHNlbGY6OlRZUEVfT1BUSU9OX05BTUU7CiR0aGlzLT5jb21wbGV0aW9uVmFsdWUgPSAkcmVsZXZhbnRUb2tlbjsKCnJldHVybjsKfQoKaWYgKG51bGwgIT09ICRvcHRpb24gJiYgJG9wdGlvbi0+YWNjZXB0VmFsdWUoKSkgewokdGhpcy0+Y29tcGxldGlvblR5cGUgPSBzZWxmOjpUWVBFX09QVElPTl9WQUxVRTsKJHRoaXMtPmNvbXBsZXRpb25OYW1lID0gJG9wdGlvbi0+Z2V0TmFtZSgpOwokdGhpcy0+Y29tcGxldGlvblZhbHVlID0gJG9wdGlvblZhbHVlID86ICghc3RyX3N0YXJ0c193aXRoKCRvcHRpb25Ub2tlbiwgJy0tJykgPyBzdWJzdHIoJG9wdGlvblRva2VuLCAyKSA6ICcnKTsKCnJldHVybjsKfQp9CgokcHJldmlvdXNUb2tlbiA9ICR0aGlzLT50b2tlbnNbJHRoaXMtPmN1cnJlbnRJbmRleCAtIDFdOwppZiAoJy0nID09PSAkcHJldmlvdXNUb2tlblswXSAmJiAnJyAhPT0gdHJpbSgkcHJldmlvdXNUb2tlbiwgJy0nKSkgewoKJHByZXZpb3VzT3B0aW9uID0gJHRoaXMtPmdldE9wdGlvbkZyb21Ub2tlbigkcHJldmlvdXNUb2tlbik7CmlmIChudWxsICE9PSAkcHJldmlvdXNPcHRpb24gJiYgJHByZXZpb3VzT3B0aW9uLT5hY2NlcHRWYWx1ZSgpKSB7CiR0aGlzLT5jb21wbGV0aW9uVHlwZSA9IHNlbGY6OlRZUEVfT1BUSU9OX1ZBTFVFOwokdGhpcy0+Y29tcGxldGlvbk5hbWUgPSAkcHJldmlvdXNPcHRpb24tPmdldE5hbWUoKTsKJHRoaXMtPmNvbXBsZXRpb25WYWx1ZSA9ICRyZWxldmFudFRva2VuOwoKcmV0dXJuOwp9Cn0KCgokdGhpcy0+Y29tcGxldGlvblR5cGUgPSBzZWxmOjpUWVBFX0FSR1VNRU5UX1ZBTFVFOwoKZm9yZWFjaCAoJHRoaXMtPmRlZmluaXRpb24tPmdldEFyZ3VtZW50cygpIGFzICRhcmd1bWVudE5hbWUgPT4gJGFyZ3VtZW50KSB7CmlmICghaXNzZXQoJHRoaXMtPmFyZ3VtZW50c1skYXJndW1lbnROYW1lXSkpIHsKYnJlYWs7Cn0KCiRhcmd1bWVudFZhbHVlID0gJHRoaXMtPmFyZ3VtZW50c1skYXJndW1lbnROYW1lXTsKJHRoaXMtPmNvbXBsZXRpb25OYW1lID0gJGFyZ3VtZW50TmFtZTsKaWYgKFxpc19hcnJheSgkYXJndW1lbnRWYWx1ZSkpIHsKJHRoaXMtPmNvbXBsZXRpb25WYWx1ZSA9ICRhcmd1bWVudFZhbHVlID8gJGFyZ3VtZW50VmFsdWVbYXJyYXlfa2V5X2xhc3QoJGFyZ3VtZW50VmFsdWUpXSA6IG51bGw7Cn0gZWxzZSB7CiR0aGlzLT5jb21wbGV0aW9uVmFsdWUgPSAkYXJndW1lbnRWYWx1ZTsKfQp9CgppZiAoJHRoaXMtPmN1cnJlbnRJbmRleCA+PSBcY291bnQoJHRoaXMtPnRva2VucykpIHsKaWYgKCFpc3NldCgkdGhpcy0+YXJndW1lbnRzWyRhcmd1bWVudE5hbWVdKSB8fCAkdGhpcy0+ZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnQoJGFyZ3VtZW50TmFtZSktPmlzQXJyYXkoKSkgewokdGhpcy0+Y29tcGxldGlvbk5hbWUgPSAkYXJndW1lbnROYW1lOwokdGhpcy0+Y29tcGxldGlvblZhbHVlID0gJyc7Cn0gZWxzZSB7CgokdGhpcy0+Y29tcGxldGlvblR5cGUgPSBzZWxmOjpUWVBFX05PTkU7CiR0aGlzLT5jb21wbGV0aW9uTmFtZSA9IG51bGw7CiR0aGlzLT5jb21wbGV0aW9uVmFsdWUgPSAnJzsKfQp9Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tcGxldGlvblR5cGUoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5jb21wbGV0aW9uVHlwZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tcGxldGlvbk5hbWUoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+Y29tcGxldGlvbk5hbWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21wbGV0aW9uVmFsdWUoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5jb21wbGV0aW9uVmFsdWU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBtdXN0U3VnZ2VzdE9wdGlvblZhbHVlc0ZvcihzdHJpbmcgJG9wdGlvbk5hbWUpOiBib29sCnsKcmV0dXJuIHNlbGY6OlRZUEVfT1BUSU9OX1ZBTFVFID09PSAkdGhpcy0+Z2V0Q29tcGxldGlvblR5cGUoKSAmJiAkb3B0aW9uTmFtZSA9PT0gJHRoaXMtPmdldENvbXBsZXRpb25OYW1lKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBtdXN0U3VnZ2VzdEFyZ3VtZW50VmFsdWVzRm9yKHN0cmluZyAkYXJndW1lbnROYW1lKTogYm9vbAp7CnJldHVybiBzZWxmOjpUWVBFX0FSR1VNRU5UX1ZBTFVFID09PSAkdGhpcy0+Z2V0Q29tcGxldGlvblR5cGUoKSAmJiAkYXJndW1lbnROYW1lID09PSAkdGhpcy0+Z2V0Q29tcGxldGlvbk5hbWUoKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIHBhcnNlVG9rZW4oc3RyaW5nICR0b2tlbiwgYm9vbCAkcGFyc2VPcHRpb25zKTogYm9vbAp7CnRyeSB7CnJldHVybiBwYXJlbnQ6OnBhcnNlVG9rZW4oJHRva2VuLCAkcGFyc2VPcHRpb25zKTsKfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiAkZSkgewoKfQoKcmV0dXJuICRwYXJzZU9wdGlvbnM7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0T3B0aW9uRnJvbVRva2VuKHN0cmluZyAkb3B0aW9uVG9rZW4pOiA/SW5wdXRPcHRpb24Kewokb3B0aW9uTmFtZSA9IGx0cmltKCRvcHRpb25Ub2tlbiwgJy0nKTsKaWYgKCEkb3B0aW9uTmFtZSkgewpyZXR1cm4gbnVsbDsKfQoKaWYgKCctJyA9PT0gKCRvcHRpb25Ub2tlblsxXSA/PyAnICcpKSB7CgpyZXR1cm4gJHRoaXMtPmRlZmluaXRpb24tPmhhc09wdGlvbigkb3B0aW9uTmFtZSkgPyAkdGhpcy0+ZGVmaW5pdGlvbi0+Z2V0T3B0aW9uKCRvcHRpb25OYW1lKSA6IG51bGw7Cn0KCgpyZXR1cm4gJHRoaXMtPmRlZmluaXRpb24tPmhhc1Nob3J0Y3V0KCRvcHRpb25OYW1lWzBdKSA/ICR0aGlzLT5kZWZpbml0aW9uLT5nZXRPcHRpb25Gb3JTaG9ydGN1dCgkb3B0aW9uTmFtZVswXSkgOiBudWxsOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFJlbGV2YW50VG9rZW4oKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT50b2tlbnNbJHRoaXMtPmlzQ3Vyc29yRnJlZSgpID8gJHRoaXMtPmN1cnJlbnRJbmRleCAtIDEgOiAkdGhpcy0+Y3VycmVudEluZGV4XTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpc0N1cnNvckZyZWUoKTogYm9vbAp7CiRuck9mVG9rZW5zID0gXGNvdW50KCR0aGlzLT50b2tlbnMpOwppZiAoJHRoaXMtPmN1cnJlbnRJbmRleCA+ICRuck9mVG9rZW5zKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0N1cnJlbnQgaW5kZXggaXMgaW52YWxpZCwgaXQgbXVzdCBiZSB0aGUgbnVtYmVyIG9mIGlucHV0IHRva2VucyBvciBvbmUgbW9yZS4nKTsKfQoKcmV0dXJuICR0aGlzLT5jdXJyZW50SW5kZXggPj0gJG5yT2ZUb2tlbnM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCkKewokc3RyID0gJyc7CmZvcmVhY2ggKCR0aGlzLT50b2tlbnMgYXMgJGkgPT4gJHRva2VuKSB7CiRzdHIgLj0gJHRva2VuOwoKaWYgKCR0aGlzLT5jdXJyZW50SW5kZXggPT09ICRpKSB7CiRzdHIgLj0gJ3wnOwp9Cgokc3RyIC49ICcgJzsKfQoKaWYgKCR0aGlzLT5jdXJyZW50SW5kZXggPiAkaSkgewokc3RyIC49ICd8JzsKfQoKcmV0dXJuIHJ0cmltKCRzdHIpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb247Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKCgoKCgoKZmluYWwgY2xhc3MgQ29tcGxldGlvblN1Z2dlc3Rpb25zCnsKcHJpdmF0ZSAkdmFsdWVTdWdnZXN0aW9ucyA9IFtdOwpwcml2YXRlICRvcHRpb25TdWdnZXN0aW9ucyA9IFtdOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzdWdnZXN0VmFsdWUoJHZhbHVlKTogc2VsZgp7CiR0aGlzLT52YWx1ZVN1Z2dlc3Rpb25zW10gPSAhJHZhbHVlIGluc3RhbmNlb2YgU3VnZ2VzdGlvbiA/IG5ldyBTdWdnZXN0aW9uKCR2YWx1ZSkgOiAkdmFsdWU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc3VnZ2VzdFZhbHVlcyhhcnJheSAkdmFsdWVzKTogc2VsZgp7CmZvcmVhY2ggKCR2YWx1ZXMgYXMgJHZhbHVlKSB7CiR0aGlzLT5zdWdnZXN0VmFsdWUoJHZhbHVlKTsKfQoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzdWdnZXN0T3B0aW9uKElucHV0T3B0aW9uICRvcHRpb24pOiBzZWxmCnsKJHRoaXMtPm9wdGlvblN1Z2dlc3Rpb25zW10gPSAkb3B0aW9uOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHN1Z2dlc3RPcHRpb25zKGFycmF5ICRvcHRpb25zKTogc2VsZgp7CmZvcmVhY2ggKCRvcHRpb25zIGFzICRvcHRpb24pIHsKJHRoaXMtPnN1Z2dlc3RPcHRpb24oJG9wdGlvbik7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE9wdGlvblN1Z2dlc3Rpb25zKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5vcHRpb25TdWdnZXN0aW9uczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFZhbHVlU3VnZ2VzdGlvbnMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnZhbHVlU3VnZ2VzdGlvbnM7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxPdXRwdXQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25TdWdnZXN0aW9uczsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCmNsYXNzIEJhc2hDb21wbGV0aW9uT3V0cHV0IGltcGxlbWVudHMgQ29tcGxldGlvbk91dHB1dEludGVyZmFjZQp7CnB1YmxpYyBmdW5jdGlvbiB3cml0ZShDb21wbGV0aW9uU3VnZ2VzdGlvbnMgJHN1Z2dlc3Rpb25zLCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IHZvaWQKewokdmFsdWVzID0gJHN1Z2dlc3Rpb25zLT5nZXRWYWx1ZVN1Z2dlc3Rpb25zKCk7CmZvcmVhY2ggKCRzdWdnZXN0aW9ucy0+Z2V0T3B0aW9uU3VnZ2VzdGlvbnMoKSBhcyAkb3B0aW9uKSB7CiR2YWx1ZXNbXSA9ICctLScuJG9wdGlvbi0+Z2V0TmFtZSgpOwppZiAoJG9wdGlvbi0+aXNOZWdhdGFibGUoKSkgewokdmFsdWVzW10gPSAnLS1uby0nLiRvcHRpb24tPmdldE5hbWUoKTsKfQp9CiRvdXRwdXQtPndyaXRlbG4oaW1wbG9kZSgiXG4iLCAkdmFsdWVzKSk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxPdXRwdXQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25TdWdnZXN0aW9uczsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKaW50ZXJmYWNlIENvbXBsZXRpb25PdXRwdXRJbnRlcmZhY2UKewpwdWJsaWMgZnVuY3Rpb24gd3JpdGUoQ29tcGxldGlvblN1Z2dlc3Rpb25zICRzdWdnZXN0aW9ucywgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiB2b2lkOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uOwoKCgoKCgpjbGFzcyBTdWdnZXN0aW9uCnsKcHJpdmF0ZSAkdmFsdWU7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICR2YWx1ZSkKewokdGhpcy0+dmFsdWUgPSAkdmFsdWU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRWYWx1ZSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnZhbHVlOwp9CgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmdldFZhbHVlKCk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGU7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFdmVudFxDb25zb2xlQ29tbWFuZEV2ZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFdmVudFxDb25zb2xlRXJyb3JFdmVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXZlbnRcQ29uc29sZVNpZ25hbEV2ZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFdmVudFxDb25zb2xlVGVybWluYXRlRXZlbnQ7CgoKCgoKCmZpbmFsIGNsYXNzIENvbnNvbGVFdmVudHMKewoKCgoKCgoKcHVibGljIGNvbnN0IENPTU1BTkQgPSAnY29uc29sZS5jb21tYW5kJzsKCgoKCgoKCnB1YmxpYyBjb25zdCBTSUdOQUwgPSAnY29uc29sZS5zaWduYWwnOwoKCgoKCgoKcHVibGljIGNvbnN0IFRFUk1JTkFURSA9ICdjb25zb2xlLnRlcm1pbmF0ZSc7CgoKCgoKCgoKCnB1YmxpYyBjb25zdCBFUlJPUiA9ICdjb25zb2xlLmVycm9yJzsKCgoKCgoKcHVibGljIGNvbnN0IEFMSUFTRVMgPSBbCkNvbnNvbGVDb21tYW5kRXZlbnQ6OmNsYXNzID0+IHNlbGY6OkNPTU1BTkQsCkNvbnNvbGVFcnJvckV2ZW50OjpjbGFzcyA9PiBzZWxmOjpFUlJPUiwKQ29uc29sZVNpZ25hbEV2ZW50OjpjbGFzcyA9PiBzZWxmOjpTSUdOQUwsCkNvbnNvbGVUZXJtaW5hdGVFdmVudDo6Y2xhc3MgPT4gc2VsZjo6VEVSTUlOQVRFLApdOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZTsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgpmaW5hbCBjbGFzcyBDdXJzb3IKewpwcml2YXRlICRvdXRwdXQ7CnByaXZhdGUgJGlucHV0OwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCAkaW5wdXQgPSBudWxsKQp7CiR0aGlzLT5vdXRwdXQgPSAkb3V0cHV0OwokdGhpcy0+aW5wdXQgPSAkaW5wdXQgPz8gKFxkZWZpbmVkKCdTVERJTicpID8gXFNURElOIDogZm9wZW4oJ3BocDovL2lucHV0JywgJ3IrJykpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbW92ZVVwKGludCAkbGluZXMgPSAxKTogc2VsZgp7CiR0aGlzLT5vdXRwdXQtPndyaXRlKHNwcmludGYoIlx4MWJbJWRBIiwgJGxpbmVzKSk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBtb3ZlRG93bihpbnQgJGxpbmVzID0gMSk6IHNlbGYKewokdGhpcy0+b3V0cHV0LT53cml0ZShzcHJpbnRmKCJceDFiWyVkQiIsICRsaW5lcykpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbW92ZVJpZ2h0KGludCAkY29sdW1ucyA9IDEpOiBzZWxmCnsKJHRoaXMtPm91dHB1dC0+d3JpdGUoc3ByaW50ZigiXHgxYlslZEMiLCAkY29sdW1ucykpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbW92ZUxlZnQoaW50ICRjb2x1bW5zID0gMSk6IHNlbGYKewokdGhpcy0+b3V0cHV0LT53cml0ZShzcHJpbnRmKCJceDFiWyVkRCIsICRjb2x1bW5zKSk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBtb3ZlVG9Db2x1bW4oaW50ICRjb2x1bW4pOiBzZWxmCnsKJHRoaXMtPm91dHB1dC0+d3JpdGUoc3ByaW50ZigiXHgxYlslZEciLCAkY29sdW1uKSk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBtb3ZlVG9Qb3NpdGlvbihpbnQgJGNvbHVtbiwgaW50ICRyb3cpOiBzZWxmCnsKJHRoaXMtPm91dHB1dC0+d3JpdGUoc3ByaW50ZigiXHgxYlslZDslZEgiLCAkcm93ICsgMSwgJGNvbHVtbikpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2F2ZVBvc2l0aW9uKCk6IHNlbGYKewokdGhpcy0+b3V0cHV0LT53cml0ZSgiXHgxYjciKTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlc3RvcmVQb3NpdGlvbigpOiBzZWxmCnsKJHRoaXMtPm91dHB1dC0+d3JpdGUoIlx4MWI4Iik7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBoaWRlKCk6IHNlbGYKewokdGhpcy0+b3V0cHV0LT53cml0ZSgiXHgxYls/MjVsIik7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzaG93KCk6IHNlbGYKewokdGhpcy0+b3V0cHV0LT53cml0ZSgiXHgxYls/MjVoXHgxYls/MGMiKTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYXJMaW5lKCk6IHNlbGYKewokdGhpcy0+b3V0cHV0LT53cml0ZSgiXHgxYlsySyIpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYXJMaW5lQWZ0ZXIoKTogc2VsZgp7CiR0aGlzLT5vdXRwdXQtPndyaXRlKCJceDFiW0siKTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYXJPdXRwdXQoKTogc2VsZgp7CiR0aGlzLT5vdXRwdXQtPndyaXRlKCJceDFiWzBKIik7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNsZWFyU2NyZWVuKCk6IHNlbGYKewokdGhpcy0+b3V0cHV0LT53cml0ZSgiXHgxYlsySiIpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q3VycmVudFBvc2l0aW9uKCk6IGFycmF5CnsKc3RhdGljICRpc1R0eVN1cHBvcnRlZDsKCmlmIChudWxsID09PSAkaXNUdHlTdXBwb3J0ZWQgJiYgXGZ1bmN0aW9uX2V4aXN0cygncHJvY19vcGVuJykpIHsKJGlzVHR5U3VwcG9ydGVkID0gKGJvb2wpIEBwcm9jX29wZW4oJ2VjaG8gMSA+L2Rldi9udWxsJywgW1snZmlsZScsICcvZGV2L3R0eScsICdyJ10sIFsnZmlsZScsICcvZGV2L3R0eScsICd3J10sIFsnZmlsZScsICcvZGV2L3R0eScsICd3J11dLCAkcGlwZXMpOwp9CgppZiAoISRpc1R0eVN1cHBvcnRlZCkgewpyZXR1cm4gWzEsIDFdOwp9Cgokc3R0eU1vZGUgPSBzaGVsbF9leGVjKCdzdHR5IC1nJyk7CnNoZWxsX2V4ZWMoJ3N0dHkgLWljYW5vbiAtZWNobycpOwoKQGZ3cml0ZSgkdGhpcy0+aW5wdXQsICJcMDMzWzZuIik7CgokY29kZSA9IHRyaW0oZnJlYWQoJHRoaXMtPmlucHV0LCAxMDI0KSk7CgpzaGVsbF9leGVjKHNwcmludGYoJ3N0dHkgJXMnLCAkc3R0eU1vZGUpKTsKCnNzY2FuZigkY29kZSwgIlwwMzNbJWQ7JWRSIiwgJHJvdywgJGNvbCk7CgpyZXR1cm4gWyRjb2wsICRyb3ddOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXERlcGVuZGVuY3lJbmplY3Rpb247Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXENvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcTGF6eUNvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRMb2FkZXJcQ29udGFpbmVyQ29tbWFuZExvYWRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XERlcGVuZGVuY3lJbmplY3Rpb25cQXJndW1lbnRcU2VydmljZUNsb3N1cmVBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XERlcGVuZGVuY3lJbmplY3Rpb25cQ29tcGlsZXJcQ29tcGlsZXJQYXNzSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRGVwZW5kZW5jeUluamVjdGlvblxDb21waWxlclxTZXJ2aWNlTG9jYXRvclRhZ1Bhc3M7CnVzZSBTeW1mb255XENvbXBvbmVudFxEZXBlbmRlbmN5SW5qZWN0aW9uXENvbnRhaW5lckJ1aWxkZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxEZXBlbmRlbmN5SW5qZWN0aW9uXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxEZXBlbmRlbmN5SW5qZWN0aW9uXFJlZmVyZW5jZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XERlcGVuZGVuY3lJbmplY3Rpb25cVHlwZWRSZWZlcmVuY2U7CgoKCgoKCmNsYXNzIEFkZENvbnNvbGVDb21tYW5kUGFzcyBpbXBsZW1lbnRzIENvbXBpbGVyUGFzc0ludGVyZmFjZQp7CnByaXZhdGUgJGNvbW1hbmRMb2FkZXJTZXJ2aWNlSWQ7CnByaXZhdGUgJGNvbW1hbmRUYWc7CnByaXZhdGUgJG5vUHJlbG9hZFRhZzsKcHJpdmF0ZSAkcHJpdmF0ZVRhZ05hbWU7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRjb21tYW5kTG9hZGVyU2VydmljZUlkID0gJ2NvbnNvbGUuY29tbWFuZF9sb2FkZXInLCBzdHJpbmcgJGNvbW1hbmRUYWcgPSAnY29uc29sZS5jb21tYW5kJywgc3RyaW5nICRub1ByZWxvYWRUYWcgPSAnY29udGFpbmVyLm5vX3ByZWxvYWQnLCBzdHJpbmcgJHByaXZhdGVUYWdOYW1lID0gJ2NvbnRhaW5lci5wcml2YXRlJykKewppZiAoMCA8IFxmdW5jX251bV9hcmdzKCkpIHsKdHJpZ2dlcl9kZXByZWNhdGlvbignc3ltZm9ueS9jb25zb2xlJywgJzUuMycsICdDb25maWd1cmluZyAiJXMiIGlzIGRlcHJlY2F0ZWQuJywgX19DTEFTU19fKTsKfQoKJHRoaXMtPmNvbW1hbmRMb2FkZXJTZXJ2aWNlSWQgPSAkY29tbWFuZExvYWRlclNlcnZpY2VJZDsKJHRoaXMtPmNvbW1hbmRUYWcgPSAkY29tbWFuZFRhZzsKJHRoaXMtPm5vUHJlbG9hZFRhZyA9ICRub1ByZWxvYWRUYWc7CiR0aGlzLT5wcml2YXRlVGFnTmFtZSA9ICRwcml2YXRlVGFnTmFtZTsKfQoKcHVibGljIGZ1bmN0aW9uIHByb2Nlc3MoQ29udGFpbmVyQnVpbGRlciAkY29udGFpbmVyKQp7CiRjb21tYW5kU2VydmljZXMgPSAkY29udGFpbmVyLT5maW5kVGFnZ2VkU2VydmljZUlkcygkdGhpcy0+Y29tbWFuZFRhZywgdHJ1ZSk7CiRsYXp5Q29tbWFuZE1hcCA9IFtdOwokbGF6eUNvbW1hbmRSZWZzID0gW107CiRzZXJ2aWNlSWRzID0gW107Cgpmb3JlYWNoICgkY29tbWFuZFNlcnZpY2VzIGFzICRpZCA9PiAkdGFncykgewokZGVmaW5pdGlvbiA9ICRjb250YWluZXItPmdldERlZmluaXRpb24oJGlkKTsKJGRlZmluaXRpb24tPmFkZFRhZygkdGhpcy0+bm9QcmVsb2FkVGFnKTsKJGNsYXNzID0gJGNvbnRhaW5lci0+Z2V0UGFyYW1ldGVyQmFnKCktPnJlc29sdmVWYWx1ZSgkZGVmaW5pdGlvbi0+Z2V0Q2xhc3MoKSk7CgppZiAoaXNzZXQoJHRhZ3NbMF1bJ2NvbW1hbmQnXSkpIHsKJGFsaWFzZXMgPSAkdGFnc1swXVsnY29tbWFuZCddOwp9IGVsc2UgewppZiAoISRyID0gJGNvbnRhaW5lci0+Z2V0UmVmbGVjdGlvbkNsYXNzKCRjbGFzcykpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdDbGFzcyAiJXMiIHVzZWQgZm9yIHNlcnZpY2UgIiVzIiBjYW5ub3QgYmUgZm91bmQuJywgJGNsYXNzLCAkaWQpKTsKfQppZiAoISRyLT5pc1N1YmNsYXNzT2YoQ29tbWFuZDo6Y2xhc3MpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlIHNlcnZpY2UgIiVzIiB0YWdnZWQgIiVzIiBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgIiVzIi4nLCAkaWQsICR0aGlzLT5jb21tYW5kVGFnLCBDb21tYW5kOjpjbGFzcykpOwp9CiRhbGlhc2VzID0gc3RyX3JlcGxhY2UoJyUnLCAnJSUnLCAkY2xhc3M6OmdldERlZmF1bHROYW1lKCkgPz8gJycpOwp9CgokYWxpYXNlcyA9IGV4cGxvZGUoJ3wnLCAkYWxpYXNlcyA/PyAnJyk7CiRjb21tYW5kTmFtZSA9IGFycmF5X3NoaWZ0KCRhbGlhc2VzKTsKCmlmICgkaXNIaWRkZW4gPSAnJyA9PT0gJGNvbW1hbmROYW1lKSB7CiRjb21tYW5kTmFtZSA9IGFycmF5X3NoaWZ0KCRhbGlhc2VzKTsKfQoKaWYgKG51bGwgPT09ICRjb21tYW5kTmFtZSkgewppZiAoISRkZWZpbml0aW9uLT5pc1B1YmxpYygpIHx8ICRkZWZpbml0aW9uLT5pc1ByaXZhdGUoKSB8fCAkZGVmaW5pdGlvbi0+aGFzVGFnKCR0aGlzLT5wcml2YXRlVGFnTmFtZSkpIHsKJGNvbW1hbmRJZCA9ICdjb25zb2xlLmNvbW1hbmQucHVibGljX2FsaWFzLicuJGlkOwokY29udGFpbmVyLT5zZXRBbGlhcygkY29tbWFuZElkLCAkaWQpLT5zZXRQdWJsaWModHJ1ZSk7CiRpZCA9ICRjb21tYW5kSWQ7Cn0KJHNlcnZpY2VJZHNbXSA9ICRpZDsKCmNvbnRpbnVlOwp9CgokZGVzY3JpcHRpb24gPSAkdGFnc1swXVsnZGVzY3JpcHRpb24nXSA/PyBudWxsOwoKdW5zZXQoJHRhZ3NbMF0pOwokbGF6eUNvbW1hbmRNYXBbJGNvbW1hbmROYW1lXSA9ICRpZDsKJGxhenlDb21tYW5kUmVmc1skaWRdID0gbmV3IFR5cGVkUmVmZXJlbmNlKCRpZCwgJGNsYXNzKTsKCmZvcmVhY2ggKCRhbGlhc2VzIGFzICRhbGlhcykgewokbGF6eUNvbW1hbmRNYXBbJGFsaWFzXSA9ICRpZDsKfQoKZm9yZWFjaCAoJHRhZ3MgYXMgJHRhZykgewppZiAoaXNzZXQoJHRhZ1snY29tbWFuZCddKSkgewokYWxpYXNlc1tdID0gJHRhZ1snY29tbWFuZCddOwokbGF6eUNvbW1hbmRNYXBbJHRhZ1snY29tbWFuZCddXSA9ICRpZDsKfQoKJGRlc2NyaXB0aW9uID0gJGRlc2NyaXB0aW9uID8/ICR0YWdbJ2Rlc2NyaXB0aW9uJ10gPz8gbnVsbDsKfQoKJGRlZmluaXRpb24tPmFkZE1ldGhvZENhbGwoJ3NldE5hbWUnLCBbJGNvbW1hbmROYW1lXSk7CgppZiAoJGFsaWFzZXMpIHsKJGRlZmluaXRpb24tPmFkZE1ldGhvZENhbGwoJ3NldEFsaWFzZXMnLCBbJGFsaWFzZXNdKTsKfQoKaWYgKCRpc0hpZGRlbikgewokZGVmaW5pdGlvbi0+YWRkTWV0aG9kQ2FsbCgnc2V0SGlkZGVuJywgW3RydWVdKTsKfQoKaWYgKCEkZGVzY3JpcHRpb24pIHsKaWYgKCEkciA9ICRjb250YWluZXItPmdldFJlZmxlY3Rpb25DbGFzcygkY2xhc3MpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignQ2xhc3MgIiVzIiB1c2VkIGZvciBzZXJ2aWNlICIlcyIgY2Fubm90IGJlIGZvdW5kLicsICRjbGFzcywgJGlkKSk7Cn0KaWYgKCEkci0+aXNTdWJjbGFzc09mKENvbW1hbmQ6OmNsYXNzKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSBzZXJ2aWNlICIlcyIgdGFnZ2VkICIlcyIgbXVzdCBiZSBhIHN1YmNsYXNzIG9mICIlcyIuJywgJGlkLCAkdGhpcy0+Y29tbWFuZFRhZywgQ29tbWFuZDo6Y2xhc3MpKTsKfQokZGVzY3JpcHRpb24gPSBzdHJfcmVwbGFjZSgnJScsICclJScsICRjbGFzczo6Z2V0RGVmYXVsdERlc2NyaXB0aW9uKCkgPz8gJycpOwp9CgppZiAoJGRlc2NyaXB0aW9uKSB7CiRkZWZpbml0aW9uLT5hZGRNZXRob2RDYWxsKCdzZXREZXNjcmlwdGlvbicsIFskZGVzY3JpcHRpb25dKTsKCiRjb250YWluZXItPnJlZ2lzdGVyKCcuJy4kaWQuJy5sYXp5JywgTGF6eUNvbW1hbmQ6OmNsYXNzKQotPnNldEFyZ3VtZW50cyhbJGNvbW1hbmROYW1lLCAkYWxpYXNlcywgJGRlc2NyaXB0aW9uLCAkaXNIaWRkZW4sIG5ldyBTZXJ2aWNlQ2xvc3VyZUFyZ3VtZW50KCRsYXp5Q29tbWFuZFJlZnNbJGlkXSldKTsKCiRsYXp5Q29tbWFuZFJlZnNbJGlkXSA9IG5ldyBSZWZlcmVuY2UoJy4nLiRpZC4nLmxhenknKTsKfQp9CgokY29udGFpbmVyCi0+cmVnaXN0ZXIoJHRoaXMtPmNvbW1hbmRMb2FkZXJTZXJ2aWNlSWQsIENvbnRhaW5lckNvbW1hbmRMb2FkZXI6OmNsYXNzKQotPnNldFB1YmxpYyh0cnVlKQotPmFkZFRhZygkdGhpcy0+bm9QcmVsb2FkVGFnKQotPnNldEFyZ3VtZW50cyhbU2VydmljZUxvY2F0b3JUYWdQYXNzOjpyZWdpc3RlcigkY29udGFpbmVyLCAkbGF6eUNvbW1hbmRSZWZzKSwgJGxhenlDb21tYW5kTWFwXSk7CgokY29udGFpbmVyLT5zZXRQYXJhbWV0ZXIoJ2NvbnNvbGUuY29tbWFuZC5pZHMnLCAkc2VydmljZUlkcyk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRGVzY3JpcHRvcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEFwcGxpY2F0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXENvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxDb21tYW5kTm90Rm91bmRFeGNlcHRpb247CgoKCgoKCmNsYXNzIEFwcGxpY2F0aW9uRGVzY3JpcHRpb24KewpwdWJsaWMgY29uc3QgR0xPQkFMX05BTUVTUEFDRSA9ICdfZ2xvYmFsJzsKCnByaXZhdGUgJGFwcGxpY2F0aW9uOwpwcml2YXRlICRuYW1lc3BhY2U7CnByaXZhdGUgJHNob3dIaWRkZW47CgoKCgpwcml2YXRlICRuYW1lc3BhY2VzOwoKCgoKcHJpdmF0ZSAkY29tbWFuZHM7CgoKCgpwcml2YXRlICRhbGlhc2VzOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KEFwcGxpY2F0aW9uICRhcHBsaWNhdGlvbiwgP3N0cmluZyAkbmFtZXNwYWNlID0gbnVsbCwgYm9vbCAkc2hvd0hpZGRlbiA9IGZhbHNlKQp7CiR0aGlzLT5hcHBsaWNhdGlvbiA9ICRhcHBsaWNhdGlvbjsKJHRoaXMtPm5hbWVzcGFjZSA9ICRuYW1lc3BhY2U7CiR0aGlzLT5zaG93SGlkZGVuID0gJHNob3dIaWRkZW47Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lc3BhY2VzKCk6IGFycmF5CnsKaWYgKG51bGwgPT09ICR0aGlzLT5uYW1lc3BhY2VzKSB7CiR0aGlzLT5pbnNwZWN0QXBwbGljYXRpb24oKTsKfQoKcmV0dXJuICR0aGlzLT5uYW1lc3BhY2VzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tbWFuZHMoKTogYXJyYXkKewppZiAobnVsbCA9PT0gJHRoaXMtPmNvbW1hbmRzKSB7CiR0aGlzLT5pbnNwZWN0QXBwbGljYXRpb24oKTsKfQoKcmV0dXJuICR0aGlzLT5jb21tYW5kczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbW1hbmQoc3RyaW5nICRuYW1lKTogQ29tbWFuZAp7CmlmICghaXNzZXQoJHRoaXMtPmNvbW1hbmRzWyRuYW1lXSkgJiYgIWlzc2V0KCR0aGlzLT5hbGlhc2VzWyRuYW1lXSkpIHsKdGhyb3cgbmV3IENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbihzcHJpbnRmKCdDb21tYW5kICIlcyIgZG9lcyBub3QgZXhpc3QuJywgJG5hbWUpKTsKfQoKcmV0dXJuICR0aGlzLT5jb21tYW5kc1skbmFtZV0gPz8gJHRoaXMtPmFsaWFzZXNbJG5hbWVdOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGluc3BlY3RBcHBsaWNhdGlvbigpCnsKJHRoaXMtPmNvbW1hbmRzID0gW107CiR0aGlzLT5uYW1lc3BhY2VzID0gW107CgokYWxsID0gJHRoaXMtPmFwcGxpY2F0aW9uLT5hbGwoJHRoaXMtPm5hbWVzcGFjZSA/ICR0aGlzLT5hcHBsaWNhdGlvbi0+ZmluZE5hbWVzcGFjZSgkdGhpcy0+bmFtZXNwYWNlKSA6IG51bGwpOwpmb3JlYWNoICgkdGhpcy0+c29ydENvbW1hbmRzKCRhbGwpIGFzICRuYW1lc3BhY2UgPT4gJGNvbW1hbmRzKSB7CiRuYW1lcyA9IFtdOwoKCmZvcmVhY2ggKCRjb21tYW5kcyBhcyAkbmFtZSA9PiAkY29tbWFuZCkgewppZiAoISRjb21tYW5kLT5nZXROYW1lKCkgfHwgKCEkdGhpcy0+c2hvd0hpZGRlbiAmJiAkY29tbWFuZC0+aXNIaWRkZW4oKSkpIHsKY29udGludWU7Cn0KCmlmICgkY29tbWFuZC0+Z2V0TmFtZSgpID09PSAkbmFtZSkgewokdGhpcy0+Y29tbWFuZHNbJG5hbWVdID0gJGNvbW1hbmQ7Cn0gZWxzZSB7CiR0aGlzLT5hbGlhc2VzWyRuYW1lXSA9ICRjb21tYW5kOwp9CgokbmFtZXNbXSA9ICRuYW1lOwp9CgokdGhpcy0+bmFtZXNwYWNlc1skbmFtZXNwYWNlXSA9IFsnaWQnID0+ICRuYW1lc3BhY2UsICdjb21tYW5kcycgPT4gJG5hbWVzXTsKfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIHNvcnRDb21tYW5kcyhhcnJheSAkY29tbWFuZHMpOiBhcnJheQp7CiRuYW1lc3BhY2VkQ29tbWFuZHMgPSBbXTsKJGdsb2JhbENvbW1hbmRzID0gW107CiRzb3J0ZWRDb21tYW5kcyA9IFtdOwpmb3JlYWNoICgkY29tbWFuZHMgYXMgJG5hbWUgPT4gJGNvbW1hbmQpIHsKJGtleSA9ICR0aGlzLT5hcHBsaWNhdGlvbi0+ZXh0cmFjdE5hbWVzcGFjZSgkbmFtZSwgMSk7CmlmIChcaW5fYXJyYXkoJGtleSwgWycnLCBzZWxmOjpHTE9CQUxfTkFNRVNQQUNFXSwgdHJ1ZSkpIHsKJGdsb2JhbENvbW1hbmRzWyRuYW1lXSA9ICRjb21tYW5kOwp9IGVsc2UgewokbmFtZXNwYWNlZENvbW1hbmRzWyRrZXldWyRuYW1lXSA9ICRjb21tYW5kOwp9Cn0KCmlmICgkZ2xvYmFsQ29tbWFuZHMpIHsKa3NvcnQoJGdsb2JhbENvbW1hbmRzKTsKJHNvcnRlZENvbW1hbmRzW3NlbGY6OkdMT0JBTF9OQU1FU1BBQ0VdID0gJGdsb2JhbENvbW1hbmRzOwp9CgppZiAoJG5hbWVzcGFjZWRDb21tYW5kcykgewprc29ydCgkbmFtZXNwYWNlZENvbW1hbmRzLCBcU09SVF9TVFJJTkcpOwpmb3JlYWNoICgkbmFtZXNwYWNlZENvbW1hbmRzIGFzICRrZXkgPT4gJGNvbW1hbmRzU2V0KSB7Cmtzb3J0KCRjb21tYW5kc1NldCk7CiRzb3J0ZWRDb21tYW5kc1ska2V5XSA9ICRjb21tYW5kc1NldDsKfQp9CgpyZXR1cm4gJHNvcnRlZENvbW1hbmRzOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXERlc2NyaXB0b3I7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxBcHBsaWNhdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dERlZmluaXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKCgphYnN0cmFjdCBjbGFzcyBEZXNjcmlwdG9yIGltcGxlbWVudHMgRGVzY3JpcHRvckludGVyZmFjZQp7CgoKCnByb3RlY3RlZCAkb3V0cHV0OwoKCgoKcHVibGljIGZ1bmN0aW9uIGRlc2NyaWJlKE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBvYmplY3QgJG9iamVjdCwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokdGhpcy0+b3V0cHV0ID0gJG91dHB1dDsKCnN3aXRjaCAodHJ1ZSkgewpjYXNlICRvYmplY3QgaW5zdGFuY2VvZiBJbnB1dEFyZ3VtZW50OgokdGhpcy0+ZGVzY3JpYmVJbnB1dEFyZ3VtZW50KCRvYmplY3QsICRvcHRpb25zKTsKYnJlYWs7CmNhc2UgJG9iamVjdCBpbnN0YW5jZW9mIElucHV0T3B0aW9uOgokdGhpcy0+ZGVzY3JpYmVJbnB1dE9wdGlvbigkb2JqZWN0LCAkb3B0aW9ucyk7CmJyZWFrOwpjYXNlICRvYmplY3QgaW5zdGFuY2VvZiBJbnB1dERlZmluaXRpb246CiR0aGlzLT5kZXNjcmliZUlucHV0RGVmaW5pdGlvbigkb2JqZWN0LCAkb3B0aW9ucyk7CmJyZWFrOwpjYXNlICRvYmplY3QgaW5zdGFuY2VvZiBDb21tYW5kOgokdGhpcy0+ZGVzY3JpYmVDb21tYW5kKCRvYmplY3QsICRvcHRpb25zKTsKYnJlYWs7CmNhc2UgJG9iamVjdCBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uOgokdGhpcy0+ZGVzY3JpYmVBcHBsaWNhdGlvbigkb2JqZWN0LCAkb3B0aW9ucyk7CmJyZWFrOwpkZWZhdWx0Ogp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ09iamVjdCBvZiB0eXBlICIlcyIgaXMgbm90IGRlc2NyaWJhYmxlLicsIGdldF9kZWJ1Z190eXBlKCRvYmplY3QpKSk7Cn0KfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHdyaXRlKHN0cmluZyAkY29udGVudCwgYm9vbCAkZGVjb3JhdGVkID0gZmFsc2UpCnsKJHRoaXMtPm91dHB1dC0+d3JpdGUoJGNvbnRlbnQsIGZhbHNlLCAkZGVjb3JhdGVkID8gT3V0cHV0SW50ZXJmYWNlOjpPVVRQVVRfTk9STUFMIDogT3V0cHV0SW50ZXJmYWNlOjpPVVRQVVRfUkFXKTsKfQoKCgoKYWJzdHJhY3QgcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlSW5wdXRBcmd1bWVudChJbnB1dEFyZ3VtZW50ICRhcmd1bWVudCwgYXJyYXkgJG9wdGlvbnMgPSBbXSk7CgoKCgphYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVJbnB1dE9wdGlvbihJbnB1dE9wdGlvbiAkb3B0aW9uLCBhcnJheSAkb3B0aW9ucyA9IFtdKTsKCgoKCmFic3RyYWN0IHByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUlucHV0RGVmaW5pdGlvbihJbnB1dERlZmluaXRpb24gJGRlZmluaXRpb24sIGFycmF5ICRvcHRpb25zID0gW10pOwoKCgoKYWJzdHJhY3QgcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlQ29tbWFuZChDb21tYW5kICRjb21tYW5kLCBhcnJheSAkb3B0aW9ucyA9IFtdKTsKCgoKCmFic3RyYWN0IHByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uICRhcHBsaWNhdGlvbiwgYXJyYXkgJG9wdGlvbnMgPSBbXSk7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXERlc2NyaXB0b3I7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKCgppbnRlcmZhY2UgRGVzY3JpcHRvckludGVyZmFjZQp7CnB1YmxpYyBmdW5jdGlvbiBkZXNjcmliZShPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgb2JqZWN0ICRvYmplY3QsIGFycmF5ICRvcHRpb25zID0gW10pOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxEZXNjcmlwdG9yOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQXBwbGljYXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXREZWZpbml0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKCgoKCgoKCgpjbGFzcyBKc29uRGVzY3JpcHRvciBleHRlbmRzIERlc2NyaXB0b3IKewoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVJbnB1dEFyZ3VtZW50KElucHV0QXJndW1lbnQgJGFyZ3VtZW50LCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiR0aGlzLT53cml0ZURhdGEoJHRoaXMtPmdldElucHV0QXJndW1lbnREYXRhKCRhcmd1bWVudCksICRvcHRpb25zKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlSW5wdXRPcHRpb24oSW5wdXRPcHRpb24gJG9wdGlvbiwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokdGhpcy0+d3JpdGVEYXRhKCR0aGlzLT5nZXRJbnB1dE9wdGlvbkRhdGEoJG9wdGlvbiksICRvcHRpb25zKTsKaWYgKCRvcHRpb24tPmlzTmVnYXRhYmxlKCkpIHsKJHRoaXMtPndyaXRlRGF0YSgkdGhpcy0+Z2V0SW5wdXRPcHRpb25EYXRhKCRvcHRpb24sIHRydWUpLCAkb3B0aW9ucyk7Cn0KfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlSW5wdXREZWZpbml0aW9uKElucHV0RGVmaW5pdGlvbiAkZGVmaW5pdGlvbiwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokdGhpcy0+d3JpdGVEYXRhKCR0aGlzLT5nZXRJbnB1dERlZmluaXRpb25EYXRhKCRkZWZpbml0aW9uKSwgJG9wdGlvbnMpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVDb21tYW5kKENvbW1hbmQgJGNvbW1hbmQsIGFycmF5ICRvcHRpb25zID0gW10pCnsKJHRoaXMtPndyaXRlRGF0YSgkdGhpcy0+Z2V0Q29tbWFuZERhdGEoJGNvbW1hbmQsICRvcHRpb25zWydzaG9ydCddID8/IGZhbHNlKSwgJG9wdGlvbnMpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiAkYXBwbGljYXRpb24sIGFycmF5ICRvcHRpb25zID0gW10pCnsKJGRlc2NyaWJlZE5hbWVzcGFjZSA9ICRvcHRpb25zWyduYW1lc3BhY2UnXSA/PyBudWxsOwokZGVzY3JpcHRpb24gPSBuZXcgQXBwbGljYXRpb25EZXNjcmlwdGlvbigkYXBwbGljYXRpb24sICRkZXNjcmliZWROYW1lc3BhY2UsIHRydWUpOwokY29tbWFuZHMgPSBbXTsKCmZvcmVhY2ggKCRkZXNjcmlwdGlvbi0+Z2V0Q29tbWFuZHMoKSBhcyAkY29tbWFuZCkgewokY29tbWFuZHNbXSA9ICR0aGlzLT5nZXRDb21tYW5kRGF0YSgkY29tbWFuZCwgJG9wdGlvbnNbJ3Nob3J0J10gPz8gZmFsc2UpOwp9CgokZGF0YSA9IFtdOwppZiAoJ1VOS05PV04nICE9PSAkYXBwbGljYXRpb24tPmdldE5hbWUoKSkgewokZGF0YVsnYXBwbGljYXRpb24nXVsnbmFtZSddID0gJGFwcGxpY2F0aW9uLT5nZXROYW1lKCk7CmlmICgnVU5LTk9XTicgIT09ICRhcHBsaWNhdGlvbi0+Z2V0VmVyc2lvbigpKSB7CiRkYXRhWydhcHBsaWNhdGlvbiddWyd2ZXJzaW9uJ10gPSAkYXBwbGljYXRpb24tPmdldFZlcnNpb24oKTsKfQp9CgokZGF0YVsnY29tbWFuZHMnXSA9ICRjb21tYW5kczsKCmlmICgkZGVzY3JpYmVkTmFtZXNwYWNlKSB7CiRkYXRhWyduYW1lc3BhY2UnXSA9ICRkZXNjcmliZWROYW1lc3BhY2U7Cn0gZWxzZSB7CiRkYXRhWyduYW1lc3BhY2VzJ10gPSBhcnJheV92YWx1ZXMoJGRlc2NyaXB0aW9uLT5nZXROYW1lc3BhY2VzKCkpOwp9CgokdGhpcy0+d3JpdGVEYXRhKCRkYXRhLCAkb3B0aW9ucyk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gd3JpdGVEYXRhKGFycmF5ICRkYXRhLCBhcnJheSAkb3B0aW9ucykKewokZmxhZ3MgPSAkb3B0aW9uc1snanNvbl9lbmNvZGluZyddID8/IDA7CgokdGhpcy0+d3JpdGUoanNvbl9lbmNvZGUoJGRhdGEsICRmbGFncykpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldElucHV0QXJndW1lbnREYXRhKElucHV0QXJndW1lbnQgJGFyZ3VtZW50KTogYXJyYXkKewpyZXR1cm4gWwonbmFtZScgPT4gJGFyZ3VtZW50LT5nZXROYW1lKCksCidpc19yZXF1aXJlZCcgPT4gJGFyZ3VtZW50LT5pc1JlcXVpcmVkKCksCidpc19hcnJheScgPT4gJGFyZ3VtZW50LT5pc0FycmF5KCksCidkZXNjcmlwdGlvbicgPT4gcHJlZ19yZXBsYWNlKCcvXHMqW1xyXG5dXHMqLycsICcgJywgJGFyZ3VtZW50LT5nZXREZXNjcmlwdGlvbigpKSwKJ2RlZmF1bHQnID0+IFxJTkYgPT09ICRhcmd1bWVudC0+Z2V0RGVmYXVsdCgpID8gJ0lORicgOiAkYXJndW1lbnQtPmdldERlZmF1bHQoKSwKXTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRJbnB1dE9wdGlvbkRhdGEoSW5wdXRPcHRpb24gJG9wdGlvbiwgYm9vbCAkbmVnYXRlZCA9IGZhbHNlKTogYXJyYXkKewpyZXR1cm4gJG5lZ2F0ZWQgPyBbCiduYW1lJyA9PiAnLS1uby0nLiRvcHRpb24tPmdldE5hbWUoKSwKJ3Nob3J0Y3V0JyA9PiAnJywKJ2FjY2VwdF92YWx1ZScgPT4gZmFsc2UsCidpc192YWx1ZV9yZXF1aXJlZCcgPT4gZmFsc2UsCidpc19tdWx0aXBsZScgPT4gZmFsc2UsCidkZXNjcmlwdGlvbicgPT4gJ05lZ2F0ZSB0aGUgIi0tJy4kb3B0aW9uLT5nZXROYW1lKCkuJyIgb3B0aW9uJywKJ2RlZmF1bHQnID0+IGZhbHNlLApdIDogWwonbmFtZScgPT4gJy0tJy4kb3B0aW9uLT5nZXROYW1lKCksCidzaG9ydGN1dCcgPT4gJG9wdGlvbi0+Z2V0U2hvcnRjdXQoKSA/ICctJy5zdHJfcmVwbGFjZSgnfCcsICd8LScsICRvcHRpb24tPmdldFNob3J0Y3V0KCkpIDogJycsCidhY2NlcHRfdmFsdWUnID0+ICRvcHRpb24tPmFjY2VwdFZhbHVlKCksCidpc192YWx1ZV9yZXF1aXJlZCcgPT4gJG9wdGlvbi0+aXNWYWx1ZVJlcXVpcmVkKCksCidpc19tdWx0aXBsZScgPT4gJG9wdGlvbi0+aXNBcnJheSgpLAonZGVzY3JpcHRpb24nID0+IHByZWdfcmVwbGFjZSgnL1xzKltcclxuXVxzKi8nLCAnICcsICRvcHRpb24tPmdldERlc2NyaXB0aW9uKCkpLAonZGVmYXVsdCcgPT4gXElORiA9PT0gJG9wdGlvbi0+Z2V0RGVmYXVsdCgpID8gJ0lORicgOiAkb3B0aW9uLT5nZXREZWZhdWx0KCksCl07Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0SW5wdXREZWZpbml0aW9uRGF0YShJbnB1dERlZmluaXRpb24gJGRlZmluaXRpb24pOiBhcnJheQp7CiRpbnB1dEFyZ3VtZW50cyA9IFtdOwpmb3JlYWNoICgkZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnRzKCkgYXMgJG5hbWUgPT4gJGFyZ3VtZW50KSB7CiRpbnB1dEFyZ3VtZW50c1skbmFtZV0gPSAkdGhpcy0+Z2V0SW5wdXRBcmd1bWVudERhdGEoJGFyZ3VtZW50KTsKfQoKJGlucHV0T3B0aW9ucyA9IFtdOwpmb3JlYWNoICgkZGVmaW5pdGlvbi0+Z2V0T3B0aW9ucygpIGFzICRuYW1lID0+ICRvcHRpb24pIHsKJGlucHV0T3B0aW9uc1skbmFtZV0gPSAkdGhpcy0+Z2V0SW5wdXRPcHRpb25EYXRhKCRvcHRpb24pOwppZiAoJG9wdGlvbi0+aXNOZWdhdGFibGUoKSkgewokaW5wdXRPcHRpb25zWyduby0nLiRuYW1lXSA9ICR0aGlzLT5nZXRJbnB1dE9wdGlvbkRhdGEoJG9wdGlvbiwgdHJ1ZSk7Cn0KfQoKcmV0dXJuIFsnYXJndW1lbnRzJyA9PiAkaW5wdXRBcmd1bWVudHMsICdvcHRpb25zJyA9PiAkaW5wdXRPcHRpb25zXTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRDb21tYW5kRGF0YShDb21tYW5kICRjb21tYW5kLCBib29sICRzaG9ydCA9IGZhbHNlKTogYXJyYXkKewokZGF0YSA9IFsKJ25hbWUnID0+ICRjb21tYW5kLT5nZXROYW1lKCksCidkZXNjcmlwdGlvbicgPT4gJGNvbW1hbmQtPmdldERlc2NyaXB0aW9uKCksCl07CgppZiAoJHNob3J0KSB7CiRkYXRhICs9IFsKJ3VzYWdlJyA9PiAkY29tbWFuZC0+Z2V0QWxpYXNlcygpLApdOwp9IGVsc2UgewokY29tbWFuZC0+bWVyZ2VBcHBsaWNhdGlvbkRlZmluaXRpb24oZmFsc2UpOwoKJGRhdGEgKz0gWwondXNhZ2UnID0+IGFycmF5X21lcmdlKFskY29tbWFuZC0+Z2V0U3lub3BzaXMoKV0sICRjb21tYW5kLT5nZXRVc2FnZXMoKSwgJGNvbW1hbmQtPmdldEFsaWFzZXMoKSksCidoZWxwJyA9PiAkY29tbWFuZC0+Z2V0UHJvY2Vzc2VkSGVscCgpLAonZGVmaW5pdGlvbicgPT4gJHRoaXMtPmdldElucHV0RGVmaW5pdGlvbkRhdGEoJGNvbW1hbmQtPmdldERlZmluaXRpb24oKSksCl07Cn0KCiRkYXRhWydoaWRkZW4nXSA9ICRjb21tYW5kLT5pc0hpZGRlbigpOwoKcmV0dXJuICRkYXRhOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXERlc2NyaXB0b3I7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxBcHBsaWNhdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcSGVscGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dERlZmluaXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKCgoKCmNsYXNzIE1hcmtkb3duRGVzY3JpcHRvciBleHRlbmRzIERlc2NyaXB0b3IKewoKCgpwdWJsaWMgZnVuY3Rpb24gZGVzY3JpYmUoT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIG9iamVjdCAkb2JqZWN0LCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiRkZWNvcmF0ZWQgPSAkb3V0cHV0LT5pc0RlY29yYXRlZCgpOwokb3V0cHV0LT5zZXREZWNvcmF0ZWQoZmFsc2UpOwoKcGFyZW50OjpkZXNjcmliZSgkb3V0cHV0LCAkb2JqZWN0LCAkb3B0aW9ucyk7Cgokb3V0cHV0LT5zZXREZWNvcmF0ZWQoJGRlY29yYXRlZCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB3cml0ZShzdHJpbmcgJGNvbnRlbnQsIGJvb2wgJGRlY29yYXRlZCA9IHRydWUpCnsKcGFyZW50Ojp3cml0ZSgkY29udGVudCwgJGRlY29yYXRlZCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUlucHV0QXJndW1lbnQoSW5wdXRBcmd1bWVudCAkYXJndW1lbnQsIGFycmF5ICRvcHRpb25zID0gW10pCnsKJHRoaXMtPndyaXRlKAonIyMjIyBgJy4oJGFyZ3VtZW50LT5nZXROYW1lKCkgPzogJzxub25lPicpLiJgXG5cbiIKLigkYXJndW1lbnQtPmdldERlc2NyaXB0aW9uKCkgPyBwcmVnX3JlcGxhY2UoJy9ccypbXHJcbl1ccyovJywgIlxuIiwgJGFyZ3VtZW50LT5nZXREZXNjcmlwdGlvbigpKS4iXG5cbiIgOiAnJykKLicqIElzIHJlcXVpcmVkOiAnLigkYXJndW1lbnQtPmlzUmVxdWlyZWQoKSA/ICd5ZXMnIDogJ25vJykuIlxuIgouJyogSXMgYXJyYXk6ICcuKCRhcmd1bWVudC0+aXNBcnJheSgpID8gJ3llcycgOiAnbm8nKS4iXG4iCi4nKiBEZWZhdWx0OiBgJy5zdHJfcmVwbGFjZSgiXG4iLCAnJywgdmFyX2V4cG9ydCgkYXJndW1lbnQtPmdldERlZmF1bHQoKSwgdHJ1ZSkpLidgJwopOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVJbnB1dE9wdGlvbihJbnB1dE9wdGlvbiAkb3B0aW9uLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiRuYW1lID0gJy0tJy4kb3B0aW9uLT5nZXROYW1lKCk7CmlmICgkb3B0aW9uLT5pc05lZ2F0YWJsZSgpKSB7CiRuYW1lIC49ICd8LS1uby0nLiRvcHRpb24tPmdldE5hbWUoKTsKfQppZiAoJG9wdGlvbi0+Z2V0U2hvcnRjdXQoKSkgewokbmFtZSAuPSAnfC0nLnN0cl9yZXBsYWNlKCd8JywgJ3wtJywgJG9wdGlvbi0+Z2V0U2hvcnRjdXQoKSkuJyc7Cn0KCiR0aGlzLT53cml0ZSgKJyMjIyMgYCcuJG5hbWUuJ2AnLiJcblxuIgouKCRvcHRpb24tPmdldERlc2NyaXB0aW9uKCkgPyBwcmVnX3JlcGxhY2UoJy9ccypbXHJcbl1ccyovJywgIlxuIiwgJG9wdGlvbi0+Z2V0RGVzY3JpcHRpb24oKSkuIlxuXG4iIDogJycpCi4nKiBBY2NlcHQgdmFsdWU6ICcuKCRvcHRpb24tPmFjY2VwdFZhbHVlKCkgPyAneWVzJyA6ICdubycpLiJcbiIKLicqIElzIHZhbHVlIHJlcXVpcmVkOiAnLigkb3B0aW9uLT5pc1ZhbHVlUmVxdWlyZWQoKSA/ICd5ZXMnIDogJ25vJykuIlxuIgouJyogSXMgbXVsdGlwbGU6ICcuKCRvcHRpb24tPmlzQXJyYXkoKSA/ICd5ZXMnIDogJ25vJykuIlxuIgouJyogSXMgbmVnYXRhYmxlOiAnLigkb3B0aW9uLT5pc05lZ2F0YWJsZSgpID8gJ3llcycgOiAnbm8nKS4iXG4iCi4nKiBEZWZhdWx0OiBgJy5zdHJfcmVwbGFjZSgiXG4iLCAnJywgdmFyX2V4cG9ydCgkb3B0aW9uLT5nZXREZWZhdWx0KCksIHRydWUpKS4nYCcKKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlSW5wdXREZWZpbml0aW9uKElucHV0RGVmaW5pdGlvbiAkZGVmaW5pdGlvbiwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewppZiAoJHNob3dBcmd1bWVudHMgPSBcY291bnQoJGRlZmluaXRpb24tPmdldEFyZ3VtZW50cygpKSA+IDApIHsKJHRoaXMtPndyaXRlKCcjIyMgQXJndW1lbnRzJyk7CmZvcmVhY2ggKCRkZWZpbml0aW9uLT5nZXRBcmd1bWVudHMoKSBhcyAkYXJndW1lbnQpIHsKJHRoaXMtPndyaXRlKCJcblxuIik7CmlmIChudWxsICE9PSAkZGVzY3JpYmVJbnB1dEFyZ3VtZW50ID0gJHRoaXMtPmRlc2NyaWJlSW5wdXRBcmd1bWVudCgkYXJndW1lbnQpKSB7CiR0aGlzLT53cml0ZSgkZGVzY3JpYmVJbnB1dEFyZ3VtZW50KTsKfQp9Cn0KCmlmIChcY291bnQoJGRlZmluaXRpb24tPmdldE9wdGlvbnMoKSkgPiAwKSB7CmlmICgkc2hvd0FyZ3VtZW50cykgewokdGhpcy0+d3JpdGUoIlxuXG4iKTsKfQoKJHRoaXMtPndyaXRlKCcjIyMgT3B0aW9ucycpOwpmb3JlYWNoICgkZGVmaW5pdGlvbi0+Z2V0T3B0aW9ucygpIGFzICRvcHRpb24pIHsKJHRoaXMtPndyaXRlKCJcblxuIik7CmlmIChudWxsICE9PSAkZGVzY3JpYmVJbnB1dE9wdGlvbiA9ICR0aGlzLT5kZXNjcmliZUlucHV0T3B0aW9uKCRvcHRpb24pKSB7CiR0aGlzLT53cml0ZSgkZGVzY3JpYmVJbnB1dE9wdGlvbik7Cn0KfQp9Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUNvbW1hbmQoQ29tbWFuZCAkY29tbWFuZCwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewppZiAoJG9wdGlvbnNbJ3Nob3J0J10gPz8gZmFsc2UpIHsKJHRoaXMtPndyaXRlKAonYCcuJGNvbW1hbmQtPmdldE5hbWUoKS4iYFxuIgouc3RyX3JlcGVhdCgnLScsIEhlbHBlcjo6d2lkdGgoJGNvbW1hbmQtPmdldE5hbWUoKSkgKyAyKS4iXG5cbiIKLigkY29tbWFuZC0+Z2V0RGVzY3JpcHRpb24oKSA/ICRjb21tYW5kLT5nZXREZXNjcmlwdGlvbigpLiJcblxuIiA6ICcnKQouJyMjIyBVc2FnZScuIlxuXG4iCi5hcnJheV9yZWR1Y2UoJGNvbW1hbmQtPmdldEFsaWFzZXMoKSwgZnVuY3Rpb24gKCRjYXJyeSwgJHVzYWdlKSB7CnJldHVybiAkY2FycnkuJyogYCcuJHVzYWdlLidgJy4iXG4iOwp9KQopOwoKcmV0dXJuOwp9CgokY29tbWFuZC0+bWVyZ2VBcHBsaWNhdGlvbkRlZmluaXRpb24oZmFsc2UpOwoKJHRoaXMtPndyaXRlKAonYCcuJGNvbW1hbmQtPmdldE5hbWUoKS4iYFxuIgouc3RyX3JlcGVhdCgnLScsIEhlbHBlcjo6d2lkdGgoJGNvbW1hbmQtPmdldE5hbWUoKSkgKyAyKS4iXG5cbiIKLigkY29tbWFuZC0+Z2V0RGVzY3JpcHRpb24oKSA/ICRjb21tYW5kLT5nZXREZXNjcmlwdGlvbigpLiJcblxuIiA6ICcnKQouJyMjIyBVc2FnZScuIlxuXG4iCi5hcnJheV9yZWR1Y2UoYXJyYXlfbWVyZ2UoWyRjb21tYW5kLT5nZXRTeW5vcHNpcygpXSwgJGNvbW1hbmQtPmdldEFsaWFzZXMoKSwgJGNvbW1hbmQtPmdldFVzYWdlcygpKSwgZnVuY3Rpb24gKCRjYXJyeSwgJHVzYWdlKSB7CnJldHVybiAkY2FycnkuJyogYCcuJHVzYWdlLidgJy4iXG4iOwp9KQopOwoKaWYgKCRoZWxwID0gJGNvbW1hbmQtPmdldFByb2Nlc3NlZEhlbHAoKSkgewokdGhpcy0+d3JpdGUoIlxuIik7CiR0aGlzLT53cml0ZSgkaGVscCk7Cn0KCiRkZWZpbml0aW9uID0gJGNvbW1hbmQtPmdldERlZmluaXRpb24oKTsKaWYgKCRkZWZpbml0aW9uLT5nZXRPcHRpb25zKCkgfHwgJGRlZmluaXRpb24tPmdldEFyZ3VtZW50cygpKSB7CiR0aGlzLT53cml0ZSgiXG5cbiIpOwokdGhpcy0+ZGVzY3JpYmVJbnB1dERlZmluaXRpb24oJGRlZmluaXRpb24pOwp9Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uICRhcHBsaWNhdGlvbiwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokZGVzY3JpYmVkTmFtZXNwYWNlID0gJG9wdGlvbnNbJ25hbWVzcGFjZSddID8/IG51bGw7CiRkZXNjcmlwdGlvbiA9IG5ldyBBcHBsaWNhdGlvbkRlc2NyaXB0aW9uKCRhcHBsaWNhdGlvbiwgJGRlc2NyaWJlZE5hbWVzcGFjZSk7CiR0aXRsZSA9ICR0aGlzLT5nZXRBcHBsaWNhdGlvblRpdGxlKCRhcHBsaWNhdGlvbik7CgokdGhpcy0+d3JpdGUoJHRpdGxlLiJcbiIuc3RyX3JlcGVhdCgnPScsIEhlbHBlcjo6d2lkdGgoJHRpdGxlKSkpOwoKZm9yZWFjaCAoJGRlc2NyaXB0aW9uLT5nZXROYW1lc3BhY2VzKCkgYXMgJG5hbWVzcGFjZSkgewppZiAoQXBwbGljYXRpb25EZXNjcmlwdGlvbjo6R0xPQkFMX05BTUVTUEFDRSAhPT0gJG5hbWVzcGFjZVsnaWQnXSkgewokdGhpcy0+d3JpdGUoIlxuXG4iKTsKJHRoaXMtPndyaXRlKCcqKicuJG5hbWVzcGFjZVsnaWQnXS4nOioqJyk7Cn0KCiR0aGlzLT53cml0ZSgiXG5cbiIpOwokdGhpcy0+d3JpdGUoaW1wbG9kZSgiXG4iLCBhcnJheV9tYXAoZnVuY3Rpb24gKCRjb21tYW5kTmFtZSkgdXNlICgkZGVzY3JpcHRpb24pIHsKcmV0dXJuIHNwcmludGYoJyogW2Alc2BdKCMlcyknLCAkY29tbWFuZE5hbWUsIHN0cl9yZXBsYWNlKCc6JywgJycsICRkZXNjcmlwdGlvbi0+Z2V0Q29tbWFuZCgkY29tbWFuZE5hbWUpLT5nZXROYW1lKCkpKTsKfSwgJG5hbWVzcGFjZVsnY29tbWFuZHMnXSkpKTsKfQoKZm9yZWFjaCAoJGRlc2NyaXB0aW9uLT5nZXRDb21tYW5kcygpIGFzICRjb21tYW5kKSB7CiR0aGlzLT53cml0ZSgiXG5cbiIpOwppZiAobnVsbCAhPT0gJGRlc2NyaWJlQ29tbWFuZCA9ICR0aGlzLT5kZXNjcmliZUNvbW1hbmQoJGNvbW1hbmQsICRvcHRpb25zKSkgewokdGhpcy0+d3JpdGUoJGRlc2NyaWJlQ29tbWFuZCk7Cn0KfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldEFwcGxpY2F0aW9uVGl0bGUoQXBwbGljYXRpb24gJGFwcGxpY2F0aW9uKTogc3RyaW5nCnsKaWYgKCdVTktOT1dOJyAhPT0gJGFwcGxpY2F0aW9uLT5nZXROYW1lKCkpIHsKaWYgKCdVTktOT1dOJyAhPT0gJGFwcGxpY2F0aW9uLT5nZXRWZXJzaW9uKCkpIHsKcmV0dXJuIHNwcmludGYoJyVzICVzJywgJGFwcGxpY2F0aW9uLT5nZXROYW1lKCksICRhcHBsaWNhdGlvbi0+Z2V0VmVyc2lvbigpKTsKfQoKcmV0dXJuICRhcHBsaWNhdGlvbi0+Z2V0TmFtZSgpOwp9CgpyZXR1cm4gJ0NvbnNvbGUgVG9vbCc7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRGVzY3JpcHRvcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEFwcGxpY2F0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXENvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxIZWxwZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0RGVmaW5pdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CgoKCgoKCgoKY2xhc3MgVGV4dERlc2NyaXB0b3IgZXh0ZW5kcyBEZXNjcmlwdG9yCnsKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlSW5wdXRBcmd1bWVudChJbnB1dEFyZ3VtZW50ICRhcmd1bWVudCwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewppZiAobnVsbCAhPT0gJGFyZ3VtZW50LT5nZXREZWZhdWx0KCkgJiYgKCFcaXNfYXJyYXkoJGFyZ3VtZW50LT5nZXREZWZhdWx0KCkpIHx8IFxjb3VudCgkYXJndW1lbnQtPmdldERlZmF1bHQoKSkpKSB7CiRkZWZhdWx0ID0gc3ByaW50ZignPGNvbW1lbnQ+IFtkZWZhdWx0OiAlc108L2NvbW1lbnQ+JywgJHRoaXMtPmZvcm1hdERlZmF1bHRWYWx1ZSgkYXJndW1lbnQtPmdldERlZmF1bHQoKSkpOwp9IGVsc2UgewokZGVmYXVsdCA9ICcnOwp9CgokdG90YWxXaWR0aCA9ICRvcHRpb25zWyd0b3RhbF93aWR0aCddID8/IEhlbHBlcjo6d2lkdGgoJGFyZ3VtZW50LT5nZXROYW1lKCkpOwokc3BhY2luZ1dpZHRoID0gJHRvdGFsV2lkdGggLSBcc3RybGVuKCRhcmd1bWVudC0+Z2V0TmFtZSgpKTsKCiR0aGlzLT53cml0ZVRleHQoc3ByaW50ZignICA8aW5mbz4lczwvaW5mbz4gICVzJXMlcycsCiRhcmd1bWVudC0+Z2V0TmFtZSgpLApzdHJfcmVwZWF0KCcgJywgJHNwYWNpbmdXaWR0aCksCgpwcmVnX3JlcGxhY2UoJy9ccypbXHJcbl1ccyovJywgIlxuIi5zdHJfcmVwZWF0KCcgJywgJHRvdGFsV2lkdGggKyA0KSwgJGFyZ3VtZW50LT5nZXREZXNjcmlwdGlvbigpKSwKJGRlZmF1bHQKKSwgJG9wdGlvbnMpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVJbnB1dE9wdGlvbihJbnB1dE9wdGlvbiAkb3B0aW9uLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CmlmICgkb3B0aW9uLT5hY2NlcHRWYWx1ZSgpICYmIG51bGwgIT09ICRvcHRpb24tPmdldERlZmF1bHQoKSAmJiAoIVxpc19hcnJheSgkb3B0aW9uLT5nZXREZWZhdWx0KCkpIHx8IFxjb3VudCgkb3B0aW9uLT5nZXREZWZhdWx0KCkpKSkgewokZGVmYXVsdCA9IHNwcmludGYoJzxjb21tZW50PiBbZGVmYXVsdDogJXNdPC9jb21tZW50PicsICR0aGlzLT5mb3JtYXREZWZhdWx0VmFsdWUoJG9wdGlvbi0+Z2V0RGVmYXVsdCgpKSk7Cn0gZWxzZSB7CiRkZWZhdWx0ID0gJyc7Cn0KCiR2YWx1ZSA9ICcnOwppZiAoJG9wdGlvbi0+YWNjZXB0VmFsdWUoKSkgewokdmFsdWUgPSAnPScuc3RydG91cHBlcigkb3B0aW9uLT5nZXROYW1lKCkpOwoKaWYgKCRvcHRpb24tPmlzVmFsdWVPcHRpb25hbCgpKSB7CiR2YWx1ZSA9ICdbJy4kdmFsdWUuJ10nOwp9Cn0KCiR0b3RhbFdpZHRoID0gJG9wdGlvbnNbJ3RvdGFsX3dpZHRoJ10gPz8gJHRoaXMtPmNhbGN1bGF0ZVRvdGFsV2lkdGhGb3JPcHRpb25zKFskb3B0aW9uXSk7CiRzeW5vcHNpcyA9IHNwcmludGYoJyVzJXMnLAokb3B0aW9uLT5nZXRTaG9ydGN1dCgpID8gc3ByaW50ZignLSVzLCAnLCAkb3B0aW9uLT5nZXRTaG9ydGN1dCgpKSA6ICcgICAgJywKc3ByaW50Zigkb3B0aW9uLT5pc05lZ2F0YWJsZSgpID8gJy0tJTEkc3wtLW5vLSUxJHMnIDogJy0tJTEkcyUyJHMnLCAkb3B0aW9uLT5nZXROYW1lKCksICR2YWx1ZSkKKTsKCiRzcGFjaW5nV2lkdGggPSAkdG90YWxXaWR0aCAtIEhlbHBlcjo6d2lkdGgoJHN5bm9wc2lzKTsKCiR0aGlzLT53cml0ZVRleHQoc3ByaW50ZignICA8aW5mbz4lczwvaW5mbz4gICVzJXMlcyVzJywKJHN5bm9wc2lzLApzdHJfcmVwZWF0KCcgJywgJHNwYWNpbmdXaWR0aCksCgpwcmVnX3JlcGxhY2UoJy9ccypbXHJcbl1ccyovJywgIlxuIi5zdHJfcmVwZWF0KCcgJywgJHRvdGFsV2lkdGggKyA0KSwgJG9wdGlvbi0+Z2V0RGVzY3JpcHRpb24oKSksCiRkZWZhdWx0LAokb3B0aW9uLT5pc0FycmF5KCkgPyAnPGNvbW1lbnQ+IChtdWx0aXBsZSB2YWx1ZXMgYWxsb3dlZCk8L2NvbW1lbnQ+JyA6ICcnCiksICRvcHRpb25zKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlSW5wdXREZWZpbml0aW9uKElucHV0RGVmaW5pdGlvbiAkZGVmaW5pdGlvbiwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokdG90YWxXaWR0aCA9ICR0aGlzLT5jYWxjdWxhdGVUb3RhbFdpZHRoRm9yT3B0aW9ucygkZGVmaW5pdGlvbi0+Z2V0T3B0aW9ucygpKTsKZm9yZWFjaCAoJGRlZmluaXRpb24tPmdldEFyZ3VtZW50cygpIGFzICRhcmd1bWVudCkgewokdG90YWxXaWR0aCA9IG1heCgkdG90YWxXaWR0aCwgSGVscGVyOjp3aWR0aCgkYXJndW1lbnQtPmdldE5hbWUoKSkpOwp9CgppZiAoJGRlZmluaXRpb24tPmdldEFyZ3VtZW50cygpKSB7CiR0aGlzLT53cml0ZVRleHQoJzxjb21tZW50PkFyZ3VtZW50czo8L2NvbW1lbnQ+JywgJG9wdGlvbnMpOwokdGhpcy0+d3JpdGVUZXh0KCJcbiIpOwpmb3JlYWNoICgkZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnRzKCkgYXMgJGFyZ3VtZW50KSB7CiR0aGlzLT5kZXNjcmliZUlucHV0QXJndW1lbnQoJGFyZ3VtZW50LCBhcnJheV9tZXJnZSgkb3B0aW9ucywgWyd0b3RhbF93aWR0aCcgPT4gJHRvdGFsV2lkdGhdKSk7CiR0aGlzLT53cml0ZVRleHQoIlxuIik7Cn0KfQoKaWYgKCRkZWZpbml0aW9uLT5nZXRBcmd1bWVudHMoKSAmJiAkZGVmaW5pdGlvbi0+Z2V0T3B0aW9ucygpKSB7CiR0aGlzLT53cml0ZVRleHQoIlxuIik7Cn0KCmlmICgkZGVmaW5pdGlvbi0+Z2V0T3B0aW9ucygpKSB7CiRsYXRlck9wdGlvbnMgPSBbXTsKCiR0aGlzLT53cml0ZVRleHQoJzxjb21tZW50Pk9wdGlvbnM6PC9jb21tZW50PicsICRvcHRpb25zKTsKZm9yZWFjaCAoJGRlZmluaXRpb24tPmdldE9wdGlvbnMoKSBhcyAkb3B0aW9uKSB7CmlmIChcc3RybGVuKCRvcHRpb24tPmdldFNob3J0Y3V0KCkgPz8gJycpID4gMSkgewokbGF0ZXJPcHRpb25zW10gPSAkb3B0aW9uOwpjb250aW51ZTsKfQokdGhpcy0+d3JpdGVUZXh0KCJcbiIpOwokdGhpcy0+ZGVzY3JpYmVJbnB1dE9wdGlvbigkb3B0aW9uLCBhcnJheV9tZXJnZSgkb3B0aW9ucywgWyd0b3RhbF93aWR0aCcgPT4gJHRvdGFsV2lkdGhdKSk7Cn0KZm9yZWFjaCAoJGxhdGVyT3B0aW9ucyBhcyAkb3B0aW9uKSB7CiR0aGlzLT53cml0ZVRleHQoIlxuIik7CiR0aGlzLT5kZXNjcmliZUlucHV0T3B0aW9uKCRvcHRpb24sIGFycmF5X21lcmdlKCRvcHRpb25zLCBbJ3RvdGFsX3dpZHRoJyA9PiAkdG90YWxXaWR0aF0pKTsKfQp9Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUNvbW1hbmQoQ29tbWFuZCAkY29tbWFuZCwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokY29tbWFuZC0+bWVyZ2VBcHBsaWNhdGlvbkRlZmluaXRpb24oZmFsc2UpOwoKaWYgKCRkZXNjcmlwdGlvbiA9ICRjb21tYW5kLT5nZXREZXNjcmlwdGlvbigpKSB7CiR0aGlzLT53cml0ZVRleHQoJzxjb21tZW50PkRlc2NyaXB0aW9uOjwvY29tbWVudD4nLCAkb3B0aW9ucyk7CiR0aGlzLT53cml0ZVRleHQoIlxuIik7CiR0aGlzLT53cml0ZVRleHQoJyAgJy4kZGVzY3JpcHRpb24pOwokdGhpcy0+d3JpdGVUZXh0KCJcblxuIik7Cn0KCiR0aGlzLT53cml0ZVRleHQoJzxjb21tZW50PlVzYWdlOjwvY29tbWVudD4nLCAkb3B0aW9ucyk7CmZvcmVhY2ggKGFycmF5X21lcmdlKFskY29tbWFuZC0+Z2V0U3lub3BzaXModHJ1ZSldLCAkY29tbWFuZC0+Z2V0QWxpYXNlcygpLCAkY29tbWFuZC0+Z2V0VXNhZ2VzKCkpIGFzICR1c2FnZSkgewokdGhpcy0+d3JpdGVUZXh0KCJcbiIpOwokdGhpcy0+d3JpdGVUZXh0KCcgICcuT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJHVzYWdlKSwgJG9wdGlvbnMpOwp9CiR0aGlzLT53cml0ZVRleHQoIlxuIik7CgokZGVmaW5pdGlvbiA9ICRjb21tYW5kLT5nZXREZWZpbml0aW9uKCk7CmlmICgkZGVmaW5pdGlvbi0+Z2V0T3B0aW9ucygpIHx8ICRkZWZpbml0aW9uLT5nZXRBcmd1bWVudHMoKSkgewokdGhpcy0+d3JpdGVUZXh0KCJcbiIpOwokdGhpcy0+ZGVzY3JpYmVJbnB1dERlZmluaXRpb24oJGRlZmluaXRpb24sICRvcHRpb25zKTsKJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKfQoKJGhlbHAgPSAkY29tbWFuZC0+Z2V0UHJvY2Vzc2VkSGVscCgpOwppZiAoJGhlbHAgJiYgJGhlbHAgIT09ICRkZXNjcmlwdGlvbikgewokdGhpcy0+d3JpdGVUZXh0KCJcbiIpOwokdGhpcy0+d3JpdGVUZXh0KCc8Y29tbWVudD5IZWxwOjwvY29tbWVudD4nLCAkb3B0aW9ucyk7CiR0aGlzLT53cml0ZVRleHQoIlxuIik7CiR0aGlzLT53cml0ZVRleHQoJyAgJy5zdHJfcmVwbGFjZSgiXG4iLCAiXG4gICIsICRoZWxwKSwgJG9wdGlvbnMpOwokdGhpcy0+d3JpdGVUZXh0KCJcbiIpOwp9Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uICRhcHBsaWNhdGlvbiwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokZGVzY3JpYmVkTmFtZXNwYWNlID0gJG9wdGlvbnNbJ25hbWVzcGFjZSddID8/IG51bGw7CiRkZXNjcmlwdGlvbiA9IG5ldyBBcHBsaWNhdGlvbkRlc2NyaXB0aW9uKCRhcHBsaWNhdGlvbiwgJGRlc2NyaWJlZE5hbWVzcGFjZSk7CgppZiAoaXNzZXQoJG9wdGlvbnNbJ3Jhd190ZXh0J10pICYmICRvcHRpb25zWydyYXdfdGV4dCddKSB7CiR3aWR0aCA9ICR0aGlzLT5nZXRDb2x1bW5XaWR0aCgkZGVzY3JpcHRpb24tPmdldENvbW1hbmRzKCkpOwoKZm9yZWFjaCAoJGRlc2NyaXB0aW9uLT5nZXRDb21tYW5kcygpIGFzICRjb21tYW5kKSB7CiR0aGlzLT53cml0ZVRleHQoc3ByaW50ZigiJS17JHdpZHRofXMgJXMiLCAkY29tbWFuZC0+Z2V0TmFtZSgpLCAkY29tbWFuZC0+Z2V0RGVzY3JpcHRpb24oKSksICRvcHRpb25zKTsKJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKfQp9IGVsc2UgewppZiAoJycgIT0gJGhlbHAgPSAkYXBwbGljYXRpb24tPmdldEhlbHAoKSkgewokdGhpcy0+d3JpdGVUZXh0KCIkaGVscFxuXG4iLCAkb3B0aW9ucyk7Cn0KCiR0aGlzLT53cml0ZVRleHQoIjxjb21tZW50PlVzYWdlOjwvY29tbWVudD5cbiIsICRvcHRpb25zKTsKJHRoaXMtPndyaXRlVGV4dCgiICBjb21tYW5kIFtvcHRpb25zXSBbYXJndW1lbnRzXVxuXG4iLCAkb3B0aW9ucyk7CgokdGhpcy0+ZGVzY3JpYmVJbnB1dERlZmluaXRpb24obmV3IElucHV0RGVmaW5pdGlvbigkYXBwbGljYXRpb24tPmdldERlZmluaXRpb24oKS0+Z2V0T3B0aW9ucygpKSwgJG9wdGlvbnMpOwoKJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKCiRjb21tYW5kcyA9ICRkZXNjcmlwdGlvbi0+Z2V0Q29tbWFuZHMoKTsKJG5hbWVzcGFjZXMgPSAkZGVzY3JpcHRpb24tPmdldE5hbWVzcGFjZXMoKTsKaWYgKCRkZXNjcmliZWROYW1lc3BhY2UgJiYgJG5hbWVzcGFjZXMpIHsKCiRkZXNjcmliZWROYW1lc3BhY2VJbmZvID0gcmVzZXQoJG5hbWVzcGFjZXMpOwpmb3JlYWNoICgkZGVzY3JpYmVkTmFtZXNwYWNlSW5mb1snY29tbWFuZHMnXSBhcyAkbmFtZSkgewokY29tbWFuZHNbJG5hbWVdID0gJGRlc2NyaXB0aW9uLT5nZXRDb21tYW5kKCRuYW1lKTsKfQp9CgoKJHdpZHRoID0gJHRoaXMtPmdldENvbHVtbldpZHRoKGFycmF5X21lcmdlKC4uLmFycmF5X3ZhbHVlcyhhcnJheV9tYXAoZnVuY3Rpb24gKCRuYW1lc3BhY2UpIHVzZSAoJGNvbW1hbmRzKSB7CnJldHVybiBhcnJheV9pbnRlcnNlY3QoJG5hbWVzcGFjZVsnY29tbWFuZHMnXSwgYXJyYXlfa2V5cygkY29tbWFuZHMpKTsKfSwgYXJyYXlfdmFsdWVzKCRuYW1lc3BhY2VzKSkpKSk7CgppZiAoJGRlc2NyaWJlZE5hbWVzcGFjZSkgewokdGhpcy0+d3JpdGVUZXh0KHNwcmludGYoJzxjb21tZW50PkF2YWlsYWJsZSBjb21tYW5kcyBmb3IgdGhlICIlcyIgbmFtZXNwYWNlOjwvY29tbWVudD4nLCAkZGVzY3JpYmVkTmFtZXNwYWNlKSwgJG9wdGlvbnMpOwp9IGVsc2UgewokdGhpcy0+d3JpdGVUZXh0KCc8Y29tbWVudD5BdmFpbGFibGUgY29tbWFuZHM6PC9jb21tZW50PicsICRvcHRpb25zKTsKfQoKZm9yZWFjaCAoJG5hbWVzcGFjZXMgYXMgJG5hbWVzcGFjZSkgewokbmFtZXNwYWNlWydjb21tYW5kcyddID0gYXJyYXlfZmlsdGVyKCRuYW1lc3BhY2VbJ2NvbW1hbmRzJ10sIGZ1bmN0aW9uICgkbmFtZSkgdXNlICgkY29tbWFuZHMpIHsKcmV0dXJuIGlzc2V0KCRjb21tYW5kc1skbmFtZV0pOwp9KTsKCmlmICghJG5hbWVzcGFjZVsnY29tbWFuZHMnXSkgewpjb250aW51ZTsKfQoKaWYgKCEkZGVzY3JpYmVkTmFtZXNwYWNlICYmIEFwcGxpY2F0aW9uRGVzY3JpcHRpb246OkdMT0JBTF9OQU1FU1BBQ0UgIT09ICRuYW1lc3BhY2VbJ2lkJ10pIHsKJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKJHRoaXMtPndyaXRlVGV4dCgnIDxjb21tZW50PicuJG5hbWVzcGFjZVsnaWQnXS4nPC9jb21tZW50PicsICRvcHRpb25zKTsKfQoKZm9yZWFjaCAoJG5hbWVzcGFjZVsnY29tbWFuZHMnXSBhcyAkbmFtZSkgewokdGhpcy0+d3JpdGVUZXh0KCJcbiIpOwokc3BhY2luZ1dpZHRoID0gJHdpZHRoIC0gSGVscGVyOjp3aWR0aCgkbmFtZSk7CiRjb21tYW5kID0gJGNvbW1hbmRzWyRuYW1lXTsKJGNvbW1hbmRBbGlhc2VzID0gJG5hbWUgPT09ICRjb21tYW5kLT5nZXROYW1lKCkgPyAkdGhpcy0+Z2V0Q29tbWFuZEFsaWFzZXNUZXh0KCRjb21tYW5kKSA6ICcnOwokdGhpcy0+d3JpdGVUZXh0KHNwcmludGYoJyAgPGluZm8+JXM8L2luZm8+JXMlcycsICRuYW1lLCBzdHJfcmVwZWF0KCcgJywgJHNwYWNpbmdXaWR0aCksICRjb21tYW5kQWxpYXNlcy4kY29tbWFuZC0+Z2V0RGVzY3JpcHRpb24oKSksICRvcHRpb25zKTsKfQp9CgokdGhpcy0+d3JpdGVUZXh0KCJcbiIpOwp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gd3JpdGVUZXh0KHN0cmluZyAkY29udGVudCwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokdGhpcy0+d3JpdGUoCmlzc2V0KCRvcHRpb25zWydyYXdfdGV4dCddKSAmJiAkb3B0aW9uc1sncmF3X3RleHQnXSA/IHN0cmlwX3RhZ3MoJGNvbnRlbnQpIDogJGNvbnRlbnQsCmlzc2V0KCRvcHRpb25zWydyYXdfb3V0cHV0J10pID8gISRvcHRpb25zWydyYXdfb3V0cHV0J10gOiB0cnVlCik7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0Q29tbWFuZEFsaWFzZXNUZXh0KENvbW1hbmQgJGNvbW1hbmQpOiBzdHJpbmcKewokdGV4dCA9ICcnOwokYWxpYXNlcyA9ICRjb21tYW5kLT5nZXRBbGlhc2VzKCk7CgppZiAoJGFsaWFzZXMpIHsKJHRleHQgPSAnWycuaW1wbG9kZSgnfCcsICRhbGlhc2VzKS4nXSAnOwp9CgpyZXR1cm4gJHRleHQ7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBmb3JtYXREZWZhdWx0VmFsdWUoJGRlZmF1bHQpOiBzdHJpbmcKewppZiAoXElORiA9PT0gJGRlZmF1bHQpIHsKcmV0dXJuICdJTkYnOwp9CgppZiAoXGlzX3N0cmluZygkZGVmYXVsdCkpIHsKJGRlZmF1bHQgPSBPdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkZGVmYXVsdCk7Cn0gZWxzZWlmIChcaXNfYXJyYXkoJGRlZmF1bHQpKSB7CmZvcmVhY2ggKCRkZWZhdWx0IGFzICRrZXkgPT4gJHZhbHVlKSB7CmlmIChcaXNfc3RyaW5nKCR2YWx1ZSkpIHsKJGRlZmF1bHRbJGtleV0gPSBPdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkdmFsdWUpOwp9Cn0KfQoKcmV0dXJuIHN0cl9yZXBsYWNlKCdcXFxcJywgJ1xcJywganNvbl9lbmNvZGUoJGRlZmF1bHQsIFxKU09OX1VORVNDQVBFRF9TTEFTSEVTIHwgXEpTT05fVU5FU0NBUEVEX1VOSUNPREUpKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRDb2x1bW5XaWR0aChhcnJheSAkY29tbWFuZHMpOiBpbnQKewokd2lkdGhzID0gW107Cgpmb3JlYWNoICgkY29tbWFuZHMgYXMgJGNvbW1hbmQpIHsKaWYgKCRjb21tYW5kIGluc3RhbmNlb2YgQ29tbWFuZCkgewokd2lkdGhzW10gPSBIZWxwZXI6OndpZHRoKCRjb21tYW5kLT5nZXROYW1lKCkpOwpmb3JlYWNoICgkY29tbWFuZC0+Z2V0QWxpYXNlcygpIGFzICRhbGlhcykgewokd2lkdGhzW10gPSBIZWxwZXI6OndpZHRoKCRhbGlhcyk7Cn0KfSBlbHNlIHsKJHdpZHRoc1tdID0gSGVscGVyOjp3aWR0aCgkY29tbWFuZCk7Cn0KfQoKcmV0dXJuICR3aWR0aHMgPyBtYXgoJHdpZHRocykgKyAyIDogMDsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjYWxjdWxhdGVUb3RhbFdpZHRoRm9yT3B0aW9ucyhhcnJheSAkb3B0aW9ucyk6IGludAp7CiR0b3RhbFdpZHRoID0gMDsKZm9yZWFjaCAoJG9wdGlvbnMgYXMgJG9wdGlvbikgewoKJG5hbWVMZW5ndGggPSAxICsgbWF4KEhlbHBlcjo6d2lkdGgoJG9wdGlvbi0+Z2V0U2hvcnRjdXQoKSksIDEpICsgNCArIEhlbHBlcjo6d2lkdGgoJG9wdGlvbi0+Z2V0TmFtZSgpKTsKaWYgKCRvcHRpb24tPmlzTmVnYXRhYmxlKCkpIHsKJG5hbWVMZW5ndGggKz0gNiArIEhlbHBlcjo6d2lkdGgoJG9wdGlvbi0+Z2V0TmFtZSgpKTsgCn0gZWxzZWlmICgkb3B0aW9uLT5hY2NlcHRWYWx1ZSgpKSB7CiR2YWx1ZUxlbmd0aCA9IDEgKyBIZWxwZXI6OndpZHRoKCRvcHRpb24tPmdldE5hbWUoKSk7IAokdmFsdWVMZW5ndGggKz0gJG9wdGlvbi0+aXNWYWx1ZU9wdGlvbmFsKCkgPyAyIDogMDsgCgokbmFtZUxlbmd0aCArPSAkdmFsdWVMZW5ndGg7Cn0KJHRvdGFsV2lkdGggPSBtYXgoJHRvdGFsV2lkdGgsICRuYW1lTGVuZ3RoKTsKfQoKcmV0dXJuICR0b3RhbFdpZHRoOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXERlc2NyaXB0b3I7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxBcHBsaWNhdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dERlZmluaXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwoKCgoKCgoKCmNsYXNzIFhtbERlc2NyaXB0b3IgZXh0ZW5kcyBEZXNjcmlwdG9yCnsKcHVibGljIGZ1bmN0aW9uIGdldElucHV0RGVmaW5pdGlvbkRvY3VtZW50KElucHV0RGVmaW5pdGlvbiAkZGVmaW5pdGlvbik6IFxET01Eb2N1bWVudAp7CiRkb20gPSBuZXcgXERPTURvY3VtZW50KCcxLjAnLCAnVVRGLTgnKTsKJGRvbS0+YXBwZW5kQ2hpbGQoJGRlZmluaXRpb25YTUwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdkZWZpbml0aW9uJykpOwoKJGRlZmluaXRpb25YTUwtPmFwcGVuZENoaWxkKCRhcmd1bWVudHNYTUwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdhcmd1bWVudHMnKSk7CmZvcmVhY2ggKCRkZWZpbml0aW9uLT5nZXRBcmd1bWVudHMoKSBhcyAkYXJndW1lbnQpIHsKJHRoaXMtPmFwcGVuZERvY3VtZW50KCRhcmd1bWVudHNYTUwsICR0aGlzLT5nZXRJbnB1dEFyZ3VtZW50RG9jdW1lbnQoJGFyZ3VtZW50KSk7Cn0KCiRkZWZpbml0aW9uWE1MLT5hcHBlbmRDaGlsZCgkb3B0aW9uc1hNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ29wdGlvbnMnKSk7CmZvcmVhY2ggKCRkZWZpbml0aW9uLT5nZXRPcHRpb25zKCkgYXMgJG9wdGlvbikgewokdGhpcy0+YXBwZW5kRG9jdW1lbnQoJG9wdGlvbnNYTUwsICR0aGlzLT5nZXRJbnB1dE9wdGlvbkRvY3VtZW50KCRvcHRpb24pKTsKfQoKcmV0dXJuICRkb207Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21tYW5kRG9jdW1lbnQoQ29tbWFuZCAkY29tbWFuZCwgYm9vbCAkc2hvcnQgPSBmYWxzZSk6IFxET01Eb2N1bWVudAp7CiRkb20gPSBuZXcgXERPTURvY3VtZW50KCcxLjAnLCAnVVRGLTgnKTsKJGRvbS0+YXBwZW5kQ2hpbGQoJGNvbW1hbmRYTUwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdjb21tYW5kJykpOwoKJGNvbW1hbmRYTUwtPnNldEF0dHJpYnV0ZSgnaWQnLCAkY29tbWFuZC0+Z2V0TmFtZSgpKTsKJGNvbW1hbmRYTUwtPnNldEF0dHJpYnV0ZSgnbmFtZScsICRjb21tYW5kLT5nZXROYW1lKCkpOwokY29tbWFuZFhNTC0+c2V0QXR0cmlidXRlKCdoaWRkZW4nLCAkY29tbWFuZC0+aXNIaWRkZW4oKSA/IDEgOiAwKTsKCiRjb21tYW5kWE1MLT5hcHBlbmRDaGlsZCgkdXNhZ2VzWE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgndXNhZ2VzJykpOwoKJGNvbW1hbmRYTUwtPmFwcGVuZENoaWxkKCRkZXNjcmlwdGlvblhNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ2Rlc2NyaXB0aW9uJykpOwokZGVzY3JpcHRpb25YTUwtPmFwcGVuZENoaWxkKCRkb20tPmNyZWF0ZVRleHROb2RlKHN0cl9yZXBsYWNlKCJcbiIsICJcbiAiLCAkY29tbWFuZC0+Z2V0RGVzY3JpcHRpb24oKSkpKTsKCmlmICgkc2hvcnQpIHsKZm9yZWFjaCAoJGNvbW1hbmQtPmdldEFsaWFzZXMoKSBhcyAkdXNhZ2UpIHsKJHVzYWdlc1hNTC0+YXBwZW5kQ2hpbGQoJGRvbS0+Y3JlYXRlRWxlbWVudCgndXNhZ2UnLCAkdXNhZ2UpKTsKfQp9IGVsc2UgewokY29tbWFuZC0+bWVyZ2VBcHBsaWNhdGlvbkRlZmluaXRpb24oZmFsc2UpOwoKZm9yZWFjaCAoYXJyYXlfbWVyZ2UoWyRjb21tYW5kLT5nZXRTeW5vcHNpcygpXSwgJGNvbW1hbmQtPmdldEFsaWFzZXMoKSwgJGNvbW1hbmQtPmdldFVzYWdlcygpKSBhcyAkdXNhZ2UpIHsKJHVzYWdlc1hNTC0+YXBwZW5kQ2hpbGQoJGRvbS0+Y3JlYXRlRWxlbWVudCgndXNhZ2UnLCAkdXNhZ2UpKTsKfQoKJGNvbW1hbmRYTUwtPmFwcGVuZENoaWxkKCRoZWxwWE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnaGVscCcpKTsKJGhlbHBYTUwtPmFwcGVuZENoaWxkKCRkb20tPmNyZWF0ZVRleHROb2RlKHN0cl9yZXBsYWNlKCJcbiIsICJcbiAiLCAkY29tbWFuZC0+Z2V0UHJvY2Vzc2VkSGVscCgpKSkpOwoKJGRlZmluaXRpb25YTUwgPSAkdGhpcy0+Z2V0SW5wdXREZWZpbml0aW9uRG9jdW1lbnQoJGNvbW1hbmQtPmdldERlZmluaXRpb24oKSk7CiR0aGlzLT5hcHBlbmREb2N1bWVudCgkY29tbWFuZFhNTCwgJGRlZmluaXRpb25YTUwtPmdldEVsZW1lbnRzQnlUYWdOYW1lKCdkZWZpbml0aW9uJyktPml0ZW0oMCkpOwp9CgpyZXR1cm4gJGRvbTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEFwcGxpY2F0aW9uRG9jdW1lbnQoQXBwbGljYXRpb24gJGFwcGxpY2F0aW9uLCA/c3RyaW5nICRuYW1lc3BhY2UgPSBudWxsLCBib29sICRzaG9ydCA9IGZhbHNlKTogXERPTURvY3VtZW50CnsKJGRvbSA9IG5ldyBcRE9NRG9jdW1lbnQoJzEuMCcsICdVVEYtOCcpOwokZG9tLT5hcHBlbmRDaGlsZCgkcm9vdFhtbCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ3N5bWZvbnknKSk7CgppZiAoJ1VOS05PV04nICE9PSAkYXBwbGljYXRpb24tPmdldE5hbWUoKSkgewokcm9vdFhtbC0+c2V0QXR0cmlidXRlKCduYW1lJywgJGFwcGxpY2F0aW9uLT5nZXROYW1lKCkpOwppZiAoJ1VOS05PV04nICE9PSAkYXBwbGljYXRpb24tPmdldFZlcnNpb24oKSkgewokcm9vdFhtbC0+c2V0QXR0cmlidXRlKCd2ZXJzaW9uJywgJGFwcGxpY2F0aW9uLT5nZXRWZXJzaW9uKCkpOwp9Cn0KCiRyb290WG1sLT5hcHBlbmRDaGlsZCgkY29tbWFuZHNYTUwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdjb21tYW5kcycpKTsKCiRkZXNjcmlwdGlvbiA9IG5ldyBBcHBsaWNhdGlvbkRlc2NyaXB0aW9uKCRhcHBsaWNhdGlvbiwgJG5hbWVzcGFjZSwgdHJ1ZSk7CgppZiAoJG5hbWVzcGFjZSkgewokY29tbWFuZHNYTUwtPnNldEF0dHJpYnV0ZSgnbmFtZXNwYWNlJywgJG5hbWVzcGFjZSk7Cn0KCmZvcmVhY2ggKCRkZXNjcmlwdGlvbi0+Z2V0Q29tbWFuZHMoKSBhcyAkY29tbWFuZCkgewokdGhpcy0+YXBwZW5kRG9jdW1lbnQoJGNvbW1hbmRzWE1MLCAkdGhpcy0+Z2V0Q29tbWFuZERvY3VtZW50KCRjb21tYW5kLCAkc2hvcnQpKTsKfQoKaWYgKCEkbmFtZXNwYWNlKSB7CiRyb290WG1sLT5hcHBlbmRDaGlsZCgkbmFtZXNwYWNlc1hNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ25hbWVzcGFjZXMnKSk7Cgpmb3JlYWNoICgkZGVzY3JpcHRpb24tPmdldE5hbWVzcGFjZXMoKSBhcyAkbmFtZXNwYWNlRGVzY3JpcHRpb24pIHsKJG5hbWVzcGFjZXNYTUwtPmFwcGVuZENoaWxkKCRuYW1lc3BhY2VBcnJheVhNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ25hbWVzcGFjZScpKTsKJG5hbWVzcGFjZUFycmF5WE1MLT5zZXRBdHRyaWJ1dGUoJ2lkJywgJG5hbWVzcGFjZURlc2NyaXB0aW9uWydpZCddKTsKCmZvcmVhY2ggKCRuYW1lc3BhY2VEZXNjcmlwdGlvblsnY29tbWFuZHMnXSBhcyAkbmFtZSkgewokbmFtZXNwYWNlQXJyYXlYTUwtPmFwcGVuZENoaWxkKCRjb21tYW5kWE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnY29tbWFuZCcpKTsKJGNvbW1hbmRYTUwtPmFwcGVuZENoaWxkKCRkb20tPmNyZWF0ZVRleHROb2RlKCRuYW1lKSk7Cn0KfQp9CgpyZXR1cm4gJGRvbTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlSW5wdXRBcmd1bWVudChJbnB1dEFyZ3VtZW50ICRhcmd1bWVudCwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokdGhpcy0+d3JpdGVEb2N1bWVudCgkdGhpcy0+Z2V0SW5wdXRBcmd1bWVudERvY3VtZW50KCRhcmd1bWVudCkpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVJbnB1dE9wdGlvbihJbnB1dE9wdGlvbiAkb3B0aW9uLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiR0aGlzLT53cml0ZURvY3VtZW50KCR0aGlzLT5nZXRJbnB1dE9wdGlvbkRvY3VtZW50KCRvcHRpb24pKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlSW5wdXREZWZpbml0aW9uKElucHV0RGVmaW5pdGlvbiAkZGVmaW5pdGlvbiwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokdGhpcy0+d3JpdGVEb2N1bWVudCgkdGhpcy0+Z2V0SW5wdXREZWZpbml0aW9uRG9jdW1lbnQoJGRlZmluaXRpb24pKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlQ29tbWFuZChDb21tYW5kICRjb21tYW5kLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiR0aGlzLT53cml0ZURvY3VtZW50KCR0aGlzLT5nZXRDb21tYW5kRG9jdW1lbnQoJGNvbW1hbmQsICRvcHRpb25zWydzaG9ydCddID8/IGZhbHNlKSk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uICRhcHBsaWNhdGlvbiwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokdGhpcy0+d3JpdGVEb2N1bWVudCgkdGhpcy0+Z2V0QXBwbGljYXRpb25Eb2N1bWVudCgkYXBwbGljYXRpb24sICRvcHRpb25zWyduYW1lc3BhY2UnXSA/PyBudWxsLCAkb3B0aW9uc1snc2hvcnQnXSA/PyBmYWxzZSkpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFwcGVuZERvY3VtZW50KFxET01Ob2RlICRwYXJlbnROb2RlLCBcRE9NTm9kZSAkaW1wb3J0ZWRQYXJlbnQpCnsKZm9yZWFjaCAoJGltcG9ydGVkUGFyZW50LT5jaGlsZE5vZGVzIGFzICRjaGlsZE5vZGUpIHsKJHBhcmVudE5vZGUtPmFwcGVuZENoaWxkKCRwYXJlbnROb2RlLT5vd25lckRvY3VtZW50LT5pbXBvcnROb2RlKCRjaGlsZE5vZGUsIHRydWUpKTsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHdyaXRlRG9jdW1lbnQoXERPTURvY3VtZW50ICRkb20pCnsKJGRvbS0+Zm9ybWF0T3V0cHV0ID0gdHJ1ZTsKJHRoaXMtPndyaXRlKCRkb20tPnNhdmVYTUwoKSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0SW5wdXRBcmd1bWVudERvY3VtZW50KElucHV0QXJndW1lbnQgJGFyZ3VtZW50KTogXERPTURvY3VtZW50CnsKJGRvbSA9IG5ldyBcRE9NRG9jdW1lbnQoJzEuMCcsICdVVEYtOCcpOwoKJGRvbS0+YXBwZW5kQ2hpbGQoJG9iamVjdFhNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ2FyZ3VtZW50JykpOwokb2JqZWN0WE1MLT5zZXRBdHRyaWJ1dGUoJ25hbWUnLCAkYXJndW1lbnQtPmdldE5hbWUoKSk7CiRvYmplY3RYTUwtPnNldEF0dHJpYnV0ZSgnaXNfcmVxdWlyZWQnLCAkYXJndW1lbnQtPmlzUmVxdWlyZWQoKSA/IDEgOiAwKTsKJG9iamVjdFhNTC0+c2V0QXR0cmlidXRlKCdpc19hcnJheScsICRhcmd1bWVudC0+aXNBcnJheSgpID8gMSA6IDApOwokb2JqZWN0WE1MLT5hcHBlbmRDaGlsZCgkZGVzY3JpcHRpb25YTUwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdkZXNjcmlwdGlvbicpKTsKJGRlc2NyaXB0aW9uWE1MLT5hcHBlbmRDaGlsZCgkZG9tLT5jcmVhdGVUZXh0Tm9kZSgkYXJndW1lbnQtPmdldERlc2NyaXB0aW9uKCkpKTsKCiRvYmplY3RYTUwtPmFwcGVuZENoaWxkKCRkZWZhdWx0c1hNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ2RlZmF1bHRzJykpOwokZGVmYXVsdHMgPSBcaXNfYXJyYXkoJGFyZ3VtZW50LT5nZXREZWZhdWx0KCkpID8gJGFyZ3VtZW50LT5nZXREZWZhdWx0KCkgOiAoXGlzX2Jvb2woJGFyZ3VtZW50LT5nZXREZWZhdWx0KCkpID8gW3Zhcl9leHBvcnQoJGFyZ3VtZW50LT5nZXREZWZhdWx0KCksIHRydWUpXSA6ICgkYXJndW1lbnQtPmdldERlZmF1bHQoKSA/IFskYXJndW1lbnQtPmdldERlZmF1bHQoKV0gOiBbXSkpOwpmb3JlYWNoICgkZGVmYXVsdHMgYXMgJGRlZmF1bHQpIHsKJGRlZmF1bHRzWE1MLT5hcHBlbmRDaGlsZCgkZGVmYXVsdFhNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ2RlZmF1bHQnKSk7CiRkZWZhdWx0WE1MLT5hcHBlbmRDaGlsZCgkZG9tLT5jcmVhdGVUZXh0Tm9kZSgkZGVmYXVsdCkpOwp9CgpyZXR1cm4gJGRvbTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRJbnB1dE9wdGlvbkRvY3VtZW50KElucHV0T3B0aW9uICRvcHRpb24pOiBcRE9NRG9jdW1lbnQKewokZG9tID0gbmV3IFxET01Eb2N1bWVudCgnMS4wJywgJ1VURi04Jyk7CgokZG9tLT5hcHBlbmRDaGlsZCgkb2JqZWN0WE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnb3B0aW9uJykpOwokb2JqZWN0WE1MLT5zZXRBdHRyaWJ1dGUoJ25hbWUnLCAnLS0nLiRvcHRpb24tPmdldE5hbWUoKSk7CiRwb3MgPSBzdHJwb3MoJG9wdGlvbi0+Z2V0U2hvcnRjdXQoKSA/PyAnJywgJ3wnKTsKaWYgKGZhbHNlICE9PSAkcG9zKSB7CiRvYmplY3RYTUwtPnNldEF0dHJpYnV0ZSgnc2hvcnRjdXQnLCAnLScuc3Vic3RyKCRvcHRpb24tPmdldFNob3J0Y3V0KCksIDAsICRwb3MpKTsKJG9iamVjdFhNTC0+c2V0QXR0cmlidXRlKCdzaG9ydGN1dHMnLCAnLScuc3RyX3JlcGxhY2UoJ3wnLCAnfC0nLCAkb3B0aW9uLT5nZXRTaG9ydGN1dCgpKSk7Cn0gZWxzZSB7CiRvYmplY3RYTUwtPnNldEF0dHJpYnV0ZSgnc2hvcnRjdXQnLCAkb3B0aW9uLT5nZXRTaG9ydGN1dCgpID8gJy0nLiRvcHRpb24tPmdldFNob3J0Y3V0KCkgOiAnJyk7Cn0KJG9iamVjdFhNTC0+c2V0QXR0cmlidXRlKCdhY2NlcHRfdmFsdWUnLCAkb3B0aW9uLT5hY2NlcHRWYWx1ZSgpID8gMSA6IDApOwokb2JqZWN0WE1MLT5zZXRBdHRyaWJ1dGUoJ2lzX3ZhbHVlX3JlcXVpcmVkJywgJG9wdGlvbi0+aXNWYWx1ZVJlcXVpcmVkKCkgPyAxIDogMCk7CiRvYmplY3RYTUwtPnNldEF0dHJpYnV0ZSgnaXNfbXVsdGlwbGUnLCAkb3B0aW9uLT5pc0FycmF5KCkgPyAxIDogMCk7CiRvYmplY3RYTUwtPmFwcGVuZENoaWxkKCRkZXNjcmlwdGlvblhNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ2Rlc2NyaXB0aW9uJykpOwokZGVzY3JpcHRpb25YTUwtPmFwcGVuZENoaWxkKCRkb20tPmNyZWF0ZVRleHROb2RlKCRvcHRpb24tPmdldERlc2NyaXB0aW9uKCkpKTsKCmlmICgkb3B0aW9uLT5hY2NlcHRWYWx1ZSgpKSB7CiRkZWZhdWx0cyA9IFxpc19hcnJheSgkb3B0aW9uLT5nZXREZWZhdWx0KCkpID8gJG9wdGlvbi0+Z2V0RGVmYXVsdCgpIDogKFxpc19ib29sKCRvcHRpb24tPmdldERlZmF1bHQoKSkgPyBbdmFyX2V4cG9ydCgkb3B0aW9uLT5nZXREZWZhdWx0KCksIHRydWUpXSA6ICgkb3B0aW9uLT5nZXREZWZhdWx0KCkgPyBbJG9wdGlvbi0+Z2V0RGVmYXVsdCgpXSA6IFtdKSk7CiRvYmplY3RYTUwtPmFwcGVuZENoaWxkKCRkZWZhdWx0c1hNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ2RlZmF1bHRzJykpOwoKaWYgKCFlbXB0eSgkZGVmYXVsdHMpKSB7CmZvcmVhY2ggKCRkZWZhdWx0cyBhcyAkZGVmYXVsdCkgewokZGVmYXVsdHNYTUwtPmFwcGVuZENoaWxkKCRkZWZhdWx0WE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnZGVmYXVsdCcpKTsKJGRlZmF1bHRYTUwtPmFwcGVuZENoaWxkKCRkb20tPmNyZWF0ZVRleHROb2RlKCRkZWZhdWx0KSk7Cn0KfQp9CgppZiAoJG9wdGlvbi0+aXNOZWdhdGFibGUoKSkgewokZG9tLT5hcHBlbmRDaGlsZCgkb2JqZWN0WE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnb3B0aW9uJykpOwokb2JqZWN0WE1MLT5zZXRBdHRyaWJ1dGUoJ25hbWUnLCAnLS1uby0nLiRvcHRpb24tPmdldE5hbWUoKSk7CiRvYmplY3RYTUwtPnNldEF0dHJpYnV0ZSgnc2hvcnRjdXQnLCAnJyk7CiRvYmplY3RYTUwtPnNldEF0dHJpYnV0ZSgnYWNjZXB0X3ZhbHVlJywgMCk7CiRvYmplY3RYTUwtPnNldEF0dHJpYnV0ZSgnaXNfdmFsdWVfcmVxdWlyZWQnLCAwKTsKJG9iamVjdFhNTC0+c2V0QXR0cmlidXRlKCdpc19tdWx0aXBsZScsIDApOwokb2JqZWN0WE1MLT5hcHBlbmRDaGlsZCgkZGVzY3JpcHRpb25YTUwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdkZXNjcmlwdGlvbicpKTsKJGRlc2NyaXB0aW9uWE1MLT5hcHBlbmRDaGlsZCgkZG9tLT5jcmVhdGVUZXh0Tm9kZSgnTmVnYXRlIHRoZSAiLS0nLiRvcHRpb24tPmdldE5hbWUoKS4nIiBvcHRpb24nKSk7Cn0KCnJldHVybiAkZG9tOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV2ZW50OwoKCgoKCgoKCgpmaW5hbCBjbGFzcyBDb25zb2xlQ29tbWFuZEV2ZW50IGV4dGVuZHMgQ29uc29sZUV2ZW50CnsKCgoKcHVibGljIGNvbnN0IFJFVFVSTl9DT0RFX0RJU0FCTEVEID0gMTEzOwoKCgoKcHJpdmF0ZSAkY29tbWFuZFNob3VsZFJ1biA9IHRydWU7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZGlzYWJsZUNvbW1hbmQoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+Y29tbWFuZFNob3VsZFJ1biA9IGZhbHNlOwp9CgpwdWJsaWMgZnVuY3Rpb24gZW5hYmxlQ29tbWFuZCgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5jb21tYW5kU2hvdWxkUnVuID0gdHJ1ZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbW1hbmRTaG91bGRSdW4oKTogYm9vbAp7CnJldHVybiAkdGhpcy0+Y29tbWFuZFNob3VsZFJ1bjsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFdmVudDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCmZpbmFsIGNsYXNzIENvbnNvbGVFcnJvckV2ZW50IGV4dGVuZHMgQ29uc29sZUV2ZW50CnsKcHJpdmF0ZSAkZXJyb3I7CnByaXZhdGUgJGV4aXRDb2RlOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIFxUaHJvd2FibGUgJGVycm9yLCA/Q29tbWFuZCAkY29tbWFuZCA9IG51bGwpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkY29tbWFuZCwgJGlucHV0LCAkb3V0cHV0KTsKCiR0aGlzLT5lcnJvciA9ICRlcnJvcjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEVycm9yKCk6IFxUaHJvd2FibGUKewpyZXR1cm4gJHRoaXMtPmVycm9yOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0RXJyb3IoXFRocm93YWJsZSAkZXJyb3IpOiB2b2lkCnsKJHRoaXMtPmVycm9yID0gJGVycm9yOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0RXhpdENvZGUoaW50ICRleGl0Q29kZSk6IHZvaWQKewokdGhpcy0+ZXhpdENvZGUgPSAkZXhpdENvZGU7CgokciA9IG5ldyBcUmVmbGVjdGlvblByb3BlcnR5KCR0aGlzLT5lcnJvciwgJ2NvZGUnKTsKJHItPnNldEFjY2Vzc2libGUodHJ1ZSk7CiRyLT5zZXRWYWx1ZSgkdGhpcy0+ZXJyb3IsICR0aGlzLT5leGl0Q29kZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRFeGl0Q29kZSgpOiBpbnQKewpyZXR1cm4gJHRoaXMtPmV4aXRDb2RlID8/IChcaXNfaW50KCR0aGlzLT5lcnJvci0+Z2V0Q29kZSgpKSAmJiAwICE9PSAkdGhpcy0+ZXJyb3ItPmdldENvZGUoKSA/ICR0aGlzLT5lcnJvci0+Z2V0Q29kZSgpIDogMSk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXZlbnQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXENvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb250cmFjdHNcRXZlbnREaXNwYXRjaGVyXEV2ZW50OwoKCgoKCgpjbGFzcyBDb25zb2xlRXZlbnQgZXh0ZW5kcyBFdmVudAp7CnByb3RlY3RlZCAkY29tbWFuZDsKCnByaXZhdGUgJGlucHV0Owpwcml2YXRlICRvdXRwdXQ7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0NvbW1hbmQgJGNvbW1hbmQsIElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpCnsKJHRoaXMtPmNvbW1hbmQgPSAkY29tbWFuZDsKJHRoaXMtPmlucHV0ID0gJGlucHV0OwokdGhpcy0+b3V0cHV0ID0gJG91dHB1dDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tbWFuZCgpCnsKcmV0dXJuICR0aGlzLT5jb21tYW5kOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJbnB1dCgpCnsKcmV0dXJuICR0aGlzLT5pbnB1dDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3V0cHV0KCkKewpyZXR1cm4gJHRoaXMtPm91dHB1dDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFdmVudDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgpmaW5hbCBjbGFzcyBDb25zb2xlU2lnbmFsRXZlbnQgZXh0ZW5kcyBDb25zb2xlRXZlbnQKewpwcml2YXRlICRoYW5kbGluZ1NpZ25hbDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChDb21tYW5kICRjb21tYW5kLCBJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBpbnQgJGhhbmRsaW5nU2lnbmFsKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJGNvbW1hbmQsICRpbnB1dCwgJG91dHB1dCk7CiR0aGlzLT5oYW5kbGluZ1NpZ25hbCA9ICRoYW5kbGluZ1NpZ25hbDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEhhbmRsaW5nU2lnbmFsKCk6IGludAp7CnJldHVybiAkdGhpcy0+aGFuZGxpbmdTaWduYWw7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXZlbnQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXENvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKCgpmaW5hbCBjbGFzcyBDb25zb2xlVGVybWluYXRlRXZlbnQgZXh0ZW5kcyBDb25zb2xlRXZlbnQKewpwcml2YXRlICRleGl0Q29kZTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChDb21tYW5kICRjb21tYW5kLCBJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBpbnQgJGV4aXRDb2RlKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJGNvbW1hbmQsICRpbnB1dCwgJG91dHB1dCk7CgokdGhpcy0+c2V0RXhpdENvZGUoJGV4aXRDb2RlKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEV4aXRDb2RlKGludCAkZXhpdENvZGUpOiB2b2lkCnsKJHRoaXMtPmV4aXRDb2RlID0gJGV4aXRDb2RlOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXhpdENvZGUoKTogaW50CnsKcmV0dXJuICR0aGlzLT5leGl0Q29kZTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFdmVudExpc3RlbmVyOwoKdXNlIFBzclxMb2dcTG9nZ2VySW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb25zb2xlRXZlbnRzOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFdmVudFxDb25zb2xlRXJyb3JFdmVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXZlbnRcQ29uc29sZUV2ZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFdmVudFxDb25zb2xlVGVybWluYXRlRXZlbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxFdmVudERpc3BhdGNoZXJcRXZlbnRTdWJzY3JpYmVySW50ZXJmYWNlOwoKCgoKCmNsYXNzIEVycm9yTGlzdGVuZXIgaW1wbGVtZW50cyBFdmVudFN1YnNjcmliZXJJbnRlcmZhY2UKewpwcml2YXRlICRsb2dnZXI7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0xvZ2dlckludGVyZmFjZSAkbG9nZ2VyID0gbnVsbCkKewokdGhpcy0+bG9nZ2VyID0gJGxvZ2dlcjsKfQoKcHVibGljIGZ1bmN0aW9uIG9uQ29uc29sZUVycm9yKENvbnNvbGVFcnJvckV2ZW50ICRldmVudCkKewppZiAobnVsbCA9PT0gJHRoaXMtPmxvZ2dlcikgewpyZXR1cm47Cn0KCiRlcnJvciA9ICRldmVudC0+Z2V0RXJyb3IoKTsKCmlmICghJGlucHV0U3RyaW5nID0gJHRoaXMtPmdldElucHV0U3RyaW5nKCRldmVudCkpIHsKJHRoaXMtPmxvZ2dlci0+Y3JpdGljYWwoJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHVzaW5nIHRoZSBjb25zb2xlLiBNZXNzYWdlOiAie21lc3NhZ2V9IicsIFsnZXhjZXB0aW9uJyA9PiAkZXJyb3IsICdtZXNzYWdlJyA9PiAkZXJyb3ItPmdldE1lc3NhZ2UoKV0pOwoKcmV0dXJuOwp9CgokdGhpcy0+bG9nZ2VyLT5jcml0aWNhbCgnRXJyb3IgdGhyb3duIHdoaWxlIHJ1bm5pbmcgY29tbWFuZCAie2NvbW1hbmR9Ii4gTWVzc2FnZTogInttZXNzYWdlfSInLCBbJ2V4Y2VwdGlvbicgPT4gJGVycm9yLCAnY29tbWFuZCcgPT4gJGlucHV0U3RyaW5nLCAnbWVzc2FnZScgPT4gJGVycm9yLT5nZXRNZXNzYWdlKCldKTsKfQoKcHVibGljIGZ1bmN0aW9uIG9uQ29uc29sZVRlcm1pbmF0ZShDb25zb2xlVGVybWluYXRlRXZlbnQgJGV2ZW50KQp7CmlmIChudWxsID09PSAkdGhpcy0+bG9nZ2VyKSB7CnJldHVybjsKfQoKJGV4aXRDb2RlID0gJGV2ZW50LT5nZXRFeGl0Q29kZSgpOwoKaWYgKDAgPT09ICRleGl0Q29kZSkgewpyZXR1cm47Cn0KCmlmICghJGlucHV0U3RyaW5nID0gJHRoaXMtPmdldElucHV0U3RyaW5nKCRldmVudCkpIHsKJHRoaXMtPmxvZ2dlci0+ZGVidWcoJ1RoZSBjb25zb2xlIGV4aXRlZCB3aXRoIGNvZGUgIntjb2RlfSInLCBbJ2NvZGUnID0+ICRleGl0Q29kZV0pOwoKcmV0dXJuOwp9CgokdGhpcy0+bG9nZ2VyLT5kZWJ1ZygnQ29tbWFuZCAie2NvbW1hbmR9IiBleGl0ZWQgd2l0aCBjb2RlICJ7Y29kZX0iJywgWydjb21tYW5kJyA9PiAkaW5wdXRTdHJpbmcsICdjb2RlJyA9PiAkZXhpdENvZGVdKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRTdWJzY3JpYmVkRXZlbnRzKCkKewpyZXR1cm4gWwpDb25zb2xlRXZlbnRzOjpFUlJPUiA9PiBbJ29uQ29uc29sZUVycm9yJywgLTEyOF0sCkNvbnNvbGVFdmVudHM6OlRFUk1JTkFURSA9PiBbJ29uQ29uc29sZVRlcm1pbmF0ZScsIC0xMjhdLApdOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRJbnB1dFN0cmluZyhDb25zb2xlRXZlbnQgJGV2ZW50KTogP3N0cmluZwp7CiRjb21tYW5kTmFtZSA9ICRldmVudC0+Z2V0Q29tbWFuZCgpID8gJGV2ZW50LT5nZXRDb21tYW5kKCktPmdldE5hbWUoKSA6IG51bGw7CiRpbnB1dCA9ICRldmVudC0+Z2V0SW5wdXQoKTsKCmlmIChtZXRob2RfZXhpc3RzKCRpbnB1dCwgJ19fdG9TdHJpbmcnKSkgewppZiAoJGNvbW1hbmROYW1lKSB7CnJldHVybiBzdHJfcmVwbGFjZShbIickY29tbWFuZE5hbWUnIiwgIlwiJGNvbW1hbmROYW1lXCIiXSwgJGNvbW1hbmROYW1lLCAoc3RyaW5nKSAkaW5wdXQpOwp9CgpyZXR1cm4gKHN0cmluZykgJGlucHV0Owp9CgpyZXR1cm4gJGNvbW1hbmROYW1lOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvbjsKCgoKCgoKY2xhc3MgQ29tbWFuZE5vdEZvdW5kRXhjZXB0aW9uIGV4dGVuZHMgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbkludGVyZmFjZQp7CnByaXZhdGUgJGFsdGVybmF0aXZlczsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG1lc3NhZ2UsIGFycmF5ICRhbHRlcm5hdGl2ZXMgPSBbXSwgaW50ICRjb2RlID0gMCwgP1xUaHJvd2FibGUgJHByZXZpb3VzID0gbnVsbCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlLCAkY29kZSwgJHByZXZpb3VzKTsKCiR0aGlzLT5hbHRlcm5hdGl2ZXMgPSAkYWx0ZXJuYXRpdmVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QWx0ZXJuYXRpdmVzKCkKewpyZXR1cm4gJHRoaXMtPmFsdGVybmF0aXZlczsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb247CgoKCgoKCmludGVyZmFjZSBFeGNlcHRpb25JbnRlcmZhY2UgZXh0ZW5kcyBcVGhyb3dhYmxlCnsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uOwoKCgoKY2xhc3MgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGV4dGVuZHMgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbkludGVyZmFjZQp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvbjsKCgoKCgoKY2xhc3MgSW52YWxpZE9wdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb25JbnRlcmZhY2UKewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb247CgoKCgpjbGFzcyBMb2dpY0V4Y2VwdGlvbiBleHRlbmRzIFxMb2dpY0V4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbkludGVyZmFjZQp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvbjsKCgoKCgoKY2xhc3MgTWlzc2luZ0lucHV0RXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbkludGVyZmFjZQp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvbjsKCgoKCgoKY2xhc3MgTmFtZXNwYWNlTm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBDb21tYW5kTm90Rm91bmRFeGNlcHRpb24Kewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb247CgoKCgpjbGFzcyBSdW50aW1lRXhjZXB0aW9uIGV4dGVuZHMgXFJ1bnRpbWVFeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb25JbnRlcmZhY2UKewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXI7CgoKCgpmaW5hbCBjbGFzcyBOdWxsT3V0cHV0Rm9ybWF0dGVyIGltcGxlbWVudHMgT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlCnsKcHJpdmF0ZSAkc3R5bGU7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZm9ybWF0KD9zdHJpbmcgJG1lc3NhZ2UpOiA/c3RyaW5nCnsKcmV0dXJuIG51bGw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdHlsZShzdHJpbmcgJG5hbWUpOiBPdXRwdXRGb3JtYXR0ZXJTdHlsZUludGVyZmFjZQp7CgpyZXR1cm4gJHRoaXMtPnN0eWxlID8/ICR0aGlzLT5zdHlsZSA9IG5ldyBOdWxsT3V0cHV0Rm9ybWF0dGVyU3R5bGUoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc1N0eWxlKHN0cmluZyAkbmFtZSk6IGJvb2wKewpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlY29yYXRlZCgpOiBib29sCnsKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGVjb3JhdGVkKGJvb2wgJGRlY29yYXRlZCk6IHZvaWQKewoKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFN0eWxlKHN0cmluZyAkbmFtZSwgT3V0cHV0Rm9ybWF0dGVyU3R5bGVJbnRlcmZhY2UgJHN0eWxlKTogdm9pZAp7Cgp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlcjsKCgoKCmZpbmFsIGNsYXNzIE51bGxPdXRwdXRGb3JtYXR0ZXJTdHlsZSBpbXBsZW1lbnRzIE91dHB1dEZvcm1hdHRlclN0eWxlSW50ZXJmYWNlCnsKCgoKcHVibGljIGZ1bmN0aW9uIGFwcGx5KHN0cmluZyAkdGV4dCk6IHN0cmluZwp7CnJldHVybiAkdGV4dDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEJhY2tncm91bmQoP3N0cmluZyAkY29sb3IgPSBudWxsKTogdm9pZAp7Cgp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Rm9yZWdyb3VuZCg/c3RyaW5nICRjb2xvciA9IG51bGwpOiB2b2lkCnsKCn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRPcHRpb24oc3RyaW5nICRvcHRpb24pOiB2b2lkCnsKCn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRPcHRpb25zKGFycmF5ICRvcHRpb25zKTogdm9pZAp7Cgp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdW5zZXRPcHRpb24oc3RyaW5nICRvcHRpb24pOiB2b2lkCnsKCn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKCnVzZSBmdW5jdGlvbiBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcYjsKCgoKCgoKCmNsYXNzIE91dHB1dEZvcm1hdHRlciBpbXBsZW1lbnRzIFdyYXBwYWJsZU91dHB1dEZvcm1hdHRlckludGVyZmFjZQp7CnByaXZhdGUgJGRlY29yYXRlZDsKcHJpdmF0ZSAkc3R5bGVzID0gW107CnByaXZhdGUgJHN0eWxlU3RhY2s7CgpwdWJsaWMgZnVuY3Rpb24gX19jbG9uZSgpCnsKJHRoaXMtPnN0eWxlU3RhY2sgPSBjbG9uZSAkdGhpcy0+c3R5bGVTdGFjazsKZm9yZWFjaCAoJHRoaXMtPnN0eWxlcyBhcyAka2V5ID0+ICR2YWx1ZSkgewokdGhpcy0+c3R5bGVzWyRrZXldID0gY2xvbmUgJHZhbHVlOwp9Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBlc2NhcGUoc3RyaW5nICR0ZXh0KQp7CiR0ZXh0ID0gcHJlZ19yZXBsYWNlKCcvKFteXFxcXF18XikoWzw+XSkvJywgJyQxXFxcXCQyJywgJHRleHQpOwoKcmV0dXJuIHNlbGY6OmVzY2FwZVRyYWlsaW5nQmFja3NsYXNoKCR0ZXh0KTsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGVzY2FwZVRyYWlsaW5nQmFja3NsYXNoKHN0cmluZyAkdGV4dCk6IHN0cmluZwp7CmlmIChzdHJfZW5kc193aXRoKCR0ZXh0LCAnXFwnKSkgewokbGVuID0gXHN0cmxlbigkdGV4dCk7CiR0ZXh0ID0gcnRyaW0oJHRleHQsICdcXCcpOwokdGV4dCA9IHN0cl9yZXBsYWNlKCJcMCIsICcnLCAkdGV4dCk7CiR0ZXh0IC49IHN0cl9yZXBlYXQoIlwwIiwgJGxlbiAtIFxzdHJsZW4oJHRleHQpKTsKfQoKcmV0dXJuICR0ZXh0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChib29sICRkZWNvcmF0ZWQgPSBmYWxzZSwgYXJyYXkgJHN0eWxlcyA9IFtdKQp7CiR0aGlzLT5kZWNvcmF0ZWQgPSAkZGVjb3JhdGVkOwoKJHRoaXMtPnNldFN0eWxlKCdlcnJvcicsIG5ldyBPdXRwdXRGb3JtYXR0ZXJTdHlsZSgnd2hpdGUnLCAncmVkJykpOwokdGhpcy0+c2V0U3R5bGUoJ2luZm8nLCBuZXcgT3V0cHV0Rm9ybWF0dGVyU3R5bGUoJ2dyZWVuJykpOwokdGhpcy0+c2V0U3R5bGUoJ2NvbW1lbnQnLCBuZXcgT3V0cHV0Rm9ybWF0dGVyU3R5bGUoJ3llbGxvdycpKTsKJHRoaXMtPnNldFN0eWxlKCdxdWVzdGlvbicsIG5ldyBPdXRwdXRGb3JtYXR0ZXJTdHlsZSgnYmxhY2snLCAnY3lhbicpKTsKCmZvcmVhY2ggKCRzdHlsZXMgYXMgJG5hbWUgPT4gJHN0eWxlKSB7CiR0aGlzLT5zZXRTdHlsZSgkbmFtZSwgJHN0eWxlKTsKfQoKJHRoaXMtPnN0eWxlU3RhY2sgPSBuZXcgT3V0cHV0Rm9ybWF0dGVyU3R5bGVTdGFjaygpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGVjb3JhdGVkKGJvb2wgJGRlY29yYXRlZCkKewokdGhpcy0+ZGVjb3JhdGVkID0gJGRlY29yYXRlZDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGVjb3JhdGVkKCkKewpyZXR1cm4gJHRoaXMtPmRlY29yYXRlZDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFN0eWxlKHN0cmluZyAkbmFtZSwgT3V0cHV0Rm9ybWF0dGVyU3R5bGVJbnRlcmZhY2UgJHN0eWxlKQp7CiR0aGlzLT5zdHlsZXNbc3RydG9sb3dlcigkbmFtZSldID0gJHN0eWxlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzU3R5bGUoc3RyaW5nICRuYW1lKQp7CnJldHVybiBpc3NldCgkdGhpcy0+c3R5bGVzW3N0cnRvbG93ZXIoJG5hbWUpXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdHlsZShzdHJpbmcgJG5hbWUpCnsKaWYgKCEkdGhpcy0+aGFzU3R5bGUoJG5hbWUpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVW5kZWZpbmVkIHN0eWxlOiAiJXMiLicsICRuYW1lKSk7Cn0KCnJldHVybiAkdGhpcy0+c3R5bGVzW3N0cnRvbG93ZXIoJG5hbWUpXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGZvcm1hdCg/c3RyaW5nICRtZXNzYWdlKQp7CnJldHVybiAkdGhpcy0+Zm9ybWF0QW5kV3JhcCgkbWVzc2FnZSwgMCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBmb3JtYXRBbmRXcmFwKD9zdHJpbmcgJG1lc3NhZ2UsIGludCAkd2lkdGgpCnsKaWYgKG51bGwgPT09ICRtZXNzYWdlKSB7CnJldHVybiAnJzsKfQoKJG9mZnNldCA9IDA7CiRvdXRwdXQgPSAnJzsKJG9wZW5UYWdSZWdleCA9ICdbYS16XSg/OlteXFxcXDw+XSorIHwgXFxcXC4pKic7CiRjbG9zZVRhZ1JlZ2V4ID0gJ1thLXpdW148Pl0qKyc7CiRjdXJyZW50TGluZUxlbmd0aCA9IDA7CnByZWdfbWF0Y2hfYWxsKCIjPCgoJG9wZW5UYWdSZWdleCkgfCAvKCRjbG9zZVRhZ1JlZ2V4KT8pPiNpeCIsICRtZXNzYWdlLCAkbWF0Y2hlcywgXFBSRUdfT0ZGU0VUX0NBUFRVUkUpOwpmb3JlYWNoICgkbWF0Y2hlc1swXSBhcyAkaSA9PiAkbWF0Y2gpIHsKJHBvcyA9ICRtYXRjaFsxXTsKJHRleHQgPSAkbWF0Y2hbMF07CgppZiAoMCAhPSAkcG9zICYmICdcXCcgPT0gJG1lc3NhZ2VbJHBvcyAtIDFdKSB7CmNvbnRpbnVlOwp9CgoKJG91dHB1dCAuPSAkdGhpcy0+YXBwbHlDdXJyZW50U3R5bGUoc3Vic3RyKCRtZXNzYWdlLCAkb2Zmc2V0LCAkcG9zIC0gJG9mZnNldCksICRvdXRwdXQsICR3aWR0aCwgJGN1cnJlbnRMaW5lTGVuZ3RoKTsKJG9mZnNldCA9ICRwb3MgKyBcc3RybGVuKCR0ZXh0KTsKCgppZiAoJG9wZW4gPSAnLycgIT0gJHRleHRbMV0pIHsKJHRhZyA9ICRtYXRjaGVzWzFdWyRpXVswXTsKfSBlbHNlIHsKJHRhZyA9ICRtYXRjaGVzWzNdWyRpXVswXSA/PyAnJzsKfQoKaWYgKCEkb3BlbiAmJiAhJHRhZykgewoKJHRoaXMtPnN0eWxlU3RhY2stPnBvcCgpOwp9IGVsc2VpZiAobnVsbCA9PT0gJHN0eWxlID0gJHRoaXMtPmNyZWF0ZVN0eWxlRnJvbVN0cmluZygkdGFnKSkgewokb3V0cHV0IC49ICR0aGlzLT5hcHBseUN1cnJlbnRTdHlsZSgkdGV4dCwgJG91dHB1dCwgJHdpZHRoLCAkY3VycmVudExpbmVMZW5ndGgpOwp9IGVsc2VpZiAoJG9wZW4pIHsKJHRoaXMtPnN0eWxlU3RhY2stPnB1c2goJHN0eWxlKTsKfSBlbHNlIHsKJHRoaXMtPnN0eWxlU3RhY2stPnBvcCgkc3R5bGUpOwp9Cn0KCiRvdXRwdXQgLj0gJHRoaXMtPmFwcGx5Q3VycmVudFN0eWxlKHN1YnN0cigkbWVzc2FnZSwgJG9mZnNldCksICRvdXRwdXQsICR3aWR0aCwgJGN1cnJlbnRMaW5lTGVuZ3RoKTsKCnJldHVybiBzdHJ0cigkb3V0cHV0LCBbIlwwIiA9PiAnXFwnLCAnXFw8JyA9PiAnPCcsICdcXD4nID0+ICc+J10pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3R5bGVTdGFjaygpCnsKcmV0dXJuICR0aGlzLT5zdHlsZVN0YWNrOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZVN0eWxlRnJvbVN0cmluZyhzdHJpbmcgJHN0cmluZyk6ID9PdXRwdXRGb3JtYXR0ZXJTdHlsZUludGVyZmFjZQp7CmlmIChpc3NldCgkdGhpcy0+c3R5bGVzWyRzdHJpbmddKSkgewpyZXR1cm4gJHRoaXMtPnN0eWxlc1skc3RyaW5nXTsKfQoKaWYgKCFwcmVnX21hdGNoX2FsbCgnLyhbXj1dKyk9KFteO10rKSg7fCQpLycsICRzdHJpbmcsICRtYXRjaGVzLCBcUFJFR19TRVRfT1JERVIpKSB7CnJldHVybiBudWxsOwp9Cgokc3R5bGUgPSBuZXcgT3V0cHV0Rm9ybWF0dGVyU3R5bGUoKTsKZm9yZWFjaCAoJG1hdGNoZXMgYXMgJG1hdGNoKSB7CmFycmF5X3NoaWZ0KCRtYXRjaCk7CiRtYXRjaFswXSA9IHN0cnRvbG93ZXIoJG1hdGNoWzBdKTsKCmlmICgnZmcnID09ICRtYXRjaFswXSkgewokc3R5bGUtPnNldEZvcmVncm91bmQoc3RydG9sb3dlcigkbWF0Y2hbMV0pKTsKfSBlbHNlaWYgKCdiZycgPT0gJG1hdGNoWzBdKSB7CiRzdHlsZS0+c2V0QmFja2dyb3VuZChzdHJ0b2xvd2VyKCRtYXRjaFsxXSkpOwp9IGVsc2VpZiAoJ2hyZWYnID09PSAkbWF0Y2hbMF0pIHsKJHVybCA9IHByZWdfcmVwbGFjZSgne1xcXFwoWzw+XSl9JywgJyQxJywgJG1hdGNoWzFdKTsKJHN0eWxlLT5zZXRIcmVmKCR1cmwpOwp9IGVsc2VpZiAoJ29wdGlvbnMnID09PSAkbWF0Y2hbMF0pIHsKcHJlZ19tYXRjaF9hbGwoJyhbXiw7XSspJywgc3RydG9sb3dlcigkbWF0Y2hbMV0pLCAkb3B0aW9ucyk7CiRvcHRpb25zID0gYXJyYXlfc2hpZnQoJG9wdGlvbnMpOwpmb3JlYWNoICgkb3B0aW9ucyBhcyAkb3B0aW9uKSB7CiRzdHlsZS0+c2V0T3B0aW9uKCRvcHRpb24pOwp9Cn0gZWxzZSB7CnJldHVybiBudWxsOwp9Cn0KCnJldHVybiAkc3R5bGU7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gYXBwbHlDdXJyZW50U3R5bGUoc3RyaW5nICR0ZXh0LCBzdHJpbmcgJGN1cnJlbnQsIGludCAkd2lkdGgsIGludCAmJGN1cnJlbnRMaW5lTGVuZ3RoKTogc3RyaW5nCnsKaWYgKCcnID09PSAkdGV4dCkgewpyZXR1cm4gJyc7Cn0KCmlmICghJHdpZHRoKSB7CnJldHVybiAkdGhpcy0+aXNEZWNvcmF0ZWQoKSA/ICR0aGlzLT5zdHlsZVN0YWNrLT5nZXRDdXJyZW50KCktPmFwcGx5KCR0ZXh0KSA6ICR0ZXh0Owp9CgppZiAoISRjdXJyZW50TGluZUxlbmd0aCAmJiAnJyAhPT0gJGN1cnJlbnQpIHsKJHRleHQgPSBsdHJpbSgkdGV4dCk7Cn0KCmlmICgkY3VycmVudExpbmVMZW5ndGgpIHsKJHByZWZpeCA9IHN1YnN0cigkdGV4dCwgMCwgJGkgPSAkd2lkdGggLSAkY3VycmVudExpbmVMZW5ndGgpLiJcbiI7CiR0ZXh0ID0gc3Vic3RyKCR0ZXh0LCAkaSk7Cn0gZWxzZSB7CiRwcmVmaXggPSAnJzsKfQoKcHJlZ19tYXRjaCgnfihcXG4pJH4nLCAkdGV4dCwgJG1hdGNoZXMpOwokdGV4dCA9ICRwcmVmaXguJHRoaXMtPmFkZExpbmVCcmVha3MoJHRleHQsICR3aWR0aCk7CiR0ZXh0ID0gcnRyaW0oJHRleHQsICJcbiIpLigkbWF0Y2hlc1sxXSA/PyAnJyk7CgppZiAoISRjdXJyZW50TGluZUxlbmd0aCAmJiAnJyAhPT0gJGN1cnJlbnQgJiYgIlxuIiAhPT0gc3Vic3RyKCRjdXJyZW50LCAtMSkpIHsKJHRleHQgPSAiXG4iLiR0ZXh0Owp9CgokbGluZXMgPSBleHBsb2RlKCJcbiIsICR0ZXh0KTsKCmZvcmVhY2ggKCRsaW5lcyBhcyAkbGluZSkgewokY3VycmVudExpbmVMZW5ndGggKz0gXHN0cmxlbigkbGluZSk7CmlmICgkd2lkdGggPD0gJGN1cnJlbnRMaW5lTGVuZ3RoKSB7CiRjdXJyZW50TGluZUxlbmd0aCA9IDA7Cn0KfQoKaWYgKCR0aGlzLT5pc0RlY29yYXRlZCgpKSB7CmZvcmVhY2ggKCRsaW5lcyBhcyAkaSA9PiAkbGluZSkgewokbGluZXNbJGldID0gJHRoaXMtPnN0eWxlU3RhY2stPmdldEN1cnJlbnQoKS0+YXBwbHkoJGxpbmUpOwp9Cn0KCnJldHVybiBpbXBsb2RlKCJcbiIsICRsaW5lcyk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gYWRkTGluZUJyZWFrcyhzdHJpbmcgJHRleHQsIGludCAkd2lkdGgpOiBzdHJpbmcKewokZW5jb2RpbmcgPSBtYl9kZXRlY3RfZW5jb2RpbmcoJHRleHQsIG51bGwsIHRydWUpID86ICdVVEYtOCc7CgpyZXR1cm4gYigkdGV4dCktPnRvQ29kZVBvaW50U3RyaW5nKCRlbmNvZGluZyktPndvcmR3cmFwKCR3aWR0aCwgIlxuIiwgdHJ1ZSktPnRvQnl0ZVN0cmluZygkZW5jb2RpbmcpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlcjsKCgoKCgoKaW50ZXJmYWNlIE91dHB1dEZvcm1hdHRlckludGVyZmFjZQp7CgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZWNvcmF0ZWQoYm9vbCAkZGVjb3JhdGVkKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGVjb3JhdGVkKCk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U3R5bGUoc3RyaW5nICRuYW1lLCBPdXRwdXRGb3JtYXR0ZXJTdHlsZUludGVyZmFjZSAkc3R5bGUpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzU3R5bGUoc3RyaW5nICRuYW1lKTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3R5bGUoc3RyaW5nICRuYW1lKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZvcm1hdCg/c3RyaW5nICRtZXNzYWdlKTsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29sb3I7CgoKCgoKCmNsYXNzIE91dHB1dEZvcm1hdHRlclN0eWxlIGltcGxlbWVudHMgT3V0cHV0Rm9ybWF0dGVyU3R5bGVJbnRlcmZhY2UKewpwcml2YXRlICRjb2xvcjsKcHJpdmF0ZSAkZm9yZWdyb3VuZDsKcHJpdmF0ZSAkYmFja2dyb3VuZDsKcHJpdmF0ZSAkb3B0aW9uczsKcHJpdmF0ZSAkaHJlZjsKcHJpdmF0ZSAkaGFuZGxlc0hyZWZHcmFjZWZ1bGx5OwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9zdHJpbmcgJGZvcmVncm91bmQgPSBudWxsLCA/c3RyaW5nICRiYWNrZ3JvdW5kID0gbnVsbCwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokdGhpcy0+Y29sb3IgPSBuZXcgQ29sb3IoJHRoaXMtPmZvcmVncm91bmQgPSAkZm9yZWdyb3VuZCA/OiAnJywgJHRoaXMtPmJhY2tncm91bmQgPSAkYmFja2dyb3VuZCA/OiAnJywgJHRoaXMtPm9wdGlvbnMgPSAkb3B0aW9ucyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRGb3JlZ3JvdW5kKD9zdHJpbmcgJGNvbG9yID0gbnVsbCkKewokdGhpcy0+Y29sb3IgPSBuZXcgQ29sb3IoJHRoaXMtPmZvcmVncm91bmQgPSAkY29sb3IgPzogJycsICR0aGlzLT5iYWNrZ3JvdW5kLCAkdGhpcy0+b3B0aW9ucyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRCYWNrZ3JvdW5kKD9zdHJpbmcgJGNvbG9yID0gbnVsbCkKewokdGhpcy0+Y29sb3IgPSBuZXcgQ29sb3IoJHRoaXMtPmZvcmVncm91bmQsICR0aGlzLT5iYWNrZ3JvdW5kID0gJGNvbG9yID86ICcnLCAkdGhpcy0+b3B0aW9ucyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRIcmVmKHN0cmluZyAkdXJsKTogdm9pZAp7CiR0aGlzLT5ocmVmID0gJHVybDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE9wdGlvbihzdHJpbmcgJG9wdGlvbikKewokdGhpcy0+b3B0aW9uc1tdID0gJG9wdGlvbjsKJHRoaXMtPmNvbG9yID0gbmV3IENvbG9yKCR0aGlzLT5mb3JlZ3JvdW5kLCAkdGhpcy0+YmFja2dyb3VuZCwgJHRoaXMtPm9wdGlvbnMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdW5zZXRPcHRpb24oc3RyaW5nICRvcHRpb24pCnsKJHBvcyA9IGFycmF5X3NlYXJjaCgkb3B0aW9uLCAkdGhpcy0+b3B0aW9ucyk7CmlmIChmYWxzZSAhPT0gJHBvcykgewp1bnNldCgkdGhpcy0+b3B0aW9uc1skcG9zXSk7Cn0KCiR0aGlzLT5jb2xvciA9IG5ldyBDb2xvcigkdGhpcy0+Zm9yZWdyb3VuZCwgJHRoaXMtPmJhY2tncm91bmQsICR0aGlzLT5vcHRpb25zKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE9wdGlvbnMoYXJyYXkgJG9wdGlvbnMpCnsKJHRoaXMtPmNvbG9yID0gbmV3IENvbG9yKCR0aGlzLT5mb3JlZ3JvdW5kLCAkdGhpcy0+YmFja2dyb3VuZCwgJHRoaXMtPm9wdGlvbnMgPSAkb3B0aW9ucyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhcHBseShzdHJpbmcgJHRleHQpCnsKaWYgKG51bGwgPT09ICR0aGlzLT5oYW5kbGVzSHJlZkdyYWNlZnVsbHkpIHsKJHRoaXMtPmhhbmRsZXNIcmVmR3JhY2VmdWxseSA9ICdKZXRCcmFpbnMtSmVkaVRlcm0nICE9PSBnZXRlbnYoJ1RFUk1JTkFMX0VNVUxBVE9SJykKJiYgKCFnZXRlbnYoJ0tPTlNPTEVfVkVSU0lPTicpIHx8IChpbnQpIGdldGVudignS09OU09MRV9WRVJTSU9OJykgPiAyMDExMDApCiYmICFpc3NldCgkX1NFUlZFUlsnSURFQV9JTklUSUFMX0RJUkVDVE9SWSddKTsKfQoKaWYgKG51bGwgIT09ICR0aGlzLT5ocmVmICYmICR0aGlzLT5oYW5kbGVzSHJlZkdyYWNlZnVsbHkpIHsKJHRleHQgPSAiXDAzM104OzskdGhpcy0+aHJlZlwwMzNcXCR0ZXh0XDAzM104OztcMDMzXFwiOwp9CgpyZXR1cm4gJHRoaXMtPmNvbG9yLT5hcHBseSgkdGV4dCk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyOwoKCgoKCgppbnRlcmZhY2UgT3V0cHV0Rm9ybWF0dGVyU3R5bGVJbnRlcmZhY2UKewoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Rm9yZWdyb3VuZCg/c3RyaW5nICRjb2xvciA9IG51bGwpOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEJhY2tncm91bmQoP3N0cmluZyAkY29sb3IgPSBudWxsKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRPcHRpb24oc3RyaW5nICRvcHRpb24pOwoKCgoKcHVibGljIGZ1bmN0aW9uIHVuc2V0T3B0aW9uKHN0cmluZyAkb3B0aW9uKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRPcHRpb25zKGFycmF5ICRvcHRpb25zKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFwcGx5KHN0cmluZyAkdGV4dCk7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbnRyYWN0c1xTZXJ2aWNlXFJlc2V0SW50ZXJmYWNlOwoKCgoKY2xhc3MgT3V0cHV0Rm9ybWF0dGVyU3R5bGVTdGFjayBpbXBsZW1lbnRzIFJlc2V0SW50ZXJmYWNlCnsKCgoKcHJpdmF0ZSAkc3R5bGVzOwoKcHJpdmF0ZSAkZW1wdHlTdHlsZTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/T3V0cHV0Rm9ybWF0dGVyU3R5bGVJbnRlcmZhY2UgJGVtcHR5U3R5bGUgPSBudWxsKQp7CiR0aGlzLT5lbXB0eVN0eWxlID0gJGVtcHR5U3R5bGUgPz8gbmV3IE91dHB1dEZvcm1hdHRlclN0eWxlKCk7CiR0aGlzLT5yZXNldCgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzZXQoKQp7CiR0aGlzLT5zdHlsZXMgPSBbXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHB1c2goT3V0cHV0Rm9ybWF0dGVyU3R5bGVJbnRlcmZhY2UgJHN0eWxlKQp7CiR0aGlzLT5zdHlsZXNbXSA9ICRzdHlsZTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwb3AoP091dHB1dEZvcm1hdHRlclN0eWxlSW50ZXJmYWNlICRzdHlsZSA9IG51bGwpCnsKaWYgKGVtcHR5KCR0aGlzLT5zdHlsZXMpKSB7CnJldHVybiAkdGhpcy0+ZW1wdHlTdHlsZTsKfQoKaWYgKG51bGwgPT09ICRzdHlsZSkgewpyZXR1cm4gYXJyYXlfcG9wKCR0aGlzLT5zdHlsZXMpOwp9Cgpmb3JlYWNoIChhcnJheV9yZXZlcnNlKCR0aGlzLT5zdHlsZXMsIHRydWUpIGFzICRpbmRleCA9PiAkc3RhY2tlZFN0eWxlKSB7CmlmICgkc3R5bGUtPmFwcGx5KCcnKSA9PT0gJHN0YWNrZWRTdHlsZS0+YXBwbHkoJycpKSB7CiR0aGlzLT5zdHlsZXMgPSBcYXJyYXlfc2xpY2UoJHRoaXMtPnN0eWxlcywgMCwgJGluZGV4KTsKCnJldHVybiAkc3RhY2tlZFN0eWxlOwp9Cn0KCnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0luY29ycmVjdGx5IG5lc3RlZCBzdHlsZSB0YWcgZm91bmQuJyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEN1cnJlbnQoKQp7CmlmIChlbXB0eSgkdGhpcy0+c3R5bGVzKSkgewpyZXR1cm4gJHRoaXMtPmVtcHR5U3R5bGU7Cn0KCnJldHVybiAkdGhpcy0+c3R5bGVzW1xjb3VudCgkdGhpcy0+c3R5bGVzKSAtIDFdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RW1wdHlTdHlsZShPdXRwdXRGb3JtYXR0ZXJTdHlsZUludGVyZmFjZSAkZW1wdHlTdHlsZSkKewokdGhpcy0+ZW1wdHlTdHlsZSA9ICRlbXB0eVN0eWxlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RW1wdHlTdHlsZSgpCnsKcmV0dXJuICR0aGlzLT5lbXB0eVN0eWxlOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlcjsKCgoKCgoKaW50ZXJmYWNlIFdyYXBwYWJsZU91dHB1dEZvcm1hdHRlckludGVyZmFjZSBleHRlbmRzIE91dHB1dEZvcm1hdHRlckludGVyZmFjZQp7CgoKCnB1YmxpYyBmdW5jdGlvbiBmb3JtYXRBbmRXcmFwKD9zdHJpbmcgJG1lc3NhZ2UsIGludCAkd2lkdGgpOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXI7CgoKCgoKCgoKY2xhc3MgRGVidWdGb3JtYXR0ZXJIZWxwZXIgZXh0ZW5kcyBIZWxwZXIKewpwcml2YXRlIGNvbnN0IENPTE9SUyA9IFsnYmxhY2snLCAncmVkJywgJ2dyZWVuJywgJ3llbGxvdycsICdibHVlJywgJ21hZ2VudGEnLCAnY3lhbicsICd3aGl0ZScsICdkZWZhdWx0J107CnByaXZhdGUgJHN0YXJ0ZWQgPSBbXTsKcHJpdmF0ZSAkY291bnQgPSAtMTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHN0YXJ0KHN0cmluZyAkaWQsIHN0cmluZyAkbWVzc2FnZSwgc3RyaW5nICRwcmVmaXggPSAnUlVOJykKewokdGhpcy0+c3RhcnRlZFskaWRdID0gWydib3JkZXInID0+ICsrJHRoaXMtPmNvdW50ICUgXGNvdW50KHNlbGY6OkNPTE9SUyldOwoKcmV0dXJuIHNwcmludGYoIiVzPGJnPWJsdWU7Zmc9d2hpdGU+ICVzIDwvPiA8Zmc9Ymx1ZT4lczwvPlxuIiwgJHRoaXMtPmdldEJvcmRlcigkaWQpLCAkcHJlZml4LCAkbWVzc2FnZSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHByb2dyZXNzKHN0cmluZyAkaWQsIHN0cmluZyAkYnVmZmVyLCBib29sICRlcnJvciA9IGZhbHNlLCBzdHJpbmcgJHByZWZpeCA9ICdPVVQnLCBzdHJpbmcgJGVycm9yUHJlZml4ID0gJ0VSUicpCnsKJG1lc3NhZ2UgPSAnJzsKCmlmICgkZXJyb3IpIHsKaWYgKGlzc2V0KCR0aGlzLT5zdGFydGVkWyRpZF1bJ291dCddKSkgewokbWVzc2FnZSAuPSAiXG4iOwp1bnNldCgkdGhpcy0+c3RhcnRlZFskaWRdWydvdXQnXSk7Cn0KaWYgKCFpc3NldCgkdGhpcy0+c3RhcnRlZFskaWRdWydlcnInXSkpIHsKJG1lc3NhZ2UgLj0gc3ByaW50ZignJXM8Ymc9cmVkO2ZnPXdoaXRlPiAlcyA8Lz4gJywgJHRoaXMtPmdldEJvcmRlcigkaWQpLCAkZXJyb3JQcmVmaXgpOwokdGhpcy0+c3RhcnRlZFskaWRdWydlcnInXSA9IHRydWU7Cn0KCiRtZXNzYWdlIC49IHN0cl9yZXBsYWNlKCJcbiIsIHNwcmludGYoIlxuJXM8Ymc9cmVkO2ZnPXdoaXRlPiAlcyA8Lz4gIiwgJHRoaXMtPmdldEJvcmRlcigkaWQpLCAkZXJyb3JQcmVmaXgpLCAkYnVmZmVyKTsKfSBlbHNlIHsKaWYgKGlzc2V0KCR0aGlzLT5zdGFydGVkWyRpZF1bJ2VyciddKSkgewokbWVzc2FnZSAuPSAiXG4iOwp1bnNldCgkdGhpcy0+c3RhcnRlZFskaWRdWydlcnInXSk7Cn0KaWYgKCFpc3NldCgkdGhpcy0+c3RhcnRlZFskaWRdWydvdXQnXSkpIHsKJG1lc3NhZ2UgLj0gc3ByaW50ZignJXM8Ymc9Z3JlZW47Zmc9d2hpdGU+ICVzIDwvPiAnLCAkdGhpcy0+Z2V0Qm9yZGVyKCRpZCksICRwcmVmaXgpOwokdGhpcy0+c3RhcnRlZFskaWRdWydvdXQnXSA9IHRydWU7Cn0KCiRtZXNzYWdlIC49IHN0cl9yZXBsYWNlKCJcbiIsIHNwcmludGYoIlxuJXM8Ymc9Z3JlZW47Zmc9d2hpdGU+ICVzIDwvPiAiLCAkdGhpcy0+Z2V0Qm9yZGVyKCRpZCksICRwcmVmaXgpLCAkYnVmZmVyKTsKfQoKcmV0dXJuICRtZXNzYWdlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzdG9wKHN0cmluZyAkaWQsIHN0cmluZyAkbWVzc2FnZSwgYm9vbCAkc3VjY2Vzc2Z1bCwgc3RyaW5nICRwcmVmaXggPSAnUkVTJykKewokdHJhaWxpbmdFT0wgPSBpc3NldCgkdGhpcy0+c3RhcnRlZFskaWRdWydvdXQnXSkgfHwgaXNzZXQoJHRoaXMtPnN0YXJ0ZWRbJGlkXVsnZXJyJ10pID8gIlxuIiA6ICcnOwoKaWYgKCRzdWNjZXNzZnVsKSB7CnJldHVybiBzcHJpbnRmKCIlcyVzPGJnPWdyZWVuO2ZnPXdoaXRlPiAlcyA8Lz4gPGZnPWdyZWVuPiVzPC8+XG4iLCAkdHJhaWxpbmdFT0wsICR0aGlzLT5nZXRCb3JkZXIoJGlkKSwgJHByZWZpeCwgJG1lc3NhZ2UpOwp9CgokbWVzc2FnZSA9IHNwcmludGYoIiVzJXM8Ymc9cmVkO2ZnPXdoaXRlPiAlcyA8Lz4gPGZnPXJlZD4lczwvPlxuIiwgJHRyYWlsaW5nRU9MLCAkdGhpcy0+Z2V0Qm9yZGVyKCRpZCksICRwcmVmaXgsICRtZXNzYWdlKTsKCnVuc2V0KCR0aGlzLT5zdGFydGVkWyRpZF1bJ291dCddLCAkdGhpcy0+c3RhcnRlZFskaWRdWydlcnInXSk7CgpyZXR1cm4gJG1lc3NhZ2U7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0Qm9yZGVyKHN0cmluZyAkaWQpOiBzdHJpbmcKewpyZXR1cm4gc3ByaW50ZignPGJnPSVzPiA8Lz4nLCBzZWxmOjpDT0xPUlNbJHRoaXMtPnN0YXJ0ZWRbJGlkXVsnYm9yZGVyJ11dKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKQp7CnJldHVybiAnZGVidWdfZm9ybWF0dGVyJzsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxEZXNjcmlwdG9yXERlc2NyaXB0b3JJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXERlc2NyaXB0b3JcSnNvbkRlc2NyaXB0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXERlc2NyaXB0b3JcTWFya2Rvd25EZXNjcmlwdG9yOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxEZXNjcmlwdG9yXFRleHREZXNjcmlwdG9yOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxEZXNjcmlwdG9yXFhtbERlc2NyaXB0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCmNsYXNzIERlc2NyaXB0b3JIZWxwZXIgZXh0ZW5kcyBIZWxwZXIKewoKCgpwcml2YXRlICRkZXNjcmlwdG9ycyA9IFtdOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKewokdGhpcwotPnJlZ2lzdGVyKCd0eHQnLCBuZXcgVGV4dERlc2NyaXB0b3IoKSkKLT5yZWdpc3RlcigneG1sJywgbmV3IFhtbERlc2NyaXB0b3IoKSkKLT5yZWdpc3RlcignanNvbicsIG5ldyBKc29uRGVzY3JpcHRvcigpKQotPnJlZ2lzdGVyKCdtZCcsIG5ldyBNYXJrZG93bkRlc2NyaXB0b3IoKSkKOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGVzY3JpYmUoT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsID9vYmplY3QgJG9iamVjdCwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokb3B0aW9ucyA9IGFycmF5X21lcmdlKFsKJ3Jhd190ZXh0JyA9PiBmYWxzZSwKJ2Zvcm1hdCcgPT4gJ3R4dCcsCl0sICRvcHRpb25zKTsKCmlmICghaXNzZXQoJHRoaXMtPmRlc2NyaXB0b3JzWyRvcHRpb25zWydmb3JtYXQnXV0pKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVW5zdXBwb3J0ZWQgZm9ybWF0ICIlcyIuJywgJG9wdGlvbnNbJ2Zvcm1hdCddKSk7Cn0KCiRkZXNjcmlwdG9yID0gJHRoaXMtPmRlc2NyaXB0b3JzWyRvcHRpb25zWydmb3JtYXQnXV07CiRkZXNjcmlwdG9yLT5kZXNjcmliZSgkb3V0cHV0LCAkb2JqZWN0LCAkb3B0aW9ucyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlZ2lzdGVyKHN0cmluZyAkZm9ybWF0LCBEZXNjcmlwdG9ySW50ZXJmYWNlICRkZXNjcmlwdG9yKQp7CiR0aGlzLT5kZXNjcmlwdG9yc1skZm9ybWF0XSA9ICRkZXNjcmlwdG9yOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpCnsKcmV0dXJuICdkZXNjcmlwdG9yJzsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEZvcm1hdHMoKTogYXJyYXkKewpyZXR1cm4gYXJyYXlfa2V5cygkdGhpcy0+ZGVzY3JpcHRvcnMpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxWYXJEdW1wZXJcQ2xvbmVyXENsb25lckludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFZhckR1bXBlclxDbG9uZXJcVmFyQ2xvbmVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcVmFyRHVtcGVyXER1bXBlclxDbGlEdW1wZXI7CgoKCgpmaW5hbCBjbGFzcyBEdW1wZXIKewpwcml2YXRlICRvdXRwdXQ7CnByaXZhdGUgJGR1bXBlcjsKcHJpdmF0ZSAkY2xvbmVyOwpwcml2YXRlICRoYW5kbGVyOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCA/Q2xpRHVtcGVyICRkdW1wZXIgPSBudWxsLCA/Q2xvbmVySW50ZXJmYWNlICRjbG9uZXIgPSBudWxsKQp7CiR0aGlzLT5vdXRwdXQgPSAkb3V0cHV0OwokdGhpcy0+ZHVtcGVyID0gJGR1bXBlcjsKJHRoaXMtPmNsb25lciA9ICRjbG9uZXI7CgppZiAoY2xhc3NfZXhpc3RzKENsaUR1bXBlcjo6Y2xhc3MpKSB7CiR0aGlzLT5oYW5kbGVyID0gZnVuY3Rpb24gKCR2YXIpOiBzdHJpbmcgewokZHVtcGVyID0gJHRoaXMtPmR1bXBlciA/PyAkdGhpcy0+ZHVtcGVyID0gbmV3IENsaUR1bXBlcihudWxsLCBudWxsLCBDbGlEdW1wZXI6OkRVTVBfTElHSFRfQVJSQVkgfCBDbGlEdW1wZXI6OkRVTVBfQ09NTUFfU0VQQVJBVE9SKTsKJGR1bXBlci0+c2V0Q29sb3JzKCR0aGlzLT5vdXRwdXQtPmlzRGVjb3JhdGVkKCkpOwoKcmV0dXJuIHJ0cmltKCRkdW1wZXItPmR1bXAoKCR0aGlzLT5jbG9uZXIgPz8gJHRoaXMtPmNsb25lciA9IG5ldyBWYXJDbG9uZXIoKSktPmNsb25lVmFyKCR2YXIpLT53aXRoUmVmSGFuZGxlcyhmYWxzZSksIHRydWUpKTsKfTsKfSBlbHNlIHsKJHRoaXMtPmhhbmRsZXIgPSBmdW5jdGlvbiAoJHZhcik6IHN0cmluZyB7CnN3aXRjaCAodHJ1ZSkgewpjYXNlIG51bGwgPT09ICR2YXI6CnJldHVybiAnbnVsbCc7CmNhc2UgdHJ1ZSA9PT0gJHZhcjoKcmV0dXJuICd0cnVlJzsKY2FzZSBmYWxzZSA9PT0gJHZhcjoKcmV0dXJuICdmYWxzZSc7CmNhc2UgXGlzX3N0cmluZygkdmFyKToKcmV0dXJuICciJy4kdmFyLiciJzsKZGVmYXVsdDoKcmV0dXJuIHJ0cmltKHByaW50X3IoJHZhciwgdHJ1ZSkpOwp9Cn07Cn0KfQoKcHVibGljIGZ1bmN0aW9uIF9faW52b2tlKCR2YXIpOiBzdHJpbmcKewpyZXR1cm4gKCR0aGlzLT5oYW5kbGVyKSgkdmFyKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyOwoKCgoKCgpjbGFzcyBGb3JtYXR0ZXJIZWxwZXIgZXh0ZW5kcyBIZWxwZXIKewoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmb3JtYXRTZWN0aW9uKHN0cmluZyAkc2VjdGlvbiwgc3RyaW5nICRtZXNzYWdlLCBzdHJpbmcgJHN0eWxlID0gJ2luZm8nKQp7CnJldHVybiBzcHJpbnRmKCc8JXM+WyVzXTwvJXM+ICVzJywgJHN0eWxlLCAkc2VjdGlvbiwgJHN0eWxlLCAkbWVzc2FnZSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZm9ybWF0QmxvY2soJG1lc3NhZ2VzLCBzdHJpbmcgJHN0eWxlLCBib29sICRsYXJnZSA9IGZhbHNlKQp7CmlmICghXGlzX2FycmF5KCRtZXNzYWdlcykpIHsKJG1lc3NhZ2VzID0gWyRtZXNzYWdlc107Cn0KCiRsZW4gPSAwOwokbGluZXMgPSBbXTsKZm9yZWFjaCAoJG1lc3NhZ2VzIGFzICRtZXNzYWdlKSB7CiRtZXNzYWdlID0gT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJG1lc3NhZ2UpOwokbGluZXNbXSA9IHNwcmludGYoJGxhcmdlID8gJyAgJXMgICcgOiAnICVzICcsICRtZXNzYWdlKTsKJGxlbiA9IG1heChzZWxmOjp3aWR0aCgkbWVzc2FnZSkgKyAoJGxhcmdlID8gNCA6IDIpLCAkbGVuKTsKfQoKJG1lc3NhZ2VzID0gJGxhcmdlID8gW3N0cl9yZXBlYXQoJyAnLCAkbGVuKV0gOiBbXTsKZm9yICgkaSA9IDA7IGlzc2V0KCRsaW5lc1skaV0pOyArKyRpKSB7CiRtZXNzYWdlc1tdID0gJGxpbmVzWyRpXS5zdHJfcmVwZWF0KCcgJywgJGxlbiAtIHNlbGY6OndpZHRoKCRsaW5lc1skaV0pKTsKfQppZiAoJGxhcmdlKSB7CiRtZXNzYWdlc1tdID0gc3RyX3JlcGVhdCgnICcsICRsZW4pOwp9Cgpmb3IgKCRpID0gMDsgaXNzZXQoJG1lc3NhZ2VzWyRpXSk7ICsrJGkpIHsKJG1lc3NhZ2VzWyRpXSA9IHNwcmludGYoJzwlcz4lczwvJXM+JywgJHN0eWxlLCAkbWVzc2FnZXNbJGldLCAkc3R5bGUpOwp9CgpyZXR1cm4gaW1wbG9kZSgiXG4iLCAkbWVzc2FnZXMpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB0cnVuY2F0ZShzdHJpbmcgJG1lc3NhZ2UsIGludCAkbGVuZ3RoLCBzdHJpbmcgJHN1ZmZpeCA9ICcuLi4nKQp7CiRjb21wdXRlZExlbmd0aCA9ICRsZW5ndGggLSBzZWxmOjp3aWR0aCgkc3VmZml4KTsKCmlmICgkY29tcHV0ZWRMZW5ndGggPiBzZWxmOjp3aWR0aCgkbWVzc2FnZSkpIHsKcmV0dXJuICRtZXNzYWdlOwp9CgpyZXR1cm4gc2VsZjo6c3Vic3RyKCRtZXNzYWdlLCAwLCAkbGVuZ3RoKS4kc3VmZml4Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpCnsKcmV0dXJuICdmb3JtYXR0ZXInOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcVW5pY29kZVN0cmluZzsKCgoKCgoKYWJzdHJhY3QgY2xhc3MgSGVscGVyIGltcGxlbWVudHMgSGVscGVySW50ZXJmYWNlCnsKcHJvdGVjdGVkICRoZWxwZXJTZXQgPSBudWxsOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEhlbHBlclNldCg/SGVscGVyU2V0ICRoZWxwZXJTZXQgPSBudWxsKQp7CiR0aGlzLT5oZWxwZXJTZXQgPSAkaGVscGVyU2V0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SGVscGVyU2V0KCkKewpyZXR1cm4gJHRoaXMtPmhlbHBlclNldDsKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3RybGVuKD9zdHJpbmcgJHN0cmluZykKewp0cmlnZ2VyX2RlcHJlY2F0aW9uKCdzeW1mb255L2NvbnNvbGUnLCAnNS4zJywgJ01ldGhvZCAiJXMoKSIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIFN5bWZvbnkgNi4wLiBVc2UgSGVscGVyOjp3aWR0aCgpIG9yIEhlbHBlcjo6bGVuZ3RoKCkgaW5zdGVhZC4nLCBfX01FVEhPRF9fKTsKCnJldHVybiBzZWxmOjp3aWR0aCgkc3RyaW5nKTsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gd2lkdGgoP3N0cmluZyAkc3RyaW5nKTogaW50CnsKJHN0cmluZyA/PyAkc3RyaW5nID0gJyc7CgppZiAocHJlZ19tYXRjaCgnLy91JywgJHN0cmluZykpIHsKcmV0dXJuIChuZXcgVW5pY29kZVN0cmluZygkc3RyaW5nKSktPndpZHRoKGZhbHNlKTsKfQoKaWYgKGZhbHNlID09PSAkZW5jb2RpbmcgPSBtYl9kZXRlY3RfZW5jb2RpbmcoJHN0cmluZywgbnVsbCwgdHJ1ZSkpIHsKcmV0dXJuIFxzdHJsZW4oJHN0cmluZyk7Cn0KCnJldHVybiBtYl9zdHJ3aWR0aCgkc3RyaW5nLCAkZW5jb2RpbmcpOwp9CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBsZW5ndGgoP3N0cmluZyAkc3RyaW5nKTogaW50CnsKJHN0cmluZyA/PyAkc3RyaW5nID0gJyc7CgppZiAocHJlZ19tYXRjaCgnLy91JywgJHN0cmluZykpIHsKcmV0dXJuIChuZXcgVW5pY29kZVN0cmluZygkc3RyaW5nKSktPmxlbmd0aCgpOwp9CgppZiAoZmFsc2UgPT09ICRlbmNvZGluZyA9IG1iX2RldGVjdF9lbmNvZGluZygkc3RyaW5nLCBudWxsLCB0cnVlKSkgewpyZXR1cm4gXHN0cmxlbigkc3RyaW5nKTsKfQoKcmV0dXJuIG1iX3N0cmxlbigkc3RyaW5nLCAkZW5jb2RpbmcpOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3Vic3RyKD9zdHJpbmcgJHN0cmluZywgaW50ICRmcm9tLCA/aW50ICRsZW5ndGggPSBudWxsKQp7CiRzdHJpbmcgPz8gJHN0cmluZyA9ICcnOwoKaWYgKGZhbHNlID09PSAkZW5jb2RpbmcgPSBtYl9kZXRlY3RfZW5jb2RpbmcoJHN0cmluZywgbnVsbCwgdHJ1ZSkpIHsKcmV0dXJuIHN1YnN0cigkc3RyaW5nLCAkZnJvbSwgJGxlbmd0aCk7Cn0KCnJldHVybiBtYl9zdWJzdHIoJHN0cmluZywgJGZyb20sICRsZW5ndGgsICRlbmNvZGluZyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZm9ybWF0VGltZSgkc2VjcykKewpzdGF0aWMgJHRpbWVGb3JtYXRzID0gWwpbMCwgJzwgMSBzZWMnXSwKWzEsICcxIHNlYyddLApbMiwgJ3NlY3MnLCAxXSwKWzYwLCAnMSBtaW4nXSwKWzEyMCwgJ21pbnMnLCA2MF0sClszNjAwLCAnMSBociddLApbNzIwMCwgJ2hycycsIDM2MDBdLApbODY0MDAsICcxIGRheSddLApbMTcyODAwLCAnZGF5cycsIDg2NDAwXSwKXTsKCmZvcmVhY2ggKCR0aW1lRm9ybWF0cyBhcyAkaW5kZXggPT4gJGZvcm1hdCkgewppZiAoJHNlY3MgPj0gJGZvcm1hdFswXSkgewppZiAoKGlzc2V0KCR0aW1lRm9ybWF0c1skaW5kZXggKyAxXSkgJiYgJHNlY3MgPCAkdGltZUZvcm1hdHNbJGluZGV4ICsgMV1bMF0pCnx8ICRpbmRleCA9PSBcY291bnQoJHRpbWVGb3JtYXRzKSAtIDEKKSB7CmlmICgyID09IFxjb3VudCgkZm9ybWF0KSkgewpyZXR1cm4gJGZvcm1hdFsxXTsKfQoKcmV0dXJuIGZsb29yKCRzZWNzIC8gJGZvcm1hdFsyXSkuJyAnLiRmb3JtYXRbMV07Cn0KfQp9Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZm9ybWF0TWVtb3J5KGludCAkbWVtb3J5KQp7CmlmICgkbWVtb3J5ID49IDEwMjQgKiAxMDI0ICogMTAyNCkgewpyZXR1cm4gc3ByaW50ZignJS4xZiBHaUInLCAkbWVtb3J5IC8gMTAyNCAvIDEwMjQgLyAxMDI0KTsKfQoKaWYgKCRtZW1vcnkgPj0gMTAyNCAqIDEwMjQpIHsKcmV0dXJuIHNwcmludGYoJyUuMWYgTWlCJywgJG1lbW9yeSAvIDEwMjQgLyAxMDI0KTsKfQoKaWYgKCRtZW1vcnkgPj0gMTAyNCkgewpyZXR1cm4gc3ByaW50ZignJWQgS2lCJywgJG1lbW9yeSAvIDEwMjQpOwp9CgpyZXR1cm4gc3ByaW50ZignJWQgQicsICRtZW1vcnkpOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN0cmxlbldpdGhvdXREZWNvcmF0aW9uKE91dHB1dEZvcm1hdHRlckludGVyZmFjZSAkZm9ybWF0dGVyLCA/c3RyaW5nICRzdHJpbmcpCnsKdHJpZ2dlcl9kZXByZWNhdGlvbignc3ltZm9ueS9jb25zb2xlJywgJzUuMycsICdNZXRob2QgIiVzKCkiIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBTeW1mb255IDYuMC4gVXNlIEhlbHBlcjo6cmVtb3ZlRGVjb3JhdGlvbigpIGluc3RlYWQuJywgX19NRVRIT0RfXyk7CgpyZXR1cm4gc2VsZjo6d2lkdGgoc2VsZjo6cmVtb3ZlRGVjb3JhdGlvbigkZm9ybWF0dGVyLCAkc3RyaW5nKSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVtb3ZlRGVjb3JhdGlvbihPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UgJGZvcm1hdHRlciwgP3N0cmluZyAkc3RyaW5nKQp7CiRpc0RlY29yYXRlZCA9ICRmb3JtYXR0ZXItPmlzRGVjb3JhdGVkKCk7CiRmb3JtYXR0ZXItPnNldERlY29yYXRlZChmYWxzZSk7Cgokc3RyaW5nID0gJGZvcm1hdHRlci0+Zm9ybWF0KCRzdHJpbmcgPz8gJycpOwoKJHN0cmluZyA9IHByZWdfcmVwbGFjZSgiL1wwMzNcW1tebV0qbS8iLCAnJywgJHN0cmluZyA/PyAnJyk7Cgokc3RyaW5nID0gcHJlZ19yZXBsYWNlKCcvXFwwMzNdODtbXjtdKjtbXlxcMDMzXSpcXDAzM1xcXFwvJywgJycsICRzdHJpbmcgPz8gJycpOwokZm9ybWF0dGVyLT5zZXREZWNvcmF0ZWQoJGlzRGVjb3JhdGVkKTsKCnJldHVybiAkc3RyaW5nOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCgoKCgoKaW50ZXJmYWNlIEhlbHBlckludGVyZmFjZQp7CgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRIZWxwZXJTZXQoP0hlbHBlclNldCAkaGVscGVyU2V0ID0gbnVsbCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRIZWxwZXJTZXQoKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKTsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwoKCgoKCgoKCmNsYXNzIEhlbHBlclNldCBpbXBsZW1lbnRzIFxJdGVyYXRvckFnZ3JlZ2F0ZQp7Cgpwcml2YXRlICRoZWxwZXJzID0gW107CnByaXZhdGUgJGNvbW1hbmQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJGhlbHBlcnMgPSBbXSkKewpmb3JlYWNoICgkaGVscGVycyBhcyAkYWxpYXMgPT4gJGhlbHBlcikgewokdGhpcy0+c2V0KCRoZWxwZXIsIFxpc19pbnQoJGFsaWFzKSA/IG51bGwgOiAkYWxpYXMpOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXQoSGVscGVySW50ZXJmYWNlICRoZWxwZXIsID9zdHJpbmcgJGFsaWFzID0gbnVsbCkKewokdGhpcy0+aGVscGVyc1skaGVscGVyLT5nZXROYW1lKCldID0gJGhlbHBlcjsKaWYgKG51bGwgIT09ICRhbGlhcykgewokdGhpcy0+aGVscGVyc1skYWxpYXNdID0gJGhlbHBlcjsKfQoKJGhlbHBlci0+c2V0SGVscGVyU2V0KCR0aGlzKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzKHN0cmluZyAkbmFtZSkKewpyZXR1cm4gaXNzZXQoJHRoaXMtPmhlbHBlcnNbJG5hbWVdKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXQoc3RyaW5nICRuYW1lKQp7CmlmICghJHRoaXMtPmhhcygkbmFtZSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgaGVscGVyICIlcyIgaXMgbm90IGRlZmluZWQuJywgJG5hbWUpKTsKfQoKcmV0dXJuICR0aGlzLT5oZWxwZXJzWyRuYW1lXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldENvbW1hbmQoP0NvbW1hbmQgJGNvbW1hbmQgPSBudWxsKQp7CnRyaWdnZXJfZGVwcmVjYXRpb24oJ3N5bWZvbnkvY29uc29sZScsICc1LjQnLCAnTWV0aG9kICIlcygpIiBpcyBkZXByZWNhdGVkLicsIF9fTUVUSE9EX18pOwoKJHRoaXMtPmNvbW1hbmQgPSAkY29tbWFuZDsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21tYW5kKCkKewp0cmlnZ2VyX2RlcHJlY2F0aW9uKCdzeW1mb255L2NvbnNvbGUnLCAnNS40JywgJ01ldGhvZCAiJXMoKSIgaXMgZGVwcmVjYXRlZC4nLCBfX01FVEhPRF9fKTsKCnJldHVybiAkdGhpcy0+Y29tbWFuZDsKfQoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBnZXRJdGVyYXRvcigpCnsKcmV0dXJuIG5ldyBcQXJyYXlJdGVyYXRvcigkdGhpcy0+aGVscGVycyk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRBd2FyZUludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CgoKCgoKCmFic3RyYWN0IGNsYXNzIElucHV0QXdhcmVIZWxwZXIgZXh0ZW5kcyBIZWxwZXIgaW1wbGVtZW50cyBJbnB1dEF3YXJlSW50ZXJmYWNlCnsKcHJvdGVjdGVkICRpbnB1dDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRJbnB1dChJbnB1dEludGVyZmFjZSAkaW5wdXQpCnsKJHRoaXMtPmlucHV0ID0gJGlucHV0Owp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxDb25zb2xlT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb25cUHJvY2Vzc0ZhaWxlZEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcUHJvY2VzczsKCgoKCgoKCgpjbGFzcyBQcm9jZXNzSGVscGVyIGV4dGVuZHMgSGVscGVyCnsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBydW4oT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsICRjbWQsID9zdHJpbmcgJGVycm9yID0gbnVsbCwgP2NhbGxhYmxlICRjYWxsYmFjayA9IG51bGwsIGludCAkdmVyYm9zaXR5ID0gT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfVkVSWV9WRVJCT1NFKTogUHJvY2Vzcwp7CmlmICghY2xhc3NfZXhpc3RzKFByb2Nlc3M6OmNsYXNzKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdUaGUgUHJvY2Vzc0hlbHBlciBjYW5ub3QgYmUgcnVuIGFzIHRoZSBQcm9jZXNzIGNvbXBvbmVudCBpcyBub3QgaW5zdGFsbGVkLiBUcnkgcnVubmluZyAiY29tcG9zZSByZXF1aXJlIHN5bWZvbnkvcHJvY2VzcyIuJyk7Cn0KCmlmICgkb3V0cHV0IGluc3RhbmNlb2YgQ29uc29sZU91dHB1dEludGVyZmFjZSkgewokb3V0cHV0ID0gJG91dHB1dC0+Z2V0RXJyb3JPdXRwdXQoKTsKfQoKJGZvcm1hdHRlciA9ICR0aGlzLT5nZXRIZWxwZXJTZXQoKS0+Z2V0KCdkZWJ1Z19mb3JtYXR0ZXInKTsKCmlmICgkY21kIGluc3RhbmNlb2YgUHJvY2VzcykgewokY21kID0gWyRjbWRdOwp9CgppZiAoIVxpc19hcnJheSgkY21kKSkgewp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKCdUaGUgImNvbW1hbmQiIGFyZ3VtZW50IG9mICIlcygpIiBtdXN0IGJlIGFuIGFycmF5IG9yIGEgIiVzIiBpbnN0YW5jZSwgIiVzIiBnaXZlbi4nLCBfX01FVEhPRF9fLCBQcm9jZXNzOjpjbGFzcywgZ2V0X2RlYnVnX3R5cGUoJGNtZCkpKTsKfQoKaWYgKFxpc19zdHJpbmcoJGNtZFswXSA/PyBudWxsKSkgewokcHJvY2VzcyA9IG5ldyBQcm9jZXNzKCRjbWQpOwokY21kID0gW107Cn0gZWxzZWlmICgoJGNtZFswXSA/PyBudWxsKSBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKJHByb2Nlc3MgPSAkY21kWzBdOwp1bnNldCgkY21kWzBdKTsKfSBlbHNlIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignSW52YWxpZCBjb21tYW5kIHByb3ZpZGVkIHRvICIlcygpIjogdGhlIGNvbW1hbmQgc2hvdWxkIGJlIGFuIGFycmF5IHdob3NlIGZpcnN0IGVsZW1lbnQgaXMgZWl0aGVyIHRoZSBwYXRoIHRvIHRoZSBiaW5hcnkgdG8gcnVuIG9yIGEgIlByb2Nlc3MiIG9iamVjdC4nLCBfX01FVEhPRF9fKSk7Cn0KCmlmICgkdmVyYm9zaXR5IDw9ICRvdXRwdXQtPmdldFZlcmJvc2l0eSgpKSB7CiRvdXRwdXQtPndyaXRlKCRmb3JtYXR0ZXItPnN0YXJ0KHNwbF9vYmplY3RfaGFzaCgkcHJvY2VzcyksICR0aGlzLT5lc2NhcGVTdHJpbmcoJHByb2Nlc3MtPmdldENvbW1hbmRMaW5lKCkpKSk7Cn0KCmlmICgkb3V0cHV0LT5pc0RlYnVnKCkpIHsKJGNhbGxiYWNrID0gJHRoaXMtPndyYXBDYWxsYmFjaygkb3V0cHV0LCAkcHJvY2VzcywgJGNhbGxiYWNrKTsKfQoKJHByb2Nlc3MtPnJ1bigkY2FsbGJhY2ssICRjbWQpOwoKaWYgKCR2ZXJib3NpdHkgPD0gJG91dHB1dC0+Z2V0VmVyYm9zaXR5KCkpIHsKJG1lc3NhZ2UgPSAkcHJvY2Vzcy0+aXNTdWNjZXNzZnVsKCkgPyAnQ29tbWFuZCByYW4gc3VjY2Vzc2Z1bGx5JyA6IHNwcmludGYoJyVzIENvbW1hbmQgZGlkIG5vdCBydW4gc3VjY2Vzc2Z1bGx5JywgJHByb2Nlc3MtPmdldEV4aXRDb2RlKCkpOwokb3V0cHV0LT53cml0ZSgkZm9ybWF0dGVyLT5zdG9wKHNwbF9vYmplY3RfaGFzaCgkcHJvY2VzcyksICRtZXNzYWdlLCAkcHJvY2Vzcy0+aXNTdWNjZXNzZnVsKCkpKTsKfQoKaWYgKCEkcHJvY2Vzcy0+aXNTdWNjZXNzZnVsKCkgJiYgbnVsbCAhPT0gJGVycm9yKSB7CiRvdXRwdXQtPndyaXRlbG4oc3ByaW50ZignPGVycm9yPiVzPC9lcnJvcj4nLCAkdGhpcy0+ZXNjYXBlU3RyaW5nKCRlcnJvcikpKTsKfQoKcmV0dXJuICRwcm9jZXNzOwp9CgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBtdXN0UnVuKE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCAkY21kLCA/c3RyaW5nICRlcnJvciA9IG51bGwsID9jYWxsYWJsZSAkY2FsbGJhY2sgPSBudWxsKTogUHJvY2Vzcwp7CiRwcm9jZXNzID0gJHRoaXMtPnJ1bigkb3V0cHV0LCAkY21kLCAkZXJyb3IsICRjYWxsYmFjayk7CgppZiAoISRwcm9jZXNzLT5pc1N1Y2Nlc3NmdWwoKSkgewp0aHJvdyBuZXcgUHJvY2Vzc0ZhaWxlZEV4Y2VwdGlvbigkcHJvY2Vzcyk7Cn0KCnJldHVybiAkcHJvY2VzczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyYXBDYWxsYmFjayhPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgUHJvY2VzcyAkcHJvY2VzcywgP2NhbGxhYmxlICRjYWxsYmFjayA9IG51bGwpOiBjYWxsYWJsZQp7CmlmICgkb3V0cHV0IGluc3RhbmNlb2YgQ29uc29sZU91dHB1dEludGVyZmFjZSkgewokb3V0cHV0ID0gJG91dHB1dC0+Z2V0RXJyb3JPdXRwdXQoKTsKfQoKJGZvcm1hdHRlciA9ICR0aGlzLT5nZXRIZWxwZXJTZXQoKS0+Z2V0KCdkZWJ1Z19mb3JtYXR0ZXInKTsKCnJldHVybiBmdW5jdGlvbiAoJHR5cGUsICRidWZmZXIpIHVzZSAoJG91dHB1dCwgJHByb2Nlc3MsICRjYWxsYmFjaywgJGZvcm1hdHRlcikgewokb3V0cHV0LT53cml0ZSgkZm9ybWF0dGVyLT5wcm9ncmVzcyhzcGxfb2JqZWN0X2hhc2goJHByb2Nlc3MpLCAkdGhpcy0+ZXNjYXBlU3RyaW5nKCRidWZmZXIpLCBQcm9jZXNzOjpFUlIgPT09ICR0eXBlKSk7CgppZiAobnVsbCAhPT0gJGNhbGxiYWNrKSB7CiRjYWxsYmFjaygkdHlwZSwgJGJ1ZmZlcik7Cn0KfTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBlc2NhcGVTdHJpbmcoc3RyaW5nICRzdHIpOiBzdHJpbmcKewpyZXR1cm4gc3RyX3JlcGxhY2UoJzwnLCAnXFw8JywgJHN0cik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCk6IHN0cmluZwp7CnJldHVybiAncHJvY2Vzcyc7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ3Vyc29yOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cTG9naWNFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxDb25zb2xlT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcQ29uc29sZVNlY3Rpb25PdXRwdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFRlcm1pbmFsOwoKCgoKCgoKZmluYWwgY2xhc3MgUHJvZ3Jlc3NCYXIKewpwdWJsaWMgY29uc3QgRk9STUFUX1ZFUkJPU0UgPSAndmVyYm9zZSc7CnB1YmxpYyBjb25zdCBGT1JNQVRfVkVSWV9WRVJCT1NFID0gJ3ZlcnlfdmVyYm9zZSc7CnB1YmxpYyBjb25zdCBGT1JNQVRfREVCVUcgPSAnZGVidWcnOwpwdWJsaWMgY29uc3QgRk9STUFUX05PUk1BTCA9ICdub3JtYWwnOwoKcHJpdmF0ZSBjb25zdCBGT1JNQVRfVkVSQk9TRV9OT01BWCA9ICd2ZXJib3NlX25vbWF4JzsKcHJpdmF0ZSBjb25zdCBGT1JNQVRfVkVSWV9WRVJCT1NFX05PTUFYID0gJ3ZlcnlfdmVyYm9zZV9ub21heCc7CnByaXZhdGUgY29uc3QgRk9STUFUX0RFQlVHX05PTUFYID0gJ2RlYnVnX25vbWF4JzsKcHJpdmF0ZSBjb25zdCBGT1JNQVRfTk9STUFMX05PTUFYID0gJ25vcm1hbF9ub21heCc7Cgpwcml2YXRlICRiYXJXaWR0aCA9IDI4Owpwcml2YXRlICRiYXJDaGFyOwpwcml2YXRlICRlbXB0eUJhckNoYXIgPSAnLSc7CnByaXZhdGUgJHByb2dyZXNzQ2hhciA9ICc+JzsKcHJpdmF0ZSAkZm9ybWF0Owpwcml2YXRlICRpbnRlcm5hbEZvcm1hdDsKcHJpdmF0ZSAkcmVkcmF3RnJlcSA9IDE7CnByaXZhdGUgJHdyaXRlQ291bnQ7CnByaXZhdGUgJGxhc3RXcml0ZVRpbWU7CnByaXZhdGUgJG1pblNlY29uZHNCZXR3ZWVuUmVkcmF3cyA9IDA7CnByaXZhdGUgJG1heFNlY29uZHNCZXR3ZWVuUmVkcmF3cyA9IDE7CnByaXZhdGUgJG91dHB1dDsKcHJpdmF0ZSAkc3RlcCA9IDA7CnByaXZhdGUgJG1heDsKcHJpdmF0ZSAkc3RhcnRUaW1lOwpwcml2YXRlICRzdGVwV2lkdGg7CnByaXZhdGUgJHBlcmNlbnQgPSAwLjA7CnByaXZhdGUgJG1lc3NhZ2VzID0gW107CnByaXZhdGUgJG92ZXJ3cml0ZSA9IHRydWU7CnByaXZhdGUgJHRlcm1pbmFsOwpwcml2YXRlICRwcmV2aW91c01lc3NhZ2U7CnByaXZhdGUgJGN1cnNvcjsKCnByaXZhdGUgc3RhdGljICRmb3JtYXR0ZXJzOwpwcml2YXRlIHN0YXRpYyAkZm9ybWF0czsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgaW50ICRtYXggPSAwLCBmbG9hdCAkbWluU2Vjb25kc0JldHdlZW5SZWRyYXdzID0gMSAvIDI1KQp7CmlmICgkb3V0cHV0IGluc3RhbmNlb2YgQ29uc29sZU91dHB1dEludGVyZmFjZSkgewokb3V0cHV0ID0gJG91dHB1dC0+Z2V0RXJyb3JPdXRwdXQoKTsKfQoKJHRoaXMtPm91dHB1dCA9ICRvdXRwdXQ7CiR0aGlzLT5zZXRNYXhTdGVwcygkbWF4KTsKJHRoaXMtPnRlcm1pbmFsID0gbmV3IFRlcm1pbmFsKCk7CgppZiAoMCA8ICRtaW5TZWNvbmRzQmV0d2VlblJlZHJhd3MpIHsKJHRoaXMtPnJlZHJhd0ZyZXEgPSBudWxsOwokdGhpcy0+bWluU2Vjb25kc0JldHdlZW5SZWRyYXdzID0gJG1pblNlY29uZHNCZXR3ZWVuUmVkcmF3czsKfQoKaWYgKCEkdGhpcy0+b3V0cHV0LT5pc0RlY29yYXRlZCgpKSB7CgokdGhpcy0+b3ZlcndyaXRlID0gZmFsc2U7CgoKJHRoaXMtPnJlZHJhd0ZyZXEgPSBudWxsOwp9CgokdGhpcy0+c3RhcnRUaW1lID0gdGltZSgpOwokdGhpcy0+Y3Vyc29yID0gbmV3IEN1cnNvcigkb3V0cHV0KTsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldFBsYWNlaG9sZGVyRm9ybWF0dGVyRGVmaW5pdGlvbihzdHJpbmcgJG5hbWUsIGNhbGxhYmxlICRjYWxsYWJsZSk6IHZvaWQKewppZiAoIXNlbGY6OiRmb3JtYXR0ZXJzKSB7CnNlbGY6OiRmb3JtYXR0ZXJzID0gc2VsZjo6aW5pdFBsYWNlaG9sZGVyRm9ybWF0dGVycygpOwp9CgpzZWxmOjokZm9ybWF0dGVyc1skbmFtZV0gPSAkY2FsbGFibGU7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRQbGFjZWhvbGRlckZvcm1hdHRlckRlZmluaXRpb24oc3RyaW5nICRuYW1lKTogP2NhbGxhYmxlCnsKaWYgKCFzZWxmOjokZm9ybWF0dGVycykgewpzZWxmOjokZm9ybWF0dGVycyA9IHNlbGY6OmluaXRQbGFjZWhvbGRlckZvcm1hdHRlcnMoKTsKfQoKcmV0dXJuIHNlbGY6OiRmb3JtYXR0ZXJzWyRuYW1lXSA/PyBudWxsOwp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0Rm9ybWF0RGVmaW5pdGlvbihzdHJpbmcgJG5hbWUsIHN0cmluZyAkZm9ybWF0KTogdm9pZAp7CmlmICghc2VsZjo6JGZvcm1hdHMpIHsKc2VsZjo6JGZvcm1hdHMgPSBzZWxmOjppbml0Rm9ybWF0cygpOwp9CgpzZWxmOjokZm9ybWF0c1skbmFtZV0gPSAkZm9ybWF0Owp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Rm9ybWF0RGVmaW5pdGlvbihzdHJpbmcgJG5hbWUpOiA/c3RyaW5nCnsKaWYgKCFzZWxmOjokZm9ybWF0cykgewpzZWxmOjokZm9ybWF0cyA9IHNlbGY6OmluaXRGb3JtYXRzKCk7Cn0KCnJldHVybiBzZWxmOjokZm9ybWF0c1skbmFtZV0gPz8gbnVsbDsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRNZXNzYWdlKHN0cmluZyAkbWVzc2FnZSwgc3RyaW5nICRuYW1lID0gJ21lc3NhZ2UnKQp7CiR0aGlzLT5tZXNzYWdlc1skbmFtZV0gPSAkbWVzc2FnZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE1lc3NhZ2Uoc3RyaW5nICRuYW1lID0gJ21lc3NhZ2UnKQp7CnJldHVybiAkdGhpcy0+bWVzc2FnZXNbJG5hbWVdID8/IG51bGw7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTdGFydFRpbWUoKTogaW50CnsKcmV0dXJuICR0aGlzLT5zdGFydFRpbWU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRNYXhTdGVwcygpOiBpbnQKewpyZXR1cm4gJHRoaXMtPm1heDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFByb2dyZXNzKCk6IGludAp7CnJldHVybiAkdGhpcy0+c3RlcDsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRTdGVwV2lkdGgoKTogaW50CnsKcmV0dXJuICR0aGlzLT5zdGVwV2lkdGg7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm9ncmVzc1BlcmNlbnQoKTogZmxvYXQKewpyZXR1cm4gJHRoaXMtPnBlcmNlbnQ7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRCYXJPZmZzZXQoKTogZmxvYXQKewpyZXR1cm4gZmxvb3IoJHRoaXMtPm1heCA/ICR0aGlzLT5wZXJjZW50ICogJHRoaXMtPmJhcldpZHRoIDogKG51bGwgPT09ICR0aGlzLT5yZWRyYXdGcmVxID8gKGludCkgKG1pbig1LCAkdGhpcy0+YmFyV2lkdGggLyAxNSkgKiAkdGhpcy0+d3JpdGVDb3VudCkgOiAkdGhpcy0+c3RlcCkgJSAkdGhpcy0+YmFyV2lkdGgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXN0aW1hdGVkKCk6IGZsb2F0CnsKaWYgKCEkdGhpcy0+c3RlcCkgewpyZXR1cm4gMDsKfQoKcmV0dXJuIHJvdW5kKCh0aW1lKCkgLSAkdGhpcy0+c3RhcnRUaW1lKSAvICR0aGlzLT5zdGVwICogJHRoaXMtPm1heCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZW1haW5pbmcoKTogZmxvYXQKewppZiAoISR0aGlzLT5zdGVwKSB7CnJldHVybiAwOwp9CgpyZXR1cm4gcm91bmQoKHRpbWUoKSAtICR0aGlzLT5zdGFydFRpbWUpIC8gJHRoaXMtPnN0ZXAgKiAoJHRoaXMtPm1heCAtICR0aGlzLT5zdGVwKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRCYXJXaWR0aChpbnQgJHNpemUpCnsKJHRoaXMtPmJhcldpZHRoID0gbWF4KDEsICRzaXplKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEJhcldpZHRoKCk6IGludAp7CnJldHVybiAkdGhpcy0+YmFyV2lkdGg7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRCYXJDaGFyYWN0ZXIoc3RyaW5nICRjaGFyKQp7CiR0aGlzLT5iYXJDaGFyID0gJGNoYXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRCYXJDaGFyYWN0ZXIoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5iYXJDaGFyID8/ICgkdGhpcy0+bWF4ID8gJz0nIDogJHRoaXMtPmVtcHR5QmFyQ2hhcik7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRFbXB0eUJhckNoYXJhY3RlcihzdHJpbmcgJGNoYXIpCnsKJHRoaXMtPmVtcHR5QmFyQ2hhciA9ICRjaGFyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RW1wdHlCYXJDaGFyYWN0ZXIoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5lbXB0eUJhckNoYXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRQcm9ncmVzc0NoYXJhY3RlcihzdHJpbmcgJGNoYXIpCnsKJHRoaXMtPnByb2dyZXNzQ2hhciA9ICRjaGFyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvZ3Jlc3NDaGFyYWN0ZXIoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5wcm9ncmVzc0NoYXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRGb3JtYXQoc3RyaW5nICRmb3JtYXQpCnsKJHRoaXMtPmZvcm1hdCA9IG51bGw7CiR0aGlzLT5pbnRlcm5hbEZvcm1hdCA9ICRmb3JtYXQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJlZHJhd0ZyZXF1ZW5jeSg/aW50ICRmcmVxKQp7CiR0aGlzLT5yZWRyYXdGcmVxID0gbnVsbCAhPT0gJGZyZXEgPyBtYXgoMSwgJGZyZXEpIDogbnVsbDsKfQoKcHVibGljIGZ1bmN0aW9uIG1pblNlY29uZHNCZXR3ZWVuUmVkcmF3cyhmbG9hdCAkc2Vjb25kcyk6IHZvaWQKewokdGhpcy0+bWluU2Vjb25kc0JldHdlZW5SZWRyYXdzID0gJHNlY29uZHM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBtYXhTZWNvbmRzQmV0d2VlblJlZHJhd3MoZmxvYXQgJHNlY29uZHMpOiB2b2lkCnsKJHRoaXMtPm1heFNlY29uZHNCZXR3ZWVuUmVkcmF3cyA9ICRzZWNvbmRzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpdGVyYXRlKGl0ZXJhYmxlICRpdGVyYWJsZSwgP2ludCAkbWF4ID0gbnVsbCk6IGl0ZXJhYmxlCnsKJHRoaXMtPnN0YXJ0KCRtYXggPz8gKGlzX2NvdW50YWJsZSgkaXRlcmFibGUpID8gXGNvdW50KCRpdGVyYWJsZSkgOiAwKSk7Cgpmb3JlYWNoICgkaXRlcmFibGUgYXMgJGtleSA9PiAkdmFsdWUpIHsKeWllbGQgJGtleSA9PiAkdmFsdWU7CgokdGhpcy0+YWR2YW5jZSgpOwp9CgokdGhpcy0+ZmluaXNoKCk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHN0YXJ0KD9pbnQgJG1heCA9IG51bGwpCnsKJHRoaXMtPnN0YXJ0VGltZSA9IHRpbWUoKTsKJHRoaXMtPnN0ZXAgPSAwOwokdGhpcy0+cGVyY2VudCA9IDAuMDsKCmlmIChudWxsICE9PSAkbWF4KSB7CiR0aGlzLT5zZXRNYXhTdGVwcygkbWF4KTsKfQoKJHRoaXMtPmRpc3BsYXkoKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWR2YW5jZShpbnQgJHN0ZXAgPSAxKQp7CiR0aGlzLT5zZXRQcm9ncmVzcygkdGhpcy0+c3RlcCArICRzdGVwKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE92ZXJ3cml0ZShib29sICRvdmVyd3JpdGUpCnsKJHRoaXMtPm92ZXJ3cml0ZSA9ICRvdmVyd3JpdGU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRQcm9ncmVzcyhpbnQgJHN0ZXApCnsKaWYgKCR0aGlzLT5tYXggJiYgJHN0ZXAgPiAkdGhpcy0+bWF4KSB7CiR0aGlzLT5tYXggPSAkc3RlcDsKfSBlbHNlaWYgKCRzdGVwIDwgMCkgewokc3RlcCA9IDA7Cn0KCiRyZWRyYXdGcmVxID0gJHRoaXMtPnJlZHJhd0ZyZXEgPz8gKCgkdGhpcy0+bWF4ID86IDEwKSAvIDEwKTsKJHByZXZQZXJpb2QgPSAoaW50KSAoJHRoaXMtPnN0ZXAgLyAkcmVkcmF3RnJlcSk7CiRjdXJyUGVyaW9kID0gKGludCkgKCRzdGVwIC8gJHJlZHJhd0ZyZXEpOwokdGhpcy0+c3RlcCA9ICRzdGVwOwokdGhpcy0+cGVyY2VudCA9ICR0aGlzLT5tYXggPyAoZmxvYXQpICR0aGlzLT5zdGVwIC8gJHRoaXMtPm1heCA6IDA7CiR0aW1lSW50ZXJ2YWwgPSBtaWNyb3RpbWUodHJ1ZSkgLSAkdGhpcy0+bGFzdFdyaXRlVGltZTsKCgppZiAoJHRoaXMtPm1heCA9PT0gJHN0ZXApIHsKJHRoaXMtPmRpc3BsYXkoKTsKCnJldHVybjsKfQoKCmlmICgkdGltZUludGVydmFsIDwgJHRoaXMtPm1pblNlY29uZHNCZXR3ZWVuUmVkcmF3cykgewpyZXR1cm47Cn0KCgppZiAoJHByZXZQZXJpb2QgIT09ICRjdXJyUGVyaW9kIHx8ICR0aW1lSW50ZXJ2YWwgPj0gJHRoaXMtPm1heFNlY29uZHNCZXR3ZWVuUmVkcmF3cykgewokdGhpcy0+ZGlzcGxheSgpOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRNYXhTdGVwcyhpbnQgJG1heCkKewokdGhpcy0+Zm9ybWF0ID0gbnVsbDsKJHRoaXMtPm1heCA9IG1heCgwLCAkbWF4KTsKJHRoaXMtPnN0ZXBXaWR0aCA9ICR0aGlzLT5tYXggPyBIZWxwZXI6OndpZHRoKChzdHJpbmcpICR0aGlzLT5tYXgpIDogNDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmlzaCgpOiB2b2lkCnsKaWYgKCEkdGhpcy0+bWF4KSB7CiR0aGlzLT5tYXggPSAkdGhpcy0+c3RlcDsKfQoKaWYgKCR0aGlzLT5zdGVwID09PSAkdGhpcy0+bWF4ICYmICEkdGhpcy0+b3ZlcndyaXRlKSB7CgpyZXR1cm47Cn0KCiR0aGlzLT5zZXRQcm9ncmVzcygkdGhpcy0+bWF4KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGRpc3BsYXkoKTogdm9pZAp7CmlmIChPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9RVUlFVCA9PT0gJHRoaXMtPm91dHB1dC0+Z2V0VmVyYm9zaXR5KCkpIHsKcmV0dXJuOwp9CgppZiAobnVsbCA9PT0gJHRoaXMtPmZvcm1hdCkgewokdGhpcy0+c2V0UmVhbEZvcm1hdCgkdGhpcy0+aW50ZXJuYWxGb3JtYXQgPzogJHRoaXMtPmRldGVybWluZUJlc3RGb3JtYXQoKSk7Cn0KCiR0aGlzLT5vdmVyd3JpdGUoJHRoaXMtPmJ1aWxkTGluZSgpKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjbGVhcigpOiB2b2lkCnsKaWYgKCEkdGhpcy0+b3ZlcndyaXRlKSB7CnJldHVybjsKfQoKaWYgKG51bGwgPT09ICR0aGlzLT5mb3JtYXQpIHsKJHRoaXMtPnNldFJlYWxGb3JtYXQoJHRoaXMtPmludGVybmFsRm9ybWF0ID86ICR0aGlzLT5kZXRlcm1pbmVCZXN0Rm9ybWF0KCkpOwp9CgokdGhpcy0+b3ZlcndyaXRlKCcnKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBzZXRSZWFsRm9ybWF0KHN0cmluZyAkZm9ybWF0KQp7CgppZiAoISR0aGlzLT5tYXggJiYgbnVsbCAhPT0gc2VsZjo6Z2V0Rm9ybWF0RGVmaW5pdGlvbigkZm9ybWF0Lidfbm9tYXgnKSkgewokdGhpcy0+Zm9ybWF0ID0gc2VsZjo6Z2V0Rm9ybWF0RGVmaW5pdGlvbigkZm9ybWF0Lidfbm9tYXgnKTsKfSBlbHNlaWYgKG51bGwgIT09IHNlbGY6OmdldEZvcm1hdERlZmluaXRpb24oJGZvcm1hdCkpIHsKJHRoaXMtPmZvcm1hdCA9IHNlbGY6OmdldEZvcm1hdERlZmluaXRpb24oJGZvcm1hdCk7Cn0gZWxzZSB7CiR0aGlzLT5mb3JtYXQgPSAkZm9ybWF0Owp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gb3ZlcndyaXRlKHN0cmluZyAkbWVzc2FnZSk6IHZvaWQKewppZiAoJHRoaXMtPnByZXZpb3VzTWVzc2FnZSA9PT0gJG1lc3NhZ2UpIHsKcmV0dXJuOwp9Cgokb3JpZ2luYWxNZXNzYWdlID0gJG1lc3NhZ2U7CgppZiAoJHRoaXMtPm92ZXJ3cml0ZSkgewppZiAobnVsbCAhPT0gJHRoaXMtPnByZXZpb3VzTWVzc2FnZSkgewppZiAoJHRoaXMtPm91dHB1dCBpbnN0YW5jZW9mIENvbnNvbGVTZWN0aW9uT3V0cHV0KSB7CiRtZXNzYWdlTGluZXMgPSBleHBsb2RlKCJcbiIsICR0aGlzLT5wcmV2aW91c01lc3NhZ2UpOwokbGluZUNvdW50ID0gXGNvdW50KCRtZXNzYWdlTGluZXMpOwpmb3JlYWNoICgkbWVzc2FnZUxpbmVzIGFzICRtZXNzYWdlTGluZSkgewokbWVzc2FnZUxpbmVMZW5ndGggPSBIZWxwZXI6OndpZHRoKEhlbHBlcjo6cmVtb3ZlRGVjb3JhdGlvbigkdGhpcy0+b3V0cHV0LT5nZXRGb3JtYXR0ZXIoKSwgJG1lc3NhZ2VMaW5lKSk7CmlmICgkbWVzc2FnZUxpbmVMZW5ndGggPiAkdGhpcy0+dGVybWluYWwtPmdldFdpZHRoKCkpIHsKJGxpbmVDb3VudCArPSBmbG9vcigkbWVzc2FnZUxpbmVMZW5ndGggLyAkdGhpcy0+dGVybWluYWwtPmdldFdpZHRoKCkpOwp9Cn0KJHRoaXMtPm91dHB1dC0+Y2xlYXIoJGxpbmVDb3VudCk7Cn0gZWxzZSB7CiRsaW5lQ291bnQgPSBzdWJzdHJfY291bnQoJHRoaXMtPnByZXZpb3VzTWVzc2FnZSwgIlxuIik7CmZvciAoJGkgPSAwOyAkaSA8ICRsaW5lQ291bnQ7ICsrJGkpIHsKJHRoaXMtPmN1cnNvci0+bW92ZVRvQ29sdW1uKDEpOwokdGhpcy0+Y3Vyc29yLT5jbGVhckxpbmUoKTsKJHRoaXMtPmN1cnNvci0+bW92ZVVwKCk7Cn0KCiR0aGlzLT5jdXJzb3ItPm1vdmVUb0NvbHVtbigxKTsKJHRoaXMtPmN1cnNvci0+Y2xlYXJMaW5lKCk7Cn0KfQp9IGVsc2VpZiAoJHRoaXMtPnN0ZXAgPiAwKSB7CiRtZXNzYWdlID0gXFBIUF9FT0wuJG1lc3NhZ2U7Cn0KCiR0aGlzLT5wcmV2aW91c01lc3NhZ2UgPSAkb3JpZ2luYWxNZXNzYWdlOwokdGhpcy0+bGFzdFdyaXRlVGltZSA9IG1pY3JvdGltZSh0cnVlKTsKCiR0aGlzLT5vdXRwdXQtPndyaXRlKCRtZXNzYWdlKTsKKyskdGhpcy0+d3JpdGVDb3VudDsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBkZXRlcm1pbmVCZXN0Rm9ybWF0KCk6IHN0cmluZwp7CnN3aXRjaCAoJHRoaXMtPm91dHB1dC0+Z2V0VmVyYm9zaXR5KCkpIHsKCmNhc2UgT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfVkVSQk9TRToKcmV0dXJuICR0aGlzLT5tYXggPyBzZWxmOjpGT1JNQVRfVkVSQk9TRSA6IHNlbGY6OkZPUk1BVF9WRVJCT1NFX05PTUFYOwpjYXNlIE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1ZFUllfVkVSQk9TRToKcmV0dXJuICR0aGlzLT5tYXggPyBzZWxmOjpGT1JNQVRfVkVSWV9WRVJCT1NFIDogc2VsZjo6Rk9STUFUX1ZFUllfVkVSQk9TRV9OT01BWDsKY2FzZSBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9ERUJVRzoKcmV0dXJuICR0aGlzLT5tYXggPyBzZWxmOjpGT1JNQVRfREVCVUcgOiBzZWxmOjpGT1JNQVRfREVCVUdfTk9NQVg7CmRlZmF1bHQ6CnJldHVybiAkdGhpcy0+bWF4ID8gc2VsZjo6Rk9STUFUX05PUk1BTCA6IHNlbGY6OkZPUk1BVF9OT1JNQUxfTk9NQVg7Cn0KfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaW5pdFBsYWNlaG9sZGVyRm9ybWF0dGVycygpOiBhcnJheQp7CnJldHVybiBbCidiYXInID0+IGZ1bmN0aW9uIChzZWxmICRiYXIsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KSB7CiRjb21wbGV0ZUJhcnMgPSAkYmFyLT5nZXRCYXJPZmZzZXQoKTsKJGRpc3BsYXkgPSBzdHJfcmVwZWF0KCRiYXItPmdldEJhckNoYXJhY3RlcigpLCAkY29tcGxldGVCYXJzKTsKaWYgKCRjb21wbGV0ZUJhcnMgPCAkYmFyLT5nZXRCYXJXaWR0aCgpKSB7CiRlbXB0eUJhcnMgPSAkYmFyLT5nZXRCYXJXaWR0aCgpIC0gJGNvbXBsZXRlQmFycyAtIEhlbHBlcjo6bGVuZ3RoKEhlbHBlcjo6cmVtb3ZlRGVjb3JhdGlvbigkb3V0cHV0LT5nZXRGb3JtYXR0ZXIoKSwgJGJhci0+Z2V0UHJvZ3Jlc3NDaGFyYWN0ZXIoKSkpOwokZGlzcGxheSAuPSAkYmFyLT5nZXRQcm9ncmVzc0NoYXJhY3RlcigpLnN0cl9yZXBlYXQoJGJhci0+Z2V0RW1wdHlCYXJDaGFyYWN0ZXIoKSwgJGVtcHR5QmFycyk7Cn0KCnJldHVybiAkZGlzcGxheTsKfSwKJ2VsYXBzZWQnID0+IGZ1bmN0aW9uIChzZWxmICRiYXIpIHsKcmV0dXJuIEhlbHBlcjo6Zm9ybWF0VGltZSh0aW1lKCkgLSAkYmFyLT5nZXRTdGFydFRpbWUoKSk7Cn0sCidyZW1haW5pbmcnID0+IGZ1bmN0aW9uIChzZWxmICRiYXIpIHsKaWYgKCEkYmFyLT5nZXRNYXhTdGVwcygpKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignVW5hYmxlIHRvIGRpc3BsYXkgdGhlIHJlbWFpbmluZyB0aW1lIGlmIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGVwcyBpcyBub3Qgc2V0LicpOwp9CgpyZXR1cm4gSGVscGVyOjpmb3JtYXRUaW1lKCRiYXItPmdldFJlbWFpbmluZygpKTsKfSwKJ2VzdGltYXRlZCcgPT4gZnVuY3Rpb24gKHNlbGYgJGJhcikgewppZiAoISRiYXItPmdldE1heFN0ZXBzKCkpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdVbmFibGUgdG8gZGlzcGxheSB0aGUgZXN0aW1hdGVkIHRpbWUgaWYgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0ZXBzIGlzIG5vdCBzZXQuJyk7Cn0KCnJldHVybiBIZWxwZXI6OmZvcm1hdFRpbWUoJGJhci0+Z2V0RXN0aW1hdGVkKCkpOwp9LAonbWVtb3J5JyA9PiBmdW5jdGlvbiAoc2VsZiAkYmFyKSB7CnJldHVybiBIZWxwZXI6OmZvcm1hdE1lbW9yeShtZW1vcnlfZ2V0X3VzYWdlKHRydWUpKTsKfSwKJ2N1cnJlbnQnID0+IGZ1bmN0aW9uIChzZWxmICRiYXIpIHsKcmV0dXJuIHN0cl9wYWQoJGJhci0+Z2V0UHJvZ3Jlc3MoKSwgJGJhci0+Z2V0U3RlcFdpZHRoKCksICcgJywgXFNUUl9QQURfTEVGVCk7Cn0sCidtYXgnID0+IGZ1bmN0aW9uIChzZWxmICRiYXIpIHsKcmV0dXJuICRiYXItPmdldE1heFN0ZXBzKCk7Cn0sCidwZXJjZW50JyA9PiBmdW5jdGlvbiAoc2VsZiAkYmFyKSB7CnJldHVybiBmbG9vcigkYmFyLT5nZXRQcm9ncmVzc1BlcmNlbnQoKSAqIDEwMCk7Cn0sCl07Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGluaXRGb3JtYXRzKCk6IGFycmF5CnsKcmV0dXJuIFsKc2VsZjo6Rk9STUFUX05PUk1BTCA9PiAnICVjdXJyZW50JS8lbWF4JSBbJWJhciVdICVwZXJjZW50OjNzJSUnLApzZWxmOjpGT1JNQVRfTk9STUFMX05PTUFYID0+ICcgJWN1cnJlbnQlIFslYmFyJV0nLAoKc2VsZjo6Rk9STUFUX1ZFUkJPU0UgPT4gJyAlY3VycmVudCUvJW1heCUgWyViYXIlXSAlcGVyY2VudDozcyUlICVlbGFwc2VkOjZzJScsCnNlbGY6OkZPUk1BVF9WRVJCT1NFX05PTUFYID0+ICcgJWN1cnJlbnQlIFslYmFyJV0gJWVsYXBzZWQ6NnMlJywKCnNlbGY6OkZPUk1BVF9WRVJZX1ZFUkJPU0UgPT4gJyAlY3VycmVudCUvJW1heCUgWyViYXIlXSAlcGVyY2VudDozcyUlICVlbGFwc2VkOjZzJS8lZXN0aW1hdGVkOi02cyUnLApzZWxmOjpGT1JNQVRfVkVSWV9WRVJCT1NFX05PTUFYID0+ICcgJWN1cnJlbnQlIFslYmFyJV0gJWVsYXBzZWQ6NnMlJywKCnNlbGY6OkZPUk1BVF9ERUJVRyA9PiAnICVjdXJyZW50JS8lbWF4JSBbJWJhciVdICVwZXJjZW50OjNzJSUgJWVsYXBzZWQ6NnMlLyVlc3RpbWF0ZWQ6LTZzJSAlbWVtb3J5OjZzJScsCnNlbGY6OkZPUk1BVF9ERUJVR19OT01BWCA9PiAnICVjdXJyZW50JSBbJWJhciVdICVlbGFwc2VkOjZzJSAlbWVtb3J5OjZzJScsCl07Cn0KCnByaXZhdGUgZnVuY3Rpb24gYnVpbGRMaW5lKCk6IHN0cmluZwp7CiRyZWdleCA9ICJ7JShbYS16XC1fXSspKD86XDooW14lXSspKT8lfWkiOwokY2FsbGJhY2sgPSBmdW5jdGlvbiAoJG1hdGNoZXMpIHsKaWYgKCRmb3JtYXR0ZXIgPSAkdGhpczo6Z2V0UGxhY2Vob2xkZXJGb3JtYXR0ZXJEZWZpbml0aW9uKCRtYXRjaGVzWzFdKSkgewokdGV4dCA9ICRmb3JtYXR0ZXIoJHRoaXMsICR0aGlzLT5vdXRwdXQpOwp9IGVsc2VpZiAoaXNzZXQoJHRoaXMtPm1lc3NhZ2VzWyRtYXRjaGVzWzFdXSkpIHsKJHRleHQgPSAkdGhpcy0+bWVzc2FnZXNbJG1hdGNoZXNbMV1dOwp9IGVsc2UgewpyZXR1cm4gJG1hdGNoZXNbMF07Cn0KCmlmIChpc3NldCgkbWF0Y2hlc1syXSkpIHsKJHRleHQgPSBzcHJpbnRmKCclJy4kbWF0Y2hlc1syXSwgJHRleHQpOwp9CgpyZXR1cm4gJHRleHQ7Cn07CiRsaW5lID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCRyZWdleCwgJGNhbGxiYWNrLCAkdGhpcy0+Zm9ybWF0KTsKCgokbGluZXNMZW5ndGggPSBhcnJheV9tYXAoZnVuY3Rpb24gKCRzdWJMaW5lKSB7CnJldHVybiBIZWxwZXI6OndpZHRoKEhlbHBlcjo6cmVtb3ZlRGVjb3JhdGlvbigkdGhpcy0+b3V0cHV0LT5nZXRGb3JtYXR0ZXIoKSwgcnRyaW0oJHN1YkxpbmUsICJcciIpKSk7Cn0sIGV4cGxvZGUoIlxuIiwgJGxpbmUpKTsKCiRsaW5lc1dpZHRoID0gbWF4KCRsaW5lc0xlbmd0aCk7CgokdGVybWluYWxXaWR0aCA9ICR0aGlzLT50ZXJtaW5hbC0+Z2V0V2lkdGgoKTsKaWYgKCRsaW5lc1dpZHRoIDw9ICR0ZXJtaW5hbFdpZHRoKSB7CnJldHVybiAkbGluZTsKfQoKJHRoaXMtPnNldEJhcldpZHRoKCR0aGlzLT5iYXJXaWR0aCAtICRsaW5lc1dpZHRoICsgJHRlcm1pbmFsV2lkdGgpOwoKcmV0dXJuIHByZWdfcmVwbGFjZV9jYWxsYmFjaygkcmVnZXgsICRjYWxsYmFjaywgJHRoaXMtPmZvcm1hdCk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXExvZ2ljRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKY2xhc3MgUHJvZ3Jlc3NJbmRpY2F0b3IKewpwcml2YXRlIGNvbnN0IEZPUk1BVFMgPSBbCidub3JtYWwnID0+ICcgJWluZGljYXRvciUgJW1lc3NhZ2UlJywKJ25vcm1hbF9ub19hbnNpJyA9PiAnICVtZXNzYWdlJScsCgondmVyYm9zZScgPT4gJyAlaW5kaWNhdG9yJSAlbWVzc2FnZSUgKCVlbGFwc2VkOjZzJSknLAondmVyYm9zZV9ub19hbnNpJyA9PiAnICVtZXNzYWdlJSAoJWVsYXBzZWQ6NnMlKScsCgondmVyeV92ZXJib3NlJyA9PiAnICVpbmRpY2F0b3IlICVtZXNzYWdlJSAoJWVsYXBzZWQ6NnMlLCAlbWVtb3J5OjZzJSknLAondmVyeV92ZXJib3NlX25vX2Fuc2knID0+ICcgJW1lc3NhZ2UlICglZWxhcHNlZDo2cyUsICVtZW1vcnk6NnMlKScsCl07Cgpwcml2YXRlICRvdXRwdXQ7CnByaXZhdGUgJHN0YXJ0VGltZTsKcHJpdmF0ZSAkZm9ybWF0Owpwcml2YXRlICRtZXNzYWdlOwpwcml2YXRlICRpbmRpY2F0b3JWYWx1ZXM7CnByaXZhdGUgJGluZGljYXRvckN1cnJlbnQ7CnByaXZhdGUgJGluZGljYXRvckNoYW5nZUludGVydmFsOwpwcml2YXRlICRpbmRpY2F0b3JVcGRhdGVUaW1lOwpwcml2YXRlICRzdGFydGVkID0gZmFsc2U7CgoKCgpwcml2YXRlIHN0YXRpYyAkZm9ybWF0dGVyczsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsID9zdHJpbmcgJGZvcm1hdCA9IG51bGwsIGludCAkaW5kaWNhdG9yQ2hhbmdlSW50ZXJ2YWwgPSAxMDAsID9hcnJheSAkaW5kaWNhdG9yVmFsdWVzID0gbnVsbCkKewokdGhpcy0+b3V0cHV0ID0gJG91dHB1dDsKCmlmIChudWxsID09PSAkZm9ybWF0KSB7CiRmb3JtYXQgPSAkdGhpcy0+ZGV0ZXJtaW5lQmVzdEZvcm1hdCgpOwp9CgppZiAobnVsbCA9PT0gJGluZGljYXRvclZhbHVlcykgewokaW5kaWNhdG9yVmFsdWVzID0gWyctJywgJ1xcJywgJ3wnLCAnLyddOwp9CgokaW5kaWNhdG9yVmFsdWVzID0gYXJyYXlfdmFsdWVzKCRpbmRpY2F0b3JWYWx1ZXMpOwoKaWYgKDIgPiBcY291bnQoJGluZGljYXRvclZhbHVlcykpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignTXVzdCBoYXZlIGF0IGxlYXN0IDIgaW5kaWNhdG9yIHZhbHVlIGNoYXJhY3RlcnMuJyk7Cn0KCiR0aGlzLT5mb3JtYXQgPSBzZWxmOjpnZXRGb3JtYXREZWZpbml0aW9uKCRmb3JtYXQpOwokdGhpcy0+aW5kaWNhdG9yQ2hhbmdlSW50ZXJ2YWwgPSAkaW5kaWNhdG9yQ2hhbmdlSW50ZXJ2YWw7CiR0aGlzLT5pbmRpY2F0b3JWYWx1ZXMgPSAkaW5kaWNhdG9yVmFsdWVzOwokdGhpcy0+c3RhcnRUaW1lID0gdGltZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0TWVzc2FnZSg/c3RyaW5nICRtZXNzYWdlKQp7CiR0aGlzLT5tZXNzYWdlID0gJG1lc3NhZ2U7CgokdGhpcy0+ZGlzcGxheSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc3RhcnQoc3RyaW5nICRtZXNzYWdlKQp7CmlmICgkdGhpcy0+c3RhcnRlZCkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ1Byb2dyZXNzIGluZGljYXRvciBhbHJlYWR5IHN0YXJ0ZWQuJyk7Cn0KCiR0aGlzLT5tZXNzYWdlID0gJG1lc3NhZ2U7CiR0aGlzLT5zdGFydGVkID0gdHJ1ZTsKJHRoaXMtPnN0YXJ0VGltZSA9IHRpbWUoKTsKJHRoaXMtPmluZGljYXRvclVwZGF0ZVRpbWUgPSAkdGhpcy0+Z2V0Q3VycmVudFRpbWVJbk1pbGxpc2Vjb25kcygpICsgJHRoaXMtPmluZGljYXRvckNoYW5nZUludGVydmFsOwokdGhpcy0+aW5kaWNhdG9yQ3VycmVudCA9IDA7CgokdGhpcy0+ZGlzcGxheSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWR2YW5jZSgpCnsKaWYgKCEkdGhpcy0+c3RhcnRlZCkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ1Byb2dyZXNzIGluZGljYXRvciBoYXMgbm90IHlldCBiZWVuIHN0YXJ0ZWQuJyk7Cn0KCmlmICghJHRoaXMtPm91dHB1dC0+aXNEZWNvcmF0ZWQoKSkgewpyZXR1cm47Cn0KCiRjdXJyZW50VGltZSA9ICR0aGlzLT5nZXRDdXJyZW50VGltZUluTWlsbGlzZWNvbmRzKCk7CgppZiAoJGN1cnJlbnRUaW1lIDwgJHRoaXMtPmluZGljYXRvclVwZGF0ZVRpbWUpIHsKcmV0dXJuOwp9CgokdGhpcy0+aW5kaWNhdG9yVXBkYXRlVGltZSA9ICRjdXJyZW50VGltZSArICR0aGlzLT5pbmRpY2F0b3JDaGFuZ2VJbnRlcnZhbDsKKyskdGhpcy0+aW5kaWNhdG9yQ3VycmVudDsKCiR0aGlzLT5kaXNwbGF5KCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5pc2goc3RyaW5nICRtZXNzYWdlKQp7CmlmICghJHRoaXMtPnN0YXJ0ZWQpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdQcm9ncmVzcyBpbmRpY2F0b3IgaGFzIG5vdCB5ZXQgYmVlbiBzdGFydGVkLicpOwp9CgokdGhpcy0+bWVzc2FnZSA9ICRtZXNzYWdlOwokdGhpcy0+ZGlzcGxheSgpOwokdGhpcy0+b3V0cHV0LT53cml0ZWxuKCcnKTsKJHRoaXMtPnN0YXJ0ZWQgPSBmYWxzZTsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEZvcm1hdERlZmluaXRpb24oc3RyaW5nICRuYW1lKQp7CnJldHVybiBzZWxmOjpGT1JNQVRTWyRuYW1lXSA/PyBudWxsOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0UGxhY2Vob2xkZXJGb3JtYXR0ZXJEZWZpbml0aW9uKHN0cmluZyAkbmFtZSwgY2FsbGFibGUgJGNhbGxhYmxlKQp7CmlmICghc2VsZjo6JGZvcm1hdHRlcnMpIHsKc2VsZjo6JGZvcm1hdHRlcnMgPSBzZWxmOjppbml0UGxhY2Vob2xkZXJGb3JtYXR0ZXJzKCk7Cn0KCnNlbGY6OiRmb3JtYXR0ZXJzWyRuYW1lXSA9ICRjYWxsYWJsZTsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFBsYWNlaG9sZGVyRm9ybWF0dGVyRGVmaW5pdGlvbihzdHJpbmcgJG5hbWUpCnsKaWYgKCFzZWxmOjokZm9ybWF0dGVycykgewpzZWxmOjokZm9ybWF0dGVycyA9IHNlbGY6OmluaXRQbGFjZWhvbGRlckZvcm1hdHRlcnMoKTsKfQoKcmV0dXJuIHNlbGY6OiRmb3JtYXR0ZXJzWyRuYW1lXSA/PyBudWxsOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGRpc3BsYXkoKQp7CmlmIChPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9RVUlFVCA9PT0gJHRoaXMtPm91dHB1dC0+Z2V0VmVyYm9zaXR5KCkpIHsKcmV0dXJuOwp9CgokdGhpcy0+b3ZlcndyaXRlKHByZWdfcmVwbGFjZV9jYWxsYmFjaygieyUoW2EtelwtX10rKSg/Olw6KFteJV0rKSk/JX1pIiwgZnVuY3Rpb24gKCRtYXRjaGVzKSB7CmlmICgkZm9ybWF0dGVyID0gc2VsZjo6Z2V0UGxhY2Vob2xkZXJGb3JtYXR0ZXJEZWZpbml0aW9uKCRtYXRjaGVzWzFdKSkgewpyZXR1cm4gJGZvcm1hdHRlcigkdGhpcyk7Cn0KCnJldHVybiAkbWF0Y2hlc1swXTsKfSwgJHRoaXMtPmZvcm1hdCA/PyAnJykpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGRldGVybWluZUJlc3RGb3JtYXQoKTogc3RyaW5nCnsKc3dpdGNoICgkdGhpcy0+b3V0cHV0LT5nZXRWZXJib3NpdHkoKSkgewoKY2FzZSBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9WRVJCT1NFOgpyZXR1cm4gJHRoaXMtPm91dHB1dC0+aXNEZWNvcmF0ZWQoKSA/ICd2ZXJib3NlJyA6ICd2ZXJib3NlX25vX2Fuc2knOwpjYXNlIE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1ZFUllfVkVSQk9TRToKY2FzZSBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9ERUJVRzoKcmV0dXJuICR0aGlzLT5vdXRwdXQtPmlzRGVjb3JhdGVkKCkgPyAndmVyeV92ZXJib3NlJyA6ICd2ZXJ5X3ZlcmJvc2Vfbm9fYW5zaSc7CmRlZmF1bHQ6CnJldHVybiAkdGhpcy0+b3V0cHV0LT5pc0RlY29yYXRlZCgpID8gJ25vcm1hbCcgOiAnbm9ybWFsX25vX2Fuc2knOwp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gb3ZlcndyaXRlKHN0cmluZyAkbWVzc2FnZSkKewppZiAoJHRoaXMtPm91dHB1dC0+aXNEZWNvcmF0ZWQoKSkgewokdGhpcy0+b3V0cHV0LT53cml0ZSgiXHgwRFx4MUJbMksiKTsKJHRoaXMtPm91dHB1dC0+d3JpdGUoJG1lc3NhZ2UpOwp9IGVsc2UgewokdGhpcy0+b3V0cHV0LT53cml0ZWxuKCRtZXNzYWdlKTsKfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldEN1cnJlbnRUaW1lSW5NaWxsaXNlY29uZHMoKTogZmxvYXQKewpyZXR1cm4gcm91bmQobWljcm90aW1lKHRydWUpICogMTAwMCk7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGluaXRQbGFjZWhvbGRlckZvcm1hdHRlcnMoKTogYXJyYXkKewpyZXR1cm4gWwonaW5kaWNhdG9yJyA9PiBmdW5jdGlvbiAoc2VsZiAkaW5kaWNhdG9yKSB7CnJldHVybiAkaW5kaWNhdG9yLT5pbmRpY2F0b3JWYWx1ZXNbJGluZGljYXRvci0+aW5kaWNhdG9yQ3VycmVudCAlIFxjb3VudCgkaW5kaWNhdG9yLT5pbmRpY2F0b3JWYWx1ZXMpXTsKfSwKJ21lc3NhZ2UnID0+IGZ1bmN0aW9uIChzZWxmICRpbmRpY2F0b3IpIHsKcmV0dXJuICRpbmRpY2F0b3ItPm1lc3NhZ2U7Cn0sCidlbGFwc2VkJyA9PiBmdW5jdGlvbiAoc2VsZiAkaW5kaWNhdG9yKSB7CnJldHVybiBIZWxwZXI6OmZvcm1hdFRpbWUodGltZSgpIC0gJGluZGljYXRvci0+c3RhcnRUaW1lKTsKfSwKJ21lbW9yeScgPT4gZnVuY3Rpb24gKCkgewpyZXR1cm4gSGVscGVyOjpmb3JtYXRNZW1vcnkobWVtb3J5X2dldF91c2FnZSh0cnVlKSk7Cn0sCl07Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ3Vyc29yOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cTWlzc2luZ0lucHV0RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cUnVudGltZUV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlclN0eWxlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcU3RyZWFtYWJsZUlucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcQ29uc29sZU91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVTZWN0aW9uT3V0cHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxRdWVzdGlvblxDaG9pY2VRdWVzdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcUXVlc3Rpb25cUXVlc3Rpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFRlcm1pbmFsOwoKdXNlIGZ1bmN0aW9uIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xzOwoKCgoKCgpjbGFzcyBRdWVzdGlvbkhlbHBlciBleHRlbmRzIEhlbHBlcgp7CgoKCnByaXZhdGUgJGlucHV0U3RyZWFtOwoKcHJpdmF0ZSBzdGF0aWMgJHN0dHkgPSB0cnVlOwpwcml2YXRlIHN0YXRpYyAkc3RkaW5Jc0ludGVyYWN0aXZlOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhc2soSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgUXVlc3Rpb24gJHF1ZXN0aW9uKQp7CmlmICgkb3V0cHV0IGluc3RhbmNlb2YgQ29uc29sZU91dHB1dEludGVyZmFjZSkgewokb3V0cHV0ID0gJG91dHB1dC0+Z2V0RXJyb3JPdXRwdXQoKTsKfQoKaWYgKCEkaW5wdXQtPmlzSW50ZXJhY3RpdmUoKSkgewpyZXR1cm4gJHRoaXMtPmdldERlZmF1bHRBbnN3ZXIoJHF1ZXN0aW9uKTsKfQoKaWYgKCRpbnB1dCBpbnN0YW5jZW9mIFN0cmVhbWFibGVJbnB1dEludGVyZmFjZSAmJiAkc3RyZWFtID0gJGlucHV0LT5nZXRTdHJlYW0oKSkgewokdGhpcy0+aW5wdXRTdHJlYW0gPSAkc3RyZWFtOwp9Cgp0cnkgewppZiAoISRxdWVzdGlvbi0+Z2V0VmFsaWRhdG9yKCkpIHsKcmV0dXJuICR0aGlzLT5kb0Fzaygkb3V0cHV0LCAkcXVlc3Rpb24pOwp9CgokaW50ZXJ2aWV3ZXIgPSBmdW5jdGlvbiAoKSB1c2UgKCRvdXRwdXQsICRxdWVzdGlvbikgewpyZXR1cm4gJHRoaXMtPmRvQXNrKCRvdXRwdXQsICRxdWVzdGlvbik7Cn07CgpyZXR1cm4gJHRoaXMtPnZhbGlkYXRlQXR0ZW1wdHMoJGludGVydmlld2VyLCAkb3V0cHV0LCAkcXVlc3Rpb24pOwp9IGNhdGNoIChNaXNzaW5nSW5wdXRFeGNlcHRpb24gJGV4Y2VwdGlvbikgewokaW5wdXQtPnNldEludGVyYWN0aXZlKGZhbHNlKTsKCmlmIChudWxsID09PSAkZmFsbGJhY2tPdXRwdXQgPSAkdGhpcy0+Z2V0RGVmYXVsdEFuc3dlcigkcXVlc3Rpb24pKSB7CnRocm93ICRleGNlcHRpb247Cn0KCnJldHVybiAkZmFsbGJhY2tPdXRwdXQ7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKQp7CnJldHVybiAncXVlc3Rpb24nOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRpc2FibGVTdHR5KCkKewpzZWxmOjokc3R0eSA9IGZhbHNlOwp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkb0FzayhPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgUXVlc3Rpb24gJHF1ZXN0aW9uKQp7CiR0aGlzLT53cml0ZVByb21wdCgkb3V0cHV0LCAkcXVlc3Rpb24pOwoKJGlucHV0U3RyZWFtID0gJHRoaXMtPmlucHV0U3RyZWFtID86IFxTVERJTjsKJGF1dG9jb21wbGV0ZSA9ICRxdWVzdGlvbi0+Z2V0QXV0b2NvbXBsZXRlckNhbGxiYWNrKCk7CgppZiAobnVsbCA9PT0gJGF1dG9jb21wbGV0ZSB8fCAhc2VsZjo6JHN0dHkgfHwgIVRlcm1pbmFsOjpoYXNTdHR5QXZhaWxhYmxlKCkpIHsKJHJldCA9IGZhbHNlOwppZiAoJHF1ZXN0aW9uLT5pc0hpZGRlbigpKSB7CnRyeSB7CiRoaWRkZW5SZXNwb25zZSA9ICR0aGlzLT5nZXRIaWRkZW5SZXNwb25zZSgkb3V0cHV0LCAkaW5wdXRTdHJlYW0sICRxdWVzdGlvbi0+aXNUcmltbWFibGUoKSk7CiRyZXQgPSAkcXVlc3Rpb24tPmlzVHJpbW1hYmxlKCkgPyB0cmltKCRoaWRkZW5SZXNwb25zZSkgOiAkaGlkZGVuUmVzcG9uc2U7Cn0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gJGUpIHsKaWYgKCEkcXVlc3Rpb24tPmlzSGlkZGVuRmFsbGJhY2soKSkgewp0aHJvdyAkZTsKfQp9Cn0KCmlmIChmYWxzZSA9PT0gJHJldCkgewokaXNCbG9ja2VkID0gc3RyZWFtX2dldF9tZXRhX2RhdGEoJGlucHV0U3RyZWFtKVsnYmxvY2tlZCddID8/IHRydWU7CgppZiAoISRpc0Jsb2NrZWQpIHsKc3RyZWFtX3NldF9ibG9ja2luZygkaW5wdXRTdHJlYW0sIHRydWUpOwp9CgokcmV0ID0gJHRoaXMtPnJlYWRJbnB1dCgkaW5wdXRTdHJlYW0sICRxdWVzdGlvbik7CgppZiAoISRpc0Jsb2NrZWQpIHsKc3RyZWFtX3NldF9ibG9ja2luZygkaW5wdXRTdHJlYW0sIGZhbHNlKTsKfQoKaWYgKGZhbHNlID09PSAkcmV0KSB7CnRocm93IG5ldyBNaXNzaW5nSW5wdXRFeGNlcHRpb24oJ0Fib3J0ZWQuJyk7Cn0KaWYgKCRxdWVzdGlvbi0+aXNUcmltbWFibGUoKSkgewokcmV0ID0gdHJpbSgkcmV0KTsKfQp9Cn0gZWxzZSB7CiRhdXRvY29tcGxldGUgPSAkdGhpcy0+YXV0b2NvbXBsZXRlKCRvdXRwdXQsICRxdWVzdGlvbiwgJGlucHV0U3RyZWFtLCAkYXV0b2NvbXBsZXRlKTsKJHJldCA9ICRxdWVzdGlvbi0+aXNUcmltbWFibGUoKSA/IHRyaW0oJGF1dG9jb21wbGV0ZSkgOiAkYXV0b2NvbXBsZXRlOwp9CgppZiAoJG91dHB1dCBpbnN0YW5jZW9mIENvbnNvbGVTZWN0aW9uT3V0cHV0KSB7CiRvdXRwdXQtPmFkZENvbnRlbnQoJHJldCk7Cn0KCiRyZXQgPSBcc3RybGVuKCRyZXQpID4gMCA/ICRyZXQgOiAkcXVlc3Rpb24tPmdldERlZmF1bHQoKTsKCmlmICgkbm9ybWFsaXplciA9ICRxdWVzdGlvbi0+Z2V0Tm9ybWFsaXplcigpKSB7CnJldHVybiAkbm9ybWFsaXplcigkcmV0KTsKfQoKcmV0dXJuICRyZXQ7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0RGVmYXVsdEFuc3dlcihRdWVzdGlvbiAkcXVlc3Rpb24pCnsKJGRlZmF1bHQgPSAkcXVlc3Rpb24tPmdldERlZmF1bHQoKTsKCmlmIChudWxsID09PSAkZGVmYXVsdCkgewpyZXR1cm4gJGRlZmF1bHQ7Cn0KCmlmICgkdmFsaWRhdG9yID0gJHF1ZXN0aW9uLT5nZXRWYWxpZGF0b3IoKSkgewpyZXR1cm4gXGNhbGxfdXNlcl9mdW5jKCRxdWVzdGlvbi0+Z2V0VmFsaWRhdG9yKCksICRkZWZhdWx0KTsKfSBlbHNlaWYgKCRxdWVzdGlvbiBpbnN0YW5jZW9mIENob2ljZVF1ZXN0aW9uKSB7CiRjaG9pY2VzID0gJHF1ZXN0aW9uLT5nZXRDaG9pY2VzKCk7CgppZiAoISRxdWVzdGlvbi0+aXNNdWx0aXNlbGVjdCgpKSB7CnJldHVybiAkY2hvaWNlc1skZGVmYXVsdF0gPz8gJGRlZmF1bHQ7Cn0KCiRkZWZhdWx0ID0gZXhwbG9kZSgnLCcsICRkZWZhdWx0KTsKZm9yZWFjaCAoJGRlZmF1bHQgYXMgJGsgPT4gJHYpIHsKJHYgPSAkcXVlc3Rpb24tPmlzVHJpbW1hYmxlKCkgPyB0cmltKCR2KSA6ICR2OwokZGVmYXVsdFska10gPSAkY2hvaWNlc1skdl0gPz8gJHY7Cn0KfQoKcmV0dXJuICRkZWZhdWx0Owp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gd3JpdGVQcm9tcHQoT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIFF1ZXN0aW9uICRxdWVzdGlvbikKewokbWVzc2FnZSA9ICRxdWVzdGlvbi0+Z2V0UXVlc3Rpb24oKTsKCmlmICgkcXVlc3Rpb24gaW5zdGFuY2VvZiBDaG9pY2VRdWVzdGlvbikgewokb3V0cHV0LT53cml0ZWxuKGFycmF5X21lcmdlKFsKJHF1ZXN0aW9uLT5nZXRRdWVzdGlvbigpLApdLCAkdGhpcy0+Zm9ybWF0Q2hvaWNlUXVlc3Rpb25DaG9pY2VzKCRxdWVzdGlvbiwgJ2luZm8nKSkpOwoKJG1lc3NhZ2UgPSAkcXVlc3Rpb24tPmdldFByb21wdCgpOwp9Cgokb3V0cHV0LT53cml0ZSgkbWVzc2FnZSk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBmb3JtYXRDaG9pY2VRdWVzdGlvbkNob2ljZXMoQ2hvaWNlUXVlc3Rpb24gJHF1ZXN0aW9uLCBzdHJpbmcgJHRhZykKewokbWVzc2FnZXMgPSBbXTsKCiRtYXhXaWR0aCA9IG1heChhcnJheV9tYXAoW19fQ0xBU1NfXywgJ3dpZHRoJ10sIGFycmF5X2tleXMoJGNob2ljZXMgPSAkcXVlc3Rpb24tPmdldENob2ljZXMoKSkpKTsKCmZvcmVhY2ggKCRjaG9pY2VzIGFzICRrZXkgPT4gJHZhbHVlKSB7CiRwYWRkaW5nID0gc3RyX3JlcGVhdCgnICcsICRtYXhXaWR0aCAtIHNlbGY6OndpZHRoKCRrZXkpKTsKCiRtZXNzYWdlc1tdID0gc3ByaW50ZigiICBbPCR0YWc+JXMkcGFkZGluZzwvJHRhZz5dICVzIiwgJGtleSwgJHZhbHVlKTsKfQoKcmV0dXJuICRtZXNzYWdlczsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHdyaXRlRXJyb3IoT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIFxFeGNlcHRpb24gJGVycm9yKQp7CmlmIChudWxsICE9PSAkdGhpcy0+Z2V0SGVscGVyU2V0KCkgJiYgJHRoaXMtPmdldEhlbHBlclNldCgpLT5oYXMoJ2Zvcm1hdHRlcicpKSB7CiRtZXNzYWdlID0gJHRoaXMtPmdldEhlbHBlclNldCgpLT5nZXQoJ2Zvcm1hdHRlcicpLT5mb3JtYXRCbG9jaygkZXJyb3ItPmdldE1lc3NhZ2UoKSwgJ2Vycm9yJyk7Cn0gZWxzZSB7CiRtZXNzYWdlID0gJzxlcnJvcj4nLiRlcnJvci0+Z2V0TWVzc2FnZSgpLic8L2Vycm9yPic7Cn0KCiRvdXRwdXQtPndyaXRlbG4oJG1lc3NhZ2UpOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gYXV0b2NvbXBsZXRlKE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBRdWVzdGlvbiAkcXVlc3Rpb24sICRpbnB1dFN0cmVhbSwgY2FsbGFibGUgJGF1dG9jb21wbGV0ZSk6IHN0cmluZwp7CiRjdXJzb3IgPSBuZXcgQ3Vyc29yKCRvdXRwdXQsICRpbnB1dFN0cmVhbSk7CgokZnVsbENob2ljZSA9ICcnOwokcmV0ID0gJyc7CgokaSA9IDA7CiRvZnMgPSAtMTsKJG1hdGNoZXMgPSAkYXV0b2NvbXBsZXRlKCRyZXQpOwokbnVtTWF0Y2hlcyA9IFxjb3VudCgkbWF0Y2hlcyk7Cgokc3R0eU1vZGUgPSBzaGVsbF9leGVjKCdzdHR5IC1nJyk7CiRpc1N0ZGluID0gJ3BocDovL3N0ZGluJyA9PT0gKHN0cmVhbV9nZXRfbWV0YV9kYXRhKCRpbnB1dFN0cmVhbSlbJ3VyaSddID8/IG51bGwpOwokciA9IFskaW5wdXRTdHJlYW1dOwokdyA9IFtdOwoKCnNoZWxsX2V4ZWMoJ3N0dHkgLWljYW5vbiAtZWNobycpOwoKCiRvdXRwdXQtPmdldEZvcm1hdHRlcigpLT5zZXRTdHlsZSgnaGwnLCBuZXcgT3V0cHV0Rm9ybWF0dGVyU3R5bGUoJ2JsYWNrJywgJ3doaXRlJykpOwoKCndoaWxlICghZmVvZigkaW5wdXRTdHJlYW0pKSB7CndoaWxlICgkaXNTdGRpbiAmJiAwID09PSBAc3RyZWFtX3NlbGVjdCgkciwgJHcsICR3LCAwLCAxMDApKSB7CgokciA9IFskaW5wdXRTdHJlYW1dOwp9CiRjID0gZnJlYWQoJGlucHV0U3RyZWFtLCAxKTsKCgppZiAoZmFsc2UgPT09ICRjIHx8ICgnJyA9PT0gJHJldCAmJiAnJyA9PT0gJGMgJiYgbnVsbCA9PT0gJHF1ZXN0aW9uLT5nZXREZWZhdWx0KCkpKSB7CnNoZWxsX2V4ZWMoJ3N0dHkgJy4kc3R0eU1vZGUpOwp0aHJvdyBuZXcgTWlzc2luZ0lucHV0RXhjZXB0aW9uKCdBYm9ydGVkLicpOwp9IGVsc2VpZiAoIlwxNzciID09PSAkYykgeyAKaWYgKDAgPT09ICRudW1NYXRjaGVzICYmIDAgIT09ICRpKSB7Ci0tJGk7CiRjdXJzb3ItPm1vdmVMZWZ0KHMoJGZ1bGxDaG9pY2UpLT5zbGljZSgtMSktPndpZHRoKGZhbHNlKSk7CgokZnVsbENob2ljZSA9IHNlbGY6OnN1YnN0cigkZnVsbENob2ljZSwgMCwgJGkpOwp9CgppZiAoMCA9PT0gJGkpIHsKJG9mcyA9IC0xOwokbWF0Y2hlcyA9ICRhdXRvY29tcGxldGUoJHJldCk7CiRudW1NYXRjaGVzID0gXGNvdW50KCRtYXRjaGVzKTsKfSBlbHNlIHsKJG51bU1hdGNoZXMgPSAwOwp9CgoKJHJldCA9IHNlbGY6OnN1YnN0cigkcmV0LCAwLCAkaSk7Cn0gZWxzZWlmICgiXDAzMyIgPT09ICRjKSB7CgokYyAuPSBmcmVhZCgkaW5wdXRTdHJlYW0sIDIpOwoKCmlmIChpc3NldCgkY1syXSkgJiYgKCdBJyA9PT0gJGNbMl0gfHwgJ0InID09PSAkY1syXSkpIHsKaWYgKCdBJyA9PT0gJGNbMl0gJiYgLTEgPT09ICRvZnMpIHsKJG9mcyA9IDA7Cn0KCmlmICgwID09PSAkbnVtTWF0Y2hlcykgewpjb250aW51ZTsKfQoKJG9mcyArPSAoJ0EnID09PSAkY1syXSkgPyAtMSA6IDE7CiRvZnMgPSAoJG51bU1hdGNoZXMgKyAkb2ZzKSAlICRudW1NYXRjaGVzOwp9Cn0gZWxzZWlmIChcb3JkKCRjKSA8IDMyKSB7CmlmICgiXHQiID09PSAkYyB8fCAiXG4iID09PSAkYykgewppZiAoJG51bU1hdGNoZXMgPiAwICYmIC0xICE9PSAkb2ZzKSB7CiRyZXQgPSAoc3RyaW5nKSAkbWF0Y2hlc1skb2ZzXTsKCiRyZW1haW5pbmdDaGFyYWN0ZXJzID0gc3Vic3RyKCRyZXQsIFxzdHJsZW4odHJpbSgkdGhpcy0+bW9zdFJlY2VudGx5RW50ZXJlZFZhbHVlKCRmdWxsQ2hvaWNlKSkpKTsKJG91dHB1dC0+d3JpdGUoJHJlbWFpbmluZ0NoYXJhY3RlcnMpOwokZnVsbENob2ljZSAuPSAkcmVtYWluaW5nQ2hhcmFjdGVyczsKJGkgPSAoZmFsc2UgPT09ICRlbmNvZGluZyA9IG1iX2RldGVjdF9lbmNvZGluZygkZnVsbENob2ljZSwgbnVsbCwgdHJ1ZSkpID8gXHN0cmxlbigkZnVsbENob2ljZSkgOiBtYl9zdHJsZW4oJGZ1bGxDaG9pY2UsICRlbmNvZGluZyk7CgokbWF0Y2hlcyA9IGFycmF5X2ZpbHRlcigKJGF1dG9jb21wbGV0ZSgkcmV0KSwKZnVuY3Rpb24gKCRtYXRjaCkgdXNlICgkcmV0KSB7CnJldHVybiAnJyA9PT0gJHJldCB8fCBzdHJfc3RhcnRzX3dpdGgoJG1hdGNoLCAkcmV0KTsKfQopOwokbnVtTWF0Y2hlcyA9IFxjb3VudCgkbWF0Y2hlcyk7CiRvZnMgPSAtMTsKfQoKaWYgKCJcbiIgPT09ICRjKSB7CiRvdXRwdXQtPndyaXRlKCRjKTsKYnJlYWs7Cn0KCiRudW1NYXRjaGVzID0gMDsKfQoKY29udGludWU7Cn0gZWxzZSB7CmlmICgiXHg4MCIgPD0gJGMpIHsKJGMgLj0gZnJlYWQoJGlucHV0U3RyZWFtLCBbIlx4QzAiID0+IDEsICJceEQwIiA9PiAxLCAiXHhFMCIgPT4gMiwgIlx4RjAiID0+IDNdWyRjICYgIlx4RjAiXSk7Cn0KCiRvdXRwdXQtPndyaXRlKCRjKTsKJHJldCAuPSAkYzsKJGZ1bGxDaG9pY2UgLj0gJGM7CisrJGk7CgokdGVtcFJldCA9ICRyZXQ7CgppZiAoJHF1ZXN0aW9uIGluc3RhbmNlb2YgQ2hvaWNlUXVlc3Rpb24gJiYgJHF1ZXN0aW9uLT5pc011bHRpc2VsZWN0KCkpIHsKJHRlbXBSZXQgPSAkdGhpcy0+bW9zdFJlY2VudGx5RW50ZXJlZFZhbHVlKCRmdWxsQ2hvaWNlKTsKfQoKJG51bU1hdGNoZXMgPSAwOwokb2ZzID0gMDsKCmZvcmVhY2ggKCRhdXRvY29tcGxldGUoJHJldCkgYXMgJHZhbHVlKSB7CgppZiAoc3RyX3N0YXJ0c193aXRoKCR2YWx1ZSwgJHRlbXBSZXQpKSB7CiRtYXRjaGVzWyRudW1NYXRjaGVzKytdID0gJHZhbHVlOwp9Cn0KfQoKJGN1cnNvci0+Y2xlYXJMaW5lQWZ0ZXIoKTsKCmlmICgkbnVtTWF0Y2hlcyA+IDAgJiYgLTEgIT09ICRvZnMpIHsKJGN1cnNvci0+c2F2ZVBvc2l0aW9uKCk7CgokY2hhcmFjdGVyc0VudGVyZWQgPSBcc3RybGVuKHRyaW0oJHRoaXMtPm1vc3RSZWNlbnRseUVudGVyZWRWYWx1ZSgkZnVsbENob2ljZSkpKTsKJG91dHB1dC0+d3JpdGUoJzxobD4nLk91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlVHJhaWxpbmdCYWNrc2xhc2goc3Vic3RyKCRtYXRjaGVzWyRvZnNdLCAkY2hhcmFjdGVyc0VudGVyZWQpKS4nPC9obD4nKTsKJGN1cnNvci0+cmVzdG9yZVBvc2l0aW9uKCk7Cn0KfQoKCnNoZWxsX2V4ZWMoJ3N0dHkgJy4kc3R0eU1vZGUpOwoKcmV0dXJuICRmdWxsQ2hvaWNlOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIG1vc3RSZWNlbnRseUVudGVyZWRWYWx1ZShzdHJpbmcgJGVudGVyZWQpOiBzdHJpbmcKewoKaWYgKCFzdHJfY29udGFpbnMoJGVudGVyZWQsICcsJykpIHsKcmV0dXJuICRlbnRlcmVkOwp9CgokY2hvaWNlcyA9IGV4cGxvZGUoJywnLCAkZW50ZXJlZCk7CmlmICgnJyAhPT0gJGxhc3RDaG9pY2UgPSB0cmltKCRjaG9pY2VzW1xjb3VudCgkY2hvaWNlcykgLSAxXSkpIHsKcmV0dXJuICRsYXN0Q2hvaWNlOwp9CgpyZXR1cm4gJGVudGVyZWQ7Cn0KCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRIaWRkZW5SZXNwb25zZShPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgJGlucHV0U3RyZWFtLCBib29sICR0cmltbWFibGUgPSB0cnVlKTogc3RyaW5nCnsKaWYgKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SKSB7CiRleGUgPSBfX0RJUl9fLicvLi4vUmVzb3VyY2VzL2Jpbi9oaWRkZW5pbnB1dC5leGUnOwoKCmlmICgncGhhcjonID09PSBzdWJzdHIoX19GSUxFX18sIDAsIDUpKSB7CiR0bXBFeGUgPSBzeXNfZ2V0X3RlbXBfZGlyKCkuJy9oaWRkZW5pbnB1dC5leGUnOwpjb3B5KCRleGUsICR0bXBFeGUpOwokZXhlID0gJHRtcEV4ZTsKfQoKJHNFeGVjID0gc2hlbGxfZXhlYygnIicuJGV4ZS4nIicpOwokdmFsdWUgPSAkdHJpbW1hYmxlID8gcnRyaW0oJHNFeGVjKSA6ICRzRXhlYzsKJG91dHB1dC0+d3JpdGVsbignJyk7CgppZiAoaXNzZXQoJHRtcEV4ZSkpIHsKdW5saW5rKCR0bXBFeGUpOwp9CgpyZXR1cm4gJHZhbHVlOwp9CgppZiAoc2VsZjo6JHN0dHkgJiYgVGVybWluYWw6Omhhc1N0dHlBdmFpbGFibGUoKSkgewokc3R0eU1vZGUgPSBzaGVsbF9leGVjKCdzdHR5IC1nJyk7CnNoZWxsX2V4ZWMoJ3N0dHkgLWVjaG8nKTsKfSBlbHNlaWYgKCR0aGlzLT5pc0ludGVyYWN0aXZlSW5wdXQoJGlucHV0U3RyZWFtKSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignVW5hYmxlIHRvIGhpZGUgdGhlIHJlc3BvbnNlLicpOwp9CgokdmFsdWUgPSBmZ2V0cygkaW5wdXRTdHJlYW0sIDQwOTYpOwoKaWYgKHNlbGY6OiRzdHR5ICYmIFRlcm1pbmFsOjpoYXNTdHR5QXZhaWxhYmxlKCkpIHsKc2hlbGxfZXhlYygnc3R0eSAnLiRzdHR5TW9kZSk7Cn0KCmlmIChmYWxzZSA9PT0gJHZhbHVlKSB7CnRocm93IG5ldyBNaXNzaW5nSW5wdXRFeGNlcHRpb24oJ0Fib3J0ZWQuJyk7Cn0KaWYgKCR0cmltbWFibGUpIHsKJHZhbHVlID0gdHJpbSgkdmFsdWUpOwp9CiRvdXRwdXQtPndyaXRlbG4oJycpOwoKcmV0dXJuICR2YWx1ZTsKfQoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZUF0dGVtcHRzKGNhbGxhYmxlICRpbnRlcnZpZXdlciwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIFF1ZXN0aW9uICRxdWVzdGlvbikKewokZXJyb3IgPSBudWxsOwokYXR0ZW1wdHMgPSAkcXVlc3Rpb24tPmdldE1heEF0dGVtcHRzKCk7Cgp3aGlsZSAobnVsbCA9PT0gJGF0dGVtcHRzIHx8ICRhdHRlbXB0cy0tKSB7CmlmIChudWxsICE9PSAkZXJyb3IpIHsKJHRoaXMtPndyaXRlRXJyb3IoJG91dHB1dCwgJGVycm9yKTsKfQoKdHJ5IHsKcmV0dXJuICRxdWVzdGlvbi0+Z2V0VmFsaWRhdG9yKCkoJGludGVydmlld2VyKCkpOwp9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uICRlKSB7CnRocm93ICRlOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlcnJvcikgewp9Cn0KCnRocm93ICRlcnJvcjsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBpc0ludGVyYWN0aXZlSW5wdXQoJGlucHV0U3RyZWFtKTogYm9vbAp7CmlmICgncGhwOi8vc3RkaW4nICE9PSAoc3RyZWFtX2dldF9tZXRhX2RhdGEoJGlucHV0U3RyZWFtKVsndXJpJ10gPz8gbnVsbCkpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAobnVsbCAhPT0gc2VsZjo6JHN0ZGluSXNJbnRlcmFjdGl2ZSkgewpyZXR1cm4gc2VsZjo6JHN0ZGluSXNJbnRlcmFjdGl2ZTsKfQoKcmV0dXJuIHNlbGY6OiRzdGRpbklzSW50ZXJhY3RpdmUgPSBAc3RyZWFtX2lzYXR0eShmb3BlbigncGhwOi8vc3RkaW4nLCAncicpKTsKfQoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlYWRJbnB1dCgkaW5wdXRTdHJlYW0sIFF1ZXN0aW9uICRxdWVzdGlvbikKewppZiAoISRxdWVzdGlvbi0+aXNNdWx0aWxpbmUoKSkgewokY3AgPSAkdGhpcy0+c2V0SU9Db2RlcGFnZSgpOwokcmV0ID0gZmdldHMoJGlucHV0U3RyZWFtLCA0MDk2KTsKCnJldHVybiAkdGhpcy0+cmVzZXRJT0NvZGVwYWdlKCRjcCwgJHJldCk7Cn0KCiRtdWx0aUxpbmVTdHJlYW1SZWFkZXIgPSAkdGhpcy0+Y2xvbmVJbnB1dFN0cmVhbSgkaW5wdXRTdHJlYW0pOwppZiAobnVsbCA9PT0gJG11bHRpTGluZVN0cmVhbVJlYWRlcikgewpyZXR1cm4gZmFsc2U7Cn0KCiRyZXQgPSAnJzsKJGNwID0gJHRoaXMtPnNldElPQ29kZXBhZ2UoKTsKd2hpbGUgKGZhbHNlICE9PSAoJGNoYXIgPSBmZ2V0YygkbXVsdGlMaW5lU3RyZWFtUmVhZGVyKSkpIHsKaWYgKFxQSFBfRU9MID09PSAieyRyZXR9eyRjaGFyfSIpIHsKYnJlYWs7Cn0KJHJldCAuPSAkY2hhcjsKfQoKcmV0dXJuICR0aGlzLT5yZXNldElPQ29kZXBhZ2UoJGNwLCAkcmV0KTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHNldElPQ29kZXBhZ2UoKTogaW50CnsKaWYgKFxmdW5jdGlvbl9leGlzdHMoJ3NhcGlfd2luZG93c19jcF9zZXQnKSkgewokY3AgPSBzYXBpX3dpbmRvd3NfY3BfZ2V0KCk7CnNhcGlfd2luZG93c19jcF9zZXQoc2FwaV93aW5kb3dzX2NwX2dldCgnb2VtJykpOwoKcmV0dXJuICRjcDsKfQoKcmV0dXJuIDA7Cn0KCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlc2V0SU9Db2RlcGFnZShpbnQgJGNwLCAkaW5wdXQpCnsKaWYgKDAgIT09ICRjcCkgewpzYXBpX3dpbmRvd3NfY3Bfc2V0KCRjcCk7CgppZiAoZmFsc2UgIT09ICRpbnB1dCAmJiAnJyAhPT0gJGlucHV0KSB7CiRpbnB1dCA9IHNhcGlfd2luZG93c19jcF9jb252KHNhcGlfd2luZG93c19jcF9nZXQoJ29lbScpLCAkY3AsICRpbnB1dCk7Cn0KfQoKcmV0dXJuICRpbnB1dDsKfQoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNsb25lSW5wdXRTdHJlYW0oJGlucHV0U3RyZWFtKQp7CiRzdHJlYW1NZXRhRGF0YSA9IHN0cmVhbV9nZXRfbWV0YV9kYXRhKCRpbnB1dFN0cmVhbSk7CiRzZWVrYWJsZSA9ICRzdHJlYW1NZXRhRGF0YVsnc2Vla2FibGUnXSA/PyBmYWxzZTsKJG1vZGUgPSAkc3RyZWFtTWV0YURhdGFbJ21vZGUnXSA/PyAncmInOwokdXJpID0gJHN0cmVhbU1ldGFEYXRhWyd1cmknXSA/PyBudWxsOwoKaWYgKG51bGwgPT09ICR1cmkpIHsKcmV0dXJuIG51bGw7Cn0KCiRjbG9uZVN0cmVhbSA9IGZvcGVuKCR1cmksICRtb2RlKTsKCgoKaWYgKHRydWUgPT09ICRzZWVrYWJsZSAmJiAhXGluX2FycmF5KCRtb2RlLCBbJ3InLCAncmInLCAncnQnXSkpIHsKJG9mZnNldCA9IGZ0ZWxsKCRpbnB1dFN0cmVhbSk7CnJld2luZCgkaW5wdXRTdHJlYW0pOwpzdHJlYW1fY29weV90b19zdHJlYW0oJGlucHV0U3RyZWFtLCAkY2xvbmVTdHJlYW0pOwpmc2VlaygkaW5wdXRTdHJlYW0sICRvZmZzZXQpOwpmc2VlaygkY2xvbmVTdHJlYW0sICRvZmZzZXQpOwp9CgpyZXR1cm4gJGNsb25lU3RyZWFtOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFF1ZXN0aW9uXENob2ljZVF1ZXN0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxRdWVzdGlvblxDb25maXJtYXRpb25RdWVzdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcUXVlc3Rpb25cUXVlc3Rpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFN0eWxlXFN5bWZvbnlTdHlsZTsKCgoKCgoKY2xhc3MgU3ltZm9ueVF1ZXN0aW9uSGVscGVyIGV4dGVuZHMgUXVlc3Rpb25IZWxwZXIKewoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gd3JpdGVQcm9tcHQoT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIFF1ZXN0aW9uICRxdWVzdGlvbikKewokdGV4dCA9IE91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlVHJhaWxpbmdCYWNrc2xhc2goJHF1ZXN0aW9uLT5nZXRRdWVzdGlvbigpKTsKJGRlZmF1bHQgPSAkcXVlc3Rpb24tPmdldERlZmF1bHQoKTsKCmlmICgkcXVlc3Rpb24tPmlzTXVsdGlsaW5lKCkpIHsKJHRleHQgLj0gc3ByaW50ZignIChwcmVzcyAlcyB0byBjb250aW51ZSknLCAkdGhpcy0+Z2V0RW9mU2hvcnRjdXQoKSk7Cn0KCnN3aXRjaCAodHJ1ZSkgewpjYXNlIG51bGwgPT09ICRkZWZhdWx0OgokdGV4dCA9IHNwcmludGYoJyA8aW5mbz4lczwvaW5mbz46JywgJHRleHQpOwoKYnJlYWs7CgpjYXNlICRxdWVzdGlvbiBpbnN0YW5jZW9mIENvbmZpcm1hdGlvblF1ZXN0aW9uOgokdGV4dCA9IHNwcmludGYoJyA8aW5mbz4lcyAoeWVzL25vKTwvaW5mbz4gWzxjb21tZW50PiVzPC9jb21tZW50Pl06JywgJHRleHQsICRkZWZhdWx0ID8gJ3llcycgOiAnbm8nKTsKCmJyZWFrOwoKY2FzZSAkcXVlc3Rpb24gaW5zdGFuY2VvZiBDaG9pY2VRdWVzdGlvbiAmJiAkcXVlc3Rpb24tPmlzTXVsdGlzZWxlY3QoKToKJGNob2ljZXMgPSAkcXVlc3Rpb24tPmdldENob2ljZXMoKTsKJGRlZmF1bHQgPSBleHBsb2RlKCcsJywgJGRlZmF1bHQpOwoKZm9yZWFjaCAoJGRlZmF1bHQgYXMgJGtleSA9PiAkdmFsdWUpIHsKJGRlZmF1bHRbJGtleV0gPSAkY2hvaWNlc1t0cmltKCR2YWx1ZSldOwp9CgokdGV4dCA9IHNwcmludGYoJyA8aW5mbz4lczwvaW5mbz4gWzxjb21tZW50PiVzPC9jb21tZW50Pl06JywgJHRleHQsIE91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKGltcGxvZGUoJywgJywgJGRlZmF1bHQpKSk7CgpicmVhazsKCmNhc2UgJHF1ZXN0aW9uIGluc3RhbmNlb2YgQ2hvaWNlUXVlc3Rpb246CiRjaG9pY2VzID0gJHF1ZXN0aW9uLT5nZXRDaG9pY2VzKCk7CiR0ZXh0ID0gc3ByaW50ZignIDxpbmZvPiVzPC9pbmZvPiBbPGNvbW1lbnQ+JXM8L2NvbW1lbnQ+XTonLCAkdGV4dCwgT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJGNob2ljZXNbJGRlZmF1bHRdID8/ICRkZWZhdWx0KSk7CgpicmVhazsKCmRlZmF1bHQ6CiR0ZXh0ID0gc3ByaW50ZignIDxpbmZvPiVzPC9pbmZvPiBbPGNvbW1lbnQ+JXM8L2NvbW1lbnQ+XTonLCAkdGV4dCwgT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJGRlZmF1bHQpKTsKfQoKJG91dHB1dC0+d3JpdGVsbigkdGV4dCk7CgokcHJvbXB0ID0gJyA+ICc7CgppZiAoJHF1ZXN0aW9uIGluc3RhbmNlb2YgQ2hvaWNlUXVlc3Rpb24pIHsKJG91dHB1dC0+d3JpdGVsbigkdGhpcy0+Zm9ybWF0Q2hvaWNlUXVlc3Rpb25DaG9pY2VzKCRxdWVzdGlvbiwgJ2NvbW1lbnQnKSk7CgokcHJvbXB0ID0gJHF1ZXN0aW9uLT5nZXRQcm9tcHQoKTsKfQoKJG91dHB1dC0+d3JpdGUoJHByb21wdCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB3cml0ZUVycm9yKE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBcRXhjZXB0aW9uICRlcnJvcikKewppZiAoJG91dHB1dCBpbnN0YW5jZW9mIFN5bWZvbnlTdHlsZSkgewokb3V0cHV0LT5uZXdMaW5lKCk7CiRvdXRwdXQtPmVycm9yKCRlcnJvci0+Z2V0TWVzc2FnZSgpKTsKCnJldHVybjsKfQoKcGFyZW50Ojp3cml0ZUVycm9yKCRvdXRwdXQsICRlcnJvcik7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0RW9mU2hvcnRjdXQoKTogc3RyaW5nCnsKaWYgKCdXaW5kb3dzJyA9PT0gXFBIUF9PU19GQU1JTFkpIHsKcmV0dXJuICc8Y29tbWVudD5DdHJsK1o8L2NvbW1lbnQ+IHRoZW4gPGNvbW1lbnQ+RW50ZXI8L2NvbW1lbnQ+JzsKfQoKcmV0dXJuICc8Y29tbWVudD5DdHJsK0Q8L2NvbW1lbnQ+JzsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cUnVudGltZUV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXFdyYXBwYWJsZU91dHB1dEZvcm1hdHRlckludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVTZWN0aW9uT3V0cHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKCgoKCgoKY2xhc3MgVGFibGUKewpwcml2YXRlIGNvbnN0IFNFUEFSQVRPUl9UT1AgPSAwOwpwcml2YXRlIGNvbnN0IFNFUEFSQVRPUl9UT1BfQk9UVE9NID0gMTsKcHJpdmF0ZSBjb25zdCBTRVBBUkFUT1JfTUlEID0gMjsKcHJpdmF0ZSBjb25zdCBTRVBBUkFUT1JfQk9UVE9NID0gMzsKcHJpdmF0ZSBjb25zdCBCT1JERVJfT1VUU0lERSA9IDA7CnByaXZhdGUgY29uc3QgQk9SREVSX0lOU0lERSA9IDE7Cgpwcml2YXRlICRoZWFkZXJUaXRsZTsKcHJpdmF0ZSAkZm9vdGVyVGl0bGU7CgoKCgpwcml2YXRlICRoZWFkZXJzID0gW107CgoKCgpwcml2YXRlICRyb3dzID0gW107CnByaXZhdGUgJGhvcml6b250YWwgPSBmYWxzZTsKCgoKCnByaXZhdGUgJGVmZmVjdGl2ZUNvbHVtbldpZHRocyA9IFtdOwoKCgoKCgpwcml2YXRlICRudW1iZXJPZkNvbHVtbnM7CgoKCgpwcml2YXRlICRvdXRwdXQ7CgoKCgpwcml2YXRlICRzdHlsZTsKCgoKCnByaXZhdGUgJGNvbHVtblN0eWxlcyA9IFtdOwoKCgoKCgpwcml2YXRlICRjb2x1bW5XaWR0aHMgPSBbXTsKcHJpdmF0ZSAkY29sdW1uTWF4V2lkdGhzID0gW107CgoKCgpwcml2YXRlIHN0YXRpYyAkc3R5bGVzOwoKcHJpdmF0ZSAkcmVuZGVyZWQgPSBmYWxzZTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewokdGhpcy0+b3V0cHV0ID0gJG91dHB1dDsKCmlmICghc2VsZjo6JHN0eWxlcykgewpzZWxmOjokc3R5bGVzID0gc2VsZjo6aW5pdFN0eWxlcygpOwp9CgokdGhpcy0+c2V0U3R5bGUoJ2RlZmF1bHQnKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRTdHlsZURlZmluaXRpb24oc3RyaW5nICRuYW1lLCBUYWJsZVN0eWxlICRzdHlsZSkKewppZiAoIXNlbGY6OiRzdHlsZXMpIHsKc2VsZjo6JHN0eWxlcyA9IHNlbGY6OmluaXRTdHlsZXMoKTsKfQoKc2VsZjo6JHN0eWxlc1skbmFtZV0gPSAkc3R5bGU7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRTdHlsZURlZmluaXRpb24oc3RyaW5nICRuYW1lKQp7CmlmICghc2VsZjo6JHN0eWxlcykgewpzZWxmOjokc3R5bGVzID0gc2VsZjo6aW5pdFN0eWxlcygpOwp9CgppZiAoaXNzZXQoc2VsZjo6JHN0eWxlc1skbmFtZV0pKSB7CnJldHVybiBzZWxmOjokc3R5bGVzWyRuYW1lXTsKfQoKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdTdHlsZSAiJXMiIGlzIG5vdCBkZWZpbmVkLicsICRuYW1lKSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U3R5bGUoJG5hbWUpCnsKJHRoaXMtPnN0eWxlID0gJHRoaXMtPnJlc29sdmVTdHlsZSgkbmFtZSk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0eWxlKCkKewpyZXR1cm4gJHRoaXMtPnN0eWxlOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldENvbHVtblN0eWxlKGludCAkY29sdW1uSW5kZXgsICRuYW1lKQp7CiR0aGlzLT5jb2x1bW5TdHlsZXNbJGNvbHVtbkluZGV4XSA9ICR0aGlzLT5yZXNvbHZlU3R5bGUoJG5hbWUpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbHVtblN0eWxlKGludCAkY29sdW1uSW5kZXgpCnsKcmV0dXJuICR0aGlzLT5jb2x1bW5TdHlsZXNbJGNvbHVtbkluZGV4XSA/PyAkdGhpcy0+Z2V0U3R5bGUoKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29sdW1uV2lkdGgoaW50ICRjb2x1bW5JbmRleCwgaW50ICR3aWR0aCkKewokdGhpcy0+Y29sdW1uV2lkdGhzWyRjb2x1bW5JbmRleF0gPSAkd2lkdGg7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldENvbHVtbldpZHRocyhhcnJheSAkd2lkdGhzKQp7CiR0aGlzLT5jb2x1bW5XaWR0aHMgPSBbXTsKZm9yZWFjaCAoJHdpZHRocyBhcyAkaW5kZXggPT4gJHdpZHRoKSB7CiR0aGlzLT5zZXRDb2x1bW5XaWR0aCgkaW5kZXgsICR3aWR0aCk7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29sdW1uTWF4V2lkdGgoaW50ICRjb2x1bW5JbmRleCwgaW50ICR3aWR0aCk6IHNlbGYKewppZiAoISR0aGlzLT5vdXRwdXQtPmdldEZvcm1hdHRlcigpIGluc3RhbmNlb2YgV3JhcHBhYmxlT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oc3ByaW50ZignU2V0dGluZyBhIG1heGltdW0gY29sdW1uIHdpZHRoIGlzIG9ubHkgc3VwcG9ydGVkIHdoZW4gdXNpbmcgYSAiJXMiIGZvcm1hdHRlciwgZ290ICIlcyIuJywgV3JhcHBhYmxlT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlOjpjbGFzcywgZ2V0X2RlYnVnX3R5cGUoJHRoaXMtPm91dHB1dC0+Z2V0Rm9ybWF0dGVyKCkpKSk7Cn0KCiR0aGlzLT5jb2x1bW5NYXhXaWR0aHNbJGNvbHVtbkluZGV4XSA9ICR3aWR0aDsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEhlYWRlcnMoYXJyYXkgJGhlYWRlcnMpCnsKJGhlYWRlcnMgPSBhcnJheV92YWx1ZXMoJGhlYWRlcnMpOwppZiAoIWVtcHR5KCRoZWFkZXJzKSAmJiAhXGlzX2FycmF5KCRoZWFkZXJzWzBdKSkgewokaGVhZGVycyA9IFskaGVhZGVyc107Cn0KCiR0aGlzLT5oZWFkZXJzID0gJGhlYWRlcnM7CgpyZXR1cm4gJHRoaXM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRSb3dzKGFycmF5ICRyb3dzKQp7CiR0aGlzLT5yb3dzID0gW107CgpyZXR1cm4gJHRoaXMtPmFkZFJvd3MoJHJvd3MpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkUm93cyhhcnJheSAkcm93cykKewpmb3JlYWNoICgkcm93cyBhcyAkcm93KSB7CiR0aGlzLT5hZGRSb3coJHJvdyk7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFJvdygkcm93KQp7CmlmICgkcm93IGluc3RhbmNlb2YgVGFibGVTZXBhcmF0b3IpIHsKJHRoaXMtPnJvd3NbXSA9ICRyb3c7CgpyZXR1cm4gJHRoaXM7Cn0KCmlmICghXGlzX2FycmF5KCRyb3cpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0Egcm93IG11c3QgYmUgYW4gYXJyYXkgb3IgYSBUYWJsZVNlcGFyYXRvciBpbnN0YW5jZS4nKTsKfQoKJHRoaXMtPnJvd3NbXSA9IGFycmF5X3ZhbHVlcygkcm93KTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXBwZW5kUm93KCRyb3cpOiBzZWxmCnsKaWYgKCEkdGhpcy0+b3V0cHV0IGluc3RhbmNlb2YgQ29uc29sZVNlY3Rpb25PdXRwdXQpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZignT3V0cHV0IHNob3VsZCBiZSBhbiBpbnN0YW5jZSBvZiAiJXMiIHdoZW4gY2FsbGluZyAiJXMiLicsIENvbnNvbGVTZWN0aW9uT3V0cHV0OjpjbGFzcywgX19NRVRIT0RfXykpOwp9CgppZiAoJHRoaXMtPnJlbmRlcmVkKSB7CiR0aGlzLT5vdXRwdXQtPmNsZWFyKCR0aGlzLT5jYWxjdWxhdGVSb3dDb3VudCgpKTsKfQoKJHRoaXMtPmFkZFJvdygkcm93KTsKJHRoaXMtPnJlbmRlcigpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Um93KCRjb2x1bW4sIGFycmF5ICRyb3cpCnsKJHRoaXMtPnJvd3NbJGNvbHVtbl0gPSAkcm93OwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SGVhZGVyVGl0bGUoP3N0cmluZyAkdGl0bGUpOiBzZWxmCnsKJHRoaXMtPmhlYWRlclRpdGxlID0gJHRpdGxlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Rm9vdGVyVGl0bGUoP3N0cmluZyAkdGl0bGUpOiBzZWxmCnsKJHRoaXMtPmZvb3RlclRpdGxlID0gJHRpdGxlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SG9yaXpvbnRhbChib29sICRob3Jpem9udGFsID0gdHJ1ZSk6IHNlbGYKewokdGhpcy0+aG9yaXpvbnRhbCA9ICRob3Jpem9udGFsOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbmRlcigpCnsKJGRpdmlkZXIgPSBuZXcgVGFibGVTZXBhcmF0b3IoKTsKaWYgKCR0aGlzLT5ob3Jpem9udGFsKSB7CiRyb3dzID0gW107CmZvcmVhY2ggKCR0aGlzLT5oZWFkZXJzWzBdID8/IFtdIGFzICRpID0+ICRoZWFkZXIpIHsKJHJvd3NbJGldID0gWyRoZWFkZXJdOwpmb3JlYWNoICgkdGhpcy0+cm93cyBhcyAkcm93KSB7CmlmICgkcm93IGluc3RhbmNlb2YgVGFibGVTZXBhcmF0b3IpIHsKY29udGludWU7Cn0KaWYgKGlzc2V0KCRyb3dbJGldKSkgewokcm93c1skaV1bXSA9ICRyb3dbJGldOwp9IGVsc2VpZiAoJHJvd3NbJGldWzBdIGluc3RhbmNlb2YgVGFibGVDZWxsICYmICRyb3dzWyRpXVswXS0+Z2V0Q29sc3BhbigpID49IDIpIHsKCn0gZWxzZSB7CiRyb3dzWyRpXVtdID0gbnVsbDsKfQp9Cn0KfSBlbHNlIHsKJHJvd3MgPSBhcnJheV9tZXJnZSgkdGhpcy0+aGVhZGVycywgWyRkaXZpZGVyXSwgJHRoaXMtPnJvd3MpOwp9CgokdGhpcy0+Y2FsY3VsYXRlTnVtYmVyT2ZDb2x1bW5zKCRyb3dzKTsKCiRyb3dHcm91cHMgPSAkdGhpcy0+YnVpbGRUYWJsZVJvd3MoJHJvd3MpOwokdGhpcy0+Y2FsY3VsYXRlQ29sdW1uc1dpZHRoKCRyb3dHcm91cHMpOwoKJGlzSGVhZGVyID0gISR0aGlzLT5ob3Jpem9udGFsOwokaXNGaXJzdFJvdyA9ICR0aGlzLT5ob3Jpem9udGFsOwokaGFzVGl0bGUgPSAoYm9vbCkgJHRoaXMtPmhlYWRlclRpdGxlOwoKZm9yZWFjaCAoJHJvd0dyb3VwcyBhcyAkcm93R3JvdXApIHsKJGlzSGVhZGVyU2VwYXJhdG9yUmVuZGVyZWQgPSBmYWxzZTsKCmZvcmVhY2ggKCRyb3dHcm91cCBhcyAkcm93KSB7CmlmICgkZGl2aWRlciA9PT0gJHJvdykgewokaXNIZWFkZXIgPSBmYWxzZTsKJGlzRmlyc3RSb3cgPSB0cnVlOwoKY29udGludWU7Cn0KCmlmICgkcm93IGluc3RhbmNlb2YgVGFibGVTZXBhcmF0b3IpIHsKJHRoaXMtPnJlbmRlclJvd1NlcGFyYXRvcigpOwoKY29udGludWU7Cn0KCmlmICghJHJvdykgewpjb250aW51ZTsKfQoKaWYgKCRpc0hlYWRlciAmJiAhJGlzSGVhZGVyU2VwYXJhdG9yUmVuZGVyZWQpIHsKJHRoaXMtPnJlbmRlclJvd1NlcGFyYXRvcigKJGlzSGVhZGVyID8gc2VsZjo6U0VQQVJBVE9SX1RPUCA6IHNlbGY6OlNFUEFSQVRPUl9UT1BfQk9UVE9NLAokaGFzVGl0bGUgPyAkdGhpcy0+aGVhZGVyVGl0bGUgOiBudWxsLAokaGFzVGl0bGUgPyAkdGhpcy0+c3R5bGUtPmdldEhlYWRlclRpdGxlRm9ybWF0KCkgOiBudWxsCik7CiRoYXNUaXRsZSA9IGZhbHNlOwokaXNIZWFkZXJTZXBhcmF0b3JSZW5kZXJlZCA9IHRydWU7Cn0KCmlmICgkaXNGaXJzdFJvdykgewokdGhpcy0+cmVuZGVyUm93U2VwYXJhdG9yKAokaXNIZWFkZXIgPyBzZWxmOjpTRVBBUkFUT1JfVE9QIDogc2VsZjo6U0VQQVJBVE9SX1RPUF9CT1RUT00sCiRoYXNUaXRsZSA/ICR0aGlzLT5oZWFkZXJUaXRsZSA6IG51bGwsCiRoYXNUaXRsZSA/ICR0aGlzLT5zdHlsZS0+Z2V0SGVhZGVyVGl0bGVGb3JtYXQoKSA6IG51bGwKKTsKJGlzRmlyc3RSb3cgPSBmYWxzZTsKJGhhc1RpdGxlID0gZmFsc2U7Cn0KCmlmICgkdGhpcy0+aG9yaXpvbnRhbCkgewokdGhpcy0+cmVuZGVyUm93KCRyb3csICR0aGlzLT5zdHlsZS0+Z2V0Q2VsbFJvd0Zvcm1hdCgpLCAkdGhpcy0+c3R5bGUtPmdldENlbGxIZWFkZXJGb3JtYXQoKSk7Cn0gZWxzZSB7CiR0aGlzLT5yZW5kZXJSb3coJHJvdywgJGlzSGVhZGVyID8gJHRoaXMtPnN0eWxlLT5nZXRDZWxsSGVhZGVyRm9ybWF0KCkgOiAkdGhpcy0+c3R5bGUtPmdldENlbGxSb3dGb3JtYXQoKSk7Cn0KfQp9CiR0aGlzLT5yZW5kZXJSb3dTZXBhcmF0b3Ioc2VsZjo6U0VQQVJBVE9SX0JPVFRPTSwgJHRoaXMtPmZvb3RlclRpdGxlLCAkdGhpcy0+c3R5bGUtPmdldEZvb3RlclRpdGxlRm9ybWF0KCkpOwoKJHRoaXMtPmNsZWFudXAoKTsKJHRoaXMtPnJlbmRlcmVkID0gdHJ1ZTsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVuZGVyUm93U2VwYXJhdG9yKGludCAkdHlwZSA9IHNlbGY6OlNFUEFSQVRPUl9NSUQsID9zdHJpbmcgJHRpdGxlID0gbnVsbCwgP3N0cmluZyAkdGl0bGVGb3JtYXQgPSBudWxsKQp7CmlmICgwID09PSAkY291bnQgPSAkdGhpcy0+bnVtYmVyT2ZDb2x1bW5zKSB7CnJldHVybjsKfQoKJGJvcmRlcnMgPSAkdGhpcy0+c3R5bGUtPmdldEJvcmRlckNoYXJzKCk7CmlmICghJGJvcmRlcnNbMF0gJiYgISRib3JkZXJzWzJdICYmICEkdGhpcy0+c3R5bGUtPmdldENyb3NzaW5nQ2hhcigpKSB7CnJldHVybjsKfQoKJGNyb3NzaW5ncyA9ICR0aGlzLT5zdHlsZS0+Z2V0Q3Jvc3NpbmdDaGFycygpOwppZiAoc2VsZjo6U0VQQVJBVE9SX01JRCA9PT0gJHR5cGUpIHsKWyRob3Jpem9udGFsLCAkbGVmdENoYXIsICRtaWRDaGFyLCAkcmlnaHRDaGFyXSA9IFskYm9yZGVyc1syXSwgJGNyb3NzaW5nc1s4XSwgJGNyb3NzaW5nc1swXSwgJGNyb3NzaW5nc1s0XV07Cn0gZWxzZWlmIChzZWxmOjpTRVBBUkFUT1JfVE9QID09PSAkdHlwZSkgewpbJGhvcml6b250YWwsICRsZWZ0Q2hhciwgJG1pZENoYXIsICRyaWdodENoYXJdID0gWyRib3JkZXJzWzBdLCAkY3Jvc3NpbmdzWzFdLCAkY3Jvc3NpbmdzWzJdLCAkY3Jvc3NpbmdzWzNdXTsKfSBlbHNlaWYgKHNlbGY6OlNFUEFSQVRPUl9UT1BfQk9UVE9NID09PSAkdHlwZSkgewpbJGhvcml6b250YWwsICRsZWZ0Q2hhciwgJG1pZENoYXIsICRyaWdodENoYXJdID0gWyRib3JkZXJzWzBdLCAkY3Jvc3NpbmdzWzldLCAkY3Jvc3NpbmdzWzEwXSwgJGNyb3NzaW5nc1sxMV1dOwp9IGVsc2UgewpbJGhvcml6b250YWwsICRsZWZ0Q2hhciwgJG1pZENoYXIsICRyaWdodENoYXJdID0gWyRib3JkZXJzWzBdLCAkY3Jvc3NpbmdzWzddLCAkY3Jvc3NpbmdzWzZdLCAkY3Jvc3NpbmdzWzVdXTsKfQoKJG1hcmt1cCA9ICRsZWZ0Q2hhcjsKZm9yICgkY29sdW1uID0gMDsgJGNvbHVtbiA8ICRjb3VudDsgKyskY29sdW1uKSB7CiRtYXJrdXAgLj0gc3RyX3JlcGVhdCgkaG9yaXpvbnRhbCwgJHRoaXMtPmVmZmVjdGl2ZUNvbHVtbldpZHRoc1skY29sdW1uXSk7CiRtYXJrdXAgLj0gJGNvbHVtbiA9PT0gJGNvdW50IC0gMSA/ICRyaWdodENoYXIgOiAkbWlkQ2hhcjsKfQoKaWYgKG51bGwgIT09ICR0aXRsZSkgewokdGl0bGVMZW5ndGggPSBIZWxwZXI6OndpZHRoKEhlbHBlcjo6cmVtb3ZlRGVjb3JhdGlvbigkZm9ybWF0dGVyID0gJHRoaXMtPm91dHB1dC0+Z2V0Rm9ybWF0dGVyKCksICRmb3JtYXR0ZWRUaXRsZSA9IHNwcmludGYoJHRpdGxlRm9ybWF0LCAkdGl0bGUpKSk7CiRtYXJrdXBMZW5ndGggPSBIZWxwZXI6OndpZHRoKCRtYXJrdXApOwppZiAoJHRpdGxlTGVuZ3RoID4gJGxpbWl0ID0gJG1hcmt1cExlbmd0aCAtIDQpIHsKJHRpdGxlTGVuZ3RoID0gJGxpbWl0OwokZm9ybWF0TGVuZ3RoID0gSGVscGVyOjp3aWR0aChIZWxwZXI6OnJlbW92ZURlY29yYXRpb24oJGZvcm1hdHRlciwgc3ByaW50ZigkdGl0bGVGb3JtYXQsICcnKSkpOwokZm9ybWF0dGVkVGl0bGUgPSBzcHJpbnRmKCR0aXRsZUZvcm1hdCwgSGVscGVyOjpzdWJzdHIoJHRpdGxlLCAwLCAkbGltaXQgLSAkZm9ybWF0TGVuZ3RoIC0gMykuJy4uLicpOwp9CgokdGl0bGVTdGFydCA9IGludGRpdigkbWFya3VwTGVuZ3RoIC0gJHRpdGxlTGVuZ3RoLCAyKTsKaWYgKGZhbHNlID09PSBtYl9kZXRlY3RfZW5jb2RpbmcoJG1hcmt1cCwgbnVsbCwgdHJ1ZSkpIHsKJG1hcmt1cCA9IHN1YnN0cl9yZXBsYWNlKCRtYXJrdXAsICRmb3JtYXR0ZWRUaXRsZSwgJHRpdGxlU3RhcnQsICR0aXRsZUxlbmd0aCk7Cn0gZWxzZSB7CiRtYXJrdXAgPSBtYl9zdWJzdHIoJG1hcmt1cCwgMCwgJHRpdGxlU3RhcnQpLiRmb3JtYXR0ZWRUaXRsZS5tYl9zdWJzdHIoJG1hcmt1cCwgJHRpdGxlU3RhcnQgKyAkdGl0bGVMZW5ndGgpOwp9Cn0KCiR0aGlzLT5vdXRwdXQtPndyaXRlbG4oc3ByaW50ZigkdGhpcy0+c3R5bGUtPmdldEJvcmRlckZvcm1hdCgpLCAkbWFya3VwKSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVuZGVyQ29sdW1uU2VwYXJhdG9yKGludCAkdHlwZSA9IHNlbGY6OkJPUkRFUl9PVVRTSURFKTogc3RyaW5nCnsKJGJvcmRlcnMgPSAkdGhpcy0+c3R5bGUtPmdldEJvcmRlckNoYXJzKCk7CgpyZXR1cm4gc3ByaW50ZigkdGhpcy0+c3R5bGUtPmdldEJvcmRlckZvcm1hdCgpLCBzZWxmOjpCT1JERVJfT1VUU0lERSA9PT0gJHR5cGUgPyAkYm9yZGVyc1sxXSA6ICRib3JkZXJzWzNdKTsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVuZGVyUm93KGFycmF5ICRyb3csIHN0cmluZyAkY2VsbEZvcm1hdCwgP3N0cmluZyAkZmlyc3RDZWxsRm9ybWF0ID0gbnVsbCkKewokcm93Q29udGVudCA9ICR0aGlzLT5yZW5kZXJDb2x1bW5TZXBhcmF0b3Ioc2VsZjo6Qk9SREVSX09VVFNJREUpOwokY29sdW1ucyA9ICR0aGlzLT5nZXRSb3dDb2x1bW5zKCRyb3cpOwokbGFzdCA9IFxjb3VudCgkY29sdW1ucykgLSAxOwpmb3JlYWNoICgkY29sdW1ucyBhcyAkaSA9PiAkY29sdW1uKSB7CmlmICgkZmlyc3RDZWxsRm9ybWF0ICYmIDAgPT09ICRpKSB7CiRyb3dDb250ZW50IC49ICR0aGlzLT5yZW5kZXJDZWxsKCRyb3csICRjb2x1bW4sICRmaXJzdENlbGxGb3JtYXQpOwp9IGVsc2Ugewokcm93Q29udGVudCAuPSAkdGhpcy0+cmVuZGVyQ2VsbCgkcm93LCAkY29sdW1uLCAkY2VsbEZvcm1hdCk7Cn0KJHJvd0NvbnRlbnQgLj0gJHRoaXMtPnJlbmRlckNvbHVtblNlcGFyYXRvcigkbGFzdCA9PT0gJGkgPyBzZWxmOjpCT1JERVJfT1VUU0lERSA6IHNlbGY6OkJPUkRFUl9JTlNJREUpOwp9CiR0aGlzLT5vdXRwdXQtPndyaXRlbG4oJHJvd0NvbnRlbnQpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlbmRlckNlbGwoYXJyYXkgJHJvdywgaW50ICRjb2x1bW4sIHN0cmluZyAkY2VsbEZvcm1hdCk6IHN0cmluZwp7CiRjZWxsID0gJHJvd1skY29sdW1uXSA/PyAnJzsKJHdpZHRoID0gJHRoaXMtPmVmZmVjdGl2ZUNvbHVtbldpZHRoc1skY29sdW1uXTsKaWYgKCRjZWxsIGluc3RhbmNlb2YgVGFibGVDZWxsICYmICRjZWxsLT5nZXRDb2xzcGFuKCkgPiAxKSB7Cgpmb3JlYWNoIChyYW5nZSgkY29sdW1uICsgMSwgJGNvbHVtbiArICRjZWxsLT5nZXRDb2xzcGFuKCkgLSAxKSBhcyAkbmV4dENvbHVtbikgewokd2lkdGggKz0gJHRoaXMtPmdldENvbHVtblNlcGFyYXRvcldpZHRoKCkgKyAkdGhpcy0+ZWZmZWN0aXZlQ29sdW1uV2lkdGhzWyRuZXh0Q29sdW1uXTsKfQp9CgoKaWYgKGZhbHNlICE9PSAkZW5jb2RpbmcgPSBtYl9kZXRlY3RfZW5jb2RpbmcoJGNlbGwsIG51bGwsIHRydWUpKSB7CiR3aWR0aCArPSBcc3RybGVuKCRjZWxsKSAtIG1iX3N0cndpZHRoKCRjZWxsLCAkZW5jb2RpbmcpOwp9Cgokc3R5bGUgPSAkdGhpcy0+Z2V0Q29sdW1uU3R5bGUoJGNvbHVtbik7CgppZiAoJGNlbGwgaW5zdGFuY2VvZiBUYWJsZVNlcGFyYXRvcikgewpyZXR1cm4gc3ByaW50Zigkc3R5bGUtPmdldEJvcmRlckZvcm1hdCgpLCBzdHJfcmVwZWF0KCRzdHlsZS0+Z2V0Qm9yZGVyQ2hhcnMoKVsyXSwgJHdpZHRoKSk7Cn0KCiR3aWR0aCArPSBIZWxwZXI6Omxlbmd0aCgkY2VsbCkgLSBIZWxwZXI6Omxlbmd0aChIZWxwZXI6OnJlbW92ZURlY29yYXRpb24oJHRoaXMtPm91dHB1dC0+Z2V0Rm9ybWF0dGVyKCksICRjZWxsKSk7CiRjb250ZW50ID0gc3ByaW50Zigkc3R5bGUtPmdldENlbGxSb3dDb250ZW50Rm9ybWF0KCksICRjZWxsKTsKCiRwYWRUeXBlID0gJHN0eWxlLT5nZXRQYWRUeXBlKCk7CmlmICgkY2VsbCBpbnN0YW5jZW9mIFRhYmxlQ2VsbCAmJiAkY2VsbC0+Z2V0U3R5bGUoKSBpbnN0YW5jZW9mIFRhYmxlQ2VsbFN0eWxlKSB7CiRpc05vdFN0eWxlZEJ5VGFnID0gIXByZWdfbWF0Y2goJy9ePChcdyt8KFx3Kz1bXHcsXSs7PykqKT4uKzxcLyhcdyt8KFx3Kz1cdys7PykqKT8+JC8nLCAkY2VsbCk7CmlmICgkaXNOb3RTdHlsZWRCeVRhZykgewokY2VsbEZvcm1hdCA9ICRjZWxsLT5nZXRTdHlsZSgpLT5nZXRDZWxsRm9ybWF0KCk7CmlmICghXGlzX3N0cmluZygkY2VsbEZvcm1hdCkpIHsKJHRhZyA9IGh0dHBfYnVpbGRfcXVlcnkoJGNlbGwtPmdldFN0eWxlKCktPmdldFRhZ09wdGlvbnMoKSwgJycsICc7Jyk7CiRjZWxsRm9ybWF0ID0gJzwnLiR0YWcuJz4lczwvPic7Cn0KCmlmIChzdHJzdHIoJGNvbnRlbnQsICc8Lz4nKSkgewokY29udGVudCA9IHN0cl9yZXBsYWNlKCc8Lz4nLCAnJywgJGNvbnRlbnQpOwokd2lkdGggLT0gMzsKfQppZiAoc3Ryc3RyKCRjb250ZW50LCAnPGZnPWRlZmF1bHQ7Ymc9ZGVmYXVsdD4nKSkgewokY29udGVudCA9IHN0cl9yZXBsYWNlKCc8Zmc9ZGVmYXVsdDtiZz1kZWZhdWx0PicsICcnLCAkY29udGVudCk7CiR3aWR0aCAtPSBcc3RybGVuKCc8Zmc9ZGVmYXVsdDtiZz1kZWZhdWx0PicpOwp9Cn0KCiRwYWRUeXBlID0gJGNlbGwtPmdldFN0eWxlKCktPmdldFBhZEJ5QWxpZ24oKTsKfQoKcmV0dXJuIHNwcmludGYoJGNlbGxGb3JtYXQsIHN0cl9wYWQoJGNvbnRlbnQsICR3aWR0aCwgJHN0eWxlLT5nZXRQYWRkaW5nQ2hhcigpLCAkcGFkVHlwZSkpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNhbGN1bGF0ZU51bWJlck9mQ29sdW1ucyhhcnJheSAkcm93cykKewokY29sdW1ucyA9IFswXTsKZm9yZWFjaCAoJHJvd3MgYXMgJHJvdykgewppZiAoJHJvdyBpbnN0YW5jZW9mIFRhYmxlU2VwYXJhdG9yKSB7CmNvbnRpbnVlOwp9CgokY29sdW1uc1tdID0gJHRoaXMtPmdldE51bWJlck9mQ29sdW1ucygkcm93KTsKfQoKJHRoaXMtPm51bWJlck9mQ29sdW1ucyA9IG1heCgkY29sdW1ucyk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gYnVpbGRUYWJsZVJvd3MoYXJyYXkgJHJvd3MpOiBUYWJsZVJvd3MKewoKJGZvcm1hdHRlciA9ICR0aGlzLT5vdXRwdXQtPmdldEZvcm1hdHRlcigpOwokdW5tZXJnZWRSb3dzID0gW107CmZvciAoJHJvd0tleSA9IDA7ICRyb3dLZXkgPCBcY291bnQoJHJvd3MpOyArKyRyb3dLZXkpIHsKJHJvd3MgPSAkdGhpcy0+ZmlsbE5leHRSb3dzKCRyb3dzLCAkcm93S2V5KTsKCgpmb3JlYWNoICgkcm93c1skcm93S2V5XSBhcyAkY29sdW1uID0+ICRjZWxsKSB7CiRjb2xzcGFuID0gJGNlbGwgaW5zdGFuY2VvZiBUYWJsZUNlbGwgPyAkY2VsbC0+Z2V0Q29sc3BhbigpIDogMTsKCmlmIChpc3NldCgkdGhpcy0+Y29sdW1uTWF4V2lkdGhzWyRjb2x1bW5dKSAmJiBIZWxwZXI6OndpZHRoKEhlbHBlcjo6cmVtb3ZlRGVjb3JhdGlvbigkZm9ybWF0dGVyLCAkY2VsbCkpID4gJHRoaXMtPmNvbHVtbk1heFdpZHRoc1skY29sdW1uXSkgewokY2VsbCA9ICRmb3JtYXR0ZXItPmZvcm1hdEFuZFdyYXAoJGNlbGwsICR0aGlzLT5jb2x1bW5NYXhXaWR0aHNbJGNvbHVtbl0gKiAkY29sc3Bhbik7Cn0KaWYgKCFzdHJzdHIoJGNlbGwgPz8gJycsICJcbiIpKSB7CmNvbnRpbnVlOwp9CiRlb2wgPSBzdHJfY29udGFpbnMoJGNlbGwgPz8gJycsICJcclxuIikgPyAiXHJcbiIgOiAiXG4iOwokZXNjYXBlZCA9IGltcGxvZGUoJGVvbCwgYXJyYXlfbWFwKFtPdXRwdXRGb3JtYXR0ZXI6OmNsYXNzLCAnZXNjYXBlVHJhaWxpbmdCYWNrc2xhc2gnXSwgZXhwbG9kZSgkZW9sLCAkY2VsbCkpKTsKJGNlbGwgPSAkY2VsbCBpbnN0YW5jZW9mIFRhYmxlQ2VsbCA/IG5ldyBUYWJsZUNlbGwoJGVzY2FwZWQsIFsnY29sc3BhbicgPT4gJGNlbGwtPmdldENvbHNwYW4oKV0pIDogJGVzY2FwZWQ7CiRsaW5lcyA9IGV4cGxvZGUoJGVvbCwgc3RyX3JlcGxhY2UoJGVvbCwgJzxmZz1kZWZhdWx0O2JnPWRlZmF1bHQ+PC8+Jy4kZW9sLCAkY2VsbCkpOwpmb3JlYWNoICgkbGluZXMgYXMgJGxpbmVLZXkgPT4gJGxpbmUpIHsKaWYgKCRjb2xzcGFuID4gMSkgewokbGluZSA9IG5ldyBUYWJsZUNlbGwoJGxpbmUsIFsnY29sc3BhbicgPT4gJGNvbHNwYW5dKTsKfQppZiAoMCA9PT0gJGxpbmVLZXkpIHsKJHJvd3NbJHJvd0tleV1bJGNvbHVtbl0gPSAkbGluZTsKfSBlbHNlIHsKaWYgKCFcYXJyYXlfa2V5X2V4aXN0cygkcm93S2V5LCAkdW5tZXJnZWRSb3dzKSB8fCAhXGFycmF5X2tleV9leGlzdHMoJGxpbmVLZXksICR1bm1lcmdlZFJvd3NbJHJvd0tleV0pKSB7CiR1bm1lcmdlZFJvd3NbJHJvd0tleV1bJGxpbmVLZXldID0gJHRoaXMtPmNvcHlSb3coJHJvd3MsICRyb3dLZXkpOwp9CiR1bm1lcmdlZFJvd3NbJHJvd0tleV1bJGxpbmVLZXldWyRjb2x1bW5dID0gJGxpbmU7Cn0KfQp9Cn0KCnJldHVybiBuZXcgVGFibGVSb3dzKGZ1bmN0aW9uICgpIHVzZSAoJHJvd3MsICR1bm1lcmdlZFJvd3MpOiBcVHJhdmVyc2FibGUgewpmb3JlYWNoICgkcm93cyBhcyAkcm93S2V5ID0+ICRyb3cpIHsKJHJvd0dyb3VwID0gWyRyb3cgaW5zdGFuY2VvZiBUYWJsZVNlcGFyYXRvciA/ICRyb3cgOiAkdGhpcy0+ZmlsbENlbGxzKCRyb3cpXTsKCmlmIChpc3NldCgkdW5tZXJnZWRSb3dzWyRyb3dLZXldKSkgewpmb3JlYWNoICgkdW5tZXJnZWRSb3dzWyRyb3dLZXldIGFzICRyb3cpIHsKJHJvd0dyb3VwW10gPSAkcm93IGluc3RhbmNlb2YgVGFibGVTZXBhcmF0b3IgPyAkcm93IDogJHRoaXMtPmZpbGxDZWxscygkcm93KTsKfQp9CnlpZWxkICRyb3dHcm91cDsKfQp9KTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjYWxjdWxhdGVSb3dDb3VudCgpOiBpbnQKewokbnVtYmVyT2ZSb3dzID0gXGNvdW50KGl0ZXJhdG9yX3RvX2FycmF5KCR0aGlzLT5idWlsZFRhYmxlUm93cyhhcnJheV9tZXJnZSgkdGhpcy0+aGVhZGVycywgW25ldyBUYWJsZVNlcGFyYXRvcigpXSwgJHRoaXMtPnJvd3MpKSkpOwoKaWYgKCR0aGlzLT5oZWFkZXJzKSB7CisrJG51bWJlck9mUm93czsgCn0KCmlmIChcY291bnQoJHRoaXMtPnJvd3MpID4gMCkgeworKyRudW1iZXJPZlJvd3M7IAp9CgpyZXR1cm4gJG51bWJlck9mUm93czsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGZpbGxOZXh0Um93cyhhcnJheSAkcm93cywgaW50ICRsaW5lKTogYXJyYXkKewokdW5tZXJnZWRSb3dzID0gW107CmZvcmVhY2ggKCRyb3dzWyRsaW5lXSBhcyAkY29sdW1uID0+ICRjZWxsKSB7CmlmIChudWxsICE9PSAkY2VsbCAmJiAhJGNlbGwgaW5zdGFuY2VvZiBUYWJsZUNlbGwgJiYgIVxpc19zY2FsYXIoJGNlbGwpICYmICEoXGlzX29iamVjdCgkY2VsbCkgJiYgbWV0aG9kX2V4aXN0cygkY2VsbCwgJ19fdG9TdHJpbmcnKSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdBIGNlbGwgbXVzdCBiZSBhIFRhYmxlQ2VsbCwgYSBzY2FsYXIgb3IgYW4gb2JqZWN0IGltcGxlbWVudGluZyAiX190b1N0cmluZygpIiwgIiVzIiBnaXZlbi4nLCBnZXRfZGVidWdfdHlwZSgkY2VsbCkpKTsKfQppZiAoJGNlbGwgaW5zdGFuY2VvZiBUYWJsZUNlbGwgJiYgJGNlbGwtPmdldFJvd3NwYW4oKSA+IDEpIHsKJG5iTGluZXMgPSAkY2VsbC0+Z2V0Um93c3BhbigpIC0gMTsKJGxpbmVzID0gWyRjZWxsXTsKaWYgKHN0cnN0cigkY2VsbCwgIlxuIikpIHsKJGVvbCA9IHN0cl9jb250YWlucygkY2VsbCwgIlxyXG4iKSA/ICJcclxuIiA6ICJcbiI7CiRsaW5lcyA9IGV4cGxvZGUoJGVvbCwgc3RyX3JlcGxhY2UoJGVvbCwgJzxmZz1kZWZhdWx0O2JnPWRlZmF1bHQ+Jy4kZW9sLic8Lz4nLCAkY2VsbCkpOwokbmJMaW5lcyA9IFxjb3VudCgkbGluZXMpID4gJG5iTGluZXMgPyBzdWJzdHJfY291bnQoJGNlbGwsICRlb2wpIDogJG5iTGluZXM7Cgokcm93c1skbGluZV1bJGNvbHVtbl0gPSBuZXcgVGFibGVDZWxsKCRsaW5lc1swXSwgWydjb2xzcGFuJyA9PiAkY2VsbC0+Z2V0Q29sc3BhbigpLCAnc3R5bGUnID0+ICRjZWxsLT5nZXRTdHlsZSgpXSk7CnVuc2V0KCRsaW5lc1swXSk7Cn0KCgokdW5tZXJnZWRSb3dzID0gYXJyYXlfcmVwbGFjZV9yZWN1cnNpdmUoYXJyYXlfZmlsbCgkbGluZSArIDEsICRuYkxpbmVzLCBbXSksICR1bm1lcmdlZFJvd3MpOwpmb3JlYWNoICgkdW5tZXJnZWRSb3dzIGFzICR1bm1lcmdlZFJvd0tleSA9PiAkdW5tZXJnZWRSb3cpIHsKJHZhbHVlID0gJGxpbmVzWyR1bm1lcmdlZFJvd0tleSAtICRsaW5lXSA/PyAnJzsKJHVubWVyZ2VkUm93c1skdW5tZXJnZWRSb3dLZXldWyRjb2x1bW5dID0gbmV3IFRhYmxlQ2VsbCgkdmFsdWUsIFsnY29sc3BhbicgPT4gJGNlbGwtPmdldENvbHNwYW4oKSwgJ3N0eWxlJyA9PiAkY2VsbC0+Z2V0U3R5bGUoKV0pOwppZiAoJG5iTGluZXMgPT09ICR1bm1lcmdlZFJvd0tleSAtICRsaW5lKSB7CmJyZWFrOwp9Cn0KfQp9Cgpmb3JlYWNoICgkdW5tZXJnZWRSb3dzIGFzICR1bm1lcmdlZFJvd0tleSA9PiAkdW5tZXJnZWRSb3cpIHsKCmlmIChpc3NldCgkcm93c1skdW5tZXJnZWRSb3dLZXldKSAmJiBcaXNfYXJyYXkoJHJvd3NbJHVubWVyZ2VkUm93S2V5XSkgJiYgKCR0aGlzLT5nZXROdW1iZXJPZkNvbHVtbnMoJHJvd3NbJHVubWVyZ2VkUm93S2V5XSkgKyAkdGhpcy0+Z2V0TnVtYmVyT2ZDb2x1bW5zKCR1bm1lcmdlZFJvd3NbJHVubWVyZ2VkUm93S2V5XSkgPD0gJHRoaXMtPm51bWJlck9mQ29sdW1ucykpIHsKZm9yZWFjaCAoJHVubWVyZ2VkUm93IGFzICRjZWxsS2V5ID0+ICRjZWxsKSB7CgphcnJheV9zcGxpY2UoJHJvd3NbJHVubWVyZ2VkUm93S2V5XSwgJGNlbGxLZXksIDAsIFskY2VsbF0pOwp9Cn0gZWxzZSB7CiRyb3cgPSAkdGhpcy0+Y29weVJvdygkcm93cywgJHVubWVyZ2VkUm93S2V5IC0gMSk7CmZvcmVhY2ggKCR1bm1lcmdlZFJvdyBhcyAkY29sdW1uID0+ICRjZWxsKSB7CmlmICghZW1wdHkoJGNlbGwpKSB7CiRyb3dbJGNvbHVtbl0gPSAkdW5tZXJnZWRSb3dbJGNvbHVtbl07Cn0KfQphcnJheV9zcGxpY2UoJHJvd3MsICR1bm1lcmdlZFJvd0tleSwgMCwgWyRyb3ddKTsKfQp9CgpyZXR1cm4gJHJvd3M7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZmlsbENlbGxzKGl0ZXJhYmxlICRyb3cpCnsKJG5ld1JvdyA9IFtdOwoKZm9yZWFjaCAoJHJvdyBhcyAkY29sdW1uID0+ICRjZWxsKSB7CiRuZXdSb3dbXSA9ICRjZWxsOwppZiAoJGNlbGwgaW5zdGFuY2VvZiBUYWJsZUNlbGwgJiYgJGNlbGwtPmdldENvbHNwYW4oKSA+IDEpIHsKZm9yZWFjaCAocmFuZ2UoJGNvbHVtbiArIDEsICRjb2x1bW4gKyAkY2VsbC0+Z2V0Q29sc3BhbigpIC0gMSkgYXMgJHBvc2l0aW9uKSB7CgokbmV3Um93W10gPSAnJzsKfQp9Cn0KCnJldHVybiAkbmV3Um93ID86ICRyb3c7Cn0KCnByaXZhdGUgZnVuY3Rpb24gY29weVJvdyhhcnJheSAkcm93cywgaW50ICRsaW5lKTogYXJyYXkKewokcm93ID0gJHJvd3NbJGxpbmVdOwpmb3JlYWNoICgkcm93IGFzICRjZWxsS2V5ID0+ICRjZWxsVmFsdWUpIHsKJHJvd1skY2VsbEtleV0gPSAnJzsKaWYgKCRjZWxsVmFsdWUgaW5zdGFuY2VvZiBUYWJsZUNlbGwpIHsKJHJvd1skY2VsbEtleV0gPSBuZXcgVGFibGVDZWxsKCcnLCBbJ2NvbHNwYW4nID0+ICRjZWxsVmFsdWUtPmdldENvbHNwYW4oKV0pOwp9Cn0KCnJldHVybiAkcm93Owp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldE51bWJlck9mQ29sdW1ucyhhcnJheSAkcm93KTogaW50CnsKJGNvbHVtbnMgPSBcY291bnQoJHJvdyk7CmZvcmVhY2ggKCRyb3cgYXMgJGNvbHVtbikgewokY29sdW1ucyArPSAkY29sdW1uIGluc3RhbmNlb2YgVGFibGVDZWxsID8gKCRjb2x1bW4tPmdldENvbHNwYW4oKSAtIDEpIDogMDsKfQoKcmV0dXJuICRjb2x1bW5zOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFJvd0NvbHVtbnMoYXJyYXkgJHJvdyk6IGFycmF5CnsKJGNvbHVtbnMgPSByYW5nZSgwLCAkdGhpcy0+bnVtYmVyT2ZDb2x1bW5zIC0gMSk7CmZvcmVhY2ggKCRyb3cgYXMgJGNlbGxLZXkgPT4gJGNlbGwpIHsKaWYgKCRjZWxsIGluc3RhbmNlb2YgVGFibGVDZWxsICYmICRjZWxsLT5nZXRDb2xzcGFuKCkgPiAxKSB7CgokY29sdW1ucyA9IGFycmF5X2RpZmYoJGNvbHVtbnMsIHJhbmdlKCRjZWxsS2V5ICsgMSwgJGNlbGxLZXkgKyAkY2VsbC0+Z2V0Q29sc3BhbigpIC0gMSkpOwp9Cn0KCnJldHVybiAkY29sdW1uczsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjYWxjdWxhdGVDb2x1bW5zV2lkdGgoaXRlcmFibGUgJGdyb3VwcykKewpmb3IgKCRjb2x1bW4gPSAwOyAkY29sdW1uIDwgJHRoaXMtPm51bWJlck9mQ29sdW1uczsgKyskY29sdW1uKSB7CiRsZW5ndGhzID0gW107CmZvcmVhY2ggKCRncm91cHMgYXMgJGdyb3VwKSB7CmZvcmVhY2ggKCRncm91cCBhcyAkcm93KSB7CmlmICgkcm93IGluc3RhbmNlb2YgVGFibGVTZXBhcmF0b3IpIHsKY29udGludWU7Cn0KCmZvcmVhY2ggKCRyb3cgYXMgJGkgPT4gJGNlbGwpIHsKaWYgKCRjZWxsIGluc3RhbmNlb2YgVGFibGVDZWxsKSB7CiR0ZXh0Q29udGVudCA9IEhlbHBlcjo6cmVtb3ZlRGVjb3JhdGlvbigkdGhpcy0+b3V0cHV0LT5nZXRGb3JtYXR0ZXIoKSwgJGNlbGwpOwokdGV4dExlbmd0aCA9IEhlbHBlcjo6d2lkdGgoJHRleHRDb250ZW50KTsKaWYgKCR0ZXh0TGVuZ3RoID4gMCkgewokY29udGVudENvbHVtbnMgPSBtYl9zdHJfc3BsaXQoJHRleHRDb250ZW50LCBjZWlsKCR0ZXh0TGVuZ3RoIC8gJGNlbGwtPmdldENvbHNwYW4oKSkpOwpmb3JlYWNoICgkY29udGVudENvbHVtbnMgYXMgJHBvc2l0aW9uID0+ICRjb250ZW50KSB7CiRyb3dbJGkgKyAkcG9zaXRpb25dID0gJGNvbnRlbnQ7Cn0KfQp9Cn0KCiRsZW5ndGhzW10gPSAkdGhpcy0+Z2V0Q2VsbFdpZHRoKCRyb3csICRjb2x1bW4pOwp9Cn0KCiR0aGlzLT5lZmZlY3RpdmVDb2x1bW5XaWR0aHNbJGNvbHVtbl0gPSBtYXgoJGxlbmd0aHMpICsgSGVscGVyOjp3aWR0aCgkdGhpcy0+c3R5bGUtPmdldENlbGxSb3dDb250ZW50Rm9ybWF0KCkpIC0gMjsKfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldENvbHVtblNlcGFyYXRvcldpZHRoKCk6IGludAp7CnJldHVybiBIZWxwZXI6OndpZHRoKHNwcmludGYoJHRoaXMtPnN0eWxlLT5nZXRCb3JkZXJGb3JtYXQoKSwgJHRoaXMtPnN0eWxlLT5nZXRCb3JkZXJDaGFycygpWzNdKSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0Q2VsbFdpZHRoKGFycmF5ICRyb3csIGludCAkY29sdW1uKTogaW50CnsKJGNlbGxXaWR0aCA9IDA7CgppZiAoaXNzZXQoJHJvd1skY29sdW1uXSkpIHsKJGNlbGwgPSAkcm93WyRjb2x1bW5dOwokY2VsbFdpZHRoID0gSGVscGVyOjp3aWR0aChIZWxwZXI6OnJlbW92ZURlY29yYXRpb24oJHRoaXMtPm91dHB1dC0+Z2V0Rm9ybWF0dGVyKCksICRjZWxsKSk7Cn0KCiRjb2x1bW5XaWR0aCA9ICR0aGlzLT5jb2x1bW5XaWR0aHNbJGNvbHVtbl0gPz8gMDsKJGNlbGxXaWR0aCA9IG1heCgkY2VsbFdpZHRoLCAkY29sdW1uV2lkdGgpOwoKcmV0dXJuIGlzc2V0KCR0aGlzLT5jb2x1bW5NYXhXaWR0aHNbJGNvbHVtbl0pID8gbWluKCR0aGlzLT5jb2x1bW5NYXhXaWR0aHNbJGNvbHVtbl0sICRjZWxsV2lkdGgpIDogJGNlbGxXaWR0aDsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjbGVhbnVwKCkKewokdGhpcy0+ZWZmZWN0aXZlQ29sdW1uV2lkdGhzID0gW107CiR0aGlzLT5udW1iZXJPZkNvbHVtbnMgPSBudWxsOwp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpbml0U3R5bGVzKCk6IGFycmF5CnsKJGJvcmRlcmxlc3MgPSBuZXcgVGFibGVTdHlsZSgpOwokYm9yZGVybGVzcwotPnNldEhvcml6b250YWxCb3JkZXJDaGFycygnPScpCi0+c2V0VmVydGljYWxCb3JkZXJDaGFycygnICcpCi0+c2V0RGVmYXVsdENyb3NzaW5nQ2hhcignICcpCjsKCiRjb21wYWN0ID0gbmV3IFRhYmxlU3R5bGUoKTsKJGNvbXBhY3QKLT5zZXRIb3Jpem9udGFsQm9yZGVyQ2hhcnMoJycpCi0+c2V0VmVydGljYWxCb3JkZXJDaGFycygnJykKLT5zZXREZWZhdWx0Q3Jvc3NpbmdDaGFyKCcnKQotPnNldENlbGxSb3dDb250ZW50Rm9ybWF0KCclcyAnKQo7Cgokc3R5bGVHdWlkZSA9IG5ldyBUYWJsZVN0eWxlKCk7CiRzdHlsZUd1aWRlCi0+c2V0SG9yaXpvbnRhbEJvcmRlckNoYXJzKCctJykKLT5zZXRWZXJ0aWNhbEJvcmRlckNoYXJzKCcgJykKLT5zZXREZWZhdWx0Q3Jvc3NpbmdDaGFyKCcgJykKLT5zZXRDZWxsSGVhZGVyRm9ybWF0KCclcycpCjsKCiRib3ggPSAobmV3IFRhYmxlU3R5bGUoKSkKLT5zZXRIb3Jpem9udGFsQm9yZGVyQ2hhcnMoJ+KUgCcpCi0+c2V0VmVydGljYWxCb3JkZXJDaGFycygn4pSCJykKLT5zZXRDcm9zc2luZ0NoYXJzKCfilLwnLCAn4pSMJywgJ+KUrCcsICfilJAnLCAn4pSkJywgJ+KUmCcsICfilLQnLCAn4pSUJywgJ+KUnCcpCjsKCiRib3hEb3VibGUgPSAobmV3IFRhYmxlU3R5bGUoKSkKLT5zZXRIb3Jpem9udGFsQm9yZGVyQ2hhcnMoJ+KVkCcsICfilIAnKQotPnNldFZlcnRpY2FsQm9yZGVyQ2hhcnMoJ+KVkScsICfilIInKQotPnNldENyb3NzaW5nQ2hhcnMoJ+KUvCcsICfilZQnLCAn4pWkJywgJ+KVlycsICfilaInLCAn4pWdJywgJ+KVpycsICfilZonLCAn4pWfJywgJ+KVoCcsICfilaonLCAn4pWjJykKOwoKcmV0dXJuIFsKJ2RlZmF1bHQnID0+IG5ldyBUYWJsZVN0eWxlKCksCidib3JkZXJsZXNzJyA9PiAkYm9yZGVybGVzcywKJ2NvbXBhY3QnID0+ICRjb21wYWN0LAonc3ltZm9ueS1zdHlsZS1ndWlkZScgPT4gJHN0eWxlR3VpZGUsCidib3gnID0+ICRib3gsCidib3gtZG91YmxlJyA9PiAkYm94RG91YmxlLApdOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHJlc29sdmVTdHlsZSgkbmFtZSk6IFRhYmxlU3R5bGUKewppZiAoJG5hbWUgaW5zdGFuY2VvZiBUYWJsZVN0eWxlKSB7CnJldHVybiAkbmFtZTsKfQoKaWYgKGlzc2V0KHNlbGY6OiRzdHlsZXNbJG5hbWVdKSkgewpyZXR1cm4gc2VsZjo6JHN0eWxlc1skbmFtZV07Cn0KCnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignU3R5bGUgIiVzIiBpcyBub3QgZGVmaW5lZC4nLCAkbmFtZSkpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CgoKCgpjbGFzcyBUYWJsZUNlbGwKewpwcml2YXRlICR2YWx1ZTsKcHJpdmF0ZSAkb3B0aW9ucyA9IFsKJ3Jvd3NwYW4nID0+IDEsCidjb2xzcGFuJyA9PiAxLAonc3R5bGUnID0+IG51bGwsCl07CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICR2YWx1ZSA9ICcnLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiR0aGlzLT52YWx1ZSA9ICR2YWx1ZTsKCgppZiAoJGRpZmYgPSBhcnJheV9kaWZmKGFycmF5X2tleXMoJG9wdGlvbnMpLCBhcnJheV9rZXlzKCR0aGlzLT5vcHRpb25zKSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgVGFibGVDZWxsIGRvZXMgbm90IHN1cHBvcnQgdGhlIGZvbGxvd2luZyBvcHRpb25zOiBcJyVzXCcuJywgaW1wbG9kZSgnXCcsIFwnJywgJGRpZmYpKSk7Cn0KCmlmIChpc3NldCgkb3B0aW9uc1snc3R5bGUnXSkgJiYgISRvcHRpb25zWydzdHlsZSddIGluc3RhbmNlb2YgVGFibGVDZWxsU3R5bGUpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVGhlIHN0eWxlIG9wdGlvbiBtdXN0IGJlIGFuIGluc3RhbmNlIG9mICJUYWJsZUNlbGxTdHlsZSIuJyk7Cn0KCiR0aGlzLT5vcHRpb25zID0gYXJyYXlfbWVyZ2UoJHRoaXMtPm9wdGlvbnMsICRvcHRpb25zKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpCnsKcmV0dXJuICR0aGlzLT52YWx1ZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29sc3BhbigpCnsKcmV0dXJuIChpbnQpICR0aGlzLT5vcHRpb25zWydjb2xzcGFuJ107Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJvd3NwYW4oKQp7CnJldHVybiAoaW50KSAkdGhpcy0+b3B0aW9uc1sncm93c3BhbiddOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3R5bGUoKTogP1RhYmxlQ2VsbFN0eWxlCnsKcmV0dXJuICR0aGlzLT5vcHRpb25zWydzdHlsZSddOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CgoKCgpjbGFzcyBUYWJsZUNlbGxTdHlsZQp7CnB1YmxpYyBjb25zdCBERUZBVUxUX0FMSUdOID0gJ2xlZnQnOwoKcHJpdmF0ZSBjb25zdCBUQUdfT1BUSU9OUyA9IFsKJ2ZnJywKJ2JnJywKJ29wdGlvbnMnLApdOwoKcHJpdmF0ZSBjb25zdCBBTElHTl9NQVAgPSBbCidsZWZ0JyA9PiBcU1RSX1BBRF9SSUdIVCwKJ2NlbnRlcicgPT4gXFNUUl9QQURfQk9USCwKJ3JpZ2h0JyA9PiBcU1RSX1BBRF9MRUZULApdOwoKcHJpdmF0ZSAkb3B0aW9ucyA9IFsKJ2ZnJyA9PiAnZGVmYXVsdCcsCidiZycgPT4gJ2RlZmF1bHQnLAonb3B0aW9ucycgPT4gbnVsbCwKJ2FsaWduJyA9PiBzZWxmOjpERUZBVUxUX0FMSUdOLAonY2VsbEZvcm1hdCcgPT4gbnVsbCwKXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkb3B0aW9ucyA9IFtdKQp7CmlmICgkZGlmZiA9IGFycmF5X2RpZmYoYXJyYXlfa2V5cygkb3B0aW9ucyksIGFycmF5X2tleXMoJHRoaXMtPm9wdGlvbnMpKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSBUYWJsZUNlbGxTdHlsZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgb3B0aW9uczogXCclc1wnLicsIGltcGxvZGUoJ1wnLCBcJycsICRkaWZmKSkpOwp9CgppZiAoaXNzZXQoJG9wdGlvbnNbJ2FsaWduJ10pICYmICFcYXJyYXlfa2V5X2V4aXN0cygkb3B0aW9uc1snYWxpZ24nXSwgc2VsZjo6QUxJR05fTUFQKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1dyb25nIGFsaWduIHZhbHVlLiBWYWx1ZSBtdXN0IGJlIGZvbGxvd2luZzogXCclc1wnLicsIGltcGxvZGUoJ1wnLCBcJycsIGFycmF5X2tleXMoc2VsZjo6QUxJR05fTUFQKSkpKTsKfQoKJHRoaXMtPm9wdGlvbnMgPSBhcnJheV9tZXJnZSgkdGhpcy0+b3B0aW9ucywgJG9wdGlvbnMpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3B0aW9ucygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+b3B0aW9uczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGFnT3B0aW9ucygpCnsKcmV0dXJuIGFycmF5X2ZpbHRlcigKJHRoaXMtPmdldE9wdGlvbnMoKSwKZnVuY3Rpb24gKCRrZXkpIHsKcmV0dXJuIFxpbl9hcnJheSgka2V5LCBzZWxmOjpUQUdfT1BUSU9OUykgJiYgaXNzZXQoJHRoaXMtPm9wdGlvbnNbJGtleV0pOwp9LApcQVJSQVlfRklMVEVSX1VTRV9LRVkKKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhZEJ5QWxpZ24oKQp7CnJldHVybiBzZWxmOjpBTElHTl9NQVBbJHRoaXMtPmdldE9wdGlvbnMoKVsnYWxpZ24nXV07Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRDZWxsRm9ybWF0KCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmdldE9wdGlvbnMoKVsnY2VsbEZvcm1hdCddOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCgoKCmNsYXNzIFRhYmxlUm93cyBpbXBsZW1lbnRzIFxJdGVyYXRvckFnZ3JlZ2F0ZQp7CnByaXZhdGUgJGdlbmVyYXRvcjsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChcQ2xvc3VyZSAkZ2VuZXJhdG9yKQp7CiR0aGlzLT5nZW5lcmF0b3IgPSAkZ2VuZXJhdG9yOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SXRlcmF0b3IoKTogXFRyYXZlcnNhYmxlCnsKcmV0dXJuICgkdGhpcy0+Z2VuZXJhdG9yKSgpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCgoKCgoKY2xhc3MgVGFibGVTZXBhcmF0b3IgZXh0ZW5kcyBUYWJsZUNlbGwKewpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJG9wdGlvbnMgPSBbXSkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCcnLCAkb3B0aW9ucyk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXExvZ2ljRXhjZXB0aW9uOwoKCgoKCgoKCmNsYXNzIFRhYmxlU3R5bGUKewpwcml2YXRlICRwYWRkaW5nQ2hhciA9ICcgJzsKcHJpdmF0ZSAkaG9yaXpvbnRhbE91dHNpZGVCb3JkZXJDaGFyID0gJy0nOwpwcml2YXRlICRob3Jpem9udGFsSW5zaWRlQm9yZGVyQ2hhciA9ICctJzsKcHJpdmF0ZSAkdmVydGljYWxPdXRzaWRlQm9yZGVyQ2hhciA9ICd8JzsKcHJpdmF0ZSAkdmVydGljYWxJbnNpZGVCb3JkZXJDaGFyID0gJ3wnOwpwcml2YXRlICRjcm9zc2luZ0NoYXIgPSAnKyc7CnByaXZhdGUgJGNyb3NzaW5nVG9wUmlnaHRDaGFyID0gJysnOwpwcml2YXRlICRjcm9zc2luZ1RvcE1pZENoYXIgPSAnKyc7CnByaXZhdGUgJGNyb3NzaW5nVG9wTGVmdENoYXIgPSAnKyc7CnByaXZhdGUgJGNyb3NzaW5nTWlkUmlnaHRDaGFyID0gJysnOwpwcml2YXRlICRjcm9zc2luZ0JvdHRvbVJpZ2h0Q2hhciA9ICcrJzsKcHJpdmF0ZSAkY3Jvc3NpbmdCb3R0b21NaWRDaGFyID0gJysnOwpwcml2YXRlICRjcm9zc2luZ0JvdHRvbUxlZnRDaGFyID0gJysnOwpwcml2YXRlICRjcm9zc2luZ01pZExlZnRDaGFyID0gJysnOwpwcml2YXRlICRjcm9zc2luZ1RvcExlZnRCb3R0b21DaGFyID0gJysnOwpwcml2YXRlICRjcm9zc2luZ1RvcE1pZEJvdHRvbUNoYXIgPSAnKyc7CnByaXZhdGUgJGNyb3NzaW5nVG9wUmlnaHRCb3R0b21DaGFyID0gJysnOwpwcml2YXRlICRoZWFkZXJUaXRsZUZvcm1hdCA9ICc8Zmc9YmxhY2s7Ymc9d2hpdGU7b3B0aW9ucz1ib2xkPiAlcyA8Lz4nOwpwcml2YXRlICRmb290ZXJUaXRsZUZvcm1hdCA9ICc8Zmc9YmxhY2s7Ymc9d2hpdGU7b3B0aW9ucz1ib2xkPiAlcyA8Lz4nOwpwcml2YXRlICRjZWxsSGVhZGVyRm9ybWF0ID0gJzxpbmZvPiVzPC9pbmZvPic7CnByaXZhdGUgJGNlbGxSb3dGb3JtYXQgPSAnJXMnOwpwcml2YXRlICRjZWxsUm93Q29udGVudEZvcm1hdCA9ICcgJXMgJzsKcHJpdmF0ZSAkYm9yZGVyRm9ybWF0ID0gJyVzJzsKcHJpdmF0ZSAkcGFkVHlwZSA9IFxTVFJfUEFEX1JJR0hUOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UGFkZGluZ0NoYXIoc3RyaW5nICRwYWRkaW5nQ2hhcikKewppZiAoISRwYWRkaW5nQ2hhcikgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ1RoZSBwYWRkaW5nIGNoYXIgbXVzdCBub3QgYmUgZW1wdHkuJyk7Cn0KCiR0aGlzLT5wYWRkaW5nQ2hhciA9ICRwYWRkaW5nQ2hhcjsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFkZGluZ0NoYXIoKQp7CnJldHVybiAkdGhpcy0+cGFkZGluZ0NoYXI7Cn0KCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SG9yaXpvbnRhbEJvcmRlckNoYXJzKHN0cmluZyAkb3V0c2lkZSwgP3N0cmluZyAkaW5zaWRlID0gbnVsbCk6IHNlbGYKewokdGhpcy0+aG9yaXpvbnRhbE91dHNpZGVCb3JkZXJDaGFyID0gJG91dHNpZGU7CiR0aGlzLT5ob3Jpem9udGFsSW5zaWRlQm9yZGVyQ2hhciA9ICRpbnNpZGUgPz8gJG91dHNpZGU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFZlcnRpY2FsQm9yZGVyQ2hhcnMoc3RyaW5nICRvdXRzaWRlLCA/c3RyaW5nICRpbnNpZGUgPSBudWxsKTogc2VsZgp7CiR0aGlzLT52ZXJ0aWNhbE91dHNpZGVCb3JkZXJDaGFyID0gJG91dHNpZGU7CiR0aGlzLT52ZXJ0aWNhbEluc2lkZUJvcmRlckNoYXIgPSAkaW5zaWRlID8/ICRvdXRzaWRlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRCb3JkZXJDaGFycygpOiBhcnJheQp7CnJldHVybiBbCiR0aGlzLT5ob3Jpem9udGFsT3V0c2lkZUJvcmRlckNoYXIsCiR0aGlzLT52ZXJ0aWNhbE91dHNpZGVCb3JkZXJDaGFyLAokdGhpcy0+aG9yaXpvbnRhbEluc2lkZUJvcmRlckNoYXIsCiR0aGlzLT52ZXJ0aWNhbEluc2lkZUJvcmRlckNoYXIsCl07Cn0KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q3Jvc3NpbmdDaGFycyhzdHJpbmcgJGNyb3NzLCBzdHJpbmcgJHRvcExlZnQsIHN0cmluZyAkdG9wTWlkLCBzdHJpbmcgJHRvcFJpZ2h0LCBzdHJpbmcgJG1pZFJpZ2h0LCBzdHJpbmcgJGJvdHRvbVJpZ2h0LCBzdHJpbmcgJGJvdHRvbU1pZCwgc3RyaW5nICRib3R0b21MZWZ0LCBzdHJpbmcgJG1pZExlZnQsID9zdHJpbmcgJHRvcExlZnRCb3R0b20gPSBudWxsLCA/c3RyaW5nICR0b3BNaWRCb3R0b20gPSBudWxsLCA/c3RyaW5nICR0b3BSaWdodEJvdHRvbSA9IG51bGwpOiBzZWxmCnsKJHRoaXMtPmNyb3NzaW5nQ2hhciA9ICRjcm9zczsKJHRoaXMtPmNyb3NzaW5nVG9wTGVmdENoYXIgPSAkdG9wTGVmdDsKJHRoaXMtPmNyb3NzaW5nVG9wTWlkQ2hhciA9ICR0b3BNaWQ7CiR0aGlzLT5jcm9zc2luZ1RvcFJpZ2h0Q2hhciA9ICR0b3BSaWdodDsKJHRoaXMtPmNyb3NzaW5nTWlkUmlnaHRDaGFyID0gJG1pZFJpZ2h0OwokdGhpcy0+Y3Jvc3NpbmdCb3R0b21SaWdodENoYXIgPSAkYm90dG9tUmlnaHQ7CiR0aGlzLT5jcm9zc2luZ0JvdHRvbU1pZENoYXIgPSAkYm90dG9tTWlkOwokdGhpcy0+Y3Jvc3NpbmdCb3R0b21MZWZ0Q2hhciA9ICRib3R0b21MZWZ0OwokdGhpcy0+Y3Jvc3NpbmdNaWRMZWZ0Q2hhciA9ICRtaWRMZWZ0OwokdGhpcy0+Y3Jvc3NpbmdUb3BMZWZ0Qm90dG9tQ2hhciA9ICR0b3BMZWZ0Qm90dG9tID8/ICRtaWRMZWZ0OwokdGhpcy0+Y3Jvc3NpbmdUb3BNaWRCb3R0b21DaGFyID0gJHRvcE1pZEJvdHRvbSA/PyAkY3Jvc3M7CiR0aGlzLT5jcm9zc2luZ1RvcFJpZ2h0Qm90dG9tQ2hhciA9ICR0b3BSaWdodEJvdHRvbSA/PyAkbWlkUmlnaHQ7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERlZmF1bHRDcm9zc2luZ0NoYXIoc3RyaW5nICRjaGFyKTogc2VsZgp7CnJldHVybiAkdGhpcy0+c2V0Q3Jvc3NpbmdDaGFycygkY2hhciwgJGNoYXIsICRjaGFyLCAkY2hhciwgJGNoYXIsICRjaGFyLCAkY2hhciwgJGNoYXIsICRjaGFyKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q3Jvc3NpbmdDaGFyKCkKewpyZXR1cm4gJHRoaXMtPmNyb3NzaW5nQ2hhcjsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q3Jvc3NpbmdDaGFycygpOiBhcnJheQp7CnJldHVybiBbCiR0aGlzLT5jcm9zc2luZ0NoYXIsCiR0aGlzLT5jcm9zc2luZ1RvcExlZnRDaGFyLAokdGhpcy0+Y3Jvc3NpbmdUb3BNaWRDaGFyLAokdGhpcy0+Y3Jvc3NpbmdUb3BSaWdodENoYXIsCiR0aGlzLT5jcm9zc2luZ01pZFJpZ2h0Q2hhciwKJHRoaXMtPmNyb3NzaW5nQm90dG9tUmlnaHRDaGFyLAokdGhpcy0+Y3Jvc3NpbmdCb3R0b21NaWRDaGFyLAokdGhpcy0+Y3Jvc3NpbmdCb3R0b21MZWZ0Q2hhciwKJHRoaXMtPmNyb3NzaW5nTWlkTGVmdENoYXIsCiR0aGlzLT5jcm9zc2luZ1RvcExlZnRCb3R0b21DaGFyLAokdGhpcy0+Y3Jvc3NpbmdUb3BNaWRCb3R0b21DaGFyLAokdGhpcy0+Y3Jvc3NpbmdUb3BSaWdodEJvdHRvbUNoYXIsCl07Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldENlbGxIZWFkZXJGb3JtYXQoc3RyaW5nICRjZWxsSGVhZGVyRm9ybWF0KQp7CiR0aGlzLT5jZWxsSGVhZGVyRm9ybWF0ID0gJGNlbGxIZWFkZXJGb3JtYXQ7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENlbGxIZWFkZXJGb3JtYXQoKQp7CnJldHVybiAkdGhpcy0+Y2VsbEhlYWRlckZvcm1hdDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q2VsbFJvd0Zvcm1hdChzdHJpbmcgJGNlbGxSb3dGb3JtYXQpCnsKJHRoaXMtPmNlbGxSb3dGb3JtYXQgPSAkY2VsbFJvd0Zvcm1hdDsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2VsbFJvd0Zvcm1hdCgpCnsKcmV0dXJuICR0aGlzLT5jZWxsUm93Rm9ybWF0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDZWxsUm93Q29udGVudEZvcm1hdChzdHJpbmcgJGNlbGxSb3dDb250ZW50Rm9ybWF0KQp7CiR0aGlzLT5jZWxsUm93Q29udGVudEZvcm1hdCA9ICRjZWxsUm93Q29udGVudEZvcm1hdDsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2VsbFJvd0NvbnRlbnRGb3JtYXQoKQp7CnJldHVybiAkdGhpcy0+Y2VsbFJvd0NvbnRlbnRGb3JtYXQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEJvcmRlckZvcm1hdChzdHJpbmcgJGJvcmRlckZvcm1hdCkKewokdGhpcy0+Ym9yZGVyRm9ybWF0ID0gJGJvcmRlckZvcm1hdDsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Qm9yZGVyRm9ybWF0KCkKewpyZXR1cm4gJHRoaXMtPmJvcmRlckZvcm1hdDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UGFkVHlwZShpbnQgJHBhZFR5cGUpCnsKaWYgKCFcaW5fYXJyYXkoJHBhZFR5cGUsIFtcU1RSX1BBRF9MRUZULCBcU1RSX1BBRF9SSUdIVCwgXFNUUl9QQURfQk9USF0sIHRydWUpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgcGFkZGluZyB0eXBlLiBFeHBlY3RlZCBvbmUgb2YgKFNUUl9QQURfTEVGVCwgU1RSX1BBRF9SSUdIVCwgU1RSX1BBRF9CT1RIKS4nKTsKfQoKJHRoaXMtPnBhZFR5cGUgPSAkcGFkVHlwZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFkVHlwZSgpCnsKcmV0dXJuICR0aGlzLT5wYWRUeXBlOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SGVhZGVyVGl0bGVGb3JtYXQoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5oZWFkZXJUaXRsZUZvcm1hdDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEhlYWRlclRpdGxlRm9ybWF0KHN0cmluZyAkZm9ybWF0KTogc2VsZgp7CiR0aGlzLT5oZWFkZXJUaXRsZUZvcm1hdCA9ICRmb3JtYXQ7CgpyZXR1cm4gJHRoaXM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRGb290ZXJUaXRsZUZvcm1hdCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmZvb3RlclRpdGxlRm9ybWF0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Rm9vdGVyVGl0bGVGb3JtYXQoc3RyaW5nICRmb3JtYXQpOiBzZWxmCnsKJHRoaXMtPmZvb3RlclRpdGxlRm9ybWF0ID0gJGZvcm1hdDsKCnJldHVybiAkdGhpczsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxSdW50aW1lRXhjZXB0aW9uOwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIEFyZ3ZJbnB1dCBleHRlbmRzIElucHV0CnsKcHJpdmF0ZSAkdG9rZW5zOwpwcml2YXRlICRwYXJzZWQ7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP2FycmF5ICRhcmd2ID0gbnVsbCwgP0lucHV0RGVmaW5pdGlvbiAkZGVmaW5pdGlvbiA9IG51bGwpCnsKJGFyZ3YgPSAkYXJndiA/PyAkX1NFUlZFUlsnYXJndiddID8/IFtdOwoKCmFycmF5X3NoaWZ0KCRhcmd2KTsKCiR0aGlzLT50b2tlbnMgPSAkYXJndjsKCnBhcmVudDo6X19jb25zdHJ1Y3QoJGRlZmluaXRpb24pOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0VG9rZW5zKGFycmF5ICR0b2tlbnMpCnsKJHRoaXMtPnRva2VucyA9ICR0b2tlbnM7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwYXJzZSgpCnsKJHBhcnNlT3B0aW9ucyA9IHRydWU7CiR0aGlzLT5wYXJzZWQgPSAkdGhpcy0+dG9rZW5zOwp3aGlsZSAobnVsbCAhPT0gJHRva2VuID0gYXJyYXlfc2hpZnQoJHRoaXMtPnBhcnNlZCkpIHsKJHBhcnNlT3B0aW9ucyA9ICR0aGlzLT5wYXJzZVRva2VuKCR0b2tlbiwgJHBhcnNlT3B0aW9ucyk7Cn0KfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIHBhcnNlVG9rZW4oc3RyaW5nICR0b2tlbiwgYm9vbCAkcGFyc2VPcHRpb25zKTogYm9vbAp7CmlmICgkcGFyc2VPcHRpb25zICYmICcnID09ICR0b2tlbikgewokdGhpcy0+cGFyc2VBcmd1bWVudCgkdG9rZW4pOwp9IGVsc2VpZiAoJHBhcnNlT3B0aW9ucyAmJiAnLS0nID09ICR0b2tlbikgewpyZXR1cm4gZmFsc2U7Cn0gZWxzZWlmICgkcGFyc2VPcHRpb25zICYmIHN0cl9zdGFydHNfd2l0aCgkdG9rZW4sICctLScpKSB7CiR0aGlzLT5wYXJzZUxvbmdPcHRpb24oJHRva2VuKTsKfSBlbHNlaWYgKCRwYXJzZU9wdGlvbnMgJiYgJy0nID09PSAkdG9rZW5bMF0gJiYgJy0nICE9PSAkdG9rZW4pIHsKJHRoaXMtPnBhcnNlU2hvcnRPcHRpb24oJHRva2VuKTsKfSBlbHNlIHsKJHRoaXMtPnBhcnNlQXJndW1lbnQoJHRva2VuKTsKfQoKcmV0dXJuICRwYXJzZU9wdGlvbnM7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcGFyc2VTaG9ydE9wdGlvbihzdHJpbmcgJHRva2VuKQp7CiRuYW1lID0gc3Vic3RyKCR0b2tlbiwgMSk7CgppZiAoXHN0cmxlbigkbmFtZSkgPiAxKSB7CmlmICgkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzU2hvcnRjdXQoJG5hbWVbMF0pICYmICR0aGlzLT5kZWZpbml0aW9uLT5nZXRPcHRpb25Gb3JTaG9ydGN1dCgkbmFtZVswXSktPmFjY2VwdFZhbHVlKCkpIHsKCiR0aGlzLT5hZGRTaG9ydE9wdGlvbigkbmFtZVswXSwgc3Vic3RyKCRuYW1lLCAxKSk7Cn0gZWxzZSB7CiR0aGlzLT5wYXJzZVNob3J0T3B0aW9uU2V0KCRuYW1lKTsKfQp9IGVsc2UgewokdGhpcy0+YWRkU2hvcnRPcHRpb24oJG5hbWUsIG51bGwpOwp9Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZVNob3J0T3B0aW9uU2V0KHN0cmluZyAkbmFtZSkKewokbGVuID0gXHN0cmxlbigkbmFtZSk7CmZvciAoJGkgPSAwOyAkaSA8ICRsZW47ICsrJGkpIHsKaWYgKCEkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzU2hvcnRjdXQoJG5hbWVbJGldKSkgewokZW5jb2RpbmcgPSBtYl9kZXRlY3RfZW5jb2RpbmcoJG5hbWUsIG51bGwsIHRydWUpOwp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgIi0lcyIgb3B0aW9uIGRvZXMgbm90IGV4aXN0LicsIGZhbHNlID09PSAkZW5jb2RpbmcgPyAkbmFtZVskaV0gOiBtYl9zdWJzdHIoJG5hbWUsICRpLCAxLCAkZW5jb2RpbmcpKSk7Cn0KCiRvcHRpb24gPSAkdGhpcy0+ZGVmaW5pdGlvbi0+Z2V0T3B0aW9uRm9yU2hvcnRjdXQoJG5hbWVbJGldKTsKaWYgKCRvcHRpb24tPmFjY2VwdFZhbHVlKCkpIHsKJHRoaXMtPmFkZExvbmdPcHRpb24oJG9wdGlvbi0+Z2V0TmFtZSgpLCAkaSA9PT0gJGxlbiAtIDEgPyBudWxsIDogc3Vic3RyKCRuYW1lLCAkaSArIDEpKTsKCmJyZWFrOwp9IGVsc2UgewokdGhpcy0+YWRkTG9uZ09wdGlvbigkb3B0aW9uLT5nZXROYW1lKCksIG51bGwpOwp9Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZUxvbmdPcHRpb24oc3RyaW5nICR0b2tlbikKewokbmFtZSA9IHN1YnN0cigkdG9rZW4sIDIpOwoKaWYgKGZhbHNlICE9PSAkcG9zID0gc3RycG9zKCRuYW1lLCAnPScpKSB7CmlmICgnJyA9PT0gJHZhbHVlID0gc3Vic3RyKCRuYW1lLCAkcG9zICsgMSkpIHsKYXJyYXlfdW5zaGlmdCgkdGhpcy0+cGFyc2VkLCAkdmFsdWUpOwp9CiR0aGlzLT5hZGRMb25nT3B0aW9uKHN1YnN0cigkbmFtZSwgMCwgJHBvcyksICR2YWx1ZSk7Cn0gZWxzZSB7CiR0aGlzLT5hZGRMb25nT3B0aW9uKCRuYW1lLCBudWxsKTsKfQp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcGFyc2VBcmd1bWVudChzdHJpbmcgJHRva2VuKQp7CiRjID0gXGNvdW50KCR0aGlzLT5hcmd1bWVudHMpOwoKCmlmICgkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzQXJndW1lbnQoJGMpKSB7CiRhcmcgPSAkdGhpcy0+ZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnQoJGMpOwokdGhpcy0+YXJndW1lbnRzWyRhcmctPmdldE5hbWUoKV0gPSAkYXJnLT5pc0FycmF5KCkgPyBbJHRva2VuXSA6ICR0b2tlbjsKCgp9IGVsc2VpZiAoJHRoaXMtPmRlZmluaXRpb24tPmhhc0FyZ3VtZW50KCRjIC0gMSkgJiYgJHRoaXMtPmRlZmluaXRpb24tPmdldEFyZ3VtZW50KCRjIC0gMSktPmlzQXJyYXkoKSkgewokYXJnID0gJHRoaXMtPmRlZmluaXRpb24tPmdldEFyZ3VtZW50KCRjIC0gMSk7CiR0aGlzLT5hcmd1bWVudHNbJGFyZy0+Z2V0TmFtZSgpXVtdID0gJHRva2VuOwoKCn0gZWxzZSB7CiRhbGwgPSAkdGhpcy0+ZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnRzKCk7CiRzeW1mb255Q29tbWFuZE5hbWUgPSBudWxsOwppZiAoKCRpbnB1dEFyZ3VtZW50ID0gJGFsbFska2V5ID0gYXJyYXlfa2V5X2ZpcnN0KCRhbGwpXSA/PyBudWxsKSAmJiAnY29tbWFuZCcgPT09ICRpbnB1dEFyZ3VtZW50LT5nZXROYW1lKCkpIHsKJHN5bWZvbnlDb21tYW5kTmFtZSA9ICR0aGlzLT5hcmd1bWVudHNbJ2NvbW1hbmQnXSA/PyBudWxsOwp1bnNldCgkYWxsWyRrZXldKTsKfQoKaWYgKFxjb3VudCgkYWxsKSkgewppZiAoJHN5bWZvbnlDb21tYW5kTmFtZSkgewokbWVzc2FnZSA9IHNwcmludGYoJ1RvbyBtYW55IGFyZ3VtZW50cyB0byAiJXMiIGNvbW1hbmQsIGV4cGVjdGVkIGFyZ3VtZW50cyAiJXMiLicsICRzeW1mb255Q29tbWFuZE5hbWUsIGltcGxvZGUoJyIgIicsIGFycmF5X2tleXMoJGFsbCkpKTsKfSBlbHNlIHsKJG1lc3NhZ2UgPSBzcHJpbnRmKCdUb28gbWFueSBhcmd1bWVudHMsIGV4cGVjdGVkIGFyZ3VtZW50cyAiJXMiLicsIGltcGxvZGUoJyIgIicsIGFycmF5X2tleXMoJGFsbCkpKTsKfQp9IGVsc2VpZiAoJHN5bWZvbnlDb21tYW5kTmFtZSkgewokbWVzc2FnZSA9IHNwcmludGYoJ05vIGFyZ3VtZW50cyBleHBlY3RlZCBmb3IgIiVzIiBjb21tYW5kLCBnb3QgIiVzIi4nLCAkc3ltZm9ueUNvbW1hbmROYW1lLCAkdG9rZW4pOwp9IGVsc2UgewokbWVzc2FnZSA9IHNwcmludGYoJ05vIGFyZ3VtZW50cyBleHBlY3RlZCwgZ290ICIlcyIuJywgJHRva2VuKTsKfQoKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJG1lc3NhZ2UpOwp9Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBhZGRTaG9ydE9wdGlvbihzdHJpbmcgJHNob3J0Y3V0LCAkdmFsdWUpCnsKaWYgKCEkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzU2hvcnRjdXQoJHNob3J0Y3V0KSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgIi0lcyIgb3B0aW9uIGRvZXMgbm90IGV4aXN0LicsICRzaG9ydGN1dCkpOwp9CgokdGhpcy0+YWRkTG9uZ09wdGlvbigkdGhpcy0+ZGVmaW5pdGlvbi0+Z2V0T3B0aW9uRm9yU2hvcnRjdXQoJHNob3J0Y3V0KS0+Z2V0TmFtZSgpLCAkdmFsdWUpOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gYWRkTG9uZ09wdGlvbihzdHJpbmcgJG5hbWUsICR2YWx1ZSkKewppZiAoISR0aGlzLT5kZWZpbml0aW9uLT5oYXNPcHRpb24oJG5hbWUpKSB7CmlmICghJHRoaXMtPmRlZmluaXRpb24tPmhhc05lZ2F0aW9uKCRuYW1lKSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgIi0tJXMiIG9wdGlvbiBkb2VzIG5vdCBleGlzdC4nLCAkbmFtZSkpOwp9Cgokb3B0aW9uTmFtZSA9ICR0aGlzLT5kZWZpbml0aW9uLT5uZWdhdGlvblRvTmFtZSgkbmFtZSk7CmlmIChudWxsICE9PSAkdmFsdWUpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZignVGhlICItLSVzIiBvcHRpb24gZG9lcyBub3QgYWNjZXB0IGEgdmFsdWUuJywgJG5hbWUpKTsKfQokdGhpcy0+b3B0aW9uc1skb3B0aW9uTmFtZV0gPSBmYWxzZTsKCnJldHVybjsKfQoKJG9wdGlvbiA9ICR0aGlzLT5kZWZpbml0aW9uLT5nZXRPcHRpb24oJG5hbWUpOwoKaWYgKG51bGwgIT09ICR2YWx1ZSAmJiAhJG9wdGlvbi0+YWNjZXB0VmFsdWUoKSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgIi0tJXMiIG9wdGlvbiBkb2VzIG5vdCBhY2NlcHQgYSB2YWx1ZS4nLCAkbmFtZSkpOwp9CgppZiAoXGluX2FycmF5KCR2YWx1ZSwgWycnLCBudWxsXSwgdHJ1ZSkgJiYgJG9wdGlvbi0+YWNjZXB0VmFsdWUoKSAmJiBcY291bnQoJHRoaXMtPnBhcnNlZCkpIHsKCgokbmV4dCA9IGFycmF5X3NoaWZ0KCR0aGlzLT5wYXJzZWQpOwppZiAoKGlzc2V0KCRuZXh0WzBdKSAmJiAnLScgIT09ICRuZXh0WzBdKSB8fCBcaW5fYXJyYXkoJG5leHQsIFsnJywgbnVsbF0sIHRydWUpKSB7CiR2YWx1ZSA9ICRuZXh0Owp9IGVsc2UgewphcnJheV91bnNoaWZ0KCR0aGlzLT5wYXJzZWQsICRuZXh0KTsKfQp9CgppZiAobnVsbCA9PT0gJHZhbHVlKSB7CmlmICgkb3B0aW9uLT5pc1ZhbHVlUmVxdWlyZWQoKSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgIi0tJXMiIG9wdGlvbiByZXF1aXJlcyBhIHZhbHVlLicsICRuYW1lKSk7Cn0KCmlmICghJG9wdGlvbi0+aXNBcnJheSgpICYmICEkb3B0aW9uLT5pc1ZhbHVlT3B0aW9uYWwoKSkgewokdmFsdWUgPSB0cnVlOwp9Cn0KCmlmICgkb3B0aW9uLT5pc0FycmF5KCkpIHsKJHRoaXMtPm9wdGlvbnNbJG5hbWVdW10gPSAkdmFsdWU7Cn0gZWxzZSB7CiR0aGlzLT5vcHRpb25zWyRuYW1lXSA9ICR2YWx1ZTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Rmlyc3RBcmd1bWVudCgpCnsKJGlzT3B0aW9uID0gZmFsc2U7CmZvcmVhY2ggKCR0aGlzLT50b2tlbnMgYXMgJGkgPT4gJHRva2VuKSB7CmlmICgkdG9rZW4gJiYgJy0nID09PSAkdG9rZW5bMF0pIHsKaWYgKHN0cl9jb250YWlucygkdG9rZW4sICc9JykgfHwgIWlzc2V0KCR0aGlzLT50b2tlbnNbJGkgKyAxXSkpIHsKY29udGludWU7Cn0KCgoKJG5hbWUgPSAnLScgPT09ICR0b2tlblsxXSA/IHN1YnN0cigkdG9rZW4sIDIpIDogc3Vic3RyKCR0b2tlbiwgLTEpOwppZiAoIWlzc2V0KCR0aGlzLT5vcHRpb25zWyRuYW1lXSkgJiYgISR0aGlzLT5kZWZpbml0aW9uLT5oYXNTaG9ydGN1dCgkbmFtZSkpIHsKCn0gZWxzZWlmICgoaXNzZXQoJHRoaXMtPm9wdGlvbnNbJG5hbWVdKSB8fCBpc3NldCgkdGhpcy0+b3B0aW9uc1skbmFtZSA9ICR0aGlzLT5kZWZpbml0aW9uLT5zaG9ydGN1dFRvTmFtZSgkbmFtZSldKSkgJiYgJHRoaXMtPnRva2Vuc1skaSArIDFdID09PSAkdGhpcy0+b3B0aW9uc1skbmFtZV0pIHsKJGlzT3B0aW9uID0gdHJ1ZTsKfQoKY29udGludWU7Cn0KCmlmICgkaXNPcHRpb24pIHsKJGlzT3B0aW9uID0gZmFsc2U7CmNvbnRpbnVlOwp9CgpyZXR1cm4gJHRva2VuOwp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc1BhcmFtZXRlck9wdGlvbigkdmFsdWVzLCBib29sICRvbmx5UGFyYW1zID0gZmFsc2UpCnsKJHZhbHVlcyA9IChhcnJheSkgJHZhbHVlczsKCmZvcmVhY2ggKCR0aGlzLT50b2tlbnMgYXMgJHRva2VuKSB7CmlmICgkb25seVBhcmFtcyAmJiAnLS0nID09PSAkdG9rZW4pIHsKcmV0dXJuIGZhbHNlOwp9CmZvcmVhY2ggKCR2YWx1ZXMgYXMgJHZhbHVlKSB7CgoKCiRsZWFkaW5nID0gc3RyX3N0YXJ0c193aXRoKCR2YWx1ZSwgJy0tJykgPyAkdmFsdWUuJz0nIDogJHZhbHVlOwppZiAoJHRva2VuID09PSAkdmFsdWUgfHwgJycgIT09ICRsZWFkaW5nICYmIHN0cl9zdGFydHNfd2l0aCgkdG9rZW4sICRsZWFkaW5nKSkgewpyZXR1cm4gdHJ1ZTsKfQp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhcmFtZXRlck9wdGlvbigkdmFsdWVzLCAkZGVmYXVsdCA9IGZhbHNlLCBib29sICRvbmx5UGFyYW1zID0gZmFsc2UpCnsKJHZhbHVlcyA9IChhcnJheSkgJHZhbHVlczsKJHRva2VucyA9ICR0aGlzLT50b2tlbnM7Cgp3aGlsZSAoMCA8IFxjb3VudCgkdG9rZW5zKSkgewokdG9rZW4gPSBhcnJheV9zaGlmdCgkdG9rZW5zKTsKaWYgKCRvbmx5UGFyYW1zICYmICctLScgPT09ICR0b2tlbikgewpyZXR1cm4gJGRlZmF1bHQ7Cn0KCmZvcmVhY2ggKCR2YWx1ZXMgYXMgJHZhbHVlKSB7CmlmICgkdG9rZW4gPT09ICR2YWx1ZSkgewpyZXR1cm4gYXJyYXlfc2hpZnQoJHRva2Vucyk7Cn0KCgoKJGxlYWRpbmcgPSBzdHJfc3RhcnRzX3dpdGgoJHZhbHVlLCAnLS0nKSA/ICR2YWx1ZS4nPScgOiAkdmFsdWU7CmlmICgnJyAhPT0gJGxlYWRpbmcgJiYgc3RyX3N0YXJ0c193aXRoKCR0b2tlbiwgJGxlYWRpbmcpKSB7CnJldHVybiBzdWJzdHIoJHRva2VuLCBcc3RybGVuKCRsZWFkaW5nKSk7Cn0KfQp9CgpyZXR1cm4gJGRlZmF1bHQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKQp7CiR0b2tlbnMgPSBhcnJheV9tYXAoZnVuY3Rpb24gKCR0b2tlbikgewppZiAocHJlZ19tYXRjaCgne14oLVtePV0rPSkoLispfScsICR0b2tlbiwgJG1hdGNoKSkgewpyZXR1cm4gJG1hdGNoWzFdLiR0aGlzLT5lc2NhcGVUb2tlbigkbWF0Y2hbMl0pOwp9CgppZiAoJHRva2VuICYmICctJyAhPT0gJHRva2VuWzBdKSB7CnJldHVybiAkdGhpcy0+ZXNjYXBlVG9rZW4oJHRva2VuKTsKfQoKcmV0dXJuICR0b2tlbjsKfSwgJHRoaXMtPnRva2Vucyk7CgpyZXR1cm4gaW1wbG9kZSgnICcsICR0b2tlbnMpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0OwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRPcHRpb25FeGNlcHRpb247CgoKCgoKCgoKCgpjbGFzcyBBcnJheUlucHV0IGV4dGVuZHMgSW5wdXQKewpwcml2YXRlICRwYXJhbWV0ZXJzOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRwYXJhbWV0ZXJzLCA/SW5wdXREZWZpbml0aW9uICRkZWZpbml0aW9uID0gbnVsbCkKewokdGhpcy0+cGFyYW1ldGVycyA9ICRwYXJhbWV0ZXJzOwoKcGFyZW50OjpfX2NvbnN0cnVjdCgkZGVmaW5pdGlvbik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGaXJzdEFyZ3VtZW50KCkKewpmb3JlYWNoICgkdGhpcy0+cGFyYW1ldGVycyBhcyAkcGFyYW0gPT4gJHZhbHVlKSB7CmlmICgkcGFyYW0gJiYgXGlzX3N0cmluZygkcGFyYW0pICYmICctJyA9PT0gJHBhcmFtWzBdKSB7CmNvbnRpbnVlOwp9CgpyZXR1cm4gJHZhbHVlOwp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc1BhcmFtZXRlck9wdGlvbigkdmFsdWVzLCBib29sICRvbmx5UGFyYW1zID0gZmFsc2UpCnsKJHZhbHVlcyA9IChhcnJheSkgJHZhbHVlczsKCmZvcmVhY2ggKCR0aGlzLT5wYXJhbWV0ZXJzIGFzICRrID0+ICR2KSB7CmlmICghXGlzX2ludCgkaykpIHsKJHYgPSAkazsKfQoKaWYgKCRvbmx5UGFyYW1zICYmICctLScgPT09ICR2KSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKFxpbl9hcnJheSgkdiwgJHZhbHVlcykpIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFyYW1ldGVyT3B0aW9uKCR2YWx1ZXMsICRkZWZhdWx0ID0gZmFsc2UsIGJvb2wgJG9ubHlQYXJhbXMgPSBmYWxzZSkKewokdmFsdWVzID0gKGFycmF5KSAkdmFsdWVzOwoKZm9yZWFjaCAoJHRoaXMtPnBhcmFtZXRlcnMgYXMgJGsgPT4gJHYpIHsKaWYgKCRvbmx5UGFyYW1zICYmICgnLS0nID09PSAkayB8fCAoXGlzX2ludCgkaykgJiYgJy0tJyA9PT0gJHYpKSkgewpyZXR1cm4gJGRlZmF1bHQ7Cn0KCmlmIChcaXNfaW50KCRrKSkgewppZiAoXGluX2FycmF5KCR2LCAkdmFsdWVzKSkgewpyZXR1cm4gdHJ1ZTsKfQp9IGVsc2VpZiAoXGluX2FycmF5KCRrLCAkdmFsdWVzKSkgewpyZXR1cm4gJHY7Cn0KfQoKcmV0dXJuICRkZWZhdWx0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCkKewokcGFyYW1zID0gW107CmZvcmVhY2ggKCR0aGlzLT5wYXJhbWV0ZXJzIGFzICRwYXJhbSA9PiAkdmFsKSB7CmlmICgkcGFyYW0gJiYgXGlzX3N0cmluZygkcGFyYW0pICYmICctJyA9PT0gJHBhcmFtWzBdKSB7CiRnbHVlID0gKCctJyA9PT0gJHBhcmFtWzFdKSA/ICc9JyA6ICcgJzsKaWYgKFxpc19hcnJheSgkdmFsKSkgewpmb3JlYWNoICgkdmFsIGFzICR2KSB7CiRwYXJhbXNbXSA9ICRwYXJhbS4oJycgIT0gJHYgPyAkZ2x1ZS4kdGhpcy0+ZXNjYXBlVG9rZW4oJHYpIDogJycpOwp9Cn0gZWxzZSB7CiRwYXJhbXNbXSA9ICRwYXJhbS4oJycgIT0gJHZhbCA/ICRnbHVlLiR0aGlzLT5lc2NhcGVUb2tlbigkdmFsKSA6ICcnKTsKfQp9IGVsc2UgewokcGFyYW1zW10gPSBcaXNfYXJyYXkoJHZhbCkgPyBpbXBsb2RlKCcgJywgYXJyYXlfbWFwKFskdGhpcywgJ2VzY2FwZVRva2VuJ10sICR2YWwpKSA6ICR0aGlzLT5lc2NhcGVUb2tlbigkdmFsKTsKfQp9CgpyZXR1cm4gaW1wbG9kZSgnICcsICRwYXJhbXMpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcGFyc2UoKQp7CmZvcmVhY2ggKCR0aGlzLT5wYXJhbWV0ZXJzIGFzICRrZXkgPT4gJHZhbHVlKSB7CmlmICgnLS0nID09PSAka2V5KSB7CnJldHVybjsKfQppZiAoc3RyX3N0YXJ0c193aXRoKCRrZXksICctLScpKSB7CiR0aGlzLT5hZGRMb25nT3B0aW9uKHN1YnN0cigka2V5LCAyKSwgJHZhbHVlKTsKfSBlbHNlaWYgKHN0cl9zdGFydHNfd2l0aCgka2V5LCAnLScpKSB7CiR0aGlzLT5hZGRTaG9ydE9wdGlvbihzdWJzdHIoJGtleSwgMSksICR2YWx1ZSk7Cn0gZWxzZSB7CiR0aGlzLT5hZGRBcmd1bWVudCgka2V5LCAkdmFsdWUpOwp9Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFkZFNob3J0T3B0aW9uKHN0cmluZyAkc2hvcnRjdXQsICR2YWx1ZSkKewppZiAoISR0aGlzLT5kZWZpbml0aW9uLT5oYXNTaG9ydGN1dCgkc2hvcnRjdXQpKSB7CnRocm93IG5ldyBJbnZhbGlkT3B0aW9uRXhjZXB0aW9uKHNwcmludGYoJ1RoZSAiLSVzIiBvcHRpb24gZG9lcyBub3QgZXhpc3QuJywgJHNob3J0Y3V0KSk7Cn0KCiR0aGlzLT5hZGRMb25nT3B0aW9uKCR0aGlzLT5kZWZpbml0aW9uLT5nZXRPcHRpb25Gb3JTaG9ydGN1dCgkc2hvcnRjdXQpLT5nZXROYW1lKCksICR2YWx1ZSk7Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gYWRkTG9uZ09wdGlvbihzdHJpbmcgJG5hbWUsICR2YWx1ZSkKewppZiAoISR0aGlzLT5kZWZpbml0aW9uLT5oYXNPcHRpb24oJG5hbWUpKSB7CmlmICghJHRoaXMtPmRlZmluaXRpb24tPmhhc05lZ2F0aW9uKCRuYW1lKSkgewp0aHJvdyBuZXcgSW52YWxpZE9wdGlvbkV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgIi0tJXMiIG9wdGlvbiBkb2VzIG5vdCBleGlzdC4nLCAkbmFtZSkpOwp9Cgokb3B0aW9uTmFtZSA9ICR0aGlzLT5kZWZpbml0aW9uLT5uZWdhdGlvblRvTmFtZSgkbmFtZSk7CiR0aGlzLT5vcHRpb25zWyRvcHRpb25OYW1lXSA9IGZhbHNlOwoKcmV0dXJuOwp9Cgokb3B0aW9uID0gJHRoaXMtPmRlZmluaXRpb24tPmdldE9wdGlvbigkbmFtZSk7CgppZiAobnVsbCA9PT0gJHZhbHVlKSB7CmlmICgkb3B0aW9uLT5pc1ZhbHVlUmVxdWlyZWQoKSkgewp0aHJvdyBuZXcgSW52YWxpZE9wdGlvbkV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgIi0tJXMiIG9wdGlvbiByZXF1aXJlcyBhIHZhbHVlLicsICRuYW1lKSk7Cn0KCmlmICghJG9wdGlvbi0+aXNWYWx1ZU9wdGlvbmFsKCkpIHsKJHZhbHVlID0gdHJ1ZTsKfQp9CgokdGhpcy0+b3B0aW9uc1skbmFtZV0gPSAkdmFsdWU7Cn0KCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBhZGRBcmd1bWVudCgkbmFtZSwgJHZhbHVlKQp7CmlmICghJHRoaXMtPmRlZmluaXRpb24tPmhhc0FyZ3VtZW50KCRuYW1lKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSAiJXMiIGFyZ3VtZW50IGRvZXMgbm90IGV4aXN0LicsICRuYW1lKSk7Cn0KCiR0aGlzLT5hcmd1bWVudHNbJG5hbWVdID0gJHZhbHVlOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0OwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXFJ1bnRpbWVFeGNlcHRpb247CgoKCgoKCgoKCgoKCmFic3RyYWN0IGNsYXNzIElucHV0IGltcGxlbWVudHMgSW5wdXRJbnRlcmZhY2UsIFN0cmVhbWFibGVJbnB1dEludGVyZmFjZQp7CnByb3RlY3RlZCAkZGVmaW5pdGlvbjsKcHJvdGVjdGVkICRzdHJlYW07CnByb3RlY3RlZCAkb3B0aW9ucyA9IFtdOwpwcm90ZWN0ZWQgJGFyZ3VtZW50cyA9IFtdOwpwcm90ZWN0ZWQgJGludGVyYWN0aXZlID0gdHJ1ZTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/SW5wdXREZWZpbml0aW9uICRkZWZpbml0aW9uID0gbnVsbCkKewppZiAobnVsbCA9PT0gJGRlZmluaXRpb24pIHsKJHRoaXMtPmRlZmluaXRpb24gPSBuZXcgSW5wdXREZWZpbml0aW9uKCk7Cn0gZWxzZSB7CiR0aGlzLT5iaW5kKCRkZWZpbml0aW9uKTsKJHRoaXMtPnZhbGlkYXRlKCk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGJpbmQoSW5wdXREZWZpbml0aW9uICRkZWZpbml0aW9uKQp7CiR0aGlzLT5hcmd1bWVudHMgPSBbXTsKJHRoaXMtPm9wdGlvbnMgPSBbXTsKJHRoaXMtPmRlZmluaXRpb24gPSAkZGVmaW5pdGlvbjsKCiR0aGlzLT5wYXJzZSgpOwp9CgoKCgphYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gcGFyc2UoKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZSgpCnsKJGRlZmluaXRpb24gPSAkdGhpcy0+ZGVmaW5pdGlvbjsKJGdpdmVuQXJndW1lbnRzID0gJHRoaXMtPmFyZ3VtZW50czsKCiRtaXNzaW5nQXJndW1lbnRzID0gYXJyYXlfZmlsdGVyKGFycmF5X2tleXMoJGRlZmluaXRpb24tPmdldEFyZ3VtZW50cygpKSwgZnVuY3Rpb24gKCRhcmd1bWVudCkgdXNlICgkZGVmaW5pdGlvbiwgJGdpdmVuQXJndW1lbnRzKSB7CnJldHVybiAhXGFycmF5X2tleV9leGlzdHMoJGFyZ3VtZW50LCAkZ2l2ZW5Bcmd1bWVudHMpICYmICRkZWZpbml0aW9uLT5nZXRBcmd1bWVudCgkYXJndW1lbnQpLT5pc1JlcXVpcmVkKCk7Cn0pOwoKaWYgKFxjb3VudCgkbWlzc2luZ0FyZ3VtZW50cykgPiAwKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJ05vdCBlbm91Z2ggYXJndW1lbnRzIChtaXNzaW5nOiAiJXMiKS4nLCBpbXBsb2RlKCcsICcsICRtaXNzaW5nQXJndW1lbnRzKSkpOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0ludGVyYWN0aXZlKCkKewpyZXR1cm4gJHRoaXMtPmludGVyYWN0aXZlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SW50ZXJhY3RpdmUoYm9vbCAkaW50ZXJhY3RpdmUpCnsKJHRoaXMtPmludGVyYWN0aXZlID0gJGludGVyYWN0aXZlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXJndW1lbnRzKCkKewpyZXR1cm4gYXJyYXlfbWVyZ2UoJHRoaXMtPmRlZmluaXRpb24tPmdldEFyZ3VtZW50RGVmYXVsdHMoKSwgJHRoaXMtPmFyZ3VtZW50cyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBcmd1bWVudChzdHJpbmcgJG5hbWUpCnsKaWYgKCEkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzQXJndW1lbnQoJG5hbWUpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlICIlcyIgYXJndW1lbnQgZG9lcyBub3QgZXhpc3QuJywgJG5hbWUpKTsKfQoKcmV0dXJuICR0aGlzLT5hcmd1bWVudHNbJG5hbWVdID8/ICR0aGlzLT5kZWZpbml0aW9uLT5nZXRBcmd1bWVudCgkbmFtZSktPmdldERlZmF1bHQoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFyZ3VtZW50KHN0cmluZyAkbmFtZSwgJHZhbHVlKQp7CmlmICghJHRoaXMtPmRlZmluaXRpb24tPmhhc0FyZ3VtZW50KCRuYW1lKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSAiJXMiIGFyZ3VtZW50IGRvZXMgbm90IGV4aXN0LicsICRuYW1lKSk7Cn0KCiR0aGlzLT5hcmd1bWVudHNbJG5hbWVdID0gJHZhbHVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzQXJndW1lbnQoc3RyaW5nICRuYW1lKQp7CnJldHVybiAkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzQXJndW1lbnQoJG5hbWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3B0aW9ucygpCnsKcmV0dXJuIGFycmF5X21lcmdlKCR0aGlzLT5kZWZpbml0aW9uLT5nZXRPcHRpb25EZWZhdWx0cygpLCAkdGhpcy0+b3B0aW9ucyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPcHRpb24oc3RyaW5nICRuYW1lKQp7CmlmICgkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzTmVnYXRpb24oJG5hbWUpKSB7CmlmIChudWxsID09PSAkdmFsdWUgPSAkdGhpcy0+Z2V0T3B0aW9uKCR0aGlzLT5kZWZpbml0aW9uLT5uZWdhdGlvblRvTmFtZSgkbmFtZSkpKSB7CnJldHVybiAkdmFsdWU7Cn0KCnJldHVybiAhJHZhbHVlOwp9CgppZiAoISR0aGlzLT5kZWZpbml0aW9uLT5oYXNPcHRpb24oJG5hbWUpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlICIlcyIgb3B0aW9uIGRvZXMgbm90IGV4aXN0LicsICRuYW1lKSk7Cn0KCnJldHVybiBcYXJyYXlfa2V5X2V4aXN0cygkbmFtZSwgJHRoaXMtPm9wdGlvbnMpID8gJHRoaXMtPm9wdGlvbnNbJG5hbWVdIDogJHRoaXMtPmRlZmluaXRpb24tPmdldE9wdGlvbigkbmFtZSktPmdldERlZmF1bHQoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE9wdGlvbihzdHJpbmcgJG5hbWUsICR2YWx1ZSkKewppZiAoJHRoaXMtPmRlZmluaXRpb24tPmhhc05lZ2F0aW9uKCRuYW1lKSkgewokdGhpcy0+b3B0aW9uc1skdGhpcy0+ZGVmaW5pdGlvbi0+bmVnYXRpb25Ub05hbWUoJG5hbWUpXSA9ICEkdmFsdWU7CgpyZXR1cm47Cn0gZWxzZWlmICghJHRoaXMtPmRlZmluaXRpb24tPmhhc09wdGlvbigkbmFtZSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgIiVzIiBvcHRpb24gZG9lcyBub3QgZXhpc3QuJywgJG5hbWUpKTsKfQoKJHRoaXMtPm9wdGlvbnNbJG5hbWVdID0gJHZhbHVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzT3B0aW9uKHN0cmluZyAkbmFtZSkKewpyZXR1cm4gJHRoaXMtPmRlZmluaXRpb24tPmhhc09wdGlvbigkbmFtZSkgfHwgJHRoaXMtPmRlZmluaXRpb24tPmhhc05lZ2F0aW9uKCRuYW1lKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXNjYXBlVG9rZW4oc3RyaW5nICR0b2tlbikKewpyZXR1cm4gcHJlZ19tYXRjaCgne15bXHctXSskfScsICR0b2tlbikgPyAkdG9rZW4gOiBlc2NhcGVzaGVsbGFyZygkdG9rZW4pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U3RyZWFtKCRzdHJlYW0pCnsKJHRoaXMtPnN0cmVhbSA9ICRzdHJlYW07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdHJlYW0oKQp7CnJldHVybiAkdGhpcy0+c3RyZWFtOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0OwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXExvZ2ljRXhjZXB0aW9uOwoKCgoKCgpjbGFzcyBJbnB1dEFyZ3VtZW50CnsKcHVibGljIGNvbnN0IFJFUVVJUkVEID0gMTsKcHVibGljIGNvbnN0IE9QVElPTkFMID0gMjsKcHVibGljIGNvbnN0IElTX0FSUkFZID0gNDsKCnByaXZhdGUgJG5hbWU7CnByaXZhdGUgJG1vZGU7CnByaXZhdGUgJGRlZmF1bHQ7CnByaXZhdGUgJGRlc2NyaXB0aW9uOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lLCA/aW50ICRtb2RlID0gbnVsbCwgc3RyaW5nICRkZXNjcmlwdGlvbiA9ICcnLCAkZGVmYXVsdCA9IG51bGwpCnsKaWYgKG51bGwgPT09ICRtb2RlKSB7CiRtb2RlID0gc2VsZjo6T1BUSU9OQUw7Cn0gZWxzZWlmICgkbW9kZSA+IDcgfHwgJG1vZGUgPCAxKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignQXJndW1lbnQgbW9kZSAiJXMiIGlzIG5vdCB2YWxpZC4nLCAkbW9kZSkpOwp9CgokdGhpcy0+bmFtZSA9ICRuYW1lOwokdGhpcy0+bW9kZSA9ICRtb2RlOwokdGhpcy0+ZGVzY3JpcHRpb24gPSAkZGVzY3JpcHRpb247CgokdGhpcy0+c2V0RGVmYXVsdCgkZGVmYXVsdCk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKQp7CnJldHVybiAkdGhpcy0+bmFtZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNSZXF1aXJlZCgpCnsKcmV0dXJuIHNlbGY6OlJFUVVJUkVEID09PSAoc2VsZjo6UkVRVUlSRUQgJiAkdGhpcy0+bW9kZSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzQXJyYXkoKQp7CnJldHVybiBzZWxmOjpJU19BUlJBWSA9PT0gKHNlbGY6OklTX0FSUkFZICYgJHRoaXMtPm1vZGUpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERlZmF1bHQoJGRlZmF1bHQgPSBudWxsKQp7CmlmICgkdGhpcy0+aXNSZXF1aXJlZCgpICYmIG51bGwgIT09ICRkZWZhdWx0KSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignQ2Fubm90IHNldCBhIGRlZmF1bHQgdmFsdWUgZXhjZXB0IGZvciBJbnB1dEFyZ3VtZW50OjpPUFRJT05BTCBtb2RlLicpOwp9CgppZiAoJHRoaXMtPmlzQXJyYXkoKSkgewppZiAobnVsbCA9PT0gJGRlZmF1bHQpIHsKJGRlZmF1bHQgPSBbXTsKfSBlbHNlaWYgKCFcaXNfYXJyYXkoJGRlZmF1bHQpKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignQSBkZWZhdWx0IHZhbHVlIGZvciBhbiBhcnJheSBhcmd1bWVudCBtdXN0IGJlIGFuIGFycmF5LicpOwp9Cn0KCiR0aGlzLT5kZWZhdWx0ID0gJGRlZmF1bHQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERlZmF1bHQoKQp7CnJldHVybiAkdGhpcy0+ZGVmYXVsdDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGVzY3JpcHRpb24oKQp7CnJldHVybiAkdGhpcy0+ZGVzY3JpcHRpb247Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXQ7CgoKCgoKCgppbnRlcmZhY2UgSW5wdXRBd2FyZUludGVyZmFjZQp7CgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRJbnB1dChJbnB1dEludGVyZmFjZSAkaW5wdXQpOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxMb2dpY0V4Y2VwdGlvbjsKCgoKCgoKCgoKCgoKCmNsYXNzIElucHV0RGVmaW5pdGlvbgp7CnByaXZhdGUgJGFyZ3VtZW50czsKcHJpdmF0ZSAkcmVxdWlyZWRDb3VudDsKcHJpdmF0ZSAkbGFzdEFycmF5QXJndW1lbnQ7CnByaXZhdGUgJGxhc3RPcHRpb25hbEFyZ3VtZW50Owpwcml2YXRlICRvcHRpb25zOwpwcml2YXRlICRuZWdhdGlvbnM7CnByaXZhdGUgJHNob3J0Y3V0czsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkZGVmaW5pdGlvbiA9IFtdKQp7CiR0aGlzLT5zZXREZWZpbml0aW9uKCRkZWZpbml0aW9uKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERlZmluaXRpb24oYXJyYXkgJGRlZmluaXRpb24pCnsKJGFyZ3VtZW50cyA9IFtdOwokb3B0aW9ucyA9IFtdOwpmb3JlYWNoICgkZGVmaW5pdGlvbiBhcyAkaXRlbSkgewppZiAoJGl0ZW0gaW5zdGFuY2VvZiBJbnB1dE9wdGlvbikgewokb3B0aW9uc1tdID0gJGl0ZW07Cn0gZWxzZSB7CiRhcmd1bWVudHNbXSA9ICRpdGVtOwp9Cn0KCiR0aGlzLT5zZXRBcmd1bWVudHMoJGFyZ3VtZW50cyk7CiR0aGlzLT5zZXRPcHRpb25zKCRvcHRpb25zKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXJndW1lbnRzKGFycmF5ICRhcmd1bWVudHMgPSBbXSkKewokdGhpcy0+YXJndW1lbnRzID0gW107CiR0aGlzLT5yZXF1aXJlZENvdW50ID0gMDsKJHRoaXMtPmxhc3RPcHRpb25hbEFyZ3VtZW50ID0gbnVsbDsKJHRoaXMtPmxhc3RBcnJheUFyZ3VtZW50ID0gbnVsbDsKJHRoaXMtPmFkZEFyZ3VtZW50cygkYXJndW1lbnRzKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkQXJndW1lbnRzKD9hcnJheSAkYXJndW1lbnRzID0gW10pCnsKaWYgKG51bGwgIT09ICRhcmd1bWVudHMpIHsKZm9yZWFjaCAoJGFyZ3VtZW50cyBhcyAkYXJndW1lbnQpIHsKJHRoaXMtPmFkZEFyZ3VtZW50KCRhcmd1bWVudCk7Cn0KfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkQXJndW1lbnQoSW5wdXRBcmd1bWVudCAkYXJndW1lbnQpCnsKaWYgKGlzc2V0KCR0aGlzLT5hcmd1bWVudHNbJGFyZ3VtZW50LT5nZXROYW1lKCldKSkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oc3ByaW50ZignQW4gYXJndW1lbnQgd2l0aCBuYW1lICIlcyIgYWxyZWFkeSBleGlzdHMuJywgJGFyZ3VtZW50LT5nZXROYW1lKCkpKTsKfQoKaWYgKG51bGwgIT09ICR0aGlzLT5sYXN0QXJyYXlBcmd1bWVudCkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oc3ByaW50ZignQ2Fubm90IGFkZCBhIHJlcXVpcmVkIGFyZ3VtZW50ICIlcyIgYWZ0ZXIgYW4gYXJyYXkgYXJndW1lbnQgIiVzIi4nLCAkYXJndW1lbnQtPmdldE5hbWUoKSwgJHRoaXMtPmxhc3RBcnJheUFyZ3VtZW50LT5nZXROYW1lKCkpKTsKfQoKaWYgKCRhcmd1bWVudC0+aXNSZXF1aXJlZCgpICYmIG51bGwgIT09ICR0aGlzLT5sYXN0T3B0aW9uYWxBcmd1bWVudCkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oc3ByaW50ZignQ2Fubm90IGFkZCBhIHJlcXVpcmVkIGFyZ3VtZW50ICIlcyIgYWZ0ZXIgYW4gb3B0aW9uYWwgb25lICIlcyIuJywgJGFyZ3VtZW50LT5nZXROYW1lKCksICR0aGlzLT5sYXN0T3B0aW9uYWxBcmd1bWVudC0+Z2V0TmFtZSgpKSk7Cn0KCmlmICgkYXJndW1lbnQtPmlzQXJyYXkoKSkgewokdGhpcy0+bGFzdEFycmF5QXJndW1lbnQgPSAkYXJndW1lbnQ7Cn0KCmlmICgkYXJndW1lbnQtPmlzUmVxdWlyZWQoKSkgeworKyR0aGlzLT5yZXF1aXJlZENvdW50Owp9IGVsc2UgewokdGhpcy0+bGFzdE9wdGlvbmFsQXJndW1lbnQgPSAkYXJndW1lbnQ7Cn0KCiR0aGlzLT5hcmd1bWVudHNbJGFyZ3VtZW50LT5nZXROYW1lKCldID0gJGFyZ3VtZW50Owp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXJndW1lbnQoJG5hbWUpCnsKaWYgKCEkdGhpcy0+aGFzQXJndW1lbnQoJG5hbWUpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlICIlcyIgYXJndW1lbnQgZG9lcyBub3QgZXhpc3QuJywgJG5hbWUpKTsKfQoKJGFyZ3VtZW50cyA9IFxpc19pbnQoJG5hbWUpID8gYXJyYXlfdmFsdWVzKCR0aGlzLT5hcmd1bWVudHMpIDogJHRoaXMtPmFyZ3VtZW50czsKCnJldHVybiAkYXJndW1lbnRzWyRuYW1lXTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNBcmd1bWVudCgkbmFtZSkKewokYXJndW1lbnRzID0gXGlzX2ludCgkbmFtZSkgPyBhcnJheV92YWx1ZXMoJHRoaXMtPmFyZ3VtZW50cykgOiAkdGhpcy0+YXJndW1lbnRzOwoKcmV0dXJuIGlzc2V0KCRhcmd1bWVudHNbJG5hbWVdKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXJndW1lbnRzKCkKewpyZXR1cm4gJHRoaXMtPmFyZ3VtZW50czsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXJndW1lbnRDb3VudCgpCnsKcmV0dXJuIG51bGwgIT09ICR0aGlzLT5sYXN0QXJyYXlBcmd1bWVudCA/IFxQSFBfSU5UX01BWCA6IFxjb3VudCgkdGhpcy0+YXJndW1lbnRzKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXJndW1lbnRSZXF1aXJlZENvdW50KCkKewpyZXR1cm4gJHRoaXMtPnJlcXVpcmVkQ291bnQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBcmd1bWVudERlZmF1bHRzKCkKewokdmFsdWVzID0gW107CmZvcmVhY2ggKCR0aGlzLT5hcmd1bWVudHMgYXMgJGFyZ3VtZW50KSB7CiR2YWx1ZXNbJGFyZ3VtZW50LT5nZXROYW1lKCldID0gJGFyZ3VtZW50LT5nZXREZWZhdWx0KCk7Cn0KCnJldHVybiAkdmFsdWVzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRPcHRpb25zKGFycmF5ICRvcHRpb25zID0gW10pCnsKJHRoaXMtPm9wdGlvbnMgPSBbXTsKJHRoaXMtPnNob3J0Y3V0cyA9IFtdOwokdGhpcy0+bmVnYXRpb25zID0gW107CiR0aGlzLT5hZGRPcHRpb25zKCRvcHRpb25zKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkT3B0aW9ucyhhcnJheSAkb3B0aW9ucyA9IFtdKQp7CmZvcmVhY2ggKCRvcHRpb25zIGFzICRvcHRpb24pIHsKJHRoaXMtPmFkZE9wdGlvbigkb3B0aW9uKTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkT3B0aW9uKElucHV0T3B0aW9uICRvcHRpb24pCnsKaWYgKGlzc2V0KCR0aGlzLT5vcHRpb25zWyRvcHRpb24tPmdldE5hbWUoKV0pICYmICEkb3B0aW9uLT5lcXVhbHMoJHRoaXMtPm9wdGlvbnNbJG9wdGlvbi0+Z2V0TmFtZSgpXSkpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ0FuIG9wdGlvbiBuYW1lZCAiJXMiIGFscmVhZHkgZXhpc3RzLicsICRvcHRpb24tPmdldE5hbWUoKSkpOwp9CmlmIChpc3NldCgkdGhpcy0+bmVnYXRpb25zWyRvcHRpb24tPmdldE5hbWUoKV0pKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKCdBbiBvcHRpb24gbmFtZWQgIiVzIiBhbHJlYWR5IGV4aXN0cy4nLCAkb3B0aW9uLT5nZXROYW1lKCkpKTsKfQoKaWYgKCRvcHRpb24tPmdldFNob3J0Y3V0KCkpIHsKZm9yZWFjaCAoZXhwbG9kZSgnfCcsICRvcHRpb24tPmdldFNob3J0Y3V0KCkpIGFzICRzaG9ydGN1dCkgewppZiAoaXNzZXQoJHRoaXMtPnNob3J0Y3V0c1skc2hvcnRjdXRdKSAmJiAhJG9wdGlvbi0+ZXF1YWxzKCR0aGlzLT5vcHRpb25zWyR0aGlzLT5zaG9ydGN1dHNbJHNob3J0Y3V0XV0pKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKCdBbiBvcHRpb24gd2l0aCBzaG9ydGN1dCAiJXMiIGFscmVhZHkgZXhpc3RzLicsICRzaG9ydGN1dCkpOwp9Cn0KfQoKJHRoaXMtPm9wdGlvbnNbJG9wdGlvbi0+Z2V0TmFtZSgpXSA9ICRvcHRpb247CmlmICgkb3B0aW9uLT5nZXRTaG9ydGN1dCgpKSB7CmZvcmVhY2ggKGV4cGxvZGUoJ3wnLCAkb3B0aW9uLT5nZXRTaG9ydGN1dCgpKSBhcyAkc2hvcnRjdXQpIHsKJHRoaXMtPnNob3J0Y3V0c1skc2hvcnRjdXRdID0gJG9wdGlvbi0+Z2V0TmFtZSgpOwp9Cn0KCmlmICgkb3B0aW9uLT5pc05lZ2F0YWJsZSgpKSB7CiRuZWdhdGVkTmFtZSA9ICduby0nLiRvcHRpb24tPmdldE5hbWUoKTsKaWYgKGlzc2V0KCR0aGlzLT5vcHRpb25zWyRuZWdhdGVkTmFtZV0pKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKCdBbiBvcHRpb24gbmFtZWQgIiVzIiBhbHJlYWR5IGV4aXN0cy4nLCAkbmVnYXRlZE5hbWUpKTsKfQokdGhpcy0+bmVnYXRpb25zWyRuZWdhdGVkTmFtZV0gPSAkb3B0aW9uLT5nZXROYW1lKCk7Cn0KfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPcHRpb24oc3RyaW5nICRuYW1lKQp7CmlmICghJHRoaXMtPmhhc09wdGlvbigkbmFtZSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgIi0tJXMiIG9wdGlvbiBkb2VzIG5vdCBleGlzdC4nLCAkbmFtZSkpOwp9CgpyZXR1cm4gJHRoaXMtPm9wdGlvbnNbJG5hbWVdOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNPcHRpb24oc3RyaW5nICRuYW1lKQp7CnJldHVybiBpc3NldCgkdGhpcy0+b3B0aW9uc1skbmFtZV0pOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPcHRpb25zKCkKewpyZXR1cm4gJHRoaXMtPm9wdGlvbnM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc1Nob3J0Y3V0KHN0cmluZyAkbmFtZSkKewpyZXR1cm4gaXNzZXQoJHRoaXMtPnNob3J0Y3V0c1skbmFtZV0pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzTmVnYXRpb24oc3RyaW5nICRuYW1lKTogYm9vbAp7CnJldHVybiBpc3NldCgkdGhpcy0+bmVnYXRpb25zWyRuYW1lXSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE9wdGlvbkZvclNob3J0Y3V0KHN0cmluZyAkc2hvcnRjdXQpCnsKcmV0dXJuICR0aGlzLT5nZXRPcHRpb24oJHRoaXMtPnNob3J0Y3V0VG9OYW1lKCRzaG9ydGN1dCkpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3B0aW9uRGVmYXVsdHMoKQp7CiR2YWx1ZXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPm9wdGlvbnMgYXMgJG9wdGlvbikgewokdmFsdWVzWyRvcHRpb24tPmdldE5hbWUoKV0gPSAkb3B0aW9uLT5nZXREZWZhdWx0KCk7Cn0KCnJldHVybiAkdmFsdWVzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNob3J0Y3V0VG9OYW1lKHN0cmluZyAkc2hvcnRjdXQpOiBzdHJpbmcKewppZiAoIWlzc2V0KCR0aGlzLT5zaG9ydGN1dHNbJHNob3J0Y3V0XSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgIi0lcyIgb3B0aW9uIGRvZXMgbm90IGV4aXN0LicsICRzaG9ydGN1dCkpOwp9CgpyZXR1cm4gJHRoaXMtPnNob3J0Y3V0c1skc2hvcnRjdXRdOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG5lZ2F0aW9uVG9OYW1lKHN0cmluZyAkbmVnYXRpb24pOiBzdHJpbmcKewppZiAoIWlzc2V0KCR0aGlzLT5uZWdhdGlvbnNbJG5lZ2F0aW9uXSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgIi0tJXMiIG9wdGlvbiBkb2VzIG5vdCBleGlzdC4nLCAkbmVnYXRpb24pKTsKfQoKcmV0dXJuICR0aGlzLT5uZWdhdGlvbnNbJG5lZ2F0aW9uXTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3lub3BzaXMoYm9vbCAkc2hvcnQgPSBmYWxzZSkKewokZWxlbWVudHMgPSBbXTsKCmlmICgkc2hvcnQgJiYgJHRoaXMtPmdldE9wdGlvbnMoKSkgewokZWxlbWVudHNbXSA9ICdbb3B0aW9uc10nOwp9IGVsc2VpZiAoISRzaG9ydCkgewpmb3JlYWNoICgkdGhpcy0+Z2V0T3B0aW9ucygpIGFzICRvcHRpb24pIHsKJHZhbHVlID0gJyc7CmlmICgkb3B0aW9uLT5hY2NlcHRWYWx1ZSgpKSB7CiR2YWx1ZSA9IHNwcmludGYoCicgJXMlcyVzJywKJG9wdGlvbi0+aXNWYWx1ZU9wdGlvbmFsKCkgPyAnWycgOiAnJywKc3RydG91cHBlcigkb3B0aW9uLT5nZXROYW1lKCkpLAokb3B0aW9uLT5pc1ZhbHVlT3B0aW9uYWwoKSA/ICddJyA6ICcnCik7Cn0KCiRzaG9ydGN1dCA9ICRvcHRpb24tPmdldFNob3J0Y3V0KCkgPyBzcHJpbnRmKCctJXN8JywgJG9wdGlvbi0+Z2V0U2hvcnRjdXQoKSkgOiAnJzsKJG5lZ2F0aW9uID0gJG9wdGlvbi0+aXNOZWdhdGFibGUoKSA/IHNwcmludGYoJ3wtLW5vLSVzJywgJG9wdGlvbi0+Z2V0TmFtZSgpKSA6ICcnOwokZWxlbWVudHNbXSA9IHNwcmludGYoJ1slcy0tJXMlcyVzXScsICRzaG9ydGN1dCwgJG9wdGlvbi0+Z2V0TmFtZSgpLCAkdmFsdWUsICRuZWdhdGlvbik7Cn0KfQoKaWYgKFxjb3VudCgkZWxlbWVudHMpICYmICR0aGlzLT5nZXRBcmd1bWVudHMoKSkgewokZWxlbWVudHNbXSA9ICdbLS1dJzsKfQoKJHRhaWwgPSAnJzsKZm9yZWFjaCAoJHRoaXMtPmdldEFyZ3VtZW50cygpIGFzICRhcmd1bWVudCkgewokZWxlbWVudCA9ICc8Jy4kYXJndW1lbnQtPmdldE5hbWUoKS4nPic7CmlmICgkYXJndW1lbnQtPmlzQXJyYXkoKSkgewokZWxlbWVudCAuPSAnLi4uJzsKfQoKaWYgKCEkYXJndW1lbnQtPmlzUmVxdWlyZWQoKSkgewokZWxlbWVudCA9ICdbJy4kZWxlbWVudDsKJHRhaWwgLj0gJ10nOwp9CgokZWxlbWVudHNbXSA9ICRlbGVtZW50Owp9CgpyZXR1cm4gaW1wbG9kZSgnICcsICRlbGVtZW50cykuJHRhaWw7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cUnVudGltZUV4Y2VwdGlvbjsKCgoKCgoKaW50ZXJmYWNlIElucHV0SW50ZXJmYWNlCnsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Rmlyc3RBcmd1bWVudCgpOwoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNQYXJhbWV0ZXJPcHRpb24oJHZhbHVlcywgYm9vbCAkb25seVBhcmFtcyA9IGZhbHNlKTsKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhcmFtZXRlck9wdGlvbigkdmFsdWVzLCAkZGVmYXVsdCA9IGZhbHNlLCBib29sICRvbmx5UGFyYW1zID0gZmFsc2UpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYmluZChJbnB1dERlZmluaXRpb24gJGRlZmluaXRpb24pOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGUoKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFyZ3VtZW50cygpOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBcmd1bWVudChzdHJpbmcgJG5hbWUpOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBcmd1bWVudChzdHJpbmcgJG5hbWUsICR2YWx1ZSk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNBcmd1bWVudChzdHJpbmcgJG5hbWUpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3B0aW9ucygpOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPcHRpb24oc3RyaW5nICRuYW1lKTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0T3B0aW9uKHN0cmluZyAkbmFtZSwgJHZhbHVlKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc09wdGlvbihzdHJpbmcgJG5hbWUpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNJbnRlcmFjdGl2ZSgpOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEludGVyYWN0aXZlKGJvb2wgJGludGVyYWN0aXZlKTsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cTG9naWNFeGNlcHRpb247CgoKCgoKCmNsYXNzIElucHV0T3B0aW9uCnsKCgoKcHVibGljIGNvbnN0IFZBTFVFX05PTkUgPSAxOwoKCgoKcHVibGljIGNvbnN0IFZBTFVFX1JFUVVJUkVEID0gMjsKCgoKCnB1YmxpYyBjb25zdCBWQUxVRV9PUFRJT05BTCA9IDQ7CgoKCgpwdWJsaWMgY29uc3QgVkFMVUVfSVNfQVJSQVkgPSA4OwoKCgoKcHVibGljIGNvbnN0IFZBTFVFX05FR0FUQUJMRSA9IDE2OwoKcHJpdmF0ZSAkbmFtZTsKcHJpdmF0ZSAkc2hvcnRjdXQ7CnByaXZhdGUgJG1vZGU7CnByaXZhdGUgJGRlZmF1bHQ7CnByaXZhdGUgJGRlc2NyaXB0aW9uOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG5hbWUsICRzaG9ydGN1dCA9IG51bGwsID9pbnQgJG1vZGUgPSBudWxsLCBzdHJpbmcgJGRlc2NyaXB0aW9uID0gJycsICRkZWZhdWx0ID0gbnVsbCkKewppZiAoc3RyX3N0YXJ0c193aXRoKCRuYW1lLCAnLS0nKSkgewokbmFtZSA9IHN1YnN0cigkbmFtZSwgMik7Cn0KCmlmIChlbXB0eSgkbmFtZSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignQW4gb3B0aW9uIG5hbWUgY2Fubm90IGJlIGVtcHR5LicpOwp9CgppZiAoJycgPT09ICRzaG9ydGN1dCB8fCBbXSA9PT0gJHNob3J0Y3V0IHx8IGZhbHNlID09PSAkc2hvcnRjdXQpIHsKJHNob3J0Y3V0ID0gbnVsbDsKfQoKaWYgKG51bGwgIT09ICRzaG9ydGN1dCkgewppZiAoXGlzX2FycmF5KCRzaG9ydGN1dCkpIHsKJHNob3J0Y3V0ID0gaW1wbG9kZSgnfCcsICRzaG9ydGN1dCk7Cn0KJHNob3J0Y3V0cyA9IHByZWdfc3BsaXQoJ3soXHwpLT99JywgbHRyaW0oJHNob3J0Y3V0LCAnLScpKTsKJHNob3J0Y3V0cyA9IGFycmF5X2ZpbHRlcigkc2hvcnRjdXRzLCAnc3RybGVuJyk7CiRzaG9ydGN1dCA9IGltcGxvZGUoJ3wnLCAkc2hvcnRjdXRzKTsKCmlmICgnJyA9PT0gJHNob3J0Y3V0KSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0FuIG9wdGlvbiBzaG9ydGN1dCBjYW5ub3QgYmUgZW1wdHkuJyk7Cn0KfQoKaWYgKG51bGwgPT09ICRtb2RlKSB7CiRtb2RlID0gc2VsZjo6VkFMVUVfTk9ORTsKfSBlbHNlaWYgKCRtb2RlID49IChzZWxmOjpWQUxVRV9ORUdBVEFCTEUgPDwgMSkgfHwgJG1vZGUgPCAxKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignT3B0aW9uIG1vZGUgIiVzIiBpcyBub3QgdmFsaWQuJywgJG1vZGUpKTsKfQoKJHRoaXMtPm5hbWUgPSAkbmFtZTsKJHRoaXMtPnNob3J0Y3V0ID0gJHNob3J0Y3V0OwokdGhpcy0+bW9kZSA9ICRtb2RlOwokdGhpcy0+ZGVzY3JpcHRpb24gPSAkZGVzY3JpcHRpb247CgppZiAoJHRoaXMtPmlzQXJyYXkoKSAmJiAhJHRoaXMtPmFjY2VwdFZhbHVlKCkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW1wb3NzaWJsZSB0byBoYXZlIGFuIG9wdGlvbiBtb2RlIFZBTFVFX0lTX0FSUkFZIGlmIHRoZSBvcHRpb24gZG9lcyBub3QgYWNjZXB0IGEgdmFsdWUuJyk7Cn0KaWYgKCR0aGlzLT5pc05lZ2F0YWJsZSgpICYmICR0aGlzLT5hY2NlcHRWYWx1ZSgpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ltcG9zc2libGUgdG8gaGF2ZSBhbiBvcHRpb24gbW9kZSBWQUxVRV9ORUdBVEFCTEUgaWYgdGhlIG9wdGlvbiBhbHNvIGFjY2VwdHMgYSB2YWx1ZS4nKTsKfQoKJHRoaXMtPnNldERlZmF1bHQoJGRlZmF1bHQpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTaG9ydGN1dCgpCnsKcmV0dXJuICR0aGlzLT5zaG9ydGN1dDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpCnsKcmV0dXJuICR0aGlzLT5uYW1lOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhY2NlcHRWYWx1ZSgpCnsKcmV0dXJuICR0aGlzLT5pc1ZhbHVlUmVxdWlyZWQoKSB8fCAkdGhpcy0+aXNWYWx1ZU9wdGlvbmFsKCk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVmFsdWVSZXF1aXJlZCgpCnsKcmV0dXJuIHNlbGY6OlZBTFVFX1JFUVVJUkVEID09PSAoc2VsZjo6VkFMVUVfUkVRVUlSRUQgJiAkdGhpcy0+bW9kZSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVmFsdWVPcHRpb25hbCgpCnsKcmV0dXJuIHNlbGY6OlZBTFVFX09QVElPTkFMID09PSAoc2VsZjo6VkFMVUVfT1BUSU9OQUwgJiAkdGhpcy0+bW9kZSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzQXJyYXkoKQp7CnJldHVybiBzZWxmOjpWQUxVRV9JU19BUlJBWSA9PT0gKHNlbGY6OlZBTFVFX0lTX0FSUkFZICYgJHRoaXMtPm1vZGUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNOZWdhdGFibGUoKTogYm9vbAp7CnJldHVybiBzZWxmOjpWQUxVRV9ORUdBVEFCTEUgPT09IChzZWxmOjpWQUxVRV9ORUdBVEFCTEUgJiAkdGhpcy0+bW9kZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZWZhdWx0KCRkZWZhdWx0ID0gbnVsbCkKewppZiAoc2VsZjo6VkFMVUVfTk9ORSA9PT0gKHNlbGY6OlZBTFVFX05PTkUgJiAkdGhpcy0+bW9kZSkgJiYgbnVsbCAhPT0gJGRlZmF1bHQpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdDYW5ub3Qgc2V0IGEgZGVmYXVsdCB2YWx1ZSB3aGVuIHVzaW5nIElucHV0T3B0aW9uOjpWQUxVRV9OT05FIG1vZGUuJyk7Cn0KCmlmICgkdGhpcy0+aXNBcnJheSgpKSB7CmlmIChudWxsID09PSAkZGVmYXVsdCkgewokZGVmYXVsdCA9IFtdOwp9IGVsc2VpZiAoIVxpc19hcnJheSgkZGVmYXVsdCkpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdBIGRlZmF1bHQgdmFsdWUgZm9yIGFuIGFycmF5IG9wdGlvbiBtdXN0IGJlIGFuIGFycmF5LicpOwp9Cn0KCiR0aGlzLT5kZWZhdWx0ID0gJHRoaXMtPmFjY2VwdFZhbHVlKCkgfHwgJHRoaXMtPmlzTmVnYXRhYmxlKCkgPyAkZGVmYXVsdCA6IGZhbHNlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZWZhdWx0KCkKewpyZXR1cm4gJHRoaXMtPmRlZmF1bHQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERlc2NyaXB0aW9uKCkKewpyZXR1cm4gJHRoaXMtPmRlc2NyaXB0aW9uOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBlcXVhbHMoc2VsZiAkb3B0aW9uKQp7CnJldHVybiAkb3B0aW9uLT5nZXROYW1lKCkgPT09ICR0aGlzLT5nZXROYW1lKCkKJiYgJG9wdGlvbi0+Z2V0U2hvcnRjdXQoKSA9PT0gJHRoaXMtPmdldFNob3J0Y3V0KCkKJiYgJG9wdGlvbi0+Z2V0RGVmYXVsdCgpID09PSAkdGhpcy0+Z2V0RGVmYXVsdCgpCiYmICRvcHRpb24tPmlzTmVnYXRhYmxlKCkgPT09ICR0aGlzLT5pc05lZ2F0YWJsZSgpCiYmICRvcHRpb24tPmlzQXJyYXkoKSA9PT0gJHRoaXMtPmlzQXJyYXkoKQomJiAkb3B0aW9uLT5pc1ZhbHVlUmVxdWlyZWQoKSA9PT0gJHRoaXMtPmlzVmFsdWVSZXF1aXJlZCgpCiYmICRvcHRpb24tPmlzVmFsdWVPcHRpb25hbCgpID09PSAkdGhpcy0+aXNWYWx1ZU9wdGlvbmFsKCkKOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0OwoKCgoKCgoKaW50ZXJmYWNlIFN0cmVhbWFibGVJbnB1dEludGVyZmFjZSBleHRlbmRzIElucHV0SW50ZXJmYWNlCnsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRTdHJlYW0oJHN0cmVhbSk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdHJlYW0oKTsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwoKCgoKCgoKCgoKY2xhc3MgU3RyaW5nSW5wdXQgZXh0ZW5kcyBBcmd2SW5wdXQKewpwdWJsaWMgY29uc3QgUkVHRVhfU1RSSU5HID0gJyhbXlxzXSs/KSg/OlxzfCg/PCFcXFxcKSJ8KD88IVxcXFwpXCd8JCknOwpwdWJsaWMgY29uc3QgUkVHRVhfVU5RVU9URURfU1RSSU5HID0gJyhbXlxzXFxcXF0rPyknOwpwdWJsaWMgY29uc3QgUkVHRVhfUVVPVEVEX1NUUklORyA9ICcoPzoiKFteIlxcXFxdKig/OlxcXFwuW14iXFxcXF0qKSopInxcJyhbXlwnXFxcXF0qKD86XFxcXC5bXlwnXFxcXF0qKSopXCcpJzsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJGlucHV0KQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoW10pOwoKJHRoaXMtPnNldFRva2VucygkdGhpcy0+dG9rZW5pemUoJGlucHV0KSk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB0b2tlbml6ZShzdHJpbmcgJGlucHV0KTogYXJyYXkKewokdG9rZW5zID0gW107CiRsZW5ndGggPSBcc3RybGVuKCRpbnB1dCk7CiRjdXJzb3IgPSAwOwokdG9rZW4gPSBudWxsOwp3aGlsZSAoJGN1cnNvciA8ICRsZW5ndGgpIHsKaWYgKCdcXCcgPT09ICRpbnB1dFskY3Vyc29yXSkgewokdG9rZW4gLj0gJGlucHV0WysrJGN1cnNvcl0gPz8gJyc7CisrJGN1cnNvcjsKY29udGludWU7Cn0KCmlmIChwcmVnX21hdGNoKCcvXHMrL0EnLCAkaW5wdXQsICRtYXRjaCwgMCwgJGN1cnNvcikpIHsKaWYgKG51bGwgIT09ICR0b2tlbikgewokdG9rZW5zW10gPSAkdG9rZW47CiR0b2tlbiA9IG51bGw7Cn0KfSBlbHNlaWYgKHByZWdfbWF0Y2goJy8oW149IlwnXHNdKz8pKD0/KSgnLnNlbGY6OlJFR0VYX1FVT1RFRF9TVFJJTkcuJyspL0EnLCAkaW5wdXQsICRtYXRjaCwgMCwgJGN1cnNvcikpIHsKJHRva2VuIC49ICRtYXRjaFsxXS4kbWF0Y2hbMl0uc3RyaXBjc2xhc2hlcyhzdHJfcmVwbGFjZShbJyJcJycsICdcJyInLCAnXCdcJycsICciIiddLCAnJywgc3Vic3RyKCRtYXRjaFszXSwgMSwgLTEpKSk7Cn0gZWxzZWlmIChwcmVnX21hdGNoKCcvJy5zZWxmOjpSRUdFWF9RVU9URURfU1RSSU5HLicvQScsICRpbnB1dCwgJG1hdGNoLCAwLCAkY3Vyc29yKSkgewokdG9rZW4gLj0gc3RyaXBjc2xhc2hlcyhzdWJzdHIoJG1hdGNoWzBdLCAxLCAtMSkpOwp9IGVsc2VpZiAocHJlZ19tYXRjaCgnLycuc2VsZjo6UkVHRVhfVU5RVU9URURfU1RSSU5HLicvQScsICRpbnB1dCwgJG1hdGNoLCAwLCAkY3Vyc29yKSkgewokdG9rZW4gLj0gJG1hdGNoWzFdOwp9IGVsc2UgewoKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdVbmFibGUgdG8gcGFyc2UgaW5wdXQgbmVhciAiLi4uICVzIC4uLiIuJywgc3Vic3RyKCRpbnB1dCwgJGN1cnNvciwgMTApKSk7Cn0KCiRjdXJzb3IgKz0gXHN0cmxlbigkbWF0Y2hbMF0pOwp9CgppZiAobnVsbCAhPT0gJHRva2VuKSB7CiR0b2tlbnNbXSA9ICR0b2tlbjsKfQoKcmV0dXJuICR0b2tlbnM7Cn0KfQoKQ29weXJpZ2h0IChjKSAyMDA0LXByZXNlbnQgRmFiaWVuIFBvdGVuY2llcgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAp0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KCjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxMb2dnZXI7Cgp1c2UgUHNyXExvZ1xBYnN0cmFjdExvZ2dlcjsKdXNlIFBzclxMb2dcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgUHNyXExvZ1xMb2dMZXZlbDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCgoKY2xhc3MgQ29uc29sZUxvZ2dlciBleHRlbmRzIEFic3RyYWN0TG9nZ2VyCnsKcHVibGljIGNvbnN0IElORk8gPSAnaW5mbyc7CnB1YmxpYyBjb25zdCBFUlJPUiA9ICdlcnJvcic7Cgpwcml2YXRlICRvdXRwdXQ7CnByaXZhdGUgJHZlcmJvc2l0eUxldmVsTWFwID0gWwpMb2dMZXZlbDo6RU1FUkdFTkNZID0+IE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX05PUk1BTCwKTG9nTGV2ZWw6OkFMRVJUID0+IE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX05PUk1BTCwKTG9nTGV2ZWw6OkNSSVRJQ0FMID0+IE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX05PUk1BTCwKTG9nTGV2ZWw6OkVSUk9SID0+IE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX05PUk1BTCwKTG9nTGV2ZWw6OldBUk5JTkcgPT4gT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfTk9STUFMLApMb2dMZXZlbDo6Tk9USUNFID0+IE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1ZFUkJPU0UsCkxvZ0xldmVsOjpJTkZPID0+IE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1ZFUllfVkVSQk9TRSwKTG9nTGV2ZWw6OkRFQlVHID0+IE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX0RFQlVHLApdOwpwcml2YXRlICRmb3JtYXRMZXZlbE1hcCA9IFsKTG9nTGV2ZWw6OkVNRVJHRU5DWSA9PiBzZWxmOjpFUlJPUiwKTG9nTGV2ZWw6OkFMRVJUID0+IHNlbGY6OkVSUk9SLApMb2dMZXZlbDo6Q1JJVElDQUwgPT4gc2VsZjo6RVJST1IsCkxvZ0xldmVsOjpFUlJPUiA9PiBzZWxmOjpFUlJPUiwKTG9nTGV2ZWw6OldBUk5JTkcgPT4gc2VsZjo6SU5GTywKTG9nTGV2ZWw6Ok5PVElDRSA9PiBzZWxmOjpJTkZPLApMb2dMZXZlbDo6SU5GTyA9PiBzZWxmOjpJTkZPLApMb2dMZXZlbDo6REVCVUcgPT4gc2VsZjo6SU5GTywKXTsKcHJpdmF0ZSAkZXJyb3JlZCA9IGZhbHNlOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBhcnJheSAkdmVyYm9zaXR5TGV2ZWxNYXAgPSBbXSwgYXJyYXkgJGZvcm1hdExldmVsTWFwID0gW10pCnsKJHRoaXMtPm91dHB1dCA9ICRvdXRwdXQ7CiR0aGlzLT52ZXJib3NpdHlMZXZlbE1hcCA9ICR2ZXJib3NpdHlMZXZlbE1hcCArICR0aGlzLT52ZXJib3NpdHlMZXZlbE1hcDsKJHRoaXMtPmZvcm1hdExldmVsTWFwID0gJGZvcm1hdExldmVsTWFwICsgJHRoaXMtPmZvcm1hdExldmVsTWFwOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2coJGxldmVsLCAkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBbXSkKewppZiAoIWlzc2V0KCR0aGlzLT52ZXJib3NpdHlMZXZlbE1hcFskbGV2ZWxdKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSBsb2cgbGV2ZWwgIiVzIiBkb2VzIG5vdCBleGlzdC4nLCAkbGV2ZWwpKTsKfQoKJG91dHB1dCA9ICR0aGlzLT5vdXRwdXQ7CgoKaWYgKHNlbGY6OkVSUk9SID09PSAkdGhpcy0+Zm9ybWF0TGV2ZWxNYXBbJGxldmVsXSkgewppZiAoJHRoaXMtPm91dHB1dCBpbnN0YW5jZW9mIENvbnNvbGVPdXRwdXRJbnRlcmZhY2UpIHsKJG91dHB1dCA9ICRvdXRwdXQtPmdldEVycm9yT3V0cHV0KCk7Cn0KJHRoaXMtPmVycm9yZWQgPSB0cnVlOwp9CgoKCmlmICgkb3V0cHV0LT5nZXRWZXJib3NpdHkoKSA+PSAkdGhpcy0+dmVyYm9zaXR5TGV2ZWxNYXBbJGxldmVsXSkgewokb3V0cHV0LT53cml0ZWxuKHNwcmludGYoJzwlMSRzPlslMiRzXSAlMyRzPC8lMSRzPicsICR0aGlzLT5mb3JtYXRMZXZlbE1hcFskbGV2ZWxdLCAkbGV2ZWwsICR0aGlzLT5pbnRlcnBvbGF0ZSgkbWVzc2FnZSwgJGNvbnRleHQpKSwgJHRoaXMtPnZlcmJvc2l0eUxldmVsTWFwWyRsZXZlbF0pOwp9Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc0Vycm9yZWQoKQp7CnJldHVybiAkdGhpcy0+ZXJyb3JlZDsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGludGVycG9sYXRlKHN0cmluZyAkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQpOiBzdHJpbmcKewppZiAoIXN0cl9jb250YWlucygkbWVzc2FnZSwgJ3snKSkgewpyZXR1cm4gJG1lc3NhZ2U7Cn0KCiRyZXBsYWNlbWVudHMgPSBbXTsKZm9yZWFjaCAoJGNvbnRleHQgYXMgJGtleSA9PiAkdmFsKSB7CmlmIChudWxsID09PSAkdmFsIHx8IFxpc19zY2FsYXIoJHZhbCkgfHwgKFxpc19vYmplY3QoJHZhbCkgJiYgbWV0aG9kX2V4aXN0cygkdmFsLCAnX190b1N0cmluZycpKSkgewokcmVwbGFjZW1lbnRzWyJ7eyRrZXl9fSJdID0gJHZhbDsKfSBlbHNlaWYgKCR2YWwgaW5zdGFuY2VvZiBcRGF0ZVRpbWVJbnRlcmZhY2UpIHsKJHJlcGxhY2VtZW50c1sie3ska2V5fX0iXSA9ICR2YWwtPmZvcm1hdChcRGF0ZVRpbWU6OlJGQzMzMzkpOwp9IGVsc2VpZiAoXGlzX29iamVjdCgkdmFsKSkgewokcmVwbGFjZW1lbnRzWyJ7eyRrZXl9fSJdID0gJ1tvYmplY3QgJy5cZ2V0X2NsYXNzKCR2YWwpLiddJzsKfSBlbHNlIHsKJHJlcGxhY2VtZW50c1sie3ska2V5fX0iXSA9ICdbJy5cZ2V0dHlwZSgkdmFsKS4nXSc7Cn0KfQoKcmV0dXJuIHN0cnRyKCRtZXNzYWdlLCAkcmVwbGFjZW1lbnRzKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXQ7CgoKCgpjbGFzcyBCdWZmZXJlZE91dHB1dCBleHRlbmRzIE91dHB1dAp7CnByaXZhdGUgJGJ1ZmZlciA9ICcnOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmV0Y2goKQp7CiRjb250ZW50ID0gJHRoaXMtPmJ1ZmZlcjsKJHRoaXMtPmJ1ZmZlciA9ICcnOwoKcmV0dXJuICRjb250ZW50Owp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9Xcml0ZShzdHJpbmcgJG1lc3NhZ2UsIGJvb2wgJG5ld2xpbmUpCnsKJHRoaXMtPmJ1ZmZlciAuPSAkbWVzc2FnZTsKCmlmICgkbmV3bGluZSkgewokdGhpcy0+YnVmZmVyIC49IFxQSFBfRU9MOwp9Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0OwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlckludGVyZmFjZTsKCgoKCgoKCgoKCgoKCgoKY2xhc3MgQ29uc29sZU91dHB1dCBleHRlbmRzIFN0cmVhbU91dHB1dCBpbXBsZW1lbnRzIENvbnNvbGVPdXRwdXRJbnRlcmZhY2UKewpwcml2YXRlICRzdGRlcnI7CnByaXZhdGUgJGNvbnNvbGVTZWN0aW9uT3V0cHV0cyA9IFtdOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpWRVJCT1NJVFlfTk9STUFMLCA/Ym9vbCAkZGVjb3JhdGVkID0gbnVsbCwgP091dHB1dEZvcm1hdHRlckludGVyZmFjZSAkZm9ybWF0dGVyID0gbnVsbCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCR0aGlzLT5vcGVuT3V0cHV0U3RyZWFtKCksICR2ZXJib3NpdHksICRkZWNvcmF0ZWQsICRmb3JtYXR0ZXIpOwoKaWYgKG51bGwgPT09ICRmb3JtYXR0ZXIpIHsKCiR0aGlzLT5zdGRlcnIgPSBuZXcgU3RyZWFtT3V0cHV0KCR0aGlzLT5vcGVuRXJyb3JTdHJlYW0oKSwgJHZlcmJvc2l0eSwgJGRlY29yYXRlZCk7CgpyZXR1cm47Cn0KCiRhY3R1YWxEZWNvcmF0ZWQgPSAkdGhpcy0+aXNEZWNvcmF0ZWQoKTsKJHRoaXMtPnN0ZGVyciA9IG5ldyBTdHJlYW1PdXRwdXQoJHRoaXMtPm9wZW5FcnJvclN0cmVhbSgpLCAkdmVyYm9zaXR5LCAkZGVjb3JhdGVkLCAkdGhpcy0+Z2V0Rm9ybWF0dGVyKCkpOwoKaWYgKG51bGwgPT09ICRkZWNvcmF0ZWQpIHsKJHRoaXMtPnNldERlY29yYXRlZCgkYWN0dWFsRGVjb3JhdGVkICYmICR0aGlzLT5zdGRlcnItPmlzRGVjb3JhdGVkKCkpOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZWN0aW9uKCk6IENvbnNvbGVTZWN0aW9uT3V0cHV0CnsKcmV0dXJuIG5ldyBDb25zb2xlU2VjdGlvbk91dHB1dCgkdGhpcy0+Z2V0U3RyZWFtKCksICR0aGlzLT5jb25zb2xlU2VjdGlvbk91dHB1dHMsICR0aGlzLT5nZXRWZXJib3NpdHkoKSwgJHRoaXMtPmlzRGVjb3JhdGVkKCksICR0aGlzLT5nZXRGb3JtYXR0ZXIoKSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZWNvcmF0ZWQoYm9vbCAkZGVjb3JhdGVkKQp7CnBhcmVudDo6c2V0RGVjb3JhdGVkKCRkZWNvcmF0ZWQpOwokdGhpcy0+c3RkZXJyLT5zZXREZWNvcmF0ZWQoJGRlY29yYXRlZCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRGb3JtYXR0ZXIoT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlICRmb3JtYXR0ZXIpCnsKcGFyZW50OjpzZXRGb3JtYXR0ZXIoJGZvcm1hdHRlcik7CiR0aGlzLT5zdGRlcnItPnNldEZvcm1hdHRlcigkZm9ybWF0dGVyKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFZlcmJvc2l0eShpbnQgJGxldmVsKQp7CnBhcmVudDo6c2V0VmVyYm9zaXR5KCRsZXZlbCk7CiR0aGlzLT5zdGRlcnItPnNldFZlcmJvc2l0eSgkbGV2ZWwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXJyb3JPdXRwdXQoKQp7CnJldHVybiAkdGhpcy0+c3RkZXJyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RXJyb3JPdXRwdXQoT3V0cHV0SW50ZXJmYWNlICRlcnJvcikKewokdGhpcy0+c3RkZXJyID0gJGVycm9yOwp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaGFzU3Rkb3V0U3VwcG9ydCgpCnsKcmV0dXJuIGZhbHNlID09PSAkdGhpcy0+aXNSdW5uaW5nT1M0MDAoKTsKfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGhhc1N0ZGVyclN1cHBvcnQoKQp7CnJldHVybiBmYWxzZSA9PT0gJHRoaXMtPmlzUnVubmluZ09TNDAwKCk7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGlzUnVubmluZ09TNDAwKCk6IGJvb2wKewokY2hlY2tzID0gWwpcZnVuY3Rpb25fZXhpc3RzKCdwaHBfdW5hbWUnKSA/IHBocF91bmFtZSgncycpIDogJycsCmdldGVudignT1NUWVBFJyksClxQSFBfT1MsCl07CgpyZXR1cm4gZmFsc2UgIT09IHN0cmlwb3MoaW1wbG9kZSgnOycsICRjaGVja3MpLCAnT1M0MDAnKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBvcGVuT3V0cHV0U3RyZWFtKCkKewppZiAoISR0aGlzLT5oYXNTdGRvdXRTdXBwb3J0KCkpIHsKcmV0dXJuIGZvcGVuKCdwaHA6Ly9vdXRwdXQnLCAndycpOwp9CgoKcmV0dXJuIFxkZWZpbmVkKCdTVERPVVQnKSA/IFxTVERPVVQgOiAoQGZvcGVuKCdwaHA6Ly9zdGRvdXQnLCAndycpID86IGZvcGVuKCdwaHA6Ly9vdXRwdXQnLCAndycpKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBvcGVuRXJyb3JTdHJlYW0oKQp7CmlmICghJHRoaXMtPmhhc1N0ZGVyclN1cHBvcnQoKSkgewpyZXR1cm4gZm9wZW4oJ3BocDovL291dHB1dCcsICd3Jyk7Cn0KCgpyZXR1cm4gXGRlZmluZWQoJ1NUREVSUicpID8gXFNUREVSUiA6IChAZm9wZW4oJ3BocDovL3N0ZGVycicsICd3JykgPzogZm9wZW4oJ3BocDovL291dHB1dCcsICd3JykpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dDsKCgoKCgoKCmludGVyZmFjZSBDb25zb2xlT3V0cHV0SW50ZXJmYWNlIGV4dGVuZHMgT3V0cHV0SW50ZXJmYWNlCnsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXJyb3JPdXRwdXQoKTsKCnB1YmxpYyBmdW5jdGlvbiBzZXRFcnJvck91dHB1dChPdXRwdXRJbnRlcmZhY2UgJGVycm9yKTsKCnB1YmxpYyBmdW5jdGlvbiBzZWN0aW9uKCk6IENvbnNvbGVTZWN0aW9uT3V0cHV0Owp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcSGVscGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxUZXJtaW5hbDsKCgoKCgpjbGFzcyBDb25zb2xlU2VjdGlvbk91dHB1dCBleHRlbmRzIFN0cmVhbU91dHB1dAp7CnByaXZhdGUgJGNvbnRlbnQgPSBbXTsKcHJpdmF0ZSAkbGluZXMgPSAwOwpwcml2YXRlICRzZWN0aW9uczsKcHJpdmF0ZSAkdGVybWluYWw7CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRzdHJlYW0sIGFycmF5ICYkc2VjdGlvbnMsIGludCAkdmVyYm9zaXR5LCBib29sICRkZWNvcmF0ZWQsIE91dHB1dEZvcm1hdHRlckludGVyZmFjZSAkZm9ybWF0dGVyKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJHN0cmVhbSwgJHZlcmJvc2l0eSwgJGRlY29yYXRlZCwgJGZvcm1hdHRlcik7CmFycmF5X3Vuc2hpZnQoJHNlY3Rpb25zLCAkdGhpcyk7CiR0aGlzLT5zZWN0aW9ucyA9ICYkc2VjdGlvbnM7CiR0aGlzLT50ZXJtaW5hbCA9IG5ldyBUZXJtaW5hbCgpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjbGVhcig/aW50ICRsaW5lcyA9IG51bGwpCnsKaWYgKGVtcHR5KCR0aGlzLT5jb250ZW50KSB8fCAhJHRoaXMtPmlzRGVjb3JhdGVkKCkpIHsKcmV0dXJuOwp9CgppZiAoJGxpbmVzKSB7CmFycmF5X3NwbGljZSgkdGhpcy0+Y29udGVudCwgLSgkbGluZXMgKiAyKSk7IAp9IGVsc2UgewokbGluZXMgPSAkdGhpcy0+bGluZXM7CiR0aGlzLT5jb250ZW50ID0gW107Cn0KCiR0aGlzLT5saW5lcyAtPSAkbGluZXM7CgpwYXJlbnQ6OmRvV3JpdGUoJHRoaXMtPnBvcFN0cmVhbUNvbnRlbnRVbnRpbEN1cnJlbnRTZWN0aW9uKCRsaW5lcyksIGZhbHNlKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gb3ZlcndyaXRlKCRtZXNzYWdlKQp7CiR0aGlzLT5jbGVhcigpOwokdGhpcy0+d3JpdGVsbigkbWVzc2FnZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRDb250ZW50KCk6IHN0cmluZwp7CnJldHVybiBpbXBsb2RlKCcnLCAkdGhpcy0+Y29udGVudCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRDb250ZW50KHN0cmluZyAkaW5wdXQpCnsKZm9yZWFjaCAoZXhwbG9kZShcUEhQX0VPTCwgJGlucHV0KSBhcyAkbGluZUNvbnRlbnQpIHsKJHRoaXMtPmxpbmVzICs9IGNlaWwoJHRoaXMtPmdldERpc3BsYXlMZW5ndGgoJGxpbmVDb250ZW50KSAvICR0aGlzLT50ZXJtaW5hbC0+Z2V0V2lkdGgoKSkgPzogMTsKJHRoaXMtPmNvbnRlbnRbXSA9ICRsaW5lQ29udGVudDsKJHRoaXMtPmNvbnRlbnRbXSA9IFxQSFBfRU9MOwp9Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb1dyaXRlKHN0cmluZyAkbWVzc2FnZSwgYm9vbCAkbmV3bGluZSkKewppZiAoISR0aGlzLT5pc0RlY29yYXRlZCgpKSB7CnBhcmVudDo6ZG9Xcml0ZSgkbWVzc2FnZSwgJG5ld2xpbmUpOwoKcmV0dXJuOwp9CgokZXJhc2VkQ29udGVudCA9ICR0aGlzLT5wb3BTdHJlYW1Db250ZW50VW50aWxDdXJyZW50U2VjdGlvbigpOwoKJHRoaXMtPmFkZENvbnRlbnQoJG1lc3NhZ2UpOwoKcGFyZW50Ojpkb1dyaXRlKCRtZXNzYWdlLCB0cnVlKTsKcGFyZW50Ojpkb1dyaXRlKCRlcmFzZWRDb250ZW50LCBmYWxzZSk7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHBvcFN0cmVhbUNvbnRlbnRVbnRpbEN1cnJlbnRTZWN0aW9uKGludCAkbnVtYmVyT2ZMaW5lc1RvQ2xlYXJGcm9tQ3VycmVudFNlY3Rpb24gPSAwKTogc3RyaW5nCnsKJG51bWJlck9mTGluZXNUb0NsZWFyID0gJG51bWJlck9mTGluZXNUb0NsZWFyRnJvbUN1cnJlbnRTZWN0aW9uOwokZXJhc2VkQ29udGVudCA9IFtdOwoKZm9yZWFjaCAoJHRoaXMtPnNlY3Rpb25zIGFzICRzZWN0aW9uKSB7CmlmICgkc2VjdGlvbiA9PT0gJHRoaXMpIHsKYnJlYWs7Cn0KCiRudW1iZXJPZkxpbmVzVG9DbGVhciArPSAkc2VjdGlvbi0+bGluZXM7CiRlcmFzZWRDb250ZW50W10gPSAkc2VjdGlvbi0+Z2V0Q29udGVudCgpOwp9CgppZiAoJG51bWJlck9mTGluZXNUb0NsZWFyID4gMCkgewoKcGFyZW50Ojpkb1dyaXRlKHNwcmludGYoIlx4MWJbJWRBIiwgJG51bWJlck9mTGluZXNUb0NsZWFyKSwgZmFsc2UpOwoKcGFyZW50Ojpkb1dyaXRlKCJceDFiWzBKIiwgZmFsc2UpOwp9CgpyZXR1cm4gaW1wbG9kZSgnJywgYXJyYXlfcmV2ZXJzZSgkZXJhc2VkQ29udGVudCkpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldERpc3BsYXlMZW5ndGgoc3RyaW5nICR0ZXh0KTogaW50CnsKcmV0dXJuIEhlbHBlcjo6d2lkdGgoSGVscGVyOjpyZW1vdmVEZWNvcmF0aW9uKCR0aGlzLT5nZXRGb3JtYXR0ZXIoKSwgc3RyX3JlcGxhY2UoIlx0IiwgJyAgICAgICAgJywgJHRleHQpKSk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0OwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE51bGxPdXRwdXRGb3JtYXR0ZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2U7CgoKCgoKCgoKCmNsYXNzIE51bGxPdXRwdXQgaW1wbGVtZW50cyBPdXRwdXRJbnRlcmZhY2UKewpwcml2YXRlICRmb3JtYXR0ZXI7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Rm9ybWF0dGVyKE91dHB1dEZvcm1hdHRlckludGVyZmFjZSAkZm9ybWF0dGVyKQp7Cgp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVyKCkKewppZiAoJHRoaXMtPmZvcm1hdHRlcikgewpyZXR1cm4gJHRoaXMtPmZvcm1hdHRlcjsKfQoKcmV0dXJuICR0aGlzLT5mb3JtYXR0ZXIgPSBuZXcgTnVsbE91dHB1dEZvcm1hdHRlcigpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGVjb3JhdGVkKGJvb2wgJGRlY29yYXRlZCkKewoKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGVjb3JhdGVkKCkKewpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRWZXJib3NpdHkoaW50ICRsZXZlbCkKewoKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFZlcmJvc2l0eSgpCnsKcmV0dXJuIHNlbGY6OlZFUkJPU0lUWV9RVUlFVDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUXVpZXQoKQp7CnJldHVybiB0cnVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWZXJib3NlKCkKewpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZlcnlWZXJib3NlKCkKewpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlYnVnKCkKewpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZWxuKCRtZXNzYWdlcywgaW50ICRvcHRpb25zID0gc2VsZjo6T1VUUFVUX05PUk1BTCkKewoKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IGZhbHNlLCBpbnQgJG9wdGlvbnMgPSBzZWxmOjpPVVRQVVRfTk9STUFMKQp7Cgp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2U7CgoKCgoKCgoKCgoKCgoKYWJzdHJhY3QgY2xhc3MgT3V0cHV0IGltcGxlbWVudHMgT3V0cHV0SW50ZXJmYWNlCnsKcHJpdmF0ZSAkdmVyYm9zaXR5Owpwcml2YXRlICRmb3JtYXR0ZXI7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/aW50ICR2ZXJib3NpdHkgPSBzZWxmOjpWRVJCT1NJVFlfTk9STUFMLCBib29sICRkZWNvcmF0ZWQgPSBmYWxzZSwgP091dHB1dEZvcm1hdHRlckludGVyZmFjZSAkZm9ybWF0dGVyID0gbnVsbCkKewokdGhpcy0+dmVyYm9zaXR5ID0gJHZlcmJvc2l0eSA/PyBzZWxmOjpWRVJCT1NJVFlfTk9STUFMOwokdGhpcy0+Zm9ybWF0dGVyID0gJGZvcm1hdHRlciA/PyBuZXcgT3V0cHV0Rm9ybWF0dGVyKCk7CiR0aGlzLT5mb3JtYXR0ZXItPnNldERlY29yYXRlZCgkZGVjb3JhdGVkKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEZvcm1hdHRlcihPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UgJGZvcm1hdHRlcikKewokdGhpcy0+Zm9ybWF0dGVyID0gJGZvcm1hdHRlcjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZvcm1hdHRlcigpCnsKcmV0dXJuICR0aGlzLT5mb3JtYXR0ZXI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZWNvcmF0ZWQoYm9vbCAkZGVjb3JhdGVkKQp7CiR0aGlzLT5mb3JtYXR0ZXItPnNldERlY29yYXRlZCgkZGVjb3JhdGVkKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGVjb3JhdGVkKCkKewpyZXR1cm4gJHRoaXMtPmZvcm1hdHRlci0+aXNEZWNvcmF0ZWQoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFZlcmJvc2l0eShpbnQgJGxldmVsKQp7CiR0aGlzLT52ZXJib3NpdHkgPSAkbGV2ZWw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRWZXJib3NpdHkoKQp7CnJldHVybiAkdGhpcy0+dmVyYm9zaXR5Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNRdWlldCgpCnsKcmV0dXJuIHNlbGY6OlZFUkJPU0lUWV9RVUlFVCA9PT0gJHRoaXMtPnZlcmJvc2l0eTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVmVyYm9zZSgpCnsKcmV0dXJuIHNlbGY6OlZFUkJPU0lUWV9WRVJCT1NFIDw9ICR0aGlzLT52ZXJib3NpdHk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZlcnlWZXJib3NlKCkKewpyZXR1cm4gc2VsZjo6VkVSQk9TSVRZX1ZFUllfVkVSQk9TRSA8PSAkdGhpcy0+dmVyYm9zaXR5Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZWJ1ZygpCnsKcmV0dXJuIHNlbGY6OlZFUkJPU0lUWV9ERUJVRyA8PSAkdGhpcy0+dmVyYm9zaXR5Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGVsbigkbWVzc2FnZXMsIGludCAkb3B0aW9ucyA9IHNlbGY6Ok9VVFBVVF9OT1JNQUwpCnsKJHRoaXMtPndyaXRlKCRtZXNzYWdlcywgdHJ1ZSwgJG9wdGlvbnMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gZmFsc2UsIGludCAkb3B0aW9ucyA9IHNlbGY6Ok9VVFBVVF9OT1JNQUwpCnsKaWYgKCFpc19pdGVyYWJsZSgkbWVzc2FnZXMpKSB7CiRtZXNzYWdlcyA9IFskbWVzc2FnZXNdOwp9CgokdHlwZXMgPSBzZWxmOjpPVVRQVVRfTk9STUFMIHwgc2VsZjo6T1VUUFVUX1JBVyB8IHNlbGY6Ok9VVFBVVF9QTEFJTjsKJHR5cGUgPSAkdHlwZXMgJiAkb3B0aW9ucyA/OiBzZWxmOjpPVVRQVVRfTk9STUFMOwoKJHZlcmJvc2l0aWVzID0gc2VsZjo6VkVSQk9TSVRZX1FVSUVUIHwgc2VsZjo6VkVSQk9TSVRZX05PUk1BTCB8IHNlbGY6OlZFUkJPU0lUWV9WRVJCT1NFIHwgc2VsZjo6VkVSQk9TSVRZX1ZFUllfVkVSQk9TRSB8IHNlbGY6OlZFUkJPU0lUWV9ERUJVRzsKJHZlcmJvc2l0eSA9ICR2ZXJib3NpdGllcyAmICRvcHRpb25zID86IHNlbGY6OlZFUkJPU0lUWV9OT1JNQUw7CgppZiAoJHZlcmJvc2l0eSA+ICR0aGlzLT5nZXRWZXJib3NpdHkoKSkgewpyZXR1cm47Cn0KCmZvcmVhY2ggKCRtZXNzYWdlcyBhcyAkbWVzc2FnZSkgewpzd2l0Y2ggKCR0eXBlKSB7CmNhc2UgT3V0cHV0SW50ZXJmYWNlOjpPVVRQVVRfTk9STUFMOgokbWVzc2FnZSA9ICR0aGlzLT5mb3JtYXR0ZXItPmZvcm1hdCgkbWVzc2FnZSk7CmJyZWFrOwpjYXNlIE91dHB1dEludGVyZmFjZTo6T1VUUFVUX1JBVzoKYnJlYWs7CmNhc2UgT3V0cHV0SW50ZXJmYWNlOjpPVVRQVVRfUExBSU46CiRtZXNzYWdlID0gc3RyaXBfdGFncygkdGhpcy0+Zm9ybWF0dGVyLT5mb3JtYXQoJG1lc3NhZ2UpKTsKYnJlYWs7Cn0KCiR0aGlzLT5kb1dyaXRlKCRtZXNzYWdlID8/ICcnLCAkbmV3bGluZSk7Cn0KfQoKCgoKYWJzdHJhY3QgcHJvdGVjdGVkIGZ1bmN0aW9uIGRvV3JpdGUoc3RyaW5nICRtZXNzYWdlLCBib29sICRuZXdsaW5lKTsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0OwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlckludGVyZmFjZTsKCgoKCgoKaW50ZXJmYWNlIE91dHB1dEludGVyZmFjZQp7CnB1YmxpYyBjb25zdCBWRVJCT1NJVFlfUVVJRVQgPSAxNjsKcHVibGljIGNvbnN0IFZFUkJPU0lUWV9OT1JNQUwgPSAzMjsKcHVibGljIGNvbnN0IFZFUkJPU0lUWV9WRVJCT1NFID0gNjQ7CnB1YmxpYyBjb25zdCBWRVJCT1NJVFlfVkVSWV9WRVJCT1NFID0gMTI4OwpwdWJsaWMgY29uc3QgVkVSQk9TSVRZX0RFQlVHID0gMjU2OwoKcHVibGljIGNvbnN0IE9VVFBVVF9OT1JNQUwgPSAxOwpwdWJsaWMgY29uc3QgT1VUUFVUX1JBVyA9IDI7CnB1YmxpYyBjb25zdCBPVVRQVVRfUExBSU4gPSA0OwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSBmYWxzZSwgaW50ICRvcHRpb25zID0gMCk7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGVsbigkbWVzc2FnZXMsIGludCAkb3B0aW9ucyA9IDApOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFZlcmJvc2l0eShpbnQgJGxldmVsKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFZlcmJvc2l0eSgpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNRdWlldCgpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWZXJib3NlKCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZlcnlWZXJib3NlKCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlYnVnKCk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGVjb3JhdGVkKGJvb2wgJGRlY29yYXRlZCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlY29yYXRlZCgpOwoKcHVibGljIGZ1bmN0aW9uIHNldEZvcm1hdHRlcihPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UgJGZvcm1hdHRlcik7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGb3JtYXR0ZXIoKTsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0OwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlckludGVyZmFjZTsKCgoKCgoKCgoKCgoKCgpjbGFzcyBTdHJlYW1PdXRwdXQgZXh0ZW5kcyBPdXRwdXQKewpwcml2YXRlICRzdHJlYW07CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkc3RyZWFtLCBpbnQgJHZlcmJvc2l0eSA9IHNlbGY6OlZFUkJPU0lUWV9OT1JNQUwsID9ib29sICRkZWNvcmF0ZWQgPSBudWxsLCA/T3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlICRmb3JtYXR0ZXIgPSBudWxsKQp7CmlmICghXGlzX3Jlc291cmNlKCRzdHJlYW0pIHx8ICdzdHJlYW0nICE9PSBnZXRfcmVzb3VyY2VfdHlwZSgkc3RyZWFtKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdUaGUgU3RyZWFtT3V0cHV0IGNsYXNzIG5lZWRzIGEgc3RyZWFtIGFzIGl0cyBmaXJzdCBhcmd1bWVudC4nKTsKfQoKJHRoaXMtPnN0cmVhbSA9ICRzdHJlYW07CgppZiAobnVsbCA9PT0gJGRlY29yYXRlZCkgewokZGVjb3JhdGVkID0gJHRoaXMtPmhhc0NvbG9yU3VwcG9ydCgpOwp9CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCR2ZXJib3NpdHksICRkZWNvcmF0ZWQsICRmb3JtYXR0ZXIpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdHJlYW0oKQp7CnJldHVybiAkdGhpcy0+c3RyZWFtOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9Xcml0ZShzdHJpbmcgJG1lc3NhZ2UsIGJvb2wgJG5ld2xpbmUpCnsKaWYgKCRuZXdsaW5lKSB7CiRtZXNzYWdlIC49IFxQSFBfRU9MOwp9CgpAZndyaXRlKCR0aGlzLT5zdHJlYW0sICRtZXNzYWdlKTsKCmZmbHVzaCgkdGhpcy0+c3RyZWFtKTsKfQoKCgoKCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBoYXNDb2xvclN1cHBvcnQoKQp7CgppZiAoJycgIT09ICgoJF9TRVJWRVJbJ05PX0NPTE9SJ10gPz8gZ2V0ZW52KCdOT19DT0xPUicpKVswXSA/PyAnJykpIHsKcmV0dXJuIGZhbHNlOwp9CgoKCmlmICghQHN0cmVhbV9pc2F0dHkoJHRoaXMtPnN0cmVhbSkgJiYgIVxpbl9hcnJheShzdHJ0b3VwcGVyKChzdHJpbmcpIGdldGVudignTVNZU1RFTScpKSwgWydNSU5HVzMyJywgJ01JTkdXNjQnXSwgdHJ1ZSkpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgJiYgQHNhcGlfd2luZG93c192dDEwMF9zdXBwb3J0KCR0aGlzLT5zdHJlYW0pKSB7CnJldHVybiB0cnVlOwp9CgppZiAoJ0h5cGVyJyA9PT0gZ2V0ZW52KCdURVJNX1BST0dSQU0nKQp8fCBmYWxzZSAhPT0gZ2V0ZW52KCdDT0xPUlRFUk0nKQp8fCBmYWxzZSAhPT0gZ2V0ZW52KCdBTlNJQ09OJykKfHwgJ09OJyA9PT0gZ2V0ZW52KCdDb25FbXVBTlNJJykKKSB7CnJldHVybiB0cnVlOwp9CgppZiAoJ2R1bWInID09PSAkdGVybSA9IChzdHJpbmcpIGdldGVudignVEVSTScpKSB7CnJldHVybiBmYWxzZTsKfQoKCnJldHVybiBwcmVnX21hdGNoKCcvXigoc2NyZWVufHh0ZXJtfHZ0MTAwfHZ0MjIwfHB1dHR5fHJ4dnR8YW5zaXxjeWd3aW58bGludXgpLiopfCguKi0yNTYoY29sb3IpPygtYmNlKT8pJC8nLCAkdGVybSk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0OwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlckludGVyZmFjZTsKCgoKCgoKY2xhc3MgVHJpbW1lZEJ1ZmZlck91dHB1dCBleHRlbmRzIE91dHB1dAp7CnByaXZhdGUgJG1heExlbmd0aDsKcHJpdmF0ZSAkYnVmZmVyID0gJyc7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoaW50ICRtYXhMZW5ndGgsID9pbnQgJHZlcmJvc2l0eSA9IHNlbGY6OlZFUkJPU0lUWV9OT1JNQUwsIGJvb2wgJGRlY29yYXRlZCA9IGZhbHNlLCA/T3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlICRmb3JtYXR0ZXIgPSBudWxsKQp7CmlmICgkbWF4TGVuZ3RoIDw9IDApIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCciJXMoKSIgZXhwZWN0cyBhIHN0cmljdGx5IHBvc2l0aXZlIG1heExlbmd0aC4gR290ICVkLicsIF9fTUVUSE9EX18sICRtYXhMZW5ndGgpKTsKfQoKcGFyZW50OjpfX2NvbnN0cnVjdCgkdmVyYm9zaXR5LCAkZGVjb3JhdGVkLCAkZm9ybWF0dGVyKTsKJHRoaXMtPm1heExlbmd0aCA9ICRtYXhMZW5ndGg7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZldGNoKCkKewokY29udGVudCA9ICR0aGlzLT5idWZmZXI7CiR0aGlzLT5idWZmZXIgPSAnJzsKCnJldHVybiAkY29udGVudDsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvV3JpdGUoc3RyaW5nICRtZXNzYWdlLCBib29sICRuZXdsaW5lKQp7CiR0aGlzLT5idWZmZXIgLj0gJG1lc3NhZ2U7CgppZiAoJG5ld2xpbmUpIHsKJHRoaXMtPmJ1ZmZlciAuPSBcUEhQX0VPTDsKfQoKJHRoaXMtPmJ1ZmZlciA9IHN1YnN0cigkdGhpcy0+YnVmZmVyLCAwIC0gJHRoaXMtPm1heExlbmd0aCk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcUXVlc3Rpb247Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwoKCgoKCgpjbGFzcyBDaG9pY2VRdWVzdGlvbiBleHRlbmRzIFF1ZXN0aW9uCnsKcHJpdmF0ZSAkY2hvaWNlczsKcHJpdmF0ZSAkbXVsdGlzZWxlY3QgPSBmYWxzZTsKcHJpdmF0ZSAkcHJvbXB0ID0gJyA+ICc7CnByaXZhdGUgJGVycm9yTWVzc2FnZSA9ICdWYWx1ZSAiJXMiIGlzIGludmFsaWQnOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRxdWVzdGlvbiwgYXJyYXkgJGNob2ljZXMsICRkZWZhdWx0ID0gbnVsbCkKewppZiAoISRjaG9pY2VzKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0Nob2ljZSBxdWVzdGlvbiBtdXN0IGhhdmUgYXQgbGVhc3QgMSBjaG9pY2UgYXZhaWxhYmxlLicpOwp9CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRxdWVzdGlvbiwgJGRlZmF1bHQpOwoKJHRoaXMtPmNob2ljZXMgPSAkY2hvaWNlczsKJHRoaXMtPnNldFZhbGlkYXRvcigkdGhpcy0+Z2V0RGVmYXVsdFZhbGlkYXRvcigpKTsKJHRoaXMtPnNldEF1dG9jb21wbGV0ZXJWYWx1ZXMoJGNob2ljZXMpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDaG9pY2VzKCkKewpyZXR1cm4gJHRoaXMtPmNob2ljZXM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0TXVsdGlzZWxlY3QoYm9vbCAkbXVsdGlzZWxlY3QpCnsKJHRoaXMtPm11bHRpc2VsZWN0ID0gJG11bHRpc2VsZWN0OwokdGhpcy0+c2V0VmFsaWRhdG9yKCR0aGlzLT5nZXREZWZhdWx0VmFsaWRhdG9yKCkpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc011bHRpc2VsZWN0KCkKewpyZXR1cm4gJHRoaXMtPm11bHRpc2VsZWN0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm9tcHQoKQp7CnJldHVybiAkdGhpcy0+cHJvbXB0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQcm9tcHQoc3RyaW5nICRwcm9tcHQpCnsKJHRoaXMtPnByb21wdCA9ICRwcm9tcHQ7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RXJyb3JNZXNzYWdlKHN0cmluZyAkZXJyb3JNZXNzYWdlKQp7CiR0aGlzLT5lcnJvck1lc3NhZ2UgPSAkZXJyb3JNZXNzYWdlOwokdGhpcy0+c2V0VmFsaWRhdG9yKCR0aGlzLT5nZXREZWZhdWx0VmFsaWRhdG9yKCkpOwoKcmV0dXJuICR0aGlzOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldERlZmF1bHRWYWxpZGF0b3IoKTogY2FsbGFibGUKewokY2hvaWNlcyA9ICR0aGlzLT5jaG9pY2VzOwokZXJyb3JNZXNzYWdlID0gJHRoaXMtPmVycm9yTWVzc2FnZTsKJG11bHRpc2VsZWN0ID0gJHRoaXMtPm11bHRpc2VsZWN0OwokaXNBc3NvYyA9ICR0aGlzLT5pc0Fzc29jKCRjaG9pY2VzKTsKCnJldHVybiBmdW5jdGlvbiAoJHNlbGVjdGVkKSB1c2UgKCRjaG9pY2VzLCAkZXJyb3JNZXNzYWdlLCAkbXVsdGlzZWxlY3QsICRpc0Fzc29jKSB7CmlmICgkbXVsdGlzZWxlY3QpIHsKCmlmICghcHJlZ19tYXRjaCgnL15bXixdKyg/OixbXixdKykqJC8nLCAoc3RyaW5nKSAkc2VsZWN0ZWQsICRtYXRjaGVzKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJGVycm9yTWVzc2FnZSwgJHNlbGVjdGVkKSk7Cn0KCiRzZWxlY3RlZENob2ljZXMgPSBleHBsb2RlKCcsJywgKHN0cmluZykgJHNlbGVjdGVkKTsKfSBlbHNlIHsKJHNlbGVjdGVkQ2hvaWNlcyA9IFskc2VsZWN0ZWRdOwp9CgppZiAoJHRoaXMtPmlzVHJpbW1hYmxlKCkpIHsKZm9yZWFjaCAoJHNlbGVjdGVkQ2hvaWNlcyBhcyAkayA9PiAkdikgewokc2VsZWN0ZWRDaG9pY2VzWyRrXSA9IHRyaW0oKHN0cmluZykgJHYpOwp9Cn0KCiRtdWx0aXNlbGVjdENob2ljZXMgPSBbXTsKZm9yZWFjaCAoJHNlbGVjdGVkQ2hvaWNlcyBhcyAkdmFsdWUpIHsKJHJlc3VsdHMgPSBbXTsKZm9yZWFjaCAoJGNob2ljZXMgYXMgJGtleSA9PiAkY2hvaWNlKSB7CmlmICgkY2hvaWNlID09PSAkdmFsdWUpIHsKJHJlc3VsdHNbXSA9ICRrZXk7Cn0KfQoKaWYgKFxjb3VudCgkcmVzdWx0cykgPiAxKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlIHByb3ZpZGVkIGFuc3dlciBpcyBhbWJpZ3VvdXMuIFZhbHVlIHNob3VsZCBiZSBvbmUgb2YgIiVzIi4nLCBpbXBsb2RlKCciIG9yICInLCAkcmVzdWx0cykpKTsKfQoKJHJlc3VsdCA9IGFycmF5X3NlYXJjaCgkdmFsdWUsICRjaG9pY2VzKTsKCmlmICghJGlzQXNzb2MpIHsKaWYgKGZhbHNlICE9PSAkcmVzdWx0KSB7CiRyZXN1bHQgPSAkY2hvaWNlc1skcmVzdWx0XTsKfSBlbHNlaWYgKGlzc2V0KCRjaG9pY2VzWyR2YWx1ZV0pKSB7CiRyZXN1bHQgPSAkY2hvaWNlc1skdmFsdWVdOwp9Cn0gZWxzZWlmIChmYWxzZSA9PT0gJHJlc3VsdCAmJiBpc3NldCgkY2hvaWNlc1skdmFsdWVdKSkgewokcmVzdWx0ID0gJHZhbHVlOwp9CgppZiAoZmFsc2UgPT09ICRyZXN1bHQpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCRlcnJvck1lc3NhZ2UsICR2YWx1ZSkpOwp9CgoKJG11bHRpc2VsZWN0Q2hvaWNlc1tdID0gJGlzQXNzb2MgPyAoc3RyaW5nKSAkcmVzdWx0IDogJHJlc3VsdDsKfQoKaWYgKCRtdWx0aXNlbGVjdCkgewpyZXR1cm4gJG11bHRpc2VsZWN0Q2hvaWNlczsKfQoKcmV0dXJuIGN1cnJlbnQoJG11bHRpc2VsZWN0Q2hvaWNlcyk7Cn07Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcUXVlc3Rpb247CgoKCgoKCmNsYXNzIENvbmZpcm1hdGlvblF1ZXN0aW9uIGV4dGVuZHMgUXVlc3Rpb24Kewpwcml2YXRlICR0cnVlQW5zd2VyUmVnZXg7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHF1ZXN0aW9uLCBib29sICRkZWZhdWx0ID0gdHJ1ZSwgc3RyaW5nICR0cnVlQW5zd2VyUmVnZXggPSAnL155L2knKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJHF1ZXN0aW9uLCAkZGVmYXVsdCk7CgokdGhpcy0+dHJ1ZUFuc3dlclJlZ2V4ID0gJHRydWVBbnN3ZXJSZWdleDsKJHRoaXMtPnNldE5vcm1hbGl6ZXIoJHRoaXMtPmdldERlZmF1bHROb3JtYWxpemVyKCkpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldERlZmF1bHROb3JtYWxpemVyKCk6IGNhbGxhYmxlCnsKJGRlZmF1bHQgPSAkdGhpcy0+Z2V0RGVmYXVsdCgpOwokcmVnZXggPSAkdGhpcy0+dHJ1ZUFuc3dlclJlZ2V4OwoKcmV0dXJuIGZ1bmN0aW9uICgkYW5zd2VyKSB1c2UgKCRkZWZhdWx0LCAkcmVnZXgpIHsKaWYgKFxpc19ib29sKCRhbnN3ZXIpKSB7CnJldHVybiAkYW5zd2VyOwp9CgokYW5zd2VySXNUcnVlID0gKGJvb2wpIHByZWdfbWF0Y2goJHJlZ2V4LCAkYW5zd2VyKTsKaWYgKGZhbHNlID09PSAkZGVmYXVsdCkgewpyZXR1cm4gJGFuc3dlciAmJiAkYW5zd2VySXNUcnVlOwp9CgpyZXR1cm4gJycgPT09ICRhbnN3ZXIgfHwgJGFuc3dlcklzVHJ1ZTsKfTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxRdWVzdGlvbjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxMb2dpY0V4Y2VwdGlvbjsKCgoKCgoKY2xhc3MgUXVlc3Rpb24Kewpwcml2YXRlICRxdWVzdGlvbjsKcHJpdmF0ZSAkYXR0ZW1wdHM7CnByaXZhdGUgJGhpZGRlbiA9IGZhbHNlOwpwcml2YXRlICRoaWRkZW5GYWxsYmFjayA9IHRydWU7CnByaXZhdGUgJGF1dG9jb21wbGV0ZXJDYWxsYmFjazsKcHJpdmF0ZSAkdmFsaWRhdG9yOwpwcml2YXRlICRkZWZhdWx0Owpwcml2YXRlICRub3JtYWxpemVyOwpwcml2YXRlICR0cmltbWFibGUgPSB0cnVlOwpwcml2YXRlICRtdWx0aWxpbmUgPSBmYWxzZTsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRxdWVzdGlvbiwgJGRlZmF1bHQgPSBudWxsKQp7CiR0aGlzLT5xdWVzdGlvbiA9ICRxdWVzdGlvbjsKJHRoaXMtPmRlZmF1bHQgPSAkZGVmYXVsdDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UXVlc3Rpb24oKQp7CnJldHVybiAkdGhpcy0+cXVlc3Rpb247Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERlZmF1bHQoKQp7CnJldHVybiAkdGhpcy0+ZGVmYXVsdDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzTXVsdGlsaW5lKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPm11bHRpbGluZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0TXVsdGlsaW5lKGJvb2wgJG11bHRpbGluZSk6IHNlbGYKewokdGhpcy0+bXVsdGlsaW5lID0gJG11bHRpbGluZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNIaWRkZW4oKQp7CnJldHVybiAkdGhpcy0+aGlkZGVuOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEhpZGRlbihib29sICRoaWRkZW4pCnsKaWYgKCR0aGlzLT5hdXRvY29tcGxldGVyQ2FsbGJhY2spIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdBIGhpZGRlbiBxdWVzdGlvbiBjYW5ub3QgdXNlIHRoZSBhdXRvY29tcGxldGVyLicpOwp9CgokdGhpcy0+aGlkZGVuID0gJGhpZGRlbjsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNIaWRkZW5GYWxsYmFjaygpCnsKcmV0dXJuICR0aGlzLT5oaWRkZW5GYWxsYmFjazsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SGlkZGVuRmFsbGJhY2soYm9vbCAkZmFsbGJhY2spCnsKJHRoaXMtPmhpZGRlbkZhbGxiYWNrID0gJGZhbGxiYWNrOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBdXRvY29tcGxldGVyVmFsdWVzKCkKewokY2FsbGJhY2sgPSAkdGhpcy0+Z2V0QXV0b2NvbXBsZXRlckNhbGxiYWNrKCk7CgpyZXR1cm4gJGNhbGxiYWNrID8gJGNhbGxiYWNrKCcnKSA6IG51bGw7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXV0b2NvbXBsZXRlclZhbHVlcyg/aXRlcmFibGUgJHZhbHVlcykKewppZiAoXGlzX2FycmF5KCR2YWx1ZXMpKSB7CiR2YWx1ZXMgPSAkdGhpcy0+aXNBc3NvYygkdmFsdWVzKSA/IGFycmF5X21lcmdlKGFycmF5X2tleXMoJHZhbHVlcyksIGFycmF5X3ZhbHVlcygkdmFsdWVzKSkgOiBhcnJheV92YWx1ZXMoJHZhbHVlcyk7CgokY2FsbGJhY2sgPSBzdGF0aWMgZnVuY3Rpb24gKCkgdXNlICgkdmFsdWVzKSB7CnJldHVybiAkdmFsdWVzOwp9Owp9IGVsc2VpZiAoJHZhbHVlcyBpbnN0YW5jZW9mIFxUcmF2ZXJzYWJsZSkgewokdmFsdWVDYWNoZSA9IG51bGw7CiRjYWxsYmFjayA9IHN0YXRpYyBmdW5jdGlvbiAoKSB1c2UgKCR2YWx1ZXMsICYkdmFsdWVDYWNoZSkgewpyZXR1cm4gJHZhbHVlQ2FjaGUgPz8gJHZhbHVlQ2FjaGUgPSBpdGVyYXRvcl90b19hcnJheSgkdmFsdWVzLCBmYWxzZSk7Cn07Cn0gZWxzZSB7CiRjYWxsYmFjayA9IG51bGw7Cn0KCnJldHVybiAkdGhpcy0+c2V0QXV0b2NvbXBsZXRlckNhbGxiYWNrKCRjYWxsYmFjayk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBdXRvY29tcGxldGVyQ2FsbGJhY2soKTogP2NhbGxhYmxlCnsKcmV0dXJuICR0aGlzLT5hdXRvY29tcGxldGVyQ2FsbGJhY2s7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXV0b2NvbXBsZXRlckNhbGxiYWNrKD9jYWxsYWJsZSAkY2FsbGJhY2sgPSBudWxsKTogc2VsZgp7CmlmICgkdGhpcy0+aGlkZGVuICYmIG51bGwgIT09ICRjYWxsYmFjaykgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ0EgaGlkZGVuIHF1ZXN0aW9uIGNhbm5vdCB1c2UgdGhlIGF1dG9jb21wbGV0ZXIuJyk7Cn0KCiR0aGlzLT5hdXRvY29tcGxldGVyQ2FsbGJhY2sgPSAkY2FsbGJhY2s7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFZhbGlkYXRvcig/Y2FsbGFibGUgJHZhbGlkYXRvciA9IG51bGwpCnsKJHRoaXMtPnZhbGlkYXRvciA9ICR2YWxpZGF0b3I7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFZhbGlkYXRvcigpCnsKcmV0dXJuICR0aGlzLT52YWxpZGF0b3I7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRNYXhBdHRlbXB0cyg/aW50ICRhdHRlbXB0cykKewppZiAobnVsbCAhPT0gJGF0dGVtcHRzICYmICRhdHRlbXB0cyA8IDEpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignTWF4aW11bSBudW1iZXIgb2YgYXR0ZW1wdHMgbXVzdCBiZSBhIHBvc2l0aXZlIHZhbHVlLicpOwp9CgokdGhpcy0+YXR0ZW1wdHMgPSAkYXR0ZW1wdHM7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TWF4QXR0ZW1wdHMoKQp7CnJldHVybiAkdGhpcy0+YXR0ZW1wdHM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Tm9ybWFsaXplcihjYWxsYWJsZSAkbm9ybWFsaXplcikKewokdGhpcy0+bm9ybWFsaXplciA9ICRub3JtYWxpemVyOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5vcm1hbGl6ZXIoKQp7CnJldHVybiAkdGhpcy0+bm9ybWFsaXplcjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGlzQXNzb2MoYXJyYXkgJGFycmF5KQp7CnJldHVybiAoYm9vbCkgXGNvdW50KGFycmF5X2ZpbHRlcihhcnJheV9rZXlzKCRhcnJheSksICdpc19zdHJpbmcnKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc1RyaW1tYWJsZSgpOiBib29sCnsKcmV0dXJuICR0aGlzLT50cmltbWFibGU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRUcmltbWFibGUoYm9vbCAkdHJpbW1hYmxlKTogc2VsZgp7CiR0aGlzLT50cmltbWFibGUgPSAkdHJpbW1hYmxlOwoKcmV0dXJuICR0aGlzOwp9Cn0KTVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAAB/xizNO6dCnjunQp47p0KeMt/XnjqnQp4y38GeLadCnjLfxp45p0KeMt/Rnj+nQp4cYTmeOKdCnjunQ54Ip0KeMt/InjqnQp4y39aeOqdCnjLf0546p0KeUmljaDunQp4AAAAAAAAAAFBFAABMAQUArE1vTwAAAAAAAAAA4AACAQsBCQAACgAAABYAAAAAAAA4EwAAABAAAAAgAAAAAEAAABAAAAACAAAFAAAAAAAAAAUAAAAAAAAAAGAAAAAEAAA/nAAAAwBAgQAAEAAAEAAAAAAQAAAQAAAAAAAAEAAAAAAAAAAAAAAAkCIAAFAAAAAAQAAAIAYAAAAAAAAAAAAAAAAAAAAAAAAAUAAAcAEAAAAhAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOCEAAEAAAAAAAAAAAAAAAAAgAADYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALnRleHQAAAALCQAAABAAAAAKAAAABAAAAAAAAAAAAAAAAAAAIAAAYC5yZGF0YQAAzgkAAAAgAAAACgAAAA4AAAAAAAAAAAAAAAAAAEAAAEAuZGF0YQAAAJADAAAAMAAAAAIAAAAYAAAAAAAAAAAAAAAAAABAAADALnJzcmMAAAAgBgAAAEAAAAAIAAAAGgAAAAAAAAAAAAAAAAAAQAAAQC5yZWxvYwAAzAEAAABQAAAAAgAAACIAAAAAAAAAAAAAAAAAAEAAAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGokuOYYQADoeAgAAGr2/xUIIEAAg2XQAIvwjUXQUFb/FQAgQACLRdCD4PtQVv8VBCBAAI1N1P8VWCBAAINl/ACNRdRQ/zVIIEAA/xVMIEAAWVn/NVwgQACNRdRQ/zVgIEAA/xVEIEAAWVmLyP8VUCBAAINN/P+NTdT/FVQgQAAzwOhICAAAwzsNADBAAHUC88PprAIAAGiAFUAA6KMEAAChbDNAAMcEJDQwQAD/NWgzQACjNDBAAGgkMEAAaCgwQABoIDBAAP8VoCBAAIPEFKMwMEAAhcB9CGoI6LkDAABZw2oQaAgiQADoHwYAADPbiV38ZKEYAAAAi3AEiV3kv4AzQABTVlf/FTAgQAA7w3QZO8Z1CDP2Rol15OsQaOgDAAD/FTQgQADr2jP2RqF8M0AAO8Z1Cmof6FwDAABZ6zuhfDNAAIXAdSyJNXwzQABo8CBAAGjkIEAA6KcFAABZWYXAdBfHRfz+////uP8AAADp3QAAAIk1PDBAAKF8M0AAO8Z1G2jgIEAAaNggQADobAUAAFlZxwV8M0AAAgAAADld5HUIU1f/FTggQAA5HYwzQAB0GWiMM0AA6IMEAABZhcB0ClNqAlP/FYwzQAChJDBAAIsNvCBAAIkB/zUkMEAA/zUoMEAA/zUgMEAA6BD+//+DxAyjODBAADkdLDBAAHU3UP8VwCBAAItF7IsIiwmJTeBQUeiOAwAAWVnDi2Xoi0XgozgwQAAz2zkdLDBAAHUHUP8VaCBAADkdPDBAAHUG/xWcIEAAx0X8/v///6E4MEAA6PsEAADDuE1aAABmOQUAAEAAdAQzwOtNoTwAQACNgAAAQACBOFBFAAB16Q+3SBiB+QsBAAB0G4H5CwIAAHXVg7iEAAAADnbMM8k5iPgAAADrDoN4dA52vDPJOYjoAAAAD5XBi8FqAaMsMEAA/xVwIEAAav//FWwgQABZWaOEM0AAo4gzQAD/FcwgQACLDXQzQACJCP8ViCBAAIsNcDNAAIkIoaggQACLAKN4M0AA6FYCAADorAQAAIM9FDBAAAB1DGi1F0AA/xWsIEAAWehnBAAAgz0QMEAA/3UJav//FbAgQABZM8DD6HsEAADpn/3//4v/VYvsgewoAwAAo0gxQACJDUQxQACJFUAxQACJHTwxQACJNTgxQACJPTQxQABmjBVgMUAAZowNVDFAAGaMHTAxQABmjAUsMUAAZowlKDFAAGaMLSQxQACcjwVYMUAAi0UAo0wxQACLRQSjUDFAAI1FCKNcMUAAi4Xg/P//xwWYMEAAAQABAKFQMUAAo0wwQADHBUAwQAAJBADAxwVEMEAAAQAAAKEAMEAAiYXY/P//oQQwQACJhdz8////FRwgQACjkDBAAGoB6D8EAABZagD/FSAgQABoHCFAAP8VJCBAAIM9kDBAAAB1CGoB6BsEAABZaAkEAMD/FSggQABQ/xUsIEAAycOL/1WL7ItFCIsAgThjc23gdSqDeBADdSSLQBQ9IAWTGXQVPSEFkxl0Dj0iBZMZdAc9AECZAXUF6NADAAAzwF3CBABoSBRAAP8VICBAADPAw/8lpCBAAGoUaCgiQADoYgIAAP81iDNAAIs1jCBAAP/WWYlF5IP4/3UM/3UI/xXEIEAAWetnagjokgMAAFmDZfwA/zWIM0AA/9aJReT/NYQzQAD/1llZiUXgjUXgUI1F5FD/dQiLNWwgQAD/1llQ6FUDAACJRdz/deT/1qOIM0AA/3Xg/9aDxBSjhDNAAMdF/P7////oCQAAAItF3OgYAgAAw2oI6BkDAABZw4v/VYvs/3UI6E7////32BvA99hZSF3Di/9WuPwhQAC+/CFAAFeL+DvGcw+LB4XAdAL/0IPHBDv+cvFfXsOL/1a4BCJAAL4EIkAAV4v4O8ZzD4sHhcB0Av/Qg8cEO/5y8V9ew/8lyCBAAMzMzMyL/1WL7ItNCLhNWgAAZjkBdAQzwF3Di0E8A8GBOFBFAAB17zPSuQsBAABmOUgYD5TCi8Jdw8zMzMzMzMzMzMzMi/9Vi+yLRQiLSDwDyA+3QRRTVg+3cQYz0leNRAgYhfZ2G4t9DItIDDv5cgmLWAgD2Tv7cgpCg8AoO9Zy6DPAX15bXcPMzMzMzMzMzMzMzMyL/1WL7Gr+aEgiQABoZRdAAGShAAAAAFCD7AhTVlehADBAADFF+DPFUI1F8GSjAAAAAIll6MdF/AAAAABoAABAAOgq////g8QEhcB0VYtFCC0AAEAAUGgAAEAA6FD///+DxAiFwHQ7i0Akwegf99CD4AHHRfz+////i03wZIkNAAAAAFlfXluL5V3Di0XsiwiLATPSPQUAAMAPlMKLwsOLZejHRfz+////M8CLTfBkiQ0AAAAAWV9eW4vlXcPM/yW4IEAA/yW0IEAAzMxoZRdAAGT/NQAAAACLRCQQiWwkEI1sJBAr4FNWV6EAMEAAMUX8M8VQiWXo/3X4i0X8x0X8/v///4lF+I1F8GSjAAAAAMOLTfBkiQ0AAAAAWV9fXluL5V1Rw4v/VYvs/3UU/3UQ/3UM/3UIaIcQQABoADBAAOjnAAAAg8QYXcOL/1ZoAAADAGgAAAEAM/ZW6NkAAACDxAyFwHQNVlZWVlbowgAAAIPEFF7DM8DDi/9Vi+yD7BChADBAAINl+ACDZfwAU1e/TuZAu7sAAP//O8d0DYXDdAn30KMEMEAA62BWjUX4UP8VPCBAAIt1/DN1+P8VDCBAADPw/xUQIEAAM/D/FRQgQAAz8I1F8FD/FRggQACLRfQzRfAz8Dv3dQe+T+ZAu+sLhfN1B4vGweAQC/CJNQAwQAD31ok1BDBAAF5fW8nD/yV0IEAA/yV4IEAA/yV8IEAA/yWAIEAA/yWEIEAA/yWQIEAA/yWUIEAA/yWYIEAA/yXQIEAAUGT/NQAAAACNRCQMK2QkDFNWV4koi+ihADBAADPFUIlF8P91/MdF/P////+NRfRkowAAAADDi030ZIkNAAAAAFlfX15bi+VdUcOLTfAzzeiv9///6d3///+NTdT/JVQgQACLVCQIjUIMi0rMM8jokPf//4tK/DPI6Ib3//+4bCJAAOlz////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4IwAAyiMAANwjAACIKQAAcikAAGIpAABIKQAANCkAABYpAAD6KAAA5igAANIoAAC0KAAArCgAAJYoAACeKQAAAAAAAPojAADgJAAAGiUAAMolAAAaJgAAZCYAAK4mAACkJAAAAAAAACgnAADEJwAA1icAAOgnAAD+JwAAHigAACgoAAA2KAAApicAAEgoAABaKAAAdCgAAIYoAAAeJwAADicAAAAnAACWJwAAgicAAGwnAABeJwAAUicAAEYnAAA+JwAAPigAADAnAAC2JwAAuCkAAAAAAAAAAAAAlhBAAAAAAAAAAAAAVxJAAIoUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAKxNb08AAAAAAgAAAGwAAACAIQAAgA8AAEAwQACYMEAAYmFkIGFsbG9jYXRpb24AAAAAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMEAA8CFAAAIAAABSU0RT0YyzELSPAUqoIfbM60xaAAEAAABjOlx1c2Vyc1xzZWxkXGRvY3VtZW50c1x2aXN1YWwgc3R1ZGlvIDIwMTBcUHJvamVjdHNcaGlkZGVuaW5wXFJlbGVhc2VcaGlkZGVuaW5wLnBkYgAAAAAAZRcAAOYYAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAADQ////AAAAAP7///8HEkAAGxJAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAAA6FUAAAAAAAP7///8AAAAA2P///wAAAAD+////yxZAAN8WQAD/////3RhAACIFkxkBAAAAZCJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAOAiAAAAAAAAAAAAAOwjAAAAIAAAJCMAAAAAAAAAAAAA9CYAAEQgAABIIwAAAAAAAAAAAAASKAAAaCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuCMAAMojAADcIwAAiCkAAHIpAABiKQAASCkAADQpAAAWKQAA+igAAOYoAADSKAAAtCgAAKwoAACWKAAAnikAAAAAAAD6IwAA4CQAABolAADKJQAAGiYAAGQmAACuJgAApCQAAAAAAAAoJwAAxCcAANYnAADoJwAA/icAAB4oAAAoKAAANigAAKYnAABIKAAAWigAAHQoAACGKAAAHicAAA4nAAAAJwAAlicAAIInAABsJwAAXicAAFInAABGJwAAPicAAD4oAAAwJwAAticAALgpAAAAAAAAlQFHZXRDb25zb2xlTW9kZQAAtwNTZXRDb25zb2xlTW9kZQAAOwJHZXRTdGRIYW5kbGUAAEtFUk5FTDMyLmRsbAAAFgA/PyQ/NkRVPyRjaGFyX3RyYWl0c0BEQHN0ZEBAVj8kYWxsb2NhdG9yQERAMUBAc3RkQEBZQUFBVj8kYmFzaWNfb3N0cmVhbUBEVT8kY2hhcl90cmFpdHNAREBzdGRAQEAwQEFBVjEwQEFCVj8kYmFzaWNfc3RyaW5nQERVPyRjaGFyX3RyYWl0c0BEQHN0ZEBAVj8kYWxsb2NhdG9yQERAMkBAMEBAWgCRBj9jb3V0QHN0ZEBAM1Y/JGJhc2ljX29zdHJlYW1ARFU/JGNoYXJfdHJhaXRzQERAc3RkQEBAMUBBAABKBj9jaW5Ac3RkQEAzVj8kYmFzaWNfaXN0cmVhbUBEVT8kY2hhcl90cmFpdHNAREBzdGRAQEAxQEEAwgA/PyRnZXRsaW5lQERVPyRjaGFyX3RyYWl0c0BEQHN0ZEBAVj8kYWxsb2NhdG9yQERAMkBAc3RkQEBZQUFBVj8kYmFzaWNfaXN0cmVhbUBEVT8kY2hhcl90cmFpdHNAREBzdGRAQEAwQEFBVjEwQEFBVj8kYmFzaWNfc3RyaW5nQERVPyRjaGFyX3RyYWl0c0BEQHN0ZEBAVj8kYWxsb2NhdG9yQERAMkBAMEBAWgAdAz8/Nj8kYmFzaWNfb3N0cmVhbUBEVT8kY2hhcl90cmFpdHNAREBzdGRAQEBzdGRAQFFBRUFBVjAxQFA2QUFBVjAxQEFBVjAxQEBaQFoAAF8CPz8xPyRiYXNpY19zdHJpbmdARFU/JGNoYXJfdHJhaXRzQERAc3RkQEBWPyRhbGxvY2F0b3JAREAyQEBzdGRAQFFBRUBYWgAAewE/PzA/JGJhc2ljX3N0cmluZ0BEVT8kY2hhcl90cmFpdHNAREBzdGRAQFY/JGFsbG9jYXRvckBEQDJAQHN0ZEBAUUFFQFhaAACzBz9lbmRsQHN0ZEBAWUFBQVY/JGJhc2ljX29zdHJlYW1ARFU/JGNoYXJfdHJhaXRzQERAc3RkQEBAMUBBQVYyMUBAWgAATVNWQ1A5MC5kbGwAFQFfYW1zZ19leGl0AACfAF9fZ2V0bWFpbmFyZ3MALAFfY2V4aXQAAHwBX2V4aXQAZgBfWGNwdEZpbHRlcgDMBGV4aXQAAKAAX19pbml0ZW52AAQCX2luaXR0ZXJtAAUCX2luaXR0ZXJtX2UAPAFfY29uZmlndGhyZWFkbG9jYWxlAOMAX19zZXR1c2VybWF0aGVycgAACwFfYWRqdXN0X2ZkaXYAAMsAX19wX19jb21tb2RlAADPAF9fcF9fZm1vZGUAAGoBX2VuY29kZV9wb2ludGVyAOAAX19zZXRfYXBwX3R5cGUAAEsBX2NydF9kZWJ1Z2dlcl9ob29rAABDAD90ZXJtaW5hdGVAQFlBWFhaAE1TVkNSOTAuZGxsAOYDX3VubG9jawCWAF9fZGxsb25leGl0AHYCX2xvY2sAHANfb25leGl0AGABX2RlY29kZV9wb2ludGVyAHMBX2V4Y2VwdF9oYW5kbGVyNF9jb21tb24ACwJfaW52b2tlX3dhdHNvbgAAPwFfY29udHJvbGZwX3MAAL0CSW50ZXJsb2NrZWRFeGNoYW5nZQAhBFNsZWVwALoCSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UAAC0EVGVybWluYXRlUHJvY2VzcwAAqQFHZXRDdXJyZW50UHJvY2VzcwA+BFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAAFQRTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIA0QJJc0RlYnVnZ2VyUHJlc2VudABUA1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyAGYCR2V0VGlja0NvdW50AACtAUdldEN1cnJlbnRUaHJlYWRJZAAAqgFHZXRDdXJyZW50UHJvY2Vzc0lkAE8CR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUAcwBfX0N4eEZyYW1lSGFuZGxlcjMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATuZAu7EZv0T///////////7///8BAAAAJCFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAIAEAAAACAAAIAYAAAAOAAAgAAAAAAAAAAABAAAAAAAAQABAAAAUAAAgAAAAAAAAAAABAAAAAAAAQABAAAAaAAAgAAAAAAAAAAABAAAAAAAAQAJBAAAgAAAAAAAAAAAAAAABAAAAAAAAQAJBAAAkAAAAKBAAAAoAwAA5AQAAAAAAADIQwAAVgIAAOQEAAAAAAAAKAM0AAAAVgBTAF8AVgBFAFIAUwBJAE8ATgBfAEkATgBGAE8AAAAAAL0E7/4AAAEAAAABAAAAAAAAAAEAAAAAABcAAAAAAAAABAAAAAEAAAAAAAAAAAAAAAAAAACGAgAAAQBTAHQAcgBpAG4AZwBGAGkAbABlAEkAbgBmAG8AAABiAgAAAQAwADQAMAA5ADAANABiADAAAADKAFEAAQBGAGkAbABlAEQAZQBzAGMAcgBpAHAAdABpAG8AbgAAAAAAUgBlAGEAZABzACAAZgByAG8AbQAgAHMAdABkAGkAbgAgAHcAaQB0AGgAbwB1AHQAIABsAGUAYQBrAGkAbgBnACAAaQBuAGYAbwAgAHQAbwAgAHQAaABlACAAdABlAHIAbQBpAG4AYQBsACAAYQBuAGQAIABvAHUAdABwAHUAdABzACAAYgBhAGMAawAgAHQAbwAgAHMAdABkAG8AdQB0AAAAAAA2AAsAAQBGAGkAbABlAFYAZQByAHMAaQBvAG4AAAAAADEALAAgADAALAAgADAALAAgADAAAAAAADgADAABAEkAbgB0AGUAcgBuAGEAbABOAGEAbQBlAAAAaABpAGQAZABlAG4AaQBuAHAAdQB0AAAAUAAWAAEATABlAGcAYQBsAEMAbwBwAHkAcgBpAGcAaAB0AAAASgBvAHIAZABpACAAQgBvAGcAZwBpAGEAbgBvACAALQAgADIAMAAxADIAAABIABAAAQBPAHIAaQBnAGkAbgBhAGwARgBpAGwAZQBuAGEAbQBlAAAAaABpAGQAZABlAG4AaQBuAHAAdQB0AC4AZQB4AGUAAAA6AA0AAQBQAHIAbwBkAHUAYwB0AE4AYQBtAGUAAAAAAEgAaQBkAGQAZQBuACAASQBuAHAAdQB0AAAAAAA6AAsAAQBQAHIAbwBkAHUAYwB0AFYAZQByAHMAaQBvAG4AAAAxACwAIAAwACwAIAAwACwAIAAwAAAAAABEAAAAAQBWAGEAcgBGAGkAbABlAEkAbgBmAG8AAAAAACQABAAAAFQAcgBhAG4AcwBsAGEAdABpAG8AbgAAAAAACQSwBDxhc3NlbWJseSB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTphc20udjEiIG1hbmlmZXN0VmVyc2lvbj0iMS4wIj4NCiAgPHRydXN0SW5mbyB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTphc20udjMiPg0KICAgIDxzZWN1cml0eT4NCiAgICAgIDxyZXF1ZXN0ZWRQcml2aWxlZ2VzPg0KICAgICAgICA8cmVxdWVzdGVkRXhlY3V0aW9uTGV2ZWwgbGV2ZWw9ImFzSW52b2tlciIgdWlBY2Nlc3M9ImZhbHNlIj48L3JlcXVlc3RlZEV4ZWN1dGlvbkxldmVsPg0KICAgICAgPC9yZXF1ZXN0ZWRQcml2aWxlZ2VzPg0KICAgIDwvc2VjdXJpdHk+DQogIDwvdHJ1c3RJbmZvPg0KICA8ZGVwZW5kZW5jeT4NCiAgICA8ZGVwZW5kZW50QXNzZW1ibHk+DQogICAgICA8YXNzZW1ibHlJZGVudGl0eSB0eXBlPSJ3aW4zMiIgbmFtZT0iTWljcm9zb2Z0LlZDOTAuQ1JUIiB2ZXJzaW9uPSI5LjAuMjEwMjIuOCIgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPSJ4ODYiIHB1YmxpY0tleVRva2VuPSIxZmM4YjNiOWExZTE4ZTNiIj48L2Fzc2VtYmx5SWRlbnRpdHk+DQogICAgPC9kZXBlbmRlbnRBc3NlbWJseT4NCiAgPC9kZXBlbmRlbmN5Pg0KPC9hc3NlbWJseT5QQVBBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElORwAQAABAAQAAAzAQMCEwLzA4MEYwTDBUMF4wZDBuMHswiTCXMKEwqDCuMLMwuDC9MMIwyDDQMOQw/zAIMSMxLTFAMUoxTzFUMXYxezGEMYkxljGnMa0xtDHIMc0x0zHbMeEx5zH0MfoxAzIiMioyMzI5MkEyTTJfMmoycDK5Mr8yxzLOMtMy2TLfMucy7TL0MvsyCzMTMxkzJTMwM04zVDNaM2AzZjNsM3MzejOBM4gzjzOWM50zpTOtM7UzwTPKM88z1TPfM+gz8zP/MwQ0FDQZNB80JTQ7NEI0izSRNJo0oTSsNLI0xjTbNOY0/jQUNSE1XjVjNYQ1iTWoNUg2TTZfNn02kTaXNgA3BjcNNyo3dzd8N8E35DfxN/03BTgNOBk4PThFOFA4VjhcOGI4aDhuOHQ4ejiAOJw44jgCOQAAACAAACQAAADcMOgw7DAcMSAxdDF4MRwyIDJAMlwyYDJoMnQyADAAAAwAAAAYMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgU3ltZm9ueSBwYWNrYWdlLgojCiMgKGMpIEZhYmllbiBQb3RlbmNpZXIgPGZhYmllbkBzeW1mb255LmNvbT4KIwojIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3CiMgaHR0cHM6Ly9zeW1mb255LmNvbS9kb2MvY3VycmVudC9jb250cmlidXRpbmcvY29kZS9saWNlbnNlLmh0bWwKCl9zZl97eyBDT01NQU5EX05BTUUgfX0oKSB7CiAgICAjIFVzZSBuZXdsaW5lIGFzIG9ubHkgc2VwYXJhdG9yIHRvIGFsbG93IHNwYWNlIGluIGNvbXBsZXRpb24gdmFsdWVzCiAgICBsb2NhbCBJRlM9JCdcbicKICAgIGxvY2FsIHNmX2NtZD0iJHtDT01QX1dPUkRTWzBdfSIKCiAgICAjIGZvciBhbiBhbGlhcywgZ2V0IHRoZSByZWFsIHNjcmlwdCBiZWhpbmQgaXQKICAgIHNmX2NtZF90eXBlPSQodHlwZSAtdCAkc2ZfY21kKQogICAgaWYgW1sgJHNmX2NtZF90eXBlID09ICJhbGlhcyIgXV07IHRoZW4KICAgICAgICBzZl9jbWQ9JChhbGlhcyAkc2ZfY21kIHwgc2VkIC1FICJzL2FsaWFzICRzZl9jbWQ9JyguKiknL1wxLyIpCiAgICBlbGlmIFtbICRzZl9jbWRfdHlwZSA9PSAiZmlsZSIgXV07IHRoZW4KICAgICAgICBzZl9jbWQ9JCh0eXBlIC1wICRzZl9jbWQpCiAgICBmaQoKICAgIGlmIFtbICRzZl9jbWRfdHlwZSAhPSAiZnVuY3Rpb24iICYmICEgLXggJHNmX2NtZCBdXTsgdGhlbgogICAgICAgIHJldHVybiAxCiAgICBmaQoKICAgIGxvY2FsIGN1ciBwcmV2IHdvcmRzIGN3b3JkCiAgICBfZ2V0X2NvbXBfd29yZHNfYnlfcmVmIC1uIDo9IGN1ciBwcmV2IHdvcmRzIGN3b3JkCgogICAgbG9jYWwgY29tcGxldGVjbWQ9KCIkc2ZfY21kIiAiX2NvbXBsZXRlIiAiLS1uby1pbnRlcmFjdGlvbiIgIi1zYmFzaCIgIi1jJGN3b3JkIiAiLVN7eyBWRVJTSU9OIH19IikKICAgIGZvciB3IGluICR7d29yZHNbQF19OyBkbwogICAgICAgIHc9JChwcmludGYgLS0gJyViJyAiJHciKQogICAgICAgICMgcmVtb3ZlIHF1b3RlcyBmcm9tIHR5cGVkIHZhbHVlcwogICAgICAgIHF1b3RlPSIke3c6MDoxfSIKICAgICAgICBpZiBbICIkcXVvdGUiID09IFwnIF07IHRoZW4KICAgICAgICAgICAgdz0iJHt3JVwnfSIKICAgICAgICAgICAgdz0iJHt3I1wnfSIKICAgICAgICBlbGlmIFsgIiRxdW90ZSIgPT0gXCIgXTsgdGhlbgogICAgICAgICAgICB3PSIke3clXCJ9IgogICAgICAgICAgICB3PSIke3cjXCJ9IgogICAgICAgIGZpCiAgICAgICAgIyBlbXB0eSB2YWx1ZXMgYXJlIGlnbm9yZWQKICAgICAgICBpZiBbICEgLXogIiR3IiBdOyB0aGVuCiAgICAgICAgICAgIGNvbXBsZXRlY21kKz0oIi1pJHciKQogICAgICAgIGZpCiAgICBkb25lCgogICAgbG9jYWwgc2Zjb21wbGV0ZQogICAgaWYgc2Zjb21wbGV0ZT0kKCR7Y29tcGxldGVjbWRbQF19IDI+JjEpOyB0aGVuCiAgICAgICAgbG9jYWwgcXVvdGUgc3VnZ2VzdGlvbnMKICAgICAgICBxdW90ZT0ke2N1cjowOjF9CgogICAgICAgICMgVXNlIHNpbmdsZSBxdW90ZXMgYnkgZGVmYXVsdCBpZiBzdWdnZXN0aW9ucyBjb250YWlucyBiYWNrc2xhc2ggKEZRQ04pCiAgICAgICAgaWYgWyAiJHF1b3RlIiA9PSAnJyBdICYmIFtbICIkc2Zjb21wbGV0ZSIgPX4gXFwgXV07IHRoZW4KICAgICAgICAgICAgcXVvdGU9XCcKICAgICAgICBmaQoKICAgICAgICBpZiBbICIkcXVvdGUiID09IFwnIF07IHRoZW4KICAgICAgICAgICAgIyBzaW5nbGUgcXVvdGVzOiBubyBhZGRpdGlvbmFsIGVzY2FwaW5nIChkb2VzIG5vdCBhY2NlcHQgJyBpbiB2YWx1ZXMpCiAgICAgICAgICAgIHN1Z2dlc3Rpb25zPSQoZm9yIHMgaW4gJHNmY29tcGxldGU7IGRvIHByaW50ZiAkJyVxJXElcVxuJyAiJHF1b3RlIiAiJHMiICIkcXVvdGUiOyBkb25lKQogICAgICAgIGVsaWYgWyAiJHF1b3RlIiA9PSBcIiBdOyB0aGVuCiAgICAgICAgICAgICMgZG91YmxlIHF1b3RlczogZG91YmxlIGVzY2FwaW5nIGZvciBcICQgYCAiCiAgICAgICAgICAgIHN1Z2dlc3Rpb25zPSQoZm9yIHMgaW4gJHNmY29tcGxldGU7IGRvCiAgICAgICAgICAgICAgICBzPSR7cy8vXFwvXFxcXH0KICAgICAgICAgICAgICAgIHM9JHtzLy9cJC9cXFwkfQogICAgICAgICAgICAgICAgcz0ke3MvL1xgL1xcXGB9CiAgICAgICAgICAgICAgICBzPSR7cy8vXCIvXFxcIn0KICAgICAgICAgICAgICAgIHByaW50ZiAkJyVxJXElcVxuJyAiJHF1b3RlIiAiJHMiICIkcXVvdGUiOwogICAgICAgICAgICBkb25lKQogICAgICAgIGVsc2UKICAgICAgICAgICAgIyBubyBxdW90ZXM6IGRvdWJsZSBlc2NhcGluZwogICAgICAgICAgICBzdWdnZXN0aW9ucz0kKGZvciBzIGluICRzZmNvbXBsZXRlOyBkbyBwcmludGYgJCclcVxuJyAkKHByaW50ZiAnJXEnICIkcyIpOyBkb25lKQogICAgICAgIGZpCiAgICAgICAgQ09NUFJFUExZPSgkKElGUz0kJ1xuJyBjb21wZ2VuIC1XICIkc3VnZ2VzdGlvbnMiIC0tICQocHJpbnRmIC0tICIlcSIgIiRjdXIiKSkpCiAgICAgICAgX19sdHJpbV9jb2xvbl9jb21wbGV0aW9ucyAiJGN1ciIKICAgIGVsc2UKICAgICAgICBpZiBbWyAiJHNmY29tcGxldGUiICE9ICoiQ29tbWFuZCBcIl9jb21wbGV0ZVwiIGlzIG5vdCBkZWZpbmVkLiIqIF1dOyB0aGVuCiAgICAgICAgICAgID4mMiBlY2hvCiAgICAgICAgICAgID4mMiBlY2hvICRzZmNvbXBsZXRlCiAgICAgICAgZmkKCiAgICAgICAgcmV0dXJuIDEKICAgIGZpCn0KCmNvbXBsZXRlIC1GIF9zZl97eyBDT01NQU5EX05BTUUgfX0ge3sgQ09NTUFORF9OQU1FIH19Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxTaWduYWxSZWdpc3RyeTsKCmZpbmFsIGNsYXNzIFNpZ25hbFJlZ2lzdHJ5CnsKcHJpdmF0ZSAkc2lnbmFsSGFuZGxlcnMgPSBbXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCnsKaWYgKFxmdW5jdGlvbl9leGlzdHMoJ3BjbnRsX2FzeW5jX3NpZ25hbHMnKSkgewpwY250bF9hc3luY19zaWduYWxzKHRydWUpOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiByZWdpc3RlcihpbnQgJHNpZ25hbCwgY2FsbGFibGUgJHNpZ25hbEhhbmRsZXIpOiB2b2lkCnsKaWYgKCFpc3NldCgkdGhpcy0+c2lnbmFsSGFuZGxlcnNbJHNpZ25hbF0pKSB7CiRwcmV2aW91c0NhbGxiYWNrID0gcGNudGxfc2lnbmFsX2dldF9oYW5kbGVyKCRzaWduYWwpOwoKaWYgKFxpc19jYWxsYWJsZSgkcHJldmlvdXNDYWxsYmFjaykpIHsKJHRoaXMtPnNpZ25hbEhhbmRsZXJzWyRzaWduYWxdW10gPSAkcHJldmlvdXNDYWxsYmFjazsKfQp9CgokdGhpcy0+c2lnbmFsSGFuZGxlcnNbJHNpZ25hbF1bXSA9ICRzaWduYWxIYW5kbGVyOwoKcGNudGxfc2lnbmFsKCRzaWduYWwsIFskdGhpcywgJ2hhbmRsZSddKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1N1cHBvcnRlZCgpOiBib29sCnsKaWYgKCFcZnVuY3Rpb25fZXhpc3RzKCdwY250bF9zaWduYWwnKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmIChcaW5fYXJyYXkoJ3BjbnRsX3NpZ25hbCcsIGV4cGxvZGUoJywnLCBcaW5pX2dldCgnZGlzYWJsZV9mdW5jdGlvbnMnKSkpKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBoYW5kbGUoaW50ICRzaWduYWwpOiB2b2lkCnsKJGNvdW50ID0gXGNvdW50KCR0aGlzLT5zaWduYWxIYW5kbGVyc1skc2lnbmFsXSk7Cgpmb3JlYWNoICgkdGhpcy0+c2lnbmFsSGFuZGxlcnNbJHNpZ25hbF0gYXMgJGkgPT4gJHNpZ25hbEhhbmRsZXIpIHsKJGhhc05leHQgPSAkaSAhPT0gJGNvdW50IC0gMTsKJHNpZ25hbEhhbmRsZXIoJHNpZ25hbCwgJGhhc05leHQpOwp9Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGU7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXENvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKY2xhc3MgU2luZ2xlQ29tbWFuZEFwcGxpY2F0aW9uIGV4dGVuZHMgQ29tbWFuZAp7CnByaXZhdGUgJHZlcnNpb24gPSAnVU5LTk9XTic7CnByaXZhdGUgJGF1dG9FeGl0ID0gdHJ1ZTsKcHJpdmF0ZSAkcnVubmluZyA9IGZhbHNlOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFZlcnNpb24oc3RyaW5nICR2ZXJzaW9uKTogc2VsZgp7CiR0aGlzLT52ZXJzaW9uID0gJHZlcnNpb247CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEF1dG9FeGl0KGJvb2wgJGF1dG9FeGl0KTogc2VsZgp7CiR0aGlzLT5hdXRvRXhpdCA9ICRhdXRvRXhpdDsKCnJldHVybiAkdGhpczsKfQoKcHVibGljIGZ1bmN0aW9uIHJ1big/SW5wdXRJbnRlcmZhY2UgJGlucHV0ID0gbnVsbCwgP091dHB1dEludGVyZmFjZSAkb3V0cHV0ID0gbnVsbCk6IGludAp7CmlmICgkdGhpcy0+cnVubmluZykgewpyZXR1cm4gcGFyZW50OjpydW4oJGlucHV0LCAkb3V0cHV0KTsKfQoKCiRhcHBsaWNhdGlvbiA9IG5ldyBBcHBsaWNhdGlvbigkdGhpcy0+Z2V0TmFtZSgpID86ICdVTktOT1dOJywgJHRoaXMtPnZlcnNpb24pOwokYXBwbGljYXRpb24tPnNldEF1dG9FeGl0KCR0aGlzLT5hdXRvRXhpdCk7CgokdGhpcy0+c2V0TmFtZSgkX1NFUlZFUlsnYXJndiddWzBdKTsKJGFwcGxpY2F0aW9uLT5hZGQoJHRoaXMpOwokYXBwbGljYXRpb24tPnNldERlZmF1bHRDb21tYW5kKCR0aGlzLT5nZXROYW1lKCksIHRydWUpOwoKJHRoaXMtPnJ1bm5pbmcgPSB0cnVlOwp0cnkgewokcmV0ID0gJGFwcGxpY2F0aW9uLT5ydW4oJGlucHV0LCAkb3V0cHV0KTsKfSBmaW5hbGx5IHsKJHRoaXMtPnJ1bm5pbmcgPSBmYWxzZTsKfQoKcmV0dXJuICRyZXQgPz8gMTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxTdHlsZTsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxQcm9ncmVzc0JhcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCmFic3RyYWN0IGNsYXNzIE91dHB1dFN0eWxlIGltcGxlbWVudHMgT3V0cHV0SW50ZXJmYWNlLCBTdHlsZUludGVyZmFjZQp7CnByaXZhdGUgJG91dHB1dDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewokdGhpcy0+b3V0cHV0ID0gJG91dHB1dDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG5ld0xpbmUoaW50ICRjb3VudCA9IDEpCnsKJHRoaXMtPm91dHB1dC0+d3JpdGUoc3RyX3JlcGVhdChcUEhQX0VPTCwgJGNvdW50KSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjcmVhdGVQcm9ncmVzc0JhcihpbnQgJG1heCA9IDApCnsKcmV0dXJuIG5ldyBQcm9ncmVzc0JhcigkdGhpcy0+b3V0cHV0LCAkbWF4KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IGZhbHNlLCBpbnQgJHR5cGUgPSBzZWxmOjpPVVRQVVRfTk9STUFMKQp7CiR0aGlzLT5vdXRwdXQtPndyaXRlKCRtZXNzYWdlcywgJG5ld2xpbmUsICR0eXBlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlbG4oJG1lc3NhZ2VzLCBpbnQgJHR5cGUgPSBzZWxmOjpPVVRQVVRfTk9STUFMKQp7CiR0aGlzLT5vdXRwdXQtPndyaXRlbG4oJG1lc3NhZ2VzLCAkdHlwZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRWZXJib3NpdHkoaW50ICRsZXZlbCkKewokdGhpcy0+b3V0cHV0LT5zZXRWZXJib3NpdHkoJGxldmVsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFZlcmJvc2l0eSgpCnsKcmV0dXJuICR0aGlzLT5vdXRwdXQtPmdldFZlcmJvc2l0eSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGVjb3JhdGVkKGJvb2wgJGRlY29yYXRlZCkKewokdGhpcy0+b3V0cHV0LT5zZXREZWNvcmF0ZWQoJGRlY29yYXRlZCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlY29yYXRlZCgpCnsKcmV0dXJuICR0aGlzLT5vdXRwdXQtPmlzRGVjb3JhdGVkKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRGb3JtYXR0ZXIoT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlICRmb3JtYXR0ZXIpCnsKJHRoaXMtPm91dHB1dC0+c2V0Rm9ybWF0dGVyKCRmb3JtYXR0ZXIpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVyKCkKewpyZXR1cm4gJHRoaXMtPm91dHB1dC0+Z2V0Rm9ybWF0dGVyKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1F1aWV0KCkKewpyZXR1cm4gJHRoaXMtPm91dHB1dC0+aXNRdWlldCgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWZXJib3NlKCkKewpyZXR1cm4gJHRoaXMtPm91dHB1dC0+aXNWZXJib3NlKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZlcnlWZXJib3NlKCkKewpyZXR1cm4gJHRoaXMtPm91dHB1dC0+aXNWZXJ5VmVyYm9zZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZWJ1ZygpCnsKcmV0dXJuICR0aGlzLT5vdXRwdXQtPmlzRGVidWcoKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEVycm9yT3V0cHV0KCkKewppZiAoISR0aGlzLT5vdXRwdXQgaW5zdGFuY2VvZiBDb25zb2xlT3V0cHV0SW50ZXJmYWNlKSB7CnJldHVybiAkdGhpcy0+b3V0cHV0Owp9CgpyZXR1cm4gJHRoaXMtPm91dHB1dC0+Z2V0RXJyb3JPdXRwdXQoKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxTdHlsZTsKCgoKCgoKaW50ZXJmYWNlIFN0eWxlSW50ZXJmYWNlCnsKCgoKcHVibGljIGZ1bmN0aW9uIHRpdGxlKHN0cmluZyAkbWVzc2FnZSk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2VjdGlvbihzdHJpbmcgJG1lc3NhZ2UpOwoKCgoKcHVibGljIGZ1bmN0aW9uIGxpc3RpbmcoYXJyYXkgJGVsZW1lbnRzKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHRleHQoJG1lc3NhZ2UpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc3VjY2VzcygkbWVzc2FnZSk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBlcnJvcigkbWVzc2FnZSk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3YXJuaW5nKCRtZXNzYWdlKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG5vdGUoJG1lc3NhZ2UpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2F1dGlvbigkbWVzc2FnZSk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gdGFibGUoYXJyYXkgJGhlYWRlcnMsIGFycmF5ICRyb3dzKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFzayhzdHJpbmcgJHF1ZXN0aW9uLCA/c3RyaW5nICRkZWZhdWx0ID0gbnVsbCwgP2NhbGxhYmxlICR2YWxpZGF0b3IgPSBudWxsKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFza0hpZGRlbihzdHJpbmcgJHF1ZXN0aW9uLCA/Y2FsbGFibGUgJHZhbGlkYXRvciA9IG51bGwpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29uZmlybShzdHJpbmcgJHF1ZXN0aW9uLCBib29sICRkZWZhdWx0ID0gdHJ1ZSk7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNob2ljZShzdHJpbmcgJHF1ZXN0aW9uLCBhcnJheSAkY2hvaWNlcywgJGRlZmF1bHQgPSBudWxsKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBuZXdMaW5lKGludCAkY291bnQgPSAxKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBwcm9ncmVzc1N0YXJ0KGludCAkbWF4ID0gMCk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gcHJvZ3Jlc3NBZHZhbmNlKGludCAkc3RlcCA9IDEpOwoKCgoKcHVibGljIGZ1bmN0aW9uIHByb2dyZXNzRmluaXNoKCk7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFN0eWxlOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXFJ1bnRpbWVFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxIZWxwZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxQcm9ncmVzc0JhcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFN5bWZvbnlRdWVzdGlvbkhlbHBlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFRhYmxlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcVGFibGVDZWxsOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcVGFibGVTZXBhcmF0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcQ29uc29sZU91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XFRyaW1tZWRCdWZmZXJPdXRwdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFF1ZXN0aW9uXENob2ljZVF1ZXN0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxRdWVzdGlvblxDb25maXJtYXRpb25RdWVzdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcUXVlc3Rpb25cUXVlc3Rpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFRlcm1pbmFsOwoKCgoKCgpjbGFzcyBTeW1mb255U3R5bGUgZXh0ZW5kcyBPdXRwdXRTdHlsZQp7CnB1YmxpYyBjb25zdCBNQVhfTElORV9MRU5HVEggPSAxMjA7Cgpwcml2YXRlICRpbnB1dDsKcHJpdmF0ZSAkb3V0cHV0Owpwcml2YXRlICRxdWVzdGlvbkhlbHBlcjsKcHJpdmF0ZSAkcHJvZ3Jlc3NCYXI7CnByaXZhdGUgJGxpbmVMZW5ndGg7CnByaXZhdGUgJGJ1ZmZlcmVkT3V0cHV0OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpCnsKJHRoaXMtPmlucHV0ID0gJGlucHV0OwokdGhpcy0+YnVmZmVyZWRPdXRwdXQgPSBuZXcgVHJpbW1lZEJ1ZmZlck91dHB1dChcRElSRUNUT1JZX1NFUEFSQVRPUiA9PT0gJ1xcJyA/IDQgOiAyLCAkb3V0cHV0LT5nZXRWZXJib3NpdHkoKSwgZmFsc2UsIGNsb25lICRvdXRwdXQtPmdldEZvcm1hdHRlcigpKTsKCiR3aWR0aCA9IChuZXcgVGVybWluYWwoKSktPmdldFdpZHRoKCkgPzogc2VsZjo6TUFYX0xJTkVfTEVOR1RIOwokdGhpcy0+bGluZUxlbmd0aCA9IG1pbigkd2lkdGggLSAoaW50KSAoXERJUkVDVE9SWV9TRVBBUkFUT1IgPT09ICdcXCcpLCBzZWxmOjpNQVhfTElORV9MRU5HVEgpOwoKcGFyZW50OjpfX2NvbnN0cnVjdCgkdGhpcy0+b3V0cHV0ID0gJG91dHB1dCk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGJsb2NrKCRtZXNzYWdlcywgP3N0cmluZyAkdHlwZSA9IG51bGwsID9zdHJpbmcgJHN0eWxlID0gbnVsbCwgc3RyaW5nICRwcmVmaXggPSAnICcsIGJvb2wgJHBhZGRpbmcgPSBmYWxzZSwgYm9vbCAkZXNjYXBlID0gdHJ1ZSkKewokbWVzc2FnZXMgPSBcaXNfYXJyYXkoJG1lc3NhZ2VzKSA/IGFycmF5X3ZhbHVlcygkbWVzc2FnZXMpIDogWyRtZXNzYWdlc107CgokdGhpcy0+YXV0b1ByZXBlbmRCbG9jaygpOwokdGhpcy0+d3JpdGVsbigkdGhpcy0+Y3JlYXRlQmxvY2soJG1lc3NhZ2VzLCAkdHlwZSwgJHN0eWxlLCAkcHJlZml4LCAkcGFkZGluZywgJGVzY2FwZSkpOwokdGhpcy0+bmV3TGluZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdGl0bGUoc3RyaW5nICRtZXNzYWdlKQp7CiR0aGlzLT5hdXRvUHJlcGVuZEJsb2NrKCk7CiR0aGlzLT53cml0ZWxuKFsKc3ByaW50ZignPGNvbW1lbnQ+JXM8Lz4nLCBPdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZVRyYWlsaW5nQmFja3NsYXNoKCRtZXNzYWdlKSksCnNwcmludGYoJzxjb21tZW50PiVzPC8+Jywgc3RyX3JlcGVhdCgnPScsIEhlbHBlcjo6d2lkdGgoSGVscGVyOjpyZW1vdmVEZWNvcmF0aW9uKCR0aGlzLT5nZXRGb3JtYXR0ZXIoKSwgJG1lc3NhZ2UpKSkpLApdKTsKJHRoaXMtPm5ld0xpbmUoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNlY3Rpb24oc3RyaW5nICRtZXNzYWdlKQp7CiR0aGlzLT5hdXRvUHJlcGVuZEJsb2NrKCk7CiR0aGlzLT53cml0ZWxuKFsKc3ByaW50ZignPGNvbW1lbnQ+JXM8Lz4nLCBPdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZVRyYWlsaW5nQmFja3NsYXNoKCRtZXNzYWdlKSksCnNwcmludGYoJzxjb21tZW50PiVzPC8+Jywgc3RyX3JlcGVhdCgnLScsIEhlbHBlcjo6d2lkdGgoSGVscGVyOjpyZW1vdmVEZWNvcmF0aW9uKCR0aGlzLT5nZXRGb3JtYXR0ZXIoKSwgJG1lc3NhZ2UpKSkpLApdKTsKJHRoaXMtPm5ld0xpbmUoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGxpc3RpbmcoYXJyYXkgJGVsZW1lbnRzKQp7CiR0aGlzLT5hdXRvUHJlcGVuZFRleHQoKTsKJGVsZW1lbnRzID0gYXJyYXlfbWFwKGZ1bmN0aW9uICgkZWxlbWVudCkgewpyZXR1cm4gc3ByaW50ZignICogJXMnLCAkZWxlbWVudCk7Cn0sICRlbGVtZW50cyk7CgokdGhpcy0+d3JpdGVsbigkZWxlbWVudHMpOwokdGhpcy0+bmV3TGluZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdGV4dCgkbWVzc2FnZSkKewokdGhpcy0+YXV0b1ByZXBlbmRUZXh0KCk7CgokbWVzc2FnZXMgPSBcaXNfYXJyYXkoJG1lc3NhZ2UpID8gYXJyYXlfdmFsdWVzKCRtZXNzYWdlKSA6IFskbWVzc2FnZV07CmZvcmVhY2ggKCRtZXNzYWdlcyBhcyAkbWVzc2FnZSkgewokdGhpcy0+d3JpdGVsbihzcHJpbnRmKCcgJXMnLCAkbWVzc2FnZSkpOwp9Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbW1lbnQoJG1lc3NhZ2UpCnsKJHRoaXMtPmJsb2NrKCRtZXNzYWdlLCBudWxsLCBudWxsLCAnPGZnPWRlZmF1bHQ7Ymc9ZGVmYXVsdD4gLy8gPC8+JywgZmFsc2UsIGZhbHNlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHN1Y2Nlc3MoJG1lc3NhZ2UpCnsKJHRoaXMtPmJsb2NrKCRtZXNzYWdlLCAnT0snLCAnZmc9YmxhY2s7Ymc9Z3JlZW4nLCAnICcsIHRydWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZXJyb3IoJG1lc3NhZ2UpCnsKJHRoaXMtPmJsb2NrKCRtZXNzYWdlLCAnRVJST1InLCAnZmc9d2hpdGU7Ymc9cmVkJywgJyAnLCB0cnVlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdhcm5pbmcoJG1lc3NhZ2UpCnsKJHRoaXMtPmJsb2NrKCRtZXNzYWdlLCAnV0FSTklORycsICdmZz1ibGFjaztiZz15ZWxsb3cnLCAnICcsIHRydWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbm90ZSgkbWVzc2FnZSkKewokdGhpcy0+YmxvY2soJG1lc3NhZ2UsICdOT1RFJywgJ2ZnPXllbGxvdycsICcgISAnKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5mbygkbWVzc2FnZSkKewokdGhpcy0+YmxvY2soJG1lc3NhZ2UsICdJTkZPJywgJ2ZnPWdyZWVuJywgJyAnLCB0cnVlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNhdXRpb24oJG1lc3NhZ2UpCnsKJHRoaXMtPmJsb2NrKCRtZXNzYWdlLCAnQ0FVVElPTicsICdmZz13aGl0ZTtiZz1yZWQnLCAnICEgJywgdHJ1ZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB0YWJsZShhcnJheSAkaGVhZGVycywgYXJyYXkgJHJvd3MpCnsKJHRoaXMtPmNyZWF0ZVRhYmxlKCkKLT5zZXRIZWFkZXJzKCRoZWFkZXJzKQotPnNldFJvd3MoJHJvd3MpCi0+cmVuZGVyKCkKOwoKJHRoaXMtPm5ld0xpbmUoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhvcml6b250YWxUYWJsZShhcnJheSAkaGVhZGVycywgYXJyYXkgJHJvd3MpCnsKJHRoaXMtPmNyZWF0ZVRhYmxlKCkKLT5zZXRIb3Jpem9udGFsKHRydWUpCi0+c2V0SGVhZGVycygkaGVhZGVycykKLT5zZXRSb3dzKCRyb3dzKQotPnJlbmRlcigpCjsKCiR0aGlzLT5uZXdMaW5lKCk7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGVmaW5pdGlvbkxpc3QoLi4uJGxpc3QpCnsKJGhlYWRlcnMgPSBbXTsKJHJvdyA9IFtdOwpmb3JlYWNoICgkbGlzdCBhcyAkdmFsdWUpIHsKaWYgKCR2YWx1ZSBpbnN0YW5jZW9mIFRhYmxlU2VwYXJhdG9yKSB7CiRoZWFkZXJzW10gPSAkdmFsdWU7CiRyb3dbXSA9ICR2YWx1ZTsKY29udGludWU7Cn0KaWYgKFxpc19zdHJpbmcoJHZhbHVlKSkgewokaGVhZGVyc1tdID0gbmV3IFRhYmxlQ2VsbCgkdmFsdWUsIFsnY29sc3BhbicgPT4gMl0pOwokcm93W10gPSBudWxsOwpjb250aW51ZTsKfQppZiAoIVxpc19hcnJheSgkdmFsdWUpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1ZhbHVlIHNob3VsZCBiZSBhbiBhcnJheSwgc3RyaW5nLCBvciBhbiBpbnN0YW5jZSBvZiBUYWJsZVNlcGFyYXRvci4nKTsKfQokaGVhZGVyc1tdID0ga2V5KCR2YWx1ZSk7CiRyb3dbXSA9IGN1cnJlbnQoJHZhbHVlKTsKfQoKJHRoaXMtPmhvcml6b250YWxUYWJsZSgkaGVhZGVycywgWyRyb3ddKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFzayhzdHJpbmcgJHF1ZXN0aW9uLCA/c3RyaW5nICRkZWZhdWx0ID0gbnVsbCwgP2NhbGxhYmxlICR2YWxpZGF0b3IgPSBudWxsKQp7CiRxdWVzdGlvbiA9IG5ldyBRdWVzdGlvbigkcXVlc3Rpb24sICRkZWZhdWx0KTsKJHF1ZXN0aW9uLT5zZXRWYWxpZGF0b3IoJHZhbGlkYXRvcik7CgpyZXR1cm4gJHRoaXMtPmFza1F1ZXN0aW9uKCRxdWVzdGlvbik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhc2tIaWRkZW4oc3RyaW5nICRxdWVzdGlvbiwgP2NhbGxhYmxlICR2YWxpZGF0b3IgPSBudWxsKQp7CiRxdWVzdGlvbiA9IG5ldyBRdWVzdGlvbigkcXVlc3Rpb24pOwoKJHF1ZXN0aW9uLT5zZXRIaWRkZW4odHJ1ZSk7CiRxdWVzdGlvbi0+c2V0VmFsaWRhdG9yKCR2YWxpZGF0b3IpOwoKcmV0dXJuICR0aGlzLT5hc2tRdWVzdGlvbigkcXVlc3Rpb24pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY29uZmlybShzdHJpbmcgJHF1ZXN0aW9uLCBib29sICRkZWZhdWx0ID0gdHJ1ZSkKewpyZXR1cm4gJHRoaXMtPmFza1F1ZXN0aW9uKG5ldyBDb25maXJtYXRpb25RdWVzdGlvbigkcXVlc3Rpb24sICRkZWZhdWx0KSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjaG9pY2Uoc3RyaW5nICRxdWVzdGlvbiwgYXJyYXkgJGNob2ljZXMsICRkZWZhdWx0ID0gbnVsbCkKewppZiAobnVsbCAhPT0gJGRlZmF1bHQpIHsKJHZhbHVlcyA9IGFycmF5X2ZsaXAoJGNob2ljZXMpOwokZGVmYXVsdCA9ICR2YWx1ZXNbJGRlZmF1bHRdID8/ICRkZWZhdWx0Owp9CgpyZXR1cm4gJHRoaXMtPmFza1F1ZXN0aW9uKG5ldyBDaG9pY2VRdWVzdGlvbigkcXVlc3Rpb24sICRjaG9pY2VzLCAkZGVmYXVsdCkpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcHJvZ3Jlc3NTdGFydChpbnQgJG1heCA9IDApCnsKJHRoaXMtPnByb2dyZXNzQmFyID0gJHRoaXMtPmNyZWF0ZVByb2dyZXNzQmFyKCRtYXgpOwokdGhpcy0+cHJvZ3Jlc3NCYXItPnN0YXJ0KCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBwcm9ncmVzc0FkdmFuY2UoaW50ICRzdGVwID0gMSkKewokdGhpcy0+Z2V0UHJvZ3Jlc3NCYXIoKS0+YWR2YW5jZSgkc3RlcCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBwcm9ncmVzc0ZpbmlzaCgpCnsKJHRoaXMtPmdldFByb2dyZXNzQmFyKCktPmZpbmlzaCgpOwokdGhpcy0+bmV3TGluZSgyKTsKJHRoaXMtPnByb2dyZXNzQmFyID0gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNyZWF0ZVByb2dyZXNzQmFyKGludCAkbWF4ID0gMCkKewokcHJvZ3Jlc3NCYXIgPSBwYXJlbnQ6OmNyZWF0ZVByb2dyZXNzQmFyKCRtYXgpOwoKaWYgKCdcXCcgIT09IFxESVJFQ1RPUllfU0VQQVJBVE9SIHx8ICdIeXBlcicgPT09IGdldGVudignVEVSTV9QUk9HUkFNJykpIHsKJHByb2dyZXNzQmFyLT5zZXRFbXB0eUJhckNoYXJhY3Rlcign4paRJyk7IAokcHJvZ3Jlc3NCYXItPnNldFByb2dyZXNzQ2hhcmFjdGVyKCcnKTsKJHByb2dyZXNzQmFyLT5zZXRCYXJDaGFyYWN0ZXIoJ+KWkycpOyAKfQoKcmV0dXJuICRwcm9ncmVzc0JhcjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHByb2dyZXNzSXRlcmF0ZShpdGVyYWJsZSAkaXRlcmFibGUsID9pbnQgJG1heCA9IG51bGwpOiBpdGVyYWJsZQp7CnlpZWxkIGZyb20gJHRoaXMtPmNyZWF0ZVByb2dyZXNzQmFyKCktPml0ZXJhdGUoJGl0ZXJhYmxlLCAkbWF4KTsKCiR0aGlzLT5uZXdMaW5lKDIpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYXNrUXVlc3Rpb24oUXVlc3Rpb24gJHF1ZXN0aW9uKQp7CmlmICgkdGhpcy0+aW5wdXQtPmlzSW50ZXJhY3RpdmUoKSkgewokdGhpcy0+YXV0b1ByZXBlbmRCbG9jaygpOwp9CgppZiAoISR0aGlzLT5xdWVzdGlvbkhlbHBlcikgewokdGhpcy0+cXVlc3Rpb25IZWxwZXIgPSBuZXcgU3ltZm9ueVF1ZXN0aW9uSGVscGVyKCk7Cn0KCiRhbnN3ZXIgPSAkdGhpcy0+cXVlc3Rpb25IZWxwZXItPmFzaygkdGhpcy0+aW5wdXQsICR0aGlzLCAkcXVlc3Rpb24pOwoKaWYgKCR0aGlzLT5pbnB1dC0+aXNJbnRlcmFjdGl2ZSgpKSB7CiR0aGlzLT5uZXdMaW5lKCk7CiR0aGlzLT5idWZmZXJlZE91dHB1dC0+d3JpdGUoIlxuIik7Cn0KCnJldHVybiAkYW5zd2VyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGVsbigkbWVzc2FnZXMsIGludCAkdHlwZSA9IHNlbGY6Ok9VVFBVVF9OT1JNQUwpCnsKaWYgKCFpc19pdGVyYWJsZSgkbWVzc2FnZXMpKSB7CiRtZXNzYWdlcyA9IFskbWVzc2FnZXNdOwp9Cgpmb3JlYWNoICgkbWVzc2FnZXMgYXMgJG1lc3NhZ2UpIHsKcGFyZW50Ojp3cml0ZWxuKCRtZXNzYWdlLCAkdHlwZSk7CiR0aGlzLT53cml0ZUJ1ZmZlcigkbWVzc2FnZSwgdHJ1ZSwgJHR5cGUpOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSBmYWxzZSwgaW50ICR0eXBlID0gc2VsZjo6T1VUUFVUX05PUk1BTCkKewppZiAoIWlzX2l0ZXJhYmxlKCRtZXNzYWdlcykpIHsKJG1lc3NhZ2VzID0gWyRtZXNzYWdlc107Cn0KCmZvcmVhY2ggKCRtZXNzYWdlcyBhcyAkbWVzc2FnZSkgewpwYXJlbnQ6OndyaXRlKCRtZXNzYWdlLCAkbmV3bGluZSwgJHR5cGUpOwokdGhpcy0+d3JpdGVCdWZmZXIoJG1lc3NhZ2UsICRuZXdsaW5lLCAkdHlwZSk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIG5ld0xpbmUoaW50ICRjb3VudCA9IDEpCnsKcGFyZW50OjpuZXdMaW5lKCRjb3VudCk7CiR0aGlzLT5idWZmZXJlZE91dHB1dC0+d3JpdGUoc3RyX3JlcGVhdCgiXG4iLCAkY291bnQpKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXJyb3JTdHlsZSgpCnsKcmV0dXJuIG5ldyBzZWxmKCR0aGlzLT5pbnB1dCwgJHRoaXMtPmdldEVycm9yT3V0cHV0KCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY3JlYXRlVGFibGUoKTogVGFibGUKewokb3V0cHV0ID0gJHRoaXMtPm91dHB1dCBpbnN0YW5jZW9mIENvbnNvbGVPdXRwdXRJbnRlcmZhY2UgPyAkdGhpcy0+b3V0cHV0LT5zZWN0aW9uKCkgOiAkdGhpcy0+b3V0cHV0Owokc3R5bGUgPSBjbG9uZSBUYWJsZTo6Z2V0U3R5bGVEZWZpbml0aW9uKCdzeW1mb255LXN0eWxlLWd1aWRlJyk7CiRzdHlsZS0+c2V0Q2VsbEhlYWRlckZvcm1hdCgnPGluZm8+JXM8L2luZm8+Jyk7CgpyZXR1cm4gKG5ldyBUYWJsZSgkb3V0cHV0KSktPnNldFN0eWxlKCRzdHlsZSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0UHJvZ3Jlc3NCYXIoKTogUHJvZ3Jlc3NCYXIKewppZiAoISR0aGlzLT5wcm9ncmVzc0Jhcikgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignVGhlIFByb2dyZXNzQmFyIGlzIG5vdCBzdGFydGVkLicpOwp9CgpyZXR1cm4gJHRoaXMtPnByb2dyZXNzQmFyOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGF1dG9QcmVwZW5kQmxvY2soKTogdm9pZAp7CiRjaGFycyA9IHN1YnN0cihzdHJfcmVwbGFjZShcUEhQX0VPTCwgIlxuIiwgJHRoaXMtPmJ1ZmZlcmVkT3V0cHV0LT5mZXRjaCgpKSwgLTIpOwoKaWYgKCFpc3NldCgkY2hhcnNbMF0pKSB7CiR0aGlzLT5uZXdMaW5lKCk7IAoKcmV0dXJuOwp9CgokdGhpcy0+bmV3TGluZSgyIC0gc3Vic3RyX2NvdW50KCRjaGFycywgIlxuIikpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGF1dG9QcmVwZW5kVGV4dCgpOiB2b2lkCnsKJGZldGNoZWQgPSAkdGhpcy0+YnVmZmVyZWRPdXRwdXQtPmZldGNoKCk7CgppZiAoIXN0cl9lbmRzX3dpdGgoJGZldGNoZWQsICJcbiIpKSB7CiR0aGlzLT5uZXdMaW5lKCk7Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUJ1ZmZlcihzdHJpbmcgJG1lc3NhZ2UsIGJvb2wgJG5ld0xpbmUsIGludCAkdHlwZSk6IHZvaWQKewoKJHRoaXMtPmJ1ZmZlcmVkT3V0cHV0LT53cml0ZSgkbWVzc2FnZSwgJG5ld0xpbmUsICR0eXBlKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVCbG9jayhpdGVyYWJsZSAkbWVzc2FnZXMsID9zdHJpbmcgJHR5cGUgPSBudWxsLCA/c3RyaW5nICRzdHlsZSA9IG51bGwsIHN0cmluZyAkcHJlZml4ID0gJyAnLCBib29sICRwYWRkaW5nID0gZmFsc2UsIGJvb2wgJGVzY2FwZSA9IGZhbHNlKTogYXJyYXkKewokaW5kZW50TGVuZ3RoID0gMDsKJHByZWZpeExlbmd0aCA9IEhlbHBlcjo6d2lkdGgoSGVscGVyOjpyZW1vdmVEZWNvcmF0aW9uKCR0aGlzLT5nZXRGb3JtYXR0ZXIoKSwgJHByZWZpeCkpOwokbGluZXMgPSBbXTsKCmlmIChudWxsICE9PSAkdHlwZSkgewokdHlwZSA9IHNwcmludGYoJ1slc10gJywgJHR5cGUpOwokaW5kZW50TGVuZ3RoID0gXHN0cmxlbigkdHlwZSk7CiRsaW5lSW5kZW50YXRpb24gPSBzdHJfcmVwZWF0KCcgJywgJGluZGVudExlbmd0aCk7Cn0KCgpmb3JlYWNoICgkbWVzc2FnZXMgYXMgJGtleSA9PiAkbWVzc2FnZSkgewppZiAoJGVzY2FwZSkgewokbWVzc2FnZSA9IE91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCRtZXNzYWdlKTsKfQoKJGRlY29yYXRpb25MZW5ndGggPSBIZWxwZXI6OndpZHRoKCRtZXNzYWdlKSAtIEhlbHBlcjo6d2lkdGgoSGVscGVyOjpyZW1vdmVEZWNvcmF0aW9uKCR0aGlzLT5nZXRGb3JtYXR0ZXIoKSwgJG1lc3NhZ2UpKTsKJG1lc3NhZ2VMaW5lTGVuZ3RoID0gbWluKCR0aGlzLT5saW5lTGVuZ3RoIC0gJHByZWZpeExlbmd0aCAtICRpbmRlbnRMZW5ndGggKyAkZGVjb3JhdGlvbkxlbmd0aCwgJHRoaXMtPmxpbmVMZW5ndGgpOwokbWVzc2FnZUxpbmVzID0gZXhwbG9kZShcUEhQX0VPTCwgd29yZHdyYXAoJG1lc3NhZ2UsICRtZXNzYWdlTGluZUxlbmd0aCwgXFBIUF9FT0wsIHRydWUpKTsKZm9yZWFjaCAoJG1lc3NhZ2VMaW5lcyBhcyAkbWVzc2FnZUxpbmUpIHsKJGxpbmVzW10gPSAkbWVzc2FnZUxpbmU7Cn0KCmlmIChcY291bnQoJG1lc3NhZ2VzKSA+IDEgJiYgJGtleSA8IFxjb3VudCgkbWVzc2FnZXMpIC0gMSkgewokbGluZXNbXSA9ICcnOwp9Cn0KCiRmaXJzdExpbmVJbmRleCA9IDA7CmlmICgkcGFkZGluZyAmJiAkdGhpcy0+aXNEZWNvcmF0ZWQoKSkgewokZmlyc3RMaW5lSW5kZXggPSAxOwphcnJheV91bnNoaWZ0KCRsaW5lcywgJycpOwokbGluZXNbXSA9ICcnOwp9Cgpmb3JlYWNoICgkbGluZXMgYXMgJGkgPT4gJiRsaW5lKSB7CmlmIChudWxsICE9PSAkdHlwZSkgewokbGluZSA9ICRmaXJzdExpbmVJbmRleCA9PT0gJGkgPyAkdHlwZS4kbGluZSA6ICRsaW5lSW5kZW50YXRpb24uJGxpbmU7Cn0KCiRsaW5lID0gJHByZWZpeC4kbGluZTsKJGxpbmUgLj0gc3RyX3JlcGVhdCgnICcsIG1heCgkdGhpcy0+bGluZUxlbmd0aCAtIEhlbHBlcjo6d2lkdGgoSGVscGVyOjpyZW1vdmVEZWNvcmF0aW9uKCR0aGlzLT5nZXRGb3JtYXR0ZXIoKSwgJGxpbmUpKSwgMCkpOwoKaWYgKCRzdHlsZSkgewokbGluZSA9IHNwcmludGYoJzwlcz4lczwvPicsICRzdHlsZSwgJGxpbmUpOwp9Cn0KCnJldHVybiAkbGluZXM7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGU7CgpjbGFzcyBUZXJtaW5hbAp7CnByaXZhdGUgc3RhdGljICR3aWR0aDsKcHJpdmF0ZSBzdGF0aWMgJGhlaWdodDsKcHJpdmF0ZSBzdGF0aWMgJHN0dHk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRXaWR0aCgpCnsKJHdpZHRoID0gZ2V0ZW52KCdDT0xVTU5TJyk7CmlmIChmYWxzZSAhPT0gJHdpZHRoKSB7CnJldHVybiAoaW50KSB0cmltKCR3aWR0aCk7Cn0KCmlmIChudWxsID09PSBzZWxmOjokd2lkdGgpIHsKc2VsZjo6aW5pdERpbWVuc2lvbnMoKTsKfQoKcmV0dXJuIHNlbGY6OiR3aWR0aCA/OiA4MDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SGVpZ2h0KCkKewokaGVpZ2h0ID0gZ2V0ZW52KCdMSU5FUycpOwppZiAoZmFsc2UgIT09ICRoZWlnaHQpIHsKcmV0dXJuIChpbnQpIHRyaW0oJGhlaWdodCk7Cn0KCmlmIChudWxsID09PSBzZWxmOjokaGVpZ2h0KSB7CnNlbGY6OmluaXREaW1lbnNpb25zKCk7Cn0KCnJldHVybiBzZWxmOjokaGVpZ2h0ID86IDUwOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGhhc1N0dHlBdmFpbGFibGUoKTogYm9vbAp7CmlmIChudWxsICE9PSBzZWxmOjokc3R0eSkgewpyZXR1cm4gc2VsZjo6JHN0dHk7Cn0KCgppZiAoIVxmdW5jdGlvbl9leGlzdHMoJ3NoZWxsX2V4ZWMnKSkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiBzZWxmOjokc3R0eSA9IChib29sKSBzaGVsbF9leGVjKCdzdHR5IDI+ICcuKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SID8gJ05VTCcgOiAnL2Rldi9udWxsJykpOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpbml0RGltZW5zaW9ucygpCnsKaWYgKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SKSB7CiRhbnNpY29uID0gZ2V0ZW52KCdBTlNJQ09OJyk7CmlmIChmYWxzZSAhPT0gJGFuc2ljb24gJiYgcHJlZ19tYXRjaCgnL14oXGQrKXgoXGQrKSg/OiBcKChcZCspeChcZCspXCkpPyQvJywgdHJpbSgkYW5zaWNvbiksICRtYXRjaGVzKSkgewoKCnNlbGY6OiR3aWR0aCA9IChpbnQpICRtYXRjaGVzWzFdOwpzZWxmOjokaGVpZ2h0ID0gaXNzZXQoJG1hdGNoZXNbNF0pID8gKGludCkgJG1hdGNoZXNbNF0gOiAoaW50KSAkbWF0Y2hlc1syXTsKfSBlbHNlaWYgKCFzZWxmOjpoYXNWdDEwMFN1cHBvcnQoKSAmJiBzZWxmOjpoYXNTdHR5QXZhaWxhYmxlKCkpIHsKCgpzZWxmOjppbml0RGltZW5zaW9uc1VzaW5nU3R0eSgpOwp9IGVsc2VpZiAobnVsbCAhPT0gJGRpbWVuc2lvbnMgPSBzZWxmOjpnZXRDb25zb2xlTW9kZSgpKSB7CgpzZWxmOjokd2lkdGggPSAoaW50KSAkZGltZW5zaW9uc1swXTsKc2VsZjo6JGhlaWdodCA9IChpbnQpICRkaW1lbnNpb25zWzFdOwp9Cn0gZWxzZSB7CnNlbGY6OmluaXREaW1lbnNpb25zVXNpbmdTdHR5KCk7Cn0KfQoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaGFzVnQxMDBTdXBwb3J0KCk6IGJvb2wKewpyZXR1cm4gXGZ1bmN0aW9uX2V4aXN0cygnc2FwaV93aW5kb3dzX3Z0MTAwX3N1cHBvcnQnKSAmJiBzYXBpX3dpbmRvd3NfdnQxMDBfc3VwcG9ydChmb3BlbigncGhwOi8vc3Rkb3V0JywgJ3cnKSk7Cn0KCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGluaXREaW1lbnNpb25zVXNpbmdTdHR5KCkKewppZiAoJHN0dHlTdHJpbmcgPSBzZWxmOjpnZXRTdHR5Q29sdW1ucygpKSB7CmlmIChwcmVnX21hdGNoKCcvcm93cy4oXGQrKTsuY29sdW1ucy4oXGQrKTsvaScsICRzdHR5U3RyaW5nLCAkbWF0Y2hlcykpIHsKCnNlbGY6OiR3aWR0aCA9IChpbnQpICRtYXRjaGVzWzJdOwpzZWxmOjokaGVpZ2h0ID0gKGludCkgJG1hdGNoZXNbMV07Cn0gZWxzZWlmIChwcmVnX21hdGNoKCcvOy4oXGQrKS5yb3dzOy4oXGQrKS5jb2x1bW5zL2knLCAkc3R0eVN0cmluZywgJG1hdGNoZXMpKSB7CgpzZWxmOjokd2lkdGggPSAoaW50KSAkbWF0Y2hlc1syXTsKc2VsZjo6JGhlaWdodCA9IChpbnQpICRtYXRjaGVzWzFdOwp9Cn0KfQoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRDb25zb2xlTW9kZSgpOiA/YXJyYXkKewokaW5mbyA9IHNlbGY6OnJlYWRGcm9tUHJvY2VzcygnbW9kZSBDT04nKTsKCmlmIChudWxsID09PSAkaW5mbyB8fCAhcHJlZ19tYXRjaCgnLy0tLS0tLS0tK1xyP1xuLis/KFxkKylccj9cbi4rPyhcZCspXHI/XG4vJywgJGluZm8sICRtYXRjaGVzKSkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuIFsoaW50KSAkbWF0Y2hlc1syXSwgKGludCkgJG1hdGNoZXNbMV1dOwp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRTdHR5Q29sdW1ucygpOiA/c3RyaW5nCnsKcmV0dXJuIHNlbGY6OnJlYWRGcm9tUHJvY2Vzcygnc3R0eSAtYSB8IGdyZXAgY29sdW1ucycpOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiByZWFkRnJvbVByb2Nlc3Moc3RyaW5nICRjb21tYW5kKTogP3N0cmluZwp7CmlmICghXGZ1bmN0aW9uX2V4aXN0cygncHJvY19vcGVuJykpIHsKcmV0dXJuIG51bGw7Cn0KCiRkZXNjcmlwdG9yc3BlYyA9IFsKMSA9PiBbJ3BpcGUnLCAndyddLAoyID0+IFsncGlwZScsICd3J10sCl07CgokY3AgPSBcZnVuY3Rpb25fZXhpc3RzKCdzYXBpX3dpbmRvd3NfY3Bfc2V0JykgPyBzYXBpX3dpbmRvd3NfY3BfZ2V0KCkgOiAwOwoKaWYgKCEkcHJvY2VzcyA9IEBwcm9jX29wZW4oJGNvbW1hbmQsICRkZXNjcmlwdG9yc3BlYywgJHBpcGVzLCBudWxsLCBudWxsLCBbJ3N1cHByZXNzX2Vycm9ycycgPT4gdHJ1ZV0pKSB7CnJldHVybiBudWxsOwp9CgokaW5mbyA9IHN0cmVhbV9nZXRfY29udGVudHMoJHBpcGVzWzFdKTsKZmNsb3NlKCRwaXBlc1sxXSk7CmZjbG9zZSgkcGlwZXNbMl0pOwpwcm9jX2Nsb3NlKCRwcm9jZXNzKTsKCmlmICgkY3ApIHsKc2FwaV93aW5kb3dzX2NwX3NldCgkY3ApOwp9CgpyZXR1cm4gJGluZm87Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcVGVzdGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQXBwbGljYXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XEFycmF5SW5wdXQ7CgoKCgoKCgoKCgoKY2xhc3MgQXBwbGljYXRpb25UZXN0ZXIKewp1c2UgVGVzdGVyVHJhaXQ7Cgpwcml2YXRlICRhcHBsaWNhdGlvbjsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChBcHBsaWNhdGlvbiAkYXBwbGljYXRpb24pCnsKJHRoaXMtPmFwcGxpY2F0aW9uID0gJGFwcGxpY2F0aW9uOwp9CgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcnVuKGFycmF5ICRpbnB1dCwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokcHJldlNoZWxsVmVyYm9zaXR5ID0gZ2V0ZW52KCdTSEVMTF9WRVJCT1NJVFknKTsKCnRyeSB7CiR0aGlzLT5pbnB1dCA9IG5ldyBBcnJheUlucHV0KCRpbnB1dCk7CmlmIChpc3NldCgkb3B0aW9uc1snaW50ZXJhY3RpdmUnXSkpIHsKJHRoaXMtPmlucHV0LT5zZXRJbnRlcmFjdGl2ZSgkb3B0aW9uc1snaW50ZXJhY3RpdmUnXSk7Cn0KCmlmICgkdGhpcy0+aW5wdXRzKSB7CiR0aGlzLT5pbnB1dC0+c2V0U3RyZWFtKHNlbGY6OmNyZWF0ZVN0cmVhbSgkdGhpcy0+aW5wdXRzKSk7Cn0KCiR0aGlzLT5pbml0T3V0cHV0KCRvcHRpb25zKTsKCnJldHVybiAkdGhpcy0+c3RhdHVzQ29kZSA9ICR0aGlzLT5hcHBsaWNhdGlvbi0+cnVuKCR0aGlzLT5pbnB1dCwgJHRoaXMtPm91dHB1dCk7Cn0gZmluYWxseSB7CgoKaWYgKGZhbHNlID09PSAkcHJldlNoZWxsVmVyYm9zaXR5KSB7CmlmIChcZnVuY3Rpb25fZXhpc3RzKCdwdXRlbnYnKSkgewpAcHV0ZW52KCdTSEVMTF9WRVJCT1NJVFknKTsKfQp1bnNldCgkX0VOVlsnU0hFTExfVkVSQk9TSVRZJ10pOwp1bnNldCgkX1NFUlZFUlsnU0hFTExfVkVSQk9TSVRZJ10pOwp9IGVsc2UgewppZiAoXGZ1bmN0aW9uX2V4aXN0cygncHV0ZW52JykpIHsKQHB1dGVudignU0hFTExfVkVSQk9TSVRZPScuJHByZXZTaGVsbFZlcmJvc2l0eSk7Cn0KJF9FTlZbJ1NIRUxMX1ZFUkJPU0lUWSddID0gJHByZXZTaGVsbFZlcmJvc2l0eTsKJF9TRVJWRVJbJ1NIRUxMX1ZFUkJPU0lUWSddID0gJHByZXZTaGVsbFZlcmJvc2l0eTsKfQp9Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcVGVzdGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25JbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uU3VnZ2VzdGlvbnM7CgoKCgoKCmNsYXNzIENvbW1hbmRDb21wbGV0aW9uVGVzdGVyCnsKcHJpdmF0ZSAkY29tbWFuZDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChDb21tYW5kICRjb21tYW5kKQp7CiR0aGlzLT5jb21tYW5kID0gJGNvbW1hbmQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb21wbGV0ZShhcnJheSAkaW5wdXQpOiBhcnJheQp7CiRjdXJyZW50SW5kZXggPSBcY291bnQoJGlucHV0KTsKaWYgKCcnID09PSBlbmQoJGlucHV0KSkgewphcnJheV9wb3AoJGlucHV0KTsKfQphcnJheV91bnNoaWZ0KCRpbnB1dCwgJHRoaXMtPmNvbW1hbmQtPmdldE5hbWUoKSk7CgokY29tcGxldGlvbklucHV0ID0gQ29tcGxldGlvbklucHV0Ojpmcm9tVG9rZW5zKCRpbnB1dCwgJGN1cnJlbnRJbmRleCk7CiRjb21wbGV0aW9uSW5wdXQtPmJpbmQoJHRoaXMtPmNvbW1hbmQtPmdldERlZmluaXRpb24oKSk7CiRzdWdnZXN0aW9ucyA9IG5ldyBDb21wbGV0aW9uU3VnZ2VzdGlvbnMoKTsKCiR0aGlzLT5jb21tYW5kLT5jb21wbGV0ZSgkY29tcGxldGlvbklucHV0LCAkc3VnZ2VzdGlvbnMpOwoKJG9wdGlvbnMgPSBbXTsKZm9yZWFjaCAoJHN1Z2dlc3Rpb25zLT5nZXRPcHRpb25TdWdnZXN0aW9ucygpIGFzICRvcHRpb24pIHsKJG9wdGlvbnNbXSA9ICctLScuJG9wdGlvbi0+Z2V0TmFtZSgpOwp9CgpyZXR1cm4gYXJyYXlfbWFwKCdzdHJ2YWwnLCBhcnJheV9tZXJnZSgkb3B0aW9ucywgJHN1Z2dlc3Rpb25zLT5nZXRWYWx1ZVN1Z2dlc3Rpb25zKCkpKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxUZXN0ZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXENvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XEFycmF5SW5wdXQ7CgoKCgoKCgpjbGFzcyBDb21tYW5kVGVzdGVyCnsKdXNlIFRlc3RlclRyYWl0OwoKcHJpdmF0ZSAkY29tbWFuZDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChDb21tYW5kICRjb21tYW5kKQp7CiR0aGlzLT5jb21tYW5kID0gJGNvbW1hbmQ7Cn0KCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBleGVjdXRlKGFycmF5ICRpbnB1dCwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewoKCmlmICghaXNzZXQoJGlucHV0Wydjb21tYW5kJ10pCiYmIChudWxsICE9PSAkYXBwbGljYXRpb24gPSAkdGhpcy0+Y29tbWFuZC0+Z2V0QXBwbGljYXRpb24oKSkKJiYgJGFwcGxpY2F0aW9uLT5nZXREZWZpbml0aW9uKCktPmhhc0FyZ3VtZW50KCdjb21tYW5kJykKKSB7CiRpbnB1dCA9IGFycmF5X21lcmdlKFsnY29tbWFuZCcgPT4gJHRoaXMtPmNvbW1hbmQtPmdldE5hbWUoKV0sICRpbnB1dCk7Cn0KCiR0aGlzLT5pbnB1dCA9IG5ldyBBcnJheUlucHV0KCRpbnB1dCk7CgokdGhpcy0+aW5wdXQtPnNldFN0cmVhbShzZWxmOjpjcmVhdGVTdHJlYW0oJHRoaXMtPmlucHV0cykpOwoKaWYgKGlzc2V0KCRvcHRpb25zWydpbnRlcmFjdGl2ZSddKSkgewokdGhpcy0+aW5wdXQtPnNldEludGVyYWN0aXZlKCRvcHRpb25zWydpbnRlcmFjdGl2ZSddKTsKfQoKaWYgKCFpc3NldCgkb3B0aW9uc1snZGVjb3JhdGVkJ10pKSB7CiRvcHRpb25zWydkZWNvcmF0ZWQnXSA9IGZhbHNlOwp9CgokdGhpcy0+aW5pdE91dHB1dCgkb3B0aW9ucyk7CgpyZXR1cm4gJHRoaXMtPnN0YXR1c0NvZGUgPSAkdGhpcy0+Y29tbWFuZC0+cnVuKCR0aGlzLT5pbnB1dCwgJHRoaXMtPm91dHB1dCk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcVGVzdGVyXENvbnN0cmFpbnQ7Cgp1c2UgUEhQVW5pdFxGcmFtZXdvcmtcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXENvbW1hbmQ7CgpmaW5hbCBjbGFzcyBDb21tYW5kSXNTdWNjZXNzZnVsIGV4dGVuZHMgQ29uc3RyYWludAp7CgoKCnB1YmxpYyBmdW5jdGlvbiB0b1N0cmluZygpOiBzdHJpbmcKewpyZXR1cm4gJ2lzIHN1Y2Nlc3NmdWwnOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gbWF0Y2hlcygkb3RoZXIpOiBib29sCnsKcmV0dXJuIENvbW1hbmQ6OlNVQ0NFU1MgPT09ICRvdGhlcjsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGZhaWx1cmVEZXNjcmlwdGlvbigkb3RoZXIpOiBzdHJpbmcKewpyZXR1cm4gJ3RoZSBjb21tYW5kICcuJHRoaXMtPnRvU3RyaW5nKCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBhZGRpdGlvbmFsRmFpbHVyZURlc2NyaXB0aW9uKCRvdGhlcik6IHN0cmluZwp7CiRtYXBwaW5nID0gWwpDb21tYW5kOjpGQUlMVVJFID0+ICdDb21tYW5kIGZhaWxlZC4nLApDb21tYW5kOjpJTlZBTElEID0+ICdDb21tYW5kIHdhcyBpbnZhbGlkLicsCl07CgpyZXR1cm4gJG1hcHBpbmdbJG90aGVyXSA/PyBzcHJpbnRmKCdDb21tYW5kIHJldHVybmVkIGV4aXQgc3RhdHVzICVkLicsICRvdGhlcik7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcVGVzdGVyOwoKdXNlIFBIUFVuaXRcRnJhbWV3b3JrXEFzc2VydDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxDb25zb2xlT3V0cHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcU3RyZWFtT3V0cHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxUZXN0ZXJcQ29uc3RyYWludFxDb21tYW5kSXNTdWNjZXNzZnVsOwoKCgoKdHJhaXQgVGVzdGVyVHJhaXQKewoKcHJpdmF0ZSAkb3V0cHV0Owpwcml2YXRlICRpbnB1dHMgPSBbXTsKcHJpdmF0ZSAkY2FwdHVyZVN0cmVhbXNJbmRlcGVuZGVudGx5ID0gZmFsc2U7Cgpwcml2YXRlICRpbnB1dDsKCnByaXZhdGUgJHN0YXR1c0NvZGU7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3BsYXkoYm9vbCAkbm9ybWFsaXplID0gZmFsc2UpCnsKaWYgKG51bGwgPT09ICR0aGlzLT5vdXRwdXQpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdPdXRwdXQgbm90IGluaXRpYWxpemVkLCBkaWQgeW91IGV4ZWN1dGUgdGhlIGNvbW1hbmQgYmVmb3JlIHJlcXVlc3RpbmcgdGhlIGRpc3BsYXk/Jyk7Cn0KCnJld2luZCgkdGhpcy0+b3V0cHV0LT5nZXRTdHJlYW0oKSk7CgokZGlzcGxheSA9IHN0cmVhbV9nZXRfY29udGVudHMoJHRoaXMtPm91dHB1dC0+Z2V0U3RyZWFtKCkpOwoKaWYgKCRub3JtYWxpemUpIHsKJGRpc3BsYXkgPSBzdHJfcmVwbGFjZShcUEhQX0VPTCwgIlxuIiwgJGRpc3BsYXkpOwp9CgpyZXR1cm4gJGRpc3BsYXk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXJyb3JPdXRwdXQoYm9vbCAkbm9ybWFsaXplID0gZmFsc2UpCnsKaWYgKCEkdGhpcy0+Y2FwdHVyZVN0cmVhbXNJbmRlcGVuZGVudGx5KSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ1RoZSBlcnJvciBvdXRwdXQgaXMgbm90IGF2YWlsYWJsZSB3aGVuIHRoZSB0ZXN0ZXIgaXMgcnVuIHdpdGhvdXQgImNhcHR1cmVfc3RkZXJyX3NlcGFyYXRlbHkiIG9wdGlvbiBzZXQuJyk7Cn0KCnJld2luZCgkdGhpcy0+b3V0cHV0LT5nZXRFcnJvck91dHB1dCgpLT5nZXRTdHJlYW0oKSk7CgokZGlzcGxheSA9IHN0cmVhbV9nZXRfY29udGVudHMoJHRoaXMtPm91dHB1dC0+Z2V0RXJyb3JPdXRwdXQoKS0+Z2V0U3RyZWFtKCkpOwoKaWYgKCRub3JtYWxpemUpIHsKJGRpc3BsYXkgPSBzdHJfcmVwbGFjZShcUEhQX0VPTCwgIlxuIiwgJGRpc3BsYXkpOwp9CgpyZXR1cm4gJGRpc3BsYXk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldElucHV0KCkKewpyZXR1cm4gJHRoaXMtPmlucHV0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPdXRwdXQoKQp7CnJldHVybiAkdGhpcy0+b3V0cHV0Owp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0YXR1c0NvZGUoKQp7CmlmIChudWxsID09PSAkdGhpcy0+c3RhdHVzQ29kZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1N0YXR1cyBjb2RlIG5vdCBpbml0aWFsaXplZCwgZGlkIHlvdSBleGVjdXRlIHRoZSBjb21tYW5kIGJlZm9yZSByZXF1ZXN0aW5nIHRoZSBzdGF0dXMgY29kZT8nKTsKfQoKcmV0dXJuICR0aGlzLT5zdGF0dXNDb2RlOwp9CgpwdWJsaWMgZnVuY3Rpb24gYXNzZXJ0Q29tbWFuZElzU3VjY2Vzc2Z1bChzdHJpbmcgJG1lc3NhZ2UgPSAnJyk6IHZvaWQKewpBc3NlcnQ6OmFzc2VydFRoYXQoJHRoaXMtPnN0YXR1c0NvZGUsIG5ldyBDb21tYW5kSXNTdWNjZXNzZnVsKCksICRtZXNzYWdlKTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SW5wdXRzKGFycmF5ICRpbnB1dHMpCnsKJHRoaXMtPmlucHV0cyA9ICRpbnB1dHM7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gaW5pdE91dHB1dChhcnJheSAkb3B0aW9ucykKewokdGhpcy0+Y2FwdHVyZVN0cmVhbXNJbmRlcGVuZGVudGx5ID0gXGFycmF5X2tleV9leGlzdHMoJ2NhcHR1cmVfc3RkZXJyX3NlcGFyYXRlbHknLCAkb3B0aW9ucykgJiYgJG9wdGlvbnNbJ2NhcHR1cmVfc3RkZXJyX3NlcGFyYXRlbHknXTsKaWYgKCEkdGhpcy0+Y2FwdHVyZVN0cmVhbXNJbmRlcGVuZGVudGx5KSB7CiR0aGlzLT5vdXRwdXQgPSBuZXcgU3RyZWFtT3V0cHV0KGZvcGVuKCdwaHA6Ly9tZW1vcnknLCAndycsIGZhbHNlKSk7CmlmIChpc3NldCgkb3B0aW9uc1snZGVjb3JhdGVkJ10pKSB7CiR0aGlzLT5vdXRwdXQtPnNldERlY29yYXRlZCgkb3B0aW9uc1snZGVjb3JhdGVkJ10pOwp9CmlmIChpc3NldCgkb3B0aW9uc1sndmVyYm9zaXR5J10pKSB7CiR0aGlzLT5vdXRwdXQtPnNldFZlcmJvc2l0eSgkb3B0aW9uc1sndmVyYm9zaXR5J10pOwp9Cn0gZWxzZSB7CiR0aGlzLT5vdXRwdXQgPSBuZXcgQ29uc29sZU91dHB1dCgKJG9wdGlvbnNbJ3ZlcmJvc2l0eSddID8/IENvbnNvbGVPdXRwdXQ6OlZFUkJPU0lUWV9OT1JNQUwsCiRvcHRpb25zWydkZWNvcmF0ZWQnXSA/PyBudWxsCik7CgokZXJyb3JPdXRwdXQgPSBuZXcgU3RyZWFtT3V0cHV0KGZvcGVuKCdwaHA6Ly9tZW1vcnknLCAndycsIGZhbHNlKSk7CiRlcnJvck91dHB1dC0+c2V0Rm9ybWF0dGVyKCR0aGlzLT5vdXRwdXQtPmdldEZvcm1hdHRlcigpKTsKJGVycm9yT3V0cHV0LT5zZXRWZXJib3NpdHkoJHRoaXMtPm91dHB1dC0+Z2V0VmVyYm9zaXR5KCkpOwokZXJyb3JPdXRwdXQtPnNldERlY29yYXRlZCgkdGhpcy0+b3V0cHV0LT5pc0RlY29yYXRlZCgpKTsKCiRyZWZsZWN0ZWRPdXRwdXQgPSBuZXcgXFJlZmxlY3Rpb25PYmplY3QoJHRoaXMtPm91dHB1dCk7CiRzdHJFcnJQcm9wZXJ0eSA9ICRyZWZsZWN0ZWRPdXRwdXQtPmdldFByb3BlcnR5KCdzdGRlcnInKTsKJHN0ckVyclByb3BlcnR5LT5zZXRBY2Nlc3NpYmxlKHRydWUpOwokc3RyRXJyUHJvcGVydHktPnNldFZhbHVlKCR0aGlzLT5vdXRwdXQsICRlcnJvck91dHB1dCk7CgokcmVmbGVjdGVkUGFyZW50ID0gJHJlZmxlY3RlZE91dHB1dC0+Z2V0UGFyZW50Q2xhc3MoKTsKJHN0cmVhbVByb3BlcnR5ID0gJHJlZmxlY3RlZFBhcmVudC0+Z2V0UHJvcGVydHkoJ3N0cmVhbScpOwokc3RyZWFtUHJvcGVydHktPnNldEFjY2Vzc2libGUodHJ1ZSk7CiRzdHJlYW1Qcm9wZXJ0eS0+c2V0VmFsdWUoJHRoaXMtPm91dHB1dCwgZm9wZW4oJ3BocDovL21lbW9yeScsICd3JywgZmFsc2UpKTsKfQp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVTdHJlYW0oYXJyYXkgJGlucHV0cykKewokc3RyZWFtID0gZm9wZW4oJ3BocDovL21lbW9yeScsICdyKycsIGZhbHNlKTsKCmZvcmVhY2ggKCRpbnB1dHMgYXMgJGlucHV0KSB7CmZ3cml0ZSgkc3RyZWFtLCAkaW5wdXQuXFBIUF9FT0wpOwp9CgpyZXdpbmQoJHN0cmVhbSk7CgpyZXR1cm4gJHN0cmVhbTsKfQp9CgpDb3B5cmlnaHQgKGMpIDIwMjAtcHJlc2VudCBGYWJpZW4gUG90ZW5jaWVyCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCnRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKPD9waHAKCgoKCgoKCgoKCmlmICghZnVuY3Rpb25fZXhpc3RzKCd0cmlnZ2VyX2RlcHJlY2F0aW9uJykpIHsKCgoKCgoKCgoKCmZ1bmN0aW9uIHRyaWdnZXJfZGVwcmVjYXRpb24oc3RyaW5nICRwYWNrYWdlLCBzdHJpbmcgJHZlcnNpb24sIHN0cmluZyAkbWVzc2FnZSwgLi4uJGFyZ3MpOiB2b2lkCnsKQHRyaWdnZXJfZXJyb3IoKCRwYWNrYWdlIHx8ICR2ZXJzaW9uID8gIlNpbmNlICRwYWNrYWdlICR2ZXJzaW9uOiAiIDogJycpLigkYXJncyA/IHZzcHJpbnRmKCRtZXNzYWdlLCAkYXJncykgOiAkbWVzc2FnZSksIFxFX1VTRVJfREVQUkVDQVRFRCk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbGVzeXN0ZW1cRXhjZXB0aW9uOwoKCgoKCgppbnRlcmZhY2UgRXhjZXB0aW9uSW50ZXJmYWNlIGV4dGVuZHMgXFRocm93YWJsZQp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaWxlc3lzdGVtXEV4Y2VwdGlvbjsKCgoKCgoKCmNsYXNzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uCnsKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9zdHJpbmcgJG1lc3NhZ2UgPSBudWxsLCBpbnQgJGNvZGUgPSAwLCA/XFRocm93YWJsZSAkcHJldmlvdXMgPSBudWxsLCA/c3RyaW5nICRwYXRoID0gbnVsbCkKewppZiAobnVsbCA9PT0gJG1lc3NhZ2UpIHsKaWYgKG51bGwgPT09ICRwYXRoKSB7CiRtZXNzYWdlID0gJ0ZpbGUgY291bGQgbm90IGJlIGZvdW5kLic7Cn0gZWxzZSB7CiRtZXNzYWdlID0gc3ByaW50ZignRmlsZSAiJXMiIGNvdWxkIG5vdCBiZSBmb3VuZC4nLCAkcGF0aCk7Cn0KfQoKcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUsICRwcmV2aW91cywgJHBhdGgpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaWxlc3lzdGVtXEV4Y2VwdGlvbjsKCgoKCgoKCgpjbGFzcyBJT0V4Y2VwdGlvbiBleHRlbmRzIFxSdW50aW1lRXhjZXB0aW9uIGltcGxlbWVudHMgSU9FeGNlcHRpb25JbnRlcmZhY2UKewpwcml2YXRlICRwYXRoOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbWVzc2FnZSwgaW50ICRjb2RlID0gMCwgP1xUaHJvd2FibGUgJHByZXZpb3VzID0gbnVsbCwgP3N0cmluZyAkcGF0aCA9IG51bGwpCnsKJHRoaXMtPnBhdGggPSAkcGF0aDsKCnBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRjb2RlLCAkcHJldmlvdXMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGF0aCgpCnsKcmV0dXJuICR0aGlzLT5wYXRoOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaWxlc3lzdGVtXEV4Y2VwdGlvbjsKCgoKCgoKaW50ZXJmYWNlIElPRXhjZXB0aW9uSW50ZXJmYWNlIGV4dGVuZHMgRXhjZXB0aW9uSW50ZXJmYWNlCnsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGF0aCgpOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmlsZXN5c3RlbVxFeGNlcHRpb247CgoKCgpjbGFzcyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uSW50ZXJmYWNlCnsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbGVzeXN0ZW1cRXhjZXB0aW9uOwoKCgoKY2xhc3MgUnVudGltZUV4Y2VwdGlvbiBleHRlbmRzIFxSdW50aW1lRXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uSW50ZXJmYWNlCnsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbGVzeXN0ZW07Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmlsZXN5c3RlbVxFeGNlcHRpb25cRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmlsZXN5c3RlbVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmlsZXN5c3RlbVxFeGNlcHRpb25cSU9FeGNlcHRpb247CgoKCgoKCmNsYXNzIEZpbGVzeXN0ZW0Kewpwcml2YXRlIHN0YXRpYyAkbGFzdEVycm9yOwoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb3B5KHN0cmluZyAkb3JpZ2luRmlsZSwgc3RyaW5nICR0YXJnZXRGaWxlLCBib29sICRvdmVyd3JpdGVOZXdlckZpbGVzID0gZmFsc2UpCnsKJG9yaWdpbklzTG9jYWwgPSBzdHJlYW1faXNfbG9jYWwoJG9yaWdpbkZpbGUpIHx8IDAgPT09IHN0cmlwb3MoJG9yaWdpbkZpbGUsICdmaWxlOi8vJyk7CmlmICgkb3JpZ2luSXNMb2NhbCAmJiAhaXNfZmlsZSgkb3JpZ2luRmlsZSkpIHsKdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihzcHJpbnRmKCdGYWlsZWQgdG8gY29weSAiJXMiIGJlY2F1c2UgZmlsZSBkb2VzIG5vdCBleGlzdC4nLCAkb3JpZ2luRmlsZSksIDAsIG51bGwsICRvcmlnaW5GaWxlKTsKfQoKJHRoaXMtPm1rZGlyKFxkaXJuYW1lKCR0YXJnZXRGaWxlKSk7CgokZG9Db3B5ID0gdHJ1ZTsKaWYgKCEkb3ZlcndyaXRlTmV3ZXJGaWxlcyAmJiAhcGFyc2VfdXJsKCRvcmlnaW5GaWxlLCBcUEhQX1VSTF9IT1NUKSAmJiBpc19maWxlKCR0YXJnZXRGaWxlKSkgewokZG9Db3B5ID0gZmlsZW10aW1lKCRvcmlnaW5GaWxlKSA+IGZpbGVtdGltZSgkdGFyZ2V0RmlsZSk7Cn0KCmlmICgkZG9Db3B5KSB7CgppZiAoISRzb3VyY2UgPSBzZWxmOjpib3goJ2ZvcGVuJywgJG9yaWdpbkZpbGUsICdyJykpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byBjb3B5ICIlcyIgdG8gIiVzIiBiZWNhdXNlIHNvdXJjZSBmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQgZm9yIHJlYWRpbmc6ICcsICRvcmlnaW5GaWxlLCAkdGFyZ2V0RmlsZSkuc2VsZjo6JGxhc3RFcnJvciwgMCwgbnVsbCwgJG9yaWdpbkZpbGUpOwp9CgoKaWYgKCEkdGFyZ2V0ID0gc2VsZjo6Ym94KCdmb3BlbicsICR0YXJnZXRGaWxlLCAndycsIGZhbHNlLCBzdHJlYW1fY29udGV4dF9jcmVhdGUoWydmdHAnID0+IFsnb3ZlcndyaXRlJyA9PiB0cnVlXV0pKSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIGNvcHkgIiVzIiB0byAiJXMiIGJlY2F1c2UgdGFyZ2V0IGZpbGUgY291bGQgbm90IGJlIG9wZW5lZCBmb3Igd3JpdGluZzogJywgJG9yaWdpbkZpbGUsICR0YXJnZXRGaWxlKS5zZWxmOjokbGFzdEVycm9yLCAwLCBudWxsLCAkb3JpZ2luRmlsZSk7Cn0KCiRieXRlc0NvcGllZCA9IHN0cmVhbV9jb3B5X3RvX3N0cmVhbSgkc291cmNlLCAkdGFyZ2V0KTsKZmNsb3NlKCRzb3VyY2UpOwpmY2xvc2UoJHRhcmdldCk7CnVuc2V0KCRzb3VyY2UsICR0YXJnZXQpOwoKaWYgKCFpc19maWxlKCR0YXJnZXRGaWxlKSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIGNvcHkgIiVzIiB0byAiJXMiLicsICRvcmlnaW5GaWxlLCAkdGFyZ2V0RmlsZSksIDAsIG51bGwsICRvcmlnaW5GaWxlKTsKfQoKaWYgKCRvcmlnaW5Jc0xvY2FsKSB7CgpzZWxmOjpib3goJ2NobW9kJywgJHRhcmdldEZpbGUsIGZpbGVwZXJtcygkdGFyZ2V0RmlsZSkgfCAoZmlsZXBlcm1zKCRvcmlnaW5GaWxlKSAmIDAxMTEpKTsKCgpzZWxmOjpib3goJ3RvdWNoJywgJHRhcmdldEZpbGUsIGZpbGVtdGltZSgkb3JpZ2luRmlsZSkpOwoKaWYgKCRieXRlc0NvcGllZCAhPT0gJGJ5dGVzT3JpZ2luID0gZmlsZXNpemUoJG9yaWdpbkZpbGUpKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdGYWlsZWQgdG8gY29weSB0aGUgd2hvbGUgY29udGVudCBvZiAiJXMiIHRvICIlcyIgKCVnIG9mICVnIGJ5dGVzIGNvcGllZCkuJywgJG9yaWdpbkZpbGUsICR0YXJnZXRGaWxlLCAkYnl0ZXNDb3BpZWQsICRieXRlc09yaWdpbiksIDAsIG51bGwsICRvcmlnaW5GaWxlKTsKfQp9Cn0KfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBta2RpcigkZGlycywgaW50ICRtb2RlID0gMDc3NykKewpmb3JlYWNoICgkdGhpcy0+dG9JdGVyYWJsZSgkZGlycykgYXMgJGRpcikgewppZiAoaXNfZGlyKCRkaXIpKSB7CmNvbnRpbnVlOwp9CgppZiAoIXNlbGY6OmJveCgnbWtkaXInLCAkZGlyLCAkbW9kZSwgdHJ1ZSkgJiYgIWlzX2RpcigkZGlyKSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIGNyZWF0ZSAiJXMiOiAnLCAkZGlyKS5zZWxmOjokbGFzdEVycm9yLCAwLCBudWxsLCAkZGlyKTsKfQp9Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXhpc3RzKCRmaWxlcykKewokbWF4UGF0aExlbmd0aCA9IFxQSFBfTUFYUEFUSExFTiAtIDI7Cgpmb3JlYWNoICgkdGhpcy0+dG9JdGVyYWJsZSgkZmlsZXMpIGFzICRmaWxlKSB7CmlmIChcc3RybGVuKCRmaWxlKSA+ICRtYXhQYXRoTGVuZ3RoKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdDb3VsZCBub3QgY2hlY2sgaWYgZmlsZSBleGlzdCBiZWNhdXNlIHBhdGggbGVuZ3RoIGV4Y2VlZHMgJWQgY2hhcmFjdGVycy4nLCAkbWF4UGF0aExlbmd0aCksIDAsIG51bGwsICRmaWxlKTsKfQoKaWYgKCFmaWxlX2V4aXN0cygkZmlsZSkpIHsKcmV0dXJuIGZhbHNlOwp9Cn0KCnJldHVybiB0cnVlOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdG91Y2goJGZpbGVzLCA/aW50ICR0aW1lID0gbnVsbCwgP2ludCAkYXRpbWUgPSBudWxsKQp7CmZvcmVhY2ggKCR0aGlzLT50b0l0ZXJhYmxlKCRmaWxlcykgYXMgJGZpbGUpIHsKaWYgKCEoJHRpbWUgPyBzZWxmOjpib3goJ3RvdWNoJywgJGZpbGUsICR0aW1lLCAkYXRpbWUpIDogc2VsZjo6Ym94KCd0b3VjaCcsICRmaWxlKSkpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byB0b3VjaCAiJXMiOiAnLCAkZmlsZSkuc2VsZjo6JGxhc3RFcnJvciwgMCwgbnVsbCwgJGZpbGUpOwp9Cn0KfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmUoJGZpbGVzKQp7CmlmICgkZmlsZXMgaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKJGZpbGVzID0gaXRlcmF0b3JfdG9fYXJyYXkoJGZpbGVzLCBmYWxzZSk7Cn0gZWxzZWlmICghXGlzX2FycmF5KCRmaWxlcykpIHsKJGZpbGVzID0gWyRmaWxlc107Cn0KCnNlbGY6OmRvUmVtb3ZlKCRmaWxlcywgZmFsc2UpOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBkb1JlbW92ZShhcnJheSAkZmlsZXMsIGJvb2wgJGlzUmVjdXJzaXZlKTogdm9pZAp7CiRmaWxlcyA9IGFycmF5X3JldmVyc2UoJGZpbGVzKTsKZm9yZWFjaCAoJGZpbGVzIGFzICRmaWxlKSB7CmlmIChpc19saW5rKCRmaWxlKSkgewoKaWYgKCEoc2VsZjo6Ym94KCd1bmxpbmsnLCAkZmlsZSkgfHwgJ1xcJyAhPT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgfHwgc2VsZjo6Ym94KCdybWRpcicsICRmaWxlKSkgJiYgZmlsZV9leGlzdHMoJGZpbGUpKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdGYWlsZWQgdG8gcmVtb3ZlIHN5bWxpbmsgIiVzIjogJywgJGZpbGUpLnNlbGY6OiRsYXN0RXJyb3IpOwp9Cn0gZWxzZWlmIChpc19kaXIoJGZpbGUpKSB7CmlmICghJGlzUmVjdXJzaXZlKSB7CiR0bXBOYW1lID0gXGRpcm5hbWUocmVhbHBhdGgoJGZpbGUpKS4nLy4hJy5zdHJyZXYoc3RydHIoYmFzZTY0X2VuY29kZShyYW5kb21fYnl0ZXMoMikpLCAnLz0nLCAnLSEnKSk7CgppZiAoZmlsZV9leGlzdHMoJHRtcE5hbWUpKSB7CnRyeSB7CnNlbGY6OmRvUmVtb3ZlKFskdG1wTmFtZV0sIHRydWUpOwp9IGNhdGNoIChJT0V4Y2VwdGlvbiAkZSkgewp9Cn0KCmlmICghZmlsZV9leGlzdHMoJHRtcE5hbWUpICYmIHNlbGY6OmJveCgncmVuYW1lJywgJGZpbGUsICR0bXBOYW1lKSkgewokb3JpZ0ZpbGUgPSAkZmlsZTsKJGZpbGUgPSAkdG1wTmFtZTsKfSBlbHNlIHsKJG9yaWdGaWxlID0gbnVsbDsKfQp9CgokZmlsZXMgPSBuZXcgXEZpbGVzeXN0ZW1JdGVyYXRvcigkZmlsZSwgXEZpbGVzeXN0ZW1JdGVyYXRvcjo6Q1VSUkVOVF9BU19QQVRITkFNRSB8IFxGaWxlc3lzdGVtSXRlcmF0b3I6OlNLSVBfRE9UUyk7CnNlbGY6OmRvUmVtb3ZlKGl0ZXJhdG9yX3RvX2FycmF5KCRmaWxlcywgdHJ1ZSksIHRydWUpOwoKaWYgKCFzZWxmOjpib3goJ3JtZGlyJywgJGZpbGUpICYmIGZpbGVfZXhpc3RzKCRmaWxlKSAmJiAhJGlzUmVjdXJzaXZlKSB7CiRsYXN0RXJyb3IgPSBzZWxmOjokbGFzdEVycm9yOwoKaWYgKG51bGwgIT09ICRvcmlnRmlsZSAmJiBzZWxmOjpib3goJ3JlbmFtZScsICRmaWxlLCAkb3JpZ0ZpbGUpKSB7CiRmaWxlID0gJG9yaWdGaWxlOwp9Cgp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIHJlbW92ZSBkaXJlY3RvcnkgIiVzIjogJywgJGZpbGUpLiRsYXN0RXJyb3IpOwp9Cn0gZWxzZWlmICghc2VsZjo6Ym94KCd1bmxpbmsnLCAkZmlsZSkgJiYgKChzZWxmOjokbGFzdEVycm9yICYmIHN0cl9jb250YWlucyhzZWxmOjokbGFzdEVycm9yLCAnUGVybWlzc2lvbiBkZW5pZWQnKSkgfHwgZmlsZV9leGlzdHMoJGZpbGUpKSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIHJlbW92ZSBmaWxlICIlcyI6ICcsICRmaWxlKS5zZWxmOjokbGFzdEVycm9yKTsKfQp9Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2htb2QoJGZpbGVzLCBpbnQgJG1vZGUsIGludCAkdW1hc2sgPSAwMDAwLCBib29sICRyZWN1cnNpdmUgPSBmYWxzZSkKewpmb3JlYWNoICgkdGhpcy0+dG9JdGVyYWJsZSgkZmlsZXMpIGFzICRmaWxlKSB7CmlmICgoXFBIUF9WRVJTSU9OX0lEIDwgODAwMDAgfHwgXGlzX2ludCgkbW9kZSkpICYmICFzZWxmOjpib3goJ2NobW9kJywgJGZpbGUsICRtb2RlICYgfiR1bWFzaykpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byBjaG1vZCBmaWxlICIlcyI6ICcsICRmaWxlKS5zZWxmOjokbGFzdEVycm9yLCAwLCBudWxsLCAkZmlsZSk7Cn0KaWYgKCRyZWN1cnNpdmUgJiYgaXNfZGlyKCRmaWxlKSAmJiAhaXNfbGluaygkZmlsZSkpIHsKJHRoaXMtPmNobW9kKG5ldyBcRmlsZXN5c3RlbUl0ZXJhdG9yKCRmaWxlKSwgJG1vZGUsICR1bWFzaywgdHJ1ZSk7Cn0KfQp9CgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNob3duKCRmaWxlcywgJHVzZXIsIGJvb2wgJHJlY3Vyc2l2ZSA9IGZhbHNlKQp7CmZvcmVhY2ggKCR0aGlzLT50b0l0ZXJhYmxlKCRmaWxlcykgYXMgJGZpbGUpIHsKaWYgKCRyZWN1cnNpdmUgJiYgaXNfZGlyKCRmaWxlKSAmJiAhaXNfbGluaygkZmlsZSkpIHsKJHRoaXMtPmNob3duKG5ldyBcRmlsZXN5c3RlbUl0ZXJhdG9yKCRmaWxlKSwgJHVzZXIsIHRydWUpOwp9CmlmIChpc19saW5rKCRmaWxlKSAmJiBcZnVuY3Rpb25fZXhpc3RzKCdsY2hvd24nKSkgewppZiAoIXNlbGY6OmJveCgnbGNob3duJywgJGZpbGUsICR1c2VyKSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIGNob3duIGZpbGUgIiVzIjogJywgJGZpbGUpLnNlbGY6OiRsYXN0RXJyb3IsIDAsIG51bGwsICRmaWxlKTsKfQp9IGVsc2UgewppZiAoIXNlbGY6OmJveCgnY2hvd24nLCAkZmlsZSwgJHVzZXIpKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdGYWlsZWQgdG8gY2hvd24gZmlsZSAiJXMiOiAnLCAkZmlsZSkuc2VsZjo6JGxhc3RFcnJvciwgMCwgbnVsbCwgJGZpbGUpOwp9Cn0KfQp9CgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNoZ3JwKCRmaWxlcywgJGdyb3VwLCBib29sICRyZWN1cnNpdmUgPSBmYWxzZSkKewpmb3JlYWNoICgkdGhpcy0+dG9JdGVyYWJsZSgkZmlsZXMpIGFzICRmaWxlKSB7CmlmICgkcmVjdXJzaXZlICYmIGlzX2RpcigkZmlsZSkgJiYgIWlzX2xpbmsoJGZpbGUpKSB7CiR0aGlzLT5jaGdycChuZXcgXEZpbGVzeXN0ZW1JdGVyYXRvcigkZmlsZSksICRncm91cCwgdHJ1ZSk7Cn0KaWYgKGlzX2xpbmsoJGZpbGUpICYmIFxmdW5jdGlvbl9leGlzdHMoJ2xjaGdycCcpKSB7CmlmICghc2VsZjo6Ym94KCdsY2hncnAnLCAkZmlsZSwgJGdyb3VwKSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIGNoZ3JwIGZpbGUgIiVzIjogJywgJGZpbGUpLnNlbGY6OiRsYXN0RXJyb3IsIDAsIG51bGwsICRmaWxlKTsKfQp9IGVsc2UgewppZiAoIXNlbGY6OmJveCgnY2hncnAnLCAkZmlsZSwgJGdyb3VwKSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIGNoZ3JwIGZpbGUgIiVzIjogJywgJGZpbGUpLnNlbGY6OiRsYXN0RXJyb3IsIDAsIG51bGwsICRmaWxlKTsKfQp9Cn0KfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbmFtZShzdHJpbmcgJG9yaWdpbiwgc3RyaW5nICR0YXJnZXQsIGJvb2wgJG92ZXJ3cml0ZSA9IGZhbHNlKQp7CgppZiAoISRvdmVyd3JpdGUgJiYgJHRoaXMtPmlzUmVhZGFibGUoJHRhcmdldCkpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0Nhbm5vdCByZW5hbWUgYmVjYXVzZSB0aGUgdGFyZ2V0ICIlcyIgYWxyZWFkeSBleGlzdHMuJywgJHRhcmdldCksIDAsIG51bGwsICR0YXJnZXQpOwp9CgppZiAoIXNlbGY6OmJveCgncmVuYW1lJywgJG9yaWdpbiwgJHRhcmdldCkpIHsKaWYgKGlzX2Rpcigkb3JpZ2luKSkgewoKJHRoaXMtPm1pcnJvcigkb3JpZ2luLCAkdGFyZ2V0LCBudWxsLCBbJ292ZXJyaWRlJyA9PiAkb3ZlcndyaXRlLCAnZGVsZXRlJyA9PiAkb3ZlcndyaXRlXSk7CiR0aGlzLT5yZW1vdmUoJG9yaWdpbik7CgpyZXR1cm47Cn0KdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0Nhbm5vdCByZW5hbWUgIiVzIiB0byAiJXMiOiAnLCAkb3JpZ2luLCAkdGFyZ2V0KS5zZWxmOjokbGFzdEVycm9yLCAwLCBudWxsLCAkdGFyZ2V0KTsKfQp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gaXNSZWFkYWJsZShzdHJpbmcgJGZpbGVuYW1lKTogYm9vbAp7CiRtYXhQYXRoTGVuZ3RoID0gXFBIUF9NQVhQQVRITEVOIC0gMjsKCmlmIChcc3RybGVuKCRmaWxlbmFtZSkgPiAkbWF4UGF0aExlbmd0aCkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignQ291bGQgbm90IGNoZWNrIGlmIGZpbGUgaXMgcmVhZGFibGUgYmVjYXVzZSBwYXRoIGxlbmd0aCBleGNlZWRzICVkIGNoYXJhY3RlcnMuJywgJG1heFBhdGhMZW5ndGgpLCAwLCBudWxsLCAkZmlsZW5hbWUpOwp9CgpyZXR1cm4gaXNfcmVhZGFibGUoJGZpbGVuYW1lKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc3ltbGluayhzdHJpbmcgJG9yaWdpbkRpciwgc3RyaW5nICR0YXJnZXREaXIsIGJvb2wgJGNvcHlPbldpbmRvd3MgPSBmYWxzZSkKewpzZWxmOjphc3NlcnRGdW5jdGlvbkV4aXN0cygnc3ltbGluaycpOwoKaWYgKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SKSB7CiRvcmlnaW5EaXIgPSBzdHJ0cigkb3JpZ2luRGlyLCAnLycsICdcXCcpOwokdGFyZ2V0RGlyID0gc3RydHIoJHRhcmdldERpciwgJy8nLCAnXFwnKTsKCmlmICgkY29weU9uV2luZG93cykgewokdGhpcy0+bWlycm9yKCRvcmlnaW5EaXIsICR0YXJnZXREaXIpOwoKcmV0dXJuOwp9Cn0KCiR0aGlzLT5ta2RpcihcZGlybmFtZSgkdGFyZ2V0RGlyKSk7CgppZiAoaXNfbGluaygkdGFyZ2V0RGlyKSkgewppZiAocmVhZGxpbmsoJHRhcmdldERpcikgPT09ICRvcmlnaW5EaXIpIHsKcmV0dXJuOwp9CiR0aGlzLT5yZW1vdmUoJHRhcmdldERpcik7Cn0KCmlmICghc2VsZjo6Ym94KCdzeW1saW5rJywgJG9yaWdpbkRpciwgJHRhcmdldERpcikpIHsKJHRoaXMtPmxpbmtFeGNlcHRpb24oJG9yaWdpbkRpciwgJHRhcmdldERpciwgJ3N5bWJvbGljJyk7Cn0KfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFyZGxpbmsoc3RyaW5nICRvcmlnaW5GaWxlLCAkdGFyZ2V0RmlsZXMpCnsKc2VsZjo6YXNzZXJ0RnVuY3Rpb25FeGlzdHMoJ2xpbmsnKTsKCmlmICghJHRoaXMtPmV4aXN0cygkb3JpZ2luRmlsZSkpIHsKdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihudWxsLCAwLCBudWxsLCAkb3JpZ2luRmlsZSk7Cn0KCmlmICghaXNfZmlsZSgkb3JpZ2luRmlsZSkpIHsKdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihzcHJpbnRmKCdPcmlnaW4gZmlsZSAiJXMiIGlzIG5vdCBhIGZpbGUuJywgJG9yaWdpbkZpbGUpKTsKfQoKZm9yZWFjaCAoJHRoaXMtPnRvSXRlcmFibGUoJHRhcmdldEZpbGVzKSBhcyAkdGFyZ2V0RmlsZSkgewppZiAoaXNfZmlsZSgkdGFyZ2V0RmlsZSkpIHsKaWYgKGZpbGVpbm9kZSgkb3JpZ2luRmlsZSkgPT09IGZpbGVpbm9kZSgkdGFyZ2V0RmlsZSkpIHsKY29udGludWU7Cn0KJHRoaXMtPnJlbW92ZSgkdGFyZ2V0RmlsZSk7Cn0KCmlmICghc2VsZjo6Ym94KCdsaW5rJywgJG9yaWdpbkZpbGUsICR0YXJnZXRGaWxlKSkgewokdGhpcy0+bGlua0V4Y2VwdGlvbigkb3JpZ2luRmlsZSwgJHRhcmdldEZpbGUsICdoYXJkJyk7Cn0KfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGxpbmtFeGNlcHRpb24oc3RyaW5nICRvcmlnaW4sIHN0cmluZyAkdGFyZ2V0LCBzdHJpbmcgJGxpbmtUeXBlKQp7CmlmIChzZWxmOjokbGFzdEVycm9yKSB7CmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUiAmJiBzdHJfY29udGFpbnMoc2VsZjo6JGxhc3RFcnJvciwgJ2Vycm9yIGNvZGUoMTMxNCknKSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignVW5hYmxlIHRvIGNyZWF0ZSAiJXMiIGxpbmsgZHVlIHRvIGVycm9yIGNvZGUgMTMxNDogXCdBIHJlcXVpcmVkIHByaXZpbGVnZSBpcyBub3QgaGVsZCBieSB0aGUgY2xpZW50XCcuIERvIHlvdSBoYXZlIHRoZSByZXF1aXJlZCBBZG1pbmlzdHJhdG9yLXJpZ2h0cz8nLCAkbGlua1R5cGUpLCAwLCBudWxsLCAkdGFyZ2V0KTsKfQp9CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdGYWlsZWQgdG8gY3JlYXRlICIlcyIgbGluayBmcm9tICIlcyIgdG8gIiVzIjogJywgJGxpbmtUeXBlLCAkb3JpZ2luLCAkdGFyZ2V0KS5zZWxmOjokbGFzdEVycm9yLCAwLCBudWxsLCAkdGFyZ2V0KTsKfQoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZWFkbGluayhzdHJpbmcgJHBhdGgsIGJvb2wgJGNhbm9uaWNhbGl6ZSA9IGZhbHNlKQp7CmlmICghJGNhbm9uaWNhbGl6ZSAmJiAhaXNfbGluaygkcGF0aCkpIHsKcmV0dXJuIG51bGw7Cn0KCmlmICgkY2Fub25pY2FsaXplKSB7CmlmICghJHRoaXMtPmV4aXN0cygkcGF0aCkpIHsKcmV0dXJuIG51bGw7Cn0KCmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUiAmJiBcUEhQX1ZFUlNJT05fSUQgPCA3MDQxMCkgewokcGF0aCA9IHJlYWRsaW5rKCRwYXRoKTsKfQoKcmV0dXJuIHJlYWxwYXRoKCRwYXRoKTsKfQoKaWYgKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SICYmIFxQSFBfVkVSU0lPTl9JRCA8IDcwNDAwKSB7CnJldHVybiByZWFscGF0aCgkcGF0aCk7Cn0KCnJldHVybiByZWFkbGluaygkcGF0aCk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIG1ha2VQYXRoUmVsYXRpdmUoc3RyaW5nICRlbmRQYXRoLCBzdHJpbmcgJHN0YXJ0UGF0aCkKewppZiAoISR0aGlzLT5pc0Fic29sdXRlUGF0aCgkc3RhcnRQYXRoKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSBzdGFydCBwYXRoICIlcyIgaXMgbm90IGFic29sdXRlLicsICRzdGFydFBhdGgpKTsKfQoKaWYgKCEkdGhpcy0+aXNBYnNvbHV0ZVBhdGgoJGVuZFBhdGgpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlIGVuZCBwYXRoICIlcyIgaXMgbm90IGFic29sdXRlLicsICRlbmRQYXRoKSk7Cn0KCgppZiAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IpIHsKJGVuZFBhdGggPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRlbmRQYXRoKTsKJHN0YXJ0UGF0aCA9IHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJHN0YXJ0UGF0aCk7Cn0KCiRzcGxpdERyaXZlTGV0dGVyID0gZnVuY3Rpb24gKCRwYXRoKSB7CnJldHVybiAoXHN0cmxlbigkcGF0aCkgPiAyICYmICc6JyA9PT0gJHBhdGhbMV0gJiYgJy8nID09PSAkcGF0aFsyXSAmJiBjdHlwZV9hbHBoYSgkcGF0aFswXSkpCj8gW3N1YnN0cigkcGF0aCwgMiksIHN0cnRvdXBwZXIoJHBhdGhbMF0pXQo6IFskcGF0aCwgbnVsbF07Cn07Cgokc3BsaXRQYXRoID0gZnVuY3Rpb24gKCRwYXRoKSB7CiRyZXN1bHQgPSBbXTsKCmZvcmVhY2ggKGV4cGxvZGUoJy8nLCB0cmltKCRwYXRoLCAnLycpKSBhcyAkc2VnbWVudCkgewppZiAoJy4uJyA9PT0gJHNlZ21lbnQpIHsKYXJyYXlfcG9wKCRyZXN1bHQpOwp9IGVsc2VpZiAoJy4nICE9PSAkc2VnbWVudCAmJiAnJyAhPT0gJHNlZ21lbnQpIHsKJHJlc3VsdFtdID0gJHNlZ21lbnQ7Cn0KfQoKcmV0dXJuICRyZXN1bHQ7Cn07CgpbJGVuZFBhdGgsICRlbmREcml2ZUxldHRlcl0gPSAkc3BsaXREcml2ZUxldHRlcigkZW5kUGF0aCk7Clskc3RhcnRQYXRoLCAkc3RhcnREcml2ZUxldHRlcl0gPSAkc3BsaXREcml2ZUxldHRlcigkc3RhcnRQYXRoKTsKCiRzdGFydFBhdGhBcnIgPSAkc3BsaXRQYXRoKCRzdGFydFBhdGgpOwokZW5kUGF0aEFyciA9ICRzcGxpdFBhdGgoJGVuZFBhdGgpOwoKaWYgKCRlbmREcml2ZUxldHRlciAmJiAkc3RhcnREcml2ZUxldHRlciAmJiAkZW5kRHJpdmVMZXR0ZXIgIT0gJHN0YXJ0RHJpdmVMZXR0ZXIpIHsKCnJldHVybiAkZW5kRHJpdmVMZXR0ZXIuJzovJy4oJGVuZFBhdGhBcnIgPyBpbXBsb2RlKCcvJywgJGVuZFBhdGhBcnIpLicvJyA6ICcnKTsKfQoKCiRpbmRleCA9IDA7CndoaWxlIChpc3NldCgkc3RhcnRQYXRoQXJyWyRpbmRleF0pICYmIGlzc2V0KCRlbmRQYXRoQXJyWyRpbmRleF0pICYmICRzdGFydFBhdGhBcnJbJGluZGV4XSA9PT0gJGVuZFBhdGhBcnJbJGluZGV4XSkgeworKyRpbmRleDsKfQoKCmlmICgxID09PSBcY291bnQoJHN0YXJ0UGF0aEFycikgJiYgJycgPT09ICRzdGFydFBhdGhBcnJbMF0pIHsKJGRlcHRoID0gMDsKfSBlbHNlIHsKJGRlcHRoID0gXGNvdW50KCRzdGFydFBhdGhBcnIpIC0gJGluZGV4Owp9CgoKJHRyYXZlcnNlciA9IHN0cl9yZXBlYXQoJy4uLycsICRkZXB0aCk7CgokZW5kUGF0aFJlbWFpbmRlciA9IGltcGxvZGUoJy8nLCBcYXJyYXlfc2xpY2UoJGVuZFBhdGhBcnIsICRpbmRleCkpOwoKCiRyZWxhdGl2ZVBhdGggPSAkdHJhdmVyc2VyLignJyAhPT0gJGVuZFBhdGhSZW1haW5kZXIgPyAkZW5kUGF0aFJlbWFpbmRlci4nLycgOiAnJyk7CgpyZXR1cm4gJycgPT09ICRyZWxhdGl2ZVBhdGggPyAnLi8nIDogJHJlbGF0aXZlUGF0aDsKfQoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbWlycm9yKHN0cmluZyAkb3JpZ2luRGlyLCBzdHJpbmcgJHRhcmdldERpciwgP1xUcmF2ZXJzYWJsZSAkaXRlcmF0b3IgPSBudWxsLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiR0YXJnZXREaXIgPSBydHJpbSgkdGFyZ2V0RGlyLCAnL1xcJyk7CiRvcmlnaW5EaXIgPSBydHJpbSgkb3JpZ2luRGlyLCAnL1xcJyk7CiRvcmlnaW5EaXJMZW4gPSBcc3RybGVuKCRvcmlnaW5EaXIpOwoKaWYgKCEkdGhpcy0+ZXhpc3RzKCRvcmlnaW5EaXIpKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdUaGUgb3JpZ2luIGRpcmVjdG9yeSBzcGVjaWZpZWQgIiVzIiB3YXMgbm90IGZvdW5kLicsICRvcmlnaW5EaXIpLCAwLCBudWxsLCAkb3JpZ2luRGlyKTsKfQoKCmlmICgkdGhpcy0+ZXhpc3RzKCR0YXJnZXREaXIpICYmIGlzc2V0KCRvcHRpb25zWydkZWxldGUnXSkgJiYgJG9wdGlvbnNbJ2RlbGV0ZSddKSB7CiRkZWxldGVJdGVyYXRvciA9ICRpdGVyYXRvcjsKaWYgKG51bGwgPT09ICRkZWxldGVJdGVyYXRvcikgewokZmxhZ3MgPSBcRmlsZXN5c3RlbUl0ZXJhdG9yOjpTS0lQX0RPVFM7CiRkZWxldGVJdGVyYXRvciA9IG5ldyBcUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcihuZXcgXFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCR0YXJnZXREaXIsICRmbGFncyksIFxSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yOjpDSElMRF9GSVJTVCk7Cn0KJHRhcmdldERpckxlbiA9IFxzdHJsZW4oJHRhcmdldERpcik7CmZvcmVhY2ggKCRkZWxldGVJdGVyYXRvciBhcyAkZmlsZSkgewokb3JpZ2luID0gJG9yaWdpbkRpci5zdWJzdHIoJGZpbGUtPmdldFBhdGhuYW1lKCksICR0YXJnZXREaXJMZW4pOwppZiAoISR0aGlzLT5leGlzdHMoJG9yaWdpbikpIHsKJHRoaXMtPnJlbW92ZSgkZmlsZSk7Cn0KfQp9CgokY29weU9uV2luZG93cyA9ICRvcHRpb25zWydjb3B5X29uX3dpbmRvd3MnXSA/PyBmYWxzZTsKCmlmIChudWxsID09PSAkaXRlcmF0b3IpIHsKJGZsYWdzID0gJGNvcHlPbldpbmRvd3MgPyBcRmlsZXN5c3RlbUl0ZXJhdG9yOjpTS0lQX0RPVFMgfCBcRmlsZXN5c3RlbUl0ZXJhdG9yOjpGT0xMT1dfU1lNTElOS1MgOiBcRmlsZXN5c3RlbUl0ZXJhdG9yOjpTS0lQX0RPVFM7CiRpdGVyYXRvciA9IG5ldyBcUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcihuZXcgXFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRvcmlnaW5EaXIsICRmbGFncyksIFxSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yOjpTRUxGX0ZJUlNUKTsKfQoKJHRoaXMtPm1rZGlyKCR0YXJnZXREaXIpOwokZmlsZXNDcmVhdGVkV2hpbGVNaXJyb3JpbmcgPSBbXTsKCmZvcmVhY2ggKCRpdGVyYXRvciBhcyAkZmlsZSkgewppZiAoJGZpbGUtPmdldFBhdGhuYW1lKCkgPT09ICR0YXJnZXREaXIgfHwgJGZpbGUtPmdldFJlYWxQYXRoKCkgPT09ICR0YXJnZXREaXIgfHwgaXNzZXQoJGZpbGVzQ3JlYXRlZFdoaWxlTWlycm9yaW5nWyRmaWxlLT5nZXRSZWFsUGF0aCgpXSkpIHsKY29udGludWU7Cn0KCiR0YXJnZXQgPSAkdGFyZ2V0RGlyLnN1YnN0cigkZmlsZS0+Z2V0UGF0aG5hbWUoKSwgJG9yaWdpbkRpckxlbik7CiRmaWxlc0NyZWF0ZWRXaGlsZU1pcnJvcmluZ1skdGFyZ2V0XSA9IHRydWU7CgppZiAoISRjb3B5T25XaW5kb3dzICYmIGlzX2xpbmsoJGZpbGUpKSB7CiR0aGlzLT5zeW1saW5rKCRmaWxlLT5nZXRMaW5rVGFyZ2V0KCksICR0YXJnZXQpOwp9IGVsc2VpZiAoaXNfZGlyKCRmaWxlKSkgewokdGhpcy0+bWtkaXIoJHRhcmdldCk7Cn0gZWxzZWlmIChpc19maWxlKCRmaWxlKSkgewokdGhpcy0+Y29weSgkZmlsZSwgJHRhcmdldCwgJG9wdGlvbnNbJ292ZXJyaWRlJ10gPz8gZmFsc2UpOwp9IGVsc2Ugewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignVW5hYmxlIHRvIGd1ZXNzICIlcyIgZmlsZSB0eXBlLicsICRmaWxlKSwgMCwgbnVsbCwgJGZpbGUpOwp9Cn0KfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNBYnNvbHV0ZVBhdGgoc3RyaW5nICRmaWxlKQp7CnJldHVybiAnJyAhPT0gJGZpbGUgJiYgKHN0cnNwbigkZmlsZSwgJy9cXCcsIDAsIDEpCnx8IChcc3RybGVuKCRmaWxlKSA+IDMgJiYgY3R5cGVfYWxwaGEoJGZpbGVbMF0pCiYmICc6JyA9PT0gJGZpbGVbMV0KJiYgc3Ryc3BuKCRmaWxlLCAnL1xcJywgMiwgMSkKKQp8fCBudWxsICE9PSBwYXJzZV91cmwoJGZpbGUsIFxQSFBfVVJMX1NDSEVNRSkKKTsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHRlbXBuYW0oc3RyaW5nICRkaXIsIHN0cmluZyAkcHJlZml4KQp7CiRzdWZmaXggPSBcZnVuY19udW1fYXJncygpID4gMiA/IGZ1bmNfZ2V0X2FyZygyKSA6ICcnOwpbJHNjaGVtZSwgJGhpZXJhcmNoeV0gPSAkdGhpcy0+Z2V0U2NoZW1lQW5kSGllcmFyY2h5KCRkaXIpOwoKCmlmICgobnVsbCA9PT0gJHNjaGVtZSB8fCAnZmlsZScgPT09ICRzY2hlbWUgfHwgJ2dzJyA9PT0gJHNjaGVtZSkgJiYgJycgPT09ICRzdWZmaXgpIHsKCmlmICgkdG1wRmlsZSA9IHNlbGY6OmJveCgndGVtcG5hbScsICRoaWVyYXJjaHksICRwcmVmaXgpKSB7CmlmIChudWxsICE9PSAkc2NoZW1lICYmICdncycgIT09ICRzY2hlbWUpIHsKcmV0dXJuICRzY2hlbWUuJzovLycuJHRtcEZpbGU7Cn0KCnJldHVybiAkdG1wRmlsZTsKfQoKdGhyb3cgbmV3IElPRXhjZXB0aW9uKCdBIHRlbXBvcmFyeSBmaWxlIGNvdWxkIG5vdCBiZSBjcmVhdGVkOiAnLnNlbGY6OiRsYXN0RXJyb3IpOwp9CgoKZm9yICgkaSA9IDA7ICRpIDwgMTA7ICsrJGkpIHsKCiR0bXBGaWxlID0gJGRpci4nLycuJHByZWZpeC51bmlxaWQobXRfcmFuZCgpLCB0cnVlKS4kc3VmZml4OwoKCgppZiAoISRoYW5kbGUgPSBzZWxmOjpib3goJ2ZvcGVuJywgJHRtcEZpbGUsICd4KycpKSB7CmNvbnRpbnVlOwp9CgoKc2VsZjo6Ym94KCdmY2xvc2UnLCAkaGFuZGxlKTsKCnJldHVybiAkdG1wRmlsZTsKfQoKdGhyb3cgbmV3IElPRXhjZXB0aW9uKCdBIHRlbXBvcmFyeSBmaWxlIGNvdWxkIG5vdCBiZSBjcmVhdGVkOiAnLnNlbGY6OiRsYXN0RXJyb3IpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGR1bXBGaWxlKHN0cmluZyAkZmlsZW5hbWUsICRjb250ZW50KQp7CmlmIChcaXNfYXJyYXkoJGNvbnRlbnQpKSB7CnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoJ0FyZ3VtZW50IDIgcGFzc2VkIHRvICIlcygpIiBtdXN0IGJlIHN0cmluZyBvciByZXNvdXJjZSwgYXJyYXkgZ2l2ZW4uJywgX19NRVRIT0RfXykpOwp9CgokZGlyID0gXGRpcm5hbWUoJGZpbGVuYW1lKTsKCmlmIChpc19saW5rKCRmaWxlbmFtZSkgJiYgJGxpbmtUYXJnZXQgPSAkdGhpcy0+cmVhZGxpbmsoJGZpbGVuYW1lKSkgewokdGhpcy0+ZHVtcEZpbGUoUGF0aDo6bWFrZUFic29sdXRlKCRsaW5rVGFyZ2V0LCAkZGlyKSwgJGNvbnRlbnQpOwoKcmV0dXJuOwp9CgppZiAoIWlzX2RpcigkZGlyKSkgewokdGhpcy0+bWtkaXIoJGRpcik7Cn0KCgoKJHRtcEZpbGUgPSAkdGhpcy0+dGVtcG5hbSgkZGlyLCBiYXNlbmFtZSgkZmlsZW5hbWUpKTsKCnRyeSB7CmlmIChmYWxzZSA9PT0gc2VsZjo6Ym94KCdmaWxlX3B1dF9jb250ZW50cycsICR0bXBGaWxlLCAkY29udGVudCkpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byB3cml0ZSBmaWxlICIlcyI6ICcsICRmaWxlbmFtZSkuc2VsZjo6JGxhc3RFcnJvciwgMCwgbnVsbCwgJGZpbGVuYW1lKTsKfQoKc2VsZjo6Ym94KCdjaG1vZCcsICR0bXBGaWxlLCBzZWxmOjpib3goJ2ZpbGVwZXJtcycsICRmaWxlbmFtZSkgPzogMDY2NiAmIH51bWFzaygpKTsKCiR0aGlzLT5yZW5hbWUoJHRtcEZpbGUsICRmaWxlbmFtZSwgdHJ1ZSk7Cn0gZmluYWxseSB7CmlmIChmaWxlX2V4aXN0cygkdG1wRmlsZSkpIHsKaWYgKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SICYmICFpc193cml0YWJsZSgkdG1wRmlsZSkpIHsKc2VsZjo6Ym94KCdjaG1vZCcsICR0bXBGaWxlLCBzZWxmOjpib3goJ2ZpbGVwZXJtcycsICR0bXBGaWxlKSB8IDAyMDApOwp9CgpzZWxmOjpib3goJ3VubGluaycsICR0bXBGaWxlKTsKfQp9Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFwcGVuZFRvRmlsZShzdHJpbmcgJGZpbGVuYW1lLCAkY29udGVudCkKewppZiAoXGlzX2FycmF5KCRjb250ZW50KSkgewp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKCdBcmd1bWVudCAyIHBhc3NlZCB0byAiJXMoKSIgbXVzdCBiZSBzdHJpbmcgb3IgcmVzb3VyY2UsIGFycmF5IGdpdmVuLicsIF9fTUVUSE9EX18pKTsKfQoKJGRpciA9IFxkaXJuYW1lKCRmaWxlbmFtZSk7CgppZiAoIWlzX2RpcigkZGlyKSkgewokdGhpcy0+bWtkaXIoJGRpcik7Cn0KCiRsb2NrID0gXGZ1bmNfbnVtX2FyZ3MoKSA+IDIgJiYgZnVuY19nZXRfYXJnKDIpOwoKaWYgKGZhbHNlID09PSBzZWxmOjpib3goJ2ZpbGVfcHV0X2NvbnRlbnRzJywgJGZpbGVuYW1lLCAkY29udGVudCwgXEZJTEVfQVBQRU5EIHwgKCRsb2NrID8gXExPQ0tfRVggOiAwKSkpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byB3cml0ZSBmaWxlICIlcyI6ICcsICRmaWxlbmFtZSkuc2VsZjo6JGxhc3RFcnJvciwgMCwgbnVsbCwgJGZpbGVuYW1lKTsKfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIHRvSXRlcmFibGUoJGZpbGVzKTogaXRlcmFibGUKewpyZXR1cm4gaXNfaXRlcmFibGUoJGZpbGVzKSA/ICRmaWxlcyA6IFskZmlsZXNdOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFNjaGVtZUFuZEhpZXJhcmNoeShzdHJpbmcgJGZpbGVuYW1lKTogYXJyYXkKewokY29tcG9uZW50cyA9IGV4cGxvZGUoJzovLycsICRmaWxlbmFtZSwgMik7CgpyZXR1cm4gMiA9PT0gXGNvdW50KCRjb21wb25lbnRzKSA/IFskY29tcG9uZW50c1swXSwgJGNvbXBvbmVudHNbMV1dIDogW251bGwsICRjb21wb25lbnRzWzBdXTsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gYXNzZXJ0RnVuY3Rpb25FeGlzdHMoc3RyaW5nICRmdW5jKTogdm9pZAp7CmlmICghXGZ1bmN0aW9uX2V4aXN0cygkZnVuYykpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ1VuYWJsZSB0byBwZXJmb3JtIGZpbGVzeXN0ZW0gb3BlcmF0aW9uIGJlY2F1c2UgdGhlICIlcygpIiBmdW5jdGlvbiBoYXMgYmVlbiBkaXNhYmxlZC4nLCAkZnVuYykpOwp9Cn0KCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gYm94KHN0cmluZyAkZnVuYywgLi4uJGFyZ3MpCnsKc2VsZjo6YXNzZXJ0RnVuY3Rpb25FeGlzdHMoJGZ1bmMpOwoKc2VsZjo6JGxhc3RFcnJvciA9IG51bGw7CnNldF9lcnJvcl9oYW5kbGVyKF9fQ0xBU1NfXy4nOjpoYW5kbGVFcnJvcicpOwp0cnkgewpyZXR1cm4gJGZ1bmMoLi4uJGFyZ3MpOwp9IGZpbmFsbHkgewpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKfQp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGhhbmRsZUVycm9yKGludCAkdHlwZSwgc3RyaW5nICRtc2cpCnsKc2VsZjo6JGxhc3RFcnJvciA9ICRtc2c7Cn0KfQoKQ29weXJpZ2h0IChjKSAyMDA0LXByZXNlbnQgRmFiaWVuIFBvdGVuY2llcgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAp0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KCjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmlsZXN5c3RlbTsKCnVzZSBTeW1mb255XENvbXBvbmVudFxGaWxlc3lzdGVtXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxGaWxlc3lzdGVtXEV4Y2VwdGlvblxSdW50aW1lRXhjZXB0aW9uOwoKCgoKCgoKCgoKCgpmaW5hbCBjbGFzcyBQYXRoCnsKCgoKcHJpdmF0ZSBjb25zdCBDTEVBTlVQX1RIUkVTSE9MRCA9IDEyNTA7CgoKCgpwcml2YXRlIGNvbnN0IENMRUFOVVBfU0laRSA9IDEwMDA7CgoKCgoKCnByaXZhdGUgc3RhdGljICRidWZmZXIgPSBbXTsKCgoKCnByaXZhdGUgc3RhdGljICRidWZmZXJTaXplID0gMDsKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjYW5vbmljYWxpemUoc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKaWYgKCcnID09PSAkcGF0aCkgewpyZXR1cm4gJyc7Cn0KCgoKCmlmIChpc3NldChzZWxmOjokYnVmZmVyWyRwYXRoXSkpIHsKcmV0dXJuIHNlbGY6OiRidWZmZXJbJHBhdGhdOwp9CgoKaWYgKCd+JyA9PT0gJHBhdGhbMF0pIHsKJHBhdGggPSBzZWxmOjpnZXRIb21lRGlyZWN0b3J5KCkuc3Vic3RyKCRwYXRoLCAxKTsKfQoKJHBhdGggPSBzZWxmOjpub3JtYWxpemUoJHBhdGgpOwoKWyRyb290LCAkcGF0aFdpdGhvdXRSb290XSA9IHNlbGY6OnNwbGl0KCRwYXRoKTsKCiRjYW5vbmljYWxQYXJ0cyA9IHNlbGY6OmZpbmRDYW5vbmljYWxQYXJ0cygkcm9vdCwgJHBhdGhXaXRob3V0Um9vdCk7CgoKc2VsZjo6JGJ1ZmZlclskcGF0aF0gPSAkY2Fub25pY2FsUGF0aCA9ICRyb290LmltcGxvZGUoJy8nLCAkY2Fub25pY2FsUGFydHMpOworK3NlbGY6OiRidWZmZXJTaXplOwoKCmlmIChzZWxmOjokYnVmZmVyU2l6ZSA+IHNlbGY6OkNMRUFOVVBfVEhSRVNIT0xEKSB7CnNlbGY6OiRidWZmZXIgPSBcYXJyYXlfc2xpY2Uoc2VsZjo6JGJ1ZmZlciwgLXNlbGY6OkNMRUFOVVBfU0laRSwgbnVsbCwgdHJ1ZSk7CnNlbGY6OiRidWZmZXJTaXplID0gc2VsZjo6Q0xFQU5VUF9TSVpFOwp9CgpyZXR1cm4gJGNhbm9uaWNhbFBhdGg7Cn0KCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBub3JtYWxpemUoc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKcmV0dXJuIHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJHBhdGgpOwp9CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RGlyZWN0b3J5KHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CmlmICgnJyA9PT0gJHBhdGgpIHsKcmV0dXJuICcnOwp9CgokcGF0aCA9IHNlbGY6OmNhbm9uaWNhbGl6ZSgkcGF0aCk7CgoKaWYgKGZhbHNlICE9PSAkc2NoZW1lU2VwYXJhdG9yUG9zaXRpb24gPSBzdHJwb3MoJHBhdGgsICc6Ly8nKSkgewokc2NoZW1lID0gc3Vic3RyKCRwYXRoLCAwLCAkc2NoZW1lU2VwYXJhdG9yUG9zaXRpb24gKyAzKTsKJHBhdGggPSBzdWJzdHIoJHBhdGgsICRzY2hlbWVTZXBhcmF0b3JQb3NpdGlvbiArIDMpOwp9IGVsc2Ugewokc2NoZW1lID0gJyc7Cn0KCmlmIChmYWxzZSA9PT0gJGRpclNlcGFyYXRvclBvc2l0aW9uID0gc3RycnBvcygkcGF0aCwgJy8nKSkgewpyZXR1cm4gJyc7Cn0KCgppZiAoMCA9PT0gJGRpclNlcGFyYXRvclBvc2l0aW9uKSB7CnJldHVybiAkc2NoZW1lLicvJzsKfQoKCmlmICgyID09PSAkZGlyU2VwYXJhdG9yUG9zaXRpb24gJiYgY3R5cGVfYWxwaGEoJHBhdGhbMF0pICYmICc6JyA9PT0gJHBhdGhbMV0pIHsKcmV0dXJuICRzY2hlbWUuc3Vic3RyKCRwYXRoLCAwLCAzKTsKfQoKcmV0dXJuICRzY2hlbWUuc3Vic3RyKCRwYXRoLCAwLCAkZGlyU2VwYXJhdG9yUG9zaXRpb24pOwp9CgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0SG9tZURpcmVjdG9yeSgpOiBzdHJpbmcKewoKaWYgKGdldGVudignSE9NRScpKSB7CnJldHVybiBzZWxmOjpjYW5vbmljYWxpemUoZ2V0ZW52KCdIT01FJykpOwp9CgoKaWYgKGdldGVudignSE9NRURSSVZFJykgJiYgZ2V0ZW52KCdIT01FUEFUSCcpKSB7CnJldHVybiBzZWxmOjpjYW5vbmljYWxpemUoZ2V0ZW52KCdIT01FRFJJVkUnKS5nZXRlbnYoJ0hPTUVQQVRIJykpOwp9Cgp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgdGhlIGhvbWUgZGlyZWN0b3J5IHBhdGg6IFlvdXIgZW52aXJvbm1lbnQgb3Igb3BlcmF0aW5nIHN5c3RlbSBpc24ndCBzdXBwb3J0ZWQuIik7Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRSb290KHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CmlmICgnJyA9PT0gJHBhdGgpIHsKcmV0dXJuICcnOwp9CgoKaWYgKGZhbHNlICE9PSAkc2NoZW1lU2VwYXJhdG9yUG9zaXRpb24gPSBzdHJwb3MoJHBhdGgsICc6Ly8nKSkgewokc2NoZW1lID0gc3Vic3RyKCRwYXRoLCAwLCAkc2NoZW1lU2VwYXJhdG9yUG9zaXRpb24gKyAzKTsKJHBhdGggPSBzdWJzdHIoJHBhdGgsICRzY2hlbWVTZXBhcmF0b3JQb3NpdGlvbiArIDMpOwp9IGVsc2Ugewokc2NoZW1lID0gJyc7Cn0KCiRmaXJzdENoYXJhY3RlciA9ICRwYXRoWzBdOwoKCmlmICgnLycgPT09ICRmaXJzdENoYXJhY3RlciB8fCAnXFwnID09PSAkZmlyc3RDaGFyYWN0ZXIpIHsKcmV0dXJuICRzY2hlbWUuJy8nOwp9CgokbGVuZ3RoID0gXHN0cmxlbigkcGF0aCk7CgoKaWYgKCRsZW5ndGggPiAxICYmICc6JyA9PT0gJHBhdGhbMV0gJiYgY3R5cGVfYWxwaGEoJGZpcnN0Q2hhcmFjdGVyKSkgewoKaWYgKDIgPT09ICRsZW5ndGgpIHsKcmV0dXJuICRzY2hlbWUuJHBhdGguJy8nOwp9CgoKaWYgKCcvJyA9PT0gJHBhdGhbMl0gfHwgJ1xcJyA9PT0gJHBhdGhbMl0pIHsKcmV0dXJuICRzY2hlbWUuJGZpcnN0Q2hhcmFjdGVyLiRwYXRoWzFdLicvJzsKfQp9CgpyZXR1cm4gJyc7Cn0KCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RmlsZW5hbWVXaXRob3V0RXh0ZW5zaW9uKHN0cmluZyAkcGF0aCwgP3N0cmluZyAkZXh0ZW5zaW9uID0gbnVsbCk6IHN0cmluZwp7CmlmICgnJyA9PT0gJHBhdGgpIHsKcmV0dXJuICcnOwp9CgppZiAobnVsbCAhPT0gJGV4dGVuc2lvbikgewoKcmV0dXJuIHJ0cmltKGJhc2VuYW1lKCRwYXRoLCAkZXh0ZW5zaW9uKSwgJy4nKTsKfQoKcmV0dXJuIHBhdGhpbmZvKCRwYXRoLCBcUEFUSElORk9fRklMRU5BTUUpOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uKHN0cmluZyAkcGF0aCwgYm9vbCAkZm9yY2VMb3dlckNhc2UgPSBmYWxzZSk6IHN0cmluZwp7CmlmICgnJyA9PT0gJHBhdGgpIHsKcmV0dXJuICcnOwp9CgokZXh0ZW5zaW9uID0gcGF0aGluZm8oJHBhdGgsIFxQQVRISU5GT19FWFRFTlNJT04pOwoKaWYgKCRmb3JjZUxvd2VyQ2FzZSkgewokZXh0ZW5zaW9uID0gc2VsZjo6dG9Mb3dlcigkZXh0ZW5zaW9uKTsKfQoKcmV0dXJuICRleHRlbnNpb247Cn0KCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBoYXNFeHRlbnNpb24oc3RyaW5nICRwYXRoLCAkZXh0ZW5zaW9ucyA9IG51bGwsIGJvb2wgJGlnbm9yZUNhc2UgPSBmYWxzZSk6IGJvb2wKewppZiAoJycgPT09ICRwYXRoKSB7CnJldHVybiBmYWxzZTsKfQoKJGFjdHVhbEV4dGVuc2lvbiA9IHNlbGY6OmdldEV4dGVuc2lvbigkcGF0aCwgJGlnbm9yZUNhc2UpOwoKCmlmIChbXSA9PT0gJGV4dGVuc2lvbnMgfHwgbnVsbCA9PT0gJGV4dGVuc2lvbnMpIHsKcmV0dXJuICcnICE9PSAkYWN0dWFsRXh0ZW5zaW9uOwp9CgppZiAoXGlzX3N0cmluZygkZXh0ZW5zaW9ucykpIHsKJGV4dGVuc2lvbnMgPSBbJGV4dGVuc2lvbnNdOwp9Cgpmb3JlYWNoICgkZXh0ZW5zaW9ucyBhcyAka2V5ID0+ICRleHRlbnNpb24pIHsKaWYgKCRpZ25vcmVDYXNlKSB7CiRleHRlbnNpb24gPSBzZWxmOjp0b0xvd2VyKCRleHRlbnNpb24pOwp9CgoKJGV4dGVuc2lvbnNbJGtleV0gPSBsdHJpbSgkZXh0ZW5zaW9uLCAnLicpOwp9CgpyZXR1cm4gXGluX2FycmF5KCRhY3R1YWxFeHRlbnNpb24sICRleHRlbnNpb25zLCB0cnVlKTsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNoYW5nZUV4dGVuc2lvbihzdHJpbmcgJHBhdGgsIHN0cmluZyAkZXh0ZW5zaW9uKTogc3RyaW5nCnsKaWYgKCcnID09PSAkcGF0aCkgewpyZXR1cm4gJyc7Cn0KCiRhY3R1YWxFeHRlbnNpb24gPSBzZWxmOjpnZXRFeHRlbnNpb24oJHBhdGgpOwokZXh0ZW5zaW9uID0gbHRyaW0oJGV4dGVuc2lvbiwgJy4nKTsKCgppZiAoJy8nID09PSBzdWJzdHIoJHBhdGgsIC0xKSkgewpyZXR1cm4gJHBhdGg7Cn0KCgppZiAoZW1wdHkoJGFjdHVhbEV4dGVuc2lvbikpIHsKcmV0dXJuICRwYXRoLignLicgPT09IHN1YnN0cigkcGF0aCwgLTEpID8gJycgOiAnLicpLiRleHRlbnNpb247Cn0KCnJldHVybiBzdWJzdHIoJHBhdGgsIDAsIC1cc3RybGVuKCRhY3R1YWxFeHRlbnNpb24pKS4kZXh0ZW5zaW9uOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzQWJzb2x1dGUoc3RyaW5nICRwYXRoKTogYm9vbAp7CmlmICgnJyA9PT0gJHBhdGgpIHsKcmV0dXJuIGZhbHNlOwp9CgoKaWYgKGZhbHNlICE9PSAoJHNjaGVtZVNlcGFyYXRvclBvc2l0aW9uID0gc3RycG9zKCRwYXRoLCAnOi8vJykpICYmIDEgIT09ICRzY2hlbWVTZXBhcmF0b3JQb3NpdGlvbikgewokcGF0aCA9IHN1YnN0cigkcGF0aCwgJHNjaGVtZVNlcGFyYXRvclBvc2l0aW9uICsgMyk7Cn0KCiRmaXJzdENoYXJhY3RlciA9ICRwYXRoWzBdOwoKCmlmICgnLycgPT09ICRmaXJzdENoYXJhY3RlciB8fCAnXFwnID09PSAkZmlyc3RDaGFyYWN0ZXIpIHsKcmV0dXJuIHRydWU7Cn0KCgppZiAoXHN0cmxlbigkcGF0aCkgPiAxICYmIGN0eXBlX2FscGhhKCRmaXJzdENoYXJhY3RlcikgJiYgJzonID09PSAkcGF0aFsxXSkgewoKaWYgKDIgPT09IFxzdHJsZW4oJHBhdGgpKSB7CnJldHVybiB0cnVlOwp9CgoKaWYgKCcvJyA9PT0gJHBhdGhbMl0gfHwgJ1xcJyA9PT0gJHBhdGhbMl0pIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzUmVsYXRpdmUoc3RyaW5nICRwYXRoKTogYm9vbAp7CnJldHVybiAhc2VsZjo6aXNBYnNvbHV0ZSgkcGF0aCk7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1ha2VBYnNvbHV0ZShzdHJpbmcgJHBhdGgsIHN0cmluZyAkYmFzZVBhdGgpOiBzdHJpbmcKewppZiAoJycgPT09ICRiYXNlUGF0aCkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSBiYXNlIHBhdGggbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuIEdvdDogIiVzIi4nLCAkYmFzZVBhdGgpKTsKfQoKaWYgKCFzZWxmOjppc0Fic29sdXRlKCRiYXNlUGF0aCkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgYmFzZSBwYXRoICIlcyIgaXMgbm90IGFuIGFic29sdXRlIHBhdGguJywgJGJhc2VQYXRoKSk7Cn0KCmlmIChzZWxmOjppc0Fic29sdXRlKCRwYXRoKSkgewpyZXR1cm4gc2VsZjo6Y2Fub25pY2FsaXplKCRwYXRoKTsKfQoKaWYgKGZhbHNlICE9PSAkc2NoZW1lU2VwYXJhdG9yUG9zaXRpb24gPSBzdHJwb3MoJGJhc2VQYXRoLCAnOi8vJykpIHsKJHNjaGVtZSA9IHN1YnN0cigkYmFzZVBhdGgsIDAsICRzY2hlbWVTZXBhcmF0b3JQb3NpdGlvbiArIDMpOwokYmFzZVBhdGggPSBzdWJzdHIoJGJhc2VQYXRoLCAkc2NoZW1lU2VwYXJhdG9yUG9zaXRpb24gKyAzKTsKfSBlbHNlIHsKJHNjaGVtZSA9ICcnOwp9CgpyZXR1cm4gJHNjaGVtZS5zZWxmOjpjYW5vbmljYWxpemUocnRyaW0oJGJhc2VQYXRoLCAnL1xcJykuJy8nLiRwYXRoKTsKfQoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1ha2VSZWxhdGl2ZShzdHJpbmcgJHBhdGgsIHN0cmluZyAkYmFzZVBhdGgpOiBzdHJpbmcKewokcGF0aCA9IHNlbGY6OmNhbm9uaWNhbGl6ZSgkcGF0aCk7CiRiYXNlUGF0aCA9IHNlbGY6OmNhbm9uaWNhbGl6ZSgkYmFzZVBhdGgpOwoKWyRyb290LCAkcmVsYXRpdmVQYXRoXSA9IHNlbGY6OnNwbGl0KCRwYXRoKTsKWyRiYXNlUm9vdCwgJHJlbGF0aXZlQmFzZVBhdGhdID0gc2VsZjo6c3BsaXQoJGJhc2VQYXRoKTsKCgoKCmlmICgnJyA9PT0gJHJvb3QgJiYgJycgIT09ICRiYXNlUm9vdCkgewoKaWYgKCcnID09PSAkcmVsYXRpdmVCYXNlUGF0aCkgewokcmVsYXRpdmVQYXRoID0gbHRyaW0oJHJlbGF0aXZlUGF0aCwgJy4vXFwnKTsKfQoKcmV0dXJuICRyZWxhdGl2ZVBhdGg7Cn0KCgoKaWYgKCcnICE9PSAkcm9vdCAmJiAnJyA9PT0gJGJhc2VSb290KSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlIGFic29sdXRlIHBhdGggIiVzIiBjYW5ub3QgYmUgbWFkZSByZWxhdGl2ZSB0byB0aGUgcmVsYXRpdmUgcGF0aCAiJXMiLiBZb3Ugc2hvdWxkIHByb3ZpZGUgYW4gYWJzb2x1dGUgYmFzZSBwYXRoIGluc3RlYWQuJywgJHBhdGgsICRiYXNlUGF0aCkpOwp9CgoKaWYgKCRiYXNlUm9vdCAmJiAkcm9vdCAhPT0gJGJhc2VSb290KSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlIHBhdGggIiVzIiBjYW5ub3QgYmUgbWFkZSByZWxhdGl2ZSB0byAiJXMiLCBiZWNhdXNlIHRoZXkgaGF2ZSBkaWZmZXJlbnQgcm9vdHMgKCIlcyIgYW5kICIlcyIpLicsICRwYXRoLCAkYmFzZVBhdGgsICRyb290LCAkYmFzZVJvb3QpKTsKfQoKaWYgKCcnID09PSAkcmVsYXRpdmVCYXNlUGF0aCkgewpyZXR1cm4gJHJlbGF0aXZlUGF0aDsKfQoKCiRwYXJ0cyA9IGV4cGxvZGUoJy8nLCAkcmVsYXRpdmVQYXRoKTsKJGJhc2VQYXJ0cyA9IGV4cGxvZGUoJy8nLCAkcmVsYXRpdmVCYXNlUGF0aCk7CiRkb3REb3RQcmVmaXggPSAnJzsKCgoKJG1hdGNoID0gdHJ1ZTsKCmZvcmVhY2ggKCRiYXNlUGFydHMgYXMgJGluZGV4ID0+ICRiYXNlUGFydCkgewppZiAoJG1hdGNoICYmIGlzc2V0KCRwYXJ0c1skaW5kZXhdKSAmJiAkYmFzZVBhcnQgPT09ICRwYXJ0c1skaW5kZXhdKSB7CnVuc2V0KCRwYXJ0c1skaW5kZXhdKTsKCmNvbnRpbnVlOwp9CgokbWF0Y2ggPSBmYWxzZTsKJGRvdERvdFByZWZpeCAuPSAnLi4vJzsKfQoKcmV0dXJuIHJ0cmltKCRkb3REb3RQcmVmaXguaW1wbG9kZSgnLycsICRwYXJ0cyksICcvJyk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNMb2NhbChzdHJpbmcgJHBhdGgpOiBib29sCnsKcmV0dXJuICcnICE9PSAkcGF0aCAmJiBmYWxzZSA9PT0gc3RycG9zKCRwYXRoLCAnOi8vJyk7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0TG9uZ2VzdENvbW1vbkJhc2VQYXRoKHN0cmluZyAuLi4kcGF0aHMpOiA/c3RyaW5nCnsKWyRicFJvb3QsICRiYXNlUGF0aF0gPSBzZWxmOjpzcGxpdChzZWxmOjpjYW5vbmljYWxpemUocmVzZXQoJHBhdGhzKSkpOwoKZm9yIChuZXh0KCRwYXRocyk7IG51bGwgIT09IGtleSgkcGF0aHMpICYmICcnICE9PSAkYmFzZVBhdGg7IG5leHQoJHBhdGhzKSkgewpbJHJvb3QsICRwYXRoXSA9IHNlbGY6OnNwbGl0KHNlbGY6OmNhbm9uaWNhbGl6ZShjdXJyZW50KCRwYXRocykpKTsKCgoKaWYgKCRyb290ICE9PSAkYnBSb290KSB7CnJldHVybiBudWxsOwp9CgoKd2hpbGUgKHRydWUpIHsKaWYgKCcuJyA9PT0gJGJhc2VQYXRoKSB7CgokYmFzZVBhdGggPSAnJzsKCgpjb250aW51ZSAyOwp9CgoKCmlmICgwID09PSBzdHJwb3MoJHBhdGguJy8nLCAkYmFzZVBhdGguJy8nKSkgewoKY29udGludWUgMjsKfQoKJGJhc2VQYXRoID0gXGRpcm5hbWUoJGJhc2VQYXRoKTsKfQp9CgpyZXR1cm4gJGJwUm9vdC4kYmFzZVBhdGg7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gam9pbihzdHJpbmcgLi4uJHBhdGhzKTogc3RyaW5nCnsKJGZpbmFsUGF0aCA9IG51bGw7CiR3YXNTY2hlbWUgPSBmYWxzZTsKCmZvcmVhY2ggKCRwYXRocyBhcyAkcGF0aCkgewppZiAoJycgPT09ICRwYXRoKSB7CmNvbnRpbnVlOwp9CgppZiAobnVsbCA9PT0gJGZpbmFsUGF0aCkgewoKJGZpbmFsUGF0aCA9ICRwYXRoOwokd2FzU2NoZW1lID0gKGZhbHNlICE9PSBzdHJwb3MoJHBhdGgsICc6Ly8nKSk7CmNvbnRpbnVlOwp9CgoKaWYgKCFcaW5fYXJyYXkoc3Vic3RyKCRmaW5hbFBhdGgsIC0xKSwgWycvJywgJ1xcJ10pKSB7CiRmaW5hbFBhdGggLj0gJy8nOwp9CgoKJGZpbmFsUGF0aCAuPSAkd2FzU2NoZW1lID8gJHBhdGggOiBsdHJpbSgkcGF0aCwgJy8nKTsKJHdhc1NjaGVtZSA9IGZhbHNlOwp9CgppZiAobnVsbCA9PT0gJGZpbmFsUGF0aCkgewpyZXR1cm4gJyc7Cn0KCnJldHVybiBzZWxmOjpjYW5vbmljYWxpemUoJGZpbmFsUGF0aCk7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0Jhc2VQYXRoKHN0cmluZyAkYmFzZVBhdGgsIHN0cmluZyAkb2ZQYXRoKTogYm9vbAp7CiRiYXNlUGF0aCA9IHNlbGY6OmNhbm9uaWNhbGl6ZSgkYmFzZVBhdGgpOwokb2ZQYXRoID0gc2VsZjo6Y2Fub25pY2FsaXplKCRvZlBhdGgpOwoKCgoKCgpyZXR1cm4gMCA9PT0gc3RycG9zKCRvZlBhdGguJy8nLCBydHJpbSgkYmFzZVBhdGgsICcvJykuJy8nKTsKfQoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZmluZENhbm9uaWNhbFBhcnRzKHN0cmluZyAkcm9vdCwgc3RyaW5nICRwYXRoV2l0aG91dFJvb3QpOiBhcnJheQp7CiRwYXJ0cyA9IGV4cGxvZGUoJy8nLCAkcGF0aFdpdGhvdXRSb290KTsKCiRjYW5vbmljYWxQYXJ0cyA9IFtdOwoKCmZvcmVhY2ggKCRwYXJ0cyBhcyAkcGFydCkgewppZiAoJy4nID09PSAkcGFydCB8fCAnJyA9PT0gJHBhcnQpIHsKY29udGludWU7Cn0KCgoKaWYgKCcuLicgPT09ICRwYXJ0ICYmIFxjb3VudCgkY2Fub25pY2FsUGFydHMpID4gMCAmJiAnLi4nICE9PSAkY2Fub25pY2FsUGFydHNbXGNvdW50KCRjYW5vbmljYWxQYXJ0cykgLSAxXSkgewphcnJheV9wb3AoJGNhbm9uaWNhbFBhcnRzKTsKCmNvbnRpbnVlOwp9CgoKaWYgKCcuLicgIT09ICRwYXJ0IHx8ICcnID09PSAkcm9vdCkgewokY2Fub25pY2FsUGFydHNbXSA9ICRwYXJ0Owp9Cn0KCnJldHVybiAkY2Fub25pY2FsUGFydHM7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gc3BsaXQoc3RyaW5nICRwYXRoKTogYXJyYXkKewppZiAoJycgPT09ICRwYXRoKSB7CnJldHVybiBbJycsICcnXTsKfQoKCmlmIChmYWxzZSAhPT0gJHNjaGVtZVNlcGFyYXRvclBvc2l0aW9uID0gc3RycG9zKCRwYXRoLCAnOi8vJykpIHsKJHJvb3QgPSBzdWJzdHIoJHBhdGgsIDAsICRzY2hlbWVTZXBhcmF0b3JQb3NpdGlvbiArIDMpOwokcGF0aCA9IHN1YnN0cigkcGF0aCwgJHNjaGVtZVNlcGFyYXRvclBvc2l0aW9uICsgMyk7Cn0gZWxzZSB7CiRyb290ID0gJyc7Cn0KCiRsZW5ndGggPSBcc3RybGVuKCRwYXRoKTsKCgppZiAoMCA9PT0gc3RycG9zKCRwYXRoLCAnLycpKSB7CiRyb290IC49ICcvJzsKJHBhdGggPSAkbGVuZ3RoID4gMSA/IHN1YnN0cigkcGF0aCwgMSkgOiAnJzsKfSBlbHNlaWYgKCRsZW5ndGggPiAxICYmIGN0eXBlX2FscGhhKCRwYXRoWzBdKSAmJiAnOicgPT09ICRwYXRoWzFdKSB7CmlmICgyID09PSAkbGVuZ3RoKSB7Cgokcm9vdCAuPSAkcGF0aC4nLyc7CiRwYXRoID0gJyc7Cn0gZWxzZWlmICgnLycgPT09ICRwYXRoWzJdKSB7Cgokcm9vdCAuPSBzdWJzdHIoJHBhdGgsIDAsIDMpOwokcGF0aCA9ICRsZW5ndGggPiAzID8gc3Vic3RyKCRwYXRoLCAzKSA6ICcnOwp9Cn0KCnJldHVybiBbJHJvb3QsICRwYXRoXTsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gdG9Mb3dlcihzdHJpbmcgJHN0cmluZyk6IHN0cmluZwp7CmlmIChmYWxzZSAhPT0gJGVuY29kaW5nID0gbWJfZGV0ZWN0X2VuY29kaW5nKCRzdHJpbmcsIG51bGwsIHRydWUpKSB7CnJldHVybiBtYl9zdHJ0b2xvd2VyKCRzdHJpbmcsICRlbmNvZGluZyk7Cn0KCnJldHVybiBzdHJ0b2xvd2VyKCRzdHJpbmcpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKewp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcQ29tcGFyYXRvcjsKCgoKCmNsYXNzIENvbXBhcmF0b3IKewpwcml2YXRlICR0YXJnZXQ7CnByaXZhdGUgJG9wZXJhdG9yID0gJz09JzsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/c3RyaW5nICR0YXJnZXQgPSBudWxsLCBzdHJpbmcgJG9wZXJhdG9yID0gJz09JykKewppZiAobnVsbCA9PT0gJHRhcmdldCkgewp0cmlnZ2VyX2RlcHJlY2F0aW9uKCdzeW1mb255L2ZpbmRlcicsICc1LjQnLCAnQ29uc3RydWN0aW5nIGEgIiVzIiB3aXRob3V0IHNldHRpbmcgIiR0YXJnZXQiIGlzIGRlcHJlY2F0ZWQuJywgX19DTEFTU19fKTsKfQoKJHRoaXMtPnRhcmdldCA9ICR0YXJnZXQ7CiR0aGlzLT5kb1NldE9wZXJhdG9yKCRvcGVyYXRvcik7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRhcmdldCgpCnsKaWYgKG51bGwgPT09ICR0aGlzLT50YXJnZXQpIHsKdHJpZ2dlcl9kZXByZWNhdGlvbignc3ltZm9ueS9maW5kZXInLCAnNS40JywgJ0NhbGxpbmcgIiVzIiB3aXRob3V0IGluaXRpYWxpemluZyB0aGUgdGFyZ2V0IGlzIGRlcHJlY2F0ZWQuJywgX19NRVRIT0RfXyk7Cn0KCnJldHVybiAkdGhpcy0+dGFyZ2V0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VGFyZ2V0KHN0cmluZyAkdGFyZ2V0KQp7CnRyaWdnZXJfZGVwcmVjYXRpb24oJ3N5bWZvbnkvZmluZGVyJywgJzUuNCcsICciJXMiIGlzIGRlcHJlY2F0ZWQuIFNldCB0aGUgdGFyZ2V0IHZpYSB0aGUgY29uc3RydWN0b3IgaW5zdGVhZC4nLCBfX01FVEhPRF9fKTsKCiR0aGlzLT50YXJnZXQgPSAkdGFyZ2V0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPcGVyYXRvcigpCnsKcmV0dXJuICR0aGlzLT5vcGVyYXRvcjsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRPcGVyYXRvcihzdHJpbmcgJG9wZXJhdG9yKQp7CnRyaWdnZXJfZGVwcmVjYXRpb24oJ3N5bWZvbnkvZmluZGVyJywgJzUuNCcsICciJXMiIGlzIGRlcHJlY2F0ZWQuIFNldCB0aGUgb3BlcmF0b3IgdmlhIHRoZSBjb25zdHJ1Y3RvciBpbnN0ZWFkLicsIF9fTUVUSE9EX18pOwoKJHRoaXMtPmRvU2V0T3BlcmF0b3IoJycgPT09ICRvcGVyYXRvciA/ICc9PScgOiAkb3BlcmF0b3IpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHRlc3QoJHRlc3QpCnsKaWYgKG51bGwgPT09ICR0aGlzLT50YXJnZXQpIHsKdHJpZ2dlcl9kZXByZWNhdGlvbignc3ltZm9ueS9maW5kZXInLCAnNS40JywgJ0NhbGxpbmcgIiVzIiB3aXRob3V0IGluaXRpYWxpemluZyB0aGUgdGFyZ2V0IGlzIGRlcHJlY2F0ZWQuJywgX19NRVRIT0RfXyk7Cn0KCnN3aXRjaCAoJHRoaXMtPm9wZXJhdG9yKSB7CmNhc2UgJz4nOgpyZXR1cm4gJHRlc3QgPiAkdGhpcy0+dGFyZ2V0OwpjYXNlICc+PSc6CnJldHVybiAkdGVzdCA+PSAkdGhpcy0+dGFyZ2V0OwpjYXNlICc8JzoKcmV0dXJuICR0ZXN0IDwgJHRoaXMtPnRhcmdldDsKY2FzZSAnPD0nOgpyZXR1cm4gJHRlc3QgPD0gJHRoaXMtPnRhcmdldDsKY2FzZSAnIT0nOgpyZXR1cm4gJHRlc3QgIT0gJHRoaXMtPnRhcmdldDsKfQoKcmV0dXJuICR0ZXN0ID09ICR0aGlzLT50YXJnZXQ7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZG9TZXRPcGVyYXRvcihzdHJpbmcgJG9wZXJhdG9yKTogdm9pZAp7CmlmICghXGluX2FycmF5KCRvcGVyYXRvciwgWyc+JywgJzwnLCAnPj0nLCAnPD0nLCAnPT0nLCAnIT0nXSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignSW52YWxpZCBvcGVyYXRvciAiJXMiLicsICRvcGVyYXRvcikpOwp9CgokdGhpcy0+b3BlcmF0b3IgPSAkb3BlcmF0b3I7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxDb21wYXJhdG9yOwoKCgoKCgpjbGFzcyBEYXRlQ29tcGFyYXRvciBleHRlbmRzIENvbXBhcmF0b3IKewoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHRlc3QpCnsKaWYgKCFwcmVnX21hdGNoKCcjXlxzKig9PXwhPXxbPD5dPT98YWZ0ZXJ8c2luY2V8YmVmb3JlfHVudGlsKT9ccyooLis/KVxzKiQjaScsICR0ZXN0LCAkbWF0Y2hlcykpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignRG9uXCd0IHVuZGVyc3RhbmQgIiVzIiBhcyBhIGRhdGUgdGVzdC4nLCAkdGVzdCkpOwp9Cgp0cnkgewokZGF0ZSA9IG5ldyBcRGF0ZVRpbWUoJG1hdGNoZXNbMl0pOwokdGFyZ2V0ID0gJGRhdGUtPmZvcm1hdCgnVScpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJyIlcyIgaXMgbm90IGEgdmFsaWQgZGF0ZS4nLCAkbWF0Y2hlc1syXSkpOwp9Cgokb3BlcmF0b3IgPSAkbWF0Y2hlc1sxXSA/PyAnPT0nOwppZiAoJ3NpbmNlJyA9PT0gJG9wZXJhdG9yIHx8ICdhZnRlcicgPT09ICRvcGVyYXRvcikgewokb3BlcmF0b3IgPSAnPic7Cn0KCmlmICgndW50aWwnID09PSAkb3BlcmF0b3IgfHwgJ2JlZm9yZScgPT09ICRvcGVyYXRvcikgewokb3BlcmF0b3IgPSAnPCc7Cn0KCnBhcmVudDo6X19jb25zdHJ1Y3QoJHRhcmdldCwgJG9wZXJhdG9yKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXENvbXBhcmF0b3I7CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpjbGFzcyBOdW1iZXJDb21wYXJhdG9yIGV4dGVuZHMgQ29tcGFyYXRvcgp7CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9zdHJpbmcgJHRlc3QpCnsKaWYgKG51bGwgPT09ICR0ZXN0IHx8ICFwcmVnX21hdGNoKCcjXlxzKig9PXwhPXxbPD5dPT8pP1xzKihbMC05XC5dKylccyooW2ttZ11pPyk/XHMqJCNpJywgJHRlc3QsICRtYXRjaGVzKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdEb25cJ3QgdW5kZXJzdGFuZCAiJXMiIGFzIGEgbnVtYmVyIHRlc3QuJywgJHRlc3QgPz8gJ251bGwnKSk7Cn0KCiR0YXJnZXQgPSAkbWF0Y2hlc1syXTsKaWYgKCFpc19udW1lcmljKCR0YXJnZXQpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ0ludmFsaWQgbnVtYmVyICIlcyIuJywgJHRhcmdldCkpOwp9CmlmIChpc3NldCgkbWF0Y2hlc1szXSkpIHsKCnN3aXRjaCAoc3RydG9sb3dlcigkbWF0Y2hlc1szXSkpIHsKY2FzZSAnayc6CiR0YXJnZXQgKj0gMTAwMDsKYnJlYWs7CmNhc2UgJ2tpJzoKJHRhcmdldCAqPSAxMDI0OwpicmVhazsKY2FzZSAnbSc6CiR0YXJnZXQgKj0gMTAwMDAwMDsKYnJlYWs7CmNhc2UgJ21pJzoKJHRhcmdldCAqPSAxMDI0ICogMTAyNDsKYnJlYWs7CmNhc2UgJ2cnOgokdGFyZ2V0ICo9IDEwMDAwMDAwMDA7CmJyZWFrOwpjYXNlICdnaSc6CiR0YXJnZXQgKj0gMTAyNCAqIDEwMjQgKiAxMDI0OwpicmVhazsKfQp9CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCR0YXJnZXQsICRtYXRjaGVzWzFdID86ICc9PScpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcRXhjZXB0aW9uOwoKCgoKY2xhc3MgQWNjZXNzRGVuaWVkRXhjZXB0aW9uIGV4dGVuZHMgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbgp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcRXhjZXB0aW9uOwoKCgoKY2xhc3MgRGlyZWN0b3J5Tm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uCnsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcQ29tcGFyYXRvclxEYXRlQ29tcGFyYXRvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxDb21wYXJhdG9yXE51bWJlckNvbXBhcmF0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcRXhjZXB0aW9uXERpcmVjdG9yeU5vdEZvdW5kRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yXEN1c3RvbUZpbHRlckl0ZXJhdG9yOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yXERhdGVSYW5nZUZpbHRlckl0ZXJhdG9yOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yXERlcHRoUmFuZ2VGaWx0ZXJJdGVyYXRvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvclxFeGNsdWRlRGlyZWN0b3J5RmlsdGVySXRlcmF0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3JcRmlsZWNvbnRlbnRGaWx0ZXJJdGVyYXRvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvclxGaWxlbmFtZUZpbHRlckl0ZXJhdG9yOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yXExhenlJdGVyYXRvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvclxTaXplUmFuZ2VGaWx0ZXJJdGVyYXRvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvclxTb3J0YWJsZUl0ZXJhdG9yOwoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgRmluZGVyIGltcGxlbWVudHMgXEl0ZXJhdG9yQWdncmVnYXRlLCBcQ291bnRhYmxlCnsKcHVibGljIGNvbnN0IElHTk9SRV9WQ1NfRklMRVMgPSAxOwpwdWJsaWMgY29uc3QgSUdOT1JFX0RPVF9GSUxFUyA9IDI7CnB1YmxpYyBjb25zdCBJR05PUkVfVkNTX0lHTk9SRURfRklMRVMgPSA0OwoKcHJpdmF0ZSAkbW9kZSA9IDA7CnByaXZhdGUgJG5hbWVzID0gW107CnByaXZhdGUgJG5vdE5hbWVzID0gW107CnByaXZhdGUgJGV4Y2x1ZGUgPSBbXTsKcHJpdmF0ZSAkZmlsdGVycyA9IFtdOwpwcml2YXRlICRkZXB0aHMgPSBbXTsKcHJpdmF0ZSAkc2l6ZXMgPSBbXTsKcHJpdmF0ZSAkZm9sbG93TGlua3MgPSBmYWxzZTsKcHJpdmF0ZSAkcmV2ZXJzZVNvcnRpbmcgPSBmYWxzZTsKcHJpdmF0ZSAkc29ydCA9IGZhbHNlOwpwcml2YXRlICRpZ25vcmUgPSAwOwpwcml2YXRlICRkaXJzID0gW107CnByaXZhdGUgJGRhdGVzID0gW107CnByaXZhdGUgJGl0ZXJhdG9ycyA9IFtdOwpwcml2YXRlICRjb250YWlucyA9IFtdOwpwcml2YXRlICRub3RDb250YWlucyA9IFtdOwpwcml2YXRlICRwYXRocyA9IFtdOwpwcml2YXRlICRub3RQYXRocyA9IFtdOwpwcml2YXRlICRpZ25vcmVVbnJlYWRhYmxlRGlycyA9IGZhbHNlOwoKcHJpdmF0ZSBzdGF0aWMgJHZjc1BhdHRlcm5zID0gWycuc3ZuJywgJ19zdm4nLCAnQ1ZTJywgJ19kYXJjcycsICcuYXJjaC1wYXJhbXMnLCAnLm1vbm90b25lJywgJy5ienInLCAnLmdpdCcsICcuaGcnXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCnsKJHRoaXMtPmlnbm9yZSA9IHN0YXRpYzo6SUdOT1JFX1ZDU19GSUxFUyB8IHN0YXRpYzo6SUdOT1JFX0RPVF9GSUxFUzsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZSgpCnsKcmV0dXJuIG5ldyBzdGF0aWMoKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGlyZWN0b3JpZXMoKQp7CiR0aGlzLT5tb2RlID0gSXRlcmF0b3JcRmlsZVR5cGVGaWx0ZXJJdGVyYXRvcjo6T05MWV9ESVJFQ1RPUklFUzsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmlsZXMoKQp7CiR0aGlzLT5tb2RlID0gSXRlcmF0b3JcRmlsZVR5cGVGaWx0ZXJJdGVyYXRvcjo6T05MWV9GSUxFUzsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkZXB0aCgkbGV2ZWxzKQp7CmZvcmVhY2ggKChhcnJheSkgJGxldmVscyBhcyAkbGV2ZWwpIHsKJHRoaXMtPmRlcHRoc1tdID0gbmV3IENvbXBhcmF0b3JcTnVtYmVyQ29tcGFyYXRvcigkbGV2ZWwpOwp9CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGF0ZSgkZGF0ZXMpCnsKZm9yZWFjaCAoKGFycmF5KSAkZGF0ZXMgYXMgJGRhdGUpIHsKJHRoaXMtPmRhdGVzW10gPSBuZXcgQ29tcGFyYXRvclxEYXRlQ29tcGFyYXRvcigkZGF0ZSk7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBuYW1lKCRwYXR0ZXJucykKewokdGhpcy0+bmFtZXMgPSBhcnJheV9tZXJnZSgkdGhpcy0+bmFtZXMsIChhcnJheSkgJHBhdHRlcm5zKTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG5vdE5hbWUoJHBhdHRlcm5zKQp7CiR0aGlzLT5ub3ROYW1lcyA9IGFycmF5X21lcmdlKCR0aGlzLT5ub3ROYW1lcywgKGFycmF5KSAkcGF0dGVybnMpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29udGFpbnMoJHBhdHRlcm5zKQp7CiR0aGlzLT5jb250YWlucyA9IGFycmF5X21lcmdlKCR0aGlzLT5jb250YWlucywgKGFycmF5KSAkcGF0dGVybnMpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbm90Q29udGFpbnMoJHBhdHRlcm5zKQp7CiR0aGlzLT5ub3RDb250YWlucyA9IGFycmF5X21lcmdlKCR0aGlzLT5ub3RDb250YWlucywgKGFycmF5KSAkcGF0dGVybnMpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwYXRoKCRwYXR0ZXJucykKewokdGhpcy0+cGF0aHMgPSBhcnJheV9tZXJnZSgkdGhpcy0+cGF0aHMsIChhcnJheSkgJHBhdHRlcm5zKTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbm90UGF0aCgkcGF0dGVybnMpCnsKJHRoaXMtPm5vdFBhdGhzID0gYXJyYXlfbWVyZ2UoJHRoaXMtPm5vdFBhdGhzLCAoYXJyYXkpICRwYXR0ZXJucyk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzaXplKCRzaXplcykKewpmb3JlYWNoICgoYXJyYXkpICRzaXplcyBhcyAkc2l6ZSkgewokdGhpcy0+c2l6ZXNbXSA9IG5ldyBDb21wYXJhdG9yXE51bWJlckNvbXBhcmF0b3IoJHNpemUpOwp9CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXhjbHVkZSgkZGlycykKewokdGhpcy0+ZXhjbHVkZSA9IGFycmF5X21lcmdlKCR0aGlzLT5leGNsdWRlLCAoYXJyYXkpICRkaXJzKTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlnbm9yZURvdEZpbGVzKGJvb2wgJGlnbm9yZURvdEZpbGVzKQp7CmlmICgkaWdub3JlRG90RmlsZXMpIHsKJHRoaXMtPmlnbm9yZSB8PSBzdGF0aWM6OklHTk9SRV9ET1RfRklMRVM7Cn0gZWxzZSB7CiR0aGlzLT5pZ25vcmUgJj0gfnN0YXRpYzo6SUdOT1JFX0RPVF9GSUxFUzsKfQoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaWdub3JlVkNTKGJvb2wgJGlnbm9yZVZDUykKewppZiAoJGlnbm9yZVZDUykgewokdGhpcy0+aWdub3JlIHw9IHN0YXRpYzo6SUdOT1JFX1ZDU19GSUxFUzsKfSBlbHNlIHsKJHRoaXMtPmlnbm9yZSAmPSB+c3RhdGljOjpJR05PUkVfVkNTX0ZJTEVTOwp9CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaWdub3JlVkNTSWdub3JlZChib29sICRpZ25vcmVWQ1NJZ25vcmVkKQp7CmlmICgkaWdub3JlVkNTSWdub3JlZCkgewokdGhpcy0+aWdub3JlIHw9IHN0YXRpYzo6SUdOT1JFX1ZDU19JR05PUkVEX0ZJTEVTOwp9IGVsc2UgewokdGhpcy0+aWdub3JlICY9IH5zdGF0aWM6OklHTk9SRV9WQ1NfSUdOT1JFRF9GSUxFUzsKfQoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhZGRWQ1NQYXR0ZXJuKCRwYXR0ZXJuKQp7CmZvcmVhY2ggKChhcnJheSkgJHBhdHRlcm4gYXMgJHApIHsKc2VsZjo6JHZjc1BhdHRlcm5zW10gPSAkcDsKfQoKc2VsZjo6JHZjc1BhdHRlcm5zID0gYXJyYXlfdW5pcXVlKHNlbGY6OiR2Y3NQYXR0ZXJucyk7Cn0KCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNvcnQoXENsb3N1cmUgJGNsb3N1cmUpCnsKJHRoaXMtPnNvcnQgPSAkY2xvc3VyZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNvcnRCeU5hbWUoYm9vbCAkdXNlTmF0dXJhbFNvcnQgPSBmYWxzZSkKewokdGhpcy0+c29ydCA9ICR1c2VOYXR1cmFsU29ydCA/IEl0ZXJhdG9yXFNvcnRhYmxlSXRlcmF0b3I6OlNPUlRfQllfTkFNRV9OQVRVUkFMIDogSXRlcmF0b3JcU29ydGFibGVJdGVyYXRvcjo6U09SVF9CWV9OQU1FOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc29ydEJ5VHlwZSgpCnsKJHRoaXMtPnNvcnQgPSBJdGVyYXRvclxTb3J0YWJsZUl0ZXJhdG9yOjpTT1JUX0JZX1RZUEU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNvcnRCeUFjY2Vzc2VkVGltZSgpCnsKJHRoaXMtPnNvcnQgPSBJdGVyYXRvclxTb3J0YWJsZUl0ZXJhdG9yOjpTT1JUX0JZX0FDQ0VTU0VEX1RJTUU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJldmVyc2VTb3J0aW5nKCkKewokdGhpcy0+cmV2ZXJzZVNvcnRpbmcgPSB0cnVlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNvcnRCeUNoYW5nZWRUaW1lKCkKewokdGhpcy0+c29ydCA9IEl0ZXJhdG9yXFNvcnRhYmxlSXRlcmF0b3I6OlNPUlRfQllfQ0hBTkdFRF9USU1FOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzb3J0QnlNb2RpZmllZFRpbWUoKQp7CiR0aGlzLT5zb3J0ID0gSXRlcmF0b3JcU29ydGFibGVJdGVyYXRvcjo6U09SVF9CWV9NT0RJRklFRF9USU1FOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbHRlcihcQ2xvc3VyZSAkY2xvc3VyZSkKewokdGhpcy0+ZmlsdGVyc1tdID0gJGNsb3N1cmU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZvbGxvd0xpbmtzKCkKewokdGhpcy0+Zm9sbG93TGlua3MgPSB0cnVlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlnbm9yZVVucmVhZGFibGVEaXJzKGJvb2wgJGlnbm9yZSA9IHRydWUpCnsKJHRoaXMtPmlnbm9yZVVucmVhZGFibGVEaXJzID0gJGlnbm9yZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGluKCRkaXJzKQp7CiRyZXNvbHZlZERpcnMgPSBbXTsKCmZvcmVhY2ggKChhcnJheSkgJGRpcnMgYXMgJGRpcikgewppZiAoaXNfZGlyKCRkaXIpKSB7CiRyZXNvbHZlZERpcnNbXSA9IFskdGhpcy0+bm9ybWFsaXplRGlyKCRkaXIpXTsKfSBlbHNlaWYgKCRnbG9iID0gZ2xvYigkZGlyLCAoXGRlZmluZWQoJ0dMT0JfQlJBQ0UnKSA/IFxHTE9CX0JSQUNFIDogMCkgfCBcR0xPQl9PTkxZRElSIHwgXEdMT0JfTk9TT1JUKSkgewpzb3J0KCRnbG9iKTsKJHJlc29sdmVkRGlyc1tdID0gYXJyYXlfbWFwKFskdGhpcywgJ25vcm1hbGl6ZURpciddLCAkZ2xvYik7Cn0gZWxzZSB7CnRocm93IG5ldyBEaXJlY3RvcnlOb3RGb3VuZEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgIiVzIiBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuJywgJGRpcikpOwp9Cn0KCiR0aGlzLT5kaXJzID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmRpcnMsIC4uLiRyZXNvbHZlZERpcnMpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGdldEl0ZXJhdG9yKCkKewppZiAoMCA9PT0gXGNvdW50KCR0aGlzLT5kaXJzKSAmJiAwID09PSBcY291bnQoJHRoaXMtPml0ZXJhdG9ycykpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignWW91IG11c3QgY2FsbCBvbmUgb2YgaW4oKSBvciBhcHBlbmQoKSBtZXRob2RzIGJlZm9yZSBpdGVyYXRpbmcgb3ZlciBhIEZpbmRlci4nKTsKfQoKaWYgKDEgPT09IFxjb3VudCgkdGhpcy0+ZGlycykgJiYgMCA9PT0gXGNvdW50KCR0aGlzLT5pdGVyYXRvcnMpKSB7CiRpdGVyYXRvciA9ICR0aGlzLT5zZWFyY2hJbkRpcmVjdG9yeSgkdGhpcy0+ZGlyc1swXSk7CgppZiAoJHRoaXMtPnNvcnQgfHwgJHRoaXMtPnJldmVyc2VTb3J0aW5nKSB7CiRpdGVyYXRvciA9IChuZXcgSXRlcmF0b3JcU29ydGFibGVJdGVyYXRvcigkaXRlcmF0b3IsICR0aGlzLT5zb3J0LCAkdGhpcy0+cmV2ZXJzZVNvcnRpbmcpKS0+Z2V0SXRlcmF0b3IoKTsKfQoKcmV0dXJuICRpdGVyYXRvcjsKfQoKJGl0ZXJhdG9yID0gbmV3IFxBcHBlbmRJdGVyYXRvcigpOwpmb3JlYWNoICgkdGhpcy0+ZGlycyBhcyAkZGlyKSB7CiRpdGVyYXRvci0+YXBwZW5kKG5ldyBcSXRlcmF0b3JJdGVyYXRvcihuZXcgTGF6eUl0ZXJhdG9yKGZ1bmN0aW9uICgpIHVzZSAoJGRpcikgewpyZXR1cm4gJHRoaXMtPnNlYXJjaEluRGlyZWN0b3J5KCRkaXIpOwp9KSkpOwp9Cgpmb3JlYWNoICgkdGhpcy0+aXRlcmF0b3JzIGFzICRpdCkgewokaXRlcmF0b3ItPmFwcGVuZCgkaXQpOwp9CgppZiAoJHRoaXMtPnNvcnQgfHwgJHRoaXMtPnJldmVyc2VTb3J0aW5nKSB7CiRpdGVyYXRvciA9IChuZXcgSXRlcmF0b3JcU29ydGFibGVJdGVyYXRvcigkaXRlcmF0b3IsICR0aGlzLT5zb3J0LCAkdGhpcy0+cmV2ZXJzZVNvcnRpbmcpKS0+Z2V0SXRlcmF0b3IoKTsKfQoKcmV0dXJuICRpdGVyYXRvcjsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFwcGVuZChpdGVyYWJsZSAkaXRlcmF0b3IpCnsKaWYgKCRpdGVyYXRvciBpbnN0YW5jZW9mIFxJdGVyYXRvckFnZ3JlZ2F0ZSkgewokdGhpcy0+aXRlcmF0b3JzW10gPSAkaXRlcmF0b3ItPmdldEl0ZXJhdG9yKCk7Cn0gZWxzZWlmICgkaXRlcmF0b3IgaW5zdGFuY2VvZiBcSXRlcmF0b3IpIHsKJHRoaXMtPml0ZXJhdG9yc1tdID0gJGl0ZXJhdG9yOwp9IGVsc2VpZiAoaXNfaXRlcmFibGUoJGl0ZXJhdG9yKSkgewokaXQgPSBuZXcgXEFycmF5SXRlcmF0b3IoKTsKZm9yZWFjaCAoJGl0ZXJhdG9yIGFzICRmaWxlKSB7CiRmaWxlID0gJGZpbGUgaW5zdGFuY2VvZiBcU3BsRmlsZUluZm8gPyAkZmlsZSA6IG5ldyBcU3BsRmlsZUluZm8oJGZpbGUpOwokaXRbJGZpbGUtPmdldFBhdGhuYW1lKCldID0gJGZpbGU7Cn0KJHRoaXMtPml0ZXJhdG9yc1tdID0gJGl0Owp9IGVsc2Ugewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignRmluZGVyOjphcHBlbmQoKSBtZXRob2Qgd3JvbmcgYXJndW1lbnQgdHlwZS4nKTsKfQoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNSZXN1bHRzKCkKewpmb3JlYWNoICgkdGhpcy0+Z2V0SXRlcmF0b3IoKSBhcyAkXykgewpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gY291bnQoKQp7CnJldHVybiBpdGVyYXRvcl9jb3VudCgkdGhpcy0+Z2V0SXRlcmF0b3IoKSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gc2VhcmNoSW5EaXJlY3Rvcnkoc3RyaW5nICRkaXIpOiBcSXRlcmF0b3IKewokZXhjbHVkZSA9ICR0aGlzLT5leGNsdWRlOwokbm90UGF0aHMgPSAkdGhpcy0+bm90UGF0aHM7CgppZiAoc3RhdGljOjpJR05PUkVfVkNTX0ZJTEVTID09PSAoc3RhdGljOjpJR05PUkVfVkNTX0ZJTEVTICYgJHRoaXMtPmlnbm9yZSkpIHsKJGV4Y2x1ZGUgPSBhcnJheV9tZXJnZSgkZXhjbHVkZSwgc2VsZjo6JHZjc1BhdHRlcm5zKTsKfQoKaWYgKHN0YXRpYzo6SUdOT1JFX0RPVF9GSUxFUyA9PT0gKHN0YXRpYzo6SUdOT1JFX0RPVF9GSUxFUyAmICR0aGlzLT5pZ25vcmUpKSB7CiRub3RQYXRoc1tdID0gJyMoXnwvKVwuLisoL3wkKSMnOwp9CgokbWluRGVwdGggPSAwOwokbWF4RGVwdGggPSBcUEhQX0lOVF9NQVg7Cgpmb3JlYWNoICgkdGhpcy0+ZGVwdGhzIGFzICRjb21wYXJhdG9yKSB7CnN3aXRjaCAoJGNvbXBhcmF0b3ItPmdldE9wZXJhdG9yKCkpIHsKY2FzZSAnPic6CiRtaW5EZXB0aCA9ICRjb21wYXJhdG9yLT5nZXRUYXJnZXQoKSArIDE7CmJyZWFrOwpjYXNlICc+PSc6CiRtaW5EZXB0aCA9ICRjb21wYXJhdG9yLT5nZXRUYXJnZXQoKTsKYnJlYWs7CmNhc2UgJzwnOgokbWF4RGVwdGggPSAkY29tcGFyYXRvci0+Z2V0VGFyZ2V0KCkgLSAxOwpicmVhazsKY2FzZSAnPD0nOgokbWF4RGVwdGggPSAkY29tcGFyYXRvci0+Z2V0VGFyZ2V0KCk7CmJyZWFrOwpkZWZhdWx0OgokbWluRGVwdGggPSAkbWF4RGVwdGggPSAkY29tcGFyYXRvci0+Z2V0VGFyZ2V0KCk7Cn0KfQoKJGZsYWdzID0gXFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yOjpTS0lQX0RPVFM7CgppZiAoJHRoaXMtPmZvbGxvd0xpbmtzKSB7CiRmbGFncyB8PSBcUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3I6OkZPTExPV19TWU1MSU5LUzsKfQoKJGl0ZXJhdG9yID0gbmV3IEl0ZXJhdG9yXFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRkaXIsICRmbGFncywgJHRoaXMtPmlnbm9yZVVucmVhZGFibGVEaXJzKTsKCmlmICgkZXhjbHVkZSkgewokaXRlcmF0b3IgPSBuZXcgSXRlcmF0b3JcRXhjbHVkZURpcmVjdG9yeUZpbHRlckl0ZXJhdG9yKCRpdGVyYXRvciwgJGV4Y2x1ZGUpOwp9CgokaXRlcmF0b3IgPSBuZXcgXFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoJGl0ZXJhdG9yLCBcUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcjo6U0VMRl9GSVJTVCk7CgppZiAoJG1pbkRlcHRoID4gMCB8fCAkbWF4RGVwdGggPCBcUEhQX0lOVF9NQVgpIHsKJGl0ZXJhdG9yID0gbmV3IEl0ZXJhdG9yXERlcHRoUmFuZ2VGaWx0ZXJJdGVyYXRvcigkaXRlcmF0b3IsICRtaW5EZXB0aCwgJG1heERlcHRoKTsKfQoKaWYgKCR0aGlzLT5tb2RlKSB7CiRpdGVyYXRvciA9IG5ldyBJdGVyYXRvclxGaWxlVHlwZUZpbHRlckl0ZXJhdG9yKCRpdGVyYXRvciwgJHRoaXMtPm1vZGUpOwp9CgppZiAoJHRoaXMtPm5hbWVzIHx8ICR0aGlzLT5ub3ROYW1lcykgewokaXRlcmF0b3IgPSBuZXcgSXRlcmF0b3JcRmlsZW5hbWVGaWx0ZXJJdGVyYXRvcigkaXRlcmF0b3IsICR0aGlzLT5uYW1lcywgJHRoaXMtPm5vdE5hbWVzKTsKfQoKaWYgKCR0aGlzLT5jb250YWlucyB8fCAkdGhpcy0+bm90Q29udGFpbnMpIHsKJGl0ZXJhdG9yID0gbmV3IEl0ZXJhdG9yXEZpbGVjb250ZW50RmlsdGVySXRlcmF0b3IoJGl0ZXJhdG9yLCAkdGhpcy0+Y29udGFpbnMsICR0aGlzLT5ub3RDb250YWlucyk7Cn0KCmlmICgkdGhpcy0+c2l6ZXMpIHsKJGl0ZXJhdG9yID0gbmV3IEl0ZXJhdG9yXFNpemVSYW5nZUZpbHRlckl0ZXJhdG9yKCRpdGVyYXRvciwgJHRoaXMtPnNpemVzKTsKfQoKaWYgKCR0aGlzLT5kYXRlcykgewokaXRlcmF0b3IgPSBuZXcgSXRlcmF0b3JcRGF0ZVJhbmdlRmlsdGVySXRlcmF0b3IoJGl0ZXJhdG9yLCAkdGhpcy0+ZGF0ZXMpOwp9CgppZiAoJHRoaXMtPmZpbHRlcnMpIHsKJGl0ZXJhdG9yID0gbmV3IEl0ZXJhdG9yXEN1c3RvbUZpbHRlckl0ZXJhdG9yKCRpdGVyYXRvciwgJHRoaXMtPmZpbHRlcnMpOwp9CgppZiAoJHRoaXMtPnBhdGhzIHx8ICRub3RQYXRocykgewokaXRlcmF0b3IgPSBuZXcgSXRlcmF0b3JcUGF0aEZpbHRlckl0ZXJhdG9yKCRpdGVyYXRvciwgJHRoaXMtPnBhdGhzLCAkbm90UGF0aHMpOwp9CgppZiAoc3RhdGljOjpJR05PUkVfVkNTX0lHTk9SRURfRklMRVMgPT09IChzdGF0aWM6OklHTk9SRV9WQ1NfSUdOT1JFRF9GSUxFUyAmICR0aGlzLT5pZ25vcmUpKSB7CiRpdGVyYXRvciA9IG5ldyBJdGVyYXRvclxWY3NJZ25vcmVkRmlsdGVySXRlcmF0b3IoJGl0ZXJhdG9yLCAkZGlyKTsKfQoKcmV0dXJuICRpdGVyYXRvcjsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIG5vcm1hbGl6ZURpcihzdHJpbmcgJGRpcik6IHN0cmluZwp7CmlmICgnLycgPT09ICRkaXIpIHsKcmV0dXJuICRkaXI7Cn0KCiRkaXIgPSBydHJpbSgkZGlyLCAnLycuXERJUkVDVE9SWV9TRVBBUkFUT1IpOwoKaWYgKHByZWdfbWF0Y2goJyNeKHNzaDJcLik/cz9mdHA6Ly8jJywgJGRpcikpIHsKJGRpciAuPSAnLyc7Cn0KCnJldHVybiAkZGlyOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXI7CgoKCgoKCgpjbGFzcyBHaXRpZ25vcmUKewoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdG9SZWdleChzdHJpbmcgJGdpdGlnbm9yZUZpbGVDb250ZW50KTogc3RyaW5nCnsKcmV0dXJuIHNlbGY6OmJ1aWxkUmVnZXgoJGdpdGlnbm9yZUZpbGVDb250ZW50LCBmYWxzZSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdG9SZWdleE1hdGNoaW5nTmVnYXRlZFBhdHRlcm5zKHN0cmluZyAkZ2l0aWdub3JlRmlsZUNvbnRlbnQpOiBzdHJpbmcKewpyZXR1cm4gc2VsZjo6YnVpbGRSZWdleCgkZ2l0aWdub3JlRmlsZUNvbnRlbnQsIHRydWUpOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBidWlsZFJlZ2V4KHN0cmluZyAkZ2l0aWdub3JlRmlsZUNvbnRlbnQsIGJvb2wgJGludmVydGVkKTogc3RyaW5nCnsKJGdpdGlnbm9yZUZpbGVDb250ZW50ID0gcHJlZ19yZXBsYWNlKCd+KD88IVxcXFwpI1teXG5ccl0qficsICcnLCAkZ2l0aWdub3JlRmlsZUNvbnRlbnQpOwokZ2l0aWdub3JlTGluZXMgPSBwcmVnX3NwbGl0KCd+XHJcbj98XG5+JywgJGdpdGlnbm9yZUZpbGVDb250ZW50KTsKCiRyZXMgPSBzZWxmOjpsaW5lVG9SZWdleCgnJyk7CmZvcmVhY2ggKCRnaXRpZ25vcmVMaW5lcyBhcyAkbGluZSkgewokbGluZSA9IHByZWdfcmVwbGFjZSgnfig/PCFcXFxcKVsgXHRdKyR+JywgJycsICRsaW5lKTsKCmlmICgnIScgPT09IHN1YnN0cigkbGluZSwgMCwgMSkpIHsKJGxpbmUgPSBzdWJzdHIoJGxpbmUsIDEpOwokaXNOZWdhdGl2ZSA9IHRydWU7Cn0gZWxzZSB7CiRpc05lZ2F0aXZlID0gZmFsc2U7Cn0KCmlmICgnJyAhPT0gJGxpbmUpIHsKaWYgKCRpc05lZ2F0aXZlIHhvciAkaW52ZXJ0ZWQpIHsKJHJlcyA9ICcoPyEnLnNlbGY6OmxpbmVUb1JlZ2V4KCRsaW5lKS4nJCknLiRyZXM7Cn0gZWxzZSB7CiRyZXMgPSAnKD86Jy4kcmVzLid8Jy5zZWxmOjpsaW5lVG9SZWdleCgkbGluZSkuJyknOwp9Cn0KfQoKcmV0dXJuICd+Xig/OicuJHJlcy4nKX5zJzsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gbGluZVRvUmVnZXgoc3RyaW5nICRnaXRpZ25vcmVMaW5lKTogc3RyaW5nCnsKaWYgKCcnID09PSAkZ2l0aWdub3JlTGluZSkgewpyZXR1cm4gJyRmJzsgCn0KCiRzbGFzaFBvcyA9IHN0cnBvcygkZ2l0aWdub3JlTGluZSwgJy8nKTsKaWYgKGZhbHNlICE9PSAkc2xhc2hQb3MgJiYgXHN0cmxlbigkZ2l0aWdub3JlTGluZSkgLSAxICE9PSAkc2xhc2hQb3MpIHsKaWYgKDAgPT09ICRzbGFzaFBvcykgewokZ2l0aWdub3JlTGluZSA9IHN1YnN0cigkZ2l0aWdub3JlTGluZSwgMSk7Cn0KJGlzQWJzb2x1dGUgPSB0cnVlOwp9IGVsc2UgewokaXNBYnNvbHV0ZSA9IGZhbHNlOwp9CgokcmVnZXggPSBwcmVnX3F1b3RlKHN0cl9yZXBsYWNlKCdcXCcsICcnLCAkZ2l0aWdub3JlTGluZSksICd+Jyk7CiRyZWdleCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygnflxcXFxcWygoPzpcXFxcISk/KShbXlxbXF1dKilcXFxcXF1+JywgZnVuY3Rpb24gKGFycmF5ICRtYXRjaGVzKTogc3RyaW5nIHsKcmV0dXJuICdbJy4oJycgIT09ICRtYXRjaGVzWzFdID8gJ14nIDogJycpLnN0cl9yZXBsYWNlKCdcXC0nLCAnLScsICRtYXRjaGVzWzJdKS4nXSc7Cn0sICRyZWdleCk7CiRyZWdleCA9IHByZWdfcmVwbGFjZSgnfig/Oig/OlxcXFxcKil7Mix9KC8/KSkrficsICcoPzooPzooPyEvLykuKD88IS8vKSkrJDEpPycsICRyZWdleCk7CiRyZWdleCA9IHByZWdfcmVwbGFjZSgnflxcXFxcKn4nLCAnW14vXSonLCAkcmVnZXgpOwokcmVnZXggPSBwcmVnX3JlcGxhY2UoJ35cXFxcXD9+JywgJ1teL10nLCAkcmVnZXgpOwoKcmV0dXJuICgkaXNBYnNvbHV0ZSA/ICcnIDogJyg/OlteL10rLykqJykKLiRyZWdleAouKCFzdHJfZW5kc193aXRoKCRnaXRpZ25vcmVMaW5lLCAnLycpID8gJyg/OiR8LyknIDogJycpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXI7CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgR2xvYgp7CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0b1JlZ2V4KHN0cmluZyAkZ2xvYiwgYm9vbCAkc3RyaWN0TGVhZGluZ0RvdCA9IHRydWUsIGJvb2wgJHN0cmljdFdpbGRjYXJkU2xhc2ggPSB0cnVlLCBzdHJpbmcgJGRlbGltaXRlciA9ICcjJykKewokZmlyc3RCeXRlID0gdHJ1ZTsKJGVzY2FwaW5nID0gZmFsc2U7CiRpbkN1cmxpZXMgPSAwOwokcmVnZXggPSAnJzsKJHNpemVHbG9iID0gXHN0cmxlbigkZ2xvYik7CmZvciAoJGkgPSAwOyAkaSA8ICRzaXplR2xvYjsgKyskaSkgewokY2FyID0gJGdsb2JbJGldOwppZiAoJGZpcnN0Qnl0ZSAmJiAkc3RyaWN0TGVhZGluZ0RvdCAmJiAnLicgIT09ICRjYXIpIHsKJHJlZ2V4IC49ICcoPz1bXlwuXSknOwp9CgokZmlyc3RCeXRlID0gJy8nID09PSAkY2FyOwoKaWYgKCRmaXJzdEJ5dGUgJiYgJHN0cmljdFdpbGRjYXJkU2xhc2ggJiYgaXNzZXQoJGdsb2JbJGkgKyAyXSkgJiYgJyoqJyA9PT0gJGdsb2JbJGkgKyAxXS4kZ2xvYlskaSArIDJdICYmICghaXNzZXQoJGdsb2JbJGkgKyAzXSkgfHwgJy8nID09PSAkZ2xvYlskaSArIDNdKSkgewokY2FyID0gJ1teL10rKy8nOwppZiAoIWlzc2V0KCRnbG9iWyRpICsgM10pKSB7CiRjYXIgLj0gJz8nOwp9CgppZiAoJHN0cmljdExlYWRpbmdEb3QpIHsKJGNhciA9ICcoPz1bXlwuXSknLiRjYXI7Cn0KCiRjYXIgPSAnLyg/OicuJGNhci4nKSonOwokaSArPSAyICsgaXNzZXQoJGdsb2JbJGkgKyAzXSk7CgppZiAoJy8nID09PSAkZGVsaW1pdGVyKSB7CiRjYXIgPSBzdHJfcmVwbGFjZSgnLycsICdcXC8nLCAkY2FyKTsKfQp9CgppZiAoJGRlbGltaXRlciA9PT0gJGNhciB8fCAnLicgPT09ICRjYXIgfHwgJygnID09PSAkY2FyIHx8ICcpJyA9PT0gJGNhciB8fCAnfCcgPT09ICRjYXIgfHwgJysnID09PSAkY2FyIHx8ICdeJyA9PT0gJGNhciB8fCAnJCcgPT09ICRjYXIpIHsKJHJlZ2V4IC49ICJcXCRjYXIiOwp9IGVsc2VpZiAoJyonID09PSAkY2FyKSB7CiRyZWdleCAuPSAkZXNjYXBpbmcgPyAnXFwqJyA6ICgkc3RyaWN0V2lsZGNhcmRTbGFzaCA/ICdbXi9dKicgOiAnLionKTsKfSBlbHNlaWYgKCc/JyA9PT0gJGNhcikgewokcmVnZXggLj0gJGVzY2FwaW5nID8gJ1xcPycgOiAoJHN0cmljdFdpbGRjYXJkU2xhc2ggPyAnW14vXScgOiAnLicpOwp9IGVsc2VpZiAoJ3snID09PSAkY2FyKSB7CiRyZWdleCAuPSAkZXNjYXBpbmcgPyAnXFx7JyA6ICcoJzsKaWYgKCEkZXNjYXBpbmcpIHsKKyskaW5DdXJsaWVzOwp9Cn0gZWxzZWlmICgnfScgPT09ICRjYXIgJiYgJGluQ3VybGllcykgewokcmVnZXggLj0gJGVzY2FwaW5nID8gJ30nIDogJyknOwppZiAoISRlc2NhcGluZykgewotLSRpbkN1cmxpZXM7Cn0KfSBlbHNlaWYgKCcsJyA9PT0gJGNhciAmJiAkaW5DdXJsaWVzKSB7CiRyZWdleCAuPSAkZXNjYXBpbmcgPyAnLCcgOiAnfCc7Cn0gZWxzZWlmICgnXFwnID09PSAkY2FyKSB7CmlmICgkZXNjYXBpbmcpIHsKJHJlZ2V4IC49ICdcXFxcJzsKJGVzY2FwaW5nID0gZmFsc2U7Cn0gZWxzZSB7CiRlc2NhcGluZyA9IHRydWU7Cn0KCmNvbnRpbnVlOwp9IGVsc2UgewokcmVnZXggLj0gJGNhcjsKfQokZXNjYXBpbmcgPSBmYWxzZTsKfQoKcmV0dXJuICRkZWxpbWl0ZXIuJ14nLiRyZWdleC4nJCcuJGRlbGltaXRlcjsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yOwoKCgoKCgoKCgoKCmNsYXNzIEN1c3RvbUZpbHRlckl0ZXJhdG9yIGV4dGVuZHMgXEZpbHRlckl0ZXJhdG9yCnsKcHJpdmF0ZSAkZmlsdGVycyA9IFtdOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFxJdGVyYXRvciAkaXRlcmF0b3IsIGFycmF5ICRmaWx0ZXJzKQp7CmZvcmVhY2ggKCRmaWx0ZXJzIGFzICRmaWx0ZXIpIHsKaWYgKCFcaXNfY2FsbGFibGUoJGZpbHRlcikpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgUEhQIGNhbGxiYWNrLicpOwp9Cn0KJHRoaXMtPmZpbHRlcnMgPSAkZmlsdGVyczsKCnBhcmVudDo6X19jb25zdHJ1Y3QoJGl0ZXJhdG9yKTsKfQoKCgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGFjY2VwdCgpCnsKJGZpbGVpbmZvID0gJHRoaXMtPmN1cnJlbnQoKTsKCmZvcmVhY2ggKCR0aGlzLT5maWx0ZXJzIGFzICRmaWx0ZXIpIHsKaWYgKGZhbHNlID09PSAkZmlsdGVyKCRmaWxlaW5mbykpIHsKcmV0dXJuIGZhbHNlOwp9Cn0KCnJldHVybiB0cnVlOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3I7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXENvbXBhcmF0b3JcRGF0ZUNvbXBhcmF0b3I7CgoKCgoKCgoKY2xhc3MgRGF0ZVJhbmdlRmlsdGVySXRlcmF0b3IgZXh0ZW5kcyBcRmlsdGVySXRlcmF0b3IKewpwcml2YXRlICRjb21wYXJhdG9ycyA9IFtdOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChcSXRlcmF0b3IgJGl0ZXJhdG9yLCBhcnJheSAkY29tcGFyYXRvcnMpCnsKJHRoaXMtPmNvbXBhcmF0b3JzID0gJGNvbXBhcmF0b3JzOwoKcGFyZW50OjpfX2NvbnN0cnVjdCgkaXRlcmF0b3IpOwp9CgoKCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KCkKewokZmlsZWluZm8gPSAkdGhpcy0+Y3VycmVudCgpOwoKaWYgKCFmaWxlX2V4aXN0cygkZmlsZWluZm8tPmdldFBhdGhuYW1lKCkpKSB7CnJldHVybiBmYWxzZTsKfQoKJGZpbGVkYXRlID0gJGZpbGVpbmZvLT5nZXRNVGltZSgpOwpmb3JlYWNoICgkdGhpcy0+Y29tcGFyYXRvcnMgYXMgJGNvbXBhcmUpIHsKaWYgKCEkY29tcGFyZS0+dGVzdCgkZmlsZWRhdGUpKSB7CnJldHVybiBmYWxzZTsKfQp9CgpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yOwoKCgoKCgoKCgoKCmNsYXNzIERlcHRoUmFuZ2VGaWx0ZXJJdGVyYXRvciBleHRlbmRzIFxGaWx0ZXJJdGVyYXRvcgp7CnByaXZhdGUgJG1pbkRlcHRoID0gMDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFxSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yICRpdGVyYXRvciwgaW50ICRtaW5EZXB0aCA9IDAsIGludCAkbWF4RGVwdGggPSBcUEhQX0lOVF9NQVgpCnsKJHRoaXMtPm1pbkRlcHRoID0gJG1pbkRlcHRoOwokaXRlcmF0b3ItPnNldE1heERlcHRoKFxQSFBfSU5UX01BWCA9PT0gJG1heERlcHRoID8gLTEgOiAkbWF4RGVwdGgpOwoKcGFyZW50OjpfX2NvbnN0cnVjdCgkaXRlcmF0b3IpOwp9CgoKCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KCkKewpyZXR1cm4gJHRoaXMtPmdldElubmVySXRlcmF0b3IoKS0+Z2V0RGVwdGgoKSA+PSAkdGhpcy0+bWluRGVwdGg7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvcjsKCgoKCgoKCgoKCmNsYXNzIEV4Y2x1ZGVEaXJlY3RvcnlGaWx0ZXJJdGVyYXRvciBleHRlbmRzIFxGaWx0ZXJJdGVyYXRvciBpbXBsZW1lbnRzIFxSZWN1cnNpdmVJdGVyYXRvcgp7CnByaXZhdGUgJGl0ZXJhdG9yOwpwcml2YXRlICRpc1JlY3Vyc2l2ZTsKcHJpdmF0ZSAkZXhjbHVkZWREaXJzID0gW107CnByaXZhdGUgJGV4Y2x1ZGVkUGF0dGVybjsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoXEl0ZXJhdG9yICRpdGVyYXRvciwgYXJyYXkgJGRpcmVjdG9yaWVzKQp7CiR0aGlzLT5pdGVyYXRvciA9ICRpdGVyYXRvcjsKJHRoaXMtPmlzUmVjdXJzaXZlID0gJGl0ZXJhdG9yIGluc3RhbmNlb2YgXFJlY3Vyc2l2ZUl0ZXJhdG9yOwokcGF0dGVybnMgPSBbXTsKZm9yZWFjaCAoJGRpcmVjdG9yaWVzIGFzICRkaXJlY3RvcnkpIHsKJGRpcmVjdG9yeSA9IHJ0cmltKCRkaXJlY3RvcnksICcvJyk7CmlmICghJHRoaXMtPmlzUmVjdXJzaXZlIHx8IHN0cl9jb250YWlucygkZGlyZWN0b3J5LCAnLycpKSB7CiRwYXR0ZXJuc1tdID0gcHJlZ19xdW90ZSgkZGlyZWN0b3J5LCAnIycpOwp9IGVsc2UgewokdGhpcy0+ZXhjbHVkZWREaXJzWyRkaXJlY3RvcnldID0gdHJ1ZTsKfQp9CmlmICgkcGF0dGVybnMpIHsKJHRoaXMtPmV4Y2x1ZGVkUGF0dGVybiA9ICcjKD86XnwvKSg/OicuaW1wbG9kZSgnfCcsICRwYXR0ZXJucykuJykoPzovfCQpIyc7Cn0KCnBhcmVudDo6X19jb25zdHJ1Y3QoJGl0ZXJhdG9yKTsKfQoKCgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGFjY2VwdCgpCnsKaWYgKCR0aGlzLT5pc1JlY3Vyc2l2ZSAmJiBpc3NldCgkdGhpcy0+ZXhjbHVkZWREaXJzWyR0aGlzLT5nZXRGaWxlbmFtZSgpXSkgJiYgJHRoaXMtPmlzRGlyKCkpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoJHRoaXMtPmV4Y2x1ZGVkUGF0dGVybikgewokcGF0aCA9ICR0aGlzLT5pc0RpcigpID8gJHRoaXMtPmN1cnJlbnQoKS0+Z2V0UmVsYXRpdmVQYXRobmFtZSgpIDogJHRoaXMtPmN1cnJlbnQoKS0+Z2V0UmVsYXRpdmVQYXRoKCk7CiRwYXRoID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkcGF0aCk7CgpyZXR1cm4gIXByZWdfbWF0Y2goJHRoaXMtPmV4Y2x1ZGVkUGF0dGVybiwgJHBhdGgpOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBoYXNDaGlsZHJlbigpCnsKcmV0dXJuICR0aGlzLT5pc1JlY3Vyc2l2ZSAmJiAkdGhpcy0+aXRlcmF0b3ItPmhhc0NoaWxkcmVuKCk7Cn0KCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hpbGRyZW4oKQp7CiRjaGlsZHJlbiA9IG5ldyBzZWxmKCR0aGlzLT5pdGVyYXRvci0+Z2V0Q2hpbGRyZW4oKSwgW10pOwokY2hpbGRyZW4tPmV4Y2x1ZGVkRGlycyA9ICR0aGlzLT5leGNsdWRlZERpcnM7CiRjaGlsZHJlbi0+ZXhjbHVkZWRQYXR0ZXJuID0gJHRoaXMtPmV4Y2x1ZGVkUGF0dGVybjsKCnJldHVybiAkY2hpbGRyZW47Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvcjsKCgoKCgoKCgpjbGFzcyBGaWxlVHlwZUZpbHRlckl0ZXJhdG9yIGV4dGVuZHMgXEZpbHRlckl0ZXJhdG9yCnsKcHVibGljIGNvbnN0IE9OTFlfRklMRVMgPSAxOwpwdWJsaWMgY29uc3QgT05MWV9ESVJFQ1RPUklFUyA9IDI7Cgpwcml2YXRlICRtb2RlOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChcSXRlcmF0b3IgJGl0ZXJhdG9yLCBpbnQgJG1vZGUpCnsKJHRoaXMtPm1vZGUgPSAkbW9kZTsKCnBhcmVudDo6X19jb25zdHJ1Y3QoJGl0ZXJhdG9yKTsKfQoKCgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGFjY2VwdCgpCnsKJGZpbGVpbmZvID0gJHRoaXMtPmN1cnJlbnQoKTsKaWYgKHNlbGY6Ok9OTFlfRElSRUNUT1JJRVMgPT09IChzZWxmOjpPTkxZX0RJUkVDVE9SSUVTICYgJHRoaXMtPm1vZGUpICYmICRmaWxlaW5mby0+aXNGaWxlKCkpIHsKcmV0dXJuIGZhbHNlOwp9IGVsc2VpZiAoc2VsZjo6T05MWV9GSUxFUyA9PT0gKHNlbGY6Ok9OTFlfRklMRVMgJiAkdGhpcy0+bW9kZSkgJiYgJGZpbGVpbmZvLT5pc0RpcigpKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvcjsKCgoKCgoKCgoKY2xhc3MgRmlsZWNvbnRlbnRGaWx0ZXJJdGVyYXRvciBleHRlbmRzIE11bHRpcGxlUGNyZUZpbHRlckl0ZXJhdG9yCnsKCgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGFjY2VwdCgpCnsKaWYgKCEkdGhpcy0+bWF0Y2hSZWdleHBzICYmICEkdGhpcy0+bm9NYXRjaFJlZ2V4cHMpIHsKcmV0dXJuIHRydWU7Cn0KCiRmaWxlaW5mbyA9ICR0aGlzLT5jdXJyZW50KCk7CgppZiAoJGZpbGVpbmZvLT5pc0RpcigpIHx8ICEkZmlsZWluZm8tPmlzUmVhZGFibGUoKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRjb250ZW50ID0gJGZpbGVpbmZvLT5nZXRDb250ZW50cygpOwppZiAoISRjb250ZW50KSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuICR0aGlzLT5pc0FjY2VwdGVkKCRjb250ZW50KTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB0b1JlZ2V4KHN0cmluZyAkc3RyKQp7CnJldHVybiAkdGhpcy0+aXNSZWdleCgkc3RyKSA/ICRzdHIgOiAnLycucHJlZ19xdW90ZSgkc3RyLCAnLycpLicvJzsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxHbG9iOwoKCgoKCgoKCmNsYXNzIEZpbGVuYW1lRmlsdGVySXRlcmF0b3IgZXh0ZW5kcyBNdWx0aXBsZVBjcmVGaWx0ZXJJdGVyYXRvcgp7CgoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoKQp7CnJldHVybiAkdGhpcy0+aXNBY2NlcHRlZCgkdGhpcy0+Y3VycmVudCgpLT5nZXRGaWxlbmFtZSgpKTsKfQoKCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB0b1JlZ2V4KHN0cmluZyAkc3RyKQp7CnJldHVybiAkdGhpcy0+aXNSZWdleCgkc3RyKSA/ICRzdHIgOiBHbG9iOjp0b1JlZ2V4KCRzdHIpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3I7CgoKCgoKCmNsYXNzIExhenlJdGVyYXRvciBpbXBsZW1lbnRzIFxJdGVyYXRvckFnZ3JlZ2F0ZQp7CnByaXZhdGUgJGl0ZXJhdG9yRmFjdG9yeTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChjYWxsYWJsZSAkaXRlcmF0b3JGYWN0b3J5KQp7CiR0aGlzLT5pdGVyYXRvckZhY3RvcnkgPSAkaXRlcmF0b3JGYWN0b3J5Owp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SXRlcmF0b3IoKTogXFRyYXZlcnNhYmxlCnsKeWllbGQgZnJvbSAoJHRoaXMtPml0ZXJhdG9yRmFjdG9yeSkoKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yOwoKCgoKCgoKCgoKCmFic3RyYWN0IGNsYXNzIE11bHRpcGxlUGNyZUZpbHRlckl0ZXJhdG9yIGV4dGVuZHMgXEZpbHRlckl0ZXJhdG9yCnsKcHJvdGVjdGVkICRtYXRjaFJlZ2V4cHMgPSBbXTsKcHJvdGVjdGVkICRub01hdGNoUmVnZXhwcyA9IFtdOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoXEl0ZXJhdG9yICRpdGVyYXRvciwgYXJyYXkgJG1hdGNoUGF0dGVybnMsIGFycmF5ICRub01hdGNoUGF0dGVybnMpCnsKZm9yZWFjaCAoJG1hdGNoUGF0dGVybnMgYXMgJHBhdHRlcm4pIHsKJHRoaXMtPm1hdGNoUmVnZXhwc1tdID0gJHRoaXMtPnRvUmVnZXgoJHBhdHRlcm4pOwp9Cgpmb3JlYWNoICgkbm9NYXRjaFBhdHRlcm5zIGFzICRwYXR0ZXJuKSB7CiR0aGlzLT5ub01hdGNoUmVnZXhwc1tdID0gJHRoaXMtPnRvUmVnZXgoJHBhdHRlcm4pOwp9CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRpdGVyYXRvcik7Cn0KCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpc0FjY2VwdGVkKHN0cmluZyAkc3RyaW5nKQp7Cgpmb3JlYWNoICgkdGhpcy0+bm9NYXRjaFJlZ2V4cHMgYXMgJHJlZ2V4KSB7CmlmIChwcmVnX21hdGNoKCRyZWdleCwgJHN0cmluZykpIHsKcmV0dXJuIGZhbHNlOwp9Cn0KCgppZiAoJHRoaXMtPm1hdGNoUmVnZXhwcykgewpmb3JlYWNoICgkdGhpcy0+bWF0Y2hSZWdleHBzIGFzICRyZWdleCkgewppZiAocHJlZ19tYXRjaCgkcmVnZXgsICRzdHJpbmcpKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCnJldHVybiB0cnVlOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpc1JlZ2V4KHN0cmluZyAkc3RyKQp7CiRhdmFpbGFibGVNb2RpZmllcnMgPSAnaW1zeHVBRFUnOwoKaWYgKFxQSFBfVkVSU0lPTl9JRCA+PSA4MDIwMCkgewokYXZhaWxhYmxlTW9kaWZpZXJzIC49ICduJzsKfQoKaWYgKHByZWdfbWF0Y2goJy9eKC57Myx9PylbJy4kYXZhaWxhYmxlTW9kaWZpZXJzLiddKiQvJywgJHN0ciwgJG0pKSB7CiRzdGFydCA9IHN1YnN0cigkbVsxXSwgMCwgMSk7CiRlbmQgPSBzdWJzdHIoJG1bMV0sIC0xKTsKCmlmICgkc3RhcnQgPT09ICRlbmQpIHsKcmV0dXJuICFwcmVnX21hdGNoKCcvWyo/WzphbG51bTpdIFxcXFxdLycsICRzdGFydCk7Cn0KCmZvcmVhY2ggKFtbJ3snLCAnfSddLCBbJygnLCAnKSddLCBbJ1snLCAnXSddLCBbJzwnLCAnPiddXSBhcyAkZGVsaW1pdGVycykgewppZiAoJHN0YXJ0ID09PSAkZGVsaW1pdGVyc1swXSAmJiAkZW5kID09PSAkZGVsaW1pdGVyc1sxXSkgewpyZXR1cm4gdHJ1ZTsKfQp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgphYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gdG9SZWdleChzdHJpbmcgJHN0cik7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3I7CgoKCgoKCgoKCmNsYXNzIFBhdGhGaWx0ZXJJdGVyYXRvciBleHRlbmRzIE11bHRpcGxlUGNyZUZpbHRlckl0ZXJhdG9yCnsKCgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGFjY2VwdCgpCnsKJGZpbGVuYW1lID0gJHRoaXMtPmN1cnJlbnQoKS0+Z2V0UmVsYXRpdmVQYXRobmFtZSgpOwoKaWYgKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SKSB7CiRmaWxlbmFtZSA9IHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJGZpbGVuYW1lKTsKfQoKcmV0dXJuICR0aGlzLT5pc0FjY2VwdGVkKCRmaWxlbmFtZSk7Cn0KCgoKCgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHRvUmVnZXgoc3RyaW5nICRzdHIpCnsKcmV0dXJuICR0aGlzLT5pc1JlZ2V4KCRzdHIpID8gJHN0ciA6ICcvJy5wcmVnX3F1b3RlKCRzdHIsICcvJykuJy8nOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3I7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEV4Y2VwdGlvblxBY2Nlc3NEZW5pZWRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcU3BsRmlsZUluZm87CgoKCgoKCmNsYXNzIFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yIGV4dGVuZHMgXFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yCnsKCgoKcHJpdmF0ZSAkaWdub3JlVW5yZWFkYWJsZURpcnM7CgoKCgpwcml2YXRlICRpZ25vcmVGaXJzdFJld2luZCA9IHRydWU7CgoKcHJpdmF0ZSAkcm9vdFBhdGg7CnByaXZhdGUgJHN1YlBhdGg7CnByaXZhdGUgJGRpcmVjdG9yeVNlcGFyYXRvciA9ICcvJzsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHBhdGgsIGludCAkZmxhZ3MsIGJvb2wgJGlnbm9yZVVucmVhZGFibGVEaXJzID0gZmFsc2UpCnsKaWYgKCRmbGFncyAmIChzZWxmOjpDVVJSRU5UX0FTX1BBVEhOQU1FIHwgc2VsZjo6Q1VSUkVOVF9BU19TRUxGKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoaXMgaXRlcmF0b3Igb25seSBzdXBwb3J0IHJldHVybmluZyBjdXJyZW50IGFzIGZpbGVpbmZvLicpOwp9CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRwYXRoLCAkZmxhZ3MpOwokdGhpcy0+aWdub3JlVW5yZWFkYWJsZURpcnMgPSAkaWdub3JlVW5yZWFkYWJsZURpcnM7CiR0aGlzLT5yb290UGF0aCA9ICRwYXRoOwppZiAoJy8nICE9PSBcRElSRUNUT1JZX1NFUEFSQVRPUiAmJiAhKCRmbGFncyAmIHNlbGY6OlVOSVhfUEFUSFMpKSB7CiR0aGlzLT5kaXJlY3RvcnlTZXBhcmF0b3IgPSBcRElSRUNUT1JZX1NFUEFSQVRPUjsKfQp9CgoKCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gY3VycmVudCgpCnsKCgppZiAobnVsbCA9PT0gJHN1YlBhdGhuYW1lID0gJHRoaXMtPnN1YlBhdGgpIHsKJHN1YlBhdGhuYW1lID0gJHRoaXMtPnN1YlBhdGggPSAkdGhpcy0+Z2V0U3ViUGF0aCgpOwp9CmlmICgnJyAhPT0gJHN1YlBhdGhuYW1lKSB7CiRzdWJQYXRobmFtZSAuPSAkdGhpcy0+ZGlyZWN0b3J5U2VwYXJhdG9yOwp9CiRzdWJQYXRobmFtZSAuPSAkdGhpcy0+Z2V0RmlsZW5hbWUoKTsKJGJhc2VQYXRoID0gJHRoaXMtPnJvb3RQYXRoOwoKaWYgKCcvJyAhPT0gJGJhc2VQYXRoICYmICFzdHJfZW5kc193aXRoKCRiYXNlUGF0aCwgJHRoaXMtPmRpcmVjdG9yeVNlcGFyYXRvcikgJiYgIXN0cl9lbmRzX3dpdGgoJGJhc2VQYXRoLCAnLycpKSB7CiRiYXNlUGF0aCAuPSAkdGhpcy0+ZGlyZWN0b3J5U2VwYXJhdG9yOwp9CgpyZXR1cm4gbmV3IFNwbEZpbGVJbmZvKCRiYXNlUGF0aC4kc3ViUGF0aG5hbWUsICR0aGlzLT5zdWJQYXRoLCAkc3ViUGF0aG5hbWUpOwp9CgoKCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gaGFzQ2hpbGRyZW4oJGFsbG93TGlua3MgPSBmYWxzZSkKewokaGFzQ2hpbGRyZW4gPSBwYXJlbnQ6Omhhc0NoaWxkcmVuKCRhbGxvd0xpbmtzKTsKCmlmICghJGhhc0NoaWxkcmVuIHx8ICEkdGhpcy0+aWdub3JlVW5yZWFkYWJsZURpcnMpIHsKcmV0dXJuICRoYXNDaGlsZHJlbjsKfQoKdHJ5IHsKcGFyZW50OjpnZXRDaGlsZHJlbigpOwoKcmV0dXJuIHRydWU7Cn0gY2F0Y2ggKFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24gJGUpIHsKCnJldHVybiBmYWxzZTsKfQp9CgoKCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hpbGRyZW4oKQp7CnRyeSB7CiRjaGlsZHJlbiA9IHBhcmVudDo6Z2V0Q2hpbGRyZW4oKTsKCmlmICgkY2hpbGRyZW4gaW5zdGFuY2VvZiBzZWxmKSB7CgokY2hpbGRyZW4tPmlnbm9yZVVucmVhZGFibGVEaXJzID0gJHRoaXMtPmlnbm9yZVVucmVhZGFibGVEaXJzOwoKCiRjaGlsZHJlbi0+cm9vdFBhdGggPSAkdGhpcy0+cm9vdFBhdGg7Cn0KCnJldHVybiAkY2hpbGRyZW47Cn0gY2F0Y2ggKFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24gJGUpIHsKdGhyb3cgbmV3IEFjY2Vzc0RlbmllZEV4Y2VwdGlvbigkZS0+Z2V0TWVzc2FnZSgpLCAkZS0+Z2V0Q29kZSgpLCAkZSk7Cn0KfQoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBuZXh0KCkKewokdGhpcy0+aWdub3JlRmlyc3RSZXdpbmQgPSBmYWxzZTsKCnBhcmVudDo6bmV4dCgpOwp9CgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIHJld2luZCgpCnsKCgppZiAoJHRoaXMtPmlnbm9yZUZpcnN0UmV3aW5kKSB7CiR0aGlzLT5pZ25vcmVGaXJzdFJld2luZCA9IGZhbHNlOwoKcmV0dXJuOwp9CgpwYXJlbnQ6OnJld2luZCgpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3I7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXENvbXBhcmF0b3JcTnVtYmVyQ29tcGFyYXRvcjsKCgoKCgoKCgpjbGFzcyBTaXplUmFuZ2VGaWx0ZXJJdGVyYXRvciBleHRlbmRzIFxGaWx0ZXJJdGVyYXRvcgp7CnByaXZhdGUgJGNvbXBhcmF0b3JzID0gW107CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFxJdGVyYXRvciAkaXRlcmF0b3IsIGFycmF5ICRjb21wYXJhdG9ycykKewokdGhpcy0+Y29tcGFyYXRvcnMgPSAkY29tcGFyYXRvcnM7CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRpdGVyYXRvcik7Cn0KCgoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoKQp7CiRmaWxlaW5mbyA9ICR0aGlzLT5jdXJyZW50KCk7CmlmICghJGZpbGVpbmZvLT5pc0ZpbGUoKSkgewpyZXR1cm4gdHJ1ZTsKfQoKJGZpbGVzaXplID0gJGZpbGVpbmZvLT5nZXRTaXplKCk7CmZvcmVhY2ggKCR0aGlzLT5jb21wYXJhdG9ycyBhcyAkY29tcGFyZSkgewppZiAoISRjb21wYXJlLT50ZXN0KCRmaWxlc2l6ZSkpIHsKcmV0dXJuIGZhbHNlOwp9Cn0KCnJldHVybiB0cnVlOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3I7CgoKCgoKCgoKY2xhc3MgU29ydGFibGVJdGVyYXRvciBpbXBsZW1lbnRzIFxJdGVyYXRvckFnZ3JlZ2F0ZQp7CnB1YmxpYyBjb25zdCBTT1JUX0JZX05PTkUgPSAwOwpwdWJsaWMgY29uc3QgU09SVF9CWV9OQU1FID0gMTsKcHVibGljIGNvbnN0IFNPUlRfQllfVFlQRSA9IDI7CnB1YmxpYyBjb25zdCBTT1JUX0JZX0FDQ0VTU0VEX1RJTUUgPSAzOwpwdWJsaWMgY29uc3QgU09SVF9CWV9DSEFOR0VEX1RJTUUgPSA0OwpwdWJsaWMgY29uc3QgU09SVF9CWV9NT0RJRklFRF9USU1FID0gNTsKcHVibGljIGNvbnN0IFNPUlRfQllfTkFNRV9OQVRVUkFMID0gNjsKCnByaXZhdGUgJGl0ZXJhdG9yOwpwcml2YXRlICRzb3J0OwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFxUcmF2ZXJzYWJsZSAkaXRlcmF0b3IsICRzb3J0LCBib29sICRyZXZlcnNlT3JkZXIgPSBmYWxzZSkKewokdGhpcy0+aXRlcmF0b3IgPSAkaXRlcmF0b3I7CiRvcmRlciA9ICRyZXZlcnNlT3JkZXIgPyAtMSA6IDE7CgppZiAoc2VsZjo6U09SVF9CWV9OQU1FID09PSAkc29ydCkgewokdGhpcy0+c29ydCA9IHN0YXRpYyBmdW5jdGlvbiAoXFNwbEZpbGVJbmZvICRhLCBcU3BsRmlsZUluZm8gJGIpIHVzZSAoJG9yZGVyKSB7CnJldHVybiAkb3JkZXIgKiBzdHJjbXAoJGEtPmdldFJlYWxQYXRoKCkgPzogJGEtPmdldFBhdGhuYW1lKCksICRiLT5nZXRSZWFsUGF0aCgpID86ICRiLT5nZXRQYXRobmFtZSgpKTsKfTsKfSBlbHNlaWYgKHNlbGY6OlNPUlRfQllfTkFNRV9OQVRVUkFMID09PSAkc29ydCkgewokdGhpcy0+c29ydCA9IHN0YXRpYyBmdW5jdGlvbiAoXFNwbEZpbGVJbmZvICRhLCBcU3BsRmlsZUluZm8gJGIpIHVzZSAoJG9yZGVyKSB7CnJldHVybiAkb3JkZXIgKiBzdHJuYXRjbXAoJGEtPmdldFJlYWxQYXRoKCkgPzogJGEtPmdldFBhdGhuYW1lKCksICRiLT5nZXRSZWFsUGF0aCgpID86ICRiLT5nZXRQYXRobmFtZSgpKTsKfTsKfSBlbHNlaWYgKHNlbGY6OlNPUlRfQllfVFlQRSA9PT0gJHNvcnQpIHsKJHRoaXMtPnNvcnQgPSBzdGF0aWMgZnVuY3Rpb24gKFxTcGxGaWxlSW5mbyAkYSwgXFNwbEZpbGVJbmZvICRiKSB1c2UgKCRvcmRlcikgewppZiAoJGEtPmlzRGlyKCkgJiYgJGItPmlzRmlsZSgpKSB7CnJldHVybiAtJG9yZGVyOwp9IGVsc2VpZiAoJGEtPmlzRmlsZSgpICYmICRiLT5pc0RpcigpKSB7CnJldHVybiAkb3JkZXI7Cn0KCnJldHVybiAkb3JkZXIgKiBzdHJjbXAoJGEtPmdldFJlYWxQYXRoKCkgPzogJGEtPmdldFBhdGhuYW1lKCksICRiLT5nZXRSZWFsUGF0aCgpID86ICRiLT5nZXRQYXRobmFtZSgpKTsKfTsKfSBlbHNlaWYgKHNlbGY6OlNPUlRfQllfQUNDRVNTRURfVElNRSA9PT0gJHNvcnQpIHsKJHRoaXMtPnNvcnQgPSBzdGF0aWMgZnVuY3Rpb24gKFxTcGxGaWxlSW5mbyAkYSwgXFNwbEZpbGVJbmZvICRiKSB1c2UgKCRvcmRlcikgewpyZXR1cm4gJG9yZGVyICogKCRhLT5nZXRBVGltZSgpIC0gJGItPmdldEFUaW1lKCkpOwp9Owp9IGVsc2VpZiAoc2VsZjo6U09SVF9CWV9DSEFOR0VEX1RJTUUgPT09ICRzb3J0KSB7CiR0aGlzLT5zb3J0ID0gc3RhdGljIGZ1bmN0aW9uIChcU3BsRmlsZUluZm8gJGEsIFxTcGxGaWxlSW5mbyAkYikgdXNlICgkb3JkZXIpIHsKcmV0dXJuICRvcmRlciAqICgkYS0+Z2V0Q1RpbWUoKSAtICRiLT5nZXRDVGltZSgpKTsKfTsKfSBlbHNlaWYgKHNlbGY6OlNPUlRfQllfTU9ESUZJRURfVElNRSA9PT0gJHNvcnQpIHsKJHRoaXMtPnNvcnQgPSBzdGF0aWMgZnVuY3Rpb24gKFxTcGxGaWxlSW5mbyAkYSwgXFNwbEZpbGVJbmZvICRiKSB1c2UgKCRvcmRlcikgewpyZXR1cm4gJG9yZGVyICogKCRhLT5nZXRNVGltZSgpIC0gJGItPmdldE1UaW1lKCkpOwp9Owp9IGVsc2VpZiAoc2VsZjo6U09SVF9CWV9OT05FID09PSAkc29ydCkgewokdGhpcy0+c29ydCA9ICRvcmRlcjsKfSBlbHNlaWYgKFxpc19jYWxsYWJsZSgkc29ydCkpIHsKJHRoaXMtPnNvcnQgPSAkcmV2ZXJzZU9yZGVyID8gc3RhdGljIGZ1bmN0aW9uIChcU3BsRmlsZUluZm8gJGEsIFxTcGxGaWxlSW5mbyAkYikgdXNlICgkc29ydCkgeyByZXR1cm4gLSRzb3J0KCRhLCAkYik7IH0gOiAkc29ydDsKfSBlbHNlIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSBTb3J0YWJsZUl0ZXJhdG9yIHRha2VzIGEgUEhQIGNhbGxhYmxlIG9yIGEgdmFsaWQgYnVpbHQtaW4gc29ydCBhbGdvcml0aG0gYXMgYW4gYXJndW1lbnQuJyk7Cn0KfQoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBnZXRJdGVyYXRvcigpCnsKaWYgKDEgPT09ICR0aGlzLT5zb3J0KSB7CnJldHVybiAkdGhpcy0+aXRlcmF0b3I7Cn0KCiRhcnJheSA9IGl0ZXJhdG9yX3RvX2FycmF5KCR0aGlzLT5pdGVyYXRvciwgdHJ1ZSk7CgppZiAoLTEgPT09ICR0aGlzLT5zb3J0KSB7CiRhcnJheSA9IGFycmF5X3JldmVyc2UoJGFycmF5KTsKfSBlbHNlIHsKdWFzb3J0KCRhcnJheSwgJHRoaXMtPnNvcnQpOwp9CgpyZXR1cm4gbmV3IFxBcnJheUl0ZXJhdG9yKCRhcnJheSk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcR2l0aWdub3JlOwoKZmluYWwgY2xhc3MgVmNzSWdub3JlZEZpbHRlckl0ZXJhdG9yIGV4dGVuZHMgXEZpbHRlckl0ZXJhdG9yCnsKCgoKcHJpdmF0ZSAkYmFzZURpcjsKCgoKCnByaXZhdGUgJGdpdGlnbm9yZUZpbGVzQ2FjaGUgPSBbXTsKCgoKCnByaXZhdGUgJGlnbm9yZWRQYXRoc0NhY2hlID0gW107CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoXEl0ZXJhdG9yICRpdGVyYXRvciwgc3RyaW5nICRiYXNlRGlyKQp7CiR0aGlzLT5iYXNlRGlyID0gJHRoaXMtPm5vcm1hbGl6ZVBhdGgoJGJhc2VEaXIpOwoKcGFyZW50OjpfX2NvbnN0cnVjdCgkaXRlcmF0b3IpOwp9CgpwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KCk6IGJvb2wKewokZmlsZSA9ICR0aGlzLT5jdXJyZW50KCk7CgokZmlsZVJlYWxQYXRoID0gJHRoaXMtPm5vcm1hbGl6ZVBhdGgoJGZpbGUtPmdldFJlYWxQYXRoKCkpOwoKcmV0dXJuICEkdGhpcy0+aXNJZ25vcmVkKCRmaWxlUmVhbFBhdGgpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGlzSWdub3JlZChzdHJpbmcgJGZpbGVSZWFsUGF0aCk6IGJvb2wKewppZiAoaXNfZGlyKCRmaWxlUmVhbFBhdGgpICYmICFzdHJfZW5kc193aXRoKCRmaWxlUmVhbFBhdGgsICcvJykpIHsKJGZpbGVSZWFsUGF0aCAuPSAnLyc7Cn0KCmlmIChpc3NldCgkdGhpcy0+aWdub3JlZFBhdGhzQ2FjaGVbJGZpbGVSZWFsUGF0aF0pKSB7CnJldHVybiAkdGhpcy0+aWdub3JlZFBhdGhzQ2FjaGVbJGZpbGVSZWFsUGF0aF07Cn0KCiRpZ25vcmVkID0gZmFsc2U7Cgpmb3JlYWNoICgkdGhpcy0+cGFyZW50c0RpcmVjdG9yeURvd253YXJkKCRmaWxlUmVhbFBhdGgpIGFzICRwYXJlbnREaXJlY3RvcnkpIHsKaWYgKCR0aGlzLT5pc0lnbm9yZWQoJHBhcmVudERpcmVjdG9yeSkpIHsKCmJyZWFrOwp9CgokZmlsZVJlbGF0aXZlUGF0aCA9IHN1YnN0cigkZmlsZVJlYWxQYXRoLCBcc3RybGVuKCRwYXJlbnREaXJlY3RvcnkpICsgMSk7CgppZiAobnVsbCA9PT0gJHJlZ2V4cHMgPSAkdGhpcy0+cmVhZEdpdGlnbm9yZUZpbGUoInskcGFyZW50RGlyZWN0b3J5fS8uZ2l0aWdub3JlIikpIHsKY29udGludWU7Cn0KClskZXhjbHVzaW9uUmVnZXgsICRpbmNsdXNpb25SZWdleF0gPSAkcmVnZXhwczsKCmlmIChwcmVnX21hdGNoKCRleGNsdXNpb25SZWdleCwgJGZpbGVSZWxhdGl2ZVBhdGgpKSB7CiRpZ25vcmVkID0gdHJ1ZTsKCmNvbnRpbnVlOwp9CgppZiAocHJlZ19tYXRjaCgkaW5jbHVzaW9uUmVnZXgsICRmaWxlUmVsYXRpdmVQYXRoKSkgewokaWdub3JlZCA9IGZhbHNlOwp9Cn0KCnJldHVybiAkdGhpcy0+aWdub3JlZFBhdGhzQ2FjaGVbJGZpbGVSZWFsUGF0aF0gPSAkaWdub3JlZDsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBwYXJlbnRzRGlyZWN0b3J5RG93bndhcmQoc3RyaW5nICRmaWxlUmVhbFBhdGgpOiBhcnJheQp7CiRwYXJlbnREaXJlY3RvcmllcyA9IFtdOwoKJHBhcmVudERpcmVjdG9yeSA9ICRmaWxlUmVhbFBhdGg7Cgp3aGlsZSAodHJ1ZSkgewokbmV3UGFyZW50RGlyZWN0b3J5ID0gXGRpcm5hbWUoJHBhcmVudERpcmVjdG9yeSk7CgoKaWYgKCRuZXdQYXJlbnREaXJlY3RvcnkgPT09ICRwYXJlbnREaXJlY3RvcnkpIHsKYnJlYWs7Cn0KCiRwYXJlbnREaXJlY3RvcnkgPSAkbmV3UGFyZW50RGlyZWN0b3J5OwoKaWYgKDAgIT09IHN0cnBvcygkcGFyZW50RGlyZWN0b3J5LCAkdGhpcy0+YmFzZURpcikpIHsKYnJlYWs7Cn0KCiRwYXJlbnREaXJlY3Rvcmllc1tdID0gJHBhcmVudERpcmVjdG9yeTsKfQoKcmV0dXJuIGFycmF5X3JldmVyc2UoJHBhcmVudERpcmVjdG9yaWVzKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiByZWFkR2l0aWdub3JlRmlsZShzdHJpbmcgJHBhdGgpOiA/YXJyYXkKewppZiAoXGFycmF5X2tleV9leGlzdHMoJHBhdGgsICR0aGlzLT5naXRpZ25vcmVGaWxlc0NhY2hlKSkgewpyZXR1cm4gJHRoaXMtPmdpdGlnbm9yZUZpbGVzQ2FjaGVbJHBhdGhdOwp9CgppZiAoIWZpbGVfZXhpc3RzKCRwYXRoKSkgewpyZXR1cm4gJHRoaXMtPmdpdGlnbm9yZUZpbGVzQ2FjaGVbJHBhdGhdID0gbnVsbDsKfQoKaWYgKCFpc19maWxlKCRwYXRoKSB8fCAhaXNfcmVhZGFibGUoJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigiVGhlIFwiaWdub3JlVkNTSWdub3JlZFwiIG9wdGlvbiBjYW5ub3QgYmUgdXNlZCBieSB0aGUgRmluZGVyIGFzIHRoZSBcInskcGF0aH1cIiBmaWxlIGlzIG5vdCByZWFkYWJsZS4iKTsKfQoKJGdpdGlnbm9yZUZpbGVDb250ZW50ID0gZmlsZV9nZXRfY29udGVudHMoJHBhdGgpOwoKcmV0dXJuICR0aGlzLT5naXRpZ25vcmVGaWxlc0NhY2hlWyRwYXRoXSA9IFsKR2l0aWdub3JlOjp0b1JlZ2V4KCRnaXRpZ25vcmVGaWxlQ29udGVudCksCkdpdGlnbm9yZTo6dG9SZWdleE1hdGNoaW5nTmVnYXRlZFBhdHRlcm5zKCRnaXRpZ25vcmVGaWxlQ29udGVudCksCl07Cn0KCnByaXZhdGUgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChzdHJpbmcgJHBhdGgpOiBzdHJpbmcKewppZiAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IpIHsKcmV0dXJuIHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJHBhdGgpOwp9CgpyZXR1cm4gJHBhdGg7Cn0KfQoKQ29weXJpZ2h0IChjKSAyMDA0LXByZXNlbnQgRmFiaWVuIFBvdGVuY2llcgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAp0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KCjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyOwoKCgoKCgpjbGFzcyBTcGxGaWxlSW5mbyBleHRlbmRzIFxTcGxGaWxlSW5mbwp7CnByaXZhdGUgJHJlbGF0aXZlUGF0aDsKcHJpdmF0ZSAkcmVsYXRpdmVQYXRobmFtZTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkZmlsZSwgc3RyaW5nICRyZWxhdGl2ZVBhdGgsIHN0cmluZyAkcmVsYXRpdmVQYXRobmFtZSkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRmaWxlKTsKJHRoaXMtPnJlbGF0aXZlUGF0aCA9ICRyZWxhdGl2ZVBhdGg7CiR0aGlzLT5yZWxhdGl2ZVBhdGhuYW1lID0gJHJlbGF0aXZlUGF0aG5hbWU7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVsYXRpdmVQYXRoKCkKewpyZXR1cm4gJHRoaXMtPnJlbGF0aXZlUGF0aDsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZWxhdGl2ZVBhdGhuYW1lKCkKewpyZXR1cm4gJHRoaXMtPnJlbGF0aXZlUGF0aG5hbWU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlbmFtZVdpdGhvdXRFeHRlbnNpb24oKTogc3RyaW5nCnsKJGZpbGVuYW1lID0gJHRoaXMtPmdldEZpbGVuYW1lKCk7CgpyZXR1cm4gcGF0aGluZm8oJGZpbGVuYW1lLCBcUEFUSElORk9fRklMRU5BTUUpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbnRlbnRzKCkKewpzZXRfZXJyb3JfaGFuZGxlcihmdW5jdGlvbiAoJHR5cGUsICRtc2cpIHVzZSAoJiRlcnJvcikgeyAkZXJyb3IgPSAkbXNnOyB9KTsKdHJ5IHsKJGNvbnRlbnQgPSBmaWxlX2dldF9jb250ZW50cygkdGhpcy0+Z2V0UGF0aG5hbWUoKSk7Cn0gZmluYWxseSB7CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwp9CmlmIChmYWxzZSA9PT0gJGNvbnRlbnQpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRlcnJvcik7Cn0KCnJldHVybiAkY29udGVudDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxQb2x5ZmlsbFxDdHlwZTsKCgoKCgoKCgpmaW5hbCBjbGFzcyBDdHlwZQp7CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3R5cGVfYWxudW0oJHRleHQpCnsKJHRleHQgPSBzZWxmOjpjb252ZXJ0X2ludF90b19jaGFyX2Zvcl9jdHlwZSgkdGV4dCwgX19GVU5DVElPTl9fKTsKCnJldHVybiBcaXNfc3RyaW5nKCR0ZXh0KSAmJiAnJyAhPT0gJHRleHQgJiYgIXByZWdfbWF0Y2goJy9bXkEtWmEtejAtOV0vJywgJHRleHQpOwp9CgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGN0eXBlX2FscGhhKCR0ZXh0KQp7CiR0ZXh0ID0gc2VsZjo6Y29udmVydF9pbnRfdG9fY2hhcl9mb3JfY3R5cGUoJHRleHQsIF9fRlVOQ1RJT05fXyk7CgpyZXR1cm4gXGlzX3N0cmluZygkdGV4dCkgJiYgJycgIT09ICR0ZXh0ICYmICFwcmVnX21hdGNoKCcvW15BLVphLXpdLycsICR0ZXh0KTsKfQoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjdHlwZV9jbnRybCgkdGV4dCkKewokdGV4dCA9IHNlbGY6OmNvbnZlcnRfaW50X3RvX2NoYXJfZm9yX2N0eXBlKCR0ZXh0LCBfX0ZVTkNUSU9OX18pOwoKcmV0dXJuIFxpc19zdHJpbmcoJHRleHQpICYmICcnICE9PSAkdGV4dCAmJiAhcHJlZ19tYXRjaCgnL1teXHgwMC1ceDFmXHg3Zl0vJywgJHRleHQpOwp9CgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGN0eXBlX2RpZ2l0KCR0ZXh0KQp7CiR0ZXh0ID0gc2VsZjo6Y29udmVydF9pbnRfdG9fY2hhcl9mb3JfY3R5cGUoJHRleHQsIF9fRlVOQ1RJT05fXyk7CgpyZXR1cm4gXGlzX3N0cmluZygkdGV4dCkgJiYgJycgIT09ICR0ZXh0ICYmICFwcmVnX21hdGNoKCcvW14wLTldLycsICR0ZXh0KTsKfQoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjdHlwZV9ncmFwaCgkdGV4dCkKewokdGV4dCA9IHNlbGY6OmNvbnZlcnRfaW50X3RvX2NoYXJfZm9yX2N0eXBlKCR0ZXh0LCBfX0ZVTkNUSU9OX18pOwoKcmV0dXJuIFxpc19zdHJpbmcoJHRleHQpICYmICcnICE9PSAkdGV4dCAmJiAhcHJlZ19tYXRjaCgnL1teIS1+XS8nLCAkdGV4dCk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3R5cGVfbG93ZXIoJHRleHQpCnsKJHRleHQgPSBzZWxmOjpjb252ZXJ0X2ludF90b19jaGFyX2Zvcl9jdHlwZSgkdGV4dCwgX19GVU5DVElPTl9fKTsKCnJldHVybiBcaXNfc3RyaW5nKCR0ZXh0KSAmJiAnJyAhPT0gJHRleHQgJiYgIXByZWdfbWF0Y2goJy9bXmEtel0vJywgJHRleHQpOwp9CgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGN0eXBlX3ByaW50KCR0ZXh0KQp7CiR0ZXh0ID0gc2VsZjo6Y29udmVydF9pbnRfdG9fY2hhcl9mb3JfY3R5cGUoJHRleHQsIF9fRlVOQ1RJT05fXyk7CgpyZXR1cm4gXGlzX3N0cmluZygkdGV4dCkgJiYgJycgIT09ICR0ZXh0ICYmICFwcmVnX21hdGNoKCcvW14gLX5dLycsICR0ZXh0KTsKfQoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjdHlwZV9wdW5jdCgkdGV4dCkKewokdGV4dCA9IHNlbGY6OmNvbnZlcnRfaW50X3RvX2NoYXJfZm9yX2N0eXBlKCR0ZXh0LCBfX0ZVTkNUSU9OX18pOwoKcmV0dXJuIFxpc19zdHJpbmcoJHRleHQpICYmICcnICE9PSAkdGV4dCAmJiAhcHJlZ19tYXRjaCgnL1teIS1cL1w6LUBcWy1gXHstfl0vJywgJHRleHQpOwp9CgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGN0eXBlX3NwYWNlKCR0ZXh0KQp7CiR0ZXh0ID0gc2VsZjo6Y29udmVydF9pbnRfdG9fY2hhcl9mb3JfY3R5cGUoJHRleHQsIF9fRlVOQ1RJT05fXyk7CgpyZXR1cm4gXGlzX3N0cmluZygkdGV4dCkgJiYgJycgIT09ICR0ZXh0ICYmICFwcmVnX21hdGNoKCcvW15cc10vJywgJHRleHQpOwp9CgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGN0eXBlX3VwcGVyKCR0ZXh0KQp7CiR0ZXh0ID0gc2VsZjo6Y29udmVydF9pbnRfdG9fY2hhcl9mb3JfY3R5cGUoJHRleHQsIF9fRlVOQ1RJT05fXyk7CgpyZXR1cm4gXGlzX3N0cmluZygkdGV4dCkgJiYgJycgIT09ICR0ZXh0ICYmICFwcmVnX21hdGNoKCcvW15BLVpdLycsICR0ZXh0KTsKfQoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjdHlwZV94ZGlnaXQoJHRleHQpCnsKJHRleHQgPSBzZWxmOjpjb252ZXJ0X2ludF90b19jaGFyX2Zvcl9jdHlwZSgkdGV4dCwgX19GVU5DVElPTl9fKTsKCnJldHVybiBcaXNfc3RyaW5nKCR0ZXh0KSAmJiAnJyAhPT0gJHRleHQgJiYgIXByZWdfbWF0Y2goJy9bXkEtRmEtZjAtOV0vJywgJHRleHQpOwp9CgoKCgoKCgoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gY29udmVydF9pbnRfdG9fY2hhcl9mb3JfY3R5cGUoJGludCwgJGZ1bmN0aW9uKQp7CmlmIChcUEhQX1ZFUlNJT05fSUQgPj0gODAxMDAgJiYgIVxpc19zdHJpbmcoJGludCkpIHsKQHRyaWdnZXJfZXJyb3IoJGZ1bmN0aW9uLicoKTogQXJndW1lbnQgb2YgdHlwZSAnLmdldF9kZWJ1Z190eXBlKCRpbnQpLicgd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBzdHJpbmcgaW4gdGhlIGZ1dHVyZScsIFxFX1VTRVJfREVQUkVDQVRFRCk7Cn0KCmlmICghXGlzX2ludCgkaW50KSkgewpyZXR1cm4gJGludDsKfQoKaWYgKCRpbnQgPCAtMTI4IHx8ICRpbnQgPiAyNTUpIHsKcmV0dXJuIChzdHJpbmcpICRpbnQ7Cn0KCmlmICgkaW50IDwgMCkgewokaW50ICs9IDI1NjsKfQoKcmV0dXJuIFxjaHIoJGludCk7Cn0KfQoKQ29weXJpZ2h0IChjKSAyMDE4LXByZXNlbnQgRmFiaWVuIFBvdGVuY2llcgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAp0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KCjw/cGhwCgoKCgoKCgoKCgp1c2UgU3ltZm9ueVxQb2x5ZmlsbFxDdHlwZSBhcyBwOwoKaWYgKFxQSFBfVkVSU0lPTl9JRCA+PSA4MDAwMCkgewpyZXR1cm4gcmVxdWlyZSBfX0RJUl9fLicvYm9vdHN0cmFwODAucGhwJzsKfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2N0eXBlX2FsbnVtJykpIHsKZnVuY3Rpb24gY3R5cGVfYWxudW0oJHRleHQpIHsgcmV0dXJuIHBcQ3R5cGU6OmN0eXBlX2FsbnVtKCR0ZXh0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdHlwZV9hbHBoYScpKSB7CmZ1bmN0aW9uIGN0eXBlX2FscGhhKCR0ZXh0KSB7IHJldHVybiBwXEN0eXBlOjpjdHlwZV9hbHBoYSgkdGV4dCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY3R5cGVfY250cmwnKSkgewpmdW5jdGlvbiBjdHlwZV9jbnRybCgkdGV4dCkgeyByZXR1cm4gcFxDdHlwZTo6Y3R5cGVfY250cmwoJHRleHQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2N0eXBlX2RpZ2l0JykpIHsKZnVuY3Rpb24gY3R5cGVfZGlnaXQoJHRleHQpIHsgcmV0dXJuIHBcQ3R5cGU6OmN0eXBlX2RpZ2l0KCR0ZXh0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdHlwZV9ncmFwaCcpKSB7CmZ1bmN0aW9uIGN0eXBlX2dyYXBoKCR0ZXh0KSB7IHJldHVybiBwXEN0eXBlOjpjdHlwZV9ncmFwaCgkdGV4dCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY3R5cGVfbG93ZXInKSkgewpmdW5jdGlvbiBjdHlwZV9sb3dlcigkdGV4dCkgeyByZXR1cm4gcFxDdHlwZTo6Y3R5cGVfbG93ZXIoJHRleHQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2N0eXBlX3ByaW50JykpIHsKZnVuY3Rpb24gY3R5cGVfcHJpbnQoJHRleHQpIHsgcmV0dXJuIHBcQ3R5cGU6OmN0eXBlX3ByaW50KCR0ZXh0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdHlwZV9wdW5jdCcpKSB7CmZ1bmN0aW9uIGN0eXBlX3B1bmN0KCR0ZXh0KSB7IHJldHVybiBwXEN0eXBlOjpjdHlwZV9wdW5jdCgkdGV4dCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY3R5cGVfc3BhY2UnKSkgewpmdW5jdGlvbiBjdHlwZV9zcGFjZSgkdGV4dCkgeyByZXR1cm4gcFxDdHlwZTo6Y3R5cGVfc3BhY2UoJHRleHQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2N0eXBlX3VwcGVyJykpIHsKZnVuY3Rpb24gY3R5cGVfdXBwZXIoJHRleHQpIHsgcmV0dXJuIHBcQ3R5cGU6OmN0eXBlX3VwcGVyKCR0ZXh0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdHlwZV94ZGlnaXQnKSkgewpmdW5jdGlvbiBjdHlwZV94ZGlnaXQoJHRleHQpIHsgcmV0dXJuIHBcQ3R5cGU6OmN0eXBlX3hkaWdpdCgkdGV4dCk7IH0KfQo8P3BocAoKCgoKCgoKCgoKdXNlIFN5bWZvbnlcUG9seWZpbGxcQ3R5cGUgYXMgcDsKCmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdHlwZV9hbG51bScpKSB7CmZ1bmN0aW9uIGN0eXBlX2FsbnVtKG1peGVkICR0ZXh0KTogYm9vbCB7IHJldHVybiBwXEN0eXBlOjpjdHlwZV9hbG51bSgkdGV4dCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY3R5cGVfYWxwaGEnKSkgewpmdW5jdGlvbiBjdHlwZV9hbHBoYShtaXhlZCAkdGV4dCk6IGJvb2wgeyByZXR1cm4gcFxDdHlwZTo6Y3R5cGVfYWxwaGEoJHRleHQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2N0eXBlX2NudHJsJykpIHsKZnVuY3Rpb24gY3R5cGVfY250cmwobWl4ZWQgJHRleHQpOiBib29sIHsgcmV0dXJuIHBcQ3R5cGU6OmN0eXBlX2NudHJsKCR0ZXh0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdHlwZV9kaWdpdCcpKSB7CmZ1bmN0aW9uIGN0eXBlX2RpZ2l0KG1peGVkICR0ZXh0KTogYm9vbCB7IHJldHVybiBwXEN0eXBlOjpjdHlwZV9kaWdpdCgkdGV4dCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY3R5cGVfZ3JhcGgnKSkgewpmdW5jdGlvbiBjdHlwZV9ncmFwaChtaXhlZCAkdGV4dCk6IGJvb2wgeyByZXR1cm4gcFxDdHlwZTo6Y3R5cGVfZ3JhcGgoJHRleHQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2N0eXBlX2xvd2VyJykpIHsKZnVuY3Rpb24gY3R5cGVfbG93ZXIobWl4ZWQgJHRleHQpOiBib29sIHsgcmV0dXJuIHBcQ3R5cGU6OmN0eXBlX2xvd2VyKCR0ZXh0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdHlwZV9wcmludCcpKSB7CmZ1bmN0aW9uIGN0eXBlX3ByaW50KG1peGVkICR0ZXh0KTogYm9vbCB7IHJldHVybiBwXEN0eXBlOjpjdHlwZV9wcmludCgkdGV4dCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY3R5cGVfcHVuY3QnKSkgewpmdW5jdGlvbiBjdHlwZV9wdW5jdChtaXhlZCAkdGV4dCk6IGJvb2wgeyByZXR1cm4gcFxDdHlwZTo6Y3R5cGVfcHVuY3QoJHRleHQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2N0eXBlX3NwYWNlJykpIHsKZnVuY3Rpb24gY3R5cGVfc3BhY2UobWl4ZWQgJHRleHQpOiBib29sIHsgcmV0dXJuIHBcQ3R5cGU6OmN0eXBlX3NwYWNlKCR0ZXh0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdHlwZV91cHBlcicpKSB7CmZ1bmN0aW9uIGN0eXBlX3VwcGVyKG1peGVkICR0ZXh0KTogYm9vbCB7IHJldHVybiBwXEN0eXBlOjpjdHlwZV91cHBlcigkdGV4dCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY3R5cGVfeGRpZ2l0JykpIHsKZnVuY3Rpb24gY3R5cGVfeGRpZ2l0KG1peGVkICR0ZXh0KTogYm9vbCB7IHJldHVybiBwXEN0eXBlOjpjdHlwZV94ZGlnaXQoJHRleHQpOyB9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XFBvbHlmaWxsXEludGxcR3JhcGhlbWU7CgpcZGVmaW5lKCdTWU1GT05ZX0dSQVBIRU1FX0NMVVNURVJfUlgnLCAoKGZsb2F0KSBcUENSRV9WRVJTSU9OIDwgMTAgPyAoZmxvYXQpIFxQQ1JFX1ZFUlNJT04gPj0gOC4zMiA6IChmbG9hdCkgXFBDUkVfVkVSU0lPTiA+PSAxMC4zOSkgPyAnXFgnIDogR3JhcGhlbWU6OkdSQVBIRU1FX0NMVVNURVJfUlgpOwoKCgoKCgoKCgoKCgoKCgoKCgoKCgpmaW5hbCBjbGFzcyBHcmFwaGVtZQp7CgoKcHVibGljIGNvbnN0IEdSQVBIRU1FX0NMVVNURVJfUlggPSAnKD86XHJcbnwoPzpbIC1+XHh7MjAwQ31ceHsyMDBEfV18W+GGqC3hh7ldK3xb4YSALeGFn10qKD86W+qwgOqwnOqwuOqxlOqxsOqyjOqyqOqzhOqzoOqzvOq0mOq0tOq1kOq1rOq2iOq2pOq3gOq3nOq3uOq4lOq4sOq5jOq5qOq6hOq6oOq6vOq7mOq7tOq8kOq8rOq9iOq9pOq+gOq+nOq+uOq/lOq/sOuAjOuAqOuBhOuBoOuBvOuCmOuCtOuDkOuDrOuEiOuEpOuFgOuFnOuFuOuGlOuGsOuHjOuHqOuIhOuIoOuIvOuJmOuJtOuKkOuKrOuLiOuLpOuMgOuMnOuMuOuNlOuNsOuOjOuOqOuPhOuPoOuPvOuQmOuQtOuRkOuRrOuSiOuSpOuTgOuTnOuTuOuUlOuUsOuVjOuVqOuWhOuWoOuWvOuXmOuXtOuYkOuYrOuZiOuZpOuagOuanOuauOublOubsOucjOucqOudhOudoOudvOuemOuetOufkOufrOugiOugpOuhgOuhnOuhuOuilOuisOujjOujqOukhOukoOukvOulmOultOumkOumrOuniOunpOuogOuonOuouOuplOupsOuqjOuqqOurhOuroOurvOusmOustOutkOutrOuuiOuupOuvgOuvnOuvuOuwlOuwsOuxjOuxqOuyhOuyoOuyvOuzmOuztOu0kOu0rOu1iOu1pOu2gOu2nOu2uOu3lOu3sOu4jOu4qOu5hOu5oOu5vOu6mOu6tOu7kOu7rOu8iOu8pOu9gOu9nOu9uOu+lOu+sOu/jOu/qOyAhOyAoOyAvOyBmOyBtOyCkOyCrOyDiOyDpOyEgOyEnOyEuOyFlOyFsOyGjOyGqOyHhOyHoOyHvOyImOyItOyJkOyJrOyKiOyKpOyLgOyLnOyLuOyMlOyMsOyNjOyNqOyOhOyOoOyOvOyPmOyPtOyQkOyQrOyRiOyRpOySgOySnOySuOyTlOyTsOyUjOyUqOyVhOyVoOyVvOyWmOyWtOyXkOyXrOyYiOyYpOyZgOyZnOyZuOyalOyasOybjOybqOychOycoOycvOydmOydtOyekOyerOyfiOyfpOyggOygnOyguOyhlOyhsOyijOyiqOyjhOyjoOyjvOykmOyktOylkOylrOymiOympOyngOynnOynuOyolOyosOypjOypqOyqhOyqoOyqvOyrmOyrtOyskOysrOytiOytpOyugOyunOyuuOyvlOyvsOywjOywqOyxhOyxoOyxvOyymOyytOyzkOyzrOy0iOy0pOy1gOy1nOy1uOy2lOy2sOy3jOy3qOy4hOy4oOy4vOy5mOy5tOy6kOy6rOy7iOy7pOy8gOy8nOy8uOy9lOy9sOy+jOy+qOy/hOy/oOy/vO2AmO2AtO2BkO2BrO2CiO2CpO2DgO2DnO2DuO2ElO2EsO2FjO2FqO2GhO2GoO2GvO2HmO2HtO2IkO2IrO2JiO2JpO2KgO2KnO2KuO2LlO2LsO2MjO2MqO2NhO2NoO2NvO2OmO2OtO2PkO2PrO2QiO2QpO2RgO2RnO2RuO2SlO2SsO2TjO2TqO2UhO2UoO2UvO2VmO2VtO2WkO2WrO2XiO2XpO2YgO2YnO2YuO2ZlO2ZsO2ajO2aqO2bhO2boO2bvO2cmO2ctO2dkO2drO2eiF0/W+GFoC3hhqJdK3xb6rCALe2eo10pW+GGqC3hh7ldKnxb4YSALeGFn10rfFteXHB7Q2N9XHB7Q2Z9XHB7Wmx9XHB7WnB9XSlbXHB7TW59XHB7TWV9XHh7MDlCRX1ceHswOUQ3fVx4ezBCM0V9XHh7MEI1N31ceHswQkJFfVx4ezBCRDd9XHh7MENDMn1ceHswQ0Q1fVx4ezBDRDZ9XHh7MEQzRX1ceHswRDU3fVx4ezBEQ0Z9XHh7MERERn1ceHsyMDBDfVx4ezIwMER9XHh7MUQxNjV9XHh7MUQxNkV9LVx4ezFEMTcyfV0qfFtccHtDY31ccHtDZn1ccHtabH1ccHtacH1dKSc7Cgpwcml2YXRlIGNvbnN0IENBU0VfRk9MRCA9IFsKWyfCtScsICfFvycsICJceENEXHg4NSIsICfPgicsICJceENGXHg5MCIsICJceENGXHg5MSIsICJceENGXHg5NSIsICJceENGXHg5NiIsICJceENGXHhCMCIsICJceENGXHhCMSIsICJceENGXHhCNSIsICJceEUxXHhCQVx4OUIiLCAiXHhFMVx4QkVceEJFIl0sClsnzrwnLCAncycsICfOuScsICfPgycsICfOsicsICfOuCcsICfPhicsICfPgCcsICfOuicsICfPgScsICfOtScsICJceEUxXHhCOVx4QTEiLCAnzrknXSwKXTsKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ3JhcGhlbWVfZXh0cmFjdCgkcywgJHNpemUsICR0eXBlID0gXEdSQVBIRU1FX0VYVFJfQ09VTlQsICRzdGFydCA9IDAsICYkbmV4dCA9IDApCnsKaWYgKDAgPiAkc3RhcnQpIHsKJHN0YXJ0ID0gXHN0cmxlbigkcykgKyAkc3RhcnQ7Cn0KCmlmICghXGlzX3NjYWxhcigkcykpIHsKJGhhc0Vycm9yID0gZmFsc2U7CnNldF9lcnJvcl9oYW5kbGVyKHN0YXRpYyBmdW5jdGlvbiAoKSB1c2UgKCYkaGFzRXJyb3IpIHsgJGhhc0Vycm9yID0gdHJ1ZTsgfSk7CiRuZXh0ID0gc3Vic3RyKCRzLCAkc3RhcnQpOwpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKaWYgKCRoYXNFcnJvcikgewpzdWJzdHIoJHMsICRzdGFydCk7CiRzID0gJyc7Cn0gZWxzZSB7CiRzID0gJG5leHQ7Cn0KfSBlbHNlIHsKJHMgPSBzdWJzdHIoJHMsICRzdGFydCk7Cn0KJHNpemUgPSAoaW50KSAkc2l6ZTsKJHR5cGUgPSAoaW50KSAkdHlwZTsKJHN0YXJ0ID0gKGludCkgJHN0YXJ0OwoKaWYgKFxHUkFQSEVNRV9FWFRSX0NPVU5UICE9PSAkdHlwZSAmJiBcR1JBUEhFTUVfRVhUUl9NQVhCWVRFUyAhPT0gJHR5cGUgJiYgXEdSQVBIRU1FX0VYVFJfTUFYQ0hBUlMgIT09ICR0eXBlKSB7CmlmICg4MDAwMCA+IFxQSFBfVkVSU0lPTl9JRCkgewpyZXR1cm4gZmFsc2U7Cn0KCnRocm93IG5ldyBcVmFsdWVFcnJvcignZ3JhcGhlbWVfZXh0cmFjdCgpOiBBcmd1bWVudCAjMyAoJHR5cGUpIG11c3QgYmUgb25lIG9mIEdSQVBIRU1FX0VYVFJfQ09VTlQsIEdSQVBIRU1FX0VYVFJfTUFYQllURVMsIG9yIEdSQVBIRU1FX0VYVFJfTUFYQ0hBUlMnKTsKfQoKaWYgKCFpc3NldCgkc1swXSkgfHwgMCA+ICRzaXplIHx8IDAgPiAkc3RhcnQpIHsKcmV0dXJuIGZhbHNlOwp9CmlmICgwID09PSAkc2l6ZSkgewpyZXR1cm4gJyc7Cn0KCiRuZXh0ID0gJHN0YXJ0OwoKJHMgPSBwcmVnX3NwbGl0KCcvKCcuU1lNRk9OWV9HUkFQSEVNRV9DTFVTVEVSX1JYLicpL3UnLCAiXHJcbiIuJHMsICRzaXplICsgMSwgXFBSRUdfU1BMSVRfTk9fRU1QVFkgfCBcUFJFR19TUExJVF9ERUxJTV9DQVBUVVJFKTsKCmlmICghaXNzZXQoJHNbMV0pKSB7CnJldHVybiBmYWxzZTsKfQoKJGkgPSAxOwokcmV0ID0gJyc7CgpkbyB7CmlmIChcR1JBUEhFTUVfRVhUUl9DT1VOVCA9PT0gJHR5cGUpIHsKLS0kc2l6ZTsKfSBlbHNlaWYgKFxHUkFQSEVNRV9FWFRSX01BWEJZVEVTID09PSAkdHlwZSkgewokc2l6ZSAtPSBcc3RybGVuKCRzWyRpXSk7Cn0gZWxzZSB7CiRzaXplIC09IGljb252X3N0cmxlbigkc1skaV0sICdVVEYtOC8vSUdOT1JFJyk7Cn0KCmlmICgkc2l6ZSA+PSAwKSB7CiRyZXQgLj0gJHNbJGldOwp9Cn0gd2hpbGUgKGlzc2V0KCRzWysrJGldKSAmJiAkc2l6ZSA+IDApOwoKJG5leHQgKz0gXHN0cmxlbigkcmV0KTsKCnJldHVybiAkcmV0Owp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdyYXBoZW1lX3N0cmxlbigkcykKewpwcmVnX3JlcGxhY2UoJy8nLlNZTUZPTllfR1JBUEhFTUVfQ0xVU1RFUl9SWC4nL3UnLCAnJywgJHMsIC0xLCAkbGVuKTsKCnJldHVybiAwID09PSAkbGVuICYmICcnICE9PSAkcyA/IG51bGwgOiAkbGVuOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdyYXBoZW1lX3N1YnN0cigkcywgJHN0YXJ0LCAkbGVuID0gbnVsbCkKewppZiAobnVsbCA9PT0gJGxlbikgewokbGVuID0gMjE0NzQ4MzY0NzsKfQoKcHJlZ19tYXRjaF9hbGwoJy8nLlNZTUZPTllfR1JBUEhFTUVfQ0xVU1RFUl9SWC4nL3UnLCAkcywgJHMpOwoKJHNsZW4gPSBcY291bnQoJHNbMF0pOwokc3RhcnQgPSAoaW50KSAkc3RhcnQ7CgppZiAoMCA+ICRzdGFydCkgewokc3RhcnQgKz0gJHNsZW47Cn0KaWYgKDAgPiAkc3RhcnQpIHsKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDgwMDAwKSB7CnJldHVybiBmYWxzZTsKfQoKJHN0YXJ0ID0gMDsKfQppZiAoJHN0YXJ0ID49ICRzbGVuKSB7CnJldHVybiBcUEhQX1ZFUlNJT05fSUQgPj0gODAwMDAgPyAnJyA6IGZhbHNlOwp9CgokcmVtID0gJHNsZW4gLSAkc3RhcnQ7CgppZiAoMCA+ICRsZW4pIHsKJGxlbiArPSAkcmVtOwp9CmlmICgwID09PSAkbGVuKSB7CnJldHVybiAnJzsKfQppZiAoMCA+ICRsZW4pIHsKcmV0dXJuIFxQSFBfVkVSU0lPTl9JRCA+PSA4MDAwMCA/ICcnIDogZmFsc2U7Cn0KaWYgKCRsZW4gPiAkcmVtKSB7CiRsZW4gPSAkcmVtOwp9CgpyZXR1cm4gaW1wbG9kZSgnJywgXGFycmF5X3NsaWNlKCRzWzBdLCAkc3RhcnQsICRsZW4pKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBncmFwaGVtZV9zdHJwb3MoJHMsICRuZWVkbGUsICRvZmZzZXQgPSAwKQp7CnJldHVybiBzZWxmOjpncmFwaGVtZV9wb3NpdGlvbigkcywgJG5lZWRsZSwgJG9mZnNldCwgMCk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ3JhcGhlbWVfc3RyaXBvcygkcywgJG5lZWRsZSwgJG9mZnNldCA9IDApCnsKcmV0dXJuIHNlbGY6OmdyYXBoZW1lX3Bvc2l0aW9uKCRzLCAkbmVlZGxlLCAkb2Zmc2V0LCAxKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBncmFwaGVtZV9zdHJycG9zKCRzLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCkKewpyZXR1cm4gc2VsZjo6Z3JhcGhlbWVfcG9zaXRpb24oJHMsICRuZWVkbGUsICRvZmZzZXQsIDIpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdyYXBoZW1lX3N0cnJpcG9zKCRzLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCkKewpyZXR1cm4gc2VsZjo6Z3JhcGhlbWVfcG9zaXRpb24oJHMsICRuZWVkbGUsICRvZmZzZXQsIDMpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdyYXBoZW1lX3N0cmlzdHIoJHMsICRuZWVkbGUsICRiZWZvcmVOZWVkbGUgPSBmYWxzZSkKewpyZXR1cm4gbWJfc3RyaXN0cigkcywgJG5lZWRsZSwgJGJlZm9yZU5lZWRsZSwgJ1VURi04Jyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ3JhcGhlbWVfc3Ryc3RyKCRzLCAkbmVlZGxlLCAkYmVmb3JlTmVlZGxlID0gZmFsc2UpCnsKcmV0dXJuIG1iX3N0cnN0cigkcywgJG5lZWRsZSwgJGJlZm9yZU5lZWRsZSwgJ1VURi04Jyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ3JhcGhlbWVfc3RyX3NwbGl0KCRzLCAkbGVuID0gMSkKewppZiAoMCA+ICRsZW4gfHwgMTA3Mzc0MTgyMyA8ICRsZW4pIHsKaWYgKDgwMDAwID4gXFBIUF9WRVJTSU9OX0lEKSB7CnJldHVybiBmYWxzZTsKfQoKdGhyb3cgbmV3IFxWYWx1ZUVycm9yKCdncmFwaGVtZV9zdHJfc3BsaXQoKTogQXJndW1lbnQgIzIgKCRsZW5ndGgpIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxMDczNzQxODIzLicpOwp9CgppZiAoJycgPT09ICRzKSB7CnJldHVybiBbXTsKfQoKaWYgKCFwcmVnX21hdGNoX2FsbCgnLygnLlNZTUZPTllfR1JBUEhFTUVfQ0xVU1RFUl9SWC4nKS91JywgJHMsICRtYXRjaGVzKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICgxID09PSAkbGVuKSB7CnJldHVybiAkbWF0Y2hlc1swXTsKfQoKJGNodW5rcyA9IGFycmF5X2NodW5rKCRtYXRjaGVzWzBdLCAkbGVuKTsKCmZvcmVhY2ggKCRjaHVua3MgYXMgJiRjaHVuaykgewokY2h1bmsgPSBpbXBsb2RlKCcnLCAkY2h1bmspOwp9CgpyZXR1cm4gJGNodW5rczsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBncmFwaGVtZV9sZXZlbnNodGVpbigkczEsICRzMiwgJGluc2VydGlvbl9jb3N0ID0gMSwgJHJlcGxhY2VtZW50X2Nvc3QgPSAxLCAkZGVsZXRpb25fY29zdCA9IDEpCnsKaWYgKCFwcmVnX21hdGNoKCcvL3UnLCAkczEpIHx8ICFwcmVnX21hdGNoKCcvL3UnLCAkczIpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKDAgPiAkaW5zZXJ0aW9uX2Nvc3QgfHwgMCA+ICRyZXBsYWNlbWVudF9jb3N0IHx8IDAgPiAkZGVsZXRpb25fY29zdCkgewppZiAoODAwMDAgPiBcUEhQX1ZFUlNJT05fSUQpIHsKcmV0dXJuIGZhbHNlOwp9Cgp0aHJvdyBuZXcgXFZhbHVlRXJyb3IoJ2dyYXBoZW1lX2xldmVuc2h0ZWluKCk6IEFyZ3VtZW50ICMzICgkaW5zZXJ0aW9uX2Nvc3QpLCAjNCAoJHJlcGxhY2VtZW50X2Nvc3QpLCBhbmQgIzUgKCRkZWxldGlvbl9jb3N0KSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwJyk7Cn0KCnByZWdfbWF0Y2hfYWxsKCcvJy5TWU1GT05ZX0dSQVBIRU1FX0NMVVNURVJfUlguJy91JywgJHMxLCAkczEpOwpwcmVnX21hdGNoX2FsbCgnLycuU1lNRk9OWV9HUkFQSEVNRV9DTFVTVEVSX1JYLicvdScsICRzMiwgJHMyKTsKCiRzMSA9ICRzMVswXTsKJHMyID0gJHMyWzBdOwokbDEgPSBcY291bnQoJHMxKTsKJGwyID0gXGNvdW50KCRzMik7CgppZiAoMCA9PT0gJGwxKSB7CnJldHVybiAkbDIgKiAkaW5zZXJ0aW9uX2Nvc3Q7Cn0KaWYgKDAgPT09ICRsMikgewpyZXR1cm4gJGwxICogJGRlbGV0aW9uX2Nvc3Q7Cn0KCiRkcCA9IGFycmF5X2ZpbGwoMCwgJGwxICsgMSwgYXJyYXlfZmlsbCgwLCAkbDIgKyAxLCAwKSk7Cgpmb3IgKCRpID0gMTsgJGkgPD0gJGwxOyArKyRpKSB7CiRkcFskaV1bMF0gPSAkZHBbJGkgLSAxXVswXSArICRkZWxldGlvbl9jb3N0Owp9CmZvciAoJGogPSAxOyAkaiA8PSAkbDI7ICsrJGopIHsKJGRwWzBdWyRqXSA9ICRkcFswXVskaiAtIDFdICsgJGluc2VydGlvbl9jb3N0Owp9Cgpmb3IgKCRpID0gMTsgJGkgPD0gJGwxOyArKyRpKSB7CmZvciAoJGogPSAxOyAkaiA8PSAkbDI7ICsrJGopIHsKJGNvc3QgPSAoJHMxWyRpIC0gMV0gPT09ICRzMlskaiAtIDFdKSA/IDAgOiAkcmVwbGFjZW1lbnRfY29zdDsKJGRwWyRpXVskal0gPSBtaW4oJGRwWyRpIC0gMV1bJGpdICsgJGRlbGV0aW9uX2Nvc3QsICRkcFskaV1bJGogLSAxXSArICRpbnNlcnRpb25fY29zdCwgJGRwWyRpIC0gMV1bJGogLSAxXSArICRjb3N0KTsKfQp9CgpyZXR1cm4gJGRwWyRsMV1bJGwyXTsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ3JhcGhlbWVfcG9zaXRpb24oJHMsICRuZWVkbGUsICRvZmZzZXQsICRtb2RlKQp7CiRuZWVkbGUgPSAoc3RyaW5nKSAkbmVlZGxlOwppZiAoODAwMDAgPiBcUEhQX1ZFUlNJT05fSUQgJiYgIXByZWdfbWF0Y2goJy8uL3VzJywgJG5lZWRsZSkpIHsKcmV0dXJuIGZhbHNlOwp9CiRzID0gKHN0cmluZykgJHM7CmlmICghcHJlZ19tYXRjaCgnLy4vdXMnLCAkcykpIHsKcmV0dXJuIGZhbHNlOwp9CmlmICgkb2Zmc2V0ID4gMCkgewokcyA9IHNlbGY6OmdyYXBoZW1lX3N1YnN0cigkcywgJG9mZnNldCk7Cn0gZWxzZWlmICgkb2Zmc2V0IDwgMCkgewppZiAoMiA+ICRtb2RlKSB7CiRvZmZzZXQgKz0gc2VsZjo6Z3JhcGhlbWVfc3RybGVuKCRzKTsKJHMgPSBzZWxmOjpncmFwaGVtZV9zdWJzdHIoJHMsICRvZmZzZXQpOwppZiAoMCA+ICRvZmZzZXQpIHsKJG9mZnNldCA9IDA7Cn0KfSBlbHNlaWYgKDAgPiAkb2Zmc2V0ICs9IHNlbGY6OmdyYXBoZW1lX3N0cmxlbigkbmVlZGxlKSkgewokcyA9IHNlbGY6OmdyYXBoZW1lX3N1YnN0cigkcywgMCwgJG9mZnNldCk7CiRvZmZzZXQgPSAwOwp9IGVsc2Ugewokb2Zmc2V0ID0gMDsKfQp9CgoKCgokY2FzZUluc2Vuc2l0aXZlID0gJG1vZGUgJiAxOwokcmV2ZXJzZSA9ICRtb2RlICYgMjsKaWYgKCRjYXNlSW5zZW5zaXRpdmUpIHsKCgoKJG1vZGUgPSBcZGVmaW5lZCgnTUJfQ0FTRV9GT0xEX1NJTVBMRScpID8gXE1CX0NBU0VfRk9MRF9TSU1QTEUgOiBcTUJfQ0FTRV9MT1dFUjsKJHMgPSBtYl9jb252ZXJ0X2Nhc2UoJHMsICRtb2RlLCAnVVRGLTgnKTsKJG5lZWRsZSA9IG1iX2NvbnZlcnRfY2FzZSgkbmVlZGxlLCAkbW9kZSwgJ1VURi04Jyk7CgppZiAoIVxkZWZpbmVkKCdNQl9DQVNFX0ZPTERfU0lNUExFJykpIHsKJHMgPSBzdHJfcmVwbGFjZShzZWxmOjpDQVNFX0ZPTERbMF0sIHNlbGY6OkNBU0VfRk9MRFsxXSwgJHMpOwokbmVlZGxlID0gc3RyX3JlcGxhY2Uoc2VsZjo6Q0FTRV9GT0xEWzBdLCBzZWxmOjpDQVNFX0ZPTERbMV0sICRuZWVkbGUpOwp9Cn0KaWYgKCRyZXZlcnNlKSB7CiRuZWVkbGVQb3MgPSBzdHJycG9zKCRzLCAkbmVlZGxlKTsKfSBlbHNlIHsKJG5lZWRsZVBvcyA9IHN0cnBvcygkcywgJG5lZWRsZSk7Cn0KCnJldHVybiBmYWxzZSAhPT0gJG5lZWRsZVBvcyA/IHNlbGY6OmdyYXBoZW1lX3N0cmxlbihzdWJzdHIoJHMsIDAsICRuZWVkbGVQb3MpKSArICRvZmZzZXQgOiBmYWxzZTsKfQp9CgpDb3B5cmlnaHQgKGMpIDIwMTUtcHJlc2VudCBGYWJpZW4gUG90ZW5jaWVyCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCnRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKPD9waHAKCgoKCgoKCgoKCnVzZSBTeW1mb255XFBvbHlmaWxsXEludGxcR3JhcGhlbWUgYXMgcDsKCmlmIChcUEhQX1ZFUlNJT05fSUQgPj0gODAwMDApIHsKcmV0dXJuIHJlcXVpcmUgX19ESVJfXy4nL2Jvb3RzdHJhcDgwLnBocCc7Cn0KCmlmICghZGVmaW5lZCgnR1JBUEhFTUVfRVhUUl9DT1VOVCcpKSB7CmRlZmluZSgnR1JBUEhFTUVfRVhUUl9DT1VOVCcsIDApOwp9CmlmICghZGVmaW5lZCgnR1JBUEhFTUVfRVhUUl9NQVhCWVRFUycpKSB7CmRlZmluZSgnR1JBUEhFTUVfRVhUUl9NQVhCWVRFUycsIDEpOwp9CmlmICghZGVmaW5lZCgnR1JBUEhFTUVfRVhUUl9NQVhDSEFSUycpKSB7CmRlZmluZSgnR1JBUEhFTUVfRVhUUl9NQVhDSEFSUycsIDIpOwp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfZXh0cmFjdCcpKSB7CmZ1bmN0aW9uIGdyYXBoZW1lX2V4dHJhY3QoJGhheXN0YWNrLCAkc2l6ZSwgJHR5cGUgPSAwLCAkc3RhcnQgPSAwLCAmJG5leHQgPSAwKSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9leHRyYWN0KCRoYXlzdGFjaywgJHNpemUsICR0eXBlLCAkc3RhcnQsICRuZXh0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdHJpcG9zJykpIHsKZnVuY3Rpb24gZ3JhcGhlbWVfc3RyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQgPSAwKSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9zdHJpcG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfc3RyaXN0cicpKSB7CmZ1bmN0aW9uIGdyYXBoZW1lX3N0cmlzdHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkYmVmb3JlTmVlZGxlID0gZmFsc2UpIHsgcmV0dXJuIHBcR3JhcGhlbWU6OmdyYXBoZW1lX3N0cmlzdHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkYmVmb3JlTmVlZGxlKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdHJsZW4nKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJsZW4oJGlucHV0KSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9zdHJsZW4oJGlucHV0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdHJwb3MnKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCkgeyByZXR1cm4gcFxHcmFwaGVtZTo6Z3JhcGhlbWVfc3RycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfc3Rycmlwb3MnKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQgPSAwKSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9zdHJyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dyYXBoZW1lX3N0cnJwb3MnKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCA9IDApIHsgcmV0dXJuIHBcR3JhcGhlbWU6OmdyYXBoZW1lX3N0cnJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdHJzdHInKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJzdHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkYmVmb3JlTmVlZGxlID0gZmFsc2UpIHsgcmV0dXJuIHBcR3JhcGhlbWU6OmdyYXBoZW1lX3N0cnN0cigkaGF5c3RhY2ssICRuZWVkbGUsICRiZWZvcmVOZWVkbGUpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dyYXBoZW1lX3N1YnN0cicpKSB7CmZ1bmN0aW9uIGdyYXBoZW1lX3N1YnN0cigkc3RyaW5nLCAkb2Zmc2V0LCAkbGVuZ3RoID0gbnVsbCkgeyByZXR1cm4gcFxHcmFwaGVtZTo6Z3JhcGhlbWVfc3Vic3RyKCRzdHJpbmcsICRvZmZzZXQsICRsZW5ndGgpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dyYXBoZW1lX3N0cl9zcGxpdCcpKSB7CmZ1bmN0aW9uIGdyYXBoZW1lX3N0cl9zcGxpdChzdHJpbmcgJHN0cmluZywgaW50ICRsZW5ndGggPSAxKSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9zdHJfc3BsaXQoJHN0cmluZywgJGxlbmd0aCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfbGV2ZW5zaHRlaW4nKSkgewpmdW5jdGlvbiBncmFwaGVtZV9sZXZlbnNodGVpbihzdHJpbmcgJHN0cmluZzEsIHN0cmluZyAkc3RyaW5nMiwgaW50ICRpbnNlcnRpb25fY29zdCA9IDEsIGludCAkcmVwbGFjZW1lbnRfY29zdCA9IDEsIGludCAkZGVsZXRpb25fY29zdCA9IDEsIHN0cmluZyAkbG9jYWxlID0gJycpIHsgcmV0dXJuIHBcUGhwODU6OmdyYXBoZW1lX2xldmVuc2h0ZWluKCRzdHJpbmcxLCAkc3RyaW5nMiwgJGluc2VydGlvbl9jb3N0LCAkcmVwbGFjZW1lbnRfY29zdCwgJGRlbGV0aW9uX2Nvc3QpOyB9Cn0KPD9waHAKCgoKCgoKCgoKCnVzZSBTeW1mb255XFBvbHlmaWxsXEludGxcR3JhcGhlbWUgYXMgcDsKCmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdHJfc3BsaXQnKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJfc3BsaXQoc3RyaW5nICRzdHJpbmcsIGludCAkbGVuZ3RoID0gMSk6IGFycmF5fGZhbHNlIHsgcmV0dXJuIHBcR3JhcGhlbWU6OmdyYXBoZW1lX3N0cl9zcGxpdCgkc3RyaW5nLCAkbGVuZ3RoKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9sZXZlbnNodGVpbicpKSB7CmZ1bmN0aW9uIGdyYXBoZW1lX2xldmVuc2h0ZWluKHN0cmluZyAkc3RyaW5nMSwgc3RyaW5nICRzdHJpbmcyLCBpbnQgJGluc2VydGlvbl9jb3N0ID0gMSwgaW50ICRyZXBsYWNlbWVudF9jb3N0ID0gMSwgaW50ICRkZWxldGlvbl9jb3N0ID0gMSwgc3RyaW5nICRsb2NhbGUgPSAnJyk6IGludHxmYWxzZSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9sZXZlbnNodGVpbigkc3RyaW5nMSwgJHN0cmluZzIsICRpbnNlcnRpb25fY29zdCwgJHJlcGxhY2VtZW50X2Nvc3QsICRkZWxldGlvbl9jb3N0KTsgfQp9CgppZiAoZXh0ZW5zaW9uX2xvYWRlZCgnaW50bCcpKSB7CnJldHVybjsKfQoKaWYgKCFkZWZpbmVkKCdHUkFQSEVNRV9FWFRSX0NPVU5UJykpIHsKZGVmaW5lKCdHUkFQSEVNRV9FWFRSX0NPVU5UJywgMCk7Cn0KaWYgKCFkZWZpbmVkKCdHUkFQSEVNRV9FWFRSX01BWEJZVEVTJykpIHsKZGVmaW5lKCdHUkFQSEVNRV9FWFRSX01BWEJZVEVTJywgMSk7Cn0KaWYgKCFkZWZpbmVkKCdHUkFQSEVNRV9FWFRSX01BWENIQVJTJykpIHsKZGVmaW5lKCdHUkFQSEVNRV9FWFRSX01BWENIQVJTJywgMik7Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9leHRyYWN0JykpIHsKZnVuY3Rpb24gZ3JhcGhlbWVfZXh0cmFjdCg/c3RyaW5nICRoYXlzdGFjaywgP2ludCAkc2l6ZSwgP2ludCAkdHlwZSA9IEdSQVBIRU1FX0VYVFJfQ09VTlQsID9pbnQgJG9mZnNldCA9IDAsICYkbmV4dCA9IG51bGwpOiBzdHJpbmd8ZmFsc2UgeyByZXR1cm4gcFxHcmFwaGVtZTo6Z3JhcGhlbWVfZXh0cmFjdCgoc3RyaW5nKSAkaGF5c3RhY2ssIChpbnQpICRzaXplLCAoaW50KSAkdHlwZSwgKGludCkgJG9mZnNldCwgJG5leHQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dyYXBoZW1lX3N0cmlwb3MnKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJpcG9zKD9zdHJpbmcgJGhheXN0YWNrLCA/c3RyaW5nICRuZWVkbGUsID9pbnQgJG9mZnNldCA9IDApOiBpbnR8ZmFsc2UgeyByZXR1cm4gcFxHcmFwaGVtZTo6Z3JhcGhlbWVfc3RyaXBvcygoc3RyaW5nKSAkaGF5c3RhY2ssIChzdHJpbmcpICRuZWVkbGUsIChpbnQpICRvZmZzZXQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dyYXBoZW1lX3N0cmlzdHInKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJpc3RyKD9zdHJpbmcgJGhheXN0YWNrLCA/c3RyaW5nICRuZWVkbGUsID9ib29sICRiZWZvcmVOZWVkbGUgPSBmYWxzZSk6IHN0cmluZ3xmYWxzZSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9zdHJpc3RyKChzdHJpbmcpICRoYXlzdGFjaywgKHN0cmluZykgJG5lZWRsZSwgKGJvb2wpICRiZWZvcmVOZWVkbGUpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dyYXBoZW1lX3N0cmxlbicpKSB7CmZ1bmN0aW9uIGdyYXBoZW1lX3N0cmxlbig/c3RyaW5nICRzdHJpbmcpOiBpbnR8ZmFsc2V8bnVsbCB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9zdHJsZW4oKHN0cmluZykgJHN0cmluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfc3RycG9zJykpIHsKZnVuY3Rpb24gZ3JhcGhlbWVfc3RycG9zKD9zdHJpbmcgJGhheXN0YWNrLCA/c3RyaW5nICRuZWVkbGUsID9pbnQgJG9mZnNldCA9IDApOiBpbnR8ZmFsc2UgeyByZXR1cm4gcFxHcmFwaGVtZTo6Z3JhcGhlbWVfc3RycG9zKChzdHJpbmcpICRoYXlzdGFjaywgKHN0cmluZykgJG5lZWRsZSwgKGludCkgJG9mZnNldCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfc3Rycmlwb3MnKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJyaXBvcyg/c3RyaW5nICRoYXlzdGFjaywgP3N0cmluZyAkbmVlZGxlLCA/aW50ICRvZmZzZXQgPSAwKTogaW50fGZhbHNlIHsgcmV0dXJuIHBcR3JhcGhlbWU6OmdyYXBoZW1lX3N0cnJpcG9zKChzdHJpbmcpICRoYXlzdGFjaywgKHN0cmluZykgJG5lZWRsZSwgKGludCkgJG9mZnNldCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfc3RycnBvcycpKSB7CmZ1bmN0aW9uIGdyYXBoZW1lX3N0cnJwb3MoP3N0cmluZyAkaGF5c3RhY2ssID9zdHJpbmcgJG5lZWRsZSwgP2ludCAkb2Zmc2V0ID0gMCk6IGludHxmYWxzZSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9zdHJycG9zKChzdHJpbmcpICRoYXlzdGFjaywgKHN0cmluZykgJG5lZWRsZSwgKGludCkgJG9mZnNldCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfc3Ryc3RyJykpIHsKZnVuY3Rpb24gZ3JhcGhlbWVfc3Ryc3RyKD9zdHJpbmcgJGhheXN0YWNrLCA/c3RyaW5nICRuZWVkbGUsID9ib29sICRiZWZvcmVOZWVkbGUgPSBmYWxzZSk6IHN0cmluZ3xmYWxzZSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9zdHJzdHIoKHN0cmluZykgJGhheXN0YWNrLCAoc3RyaW5nKSAkbmVlZGxlLCAoYm9vbCkgJGJlZm9yZU5lZWRsZSk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfc3Vic3RyJykpIHsKZnVuY3Rpb24gZ3JhcGhlbWVfc3Vic3RyKD9zdHJpbmcgJHN0cmluZywgP2ludCAkb2Zmc2V0LCA/aW50ICRsZW5ndGggPSBudWxsKTogc3RyaW5nfGZhbHNlIHsgcmV0dXJuIHBcR3JhcGhlbWU6OmdyYXBoZW1lX3N1YnN0cigoc3RyaW5nKSAkc3RyaW5nLCAoaW50KSAkb2Zmc2V0LCAkbGVuZ3RoKTsgfQp9CgpDb3B5cmlnaHQgKGMpIDIwMTUtcHJlc2VudCBGYWJpZW4gUG90ZW5jaWVyCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCnRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XFBvbHlmaWxsXEludGxcTm9ybWFsaXplcjsKCgoKCgoKCgoKCgpjbGFzcyBOb3JtYWxpemVyCnsKcHVibGljIGNvbnN0IEZPUk1fRCA9IFxOb3JtYWxpemVyOjpGT1JNX0Q7CnB1YmxpYyBjb25zdCBGT1JNX0tEID0gXE5vcm1hbGl6ZXI6OkZPUk1fS0Q7CnB1YmxpYyBjb25zdCBGT1JNX0MgPSBcTm9ybWFsaXplcjo6Rk9STV9DOwpwdWJsaWMgY29uc3QgRk9STV9LQyA9IFxOb3JtYWxpemVyOjpGT1JNX0tDOwpwdWJsaWMgY29uc3QgTkZEID0gXE5vcm1hbGl6ZXI6Ok5GRDsKcHVibGljIGNvbnN0IE5GS0QgPSBcTm9ybWFsaXplcjo6TkZLRDsKcHVibGljIGNvbnN0IE5GQyA9IFxOb3JtYWxpemVyOjpORkM7CnB1YmxpYyBjb25zdCBORktDID0gXE5vcm1hbGl6ZXI6Ok5GS0M7Cgpwcml2YXRlIHN0YXRpYyAkQzsKcHJpdmF0ZSBzdGF0aWMgJEQ7CnByaXZhdGUgc3RhdGljICRLRDsKcHJpdmF0ZSBzdGF0aWMgJGNDOwpwcml2YXRlIHN0YXRpYyAkdWxlbk1hc2sgPSBbIlx4QzAiID0+IDIsICJceEQwIiA9PiAyLCAiXHhFMCIgPT4gMywgIlx4RjAiID0+IDRdOwpwcml2YXRlIHN0YXRpYyAkQVNDSUkgPSAiXHgyMFx4NjVceDY5XHg2MVx4NzNceDZFXHg3NFx4NzJceDZGXHg2Q1x4NzVceDY0XHg1RFx4NUJceDYzXHg2RFx4NzBceDI3XHgwQVx4NjdceDdDXHg2OFx4NzZceDJFXHg2Nlx4NjJceDJDXHgzQVx4M0RceDJEXHg3MVx4MzFceDMwXHg0M1x4MzJceDJBXHg3OVx4NzhceDI5XHgyOFx4NENceDM5XHg0MVx4NTNceDJGXHg1MFx4MjJceDQ1XHg2QVx4NERceDQ5XHg2Qlx4MzNceDNFXHgzNVx4NTRceDNDXHg0NFx4MzRceDdEXHg0Mlx4N0JceDM4XHg0Nlx4NzdceDUyXHgzNlx4MzdceDU1XHg0N1x4NEVceDNCXHg0QVx4N0FceDU2XHgyM1x4NDhceDRGXHg1N1x4NUZceDI2XHgyMVx4NEJceDNGXHg1OFx4NTFceDI1XHg1OVx4NUNceDA5XHg1QVx4MkJceDdFXHg1RVx4MjRceDQwXHg2MFx4N0ZceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDhceDBCXHgwQ1x4MERceDBFXHgwRlx4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3XHgxOFx4MTlceDFBXHgxQlx4MUNceDFEXHgxRVx4MUYiOwoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc05vcm1hbGl6ZWQoc3RyaW5nICRzLCBpbnQgJGZvcm0gPSBzZWxmOjpGT1JNX0MpCnsKaWYgKCFcaW5fYXJyYXkoJGZvcm0sIFtzZWxmOjpORkQsIHNlbGY6Ok5GS0QsIHNlbGY6Ok5GQywgc2VsZjo6TkZLQ10pKSB7CnJldHVybiBmYWxzZTsKfQppZiAoIWlzc2V0KCRzW3N0cnNwbigkcywgc2VsZjo6JEFTQ0lJKV0pKSB7CnJldHVybiB0cnVlOwp9CmlmIChzZWxmOjpORkMgPT0gJGZvcm0gJiYgcHJlZ19tYXRjaCgnLy91JywgJHMpICYmICFwcmVnX21hdGNoKCcvW15ceDAwLVx4ezJGRn1dL3UnLCAkcykpIHsKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBzZWxmOjpub3JtYWxpemUoJHMsICRmb3JtKSA9PT0gJHM7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbm9ybWFsaXplKHN0cmluZyAkcywgaW50ICRmb3JtID0gc2VsZjo6Rk9STV9DKQp7CmlmICghcHJlZ19tYXRjaCgnLy91JywgJHMpKSB7CnJldHVybiBmYWxzZTsKfQoKc3dpdGNoICgkZm9ybSkgewpjYXNlIHNlbGY6Ok5GQzogJEMgPSB0cnVlOyAkSyA9IGZhbHNlOyBicmVhazsKY2FzZSBzZWxmOjpORkQ6ICRDID0gZmFsc2U7ICRLID0gZmFsc2U7IGJyZWFrOwpjYXNlIHNlbGY6Ok5GS0M6ICRDID0gdHJ1ZTsgJEsgPSB0cnVlOyBicmVhazsKY2FzZSBzZWxmOjpORktEOiAkQyA9IGZhbHNlOyAkSyA9IHRydWU7IGJyZWFrOwpkZWZhdWx0OgppZiAoXGRlZmluZWQoJ05vcm1hbGl6ZXI6Ok5PTkUnKSAmJiBcTm9ybWFsaXplcjo6Tk9ORSA9PSAkZm9ybSkgewpyZXR1cm4gJHM7Cn0KCmlmICg4MDAwMCA+IFxQSFBfVkVSU0lPTl9JRCkgewpyZXR1cm4gZmFsc2U7Cn0KCnRocm93IG5ldyBcVmFsdWVFcnJvcignbm9ybWFsaXplcl9ub3JtYWxpemUoKTogQXJndW1lbnQgIzIgKCRmb3JtKSBtdXN0IGJlIGEgYSB2YWxpZCBub3JtYWxpemF0aW9uIGZvcm0nKTsKfQoKaWYgKCcnID09PSAkcykgewpyZXR1cm4gJyc7Cn0KCmlmICgkSyAmJiBudWxsID09PSBzZWxmOjokS0QpIHsKc2VsZjo6JEtEID0gc2VsZjo6Z2V0RGF0YSgnY29tcGF0aWJpbGl0eURlY29tcG9zaXRpb24nKTsKfQoKaWYgKG51bGwgPT09IHNlbGY6OiREKSB7CnNlbGY6OiREID0gc2VsZjo6Z2V0RGF0YSgnY2Fub25pY2FsRGVjb21wb3NpdGlvbicpOwpzZWxmOjokY0MgPSBzZWxmOjpnZXREYXRhKCdjb21iaW5pbmdDbGFzcycpOwp9CgppZiAobnVsbCAhPT0gJG1iRW5jb2RpbmcgPSAoMiAgJiAoaW50KSBcaW5pX2dldCgnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcpKSA/IG1iX2ludGVybmFsX2VuY29kaW5nKCkgOiBudWxsKSB7Cm1iX2ludGVybmFsX2VuY29kaW5nKCc4Yml0Jyk7Cn0KCiRyID0gc2VsZjo6ZGVjb21wb3NlKCRzLCAkSyk7CgppZiAoJEMpIHsKaWYgKG51bGwgPT09IHNlbGY6OiRDKSB7CnNlbGY6OiRDID0gc2VsZjo6Z2V0RGF0YSgnY2Fub25pY2FsQ29tcG9zaXRpb24nKTsKfQoKJHIgPSBzZWxmOjpyZWNvbXBvc2UoJHIpOwp9CmlmIChudWxsICE9PSAkbWJFbmNvZGluZykgewptYl9pbnRlcm5hbF9lbmNvZGluZygkbWJFbmNvZGluZyk7Cn0KCnJldHVybiAkcjsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gcmVjb21wb3NlKCRzKQp7CiRBU0NJSSA9IHNlbGY6OiRBU0NJSTsKJGNvbXBNYXAgPSBzZWxmOjokQzsKJGNvbWJDbGFzcyA9IHNlbGY6OiRjQzsKJHVsZW5NYXNrID0gc2VsZjo6JHVsZW5NYXNrOwoKJHJlc3VsdCA9ICR0YWlsID0gJyc7CgokaSA9ICRzWzBdIDwgIlx4ODAiID8gMSA6ICR1bGVuTWFza1skc1swXSAmICJceEYwIl07CiRsZW4gPSBcc3RybGVuKCRzKTsKCiRsYXN0VWNociA9IHN1YnN0cigkcywgMCwgJGkpOwokbGFzdFVjbHMgPSBpc3NldCgkY29tYkNsYXNzWyRsYXN0VWNocl0pID8gMjU2IDogMDsKCndoaWxlICgkaSA8ICRsZW4pIHsKaWYgKCRzWyRpXSA8ICJceDgwIikgewoKCmlmICgkdGFpbCkgewokbGFzdFVjaHIgLj0gJHRhaWw7CiR0YWlsID0gJyc7Cn0KCmlmICgkaiA9IHN0cnNwbigkcywgJEFTQ0lJLCAkaSArIDEpKSB7CiRsYXN0VWNociAuPSBzdWJzdHIoJHMsICRpLCAkaik7CiRpICs9ICRqOwp9CgokcmVzdWx0IC49ICRsYXN0VWNocjsKJGxhc3RVY2hyID0gJHNbJGldOwokbGFzdFVjbHMgPSAwOworKyRpOwpjb250aW51ZTsKfQoKJHVsZW4gPSAkdWxlbk1hc2tbJHNbJGldICYgIlx4RjAiXTsKJHVjaHIgPSBzdWJzdHIoJHMsICRpLCAkdWxlbik7CgppZiAoJGxhc3RVY2hyIDwgIlx4RTFceDg0XHg4MCIgfHwgIlx4RTFceDg0XHg5MiIgPCAkbGFzdFVjaHIKfHwgJHVjaHIgPCAiXHhFMVx4ODVceEExIiB8fCAiXHhFMVx4ODVceEI1IiA8ICR1Y2hyCnx8ICRsYXN0VWNscykgewoKCiR1Y2xzID0gJGNvbWJDbGFzc1skdWNocl0gPz8gMDsKCmlmIChpc3NldCgkY29tcE1hcFskbGFzdFVjaHIuJHVjaHJdKSAmJiAoISRsYXN0VWNscyB8fCAkbGFzdFVjbHMgPCAkdWNscykpIHsKJGxhc3RVY2hyID0gJGNvbXBNYXBbJGxhc3RVY2hyLiR1Y2hyXTsKfSBlbHNlaWYgKCRsYXN0VWNscyA9ICR1Y2xzKSB7CiR0YWlsIC49ICR1Y2hyOwp9IGVsc2UgewppZiAoJHRhaWwpIHsKJGxhc3RVY2hyIC49ICR0YWlsOwokdGFpbCA9ICcnOwp9CgokcmVzdWx0IC49ICRsYXN0VWNocjsKJGxhc3RVY2hyID0gJHVjaHI7Cn0KfSBlbHNlIHsKCgokTCA9IFxvcmQoJGxhc3RVY2hyWzJdKSAtIDB4ODA7CiRWID0gXG9yZCgkdWNoclsyXSkgLSAweEExOwokVCA9IDA7CgokdWNociA9IHN1YnN0cigkcywgJGkgKyAkdWxlbiwgMyk7CgppZiAoIlx4RTFceDg2XHhBNyIgPD0gJHVjaHIgJiYgJHVjaHIgPD0gIlx4RTFceDg3XHg4MiIpIHsKJFQgPSBcb3JkKCR1Y2hyWzJdKSAtIDB4QTc7CjAgPiAkVCAmJiAkVCArPSAweDQwOwokdWxlbiArPSAzOwp9CgokTCA9IDB4QUMwMCArICgkTCAqIDIxICsgJFYpICogMjggKyAkVDsKJGxhc3RVY2hyID0gXGNocigweEUwIHwgJEwgPj4gMTIpLlxjaHIoMHg4MCB8ICRMID4+IDYgJiAweDNGKS5cY2hyKDB4ODAgfCAkTCAmIDB4M0YpOwp9CgokaSArPSAkdWxlbjsKfQoKcmV0dXJuICRyZXN1bHQuJGxhc3RVY2hyLiR0YWlsOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBkZWNvbXBvc2UoJHMsICRjKQp7CiRyZXN1bHQgPSAnJzsKCiRBU0NJSSA9IHNlbGY6OiRBU0NJSTsKJGRlY29tcE1hcCA9IHNlbGY6OiREOwokY29tYkNsYXNzID0gc2VsZjo6JGNDOwokdWxlbk1hc2sgPSBzZWxmOjokdWxlbk1hc2s7CmlmICgkYykgewokY29tcGF0TWFwID0gc2VsZjo6JEtEOwp9CgokYyA9IFtdOwokaSA9IDA7CiRsZW4gPSBcc3RybGVuKCRzKTsKCndoaWxlICgkaSA8ICRsZW4pIHsKaWYgKCRzWyRpXSA8ICJceDgwIikgewoKCmlmICgkYykgewprc29ydCgkYyk7CiRyZXN1bHQgLj0gaW1wbG9kZSgnJywgJGMpOwokYyA9IFtdOwp9CgokaiA9IDEgKyBzdHJzcG4oJHMsICRBU0NJSSwgJGkgKyAxKTsKJHJlc3VsdCAuPSBzdWJzdHIoJHMsICRpLCAkaik7CiRpICs9ICRqOwpjb250aW51ZTsKfQoKJHVsZW4gPSAkdWxlbk1hc2tbJHNbJGldICYgIlx4RjAiXTsKJHVjaHIgPSBzdWJzdHIoJHMsICRpLCAkdWxlbik7CiRpICs9ICR1bGVuOwoKaWYgKCR1Y2hyIDwgIlx4RUFceEIwXHg4MCIgfHwgIlx4RURceDlFXHhBMyIgPCAkdWNocikgewoKCmlmICgkdWNociAhPT0gJGogPSAkY29tcGF0TWFwWyR1Y2hyXSA/PyAoJGRlY29tcE1hcFskdWNocl0gPz8gJHVjaHIpKSB7CiR1Y2hyID0gJGo7CgokaiA9IFxzdHJsZW4oJHVjaHIpOwokdWxlbiA9ICR1Y2hyWzBdIDwgIlx4ODAiID8gMSA6ICR1bGVuTWFza1skdWNoclswXSAmICJceEYwIl07CgppZiAoJHVsZW4gIT0gJGopIHsKCgokaiAtPSAkdWxlbjsKJGkgLT0gJGo7CgppZiAoMCA+ICRpKSB7CiRzID0gc3RyX3JlcGVhdCgnICcsIC0kaSkuJHM7CiRsZW4gLT0gJGk7CiRpID0gMDsKfQoKd2hpbGUgKCRqLS0pIHsKJHNbJGkgKyAkal0gPSAkdWNoclskdWxlbiArICRqXTsKfQoKJHVjaHIgPSBzdWJzdHIoJHVjaHIsIDAsICR1bGVuKTsKfQp9CmlmIChpc3NldCgkY29tYkNsYXNzWyR1Y2hyXSkpIHsKCgppZiAoIWlzc2V0KCRjWyRjb21iQ2xhc3NbJHVjaHJdXSkpIHsKJGNbJGNvbWJDbGFzc1skdWNocl1dID0gJyc7Cn0KJGNbJGNvbWJDbGFzc1skdWNocl1dIC49ICR1Y2hyOwpjb250aW51ZTsKfQp9IGVsc2UgewoKCiR1Y2hyID0gdW5wYWNrKCdDKicsICR1Y2hyKTsKJGogPSAoKCR1Y2hyWzFdIC0gMjI0KSA8PCAxMikgKyAoKCR1Y2hyWzJdIC0gMTI4KSA8PCA2KSArICR1Y2hyWzNdIC0gMHhBQzgwOwoKJHVjaHIgPSAiXHhFMVx4ODQiLlxjaHIoMHg4MCArIChpbnQpICgkaiAvIDU4OCkpCi4iXHhFMVx4ODUiLlxjaHIoMHhBMSArIChpbnQpICgoJGogJSA1ODgpIC8gMjgpKTsKCmlmICgkaiAlPSAyOCkgewokdWNociAuPSAkaiA8IDI1Cj8gKCJceEUxXHg4NiIuXGNocigweEE3ICsgJGopKQo6ICgiXHhFMVx4ODciLlxjaHIoMHg2NyArICRqKSk7Cn0KfQppZiAoJGMpIHsKa3NvcnQoJGMpOwokcmVzdWx0IC49IGltcGxvZGUoJycsICRjKTsKJGMgPSBbXTsKfQoKJHJlc3VsdCAuPSAkdWNocjsKfQoKaWYgKCRjKSB7Cmtzb3J0KCRjKTsKJHJlc3VsdCAuPSBpbXBsb2RlKCcnLCAkYyk7Cn0KCnJldHVybiAkcmVzdWx0Owp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXREYXRhKCRmaWxlKQp7CmlmIChmaWxlX2V4aXN0cygkZmlsZSA9IF9fRElSX18uJy9SZXNvdXJjZXMvdW5pZGF0YS8nLiRmaWxlLicucGhwJykpIHsKcmV0dXJuIHJlcXVpcmUgJGZpbGU7Cn0KCnJldHVybiBmYWxzZTsKfQp9Cjw/cGhwCgpjbGFzcyBOb3JtYWxpemVyIGV4dGVuZHMgU3ltZm9ueVxQb2x5ZmlsbFxJbnRsXE5vcm1hbGl6ZXJcTm9ybWFsaXplcgp7CgoKCnB1YmxpYyBjb25zdCBOT05FID0gMjsKcHVibGljIGNvbnN0IEZPUk1fRCA9IDQ7CnB1YmxpYyBjb25zdCBGT1JNX0tEID0gODsKcHVibGljIGNvbnN0IEZPUk1fQyA9IDE2OwpwdWJsaWMgY29uc3QgRk9STV9LQyA9IDMyOwpwdWJsaWMgY29uc3QgTkZEID0gNDsKcHVibGljIGNvbnN0IE5GS0QgPSA4OwpwdWJsaWMgY29uc3QgTkZDID0gMTY7CnB1YmxpYyBjb25zdCBORktDID0gMzI7Cn0KPD9waHAKCnJldHVybiBhcnJheSAoCidBzIAnID0+ICfDgCcsCidBzIEnID0+ICfDgScsCidBzIInID0+ICfDgicsCidBzIMnID0+ICfDgycsCidBzIgnID0+ICfDhCcsCidBzIonID0+ICfDhScsCidDzKcnID0+ICfDhycsCidFzIAnID0+ICfDiCcsCidFzIEnID0+ICfDiScsCidFzIInID0+ICfDiicsCidFzIgnID0+ICfDiycsCidJzIAnID0+ICfDjCcsCidJzIEnID0+ICfDjScsCidJzIInID0+ICfDjicsCidJzIgnID0+ICfDjycsCidOzIMnID0+ICfDkScsCidPzIAnID0+ICfDkicsCidPzIEnID0+ICfDkycsCidPzIInID0+ICfDlCcsCidPzIMnID0+ICfDlScsCidPzIgnID0+ICfDlicsCidVzIAnID0+ICfDmScsCidVzIEnID0+ICfDmicsCidVzIInID0+ICfDmycsCidVzIgnID0+ICfDnCcsCidZzIEnID0+ICfDnScsCidhzIAnID0+ICfDoCcsCidhzIEnID0+ICfDoScsCidhzIInID0+ICfDoicsCidhzIMnID0+ICfDoycsCidhzIgnID0+ICfDpCcsCidhzIonID0+ICfDpScsCidjzKcnID0+ICfDpycsCidlzIAnID0+ICfDqCcsCidlzIEnID0+ICfDqScsCidlzIInID0+ICfDqicsCidlzIgnID0+ICfDqycsCidpzIAnID0+ICfDrCcsCidpzIEnID0+ICfDrScsCidpzIInID0+ICfDricsCidpzIgnID0+ICfDrycsCiduzIMnID0+ICfDsScsCidvzIAnID0+ICfDsicsCidvzIEnID0+ICfDsycsCidvzIInID0+ICfDtCcsCidvzIMnID0+ICfDtScsCidvzIgnID0+ICfDticsCid1zIAnID0+ICfDuScsCid1zIEnID0+ICfDuicsCid1zIInID0+ICfDuycsCid1zIgnID0+ICfDvCcsCid5zIEnID0+ICfDvScsCid5zIgnID0+ICfDvycsCidBzIQnID0+ICfEgCcsCidhzIQnID0+ICfEgScsCidBzIYnID0+ICfEgicsCidhzIYnID0+ICfEgycsCidBzKgnID0+ICfEhCcsCidhzKgnID0+ICfEhScsCidDzIEnID0+ICfEhicsCidjzIEnID0+ICfEhycsCidDzIInID0+ICfEiCcsCidjzIInID0+ICfEiScsCidDzIcnID0+ICfEiicsCidjzIcnID0+ICfEiycsCidDzIwnID0+ICfEjCcsCidjzIwnID0+ICfEjScsCidEzIwnID0+ICfEjicsCidkzIwnID0+ICfEjycsCidFzIQnID0+ICfEkicsCidlzIQnID0+ICfEkycsCidFzIYnID0+ICfElCcsCidlzIYnID0+ICfElScsCidFzIcnID0+ICfElicsCidlzIcnID0+ICfElycsCidFzKgnID0+ICfEmCcsCidlzKgnID0+ICfEmScsCidFzIwnID0+ICfEmicsCidlzIwnID0+ICfEmycsCidHzIInID0+ICfEnCcsCidnzIInID0+ICfEnScsCidHzIYnID0+ICfEnicsCidnzIYnID0+ICfEnycsCidHzIcnID0+ICfEoCcsCidnzIcnID0+ICfEoScsCidHzKcnID0+ICfEoicsCidnzKcnID0+ICfEoycsCidIzIInID0+ICfEpCcsCidozIInID0+ICfEpScsCidJzIMnID0+ICfEqCcsCidpzIMnID0+ICfEqScsCidJzIQnID0+ICfEqicsCidpzIQnID0+ICfEqycsCidJzIYnID0+ICfErCcsCidpzIYnID0+ICfErScsCidJzKgnID0+ICfEricsCidpzKgnID0+ICfErycsCidJzIcnID0+ICfEsCcsCidKzIInID0+ICfEtCcsCidqzIInID0+ICfEtScsCidLzKcnID0+ICfEticsCidrzKcnID0+ICfEtycsCidMzIEnID0+ICfEuScsCidszIEnID0+ICfEuicsCidMzKcnID0+ICfEuycsCidszKcnID0+ICfEvCcsCidMzIwnID0+ICfEvScsCidszIwnID0+ICfEvicsCidOzIEnID0+ICfFgycsCiduzIEnID0+ICfFhCcsCidOzKcnID0+ICfFhScsCiduzKcnID0+ICfFhicsCidOzIwnID0+ICfFhycsCiduzIwnID0+ICfFiCcsCidPzIQnID0+ICfFjCcsCidvzIQnID0+ICfFjScsCidPzIYnID0+ICfFjicsCidvzIYnID0+ICfFjycsCidPzIsnID0+ICfFkCcsCidvzIsnID0+ICfFkScsCidSzIEnID0+ICfFlCcsCidyzIEnID0+ICfFlScsCidSzKcnID0+ICfFlicsCidyzKcnID0+ICfFlycsCidSzIwnID0+ICfFmCcsCidyzIwnID0+ICfFmScsCidTzIEnID0+ICfFmicsCidzzIEnID0+ICfFmycsCidTzIInID0+ICfFnCcsCidzzIInID0+ICfFnScsCidTzKcnID0+ICfFnicsCidzzKcnID0+ICfFnycsCidTzIwnID0+ICfFoCcsCidzzIwnID0+ICfFoScsCidUzKcnID0+ICfFoicsCid0zKcnID0+ICfFoycsCidUzIwnID0+ICfFpCcsCid0zIwnID0+ICfFpScsCidVzIMnID0+ICfFqCcsCid1zIMnID0+ICfFqScsCidVzIQnID0+ICfFqicsCid1zIQnID0+ICfFqycsCidVzIYnID0+ICfFrCcsCid1zIYnID0+ICfFrScsCidVzIonID0+ICfFricsCid1zIonID0+ICfFrycsCidVzIsnID0+ICfFsCcsCid1zIsnID0+ICfFsScsCidVzKgnID0+ICfFsicsCid1zKgnID0+ICfFsycsCidXzIInID0+ICfFtCcsCid3zIInID0+ICfFtScsCidZzIInID0+ICfFticsCid5zIInID0+ICfFtycsCidZzIgnID0+ICfFuCcsCidazIEnID0+ICfFuScsCid6zIEnID0+ICfFuicsCidazIcnID0+ICfFuycsCid6zIcnID0+ICfFvCcsCidazIwnID0+ICfFvScsCid6zIwnID0+ICfFvicsCidPzJsnID0+ICfGoCcsCidvzJsnID0+ICfGoScsCidVzJsnID0+ICfGrycsCid1zJsnID0+ICfGsCcsCidBzIwnID0+ICfHjScsCidhzIwnID0+ICfHjicsCidJzIwnID0+ICfHjycsCidpzIwnID0+ICfHkCcsCidPzIwnID0+ICfHkScsCidvzIwnID0+ICfHkicsCidVzIwnID0+ICfHkycsCid1zIwnID0+ICfHlCcsCifDnMyEJyA9PiAnx5UnLAonw7zMhCcgPT4gJ8eWJywKJ8OczIEnID0+ICfHlycsCifDvMyBJyA9PiAnx5gnLAonw5zMjCcgPT4gJ8eZJywKJ8O8zIwnID0+ICfHmicsCifDnMyAJyA9PiAnx5snLAonw7zMgCcgPT4gJ8ecJywKJ8OEzIQnID0+ICfHnicsCifDpMyEJyA9PiAnx58nLAonyKbMhCcgPT4gJ8egJywKJ8inzIQnID0+ICfHoScsCifDhsyEJyA9PiAnx6InLAonw6bMhCcgPT4gJ8ejJywKJ0fMjCcgPT4gJ8emJywKJ2fMjCcgPT4gJ8enJywKJ0vMjCcgPT4gJ8eoJywKJ2vMjCcgPT4gJ8epJywKJ0/MqCcgPT4gJ8eqJywKJ2/MqCcgPT4gJ8erJywKJ8eqzIQnID0+ICfHrCcsCifHq8yEJyA9PiAnx60nLAonxrfMjCcgPT4gJ8euJywKJ8qSzIwnID0+ICfHrycsCidqzIwnID0+ICfHsCcsCidHzIEnID0+ICfHtCcsCidnzIEnID0+ICfHtScsCidOzIAnID0+ICfHuCcsCiduzIAnID0+ICfHuScsCifDhcyBJyA9PiAnx7onLAonw6XMgScgPT4gJ8e7JywKJ8OGzIEnID0+ICfHvCcsCifDpsyBJyA9PiAnx70nLAonw5jMgScgPT4gJ8e+JywKJ8O4zIEnID0+ICfHvycsCidBzI8nID0+ICfIgCcsCidhzI8nID0+ICfIgScsCidBzJEnID0+ICfIgicsCidhzJEnID0+ICfIgycsCidFzI8nID0+ICfIhCcsCidlzI8nID0+ICfIhScsCidFzJEnID0+ICfIhicsCidlzJEnID0+ICfIhycsCidJzI8nID0+ICfIiCcsCidpzI8nID0+ICfIiScsCidJzJEnID0+ICfIiicsCidpzJEnID0+ICfIiycsCidPzI8nID0+ICfIjCcsCidvzI8nID0+ICfIjScsCidPzJEnID0+ICfIjicsCidvzJEnID0+ICfIjycsCidSzI8nID0+ICfIkCcsCidyzI8nID0+ICfIkScsCidSzJEnID0+ICfIkicsCidyzJEnID0+ICfIkycsCidVzI8nID0+ICfIlCcsCid1zI8nID0+ICfIlScsCidVzJEnID0+ICfIlicsCid1zJEnID0+ICfIlycsCidTzKYnID0+ICfImCcsCidzzKYnID0+ICfImScsCidUzKYnID0+ICfImicsCid0zKYnID0+ICfImycsCidIzIwnID0+ICfInicsCidozIwnID0+ICfInycsCidBzIcnID0+ICfIpicsCidhzIcnID0+ICfIpycsCidFzKcnID0+ICfIqCcsCidlzKcnID0+ICfIqScsCifDlsyEJyA9PiAnyKonLAonw7bMhCcgPT4gJ8irJywKJ8OVzIQnID0+ICfIrCcsCifDtcyEJyA9PiAnyK0nLAonT8yHJyA9PiAnyK4nLAonb8yHJyA9PiAnyK8nLAonyK7MhCcgPT4gJ8iwJywKJ8ivzIQnID0+ICfIsScsCidZzIQnID0+ICfIsicsCid5zIQnID0+ICfIsycsCifCqMyBJyA9PiAnzoUnLAonzpHMgScgPT4gJ86GJywKJ86VzIEnID0+ICfOiCcsCifOl8yBJyA9PiAnzoknLAonzpnMgScgPT4gJ86KJywKJ86fzIEnID0+ICfOjCcsCifOpcyBJyA9PiAnzo4nLAonzqnMgScgPT4gJ86PJywKJ8+KzIEnID0+ICfOkCcsCifOmcyIJyA9PiAnzqonLAonzqXMiCcgPT4gJ86rJywKJ86xzIEnID0+ICfOrCcsCifOtcyBJyA9PiAnzq0nLAonzrfMgScgPT4gJ86uJywKJ865zIEnID0+ICfOrycsCifPi8yBJyA9PiAnzrAnLAonzrnMiCcgPT4gJ8+KJywKJ8+FzIgnID0+ICfPiycsCifOv8yBJyA9PiAnz4wnLAonz4XMgScgPT4gJ8+NJywKJ8+JzIEnID0+ICfPjicsCifPksyBJyA9PiAnz5MnLAonz5LMiCcgPT4gJ8+UJywKJ9CVzIAnID0+ICfQgCcsCifQlcyIJyA9PiAn0IEnLAon0JPMgScgPT4gJ9CDJywKJ9CGzIgnID0+ICfQhycsCifQmsyBJyA9PiAn0IwnLAon0JjMgCcgPT4gJ9CNJywKJ9CjzIYnID0+ICfQjicsCifQmMyGJyA9PiAn0JknLAon0LjMhicgPT4gJ9C5JywKJ9C1zIAnID0+ICfRkCcsCifQtcyIJyA9PiAn0ZEnLAon0LPMgScgPT4gJ9GTJywKJ9GWzIgnID0+ICfRlycsCifQusyBJyA9PiAn0ZwnLAon0LjMgCcgPT4gJ9GdJywKJ9GDzIYnID0+ICfRnicsCifRtMyPJyA9PiAn0bYnLAon0bXMjycgPT4gJ9G3JywKJ9CWzIYnID0+ICfTgScsCifQtsyGJyA9PiAn04InLAon0JDMhicgPT4gJ9OQJywKJ9CwzIYnID0+ICfTkScsCifQkMyIJyA9PiAn05InLAon0LDMiCcgPT4gJ9OTJywKJ9CVzIYnID0+ICfTlicsCifQtcyGJyA9PiAn05cnLAon05jMiCcgPT4gJ9OaJywKJ9OZzIgnID0+ICfTmycsCifQlsyIJyA9PiAn05wnLAon0LbMiCcgPT4gJ9OdJywKJ9CXzIgnID0+ICfTnicsCifQt8yIJyA9PiAn058nLAon0JjMhCcgPT4gJ9OiJywKJ9C4zIQnID0+ICfToycsCifQmMyIJyA9PiAn06QnLAon0LjMiCcgPT4gJ9OlJywKJ9CezIgnID0+ICfTpicsCifQvsyIJyA9PiAn06cnLAon06jMiCcgPT4gJ9OqJywKJ9OpzIgnID0+ICfTqycsCifQrcyIJyA9PiAn06wnLAon0Y3MiCcgPT4gJ9OtJywKJ9CjzIQnID0+ICfTricsCifRg8yEJyA9PiAn068nLAon0KPMiCcgPT4gJ9OwJywKJ9GDzIgnID0+ICfTsScsCifQo8yLJyA9PiAn07InLAon0YPMiycgPT4gJ9OzJywKJ9CnzIgnID0+ICfTtCcsCifRh8yIJyA9PiAn07UnLAon0KvMiCcgPT4gJ9O4JywKJ9GLzIgnID0+ICfTuScsCifYp9mTJyA9PiAn2KInLAon2KfZlCcgPT4gJ9ijJywKJ9mI2ZQnID0+ICfYpCcsCifYp9mVJyA9PiAn2KUnLAon2YrZlCcgPT4gJ9imJywKJ9uV2ZQnID0+ICfbgCcsCifbgdmUJyA9PiAn24InLAon25LZlCcgPT4gJ9uTJywKJ+CkqOCkvCcgPT4gJ+CkqScsCifgpLDgpLwnID0+ICfgpLEnLAon4KSz4KS8JyA9PiAn4KS0JywKJ+Cnh+CmvicgPT4gJ+CniycsCifgp4fgp5cnID0+ICfgp4wnLAon4K2H4K2WJyA9PiAn4K2IJywKJ+Cth+CsvicgPT4gJ+CtiycsCifgrYfgrZcnID0+ICfgrYwnLAon4K6S4K+XJyA9PiAn4K6UJywKJ+CvhuCuvicgPT4gJ+CviicsCifgr4fgrr4nID0+ICfgr4snLAon4K+G4K+XJyA9PiAn4K+MJywKJ+CxhuCxlicgPT4gJ+CxiCcsCifgsr/gs5UnID0+ICfgs4AnLAon4LOG4LOVJyA9PiAn4LOHJywKJ+CzhuCzlicgPT4gJ+CziCcsCifgs4bgs4InID0+ICfgs4onLAon4LOK4LOVJyA9PiAn4LOLJywKJ+C1huC0vicgPT4gJ+C1iicsCifgtYfgtL4nID0+ICfgtYsnLAon4LWG4LWXJyA9PiAn4LWMJywKJ+C3meC3iicgPT4gJ+C3micsCifgt5ngt48nID0+ICfgt5wnLAon4Lec4LeKJyA9PiAn4LedJywKJ+C3meC3nycgPT4gJ+C3nicsCifhgKXhgK4nID0+ICfhgKYnLAon4ayF4ay1JyA9PiAn4ayGJywKJ+Gsh+GstScgPT4gJ+GsiCcsCifhrInhrLUnID0+ICfhrIonLAon4ayL4ay1JyA9PiAn4ayMJywKJ+GsjeGstScgPT4gJ+GsjicsCifhrJHhrLUnID0+ICfhrJInLAon4ay64ay1JyA9PiAn4ay7JywKJ+GsvOGstScgPT4gJ+GsvScsCifhrL7hrLUnID0+ICfhrYAnLAon4ay/4ay1JyA9PiAn4a2BJywKJ+GtguGstScgPT4gJ+GtgycsCidBzKUnID0+ICfhuIAnLAonYcylJyA9PiAn4biBJywKJ0LMhycgPT4gJ+G4gicsCidizIcnID0+ICfhuIMnLAonQsyjJyA9PiAn4biEJywKJ2LMoycgPT4gJ+G4hScsCidCzLEnID0+ICfhuIYnLAonYsyxJyA9PiAn4biHJywKJ8OHzIEnID0+ICfhuIgnLAonw6fMgScgPT4gJ+G4iScsCidEzIcnID0+ICfhuIonLAonZMyHJyA9PiAn4biLJywKJ0TMoycgPT4gJ+G4jCcsCidkzKMnID0+ICfhuI0nLAonRMyxJyA9PiAn4biOJywKJ2TMsScgPT4gJ+G4jycsCidEzKcnID0+ICfhuJAnLAonZMynJyA9PiAn4biRJywKJ0TMrScgPT4gJ+G4kicsCidkzK0nID0+ICfhuJMnLAonxJLMgCcgPT4gJ+G4lCcsCifEk8yAJyA9PiAn4biVJywKJ8SSzIEnID0+ICfhuJYnLAonxJPMgScgPT4gJ+G4lycsCidFzK0nID0+ICfhuJgnLAonZcytJyA9PiAn4biZJywKJ0XMsCcgPT4gJ+G4micsCidlzLAnID0+ICfhuJsnLAonyKjMhicgPT4gJ+G4nCcsCifIqcyGJyA9PiAn4bidJywKJ0bMhycgPT4gJ+G4nicsCidmzIcnID0+ICfhuJ8nLAonR8yEJyA9PiAn4bigJywKJ2fMhCcgPT4gJ+G4oScsCidIzIcnID0+ICfhuKInLAonaMyHJyA9PiAn4bijJywKJ0jMoycgPT4gJ+G4pCcsCidozKMnID0+ICfhuKUnLAonSMyIJyA9PiAn4bimJywKJ2jMiCcgPT4gJ+G4pycsCidIzKcnID0+ICfhuKgnLAonaMynJyA9PiAn4bipJywKJ0jMricgPT4gJ+G4qicsCidozK4nID0+ICfhuKsnLAonScywJyA9PiAn4bisJywKJ2nMsCcgPT4gJ+G4rScsCifDj8yBJyA9PiAn4biuJywKJ8OvzIEnID0+ICfhuK8nLAonS8yBJyA9PiAn4biwJywKJ2vMgScgPT4gJ+G4sScsCidLzKMnID0+ICfhuLInLAona8yjJyA9PiAn4bizJywKJ0vMsScgPT4gJ+G4tCcsCidrzLEnID0+ICfhuLUnLAonTMyjJyA9PiAn4bi2JywKJ2zMoycgPT4gJ+G4tycsCifhuLbMhCcgPT4gJ+G4uCcsCifhuLfMhCcgPT4gJ+G4uScsCidMzLEnID0+ICfhuLonLAonbMyxJyA9PiAn4bi7JywKJ0zMrScgPT4gJ+G4vCcsCidszK0nID0+ICfhuL0nLAonTcyBJyA9PiAn4bi+JywKJ23MgScgPT4gJ+G4vycsCidNzIcnID0+ICfhuYAnLAonbcyHJyA9PiAn4bmBJywKJ03MoycgPT4gJ+G5gicsCidtzKMnID0+ICfhuYMnLAonTsyHJyA9PiAn4bmEJywKJ27MhycgPT4gJ+G5hScsCidOzKMnID0+ICfhuYYnLAonbsyjJyA9PiAn4bmHJywKJ07MsScgPT4gJ+G5iCcsCiduzLEnID0+ICfhuYknLAonTsytJyA9PiAn4bmKJywKJ27MrScgPT4gJ+G5iycsCifDlcyBJyA9PiAn4bmMJywKJ8O1zIEnID0+ICfhuY0nLAonw5XMiCcgPT4gJ+G5jicsCifDtcyIJyA9PiAn4bmPJywKJ8WMzIAnID0+ICfhuZAnLAonxY3MgCcgPT4gJ+G5kScsCifFjMyBJyA9PiAn4bmSJywKJ8WNzIEnID0+ICfhuZMnLAonUMyBJyA9PiAn4bmUJywKJ3DMgScgPT4gJ+G5lScsCidQzIcnID0+ICfhuZYnLAoncMyHJyA9PiAn4bmXJywKJ1LMhycgPT4gJ+G5mCcsCidyzIcnID0+ICfhuZknLAonUsyjJyA9PiAn4bmaJywKJ3LMoycgPT4gJ+G5mycsCifhuZrMhCcgPT4gJ+G5nCcsCifhuZvMhCcgPT4gJ+G5nScsCidSzLEnID0+ICfhuZ4nLAoncsyxJyA9PiAn4bmfJywKJ1PMhycgPT4gJ+G5oCcsCidzzIcnID0+ICfhuaEnLAonU8yjJyA9PiAn4bmiJywKJ3PMoycgPT4gJ+G5oycsCifFmsyHJyA9PiAn4bmkJywKJ8WbzIcnID0+ICfhuaUnLAonxaDMhycgPT4gJ+G5picsCifFocyHJyA9PiAn4bmnJywKJ+G5osyHJyA9PiAn4bmoJywKJ+G5o8yHJyA9PiAn4bmpJywKJ1TMhycgPT4gJ+G5qicsCid0zIcnID0+ICfhuasnLAonVMyjJyA9PiAn4bmsJywKJ3TMoycgPT4gJ+G5rScsCidUzLEnID0+ICfhua4nLAondMyxJyA9PiAn4bmvJywKJ1TMrScgPT4gJ+G5sCcsCid0zK0nID0+ICfhubEnLAonVcykJyA9PiAn4bmyJywKJ3XMpCcgPT4gJ+G5sycsCidVzLAnID0+ICfhubQnLAondcywJyA9PiAn4bm1JywKJ1XMrScgPT4gJ+G5ticsCid1zK0nID0+ICfhubcnLAonxajMgScgPT4gJ+G5uCcsCifFqcyBJyA9PiAn4bm5JywKJ8WqzIgnID0+ICfhubonLAonxavMiCcgPT4gJ+G5uycsCidWzIMnID0+ICfhubwnLAondsyDJyA9PiAn4bm9JywKJ1bMoycgPT4gJ+G5vicsCid2zKMnID0+ICfhub8nLAonV8yAJyA9PiAn4bqAJywKJ3fMgCcgPT4gJ+G6gScsCidXzIEnID0+ICfhuoInLAond8yBJyA9PiAn4bqDJywKJ1fMiCcgPT4gJ+G6hCcsCid3zIgnID0+ICfhuoUnLAonV8yHJyA9PiAn4bqGJywKJ3fMhycgPT4gJ+G6hycsCidXzKMnID0+ICfhuognLAond8yjJyA9PiAn4bqJJywKJ1jMhycgPT4gJ+G6iicsCid4zIcnID0+ICfhuosnLAonWMyIJyA9PiAn4bqMJywKJ3jMiCcgPT4gJ+G6jScsCidZzIcnID0+ICfhuo4nLAonecyHJyA9PiAn4bqPJywKJ1rMgicgPT4gJ+G6kCcsCid6zIInID0+ICfhupEnLAonWsyjJyA9PiAn4bqSJywKJ3rMoycgPT4gJ+G6kycsCidazLEnID0+ICfhupQnLAonesyxJyA9PiAn4bqVJywKJ2jMsScgPT4gJ+G6licsCid0zIgnID0+ICfhupcnLAond8yKJyA9PiAn4bqYJywKJ3nMiicgPT4gJ+G6mScsCifFv8yHJyA9PiAn4bqbJywKJ0HMoycgPT4gJ+G6oCcsCidhzKMnID0+ICfhuqEnLAonQcyJJyA9PiAn4bqiJywKJ2HMiScgPT4gJ+G6oycsCifDgsyBJyA9PiAn4bqkJywKJ8OizIEnID0+ICfhuqUnLAonw4LMgCcgPT4gJ+G6picsCifDosyAJyA9PiAn4bqnJywKJ8OCzIknID0+ICfhuqgnLAonw6LMiScgPT4gJ+G6qScsCifDgsyDJyA9PiAn4bqqJywKJ8OizIMnID0+ICfhuqsnLAon4bqgzIInID0+ICfhuqwnLAon4bqhzIInID0+ICfhuq0nLAonxILMgScgPT4gJ+G6ricsCifEg8yBJyA9PiAn4bqvJywKJ8SCzIAnID0+ICfhurAnLAonxIPMgCcgPT4gJ+G6sScsCifEgsyJJyA9PiAn4bqyJywKJ8SDzIknID0+ICfhurMnLAonxILMgycgPT4gJ+G6tCcsCifEg8yDJyA9PiAn4bq1JywKJ+G6oMyGJyA9PiAn4bq2JywKJ+G6ocyGJyA9PiAn4bq3JywKJ0XMoycgPT4gJ+G6uCcsCidlzKMnID0+ICfhurknLAonRcyJJyA9PiAn4bq6JywKJ2XMiScgPT4gJ+G6uycsCidFzIMnID0+ICfhurwnLAonZcyDJyA9PiAn4bq9JywKJ8OKzIEnID0+ICfhur4nLAonw6rMgScgPT4gJ+G6vycsCifDisyAJyA9PiAn4buAJywKJ8OqzIAnID0+ICfhu4EnLAonw4rMiScgPT4gJ+G7gicsCifDqsyJJyA9PiAn4buDJywKJ8OKzIMnID0+ICfhu4QnLAonw6rMgycgPT4gJ+G7hScsCifhurjMgicgPT4gJ+G7hicsCifhurnMgicgPT4gJ+G7hycsCidJzIknID0+ICfhu4gnLAonacyJJyA9PiAn4buJJywKJ0nMoycgPT4gJ+G7iicsCidpzKMnID0+ICfhu4snLAonT8yjJyA9PiAn4buMJywKJ2/MoycgPT4gJ+G7jScsCidPzIknID0+ICfhu44nLAonb8yJJyA9PiAn4buPJywKJ8OUzIEnID0+ICfhu5AnLAonw7TMgScgPT4gJ+G7kScsCifDlMyAJyA9PiAn4buSJywKJ8O0zIAnID0+ICfhu5MnLAonw5TMiScgPT4gJ+G7lCcsCifDtMyJJyA9PiAn4buVJywKJ8OUzIMnID0+ICfhu5YnLAonw7TMgycgPT4gJ+G7lycsCifhu4zMgicgPT4gJ+G7mCcsCifhu43MgicgPT4gJ+G7mScsCifGoMyBJyA9PiAn4buaJywKJ8ahzIEnID0+ICfhu5snLAonxqDMgCcgPT4gJ+G7nCcsCifGocyAJyA9PiAn4budJywKJ8agzIknID0+ICfhu54nLAonxqHMiScgPT4gJ+G7nycsCifGoMyDJyA9PiAn4bugJywKJ8ahzIMnID0+ICfhu6EnLAonxqDMoycgPT4gJ+G7oicsCifGocyjJyA9PiAn4bujJywKJ1XMoycgPT4gJ+G7pCcsCid1zKMnID0+ICfhu6UnLAonVcyJJyA9PiAn4bumJywKJ3XMiScgPT4gJ+G7pycsCifGr8yBJyA9PiAn4buoJywKJ8awzIEnID0+ICfhu6knLAonxq/MgCcgPT4gJ+G7qicsCifGsMyAJyA9PiAn4burJywKJ8avzIknID0+ICfhu6wnLAonxrDMiScgPT4gJ+G7rScsCifGr8yDJyA9PiAn4buuJywKJ8awzIMnID0+ICfhu68nLAonxq/MoycgPT4gJ+G7sCcsCifGsMyjJyA9PiAn4buxJywKJ1nMgCcgPT4gJ+G7sicsCid5zIAnID0+ICfhu7MnLAonWcyjJyA9PiAn4bu0JywKJ3nMoycgPT4gJ+G7tScsCidZzIknID0+ICfhu7YnLAonecyJJyA9PiAn4bu3JywKJ1nMgycgPT4gJ+G7uCcsCid5zIMnID0+ICfhu7knLAonzrHMkycgPT4gJ+G8gCcsCifOscyUJyA9PiAn4byBJywKJ+G8gMyAJyA9PiAn4byCJywKJ+G8gcyAJyA9PiAn4byDJywKJ+G8gMyBJyA9PiAn4byEJywKJ+G8gcyBJyA9PiAn4byFJywKJ+G8gM2CJyA9PiAn4byGJywKJ+G8gc2CJyA9PiAn4byHJywKJ86RzJMnID0+ICfhvIgnLAonzpHMlCcgPT4gJ+G8iScsCifhvIjMgCcgPT4gJ+G8iicsCifhvInMgCcgPT4gJ+G8iycsCifhvIjMgScgPT4gJ+G8jCcsCifhvInMgScgPT4gJ+G8jScsCifhvIjNgicgPT4gJ+G8jicsCifhvInNgicgPT4gJ+G8jycsCifOtcyTJyA9PiAn4byQJywKJ861zJQnID0+ICfhvJEnLAon4byQzIAnID0+ICfhvJInLAon4byRzIAnID0+ICfhvJMnLAon4byQzIEnID0+ICfhvJQnLAon4byRzIEnID0+ICfhvJUnLAonzpXMkycgPT4gJ+G8mCcsCifOlcyUJyA9PiAn4byZJywKJ+G8mMyAJyA9PiAn4byaJywKJ+G8mcyAJyA9PiAn4bybJywKJ+G8mMyBJyA9PiAn4bycJywKJ+G8mcyBJyA9PiAn4bydJywKJ863zJMnID0+ICfhvKAnLAonzrfMlCcgPT4gJ+G8oScsCifhvKDMgCcgPT4gJ+G8oicsCifhvKHMgCcgPT4gJ+G8oycsCifhvKDMgScgPT4gJ+G8pCcsCifhvKHMgScgPT4gJ+G8pScsCifhvKDNgicgPT4gJ+G8picsCifhvKHNgicgPT4gJ+G8pycsCifOl8yTJyA9PiAn4byoJywKJ86XzJQnID0+ICfhvKknLAon4byozIAnID0+ICfhvKonLAon4bypzIAnID0+ICfhvKsnLAon4byozIEnID0+ICfhvKwnLAon4bypzIEnID0+ICfhvK0nLAon4byozYInID0+ICfhvK4nLAon4bypzYInID0+ICfhvK8nLAonzrnMkycgPT4gJ+G8sCcsCifOucyUJyA9PiAn4byxJywKJ+G8sMyAJyA9PiAn4byyJywKJ+G8scyAJyA9PiAn4byzJywKJ+G8sMyBJyA9PiAn4by0JywKJ+G8scyBJyA9PiAn4by1JywKJ+G8sM2CJyA9PiAn4by2JywKJ+G8sc2CJyA9PiAn4by3JywKJ86ZzJMnID0+ICfhvLgnLAonzpnMlCcgPT4gJ+G8uScsCifhvLjMgCcgPT4gJ+G8uicsCifhvLnMgCcgPT4gJ+G8uycsCifhvLjMgScgPT4gJ+G8vCcsCifhvLnMgScgPT4gJ+G8vScsCifhvLjNgicgPT4gJ+G8vicsCifhvLnNgicgPT4gJ+G8vycsCifOv8yTJyA9PiAn4b2AJywKJ86/zJQnID0+ICfhvYEnLAon4b2AzIAnID0+ICfhvYInLAon4b2BzIAnID0+ICfhvYMnLAon4b2AzIEnID0+ICfhvYQnLAon4b2BzIEnID0+ICfhvYUnLAonzp/MkycgPT4gJ+G9iCcsCifOn8yUJyA9PiAn4b2JJywKJ+G9iMyAJyA9PiAn4b2KJywKJ+G9icyAJyA9PiAn4b2LJywKJ+G9iMyBJyA9PiAn4b2MJywKJ+G9icyBJyA9PiAn4b2NJywKJ8+FzJMnID0+ICfhvZAnLAonz4XMlCcgPT4gJ+G9kScsCifhvZDMgCcgPT4gJ+G9kicsCifhvZHMgCcgPT4gJ+G9kycsCifhvZDMgScgPT4gJ+G9lCcsCifhvZHMgScgPT4gJ+G9lScsCifhvZDNgicgPT4gJ+G9licsCifhvZHNgicgPT4gJ+G9lycsCifOpcyUJyA9PiAn4b2ZJywKJ+G9mcyAJyA9PiAn4b2bJywKJ+G9mcyBJyA9PiAn4b2dJywKJ+G9mc2CJyA9PiAn4b2fJywKJ8+JzJMnID0+ICfhvaAnLAonz4nMlCcgPT4gJ+G9oScsCifhvaDMgCcgPT4gJ+G9oicsCifhvaHMgCcgPT4gJ+G9oycsCifhvaDMgScgPT4gJ+G9pCcsCifhvaHMgScgPT4gJ+G9pScsCifhvaDNgicgPT4gJ+G9picsCifhvaHNgicgPT4gJ+G9pycsCifOqcyTJyA9PiAn4b2oJywKJ86pzJQnID0+ICfhvaknLAon4b2ozIAnID0+ICfhvaonLAon4b2pzIAnID0+ICfhvasnLAon4b2ozIEnID0+ICfhvawnLAon4b2pzIEnID0+ICfhva0nLAon4b2ozYInID0+ICfhva4nLAon4b2pzYInID0+ICfhva8nLAonzrHMgCcgPT4gJ+G9sCcsCifOtcyAJyA9PiAn4b2yJywKJ863zIAnID0+ICfhvbQnLAonzrnMgCcgPT4gJ+G9ticsCifOv8yAJyA9PiAn4b24JywKJ8+FzIAnID0+ICfhvbonLAonz4nMgCcgPT4gJ+G9vCcsCifhvIDNhScgPT4gJ+G+gCcsCifhvIHNhScgPT4gJ+G+gScsCifhvILNhScgPT4gJ+G+gicsCifhvIPNhScgPT4gJ+G+gycsCifhvITNhScgPT4gJ+G+hCcsCifhvIXNhScgPT4gJ+G+hScsCifhvIbNhScgPT4gJ+G+hicsCifhvIfNhScgPT4gJ+G+hycsCifhvIjNhScgPT4gJ+G+iCcsCifhvInNhScgPT4gJ+G+iScsCifhvIrNhScgPT4gJ+G+iicsCifhvIvNhScgPT4gJ+G+iycsCifhvIzNhScgPT4gJ+G+jCcsCifhvI3NhScgPT4gJ+G+jScsCifhvI7NhScgPT4gJ+G+jicsCifhvI/NhScgPT4gJ+G+jycsCifhvKDNhScgPT4gJ+G+kCcsCifhvKHNhScgPT4gJ+G+kScsCifhvKLNhScgPT4gJ+G+kicsCifhvKPNhScgPT4gJ+G+kycsCifhvKTNhScgPT4gJ+G+lCcsCifhvKXNhScgPT4gJ+G+lScsCifhvKbNhScgPT4gJ+G+licsCifhvKfNhScgPT4gJ+G+lycsCifhvKjNhScgPT4gJ+G+mCcsCifhvKnNhScgPT4gJ+G+mScsCifhvKrNhScgPT4gJ+G+micsCifhvKvNhScgPT4gJ+G+mycsCifhvKzNhScgPT4gJ+G+nCcsCifhvK3NhScgPT4gJ+G+nScsCifhvK7NhScgPT4gJ+G+nicsCifhvK/NhScgPT4gJ+G+nycsCifhvaDNhScgPT4gJ+G+oCcsCifhvaHNhScgPT4gJ+G+oScsCifhvaLNhScgPT4gJ+G+oicsCifhvaPNhScgPT4gJ+G+oycsCifhvaTNhScgPT4gJ+G+pCcsCifhvaXNhScgPT4gJ+G+pScsCifhvabNhScgPT4gJ+G+picsCifhvafNhScgPT4gJ+G+pycsCifhvajNhScgPT4gJ+G+qCcsCifhvanNhScgPT4gJ+G+qScsCifhvarNhScgPT4gJ+G+qicsCifhvavNhScgPT4gJ+G+qycsCifhvazNhScgPT4gJ+G+rCcsCifhva3NhScgPT4gJ+G+rScsCifhva7NhScgPT4gJ+G+ricsCifhva/NhScgPT4gJ+G+rycsCifOscyGJyA9PiAn4b6wJywKJ86xzIQnID0+ICfhvrEnLAon4b2wzYUnID0+ICfhvrInLAonzrHNhScgPT4gJ+G+sycsCifOrM2FJyA9PiAn4b60JywKJ86xzYInID0+ICfhvrYnLAon4b62zYUnID0+ICfhvrcnLAonzpHMhicgPT4gJ+G+uCcsCifOkcyEJyA9PiAn4b65JywKJ86RzIAnID0+ICfhvronLAonzpHNhScgPT4gJ+G+vCcsCifCqM2CJyA9PiAn4b+BJywKJ+G9tM2FJyA9PiAn4b+CJywKJ863zYUnID0+ICfhv4MnLAonzq7NhScgPT4gJ+G/hCcsCifOt82CJyA9PiAn4b+GJywKJ+G/hs2FJyA9PiAn4b+HJywKJ86VzIAnID0+ICfhv4gnLAonzpfMgCcgPT4gJ+G/iicsCifOl82FJyA9PiAn4b+MJywKJ+G+v8yAJyA9PiAn4b+NJywKJ+G+v8yBJyA9PiAn4b+OJywKJ+G+v82CJyA9PiAn4b+PJywKJ865zIYnID0+ICfhv5AnLAonzrnMhCcgPT4gJ+G/kScsCifPisyAJyA9PiAn4b+SJywKJ865zYInID0+ICfhv5YnLAonz4rNgicgPT4gJ+G/lycsCifOmcyGJyA9PiAn4b+YJywKJ86ZzIQnID0+ICfhv5knLAonzpnMgCcgPT4gJ+G/micsCifhv77MgCcgPT4gJ+G/nScsCifhv77MgScgPT4gJ+G/nicsCifhv77NgicgPT4gJ+G/nycsCifPhcyGJyA9PiAn4b+gJywKJ8+FzIQnID0+ICfhv6EnLAonz4vMgCcgPT4gJ+G/oicsCifPgcyTJyA9PiAn4b+kJywKJ8+BzJQnID0+ICfhv6UnLAonz4XNgicgPT4gJ+G/picsCifPi82CJyA9PiAn4b+nJywKJ86lzIYnID0+ICfhv6gnLAonzqXMhCcgPT4gJ+G/qScsCifOpcyAJyA9PiAn4b+qJywKJ86hzJQnID0+ICfhv6wnLAonwqjMgCcgPT4gJ+G/rScsCifhvbzNhScgPT4gJ+G/sicsCifPic2FJyA9PiAn4b+zJywKJ8+OzYUnID0+ICfhv7QnLAonz4nNgicgPT4gJ+G/ticsCifhv7bNhScgPT4gJ+G/tycsCifOn8yAJyA9PiAn4b+4JywKJ86pzIAnID0+ICfhv7onLAonzqnNhScgPT4gJ+G/vCcsCifihpDMuCcgPT4gJ+KGmicsCifihpLMuCcgPT4gJ+KGmycsCifihpTMuCcgPT4gJ+KGricsCifih5DMuCcgPT4gJ+KHjScsCifih5TMuCcgPT4gJ+KHjicsCifih5LMuCcgPT4gJ+KHjycsCifiiIPMuCcgPT4gJ+KIhCcsCifiiIjMuCcgPT4gJ+KIiScsCifiiIvMuCcgPT4gJ+KIjCcsCifiiKPMuCcgPT4gJ+KIpCcsCifiiKXMuCcgPT4gJ+KIpicsCifiiLzMuCcgPT4gJ+KJgScsCifiiYPMuCcgPT4gJ+KJhCcsCifiiYXMuCcgPT4gJ+KJhycsCifiiYjMuCcgPT4gJ+KJiScsCic9zLgnID0+ICfiiaAnLAon4omhzLgnID0+ICfiiaInLAon4omNzLgnID0+ICfiia0nLAonPMy4JyA9PiAn4omuJywKJz7MuCcgPT4gJ+KJrycsCifiiaTMuCcgPT4gJ+KJsCcsCifiiaXMuCcgPT4gJ+KJsScsCifiibLMuCcgPT4gJ+KJtCcsCifiibPMuCcgPT4gJ+KJtScsCifiibbMuCcgPT4gJ+KJuCcsCifiibfMuCcgPT4gJ+KJuScsCifiibrMuCcgPT4gJ+KKgCcsCifiibvMuCcgPT4gJ+KKgScsCifiioLMuCcgPT4gJ+KKhCcsCifiioPMuCcgPT4gJ+KKhScsCifiiobMuCcgPT4gJ+KKiCcsCifiiofMuCcgPT4gJ+KKiScsCifiiqLMuCcgPT4gJ+KKrCcsCifiiqjMuCcgPT4gJ+KKrScsCifiiqnMuCcgPT4gJ+KKricsCifiiqvMuCcgPT4gJ+KKrycsCifiibzMuCcgPT4gJ+KLoCcsCifiib3MuCcgPT4gJ+KLoScsCifiipHMuCcgPT4gJ+KLoicsCifiipLMuCcgPT4gJ+KLoycsCifiirLMuCcgPT4gJ+KLqicsCifiirPMuCcgPT4gJ+KLqycsCifiirTMuCcgPT4gJ+KLrCcsCifiirXMuCcgPT4gJ+KLrScsCifjgYvjgpknID0+ICfjgYwnLAon44GN44KZJyA9PiAn44GOJywKJ+OBj+OCmScgPT4gJ+OBkCcsCifjgZHjgpknID0+ICfjgZInLAon44GT44KZJyA9PiAn44GUJywKJ+OBleOCmScgPT4gJ+OBlicsCifjgZfjgpknID0+ICfjgZgnLAon44GZ44KZJyA9PiAn44GaJywKJ+OBm+OCmScgPT4gJ+OBnCcsCifjgZ3jgpknID0+ICfjgZ4nLAon44Gf44KZJyA9PiAn44GgJywKJ+OBoeOCmScgPT4gJ+OBoicsCifjgaTjgpknID0+ICfjgaUnLAon44Gm44KZJyA9PiAn44GnJywKJ+OBqOOCmScgPT4gJ+OBqScsCifjga/jgpknID0+ICfjgbAnLAon44Gv44KaJyA9PiAn44GxJywKJ+OBsuOCmScgPT4gJ+OBsycsCifjgbLjgponID0+ICfjgbQnLAon44G144KZJyA9PiAn44G2JywKJ+OBteOCmicgPT4gJ+OBtycsCifjgbjjgpknID0+ICfjgbknLAon44G444KaJyA9PiAn44G6JywKJ+OBu+OCmScgPT4gJ+OBvCcsCifjgbvjgponID0+ICfjgb0nLAon44GG44KZJyA9PiAn44KUJywKJ+OCneOCmScgPT4gJ+OCnicsCifjgqvjgpknID0+ICfjgqwnLAon44Kt44KZJyA9PiAn44KuJywKJ+OCr+OCmScgPT4gJ+OCsCcsCifjgrHjgpknID0+ICfjgrInLAon44Kz44KZJyA9PiAn44K0JywKJ+OCteOCmScgPT4gJ+OCticsCifjgrfjgpknID0+ICfjgrgnLAon44K544KZJyA9PiAn44K6JywKJ+OCu+OCmScgPT4gJ+OCvCcsCifjgr3jgpknID0+ICfjgr4nLAon44K/44KZJyA9PiAn44OAJywKJ+ODgeOCmScgPT4gJ+ODgicsCifjg4TjgpknID0+ICfjg4UnLAon44OG44KZJyA9PiAn44OHJywKJ+ODiOOCmScgPT4gJ+ODiScsCifjg4/jgpknID0+ICfjg5AnLAon44OP44KaJyA9PiAn44ORJywKJ+ODkuOCmScgPT4gJ+ODkycsCifjg5LjgponID0+ICfjg5QnLAon44OV44KZJyA9PiAn44OWJywKJ+ODleOCmicgPT4gJ+ODlycsCifjg5jjgpknID0+ICfjg5knLAon44OY44KaJyA9PiAn44OaJywKJ+ODm+OCmScgPT4gJ+ODnCcsCifjg5vjgponID0+ICfjg50nLAon44Km44KZJyA9PiAn44O0JywKJ+ODr+OCmScgPT4gJ+ODtycsCifjg7DjgpknID0+ICfjg7gnLAon44Ox44KZJyA9PiAn44O5JywKJ+ODsuOCmScgPT4gJ+ODuicsCifjg73jgpknID0+ICfjg74nLAon8JGCmfCRgronID0+ICfwkYKaJywKJ/CRgpvwkYK6JyA9PiAn8JGCnCcsCifwkYKl8JGCuicgPT4gJ/CRgqsnLAon8JGEsfCRhKcnID0+ICfwkYSuJywKJ/CRhLLwkYSnJyA9PiAn8JGErycsCifwkY2H8JGMvicgPT4gJ/CRjYsnLAon8JGNh/CRjZcnID0+ICfwkY2MJywKJ/CRkrnwkZK6JyA9PiAn8JGSuycsCifwkZK58JGSsCcgPT4gJ/CRkrwnLAon8JGSufCRkr0nID0+ICfwkZK+JywKJ/CRlrjwkZavJyA9PiAn8JGWuicsCifwkZa58JGWrycgPT4gJ/CRlrsnLAon8JGktfCRpLAnID0+ICfwkaS4JywKKTsKPD9waHAKCnJldHVybiBhcnJheSAoCifDgCcgPT4gJ0HMgCcsCifDgScgPT4gJ0HMgScsCifDgicgPT4gJ0HMgicsCifDgycgPT4gJ0HMgycsCifDhCcgPT4gJ0HMiCcsCifDhScgPT4gJ0HMiicsCifDhycgPT4gJ0PMpycsCifDiCcgPT4gJ0XMgCcsCifDiScgPT4gJ0XMgScsCifDiicgPT4gJ0XMgicsCifDiycgPT4gJ0XMiCcsCifDjCcgPT4gJ0nMgCcsCifDjScgPT4gJ0nMgScsCifDjicgPT4gJ0nMgicsCifDjycgPT4gJ0nMiCcsCifDkScgPT4gJ07MgycsCifDkicgPT4gJ0/MgCcsCifDkycgPT4gJ0/MgScsCifDlCcgPT4gJ0/MgicsCifDlScgPT4gJ0/MgycsCifDlicgPT4gJ0/MiCcsCifDmScgPT4gJ1XMgCcsCifDmicgPT4gJ1XMgScsCifDmycgPT4gJ1XMgicsCifDnCcgPT4gJ1XMiCcsCifDnScgPT4gJ1nMgScsCifDoCcgPT4gJ2HMgCcsCifDoScgPT4gJ2HMgScsCifDoicgPT4gJ2HMgicsCifDoycgPT4gJ2HMgycsCifDpCcgPT4gJ2HMiCcsCifDpScgPT4gJ2HMiicsCifDpycgPT4gJ2PMpycsCifDqCcgPT4gJ2XMgCcsCifDqScgPT4gJ2XMgScsCifDqicgPT4gJ2XMgicsCifDqycgPT4gJ2XMiCcsCifDrCcgPT4gJ2nMgCcsCifDrScgPT4gJ2nMgScsCifDricgPT4gJ2nMgicsCifDrycgPT4gJ2nMiCcsCifDsScgPT4gJ27MgycsCifDsicgPT4gJ2/MgCcsCifDsycgPT4gJ2/MgScsCifDtCcgPT4gJ2/MgicsCifDtScgPT4gJ2/MgycsCifDticgPT4gJ2/MiCcsCifDuScgPT4gJ3XMgCcsCifDuicgPT4gJ3XMgScsCifDuycgPT4gJ3XMgicsCifDvCcgPT4gJ3XMiCcsCifDvScgPT4gJ3nMgScsCifDvycgPT4gJ3nMiCcsCifEgCcgPT4gJ0HMhCcsCifEgScgPT4gJ2HMhCcsCifEgicgPT4gJ0HMhicsCifEgycgPT4gJ2HMhicsCifEhCcgPT4gJ0HMqCcsCifEhScgPT4gJ2HMqCcsCifEhicgPT4gJ0PMgScsCifEhycgPT4gJ2PMgScsCifEiCcgPT4gJ0PMgicsCifEiScgPT4gJ2PMgicsCifEiicgPT4gJ0PMhycsCifEiycgPT4gJ2PMhycsCifEjCcgPT4gJ0PMjCcsCifEjScgPT4gJ2PMjCcsCifEjicgPT4gJ0TMjCcsCifEjycgPT4gJ2TMjCcsCifEkicgPT4gJ0XMhCcsCifEkycgPT4gJ2XMhCcsCifElCcgPT4gJ0XMhicsCifElScgPT4gJ2XMhicsCifElicgPT4gJ0XMhycsCifElycgPT4gJ2XMhycsCifEmCcgPT4gJ0XMqCcsCifEmScgPT4gJ2XMqCcsCifEmicgPT4gJ0XMjCcsCifEmycgPT4gJ2XMjCcsCifEnCcgPT4gJ0fMgicsCifEnScgPT4gJ2fMgicsCifEnicgPT4gJ0fMhicsCifEnycgPT4gJ2fMhicsCifEoCcgPT4gJ0fMhycsCifEoScgPT4gJ2fMhycsCifEoicgPT4gJ0fMpycsCifEoycgPT4gJ2fMpycsCifEpCcgPT4gJ0jMgicsCifEpScgPT4gJ2jMgicsCifEqCcgPT4gJ0nMgycsCifEqScgPT4gJ2nMgycsCifEqicgPT4gJ0nMhCcsCifEqycgPT4gJ2nMhCcsCifErCcgPT4gJ0nMhicsCifErScgPT4gJ2nMhicsCifEricgPT4gJ0nMqCcsCifErycgPT4gJ2nMqCcsCifEsCcgPT4gJ0nMhycsCifEtCcgPT4gJ0rMgicsCifEtScgPT4gJ2rMgicsCifEticgPT4gJ0vMpycsCifEtycgPT4gJ2vMpycsCifEuScgPT4gJ0zMgScsCifEuicgPT4gJ2zMgScsCifEuycgPT4gJ0zMpycsCifEvCcgPT4gJ2zMpycsCifEvScgPT4gJ0zMjCcsCifEvicgPT4gJ2zMjCcsCifFgycgPT4gJ07MgScsCifFhCcgPT4gJ27MgScsCifFhScgPT4gJ07MpycsCifFhicgPT4gJ27MpycsCifFhycgPT4gJ07MjCcsCifFiCcgPT4gJ27MjCcsCifFjCcgPT4gJ0/MhCcsCifFjScgPT4gJ2/MhCcsCifFjicgPT4gJ0/MhicsCifFjycgPT4gJ2/MhicsCifFkCcgPT4gJ0/MiycsCifFkScgPT4gJ2/MiycsCifFlCcgPT4gJ1LMgScsCifFlScgPT4gJ3LMgScsCifFlicgPT4gJ1LMpycsCifFlycgPT4gJ3LMpycsCifFmCcgPT4gJ1LMjCcsCifFmScgPT4gJ3LMjCcsCifFmicgPT4gJ1PMgScsCifFmycgPT4gJ3PMgScsCifFnCcgPT4gJ1PMgicsCifFnScgPT4gJ3PMgicsCifFnicgPT4gJ1PMpycsCifFnycgPT4gJ3PMpycsCifFoCcgPT4gJ1PMjCcsCifFoScgPT4gJ3PMjCcsCifFoicgPT4gJ1TMpycsCifFoycgPT4gJ3TMpycsCifFpCcgPT4gJ1TMjCcsCifFpScgPT4gJ3TMjCcsCifFqCcgPT4gJ1XMgycsCifFqScgPT4gJ3XMgycsCifFqicgPT4gJ1XMhCcsCifFqycgPT4gJ3XMhCcsCifFrCcgPT4gJ1XMhicsCifFrScgPT4gJ3XMhicsCifFricgPT4gJ1XMiicsCifFrycgPT4gJ3XMiicsCifFsCcgPT4gJ1XMiycsCifFsScgPT4gJ3XMiycsCifFsicgPT4gJ1XMqCcsCifFsycgPT4gJ3XMqCcsCifFtCcgPT4gJ1fMgicsCifFtScgPT4gJ3fMgicsCifFticgPT4gJ1nMgicsCifFtycgPT4gJ3nMgicsCifFuCcgPT4gJ1nMiCcsCifFuScgPT4gJ1rMgScsCifFuicgPT4gJ3rMgScsCifFuycgPT4gJ1rMhycsCifFvCcgPT4gJ3rMhycsCifFvScgPT4gJ1rMjCcsCifFvicgPT4gJ3rMjCcsCifGoCcgPT4gJ0/MmycsCifGoScgPT4gJ2/MmycsCifGrycgPT4gJ1XMmycsCifGsCcgPT4gJ3XMmycsCifHjScgPT4gJ0HMjCcsCifHjicgPT4gJ2HMjCcsCifHjycgPT4gJ0nMjCcsCifHkCcgPT4gJ2nMjCcsCifHkScgPT4gJ0/MjCcsCifHkicgPT4gJ2/MjCcsCifHkycgPT4gJ1XMjCcsCifHlCcgPT4gJ3XMjCcsCifHlScgPT4gJ1XMiMyEJywKJ8eWJyA9PiAndcyIzIQnLAonx5cnID0+ICdVzIjMgScsCifHmCcgPT4gJ3XMiMyBJywKJ8eZJyA9PiAnVcyIzIwnLAonx5onID0+ICd1zIjMjCcsCifHmycgPT4gJ1XMiMyAJywKJ8ecJyA9PiAndcyIzIAnLAonx54nID0+ICdBzIjMhCcsCifHnycgPT4gJ2HMiMyEJywKJ8egJyA9PiAnQcyHzIQnLAonx6EnID0+ICdhzIfMhCcsCifHoicgPT4gJ8OGzIQnLAonx6MnID0+ICfDpsyEJywKJ8emJyA9PiAnR8yMJywKJ8enJyA9PiAnZ8yMJywKJ8eoJyA9PiAnS8yMJywKJ8epJyA9PiAna8yMJywKJ8eqJyA9PiAnT8yoJywKJ8erJyA9PiAnb8yoJywKJ8esJyA9PiAnT8yozIQnLAonx60nID0+ICdvzKjMhCcsCifHricgPT4gJ8a3zIwnLAonx68nID0+ICfKksyMJywKJ8ewJyA9PiAnasyMJywKJ8e0JyA9PiAnR8yBJywKJ8e1JyA9PiAnZ8yBJywKJ8e4JyA9PiAnTsyAJywKJ8e5JyA9PiAnbsyAJywKJ8e6JyA9PiAnQcyKzIEnLAonx7snID0+ICdhzIrMgScsCifHvCcgPT4gJ8OGzIEnLAonx70nID0+ICfDpsyBJywKJ8e+JyA9PiAnw5jMgScsCifHvycgPT4gJ8O4zIEnLAonyIAnID0+ICdBzI8nLAonyIEnID0+ICdhzI8nLAonyIInID0+ICdBzJEnLAonyIMnID0+ICdhzJEnLAonyIQnID0+ICdFzI8nLAonyIUnID0+ICdlzI8nLAonyIYnID0+ICdFzJEnLAonyIcnID0+ICdlzJEnLAonyIgnID0+ICdJzI8nLAonyIknID0+ICdpzI8nLAonyIonID0+ICdJzJEnLAonyIsnID0+ICdpzJEnLAonyIwnID0+ICdPzI8nLAonyI0nID0+ICdvzI8nLAonyI4nID0+ICdPzJEnLAonyI8nID0+ICdvzJEnLAonyJAnID0+ICdSzI8nLAonyJEnID0+ICdyzI8nLAonyJInID0+ICdSzJEnLAonyJMnID0+ICdyzJEnLAonyJQnID0+ICdVzI8nLAonyJUnID0+ICd1zI8nLAonyJYnID0+ICdVzJEnLAonyJcnID0+ICd1zJEnLAonyJgnID0+ICdTzKYnLAonyJknID0+ICdzzKYnLAonyJonID0+ICdUzKYnLAonyJsnID0+ICd0zKYnLAonyJ4nID0+ICdIzIwnLAonyJ8nID0+ICdozIwnLAonyKYnID0+ICdBzIcnLAonyKcnID0+ICdhzIcnLAonyKgnID0+ICdFzKcnLAonyKknID0+ICdlzKcnLAonyKonID0+ICdPzIjMhCcsCifIqycgPT4gJ2/MiMyEJywKJ8isJyA9PiAnT8yDzIQnLAonyK0nID0+ICdvzIPMhCcsCifIricgPT4gJ0/MhycsCifIrycgPT4gJ2/MhycsCifIsCcgPT4gJ0/Mh8yEJywKJ8ixJyA9PiAnb8yHzIQnLAonyLInID0+ICdZzIQnLAonyLMnID0+ICd5zIQnLAonzYAnID0+ICfMgCcsCifNgScgPT4gJ8yBJywKJ82DJyA9PiAnzJMnLAonzYQnID0+ICfMiMyBJywKJ820JyA9PiAnyrknLAonzb4nID0+ICc7JywKJ86FJyA9PiAnwqjMgScsCifOhicgPT4gJ86RzIEnLAonzocnID0+ICfCtycsCifOiCcgPT4gJ86VzIEnLAonzoknID0+ICfOl8yBJywKJ86KJyA9PiAnzpnMgScsCifOjCcgPT4gJ86fzIEnLAonzo4nID0+ICfOpcyBJywKJ86PJyA9PiAnzqnMgScsCifOkCcgPT4gJ865zIjMgScsCifOqicgPT4gJ86ZzIgnLAonzqsnID0+ICfOpcyIJywKJ86sJyA9PiAnzrHMgScsCifOrScgPT4gJ861zIEnLAonzq4nID0+ICfOt8yBJywKJ86vJyA9PiAnzrnMgScsCifOsCcgPT4gJ8+FzIjMgScsCifPiicgPT4gJ865zIgnLAonz4snID0+ICfPhcyIJywKJ8+MJyA9PiAnzr/MgScsCifPjScgPT4gJ8+FzIEnLAonz44nID0+ICfPicyBJywKJ8+TJyA9PiAnz5LMgScsCifPlCcgPT4gJ8+SzIgnLAon0IAnID0+ICfQlcyAJywKJ9CBJyA9PiAn0JXMiCcsCifQgycgPT4gJ9CTzIEnLAon0IcnID0+ICfQhsyIJywKJ9CMJyA9PiAn0JrMgScsCifQjScgPT4gJ9CYzIAnLAon0I4nID0+ICfQo8yGJywKJ9CZJyA9PiAn0JjMhicsCifQuScgPT4gJ9C4zIYnLAon0ZAnID0+ICfQtcyAJywKJ9GRJyA9PiAn0LXMiCcsCifRkycgPT4gJ9CzzIEnLAon0ZcnID0+ICfRlsyIJywKJ9GcJyA9PiAn0LrMgScsCifRnScgPT4gJ9C4zIAnLAon0Z4nID0+ICfRg8yGJywKJ9G2JyA9PiAn0bTMjycsCifRtycgPT4gJ9G1zI8nLAon04EnID0+ICfQlsyGJywKJ9OCJyA9PiAn0LbMhicsCifTkCcgPT4gJ9CQzIYnLAon05EnID0+ICfQsMyGJywKJ9OSJyA9PiAn0JDMiCcsCifTkycgPT4gJ9CwzIgnLAon05YnID0+ICfQlcyGJywKJ9OXJyA9PiAn0LXMhicsCifTmicgPT4gJ9OYzIgnLAon05snID0+ICfTmcyIJywKJ9OcJyA9PiAn0JbMiCcsCifTnScgPT4gJ9C2zIgnLAon054nID0+ICfQl8yIJywKJ9OfJyA9PiAn0LfMiCcsCifToicgPT4gJ9CYzIQnLAon06MnID0+ICfQuMyEJywKJ9OkJyA9PiAn0JjMiCcsCifTpScgPT4gJ9C4zIgnLAon06YnID0+ICfQnsyIJywKJ9OnJyA9PiAn0L7MiCcsCifTqicgPT4gJ9OozIgnLAon06snID0+ICfTqcyIJywKJ9OsJyA9PiAn0K3MiCcsCifTrScgPT4gJ9GNzIgnLAon064nID0+ICfQo8yEJywKJ9OvJyA9PiAn0YPMhCcsCifTsCcgPT4gJ9CjzIgnLAon07EnID0+ICfRg8yIJywKJ9OyJyA9PiAn0KPMiycsCifTsycgPT4gJ9GDzIsnLAon07QnID0+ICfQp8yIJywKJ9O1JyA9PiAn0YfMiCcsCifTuCcgPT4gJ9CrzIgnLAon07knID0+ICfRi8yIJywKJ9iiJyA9PiAn2KfZkycsCifYoycgPT4gJ9in2ZQnLAon2KQnID0+ICfZiNmUJywKJ9ilJyA9PiAn2KfZlScsCifYpicgPT4gJ9mK2ZQnLAon24AnID0+ICfbldmUJywKJ9uCJyA9PiAn24HZlCcsCifbkycgPT4gJ9uS2ZQnLAon4KSpJyA9PiAn4KSo4KS8JywKJ+CksScgPT4gJ+CksOCkvCcsCifgpLQnID0+ICfgpLPgpLwnLAon4KWYJyA9PiAn4KSV4KS8JywKJ+ClmScgPT4gJ+CkluCkvCcsCifgpZonID0+ICfgpJfgpLwnLAon4KWbJyA9PiAn4KSc4KS8JywKJ+ClnCcgPT4gJ+CkoeCkvCcsCifgpZ0nID0+ICfgpKLgpLwnLAon4KWeJyA9PiAn4KSr4KS8JywKJ+ClnycgPT4gJ+Ckr+CkvCcsCifgp4snID0+ICfgp4fgpr4nLAon4KeMJyA9PiAn4KeH4KeXJywKJ+CnnCcgPT4gJ+CmoeCmvCcsCifgp50nID0+ICfgpqLgprwnLAon4KefJyA9PiAn4Kav4Ka8JywKJ+CosycgPT4gJ+CosuCovCcsCifgqLYnID0+ICfgqLjgqLwnLAon4KmZJyA9PiAn4KiW4Ki8JywKJ+CpmicgPT4gJ+Col+CovCcsCifgqZsnID0+ICfgqJzgqLwnLAon4KmeJyA9PiAn4Kir4Ki8JywKJ+CtiCcgPT4gJ+Cth+CtlicsCifgrYsnID0+ICfgrYfgrL4nLAon4K2MJyA9PiAn4K2H4K2XJywKJ+CtnCcgPT4gJ+CsoeCsvCcsCifgrZ0nID0+ICfgrKLgrLwnLAon4K6UJyA9PiAn4K6S4K+XJywKJ+CviicgPT4gJ+CvhuCuvicsCifgr4snID0+ICfgr4fgrr4nLAon4K+MJyA9PiAn4K+G4K+XJywKJ+CxiCcgPT4gJ+CxhuCxlicsCifgs4AnID0+ICfgsr/gs5UnLAon4LOHJyA9PiAn4LOG4LOVJywKJ+CziCcgPT4gJ+CzhuCzlicsCifgs4onID0+ICfgs4bgs4InLAon4LOLJyA9PiAn4LOG4LOC4LOVJywKJ+C1iicgPT4gJ+C1huC0vicsCifgtYsnID0+ICfgtYfgtL4nLAon4LWMJyA9PiAn4LWG4LWXJywKJ+C3micgPT4gJ+C3meC3iicsCifgt5wnID0+ICfgt5ngt48nLAon4LedJyA9PiAn4LeZ4LeP4LeKJywKJ+C3nicgPT4gJ+C3meC3nycsCifgvYMnID0+ICfgvYLgvrcnLAon4L2NJyA9PiAn4L2M4L63JywKJ+C9kicgPT4gJ+C9keC+tycsCifgvZcnID0+ICfgvZbgvrcnLAon4L2cJyA9PiAn4L2b4L63JywKJ+C9qScgPT4gJ+C9gOC+tScsCifgvbMnID0+ICfgvbHgvbInLAon4L21JyA9PiAn4L2x4L20JywKJ+C9ticgPT4gJ+C+suC+gCcsCifgvbgnID0+ICfgvrPgvoAnLAon4L6BJyA9PiAn4L2x4L6AJywKJ+C+kycgPT4gJ+C+kuC+tycsCifgvp0nID0+ICfgvpzgvrcnLAon4L6iJyA9PiAn4L6h4L63JywKJ+C+pycgPT4gJ+C+puC+tycsCifgvqwnID0+ICfgvqvgvrcnLAon4L65JyA9PiAn4L6Q4L61JywKJ+GApicgPT4gJ+GApeGAricsCifhrIYnID0+ICfhrIXhrLUnLAon4ayIJyA9PiAn4ayH4ay1JywKJ+GsiicgPT4gJ+GsieGstScsCifhrIwnID0+ICfhrIvhrLUnLAon4ayOJyA9PiAn4ayN4ay1JywKJ+GskicgPT4gJ+GskeGstScsCifhrLsnID0+ICfhrLrhrLUnLAon4ay9JyA9PiAn4ay84ay1JywKJ+GtgCcgPT4gJ+GsvuGstScsCifhrYEnID0+ICfhrL/hrLUnLAon4a2DJyA9PiAn4a2C4ay1JywKJ+G4gCcgPT4gJ0HMpScsCifhuIEnID0+ICdhzKUnLAon4biCJyA9PiAnQsyHJywKJ+G4gycgPT4gJ2LMhycsCifhuIQnID0+ICdCzKMnLAon4biFJyA9PiAnYsyjJywKJ+G4hicgPT4gJ0LMsScsCifhuIcnID0+ICdizLEnLAon4biIJyA9PiAnQ8ynzIEnLAon4biJJyA9PiAnY8ynzIEnLAon4biKJyA9PiAnRMyHJywKJ+G4iycgPT4gJ2TMhycsCifhuIwnID0+ICdEzKMnLAon4biNJyA9PiAnZMyjJywKJ+G4jicgPT4gJ0TMsScsCifhuI8nID0+ICdkzLEnLAon4biQJyA9PiAnRMynJywKJ+G4kScgPT4gJ2TMpycsCifhuJInID0+ICdEzK0nLAon4biTJyA9PiAnZMytJywKJ+G4lCcgPT4gJ0XMhMyAJywKJ+G4lScgPT4gJ2XMhMyAJywKJ+G4licgPT4gJ0XMhMyBJywKJ+G4lycgPT4gJ2XMhMyBJywKJ+G4mCcgPT4gJ0XMrScsCifhuJknID0+ICdlzK0nLAon4biaJyA9PiAnRcywJywKJ+G4mycgPT4gJ2XMsCcsCifhuJwnID0+ICdFzKfMhicsCifhuJ0nID0+ICdlzKfMhicsCifhuJ4nID0+ICdGzIcnLAon4bifJyA9PiAnZsyHJywKJ+G4oCcgPT4gJ0fMhCcsCifhuKEnID0+ICdnzIQnLAon4biiJyA9PiAnSMyHJywKJ+G4oycgPT4gJ2jMhycsCifhuKQnID0+ICdIzKMnLAon4bilJyA9PiAnaMyjJywKJ+G4picgPT4gJ0jMiCcsCifhuKcnID0+ICdozIgnLAon4bioJyA9PiAnSMynJywKJ+G4qScgPT4gJ2jMpycsCifhuKonID0+ICdIzK4nLAon4birJyA9PiAnaMyuJywKJ+G4rCcgPT4gJ0nMsCcsCifhuK0nID0+ICdpzLAnLAon4biuJyA9PiAnScyIzIEnLAon4bivJyA9PiAnacyIzIEnLAon4biwJyA9PiAnS8yBJywKJ+G4sScgPT4gJ2vMgScsCifhuLInID0+ICdLzKMnLAon4bizJyA9PiAna8yjJywKJ+G4tCcgPT4gJ0vMsScsCifhuLUnID0+ICdrzLEnLAon4bi2JyA9PiAnTMyjJywKJ+G4tycgPT4gJ2zMoycsCifhuLgnID0+ICdMzKPMhCcsCifhuLknID0+ICdszKPMhCcsCifhuLonID0+ICdMzLEnLAon4bi7JyA9PiAnbMyxJywKJ+G4vCcgPT4gJ0zMrScsCifhuL0nID0+ICdszK0nLAon4bi+JyA9PiAnTcyBJywKJ+G4vycgPT4gJ23MgScsCifhuYAnID0+ICdNzIcnLAon4bmBJyA9PiAnbcyHJywKJ+G5gicgPT4gJ03MoycsCifhuYMnID0+ICdtzKMnLAon4bmEJyA9PiAnTsyHJywKJ+G5hScgPT4gJ27MhycsCifhuYYnID0+ICdOzKMnLAon4bmHJyA9PiAnbsyjJywKJ+G5iCcgPT4gJ07MsScsCifhuYknID0+ICduzLEnLAon4bmKJyA9PiAnTsytJywKJ+G5iycgPT4gJ27MrScsCifhuYwnID0+ICdPzIPMgScsCifhuY0nID0+ICdvzIPMgScsCifhuY4nID0+ICdPzIPMiCcsCifhuY8nID0+ICdvzIPMiCcsCifhuZAnID0+ICdPzITMgCcsCifhuZEnID0+ICdvzITMgCcsCifhuZInID0+ICdPzITMgScsCifhuZMnID0+ICdvzITMgScsCifhuZQnID0+ICdQzIEnLAon4bmVJyA9PiAncMyBJywKJ+G5licgPT4gJ1DMhycsCifhuZcnID0+ICdwzIcnLAon4bmYJyA9PiAnUsyHJywKJ+G5mScgPT4gJ3LMhycsCifhuZonID0+ICdSzKMnLAon4bmbJyA9PiAncsyjJywKJ+G5nCcgPT4gJ1LMo8yEJywKJ+G5nScgPT4gJ3LMo8yEJywKJ+G5nicgPT4gJ1LMsScsCifhuZ8nID0+ICdyzLEnLAon4bmgJyA9PiAnU8yHJywKJ+G5oScgPT4gJ3PMhycsCifhuaInID0+ICdTzKMnLAon4bmjJyA9PiAnc8yjJywKJ+G5pCcgPT4gJ1PMgcyHJywKJ+G5pScgPT4gJ3PMgcyHJywKJ+G5picgPT4gJ1PMjMyHJywKJ+G5pycgPT4gJ3PMjMyHJywKJ+G5qCcgPT4gJ1PMo8yHJywKJ+G5qScgPT4gJ3PMo8yHJywKJ+G5qicgPT4gJ1TMhycsCifhuasnID0+ICd0zIcnLAon4bmsJyA9PiAnVMyjJywKJ+G5rScgPT4gJ3TMoycsCifhua4nID0+ICdUzLEnLAon4bmvJyA9PiAndMyxJywKJ+G5sCcgPT4gJ1TMrScsCifhubEnID0+ICd0zK0nLAon4bmyJyA9PiAnVcykJywKJ+G5sycgPT4gJ3XMpCcsCifhubQnID0+ICdVzLAnLAon4bm1JyA9PiAndcywJywKJ+G5ticgPT4gJ1XMrScsCifhubcnID0+ICd1zK0nLAon4bm4JyA9PiAnVcyDzIEnLAon4bm5JyA9PiAndcyDzIEnLAon4bm6JyA9PiAnVcyEzIgnLAon4bm7JyA9PiAndcyEzIgnLAon4bm8JyA9PiAnVsyDJywKJ+G5vScgPT4gJ3bMgycsCifhub4nID0+ICdWzKMnLAon4bm/JyA9PiAndsyjJywKJ+G6gCcgPT4gJ1fMgCcsCifhuoEnID0+ICd3zIAnLAon4bqCJyA9PiAnV8yBJywKJ+G6gycgPT4gJ3fMgScsCifhuoQnID0+ICdXzIgnLAon4bqFJyA9PiAnd8yIJywKJ+G6hicgPT4gJ1fMhycsCifhuocnID0+ICd3zIcnLAon4bqIJyA9PiAnV8yjJywKJ+G6iScgPT4gJ3fMoycsCifhuoonID0+ICdYzIcnLAon4bqLJyA9PiAneMyHJywKJ+G6jCcgPT4gJ1jMiCcsCifhuo0nID0+ICd4zIgnLAon4bqOJyA9PiAnWcyHJywKJ+G6jycgPT4gJ3nMhycsCifhupAnID0+ICdazIInLAon4bqRJyA9PiAnesyCJywKJ+G6kicgPT4gJ1rMoycsCifhupMnID0+ICd6zKMnLAon4bqUJyA9PiAnWsyxJywKJ+G6lScgPT4gJ3rMsScsCifhupYnID0+ICdozLEnLAon4bqXJyA9PiAndMyIJywKJ+G6mCcgPT4gJ3fMiicsCifhupknID0+ICd5zIonLAon4bqbJyA9PiAnxb/MhycsCifhuqAnID0+ICdBzKMnLAon4bqhJyA9PiAnYcyjJywKJ+G6oicgPT4gJ0HMiScsCifhuqMnID0+ICdhzIknLAon4bqkJyA9PiAnQcyCzIEnLAon4bqlJyA9PiAnYcyCzIEnLAon4bqmJyA9PiAnQcyCzIAnLAon4bqnJyA9PiAnYcyCzIAnLAon4bqoJyA9PiAnQcyCzIknLAon4bqpJyA9PiAnYcyCzIknLAon4bqqJyA9PiAnQcyCzIMnLAon4bqrJyA9PiAnYcyCzIMnLAon4bqsJyA9PiAnQcyjzIInLAon4bqtJyA9PiAnYcyjzIInLAon4bquJyA9PiAnQcyGzIEnLAon4bqvJyA9PiAnYcyGzIEnLAon4bqwJyA9PiAnQcyGzIAnLAon4bqxJyA9PiAnYcyGzIAnLAon4bqyJyA9PiAnQcyGzIknLAon4bqzJyA9PiAnYcyGzIknLAon4bq0JyA9PiAnQcyGzIMnLAon4bq1JyA9PiAnYcyGzIMnLAon4bq2JyA9PiAnQcyjzIYnLAon4bq3JyA9PiAnYcyjzIYnLAon4bq4JyA9PiAnRcyjJywKJ+G6uScgPT4gJ2XMoycsCifhuronID0+ICdFzIknLAon4bq7JyA9PiAnZcyJJywKJ+G6vCcgPT4gJ0XMgycsCifhur0nID0+ICdlzIMnLAon4bq+JyA9PiAnRcyCzIEnLAon4bq/JyA9PiAnZcyCzIEnLAon4buAJyA9PiAnRcyCzIAnLAon4buBJyA9PiAnZcyCzIAnLAon4buCJyA9PiAnRcyCzIknLAon4buDJyA9PiAnZcyCzIknLAon4buEJyA9PiAnRcyCzIMnLAon4buFJyA9PiAnZcyCzIMnLAon4buGJyA9PiAnRcyjzIInLAon4buHJyA9PiAnZcyjzIInLAon4buIJyA9PiAnScyJJywKJ+G7iScgPT4gJ2nMiScsCifhu4onID0+ICdJzKMnLAon4buLJyA9PiAnacyjJywKJ+G7jCcgPT4gJ0/MoycsCifhu40nID0+ICdvzKMnLAon4buOJyA9PiAnT8yJJywKJ+G7jycgPT4gJ2/MiScsCifhu5AnID0+ICdPzILMgScsCifhu5EnID0+ICdvzILMgScsCifhu5InID0+ICdPzILMgCcsCifhu5MnID0+ICdvzILMgCcsCifhu5QnID0+ICdPzILMiScsCifhu5UnID0+ICdvzILMiScsCifhu5YnID0+ICdPzILMgycsCifhu5cnID0+ICdvzILMgycsCifhu5gnID0+ICdPzKPMgicsCifhu5knID0+ICdvzKPMgicsCifhu5onID0+ICdPzJvMgScsCifhu5snID0+ICdvzJvMgScsCifhu5wnID0+ICdPzJvMgCcsCifhu50nID0+ICdvzJvMgCcsCifhu54nID0+ICdPzJvMiScsCifhu58nID0+ICdvzJvMiScsCifhu6AnID0+ICdPzJvMgycsCifhu6EnID0+ICdvzJvMgycsCifhu6InID0+ICdPzJvMoycsCifhu6MnID0+ICdvzJvMoycsCifhu6QnID0+ICdVzKMnLAon4bulJyA9PiAndcyjJywKJ+G7picgPT4gJ1XMiScsCifhu6cnID0+ICd1zIknLAon4buoJyA9PiAnVcybzIEnLAon4bupJyA9PiAndcybzIEnLAon4buqJyA9PiAnVcybzIAnLAon4burJyA9PiAndcybzIAnLAon4busJyA9PiAnVcybzIknLAon4butJyA9PiAndcybzIknLAon4buuJyA9PiAnVcybzIMnLAon4buvJyA9PiAndcybzIMnLAon4buwJyA9PiAnVcybzKMnLAon4buxJyA9PiAndcybzKMnLAon4buyJyA9PiAnWcyAJywKJ+G7sycgPT4gJ3nMgCcsCifhu7QnID0+ICdZzKMnLAon4bu1JyA9PiAnecyjJywKJ+G7ticgPT4gJ1nMiScsCifhu7cnID0+ICd5zIknLAon4bu4JyA9PiAnWcyDJywKJ+G7uScgPT4gJ3nMgycsCifhvIAnID0+ICfOscyTJywKJ+G8gScgPT4gJ86xzJQnLAon4byCJyA9PiAnzrHMk8yAJywKJ+G8gycgPT4gJ86xzJTMgCcsCifhvIQnID0+ICfOscyTzIEnLAon4byFJyA9PiAnzrHMlMyBJywKJ+G8hicgPT4gJ86xzJPNgicsCifhvIcnID0+ICfOscyUzYInLAon4byIJyA9PiAnzpHMkycsCifhvIknID0+ICfOkcyUJywKJ+G8iicgPT4gJ86RzJPMgCcsCifhvIsnID0+ICfOkcyUzIAnLAon4byMJyA9PiAnzpHMk8yBJywKJ+G8jScgPT4gJ86RzJTMgScsCifhvI4nID0+ICfOkcyTzYInLAon4byPJyA9PiAnzpHMlM2CJywKJ+G8kCcgPT4gJ861zJMnLAon4byRJyA9PiAnzrXMlCcsCifhvJInID0+ICfOtcyTzIAnLAon4byTJyA9PiAnzrXMlMyAJywKJ+G8lCcgPT4gJ861zJPMgScsCifhvJUnID0+ICfOtcyUzIEnLAon4byYJyA9PiAnzpXMkycsCifhvJknID0+ICfOlcyUJywKJ+G8micgPT4gJ86VzJPMgCcsCifhvJsnID0+ICfOlcyUzIAnLAon4bycJyA9PiAnzpXMk8yBJywKJ+G8nScgPT4gJ86VzJTMgScsCifhvKAnID0+ICfOt8yTJywKJ+G8oScgPT4gJ863zJQnLAon4byiJyA9PiAnzrfMk8yAJywKJ+G8oycgPT4gJ863zJTMgCcsCifhvKQnID0+ICfOt8yTzIEnLAon4bylJyA9PiAnzrfMlMyBJywKJ+G8picgPT4gJ863zJPNgicsCifhvKcnID0+ICfOt8yUzYInLAon4byoJyA9PiAnzpfMkycsCifhvKknID0+ICfOl8yUJywKJ+G8qicgPT4gJ86XzJPMgCcsCifhvKsnID0+ICfOl8yUzIAnLAon4bysJyA9PiAnzpfMk8yBJywKJ+G8rScgPT4gJ86XzJTMgScsCifhvK4nID0+ICfOl8yTzYInLAon4byvJyA9PiAnzpfMlM2CJywKJ+G8sCcgPT4gJ865zJMnLAon4byxJyA9PiAnzrnMlCcsCifhvLInID0+ICfOucyTzIAnLAon4byzJyA9PiAnzrnMlMyAJywKJ+G8tCcgPT4gJ865zJPMgScsCifhvLUnID0+ICfOucyUzIEnLAon4by2JyA9PiAnzrnMk82CJywKJ+G8tycgPT4gJ865zJTNgicsCifhvLgnID0+ICfOmcyTJywKJ+G8uScgPT4gJ86ZzJQnLAon4by6JyA9PiAnzpnMk8yAJywKJ+G8uycgPT4gJ86ZzJTMgCcsCifhvLwnID0+ICfOmcyTzIEnLAon4by9JyA9PiAnzpnMlMyBJywKJ+G8vicgPT4gJ86ZzJPNgicsCifhvL8nID0+ICfOmcyUzYInLAon4b2AJyA9PiAnzr/MkycsCifhvYEnID0+ICfOv8yUJywKJ+G9gicgPT4gJ86/zJPMgCcsCifhvYMnID0+ICfOv8yUzIAnLAon4b2EJyA9PiAnzr/Mk8yBJywKJ+G9hScgPT4gJ86/zJTMgScsCifhvYgnID0+ICfOn8yTJywKJ+G9iScgPT4gJ86fzJQnLAon4b2KJyA9PiAnzp/Mk8yAJywKJ+G9iycgPT4gJ86fzJTMgCcsCifhvYwnID0+ICfOn8yTzIEnLAon4b2NJyA9PiAnzp/MlMyBJywKJ+G9kCcgPT4gJ8+FzJMnLAon4b2RJyA9PiAnz4XMlCcsCifhvZInID0+ICfPhcyTzIAnLAon4b2TJyA9PiAnz4XMlMyAJywKJ+G9lCcgPT4gJ8+FzJPMgScsCifhvZUnID0+ICfPhcyUzIEnLAon4b2WJyA9PiAnz4XMk82CJywKJ+G9lycgPT4gJ8+FzJTNgicsCifhvZknID0+ICfOpcyUJywKJ+G9mycgPT4gJ86lzJTMgCcsCifhvZ0nID0+ICfOpcyUzIEnLAon4b2fJyA9PiAnzqXMlM2CJywKJ+G9oCcgPT4gJ8+JzJMnLAon4b2hJyA9PiAnz4nMlCcsCifhvaInID0+ICfPicyTzIAnLAon4b2jJyA9PiAnz4nMlMyAJywKJ+G9pCcgPT4gJ8+JzJPMgScsCifhvaUnID0+ICfPicyUzIEnLAon4b2mJyA9PiAnz4nMk82CJywKJ+G9pycgPT4gJ8+JzJTNgicsCifhvagnID0+ICfOqcyTJywKJ+G9qScgPT4gJ86pzJQnLAon4b2qJyA9PiAnzqnMk8yAJywKJ+G9qycgPT4gJ86pzJTMgCcsCifhvawnID0+ICfOqcyTzIEnLAon4b2tJyA9PiAnzqnMlMyBJywKJ+G9ricgPT4gJ86pzJPNgicsCifhva8nID0+ICfOqcyUzYInLAon4b2wJyA9PiAnzrHMgCcsCifhvbEnID0+ICfOscyBJywKJ+G9sicgPT4gJ861zIAnLAon4b2zJyA9PiAnzrXMgScsCifhvbQnID0+ICfOt8yAJywKJ+G9tScgPT4gJ863zIEnLAon4b22JyA9PiAnzrnMgCcsCifhvbcnID0+ICfOucyBJywKJ+G9uCcgPT4gJ86/zIAnLAon4b25JyA9PiAnzr/MgScsCifhvbonID0+ICfPhcyAJywKJ+G9uycgPT4gJ8+FzIEnLAon4b28JyA9PiAnz4nMgCcsCifhvb0nID0+ICfPicyBJywKJ+G+gCcgPT4gJ86xzJPNhScsCifhvoEnID0+ICfOscyUzYUnLAon4b6CJyA9PiAnzrHMk8yAzYUnLAon4b6DJyA9PiAnzrHMlMyAzYUnLAon4b6EJyA9PiAnzrHMk8yBzYUnLAon4b6FJyA9PiAnzrHMlMyBzYUnLAon4b6GJyA9PiAnzrHMk82CzYUnLAon4b6HJyA9PiAnzrHMlM2CzYUnLAon4b6IJyA9PiAnzpHMk82FJywKJ+G+iScgPT4gJ86RzJTNhScsCifhvoonID0+ICfOkcyTzIDNhScsCifhvosnID0+ICfOkcyUzIDNhScsCifhvownID0+ICfOkcyTzIHNhScsCifhvo0nID0+ICfOkcyUzIHNhScsCifhvo4nID0+ICfOkcyTzYLNhScsCifhvo8nID0+ICfOkcyUzYLNhScsCifhvpAnID0+ICfOt8yTzYUnLAon4b6RJyA9PiAnzrfMlM2FJywKJ+G+kicgPT4gJ863zJPMgM2FJywKJ+G+kycgPT4gJ863zJTMgM2FJywKJ+G+lCcgPT4gJ863zJPMgc2FJywKJ+G+lScgPT4gJ863zJTMgc2FJywKJ+G+licgPT4gJ863zJPNgs2FJywKJ+G+lycgPT4gJ863zJTNgs2FJywKJ+G+mCcgPT4gJ86XzJPNhScsCifhvpknID0+ICfOl8yUzYUnLAon4b6aJyA9PiAnzpfMk8yAzYUnLAon4b6bJyA9PiAnzpfMlMyAzYUnLAon4b6cJyA9PiAnzpfMk8yBzYUnLAon4b6dJyA9PiAnzpfMlMyBzYUnLAon4b6eJyA9PiAnzpfMk82CzYUnLAon4b6fJyA9PiAnzpfMlM2CzYUnLAon4b6gJyA9PiAnz4nMk82FJywKJ+G+oScgPT4gJ8+JzJTNhScsCifhvqInID0+ICfPicyTzIDNhScsCifhvqMnID0+ICfPicyUzIDNhScsCifhvqQnID0+ICfPicyTzIHNhScsCifhvqUnID0+ICfPicyUzIHNhScsCifhvqYnID0+ICfPicyTzYLNhScsCifhvqcnID0+ICfPicyUzYLNhScsCifhvqgnID0+ICfOqcyTzYUnLAon4b6pJyA9PiAnzqnMlM2FJywKJ+G+qicgPT4gJ86pzJPMgM2FJywKJ+G+qycgPT4gJ86pzJTMgM2FJywKJ+G+rCcgPT4gJ86pzJPMgc2FJywKJ+G+rScgPT4gJ86pzJTMgc2FJywKJ+G+ricgPT4gJ86pzJPNgs2FJywKJ+G+rycgPT4gJ86pzJTNgs2FJywKJ+G+sCcgPT4gJ86xzIYnLAon4b6xJyA9PiAnzrHMhCcsCifhvrInID0+ICfOscyAzYUnLAon4b6zJyA9PiAnzrHNhScsCifhvrQnID0+ICfOscyBzYUnLAon4b62JyA9PiAnzrHNgicsCifhvrcnID0+ICfOsc2CzYUnLAon4b64JyA9PiAnzpHMhicsCifhvrknID0+ICfOkcyEJywKJ+G+uicgPT4gJ86RzIAnLAon4b67JyA9PiAnzpHMgScsCifhvrwnID0+ICfOkc2FJywKJ+G+vicgPT4gJ865JywKJ+G/gScgPT4gJ8KozYInLAon4b+CJyA9PiAnzrfMgM2FJywKJ+G/gycgPT4gJ863zYUnLAon4b+EJyA9PiAnzrfMgc2FJywKJ+G/hicgPT4gJ863zYInLAon4b+HJyA9PiAnzrfNgs2FJywKJ+G/iCcgPT4gJ86VzIAnLAon4b+JJyA9PiAnzpXMgScsCifhv4onID0+ICfOl8yAJywKJ+G/iycgPT4gJ86XzIEnLAon4b+MJyA9PiAnzpfNhScsCifhv40nID0+ICfhvr/MgCcsCifhv44nID0+ICfhvr/MgScsCifhv48nID0+ICfhvr/NgicsCifhv5AnID0+ICfOucyGJywKJ+G/kScgPT4gJ865zIQnLAon4b+SJyA9PiAnzrnMiMyAJywKJ+G/kycgPT4gJ865zIjMgScsCifhv5YnID0+ICfOuc2CJywKJ+G/lycgPT4gJ865zIjNgicsCifhv5gnID0+ICfOmcyGJywKJ+G/mScgPT4gJ86ZzIQnLAon4b+aJyA9PiAnzpnMgCcsCifhv5snID0+ICfOmcyBJywKJ+G/nScgPT4gJ+G/vsyAJywKJ+G/nicgPT4gJ+G/vsyBJywKJ+G/nycgPT4gJ+G/vs2CJywKJ+G/oCcgPT4gJ8+FzIYnLAon4b+hJyA9PiAnz4XMhCcsCifhv6InID0+ICfPhcyIzIAnLAon4b+jJyA9PiAnz4XMiMyBJywKJ+G/pCcgPT4gJ8+BzJMnLAon4b+lJyA9PiAnz4HMlCcsCifhv6YnID0+ICfPhc2CJywKJ+G/pycgPT4gJ8+FzIjNgicsCifhv6gnID0+ICfOpcyGJywKJ+G/qScgPT4gJ86lzIQnLAon4b+qJyA9PiAnzqXMgCcsCifhv6snID0+ICfOpcyBJywKJ+G/rCcgPT4gJ86hzJQnLAon4b+tJyA9PiAnwqjMgCcsCifhv64nID0+ICfCqMyBJywKJ+G/rycgPT4gJ2AnLAon4b+yJyA9PiAnz4nMgM2FJywKJ+G/sycgPT4gJ8+JzYUnLAon4b+0JyA9PiAnz4nMgc2FJywKJ+G/ticgPT4gJ8+JzYInLAon4b+3JyA9PiAnz4nNgs2FJywKJ+G/uCcgPT4gJ86fzIAnLAon4b+5JyA9PiAnzp/MgScsCifhv7onID0+ICfOqcyAJywKJ+G/uycgPT4gJ86pzIEnLAon4b+8JyA9PiAnzqnNhScsCifhv70nID0+ICfCtCcsCifigIAnID0+ICfigIInLAon4oCBJyA9PiAn4oCDJywKJ+KEpicgPT4gJ86pJywKJ+KEqicgPT4gJ0snLAon4oSrJyA9PiAnQcyKJywKJ+KGmicgPT4gJ+KGkMy4JywKJ+KGmycgPT4gJ+KGksy4JywKJ+KGricgPT4gJ+KGlMy4JywKJ+KHjScgPT4gJ+KHkMy4JywKJ+KHjicgPT4gJ+KHlMy4JywKJ+KHjycgPT4gJ+KHksy4JywKJ+KIhCcgPT4gJ+KIg8y4JywKJ+KIiScgPT4gJ+KIiMy4JywKJ+KIjCcgPT4gJ+KIi8y4JywKJ+KIpCcgPT4gJ+KIo8y4JywKJ+KIpicgPT4gJ+KIpcy4JywKJ+KJgScgPT4gJ+KIvMy4JywKJ+KJhCcgPT4gJ+KJg8y4JywKJ+KJhycgPT4gJ+KJhcy4JywKJ+KJiScgPT4gJ+KJiMy4JywKJ+KJoCcgPT4gJz3MuCcsCifiiaInID0+ICfiiaHMuCcsCifiia0nID0+ICfiiY3MuCcsCifiia4nID0+ICc8zLgnLAon4omvJyA9PiAnPsy4JywKJ+KJsCcgPT4gJ+KJpMy4JywKJ+KJsScgPT4gJ+KJpcy4JywKJ+KJtCcgPT4gJ+KJssy4JywKJ+KJtScgPT4gJ+KJs8y4JywKJ+KJuCcgPT4gJ+KJtsy4JywKJ+KJuScgPT4gJ+KJt8y4JywKJ+KKgCcgPT4gJ+KJusy4JywKJ+KKgScgPT4gJ+KJu8y4JywKJ+KKhCcgPT4gJ+KKgsy4JywKJ+KKhScgPT4gJ+KKg8y4JywKJ+KKiCcgPT4gJ+KKhsy4JywKJ+KKiScgPT4gJ+KKh8y4JywKJ+KKrCcgPT4gJ+KKosy4JywKJ+KKrScgPT4gJ+KKqMy4JywKJ+KKricgPT4gJ+KKqcy4JywKJ+KKrycgPT4gJ+KKq8y4JywKJ+KLoCcgPT4gJ+KJvMy4JywKJ+KLoScgPT4gJ+KJvcy4JywKJ+KLoicgPT4gJ+KKkcy4JywKJ+KLoycgPT4gJ+KKksy4JywKJ+KLqicgPT4gJ+KKssy4JywKJ+KLqycgPT4gJ+KKs8y4JywKJ+KLrCcgPT4gJ+KKtMy4JywKJ+KLrScgPT4gJ+KKtcy4JywKJ+KMqScgPT4gJ+OAiCcsCifijKonID0+ICfjgIknLAon4qucJyA9PiAn4qudzLgnLAon44GMJyA9PiAn44GL44KZJywKJ+OBjicgPT4gJ+OBjeOCmScsCifjgZAnID0+ICfjgY/jgpknLAon44GSJyA9PiAn44GR44KZJywKJ+OBlCcgPT4gJ+OBk+OCmScsCifjgZYnID0+ICfjgZXjgpknLAon44GYJyA9PiAn44GX44KZJywKJ+OBmicgPT4gJ+OBmeOCmScsCifjgZwnID0+ICfjgZvjgpknLAon44GeJyA9PiAn44Gd44KZJywKJ+OBoCcgPT4gJ+OBn+OCmScsCifjgaInID0+ICfjgaHjgpknLAon44GlJyA9PiAn44Gk44KZJywKJ+OBpycgPT4gJ+OBpuOCmScsCifjgaknID0+ICfjgajjgpknLAon44GwJyA9PiAn44Gv44KZJywKJ+OBsScgPT4gJ+OBr+OCmicsCifjgbMnID0+ICfjgbLjgpknLAon44G0JyA9PiAn44Gy44KaJywKJ+OBticgPT4gJ+OBteOCmScsCifjgbcnID0+ICfjgbXjgponLAon44G5JyA9PiAn44G444KZJywKJ+OBuicgPT4gJ+OBuOOCmicsCifjgbwnID0+ICfjgbvjgpknLAon44G9JyA9PiAn44G744KaJywKJ+OClCcgPT4gJ+OBhuOCmScsCifjgp4nID0+ICfjgp3jgpknLAon44KsJyA9PiAn44Kr44KZJywKJ+OCricgPT4gJ+OCreOCmScsCifjgrAnID0+ICfjgq/jgpknLAon44KyJyA9PiAn44Kx44KZJywKJ+OCtCcgPT4gJ+OCs+OCmScsCifjgrYnID0+ICfjgrXjgpknLAon44K4JyA9PiAn44K344KZJywKJ+OCuicgPT4gJ+OCueOCmScsCifjgrwnID0+ICfjgrvjgpknLAon44K+JyA9PiAn44K944KZJywKJ+ODgCcgPT4gJ+OCv+OCmScsCifjg4InID0+ICfjg4HjgpknLAon44OFJyA9PiAn44OE44KZJywKJ+ODhycgPT4gJ+ODhuOCmScsCifjg4knID0+ICfjg4jjgpknLAon44OQJyA9PiAn44OP44KZJywKJ+ODkScgPT4gJ+ODj+OCmicsCifjg5MnID0+ICfjg5LjgpknLAon44OUJyA9PiAn44OS44KaJywKJ+ODlicgPT4gJ+ODleOCmScsCifjg5cnID0+ICfjg5XjgponLAon44OZJyA9PiAn44OY44KZJywKJ+ODmicgPT4gJ+ODmOOCmicsCifjg5wnID0+ICfjg5vjgpknLAon44OdJyA9PiAn44Ob44KaJywKJ+ODtCcgPT4gJ+OCpuOCmScsCifjg7cnID0+ICfjg6/jgpknLAon44O4JyA9PiAn44Ow44KZJywKJ+ODuScgPT4gJ+ODseOCmScsCifjg7onID0+ICfjg7LjgpknLAon44O+JyA9PiAn44O944KZJywKJ++kgCcgPT4gJ+ixiCcsCifvpIEnID0+ICfmm7QnLAon76SCJyA9PiAn6LuKJywKJ++kgycgPT4gJ+iziCcsCifvpIQnID0+ICfmu5EnLAon76SFJyA9PiAn5LiyJywKJ++khicgPT4gJ+WPpScsCifvpIcnID0+ICfpvpwnLAon76SIJyA9PiAn6b6cJywKJ++kiScgPT4gJ+WlkScsCifvpIonID0+ICfph5EnLAon76SLJyA9PiAn5ZaHJywKJ++kjCcgPT4gJ+WliCcsCifvpI0nID0+ICfmh7YnLAon76SOJyA9PiAn55mpJywKJ++kjycgPT4gJ+e+hScsCifvpJAnID0+ICfomL8nLAon76SRJyA9PiAn6J66JywKJ++kkicgPT4gJ+ijuCcsCifvpJMnID0+ICfpgo8nLAon76SUJyA9PiAn5qiCJywKJ++klScgPT4gJ+a0mycsCifvpJYnID0+ICfng5knLAon76SXJyA9PiAn54+eJywKJ++kmCcgPT4gJ+iQvScsCifvpJknID0+ICfphaonLAon76SaJyA9PiAn6aexJywKJ++kmycgPT4gJ+S6gicsCifvpJwnID0+ICfljbUnLAon76SdJyA9PiAn5qyEJywKJ++knicgPT4gJ+eImycsCifvpJ8nID0+ICfomK0nLAon76SgJyA9PiAn6bieJywKJ++koScgPT4gJ+W1kCcsCifvpKInID0+ICfmv6snLAon76SjJyA9PiAn6JeNJywKJ++kpCcgPT4gJ+ilpCcsCifvpKUnID0+ICfmi4knLAon76SmJyA9PiAn6IeYJywKJ++kpycgPT4gJ+ignycsCifvpKgnID0+ICflu4onLAon76SpJyA9PiAn5pyXJywKJ++kqicgPT4gJ+a1qicsCifvpKsnID0+ICfni7wnLAon76SsJyA9PiAn6YOOJywKJ++krScgPT4gJ+S+hicsCifvpK4nID0+ICflhrcnLAon76SvJyA9PiAn5YueJywKJ++ksCcgPT4gJ+aThCcsCifvpLEnID0+ICfmq5MnLAon76SyJyA9PiAn54iQJywKJ++ksycgPT4gJ+ebpycsCifvpLQnID0+ICfogIEnLAon76S1JyA9PiAn6JiGJywKJ++kticgPT4gJ+iZnCcsCifvpLcnID0+ICfot68nLAon76S4JyA9PiAn6ZyyJywKJ++kuScgPT4gJ+mtrycsCifvpLonID0+ICfpt7onLAon76S7JyA9PiAn56KMJywKJ++kvCcgPT4gJ+elvycsCifvpL0nID0+ICfntqAnLAon76S+JyA9PiAn6I+JJywKJ++kvycgPT4gJ+mMhCcsCifvpYAnID0+ICfpub8nLAon76WBJyA9PiAn6KuWJywKJ++lgicgPT4gJ+WjnycsCifvpYMnID0+ICflvIQnLAon76WEJyA9PiAn57GgJywKJ++lhScgPT4gJ+iBvicsCifvpYYnID0+ICfniaInLAon76WHJyA9PiAn56OKJywKJ++liCcgPT4gJ+izgicsCifvpYknID0+ICfpm7cnLAon76WKJyA9PiAn5aOYJywKJ++liycgPT4gJ+WxoicsCifvpYwnID0+ICfmqJMnLAon76WNJyA9PiAn5reaJywKJ++ljicgPT4gJ+a8jycsCifvpY8nID0+ICfntK8nLAon76WQJyA9PiAn57i3JywKJ++lkScgPT4gJ+mZiycsCifvpZInID0+ICfli5InLAon76WTJyA9PiAn6IKLJywKJ++llCcgPT4gJ+WHnCcsCifvpZUnID0+ICflh4wnLAon76WWJyA9PiAn56icJywKJ++llycgPT4gJ+e2vicsCifvpZgnID0+ICfoj7EnLAon76WZJyA9PiAn6Zm1JywKJ++lmicgPT4gJ+iugCcsCifvpZsnID0+ICfmi48nLAon76WcJyA9PiAn5qiCJywKJ++lnScgPT4gJ+irvicsCifvpZ4nID0+ICfkuLknLAon76WfJyA9PiAn5a+nJywKJ++loCcgPT4gJ+aAkicsCifvpaEnID0+ICfnjocnLAon76WiJyA9PiAn55WwJywKJ++loycgPT4gJ+WMlycsCifvpaQnID0+ICfno7snLAon76WlJyA9PiAn5L6/JywKJ++lpicgPT4gJ+W+qScsCifvpacnID0+ICfkuI0nLAon76WoJyA9PiAn5rOMJywKJ++lqScgPT4gJ+aVuCcsCifvpaonID0+ICfntKInLAon76WrJyA9PiAn5Y+DJywKJ++lrCcgPT4gJ+WhnicsCifvpa0nID0+ICfnnIEnLAon76WuJyA9PiAn6JGJJywKJ++lrycgPT4gJ+iqqicsCifvpbAnID0+ICfmrronLAon76WxJyA9PiAn6L6wJywKJ++lsicgPT4gJ+ayiCcsCifvpbMnID0+ICfmi74nLAon76W0JyA9PiAn6IulJywKJ++ltScgPT4gJ+aOoCcsCifvpbYnID0+ICfnlaUnLAon76W3JyA9PiAn5LquJywKJ++luCcgPT4gJ+WFqScsCifvpbknID0+ICflh4knLAon76W6JyA9PiAn5qKBJywKJ++luycgPT4gJ+ezpycsCifvpbwnID0+ICfoia8nLAon76W9JyA9PiAn6KuSJywKJ++lvicgPT4gJ+mHjycsCifvpb8nID0+ICfli7UnLAon76aAJyA9PiAn5ZGCJywKJ++mgScgPT4gJ+WlsycsCifvpoInID0+ICflu6wnLAon76aDJyA9PiAn5peFJywKJ++mhCcgPT4gJ+a/vicsCifvpoUnID0+ICfnpKonLAon76aGJyA9PiAn6ZatJywKJ++mhycgPT4gJ+mpqicsCifvpognID0+ICfpupcnLAon76aJJyA9PiAn6buOJywKJ++miicgPT4gJ+WKmycsCifvposnID0+ICfmm4YnLAon76aMJyA9PiAn5q23JywKJ++mjScgPT4gJ+i9oicsCifvpo4nID0+ICflubQnLAon76aPJyA9PiAn5oaQJywKJ++mkCcgPT4gJ+aIgCcsCifvppEnID0+ICfmkponLAon76aSJyA9PiAn5ryjJywKJ++mkycgPT4gJ+eFiScsCifvppQnID0+ICfnkoknLAon76aVJyA9PiAn56eKJywKJ++mlicgPT4gJ+e3tCcsCifvppcnID0+ICfoga8nLAon76aYJyA9PiAn6LymJywKJ++mmScgPT4gJ+iTricsCifvpponID0+ICfpgKMnLAon76abJyA9PiAn6Y2KJywKJ++mnCcgPT4gJ+WIlycsCifvpp0nID0+ICfliqMnLAon76aeJyA9PiAn5ZK9JywKJ++mnycgPT4gJ+eDiCcsCifvpqAnID0+ICfoo4InLAon76ahJyA9PiAn6KqqJywKJ++moicgPT4gJ+W7iScsCifvpqMnID0+ICflv7UnLAon76akJyA9PiAn5o27JywKJ++mpScgPT4gJ+auricsCifvpqYnID0+ICfnsL4nLAon76anJyA9PiAn5421JywKJ++mqCcgPT4gJ+S7pCcsCifvpqknID0+ICflm7knLAon76aqJyA9PiAn5a+nJywKJ++mqycgPT4gJ+W2uicsCifvpqwnID0+ICfmgJwnLAon76atJyA9PiAn546yJywKJ++mricgPT4gJ+eRqScsCifvpq8nID0+ICfnvponLAon76awJyA9PiAn6IGGJywKJ++msScgPT4gJ+mItCcsCifvprInID0+ICfpm7YnLAon76azJyA9PiAn6Z2IJywKJ++mtCcgPT4gJ+mgmCcsCifvprUnID0+ICfkvosnLAon76a2JyA9PiAn56auJywKJ++mtycgPT4gJ+mGtCcsCifvprgnID0+ICfpmrgnLAon76a5JyA9PiAn5oOhJywKJ++muicgPT4gJ+S6hicsCifvprsnID0+ICflg5onLAon76a8JyA9PiAn5a+uJywKJ++mvScgPT4gJ+WwvycsCifvpr4nID0+ICfmlpknLAon76a/JyA9PiAn5qiCJywKJ++ngCcgPT4gJ+eHjicsCifvp4EnID0+ICfnmYInLAon76eCJyA9PiAn6JO8JywKJ++ngycgPT4gJ+mBvCcsCifvp4QnID0+ICfpvo0nLAon76eFJyA9PiAn5pqIJywKJ++nhicgPT4gJ+mYricsCifvp4cnID0+ICflioknLAon76eIJyA9PiAn5p27JywKJ++niScgPT4gJ+afsycsCifvp4onID0+ICfmtYEnLAon76eLJyA9PiAn5rqcJywKJ++njCcgPT4gJ+eQiScsCifvp40nID0+ICfnlZknLAon76eOJyA9PiAn56GrJywKJ++njycgPT4gJ+e0kCcsCifvp5AnID0+ICfpoZ4nLAon76eRJyA9PiAn5YWtJywKJ++nkicgPT4gJ+aIricsCifvp5MnID0+ICfpmbgnLAon76eUJyA9PiAn5YCrJywKJ++nlScgPT4gJ+W0mScsCifvp5YnID0+ICfmt6onLAon76eXJyA9PiAn6LyqJywKJ++nmCcgPT4gJ+W+iycsCifvp5knID0+ICfmhYQnLAon76eaJyA9PiAn5qCXJywKJ++nmycgPT4gJ+eOhycsCifvp5wnID0+ICfpmoYnLAon76edJyA9PiAn5YipJywKJ++nnicgPT4gJ+WQjycsCifvp58nID0+ICflsaUnLAon76egJyA9PiAn5piTJywKJ++noScgPT4gJ+adjicsCifvp6InID0+ICfmoqgnLAon76ejJyA9PiAn5rOlJywKJ++npCcgPT4gJ+eQhicsCifvp6UnID0+ICfnl6InLAon76emJyA9PiAn5725JywKJ++npycgPT4gJ+ijjycsCifvp6gnID0+ICfoo6EnLAon76epJyA9PiAn6YeMJywKJ++nqicgPT4gJ+mboicsCifvp6snID0+ICfljL8nLAon76esJyA9PiAn5rq6JywKJ++nrScgPT4gJ+WQnScsCifvp64nID0+ICfnh5AnLAon76evJyA9PiAn55KYJywKJ++nsCcgPT4gJ+iXuicsCifvp7EnID0+ICfpmqMnLAon76eyJyA9PiAn6bGXJywKJ++nsycgPT4gJ+m6nycsCifvp7QnID0+ICfmnpcnLAon76e1JyA9PiAn5reLJywKJ++nticgPT4gJ+iHqCcsCifvp7cnID0+ICfnq4snLAon76e4JyA9PiAn56ygJywKJ++nuScgPT4gJ+eykicsCifvp7onID0+ICfni4AnLAon76e7JyA9PiAn54KZJywKJ++nvCcgPT4gJ+itmCcsCifvp70nID0+ICfku4AnLAon76e+JyA9PiAn6Iy2JywKJ++nvycgPT4gJ+WIuicsCifvqIAnID0+ICfliIcnLAon76iBJyA9PiAn5bqmJywKJ++ogicgPT4gJ+aLkycsCifvqIMnID0+ICfns5YnLAon76iEJyA9PiAn5a6FJywKJ++ohScgPT4gJ+a0nicsCifvqIYnID0+ICfmmrQnLAon76iHJyA9PiAn6Ly7JywKJ++oiCcgPT4gJ+ihjCcsCifvqIknID0+ICfpmY0nLAon76iKJyA9PiAn6KaLJywKJ++oiycgPT4gJ+W7kycsCifvqIwnID0+ICflhYAnLAon76iNJyA9PiAn5ZeAJywKJ++okCcgPT4gJ+WhmicsCifvqJInID0+ICfmmbQnLAon76iVJyA9PiAn5YeeJywKJ++olicgPT4gJ+eMqicsCifvqJcnID0+ICfnm4onLAon76iYJyA9PiAn56S8JywKJ++omScgPT4gJ+elnicsCifvqJonID0+ICfnpaUnLAon76ibJyA9PiAn56aPJywKJ++onCcgPT4gJ+mdlicsCifvqJ0nID0+ICfnsr4nLAon76ieJyA9PiAn5769JywKJ++ooCcgPT4gJ+iYkicsCifvqKInID0+ICfoq7gnLAon76ilJyA9PiAn6YC4JywKJ++opicgPT4gJ+mDvScsCifvqKonID0+ICfpo68nLAon76irJyA9PiAn6aO8JywKJ++orCcgPT4gJ+mkqCcsCifvqK0nID0+ICfptrQnLAon76iuJyA9PiAn6YOeJywKJ++orycgPT4gJ+matycsCifvqLAnID0+ICfkvq4nLAon76ixJyA9PiAn5YOnJywKJ++osicgPT4gJ+WFjScsCifvqLMnID0+ICfli4knLAon76i0JyA9PiAn5YukJywKJ++otScgPT4gJ+WNkScsCifvqLYnID0+ICfllp0nLAon76i3JyA9PiAn5ZiGJywKJ++ouCcgPT4gJ+WZqCcsCifvqLknID0+ICfloYAnLAon76i6JyA9PiAn5aKoJywKJ++ouycgPT4gJ+WxpCcsCifvqLwnID0+ICflsa4nLAon76i9JyA9PiAn5oKUJywKJ++ovicgPT4gJ+aFqCcsCifvqL8nID0+ICfmho4nLAon76mAJyA9PiAn5oeyJywKJ++pgScgPT4gJ+aVjycsCifvqYInID0+ICfml6InLAon76mDJyA9PiAn5pqRJywKJ++phCcgPT4gJ+aihScsCifvqYUnID0+ICfmtbcnLAon76mGJyA9PiAn5riaJywKJ++phycgPT4gJ+a8oicsCifvqYgnID0+ICfnha4nLAon76mJJyA9PiAn54irJywKJ++piicgPT4gJ+eQoicsCifvqYsnID0+ICfnopEnLAon76mMJyA9PiAn56S+JywKJ++pjScgPT4gJ+eliScsCifvqY4nID0+ICfnpYgnLAon76mPJyA9PiAn56WQJywKJ++pkCcgPT4gJ+ellicsCifvqZEnID0+ICfnpZ0nLAon76mSJyA9PiAn56aNJywKJ++pkycgPT4gJ+emjicsCifvqZQnID0+ICfnqYAnLAon76mVJyA9PiAn56qBJywKJ++plicgPT4gJ+evgCcsCifvqZcnID0+ICfnt7QnLAon76mYJyA9PiAn57iJJywKJ++pmScgPT4gJ+e5gScsCifvqZonID0+ICfnvbInLAon76mbJyA9PiAn6ICFJywKJ++pnCcgPT4gJ+iHrScsCifvqZ0nID0+ICfoibknLAon76meJyA9PiAn6Im5JywKJ++pnycgPT4gJ+iRlycsCifvqaAnID0+ICfopJAnLAon76mhJyA9PiAn6KaWJywKJ++poicgPT4gJ+isgScsCifvqaMnID0+ICforLknLAon76mkJyA9PiAn6LOTJywKJ++ppScgPT4gJ+i0iCcsCifvqaYnID0+ICfovrYnLAon76mnJyA9PiAn6YC4JywKJ++pqCcgPT4gJ+mboycsCifvqaknID0+ICfpn78nLAon76mqJyA9PiAn6aC7JywKJ++pqycgPT4gJ+aBtScsCifvqawnID0+ICfwpIuuJywKJ++prScgPT4gJ+iImCcsCifvqbAnID0+ICfkuKYnLAon76mxJyA9PiAn5Ya1JywKJ++psicgPT4gJ+WFqCcsCifvqbMnID0+ICfkvoAnLAon76m0JyA9PiAn5YWFJywKJ++ptScgPT4gJ+WGgCcsCifvqbYnID0+ICfli4cnLAon76m3JyA9PiAn5Yu6JywKJ++puCcgPT4gJ+WWnScsCifvqbknID0+ICfllZUnLAon76m6JyA9PiAn5ZaZJywKJ++puycgPT4gJ+WXoicsCifvqbwnID0+ICfloZonLAon76m9JyA9PiAn5aKzJywKJ++pvicgPT4gJ+WlhCcsCifvqb8nID0+ICflpZQnLAon76qAJyA9PiAn5amiJywKJ++qgScgPT4gJ+WsqCcsCifvqoInID0+ICflu5InLAon76qDJyA9PiAn5buZJywKJ++qhCcgPT4gJ+W9qScsCifvqoUnID0+ICflvq0nLAon76qGJyA9PiAn5oOYJywKJ++qhycgPT4gJ+aFjicsCifvqognID0+ICfmhIgnLAon76qJJyA9PiAn5oaOJywKJ++qiicgPT4gJ+aFoCcsCifvqosnID0+ICfmh7InLAon76qMJyA9PiAn5oi0JywKJ++qjScgPT4gJ+aPhCcsCifvqo4nID0+ICfmkJwnLAon76qPJyA9PiAn5pGSJywKJ++qkCcgPT4gJ+aVlicsCifvqpEnID0+ICfmmbQnLAon76qSJyA9PiAn5pyXJywKJ++qkycgPT4gJ+acmycsCifvqpQnID0+ICfmnZYnLAon76qVJyA9PiAn5q25JywKJ++qlicgPT4gJ+auuicsCifvqpcnID0+ICfmtYEnLAon76qYJyA9PiAn5rubJywKJ++qmScgPT4gJ+a7iycsCifvqponID0+ICfmvKInLAon76qbJyA9PiAn54CeJywKJ++qnCcgPT4gJ+eFricsCifvqp0nID0+ICfnnqcnLAon76qeJyA9PiAn54i1JywKJ++qnycgPT4gJ+eKrycsCifvqqAnID0+ICfnjKonLAon76qhJyA9PiAn55GxJywKJ++qoicgPT4gJ+eUhicsCifvqqMnID0+ICfnlLsnLAon76qkJyA9PiAn55idJywKJ++qpScgPT4gJ+eYnycsCifvqqYnID0+ICfnm4onLAon76qnJyA9PiAn55ubJywKJ++qqCcgPT4gJ+ebtCcsCifvqqknID0+ICfnnYonLAon76qqJyA9PiAn552AJywKJ++qqycgPT4gJ+ejjCcsCifvqqwnID0+ICfnqrEnLAon76qtJyA9PiAn56+AJywKJ++qricgPT4gJ+exuycsCifvqq8nID0+ICfntZsnLAon76qwJyA9PiAn57e0JywKJ++qsScgPT4gJ+e8vicsCifvqrInID0+ICfogIUnLAon76qzJyA9PiAn6I2SJywKJ++qtCcgPT4gJ+iPrycsCifvqrUnID0+ICfonbknLAon76q2JyA9PiAn6KWBJywKJ++qtycgPT4gJ+imhicsCifvqrgnID0+ICfoppYnLAon76q5JyA9PiAn6Kq/JywKJ++quicgPT4gJ+iruCcsCifvqrsnID0+ICfoq4snLAon76q8JyA9PiAn6KyBJywKJ++qvScgPT4gJ+irvicsCifvqr4nID0+ICfoq60nLAon76q/JyA9PiAn6Ky5JywKJ++rgCcgPT4gJ+iuiicsCifvq4EnID0+ICfotIgnLAon76uCJyA9PiAn6Ly4JywKJ++rgycgPT4gJ+mBsicsCifvq4QnID0+ICfphpknLAon76uFJyA9PiAn6Ym2JywKJ++rhicgPT4gJ+mZvCcsCifvq4cnID0+ICfpm6MnLAon76uIJyA9PiAn6Z2WJywKJ++riScgPT4gJ+mfmycsCifvq4onID0+ICfpn78nLAon76uLJyA9PiAn6aCLJywKJ++rjCcgPT4gJ+mguycsCifvq40nID0+ICfprJInLAon76uOJyA9PiAn6b6cJywKJ++rjycgPT4gJ/CioYonLAon76uQJyA9PiAn8KKhhCcsCifvq5EnID0+ICfwo4+VJywKJ++rkicgPT4gJ+OunScsCifvq5MnID0+ICfkgJgnLAon76uUJyA9PiAn5IC5JywKJ++rlScgPT4gJ/CliYknLAon76uWJyA9PiAn8KWzkCcsCifvq5cnID0+ICfwp7uTJywKJ++rmCcgPT4gJ+m9gycsCifvq5knID0+ICfpvo4nLAon76ydJyA9PiAn15nWtCcsCifvrJ8nID0+ICfXsta3JywKJ++sqicgPT4gJ9ep14EnLAon76yrJyA9PiAn16nXgicsCifvrKwnID0+ICfXqda814EnLAon76ytJyA9PiAn16nWvNeCJywKJ++sricgPT4gJ9eQ1rcnLAon76yvJyA9PiAn15DWuCcsCifvrLAnID0+ICfXkNa8JywKJ++ssScgPT4gJ9eR1rwnLAon76yyJyA9PiAn15LWvCcsCifvrLMnID0+ICfXk9a8JywKJ++stCcgPT4gJ9eU1rwnLAon76y1JyA9PiAn15XWvCcsCifvrLYnID0+ICfXlta8JywKJ++suCcgPT4gJ9eY1rwnLAon76y5JyA9PiAn15nWvCcsCifvrLonID0+ICfXmta8JywKJ++suycgPT4gJ9eb1rwnLAon76y8JyA9PiAn15zWvCcsCifvrL4nID0+ICfXnta8JywKJ++tgCcgPT4gJ9eg1rwnLAon762BJyA9PiAn16HWvCcsCifvrYMnID0+ICfXo9a8JywKJ++thCcgPT4gJ9ek1rwnLAon762GJyA9PiAn16bWvCcsCifvrYcnID0+ICfXp9a8JywKJ++tiCcgPT4gJ9eo1rwnLAon762JJyA9PiAn16nWvCcsCifvrYonID0+ICfXqta8JywKJ++tiycgPT4gJ9eV1rknLAon762MJyA9PiAn15HWvycsCifvrY0nID0+ICfXm9a/JywKJ++tjicgPT4gJ9ek1r8nLAon8JGCmicgPT4gJ/CRgpnwkYK6JywKJ/CRgpwnID0+ICfwkYKb8JGCuicsCifwkYKrJyA9PiAn8JGCpfCRgronLAon8JGEricgPT4gJ/CRhLHwkYSnJywKJ/CRhK8nID0+ICfwkYSy8JGEpycsCifwkY2LJyA9PiAn8JGNh/CRjL4nLAon8JGNjCcgPT4gJ/CRjYfwkY2XJywKJ/CRkrsnID0+ICfwkZK58JGSuicsCifwkZK8JyA9PiAn8JGSufCRkrAnLAon8JGSvicgPT4gJ/CRkrnwkZK9JywKJ/CRlronID0+ICfwkZa48JGWrycsCifwkZa7JyA9PiAn8JGWufCRlq8nLAon8JGkuCcgPT4gJ/CRpLXwkaSwJywKJ/CdhZ4nID0+ICfwnYWX8J2FpScsCifwnYWfJyA9PiAn8J2FmPCdhaUnLAon8J2FoCcgPT4gJ/CdhZjwnYWl8J2FricsCifwnYWhJyA9PiAn8J2FmPCdhaXwnYWvJywKJ/CdhaInID0+ICfwnYWY8J2FpfCdhbAnLAon8J2FoycgPT4gJ/CdhZjwnYWl8J2FsScsCifwnYWkJyA9PiAn8J2FmPCdhaXwnYWyJywKJ/CdhrsnID0+ICfwnYa58J2FpScsCifwnYa8JyA9PiAn8J2GuvCdhaUnLAon8J2GvScgPT4gJ/CdhrnwnYWl8J2FricsCifwnYa+JyA9PiAn8J2GuvCdhaXwnYWuJywKJ/Cdhr8nID0+ICfwnYa58J2FpfCdha8nLAon8J2HgCcgPT4gJ/CdhrrwnYWl8J2FrycsCifwr6CAJyA9PiAn5Li9JywKJ/CvoIEnID0+ICfkuLgnLAon8K+ggicgPT4gJ+S5gScsCifwr6CDJyA9PiAn8KCEoicsCifwr6CEJyA9PiAn5L2gJywKJ/CvoIUnID0+ICfkvq4nLAon8K+ghicgPT4gJ+S+uycsCifwr6CHJyA9PiAn5YCCJywKJ/CvoIgnID0+ICflgbonLAon8K+giScgPT4gJ+WCmScsCifwr6CKJyA9PiAn5YOnJywKJ/CvoIsnID0+ICflg48nLAon8K+gjCcgPT4gJ+OSnicsCifwr6CNJyA9PiAn8KCYuicsCifwr6COJyA9PiAn5YWNJywKJ/CvoI8nID0+ICflhZQnLAon8K+gkCcgPT4gJ+WFpCcsCifwr6CRJyA9PiAn5YW3JywKJ/CvoJInID0+ICfwoJScJywKJ/CvoJMnID0+ICfjkrknLAon8K+glCcgPT4gJ+WFpycsCifwr6CVJyA9PiAn5YaNJywKJ/CvoJYnID0+ICfwoJWLJywKJ/CvoJcnID0+ICflhpcnLAon8K+gmCcgPT4gJ+WGpCcsCifwr6CZJyA9PiAn5LuMJywKJ/CvoJonID0+ICflhqwnLAon8K+gmycgPT4gJ+WGtScsCifwr6CcJyA9PiAn8KmHnycsCifwr6CdJyA9PiAn5Ye1JywKJ/CvoJ4nID0+ICfliIMnLAon8K+gnycgPT4gJ+OTnycsCifwr6CgJyA9PiAn5Yi7JywKJ/CvoKEnID0+ICfliYYnLAon8K+goicgPT4gJ+WJsicsCifwr6CjJyA9PiAn5Ym3JywKJ/CvoKQnID0+ICfjlJUnLAon8K+gpScgPT4gJ+WLhycsCifwr6CmJyA9PiAn5YuJJywKJ/CvoKcnID0+ICfli6QnLAon8K+gqCcgPT4gJ+WLuicsCifwr6CpJyA9PiAn5YyFJywKJ/CvoKonID0+ICfljIYnLAon8K+gqycgPT4gJ+WMlycsCifwr6CsJyA9PiAn5Y2JJywKJ/CvoK0nID0+ICfljZEnLAon8K+gricgPT4gJ+WNmicsCifwr6CvJyA9PiAn5Y2zJywKJ/CvoLAnID0+ICfljb0nLAon8K+gsScgPT4gJ+WNvycsCifwr6CyJyA9PiAn5Y2/JywKJ/CvoLMnID0+ICfljb8nLAon8K+gtCcgPT4gJ/CgqKwnLAon8K+gtScgPT4gJ+eBsCcsCifwr6C2JyA9PiAn5Y+KJywKJ/CvoLcnID0+ICflj58nLAon8K+guCcgPT4gJ/CgraMnLAon8K+guScgPT4gJ+WPqycsCifwr6C6JyA9PiAn5Y+xJywKJ/CvoLsnID0+ICflkIYnLAon8K+gvCcgPT4gJ+WSnicsCifwr6C9JyA9PiAn5ZC4JywKJ/CvoL4nID0+ICflkYgnLAon8K+gvycgPT4gJ+WRqCcsCifwr6GAJyA9PiAn5ZKiJywKJ/CvoYEnID0+ICflk7YnLAon8K+hgicgPT4gJ+WUkCcsCifwr6GDJyA9PiAn5ZWTJywKJ/CvoYQnID0+ICfllaMnLAon8K+hhScgPT4gJ+WWhCcsCifwr6GGJyA9PiAn5ZaEJywKJ/CvoYcnID0+ICfllpknLAon8K+hiCcgPT4gJ+WWqycsCifwr6GJJyA9PiAn5ZazJywKJ/CvoYonID0+ICfll4InLAon8K+hiycgPT4gJ+WclicsCifwr6GMJyA9PiAn5ZiGJywKJ/CvoY0nID0+ICflnJcnLAon8K+hjicgPT4gJ+WZkScsCifwr6GPJyA9PiAn5Zm0JywKJ/CvoZAnID0+ICfliIcnLAon8K+hkScgPT4gJ+WjricsCifwr6GSJyA9PiAn5Z+OJywKJ/CvoZMnID0+ICfln7QnLAon8K+hlCcgPT4gJ+WgjScsCifwr6GVJyA9PiAn5Z6LJywKJ/CvoZYnID0+ICfloLInLAon8K+hlycgPT4gJ+WgsScsCifwr6GYJyA9PiAn5aKsJywKJ/CvoZknID0+ICfwoZOkJywKJ/CvoZonID0+ICflo7InLAon8K+hmycgPT4gJ+WjtycsCifwr6GcJyA9PiAn5aSGJywKJ/CvoZ0nID0+ICflpJonLAon8K+hnicgPT4gJ+WkoicsCifwr6GfJyA9PiAn5aWiJywKJ/CvoaAnID0+ICfwoZqoJywKJ/CvoaEnID0+ICfwoZuqJywKJ/CvoaInID0+ICflp6wnLAon8K+hoycgPT4gJ+WomycsCifwr6GkJyA9PiAn5ainJywKJ/CvoaUnID0+ICflp5gnLAon8K+hpicgPT4gJ+WppicsCifwr6GnJyA9PiAn45uuJywKJ/CvoagnID0+ICfjm7wnLAon8K+hqScgPT4gJ+WsiCcsCifwr6GqJyA9PiAn5ay+JywKJ/CvoasnID0+ICflrL4nLAon8K+hrCcgPT4gJ/Chp4gnLAon8K+hrScgPT4gJ+WvgycsCifwr6GuJyA9PiAn5a+YJywKJ/Cvoa8nID0+ICflr6cnLAon8K+hsCcgPT4gJ+WvsycsCifwr6GxJyA9PiAn8KGsmCcsCifwr6GyJyA9PiAn5a+/JywKJ/CvobMnID0+ICflsIYnLAon8K+htCcgPT4gJ+W9kycsCifwr6G1JyA9PiAn5bCiJywKJ/CvobYnID0+ICfjnoEnLAon8K+htycgPT4gJ+WxoCcsCifwr6G4JyA9PiAn5bGuJywKJ/CvobknID0+ICfls4AnLAon8K+huicgPT4gJ+WyjScsCifwr6G7JyA9PiAn8KG3pCcsCifwr6G8JyA9PiAn5bWDJywKJ/Cvob0nID0+ICfwobemJywKJ/Cvob4nID0+ICflta4nLAon8K+hvycgPT4gJ+W1qycsCifwr6KAJyA9PiAn5bW8JywKJ/CvooEnID0+ICflt6EnLAon8K+igicgPT4gJ+W3oicsCifwr6KDJyA9PiAn46CvJywKJ/CvooQnID0+ICflt70nLAon8K+ihScgPT4gJ+W4qCcsCifwr6KGJyA9PiAn5bi9JywKJ/CvoocnID0+ICfluaknLAon8K+iiCcgPT4gJ+OhoicsCifwr6KJJyA9PiAn8KKGgycsCifwr6KKJyA9PiAn46G8JywKJ/CvoosnID0+ICflurAnLAon8K+ijCcgPT4gJ+W6sycsCifwr6KNJyA9PiAn5bq2JywKJ/Cvoo4nID0+ICflu4onLAon8K+ijycgPT4gJ/CqjpInLAon8K+ikCcgPT4gJ+W7vicsCifwr6KRJyA9PiAn8KKMsScsCifwr6KSJyA9PiAn8KKMsScsCifwr6KTJyA9PiAn6IiBJywKJ/CvopQnID0+ICflvKInLAon8K+ilScgPT4gJ+W8oicsCifwr6KWJyA9PiAn46OHJywKJ/CvopcnID0+ICfwo4q4JywKJ/CvopgnID0+ICfwpoeaJywKJ/CvopknID0+ICflvaInLAon8K+imicgPT4gJ+W9qycsCifwr6KbJyA9PiAn46OjJywKJ/CvopwnID0+ICflvponLAon8K+inScgPT4gJ+W/jScsCifwr6KeJyA9PiAn5b+XJywKJ/Cvop8nID0+ICflv7knLAon8K+ioCcgPT4gJ+aCgScsCifwr6KhJyA9PiAn46S6JywKJ/CvoqInID0+ICfjpJwnLAon8K+ioycgPT4gJ+aClCcsCifwr6KkJyA9PiAn8KKblCcsCifwr6KlJyA9PiAn5oOHJywKJ/CvoqYnID0+ICfmhYgnLAon8K+ipycgPT4gJ+aFjCcsCifwr6KoJyA9PiAn5oWOJywKJ/CvoqknID0+ICfmhYwnLAon8K+iqicgPT4gJ+aFuicsCifwr6KrJyA9PiAn5oaOJywKJ/CvoqwnID0+ICfmhrInLAon8K+irScgPT4gJ+aGpCcsCifwr6KuJyA9PiAn5oavJywKJ/Cvoq8nID0+ICfmh54nLAon8K+isCcgPT4gJ+aHsicsCifwr6KxJyA9PiAn5oe2JywKJ/CvorInID0+ICfmiJAnLAon8K+isycgPT4gJ+aImycsCifwr6K0JyA9PiAn5omdJywKJ/CvorUnID0+ICfmirEnLAon8K+iticgPT4gJ+aLlCcsCifwr6K3JyA9PiAn5o2QJywKJ/CvorgnID0+ICfwoqyMJywKJ/CvorknID0+ICfmjL0nLAon8K+iuicgPT4gJ+aLvCcsCifwr6K7JyA9PiAn5o2oJywKJ/CvorwnID0+ICfmjoMnLAon8K+ivScgPT4gJ+aPpCcsCifwr6K+JyA9PiAn8KKvsScsCifwr6K/JyA9PiAn5pCiJywKJ/Cvo4AnID0+ICfmj4UnLAon8K+jgScgPT4gJ+aOqScsCifwr6OCJyA9PiAn46iuJywKJ/Cvo4MnID0+ICfmkaknLAon8K+jhCcgPT4gJ+aRvicsCifwr6OFJyA9PiAn5pKdJywKJ/Cvo4YnID0+ICfmkbcnLAon8K+jhycgPT4gJ+OprCcsCifwr6OIJyA9PiAn5pWPJywKJ/Cvo4knID0+ICfmlawnLAon8K+jiicgPT4gJ/CjgIonLAon8K+jiycgPT4gJ+aXoycsCifwr6OMJyA9PiAn5pu4JywKJ/Cvo40nID0+ICfmmYknLAon8K+jjicgPT4gJ+OsmScsCifwr6OPJyA9PiAn5pqRJywKJ/Cvo5AnID0+ICfjrIgnLAon8K+jkScgPT4gJ+OrpCcsCifwr6OSJyA9PiAn5YaSJywKJ/Cvo5MnID0+ICflhpUnLAon8K+jlCcgPT4gJ+acgCcsCifwr6OVJyA9PiAn5pqcJywKJ/Cvo5YnID0+ICfogq0nLAon8K+jlycgPT4gJ+SPmScsCifwr6OYJyA9PiAn5pyXJywKJ/Cvo5knID0+ICfmnJsnLAon8K+jmicgPT4gJ+acoScsCifwr6ObJyA9PiAn5p2eJywKJ/Cvo5wnID0+ICfmnZMnLAon8K+jnScgPT4gJ/Cjj4MnLAon8K+jnicgPT4gJ+OtiScsCifwr6OfJyA9PiAn5p+6JywKJ/Cvo6AnID0+ICfmnoUnLAon8K+joScgPT4gJ+ahkicsCifwr6OiJyA9PiAn5qKFJywKJ/Cvo6MnID0+ICfwo5GtJywKJ/Cvo6QnID0+ICfmoo4nLAon8K+jpScgPT4gJ+agnycsCifwr6OmJyA9PiAn5qSUJywKJ/Cvo6cnID0+ICfjrp0nLAon8K+jqCcgPT4gJ+algicsCifwr6OpJyA9PiAn5qajJywKJ/Cvo6onID0+ICfmp6onLAon8K+jqycgPT4gJ+aqqCcsCifwr6OsJyA9PiAn8KOaoycsCifwr6OtJyA9PiAn5qubJywKJ/Cvo64nID0+ICfjsJgnLAon8K+jrycgPT4gJ+asoScsCifwr6OwJyA9PiAn8KOipycsCifwr6OxJyA9PiAn5q2UJywKJ/Cvo7InID0+ICfjsY4nLAon8K+jsycgPT4gJ+atsicsCifwr6O0JyA9PiAn5q6fJywKJ/Cvo7UnID0+ICfmrronLAon8K+jticgPT4gJ+auuycsCifwr6O3JyA9PiAn8KOqjScsCifwr6O4JyA9PiAn8KG0iycsCifwr6O5JyA9PiAn8KOruicsCifwr6O6JyA9PiAn5rGOJywKJ/Cvo7snID0+ICfwo7K8JywKJ/Cvo7wnID0+ICfmsr8nLAon8K+jvScgPT4gJ+azjScsCifwr6O+JyA9PiAn5rGnJywKJ/Cvo78nID0+ICfmtJYnLAon8K+kgCcgPT4gJ+a0vicsCifwr6SBJyA9PiAn5rW3JywKJ/CvpIInID0+ICfmtYEnLAon8K+kgycgPT4gJ+a1qScsCifwr6SEJyA9PiAn5rW4JywKJ/CvpIUnID0+ICfmtoUnLAon8K+khicgPT4gJ/CjtJ4nLAon8K+khycgPT4gJ+a0tCcsCifwr6SIJyA9PiAn5rivJywKJ/CvpIknID0+ICfmua4nLAon8K+kiicgPT4gJ+O0sycsCifwr6SLJyA9PiAn5ruLJywKJ/CvpIwnID0+ICfmu4cnLAon8K+kjScgPT4gJ/Cju5EnLAon8K+kjicgPT4gJ+a3uScsCifwr6SPJyA9PiAn5r2uJywKJ/CvpJAnID0+ICfwo72eJywKJ/CvpJEnID0+ICfwo76OJywKJ/CvpJInID0+ICfmv4YnLAon8K+kkycgPT4gJ+eAuScsCifwr6SUJyA9PiAn54CeJywKJ/CvpJUnID0+ICfngJsnLAon8K+klicgPT4gJ+O2licsCifwr6SXJyA9PiAn54GKJywKJ/CvpJgnID0+ICfngb0nLAon8K+kmScgPT4gJ+eBtycsCifwr6SaJyA9PiAn54KtJywKJ/CvpJsnID0+ICfwoJSlJywKJ/CvpJwnID0+ICfnhYUnLAon8K+knScgPT4gJ/CkiaMnLAon8K+knicgPT4gJ+eGnCcsCifwr6SfJyA9PiAn8KSOqycsCifwr6SgJyA9PiAn54ioJywKJ/CvpKEnID0+ICfniLUnLAon8K+koicgPT4gJ+eJkCcsCifwr6SjJyA9PiAn8KSYiCcsCifwr6SkJyA9PiAn54qAJywKJ/CvpKUnID0+ICfnipUnLAon8K+kpicgPT4gJ/CknLUnLAon8K+kpycgPT4gJ/CkoJQnLAon8K+kqCcgPT4gJ+eNuicsCifwr6SpJyA9PiAn546LJywKJ/CvpKonID0+ICfjuqwnLAon8K+kqycgPT4gJ+eOpScsCifwr6SsJyA9PiAn47q4JywKJ/CvpK0nID0+ICfjurgnLAon8K+kricgPT4gJ+eRhycsCifwr6SvJyA9PiAn55GcJywKJ/CvpLAnID0+ICfnkbEnLAon8K+ksScgPT4gJ+eShScsCifwr6SyJyA9PiAn55OKJywKJ/CvpLMnID0+ICfjvJsnLAon8K+ktCcgPT4gJ+eUpCcsCifwr6S1JyA9PiAn8KSwticsCifwr6S2JyA9PiAn55S+JywKJ/CvpLcnID0+ICfwpLKSJywKJ/CvpLgnID0+ICfnlbAnLAon8K+kuScgPT4gJ/Cihp8nLAon8K+kuicgPT4gJ+eYkCcsCifwr6S7JyA9PiAn8KS+oScsCifwr6S8JyA9PiAn8KS+uCcsCifwr6S9JyA9PiAn8KWBhCcsCifwr6S+JyA9PiAn47+8JywKJ/CvpL8nID0+ICfkgIgnLAon8K+lgCcgPT4gJ+ebtCcsCifwr6WBJyA9PiAn8KWDsycsCifwr6WCJyA9PiAn8KWDsicsCifwr6WDJyA9PiAn8KWEmScsCifwr6WEJyA9PiAn8KWEsycsCifwr6WFJyA9PiAn55yeJywKJ/CvpYYnID0+ICfnnJ8nLAon8K+lhycgPT4gJ+ecnycsCifwr6WIJyA9PiAn552KJywKJ/CvpYknID0+ICfkgLknLAon8K+liicgPT4gJ+eeiycsCifwr6WLJyA9PiAn5IGGJywKJ/CvpYwnID0+ICfkgpYnLAon8K+ljScgPT4gJ/ClkJ0nLAon8K+ljicgPT4gJ+ehjicsCifwr6WPJyA9PiAn56KMJywKJ/CvpZAnID0+ICfno4wnLAon8K+lkScgPT4gJ+SDoycsCifwr6WSJyA9PiAn8KWYpicsCifwr6WTJyA9PiAn56WWJywKJ/CvpZQnID0+ICfwpZqaJywKJ/CvpZUnID0+ICfwpZuFJywKJ/CvpZYnID0+ICfnpo8nLAon8K+llycgPT4gJ+enqycsCifwr6WYJyA9PiAn5ISvJywKJ/CvpZknID0+ICfnqYAnLAon8K+lmicgPT4gJ+epiicsCifwr6WbJyA9PiAn56mPJywKJ/CvpZwnID0+ICfwpaW8JywKJ/CvpZ0nID0+ICfwpaqnJywKJ/CvpZ4nID0+ICfwpaqnJywKJ/CvpZ8nID0+ICfnq64nLAon8K+loCcgPT4gJ+SIgicsCifwr6WhJyA9PiAn8KWuqycsCifwr6WiJyA9PiAn56+GJywKJ/CvpaMnID0+ICfnr4knLAon8K+lpCcgPT4gJ+SIpycsCifwr6WlJyA9PiAn8KWygCcsCifwr6WmJyA9PiAn57OSJywKJ/CvpacnID0+ICfkiqAnLAon8K+lqCcgPT4gJ+ezqCcsCifwr6WpJyA9PiAn57OjJywKJ/CvpaonID0+ICfntIAnLAon8K+lqycgPT4gJ/ClvoYnLAon8K+lrCcgPT4gJ+e1oycsCifwr6WtJyA9PiAn5IyBJywKJ/Cvpa4nID0+ICfnt4cnLAon8K+lrycgPT4gJ+e4gicsCifwr6WwJyA9PiAn57mFJywKJ/CvpbEnID0+ICfkjLQnLAon8K+lsicgPT4gJ/CmiKgnLAon8K+lsycgPT4gJ/CmiYcnLAon8K+ltCcgPT4gJ+SNmScsCifwr6W1JyA9PiAn8KaLmScsCifwr6W2JyA9PiAn5726JywKJ/CvpbcnID0+ICfwpoy+JywKJ/CvpbgnID0+ICfnvpUnLAon8K+luScgPT4gJ+e/uicsCifwr6W6JyA9PiAn6ICFJywKJ/CvpbsnID0+ICfwppOaJywKJ/CvpbwnID0+ICfwppSjJywKJ/Cvpb0nID0+ICfogaAnLAon8K+lvicgPT4gJ/CmlqgnLAon8K+lvycgPT4gJ+iBsCcsCifwr6aAJyA9PiAn8KONnycsCifwr6aBJyA9PiAn5I+VJywKJ/CvpoInID0+ICfogrInLAon8K+mgycgPT4gJ+iEgycsCifwr6aEJyA9PiAn5JCLJywKJ/CvpoUnID0+ICfohL4nLAon8K+mhicgPT4gJ+WqtScsCifwr6aHJyA9PiAn8KaepycsCifwr6aIJyA9PiAn8KaetScsCifwr6aJJyA9PiAn8KOOkycsCifwr6aKJyA9PiAn8KOOnCcsCifwr6aLJyA9PiAn6IiBJywKJ/CvpownID0+ICfoiIQnLAon8K+mjScgPT4gJ+i+nicsCifwr6aOJyA9PiAn5JGrJywKJ/Cvpo8nID0+ICfoipEnLAon8K+mkCcgPT4gJ+iKiycsCifwr6aRJyA9PiAn6IqdJywKJ/CvppInID0+ICflirMnLAon8K+mkycgPT4gJ+iKsScsCifwr6aUJyA9PiAn6IqzJywKJ/CvppUnID0+ICfoir0nLAon8K+mlicgPT4gJ+iLpicsCifwr6aXJyA9PiAn8KasvCcsCifwr6aYJyA9PiAn6IulJywKJ/CvppknID0+ICfojJ0nLAon8K+mmicgPT4gJ+iNoycsCifwr6abJyA9PiAn6I6tJywKJ/CvppwnID0+ICfojKMnLAon8K+mnScgPT4gJ+iOvScsCifwr6aeJyA9PiAn6I+nJywKJ/Cvpp8nID0+ICfokZcnLAon8K+moCcgPT4gJ+iNkycsCifwr6ahJyA9PiAn6I+KJywKJ/CvpqInID0+ICfoj4wnLAon8K+moycgPT4gJ+iPnCcsCifwr6akJyA9PiAn8KawticsCifwr6alJyA9PiAn8Ka1qycsCifwr6amJyA9PiAn8KazlScsCifwr6anJyA9PiAn5JSrJywKJ/CvpqgnID0+ICfok7EnLAon8K+mqScgPT4gJ+iTsycsCifwr6aqJyA9PiAn6JSWJywKJ/CvpqsnID0+ICfwp4+KJywKJ/CvpqwnID0+ICfolaQnLAon8K+mrScgPT4gJ/CmvKwnLAon8K+mricgPT4gJ+SVnScsCifwr6avJyA9PiAn5JWhJywKJ/CvprAnID0+ICfwpr6xJywKJ/CvprEnID0+ICfwp4OSJywKJ/CvprInID0+ICfklasnLAon8K+msycgPT4gJ+iZkCcsCifwr6a0JyA9PiAn6JmcJywKJ/CvprUnID0+ICfomacnLAon8K+mticgPT4gJ+iZqScsCifwr6a3JyA9PiAn6JqpJywKJ/CvprgnID0+ICfomognLAon8K+muScgPT4gJ+icjicsCifwr6a6JyA9PiAn6JuiJywKJ/CvprsnID0+ICfonbknLAon8K+mvCcgPT4gJ+icqCcsCifwr6a9JyA9PiAn6J2rJywKJ/Cvpr4nID0+ICfonoYnLAon8K+mvycgPT4gJ+SXlycsCifwr6eAJyA9PiAn6J+hJywKJ/Cvp4EnID0+ICfooIEnLAon8K+ngicgPT4gJ+SXuScsCifwr6eDJyA9PiAn6KGgJywKJ/Cvp4QnID0+ICfooaMnLAon8K+nhScgPT4gJ/CnmacnLAon8K+nhicgPT4gJ+ijlycsCifwr6eHJyA9PiAn6KOeJywKJ/Cvp4gnID0+ICfkmLUnLAon8K+niScgPT4gJ+ijuicsCifwr6eKJyA9PiAn45K7JywKJ/Cvp4snID0+ICfwp6KuJywKJ/Cvp4wnID0+ICfwp6WmJywKJ/Cvp40nID0+ICfkmr4nLAon8K+njicgPT4gJ+SbhycsCifwr6ePJyA9PiAn6KqgJywKJ/Cvp5AnID0+ICfoq60nLAon8K+nkScgPT4gJ+iuiicsCifwr6eSJyA9PiAn6LGVJywKJ/Cvp5MnID0+ICfwp7KoJywKJ/Cvp5QnID0+ICfosqsnLAon8K+nlScgPT4gJ+izgScsCifwr6eWJyA9PiAn6LSbJywKJ/Cvp5cnID0+ICfotbcnLAon8K+nmCcgPT4gJ/CnvK8nLAon8K+nmScgPT4gJ/CgoIQnLAon8K+nmicgPT4gJ+i3iycsCifwr6ebJyA9PiAn6La8JywKJ/Cvp5wnID0+ICfot7AnLAon8K+nnScgPT4gJ/Cgo54nLAon8K+nnicgPT4gJ+i7lCcsCifwr6efJyA9PiAn6Ly4JywKJ/Cvp6AnID0+ICfwqJeSJywKJ/Cvp6EnID0+ICfwqJetJywKJ/Cvp6InID0+ICfpgpQnLAon8K+noycgPT4gJ+mDsScsCifwr6ekJyA9PiAn6YSRJywKJ/Cvp6UnID0+ICfwqJyuJywKJ/Cvp6YnID0+ICfphJsnLAon8K+npycgPT4gJ+mIuCcsCifwr6eoJyA9PiAn6YuXJywKJ/Cvp6knID0+ICfpi5gnLAon8K+nqicgPT4gJ+mJvCcsCifwr6erJyA9PiAn6Y+5JywKJ/Cvp6wnID0+ICfpkJUnLAon8K+nrScgPT4gJ/Cor7onLAon8K+nricgPT4gJ+mWiycsCifwr6evJyA9PiAn5KaVJywKJ/Cvp7AnID0+ICfplrcnLAon8K+nsScgPT4gJ/CotbcnLAon8K+nsicgPT4gJ+SnpicsCifwr6ezJyA9PiAn6ZuDJywKJ/Cvp7QnID0+ICfltrInLAon8K+ntScgPT4gJ+mcoycsCifwr6e2JyA9PiAn8KmFhScsCifwr6e3JyA9PiAn8KmImicsCifwr6e4JyA9PiAn5KmuJywKJ/Cvp7knID0+ICfkqbYnLAon8K+nuicgPT4gJ+mfoCcsCifwr6e7JyA9PiAn8KmQiicsCifwr6e8JyA9PiAn5KqyJywKJ/Cvp70nID0+ICfwqZKWJywKJ/Cvp74nID0+ICfpoIsnLAon8K+nvycgPT4gJ+mgiycsCifwr6iAJyA9PiAn6aCpJywKJ/CvqIEnID0+ICfwqZa2JywKJ/CvqIInID0+ICfpo6InLAon8K+ogycgPT4gJ+SssycsCifwr6iEJyA9PiAn6aSpJywKJ/CvqIUnID0+ICfppqcnLAon8K+ohicgPT4gJ+mngicsCifwr6iHJyA9PiAn6ae+JywKJ/CvqIgnID0+ICfkr44nLAon8K+oiScgPT4gJ/CprLAnLAon8K+oiicgPT4gJ+mskicsCifwr6iLJyA9PiAn6bGAJywKJ/CvqIwnID0+ICfps70nLAon8K+ojScgPT4gJ+SzjicsCifwr6iOJyA9PiAn5LOtJywKJ/CvqI8nID0+ICfptacnLAon8K+okCcgPT4gJ/Cqg44nLAon8K+okScgPT4gJ+SzuCcsCifwr6iSJyA9PiAn8KqEhScsCifwr6iTJyA9PiAn8KqIjicsCifwr6iUJyA9PiAn8KqKkScsCifwr6iVJyA9PiAn6bq7JywKJ/CvqJYnID0+ICfktZYnLAon8K+olycgPT4gJ+m7uScsCifwr6iYJyA9PiAn6bu+JywKJ/CvqJknID0+ICfpvIUnLAon8K+omicgPT4gJ+m8jycsCifwr6ibJyA9PiAn6byWJywKJ/CvqJwnID0+ICfpvLsnLAon8K+onScgPT4gJ/CqmIAnLAopOwo8P3BocAoKcmV0dXJuIGFycmF5ICgKJ8yAJyA9PiAyMzAsCifMgScgPT4gMjMwLAonzIInID0+IDIzMCwKJ8yDJyA9PiAyMzAsCifMhCcgPT4gMjMwLAonzIUnID0+IDIzMCwKJ8yGJyA9PiAyMzAsCifMhycgPT4gMjMwLAonzIgnID0+IDIzMCwKJ8yJJyA9PiAyMzAsCifMiicgPT4gMjMwLAonzIsnID0+IDIzMCwKJ8yMJyA9PiAyMzAsCifMjScgPT4gMjMwLAonzI4nID0+IDIzMCwKJ8yPJyA9PiAyMzAsCifMkCcgPT4gMjMwLAonzJEnID0+IDIzMCwKJ8ySJyA9PiAyMzAsCifMkycgPT4gMjMwLAonzJQnID0+IDIzMCwKJ8yVJyA9PiAyMzIsCifMlicgPT4gMjIwLAonzJcnID0+IDIyMCwKJ8yYJyA9PiAyMjAsCifMmScgPT4gMjIwLAonzJonID0+IDIzMiwKJ8ybJyA9PiAyMTYsCifMnCcgPT4gMjIwLAonzJ0nID0+IDIyMCwKJ8yeJyA9PiAyMjAsCifMnycgPT4gMjIwLAonzKAnID0+IDIyMCwKJ8yhJyA9PiAyMDIsCifMoicgPT4gMjAyLAonzKMnID0+IDIyMCwKJ8ykJyA9PiAyMjAsCifMpScgPT4gMjIwLAonzKYnID0+IDIyMCwKJ8ynJyA9PiAyMDIsCifMqCcgPT4gMjAyLAonzKknID0+IDIyMCwKJ8yqJyA9PiAyMjAsCifMqycgPT4gMjIwLAonzKwnID0+IDIyMCwKJ8ytJyA9PiAyMjAsCifMricgPT4gMjIwLAonzK8nID0+IDIyMCwKJ8ywJyA9PiAyMjAsCifMsScgPT4gMjIwLAonzLInID0+IDIyMCwKJ8yzJyA9PiAyMjAsCifMtCcgPT4gMSwKJ8y1JyA9PiAxLAonzLYnID0+IDEsCifMtycgPT4gMSwKJ8y4JyA9PiAxLAonzLknID0+IDIyMCwKJ8y6JyA9PiAyMjAsCifMuycgPT4gMjIwLAonzLwnID0+IDIyMCwKJ8y9JyA9PiAyMzAsCifMvicgPT4gMjMwLAonzL8nID0+IDIzMCwKJ82AJyA9PiAyMzAsCifNgScgPT4gMjMwLAonzYInID0+IDIzMCwKJ82DJyA9PiAyMzAsCifNhCcgPT4gMjMwLAonzYUnID0+IDI0MCwKJ82GJyA9PiAyMzAsCifNhycgPT4gMjIwLAonzYgnID0+IDIyMCwKJ82JJyA9PiAyMjAsCifNiicgPT4gMjMwLAonzYsnID0+IDIzMCwKJ82MJyA9PiAyMzAsCifNjScgPT4gMjIwLAonzY4nID0+IDIyMCwKJ82QJyA9PiAyMzAsCifNkScgPT4gMjMwLAonzZInID0+IDIzMCwKJ82TJyA9PiAyMjAsCifNlCcgPT4gMjIwLAonzZUnID0+IDIyMCwKJ82WJyA9PiAyMjAsCifNlycgPT4gMjMwLAonzZgnID0+IDIzMiwKJ82ZJyA9PiAyMjAsCifNmicgPT4gMjIwLAonzZsnID0+IDIzMCwKJ82cJyA9PiAyMzMsCifNnScgPT4gMjM0LAonzZ4nID0+IDIzNCwKJ82fJyA9PiAyMzMsCifNoCcgPT4gMjM0LAonzaEnID0+IDIzNCwKJ82iJyA9PiAyMzMsCifNoycgPT4gMjMwLAonzaQnID0+IDIzMCwKJ82lJyA9PiAyMzAsCifNpicgPT4gMjMwLAonzacnID0+IDIzMCwKJ82oJyA9PiAyMzAsCifNqScgPT4gMjMwLAonzaonID0+IDIzMCwKJ82rJyA9PiAyMzAsCifNrCcgPT4gMjMwLAonza0nID0+IDIzMCwKJ82uJyA9PiAyMzAsCifNrycgPT4gMjMwLAon0oMnID0+IDIzMCwKJ9KEJyA9PiAyMzAsCifShScgPT4gMjMwLAon0oYnID0+IDIzMCwKJ9KHJyA9PiAyMzAsCifWkScgPT4gMjIwLAon1pInID0+IDIzMCwKJ9aTJyA9PiAyMzAsCifWlCcgPT4gMjMwLAon1pUnID0+IDIzMCwKJ9aWJyA9PiAyMjAsCifWlycgPT4gMjMwLAon1pgnID0+IDIzMCwKJ9aZJyA9PiAyMzAsCifWmicgPT4gMjIyLAon1psnID0+IDIyMCwKJ9acJyA9PiAyMzAsCifWnScgPT4gMjMwLAon1p4nID0+IDIzMCwKJ9afJyA9PiAyMzAsCifWoCcgPT4gMjMwLAon1qEnID0+IDIzMCwKJ9aiJyA9PiAyMjAsCifWoycgPT4gMjIwLAon1qQnID0+IDIyMCwKJ9alJyA9PiAyMjAsCifWpicgPT4gMjIwLAon1qcnID0+IDIyMCwKJ9aoJyA9PiAyMzAsCifWqScgPT4gMjMwLAon1qonID0+IDIyMCwKJ9arJyA9PiAyMzAsCifWrCcgPT4gMjMwLAon1q0nID0+IDIyMiwKJ9auJyA9PiAyMjgsCifWrycgPT4gMjMwLAon1rAnID0+IDEwLAon1rEnID0+IDExLAon1rInID0+IDEyLAon1rMnID0+IDEzLAon1rQnID0+IDE0LAon1rUnID0+IDE1LAon1rYnID0+IDE2LAon1rcnID0+IDE3LAon1rgnID0+IDE4LAon1rknID0+IDE5LAon1ronID0+IDE5LAon1rsnID0+IDIwLAon1rwnID0+IDIxLAon1r0nID0+IDIyLAon1r8nID0+IDIzLAon14EnID0+IDI0LAon14InID0+IDI1LAon14QnID0+IDIzMCwKJ9eFJyA9PiAyMjAsCifXhycgPT4gMTgsCifYkCcgPT4gMjMwLAon2JEnID0+IDIzMCwKJ9iSJyA9PiAyMzAsCifYkycgPT4gMjMwLAon2JQnID0+IDIzMCwKJ9iVJyA9PiAyMzAsCifYlicgPT4gMjMwLAon2JcnID0+IDIzMCwKJ9iYJyA9PiAzMCwKJ9iZJyA9PiAzMSwKJ9iaJyA9PiAzMiwKJ9mLJyA9PiAyNywKJ9mMJyA9PiAyOCwKJ9mNJyA9PiAyOSwKJ9mOJyA9PiAzMCwKJ9mPJyA9PiAzMSwKJ9mQJyA9PiAzMiwKJ9mRJyA9PiAzMywKJ9mSJyA9PiAzNCwKJ9mTJyA9PiAyMzAsCifZlCcgPT4gMjMwLAon2ZUnID0+IDIyMCwKJ9mWJyA9PiAyMjAsCifZlycgPT4gMjMwLAon2ZgnID0+IDIzMCwKJ9mZJyA9PiAyMzAsCifZmicgPT4gMjMwLAon2ZsnID0+IDIzMCwKJ9mcJyA9PiAyMjAsCifZnScgPT4gMjMwLAon2Z4nID0+IDIzMCwKJ9mfJyA9PiAyMjAsCifZsCcgPT4gMzUsCifblicgPT4gMjMwLAon25cnID0+IDIzMCwKJ9uYJyA9PiAyMzAsCifbmScgPT4gMjMwLAon25onID0+IDIzMCwKJ9ubJyA9PiAyMzAsCifbnCcgPT4gMjMwLAon258nID0+IDIzMCwKJ9ugJyA9PiAyMzAsCifboScgPT4gMjMwLAon26InID0+IDIzMCwKJ9ujJyA9PiAyMjAsCifbpCcgPT4gMjMwLAon26cnID0+IDIzMCwKJ9uoJyA9PiAyMzAsCifbqicgPT4gMjIwLAon26snID0+IDIzMCwKJ9usJyA9PiAyMzAsCifbrScgPT4gMjIwLAon3JEnID0+IDM2LAon3LAnID0+IDIzMCwKJ9yxJyA9PiAyMjAsCifcsicgPT4gMjMwLAon3LMnID0+IDIzMCwKJ9y0JyA9PiAyMjAsCifctScgPT4gMjMwLAon3LYnID0+IDIzMCwKJ9y3JyA9PiAyMjAsCifcuCcgPT4gMjIwLAon3LknID0+IDIyMCwKJ9y6JyA9PiAyMzAsCifcuycgPT4gMjIwLAon3LwnID0+IDIyMCwKJ9y9JyA9PiAyMzAsCifcvicgPT4gMjIwLAon3L8nID0+IDIzMCwKJ92AJyA9PiAyMzAsCifdgScgPT4gMjMwLAon3YInID0+IDIyMCwKJ92DJyA9PiAyMzAsCifdhCcgPT4gMjIwLAon3YUnID0+IDIzMCwKJ92GJyA9PiAyMjAsCifdhycgPT4gMjMwLAon3YgnID0+IDIyMCwKJ92JJyA9PiAyMzAsCifdiicgPT4gMjMwLAon36snID0+IDIzMCwKJ9+sJyA9PiAyMzAsCiffrScgPT4gMjMwLAon364nID0+IDIzMCwKJ9+vJyA9PiAyMzAsCiffsCcgPT4gMjMwLAon37EnID0+IDIzMCwKJ9+yJyA9PiAyMjAsCiffsycgPT4gMjMwLAon370nID0+IDIyMCwKJ+CglicgPT4gMjMwLAon4KCXJyA9PiAyMzAsCifgoJgnID0+IDIzMCwKJ+CgmScgPT4gMjMwLAon4KCbJyA9PiAyMzAsCifgoJwnID0+IDIzMCwKJ+CgnScgPT4gMjMwLAon4KCeJyA9PiAyMzAsCifgoJ8nID0+IDIzMCwKJ+CgoCcgPT4gMjMwLAon4KChJyA9PiAyMzAsCifgoKInID0+IDIzMCwKJ+CgoycgPT4gMjMwLAon4KClJyA9PiAyMzAsCifgoKYnID0+IDIzMCwKJ+CgpycgPT4gMjMwLAon4KCpJyA9PiAyMzAsCifgoKonID0+IDIzMCwKJ+CgqycgPT4gMjMwLAon4KCsJyA9PiAyMzAsCifgoK0nID0+IDIzMCwKJ+ChmScgPT4gMjIwLAon4KGaJyA9PiAyMjAsCifgoZsnID0+IDIyMCwKJ+CjkycgPT4gMjIwLAon4KOUJyA9PiAyMzAsCifgo5UnID0+IDIzMCwKJ+CjlicgPT4gMjMwLAon4KOXJyA9PiAyMzAsCifgo5gnID0+IDIzMCwKJ+CjmScgPT4gMjMwLAon4KOaJyA9PiAyMzAsCifgo5snID0+IDIzMCwKJ+CjnCcgPT4gMjMwLAon4KOdJyA9PiAyMzAsCifgo54nID0+IDIzMCwKJ+CjnycgPT4gMjMwLAon4KOgJyA9PiAyMzAsCifgo6EnID0+IDIzMCwKJ+CjoycgPT4gMjIwLAon4KOkJyA9PiAyMzAsCifgo6UnID0+IDIzMCwKJ+CjpicgPT4gMjIwLAon4KOnJyA9PiAyMzAsCifgo6gnID0+IDIzMCwKJ+CjqScgPT4gMjIwLAon4KOqJyA9PiAyMzAsCifgo6snID0+IDIzMCwKJ+CjrCcgPT4gMjMwLAon4KOtJyA9PiAyMjAsCifgo64nID0+IDIyMCwKJ+CjrycgPT4gMjIwLAon4KOwJyA9PiAyNywKJ+CjsScgPT4gMjgsCifgo7InID0+IDI5LAon4KOzJyA9PiAyMzAsCifgo7QnID0+IDIzMCwKJ+CjtScgPT4gMjMwLAon4KO2JyA9PiAyMjAsCifgo7cnID0+IDIzMCwKJ+CjuCcgPT4gMjMwLAon4KO5JyA9PiAyMjAsCifgo7onID0+IDIyMCwKJ+CjuycgPT4gMjMwLAon4KO8JyA9PiAyMzAsCifgo70nID0+IDIzMCwKJ+CjvicgPT4gMjMwLAon4KO/JyA9PiAyMzAsCifgpLwnID0+IDcsCifgpY0nID0+IDksCifgpZEnID0+IDIzMCwKJ+ClkicgPT4gMjIwLAon4KWTJyA9PiAyMzAsCifgpZQnID0+IDIzMCwKJ+CmvCcgPT4gNywKJ+CnjScgPT4gOSwKJ+CnvicgPT4gMjMwLAon4Ki8JyA9PiA3LAon4KmNJyA9PiA5LAon4Kq8JyA9PiA3LAon4KuNJyA9PiA5LAon4Ky8JyA9PiA3LAon4K2NJyA9PiA5LAon4K+NJyA9PiA5LAon4LGNJyA9PiA5LAon4LGVJyA9PiA4NCwKJ+CxlicgPT4gOTEsCifgsrwnID0+IDcsCifgs40nID0+IDksCifgtLsnID0+IDksCifgtLwnID0+IDksCifgtY0nID0+IDksCifgt4onID0+IDksCifguLgnID0+IDEwMywKJ+C4uScgPT4gMTAzLAon4Li6JyA9PiA5LAon4LmIJyA9PiAxMDcsCifguYknID0+IDEwNywKJ+C5iicgPT4gMTA3LAon4LmLJyA9PiAxMDcsCifgurgnID0+IDExOCwKJ+C6uScgPT4gMTE4LAon4Lq6JyA9PiA5LAon4LuIJyA9PiAxMjIsCifgu4knID0+IDEyMiwKJ+C7iicgPT4gMTIyLAon4LuLJyA9PiAxMjIsCifgvJgnID0+IDIyMCwKJ+C8mScgPT4gMjIwLAon4Ly1JyA9PiAyMjAsCifgvLcnID0+IDIyMCwKJ+C8uScgPT4gMjE2LAon4L2xJyA9PiAxMjksCifgvbInID0+IDEzMCwKJ+C9tCcgPT4gMTMyLAon4L26JyA9PiAxMzAsCifgvbsnID0+IDEzMCwKJ+C9vCcgPT4gMTMwLAon4L29JyA9PiAxMzAsCifgvoAnID0+IDEzMCwKJ+C+gicgPT4gMjMwLAon4L6DJyA9PiAyMzAsCifgvoQnID0+IDksCifgvoYnID0+IDIzMCwKJ+C+hycgPT4gMjMwLAon4L+GJyA9PiAyMjAsCifhgLcnID0+IDcsCifhgLknID0+IDksCifhgLonID0+IDksCifhgo0nID0+IDIyMCwKJ+GNnScgPT4gMjMwLAon4Y2eJyA9PiAyMzAsCifhjZ8nID0+IDIzMCwKJ+GclCcgPT4gOSwKJ+GctCcgPT4gOSwKJ+GfkicgPT4gOSwKJ+GfnScgPT4gMjMwLAon4aKpJyA9PiAyMjgsCifhpLknID0+IDIyMiwKJ+GkuicgPT4gMjMwLAon4aS7JyA9PiAyMjAsCifhqJcnID0+IDIzMCwKJ+GomCcgPT4gMjIwLAon4amgJyA9PiA5LAon4am1JyA9PiAyMzAsCifhqbYnID0+IDIzMCwKJ+GptycgPT4gMjMwLAon4am4JyA9PiAyMzAsCifhqbknID0+IDIzMCwKJ+GpuicgPT4gMjMwLAon4am7JyA9PiAyMzAsCifhqbwnID0+IDIzMCwKJ+GpvycgPT4gMjIwLAon4aqwJyA9PiAyMzAsCifhqrEnID0+IDIzMCwKJ+GqsicgPT4gMjMwLAon4aqzJyA9PiAyMzAsCifhqrQnID0+IDIzMCwKJ+GqtScgPT4gMjIwLAon4aq2JyA9PiAyMjAsCifhqrcnID0+IDIyMCwKJ+GquCcgPT4gMjIwLAon4aq5JyA9PiAyMjAsCifhqronID0+IDIyMCwKJ+GquycgPT4gMjMwLAon4aq8JyA9PiAyMzAsCifhqr0nID0+IDIyMCwKJ+GqvycgPT4gMjIwLAon4auAJyA9PiAyMjAsCifhrLQnID0+IDcsCifhrYQnID0+IDksCifhrasnID0+IDIzMCwKJ+GtrCcgPT4gMjIwLAon4a2tJyA9PiAyMzAsCifhra4nID0+IDIzMCwKJ+GtrycgPT4gMjMwLAon4a2wJyA9PiAyMzAsCifhrbEnID0+IDIzMCwKJ+GtsicgPT4gMjMwLAon4a2zJyA9PiAyMzAsCifhrqonID0+IDksCifhrqsnID0+IDksCifhr6YnID0+IDcsCifhr7InID0+IDksCifhr7MnID0+IDksCifhsLcnID0+IDcsCifhs5AnID0+IDIzMCwKJ+GzkScgPT4gMjMwLAon4bOSJyA9PiAyMzAsCifhs5QnID0+IDEsCifhs5UnID0+IDIyMCwKJ+GzlicgPT4gMjIwLAon4bOXJyA9PiAyMjAsCifhs5gnID0+IDIyMCwKJ+GzmScgPT4gMjIwLAon4bOaJyA9PiAyMzAsCifhs5snID0+IDIzMCwKJ+GznCcgPT4gMjIwLAon4bOdJyA9PiAyMjAsCifhs54nID0+IDIyMCwKJ+GznycgPT4gMjIwLAon4bOgJyA9PiAyMzAsCifhs6InID0+IDEsCifhs6MnID0+IDEsCifhs6QnID0+IDEsCifhs6UnID0+IDEsCifhs6YnID0+IDEsCifhs6cnID0+IDEsCifhs6gnID0+IDEsCifhs60nID0+IDIyMCwKJ+GztCcgPT4gMjMwLAon4bO4JyA9PiAyMzAsCifhs7knID0+IDIzMCwKJ+G3gCcgPT4gMjMwLAon4beBJyA9PiAyMzAsCifht4InID0+IDIyMCwKJ+G3gycgPT4gMjMwLAon4beEJyA9PiAyMzAsCifht4UnID0+IDIzMCwKJ+G3hicgPT4gMjMwLAon4beHJyA9PiAyMzAsCifht4gnID0+IDIzMCwKJ+G3iScgPT4gMjMwLAon4beKJyA9PiAyMjAsCifht4snID0+IDIzMCwKJ+G3jCcgPT4gMjMwLAon4beNJyA9PiAyMzQsCifht44nID0+IDIxNCwKJ+G3jycgPT4gMjIwLAon4beQJyA9PiAyMDIsCifht5EnID0+IDIzMCwKJ+G3kicgPT4gMjMwLAon4beTJyA9PiAyMzAsCifht5QnID0+IDIzMCwKJ+G3lScgPT4gMjMwLAon4beWJyA9PiAyMzAsCifht5cnID0+IDIzMCwKJ+G3mCcgPT4gMjMwLAon4beZJyA9PiAyMzAsCifht5onID0+IDIzMCwKJ+G3mycgPT4gMjMwLAon4becJyA9PiAyMzAsCifht50nID0+IDIzMCwKJ+G3nicgPT4gMjMwLAon4befJyA9PiAyMzAsCifht6AnID0+IDIzMCwKJ+G3oScgPT4gMjMwLAon4beiJyA9PiAyMzAsCifht6MnID0+IDIzMCwKJ+G3pCcgPT4gMjMwLAon4belJyA9PiAyMzAsCifht6YnID0+IDIzMCwKJ+G3pycgPT4gMjMwLAon4beoJyA9PiAyMzAsCifht6knID0+IDIzMCwKJ+G3qicgPT4gMjMwLAon4berJyA9PiAyMzAsCifht6wnID0+IDIzMCwKJ+G3rScgPT4gMjMwLAon4beuJyA9PiAyMzAsCifht68nID0+IDIzMCwKJ+G3sCcgPT4gMjMwLAon4bexJyA9PiAyMzAsCifht7InID0+IDIzMCwKJ+G3sycgPT4gMjMwLAon4be0JyA9PiAyMzAsCifht7UnID0+IDIzMCwKJ+G3ticgPT4gMjMyLAon4be3JyA9PiAyMjgsCifht7gnID0+IDIyOCwKJ+G3uScgPT4gMjIwLAon4be7JyA9PiAyMzAsCifht7wnID0+IDIzMywKJ+G3vScgPT4gMjIwLAon4be+JyA9PiAyMzAsCifht78nID0+IDIyMCwKJ+KDkCcgPT4gMjMwLAon4oORJyA9PiAyMzAsCifig5InID0+IDEsCifig5MnID0+IDEsCifig5QnID0+IDIzMCwKJ+KDlScgPT4gMjMwLAon4oOWJyA9PiAyMzAsCifig5cnID0+IDIzMCwKJ+KDmCcgPT4gMSwKJ+KDmScgPT4gMSwKJ+KDmicgPT4gMSwKJ+KDmycgPT4gMjMwLAon4oOcJyA9PiAyMzAsCifig6EnID0+IDIzMCwKJ+KDpScgPT4gMSwKJ+KDpicgPT4gMSwKJ+KDpycgPT4gMjMwLAon4oOoJyA9PiAyMjAsCifig6knID0+IDIzMCwKJ+KDqicgPT4gMSwKJ+KDqycgPT4gMSwKJ+KDrCcgPT4gMjIwLAon4oOtJyA9PiAyMjAsCifig64nID0+IDIyMCwKJ+KDrycgPT4gMjIwLAon4oOwJyA9PiAyMzAsCifis68nID0+IDIzMCwKJ+KzsCcgPT4gMjMwLAon4rOxJyA9PiAyMzAsCifitb8nID0+IDksCifit6AnID0+IDIzMCwKJ+K3oScgPT4gMjMwLAon4reiJyA9PiAyMzAsCifit6MnID0+IDIzMCwKJ+K3pCcgPT4gMjMwLAon4relJyA9PiAyMzAsCifit6YnID0+IDIzMCwKJ+K3pycgPT4gMjMwLAon4reoJyA9PiAyMzAsCifit6knID0+IDIzMCwKJ+K3qicgPT4gMjMwLAon4rerJyA9PiAyMzAsCifit6wnID0+IDIzMCwKJ+K3rScgPT4gMjMwLAon4reuJyA9PiAyMzAsCifit68nID0+IDIzMCwKJ+K3sCcgPT4gMjMwLAon4rexJyA9PiAyMzAsCifit7InID0+IDIzMCwKJ+K3sycgPT4gMjMwLAon4re0JyA9PiAyMzAsCifit7UnID0+IDIzMCwKJ+K3ticgPT4gMjMwLAon4re3JyA9PiAyMzAsCifit7gnID0+IDIzMCwKJ+K3uScgPT4gMjMwLAon4re6JyA9PiAyMzAsCifit7snID0+IDIzMCwKJ+K3vCcgPT4gMjMwLAon4re9JyA9PiAyMzAsCifit74nID0+IDIzMCwKJ+K3vycgPT4gMjMwLAon44CqJyA9PiAyMTgsCifjgKsnID0+IDIyOCwKJ+OArCcgPT4gMjMyLAon44CtJyA9PiAyMjIsCifjgK4nID0+IDIyNCwKJ+OArycgPT4gMjI0LAon44KZJyA9PiA4LAon44KaJyA9PiA4LAon6pmvJyA9PiAyMzAsCifqmbQnID0+IDIzMCwKJ+qZtScgPT4gMjMwLAon6pm2JyA9PiAyMzAsCifqmbcnID0+IDIzMCwKJ+qZuCcgPT4gMjMwLAon6pm5JyA9PiAyMzAsCifqmbonID0+IDIzMCwKJ+qZuycgPT4gMjMwLAon6pm8JyA9PiAyMzAsCifqmb0nID0+IDIzMCwKJ+qanicgPT4gMjMwLAon6pqfJyA9PiAyMzAsCifqm7AnID0+IDIzMCwKJ+qbsScgPT4gMjMwLAon6qCGJyA9PiA5LAon6qCsJyA9PiA5LAon6qOEJyA9PiA5LAon6qOgJyA9PiAyMzAsCifqo6EnID0+IDIzMCwKJ+qjoicgPT4gMjMwLAon6qOjJyA9PiAyMzAsCifqo6QnID0+IDIzMCwKJ+qjpScgPT4gMjMwLAon6qOmJyA9PiAyMzAsCifqo6cnID0+IDIzMCwKJ+qjqCcgPT4gMjMwLAon6qOpJyA9PiAyMzAsCifqo6onID0+IDIzMCwKJ+qjqycgPT4gMjMwLAon6qOsJyA9PiAyMzAsCifqo60nID0+IDIzMCwKJ+qjricgPT4gMjMwLAon6qOvJyA9PiAyMzAsCifqo7AnID0+IDIzMCwKJ+qjsScgPT4gMjMwLAon6qSrJyA9PiAyMjAsCifqpKwnID0+IDIyMCwKJ+qkrScgPT4gMjIwLAon6qWTJyA9PiA5LAon6qazJyA9PiA3LAon6qeAJyA9PiA5LAon6qqwJyA9PiAyMzAsCifqqrInID0+IDIzMCwKJ+qqsycgPT4gMjMwLAon6qq0JyA9PiAyMjAsCifqqrcnID0+IDIzMCwKJ+qquCcgPT4gMjMwLAon6qq+JyA9PiAyMzAsCifqqr8nID0+IDIzMCwKJ+qrgScgPT4gMjMwLAon6qu2JyA9PiA5LAon6q+tJyA9PiA5LAon76yeJyA9PiAyNiwKJ++4oCcgPT4gMjMwLAon77ihJyA9PiAyMzAsCifvuKInID0+IDIzMCwKJ++4oycgPT4gMjMwLAon77ikJyA9PiAyMzAsCifvuKUnID0+IDIzMCwKJ++4picgPT4gMjMwLAon77inJyA9PiAyMjAsCifvuKgnID0+IDIyMCwKJ++4qScgPT4gMjIwLAon77iqJyA9PiAyMjAsCifvuKsnID0+IDIyMCwKJ++4rCcgPT4gMjIwLAon77itJyA9PiAyMjAsCifvuK4nID0+IDIzMCwKJ++4rycgPT4gMjMwLAon8JCHvScgPT4gMjIwLAon8JCLoCcgPT4gMjIwLAon8JCNticgPT4gMjMwLAon8JCNtycgPT4gMjMwLAon8JCNuCcgPT4gMjMwLAon8JCNuScgPT4gMjMwLAon8JCNuicgPT4gMjMwLAon8JCojScgPT4gMjIwLAon8JCojycgPT4gMjMwLAon8JCouCcgPT4gMjMwLAon8JCouScgPT4gMSwKJ/CQqLonID0+IDIyMCwKJ/CQqL8nID0+IDksCifwkKulJyA9PiAyMzAsCifwkKumJyA9PiAyMjAsCifwkLSkJyA9PiAyMzAsCifwkLSlJyA9PiAyMzAsCifwkLSmJyA9PiAyMzAsCifwkLSnJyA9PiAyMzAsCifwkLqrJyA9PiAyMzAsCifwkLqsJyA9PiAyMzAsCifwkL2GJyA9PiAyMjAsCifwkL2HJyA9PiAyMjAsCifwkL2IJyA9PiAyMzAsCifwkL2JJyA9PiAyMzAsCifwkL2KJyA9PiAyMzAsCifwkL2LJyA9PiAyMjAsCifwkL2MJyA9PiAyMzAsCifwkL2NJyA9PiAyMjAsCifwkL2OJyA9PiAyMjAsCifwkL2PJyA9PiAyMjAsCifwkL2QJyA9PiAyMjAsCifwkYGGJyA9PiA5LAon8JGBvycgPT4gOSwKJ/CRgrknID0+IDksCifwkYK6JyA9PiA3LAon8JGEgCcgPT4gMjMwLAon8JGEgScgPT4gMjMwLAon8JGEgicgPT4gMjMwLAon8JGEsycgPT4gOSwKJ/CRhLQnID0+IDksCifwkYWzJyA9PiA3LAon8JGHgCcgPT4gOSwKJ/CRh4onID0+IDcsCifwkYi1JyA9PiA5LAon8JGIticgPT4gNywKJ/CRi6knID0+IDcsCifwkYuqJyA9PiA5LAon8JGMuycgPT4gNywKJ/CRjLwnID0+IDcsCifwkY2NJyA9PiA5LAon8JGNpicgPT4gMjMwLAon8JGNpycgPT4gMjMwLAon8JGNqCcgPT4gMjMwLAon8JGNqScgPT4gMjMwLAon8JGNqicgPT4gMjMwLAon8JGNqycgPT4gMjMwLAon8JGNrCcgPT4gMjMwLAon8JGNsCcgPT4gMjMwLAon8JGNsScgPT4gMjMwLAon8JGNsicgPT4gMjMwLAon8JGNsycgPT4gMjMwLAon8JGNtCcgPT4gMjMwLAon8JGRgicgPT4gOSwKJ/CRkYYnID0+IDcsCifwkZGeJyA9PiAyMzAsCifwkZOCJyA9PiA5LAon8JGTgycgPT4gNywKJ/CRlr8nID0+IDksCifwkZeAJyA9PiA3LAon8JGYvycgPT4gOSwKJ/CRmrYnID0+IDksCifwkZq3JyA9PiA3LAon8JGcqycgPT4gOSwKJ/CRoLknID0+IDksCifwkaC6JyA9PiA3LAon8JGkvScgPT4gOSwKJ/CRpL4nID0+IDksCifwkaWDJyA9PiA3LAon8JGnoCcgPT4gOSwKJ/CRqLQnID0+IDksCifwkamHJyA9PiA5LAon8JGqmScgPT4gOSwKJ/CRsL8nID0+IDksCifwkbWCJyA9PiA3LAon8JG1hCcgPT4gOSwKJ/CRtYUnID0+IDksCifwkbaXJyA9PiA5LAon8JarsCcgPT4gMSwKJ/CWq7EnID0+IDEsCifwlquyJyA9PiAxLAon8JarsycgPT4gMSwKJ/CWq7QnID0+IDEsCifwlqywJyA9PiAyMzAsCifwlqyxJyA9PiAyMzAsCifwlqyyJyA9PiAyMzAsCifwlqyzJyA9PiAyMzAsCifwlqy0JyA9PiAyMzAsCifwlqy1JyA9PiAyMzAsCifwlqy2JyA9PiAyMzAsCifwlr+wJyA9PiA2LAon8Ja/sScgPT4gNiwKJ/Cbsp4nID0+IDEsCifwnYWlJyA9PiAyMTYsCifwnYWmJyA9PiAyMTYsCifwnYWnJyA9PiAxLAon8J2FqCcgPT4gMSwKJ/CdhaknID0+IDEsCifwnYWtJyA9PiAyMjYsCifwnYWuJyA9PiAyMTYsCifwnYWvJyA9PiAyMTYsCifwnYWwJyA9PiAyMTYsCifwnYWxJyA9PiAyMTYsCifwnYWyJyA9PiAyMTYsCifwnYW7JyA9PiAyMjAsCifwnYW8JyA9PiAyMjAsCifwnYW9JyA9PiAyMjAsCifwnYW+JyA9PiAyMjAsCifwnYW/JyA9PiAyMjAsCifwnYaAJyA9PiAyMjAsCifwnYaBJyA9PiAyMjAsCifwnYaCJyA9PiAyMjAsCifwnYaFJyA9PiAyMzAsCifwnYaGJyA9PiAyMzAsCifwnYaHJyA9PiAyMzAsCifwnYaIJyA9PiAyMzAsCifwnYaJJyA9PiAyMzAsCifwnYaKJyA9PiAyMjAsCifwnYaLJyA9PiAyMjAsCifwnYaqJyA9PiAyMzAsCifwnYarJyA9PiAyMzAsCifwnYasJyA9PiAyMzAsCifwnYatJyA9PiAyMzAsCifwnYmCJyA9PiAyMzAsCifwnYmDJyA9PiAyMzAsCifwnYmEJyA9PiAyMzAsCifwnoCAJyA9PiAyMzAsCifwnoCBJyA9PiAyMzAsCifwnoCCJyA9PiAyMzAsCifwnoCDJyA9PiAyMzAsCifwnoCEJyA9PiAyMzAsCifwnoCFJyA9PiAyMzAsCifwnoCGJyA9PiAyMzAsCifwnoCIJyA9PiAyMzAsCifwnoCJJyA9PiAyMzAsCifwnoCKJyA9PiAyMzAsCifwnoCLJyA9PiAyMzAsCifwnoCMJyA9PiAyMzAsCifwnoCNJyA9PiAyMzAsCifwnoCOJyA9PiAyMzAsCifwnoCPJyA9PiAyMzAsCifwnoCQJyA9PiAyMzAsCifwnoCRJyA9PiAyMzAsCifwnoCSJyA9PiAyMzAsCifwnoCTJyA9PiAyMzAsCifwnoCUJyA9PiAyMzAsCifwnoCVJyA9PiAyMzAsCifwnoCWJyA9PiAyMzAsCifwnoCXJyA9PiAyMzAsCifwnoCYJyA9PiAyMzAsCifwnoCbJyA9PiAyMzAsCifwnoCcJyA9PiAyMzAsCifwnoCdJyA9PiAyMzAsCifwnoCeJyA9PiAyMzAsCifwnoCfJyA9PiAyMzAsCifwnoCgJyA9PiAyMzAsCifwnoChJyA9PiAyMzAsCifwnoCjJyA9PiAyMzAsCifwnoCkJyA9PiAyMzAsCifwnoCmJyA9PiAyMzAsCifwnoCnJyA9PiAyMzAsCifwnoCoJyA9PiAyMzAsCifwnoCpJyA9PiAyMzAsCifwnoCqJyA9PiAyMzAsCifwnoSwJyA9PiAyMzAsCifwnoSxJyA9PiAyMzAsCifwnoSyJyA9PiAyMzAsCifwnoSzJyA9PiAyMzAsCifwnoS0JyA9PiAyMzAsCifwnoS1JyA9PiAyMzAsCifwnoS2JyA9PiAyMzAsCifwnousJyA9PiAyMzAsCifwnoutJyA9PiAyMzAsCifwnouuJyA9PiAyMzAsCifwnouvJyA9PiAyMzAsCifwnqOQJyA9PiAyMjAsCifwnqORJyA9PiAyMjAsCifwnqOSJyA9PiAyMjAsCifwnqOTJyA9PiAyMjAsCifwnqOUJyA9PiAyMjAsCifwnqOVJyA9PiAyMjAsCifwnqOWJyA9PiAyMjAsCifwnqWEJyA9PiAyMzAsCifwnqWFJyA9PiAyMzAsCifwnqWGJyA9PiAyMzAsCifwnqWHJyA9PiAyMzAsCifwnqWIJyA9PiAyMzAsCifwnqWJJyA9PiAyMzAsCifwnqWKJyA9PiA3LAopOwo8P3BocAoKcmV0dXJuIGFycmF5ICgKJ8KgJyA9PiAnICcsCifCqCcgPT4gJyDMiCcsCifCqicgPT4gJ2EnLAonwq8nID0+ICcgzIQnLAonwrInID0+ICcyJywKJ8KzJyA9PiAnMycsCifCtCcgPT4gJyDMgScsCifCtScgPT4gJ868JywKJ8K4JyA9PiAnIMynJywKJ8K5JyA9PiAnMScsCifCuicgPT4gJ28nLAonwrwnID0+ICcx4oGENCcsCifCvScgPT4gJzHigYQyJywKJ8K+JyA9PiAnM+KBhDQnLAonxLInID0+ICdJSicsCifEsycgPT4gJ2lqJywKJ8S/JyA9PiAnTMK3JywKJ8WAJyA9PiAnbMK3JywKJ8WJJyA9PiAnyrxuJywKJ8W/JyA9PiAncycsCifHhCcgPT4gJ0RazIwnLAonx4UnID0+ICdEesyMJywKJ8eGJyA9PiAnZHrMjCcsCifHhycgPT4gJ0xKJywKJ8eIJyA9PiAnTGonLAonx4knID0+ICdsaicsCifHiicgPT4gJ05KJywKJ8eLJyA9PiAnTmonLAonx4wnID0+ICduaicsCifHsScgPT4gJ0RaJywKJ8eyJyA9PiAnRHonLAonx7MnID0+ICdkeicsCifKsCcgPT4gJ2gnLAonyrEnID0+ICfJpicsCifKsicgPT4gJ2onLAonyrMnID0+ICdyJywKJ8q0JyA9PiAnybknLAonyrUnID0+ICfJuycsCifKticgPT4gJ8qBJywKJ8q3JyA9PiAndycsCifKuCcgPT4gJ3knLAony5gnID0+ICcgzIYnLAony5knID0+ICcgzIcnLAony5onID0+ICcgzIonLAony5snID0+ICcgzKgnLAony5wnID0+ICcgzIMnLAony50nID0+ICcgzIsnLAony6AnID0+ICfJoycsCifLoScgPT4gJ2wnLAony6InID0+ICdzJywKJ8ujJyA9PiAneCcsCifLpCcgPT4gJ8qVJywKJ826JyA9PiAnIM2FJywKJ86EJyA9PiAnIMyBJywKJ86FJyA9PiAnIMyIzIEnLAonz5AnID0+ICfOsicsCifPkScgPT4gJ864JywKJ8+SJyA9PiAnzqUnLAonz5MnID0+ICfOpcyBJywKJ8+UJyA9PiAnzqXMiCcsCifPlScgPT4gJ8+GJywKJ8+WJyA9PiAnz4AnLAonz7AnID0+ICfOuicsCifPsScgPT4gJ8+BJywKJ8+yJyA9PiAnz4InLAonz7QnID0+ICfOmCcsCifPtScgPT4gJ861JywKJ8+5JyA9PiAnzqMnLAon1ocnID0+ICfVpdaCJywKJ9m1JyA9PiAn2KfZtCcsCifZticgPT4gJ9mI2bQnLAon2bcnID0+ICfbh9m0JywKJ9m4JyA9PiAn2YrZtCcsCifguLMnID0+ICfguY3guLInLAon4LqzJyA9PiAn4LuN4LqyJywKJ+C7nCcgPT4gJ+C6q+C6mScsCifgu50nID0+ICfguqvguqEnLAon4LyMJyA9PiAn4LyLJywKJ+C9tycgPT4gJ+C+suC9seC+gCcsCifgvbknID0+ICfgvrPgvbHgvoAnLAon4YO8JyA9PiAn4YOcJywKJ+G0rCcgPT4gJ0EnLAon4bStJyA9PiAnw4YnLAon4bSuJyA9PiAnQicsCifhtLAnID0+ICdEJywKJ+G0sScgPT4gJ0UnLAon4bSyJyA9PiAnxo4nLAon4bSzJyA9PiAnRycsCifhtLQnID0+ICdIJywKJ+G0tScgPT4gJ0knLAon4bS2JyA9PiAnSicsCifhtLcnID0+ICdLJywKJ+G0uCcgPT4gJ0wnLAon4bS5JyA9PiAnTScsCifhtLonID0+ICdOJywKJ+G0vCcgPT4gJ08nLAon4bS9JyA9PiAnyKInLAon4bS+JyA9PiAnUCcsCifhtL8nID0+ICdSJywKJ+G1gCcgPT4gJ1QnLAon4bWBJyA9PiAnVScsCifhtYInID0+ICdXJywKJ+G1gycgPT4gJ2EnLAon4bWEJyA9PiAnyZAnLAon4bWFJyA9PiAnyZEnLAon4bWGJyA9PiAn4bSCJywKJ+G1hycgPT4gJ2InLAon4bWIJyA9PiAnZCcsCifhtYknID0+ICdlJywKJ+G1iicgPT4gJ8mZJywKJ+G1iycgPT4gJ8mbJywKJ+G1jCcgPT4gJ8mcJywKJ+G1jScgPT4gJ2cnLAon4bWPJyA9PiAnaycsCifhtZAnID0+ICdtJywKJ+G1kScgPT4gJ8WLJywKJ+G1kicgPT4gJ28nLAon4bWTJyA9PiAnyZQnLAon4bWUJyA9PiAn4bSWJywKJ+G1lScgPT4gJ+G0lycsCifhtZYnID0+ICdwJywKJ+G1lycgPT4gJ3QnLAon4bWYJyA9PiAndScsCifhtZknID0+ICfhtJ0nLAon4bWaJyA9PiAnya8nLAon4bWbJyA9PiAndicsCifhtZwnID0+ICfhtKUnLAon4bWdJyA9PiAnzrInLAon4bWeJyA9PiAnzrMnLAon4bWfJyA9PiAnzrQnLAon4bWgJyA9PiAnz4YnLAon4bWhJyA9PiAnz4cnLAon4bWiJyA9PiAnaScsCifhtaMnID0+ICdyJywKJ+G1pCcgPT4gJ3UnLAon4bWlJyA9PiAndicsCifhtaYnID0+ICfOsicsCifhtacnID0+ICfOsycsCifhtagnID0+ICfPgScsCifhtaknID0+ICfPhicsCifhtaonID0+ICfPhycsCifhtbgnID0+ICfQvScsCifhtpsnID0+ICfJkicsCifhtpwnID0+ICdjJywKJ+G2nScgPT4gJ8mVJywKJ+G2nicgPT4gJ8OwJywKJ+G2nycgPT4gJ8mcJywKJ+G2oCcgPT4gJ2YnLAon4bahJyA9PiAnyZ8nLAon4baiJyA9PiAnyaEnLAon4bajJyA9PiAnyaUnLAon4bakJyA9PiAnyagnLAon4balJyA9PiAnyaknLAon4bamJyA9PiAnyaonLAon4banJyA9PiAn4bW7JywKJ+G2qCcgPT4gJ8qdJywKJ+G2qScgPT4gJ8mtJywKJ+G2qicgPT4gJ+G2hScsCifhtqsnID0+ICfKnycsCifhtqwnID0+ICfJsScsCifhtq0nID0+ICfJsCcsCifhtq4nID0+ICfJsicsCifhtq8nID0+ICfJsycsCifhtrAnID0+ICfJtCcsCifhtrEnID0+ICfJtScsCifhtrInID0+ICfJuCcsCifhtrMnID0+ICfKgicsCifhtrQnID0+ICfKgycsCifhtrUnID0+ICfGqycsCifhtrYnID0+ICfKiScsCifhtrcnID0+ICfKiicsCifhtrgnID0+ICfhtJwnLAon4ba5JyA9PiAnyosnLAon4ba6JyA9PiAnyownLAon4ba7JyA9PiAneicsCifhtrwnID0+ICfKkCcsCifhtr0nID0+ICfKkScsCifhtr4nID0+ICfKkicsCifhtr8nID0+ICfOuCcsCifhuponID0+ICdhyr4nLAon4bqbJyA9PiAnc8yHJywKJ+G+vScgPT4gJyDMkycsCifhvr8nID0+ICcgzJMnLAon4b+AJyA9PiAnIM2CJywKJ+G/gScgPT4gJyDMiM2CJywKJ+G/jScgPT4gJyDMk8yAJywKJ+G/jicgPT4gJyDMk8yBJywKJ+G/jycgPT4gJyDMk82CJywKJ+G/nScgPT4gJyDMlMyAJywKJ+G/nicgPT4gJyDMlMyBJywKJ+G/nycgPT4gJyDMlM2CJywKJ+G/rScgPT4gJyDMiMyAJywKJ+G/ricgPT4gJyDMiMyBJywKJ+G/vScgPT4gJyDMgScsCifhv74nID0+ICcgzJQnLAon4oCAJyA9PiAnICcsCifigIEnID0+ICcgJywKJ+KAgicgPT4gJyAnLAon4oCDJyA9PiAnICcsCifigIQnID0+ICcgJywKJ+KAhScgPT4gJyAnLAon4oCGJyA9PiAnICcsCifigIcnID0+ICcgJywKJ+KAiCcgPT4gJyAnLAon4oCJJyA9PiAnICcsCifigIonID0+ICcgJywKJ+KAkScgPT4gJ+KAkCcsCifigJcnID0+ICcgzLMnLAon4oCkJyA9PiAnLicsCifigKUnID0+ICcuLicsCifigKYnID0+ICcuLi4nLAon4oCvJyA9PiAnICcsCifigLMnID0+ICfigLLigLInLAon4oC0JyA9PiAn4oCy4oCy4oCyJywKJ+KAticgPT4gJ+KAteKAtScsCifigLcnID0+ICfigLXigLXigLUnLAon4oC8JyA9PiAnISEnLAon4oC+JyA9PiAnIMyFJywKJ+KBhycgPT4gJz8/JywKJ+KBiCcgPT4gJz8hJywKJ+KBiScgPT4gJyE/JywKJ+KBlycgPT4gJ+KAsuKAsuKAsuKAsicsCifigZ8nID0+ICcgJywKJ+KBsCcgPT4gJzAnLAon4oGxJyA9PiAnaScsCifigbQnID0+ICc0JywKJ+KBtScgPT4gJzUnLAon4oG2JyA9PiAnNicsCifigbcnID0+ICc3JywKJ+KBuCcgPT4gJzgnLAon4oG5JyA9PiAnOScsCifigbonID0+ICcrJywKJ+KBuycgPT4gJ+KIkicsCifigbwnID0+ICc9JywKJ+KBvScgPT4gJygnLAon4oG+JyA9PiAnKScsCifigb8nID0+ICduJywKJ+KCgCcgPT4gJzAnLAon4oKBJyA9PiAnMScsCifigoInID0+ICcyJywKJ+KCgycgPT4gJzMnLAon4oKEJyA9PiAnNCcsCifigoUnID0+ICc1JywKJ+KChicgPT4gJzYnLAon4oKHJyA9PiAnNycsCifigognID0+ICc4JywKJ+KCiScgPT4gJzknLAon4oKKJyA9PiAnKycsCifigosnID0+ICfiiJInLAon4oKMJyA9PiAnPScsCifigo0nID0+ICcoJywKJ+KCjicgPT4gJyknLAon4oKQJyA9PiAnYScsCifigpEnID0+ICdlJywKJ+KCkicgPT4gJ28nLAon4oKTJyA9PiAneCcsCifigpQnID0+ICfJmScsCifigpUnID0+ICdoJywKJ+KClicgPT4gJ2snLAon4oKXJyA9PiAnbCcsCifigpgnID0+ICdtJywKJ+KCmScgPT4gJ24nLAon4oKaJyA9PiAncCcsCifigpsnID0+ICdzJywKJ+KCnCcgPT4gJ3QnLAon4oKoJyA9PiAnUnMnLAon4oSAJyA9PiAnYS9jJywKJ+KEgScgPT4gJ2EvcycsCifihIInID0+ICdDJywKJ+KEgycgPT4gJ8KwQycsCifihIUnID0+ICdjL28nLAon4oSGJyA9PiAnYy91JywKJ+KEhycgPT4gJ8aQJywKJ+KEiScgPT4gJ8KwRicsCifihIonID0+ICdnJywKJ+KEiycgPT4gJ0gnLAon4oSMJyA9PiAnSCcsCifihI0nID0+ICdIJywKJ+KEjicgPT4gJ2gnLAon4oSPJyA9PiAnxKcnLAon4oSQJyA9PiAnSScsCifihJEnID0+ICdJJywKJ+KEkicgPT4gJ0wnLAon4oSTJyA9PiAnbCcsCifihJUnID0+ICdOJywKJ+KElicgPT4gJ05vJywKJ+KEmScgPT4gJ1AnLAon4oSaJyA9PiAnUScsCifihJsnID0+ICdSJywKJ+KEnCcgPT4gJ1InLAon4oSdJyA9PiAnUicsCifihKAnID0+ICdTTScsCifihKEnID0+ICdURUwnLAon4oSiJyA9PiAnVE0nLAon4oSkJyA9PiAnWicsCifihKgnID0+ICdaJywKJ+KErCcgPT4gJ0InLAon4oStJyA9PiAnQycsCifihK8nID0+ICdlJywKJ+KEsCcgPT4gJ0UnLAon4oSxJyA9PiAnRicsCifihLMnID0+ICdNJywKJ+KEtCcgPT4gJ28nLAon4oS1JyA9PiAn15AnLAon4oS2JyA9PiAn15EnLAon4oS3JyA9PiAn15InLAon4oS4JyA9PiAn15MnLAon4oS5JyA9PiAnaScsCifihLsnID0+ICdGQVgnLAon4oS8JyA9PiAnz4AnLAon4oS9JyA9PiAnzrMnLAon4oS+JyA9PiAnzpMnLAon4oS/JyA9PiAnzqAnLAon4oWAJyA9PiAn4oiRJywKJ+KFhScgPT4gJ0QnLAon4oWGJyA9PiAnZCcsCifihYcnID0+ICdlJywKJ+KFiCcgPT4gJ2knLAon4oWJJyA9PiAnaicsCifihZAnID0+ICcx4oGENycsCifihZEnID0+ICcx4oGEOScsCifihZInID0+ICcx4oGEMTAnLAon4oWTJyA9PiAnMeKBhDMnLAon4oWUJyA9PiAnMuKBhDMnLAon4oWVJyA9PiAnMeKBhDUnLAon4oWWJyA9PiAnMuKBhDUnLAon4oWXJyA9PiAnM+KBhDUnLAon4oWYJyA9PiAnNOKBhDUnLAon4oWZJyA9PiAnMeKBhDYnLAon4oWaJyA9PiAnNeKBhDYnLAon4oWbJyA9PiAnMeKBhDgnLAon4oWcJyA9PiAnM+KBhDgnLAon4oWdJyA9PiAnNeKBhDgnLAon4oWeJyA9PiAnN+KBhDgnLAon4oWfJyA9PiAnMeKBhCcsCifihaAnID0+ICdJJywKJ+KFoScgPT4gJ0lJJywKJ+KFoicgPT4gJ0lJSScsCifihaMnID0+ICdJVicsCifihaQnID0+ICdWJywKJ+KFpScgPT4gJ1ZJJywKJ+KFpicgPT4gJ1ZJSScsCifihacnID0+ICdWSUlJJywKJ+KFqCcgPT4gJ0lYJywKJ+KFqScgPT4gJ1gnLAon4oWqJyA9PiAnWEknLAon4oWrJyA9PiAnWElJJywKJ+KFrCcgPT4gJ0wnLAon4oWtJyA9PiAnQycsCifiha4nID0+ICdEJywKJ+KFrycgPT4gJ00nLAon4oWwJyA9PiAnaScsCifihbEnID0+ICdpaScsCifihbInID0+ICdpaWknLAon4oWzJyA9PiAnaXYnLAon4oW0JyA9PiAndicsCifihbUnID0+ICd2aScsCifihbYnID0+ICd2aWknLAon4oW3JyA9PiAndmlpaScsCifihbgnID0+ICdpeCcsCifihbknID0+ICd4JywKJ+KFuicgPT4gJ3hpJywKJ+KFuycgPT4gJ3hpaScsCifihbwnID0+ICdsJywKJ+KFvScgPT4gJ2MnLAon4oW+JyA9PiAnZCcsCifihb8nID0+ICdtJywKJ+KGiScgPT4gJzDigYQzJywKJ+KIrCcgPT4gJ+KIq+KIqycsCifiiK0nID0+ICfiiKviiKviiKsnLAon4oivJyA9PiAn4oiu4oiuJywKJ+KIsCcgPT4gJ+KIruKIruKIricsCifikaAnID0+ICcxJywKJ+KRoScgPT4gJzInLAon4pGiJyA9PiAnMycsCifikaMnID0+ICc0JywKJ+KRpCcgPT4gJzUnLAon4pGlJyA9PiAnNicsCifikaYnID0+ICc3JywKJ+KRpycgPT4gJzgnLAon4pGoJyA9PiAnOScsCifikaknID0+ICcxMCcsCifikaonID0+ICcxMScsCifikasnID0+ICcxMicsCifikawnID0+ICcxMycsCifika0nID0+ICcxNCcsCifika4nID0+ICcxNScsCifika8nID0+ICcxNicsCifikbAnID0+ICcxNycsCifikbEnID0+ICcxOCcsCifikbInID0+ICcxOScsCifikbMnID0+ICcyMCcsCifikbQnID0+ICcoMSknLAon4pG1JyA9PiAnKDIpJywKJ+KRticgPT4gJygzKScsCifikbcnID0+ICcoNCknLAon4pG4JyA9PiAnKDUpJywKJ+KRuScgPT4gJyg2KScsCifikbonID0+ICcoNyknLAon4pG7JyA9PiAnKDgpJywKJ+KRvCcgPT4gJyg5KScsCifikb0nID0+ICcoMTApJywKJ+KRvicgPT4gJygxMSknLAon4pG/JyA9PiAnKDEyKScsCifikoAnID0+ICcoMTMpJywKJ+KSgScgPT4gJygxNCknLAon4pKCJyA9PiAnKDE1KScsCifikoMnID0+ICcoMTYpJywKJ+KShCcgPT4gJygxNyknLAon4pKFJyA9PiAnKDE4KScsCifikoYnID0+ICcoMTkpJywKJ+KShycgPT4gJygyMCknLAon4pKIJyA9PiAnMS4nLAon4pKJJyA9PiAnMi4nLAon4pKKJyA9PiAnMy4nLAon4pKLJyA9PiAnNC4nLAon4pKMJyA9PiAnNS4nLAon4pKNJyA9PiAnNi4nLAon4pKOJyA9PiAnNy4nLAon4pKPJyA9PiAnOC4nLAon4pKQJyA9PiAnOS4nLAon4pKRJyA9PiAnMTAuJywKJ+KSkicgPT4gJzExLicsCifikpMnID0+ICcxMi4nLAon4pKUJyA9PiAnMTMuJywKJ+KSlScgPT4gJzE0LicsCifikpYnID0+ICcxNS4nLAon4pKXJyA9PiAnMTYuJywKJ+KSmCcgPT4gJzE3LicsCifikpknID0+ICcxOC4nLAon4pKaJyA9PiAnMTkuJywKJ+KSmycgPT4gJzIwLicsCifikpwnID0+ICcoYSknLAon4pKdJyA9PiAnKGIpJywKJ+KSnicgPT4gJyhjKScsCifikp8nID0+ICcoZCknLAon4pKgJyA9PiAnKGUpJywKJ+KSoScgPT4gJyhmKScsCifikqInID0+ICcoZyknLAon4pKjJyA9PiAnKGgpJywKJ+KSpCcgPT4gJyhpKScsCifikqUnID0+ICcoaiknLAon4pKmJyA9PiAnKGspJywKJ+KSpycgPT4gJyhsKScsCifikqgnID0+ICcobSknLAon4pKpJyA9PiAnKG4pJywKJ+KSqicgPT4gJyhvKScsCifikqsnID0+ICcocCknLAon4pKsJyA9PiAnKHEpJywKJ+KSrScgPT4gJyhyKScsCifikq4nID0+ICcocyknLAon4pKvJyA9PiAnKHQpJywKJ+KSsCcgPT4gJyh1KScsCifikrEnID0+ICcodiknLAon4pKyJyA9PiAnKHcpJywKJ+KSsycgPT4gJyh4KScsCifikrQnID0+ICcoeSknLAon4pK1JyA9PiAnKHopJywKJ+KSticgPT4gJ0EnLAon4pK3JyA9PiAnQicsCifikrgnID0+ICdDJywKJ+KSuScgPT4gJ0QnLAon4pK6JyA9PiAnRScsCifikrsnID0+ICdGJywKJ+KSvCcgPT4gJ0cnLAon4pK9JyA9PiAnSCcsCifikr4nID0+ICdJJywKJ+KSvycgPT4gJ0onLAon4pOAJyA9PiAnSycsCifik4EnID0+ICdMJywKJ+KTgicgPT4gJ00nLAon4pODJyA9PiAnTicsCifik4QnID0+ICdPJywKJ+KThScgPT4gJ1AnLAon4pOGJyA9PiAnUScsCifik4cnID0+ICdSJywKJ+KTiCcgPT4gJ1MnLAon4pOJJyA9PiAnVCcsCifik4onID0+ICdVJywKJ+KTiycgPT4gJ1YnLAon4pOMJyA9PiAnVycsCifik40nID0+ICdYJywKJ+KTjicgPT4gJ1knLAon4pOPJyA9PiAnWicsCifik5AnID0+ICdhJywKJ+KTkScgPT4gJ2InLAon4pOSJyA9PiAnYycsCifik5MnID0+ICdkJywKJ+KTlCcgPT4gJ2UnLAon4pOVJyA9PiAnZicsCifik5YnID0+ICdnJywKJ+KTlycgPT4gJ2gnLAon4pOYJyA9PiAnaScsCifik5knID0+ICdqJywKJ+KTmicgPT4gJ2snLAon4pObJyA9PiAnbCcsCifik5wnID0+ICdtJywKJ+KTnScgPT4gJ24nLAon4pOeJyA9PiAnbycsCifik58nID0+ICdwJywKJ+KToCcgPT4gJ3EnLAon4pOhJyA9PiAncicsCifik6InID0+ICdzJywKJ+KToycgPT4gJ3QnLAon4pOkJyA9PiAndScsCifik6UnID0+ICd2JywKJ+KTpicgPT4gJ3cnLAon4pOnJyA9PiAneCcsCifik6gnID0+ICd5JywKJ+KTqScgPT4gJ3onLAon4pOqJyA9PiAnMCcsCifiqIwnID0+ICfiiKviiKviiKviiKsnLAon4qm0JyA9PiAnOjo9JywKJ+KptScgPT4gJz09JywKJ+KpticgPT4gJz09PScsCifisbwnID0+ICdqJywKJ+KxvScgPT4gJ1YnLAon4rWvJyA9PiAn4rWhJywKJ+K6nycgPT4gJ+avjScsCifiu7MnID0+ICfpvp8nLAon4ryAJyA9PiAn5LiAJywKJ+K8gScgPT4gJ+S4qCcsCifivIInID0+ICfkuLYnLAon4ryDJyA9PiAn5Li/JywKJ+K8hCcgPT4gJ+S5mScsCifivIUnID0+ICfkuoUnLAon4ryGJyA9PiAn5LqMJywKJ+K8hycgPT4gJ+S6oCcsCifivIgnID0+ICfkuronLAon4ryJJyA9PiAn5YS/JywKJ+K8iicgPT4gJ+WFpScsCifivIsnID0+ICflhasnLAon4ryMJyA9PiAn5YaCJywKJ+K8jScgPT4gJ+WGlicsCifivI4nID0+ICflhqsnLAon4ryPJyA9PiAn5YegJywKJ+K8kCcgPT4gJ+WHtScsCifivJEnID0+ICfliIAnLAon4rySJyA9PiAn5YqbJywKJ+K8kycgPT4gJ+WLuScsCifivJQnID0+ICfljJUnLAon4ryVJyA9PiAn5YyaJywKJ+K8licgPT4gJ+WMuCcsCifivJcnID0+ICfljYEnLAon4ryYJyA9PiAn5Y2cJywKJ+K8mScgPT4gJ+WNqScsCifivJonID0+ICfljoInLAon4rybJyA9PiAn5Y62JywKJ+K8nCcgPT4gJ+WPiCcsCifivJ0nID0+ICflj6MnLAon4ryeJyA9PiAn5ZuXJywKJ+K8nycgPT4gJ+WcnycsCifivKAnID0+ICflo6snLAon4ryhJyA9PiAn5aSCJywKJ+K8oicgPT4gJ+WkiicsCifivKMnID0+ICflpJUnLAon4rykJyA9PiAn5aSnJywKJ+K8pScgPT4gJ+WlsycsCifivKYnID0+ICflrZAnLAon4rynJyA9PiAn5a6AJywKJ+K8qCcgPT4gJ+WvuCcsCifivKknID0+ICflsI8nLAon4ryqJyA9PiAn5bCiJywKJ+K8qycgPT4gJ+WwuCcsCifivKwnID0+ICflsa4nLAon4rytJyA9PiAn5bGxJywKJ+K8ricgPT4gJ+W3mycsCifivK8nID0+ICflt6UnLAon4rywJyA9PiAn5bexJywKJ+K8sScgPT4gJ+W3vicsCifivLInID0+ICflubInLAon4ryzJyA9PiAn5bm6JywKJ+K8tCcgPT4gJ+W5vycsCifivLUnID0+ICflu7QnLAon4ry2JyA9PiAn5bu+JywKJ+K8tycgPT4gJ+W8iycsCifivLgnID0+ICflvJMnLAon4ry5JyA9PiAn5b2QJywKJ+K8uicgPT4gJ+W9oScsCifivLsnID0+ICflvbMnLAon4ry8JyA9PiAn5b+DJywKJ+K8vScgPT4gJ+aIiCcsCifivL4nID0+ICfmiLYnLAon4ry/JyA9PiAn5omLJywKJ+K9gCcgPT4gJ+aUrycsCifivYEnID0+ICfmlLQnLAon4r2CJyA9PiAn5paHJywKJ+K9gycgPT4gJ+aWlycsCifivYQnID0+ICfmlqQnLAon4r2FJyA9PiAn5pa5JywKJ+K9hicgPT4gJ+aXoCcsCifivYcnID0+ICfml6UnLAon4r2IJyA9PiAn5puwJywKJ+K9iScgPT4gJ+aciCcsCifivYonID0+ICfmnKgnLAon4r2LJyA9PiAn5qygJywKJ+K9jCcgPT4gJ+atoicsCifivY0nID0+ICfmrbknLAon4r2OJyA9PiAn5q6zJywKJ+K9jycgPT4gJ+aviycsCifivZAnID0+ICfmr5QnLAon4r2RJyA9PiAn5q+bJywKJ+K9kicgPT4gJ+awjycsCifivZMnID0+ICfmsJQnLAon4r2UJyA9PiAn5rC0JywKJ+K9lScgPT4gJ+eBqycsCifivZYnID0+ICfniKonLAon4r2XJyA9PiAn54i2JywKJ+K9mCcgPT4gJ+eIuycsCifivZknID0+ICfniL8nLAon4r2aJyA9PiAn54mHJywKJ+K9mycgPT4gJ+eJmScsCifivZwnID0+ICfniZsnLAon4r2dJyA9PiAn54qsJywKJ+K9nicgPT4gJ+eOhCcsCifivZ8nID0+ICfnjoknLAon4r2gJyA9PiAn55OcJywKJ+K9oScgPT4gJ+eTpicsCifivaInID0+ICfnlJgnLAon4r2jJyA9PiAn55SfJywKJ+K9pCcgPT4gJ+eUqCcsCifivaUnID0+ICfnlLAnLAon4r2mJyA9PiAn55aLJywKJ+K9pycgPT4gJ+eWkicsCifivagnID0+ICfnmbYnLAon4r2pJyA9PiAn55m9JywKJ+K9qicgPT4gJ+earicsCifivasnID0+ICfnmr8nLAon4r2sJyA9PiAn55uuJywKJ+K9rScgPT4gJ+efmycsCifiva4nID0+ICfnn6InLAon4r2vJyA9PiAn55+zJywKJ+K9sCcgPT4gJ+ekuicsCifivbEnID0+ICfnprgnLAon4r2yJyA9PiAn56a+JywKJ+K9sycgPT4gJ+eptCcsCifivbQnID0+ICfnq4snLAon4r21JyA9PiAn56u5JywKJ+K9ticgPT4gJ+exsycsCifivbcnID0+ICfns7gnLAon4r24JyA9PiAn57y2JywKJ+K9uScgPT4gJ+e9kScsCifivbonID0+ICfnvoonLAon4r27JyA9PiAn5769JywKJ+K9vCcgPT4gJ+iAgScsCifivb0nID0+ICfogIwnLAon4r2+JyA9PiAn6ICSJywKJ+K9vycgPT4gJ+iAsycsCifivoAnID0+ICfogb8nLAon4r6BJyA9PiAn6IKJJywKJ+K+gicgPT4gJ+iHoycsCifivoMnID0+ICfoh6onLAon4r6EJyA9PiAn6IezJywKJ+K+hScgPT4gJ+iHvCcsCifivoYnID0+ICfoiIwnLAon4r6HJyA9PiAn6IibJywKJ+K+iCcgPT4gJ+iInycsCifivoknID0+ICfoia4nLAon4r6KJyA9PiAn6ImyJywKJ+K+iycgPT4gJ+iJuCcsCifivownID0+ICfomY0nLAon4r6NJyA9PiAn6JmrJywKJ+K+jicgPT4gJ+ihgCcsCifivo8nID0+ICfooYwnLAon4r6QJyA9PiAn6KGjJywKJ+K+kScgPT4gJ+ilvicsCifivpInID0+ICfoposnLAon4r6TJyA9PiAn6KeSJywKJ+K+lCcgPT4gJ+iogCcsCifivpUnID0+ICfosLcnLAon4r6WJyA9PiAn6LGGJywKJ+K+lycgPT4gJ+ixlScsCifivpgnID0+ICfosbgnLAon4r6ZJyA9PiAn6LKdJywKJ+K+micgPT4gJ+i1pCcsCifivpsnID0+ICfotbAnLAon4r6cJyA9PiAn6LazJywKJ+K+nScgPT4gJ+i6qycsCifivp4nID0+ICfou4onLAon4r6fJyA9PiAn6L6bJywKJ+K+oCcgPT4gJ+i+sCcsCifivqEnID0+ICfovrUnLAon4r6iJyA9PiAn6YKRJywKJ+K+oycgPT4gJ+mFiScsCifivqQnID0+ICfph4YnLAon4r6lJyA9PiAn6YeMJywKJ+K+picgPT4gJ+mHkScsCifivqcnID0+ICfplbcnLAon4r6oJyA9PiAn6ZaAJywKJ+K+qScgPT4gJ+mYnCcsCifivqonID0+ICfpmrYnLAon4r6rJyA9PiAn6Zq5JywKJ+K+rCcgPT4gJ+mbqCcsCifivq0nID0+ICfpnZEnLAon4r6uJyA9PiAn6Z2eJywKJ+K+rycgPT4gJ+mdoicsCifivrAnID0+ICfpnaknLAon4r6xJyA9PiAn6Z+LJywKJ+K+sicgPT4gJ+mfrScsCifivrMnID0+ICfpn7MnLAon4r60JyA9PiAn6aCBJywKJ+K+tScgPT4gJ+miqCcsCifivrYnID0+ICfpo5snLAon4r63JyA9PiAn6aOfJywKJ+K+uCcgPT4gJ+mmlicsCifivrknID0+ICfpppknLAon4r66JyA9PiAn6aasJywKJ+K+uycgPT4gJ+mqqCcsCifivrwnID0+ICfpq5gnLAon4r69JyA9PiAn6aufJywKJ+K+vicgPT4gJ+mspScsCifivr8nID0+ICfprK8nLAon4r+AJyA9PiAn6ayyJywKJ+K/gScgPT4gJ+msvCcsCifiv4InID0+ICfprZonLAon4r+DJyA9PiAn6bOlJywKJ+K/hCcgPT4gJ+m5tScsCifiv4UnID0+ICfpub8nLAon4r+GJyA9PiAn6bqlJywKJ+K/hycgPT4gJ+m6uycsCifiv4gnID0+ICfpu4MnLAon4r+JJyA9PiAn6buNJywKJ+K/iicgPT4gJ+m7kScsCifiv4snID0+ICfpu7knLAon4r+MJyA9PiAn6bu9JywKJ+K/jScgPT4gJ+m8jicsCifiv44nID0+ICfpvJMnLAon4r+PJyA9PiAn6bygJywKJ+K/kCcgPT4gJ+m8uycsCifiv5EnID0+ICfpvYonLAon4r+SJyA9PiAn6b2SJywKJ+K/kycgPT4gJ+m+jScsCifiv5QnID0+ICfpvpwnLAon4r+VJyA9PiAn6b6gJywKJ+OAgCcgPT4gJyAnLAon44C2JyA9PiAn44CSJywKJ+OAuCcgPT4gJ+WNgScsCifjgLknID0+ICfljYQnLAon44C6JyA9PiAn5Y2FJywKJ+OCmycgPT4gJyDjgpknLAon44KcJyA9PiAnIOOCmicsCifjgp8nID0+ICfjgojjgoonLAon44O/JyA9PiAn44Kz44OIJywKJ+OEsScgPT4gJ+GEgCcsCifjhLInID0+ICfhhIEnLAon44SzJyA9PiAn4YaqJywKJ+OEtCcgPT4gJ+GEgicsCifjhLUnID0+ICfhhqwnLAon44S2JyA9PiAn4YatJywKJ+OEtycgPT4gJ+GEgycsCifjhLgnID0+ICfhhIQnLAon44S5JyA9PiAn4YSFJywKJ+OEuicgPT4gJ+GGsCcsCifjhLsnID0+ICfhhrEnLAon44S8JyA9PiAn4YayJywKJ+OEvScgPT4gJ+GGsycsCifjhL4nID0+ICfhhrQnLAon44S/JyA9PiAn4Ya1JywKJ+OFgCcgPT4gJ+GEmicsCifjhYEnID0+ICfhhIYnLAon44WCJyA9PiAn4YSHJywKJ+OFgycgPT4gJ+GEiCcsCifjhYQnID0+ICfhhKEnLAon44WFJyA9PiAn4YSJJywKJ+OFhicgPT4gJ+GEiicsCifjhYcnID0+ICfhhIsnLAon44WIJyA9PiAn4YSMJywKJ+OFiScgPT4gJ+GEjScsCifjhYonID0+ICfhhI4nLAon44WLJyA9PiAn4YSPJywKJ+OFjCcgPT4gJ+GEkCcsCifjhY0nID0+ICfhhJEnLAon44WOJyA9PiAn4YSSJywKJ+OFjycgPT4gJ+GFoScsCifjhZAnID0+ICfhhaInLAon44WRJyA9PiAn4YWjJywKJ+OFkicgPT4gJ+GFpCcsCifjhZMnID0+ICfhhaUnLAon44WUJyA9PiAn4YWmJywKJ+OFlScgPT4gJ+GFpycsCifjhZYnID0+ICfhhagnLAon44WXJyA9PiAn4YWpJywKJ+OFmCcgPT4gJ+GFqicsCifjhZknID0+ICfhhasnLAon44WaJyA9PiAn4YWsJywKJ+OFmycgPT4gJ+GFrScsCifjhZwnID0+ICfhha4nLAon44WdJyA9PiAn4YWvJywKJ+OFnicgPT4gJ+GFsCcsCifjhZ8nID0+ICfhhbEnLAon44WgJyA9PiAn4YWyJywKJ+OFoScgPT4gJ+GFsycsCifjhaInID0+ICfhhbQnLAon44WjJyA9PiAn4YW1JywKJ+OFpCcgPT4gJ+GFoCcsCifjhaUnID0+ICfhhJQnLAon44WmJyA9PiAn4YSVJywKJ+OFpycgPT4gJ+GHhycsCifjhagnID0+ICfhh4gnLAon44WpJyA9PiAn4YeMJywKJ+OFqicgPT4gJ+GHjicsCifjhasnID0+ICfhh5MnLAon44WsJyA9PiAn4YeXJywKJ+OFrScgPT4gJ+GHmScsCifjha4nID0+ICfhhJwnLAon44WvJyA9PiAn4YedJywKJ+OFsCcgPT4gJ+GHnycsCifjhbEnID0+ICfhhJ0nLAon44WyJyA9PiAn4YSeJywKJ+OFsycgPT4gJ+GEoCcsCifjhbQnID0+ICfhhKInLAon44W1JyA9PiAn4YSjJywKJ+OFticgPT4gJ+GEpycsCifjhbcnID0+ICfhhKknLAon44W4JyA9PiAn4YSrJywKJ+OFuScgPT4gJ+GErCcsCifjhbonID0+ICfhhK0nLAon44W7JyA9PiAn4YSuJywKJ+OFvCcgPT4gJ+GErycsCifjhb0nID0+ICfhhLInLAon44W+JyA9PiAn4YS2JywKJ+OFvycgPT4gJ+GFgCcsCifjhoAnID0+ICfhhYcnLAon44aBJyA9PiAn4YWMJywKJ+OGgicgPT4gJ+GHsScsCifjhoMnID0+ICfhh7InLAon44aEJyA9PiAn4YWXJywKJ+OGhScgPT4gJ+GFmCcsCifjhoYnID0+ICfhhZknLAon44aHJyA9PiAn4YaEJywKJ+OGiCcgPT4gJ+GGhScsCifjhoknID0+ICfhhognLAon44aKJyA9PiAn4YaRJywKJ+OGiycgPT4gJ+GGkicsCifjhownID0+ICfhhpQnLAon44aNJyA9PiAn4YaeJywKJ+OGjicgPT4gJ+GGoScsCifjhpInID0+ICfkuIAnLAon44aTJyA9PiAn5LqMJywKJ+OGlCcgPT4gJ+S4iScsCifjhpUnID0+ICflm5snLAon44aWJyA9PiAn5LiKJywKJ+OGlycgPT4gJ+S4rScsCifjhpgnID0+ICfkuIsnLAon44aZJyA9PiAn55SyJywKJ+OGmicgPT4gJ+S5mScsCifjhpsnID0+ICfkuJknLAon44acJyA9PiAn5LiBJywKJ+OGnScgPT4gJ+WkqScsCifjhp4nID0+ICflnLAnLAon44afJyA9PiAn5Lq6JywKJ+OIgCcgPT4gJyjhhIApJywKJ+OIgScgPT4gJyjhhIIpJywKJ+OIgicgPT4gJyjhhIMpJywKJ+OIgycgPT4gJyjhhIUpJywKJ+OIhCcgPT4gJyjhhIYpJywKJ+OIhScgPT4gJyjhhIcpJywKJ+OIhicgPT4gJyjhhIkpJywKJ+OIhycgPT4gJyjhhIspJywKJ+OIiCcgPT4gJyjhhIwpJywKJ+OIiScgPT4gJyjhhI4pJywKJ+OIiicgPT4gJyjhhI8pJywKJ+OIiycgPT4gJyjhhJApJywKJ+OIjCcgPT4gJyjhhJEpJywKJ+OIjScgPT4gJyjhhJIpJywKJ+OIjicgPT4gJyjhhIDhhaEpJywKJ+OIjycgPT4gJyjhhILhhaEpJywKJ+OIkCcgPT4gJyjhhIPhhaEpJywKJ+OIkScgPT4gJyjhhIXhhaEpJywKJ+OIkicgPT4gJyjhhIbhhaEpJywKJ+OIkycgPT4gJyjhhIfhhaEpJywKJ+OIlCcgPT4gJyjhhInhhaEpJywKJ+OIlScgPT4gJyjhhIvhhaEpJywKJ+OIlicgPT4gJyjhhIzhhaEpJywKJ+OIlycgPT4gJyjhhI7hhaEpJywKJ+OImCcgPT4gJyjhhI/hhaEpJywKJ+OImScgPT4gJyjhhJDhhaEpJywKJ+OImicgPT4gJyjhhJHhhaEpJywKJ+OImycgPT4gJyjhhJLhhaEpJywKJ+OInCcgPT4gJyjhhIzhha4pJywKJ+OInScgPT4gJyjhhIvhhanhhIzhhaXhhqspJywKJ+OInicgPT4gJyjhhIvhhanhhJLhha4pJywKJ+OIoCcgPT4gJyjkuIApJywKJ+OIoScgPT4gJyjkuowpJywKJ+OIoicgPT4gJyjkuIkpJywKJ+OIoycgPT4gJyjlm5spJywKJ+OIpCcgPT4gJyjkupQpJywKJ+OIpScgPT4gJyjlha0pJywKJ+OIpicgPT4gJyjkuIMpJywKJ+OIpycgPT4gJyjlhaspJywKJ+OIqCcgPT4gJyjkuZ0pJywKJ+OIqScgPT4gJyjljYEpJywKJ+OIqicgPT4gJyjmnIgpJywKJ+OIqycgPT4gJyjngaspJywKJ+OIrCcgPT4gJyjmsLQpJywKJ+OIrScgPT4gJyjmnKgpJywKJ+OIricgPT4gJyjph5EpJywKJ+OIrycgPT4gJyjlnJ8pJywKJ+OIsCcgPT4gJyjml6UpJywKJ+OIsScgPT4gJyjmoKopJywKJ+OIsicgPT4gJyjmnIkpJywKJ+OIsycgPT4gJyjnpL4pJywKJ+OItCcgPT4gJyjlkI0pJywKJ+OItScgPT4gJyjnibkpJywKJ+OIticgPT4gJyjosqEpJywKJ+OItycgPT4gJyjnpZ0pJywKJ+OIuCcgPT4gJyjlirQpJywKJ+OIuScgPT4gJyjku6MpJywKJ+OIuicgPT4gJyjlkbwpJywKJ+OIuycgPT4gJyjlraYpJywKJ+OIvCcgPT4gJyjnm6MpJywKJ+OIvScgPT4gJyjkvIEpJywKJ+OIvicgPT4gJyjos4cpJywKJ+OIvycgPT4gJyjljZQpJywKJ+OJgCcgPT4gJyjnpa0pJywKJ+OJgScgPT4gJyjkvJEpJywKJ+OJgicgPT4gJyjoh6opJywKJ+OJgycgPT4gJyjoh7MpJywKJ+OJhCcgPT4gJ+WVjycsCifjiYUnID0+ICflubwnLAon44mGJyA9PiAn5paHJywKJ+OJhycgPT4gJ+eujycsCifjiZAnID0+ICdQVEUnLAon44mRJyA9PiAnMjEnLAon44mSJyA9PiAnMjInLAon44mTJyA9PiAnMjMnLAon44mUJyA9PiAnMjQnLAon44mVJyA9PiAnMjUnLAon44mWJyA9PiAnMjYnLAon44mXJyA9PiAnMjcnLAon44mYJyA9PiAnMjgnLAon44mZJyA9PiAnMjknLAon44maJyA9PiAnMzAnLAon44mbJyA9PiAnMzEnLAon44mcJyA9PiAnMzInLAon44mdJyA9PiAnMzMnLAon44meJyA9PiAnMzQnLAon44mfJyA9PiAnMzUnLAon44mgJyA9PiAn4YSAJywKJ+OJoScgPT4gJ+GEgicsCifjiaInID0+ICfhhIMnLAon44mjJyA9PiAn4YSFJywKJ+OJpCcgPT4gJ+GEhicsCifjiaUnID0+ICfhhIcnLAon44mmJyA9PiAn4YSJJywKJ+OJpycgPT4gJ+GEiycsCifjiagnID0+ICfhhIwnLAon44mpJyA9PiAn4YSOJywKJ+OJqicgPT4gJ+GEjycsCifjiasnID0+ICfhhJAnLAon44msJyA9PiAn4YSRJywKJ+OJrScgPT4gJ+GEkicsCifjia4nID0+ICfhhIDhhaEnLAon44mvJyA9PiAn4YSC4YWhJywKJ+OJsCcgPT4gJ+GEg+GFoScsCifjibEnID0+ICfhhIXhhaEnLAon44myJyA9PiAn4YSG4YWhJywKJ+OJsycgPT4gJ+GEh+GFoScsCifjibQnID0+ICfhhInhhaEnLAon44m1JyA9PiAn4YSL4YWhJywKJ+OJticgPT4gJ+GEjOGFoScsCifjibcnID0+ICfhhI7hhaEnLAon44m4JyA9PiAn4YSP4YWhJywKJ+OJuScgPT4gJ+GEkOGFoScsCifjibonID0+ICfhhJHhhaEnLAon44m7JyA9PiAn4YSS4YWhJywKJ+OJvCcgPT4gJ+GEjuGFoeGGt+GEgOGFqScsCifjib0nID0+ICfhhIzhha7hhIvhhbQnLAon44m+JyA9PiAn4YSL4YWuJywKJ+OKgCcgPT4gJ+S4gCcsCifjioEnID0+ICfkuownLAon44qCJyA9PiAn5LiJJywKJ+OKgycgPT4gJ+WbmycsCifjioQnID0+ICfkupQnLAon44qFJyA9PiAn5YWtJywKJ+OKhicgPT4gJ+S4gycsCifjiocnID0+ICflhasnLAon44qIJyA9PiAn5LmdJywKJ+OKiScgPT4gJ+WNgScsCifjioonID0+ICfmnIgnLAon44qLJyA9PiAn54GrJywKJ+OKjCcgPT4gJ+awtCcsCifjio0nID0+ICfmnKgnLAon44qOJyA9PiAn6YeRJywKJ+OKjycgPT4gJ+WcnycsCifjipAnID0+ICfml6UnLAon44qRJyA9PiAn5qCqJywKJ+OKkicgPT4gJ+aciScsCifjipMnID0+ICfnpL4nLAon44qUJyA9PiAn5ZCNJywKJ+OKlScgPT4gJ+eJuScsCifjipYnID0+ICfosqEnLAon44qXJyA9PiAn56WdJywKJ+OKmCcgPT4gJ+WKtCcsCifjipknID0+ICfnp5gnLAon44qaJyA9PiAn55S3JywKJ+OKmycgPT4gJ+WlsycsCifjipwnID0+ICfpgaknLAon44qdJyA9PiAn5YSqJywKJ+OKnicgPT4gJ+WNsCcsCifjip8nID0+ICfms6gnLAon44qgJyA9PiAn6aCFJywKJ+OKoScgPT4gJ+S8kScsCifjiqInID0+ICflhpknLAon44qjJyA9PiAn5q2jJywKJ+OKpCcgPT4gJ+S4iicsCifjiqUnID0+ICfkuK0nLAon44qmJyA9PiAn5LiLJywKJ+OKpycgPT4gJ+W3picsCifjiqgnID0+ICflj7MnLAon44qpJyA9PiAn5Yy7JywKJ+OKqicgPT4gJ+WulycsCifjiqsnID0+ICflraYnLAon44qsJyA9PiAn55ujJywKJ+OKrScgPT4gJ+S8gScsCifjiq4nID0+ICfos4cnLAon44qvJyA9PiAn5Y2UJywKJ+OKsCcgPT4gJ+WknCcsCifjirEnID0+ICczNicsCifjirInID0+ICczNycsCifjirMnID0+ICczOCcsCifjirQnID0+ICczOScsCifjirUnID0+ICc0MCcsCifjirYnID0+ICc0MScsCifjircnID0+ICc0MicsCifjirgnID0+ICc0MycsCifjirknID0+ICc0NCcsCifjironID0+ICc0NScsCifjirsnID0+ICc0NicsCifjirwnID0+ICc0NycsCifjir0nID0+ICc0OCcsCifjir4nID0+ICc0OScsCifjir8nID0+ICc1MCcsCifji4AnID0+ICcx5pyIJywKJ+OLgScgPT4gJzLmnIgnLAon44uCJyA9PiAnM+aciCcsCifji4MnID0+ICc05pyIJywKJ+OLhCcgPT4gJzXmnIgnLAon44uFJyA9PiAnNuaciCcsCifji4YnID0+ICc35pyIJywKJ+OLhycgPT4gJzjmnIgnLAon44uIJyA9PiAnOeaciCcsCifji4knID0+ICcxMOaciCcsCifji4onID0+ICcxMeaciCcsCifji4snID0+ICcxMuaciCcsCifji4wnID0+ICdIZycsCifji40nID0+ICdlcmcnLAon44uOJyA9PiAnZVYnLAon44uPJyA9PiAnTFREJywKJ+OLkCcgPT4gJ+OCoicsCifji5EnID0+ICfjgqQnLAon44uSJyA9PiAn44KmJywKJ+OLkycgPT4gJ+OCqCcsCifji5QnID0+ICfjgqonLAon44uVJyA9PiAn44KrJywKJ+OLlicgPT4gJ+OCrScsCifji5cnID0+ICfjgq8nLAon44uYJyA9PiAn44KxJywKJ+OLmScgPT4gJ+OCsycsCifji5onID0+ICfjgrUnLAon44ubJyA9PiAn44K3JywKJ+OLnCcgPT4gJ+OCuScsCifji50nID0+ICfjgrsnLAon44ueJyA9PiAn44K9JywKJ+OLnycgPT4gJ+OCvycsCifji6AnID0+ICfjg4EnLAon44uhJyA9PiAn44OEJywKJ+OLoicgPT4gJ+ODhicsCifji6MnID0+ICfjg4gnLAon44ukJyA9PiAn44OKJywKJ+OLpScgPT4gJ+ODiycsCifji6YnID0+ICfjg4wnLAon44unJyA9PiAn44ONJywKJ+OLqCcgPT4gJ+ODjicsCifji6knID0+ICfjg48nLAon44uqJyA9PiAn44OSJywKJ+OLqycgPT4gJ+ODlScsCifji6wnID0+ICfjg5gnLAon44utJyA9PiAn44ObJywKJ+OLricgPT4gJ+ODnicsCifji68nID0+ICfjg58nLAon44uwJyA9PiAn44OgJywKJ+OLsScgPT4gJ+ODoScsCifji7InID0+ICfjg6InLAon44uzJyA9PiAn44OkJywKJ+OLtCcgPT4gJ+ODpicsCifji7UnID0+ICfjg6gnLAon44u2JyA9PiAn44OpJywKJ+OLtycgPT4gJ+ODqicsCifji7gnID0+ICfjg6snLAon44u5JyA9PiAn44OsJywKJ+OLuicgPT4gJ+ODrScsCifji7snID0+ICfjg68nLAon44u8JyA9PiAn44OwJywKJ+OLvScgPT4gJ+ODsScsCifji74nID0+ICfjg7InLAon44u/JyA9PiAn5Luk5ZKMJywKJ+OMgCcgPT4gJ+OCouODj+OCmuODvOODiCcsCifjjIEnID0+ICfjgqLjg6vjg5XjgqEnLAon44yCJyA9PiAn44Ki44Oz44OY44Ka44KiJywKJ+OMgycgPT4gJ+OCouODvOODqycsCifjjIQnID0+ICfjgqTjg4vjg7Pjgq/jgpknLAon44yFJyA9PiAn44Kk44Oz44OBJywKJ+OMhicgPT4gJ+OCpuOCqeODsycsCifjjIcnID0+ICfjgqjjgrnjgq/jg7zjg4jjgpknLAon44yIJyA9PiAn44Ko44O844Kr44O8JywKJ+OMiScgPT4gJ+OCquODs+OCuScsCifjjIonID0+ICfjgqrjg7zjg6AnLAon44yLJyA9PiAn44Kr44Kk44OqJywKJ+OMjCcgPT4gJ+OCq+ODqeODg+ODiCcsCifjjI0nID0+ICfjgqvjg63jg6rjg7wnLAon44yOJyA9PiAn44Kr44KZ44Ot44OzJywKJ+OMjycgPT4gJ+OCq+OCmeODs+ODnicsCifjjJAnID0+ICfjgq3jgpnjgqvjgpknLAon44yRJyA9PiAn44Kt44KZ44OL44O8JywKJ+OMkicgPT4gJ+OCreODpeODquODvCcsCifjjJMnID0+ICfjgq3jgpnjg6vjgr/jgpnjg7wnLAon44yUJyA9PiAn44Kt44OtJywKJ+OMlScgPT4gJ+OCreODreOCr+OCmeODqeODoCcsCifjjJYnID0+ICfjgq3jg63jg6Hjg7zjg4jjg6snLAon44yXJyA9PiAn44Kt44Ot44Ov44OD44OIJywKJ+OMmCcgPT4gJ+OCr+OCmeODqeODoCcsCifjjJknID0+ICfjgq/jgpnjg6njg6Djg4jjg7MnLAon44yaJyA9PiAn44Kv44Or44K744KZ44Kk44OtJywKJ+OMmycgPT4gJ+OCr+ODreODvOODjScsCifjjJwnID0+ICfjgrHjg7zjgrknLAon44ydJyA9PiAn44Kz44Or44OKJywKJ+OMnicgPT4gJ+OCs+ODvOODm+OCmicsCifjjJ8nID0+ICfjgrXjgqTjgq/jg6snLAon44ygJyA9PiAn44K144Oz44OB44O844OgJywKJ+OMoScgPT4gJ+OCt+ODquODs+OCr+OCmScsCifjjKInID0+ICfjgrvjg7Pjg4EnLAon44yjJyA9PiAn44K744Oz44OIJywKJ+OMpCcgPT4gJ+OCv+OCmeODvOOCuScsCifjjKUnID0+ICfjg4bjgpnjgrcnLAon44ymJyA9PiAn44OI44KZ44OrJywKJ+OMpycgPT4gJ+ODiOODsycsCifjjKgnID0+ICfjg4rjg44nLAon44ypJyA9PiAn44OO44OD44OIJywKJ+OMqicgPT4gJ+ODj+OCpOODhCcsCifjjKsnID0+ICfjg4/jgprjg7zjgrvjg7Pjg4gnLAon44ysJyA9PiAn44OP44Ka44O844OEJywKJ+OMrScgPT4gJ+ODj+OCmeODvOODrOODqycsCifjjK4nID0+ICfjg5LjgprjgqLjgrnjg4jjg6snLAon44yvJyA9PiAn44OS44Ka44Kv44OrJywKJ+OMsCcgPT4gJ+ODkuOCmuOCsycsCifjjLEnID0+ICfjg5Ljgpnjg6snLAon44yyJyA9PiAn44OV44Kh44Op44OD44OI44KZJywKJ+OMsycgPT4gJ+ODleOCo+ODvOODiCcsCifjjLQnID0+ICfjg5Xjgpnjg4Pjgrfjgqfjg6snLAon44y1JyA9PiAn44OV44Op44OzJywKJ+OMticgPT4gJ+ODmOOCr+OCv+ODvOODqycsCifjjLcnID0+ICfjg5jjgprjgr0nLAon44y4JyA9PiAn44OY44Ka44OL44OSJywKJ+OMuScgPT4gJ+ODmOODq+ODhCcsCifjjLonID0+ICfjg5jjgprjg7PjgrknLAon44y7JyA9PiAn44OY44Ka44O844K344KZJywKJ+OMvCcgPT4gJ+ODmOOCmeODvOOCvycsCifjjL0nID0+ICfjg5vjgprjgqTjg7Pjg4gnLAon44y+JyA9PiAn44Ob44KZ44Or44OIJywKJ+OMvycgPT4gJ+ODm+ODsycsCifjjYAnID0+ICfjg5vjgprjg7Pjg4jjgpknLAon442BJyA9PiAn44Ob44O844OrJywKJ+ONgicgPT4gJ+ODm+ODvOODsycsCifjjYMnID0+ICfjg57jgqTjgq/jg60nLAon442EJyA9PiAn44Oe44Kk44OrJywKJ+ONhScgPT4gJ+ODnuODg+ODjycsCifjjYYnID0+ICfjg57jg6vjgq8nLAon442HJyA9PiAn44Oe44Oz44K344On44OzJywKJ+ONiCcgPT4gJ+ODn+OCr+ODreODsycsCifjjYknID0+ICfjg5/jg6onLAon442KJyA9PiAn44Of44Oq44OP44KZ44O844OrJywKJ+ONiycgPT4gJ+ODoeOCq+OCmScsCifjjYwnID0+ICfjg6Hjgqvjgpnjg4jjg7MnLAon442NJyA9PiAn44Oh44O844OI44OrJywKJ+ONjicgPT4gJ+ODpOODvOODiOOCmScsCifjjY8nID0+ICfjg6Tjg7zjg6snLAon442QJyA9PiAn44Om44Ki44OzJywKJ+ONkScgPT4gJ+ODquODg+ODiOODqycsCifjjZInID0+ICfjg6rjg6knLAon442TJyA9PiAn44Or44OS44Ka44O8JywKJ+ONlCcgPT4gJ+ODq+ODvOODleOCmeODqycsCifjjZUnID0+ICfjg6zjg6AnLAon442WJyA9PiAn44Os44Oz44OI44Kx44KZ44OzJywKJ+ONlycgPT4gJ+ODr+ODg+ODiCcsCifjjZgnID0+ICcw54K5JywKJ+ONmScgPT4gJzHngrknLAon442aJyA9PiAnMueCuScsCifjjZsnID0+ICcz54K5JywKJ+ONnCcgPT4gJzTngrknLAon442dJyA9PiAnNeeCuScsCifjjZ4nID0+ICc254K5JywKJ+ONnycgPT4gJzfngrknLAon442gJyA9PiAnOOeCuScsCifjjaEnID0+ICc554K5JywKJ+ONoicgPT4gJzEw54K5JywKJ+ONoycgPT4gJzEx54K5JywKJ+ONpCcgPT4gJzEy54K5JywKJ+ONpScgPT4gJzEz54K5JywKJ+ONpicgPT4gJzE054K5JywKJ+ONpycgPT4gJzE154K5JywKJ+ONqCcgPT4gJzE254K5JywKJ+ONqScgPT4gJzE354K5JywKJ+ONqicgPT4gJzE454K5JywKJ+ONqycgPT4gJzE554K5JywKJ+ONrCcgPT4gJzIw54K5JywKJ+ONrScgPT4gJzIx54K5JywKJ+ONricgPT4gJzIy54K5JywKJ+ONrycgPT4gJzIz54K5JywKJ+ONsCcgPT4gJzI054K5JywKJ+ONsScgPT4gJ2hQYScsCifjjbInID0+ICdkYScsCifjjbMnID0+ICdBVScsCifjjbQnID0+ICdiYXInLAon4421JyA9PiAnb1YnLAon4422JyA9PiAncGMnLAon4423JyA9PiAnZG0nLAon4424JyA9PiAnZG0yJywKJ+ONuScgPT4gJ2RtMycsCifjjbonID0+ICdJVScsCifjjbsnID0+ICflubPmiJAnLAon4428JyA9PiAn5pit5ZKMJywKJ+ONvScgPT4gJ+Wkp+atoycsCifjjb4nID0+ICfmmI7msrsnLAon442/JyA9PiAn5qCq5byP5Lya56S+JywKJ+OOgCcgPT4gJ3BBJywKJ+OOgScgPT4gJ25BJywKJ+OOgicgPT4gJ868QScsCifjjoMnID0+ICdtQScsCifjjoQnID0+ICdrQScsCifjjoUnID0+ICdLQicsCifjjoYnID0+ICdNQicsCifjjocnID0+ICdHQicsCifjjognID0+ICdjYWwnLAon446JJyA9PiAna2NhbCcsCifjjoonID0+ICdwRicsCifjjosnID0+ICduRicsCifjjownID0+ICfOvEYnLAon446NJyA9PiAnzrxnJywKJ+OOjicgPT4gJ21nJywKJ+OOjycgPT4gJ2tnJywKJ+OOkCcgPT4gJ0h6JywKJ+OOkScgPT4gJ2tIeicsCifjjpInID0+ICdNSHonLAon446TJyA9PiAnR0h6JywKJ+OOlCcgPT4gJ1RIeicsCifjjpUnID0+ICfOvGwnLAon446WJyA9PiAnbWwnLAon446XJyA9PiAnZGwnLAon446YJyA9PiAna2wnLAon446ZJyA9PiAnZm0nLAon446aJyA9PiAnbm0nLAon446bJyA9PiAnzrxtJywKJ+OOnCcgPT4gJ21tJywKJ+OOnScgPT4gJ2NtJywKJ+OOnicgPT4gJ2ttJywKJ+OOnycgPT4gJ21tMicsCifjjqAnID0+ICdjbTInLAon446hJyA9PiAnbTInLAon446iJyA9PiAna20yJywKJ+OOoycgPT4gJ21tMycsCifjjqQnID0+ICdjbTMnLAon446lJyA9PiAnbTMnLAon446mJyA9PiAna20zJywKJ+OOpycgPT4gJ23iiJVzJywKJ+OOqCcgPT4gJ23iiJVzMicsCifjjqknID0+ICdQYScsCifjjqonID0+ICdrUGEnLAon446rJyA9PiAnTVBhJywKJ+OOrCcgPT4gJ0dQYScsCifjjq0nID0+ICdyYWQnLAon446uJyA9PiAncmFk4oiVcycsCifjjq8nID0+ICdyYWTiiJVzMicsCifjjrAnID0+ICdwcycsCifjjrEnID0+ICducycsCifjjrInID0+ICfOvHMnLAon446zJyA9PiAnbXMnLAon4460JyA9PiAncFYnLAon4461JyA9PiAnblYnLAon4462JyA9PiAnzrxWJywKJ+OOtycgPT4gJ21WJywKJ+OOuCcgPT4gJ2tWJywKJ+OOuScgPT4gJ01WJywKJ+OOuicgPT4gJ3BXJywKJ+OOuycgPT4gJ25XJywKJ+OOvCcgPT4gJ868VycsCifjjr0nID0+ICdtVycsCifjjr4nID0+ICdrVycsCifjjr8nID0+ICdNVycsCifjj4AnID0+ICdrzqknLAon44+BJyA9PiAnTc6pJywKJ+OPgicgPT4gJ2EubS4nLAon44+DJyA9PiAnQnEnLAon44+EJyA9PiAnY2MnLAon44+FJyA9PiAnY2QnLAon44+GJyA9PiAnQ+KIlWtnJywKJ+OPhycgPT4gJ0NvLicsCifjj4gnID0+ICdkQicsCifjj4knID0+ICdHeScsCifjj4onID0+ICdoYScsCifjj4snID0+ICdIUCcsCifjj4wnID0+ICdpbicsCifjj40nID0+ICdLSycsCifjj44nID0+ICdLTScsCifjj48nID0+ICdrdCcsCifjj5AnID0+ICdsbScsCifjj5EnID0+ICdsbicsCifjj5InID0+ICdsb2cnLAon44+TJyA9PiAnbHgnLAon44+UJyA9PiAnbWInLAon44+VJyA9PiAnbWlsJywKJ+OPlicgPT4gJ21vbCcsCifjj5cnID0+ICdQSCcsCifjj5gnID0+ICdwLm0uJywKJ+OPmScgPT4gJ1BQTScsCifjj5onID0+ICdQUicsCifjj5snID0+ICdzcicsCifjj5wnID0+ICdTdicsCifjj50nID0+ICdXYicsCifjj54nID0+ICdW4oiVbScsCifjj58nID0+ICdB4oiVbScsCifjj6AnID0+ICcx5pelJywKJ+OPoScgPT4gJzLml6UnLAon44+iJyA9PiAnM+aXpScsCifjj6MnID0+ICc05pelJywKJ+OPpCcgPT4gJzXml6UnLAon44+lJyA9PiAnNuaXpScsCifjj6YnID0+ICc35pelJywKJ+OPpycgPT4gJzjml6UnLAon44+oJyA9PiAnOeaXpScsCifjj6knID0+ICcxMOaXpScsCifjj6onID0+ICcxMeaXpScsCifjj6snID0+ICcxMuaXpScsCifjj6wnID0+ICcxM+aXpScsCifjj60nID0+ICcxNOaXpScsCifjj64nID0+ICcxNeaXpScsCifjj68nID0+ICcxNuaXpScsCifjj7AnID0+ICcxN+aXpScsCifjj7EnID0+ICcxOOaXpScsCifjj7InID0+ICcxOeaXpScsCifjj7MnID0+ICcyMOaXpScsCifjj7QnID0+ICcyMeaXpScsCifjj7UnID0+ICcyMuaXpScsCifjj7YnID0+ICcyM+aXpScsCifjj7cnID0+ICcyNOaXpScsCifjj7gnID0+ICcyNeaXpScsCifjj7knID0+ICcyNuaXpScsCifjj7onID0+ICcyN+aXpScsCifjj7snID0+ICcyOOaXpScsCifjj7wnID0+ICcyOeaXpScsCifjj70nID0+ICczMOaXpScsCifjj74nID0+ICczMeaXpScsCifjj78nID0+ICdnYWwnLAon6pqcJyA9PiAn0YonLAon6pqdJyA9PiAn0YwnLAon6p2wJyA9PiAn6p2vJywKJ+qfuCcgPT4gJ8SmJywKJ+qfuScgPT4gJ8WTJywKJ+qtnCcgPT4gJ+qcpycsCifqrZ0nID0+ICfqrLcnLAon6q2eJyA9PiAnyasnLAon6q2fJyA9PiAn6q2SJywKJ+qtqScgPT4gJ8qNJywKJ++sgCcgPT4gJ2ZmJywKJ++sgScgPT4gJ2ZpJywKJ++sgicgPT4gJ2ZsJywKJ++sgycgPT4gJ2ZmaScsCifvrIQnID0+ICdmZmwnLAon76yFJyA9PiAnc3QnLAon76yGJyA9PiAnc3QnLAon76yTJyA9PiAn1bTVticsCifvrJQnID0+ICfVtNWlJywKJ++slScgPT4gJ9W01asnLAon76yWJyA9PiAn1b7VticsCifvrJcnID0+ICfVtNWtJywKJ++soCcgPT4gJ9eiJywKJ++soScgPT4gJ9eQJywKJ++soicgPT4gJ9eTJywKJ++soycgPT4gJ9eUJywKJ++spCcgPT4gJ9ebJywKJ++spScgPT4gJ9ecJywKJ++spicgPT4gJ9edJywKJ++spycgPT4gJ9eoJywKJ++sqCcgPT4gJ9eqJywKJ++sqScgPT4gJysnLAon762PJyA9PiAn15DXnCcsCifvrZAnID0+ICfZsScsCifvrZEnID0+ICfZsScsCifvrZInID0+ICfZuycsCifvrZMnID0+ICfZuycsCifvrZQnID0+ICfZuycsCifvrZUnID0+ICfZuycsCifvrZYnID0+ICfZvicsCifvrZcnID0+ICfZvicsCifvrZgnID0+ICfZvicsCifvrZknID0+ICfZvicsCifvrZonID0+ICfagCcsCifvrZsnID0+ICfagCcsCifvrZwnID0+ICfagCcsCifvrZ0nID0+ICfagCcsCifvrZ4nID0+ICfZuicsCifvrZ8nID0+ICfZuicsCifvraAnID0+ICfZuicsCifvraEnID0+ICfZuicsCifvraInID0+ICfZvycsCifvraMnID0+ICfZvycsCifvraQnID0+ICfZvycsCifvraUnID0+ICfZvycsCifvraYnID0+ICfZuScsCifvracnID0+ICfZuScsCifvragnID0+ICfZuScsCifvraknID0+ICfZuScsCifvraonID0+ICfapCcsCifvrasnID0+ICfapCcsCifvrawnID0+ICfapCcsCifvra0nID0+ICfapCcsCifvra4nID0+ICfapicsCifvra8nID0+ICfapicsCifvrbAnID0+ICfapicsCifvrbEnID0+ICfapicsCifvrbInID0+ICfahCcsCifvrbMnID0+ICfahCcsCifvrbQnID0+ICfahCcsCifvrbUnID0+ICfahCcsCifvrbYnID0+ICfagycsCifvrbcnID0+ICfagycsCifvrbgnID0+ICfagycsCifvrbknID0+ICfagycsCifvrbonID0+ICfahicsCifvrbsnID0+ICfahicsCifvrbwnID0+ICfahicsCifvrb0nID0+ICfahicsCifvrb4nID0+ICfahycsCifvrb8nID0+ICfahycsCifvroAnID0+ICfahycsCifvroEnID0+ICfahycsCifvroInID0+ICfajScsCifvroMnID0+ICfajScsCifvroQnID0+ICfajCcsCifvroUnID0+ICfajCcsCifvroYnID0+ICfajicsCifvrocnID0+ICfajicsCifvrognID0+ICfaiCcsCifvroknID0+ICfaiCcsCifvroonID0+ICfamCcsCifvrosnID0+ICfamCcsCifvrownID0+ICfakScsCifvro0nID0+ICfakScsCifvro4nID0+ICfaqScsCifvro8nID0+ICfaqScsCifvrpAnID0+ICfaqScsCifvrpEnID0+ICfaqScsCifvrpInID0+ICfarycsCifvrpMnID0+ICfarycsCifvrpQnID0+ICfarycsCifvrpUnID0+ICfarycsCifvrpYnID0+ICfasycsCifvrpcnID0+ICfasycsCifvrpgnID0+ICfasycsCifvrpknID0+ICfasycsCifvrponID0+ICfasScsCifvrpsnID0+ICfasScsCifvrpwnID0+ICfasScsCifvrp0nID0+ICfasScsCifvrp4nID0+ICfauicsCifvrp8nID0+ICfauicsCifvrqAnID0+ICfauycsCifvrqEnID0+ICfauycsCifvrqInID0+ICfauycsCifvrqMnID0+ICfauycsCifvrqQnID0+ICfbldmUJywKJ++upScgPT4gJ9uV2ZQnLAon766mJyA9PiAn24EnLAon766nJyA9PiAn24EnLAon766oJyA9PiAn24EnLAon766pJyA9PiAn24EnLAon766qJyA9PiAn2r4nLAon766rJyA9PiAn2r4nLAon766sJyA9PiAn2r4nLAon766tJyA9PiAn2r4nLAon766uJyA9PiAn25InLAon766vJyA9PiAn25InLAon766wJyA9PiAn25LZlCcsCifvrrEnID0+ICfbktmUJywKJ++vkycgPT4gJ9qtJywKJ++vlCcgPT4gJ9qtJywKJ++vlScgPT4gJ9qtJywKJ++vlicgPT4gJ9qtJywKJ++vlycgPT4gJ9uHJywKJ++vmCcgPT4gJ9uHJywKJ++vmScgPT4gJ9uGJywKJ++vmicgPT4gJ9uGJywKJ++vmycgPT4gJ9uIJywKJ++vnCcgPT4gJ9uIJywKJ++vnScgPT4gJ9uH2bQnLAon76+eJyA9PiAn24snLAon76+fJyA9PiAn24snLAon76+gJyA9PiAn24UnLAon76+hJyA9PiAn24UnLAon76+iJyA9PiAn24knLAon76+jJyA9PiAn24knLAon76+kJyA9PiAn25AnLAon76+lJyA9PiAn25AnLAon76+mJyA9PiAn25AnLAon76+nJyA9PiAn25AnLAon76+oJyA9PiAn2YknLAon76+pJyA9PiAn2YknLAon76+qJyA9PiAn2YrZlNinJywKJ++vqycgPT4gJ9mK2ZTYpycsCifvr6wnID0+ICfZitmU25UnLAon76+tJyA9PiAn2YrZlNuVJywKJ++vricgPT4gJ9mK2ZTZiCcsCifvr68nID0+ICfZitmU2YgnLAon76+wJyA9PiAn2YrZlNuHJywKJ++vsScgPT4gJ9mK2ZTbhycsCifvr7InID0+ICfZitmU24YnLAon76+zJyA9PiAn2YrZlNuGJywKJ++vtCcgPT4gJ9mK2ZTbiCcsCifvr7UnID0+ICfZitmU24gnLAon76+2JyA9PiAn2YrZlNuQJywKJ++vtycgPT4gJ9mK2ZTbkCcsCifvr7gnID0+ICfZitmU25AnLAon76+5JyA9PiAn2YrZlNmJJywKJ++vuicgPT4gJ9mK2ZTZiScsCifvr7snID0+ICfZitmU2YknLAon76+8JyA9PiAn24wnLAon76+9JyA9PiAn24wnLAon76++JyA9PiAn24wnLAon76+/JyA9PiAn24wnLAon77CAJyA9PiAn2YrZlNisJywKJ++wgScgPT4gJ9mK2ZTYrScsCifvsIInID0+ICfZitmU2YUnLAon77CDJyA9PiAn2YrZlNmJJywKJ++whCcgPT4gJ9mK2ZTZiicsCifvsIUnID0+ICfYqNisJywKJ++whicgPT4gJ9io2K0nLAon77CHJyA9PiAn2KjYricsCifvsIgnID0+ICfYqNmFJywKJ++wiScgPT4gJ9io2YknLAon77CKJyA9PiAn2KjZiicsCifvsIsnID0+ICfYqtisJywKJ++wjCcgPT4gJ9iq2K0nLAon77CNJyA9PiAn2KrYricsCifvsI4nID0+ICfYqtmFJywKJ++wjycgPT4gJ9iq2YknLAon77CQJyA9PiAn2KrZiicsCifvsJEnID0+ICfYq9isJywKJ++wkicgPT4gJ9ir2YUnLAon77CTJyA9PiAn2KvZiScsCifvsJQnID0+ICfYq9mKJywKJ++wlScgPT4gJ9is2K0nLAon77CWJyA9PiAn2KzZhScsCifvsJcnID0+ICfYrdisJywKJ++wmCcgPT4gJ9it2YUnLAon77CZJyA9PiAn2K7YrCcsCifvsJonID0+ICfYrtitJywKJ++wmycgPT4gJ9iu2YUnLAon77CcJyA9PiAn2LPYrCcsCifvsJ0nID0+ICfYs9itJywKJ++wnicgPT4gJ9iz2K4nLAon77CfJyA9PiAn2LPZhScsCifvsKAnID0+ICfYtditJywKJ++woScgPT4gJ9i12YUnLAon77CiJyA9PiAn2LbYrCcsCifvsKMnID0+ICfYttitJywKJ++wpCcgPT4gJ9i22K4nLAon77ClJyA9PiAn2LbZhScsCifvsKYnID0+ICfYt9itJywKJ++wpycgPT4gJ9i32YUnLAon77CoJyA9PiAn2LjZhScsCifvsKknID0+ICfYudisJywKJ++wqicgPT4gJ9i52YUnLAon77CrJyA9PiAn2LrYrCcsCifvsKwnID0+ICfYutmFJywKJ++wrScgPT4gJ9mB2KwnLAon77CuJyA9PiAn2YHYrScsCifvsK8nID0+ICfZgdiuJywKJ++wsCcgPT4gJ9mB2YUnLAon77CxJyA9PiAn2YHZiScsCifvsLInID0+ICfZgdmKJywKJ++wsycgPT4gJ9mC2K0nLAon77C0JyA9PiAn2YLZhScsCifvsLUnID0+ICfZgtmJJywKJ++wticgPT4gJ9mC2YonLAon77C3JyA9PiAn2YPYpycsCifvsLgnID0+ICfZg9isJywKJ++wuScgPT4gJ9mD2K0nLAon77C6JyA9PiAn2YPYricsCifvsLsnID0+ICfZg9mEJywKJ++wvCcgPT4gJ9mD2YUnLAon77C9JyA9PiAn2YPZiScsCifvsL4nID0+ICfZg9mKJywKJ++wvycgPT4gJ9mE2KwnLAon77GAJyA9PiAn2YTYrScsCifvsYEnID0+ICfZhNiuJywKJ++xgicgPT4gJ9mE2YUnLAon77GDJyA9PiAn2YTZiScsCifvsYQnID0+ICfZhNmKJywKJ++xhScgPT4gJ9mF2KwnLAon77GGJyA9PiAn2YXYrScsCifvsYcnID0+ICfZhdiuJywKJ++xiCcgPT4gJ9mF2YUnLAon77GJJyA9PiAn2YXZiScsCifvsYonID0+ICfZhdmKJywKJ++xiycgPT4gJ9mG2KwnLAon77GMJyA9PiAn2YbYrScsCifvsY0nID0+ICfZhtiuJywKJ++xjicgPT4gJ9mG2YUnLAon77GPJyA9PiAn2YbZiScsCifvsZAnID0+ICfZhtmKJywKJ++xkScgPT4gJ9mH2KwnLAon77GSJyA9PiAn2YfZhScsCifvsZMnID0+ICfZh9mJJywKJ++xlCcgPT4gJ9mH2YonLAon77GVJyA9PiAn2YrYrCcsCifvsZYnID0+ICfZititJywKJ++xlycgPT4gJ9mK2K4nLAon77GYJyA9PiAn2YrZhScsCifvsZknID0+ICfZitmJJywKJ++xmicgPT4gJ9mK2YonLAon77GbJyA9PiAn2LDZsCcsCifvsZwnID0+ICfYsdmwJywKJ++xnScgPT4gJ9mJ2bAnLAon77GeJyA9PiAnINmM2ZEnLAon77GfJyA9PiAnINmN2ZEnLAon77GgJyA9PiAnINmO2ZEnLAon77GhJyA9PiAnINmP2ZEnLAon77GiJyA9PiAnINmQ2ZEnLAon77GjJyA9PiAnINmR2bAnLAon77GkJyA9PiAn2YrZlNixJywKJ++xpScgPT4gJ9mK2ZTYsicsCifvsaYnID0+ICfZitmU2YUnLAon77GnJyA9PiAn2YrZlNmGJywKJ++xqCcgPT4gJ9mK2ZTZiScsCifvsaknID0+ICfZitmU2YonLAon77GqJyA9PiAn2KjYsScsCifvsasnID0+ICfYqNiyJywKJ++xrCcgPT4gJ9io2YUnLAon77GtJyA9PiAn2KjZhicsCifvsa4nID0+ICfYqNmJJywKJ++xrycgPT4gJ9io2YonLAon77GwJyA9PiAn2KrYsScsCifvsbEnID0+ICfYqtiyJywKJ++xsicgPT4gJ9iq2YUnLAon77GzJyA9PiAn2KrZhicsCifvsbQnID0+ICfYqtmJJywKJ++xtScgPT4gJ9iq2YonLAon77G2JyA9PiAn2KvYsScsCifvsbcnID0+ICfYq9iyJywKJ++xuCcgPT4gJ9ir2YUnLAon77G5JyA9PiAn2KvZhicsCifvsbonID0+ICfYq9mJJywKJ++xuycgPT4gJ9ir2YonLAon77G8JyA9PiAn2YHZiScsCifvsb0nID0+ICfZgdmKJywKJ++xvicgPT4gJ9mC2YknLAon77G/JyA9PiAn2YLZiicsCifvsoAnID0+ICfZg9inJywKJ++ygScgPT4gJ9mD2YQnLAon77KCJyA9PiAn2YPZhScsCifvsoMnID0+ICfZg9mJJywKJ++yhCcgPT4gJ9mD2YonLAon77KFJyA9PiAn2YTZhScsCifvsoYnID0+ICfZhNmJJywKJ++yhycgPT4gJ9mE2YonLAon77KIJyA9PiAn2YXYpycsCifvsoknID0+ICfZhdmFJywKJ++yiicgPT4gJ9mG2LEnLAon77KLJyA9PiAn2YbYsicsCifvsownID0+ICfZhtmFJywKJ++yjScgPT4gJ9mG2YYnLAon77KOJyA9PiAn2YbZiScsCifvso8nID0+ICfZhtmKJywKJ++ykCcgPT4gJ9mJ2bAnLAon77KRJyA9PiAn2YrYsScsCifvspInID0+ICfZitiyJywKJ++ykycgPT4gJ9mK2YUnLAon77KUJyA9PiAn2YrZhicsCifvspUnID0+ICfZitmJJywKJ++ylicgPT4gJ9mK2YonLAon77KXJyA9PiAn2YrZlNisJywKJ++ymCcgPT4gJ9mK2ZTYrScsCifvspknID0+ICfZitmU2K4nLAon77KaJyA9PiAn2YrZlNmFJywKJ++ymycgPT4gJ9mK2ZTZhycsCifvspwnID0+ICfYqNisJywKJ++ynScgPT4gJ9io2K0nLAon77KeJyA9PiAn2KjYricsCifvsp8nID0+ICfYqNmFJywKJ++yoCcgPT4gJ9io2YcnLAon77KhJyA9PiAn2KrYrCcsCifvsqInID0+ICfYqtitJywKJ++yoycgPT4gJ9iq2K4nLAon77KkJyA9PiAn2KrZhScsCifvsqUnID0+ICfYqtmHJywKJ++ypicgPT4gJ9ir2YUnLAon77KnJyA9PiAn2KzYrScsCifvsqgnID0+ICfYrNmFJywKJ++yqScgPT4gJ9it2KwnLAon77KqJyA9PiAn2K3ZhScsCifvsqsnID0+ICfYrtisJywKJ++yrCcgPT4gJ9iu2YUnLAon77KtJyA9PiAn2LPYrCcsCifvsq4nID0+ICfYs9itJywKJ++yrycgPT4gJ9iz2K4nLAon77KwJyA9PiAn2LPZhScsCifvsrEnID0+ICfYtditJywKJ++ysicgPT4gJ9i12K4nLAon77KzJyA9PiAn2LXZhScsCifvsrQnID0+ICfYttisJywKJ++ytScgPT4gJ9i22K0nLAon77K2JyA9PiAn2LbYricsCifvsrcnID0+ICfYttmFJywKJ++yuCcgPT4gJ9i32K0nLAon77K5JyA9PiAn2LjZhScsCifvsronID0+ICfYudisJywKJ++yuycgPT4gJ9i52YUnLAon77K8JyA9PiAn2LrYrCcsCifvsr0nID0+ICfYutmFJywKJ++yvicgPT4gJ9mB2KwnLAon77K/JyA9PiAn2YHYrScsCifvs4AnID0+ICfZgdiuJywKJ++zgScgPT4gJ9mB2YUnLAon77OCJyA9PiAn2YLYrScsCifvs4MnID0+ICfZgtmFJywKJ++zhCcgPT4gJ9mD2KwnLAon77OFJyA9PiAn2YPYrScsCifvs4YnID0+ICfZg9iuJywKJ++zhycgPT4gJ9mD2YQnLAon77OIJyA9PiAn2YPZhScsCifvs4knID0+ICfZhNisJywKJ++ziicgPT4gJ9mE2K0nLAon77OLJyA9PiAn2YTYricsCifvs4wnID0+ICfZhNmFJywKJ++zjScgPT4gJ9mE2YcnLAon77OOJyA9PiAn2YXYrCcsCifvs48nID0+ICfZhditJywKJ++zkCcgPT4gJ9mF2K4nLAon77ORJyA9PiAn2YXZhScsCifvs5InID0+ICfZhtisJywKJ++zkycgPT4gJ9mG2K0nLAon77OUJyA9PiAn2YbYricsCifvs5UnID0+ICfZhtmFJywKJ++zlicgPT4gJ9mG2YcnLAon77OXJyA9PiAn2YfYrCcsCifvs5gnID0+ICfZh9mFJywKJ++zmScgPT4gJ9mH2bAnLAon77OaJyA9PiAn2YrYrCcsCifvs5snID0+ICfZititJywKJ++znCcgPT4gJ9mK2K4nLAon77OdJyA9PiAn2YrZhScsCifvs54nID0+ICfZitmHJywKJ++znycgPT4gJ9mK2ZTZhScsCifvs6AnID0+ICfZitmU2YcnLAon77OhJyA9PiAn2KjZhScsCifvs6InID0+ICfYqNmHJywKJ++zoycgPT4gJ9iq2YUnLAon77OkJyA9PiAn2KrZhycsCifvs6UnID0+ICfYq9mFJywKJ++zpicgPT4gJ9ir2YcnLAon77OnJyA9PiAn2LPZhScsCifvs6gnID0+ICfYs9mHJywKJ++zqScgPT4gJ9i02YUnLAon77OqJyA9PiAn2LTZhycsCifvs6snID0+ICfZg9mEJywKJ++zrCcgPT4gJ9mD2YUnLAon77OtJyA9PiAn2YTZhScsCifvs64nID0+ICfZhtmFJywKJ++zrycgPT4gJ9mG2YcnLAon77OwJyA9PiAn2YrZhScsCifvs7EnID0+ICfZitmHJywKJ++zsicgPT4gJ9mA2Y7ZkScsCifvs7MnID0+ICfZgNmP2ZEnLAon77O0JyA9PiAn2YDZkNmRJywKJ++ztScgPT4gJ9i32YknLAon77O2JyA9PiAn2LfZiicsCifvs7cnID0+ICfYudmJJywKJ++zuCcgPT4gJ9i52YonLAon77O5JyA9PiAn2LrZiScsCifvs7onID0+ICfYutmKJywKJ++zuycgPT4gJ9iz2YknLAon77O8JyA9PiAn2LPZiicsCifvs70nID0+ICfYtNmJJywKJ++zvicgPT4gJ9i02YonLAon77O/JyA9PiAn2K3ZiScsCifvtIAnID0+ICfYrdmKJywKJ++0gScgPT4gJ9is2YknLAon77SCJyA9PiAn2KzZiicsCifvtIMnID0+ICfYrtmJJywKJ++0hCcgPT4gJ9iu2YonLAon77SFJyA9PiAn2LXZiScsCifvtIYnID0+ICfYtdmKJywKJ++0hycgPT4gJ9i22YknLAon77SIJyA9PiAn2LbZiicsCifvtIknID0+ICfYtNisJywKJ++0iicgPT4gJ9i02K0nLAon77SLJyA9PiAn2LTYricsCifvtIwnID0+ICfYtNmFJywKJ++0jScgPT4gJ9i02LEnLAon77SOJyA9PiAn2LPYsScsCifvtI8nID0+ICfYtdixJywKJ++0kCcgPT4gJ9i22LEnLAon77SRJyA9PiAn2LfZiScsCifvtJInID0+ICfYt9mKJywKJ++0kycgPT4gJ9i52YknLAon77SUJyA9PiAn2LnZiicsCifvtJUnID0+ICfYutmJJywKJ++0licgPT4gJ9i62YonLAon77SXJyA9PiAn2LPZiScsCifvtJgnID0+ICfYs9mKJywKJ++0mScgPT4gJ9i02YknLAon77SaJyA9PiAn2LTZiicsCifvtJsnID0+ICfYrdmJJywKJ++0nCcgPT4gJ9it2YonLAon77SdJyA9PiAn2KzZiScsCifvtJ4nID0+ICfYrNmKJywKJ++0nycgPT4gJ9iu2YknLAon77SgJyA9PiAn2K7ZiicsCifvtKEnID0+ICfYtdmJJywKJ++0oicgPT4gJ9i12YonLAon77SjJyA9PiAn2LbZiScsCifvtKQnID0+ICfYttmKJywKJ++0pScgPT4gJ9i02KwnLAon77SmJyA9PiAn2LTYrScsCifvtKcnID0+ICfYtNiuJywKJ++0qCcgPT4gJ9i02YUnLAon77SpJyA9PiAn2LTYsScsCifvtKonID0+ICfYs9ixJywKJ++0qycgPT4gJ9i12LEnLAon77SsJyA9PiAn2LbYsScsCifvtK0nID0+ICfYtNisJywKJ++0ricgPT4gJ9i02K0nLAon77SvJyA9PiAn2LTYricsCifvtLAnID0+ICfYtNmFJywKJ++0sScgPT4gJ9iz2YcnLAon77SyJyA9PiAn2LTZhycsCifvtLMnID0+ICfYt9mFJywKJ++0tCcgPT4gJ9iz2KwnLAon77S1JyA9PiAn2LPYrScsCifvtLYnID0+ICfYs9iuJywKJ++0tycgPT4gJ9i02KwnLAon77S4JyA9PiAn2LTYrScsCifvtLknID0+ICfYtNiuJywKJ++0uicgPT4gJ9i32YUnLAon77S7JyA9PiAn2LjZhScsCifvtLwnID0+ICfYp9mLJywKJ++0vScgPT4gJ9in2YsnLAon77WQJyA9PiAn2KrYrNmFJywKJ++1kScgPT4gJ9iq2K3YrCcsCifvtZInID0+ICfYqtit2KwnLAon77WTJyA9PiAn2KrYrdmFJywKJ++1lCcgPT4gJ9iq2K7ZhScsCifvtZUnID0+ICfYqtmF2KwnLAon77WWJyA9PiAn2KrZhditJywKJ++1lycgPT4gJ9iq2YXYricsCifvtZgnID0+ICfYrNmF2K0nLAon77WZJyA9PiAn2KzZhditJywKJ++1micgPT4gJ9it2YXZiicsCifvtZsnID0+ICfYrdmF2YknLAon77WcJyA9PiAn2LPYrdisJywKJ++1nScgPT4gJ9iz2KzYrScsCifvtZ4nID0+ICfYs9is2YknLAon77WfJyA9PiAn2LPZhditJywKJ++1oCcgPT4gJ9iz2YXYrScsCifvtaEnID0+ICfYs9mF2KwnLAon77WiJyA9PiAn2LPZhdmFJywKJ++1oycgPT4gJ9iz2YXZhScsCifvtaQnID0+ICfYtdit2K0nLAon77WlJyA9PiAn2LXYrditJywKJ++1picgPT4gJ9i12YXZhScsCifvtacnID0+ICfYtNit2YUnLAon77WoJyA9PiAn2LTYrdmFJywKJ++1qScgPT4gJ9i02KzZiicsCifvtaonID0+ICfYtNmF2K4nLAon77WrJyA9PiAn2LTZhdiuJywKJ++1rCcgPT4gJ9i02YXZhScsCifvta0nID0+ICfYtNmF2YUnLAon77WuJyA9PiAn2LbYrdmJJywKJ++1rycgPT4gJ9i22K7ZhScsCifvtbAnID0+ICfYttiu2YUnLAon77WxJyA9PiAn2LfZhditJywKJ++1sicgPT4gJ9i32YXYrScsCifvtbMnID0+ICfYt9mF2YUnLAon77W0JyA9PiAn2LfZhdmKJywKJ++1tScgPT4gJ9i52KzZhScsCifvtbYnID0+ICfYudmF2YUnLAon77W3JyA9PiAn2LnZhdmFJywKJ++1uCcgPT4gJ9i52YXZiScsCifvtbknID0+ICfYutmF2YUnLAon77W6JyA9PiAn2LrZhdmKJywKJ++1uycgPT4gJ9i62YXZiScsCifvtbwnID0+ICfZgdiu2YUnLAon77W9JyA9PiAn2YHYrtmFJywKJ++1vicgPT4gJ9mC2YXYrScsCifvtb8nID0+ICfZgtmF2YUnLAon77aAJyA9PiAn2YTYrdmFJywKJ++2gScgPT4gJ9mE2K3ZiicsCifvtoInID0+ICfZhNit2YknLAon77aDJyA9PiAn2YTYrNisJywKJ++2hCcgPT4gJ9mE2KzYrCcsCifvtoUnID0+ICfZhNiu2YUnLAon77aGJyA9PiAn2YTYrtmFJywKJ++2hycgPT4gJ9mE2YXYrScsCifvtognID0+ICfZhNmF2K0nLAon77aJJyA9PiAn2YXYrdisJywKJ++2iicgPT4gJ9mF2K3ZhScsCifvtosnID0+ICfZhdit2YonLAon77aMJyA9PiAn2YXYrNitJywKJ++2jScgPT4gJ9mF2KzZhScsCifvto4nID0+ICfZhdiu2KwnLAon77aPJyA9PiAn2YXYrtmFJywKJ++2kicgPT4gJ9mF2KzYricsCifvtpMnID0+ICfZh9mF2KwnLAon77aUJyA9PiAn2YfZhdmFJywKJ++2lScgPT4gJ9mG2K3ZhScsCifvtpYnID0+ICfZhtit2YknLAon77aXJyA9PiAn2YbYrNmFJywKJ++2mCcgPT4gJ9mG2KzZhScsCifvtpknID0+ICfZhtis2YknLAon77aaJyA9PiAn2YbZhdmKJywKJ++2mycgPT4gJ9mG2YXZiScsCifvtpwnID0+ICfZitmF2YUnLAon77adJyA9PiAn2YrZhdmFJywKJ++2nicgPT4gJ9io2K7ZiicsCifvtp8nID0+ICfYqtis2YonLAon77agJyA9PiAn2KrYrNmJJywKJ++2oScgPT4gJ9iq2K7ZiicsCifvtqInID0+ICfYqtiu2YknLAon77ajJyA9PiAn2KrZhdmKJywKJ++2pCcgPT4gJ9iq2YXZiScsCifvtqUnID0+ICfYrNmF2YonLAon77amJyA9PiAn2KzYrdmJJywKJ++2pycgPT4gJ9is2YXZiScsCifvtqgnID0+ICfYs9iu2YknLAon77apJyA9PiAn2LXYrdmKJywKJ++2qicgPT4gJ9i02K3ZiicsCifvtqsnID0+ICfYttit2YonLAon77asJyA9PiAn2YTYrNmKJywKJ++2rScgPT4gJ9mE2YXZiicsCifvtq4nID0+ICfZitit2YonLAon77avJyA9PiAn2YrYrNmKJywKJ++2sCcgPT4gJ9mK2YXZiicsCifvtrEnID0+ICfZhdmF2YonLAon77ayJyA9PiAn2YLZhdmKJywKJ++2sycgPT4gJ9mG2K3ZiicsCifvtrQnID0+ICfZgtmF2K0nLAon77a1JyA9PiAn2YTYrdmFJywKJ++2ticgPT4gJ9i52YXZiicsCifvtrcnID0+ICfZg9mF2YonLAon77a4JyA9PiAn2YbYrNitJywKJ++2uScgPT4gJ9mF2K7ZiicsCifvtronID0+ICfZhNis2YUnLAon77a7JyA9PiAn2YPZhdmFJywKJ++2vCcgPT4gJ9mE2KzZhScsCifvtr0nID0+ICfZhtis2K0nLAon77a+JyA9PiAn2KzYrdmKJywKJ++2vycgPT4gJ9it2KzZiicsCifvt4AnID0+ICfZhdis2YonLAon77eBJyA9PiAn2YHZhdmKJywKJ++3gicgPT4gJ9io2K3ZiicsCifvt4MnID0+ICfZg9mF2YUnLAon77eEJyA9PiAn2LnYrNmFJywKJ++3hScgPT4gJ9i12YXZhScsCifvt4YnID0+ICfYs9iu2YonLAon77eHJyA9PiAn2YbYrNmKJywKJ++3sCcgPT4gJ9i12YTbkicsCifvt7EnID0+ICfZgtmE25InLAon77eyJyA9PiAn2KfZhNmE2YcnLAon77ezJyA9PiAn2KfZg9io2LEnLAon77e0JyA9PiAn2YXYrdmF2K8nLAon77e1JyA9PiAn2LXZhNi52YUnLAon77e2JyA9PiAn2LHYs9mI2YQnLAon77e3JyA9PiAn2LnZhNmK2YcnLAon77e4JyA9PiAn2YjYs9mE2YUnLAon77e5JyA9PiAn2LXZhNmJJywKJ++3uicgPT4gJ9i12YTZiSDYp9mE2YTZhyDYudmE2YrZhyDZiNiz2YTZhScsCifvt7snID0+ICfYrNmEINis2YTYp9mE2YcnLAon77e8JyA9PiAn2LHbjNin2YQnLAon77iQJyA9PiAnLCcsCifvuJEnID0+ICfjgIEnLAon77iSJyA9PiAn44CCJywKJ++4kycgPT4gJzonLAon77iUJyA9PiAnOycsCifvuJUnID0+ICchJywKJ++4licgPT4gJz8nLAon77iXJyA9PiAn44CWJywKJ++4mCcgPT4gJ+OAlycsCifvuJknID0+ICcuLi4nLAon77iwJyA9PiAnLi4nLAon77ixJyA9PiAn4oCUJywKJ++4sicgPT4gJ+KAkycsCifvuLMnID0+ICdfJywKJ++4tCcgPT4gJ18nLAon77i1JyA9PiAnKCcsCifvuLYnID0+ICcpJywKJ++4tycgPT4gJ3snLAon77i4JyA9PiAnfScsCifvuLknID0+ICfjgJQnLAon77i6JyA9PiAn44CVJywKJ++4uycgPT4gJ+OAkCcsCifvuLwnID0+ICfjgJEnLAon77i9JyA9PiAn44CKJywKJ++4vicgPT4gJ+OAiycsCifvuL8nID0+ICfjgIgnLAon77mAJyA9PiAn44CJJywKJ++5gScgPT4gJ+OAjCcsCifvuYInID0+ICfjgI0nLAon77mDJyA9PiAn44COJywKJ++5hCcgPT4gJ+OAjycsCifvuYcnID0+ICdbJywKJ++5iCcgPT4gJ10nLAon77mJJyA9PiAnIMyFJywKJ++5iicgPT4gJyDMhScsCifvuYsnID0+ICcgzIUnLAon77mMJyA9PiAnIMyFJywKJ++5jScgPT4gJ18nLAon77mOJyA9PiAnXycsCifvuY8nID0+ICdfJywKJ++5kCcgPT4gJywnLAon77mRJyA9PiAn44CBJywKJ++5kicgPT4gJy4nLAon77mUJyA9PiAnOycsCifvuZUnID0+ICc6JywKJ++5licgPT4gJz8nLAon77mXJyA9PiAnIScsCifvuZgnID0+ICfigJQnLAon77mZJyA9PiAnKCcsCifvuZonID0+ICcpJywKJ++5mycgPT4gJ3snLAon77mcJyA9PiAnfScsCifvuZ0nID0+ICfjgJQnLAon77meJyA9PiAn44CVJywKJ++5nycgPT4gJyMnLAon77mgJyA9PiAnJicsCifvuaEnID0+ICcqJywKJ++5oicgPT4gJysnLAon77mjJyA9PiAnLScsCifvuaQnID0+ICc8JywKJ++5pScgPT4gJz4nLAon77mmJyA9PiAnPScsCifvuagnID0+ICdcXCcsCifvuaknID0+ICckJywKJ++5qicgPT4gJyUnLAon77mrJyA9PiAnQCcsCifvubAnID0+ICcg2YsnLAon77mxJyA9PiAn2YDZiycsCifvubInID0+ICcg2YwnLAon77m0JyA9PiAnINmNJywKJ++5ticgPT4gJyDZjicsCifvubcnID0+ICfZgNmOJywKJ++5uCcgPT4gJyDZjycsCifvubknID0+ICfZgNmPJywKJ++5uicgPT4gJyDZkCcsCifvubsnID0+ICfZgNmQJywKJ++5vCcgPT4gJyDZkScsCifvub0nID0+ICfZgNmRJywKJ++5vicgPT4gJyDZkicsCifvub8nID0+ICfZgNmSJywKJ++6gCcgPT4gJ9ihJywKJ++6gScgPT4gJ9in2ZMnLAon77qCJyA9PiAn2KfZkycsCifvuoMnID0+ICfYp9mUJywKJ++6hCcgPT4gJ9in2ZQnLAon77qFJyA9PiAn2YjZlCcsCifvuoYnID0+ICfZiNmUJywKJ++6hycgPT4gJ9in2ZUnLAon77qIJyA9PiAn2KfZlScsCifvuoknID0+ICfZitmUJywKJ++6iicgPT4gJ9mK2ZQnLAon77qLJyA9PiAn2YrZlCcsCifvuownID0+ICfZitmUJywKJ++6jScgPT4gJ9inJywKJ++6jicgPT4gJ9inJywKJ++6jycgPT4gJ9ioJywKJ++6kCcgPT4gJ9ioJywKJ++6kScgPT4gJ9ioJywKJ++6kicgPT4gJ9ioJywKJ++6kycgPT4gJ9ipJywKJ++6lCcgPT4gJ9ipJywKJ++6lScgPT4gJ9iqJywKJ++6licgPT4gJ9iqJywKJ++6lycgPT4gJ9iqJywKJ++6mCcgPT4gJ9iqJywKJ++6mScgPT4gJ9irJywKJ++6micgPT4gJ9irJywKJ++6mycgPT4gJ9irJywKJ++6nCcgPT4gJ9irJywKJ++6nScgPT4gJ9isJywKJ++6nicgPT4gJ9isJywKJ++6nycgPT4gJ9isJywKJ++6oCcgPT4gJ9isJywKJ++6oScgPT4gJ9itJywKJ++6oicgPT4gJ9itJywKJ++6oycgPT4gJ9itJywKJ++6pCcgPT4gJ9itJywKJ++6pScgPT4gJ9iuJywKJ++6picgPT4gJ9iuJywKJ++6pycgPT4gJ9iuJywKJ++6qCcgPT4gJ9iuJywKJ++6qScgPT4gJ9ivJywKJ++6qicgPT4gJ9ivJywKJ++6qycgPT4gJ9iwJywKJ++6rCcgPT4gJ9iwJywKJ++6rScgPT4gJ9ixJywKJ++6ricgPT4gJ9ixJywKJ++6rycgPT4gJ9iyJywKJ++6sCcgPT4gJ9iyJywKJ++6sScgPT4gJ9izJywKJ++6sicgPT4gJ9izJywKJ++6sycgPT4gJ9izJywKJ++6tCcgPT4gJ9izJywKJ++6tScgPT4gJ9i0JywKJ++6ticgPT4gJ9i0JywKJ++6tycgPT4gJ9i0JywKJ++6uCcgPT4gJ9i0JywKJ++6uScgPT4gJ9i1JywKJ++6uicgPT4gJ9i1JywKJ++6uycgPT4gJ9i1JywKJ++6vCcgPT4gJ9i1JywKJ++6vScgPT4gJ9i2JywKJ++6vicgPT4gJ9i2JywKJ++6vycgPT4gJ9i2JywKJ++7gCcgPT4gJ9i2JywKJ++7gScgPT4gJ9i3JywKJ++7gicgPT4gJ9i3JywKJ++7gycgPT4gJ9i3JywKJ++7hCcgPT4gJ9i3JywKJ++7hScgPT4gJ9i4JywKJ++7hicgPT4gJ9i4JywKJ++7hycgPT4gJ9i4JywKJ++7iCcgPT4gJ9i4JywKJ++7iScgPT4gJ9i5JywKJ++7iicgPT4gJ9i5JywKJ++7iycgPT4gJ9i5JywKJ++7jCcgPT4gJ9i5JywKJ++7jScgPT4gJ9i6JywKJ++7jicgPT4gJ9i6JywKJ++7jycgPT4gJ9i6JywKJ++7kCcgPT4gJ9i6JywKJ++7kScgPT4gJ9mBJywKJ++7kicgPT4gJ9mBJywKJ++7kycgPT4gJ9mBJywKJ++7lCcgPT4gJ9mBJywKJ++7lScgPT4gJ9mCJywKJ++7licgPT4gJ9mCJywKJ++7lycgPT4gJ9mCJywKJ++7mCcgPT4gJ9mCJywKJ++7mScgPT4gJ9mDJywKJ++7micgPT4gJ9mDJywKJ++7mycgPT4gJ9mDJywKJ++7nCcgPT4gJ9mDJywKJ++7nScgPT4gJ9mEJywKJ++7nicgPT4gJ9mEJywKJ++7nycgPT4gJ9mEJywKJ++7oCcgPT4gJ9mEJywKJ++7oScgPT4gJ9mFJywKJ++7oicgPT4gJ9mFJywKJ++7oycgPT4gJ9mFJywKJ++7pCcgPT4gJ9mFJywKJ++7pScgPT4gJ9mGJywKJ++7picgPT4gJ9mGJywKJ++7pycgPT4gJ9mGJywKJ++7qCcgPT4gJ9mGJywKJ++7qScgPT4gJ9mHJywKJ++7qicgPT4gJ9mHJywKJ++7qycgPT4gJ9mHJywKJ++7rCcgPT4gJ9mHJywKJ++7rScgPT4gJ9mIJywKJ++7ricgPT4gJ9mIJywKJ++7rycgPT4gJ9mJJywKJ++7sCcgPT4gJ9mJJywKJ++7sScgPT4gJ9mKJywKJ++7sicgPT4gJ9mKJywKJ++7sycgPT4gJ9mKJywKJ++7tCcgPT4gJ9mKJywKJ++7tScgPT4gJ9mE2KfZkycsCifvu7YnID0+ICfZhNin2ZMnLAon77u3JyA9PiAn2YTYp9mUJywKJ++7uCcgPT4gJ9mE2KfZlCcsCifvu7knID0+ICfZhNin2ZUnLAon77u6JyA9PiAn2YTYp9mVJywKJ++7uycgPT4gJ9mE2KcnLAon77u8JyA9PiAn2YTYpycsCifvvIEnID0+ICchJywKJ++8gicgPT4gJyInLAon77yDJyA9PiAnIycsCifvvIQnID0+ICckJywKJ++8hScgPT4gJyUnLAon77yGJyA9PiAnJicsCifvvIcnID0+ICdcJycsCifvvIgnID0+ICcoJywKJ++8iScgPT4gJyknLAon77yKJyA9PiAnKicsCifvvIsnID0+ICcrJywKJ++8jCcgPT4gJywnLAon77yNJyA9PiAnLScsCifvvI4nID0+ICcuJywKJ++8jycgPT4gJy8nLAon77yQJyA9PiAnMCcsCifvvJEnID0+ICcxJywKJ++8kicgPT4gJzInLAon77yTJyA9PiAnMycsCifvvJQnID0+ICc0JywKJ++8lScgPT4gJzUnLAon77yWJyA9PiAnNicsCifvvJcnID0+ICc3JywKJ++8mCcgPT4gJzgnLAon77yZJyA9PiAnOScsCifvvJonID0+ICc6JywKJ++8mycgPT4gJzsnLAon77ycJyA9PiAnPCcsCifvvJ0nID0+ICc9JywKJ++8nicgPT4gJz4nLAon77yfJyA9PiAnPycsCifvvKAnID0+ICdAJywKJ++8oScgPT4gJ0EnLAon77yiJyA9PiAnQicsCifvvKMnID0+ICdDJywKJ++8pCcgPT4gJ0QnLAon77ylJyA9PiAnRScsCifvvKYnID0+ICdGJywKJ++8pycgPT4gJ0cnLAon77yoJyA9PiAnSCcsCifvvKknID0+ICdJJywKJ++8qicgPT4gJ0onLAon77yrJyA9PiAnSycsCifvvKwnID0+ICdMJywKJ++8rScgPT4gJ00nLAon77yuJyA9PiAnTicsCifvvK8nID0+ICdPJywKJ++8sCcgPT4gJ1AnLAon77yxJyA9PiAnUScsCifvvLInID0+ICdSJywKJ++8sycgPT4gJ1MnLAon77y0JyA9PiAnVCcsCifvvLUnID0+ICdVJywKJ++8ticgPT4gJ1YnLAon77y3JyA9PiAnVycsCifvvLgnID0+ICdYJywKJ++8uScgPT4gJ1knLAon77y6JyA9PiAnWicsCifvvLsnID0+ICdbJywKJ++8vCcgPT4gJ1xcJywKJ++8vScgPT4gJ10nLAon77y+JyA9PiAnXicsCifvvL8nID0+ICdfJywKJ++9gCcgPT4gJ2AnLAon772BJyA9PiAnYScsCifvvYInID0+ICdiJywKJ++9gycgPT4gJ2MnLAon772EJyA9PiAnZCcsCifvvYUnID0+ICdlJywKJ++9hicgPT4gJ2YnLAon772HJyA9PiAnZycsCifvvYgnID0+ICdoJywKJ++9iScgPT4gJ2knLAon772KJyA9PiAnaicsCifvvYsnID0+ICdrJywKJ++9jCcgPT4gJ2wnLAon772NJyA9PiAnbScsCifvvY4nID0+ICduJywKJ++9jycgPT4gJ28nLAon772QJyA9PiAncCcsCifvvZEnID0+ICdxJywKJ++9kicgPT4gJ3InLAon772TJyA9PiAncycsCifvvZQnID0+ICd0JywKJ++9lScgPT4gJ3UnLAon772WJyA9PiAndicsCifvvZcnID0+ICd3JywKJ++9mCcgPT4gJ3gnLAon772ZJyA9PiAneScsCifvvZonID0+ICd6JywKJ++9mycgPT4gJ3snLAon772cJyA9PiAnfCcsCifvvZ0nID0+ICd9JywKJ++9nicgPT4gJ34nLAon772fJyA9PiAn4qaFJywKJ++9oCcgPT4gJ+KmhicsCifvvaEnID0+ICfjgIInLAon772iJyA9PiAn44CMJywKJ++9oycgPT4gJ+OAjScsCifvvaQnID0+ICfjgIEnLAon772lJyA9PiAn44O7JywKJ++9picgPT4gJ+ODsicsCifvvacnID0+ICfjgqEnLAon772oJyA9PiAn44KjJywKJ++9qScgPT4gJ+OCpScsCifvvaonID0+ICfjgqcnLAon772rJyA9PiAn44KpJywKJ++9rCcgPT4gJ+ODoycsCifvva0nID0+ICfjg6UnLAon772uJyA9PiAn44OnJywKJ++9rycgPT4gJ+ODgycsCifvvbAnID0+ICfjg7wnLAon772xJyA9PiAn44KiJywKJ++9sicgPT4gJ+OCpCcsCifvvbMnID0+ICfjgqYnLAon7720JyA9PiAn44KoJywKJ++9tScgPT4gJ+OCqicsCifvvbYnID0+ICfjgqsnLAon7723JyA9PiAn44KtJywKJ++9uCcgPT4gJ+OCrycsCifvvbknID0+ICfjgrEnLAon7726JyA9PiAn44KzJywKJ++9uycgPT4gJ+OCtScsCifvvbwnID0+ICfjgrcnLAon7729JyA9PiAn44K5JywKJ++9vicgPT4gJ+OCuycsCifvvb8nID0+ICfjgr0nLAon776AJyA9PiAn44K/JywKJ+++gScgPT4gJ+ODgScsCifvvoInID0+ICfjg4QnLAon776DJyA9PiAn44OGJywKJ+++hCcgPT4gJ+ODiCcsCifvvoUnID0+ICfjg4onLAon776GJyA9PiAn44OLJywKJ+++hycgPT4gJ+ODjCcsCifvvognID0+ICfjg40nLAon776JJyA9PiAn44OOJywKJ+++iicgPT4gJ+ODjycsCifvvosnID0+ICfjg5InLAon776MJyA9PiAn44OVJywKJ+++jScgPT4gJ+ODmCcsCifvvo4nID0+ICfjg5snLAon776PJyA9PiAn44OeJywKJ+++kCcgPT4gJ+ODnycsCifvvpEnID0+ICfjg6AnLAon776SJyA9PiAn44OhJywKJ+++kycgPT4gJ+ODoicsCifvvpQnID0+ICfjg6QnLAon776VJyA9PiAn44OmJywKJ+++licgPT4gJ+ODqCcsCifvvpcnID0+ICfjg6knLAon776YJyA9PiAn44OqJywKJ+++mScgPT4gJ+ODqycsCifvvponID0+ICfjg6wnLAon776bJyA9PiAn44OtJywKJ+++nCcgPT4gJ+ODrycsCifvvp0nID0+ICfjg7MnLAon776eJyA9PiAn44KZJywKJ+++nycgPT4gJ+OCmicsCifvvqAnID0+ICfhhaAnLAon776hJyA9PiAn4YSAJywKJ+++oicgPT4gJ+GEgScsCifvvqMnID0+ICfhhqonLAon776kJyA9PiAn4YSCJywKJ+++pScgPT4gJ+GGrCcsCifvvqYnID0+ICfhhq0nLAon776nJyA9PiAn4YSDJywKJ+++qCcgPT4gJ+GEhCcsCifvvqknID0+ICfhhIUnLAon776qJyA9PiAn4YawJywKJ+++qycgPT4gJ+GGsScsCifvvqwnID0+ICfhhrInLAon776tJyA9PiAn4YazJywKJ+++ricgPT4gJ+GGtCcsCifvvq8nID0+ICfhhrUnLAon776wJyA9PiAn4YSaJywKJ+++sScgPT4gJ+GEhicsCifvvrInID0+ICfhhIcnLAon776zJyA9PiAn4YSIJywKJ+++tCcgPT4gJ+GEoScsCifvvrUnID0+ICfhhIknLAon7762JyA9PiAn4YSKJywKJ+++tycgPT4gJ+GEiycsCifvvrgnID0+ICfhhIwnLAon7765JyA9PiAn4YSNJywKJ+++uicgPT4gJ+GEjicsCifvvrsnID0+ICfhhI8nLAon7768JyA9PiAn4YSQJywKJ+++vScgPT4gJ+GEkScsCifvvr4nID0+ICfhhJInLAon77+CJyA9PiAn4YWhJywKJ++/gycgPT4gJ+GFoicsCifvv4QnID0+ICfhhaMnLAon77+FJyA9PiAn4YWkJywKJ++/hicgPT4gJ+GFpScsCifvv4cnID0+ICfhhaYnLAon77+KJyA9PiAn4YWnJywKJ++/iycgPT4gJ+GFqCcsCifvv4wnID0+ICfhhaknLAon77+NJyA9PiAn4YWqJywKJ++/jicgPT4gJ+GFqycsCifvv48nID0+ICfhhawnLAon77+SJyA9PiAn4YWtJywKJ++/kycgPT4gJ+GFricsCifvv5QnID0+ICfhha8nLAon77+VJyA9PiAn4YWwJywKJ++/licgPT4gJ+GFsScsCifvv5cnID0+ICfhhbInLAon77+aJyA9PiAn4YWzJywKJ++/mycgPT4gJ+GFtCcsCifvv5wnID0+ICfhhbUnLAon77+gJyA9PiAnwqInLAon77+hJyA9PiAnwqMnLAon77+iJyA9PiAnwqwnLAon77+jJyA9PiAnIMyEJywKJ++/pCcgPT4gJ8KmJywKJ++/pScgPT4gJ8KlJywKJ++/picgPT4gJ+KCqScsCifvv6gnID0+ICfilIInLAon77+pJyA9PiAn4oaQJywKJ++/qicgPT4gJ+KGkScsCifvv6snID0+ICfihpInLAon77+sJyA9PiAn4oaTJywKJ++/rScgPT4gJ+KWoCcsCifvv64nID0+ICfil4snLAon8J2QgCcgPT4gJ0EnLAon8J2QgScgPT4gJ0InLAon8J2QgicgPT4gJ0MnLAon8J2QgycgPT4gJ0QnLAon8J2QhCcgPT4gJ0UnLAon8J2QhScgPT4gJ0YnLAon8J2QhicgPT4gJ0cnLAon8J2QhycgPT4gJ0gnLAon8J2QiCcgPT4gJ0knLAon8J2QiScgPT4gJ0onLAon8J2QiicgPT4gJ0snLAon8J2QiycgPT4gJ0wnLAon8J2QjCcgPT4gJ00nLAon8J2QjScgPT4gJ04nLAon8J2QjicgPT4gJ08nLAon8J2QjycgPT4gJ1AnLAon8J2QkCcgPT4gJ1EnLAon8J2QkScgPT4gJ1InLAon8J2QkicgPT4gJ1MnLAon8J2QkycgPT4gJ1QnLAon8J2QlCcgPT4gJ1UnLAon8J2QlScgPT4gJ1YnLAon8J2QlicgPT4gJ1cnLAon8J2QlycgPT4gJ1gnLAon8J2QmCcgPT4gJ1knLAon8J2QmScgPT4gJ1onLAon8J2QmicgPT4gJ2EnLAon8J2QmycgPT4gJ2InLAon8J2QnCcgPT4gJ2MnLAon8J2QnScgPT4gJ2QnLAon8J2QnicgPT4gJ2UnLAon8J2QnycgPT4gJ2YnLAon8J2QoCcgPT4gJ2cnLAon8J2QoScgPT4gJ2gnLAon8J2QoicgPT4gJ2knLAon8J2QoycgPT4gJ2onLAon8J2QpCcgPT4gJ2snLAon8J2QpScgPT4gJ2wnLAon8J2QpicgPT4gJ20nLAon8J2QpycgPT4gJ24nLAon8J2QqCcgPT4gJ28nLAon8J2QqScgPT4gJ3AnLAon8J2QqicgPT4gJ3EnLAon8J2QqycgPT4gJ3InLAon8J2QrCcgPT4gJ3MnLAon8J2QrScgPT4gJ3QnLAon8J2QricgPT4gJ3UnLAon8J2QrycgPT4gJ3YnLAon8J2QsCcgPT4gJ3cnLAon8J2QsScgPT4gJ3gnLAon8J2QsicgPT4gJ3knLAon8J2QsycgPT4gJ3onLAon8J2QtCcgPT4gJ0EnLAon8J2QtScgPT4gJ0InLAon8J2QticgPT4gJ0MnLAon8J2QtycgPT4gJ0QnLAon8J2QuCcgPT4gJ0UnLAon8J2QuScgPT4gJ0YnLAon8J2QuicgPT4gJ0cnLAon8J2QuycgPT4gJ0gnLAon8J2QvCcgPT4gJ0knLAon8J2QvScgPT4gJ0onLAon8J2QvicgPT4gJ0snLAon8J2QvycgPT4gJ0wnLAon8J2RgCcgPT4gJ00nLAon8J2RgScgPT4gJ04nLAon8J2RgicgPT4gJ08nLAon8J2RgycgPT4gJ1AnLAon8J2RhCcgPT4gJ1EnLAon8J2RhScgPT4gJ1InLAon8J2RhicgPT4gJ1MnLAon8J2RhycgPT4gJ1QnLAon8J2RiCcgPT4gJ1UnLAon8J2RiScgPT4gJ1YnLAon8J2RiicgPT4gJ1cnLAon8J2RiycgPT4gJ1gnLAon8J2RjCcgPT4gJ1knLAon8J2RjScgPT4gJ1onLAon8J2RjicgPT4gJ2EnLAon8J2RjycgPT4gJ2InLAon8J2RkCcgPT4gJ2MnLAon8J2RkScgPT4gJ2QnLAon8J2RkicgPT4gJ2UnLAon8J2RkycgPT4gJ2YnLAon8J2RlCcgPT4gJ2cnLAon8J2RlicgPT4gJ2knLAon8J2RlycgPT4gJ2onLAon8J2RmCcgPT4gJ2snLAon8J2RmScgPT4gJ2wnLAon8J2RmicgPT4gJ20nLAon8J2RmycgPT4gJ24nLAon8J2RnCcgPT4gJ28nLAon8J2RnScgPT4gJ3AnLAon8J2RnicgPT4gJ3EnLAon8J2RnycgPT4gJ3InLAon8J2RoCcgPT4gJ3MnLAon8J2RoScgPT4gJ3QnLAon8J2RoicgPT4gJ3UnLAon8J2RoycgPT4gJ3YnLAon8J2RpCcgPT4gJ3cnLAon8J2RpScgPT4gJ3gnLAon8J2RpicgPT4gJ3knLAon8J2RpycgPT4gJ3onLAon8J2RqCcgPT4gJ0EnLAon8J2RqScgPT4gJ0InLAon8J2RqicgPT4gJ0MnLAon8J2RqycgPT4gJ0QnLAon8J2RrCcgPT4gJ0UnLAon8J2RrScgPT4gJ0YnLAon8J2RricgPT4gJ0cnLAon8J2RrycgPT4gJ0gnLAon8J2RsCcgPT4gJ0knLAon8J2RsScgPT4gJ0onLAon8J2RsicgPT4gJ0snLAon8J2RsycgPT4gJ0wnLAon8J2RtCcgPT4gJ00nLAon8J2RtScgPT4gJ04nLAon8J2RticgPT4gJ08nLAon8J2RtycgPT4gJ1AnLAon8J2RuCcgPT4gJ1EnLAon8J2RuScgPT4gJ1InLAon8J2RuicgPT4gJ1MnLAon8J2RuycgPT4gJ1QnLAon8J2RvCcgPT4gJ1UnLAon8J2RvScgPT4gJ1YnLAon8J2RvicgPT4gJ1cnLAon8J2RvycgPT4gJ1gnLAon8J2SgCcgPT4gJ1knLAon8J2SgScgPT4gJ1onLAon8J2SgicgPT4gJ2EnLAon8J2SgycgPT4gJ2InLAon8J2ShCcgPT4gJ2MnLAon8J2ShScgPT4gJ2QnLAon8J2ShicgPT4gJ2UnLAon8J2ShycgPT4gJ2YnLAon8J2SiCcgPT4gJ2cnLAon8J2SiScgPT4gJ2gnLAon8J2SiicgPT4gJ2knLAon8J2SiycgPT4gJ2onLAon8J2SjCcgPT4gJ2snLAon8J2SjScgPT4gJ2wnLAon8J2SjicgPT4gJ20nLAon8J2SjycgPT4gJ24nLAon8J2SkCcgPT4gJ28nLAon8J2SkScgPT4gJ3AnLAon8J2SkicgPT4gJ3EnLAon8J2SkycgPT4gJ3InLAon8J2SlCcgPT4gJ3MnLAon8J2SlScgPT4gJ3QnLAon8J2SlicgPT4gJ3UnLAon8J2SlycgPT4gJ3YnLAon8J2SmCcgPT4gJ3cnLAon8J2SmScgPT4gJ3gnLAon8J2SmicgPT4gJ3knLAon8J2SmycgPT4gJ3onLAon8J2SnCcgPT4gJ0EnLAon8J2SnicgPT4gJ0MnLAon8J2SnycgPT4gJ0QnLAon8J2SoicgPT4gJ0cnLAon8J2SpScgPT4gJ0onLAon8J2SpicgPT4gJ0snLAon8J2SqScgPT4gJ04nLAon8J2SqicgPT4gJ08nLAon8J2SqycgPT4gJ1AnLAon8J2SrCcgPT4gJ1EnLAon8J2SricgPT4gJ1MnLAon8J2SrycgPT4gJ1QnLAon8J2SsCcgPT4gJ1UnLAon8J2SsScgPT4gJ1YnLAon8J2SsicgPT4gJ1cnLAon8J2SsycgPT4gJ1gnLAon8J2StCcgPT4gJ1knLAon8J2StScgPT4gJ1onLAon8J2SticgPT4gJ2EnLAon8J2StycgPT4gJ2InLAon8J2SuCcgPT4gJ2MnLAon8J2SuScgPT4gJ2QnLAon8J2SuycgPT4gJ2YnLAon8J2SvScgPT4gJ2gnLAon8J2SvicgPT4gJ2knLAon8J2SvycgPT4gJ2onLAon8J2TgCcgPT4gJ2snLAon8J2TgScgPT4gJ2wnLAon8J2TgicgPT4gJ20nLAon8J2TgycgPT4gJ24nLAon8J2ThScgPT4gJ3AnLAon8J2ThicgPT4gJ3EnLAon8J2ThycgPT4gJ3InLAon8J2TiCcgPT4gJ3MnLAon8J2TiScgPT4gJ3QnLAon8J2TiicgPT4gJ3UnLAon8J2TiycgPT4gJ3YnLAon8J2TjCcgPT4gJ3cnLAon8J2TjScgPT4gJ3gnLAon8J2TjicgPT4gJ3knLAon8J2TjycgPT4gJ3onLAon8J2TkCcgPT4gJ0EnLAon8J2TkScgPT4gJ0InLAon8J2TkicgPT4gJ0MnLAon8J2TkycgPT4gJ0QnLAon8J2TlCcgPT4gJ0UnLAon8J2TlScgPT4gJ0YnLAon8J2TlicgPT4gJ0cnLAon8J2TlycgPT4gJ0gnLAon8J2TmCcgPT4gJ0knLAon8J2TmScgPT4gJ0onLAon8J2TmicgPT4gJ0snLAon8J2TmycgPT4gJ0wnLAon8J2TnCcgPT4gJ00nLAon8J2TnScgPT4gJ04nLAon8J2TnicgPT4gJ08nLAon8J2TnycgPT4gJ1AnLAon8J2ToCcgPT4gJ1EnLAon8J2ToScgPT4gJ1InLAon8J2ToicgPT4gJ1MnLAon8J2ToycgPT4gJ1QnLAon8J2TpCcgPT4gJ1UnLAon8J2TpScgPT4gJ1YnLAon8J2TpicgPT4gJ1cnLAon8J2TpycgPT4gJ1gnLAon8J2TqCcgPT4gJ1knLAon8J2TqScgPT4gJ1onLAon8J2TqicgPT4gJ2EnLAon8J2TqycgPT4gJ2InLAon8J2TrCcgPT4gJ2MnLAon8J2TrScgPT4gJ2QnLAon8J2TricgPT4gJ2UnLAon8J2TrycgPT4gJ2YnLAon8J2TsCcgPT4gJ2cnLAon8J2TsScgPT4gJ2gnLAon8J2TsicgPT4gJ2knLAon8J2TsycgPT4gJ2onLAon8J2TtCcgPT4gJ2snLAon8J2TtScgPT4gJ2wnLAon8J2TticgPT4gJ20nLAon8J2TtycgPT4gJ24nLAon8J2TuCcgPT4gJ28nLAon8J2TuScgPT4gJ3AnLAon8J2TuicgPT4gJ3EnLAon8J2TuycgPT4gJ3InLAon8J2TvCcgPT4gJ3MnLAon8J2TvScgPT4gJ3QnLAon8J2TvicgPT4gJ3UnLAon8J2TvycgPT4gJ3YnLAon8J2UgCcgPT4gJ3cnLAon8J2UgScgPT4gJ3gnLAon8J2UgicgPT4gJ3knLAon8J2UgycgPT4gJ3onLAon8J2UhCcgPT4gJ0EnLAon8J2UhScgPT4gJ0InLAon8J2UhycgPT4gJ0QnLAon8J2UiCcgPT4gJ0UnLAon8J2UiScgPT4gJ0YnLAon8J2UiicgPT4gJ0cnLAon8J2UjScgPT4gJ0onLAon8J2UjicgPT4gJ0snLAon8J2UjycgPT4gJ0wnLAon8J2UkCcgPT4gJ00nLAon8J2UkScgPT4gJ04nLAon8J2UkicgPT4gJ08nLAon8J2UkycgPT4gJ1AnLAon8J2UlCcgPT4gJ1EnLAon8J2UlicgPT4gJ1MnLAon8J2UlycgPT4gJ1QnLAon8J2UmCcgPT4gJ1UnLAon8J2UmScgPT4gJ1YnLAon8J2UmicgPT4gJ1cnLAon8J2UmycgPT4gJ1gnLAon8J2UnCcgPT4gJ1knLAon8J2UnicgPT4gJ2EnLAon8J2UnycgPT4gJ2InLAon8J2UoCcgPT4gJ2MnLAon8J2UoScgPT4gJ2QnLAon8J2UoicgPT4gJ2UnLAon8J2UoycgPT4gJ2YnLAon8J2UpCcgPT4gJ2cnLAon8J2UpScgPT4gJ2gnLAon8J2UpicgPT4gJ2knLAon8J2UpycgPT4gJ2onLAon8J2UqCcgPT4gJ2snLAon8J2UqScgPT4gJ2wnLAon8J2UqicgPT4gJ20nLAon8J2UqycgPT4gJ24nLAon8J2UrCcgPT4gJ28nLAon8J2UrScgPT4gJ3AnLAon8J2UricgPT4gJ3EnLAon8J2UrycgPT4gJ3InLAon8J2UsCcgPT4gJ3MnLAon8J2UsScgPT4gJ3QnLAon8J2UsicgPT4gJ3UnLAon8J2UsycgPT4gJ3YnLAon8J2UtCcgPT4gJ3cnLAon8J2UtScgPT4gJ3gnLAon8J2UticgPT4gJ3knLAon8J2UtycgPT4gJ3onLAon8J2UuCcgPT4gJ0EnLAon8J2UuScgPT4gJ0InLAon8J2UuycgPT4gJ0QnLAon8J2UvCcgPT4gJ0UnLAon8J2UvScgPT4gJ0YnLAon8J2UvicgPT4gJ0cnLAon8J2VgCcgPT4gJ0knLAon8J2VgScgPT4gJ0onLAon8J2VgicgPT4gJ0snLAon8J2VgycgPT4gJ0wnLAon8J2VhCcgPT4gJ00nLAon8J2VhicgPT4gJ08nLAon8J2ViicgPT4gJ1MnLAon8J2ViycgPT4gJ1QnLAon8J2VjCcgPT4gJ1UnLAon8J2VjScgPT4gJ1YnLAon8J2VjicgPT4gJ1cnLAon8J2VjycgPT4gJ1gnLAon8J2VkCcgPT4gJ1knLAon8J2VkicgPT4gJ2EnLAon8J2VkycgPT4gJ2InLAon8J2VlCcgPT4gJ2MnLAon8J2VlScgPT4gJ2QnLAon8J2VlicgPT4gJ2UnLAon8J2VlycgPT4gJ2YnLAon8J2VmCcgPT4gJ2cnLAon8J2VmScgPT4gJ2gnLAon8J2VmicgPT4gJ2knLAon8J2VmycgPT4gJ2onLAon8J2VnCcgPT4gJ2snLAon8J2VnScgPT4gJ2wnLAon8J2VnicgPT4gJ20nLAon8J2VnycgPT4gJ24nLAon8J2VoCcgPT4gJ28nLAon8J2VoScgPT4gJ3AnLAon8J2VoicgPT4gJ3EnLAon8J2VoycgPT4gJ3InLAon8J2VpCcgPT4gJ3MnLAon8J2VpScgPT4gJ3QnLAon8J2VpicgPT4gJ3UnLAon8J2VpycgPT4gJ3YnLAon8J2VqCcgPT4gJ3cnLAon8J2VqScgPT4gJ3gnLAon8J2VqicgPT4gJ3knLAon8J2VqycgPT4gJ3onLAon8J2VrCcgPT4gJ0EnLAon8J2VrScgPT4gJ0InLAon8J2VricgPT4gJ0MnLAon8J2VrycgPT4gJ0QnLAon8J2VsCcgPT4gJ0UnLAon8J2VsScgPT4gJ0YnLAon8J2VsicgPT4gJ0cnLAon8J2VsycgPT4gJ0gnLAon8J2VtCcgPT4gJ0knLAon8J2VtScgPT4gJ0onLAon8J2VticgPT4gJ0snLAon8J2VtycgPT4gJ0wnLAon8J2VuCcgPT4gJ00nLAon8J2VuScgPT4gJ04nLAon8J2VuicgPT4gJ08nLAon8J2VuycgPT4gJ1AnLAon8J2VvCcgPT4gJ1EnLAon8J2VvScgPT4gJ1InLAon8J2VvicgPT4gJ1MnLAon8J2VvycgPT4gJ1QnLAon8J2WgCcgPT4gJ1UnLAon8J2WgScgPT4gJ1YnLAon8J2WgicgPT4gJ1cnLAon8J2WgycgPT4gJ1gnLAon8J2WhCcgPT4gJ1knLAon8J2WhScgPT4gJ1onLAon8J2WhicgPT4gJ2EnLAon8J2WhycgPT4gJ2InLAon8J2WiCcgPT4gJ2MnLAon8J2WiScgPT4gJ2QnLAon8J2WiicgPT4gJ2UnLAon8J2WiycgPT4gJ2YnLAon8J2WjCcgPT4gJ2cnLAon8J2WjScgPT4gJ2gnLAon8J2WjicgPT4gJ2knLAon8J2WjycgPT4gJ2onLAon8J2WkCcgPT4gJ2snLAon8J2WkScgPT4gJ2wnLAon8J2WkicgPT4gJ20nLAon8J2WkycgPT4gJ24nLAon8J2WlCcgPT4gJ28nLAon8J2WlScgPT4gJ3AnLAon8J2WlicgPT4gJ3EnLAon8J2WlycgPT4gJ3InLAon8J2WmCcgPT4gJ3MnLAon8J2WmScgPT4gJ3QnLAon8J2WmicgPT4gJ3UnLAon8J2WmycgPT4gJ3YnLAon8J2WnCcgPT4gJ3cnLAon8J2WnScgPT4gJ3gnLAon8J2WnicgPT4gJ3knLAon8J2WnycgPT4gJ3onLAon8J2WoCcgPT4gJ0EnLAon8J2WoScgPT4gJ0InLAon8J2WoicgPT4gJ0MnLAon8J2WoycgPT4gJ0QnLAon8J2WpCcgPT4gJ0UnLAon8J2WpScgPT4gJ0YnLAon8J2WpicgPT4gJ0cnLAon8J2WpycgPT4gJ0gnLAon8J2WqCcgPT4gJ0knLAon8J2WqScgPT4gJ0onLAon8J2WqicgPT4gJ0snLAon8J2WqycgPT4gJ0wnLAon8J2WrCcgPT4gJ00nLAon8J2WrScgPT4gJ04nLAon8J2WricgPT4gJ08nLAon8J2WrycgPT4gJ1AnLAon8J2WsCcgPT4gJ1EnLAon8J2WsScgPT4gJ1InLAon8J2WsicgPT4gJ1MnLAon8J2WsycgPT4gJ1QnLAon8J2WtCcgPT4gJ1UnLAon8J2WtScgPT4gJ1YnLAon8J2WticgPT4gJ1cnLAon8J2WtycgPT4gJ1gnLAon8J2WuCcgPT4gJ1knLAon8J2WuScgPT4gJ1onLAon8J2WuicgPT4gJ2EnLAon8J2WuycgPT4gJ2InLAon8J2WvCcgPT4gJ2MnLAon8J2WvScgPT4gJ2QnLAon8J2WvicgPT4gJ2UnLAon8J2WvycgPT4gJ2YnLAon8J2XgCcgPT4gJ2cnLAon8J2XgScgPT4gJ2gnLAon8J2XgicgPT4gJ2knLAon8J2XgycgPT4gJ2onLAon8J2XhCcgPT4gJ2snLAon8J2XhScgPT4gJ2wnLAon8J2XhicgPT4gJ20nLAon8J2XhycgPT4gJ24nLAon8J2XiCcgPT4gJ28nLAon8J2XiScgPT4gJ3AnLAon8J2XiicgPT4gJ3EnLAon8J2XiycgPT4gJ3InLAon8J2XjCcgPT4gJ3MnLAon8J2XjScgPT4gJ3QnLAon8J2XjicgPT4gJ3UnLAon8J2XjycgPT4gJ3YnLAon8J2XkCcgPT4gJ3cnLAon8J2XkScgPT4gJ3gnLAon8J2XkicgPT4gJ3knLAon8J2XkycgPT4gJ3onLAon8J2XlCcgPT4gJ0EnLAon8J2XlScgPT4gJ0InLAon8J2XlicgPT4gJ0MnLAon8J2XlycgPT4gJ0QnLAon8J2XmCcgPT4gJ0UnLAon8J2XmScgPT4gJ0YnLAon8J2XmicgPT4gJ0cnLAon8J2XmycgPT4gJ0gnLAon8J2XnCcgPT4gJ0knLAon8J2XnScgPT4gJ0onLAon8J2XnicgPT4gJ0snLAon8J2XnycgPT4gJ0wnLAon8J2XoCcgPT4gJ00nLAon8J2XoScgPT4gJ04nLAon8J2XoicgPT4gJ08nLAon8J2XoycgPT4gJ1AnLAon8J2XpCcgPT4gJ1EnLAon8J2XpScgPT4gJ1InLAon8J2XpicgPT4gJ1MnLAon8J2XpycgPT4gJ1QnLAon8J2XqCcgPT4gJ1UnLAon8J2XqScgPT4gJ1YnLAon8J2XqicgPT4gJ1cnLAon8J2XqycgPT4gJ1gnLAon8J2XrCcgPT4gJ1knLAon8J2XrScgPT4gJ1onLAon8J2XricgPT4gJ2EnLAon8J2XrycgPT4gJ2InLAon8J2XsCcgPT4gJ2MnLAon8J2XsScgPT4gJ2QnLAon8J2XsicgPT4gJ2UnLAon8J2XsycgPT4gJ2YnLAon8J2XtCcgPT4gJ2cnLAon8J2XtScgPT4gJ2gnLAon8J2XticgPT4gJ2knLAon8J2XtycgPT4gJ2onLAon8J2XuCcgPT4gJ2snLAon8J2XuScgPT4gJ2wnLAon8J2XuicgPT4gJ20nLAon8J2XuycgPT4gJ24nLAon8J2XvCcgPT4gJ28nLAon8J2XvScgPT4gJ3AnLAon8J2XvicgPT4gJ3EnLAon8J2XvycgPT4gJ3InLAon8J2YgCcgPT4gJ3MnLAon8J2YgScgPT4gJ3QnLAon8J2YgicgPT4gJ3UnLAon8J2YgycgPT4gJ3YnLAon8J2YhCcgPT4gJ3cnLAon8J2YhScgPT4gJ3gnLAon8J2YhicgPT4gJ3knLAon8J2YhycgPT4gJ3onLAon8J2YiCcgPT4gJ0EnLAon8J2YiScgPT4gJ0InLAon8J2YiicgPT4gJ0MnLAon8J2YiycgPT4gJ0QnLAon8J2YjCcgPT4gJ0UnLAon8J2YjScgPT4gJ0YnLAon8J2YjicgPT4gJ0cnLAon8J2YjycgPT4gJ0gnLAon8J2YkCcgPT4gJ0knLAon8J2YkScgPT4gJ0onLAon8J2YkicgPT4gJ0snLAon8J2YkycgPT4gJ0wnLAon8J2YlCcgPT4gJ00nLAon8J2YlScgPT4gJ04nLAon8J2YlicgPT4gJ08nLAon8J2YlycgPT4gJ1AnLAon8J2YmCcgPT4gJ1EnLAon8J2YmScgPT4gJ1InLAon8J2YmicgPT4gJ1MnLAon8J2YmycgPT4gJ1QnLAon8J2YnCcgPT4gJ1UnLAon8J2YnScgPT4gJ1YnLAon8J2YnicgPT4gJ1cnLAon8J2YnycgPT4gJ1gnLAon8J2YoCcgPT4gJ1knLAon8J2YoScgPT4gJ1onLAon8J2YoicgPT4gJ2EnLAon8J2YoycgPT4gJ2InLAon8J2YpCcgPT4gJ2MnLAon8J2YpScgPT4gJ2QnLAon8J2YpicgPT4gJ2UnLAon8J2YpycgPT4gJ2YnLAon8J2YqCcgPT4gJ2cnLAon8J2YqScgPT4gJ2gnLAon8J2YqicgPT4gJ2knLAon8J2YqycgPT4gJ2onLAon8J2YrCcgPT4gJ2snLAon8J2YrScgPT4gJ2wnLAon8J2YricgPT4gJ20nLAon8J2YrycgPT4gJ24nLAon8J2YsCcgPT4gJ28nLAon8J2YsScgPT4gJ3AnLAon8J2YsicgPT4gJ3EnLAon8J2YsycgPT4gJ3InLAon8J2YtCcgPT4gJ3MnLAon8J2YtScgPT4gJ3QnLAon8J2YticgPT4gJ3UnLAon8J2YtycgPT4gJ3YnLAon8J2YuCcgPT4gJ3cnLAon8J2YuScgPT4gJ3gnLAon8J2YuicgPT4gJ3knLAon8J2YuycgPT4gJ3onLAon8J2YvCcgPT4gJ0EnLAon8J2YvScgPT4gJ0InLAon8J2YvicgPT4gJ0MnLAon8J2YvycgPT4gJ0QnLAon8J2ZgCcgPT4gJ0UnLAon8J2ZgScgPT4gJ0YnLAon8J2ZgicgPT4gJ0cnLAon8J2ZgycgPT4gJ0gnLAon8J2ZhCcgPT4gJ0knLAon8J2ZhScgPT4gJ0onLAon8J2ZhicgPT4gJ0snLAon8J2ZhycgPT4gJ0wnLAon8J2ZiCcgPT4gJ00nLAon8J2ZiScgPT4gJ04nLAon8J2ZiicgPT4gJ08nLAon8J2ZiycgPT4gJ1AnLAon8J2ZjCcgPT4gJ1EnLAon8J2ZjScgPT4gJ1InLAon8J2ZjicgPT4gJ1MnLAon8J2ZjycgPT4gJ1QnLAon8J2ZkCcgPT4gJ1UnLAon8J2ZkScgPT4gJ1YnLAon8J2ZkicgPT4gJ1cnLAon8J2ZkycgPT4gJ1gnLAon8J2ZlCcgPT4gJ1knLAon8J2ZlScgPT4gJ1onLAon8J2ZlicgPT4gJ2EnLAon8J2ZlycgPT4gJ2InLAon8J2ZmCcgPT4gJ2MnLAon8J2ZmScgPT4gJ2QnLAon8J2ZmicgPT4gJ2UnLAon8J2ZmycgPT4gJ2YnLAon8J2ZnCcgPT4gJ2cnLAon8J2ZnScgPT4gJ2gnLAon8J2ZnicgPT4gJ2knLAon8J2ZnycgPT4gJ2onLAon8J2ZoCcgPT4gJ2snLAon8J2ZoScgPT4gJ2wnLAon8J2ZoicgPT4gJ20nLAon8J2ZoycgPT4gJ24nLAon8J2ZpCcgPT4gJ28nLAon8J2ZpScgPT4gJ3AnLAon8J2ZpicgPT4gJ3EnLAon8J2ZpycgPT4gJ3InLAon8J2ZqCcgPT4gJ3MnLAon8J2ZqScgPT4gJ3QnLAon8J2ZqicgPT4gJ3UnLAon8J2ZqycgPT4gJ3YnLAon8J2ZrCcgPT4gJ3cnLAon8J2ZrScgPT4gJ3gnLAon8J2ZricgPT4gJ3knLAon8J2ZrycgPT4gJ3onLAon8J2ZsCcgPT4gJ0EnLAon8J2ZsScgPT4gJ0InLAon8J2ZsicgPT4gJ0MnLAon8J2ZsycgPT4gJ0QnLAon8J2ZtCcgPT4gJ0UnLAon8J2ZtScgPT4gJ0YnLAon8J2ZticgPT4gJ0cnLAon8J2ZtycgPT4gJ0gnLAon8J2ZuCcgPT4gJ0knLAon8J2ZuScgPT4gJ0onLAon8J2ZuicgPT4gJ0snLAon8J2ZuycgPT4gJ0wnLAon8J2ZvCcgPT4gJ00nLAon8J2ZvScgPT4gJ04nLAon8J2ZvicgPT4gJ08nLAon8J2ZvycgPT4gJ1AnLAon8J2agCcgPT4gJ1EnLAon8J2agScgPT4gJ1InLAon8J2agicgPT4gJ1MnLAon8J2agycgPT4gJ1QnLAon8J2ahCcgPT4gJ1UnLAon8J2ahScgPT4gJ1YnLAon8J2ahicgPT4gJ1cnLAon8J2ahycgPT4gJ1gnLAon8J2aiCcgPT4gJ1knLAon8J2aiScgPT4gJ1onLAon8J2aiicgPT4gJ2EnLAon8J2aiycgPT4gJ2InLAon8J2ajCcgPT4gJ2MnLAon8J2ajScgPT4gJ2QnLAon8J2ajicgPT4gJ2UnLAon8J2ajycgPT4gJ2YnLAon8J2akCcgPT4gJ2cnLAon8J2akScgPT4gJ2gnLAon8J2akicgPT4gJ2knLAon8J2akycgPT4gJ2onLAon8J2alCcgPT4gJ2snLAon8J2alScgPT4gJ2wnLAon8J2alicgPT4gJ20nLAon8J2alycgPT4gJ24nLAon8J2amCcgPT4gJ28nLAon8J2amScgPT4gJ3AnLAon8J2amicgPT4gJ3EnLAon8J2amycgPT4gJ3InLAon8J2anCcgPT4gJ3MnLAon8J2anScgPT4gJ3QnLAon8J2anicgPT4gJ3UnLAon8J2anycgPT4gJ3YnLAon8J2aoCcgPT4gJ3cnLAon8J2aoScgPT4gJ3gnLAon8J2aoicgPT4gJ3knLAon8J2aoycgPT4gJ3onLAon8J2apCcgPT4gJ8SxJywKJ/CdmqUnID0+ICfItycsCifwnZqoJyA9PiAnzpEnLAon8J2aqScgPT4gJ86SJywKJ/CdmqonID0+ICfOkycsCifwnZqrJyA9PiAnzpQnLAon8J2arCcgPT4gJ86VJywKJ/Cdmq0nID0+ICfOlicsCifwnZquJyA9PiAnzpcnLAon8J2arycgPT4gJ86YJywKJ/CdmrAnID0+ICfOmScsCifwnZqxJyA9PiAnzponLAon8J2asicgPT4gJ86bJywKJ/CdmrMnID0+ICfOnCcsCifwnZq0JyA9PiAnzp0nLAon8J2atScgPT4gJ86eJywKJ/CdmrYnID0+ICfOnycsCifwnZq3JyA9PiAnzqAnLAon8J2auCcgPT4gJ86hJywKJ/CdmrknID0+ICfOmCcsCifwnZq6JyA9PiAnzqMnLAon8J2auycgPT4gJ86kJywKJ/CdmrwnID0+ICfOpScsCifwnZq9JyA9PiAnzqYnLAon8J2avicgPT4gJ86nJywKJ/Cdmr8nID0+ICfOqCcsCifwnZuAJyA9PiAnzqknLAon8J2bgScgPT4gJ+KIhycsCifwnZuCJyA9PiAnzrEnLAon8J2bgycgPT4gJ86yJywKJ/Cdm4QnID0+ICfOsycsCifwnZuFJyA9PiAnzrQnLAon8J2bhicgPT4gJ861JywKJ/Cdm4cnID0+ICfOticsCifwnZuIJyA9PiAnzrcnLAon8J2biScgPT4gJ864JywKJ/Cdm4onID0+ICfOuScsCifwnZuLJyA9PiAnzronLAon8J2bjCcgPT4gJ867JywKJ/Cdm40nID0+ICfOvCcsCifwnZuOJyA9PiAnzr0nLAon8J2bjycgPT4gJ86+JywKJ/Cdm5AnID0+ICfOvycsCifwnZuRJyA9PiAnz4AnLAon8J2bkicgPT4gJ8+BJywKJ/Cdm5MnID0+ICfPgicsCifwnZuUJyA9PiAnz4MnLAon8J2blScgPT4gJ8+EJywKJ/Cdm5YnID0+ICfPhScsCifwnZuXJyA9PiAnz4YnLAon8J2bmCcgPT4gJ8+HJywKJ/Cdm5knID0+ICfPiCcsCifwnZuaJyA9PiAnz4knLAon8J2bmycgPT4gJ+KIgicsCifwnZucJyA9PiAnzrUnLAon8J2bnScgPT4gJ864JywKJ/Cdm54nID0+ICfOuicsCifwnZufJyA9PiAnz4YnLAon8J2boCcgPT4gJ8+BJywKJ/Cdm6EnID0+ICfPgCcsCifwnZuiJyA9PiAnzpEnLAon8J2boycgPT4gJ86SJywKJ/Cdm6QnID0+ICfOkycsCifwnZulJyA9PiAnzpQnLAon8J2bpicgPT4gJ86VJywKJ/Cdm6cnID0+ICfOlicsCifwnZuoJyA9PiAnzpcnLAon8J2bqScgPT4gJ86YJywKJ/Cdm6onID0+ICfOmScsCifwnZurJyA9PiAnzponLAon8J2brCcgPT4gJ86bJywKJ/Cdm60nID0+ICfOnCcsCifwnZuuJyA9PiAnzp0nLAon8J2brycgPT4gJ86eJywKJ/Cdm7AnID0+ICfOnycsCifwnZuxJyA9PiAnzqAnLAon8J2bsicgPT4gJ86hJywKJ/Cdm7MnID0+ICfOmCcsCifwnZu0JyA9PiAnzqMnLAon8J2btScgPT4gJ86kJywKJ/Cdm7YnID0+ICfOpScsCifwnZu3JyA9PiAnzqYnLAon8J2buCcgPT4gJ86nJywKJ/Cdm7knID0+ICfOqCcsCifwnZu6JyA9PiAnzqknLAon8J2buycgPT4gJ+KIhycsCifwnZu8JyA9PiAnzrEnLAon8J2bvScgPT4gJ86yJywKJ/Cdm74nID0+ICfOsycsCifwnZu/JyA9PiAnzrQnLAon8J2cgCcgPT4gJ861JywKJ/CdnIEnID0+ICfOticsCifwnZyCJyA9PiAnzrcnLAon8J2cgycgPT4gJ864JywKJ/CdnIQnID0+ICfOuScsCifwnZyFJyA9PiAnzronLAon8J2chicgPT4gJ867JywKJ/CdnIcnID0+ICfOvCcsCifwnZyIJyA9PiAnzr0nLAon8J2ciScgPT4gJ86+JywKJ/CdnIonID0+ICfOvycsCifwnZyLJyA9PiAnz4AnLAon8J2cjCcgPT4gJ8+BJywKJ/CdnI0nID0+ICfPgicsCifwnZyOJyA9PiAnz4MnLAon8J2cjycgPT4gJ8+EJywKJ/CdnJAnID0+ICfPhScsCifwnZyRJyA9PiAnz4YnLAon8J2ckicgPT4gJ8+HJywKJ/CdnJMnID0+ICfPiCcsCifwnZyUJyA9PiAnz4knLAon8J2clScgPT4gJ+KIgicsCifwnZyWJyA9PiAnzrUnLAon8J2clycgPT4gJ864JywKJ/CdnJgnID0+ICfOuicsCifwnZyZJyA9PiAnz4YnLAon8J2cmicgPT4gJ8+BJywKJ/CdnJsnID0+ICfPgCcsCifwnZycJyA9PiAnzpEnLAon8J2cnScgPT4gJ86SJywKJ/CdnJ4nID0+ICfOkycsCifwnZyfJyA9PiAnzpQnLAon8J2coCcgPT4gJ86VJywKJ/CdnKEnID0+ICfOlicsCifwnZyiJyA9PiAnzpcnLAon8J2coycgPT4gJ86YJywKJ/CdnKQnID0+ICfOmScsCifwnZylJyA9PiAnzponLAon8J2cpicgPT4gJ86bJywKJ/CdnKcnID0+ICfOnCcsCifwnZyoJyA9PiAnzp0nLAon8J2cqScgPT4gJ86eJywKJ/CdnKonID0+ICfOnycsCifwnZyrJyA9PiAnzqAnLAon8J2crCcgPT4gJ86hJywKJ/CdnK0nID0+ICfOmCcsCifwnZyuJyA9PiAnzqMnLAon8J2crycgPT4gJ86kJywKJ/CdnLAnID0+ICfOpScsCifwnZyxJyA9PiAnzqYnLAon8J2csicgPT4gJ86nJywKJ/CdnLMnID0+ICfOqCcsCifwnZy0JyA9PiAnzqknLAon8J2ctScgPT4gJ+KIhycsCifwnZy2JyA9PiAnzrEnLAon8J2ctycgPT4gJ86yJywKJ/CdnLgnID0+ICfOsycsCifwnZy5JyA9PiAnzrQnLAon8J2cuicgPT4gJ861JywKJ/CdnLsnID0+ICfOticsCifwnZy8JyA9PiAnzrcnLAon8J2cvScgPT4gJ864JywKJ/CdnL4nID0+ICfOuScsCifwnZy/JyA9PiAnzronLAon8J2dgCcgPT4gJ867JywKJ/CdnYEnID0+ICfOvCcsCifwnZ2CJyA9PiAnzr0nLAon8J2dgycgPT4gJ86+JywKJ/CdnYQnID0+ICfOvycsCifwnZ2FJyA9PiAnz4AnLAon8J2dhicgPT4gJ8+BJywKJ/CdnYcnID0+ICfPgicsCifwnZ2IJyA9PiAnz4MnLAon8J2diScgPT4gJ8+EJywKJ/CdnYonID0+ICfPhScsCifwnZ2LJyA9PiAnz4YnLAon8J2djCcgPT4gJ8+HJywKJ/CdnY0nID0+ICfPiCcsCifwnZ2OJyA9PiAnz4knLAon8J2djycgPT4gJ+KIgicsCifwnZ2QJyA9PiAnzrUnLAon8J2dkScgPT4gJ864JywKJ/CdnZInID0+ICfOuicsCifwnZ2TJyA9PiAnz4YnLAon8J2dlCcgPT4gJ8+BJywKJ/CdnZUnID0+ICfPgCcsCifwnZ2WJyA9PiAnzpEnLAon8J2dlycgPT4gJ86SJywKJ/CdnZgnID0+ICfOkycsCifwnZ2ZJyA9PiAnzpQnLAon8J2dmicgPT4gJ86VJywKJ/CdnZsnID0+ICfOlicsCifwnZ2cJyA9PiAnzpcnLAon8J2dnScgPT4gJ86YJywKJ/CdnZ4nID0+ICfOmScsCifwnZ2fJyA9PiAnzponLAon8J2doCcgPT4gJ86bJywKJ/CdnaEnID0+ICfOnCcsCifwnZ2iJyA9PiAnzp0nLAon8J2doycgPT4gJ86eJywKJ/CdnaQnID0+ICfOnycsCifwnZ2lJyA9PiAnzqAnLAon8J2dpicgPT4gJ86hJywKJ/CdnacnID0+ICfOmCcsCifwnZ2oJyA9PiAnzqMnLAon8J2dqScgPT4gJ86kJywKJ/CdnaonID0+ICfOpScsCifwnZ2rJyA9PiAnzqYnLAon8J2drCcgPT4gJ86nJywKJ/Cdna0nID0+ICfOqCcsCifwnZ2uJyA9PiAnzqknLAon8J2drycgPT4gJ+KIhycsCifwnZ2wJyA9PiAnzrEnLAon8J2dsScgPT4gJ86yJywKJ/CdnbInID0+ICfOsycsCifwnZ2zJyA9PiAnzrQnLAon8J2dtCcgPT4gJ861JywKJ/CdnbUnID0+ICfOticsCifwnZ22JyA9PiAnzrcnLAon8J2dtycgPT4gJ864JywKJ/CdnbgnID0+ICfOuScsCifwnZ25JyA9PiAnzronLAon8J2duicgPT4gJ867JywKJ/CdnbsnID0+ICfOvCcsCifwnZ28JyA9PiAnzr0nLAon8J2dvScgPT4gJ86+JywKJ/Cdnb4nID0+ICfOvycsCifwnZ2/JyA9PiAnz4AnLAon8J2egCcgPT4gJ8+BJywKJ/CdnoEnID0+ICfPgicsCifwnZ6CJyA9PiAnz4MnLAon8J2egycgPT4gJ8+EJywKJ/CdnoQnID0+ICfPhScsCifwnZ6FJyA9PiAnz4YnLAon8J2ehicgPT4gJ8+HJywKJ/CdnocnID0+ICfPiCcsCifwnZ6IJyA9PiAnz4knLAon8J2eiScgPT4gJ+KIgicsCifwnZ6KJyA9PiAnzrUnLAon8J2eiycgPT4gJ864JywKJ/CdnownID0+ICfOuicsCifwnZ6NJyA9PiAnz4YnLAon8J2ejicgPT4gJ8+BJywKJ/Cdno8nID0+ICfPgCcsCifwnZ6QJyA9PiAnzpEnLAon8J2ekScgPT4gJ86SJywKJ/CdnpInID0+ICfOkycsCifwnZ6TJyA9PiAnzpQnLAon8J2elCcgPT4gJ86VJywKJ/CdnpUnID0+ICfOlicsCifwnZ6WJyA9PiAnzpcnLAon8J2elycgPT4gJ86YJywKJ/CdnpgnID0+ICfOmScsCifwnZ6ZJyA9PiAnzponLAon8J2emicgPT4gJ86bJywKJ/CdnpsnID0+ICfOnCcsCifwnZ6cJyA9PiAnzp0nLAon8J2enScgPT4gJ86eJywKJ/Cdnp4nID0+ICfOnycsCifwnZ6fJyA9PiAnzqAnLAon8J2eoCcgPT4gJ86hJywKJ/CdnqEnID0+ICfOmCcsCifwnZ6iJyA9PiAnzqMnLAon8J2eoycgPT4gJ86kJywKJ/CdnqQnID0+ICfOpScsCifwnZ6lJyA9PiAnzqYnLAon8J2epicgPT4gJ86nJywKJ/CdnqcnID0+ICfOqCcsCifwnZ6oJyA9PiAnzqknLAon8J2eqScgPT4gJ+KIhycsCifwnZ6qJyA9PiAnzrEnLAon8J2eqycgPT4gJ86yJywKJ/CdnqwnID0+ICfOsycsCifwnZ6tJyA9PiAnzrQnLAon8J2ericgPT4gJ861JywKJ/Cdnq8nID0+ICfOticsCifwnZ6wJyA9PiAnzrcnLAon8J2esScgPT4gJ864JywKJ/CdnrInID0+ICfOuScsCifwnZ6zJyA9PiAnzronLAon8J2etCcgPT4gJ867JywKJ/CdnrUnID0+ICfOvCcsCifwnZ62JyA9PiAnzr0nLAon8J2etycgPT4gJ86+JywKJ/CdnrgnID0+ICfOvycsCifwnZ65JyA9PiAnz4AnLAon8J2euicgPT4gJ8+BJywKJ/CdnrsnID0+ICfPgicsCifwnZ68JyA9PiAnz4MnLAon8J2evScgPT4gJ8+EJywKJ/Cdnr4nID0+ICfPhScsCifwnZ6/JyA9PiAnz4YnLAon8J2fgCcgPT4gJ8+HJywKJ/Cdn4EnID0+ICfPiCcsCifwnZ+CJyA9PiAnz4knLAon8J2fgycgPT4gJ+KIgicsCifwnZ+EJyA9PiAnzrUnLAon8J2fhScgPT4gJ864JywKJ/Cdn4YnID0+ICfOuicsCifwnZ+HJyA9PiAnz4YnLAon8J2fiCcgPT4gJ8+BJywKJ/Cdn4knID0+ICfPgCcsCifwnZ+KJyA9PiAnz5wnLAon8J2fiycgPT4gJ8+dJywKJ/Cdn44nID0+ICcwJywKJ/Cdn48nID0+ICcxJywKJ/Cdn5AnID0+ICcyJywKJ/Cdn5EnID0+ICczJywKJ/Cdn5InID0+ICc0JywKJ/Cdn5MnID0+ICc1JywKJ/Cdn5QnID0+ICc2JywKJ/Cdn5UnID0+ICc3JywKJ/Cdn5YnID0+ICc4JywKJ/Cdn5cnID0+ICc5JywKJ/Cdn5gnID0+ICcwJywKJ/Cdn5knID0+ICcxJywKJ/Cdn5onID0+ICcyJywKJ/Cdn5snID0+ICczJywKJ/Cdn5wnID0+ICc0JywKJ/Cdn50nID0+ICc1JywKJ/Cdn54nID0+ICc2JywKJ/Cdn58nID0+ICc3JywKJ/Cdn6AnID0+ICc4JywKJ/Cdn6EnID0+ICc5JywKJ/Cdn6InID0+ICcwJywKJ/Cdn6MnID0+ICcxJywKJ/Cdn6QnID0+ICcyJywKJ/Cdn6UnID0+ICczJywKJ/Cdn6YnID0+ICc0JywKJ/Cdn6cnID0+ICc1JywKJ/Cdn6gnID0+ICc2JywKJ/Cdn6knID0+ICc3JywKJ/Cdn6onID0+ICc4JywKJ/Cdn6snID0+ICc5JywKJ/Cdn6wnID0+ICcwJywKJ/Cdn60nID0+ICcxJywKJ/Cdn64nID0+ICcyJywKJ/Cdn68nID0+ICczJywKJ/Cdn7AnID0+ICc0JywKJ/Cdn7EnID0+ICc1JywKJ/Cdn7InID0+ICc2JywKJ/Cdn7MnID0+ICc3JywKJ/Cdn7QnID0+ICc4JywKJ/Cdn7UnID0+ICc5JywKJ/Cdn7YnID0+ICcwJywKJ/Cdn7cnID0+ICcxJywKJ/Cdn7gnID0+ICcyJywKJ/Cdn7knID0+ICczJywKJ/Cdn7onID0+ICc0JywKJ/Cdn7snID0+ICc1JywKJ/Cdn7wnID0+ICc2JywKJ/Cdn70nID0+ICc3JywKJ/Cdn74nID0+ICc4JywKJ/Cdn78nID0+ICc5JywKJ/CeuIAnID0+ICfYpycsCifwnriBJyA9PiAn2KgnLAon8J64gicgPT4gJ9isJywKJ/CeuIMnID0+ICfYrycsCifwnriFJyA9PiAn2YgnLAon8J64hicgPT4gJ9iyJywKJ/CeuIcnID0+ICfYrScsCifwnriIJyA9PiAn2LcnLAon8J64iScgPT4gJ9mKJywKJ/CeuIonID0+ICfZgycsCifwnriLJyA9PiAn2YQnLAon8J64jCcgPT4gJ9mFJywKJ/CeuI0nID0+ICfZhicsCifwnriOJyA9PiAn2LMnLAon8J64jycgPT4gJ9i5JywKJ/CeuJAnID0+ICfZgScsCifwnriRJyA9PiAn2LUnLAon8J64kicgPT4gJ9mCJywKJ/CeuJMnID0+ICfYsScsCifwnriUJyA9PiAn2LQnLAon8J64lScgPT4gJ9iqJywKJ/CeuJYnID0+ICfYqycsCifwnriXJyA9PiAn2K4nLAon8J64mCcgPT4gJ9iwJywKJ/CeuJknID0+ICfYticsCifwnriaJyA9PiAn2LgnLAon8J64mycgPT4gJ9i6JywKJ/CeuJwnID0+ICfZricsCifwnridJyA9PiAn2ronLAon8J64nicgPT4gJ9qhJywKJ/CeuJ8nID0+ICfZrycsCifwnrihJyA9PiAn2KgnLAon8J64oicgPT4gJ9isJywKJ/CeuKQnID0+ICfZhycsCifwnrinJyA9PiAn2K0nLAon8J64qScgPT4gJ9mKJywKJ/CeuKonID0+ICfZgycsCifwnrirJyA9PiAn2YQnLAon8J64rCcgPT4gJ9mFJywKJ/CeuK0nID0+ICfZhicsCifwnriuJyA9PiAn2LMnLAon8J64rycgPT4gJ9i5JywKJ/CeuLAnID0+ICfZgScsCifwnrixJyA9PiAn2LUnLAon8J64sicgPT4gJ9mCJywKJ/CeuLQnID0+ICfYtCcsCifwnri1JyA9PiAn2KonLAon8J64ticgPT4gJ9irJywKJ/CeuLcnID0+ICfYricsCifwnri5JyA9PiAn2LYnLAon8J64uycgPT4gJ9i6JywKJ/CeuYInID0+ICfYrCcsCifwnrmHJyA9PiAn2K0nLAon8J65iScgPT4gJ9mKJywKJ/CeuYsnID0+ICfZhCcsCifwnrmNJyA9PiAn2YYnLAon8J65jicgPT4gJ9izJywKJ/CeuY8nID0+ICfYuScsCifwnrmRJyA9PiAn2LUnLAon8J65kicgPT4gJ9mCJywKJ/CeuZQnID0+ICfYtCcsCifwnrmXJyA9PiAn2K4nLAon8J65mScgPT4gJ9i2JywKJ/CeuZsnID0+ICfYuicsCifwnrmdJyA9PiAn2ronLAon8J65nycgPT4gJ9mvJywKJ/CeuaEnID0+ICfYqCcsCifwnrmiJyA9PiAn2KwnLAon8J65pCcgPT4gJ9mHJywKJ/CeuacnID0+ICfYrScsCifwnrmoJyA9PiAn2LcnLAon8J65qScgPT4gJ9mKJywKJ/CeuaonID0+ICfZgycsCifwnrmsJyA9PiAn2YUnLAon8J65rScgPT4gJ9mGJywKJ/Ceua4nID0+ICfYsycsCifwnrmvJyA9PiAn2LknLAon8J65sCcgPT4gJ9mBJywKJ/CeubEnID0+ICfYtScsCifwnrmyJyA9PiAn2YInLAon8J65tCcgPT4gJ9i0JywKJ/CeubUnID0+ICfYqicsCifwnrm2JyA9PiAn2KsnLAon8J65tycgPT4gJ9iuJywKJ/CeubknID0+ICfYticsCifwnrm6JyA9PiAn2LgnLAon8J65uycgPT4gJ9i6JywKJ/CeubwnID0+ICfZricsCifwnrm+JyA9PiAn2qEnLAon8J66gCcgPT4gJ9inJywKJ/CeuoEnID0+ICfYqCcsCifwnrqCJyA9PiAn2KwnLAon8J66gycgPT4gJ9ivJywKJ/CeuoQnID0+ICfZhycsCifwnrqFJyA9PiAn2YgnLAon8J66hicgPT4gJ9iyJywKJ/CeuocnID0+ICfYrScsCifwnrqIJyA9PiAn2LcnLAon8J66iScgPT4gJ9mKJywKJ/CeuosnID0+ICfZhCcsCifwnrqMJyA9PiAn2YUnLAon8J66jScgPT4gJ9mGJywKJ/Ceuo4nID0+ICfYsycsCifwnrqPJyA9PiAn2LknLAon8J66kCcgPT4gJ9mBJywKJ/CeupEnID0+ICfYtScsCifwnrqSJyA9PiAn2YInLAon8J66kycgPT4gJ9ixJywKJ/CeupQnID0+ICfYtCcsCifwnrqVJyA9PiAn2KonLAon8J66licgPT4gJ9irJywKJ/CeupcnID0+ICfYricsCifwnrqYJyA9PiAn2LAnLAon8J66mScgPT4gJ9i2JywKJ/CeuponID0+ICfYuCcsCifwnrqbJyA9PiAn2LonLAon8J66oScgPT4gJ9ioJywKJ/CeuqInID0+ICfYrCcsCifwnrqjJyA9PiAn2K8nLAon8J66pScgPT4gJ9mIJywKJ/CeuqYnID0+ICfYsicsCifwnrqnJyA9PiAn2K0nLAon8J66qCcgPT4gJ9i3JywKJ/CeuqknID0+ICfZiicsCifwnrqrJyA9PiAn2YQnLAon8J66rCcgPT4gJ9mFJywKJ/Ceuq0nID0+ICfZhicsCifwnrquJyA9PiAn2LMnLAon8J66rycgPT4gJ9i5JywKJ/CeurAnID0+ICfZgScsCifwnrqxJyA9PiAn2LUnLAon8J66sicgPT4gJ9mCJywKJ/CeurMnID0+ICfYsScsCifwnrq0JyA9PiAn2LQnLAon8J66tScgPT4gJ9iqJywKJ/CeurYnID0+ICfYqycsCifwnrq3JyA9PiAn2K4nLAon8J66uCcgPT4gJ9iwJywKJ/CeurknID0+ICfYticsCifwnrq6JyA9PiAn2LgnLAon8J66uycgPT4gJ9i6JywKJ/CfhIAnID0+ICcwLicsCifwn4SBJyA9PiAnMCwnLAon8J+EgicgPT4gJzEsJywKJ/CfhIMnID0+ICcyLCcsCifwn4SEJyA9PiAnMywnLAon8J+EhScgPT4gJzQsJywKJ/CfhIYnID0+ICc1LCcsCifwn4SHJyA9PiAnNiwnLAon8J+EiCcgPT4gJzcsJywKJ/CfhIknID0+ICc4LCcsCifwn4SKJyA9PiAnOSwnLAon8J+EkCcgPT4gJyhBKScsCifwn4SRJyA9PiAnKEIpJywKJ/CfhJInID0+ICcoQyknLAon8J+EkycgPT4gJyhEKScsCifwn4SUJyA9PiAnKEUpJywKJ/CfhJUnID0+ICcoRiknLAon8J+ElicgPT4gJyhHKScsCifwn4SXJyA9PiAnKEgpJywKJ/CfhJgnID0+ICcoSSknLAon8J+EmScgPT4gJyhKKScsCifwn4SaJyA9PiAnKEspJywKJ/CfhJsnID0+ICcoTCknLAon8J+EnCcgPT4gJyhNKScsCifwn4SdJyA9PiAnKE4pJywKJ/CfhJ4nID0+ICcoTyknLAon8J+EnycgPT4gJyhQKScsCifwn4SgJyA9PiAnKFEpJywKJ/CfhKEnID0+ICcoUiknLAon8J+EoicgPT4gJyhTKScsCifwn4SjJyA9PiAnKFQpJywKJ/CfhKQnID0+ICcoVSknLAon8J+EpScgPT4gJyhWKScsCifwn4SmJyA9PiAnKFcpJywKJ/CfhKcnID0+ICcoWCknLAon8J+EqCcgPT4gJyhZKScsCifwn4SpJyA9PiAnKFopJywKJ/CfhKonID0+ICfjgJRT44CVJywKJ/CfhKsnID0+ICdDJywKJ/CfhKwnID0+ICdSJywKJ/CfhK0nID0+ICdDRCcsCifwn4SuJyA9PiAnV1onLAon8J+EsCcgPT4gJ0EnLAon8J+EsScgPT4gJ0InLAon8J+EsicgPT4gJ0MnLAon8J+EsycgPT4gJ0QnLAon8J+EtCcgPT4gJ0UnLAon8J+EtScgPT4gJ0YnLAon8J+EticgPT4gJ0cnLAon8J+EtycgPT4gJ0gnLAon8J+EuCcgPT4gJ0knLAon8J+EuScgPT4gJ0onLAon8J+EuicgPT4gJ0snLAon8J+EuycgPT4gJ0wnLAon8J+EvCcgPT4gJ00nLAon8J+EvScgPT4gJ04nLAon8J+EvicgPT4gJ08nLAon8J+EvycgPT4gJ1AnLAon8J+FgCcgPT4gJ1EnLAon8J+FgScgPT4gJ1InLAon8J+FgicgPT4gJ1MnLAon8J+FgycgPT4gJ1QnLAon8J+FhCcgPT4gJ1UnLAon8J+FhScgPT4gJ1YnLAon8J+FhicgPT4gJ1cnLAon8J+FhycgPT4gJ1gnLAon8J+FiCcgPT4gJ1knLAon8J+FiScgPT4gJ1onLAon8J+FiicgPT4gJ0hWJywKJ/CfhYsnID0+ICdNVicsCifwn4WMJyA9PiAnU0QnLAon8J+FjScgPT4gJ1NTJywKJ/CfhY4nID0+ICdQUFYnLAon8J+FjycgPT4gJ1dDJywKJ/CfhaonID0+ICdNQycsCifwn4WrJyA9PiAnTUQnLAon8J+FrCcgPT4gJ01SJywKJ/CfhpAnID0+ICdESicsCifwn4iAJyA9PiAn44G744GLJywKJ/CfiIEnID0+ICfjgrPjgrMnLAon8J+IgicgPT4gJ+OCtScsCifwn4iQJyA9PiAn5omLJywKJ/CfiJEnID0+ICflrZcnLAon8J+IkicgPT4gJ+WPjCcsCifwn4iTJyA9PiAn44OG44KZJywKJ/CfiJQnID0+ICfkuownLAon8J+IlScgPT4gJ+WkmicsCifwn4iWJyA9PiAn6KejJywKJ/CfiJcnID0+ICflpKknLAon8J+ImCcgPT4gJ+S6pCcsCifwn4iZJyA9PiAn5pigJywKJ/CfiJonID0+ICfnhKEnLAon8J+ImycgPT4gJ+aWmScsCifwn4icJyA9PiAn5YmNJywKJ/CfiJ0nID0+ICflvownLAon8J+InicgPT4gJ+WGjScsCifwn4ifJyA9PiAn5pawJywKJ/CfiKAnID0+ICfliJ0nLAon8J+IoScgPT4gJ+e1gicsCifwn4iiJyA9PiAn55SfJywKJ/CfiKMnID0+ICfosqknLAon8J+IpCcgPT4gJ+WjsCcsCifwn4ilJyA9PiAn5ZC5JywKJ/CfiKYnID0+ICfmvJQnLAon8J+IpycgPT4gJ+aKlScsCifwn4ioJyA9PiAn5o2VJywKJ/CfiKknID0+ICfkuIAnLAon8J+IqicgPT4gJ+S4iScsCifwn4irJyA9PiAn6YGKJywKJ/CfiKwnID0+ICflt6YnLAon8J+IrScgPT4gJ+S4rScsCifwn4iuJyA9PiAn5Y+zJywKJ/CfiK8nID0+ICfmjIcnLAon8J+IsCcgPT4gJ+i1sCcsCifwn4ixJyA9PiAn5omTJywKJ/CfiLInID0+ICfnpoEnLAon8J+IsycgPT4gJ+epuicsCifwn4i0JyA9PiAn5ZCIJywKJ/CfiLUnID0+ICfmuoAnLAon8J+IticgPT4gJ+aciScsCifwn4i3JyA9PiAn5pyIJywKJ/CfiLgnID0+ICfnlLMnLAon8J+IuScgPT4gJ+WJsicsCifwn4i6JyA9PiAn5Za2JywKJ/CfiLsnID0+ICfphY0nLAon8J+JgCcgPT4gJ+OAlOacrOOAlScsCifwn4mBJyA9PiAn44CU5LiJ44CVJywKJ/CfiYInID0+ICfjgJTkuozjgJUnLAon8J+JgycgPT4gJ+OAlOWuieOAlScsCifwn4mEJyA9PiAn44CU54K544CVJywKJ/CfiYUnID0+ICfjgJTmiZPjgJUnLAon8J+JhicgPT4gJ+OAlOebl+OAlScsCifwn4mHJyA9PiAn44CU5Yud44CVJywKJ/CfiYgnID0+ICfjgJTmlZfjgJUnLAon8J+JkCcgPT4gJ+W+lycsCifwn4mRJyA9PiAn5Y+vJywKJ/Cfr7AnID0+ICcwJywKJ/Cfr7EnID0+ICcxJywKJ/Cfr7InID0+ICcyJywKJ/Cfr7MnID0+ICczJywKJ/Cfr7QnID0+ICc0JywKJ/Cfr7UnID0+ICc1JywKJ/Cfr7YnID0+ICc2JywKJ/Cfr7cnID0+ICc3JywKJ/Cfr7gnID0+ICc4JywKJ/Cfr7knID0+ICc5JywKKTsKPD9waHAKCgoKCgoKCgoKCnVzZSBTeW1mb255XFBvbHlmaWxsXEludGxcTm9ybWFsaXplciBhcyBwOwoKaWYgKFxQSFBfVkVSU0lPTl9JRCA+PSA4MDAwMCkgewpyZXR1cm4gcmVxdWlyZSBfX0RJUl9fLicvYm9vdHN0cmFwODAucGhwJzsKfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ25vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCcpKSB7CmZ1bmN0aW9uIG5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkc3RyaW5nLCAkZm9ybSA9IHBcTm9ybWFsaXplcjo6Rk9STV9DKSB7IHJldHVybiBwXE5vcm1hbGl6ZXI6OmlzTm9ybWFsaXplZCgkc3RyaW5nLCAkZm9ybSk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbm9ybWFsaXplcl9ub3JtYWxpemUnKSkgewpmdW5jdGlvbiBub3JtYWxpemVyX25vcm1hbGl6ZSgkc3RyaW5nLCAkZm9ybSA9IHBcTm9ybWFsaXplcjo6Rk9STV9DKSB7IHJldHVybiBwXE5vcm1hbGl6ZXI6Om5vcm1hbGl6ZSgkc3RyaW5nLCAkZm9ybSk7IH0KfQo8P3BocAoKCgoKCgoKCgoKdXNlIFN5bWZvbnlcUG9seWZpbGxcSW50bFxOb3JtYWxpemVyIGFzIHA7CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbm9ybWFsaXplcl9pc19ub3JtYWxpemVkJykpIHsKZnVuY3Rpb24gbm9ybWFsaXplcl9pc19ub3JtYWxpemVkKD9zdHJpbmcgJHN0cmluZywgP2ludCAkZm9ybSA9IHBcTm9ybWFsaXplcjo6Rk9STV9DKTogYm9vbCB7IHJldHVybiBwXE5vcm1hbGl6ZXI6OmlzTm9ybWFsaXplZCgoc3RyaW5nKSAkc3RyaW5nLCAoaW50KSAkZm9ybSk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbm9ybWFsaXplcl9ub3JtYWxpemUnKSkgewpmdW5jdGlvbiBub3JtYWxpemVyX25vcm1hbGl6ZSg/c3RyaW5nICRzdHJpbmcsID9pbnQgJGZvcm0gPSBwXE5vcm1hbGl6ZXI6OkZPUk1fQyk6IHN0cmluZ3xmYWxzZSB7IHJldHVybiBwXE5vcm1hbGl6ZXI6Om5vcm1hbGl6ZSgoc3RyaW5nKSAkc3RyaW5nLCAoaW50KSAkZm9ybSk7IH0KfQoKQ29weXJpZ2h0IChjKSAyMDE1LXByZXNlbnQgRmFiaWVuIFBvdGVuY2llcgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAp0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KCjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxQb2x5ZmlsbFxNYnN0cmluZzsKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKZmluYWwgY2xhc3MgTWJzdHJpbmcKewpwdWJsaWMgY29uc3QgTUJfQ0FTRV9GT0xEID0gXFBIUF9JTlRfTUFYOwoKcHJpdmF0ZSBjb25zdCBTSU1QTEVfQ0FTRV9GT0xEID0gWwpbJ8K1JywgJ8W/JywgIlx4Q0RceDg1IiwgJ8+CJywgIlx4Q0ZceDkwIiwgIlx4Q0ZceDkxIiwgIlx4Q0ZceDk1IiwgIlx4Q0ZceDk2IiwgIlx4Q0ZceEIwIiwgIlx4Q0ZceEIxIiwgIlx4Q0ZceEI1IiwgIlx4RTFceEJBXHg5QiIsICJceEUxXHhCRVx4QkUiXSwKWyfOvCcsICdzJywgJ865JywgJ8+DJywgJ86yJywgJ864JywgJ8+GJywgJ8+AJywgJ866JywgJ8+BJywgJ861JywgIlx4RTFceEI5XHhBMSIsICfOuSddLApdOwoKcHJpdmF0ZSBzdGF0aWMgJGVuY29kaW5nTGlzdCA9IFsnQVNDSUknLCAnVVRGLTgnXTsKcHJpdmF0ZSBzdGF0aWMgJGxhbmd1YWdlID0gJ25ldXRyYWwnOwpwcml2YXRlIHN0YXRpYyAkaW50ZXJuYWxFbmNvZGluZyA9ICdVVEYtOCc7CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2NvbnZlcnRfZW5jb2RpbmcoJHMsICR0b0VuY29kaW5nLCAkZnJvbUVuY29kaW5nID0gbnVsbCkKewppZiAoXGlzX2FycmF5KCRzKSkgewokciA9IFtdOwpmb3JlYWNoICgkcyBhcyAkc3RyKSB7CiRyW10gPSBzZWxmOjptYl9jb252ZXJ0X2VuY29kaW5nKCRzdHIsICR0b0VuY29kaW5nLCAkZnJvbUVuY29kaW5nKTsKfQoKcmV0dXJuICRyOwp9CgppZiAoXGlzX2FycmF5KCRmcm9tRW5jb2RpbmcpIHx8IChudWxsICE9PSAkZnJvbUVuY29kaW5nICYmIGZhbHNlICE9PSBzdHJwb3MoJGZyb21FbmNvZGluZywgJywnKSkpIHsKJGZyb21FbmNvZGluZyA9IHNlbGY6Om1iX2RldGVjdF9lbmNvZGluZygkcywgJGZyb21FbmNvZGluZyk7Cn0gZWxzZSB7CiRmcm9tRW5jb2RpbmcgPSBzZWxmOjpnZXRFbmNvZGluZygkZnJvbUVuY29kaW5nKTsKfQoKJHRvRW5jb2RpbmcgPSBzZWxmOjpnZXRFbmNvZGluZygkdG9FbmNvZGluZyk7CgppZiAoJ0JBU0U2NCcgPT09ICRmcm9tRW5jb2RpbmcpIHsKJHMgPSBiYXNlNjRfZGVjb2RlKCRzKTsKJGZyb21FbmNvZGluZyA9ICR0b0VuY29kaW5nOwp9CgppZiAoJ0JBU0U2NCcgPT09ICR0b0VuY29kaW5nKSB7CnJldHVybiBiYXNlNjRfZW5jb2RlKCRzKTsKfQoKaWYgKCdIVE1MLUVOVElUSUVTJyA9PT0gJHRvRW5jb2RpbmcgfHwgJ0hUTUwnID09PSAkdG9FbmNvZGluZykgewppZiAoJ0hUTUwtRU5USVRJRVMnID09PSAkZnJvbUVuY29kaW5nIHx8ICdIVE1MJyA9PT0gJGZyb21FbmNvZGluZykgewokZnJvbUVuY29kaW5nID0gJ1dpbmRvd3MtMTI1Mic7Cn0KaWYgKCdVVEYtOCcgIT09ICRmcm9tRW5jb2RpbmcpIHsKJHMgPSBpY29udigkZnJvbUVuY29kaW5nLCAnVVRGLTgvL0lHTk9SRScsICRzKTsKfQoKcmV0dXJuIHByZWdfcmVwbGFjZV9jYWxsYmFjaygnL1tceDgwLVx4RkZdKy8nLCBbX19DTEFTU19fLCAnaHRtbF9lbmNvZGluZ19jYWxsYmFjayddLCAkcyk7Cn0KCmlmICgnSFRNTC1FTlRJVElFUycgPT09ICRmcm9tRW5jb2RpbmcpIHsKJHMgPSBodG1sX2VudGl0eV9kZWNvZGUoJHMsIFxFTlRfQ09NUEFULCAnVVRGLTgnKTsKJGZyb21FbmNvZGluZyA9ICdVVEYtOCc7Cn0KCnJldHVybiBpY29udigkZnJvbUVuY29kaW5nLCAkdG9FbmNvZGluZy4nLy9JR05PUkUnLCAkcyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfY29udmVydF92YXJpYWJsZXMoJHRvRW5jb2RpbmcsICRmcm9tRW5jb2RpbmcsICYuLi4kdmFycykKewokb2sgPSB0cnVlOwphcnJheV93YWxrX3JlY3Vyc2l2ZSgkdmFycywgc3RhdGljIGZ1bmN0aW9uICgmJHYpIHVzZSAoJiRvaywgJHRvRW5jb2RpbmcsICRmcm9tRW5jb2RpbmcpIHsKaWYgKGZhbHNlID09PSAkdiA9IHNlbGY6Om1iX2NvbnZlcnRfZW5jb2RpbmcoJHYsICR0b0VuY29kaW5nLCAkZnJvbUVuY29kaW5nKSkgewokb2sgPSBmYWxzZTsKfQp9KTsKCnJldHVybiAkb2sgPyAkZnJvbUVuY29kaW5nIDogZmFsc2U7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfZGVjb2RlX21pbWVoZWFkZXIoJHMpCnsKcmV0dXJuIGljb252X21pbWVfZGVjb2RlKCRzLCAyLCBzZWxmOjokaW50ZXJuYWxFbmNvZGluZyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfZW5jb2RlX21pbWVoZWFkZXIoJHMsICRjaGFyc2V0ID0gbnVsbCwgJHRyYW5zZmVyRW5jb2RpbmcgPSBudWxsLCAkbGluZWZlZWQgPSBudWxsLCAkaW5kZW50ID0gbnVsbCkKewp0cmlnZ2VyX2Vycm9yKCdtYl9lbmNvZGVfbWltZWhlYWRlcigpIGlzIGJ1Z2dlZC4gUGxlYXNlIHVzZSBpY29udl9taW1lX2VuY29kZSgpIGluc3RlYWQnLCBcRV9VU0VSX1dBUk5JTkcpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2RlY29kZV9udW1lcmljZW50aXR5KCRzLCAkY29udm1hcCwgJGVuY29kaW5nID0gbnVsbCkKewppZiAobnVsbCAhPT0gJHMgJiYgIVxpc19zY2FsYXIoJHMpICYmICEoXGlzX29iamVjdCgkcykgJiYgbWV0aG9kX2V4aXN0cygkcywgJ19fdG9TdHJpbmcnKSkpIHsKdHJpZ2dlcl9lcnJvcignbWJfZGVjb2RlX251bWVyaWNlbnRpdHkoKSBleHBlY3RzIHBhcmFtZXRlciAxIHRvIGJlIHN0cmluZywgJy5cZ2V0dHlwZSgkcykuJyBnaXZlbicsIFxFX1VTRVJfV0FSTklORyk7CgpyZXR1cm4gbnVsbDsKfQoKaWYgKCFcaXNfYXJyYXkoJGNvbnZtYXApIHx8ICg4MDAwMCA+IFxQSFBfVkVSU0lPTl9JRCAmJiAhJGNvbnZtYXApKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKG51bGwgIT09ICRlbmNvZGluZyAmJiAhXGlzX3NjYWxhcigkZW5jb2RpbmcpKSB7CnRyaWdnZXJfZXJyb3IoJ21iX2RlY29kZV9udW1lcmljZW50aXR5KCkgZXhwZWN0cyBwYXJhbWV0ZXIgMyB0byBiZSBzdHJpbmcsICcuXGdldHR5cGUoJHMpLicgZ2l2ZW4nLCBcRV9VU0VSX1dBUk5JTkcpOwoKcmV0dXJuICcnOyAKfQoKJHMgPSAoc3RyaW5nKSAkczsKaWYgKCcnID09PSAkcykgewpyZXR1cm4gJyc7Cn0KCiRlbmNvZGluZyA9IHNlbGY6OmdldEVuY29kaW5nKCRlbmNvZGluZyk7CgppZiAoJ1VURi04JyA9PT0gJGVuY29kaW5nKSB7CiRlbmNvZGluZyA9IG51bGw7CmlmICghcHJlZ19tYXRjaCgnLy91JywgJHMpKSB7CiRzID0gQGljb252KCdVVEYtOCcsICdVVEYtOC8vSUdOT1JFJywgJHMpOwp9Cn0gZWxzZSB7CiRzID0gaWNvbnYoJGVuY29kaW5nLCAnVVRGLTgvL0lHTk9SRScsICRzKTsKfQoKJGNudCA9IGZsb29yKFxjb3VudCgkY29udm1hcCkgLyA0KSAqIDQ7Cgpmb3IgKCRpID0gMDsgJGkgPCAkY250OyAkaSArPSA0KSB7CgokY29udm1hcFskaV0gKz0gJGNvbnZtYXBbJGkgKyAyXTsKJGNvbnZtYXBbJGkgKyAxXSArPSAkY29udm1hcFskaSArIDJdOwp9CgokcyA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygnLyYjKD86MCooWzAtOV0rKXx4MCooWzAtOWEtZkEtRl0rKSknLihcUEhQX1ZFUlNJT05fSUQgPj0gODAyMDAgPyAnJyA6ICcoPyEmKScpLic7Py8nLCBzdGF0aWMgZnVuY3Rpb24gKGFycmF5ICRtKSB1c2UgKCRjbnQsICRjb252bWFwKSB7CiRjID0gaXNzZXQoJG1bMl0pID8gKGludCkgaGV4ZGVjKCRtWzJdKSA6ICRtWzFdOwpmb3IgKCRpID0gMDsgJGkgPCAkY250OyAkaSArPSA0KSB7CmlmICgkYyA+PSAkY29udm1hcFskaV0gJiYgJGMgPD0gJGNvbnZtYXBbJGkgKyAxXSkgewpyZXR1cm4gc2VsZjo6bWJfY2hyKCRjIC0gJGNvbnZtYXBbJGkgKyAyXSk7Cn0KfQoKcmV0dXJuICRtWzBdOwp9LCAkcyk7CgppZiAobnVsbCA9PT0gJGVuY29kaW5nKSB7CnJldHVybiAkczsKfQoKcmV0dXJuIGljb252KCdVVEYtOCcsICRlbmNvZGluZy4nLy9JR05PUkUnLCAkcyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfZW5jb2RlX251bWVyaWNlbnRpdHkoJHMsICRjb252bWFwLCAkZW5jb2RpbmcgPSBudWxsLCAkaXNfaGV4ID0gZmFsc2UpCnsKaWYgKG51bGwgIT09ICRzICYmICFcaXNfc2NhbGFyKCRzKSAmJiAhKFxpc19vYmplY3QoJHMpICYmIG1ldGhvZF9leGlzdHMoJHMsICdfX3RvU3RyaW5nJykpKSB7CnRyaWdnZXJfZXJyb3IoJ21iX2VuY29kZV9udW1lcmljZW50aXR5KCkgZXhwZWN0cyBwYXJhbWV0ZXIgMSB0byBiZSBzdHJpbmcsICcuXGdldHR5cGUoJHMpLicgZ2l2ZW4nLCBcRV9VU0VSX1dBUk5JTkcpOwoKcmV0dXJuIG51bGw7Cn0KCmlmICghXGlzX2FycmF5KCRjb252bWFwKSB8fCAoODAwMDAgPiBcUEhQX1ZFUlNJT05fSUQgJiYgISRjb252bWFwKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmIChudWxsICE9PSAkZW5jb2RpbmcgJiYgIVxpc19zY2FsYXIoJGVuY29kaW5nKSkgewp0cmlnZ2VyX2Vycm9yKCdtYl9lbmNvZGVfbnVtZXJpY2VudGl0eSgpIGV4cGVjdHMgcGFyYW1ldGVyIDMgdG8gYmUgc3RyaW5nLCAnLlxnZXR0eXBlKCRzKS4nIGdpdmVuJywgXEVfVVNFUl9XQVJOSU5HKTsKCnJldHVybiBudWxsOyAKfQoKaWYgKG51bGwgIT09ICRpc19oZXggJiYgIVxpc19zY2FsYXIoJGlzX2hleCkpIHsKdHJpZ2dlcl9lcnJvcignbWJfZW5jb2RlX251bWVyaWNlbnRpdHkoKSBleHBlY3RzIHBhcmFtZXRlciA0IHRvIGJlIGJvb2xlYW4sICcuXGdldHR5cGUoJHMpLicgZ2l2ZW4nLCBcRV9VU0VSX1dBUk5JTkcpOwoKcmV0dXJuIG51bGw7Cn0KCiRzID0gKHN0cmluZykgJHM7CmlmICgnJyA9PT0gJHMpIHsKcmV0dXJuICcnOwp9CgokZW5jb2RpbmcgPSBzZWxmOjpnZXRFbmNvZGluZygkZW5jb2RpbmcpOwoKaWYgKCdVVEYtOCcgPT09ICRlbmNvZGluZykgewokZW5jb2RpbmcgPSBudWxsOwppZiAoIXByZWdfbWF0Y2goJy8vdScsICRzKSkgewokcyA9IEBpY29udignVVRGLTgnLCAnVVRGLTgvL0lHTk9SRScsICRzKTsKfQp9IGVsc2UgewokcyA9IGljb252KCRlbmNvZGluZywgJ1VURi04Ly9JR05PUkUnLCAkcyk7Cn0KCnN0YXRpYyAkdWxlbk1hc2sgPSBbIlx4QzAiID0+IDIsICJceEQwIiA9PiAyLCAiXHhFMCIgPT4gMywgIlx4RjAiID0+IDRdOwoKJGNudCA9IGZsb29yKFxjb3VudCgkY29udm1hcCkgLyA0KSAqIDQ7CiRpID0gMDsKJGxlbiA9IFxzdHJsZW4oJHMpOwokcmVzdWx0ID0gJyc7Cgp3aGlsZSAoJGkgPCAkbGVuKSB7CiR1bGVuID0gJHNbJGldIDwgIlx4ODAiID8gMSA6ICR1bGVuTWFza1skc1skaV0gJiAiXHhGMCJdOwokdWNociA9IHN1YnN0cigkcywgJGksICR1bGVuKTsKJGkgKz0gJHVsZW47CiRjID0gc2VsZjo6bWJfb3JkKCR1Y2hyKTsKCmZvciAoJGogPSAwOyAkaiA8ICRjbnQ7ICRqICs9IDQpIHsKaWYgKCRjID49ICRjb252bWFwWyRqXSAmJiAkYyA8PSAkY29udm1hcFskaiArIDFdKSB7CiRjT2Zmc2V0ID0gKCRjICsgJGNvbnZtYXBbJGogKyAyXSkgJiAkY29udm1hcFskaiArIDNdOwokcmVzdWx0IC49ICRpc19oZXggPyBcc3ByaW50ZignJiN4JVg7JywgJGNPZmZzZXQpIDogJyYjJy4kY09mZnNldC4nOyc7CmNvbnRpbnVlIDI7Cn0KfQokcmVzdWx0IC49ICR1Y2hyOwp9CgppZiAobnVsbCA9PT0gJGVuY29kaW5nKSB7CnJldHVybiAkcmVzdWx0Owp9CgpyZXR1cm4gaWNvbnYoJ1VURi04JywgJGVuY29kaW5nLicvL0lHTk9SRScsICRyZXN1bHQpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2NvbnZlcnRfY2FzZSgkcywgJG1vZGUsICRlbmNvZGluZyA9IG51bGwpCnsKJHMgPSAoc3RyaW5nKSAkczsKaWYgKCcnID09PSAkcykgewpyZXR1cm4gJyc7Cn0KCiRlbmNvZGluZyA9IHNlbGY6OmdldEVuY29kaW5nKCRlbmNvZGluZyk7CgppZiAoJ1VURi04JyA9PT0gJGVuY29kaW5nKSB7CiRlbmNvZGluZyA9IG51bGw7CmlmICghcHJlZ19tYXRjaCgnLy91JywgJHMpKSB7CiRzID0gQGljb252KCdVVEYtOCcsICdVVEYtOC8vSUdOT1JFJywgJHMpOwp9Cn0gZWxzZSB7CiRzID0gaWNvbnYoJGVuY29kaW5nLCAnVVRGLTgvL0lHTk9SRScsICRzKTsKfQoKaWYgKFxNQl9DQVNFX1RJVExFID09ICRtb2RlKSB7CnN0YXRpYyAkdGl0bGVSZWdleHAgPSBudWxsOwppZiAobnVsbCA9PT0gJHRpdGxlUmVnZXhwKSB7CiR0aXRsZVJlZ2V4cCA9IHNlbGY6OmdldERhdGEoJ3RpdGxlQ2FzZVJlZ2V4cCcpOwp9CiRzID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCR0aXRsZVJlZ2V4cCwgW19fQ0xBU1NfXywgJ3RpdGxlX2Nhc2UnXSwgJHMpOwp9IGVsc2UgewppZiAoXE1CX0NBU0VfVVBQRVIgPT0gJG1vZGUpIHsKc3RhdGljICR1cHBlciA9IG51bGw7CmlmIChudWxsID09PSAkdXBwZXIpIHsKJHVwcGVyID0gc2VsZjo6Z2V0RGF0YSgndXBwZXJDYXNlJyk7Cn0KJG1hcCA9ICR1cHBlcjsKfSBlbHNlIHsKaWYgKHNlbGY6Ok1CX0NBU0VfRk9MRCA9PT0gJG1vZGUpIHsKc3RhdGljICRjYXNlRm9sZGluZyA9IG51bGw7CmlmIChudWxsID09PSAkY2FzZUZvbGRpbmcpIHsKJGNhc2VGb2xkaW5nID0gc2VsZjo6Z2V0RGF0YSgnY2FzZUZvbGRpbmcnKTsKfQokcyA9IHN0cnRyKCRzLCAkY2FzZUZvbGRpbmcpOwp9CgpzdGF0aWMgJGxvd2VyID0gbnVsbDsKaWYgKG51bGwgPT09ICRsb3dlcikgewokbG93ZXIgPSBzZWxmOjpnZXREYXRhKCdsb3dlckNhc2UnKTsKfQokbWFwID0gJGxvd2VyOwp9CgpzdGF0aWMgJHVsZW5NYXNrID0gWyJceEMwIiA9PiAyLCAiXHhEMCIgPT4gMiwgIlx4RTAiID0+IDMsICJceEYwIiA9PiA0XTsKCiRpID0gMDsKJGxlbiA9IFxzdHJsZW4oJHMpOwoKd2hpbGUgKCRpIDwgJGxlbikgewokdWxlbiA9ICRzWyRpXSA8ICJceDgwIiA/IDEgOiAkdWxlbk1hc2tbJHNbJGldICYgIlx4RjAiXTsKJHVjaHIgPSBzdWJzdHIoJHMsICRpLCAkdWxlbik7CiRpICs9ICR1bGVuOwoKaWYgKGlzc2V0KCRtYXBbJHVjaHJdKSkgewokdWNociA9ICRtYXBbJHVjaHJdOwokbmxlbiA9IFxzdHJsZW4oJHVjaHIpOwoKaWYgKCRubGVuID09ICR1bGVuKSB7CiRubGVuID0gJGk7CmRvIHsKJHNbLS0kbmxlbl0gPSAkdWNoclstLSR1bGVuXTsKfSB3aGlsZSAoJHVsZW4pOwp9IGVsc2UgewokcyA9IHN1YnN0cl9yZXBsYWNlKCRzLCAkdWNociwgJGkgLSAkdWxlbiwgJHVsZW4pOwokbGVuICs9ICRubGVuIC0gJHVsZW47CiRpICs9ICRubGVuIC0gJHVsZW47Cn0KfQp9Cn0KCmlmIChudWxsID09PSAkZW5jb2RpbmcpIHsKcmV0dXJuICRzOwp9CgpyZXR1cm4gaWNvbnYoJ1VURi04JywgJGVuY29kaW5nLicvL0lHTk9SRScsICRzKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9pbnRlcm5hbF9lbmNvZGluZygkZW5jb2RpbmcgPSBudWxsKQp7CmlmIChudWxsID09PSAkZW5jb2RpbmcpIHsKcmV0dXJuIHNlbGY6OiRpbnRlcm5hbEVuY29kaW5nOwp9Cgokbm9ybWFsaXplZEVuY29kaW5nID0gc2VsZjo6Z2V0RW5jb2RpbmcoJGVuY29kaW5nKTsKCmlmICgnVVRGLTgnID09PSAkbm9ybWFsaXplZEVuY29kaW5nIHx8IGZhbHNlICE9PSBAaWNvbnYoJG5vcm1hbGl6ZWRFbmNvZGluZywgJG5vcm1hbGl6ZWRFbmNvZGluZywgJyAnKSkgewpzZWxmOjokaW50ZXJuYWxFbmNvZGluZyA9ICRub3JtYWxpemVkRW5jb2Rpbmc7CgpyZXR1cm4gdHJ1ZTsKfQoKaWYgKDgwMDAwID4gXFBIUF9WRVJTSU9OX0lEKSB7CnJldHVybiBmYWxzZTsKfQoKdGhyb3cgbmV3IFxWYWx1ZUVycm9yKFxzcHJpbnRmKCdBcmd1bWVudCAjMSAoJGVuY29kaW5nKSBtdXN0IGJlIGEgdmFsaWQgZW5jb2RpbmcsICIlcyIgZ2l2ZW4nLCAkZW5jb2RpbmcpKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9sYW5ndWFnZSgkbGFuZyA9IG51bGwpCnsKaWYgKG51bGwgPT09ICRsYW5nKSB7CnJldHVybiBzZWxmOjokbGFuZ3VhZ2U7Cn0KCnN3aXRjaCAoJG5vcm1hbGl6ZWRMYW5nID0gc3RydG9sb3dlcigkbGFuZykpIHsKY2FzZSAndW5pJzoKY2FzZSAnbmV1dHJhbCc6CnNlbGY6OiRsYW5ndWFnZSA9ICRub3JtYWxpemVkTGFuZzsKCnJldHVybiB0cnVlOwp9CgppZiAoODAwMDAgPiBcUEhQX1ZFUlNJT05fSUQpIHsKcmV0dXJuIGZhbHNlOwp9Cgp0aHJvdyBuZXcgXFZhbHVlRXJyb3IoXHNwcmludGYoJ0FyZ3VtZW50ICMxICgkbGFuZ3VhZ2UpIG11c3QgYmUgYSB2YWxpZCBsYW5ndWFnZSwgIiVzIiBnaXZlbicsICRsYW5nKSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfbGlzdF9lbmNvZGluZ3MoKQp7CnJldHVybiBbJ1VURi04J107Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfZW5jb2RpbmdfYWxpYXNlcygkZW5jb2RpbmcpCnsKc3dpdGNoIChzdHJ0b3VwcGVyKCRlbmNvZGluZykpIHsKY2FzZSAnVVRGOCc6CmNhc2UgJ1VURi04JzoKcmV0dXJuIFsndXRmOCddOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfY2hlY2tfZW5jb2RpbmcoJHZhciA9IG51bGwsICRlbmNvZGluZyA9IG51bGwpCnsKaWYgKG51bGwgPT09ICRlbmNvZGluZykgewppZiAobnVsbCA9PT0gJHZhcikgewpyZXR1cm4gZmFsc2U7Cn0KJGVuY29kaW5nID0gc2VsZjo6JGludGVybmFsRW5jb2Rpbmc7Cn0KCmlmICghXGlzX2FycmF5KCR2YXIpKSB7CnJldHVybiBzZWxmOjptYl9kZXRlY3RfZW5jb2RpbmcoJHZhciwgWyRlbmNvZGluZ10pIHx8IGZhbHNlICE9PSBAaWNvbnYoJGVuY29kaW5nLCAkZW5jb2RpbmcsICR2YXIpOwp9Cgpmb3JlYWNoICgkdmFyIGFzICRrZXkgPT4gJHZhbHVlKSB7CmlmICghc2VsZjo6bWJfY2hlY2tfZW5jb2RpbmcoJGtleSwgJGVuY29kaW5nKSkgewpyZXR1cm4gZmFsc2U7Cn0KaWYgKCFzZWxmOjptYl9jaGVja19lbmNvZGluZygkdmFsdWUsICRlbmNvZGluZykpIHsKcmV0dXJuIGZhbHNlOwp9Cn0KCnJldHVybiB0cnVlOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2RldGVjdF9lbmNvZGluZygkc3RyLCAkZW5jb2RpbmdMaXN0ID0gbnVsbCwgJHN0cmljdCA9IGZhbHNlKQp7CmlmIChudWxsID09PSAkZW5jb2RpbmdMaXN0KSB7CiRlbmNvZGluZ0xpc3QgPSBzZWxmOjokZW5jb2RpbmdMaXN0Owp9IGVsc2UgewppZiAoIVxpc19hcnJheSgkZW5jb2RpbmdMaXN0KSkgewokZW5jb2RpbmdMaXN0ID0gYXJyYXlfbWFwKCd0cmltJywgZXhwbG9kZSgnLCcsICRlbmNvZGluZ0xpc3QpKTsKfQokZW5jb2RpbmdMaXN0ID0gYXJyYXlfbWFwKCdzdHJ0b3VwcGVyJywgJGVuY29kaW5nTGlzdCk7Cn0KCmZvcmVhY2ggKCRlbmNvZGluZ0xpc3QgYXMgJGVuYykgewpzd2l0Y2ggKCRlbmMpIHsKY2FzZSAnQVNDSUknOgppZiAoIXByZWdfbWF0Y2goJy9bXHg4MC1ceEZGXS8nLCAkc3RyKSkgewpyZXR1cm4gJGVuYzsKfQpicmVhazsKCmNhc2UgJ1VURjgnOgpjYXNlICdVVEYtOCc6CmlmIChwcmVnX21hdGNoKCcvL3UnLCAkc3RyKSkgewpyZXR1cm4gJ1VURi04JzsKfQpicmVhazsKCmRlZmF1bHQ6CmlmICgwID09PSBzdHJuY21wKCRlbmMsICdJU08tODg1OS0nLCA5KSkgewpyZXR1cm4gJGVuYzsKfQp9Cn0KCnJldHVybiBmYWxzZTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9kZXRlY3Rfb3JkZXIoJGVuY29kaW5nTGlzdCA9IG51bGwpCnsKaWYgKG51bGwgPT09ICRlbmNvZGluZ0xpc3QpIHsKcmV0dXJuIHNlbGY6OiRlbmNvZGluZ0xpc3Q7Cn0KCmlmICghXGlzX2FycmF5KCRlbmNvZGluZ0xpc3QpKSB7CiRlbmNvZGluZ0xpc3QgPSBhcnJheV9tYXAoJ3RyaW0nLCBleHBsb2RlKCcsJywgJGVuY29kaW5nTGlzdCkpOwp9CiRlbmNvZGluZ0xpc3QgPSBhcnJheV9tYXAoJ3N0cnRvdXBwZXInLCAkZW5jb2RpbmdMaXN0KTsKCmZvcmVhY2ggKCRlbmNvZGluZ0xpc3QgYXMgJGVuYykgewpzd2l0Y2ggKCRlbmMpIHsKZGVmYXVsdDoKaWYgKHN0cm5jbXAoJGVuYywgJ0lTTy04ODU5LScsIDkpKSB7CnJldHVybiBmYWxzZTsKfQoKY2FzZSAnQVNDSUknOgpjYXNlICdVVEY4JzoKY2FzZSAnVVRGLTgnOgp9Cn0KCnNlbGY6OiRlbmNvZGluZ0xpc3QgPSAkZW5jb2RpbmdMaXN0OwoKcmV0dXJuIHRydWU7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3RybGVuKCRzLCAkZW5jb2RpbmcgPSBudWxsKQp7CiRlbmNvZGluZyA9IHNlbGY6OmdldEVuY29kaW5nKCRlbmNvZGluZyk7CmlmICgnQ1A4NTAnID09PSAkZW5jb2RpbmcgfHwgJ0FTQ0lJJyA9PT0gJGVuY29kaW5nKSB7CnJldHVybiBcc3RybGVuKCRzKTsKfQoKcmV0dXJuIEBpY29udl9zdHJsZW4oJHMsICRlbmNvZGluZyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3RycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCA9IDAsICRlbmNvZGluZyA9IG51bGwpCnsKJGVuY29kaW5nID0gc2VsZjo6Z2V0RW5jb2RpbmcoJGVuY29kaW5nKTsKaWYgKCdDUDg1MCcgPT09ICRlbmNvZGluZyB8fCAnQVNDSUknID09PSAkZW5jb2RpbmcpIHsKcmV0dXJuIHN0cnBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQpOwp9CgokbmVlZGxlID0gKHN0cmluZykgJG5lZWRsZTsKaWYgKCcnID09PSAkbmVlZGxlKSB7CmlmICg4MDAwMCA+IFxQSFBfVkVSU0lPTl9JRCkgewp0cmlnZ2VyX2Vycm9yKF9fTUVUSE9EX18uJzogRW1wdHkgZGVsaW1pdGVyJywgXEVfVVNFUl9XQVJOSU5HKTsKCnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIDA7Cn0KCnJldHVybiBpY29udl9zdHJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0LCAkZW5jb2RpbmcpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3N0cnJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCwgJGVuY29kaW5nID0gbnVsbCkKewokZW5jb2RpbmcgPSBzZWxmOjpnZXRFbmNvZGluZygkZW5jb2RpbmcpOwppZiAoJ0NQODUwJyA9PT0gJGVuY29kaW5nIHx8ICdBU0NJSScgPT09ICRlbmNvZGluZykgewpyZXR1cm4gc3RycnBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQpOwp9CgppZiAoJG9mZnNldCAhPSAoaW50KSAkb2Zmc2V0KSB7CiRvZmZzZXQgPSAwOwp9IGVsc2VpZiAoJG9mZnNldCA9IChpbnQpICRvZmZzZXQpIHsKaWYgKCRvZmZzZXQgPCAwKSB7CmlmICgwID4gJG9mZnNldCArPSBzZWxmOjptYl9zdHJsZW4oJG5lZWRsZSkpIHsKJGhheXN0YWNrID0gc2VsZjo6bWJfc3Vic3RyKCRoYXlzdGFjaywgMCwgJG9mZnNldCwgJGVuY29kaW5nKTsKfQokb2Zmc2V0ID0gMDsKfSBlbHNlIHsKJGhheXN0YWNrID0gc2VsZjo6bWJfc3Vic3RyKCRoYXlzdGFjaywgJG9mZnNldCwgMjE0NzQ4MzY0NywgJGVuY29kaW5nKTsKfQp9CgokcG9zID0gJycgIT09ICRuZWVkbGUgfHwgODAwMDAgPiBcUEhQX1ZFUlNJT05fSUQKPyBpY29udl9zdHJycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJGVuY29kaW5nKQo6IHNlbGY6Om1iX3N0cmxlbigkaGF5c3RhY2ssICRlbmNvZGluZyk7CgpyZXR1cm4gZmFsc2UgIT09ICRwb3MgPyAkb2Zmc2V0ICsgJHBvcyA6IGZhbHNlOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3N0cl9zcGxpdCgkc3RyaW5nLCAkc3BsaXRfbGVuZ3RoID0gMSwgJGVuY29kaW5nID0gbnVsbCkKewppZiAobnVsbCAhPT0gJHN0cmluZyAmJiAhXGlzX3NjYWxhcigkc3RyaW5nKSAmJiAhKFxpc19vYmplY3QoJHN0cmluZykgJiYgbWV0aG9kX2V4aXN0cygkc3RyaW5nLCAnX190b1N0cmluZycpKSkgewp0cmlnZ2VyX2Vycm9yKCdtYl9zdHJfc3BsaXQoKSBleHBlY3RzIHBhcmFtZXRlciAxIHRvIGJlIHN0cmluZywgJy5cZ2V0dHlwZSgkc3RyaW5nKS4nIGdpdmVuJywgXEVfVVNFUl9XQVJOSU5HKTsKCnJldHVybiBudWxsOwp9CgppZiAoMSA+ICRzcGxpdF9sZW5ndGggPSAoaW50KSAkc3BsaXRfbGVuZ3RoKSB7CmlmICg4MDAwMCA+IFxQSFBfVkVSU0lPTl9JRCkgewp0cmlnZ2VyX2Vycm9yKCdUaGUgbGVuZ3RoIG9mIGVhY2ggc2VnbWVudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvJywgXEVfVVNFUl9XQVJOSU5HKTsKCnJldHVybiBmYWxzZTsKfQoKdGhyb3cgbmV3IFxWYWx1ZUVycm9yKCdBcmd1bWVudCAjMiAoJGxlbmd0aCkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpOwp9CgppZiAobnVsbCA9PT0gJGVuY29kaW5nKSB7CiRlbmNvZGluZyA9IG1iX2ludGVybmFsX2VuY29kaW5nKCk7Cn0KCmlmICgnVVRGLTgnID09PSAkZW5jb2RpbmcgPSBzZWxmOjpnZXRFbmNvZGluZygkZW5jb2RpbmcpKSB7CiRyeCA9ICcvKCc7CndoaWxlICg2NTUzNSA8ICRzcGxpdF9sZW5ndGgpIHsKJHJ4IC49ICcuezY1NTM1fSc7CiRzcGxpdF9sZW5ndGggLT0gNjU1MzU7Cn0KJHJ4IC49ICcueycuJHNwbGl0X2xlbmd0aC4nfSkvdXMnOwoKcmV0dXJuIHByZWdfc3BsaXQoJHJ4LCAkc3RyaW5nLCAtMSwgXFBSRUdfU1BMSVRfREVMSU1fQ0FQVFVSRSB8IFxQUkVHX1NQTElUX05PX0VNUFRZKTsKfQoKJHJlc3VsdCA9IFtdOwokbGVuZ3RoID0gbWJfc3RybGVuKCRzdHJpbmcsICRlbmNvZGluZyk7Cgpmb3IgKCRpID0gMDsgJGkgPCAkbGVuZ3RoOyAkaSArPSAkc3BsaXRfbGVuZ3RoKSB7CiRyZXN1bHRbXSA9IG1iX3N1YnN0cigkc3RyaW5nLCAkaSwgJHNwbGl0X2xlbmd0aCwgJGVuY29kaW5nKTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3RydG9sb3dlcigkcywgJGVuY29kaW5nID0gbnVsbCkKewpyZXR1cm4gc2VsZjo6bWJfY29udmVydF9jYXNlKCRzLCBcTUJfQ0FTRV9MT1dFUiwgJGVuY29kaW5nKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9zdHJ0b3VwcGVyKCRzLCAkZW5jb2RpbmcgPSBudWxsKQp7CnJldHVybiBzZWxmOjptYl9jb252ZXJ0X2Nhc2UoJHMsIFxNQl9DQVNFX1VQUEVSLCAkZW5jb2RpbmcpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3N1YnN0aXR1dGVfY2hhcmFjdGVyKCRjID0gbnVsbCkKewppZiAobnVsbCA9PT0gJGMpIHsKcmV0dXJuICdub25lJzsKfQppZiAoMCA9PT0gc3RyY2FzZWNtcCgkYywgJ25vbmUnKSkgewpyZXR1cm4gdHJ1ZTsKfQppZiAoODAwMDAgPiBcUEhQX1ZFUlNJT05fSUQpIHsKcmV0dXJuIGZhbHNlOwp9CmlmIChcaXNfaW50KCRjKSB8fCAnbG9uZycgPT09ICRjIHx8ICdlbnRpdHknID09PSAkYykgewpyZXR1cm4gZmFsc2U7Cn0KCnRocm93IG5ldyBcVmFsdWVFcnJvcignQXJndW1lbnQgIzEgKCRzdWJzdGl0dXRlX2NoYXJhY3RlcikgbXVzdCBiZSAibm9uZSIsICJsb25nIiwgImVudGl0eSIgb3IgYSB2YWxpZCBjb2RlcG9pbnQnKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9zdWJzdHIoJHMsICRzdGFydCwgJGxlbmd0aCA9IG51bGwsICRlbmNvZGluZyA9IG51bGwpCnsKJGVuY29kaW5nID0gc2VsZjo6Z2V0RW5jb2RpbmcoJGVuY29kaW5nKTsKaWYgKCdDUDg1MCcgPT09ICRlbmNvZGluZyB8fCAnQVNDSUknID09PSAkZW5jb2RpbmcpIHsKcmV0dXJuIChzdHJpbmcpIHN1YnN0cigkcywgJHN0YXJ0LCBudWxsID09PSAkbGVuZ3RoID8gMjE0NzQ4MzY0NyA6ICRsZW5ndGgpOwp9CgppZiAoJHN0YXJ0IDwgMCkgewokc3RhcnQgPSBpY29udl9zdHJsZW4oJHMsICRlbmNvZGluZykgKyAkc3RhcnQ7CmlmICgkc3RhcnQgPCAwKSB7CiRzdGFydCA9IDA7Cn0KfQoKaWYgKG51bGwgPT09ICRsZW5ndGgpIHsKJGxlbmd0aCA9IDIxNDc0ODM2NDc7Cn0gZWxzZWlmICgkbGVuZ3RoIDwgMCkgewokbGVuZ3RoID0gaWNvbnZfc3RybGVuKCRzLCAkZW5jb2RpbmcpICsgJGxlbmd0aCAtICRzdGFydDsKaWYgKCRsZW5ndGggPCAwKSB7CnJldHVybiAnJzsKfQp9CgpyZXR1cm4gKHN0cmluZykgaWNvbnZfc3Vic3RyKCRzLCAkc3RhcnQsICRsZW5ndGgsICRlbmNvZGluZyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3RyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQgPSAwLCAkZW5jb2RpbmcgPSBudWxsKQp7ClskaGF5c3RhY2ssICRuZWVkbGVdID0gc3RyX3JlcGxhY2Uoc2VsZjo6U0lNUExFX0NBU0VfRk9MRFswXSwgc2VsZjo6U0lNUExFX0NBU0VfRk9MRFsxXSwgWwpzZWxmOjptYl9jb252ZXJ0X2Nhc2UoJGhheXN0YWNrLCBcTUJfQ0FTRV9MT1dFUiwgJGVuY29kaW5nKSwKc2VsZjo6bWJfY29udmVydF9jYXNlKCRuZWVkbGUsIFxNQl9DQVNFX0xPV0VSLCAkZW5jb2RpbmcpLApdKTsKCnJldHVybiBzZWxmOjptYl9zdHJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0LCAkZW5jb2RpbmcpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3N0cmlzdHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkcGFydCA9IGZhbHNlLCAkZW5jb2RpbmcgPSBudWxsKQp7CiRwb3MgPSBzZWxmOjptYl9zdHJpcG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgMCwgJGVuY29kaW5nKTsKCnJldHVybiBzZWxmOjpnZXRTdWJwYXJ0KCRwb3MsICRwYXJ0LCAkaGF5c3RhY2ssICRlbmNvZGluZyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3RycmNocigkaGF5c3RhY2ssICRuZWVkbGUsICRwYXJ0ID0gZmFsc2UsICRlbmNvZGluZyA9IG51bGwpCnsKJGVuY29kaW5nID0gc2VsZjo6Z2V0RW5jb2RpbmcoJGVuY29kaW5nKTsKaWYgKCdDUDg1MCcgPT09ICRlbmNvZGluZyB8fCAnQVNDSUknID09PSAkZW5jb2RpbmcpIHsKJHBvcyA9IHN0cnJwb3MoJGhheXN0YWNrLCAkbmVlZGxlKTsKfSBlbHNlIHsKJG5lZWRsZSA9IHNlbGY6Om1iX3N1YnN0cigkbmVlZGxlLCAwLCAxLCAkZW5jb2RpbmcpOwokcG9zID0gaWNvbnZfc3RycnBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRlbmNvZGluZyk7Cn0KCnJldHVybiBzZWxmOjpnZXRTdWJwYXJ0KCRwb3MsICRwYXJ0LCAkaGF5c3RhY2ssICRlbmNvZGluZyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3RycmljaHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkcGFydCA9IGZhbHNlLCAkZW5jb2RpbmcgPSBudWxsKQp7CiRuZWVkbGUgPSBzZWxmOjptYl9zdWJzdHIoJG5lZWRsZSwgMCwgMSwgJGVuY29kaW5nKTsKJHBvcyA9IHNlbGY6Om1iX3N0cnJpcG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJGVuY29kaW5nKTsKCnJldHVybiBzZWxmOjpnZXRTdWJwYXJ0KCRwb3MsICRwYXJ0LCAkaGF5c3RhY2ssICRlbmNvZGluZyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3Rycmlwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCwgJGVuY29kaW5nID0gbnVsbCkKewokaGF5c3RhY2sgPSBzZWxmOjptYl9jb252ZXJ0X2Nhc2UoJGhheXN0YWNrLCBcTUJfQ0FTRV9MT1dFUiwgJGVuY29kaW5nKTsKJG5lZWRsZSA9IHNlbGY6Om1iX2NvbnZlcnRfY2FzZSgkbmVlZGxlLCBcTUJfQ0FTRV9MT1dFUiwgJGVuY29kaW5nKTsKCiRoYXlzdGFjayA9IHN0cl9yZXBsYWNlKHNlbGY6OlNJTVBMRV9DQVNFX0ZPTERbMF0sIHNlbGY6OlNJTVBMRV9DQVNFX0ZPTERbMV0sICRoYXlzdGFjayk7CiRuZWVkbGUgPSBzdHJfcmVwbGFjZShzZWxmOjpTSU1QTEVfQ0FTRV9GT0xEWzBdLCBzZWxmOjpTSU1QTEVfQ0FTRV9GT0xEWzFdLCAkbmVlZGxlKTsKCnJldHVybiBzZWxmOjptYl9zdHJycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCwgJGVuY29kaW5nKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9zdHJzdHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkcGFydCA9IGZhbHNlLCAkZW5jb2RpbmcgPSBudWxsKQp7CiRwb3MgPSBzdHJwb3MoJGhheXN0YWNrLCAkbmVlZGxlKTsKaWYgKGZhbHNlID09PSAkcG9zKSB7CnJldHVybiBmYWxzZTsKfQppZiAoJHBhcnQpIHsKcmV0dXJuIHN1YnN0cigkaGF5c3RhY2ssIDAsICRwb3MpOwp9CgpyZXR1cm4gc3Vic3RyKCRoYXlzdGFjaywgJHBvcyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfZ2V0X2luZm8oJHR5cGUgPSAnYWxsJykKewokaW5mbyA9IFsKJ2ludGVybmFsX2VuY29kaW5nJyA9PiBzZWxmOjokaW50ZXJuYWxFbmNvZGluZywKJ2h0dHBfb3V0cHV0JyA9PiAncGFzcycsCidodHRwX291dHB1dF9jb252X21pbWV0eXBlcycgPT4gJ14odGV4dC98YXBwbGljYXRpb24veGh0bWxcK3htbCknLAonZnVuY19vdmVybG9hZCcgPT4gMCwKJ2Z1bmNfb3ZlcmxvYWRfbGlzdCcgPT4gJ25vIG92ZXJsb2FkJywKJ21haWxfY2hhcnNldCcgPT4gJ1VURi04JywKJ21haWxfaGVhZGVyX2VuY29kaW5nJyA9PiAnQkFTRTY0JywKJ21haWxfYm9keV9lbmNvZGluZycgPT4gJ0JBU0U2NCcsCidpbGxlZ2FsX2NoYXJzJyA9PiAwLAonZW5jb2RpbmdfdHJhbnNsYXRpb24nID0+ICdPZmYnLAonbGFuZ3VhZ2UnID0+IHNlbGY6OiRsYW5ndWFnZSwKJ2RldGVjdF9vcmRlcicgPT4gc2VsZjo6JGVuY29kaW5nTGlzdCwKJ3N1YnN0aXR1dGVfY2hhcmFjdGVyJyA9PiAnbm9uZScsCidzdHJpY3RfZGV0ZWN0aW9uJyA9PiAnT2ZmJywKXTsKCmlmICgnYWxsJyA9PT0gJHR5cGUpIHsKcmV0dXJuICRpbmZvOwp9CmlmIChpc3NldCgkaW5mb1skdHlwZV0pKSB7CnJldHVybiAkaW5mb1skdHlwZV07Cn0KCnJldHVybiBmYWxzZTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9odHRwX2lucHV0KCR0eXBlID0gJycpCnsKcmV0dXJuIGZhbHNlOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2h0dHBfb3V0cHV0KCRlbmNvZGluZyA9IG51bGwpCnsKcmV0dXJuIG51bGwgIT09ICRlbmNvZGluZyA/ICdwYXNzJyA9PT0gJGVuY29kaW5nIDogJ3Bhc3MnOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3N0cndpZHRoKCRzLCAkZW5jb2RpbmcgPSBudWxsKQp7CiRlbmNvZGluZyA9IHNlbGY6OmdldEVuY29kaW5nKCRlbmNvZGluZyk7CgppZiAoJ1VURi04JyAhPT0gJGVuY29kaW5nKSB7CiRzID0gaWNvbnYoJGVuY29kaW5nLCAnVVRGLTgvL0lHTk9SRScsICRzKTsKfQoKJHMgPSBwcmVnX3JlcGxhY2UoJy9bXHh7MTEwMH0tXHh7MTE1Rn1ceHsyMzI5fVx4ezIzMkF9XHh7MkU4MH0tXHh7MzAzRX1ceHszMDQwfS1ceHtBNENGfVx4e0FDMDB9LVx4e0Q3QTN9XHh7RjkwMH0tXHh7RkFGRn1ceHtGRTEwfS1ceHtGRTE5fVx4e0ZFMzB9LVx4e0ZFNkZ9XHh7RkYwMH0tXHh7RkY2MH1ceHtGRkUwfS1ceHtGRkU2fVx4ezIwMDAwfS1ceHsyRkZGRH1ceHszMDAwMH0tXHh7M0ZGRkR9XS91JywgJycsICRzLCAtMSwgJHdpZGUpOwoKcmV0dXJuICgkd2lkZSA8PCAxKSArIGljb252X3N0cmxlbigkcywgJ1VURi04Jyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3Vic3RyX2NvdW50KCRoYXlzdGFjaywgJG5lZWRsZSwgJGVuY29kaW5nID0gbnVsbCkKewpyZXR1cm4gc3Vic3RyX2NvdW50KCRoYXlzdGFjaywgJG5lZWRsZSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfb3V0cHV0X2hhbmRsZXIoJGNvbnRlbnRzLCAkc3RhdHVzKQp7CnJldHVybiAkY29udGVudHM7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfY2hyKCRjb2RlLCAkZW5jb2RpbmcgPSBudWxsKQp7CmlmICgweDgwID4gJGNvZGUgJT0gMHgyMDAwMDApIHsKJHMgPSBcY2hyKCRjb2RlKTsKfSBlbHNlaWYgKDB4ODAwID4gJGNvZGUpIHsKJHMgPSBcY2hyKDB4QzAgfCAkY29kZSA+PiA2KS5cY2hyKDB4ODAgfCAkY29kZSAmIDB4M0YpOwp9IGVsc2VpZiAoMHgxMDAwMCA+ICRjb2RlKSB7CiRzID0gXGNocigweEUwIHwgJGNvZGUgPj4gMTIpLlxjaHIoMHg4MCB8ICRjb2RlID4+IDYgJiAweDNGKS5cY2hyKDB4ODAgfCAkY29kZSAmIDB4M0YpOwp9IGVsc2UgewokcyA9IFxjaHIoMHhGMCB8ICRjb2RlID4+IDE4KS5cY2hyKDB4ODAgfCAkY29kZSA+PiAxMiAmIDB4M0YpLlxjaHIoMHg4MCB8ICRjb2RlID4+IDYgJiAweDNGKS5cY2hyKDB4ODAgfCAkY29kZSAmIDB4M0YpOwp9CgppZiAoJ1VURi04JyAhPT0gJGVuY29kaW5nID0gc2VsZjo6Z2V0RW5jb2RpbmcoJGVuY29kaW5nKSkgewokcyA9IG1iX2NvbnZlcnRfZW5jb2RpbmcoJHMsICRlbmNvZGluZywgJ1VURi04Jyk7Cn0KCnJldHVybiAkczsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9vcmQoJHMsICRlbmNvZGluZyA9IG51bGwpCnsKaWYgKCdVVEYtOCcgIT09ICRlbmNvZGluZyA9IHNlbGY6OmdldEVuY29kaW5nKCRlbmNvZGluZykpIHsKJHMgPSBtYl9jb252ZXJ0X2VuY29kaW5nKCRzLCAnVVRGLTgnLCAkZW5jb2RpbmcpOwp9CgppZiAoMSA9PT0gXHN0cmxlbigkcykpIHsKcmV0dXJuIFxvcmQoJHMpOwp9CgokY29kZSA9ICgkcyA9IHVucGFjaygnQyonLCBzdWJzdHIoJHMsIDAsIDQpKSkgPyAkc1sxXSA6IDA7CmlmICgweEYwIDw9ICRjb2RlKSB7CnJldHVybiAoKCRjb2RlIC0gMHhGMCkgPDwgMTgpICsgKCgkc1syXSAtIDB4ODApIDw8IDEyKSArICgoJHNbM10gLSAweDgwKSA8PCA2KSArICRzWzRdIC0gMHg4MDsKfQppZiAoMHhFMCA8PSAkY29kZSkgewpyZXR1cm4gKCgkY29kZSAtIDB4RTApIDw8IDEyKSArICgoJHNbMl0gLSAweDgwKSA8PCA2KSArICRzWzNdIC0gMHg4MDsKfQppZiAoMHhDMCA8PSAkY29kZSkgewpyZXR1cm4gKCgkY29kZSAtIDB4QzApIDw8IDYpICsgJHNbMl0gLSAweDgwOwp9CgpyZXR1cm4gJGNvZGU7Cn0KCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3N0cl9wYWQoc3RyaW5nICRzdHJpbmcsIGludCAkbGVuZ3RoLCBzdHJpbmcgJHBhZF9zdHJpbmcgPSAnICcsIGludCAkcGFkX3R5cGUgPSBcU1RSX1BBRF9SSUdIVCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKQp7CmlmICghXGluX2FycmF5KCRwYWRfdHlwZSwgW1xTVFJfUEFEX1JJR0hULCBcU1RSX1BBRF9MRUZULCBcU1RSX1BBRF9CT1RIXSwgdHJ1ZSkpIHsKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDgwMDAwKSB7CnRyaWdnZXJfZXJyb3IoJ21iX3N0cl9wYWQoKTogQXJndW1lbnQgIzQgKCRwYWRfdHlwZSkgbXVzdCBiZSBTVFJfUEFEX0xFRlQsIFNUUl9QQURfUklHSFQsIG9yIFNUUl9QQURfQk9USCcsIFxFX1VTRVJfV0FSTklORyk7CgpyZXR1cm4gZmFsc2U7Cn0KCnRocm93IG5ldyBcVmFsdWVFcnJvcignbWJfc3RyX3BhZCgpOiBBcmd1bWVudCAjNCAoJHBhZF90eXBlKSBtdXN0IGJlIFNUUl9QQURfTEVGVCwgU1RSX1BBRF9SSUdIVCwgb3IgU1RSX1BBRF9CT1RIJyk7Cn0KCmlmIChudWxsID09PSAkZW5jb2RpbmcpIHsKJGVuY29kaW5nID0gc2VsZjo6bWJfaW50ZXJuYWxfZW5jb2RpbmcoKTsKfSBlbHNlaWYgKCFzZWxmOjphc3NlcnRFbmNvZGluZygkZW5jb2RpbmcsICdtYl9zdHJfcGFkKCk6IEFyZ3VtZW50ICM1ICgkZW5jb2RpbmcpIG11c3QgYmUgYSB2YWxpZCBlbmNvZGluZywgIiVzIiBnaXZlbicpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKHNlbGY6Om1iX3N0cmxlbigkcGFkX3N0cmluZywgJGVuY29kaW5nKSA8PSAwKSB7CmlmIChcUEhQX1ZFUlNJT05fSUQgPCA4MDAwMCkgewp0cmlnZ2VyX2Vycm9yKCdtYl9zdHJfcGFkKCk6IEFyZ3VtZW50ICMzICgkcGFkX3N0cmluZykgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnLCBcRV9VU0VSX1dBUk5JTkcpOwoKcmV0dXJuIGZhbHNlOwp9Cgp0aHJvdyBuZXcgXFZhbHVlRXJyb3IoJ21iX3N0cl9wYWQoKTogQXJndW1lbnQgIzMgKCRwYWRfc3RyaW5nKSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpOwp9CgokcGFkZGluZ1JlcXVpcmVkID0gJGxlbmd0aCAtIHNlbGY6Om1iX3N0cmxlbigkc3RyaW5nLCAkZW5jb2RpbmcpOwoKaWYgKCRwYWRkaW5nUmVxdWlyZWQgPCAxKSB7CnJldHVybiAkc3RyaW5nOwp9Cgpzd2l0Y2ggKCRwYWRfdHlwZSkgewpjYXNlIFxTVFJfUEFEX0xFRlQ6CnJldHVybiBzZWxmOjptYl9zdWJzdHIoc3RyX3JlcGVhdCgkcGFkX3N0cmluZywgJHBhZGRpbmdSZXF1aXJlZCksIDAsICRwYWRkaW5nUmVxdWlyZWQsICRlbmNvZGluZykuJHN0cmluZzsKY2FzZSBcU1RSX1BBRF9SSUdIVDoKcmV0dXJuICRzdHJpbmcuc2VsZjo6bWJfc3Vic3RyKHN0cl9yZXBlYXQoJHBhZF9zdHJpbmcsICRwYWRkaW5nUmVxdWlyZWQpLCAwLCAkcGFkZGluZ1JlcXVpcmVkLCAkZW5jb2RpbmcpOwpkZWZhdWx0OgokbGVmdFBhZGRpbmdMZW5ndGggPSBmbG9vcigkcGFkZGluZ1JlcXVpcmVkIC8gMik7CiRyaWdodFBhZGRpbmdMZW5ndGggPSAkcGFkZGluZ1JlcXVpcmVkIC0gJGxlZnRQYWRkaW5nTGVuZ3RoOwoKcmV0dXJuIHNlbGY6Om1iX3N1YnN0cihzdHJfcmVwZWF0KCRwYWRfc3RyaW5nLCAkbGVmdFBhZGRpbmdMZW5ndGgpLCAwLCAkbGVmdFBhZGRpbmdMZW5ndGgsICRlbmNvZGluZykuJHN0cmluZy5zZWxmOjptYl9zdWJzdHIoc3RyX3JlcGVhdCgkcGFkX3N0cmluZywgJHJpZ2h0UGFkZGluZ0xlbmd0aCksIDAsICRyaWdodFBhZGRpbmdMZW5ndGgsICRlbmNvZGluZyk7Cn0KfQoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfdWNmaXJzdChzdHJpbmcgJHN0cmluZywgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKQp7CmlmIChudWxsID09PSAkZW5jb2RpbmcpIHsKJGVuY29kaW5nID0gc2VsZjo6bWJfaW50ZXJuYWxfZW5jb2RpbmcoKTsKfSBlbHNlaWYgKCFzZWxmOjphc3NlcnRFbmNvZGluZygkZW5jb2RpbmcsICdtYl91Y2ZpcnN0KCk6IEFyZ3VtZW50ICMyICgkZW5jb2RpbmcpIG11c3QgYmUgYSB2YWxpZCBlbmNvZGluZywgIiVzIiBnaXZlbicpKSB7CnJldHVybiBmYWxzZTsKfQoKJGZpcnN0Q2hhciA9IG1iX3N1YnN0cigkc3RyaW5nLCAwLCAxLCAkZW5jb2RpbmcpOwokZmlyc3RDaGFyID0gbWJfY29udmVydF9jYXNlKCRmaXJzdENoYXIsIFxNQl9DQVNFX1RJVExFLCAkZW5jb2RpbmcpOwoKcmV0dXJuICRmaXJzdENoYXIubWJfc3Vic3RyKCRzdHJpbmcsIDEsIG51bGwsICRlbmNvZGluZyk7Cn0KCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2xjZmlyc3Qoc3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCkKewppZiAobnVsbCA9PT0gJGVuY29kaW5nKSB7CiRlbmNvZGluZyA9IHNlbGY6Om1iX2ludGVybmFsX2VuY29kaW5nKCk7Cn0gZWxzZWlmICghc2VsZjo6YXNzZXJ0RW5jb2RpbmcoJGVuY29kaW5nLCAnbWJfbGNmaXJzdCgpOiBBcmd1bWVudCAjMiAoJGVuY29kaW5nKSBtdXN0IGJlIGEgdmFsaWQgZW5jb2RpbmcsICIlcyIgZ2l2ZW4nKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRmaXJzdENoYXIgPSBtYl9zdWJzdHIoJHN0cmluZywgMCwgMSwgJGVuY29kaW5nKTsKJGZpcnN0Q2hhciA9IG1iX2NvbnZlcnRfY2FzZSgkZmlyc3RDaGFyLCBcTUJfQ0FTRV9MT1dFUiwgJGVuY29kaW5nKTsKCnJldHVybiAkZmlyc3RDaGFyLm1iX3N1YnN0cigkc3RyaW5nLCAxLCBudWxsLCAkZW5jb2RpbmcpOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRTdWJwYXJ0KCRwb3MsICRwYXJ0LCAkaGF5c3RhY2ssICRlbmNvZGluZykKewppZiAoZmFsc2UgPT09ICRwb3MpIHsKcmV0dXJuIGZhbHNlOwp9CmlmICgkcGFydCkgewpyZXR1cm4gc2VsZjo6bWJfc3Vic3RyKCRoYXlzdGFjaywgMCwgJHBvcywgJGVuY29kaW5nKTsKfQoKcmV0dXJuIHNlbGY6Om1iX3N1YnN0cigkaGF5c3RhY2ssICRwb3MsIG51bGwsICRlbmNvZGluZyk7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGh0bWxfZW5jb2RpbmdfY2FsbGJhY2soYXJyYXkgJG0pCnsKJGkgPSAxOwokZW50aXRpZXMgPSAnJzsKJG0gPSB1bnBhY2soJ0MqJywgaHRtbGVudGl0aWVzKCRtWzBdLCBcRU5UX0NPTVBBVCwgJ1VURi04JykpOwoKd2hpbGUgKGlzc2V0KCRtWyRpXSkpIHsKaWYgKDB4ODAgPiAkbVskaV0pIHsKJGVudGl0aWVzIC49IFxjaHIoJG1bJGkrK10pOwpjb250aW51ZTsKfQppZiAoMHhGMCA8PSAkbVskaV0pIHsKJGMgPSAoKCRtWyRpKytdIC0gMHhGMCkgPDwgMTgpICsgKCgkbVskaSsrXSAtIDB4ODApIDw8IDEyKSArICgoJG1bJGkrK10gLSAweDgwKSA8PCA2KSArICRtWyRpKytdIC0gMHg4MDsKfSBlbHNlaWYgKDB4RTAgPD0gJG1bJGldKSB7CiRjID0gKCgkbVskaSsrXSAtIDB4RTApIDw8IDEyKSArICgoJG1bJGkrK10gLSAweDgwKSA8PCA2KSArICRtWyRpKytdIC0gMHg4MDsKfSBlbHNlIHsKJGMgPSAoKCRtWyRpKytdIC0gMHhDMCkgPDwgNikgKyAkbVskaSsrXSAtIDB4ODA7Cn0KCiRlbnRpdGllcyAuPSAnJiMnLiRjLic7JzsKfQoKcmV0dXJuICRlbnRpdGllczsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gdGl0bGVfY2FzZShhcnJheSAkcykKewpyZXR1cm4gc2VsZjo6bWJfY29udmVydF9jYXNlKCRzWzFdLCBcTUJfQ0FTRV9VUFBFUiwgJ1VURi04Jykuc2VsZjo6bWJfY29udmVydF9jYXNlKCRzWzJdLCBcTUJfQ0FTRV9MT1dFUiwgJ1VURi04Jyk7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldERhdGEoJGZpbGUpCnsKaWYgKGZpbGVfZXhpc3RzKCRmaWxlID0gX19ESVJfXy4nL1Jlc291cmNlcy91bmlkYXRhLycuJGZpbGUuJy5waHAnKSkgewpyZXR1cm4gcmVxdWlyZSAkZmlsZTsKfQoKcmV0dXJuIGZhbHNlOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRFbmNvZGluZygkZW5jb2RpbmcpCnsKaWYgKG51bGwgPT09ICRlbmNvZGluZykgewpyZXR1cm4gc2VsZjo6JGludGVybmFsRW5jb2Rpbmc7Cn0KCmlmICgnVVRGLTgnID09PSAkZW5jb2RpbmcpIHsKcmV0dXJuICdVVEYtOCc7Cn0KCiRlbmNvZGluZyA9IHN0cnRvdXBwZXIoJGVuY29kaW5nKTsKCmlmICgnOEJJVCcgPT09ICRlbmNvZGluZyB8fCAnQklOQVJZJyA9PT0gJGVuY29kaW5nKSB7CnJldHVybiAnQ1A4NTAnOwp9CgppZiAoJ1VURjgnID09PSAkZW5jb2RpbmcpIHsKcmV0dXJuICdVVEYtOCc7Cn0KCmlmICgnVVRGLTMyJyA9PT0gJGVuY29kaW5nKSB7CnJldHVybiAnVVRGLTMyQkUnOwp9CgppZiAoJ1VURi0xNicgPT09ICRlbmNvZGluZykgewpyZXR1cm4gJ1VURi0xNkJFJzsKfQoKcmV0dXJuICRlbmNvZGluZzsKfQoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfdHJpbShzdHJpbmcgJHN0cmluZywgP3N0cmluZyAkY2hhcmFjdGVycyA9IG51bGwsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCkKewpyZXR1cm4gc2VsZjo6bWJfaW50ZXJuYWxfdHJpbSgne15bJXNdK3xbJTEkc10rJH1EdScsICRzdHJpbmcsICRjaGFyYWN0ZXJzLCAkZW5jb2RpbmcsIF9fRlVOQ1RJT05fXyk7Cn0KCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2x0cmltKHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRjaGFyYWN0ZXJzID0gbnVsbCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKQp7CnJldHVybiBzZWxmOjptYl9pbnRlcm5hbF90cmltKCd7Xlslc10rfUR1JywgJHN0cmluZywgJGNoYXJhY3RlcnMsICRlbmNvZGluZywgX19GVU5DVElPTl9fKTsKfQoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfcnRyaW0oc3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGNoYXJhY3RlcnMgPSBudWxsLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpCnsKcmV0dXJuIHNlbGY6Om1iX2ludGVybmFsX3RyaW0oJ3tbJXNdKyR9RHUnLCAkc3RyaW5nLCAkY2hhcmFjdGVycywgJGVuY29kaW5nLCBfX0ZVTkNUSU9OX18pOwp9CgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gbWJfaW50ZXJuYWxfdHJpbShzdHJpbmcgJHJlZ2V4LCBzdHJpbmcgJHN0cmluZywgP3N0cmluZyAkY2hhcmFjdGVycywgP3N0cmluZyAkZW5jb2RpbmcsIHN0cmluZyAkZnVuY3Rpb24pCnsKaWYgKG51bGwgPT09ICRlbmNvZGluZykgewokZW5jb2RpbmcgPSBzZWxmOjptYl9pbnRlcm5hbF9lbmNvZGluZygpOwp9IGVsc2VpZiAoIXNlbGY6OmFzc2VydEVuY29kaW5nKCRlbmNvZGluZywgJGZ1bmN0aW9uLicoKTogQXJndW1lbnQgIzMgKCRlbmNvZGluZykgbXVzdCBiZSBhIHZhbGlkIGVuY29kaW5nLCAiJXMiIGdpdmVuJykpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoJycgPT09ICRjaGFyYWN0ZXJzKSB7CnJldHVybiBudWxsID09PSAkZW5jb2RpbmcgPyAkc3RyaW5nIDogc2VsZjo6bWJfY29udmVydF9lbmNvZGluZygkc3RyaW5nLCAkZW5jb2RpbmcpOwp9CgppZiAoJ1VURi04JyA9PT0gJGVuY29kaW5nKSB7CiRlbmNvZGluZyA9IG51bGw7CmlmICghcHJlZ19tYXRjaCgnLy91JywgJHN0cmluZykpIHsKJHN0cmluZyA9IEBpY29udignVVRGLTgnLCAnVVRGLTgvL0lHTk9SRScsICRzdHJpbmcpOwp9CmlmIChudWxsICE9PSAkY2hhcmFjdGVycyAmJiAhcHJlZ19tYXRjaCgnLy91JywgJGNoYXJhY3RlcnMpKSB7CiRjaGFyYWN0ZXJzID0gQGljb252KCdVVEYtOCcsICdVVEYtOC8vSUdOT1JFJywgJGNoYXJhY3RlcnMpOwp9Cn0gZWxzZSB7CiRzdHJpbmcgPSBpY29udigkZW5jb2RpbmcsICdVVEYtOC8vSUdOT1JFJywgJHN0cmluZyk7CgppZiAobnVsbCAhPT0gJGNoYXJhY3RlcnMpIHsKJGNoYXJhY3RlcnMgPSBpY29udigkZW5jb2RpbmcsICdVVEYtOC8vSUdOT1JFJywgJGNoYXJhY3RlcnMpOwp9Cn0KCmlmIChudWxsID09PSAkY2hhcmFjdGVycykgewokY2hhcmFjdGVycyA9ICJcXDAgXGZcblxyXHRcdlx1ezAwQTB9XHV7MTY4MH1cdXsyMDAwfVx1ezIwMDF9XHV7MjAwMn1cdXsyMDAzfVx1ezIwMDR9XHV7MjAwNX1cdXsyMDA2fVx1ezIwMDd9XHV7MjAwOH1cdXsyMDA5fVx1ezIwMEF9XHV7MjAyOH1cdXsyMDI5fVx1ezIwMkZ9XHV7MjA1Rn1cdXszMDAwfVx1ezAwODV9XHV7MTgwRX0iOwp9IGVsc2UgewokY2hhcmFjdGVycyA9IHByZWdfcXVvdGUoJGNoYXJhY3RlcnMpOwp9Cgokc3RyaW5nID0gcHJlZ19yZXBsYWNlKFxzcHJpbnRmKCRyZWdleCwgJGNoYXJhY3RlcnMpLCAnJywgJHN0cmluZyk7CgppZiAobnVsbCA9PT0gJGVuY29kaW5nKSB7CnJldHVybiAkc3RyaW5nOwp9CgpyZXR1cm4gaWNvbnYoJ1VURi04JywgJGVuY29kaW5nLicvL0lHTk9SRScsICRzdHJpbmcpOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBhc3NlcnRFbmNvZGluZyhzdHJpbmcgJGVuY29kaW5nLCBzdHJpbmcgJGVycm9yRm9ybWF0KTogYm9vbAp7CnRyeSB7CiR2YWxpZEVuY29kaW5nID0gQHNlbGY6Om1iX2NoZWNrX2VuY29kaW5nKCcnLCAkZW5jb2RpbmcpOwp9IGNhdGNoIChcVmFsdWVFcnJvciAkZSkgewp0aHJvdyBuZXcgXFZhbHVlRXJyb3IoXHNwcmludGYoJGVycm9yRm9ybWF0LCAkZW5jb2RpbmcpKTsKfQoKaWYgKCEkdmFsaWRFbmNvZGluZykgewppZiAoODAwMDAgPiBcUEhQX1ZFUlNJT05fSUQpIHsKdHJpZ2dlcl9lcnJvcihcc3ByaW50ZigkZXJyb3JGb3JtYXQsICRlbmNvZGluZyksIFxFX1VTRVJfV0FSTklORyk7Cn0gZWxzZSB7CnRocm93IG5ldyBcVmFsdWVFcnJvcihcc3ByaW50ZigkZXJyb3JGb3JtYXQsICRlbmNvZGluZykpOwp9Cn0KCnJldHVybiAkdmFsaWRFbmNvZGluZzsKfQp9Cjw/cGhwCgpyZXR1cm4gWwonxLAnID0+ICdpzIcnLAonwrUnID0+ICfOvCcsCifFvycgPT4gJ3MnLAonzYUnID0+ICfOuScsCifPgicgPT4gJ8+DJywKJ8+QJyA9PiAnzrInLAonz5EnID0+ICfOuCcsCifPlScgPT4gJ8+GJywKJ8+WJyA9PiAnz4AnLAonz7AnID0+ICfOuicsCifPsScgPT4gJ8+BJywKJ8+1JyA9PiAnzrUnLAon4bqbJyA9PiAn4bmhJywKJ+G+vicgPT4gJ865JywKJ8OfJyA9PiAnc3MnLAonxYknID0+ICfKvG4nLAonx7AnID0+ICfHsCcsCifOkCcgPT4gJ86QJywKJ86wJyA9PiAnzrAnLAon1ocnID0+ICfVpdaCJywKJ+G6licgPT4gJ+G6licsCifhupcnID0+ICfhupcnLAon4bqYJyA9PiAn4bqYJywKJ+G6mScgPT4gJ+G6mScsCifhuponID0+ICdhyr4nLAon4bqeJyA9PiAnc3MnLAon4b2QJyA9PiAn4b2QJywKJ+G9kicgPT4gJ+G9kicsCifhvZQnID0+ICfhvZQnLAon4b2WJyA9PiAn4b2WJywKJ+G+gCcgPT4gJ+G8gM65JywKJ+G+gScgPT4gJ+G8gc65JywKJ+G+gicgPT4gJ+G8gs65JywKJ+G+gycgPT4gJ+G8g865JywKJ+G+hCcgPT4gJ+G8hM65JywKJ+G+hScgPT4gJ+G8hc65JywKJ+G+hicgPT4gJ+G8hs65JywKJ+G+hycgPT4gJ+G8h865JywKJ+G+iCcgPT4gJ+G8gM65JywKJ+G+iScgPT4gJ+G8gc65JywKJ+G+iicgPT4gJ+G8gs65JywKJ+G+iycgPT4gJ+G8g865JywKJ+G+jCcgPT4gJ+G8hM65JywKJ+G+jScgPT4gJ+G8hc65JywKJ+G+jicgPT4gJ+G8hs65JywKJ+G+jycgPT4gJ+G8h865JywKJ+G+kCcgPT4gJ+G8oM65JywKJ+G+kScgPT4gJ+G8oc65JywKJ+G+kicgPT4gJ+G8os65JywKJ+G+kycgPT4gJ+G8o865JywKJ+G+lCcgPT4gJ+G8pM65JywKJ+G+lScgPT4gJ+G8pc65JywKJ+G+licgPT4gJ+G8ps65JywKJ+G+lycgPT4gJ+G8p865JywKJ+G+mCcgPT4gJ+G8oM65JywKJ+G+mScgPT4gJ+G8oc65JywKJ+G+micgPT4gJ+G8os65JywKJ+G+mycgPT4gJ+G8o865JywKJ+G+nCcgPT4gJ+G8pM65JywKJ+G+nScgPT4gJ+G8pc65JywKJ+G+nicgPT4gJ+G8ps65JywKJ+G+nycgPT4gJ+G8p865JywKJ+G+oCcgPT4gJ+G9oM65JywKJ+G+oScgPT4gJ+G9oc65JywKJ+G+oicgPT4gJ+G9os65JywKJ+G+oycgPT4gJ+G9o865JywKJ+G+pCcgPT4gJ+G9pM65JywKJ+G+pScgPT4gJ+G9pc65JywKJ+G+picgPT4gJ+G9ps65JywKJ+G+pycgPT4gJ+G9p865JywKJ+G+qCcgPT4gJ+G9oM65JywKJ+G+qScgPT4gJ+G9oc65JywKJ+G+qicgPT4gJ+G9os65JywKJ+G+qycgPT4gJ+G9o865JywKJ+G+rCcgPT4gJ+G9pM65JywKJ+G+rScgPT4gJ+G9pc65JywKJ+G+ricgPT4gJ+G9ps65JywKJ+G+rycgPT4gJ+G9p865JywKJ+G+sicgPT4gJ+G9sM65JywKJ+G+sycgPT4gJ86xzrknLAon4b60JyA9PiAnzqzOuScsCifhvrYnID0+ICfhvrYnLAon4b63JyA9PiAn4b62zrknLAon4b68JyA9PiAnzrHOuScsCifhv4InID0+ICfhvbTOuScsCifhv4MnID0+ICfOt865JywKJ+G/hCcgPT4gJ86uzrknLAon4b+GJyA9PiAn4b+GJywKJ+G/hycgPT4gJ+G/hs65JywKJ+G/jCcgPT4gJ863zrknLAon4b+SJyA9PiAn4b+SJywKJ+G/licgPT4gJ+G/licsCifhv5cnID0+ICfhv5cnLAon4b+iJyA9PiAn4b+iJywKJ+G/pCcgPT4gJ+G/pCcsCifhv6YnID0+ICfhv6YnLAon4b+nJyA9PiAn4b+nJywKJ+G/sicgPT4gJ+G9vM65JywKJ+G/sycgPT4gJ8+JzrknLAon4b+0JyA9PiAnz47OuScsCifhv7YnID0+ICfhv7YnLAon4b+3JyA9PiAn4b+2zrknLAon4b+8JyA9PiAnz4nOuScsCifvrIAnID0+ICdmZicsCifvrIEnID0+ICdmaScsCifvrIInID0+ICdmbCcsCifvrIMnID0+ICdmZmknLAon76yEJyA9PiAnZmZsJywKJ++shScgPT4gJ3N0JywKJ++shicgPT4gJ3N0JywKJ++skycgPT4gJ9W01bYnLAon76yUJyA9PiAn1bTVpScsCifvrJUnID0+ICfVtNWrJywKJ++slicgPT4gJ9W+1bYnLAon76yXJyA9PiAn1bTVrScsCl07Cjw/cGhwCgpyZXR1cm4gYXJyYXkgKAonQScgPT4gJ2EnLAonQicgPT4gJ2InLAonQycgPT4gJ2MnLAonRCcgPT4gJ2QnLAonRScgPT4gJ2UnLAonRicgPT4gJ2YnLAonRycgPT4gJ2cnLAonSCcgPT4gJ2gnLAonSScgPT4gJ2knLAonSicgPT4gJ2onLAonSycgPT4gJ2snLAonTCcgPT4gJ2wnLAonTScgPT4gJ20nLAonTicgPT4gJ24nLAonTycgPT4gJ28nLAonUCcgPT4gJ3AnLAonUScgPT4gJ3EnLAonUicgPT4gJ3InLAonUycgPT4gJ3MnLAonVCcgPT4gJ3QnLAonVScgPT4gJ3UnLAonVicgPT4gJ3YnLAonVycgPT4gJ3cnLAonWCcgPT4gJ3gnLAonWScgPT4gJ3knLAonWicgPT4gJ3onLAonw4AnID0+ICfDoCcsCifDgScgPT4gJ8OhJywKJ8OCJyA9PiAnw6InLAonw4MnID0+ICfDoycsCifDhCcgPT4gJ8OkJywKJ8OFJyA9PiAnw6UnLAonw4YnID0+ICfDpicsCifDhycgPT4gJ8OnJywKJ8OIJyA9PiAnw6gnLAonw4knID0+ICfDqScsCifDiicgPT4gJ8OqJywKJ8OLJyA9PiAnw6snLAonw4wnID0+ICfDrCcsCifDjScgPT4gJ8OtJywKJ8OOJyA9PiAnw64nLAonw48nID0+ICfDrycsCifDkCcgPT4gJ8OwJywKJ8ORJyA9PiAnw7EnLAonw5InID0+ICfDsicsCifDkycgPT4gJ8OzJywKJ8OUJyA9PiAnw7QnLAonw5UnID0+ICfDtScsCifDlicgPT4gJ8O2JywKJ8OYJyA9PiAnw7gnLAonw5knID0+ICfDuScsCifDmicgPT4gJ8O6JywKJ8ObJyA9PiAnw7snLAonw5wnID0+ICfDvCcsCifDnScgPT4gJ8O9JywKJ8OeJyA9PiAnw74nLAonxIAnID0+ICfEgScsCifEgicgPT4gJ8SDJywKJ8SEJyA9PiAnxIUnLAonxIYnID0+ICfEhycsCifEiCcgPT4gJ8SJJywKJ8SKJyA9PiAnxIsnLAonxIwnID0+ICfEjScsCifEjicgPT4gJ8SPJywKJ8SQJyA9PiAnxJEnLAonxJInID0+ICfEkycsCifElCcgPT4gJ8SVJywKJ8SWJyA9PiAnxJcnLAonxJgnID0+ICfEmScsCifEmicgPT4gJ8SbJywKJ8ScJyA9PiAnxJ0nLAonxJ4nID0+ICfEnycsCifEoCcgPT4gJ8ShJywKJ8SiJyA9PiAnxKMnLAonxKQnID0+ICfEpScsCifEpicgPT4gJ8SnJywKJ8SoJyA9PiAnxKknLAonxKonID0+ICfEqycsCifErCcgPT4gJ8StJywKJ8SuJyA9PiAnxK8nLAonxLAnID0+ICdpzIcnLAonxLInID0+ICfEsycsCifEtCcgPT4gJ8S1JywKJ8S2JyA9PiAnxLcnLAonxLknID0+ICfEuicsCifEuycgPT4gJ8S8JywKJ8S9JyA9PiAnxL4nLAonxL8nID0+ICfFgCcsCifFgScgPT4gJ8WCJywKJ8WDJyA9PiAnxYQnLAonxYUnID0+ICfFhicsCifFhycgPT4gJ8WIJywKJ8WKJyA9PiAnxYsnLAonxYwnID0+ICfFjScsCifFjicgPT4gJ8WPJywKJ8WQJyA9PiAnxZEnLAonxZInID0+ICfFkycsCifFlCcgPT4gJ8WVJywKJ8WWJyA9PiAnxZcnLAonxZgnID0+ICfFmScsCifFmicgPT4gJ8WbJywKJ8WcJyA9PiAnxZ0nLAonxZ4nID0+ICfFnycsCifFoCcgPT4gJ8WhJywKJ8WiJyA9PiAnxaMnLAonxaQnID0+ICfFpScsCifFpicgPT4gJ8WnJywKJ8WoJyA9PiAnxaknLAonxaonID0+ICfFqycsCifFrCcgPT4gJ8WtJywKJ8WuJyA9PiAnxa8nLAonxbAnID0+ICfFsScsCifFsicgPT4gJ8WzJywKJ8W0JyA9PiAnxbUnLAonxbYnID0+ICfFtycsCifFuCcgPT4gJ8O/JywKJ8W5JyA9PiAnxbonLAonxbsnID0+ICfFvCcsCifFvScgPT4gJ8W+JywKJ8aBJyA9PiAnyZMnLAonxoInID0+ICfGgycsCifGhCcgPT4gJ8aFJywKJ8aGJyA9PiAnyZQnLAonxocnID0+ICfGiCcsCifGiScgPT4gJ8mWJywKJ8aKJyA9PiAnyZcnLAonxosnID0+ICfGjCcsCifGjicgPT4gJ8edJywKJ8aPJyA9PiAnyZknLAonxpAnID0+ICfJmycsCifGkScgPT4gJ8aSJywKJ8aTJyA9PiAnyaAnLAonxpQnID0+ICfJoycsCifGlicgPT4gJ8mpJywKJ8aXJyA9PiAnyagnLAonxpgnID0+ICfGmScsCifGnCcgPT4gJ8mvJywKJ8adJyA9PiAnybInLAonxp8nID0+ICfJtScsCifGoCcgPT4gJ8ahJywKJ8aiJyA9PiAnxqMnLAonxqQnID0+ICfGpScsCifGpicgPT4gJ8qAJywKJ8anJyA9PiAnxqgnLAonxqknID0+ICfKgycsCifGrCcgPT4gJ8atJywKJ8auJyA9PiAnyognLAonxq8nID0+ICfGsCcsCifGsScgPT4gJ8qKJywKJ8ayJyA9PiAnyosnLAonxrMnID0+ICfGtCcsCifGtScgPT4gJ8a2JywKJ8a3JyA9PiAnypInLAonxrgnID0+ICfGuScsCifGvCcgPT4gJ8a9JywKJ8eEJyA9PiAnx4YnLAonx4UnID0+ICfHhicsCifHhycgPT4gJ8eJJywKJ8eIJyA9PiAnx4knLAonx4onID0+ICfHjCcsCifHiycgPT4gJ8eMJywKJ8eNJyA9PiAnx44nLAonx48nID0+ICfHkCcsCifHkScgPT4gJ8eSJywKJ8eTJyA9PiAnx5QnLAonx5UnID0+ICfHlicsCifHlycgPT4gJ8eYJywKJ8eZJyA9PiAnx5onLAonx5snID0+ICfHnCcsCifHnicgPT4gJ8efJywKJ8egJyA9PiAnx6EnLAonx6InID0+ICfHoycsCifHpCcgPT4gJ8elJywKJ8emJyA9PiAnx6cnLAonx6gnID0+ICfHqScsCifHqicgPT4gJ8erJywKJ8esJyA9PiAnx60nLAonx64nID0+ICfHrycsCifHsScgPT4gJ8ezJywKJ8eyJyA9PiAnx7MnLAonx7QnID0+ICfHtScsCifHticgPT4gJ8aVJywKJ8e3JyA9PiAnxr8nLAonx7gnID0+ICfHuScsCifHuicgPT4gJ8e7JywKJ8e8JyA9PiAnx70nLAonx74nID0+ICfHvycsCifIgCcgPT4gJ8iBJywKJ8iCJyA9PiAnyIMnLAonyIQnID0+ICfIhScsCifIhicgPT4gJ8iHJywKJ8iIJyA9PiAnyIknLAonyIonID0+ICfIiycsCifIjCcgPT4gJ8iNJywKJ8iOJyA9PiAnyI8nLAonyJAnID0+ICfIkScsCifIkicgPT4gJ8iTJywKJ8iUJyA9PiAnyJUnLAonyJYnID0+ICfIlycsCifImCcgPT4gJ8iZJywKJ8iaJyA9PiAnyJsnLAonyJwnID0+ICfInScsCifInicgPT4gJ8ifJywKJ8igJyA9PiAnxp4nLAonyKInID0+ICfIoycsCifIpCcgPT4gJ8ilJywKJ8imJyA9PiAnyKcnLAonyKgnID0+ICfIqScsCifIqicgPT4gJ8irJywKJ8isJyA9PiAnyK0nLAonyK4nID0+ICfIrycsCifIsCcgPT4gJ8ixJywKJ8iyJyA9PiAnyLMnLAonyLonID0+ICfisaUnLAonyLsnID0+ICfIvCcsCifIvScgPT4gJ8aaJywKJ8i+JyA9PiAn4rGmJywKJ8mBJyA9PiAnyYInLAonyYMnID0+ICfGgCcsCifJhCcgPT4gJ8qJJywKJ8mFJyA9PiAnyownLAonyYYnID0+ICfJhycsCifJiCcgPT4gJ8mJJywKJ8mKJyA9PiAnyYsnLAonyYwnID0+ICfJjScsCifJjicgPT4gJ8mPJywKJ82wJyA9PiAnzbEnLAonzbInID0+ICfNsycsCifNticgPT4gJ823JywKJ82/JyA9PiAnz7MnLAonzoYnID0+ICfOrCcsCifOiCcgPT4gJ86tJywKJ86JJyA9PiAnzq4nLAonzoonID0+ICfOrycsCifOjCcgPT4gJ8+MJywKJ86OJyA9PiAnz40nLAonzo8nID0+ICfPjicsCifOkScgPT4gJ86xJywKJ86SJyA9PiAnzrInLAonzpMnID0+ICfOsycsCifOlCcgPT4gJ860JywKJ86VJyA9PiAnzrUnLAonzpYnID0+ICfOticsCifOlycgPT4gJ863JywKJ86YJyA9PiAnzrgnLAonzpknID0+ICfOuScsCifOmicgPT4gJ866JywKJ86bJyA9PiAnzrsnLAonzpwnID0+ICfOvCcsCifOnScgPT4gJ869JywKJ86eJyA9PiAnzr4nLAonzp8nID0+ICfOvycsCifOoCcgPT4gJ8+AJywKJ86hJyA9PiAnz4EnLAonzqMnID0+ICfPgycsCifOpCcgPT4gJ8+EJywKJ86lJyA9PiAnz4UnLAonzqYnID0+ICfPhicsCifOpycgPT4gJ8+HJywKJ86oJyA9PiAnz4gnLAonzqknID0+ICfPiScsCifOqicgPT4gJ8+KJywKJ86rJyA9PiAnz4snLAonz48nID0+ICfPlycsCifPmCcgPT4gJ8+ZJywKJ8+aJyA9PiAnz5snLAonz5wnID0+ICfPnScsCifPnicgPT4gJ8+fJywKJ8+gJyA9PiAnz6EnLAonz6InID0+ICfPoycsCifPpCcgPT4gJ8+lJywKJ8+mJyA9PiAnz6cnLAonz6gnID0+ICfPqScsCifPqicgPT4gJ8+rJywKJ8+sJyA9PiAnz60nLAonz64nID0+ICfPrycsCifPtCcgPT4gJ864JywKJ8+3JyA9PiAnz7gnLAonz7knID0+ICfPsicsCifPuicgPT4gJ8+7JywKJ8+9JyA9PiAnzbsnLAonz74nID0+ICfNvCcsCifPvycgPT4gJ829JywKJ9CAJyA9PiAn0ZAnLAon0IEnID0+ICfRkScsCifQgicgPT4gJ9GSJywKJ9CDJyA9PiAn0ZMnLAon0IQnID0+ICfRlCcsCifQhScgPT4gJ9GVJywKJ9CGJyA9PiAn0ZYnLAon0IcnID0+ICfRlycsCifQiCcgPT4gJ9GYJywKJ9CJJyA9PiAn0ZknLAon0IonID0+ICfRmicsCifQiycgPT4gJ9GbJywKJ9CMJyA9PiAn0ZwnLAon0I0nID0+ICfRnScsCifQjicgPT4gJ9GeJywKJ9CPJyA9PiAn0Z8nLAon0JAnID0+ICfQsCcsCifQkScgPT4gJ9CxJywKJ9CSJyA9PiAn0LInLAon0JMnID0+ICfQsycsCifQlCcgPT4gJ9C0JywKJ9CVJyA9PiAn0LUnLAon0JYnID0+ICfQticsCifQlycgPT4gJ9C3JywKJ9CYJyA9PiAn0LgnLAon0JknID0+ICfQuScsCifQmicgPT4gJ9C6JywKJ9CbJyA9PiAn0LsnLAon0JwnID0+ICfQvCcsCifQnScgPT4gJ9C9JywKJ9CeJyA9PiAn0L4nLAon0J8nID0+ICfQvycsCifQoCcgPT4gJ9GAJywKJ9ChJyA9PiAn0YEnLAon0KInID0+ICfRgicsCifQoycgPT4gJ9GDJywKJ9CkJyA9PiAn0YQnLAon0KUnID0+ICfRhScsCifQpicgPT4gJ9GGJywKJ9CnJyA9PiAn0YcnLAon0KgnID0+ICfRiCcsCifQqScgPT4gJ9GJJywKJ9CqJyA9PiAn0YonLAon0KsnID0+ICfRiycsCifQrCcgPT4gJ9GMJywKJ9CtJyA9PiAn0Y0nLAon0K4nID0+ICfRjicsCifQrycgPT4gJ9GPJywKJ9GgJyA9PiAn0aEnLAon0aInID0+ICfRoycsCifRpCcgPT4gJ9GlJywKJ9GmJyA9PiAn0acnLAon0agnID0+ICfRqScsCifRqicgPT4gJ9GrJywKJ9GsJyA9PiAn0a0nLAon0a4nID0+ICfRrycsCifRsCcgPT4gJ9GxJywKJ9GyJyA9PiAn0bMnLAon0bQnID0+ICfRtScsCifRticgPT4gJ9G3JywKJ9G4JyA9PiAn0bknLAon0bonID0+ICfRuycsCifRvCcgPT4gJ9G9JywKJ9G+JyA9PiAn0b8nLAon0oAnID0+ICfSgScsCifSiicgPT4gJ9KLJywKJ9KMJyA9PiAn0o0nLAon0o4nID0+ICfSjycsCifSkCcgPT4gJ9KRJywKJ9KSJyA9PiAn0pMnLAon0pQnID0+ICfSlScsCifSlicgPT4gJ9KXJywKJ9KYJyA9PiAn0pknLAon0ponID0+ICfSmycsCifSnCcgPT4gJ9KdJywKJ9KeJyA9PiAn0p8nLAon0qAnID0+ICfSoScsCifSoicgPT4gJ9KjJywKJ9KkJyA9PiAn0qUnLAon0qYnID0+ICfSpycsCifSqCcgPT4gJ9KpJywKJ9KqJyA9PiAn0qsnLAon0qwnID0+ICfSrScsCifSricgPT4gJ9KvJywKJ9KwJyA9PiAn0rEnLAon0rInID0+ICfSsycsCifStCcgPT4gJ9K1JywKJ9K2JyA9PiAn0rcnLAon0rgnID0+ICfSuScsCifSuicgPT4gJ9K7JywKJ9K8JyA9PiAn0r0nLAon0r4nID0+ICfSvycsCifTgCcgPT4gJ9OPJywKJ9OBJyA9PiAn04InLAon04MnID0+ICfThCcsCifThScgPT4gJ9OGJywKJ9OHJyA9PiAn04gnLAon04knID0+ICfTiicsCifTiycgPT4gJ9OMJywKJ9ONJyA9PiAn044nLAon05AnID0+ICfTkScsCifTkicgPT4gJ9OTJywKJ9OUJyA9PiAn05UnLAon05YnID0+ICfTlycsCifTmCcgPT4gJ9OZJywKJ9OaJyA9PiAn05snLAon05wnID0+ICfTnScsCifTnicgPT4gJ9OfJywKJ9OgJyA9PiAn06EnLAon06InID0+ICfToycsCifTpCcgPT4gJ9OlJywKJ9OmJyA9PiAn06cnLAon06gnID0+ICfTqScsCifTqicgPT4gJ9OrJywKJ9OsJyA9PiAn060nLAon064nID0+ICfTrycsCifTsCcgPT4gJ9OxJywKJ9OyJyA9PiAn07MnLAon07QnID0+ICfTtScsCifTticgPT4gJ9O3JywKJ9O4JyA9PiAn07knLAon07onID0+ICfTuycsCifTvCcgPT4gJ9O9JywKJ9O+JyA9PiAn078nLAon1IAnID0+ICfUgScsCifUgicgPT4gJ9SDJywKJ9SEJyA9PiAn1IUnLAon1IYnID0+ICfUhycsCifUiCcgPT4gJ9SJJywKJ9SKJyA9PiAn1IsnLAon1IwnID0+ICfUjScsCifUjicgPT4gJ9SPJywKJ9SQJyA9PiAn1JEnLAon1JInID0+ICfUkycsCifUlCcgPT4gJ9SVJywKJ9SWJyA9PiAn1JcnLAon1JgnID0+ICfUmScsCifUmicgPT4gJ9SbJywKJ9ScJyA9PiAn1J0nLAon1J4nID0+ICfUnycsCifUoCcgPT4gJ9ShJywKJ9SiJyA9PiAn1KMnLAon1KQnID0+ICfUpScsCifUpicgPT4gJ9SnJywKJ9SoJyA9PiAn1KknLAon1KonID0+ICfUqycsCifUrCcgPT4gJ9StJywKJ9SuJyA9PiAn1K8nLAon1LEnID0+ICfVoScsCifUsicgPT4gJ9WiJywKJ9SzJyA9PiAn1aMnLAon1LQnID0+ICfVpCcsCifUtScgPT4gJ9WlJywKJ9S2JyA9PiAn1aYnLAon1LcnID0+ICfVpycsCifUuCcgPT4gJ9WoJywKJ9S5JyA9PiAn1aknLAon1LonID0+ICfVqicsCifUuycgPT4gJ9WrJywKJ9S8JyA9PiAn1awnLAon1L0nID0+ICfVrScsCifUvicgPT4gJ9WuJywKJ9S/JyA9PiAn1a8nLAon1YAnID0+ICfVsCcsCifVgScgPT4gJ9WxJywKJ9WCJyA9PiAn1bInLAon1YMnID0+ICfVsycsCifVhCcgPT4gJ9W0JywKJ9WFJyA9PiAn1bUnLAon1YYnID0+ICfVticsCifVhycgPT4gJ9W3JywKJ9WIJyA9PiAn1bgnLAon1YknID0+ICfVuScsCifViicgPT4gJ9W6JywKJ9WLJyA9PiAn1bsnLAon1YwnID0+ICfVvCcsCifVjScgPT4gJ9W9JywKJ9WOJyA9PiAn1b4nLAon1Y8nID0+ICfVvycsCifVkCcgPT4gJ9aAJywKJ9WRJyA9PiAn1oEnLAon1ZInID0+ICfWgicsCifVkycgPT4gJ9aDJywKJ9WUJyA9PiAn1oQnLAon1ZUnID0+ICfWhScsCifVlicgPT4gJ9aGJywKJ+GCoCcgPT4gJ+K0gCcsCifhgqEnID0+ICfitIEnLAon4YKiJyA9PiAn4rSCJywKJ+GCoycgPT4gJ+K0gycsCifhgqQnID0+ICfitIQnLAon4YKlJyA9PiAn4rSFJywKJ+GCpicgPT4gJ+K0hicsCifhgqcnID0+ICfitIcnLAon4YKoJyA9PiAn4rSIJywKJ+GCqScgPT4gJ+K0iScsCifhgqonID0+ICfitIonLAon4YKrJyA9PiAn4rSLJywKJ+GCrCcgPT4gJ+K0jCcsCifhgq0nID0+ICfitI0nLAon4YKuJyA9PiAn4rSOJywKJ+GCrycgPT4gJ+K0jycsCifhgrAnID0+ICfitJAnLAon4YKxJyA9PiAn4rSRJywKJ+GCsicgPT4gJ+K0kicsCifhgrMnID0+ICfitJMnLAon4YK0JyA9PiAn4rSUJywKJ+GCtScgPT4gJ+K0lScsCifhgrYnID0+ICfitJYnLAon4YK3JyA9PiAn4rSXJywKJ+GCuCcgPT4gJ+K0mCcsCifhgrknID0+ICfitJknLAon4YK6JyA9PiAn4rSaJywKJ+GCuycgPT4gJ+K0mycsCifhgrwnID0+ICfitJwnLAon4YK9JyA9PiAn4rSdJywKJ+GCvicgPT4gJ+K0nicsCifhgr8nID0+ICfitJ8nLAon4YOAJyA9PiAn4rSgJywKJ+GDgScgPT4gJ+K0oScsCifhg4InID0+ICfitKInLAon4YODJyA9PiAn4rSjJywKJ+GDhCcgPT4gJ+K0pCcsCifhg4UnID0+ICfitKUnLAon4YOHJyA9PiAn4rSnJywKJ+GDjScgPT4gJ+K0rScsCifhjqAnID0+ICfqrbAnLAon4Y6hJyA9PiAn6q2xJywKJ+GOoicgPT4gJ+qtsicsCifhjqMnID0+ICfqrbMnLAon4Y6kJyA9PiAn6q20JywKJ+GOpScgPT4gJ+qttScsCifhjqYnID0+ICfqrbYnLAon4Y6nJyA9PiAn6q23JywKJ+GOqCcgPT4gJ+qtuCcsCifhjqknID0+ICfqrbknLAon4Y6qJyA9PiAn6q26JywKJ+GOqycgPT4gJ+qtuycsCifhjqwnID0+ICfqrbwnLAon4Y6tJyA9PiAn6q29JywKJ+GOricgPT4gJ+qtvicsCifhjq8nID0+ICfqrb8nLAon4Y6wJyA9PiAn6q6AJywKJ+GOsScgPT4gJ+qugScsCifhjrInID0+ICfqroInLAon4Y6zJyA9PiAn6q6DJywKJ+GOtCcgPT4gJ+quhCcsCifhjrUnID0+ICfqroUnLAon4Y62JyA9PiAn6q6GJywKJ+GOtycgPT4gJ+quhycsCifhjrgnID0+ICfqrognLAon4Y65JyA9PiAn6q6JJywKJ+GOuicgPT4gJ+quiicsCifhjrsnID0+ICfqrosnLAon4Y68JyA9PiAn6q6MJywKJ+GOvScgPT4gJ+qujScsCifhjr4nID0+ICfqro4nLAon4Y6/JyA9PiAn6q6PJywKJ+GPgCcgPT4gJ+qukCcsCifhj4EnID0+ICfqrpEnLAon4Y+CJyA9PiAn6q6SJywKJ+GPgycgPT4gJ+qukycsCifhj4QnID0+ICfqrpQnLAon4Y+FJyA9PiAn6q6VJywKJ+GPhicgPT4gJ+qulicsCifhj4cnID0+ICfqrpcnLAon4Y+IJyA9PiAn6q6YJywKJ+GPiScgPT4gJ+qumScsCifhj4onID0+ICfqrponLAon4Y+LJyA9PiAn6q6bJywKJ+GPjCcgPT4gJ+qunCcsCifhj40nID0+ICfqrp0nLAon4Y+OJyA9PiAn6q6eJywKJ+GPjycgPT4gJ+qunycsCifhj5AnID0+ICfqrqAnLAon4Y+RJyA9PiAn6q6hJywKJ+GPkicgPT4gJ+quoicsCifhj5MnID0+ICfqrqMnLAon4Y+UJyA9PiAn6q6kJywKJ+GPlScgPT4gJ+qupScsCifhj5YnID0+ICfqrqYnLAon4Y+XJyA9PiAn6q6nJywKJ+GPmCcgPT4gJ+quqCcsCifhj5knID0+ICfqrqknLAon4Y+aJyA9PiAn6q6qJywKJ+GPmycgPT4gJ+quqycsCifhj5wnID0+ICfqrqwnLAon4Y+dJyA9PiAn6q6tJywKJ+GPnicgPT4gJ+quricsCifhj58nID0+ICfqrq8nLAon4Y+gJyA9PiAn6q6wJywKJ+GPoScgPT4gJ+qusScsCifhj6InID0+ICfqrrInLAon4Y+jJyA9PiAn6q6zJywKJ+GPpCcgPT4gJ+qutCcsCifhj6UnID0+ICfqrrUnLAon4Y+mJyA9PiAn6q62JywKJ+GPpycgPT4gJ+qutycsCifhj6gnID0+ICfqrrgnLAon4Y+pJyA9PiAn6q65JywKJ+GPqicgPT4gJ+quuicsCifhj6snID0+ICfqrrsnLAon4Y+sJyA9PiAn6q68JywKJ+GPrScgPT4gJ+quvScsCifhj64nID0+ICfqrr4nLAon4Y+vJyA9PiAn6q6/JywKJ+GPsCcgPT4gJ+GPuCcsCifhj7EnID0+ICfhj7knLAon4Y+yJyA9PiAn4Y+6JywKJ+GPsycgPT4gJ+GPuycsCifhj7QnID0+ICfhj7wnLAon4Y+1JyA9PiAn4Y+9JywKJ+GykCcgPT4gJ+GDkCcsCifhspEnID0+ICfhg5EnLAon4bKSJyA9PiAn4YOSJywKJ+GykycgPT4gJ+GDkycsCifhspQnID0+ICfhg5QnLAon4bKVJyA9PiAn4YOVJywKJ+GylicgPT4gJ+GDlicsCifhspcnID0+ICfhg5cnLAon4bKYJyA9PiAn4YOYJywKJ+GymScgPT4gJ+GDmScsCifhsponID0+ICfhg5onLAon4bKbJyA9PiAn4YObJywKJ+GynCcgPT4gJ+GDnCcsCifhsp0nID0+ICfhg50nLAon4bKeJyA9PiAn4YOeJywKJ+GynycgPT4gJ+GDnycsCifhsqAnID0+ICfhg6AnLAon4bKhJyA9PiAn4YOhJywKJ+GyoicgPT4gJ+GDoicsCifhsqMnID0+ICfhg6MnLAon4bKkJyA9PiAn4YOkJywKJ+GypScgPT4gJ+GDpScsCifhsqYnID0+ICfhg6YnLAon4bKnJyA9PiAn4YOnJywKJ+GyqCcgPT4gJ+GDqCcsCifhsqknID0+ICfhg6knLAon4bKqJyA9PiAn4YOqJywKJ+GyqycgPT4gJ+GDqycsCifhsqwnID0+ICfhg6wnLAon4bKtJyA9PiAn4YOtJywKJ+GyricgPT4gJ+GDricsCifhsq8nID0+ICfhg68nLAon4bKwJyA9PiAn4YOwJywKJ+GysScgPT4gJ+GDsScsCifhsrInID0+ICfhg7InLAon4bKzJyA9PiAn4YOzJywKJ+GytCcgPT4gJ+GDtCcsCifhsrUnID0+ICfhg7UnLAon4bK2JyA9PiAn4YO2JywKJ+GytycgPT4gJ+GDtycsCifhsrgnID0+ICfhg7gnLAon4bK5JyA9PiAn4YO5JywKJ+GyuicgPT4gJ+GDuicsCifhsr0nID0+ICfhg70nLAon4bK+JyA9PiAn4YO+JywKJ+GyvycgPT4gJ+GDvycsCifhuIAnID0+ICfhuIEnLAon4biCJyA9PiAn4biDJywKJ+G4hCcgPT4gJ+G4hScsCifhuIYnID0+ICfhuIcnLAon4biIJyA9PiAn4biJJywKJ+G4iicgPT4gJ+G4iycsCifhuIwnID0+ICfhuI0nLAon4biOJyA9PiAn4biPJywKJ+G4kCcgPT4gJ+G4kScsCifhuJInID0+ICfhuJMnLAon4biUJyA9PiAn4biVJywKJ+G4licgPT4gJ+G4lycsCifhuJgnID0+ICfhuJknLAon4biaJyA9PiAn4bibJywKJ+G4nCcgPT4gJ+G4nScsCifhuJ4nID0+ICfhuJ8nLAon4bigJyA9PiAn4bihJywKJ+G4oicgPT4gJ+G4oycsCifhuKQnID0+ICfhuKUnLAon4bimJyA9PiAn4binJywKJ+G4qCcgPT4gJ+G4qScsCifhuKonID0+ICfhuKsnLAon4bisJyA9PiAn4bitJywKJ+G4ricgPT4gJ+G4rycsCifhuLAnID0+ICfhuLEnLAon4biyJyA9PiAn4bizJywKJ+G4tCcgPT4gJ+G4tScsCifhuLYnID0+ICfhuLcnLAon4bi4JyA9PiAn4bi5JywKJ+G4uicgPT4gJ+G4uycsCifhuLwnID0+ICfhuL0nLAon4bi+JyA9PiAn4bi/JywKJ+G5gCcgPT4gJ+G5gScsCifhuYInID0+ICfhuYMnLAon4bmEJyA9PiAn4bmFJywKJ+G5hicgPT4gJ+G5hycsCifhuYgnID0+ICfhuYknLAon4bmKJyA9PiAn4bmLJywKJ+G5jCcgPT4gJ+G5jScsCifhuY4nID0+ICfhuY8nLAon4bmQJyA9PiAn4bmRJywKJ+G5kicgPT4gJ+G5kycsCifhuZQnID0+ICfhuZUnLAon4bmWJyA9PiAn4bmXJywKJ+G5mCcgPT4gJ+G5mScsCifhuZonID0+ICfhuZsnLAon4bmcJyA9PiAn4bmdJywKJ+G5nicgPT4gJ+G5nycsCifhuaAnID0+ICfhuaEnLAon4bmiJyA9PiAn4bmjJywKJ+G5pCcgPT4gJ+G5pScsCifhuaYnID0+ICfhuacnLAon4bmoJyA9PiAn4bmpJywKJ+G5qicgPT4gJ+G5qycsCifhuawnID0+ICfhua0nLAon4bmuJyA9PiAn4bmvJywKJ+G5sCcgPT4gJ+G5sScsCifhubInID0+ICfhubMnLAon4bm0JyA9PiAn4bm1JywKJ+G5ticgPT4gJ+G5tycsCifhubgnID0+ICfhubknLAon4bm6JyA9PiAn4bm7JywKJ+G5vCcgPT4gJ+G5vScsCifhub4nID0+ICfhub8nLAon4bqAJyA9PiAn4bqBJywKJ+G6gicgPT4gJ+G6gycsCifhuoQnID0+ICfhuoUnLAon4bqGJyA9PiAn4bqHJywKJ+G6iCcgPT4gJ+G6iScsCifhuoonID0+ICfhuosnLAon4bqMJyA9PiAn4bqNJywKJ+G6jicgPT4gJ+G6jycsCifhupAnID0+ICfhupEnLAon4bqSJyA9PiAn4bqTJywKJ+G6lCcgPT4gJ+G6lScsCifhup4nID0+ICfDnycsCifhuqAnID0+ICfhuqEnLAon4bqiJyA9PiAn4bqjJywKJ+G6pCcgPT4gJ+G6pScsCifhuqYnID0+ICfhuqcnLAon4bqoJyA9PiAn4bqpJywKJ+G6qicgPT4gJ+G6qycsCifhuqwnID0+ICfhuq0nLAon4bquJyA9PiAn4bqvJywKJ+G6sCcgPT4gJ+G6sScsCifhurInID0+ICfhurMnLAon4bq0JyA9PiAn4bq1JywKJ+G6ticgPT4gJ+G6tycsCifhurgnID0+ICfhurknLAon4bq6JyA9PiAn4bq7JywKJ+G6vCcgPT4gJ+G6vScsCifhur4nID0+ICfhur8nLAon4buAJyA9PiAn4buBJywKJ+G7gicgPT4gJ+G7gycsCifhu4QnID0+ICfhu4UnLAon4buGJyA9PiAn4buHJywKJ+G7iCcgPT4gJ+G7iScsCifhu4onID0+ICfhu4snLAon4buMJyA9PiAn4buNJywKJ+G7jicgPT4gJ+G7jycsCifhu5AnID0+ICfhu5EnLAon4buSJyA9PiAn4buTJywKJ+G7lCcgPT4gJ+G7lScsCifhu5YnID0+ICfhu5cnLAon4buYJyA9PiAn4buZJywKJ+G7micgPT4gJ+G7mycsCifhu5wnID0+ICfhu50nLAon4bueJyA9PiAn4bufJywKJ+G7oCcgPT4gJ+G7oScsCifhu6InID0+ICfhu6MnLAon4bukJyA9PiAn4bulJywKJ+G7picgPT4gJ+G7pycsCifhu6gnID0+ICfhu6knLAon4buqJyA9PiAn4burJywKJ+G7rCcgPT4gJ+G7rScsCifhu64nID0+ICfhu68nLAon4buwJyA9PiAn4buxJywKJ+G7sicgPT4gJ+G7sycsCifhu7QnID0+ICfhu7UnLAon4bu2JyA9PiAn4bu3JywKJ+G7uCcgPT4gJ+G7uScsCifhu7onID0+ICfhu7snLAon4bu8JyA9PiAn4bu9JywKJ+G7vicgPT4gJ+G7vycsCifhvIgnID0+ICfhvIAnLAon4byJJyA9PiAn4byBJywKJ+G8iicgPT4gJ+G8gicsCifhvIsnID0+ICfhvIMnLAon4byMJyA9PiAn4byEJywKJ+G8jScgPT4gJ+G8hScsCifhvI4nID0+ICfhvIYnLAon4byPJyA9PiAn4byHJywKJ+G8mCcgPT4gJ+G8kCcsCifhvJknID0+ICfhvJEnLAon4byaJyA9PiAn4bySJywKJ+G8mycgPT4gJ+G8kycsCifhvJwnID0+ICfhvJQnLAon4bydJyA9PiAn4byVJywKJ+G8qCcgPT4gJ+G8oCcsCifhvKknID0+ICfhvKEnLAon4byqJyA9PiAn4byiJywKJ+G8qycgPT4gJ+G8oycsCifhvKwnID0+ICfhvKQnLAon4bytJyA9PiAn4bylJywKJ+G8ricgPT4gJ+G8picsCifhvK8nID0+ICfhvKcnLAon4by4JyA9PiAn4bywJywKJ+G8uScgPT4gJ+G8sScsCifhvLonID0+ICfhvLInLAon4by7JyA9PiAn4byzJywKJ+G8vCcgPT4gJ+G8tCcsCifhvL0nID0+ICfhvLUnLAon4by+JyA9PiAn4by2JywKJ+G8vycgPT4gJ+G8tycsCifhvYgnID0+ICfhvYAnLAon4b2JJyA9PiAn4b2BJywKJ+G9iicgPT4gJ+G9gicsCifhvYsnID0+ICfhvYMnLAon4b2MJyA9PiAn4b2EJywKJ+G9jScgPT4gJ+G9hScsCifhvZknID0+ICfhvZEnLAon4b2bJyA9PiAn4b2TJywKJ+G9nScgPT4gJ+G9lScsCifhvZ8nID0+ICfhvZcnLAon4b2oJyA9PiAn4b2gJywKJ+G9qScgPT4gJ+G9oScsCifhvaonID0+ICfhvaInLAon4b2rJyA9PiAn4b2jJywKJ+G9rCcgPT4gJ+G9pCcsCifhva0nID0+ICfhvaUnLAon4b2uJyA9PiAn4b2mJywKJ+G9rycgPT4gJ+G9pycsCifhvognID0+ICfhvoAnLAon4b6JJyA9PiAn4b6BJywKJ+G+iicgPT4gJ+G+gicsCifhvosnID0+ICfhvoMnLAon4b6MJyA9PiAn4b6EJywKJ+G+jScgPT4gJ+G+hScsCifhvo4nID0+ICfhvoYnLAon4b6PJyA9PiAn4b6HJywKJ+G+mCcgPT4gJ+G+kCcsCifhvpknID0+ICfhvpEnLAon4b6aJyA9PiAn4b6SJywKJ+G+mycgPT4gJ+G+kycsCifhvpwnID0+ICfhvpQnLAon4b6dJyA9PiAn4b6VJywKJ+G+nicgPT4gJ+G+licsCifhvp8nID0+ICfhvpcnLAon4b6oJyA9PiAn4b6gJywKJ+G+qScgPT4gJ+G+oScsCifhvqonID0+ICfhvqInLAon4b6rJyA9PiAn4b6jJywKJ+G+rCcgPT4gJ+G+pCcsCifhvq0nID0+ICfhvqUnLAon4b6uJyA9PiAn4b6mJywKJ+G+rycgPT4gJ+G+pycsCifhvrgnID0+ICfhvrAnLAon4b65JyA9PiAn4b6xJywKJ+G+uicgPT4gJ+G9sCcsCifhvrsnID0+ICfhvbEnLAon4b68JyA9PiAn4b6zJywKJ+G/iCcgPT4gJ+G9sicsCifhv4knID0+ICfhvbMnLAon4b+KJyA9PiAn4b20JywKJ+G/iycgPT4gJ+G9tScsCifhv4wnID0+ICfhv4MnLAon4b+YJyA9PiAn4b+QJywKJ+G/mScgPT4gJ+G/kScsCifhv5onID0+ICfhvbYnLAon4b+bJyA9PiAn4b23JywKJ+G/qCcgPT4gJ+G/oCcsCifhv6knID0+ICfhv6EnLAon4b+qJyA9PiAn4b26JywKJ+G/qycgPT4gJ+G9uycsCifhv6wnID0+ICfhv6UnLAon4b+4JyA9PiAn4b24JywKJ+G/uScgPT4gJ+G9uScsCifhv7onID0+ICfhvbwnLAon4b+7JyA9PiAn4b29JywKJ+G/vCcgPT4gJ+G/sycsCifihKYnID0+ICfPiScsCifihKonID0+ICdrJywKJ+KEqycgPT4gJ8OlJywKJ+KEsicgPT4gJ+KFjicsCifihaAnID0+ICfihbAnLAon4oWhJyA9PiAn4oWxJywKJ+KFoicgPT4gJ+KFsicsCifihaMnID0+ICfihbMnLAon4oWkJyA9PiAn4oW0JywKJ+KFpScgPT4gJ+KFtScsCifihaYnID0+ICfihbYnLAon4oWnJyA9PiAn4oW3JywKJ+KFqCcgPT4gJ+KFuCcsCifihaknID0+ICfihbknLAon4oWqJyA9PiAn4oW6JywKJ+KFqycgPT4gJ+KFuycsCifihawnID0+ICfihbwnLAon4oWtJyA9PiAn4oW9JywKJ+KFricgPT4gJ+KFvicsCifiha8nID0+ICfihb8nLAon4oaDJyA9PiAn4oaEJywKJ+KSticgPT4gJ+KTkCcsCifikrcnID0+ICfik5EnLAon4pK4JyA9PiAn4pOSJywKJ+KSuScgPT4gJ+KTkycsCifikronID0+ICfik5QnLAon4pK7JyA9PiAn4pOVJywKJ+KSvCcgPT4gJ+KTlicsCifikr0nID0+ICfik5cnLAon4pK+JyA9PiAn4pOYJywKJ+KSvycgPT4gJ+KTmScsCifik4AnID0+ICfik5onLAon4pOBJyA9PiAn4pObJywKJ+KTgicgPT4gJ+KTnCcsCifik4MnID0+ICfik50nLAon4pOEJyA9PiAn4pOeJywKJ+KThScgPT4gJ+KTnycsCifik4YnID0+ICfik6AnLAon4pOHJyA9PiAn4pOhJywKJ+KTiCcgPT4gJ+KToicsCifik4knID0+ICfik6MnLAon4pOKJyA9PiAn4pOkJywKJ+KTiycgPT4gJ+KTpScsCifik4wnID0+ICfik6YnLAon4pONJyA9PiAn4pOnJywKJ+KTjicgPT4gJ+KTqCcsCifik48nID0+ICfik6knLAon4rCAJyA9PiAn4rCwJywKJ+KwgScgPT4gJ+KwsScsCifisIInID0+ICfisLInLAon4rCDJyA9PiAn4rCzJywKJ+KwhCcgPT4gJ+KwtCcsCifisIUnID0+ICfisLUnLAon4rCGJyA9PiAn4rC2JywKJ+KwhycgPT4gJ+KwtycsCifisIgnID0+ICfisLgnLAon4rCJJyA9PiAn4rC5JywKJ+KwiicgPT4gJ+KwuicsCifisIsnID0+ICfisLsnLAon4rCMJyA9PiAn4rC8JywKJ+KwjScgPT4gJ+KwvScsCifisI4nID0+ICfisL4nLAon4rCPJyA9PiAn4rC/JywKJ+KwkCcgPT4gJ+KxgCcsCifisJEnID0+ICfisYEnLAon4rCSJyA9PiAn4rGCJywKJ+KwkycgPT4gJ+KxgycsCifisJQnID0+ICfisYQnLAon4rCVJyA9PiAn4rGFJywKJ+KwlicgPT4gJ+KxhicsCifisJcnID0+ICfisYcnLAon4rCYJyA9PiAn4rGIJywKJ+KwmScgPT4gJ+KxiScsCifisJonID0+ICfisYonLAon4rCbJyA9PiAn4rGLJywKJ+KwnCcgPT4gJ+KxjCcsCifisJ0nID0+ICfisY0nLAon4rCeJyA9PiAn4rGOJywKJ+KwnycgPT4gJ+KxjycsCifisKAnID0+ICfisZAnLAon4rChJyA9PiAn4rGRJywKJ+KwoicgPT4gJ+KxkicsCifisKMnID0+ICfisZMnLAon4rCkJyA9PiAn4rGUJywKJ+KwpScgPT4gJ+KxlScsCifisKYnID0+ICfisZYnLAon4rCnJyA9PiAn4rGXJywKJ+KwqCcgPT4gJ+KxmCcsCifisKknID0+ICfisZknLAon4rCqJyA9PiAn4rGaJywKJ+KwqycgPT4gJ+KxmycsCifisKwnID0+ICfisZwnLAon4rCtJyA9PiAn4rGdJywKJ+KwricgPT4gJ+KxnicsCifisaAnID0+ICfisaEnLAon4rGiJyA9PiAnyasnLAon4rGjJyA9PiAn4bW9JywKJ+KxpCcgPT4gJ8m9JywKJ+KxpycgPT4gJ+KxqCcsCifisaknID0+ICfisaonLAon4rGrJyA9PiAn4rGsJywKJ+KxrScgPT4gJ8mRJywKJ+KxricgPT4gJ8mxJywKJ+KxrycgPT4gJ8mQJywKJ+KxsCcgPT4gJ8mSJywKJ+KxsicgPT4gJ+KxsycsCifisbUnID0+ICfisbYnLAon4rG+JyA9PiAnyL8nLAon4rG/JyA9PiAnyYAnLAon4rKAJyA9PiAn4rKBJywKJ+KygicgPT4gJ+KygycsCifisoQnID0+ICfisoUnLAon4rKGJyA9PiAn4rKHJywKJ+KyiCcgPT4gJ+KyiScsCifisoonID0+ICfisosnLAon4rKMJyA9PiAn4rKNJywKJ+KyjicgPT4gJ+KyjycsCifispAnID0+ICfispEnLAon4rKSJyA9PiAn4rKTJywKJ+KylCcgPT4gJ+KylScsCifispYnID0+ICfispcnLAon4rKYJyA9PiAn4rKZJywKJ+KymicgPT4gJ+KymycsCifispwnID0+ICfisp0nLAon4rKeJyA9PiAn4rKfJywKJ+KyoCcgPT4gJ+KyoScsCifisqInID0+ICfisqMnLAon4rKkJyA9PiAn4rKlJywKJ+KypicgPT4gJ+KypycsCifisqgnID0+ICfisqknLAon4rKqJyA9PiAn4rKrJywKJ+KyrCcgPT4gJ+KyrScsCifisq4nID0+ICfisq8nLAon4rKwJyA9PiAn4rKxJywKJ+KysicgPT4gJ+KysycsCifisrQnID0+ICfisrUnLAon4rK2JyA9PiAn4rK3JywKJ+KyuCcgPT4gJ+KyuScsCifisronID0+ICfisrsnLAon4rK8JyA9PiAn4rK9JywKJ+KyvicgPT4gJ+KyvycsCifis4AnID0+ICfis4EnLAon4rOCJyA9PiAn4rODJywKJ+KzhCcgPT4gJ+KzhScsCifis4YnID0+ICfis4cnLAon4rOIJyA9PiAn4rOJJywKJ+KziicgPT4gJ+KziycsCifis4wnID0+ICfis40nLAon4rOOJyA9PiAn4rOPJywKJ+KzkCcgPT4gJ+KzkScsCifis5InID0+ICfis5MnLAon4rOUJyA9PiAn4rOVJywKJ+KzlicgPT4gJ+KzlycsCifis5gnID0+ICfis5knLAon4rOaJyA9PiAn4rObJywKJ+KznCcgPT4gJ+KznScsCifis54nID0+ICfis58nLAon4rOgJyA9PiAn4rOhJywKJ+KzoicgPT4gJ+KzoycsCifis6snID0+ICfis6wnLAon4rOtJyA9PiAn4rOuJywKJ+KzsicgPT4gJ+KzsycsCifqmYAnID0+ICfqmYEnLAon6pmCJyA9PiAn6pmDJywKJ+qZhCcgPT4gJ+qZhScsCifqmYYnID0+ICfqmYcnLAon6pmIJyA9PiAn6pmJJywKJ+qZiicgPT4gJ+qZiycsCifqmYwnID0+ICfqmY0nLAon6pmOJyA9PiAn6pmPJywKJ+qZkCcgPT4gJ+qZkScsCifqmZInID0+ICfqmZMnLAon6pmUJyA9PiAn6pmVJywKJ+qZlicgPT4gJ+qZlycsCifqmZgnID0+ICfqmZknLAon6pmaJyA9PiAn6pmbJywKJ+qZnCcgPT4gJ+qZnScsCifqmZ4nID0+ICfqmZ8nLAon6pmgJyA9PiAn6pmhJywKJ+qZoicgPT4gJ+qZoycsCifqmaQnID0+ICfqmaUnLAon6pmmJyA9PiAn6pmnJywKJ+qZqCcgPT4gJ+qZqScsCifqmaonID0+ICfqmasnLAon6pmsJyA9PiAn6pmtJywKJ+qagCcgPT4gJ+qagScsCifqmoInID0+ICfqmoMnLAon6pqEJyA9PiAn6pqFJywKJ+qahicgPT4gJ+qahycsCifqmognID0+ICfqmoknLAon6pqKJyA9PiAn6pqLJywKJ+qajCcgPT4gJ+qajScsCifqmo4nID0+ICfqmo8nLAon6pqQJyA9PiAn6pqRJywKJ+qakicgPT4gJ+qakycsCifqmpQnID0+ICfqmpUnLAon6pqWJyA9PiAn6pqXJywKJ+qamCcgPT4gJ+qamScsCifqmponID0+ICfqmpsnLAon6pyiJyA9PiAn6pyjJywKJ+qcpCcgPT4gJ+qcpScsCifqnKYnID0+ICfqnKcnLAon6pyoJyA9PiAn6pypJywKJ+qcqicgPT4gJ+qcqycsCifqnKwnID0+ICfqnK0nLAon6pyuJyA9PiAn6pyvJywKJ+qcsicgPT4gJ+qcsycsCifqnLQnID0+ICfqnLUnLAon6py2JyA9PiAn6py3JywKJ+qcuCcgPT4gJ+qcuScsCifqnLonID0+ICfqnLsnLAon6py8JyA9PiAn6py9JywKJ+qcvicgPT4gJ+qcvycsCifqnYAnID0+ICfqnYEnLAon6p2CJyA9PiAn6p2DJywKJ+qdhCcgPT4gJ+qdhScsCifqnYYnID0+ICfqnYcnLAon6p2IJyA9PiAn6p2JJywKJ+qdiicgPT4gJ+qdiycsCifqnYwnID0+ICfqnY0nLAon6p2OJyA9PiAn6p2PJywKJ+qdkCcgPT4gJ+qdkScsCifqnZInID0+ICfqnZMnLAon6p2UJyA9PiAn6p2VJywKJ+qdlicgPT4gJ+qdlycsCifqnZgnID0+ICfqnZknLAon6p2aJyA9PiAn6p2bJywKJ+qdnCcgPT4gJ+qdnScsCifqnZ4nID0+ICfqnZ8nLAon6p2gJyA9PiAn6p2hJywKJ+qdoicgPT4gJ+qdoycsCifqnaQnID0+ICfqnaUnLAon6p2mJyA9PiAn6p2nJywKJ+qdqCcgPT4gJ+qdqScsCifqnaonID0+ICfqnasnLAon6p2sJyA9PiAn6p2tJywKJ+qdricgPT4gJ+qdrycsCifqnbknID0+ICfqnbonLAon6p27JyA9PiAn6p28JywKJ+qdvScgPT4gJ+G1uScsCifqnb4nID0+ICfqnb8nLAon6p6AJyA9PiAn6p6BJywKJ+qegicgPT4gJ+qegycsCifqnoQnID0+ICfqnoUnLAon6p6GJyA9PiAn6p6HJywKJ+qeiycgPT4gJ+qejCcsCifqno0nID0+ICfJpScsCifqnpAnID0+ICfqnpEnLAon6p6SJyA9PiAn6p6TJywKJ+qelicgPT4gJ+qelycsCifqnpgnID0+ICfqnpknLAon6p6aJyA9PiAn6p6bJywKJ+qenCcgPT4gJ+qenScsCifqnp4nID0+ICfqnp8nLAon6p6gJyA9PiAn6p6hJywKJ+qeoicgPT4gJ+qeoycsCifqnqQnID0+ICfqnqUnLAon6p6mJyA9PiAn6p6nJywKJ+qeqCcgPT4gJ+qeqScsCifqnqonID0+ICfJpicsCifqnqsnID0+ICfJnCcsCifqnqwnID0+ICfJoScsCifqnq0nID0+ICfJrCcsCifqnq4nID0+ICfJqicsCifqnrAnID0+ICfKnicsCifqnrEnID0+ICfKhycsCifqnrInID0+ICfKnScsCifqnrMnID0+ICfqrZMnLAon6p60JyA9PiAn6p61JywKJ+qeticgPT4gJ+qetycsCifqnrgnID0+ICfqnrknLAon6p66JyA9PiAn6p67JywKJ+qevCcgPT4gJ+qevScsCifqnr4nID0+ICfqnr8nLAon6p+CJyA9PiAn6p+DJywKJ+qfhCcgPT4gJ+qelCcsCifqn4UnID0+ICfKgicsCifqn4YnID0+ICfhto4nLAon6p+HJyA9PiAn6p+IJywKJ+qfiScgPT4gJ+qfiicsCifqn7UnID0+ICfqn7YnLAon77yhJyA9PiAn772BJywKJ++8oicgPT4gJ++9gicsCifvvKMnID0+ICfvvYMnLAon77ykJyA9PiAn772EJywKJ++8pScgPT4gJ++9hScsCifvvKYnID0+ICfvvYYnLAon77ynJyA9PiAn772HJywKJ++8qCcgPT4gJ++9iCcsCifvvKknID0+ICfvvYknLAon77yqJyA9PiAn772KJywKJ++8qycgPT4gJ++9iycsCifvvKwnID0+ICfvvYwnLAon77ytJyA9PiAn772NJywKJ++8ricgPT4gJ++9jicsCifvvK8nID0+ICfvvY8nLAon77ywJyA9PiAn772QJywKJ++8sScgPT4gJ++9kScsCifvvLInID0+ICfvvZInLAon77yzJyA9PiAn772TJywKJ++8tCcgPT4gJ++9lCcsCifvvLUnID0+ICfvvZUnLAon77y2JyA9PiAn772WJywKJ++8tycgPT4gJ++9lycsCifvvLgnID0+ICfvvZgnLAon77y5JyA9PiAn772ZJywKJ++8uicgPT4gJ++9micsCifwkJCAJyA9PiAn8JCQqCcsCifwkJCBJyA9PiAn8JCQqScsCifwkJCCJyA9PiAn8JCQqicsCifwkJCDJyA9PiAn8JCQqycsCifwkJCEJyA9PiAn8JCQrCcsCifwkJCFJyA9PiAn8JCQrScsCifwkJCGJyA9PiAn8JCQricsCifwkJCHJyA9PiAn8JCQrycsCifwkJCIJyA9PiAn8JCQsCcsCifwkJCJJyA9PiAn8JCQsScsCifwkJCKJyA9PiAn8JCQsicsCifwkJCLJyA9PiAn8JCQsycsCifwkJCMJyA9PiAn8JCQtCcsCifwkJCNJyA9PiAn8JCQtScsCifwkJCOJyA9PiAn8JCQticsCifwkJCPJyA9PiAn8JCQtycsCifwkJCQJyA9PiAn8JCQuCcsCifwkJCRJyA9PiAn8JCQuScsCifwkJCSJyA9PiAn8JCQuicsCifwkJCTJyA9PiAn8JCQuycsCifwkJCUJyA9PiAn8JCQvCcsCifwkJCVJyA9PiAn8JCQvScsCifwkJCWJyA9PiAn8JCQvicsCifwkJCXJyA9PiAn8JCQvycsCifwkJCYJyA9PiAn8JCRgCcsCifwkJCZJyA9PiAn8JCRgScsCifwkJCaJyA9PiAn8JCRgicsCifwkJCbJyA9PiAn8JCRgycsCifwkJCcJyA9PiAn8JCRhCcsCifwkJCdJyA9PiAn8JCRhScsCifwkJCeJyA9PiAn8JCRhicsCifwkJCfJyA9PiAn8JCRhycsCifwkJCgJyA9PiAn8JCRiCcsCifwkJChJyA9PiAn8JCRiScsCifwkJCiJyA9PiAn8JCRiicsCifwkJCjJyA9PiAn8JCRiycsCifwkJCkJyA9PiAn8JCRjCcsCifwkJClJyA9PiAn8JCRjScsCifwkJCmJyA9PiAn8JCRjicsCifwkJCnJyA9PiAn8JCRjycsCifwkJKwJyA9PiAn8JCTmCcsCifwkJKxJyA9PiAn8JCTmScsCifwkJKyJyA9PiAn8JCTmicsCifwkJKzJyA9PiAn8JCTmycsCifwkJK0JyA9PiAn8JCTnCcsCifwkJK1JyA9PiAn8JCTnScsCifwkJK2JyA9PiAn8JCTnicsCifwkJK3JyA9PiAn8JCTnycsCifwkJK4JyA9PiAn8JCToCcsCifwkJK5JyA9PiAn8JCToScsCifwkJK6JyA9PiAn8JCToicsCifwkJK7JyA9PiAn8JCToycsCifwkJK8JyA9PiAn8JCTpCcsCifwkJK9JyA9PiAn8JCTpScsCifwkJK+JyA9PiAn8JCTpicsCifwkJK/JyA9PiAn8JCTpycsCifwkJOAJyA9PiAn8JCTqCcsCifwkJOBJyA9PiAn8JCTqScsCifwkJOCJyA9PiAn8JCTqicsCifwkJODJyA9PiAn8JCTqycsCifwkJOEJyA9PiAn8JCTrCcsCifwkJOFJyA9PiAn8JCTrScsCifwkJOGJyA9PiAn8JCTricsCifwkJOHJyA9PiAn8JCTrycsCifwkJOIJyA9PiAn8JCTsCcsCifwkJOJJyA9PiAn8JCTsScsCifwkJOKJyA9PiAn8JCTsicsCifwkJOLJyA9PiAn8JCTsycsCifwkJOMJyA9PiAn8JCTtCcsCifwkJONJyA9PiAn8JCTtScsCifwkJOOJyA9PiAn8JCTticsCifwkJOPJyA9PiAn8JCTtycsCifwkJOQJyA9PiAn8JCTuCcsCifwkJORJyA9PiAn8JCTuScsCifwkJOSJyA9PiAn8JCTuicsCifwkJOTJyA9PiAn8JCTuycsCifwkLKAJyA9PiAn8JCzgCcsCifwkLKBJyA9PiAn8JCzgScsCifwkLKCJyA9PiAn8JCzgicsCifwkLKDJyA9PiAn8JCzgycsCifwkLKEJyA9PiAn8JCzhCcsCifwkLKFJyA9PiAn8JCzhScsCifwkLKGJyA9PiAn8JCzhicsCifwkLKHJyA9PiAn8JCzhycsCifwkLKIJyA9PiAn8JCziCcsCifwkLKJJyA9PiAn8JCziScsCifwkLKKJyA9PiAn8JCziicsCifwkLKLJyA9PiAn8JCziycsCifwkLKMJyA9PiAn8JCzjCcsCifwkLKNJyA9PiAn8JCzjScsCifwkLKOJyA9PiAn8JCzjicsCifwkLKPJyA9PiAn8JCzjycsCifwkLKQJyA9PiAn8JCzkCcsCifwkLKRJyA9PiAn8JCzkScsCifwkLKSJyA9PiAn8JCzkicsCifwkLKTJyA9PiAn8JCzkycsCifwkLKUJyA9PiAn8JCzlCcsCifwkLKVJyA9PiAn8JCzlScsCifwkLKWJyA9PiAn8JCzlicsCifwkLKXJyA9PiAn8JCzlycsCifwkLKYJyA9PiAn8JCzmCcsCifwkLKZJyA9PiAn8JCzmScsCifwkLKaJyA9PiAn8JCzmicsCifwkLKbJyA9PiAn8JCzmycsCifwkLKcJyA9PiAn8JCznCcsCifwkLKdJyA9PiAn8JCznScsCifwkLKeJyA9PiAn8JCznicsCifwkLKfJyA9PiAn8JCznycsCifwkLKgJyA9PiAn8JCzoCcsCifwkLKhJyA9PiAn8JCzoScsCifwkLKiJyA9PiAn8JCzoicsCifwkLKjJyA9PiAn8JCzoycsCifwkLKkJyA9PiAn8JCzpCcsCifwkLKlJyA9PiAn8JCzpScsCifwkLKmJyA9PiAn8JCzpicsCifwkLKnJyA9PiAn8JCzpycsCifwkLKoJyA9PiAn8JCzqCcsCifwkLKpJyA9PiAn8JCzqScsCifwkLKqJyA9PiAn8JCzqicsCifwkLKrJyA9PiAn8JCzqycsCifwkLKsJyA9PiAn8JCzrCcsCifwkLKtJyA9PiAn8JCzrScsCifwkLKuJyA9PiAn8JCzricsCifwkLKvJyA9PiAn8JCzrycsCifwkLKwJyA9PiAn8JCzsCcsCifwkLKxJyA9PiAn8JCzsScsCifwkLKyJyA9PiAn8JCzsicsCifwkaKgJyA9PiAn8JGjgCcsCifwkaKhJyA9PiAn8JGjgScsCifwkaKiJyA9PiAn8JGjgicsCifwkaKjJyA9PiAn8JGjgycsCifwkaKkJyA9PiAn8JGjhCcsCifwkaKlJyA9PiAn8JGjhScsCifwkaKmJyA9PiAn8JGjhicsCifwkaKnJyA9PiAn8JGjhycsCifwkaKoJyA9PiAn8JGjiCcsCifwkaKpJyA9PiAn8JGjiScsCifwkaKqJyA9PiAn8JGjiicsCifwkaKrJyA9PiAn8JGjiycsCifwkaKsJyA9PiAn8JGjjCcsCifwkaKtJyA9PiAn8JGjjScsCifwkaKuJyA9PiAn8JGjjicsCifwkaKvJyA9PiAn8JGjjycsCifwkaKwJyA9PiAn8JGjkCcsCifwkaKxJyA9PiAn8JGjkScsCifwkaKyJyA9PiAn8JGjkicsCifwkaKzJyA9PiAn8JGjkycsCifwkaK0JyA9PiAn8JGjlCcsCifwkaK1JyA9PiAn8JGjlScsCifwkaK2JyA9PiAn8JGjlicsCifwkaK3JyA9PiAn8JGjlycsCifwkaK4JyA9PiAn8JGjmCcsCifwkaK5JyA9PiAn8JGjmScsCifwkaK6JyA9PiAn8JGjmicsCifwkaK7JyA9PiAn8JGjmycsCifwkaK8JyA9PiAn8JGjnCcsCifwkaK9JyA9PiAn8JGjnScsCifwkaK+JyA9PiAn8JGjnicsCifwkaK/JyA9PiAn8JGjnycsCifwlrmAJyA9PiAn8Ja5oCcsCifwlrmBJyA9PiAn8Ja5oScsCifwlrmCJyA9PiAn8Ja5oicsCifwlrmDJyA9PiAn8Ja5oycsCifwlrmEJyA9PiAn8Ja5pCcsCifwlrmFJyA9PiAn8Ja5pScsCifwlrmGJyA9PiAn8Ja5picsCifwlrmHJyA9PiAn8Ja5pycsCifwlrmIJyA9PiAn8Ja5qCcsCifwlrmJJyA9PiAn8Ja5qScsCifwlrmKJyA9PiAn8Ja5qicsCifwlrmLJyA9PiAn8Ja5qycsCifwlrmMJyA9PiAn8Ja5rCcsCifwlrmNJyA9PiAn8Ja5rScsCifwlrmOJyA9PiAn8Ja5ricsCifwlrmPJyA9PiAn8Ja5rycsCifwlrmQJyA9PiAn8Ja5sCcsCifwlrmRJyA9PiAn8Ja5sScsCifwlrmSJyA9PiAn8Ja5sicsCifwlrmTJyA9PiAn8Ja5sycsCifwlrmUJyA9PiAn8Ja5tCcsCifwlrmVJyA9PiAn8Ja5tScsCifwlrmWJyA9PiAn8Ja5ticsCifwlrmXJyA9PiAn8Ja5tycsCifwlrmYJyA9PiAn8Ja5uCcsCifwlrmZJyA9PiAn8Ja5uScsCifwlrmaJyA9PiAn8Ja5uicsCifwlrmbJyA9PiAn8Ja5uycsCifwlrmcJyA9PiAn8Ja5vCcsCifwlrmdJyA9PiAn8Ja5vScsCifwlrmeJyA9PiAn8Ja5vicsCifwlrmfJyA9PiAn8Ja5vycsCifwnqSAJyA9PiAn8J6koicsCifwnqSBJyA9PiAn8J6koycsCifwnqSCJyA9PiAn8J6kpCcsCifwnqSDJyA9PiAn8J6kpScsCifwnqSEJyA9PiAn8J6kpicsCifwnqSFJyA9PiAn8J6kpycsCifwnqSGJyA9PiAn8J6kqCcsCifwnqSHJyA9PiAn8J6kqScsCifwnqSIJyA9PiAn8J6kqicsCifwnqSJJyA9PiAn8J6kqycsCifwnqSKJyA9PiAn8J6krCcsCifwnqSLJyA9PiAn8J6krScsCifwnqSMJyA9PiAn8J6kricsCifwnqSNJyA9PiAn8J6krycsCifwnqSOJyA9PiAn8J6ksCcsCifwnqSPJyA9PiAn8J6ksScsCifwnqSQJyA9PiAn8J6ksicsCifwnqSRJyA9PiAn8J6ksycsCifwnqSSJyA9PiAn8J6ktCcsCifwnqSTJyA9PiAn8J6ktScsCifwnqSUJyA9PiAn8J6kticsCifwnqSVJyA9PiAn8J6ktycsCifwnqSWJyA9PiAn8J6kuCcsCifwnqSXJyA9PiAn8J6kuScsCifwnqSYJyA9PiAn8J6kuicsCifwnqSZJyA9PiAn8J6kuycsCifwnqSaJyA9PiAn8J6kvCcsCifwnqSbJyA9PiAn8J6kvScsCifwnqScJyA9PiAn8J6kvicsCifwnqSdJyA9PiAn8J6kvycsCifwnqSeJyA9PiAn8J6lgCcsCifwnqSfJyA9PiAn8J6lgScsCifwnqSgJyA9PiAn8J6lgicsCifwnqShJyA9PiAn8J6lgycsCik7Cjw/cGhwCgoKCnJldHVybiAnLyg/PCFbXHh7MDAyN31ceHswMDJFfVx4ezAwM0F9XHh7MDA1RX1ceHswMDYwfVx4ezAwQTh9XHh7MDBBRH1ceHswMEFGfVx4ezAwQjR9XHh7MDBCN31ceHswMEI4fVx4ezAyQjB9LVx4ezAyQzF9XHh7MDJDMn0tXHh7MDJDNX1ceHswMkM2fS1ceHswMkQxfVx4ezAyRDJ9LVx4ezAyREZ9XHh7MDJFMH0tXHh7MDJFNH1ceHswMkU1fS1ceHswMkVCfVx4ezAyRUN9XHh7MDJFRH1ceHswMkVFfVx4ezAyRUZ9LVx4ezAyRkZ9XHh7MDMwMH0tXHh7MDM2Rn1ceHswMzc0fVx4ezAzNzV9XHh7MDM3QX1ceHswMzg0fS1ceHswMzg1fVx4ezAzODd9XHh7MDQ4M30tXHh7MDQ4N31ceHswNDg4fS1ceHswNDg5fVx4ezA1NTl9XHh7MDU5MX0tXHh7MDVCRH1ceHswNUJGfVx4ezA1QzF9LVx4ezA1QzJ9XHh7MDVDNH0tXHh7MDVDNX1ceHswNUM3fVx4ezA1RjR9XHh7MDYwMH0tXHh7MDYwNX1ceHswNjEwfS1ceHswNjFBfVx4ezA2MUN9XHh7MDY0MH1ceHswNjRCfS1ceHswNjVGfVx4ezA2NzB9XHh7MDZENn0tXHh7MDZEQ31ceHswNkREfVx4ezA2REZ9LVx4ezA2RTR9XHh7MDZFNX0tXHh7MDZFNn1ceHswNkU3fS1ceHswNkU4fVx4ezA2RUF9LVx4ezA2RUR9XHh7MDcwRn1ceHswNzExfVx4ezA3MzB9LVx4ezA3NEF9XHh7MDdBNn0tXHh7MDdCMH1ceHswN0VCfS1ceHswN0YzfVx4ezA3RjR9LVx4ezA3RjV9XHh7MDdGQX1ceHswN0ZEfVx4ezA4MTZ9LVx4ezA4MTl9XHh7MDgxQX1ceHswODFCfS1ceHswODIzfVx4ezA4MjR9XHh7MDgyNX0tXHh7MDgyN31ceHswODI4fVx4ezA4Mjl9LVx4ezA4MkR9XHh7MDg1OX0tXHh7MDg1Qn1ceHswOEQzfS1ceHswOEUxfVx4ezA4RTJ9XHh7MDhFM30tXHh7MDkwMn1ceHswOTNBfVx4ezA5M0N9XHh7MDk0MX0tXHh7MDk0OH1ceHswOTREfVx4ezA5NTF9LVx4ezA5NTd9XHh7MDk2Mn0tXHh7MDk2M31ceHswOTcxfVx4ezA5ODF9XHh7MDlCQ31ceHswOUMxfS1ceHswOUM0fVx4ezA5Q0R9XHh7MDlFMn0tXHh7MDlFM31ceHswOUZFfVx4ezBBMDF9LVx4ezBBMDJ9XHh7MEEzQ31ceHswQTQxfS1ceHswQTQyfVx4ezBBNDd9LVx4ezBBNDh9XHh7MEE0Qn0tXHh7MEE0RH1ceHswQTUxfVx4ezBBNzB9LVx4ezBBNzF9XHh7MEE3NX1ceHswQTgxfS1ceHswQTgyfVx4ezBBQkN9XHh7MEFDMX0tXHh7MEFDNX1ceHswQUM3fS1ceHswQUM4fVx4ezBBQ0R9XHh7MEFFMn0tXHh7MEFFM31ceHswQUZBfS1ceHswQUZGfVx4ezBCMDF9XHh7MEIzQ31ceHswQjNGfVx4ezBCNDF9LVx4ezBCNDR9XHh7MEI0RH1ceHswQjU2fVx4ezBCNjJ9LVx4ezBCNjN9XHh7MEI4Mn1ceHswQkMwfVx4ezBCQ0R9XHh7MEMwMH1ceHswQzA0fVx4ezBDM0V9LVx4ezBDNDB9XHh7MEM0Nn0tXHh7MEM0OH1ceHswQzRBfS1ceHswQzREfVx4ezBDNTV9LVx4ezBDNTZ9XHh7MEM2Mn0tXHh7MEM2M31ceHswQzgxfVx4ezBDQkN9XHh7MENCRn1ceHswQ0M2fVx4ezBDQ0N9LVx4ezBDQ0R9XHh7MENFMn0tXHh7MENFM31ceHswRDAwfS1ceHswRDAxfVx4ezBEM0J9LVx4ezBEM0N9XHh7MEQ0MX0tXHh7MEQ0NH1ceHswRDREfVx4ezBENjJ9LVx4ezBENjN9XHh7MERDQX1ceHswREQyfS1ceHswREQ0fVx4ezBERDZ9XHh7MEUzMX1ceHswRTM0fS1ceHswRTNBfVx4ezBFNDZ9XHh7MEU0N30tXHh7MEU0RX1ceHswRUIxfVx4ezBFQjR9LVx4ezBFQjl9XHh7MEVCQn0tXHh7MEVCQ31ceHswRUM2fVx4ezBFQzh9LVx4ezBFQ0R9XHh7MEYxOH0tXHh7MEYxOX1ceHswRjM1fVx4ezBGMzd9XHh7MEYzOX1ceHswRjcxfS1ceHswRjdFfVx4ezBGODB9LVx4ezBGODR9XHh7MEY4Nn0tXHh7MEY4N31ceHswRjhEfS1ceHswRjk3fVx4ezBGOTl9LVx4ezBGQkN9XHh7MEZDNn1ceHsxMDJEfS1ceHsxMDMwfVx4ezEwMzJ9LVx4ezEwMzd9XHh7MTAzOX0tXHh7MTAzQX1ceHsxMDNEfS1ceHsxMDNFfVx4ezEwNTh9LVx4ezEwNTl9XHh7MTA1RX0tXHh7MTA2MH1ceHsxMDcxfS1ceHsxMDc0fVx4ezEwODJ9XHh7MTA4NX0tXHh7MTA4Nn1ceHsxMDhEfVx4ezEwOUR9XHh7MTBGQ31ceHsxMzVEfS1ceHsxMzVGfVx4ezE3MTJ9LVx4ezE3MTR9XHh7MTczMn0tXHh7MTczNH1ceHsxNzUyfS1ceHsxNzUzfVx4ezE3NzJ9LVx4ezE3NzN9XHh7MTdCNH0tXHh7MTdCNX1ceHsxN0I3fS1ceHsxN0JEfVx4ezE3QzZ9XHh7MTdDOX0tXHh7MTdEM31ceHsxN0Q3fVx4ezE3RER9XHh7MTgwQn0tXHh7MTgwRH1ceHsxODBFfVx4ezE4NDN9XHh7MTg4NX0tXHh7MTg4Nn1ceHsxOEE5fVx4ezE5MjB9LVx4ezE5MjJ9XHh7MTkyN30tXHh7MTkyOH1ceHsxOTMyfVx4ezE5Mzl9LVx4ezE5M0J9XHh7MUExN30tXHh7MUExOH1ceHsxQTFCfVx4ezFBNTZ9XHh7MUE1OH0tXHh7MUE1RX1ceHsxQTYwfVx4ezFBNjJ9XHh7MUE2NX0tXHh7MUE2Q31ceHsxQTczfS1ceHsxQTdDfVx4ezFBN0Z9XHh7MUFBN31ceHsxQUIwfS1ceHsxQUJEfVx4ezFBQkV9XHh7MUIwMH0tXHh7MUIwM31ceHsxQjM0fVx4ezFCMzZ9LVx4ezFCM0F9XHh7MUIzQ31ceHsxQjQyfVx4ezFCNkJ9LVx4ezFCNzN9XHh7MUI4MH0tXHh7MUI4MX1ceHsxQkEyfS1ceHsxQkE1fVx4ezFCQTh9LVx4ezFCQTl9XHh7MUJBQn0tXHh7MUJBRH1ceHsxQkU2fVx4ezFCRTh9LVx4ezFCRTl9XHh7MUJFRH1ceHsxQkVGfS1ceHsxQkYxfVx4ezFDMkN9LVx4ezFDMzN9XHh7MUMzNn0tXHh7MUMzN31ceHsxQzc4fS1ceHsxQzdEfVx4ezFDRDB9LVx4ezFDRDJ9XHh7MUNENH0tXHh7MUNFMH1ceHsxQ0UyfS1ceHsxQ0U4fVx4ezFDRUR9XHh7MUNGNH1ceHsxQ0Y4fS1ceHsxQ0Y5fVx4ezFEMkN9LVx4ezFENkF9XHh7MUQ3OH1ceHsxRDlCfS1ceHsxREJGfVx4ezFEQzB9LVx4ezFERjl9XHh7MURGQn0tXHh7MURGRn1ceHsxRkJEfVx4ezFGQkZ9LVx4ezFGQzF9XHh7MUZDRH0tXHh7MUZDRn1ceHsxRkREfS1ceHsxRkRGfVx4ezFGRUR9LVx4ezFGRUZ9XHh7MUZGRH0tXHh7MUZGRX1ceHsyMDBCfS1ceHsyMDBGfVx4ezIwMTh9XHh7MjAxOX1ceHsyMDI0fVx4ezIwMjd9XHh7MjAyQX0tXHh7MjAyRX1ceHsyMDYwfS1ceHsyMDY0fVx4ezIwNjZ9LVx4ezIwNkZ9XHh7MjA3MX1ceHsyMDdGfVx4ezIwOTB9LVx4ezIwOUN9XHh7MjBEMH0tXHh7MjBEQ31ceHsyMEREfS1ceHsyMEUwfVx4ezIwRTF9XHh7MjBFMn0tXHh7MjBFNH1ceHsyMEU1fS1ceHsyMEYwfVx4ezJDN0N9LVx4ezJDN0R9XHh7MkNFRn0tXHh7MkNGMX1ceHsyRDZGfVx4ezJEN0Z9XHh7MkRFMH0tXHh7MkRGRn1ceHsyRTJGfVx4ezMwMDV9XHh7MzAyQX0tXHh7MzAyRH1ceHszMDMxfS1ceHszMDM1fVx4ezMwM0J9XHh7MzA5OX0tXHh7MzA5QX1ceHszMDlCfS1ceHszMDlDfVx4ezMwOUR9LVx4ezMwOUV9XHh7MzBGQ30tXHh7MzBGRX1ceHtBMDE1fVx4e0E0Rjh9LVx4e0E0RkR9XHh7QTYwQ31ceHtBNjZGfVx4e0E2NzB9LVx4e0E2NzJ9XHh7QTY3NH0tXHh7QTY3RH1ceHtBNjdGfVx4e0E2OUN9LVx4e0E2OUR9XHh7QTY5RX0tXHh7QTY5Rn1ceHtBNkYwfS1ceHtBNkYxfVx4e0E3MDB9LVx4e0E3MTZ9XHh7QTcxN30tXHh7QTcxRn1ceHtBNzIwfS1ceHtBNzIxfVx4e0E3NzB9XHh7QTc4OH1ceHtBNzg5fS1ceHtBNzhBfVx4e0E3Rjh9LVx4e0E3Rjl9XHh7QTgwMn1ceHtBODA2fVx4e0E4MEJ9XHh7QTgyNX0tXHh7QTgyNn1ceHtBOEM0fS1ceHtBOEM1fVx4e0E4RTB9LVx4e0E4RjF9XHh7QThGRn1ceHtBOTI2fS1ceHtBOTJEfVx4e0E5NDd9LVx4e0E5NTF9XHh7QTk4MH0tXHh7QTk4Mn1ceHtBOUIzfVx4e0E5QjZ9LVx4e0E5Qjl9XHh7QTlCQ31ceHtBOUNGfVx4e0E5RTV9XHh7QTlFNn1ceHtBQTI5fS1ceHtBQTJFfVx4e0FBMzF9LVx4e0FBMzJ9XHh7QUEzNX0tXHh7QUEzNn1ceHtBQTQzfVx4e0FBNEN9XHh7QUE3MH1ceHtBQTdDfVx4e0FBQjB9XHh7QUFCMn0tXHh7QUFCNH1ceHtBQUI3fS1ceHtBQUI4fVx4e0FBQkV9LVx4e0FBQkZ9XHh7QUFDMX1ceHtBQUREfVx4e0FBRUN9LVx4e0FBRUR9XHh7QUFGM30tXHh7QUFGNH1ceHtBQUY2fVx4e0FCNUJ9XHh7QUI1Q30tXHh7QUI1Rn1ceHtBQkU1fVx4e0FCRTh9XHh7QUJFRH1ceHtGQjFFfVx4e0ZCQjJ9LVx4e0ZCQzF9XHh7RkUwMH0tXHh7RkUwRn1ceHtGRTEzfVx4e0ZFMjB9LVx4e0ZFMkZ9XHh7RkU1Mn1ceHtGRTU1fVx4e0ZFRkZ9XHh7RkYwN31ceHtGRjBFfVx4e0ZGMUF9XHh7RkYzRX1ceHtGRjQwfVx4e0ZGNzB9XHh7RkY5RX0tXHh7RkY5Rn1ceHtGRkUzfVx4e0ZGRjl9LVx4e0ZGRkJ9XHh7MTAxRkR9XHh7MTAyRTB9XHh7MTAzNzZ9LVx4ezEwMzdBfVx4ezEwQTAxfS1ceHsxMEEwM31ceHsxMEEwNX0tXHh7MTBBMDZ9XHh7MTBBMEN9LVx4ezEwQTBGfVx4ezEwQTM4fS1ceHsxMEEzQX1ceHsxMEEzRn1ceHsxMEFFNX0tXHh7MTBBRTZ9XHh7MTBEMjR9LVx4ezEwRDI3fVx4ezEwRjQ2fS1ceHsxMEY1MH1ceHsxMTAwMX1ceHsxMTAzOH0tXHh7MTEwNDZ9XHh7MTEwN0Z9LVx4ezExMDgxfVx4ezExMEIzfS1ceHsxMTBCNn1ceHsxMTBCOX0tXHh7MTEwQkF9XHh7MTEwQkR9XHh7MTEwQ0R9XHh7MTExMDB9LVx4ezExMTAyfVx4ezExMTI3fS1ceHsxMTEyQn1ceHsxMTEyRH0tXHh7MTExMzR9XHh7MTExNzN9XHh7MTExODB9LVx4ezExMTgxfVx4ezExMUI2fS1ceHsxMTFCRX1ceHsxMTFDOX0tXHh7MTExQ0N9XHh7MTEyMkZ9LVx4ezExMjMxfVx4ezExMjM0fVx4ezExMjM2fS1ceHsxMTIzN31ceHsxMTIzRX1ceHsxMTJERn1ceHsxMTJFM30tXHh7MTEyRUF9XHh7MTEzMDB9LVx4ezExMzAxfVx4ezExMzNCfS1ceHsxMTMzQ31ceHsxMTM0MH1ceHsxMTM2Nn0tXHh7MTEzNkN9XHh7MTEzNzB9LVx4ezExMzc0fVx4ezExNDM4fS1ceHsxMTQzRn1ceHsxMTQ0Mn0tXHh7MTE0NDR9XHh7MTE0NDZ9XHh7MTE0NUV9XHh7MTE0QjN9LVx4ezExNEI4fVx4ezExNEJBfVx4ezExNEJGfS1ceHsxMTRDMH1ceHsxMTRDMn0tXHh7MTE0QzN9XHh7MTE1QjJ9LVx4ezExNUI1fVx4ezExNUJDfS1ceHsxMTVCRH1ceHsxMTVCRn0tXHh7MTE1QzB9XHh7MTE1REN9LVx4ezExNUREfVx4ezExNjMzfS1ceHsxMTYzQX1ceHsxMTYzRH1ceHsxMTYzRn0tXHh7MTE2NDB9XHh7MTE2QUJ9XHh7MTE2QUR9XHh7MTE2QjB9LVx4ezExNkI1fVx4ezExNkI3fVx4ezExNzFEfS1ceHsxMTcxRn1ceHsxMTcyMn0tXHh7MTE3MjV9XHh7MTE3Mjd9LVx4ezExNzJCfVx4ezExODJGfS1ceHsxMTgzN31ceHsxMTgzOX0tXHh7MTE4M0F9XHh7MTFBMDF9LVx4ezExQTBBfVx4ezExQTMzfS1ceHsxMUEzOH1ceHsxMUEzQn0tXHh7MTFBM0V9XHh7MTFBNDd9XHh7MTFBNTF9LVx4ezExQTU2fVx4ezExQTU5fS1ceHsxMUE1Qn1ceHsxMUE4QX0tXHh7MTFBOTZ9XHh7MTFBOTh9LVx4ezExQTk5fVx4ezExQzMwfS1ceHsxMUMzNn1ceHsxMUMzOH0tXHh7MTFDM0R9XHh7MTFDM0Z9XHh7MTFDOTJ9LVx4ezExQ0E3fVx4ezExQ0FBfS1ceHsxMUNCMH1ceHsxMUNCMn0tXHh7MTFDQjN9XHh7MTFDQjV9LVx4ezExQ0I2fVx4ezExRDMxfS1ceHsxMUQzNn1ceHsxMUQzQX1ceHsxMUQzQ30tXHh7MTFEM0R9XHh7MTFEM0Z9LVx4ezExRDQ1fVx4ezExRDQ3fVx4ezExRDkwfS1ceHsxMUQ5MX1ceHsxMUQ5NX1ceHsxMUQ5N31ceHsxMUVGM30tXHh7MTFFRjR9XHh7MTZBRjB9LVx4ezE2QUY0fVx4ezE2QjMwfS1ceHsxNkIzNn1ceHsxNkI0MH0tXHh7MTZCNDN9XHh7MTZGOEZ9LVx4ezE2RjkyfVx4ezE2RjkzfS1ceHsxNkY5Rn1ceHsxNkZFMH0tXHh7MTZGRTF9XHh7MUJDOUR9LVx4ezFCQzlFfVx4ezFCQ0EwfS1ceHsxQkNBM31ceHsxRDE2N30tXHh7MUQxNjl9XHh7MUQxNzN9LVx4ezFEMTdBfVx4ezFEMTdCfS1ceHsxRDE4Mn1ceHsxRDE4NX0tXHh7MUQxOEJ9XHh7MUQxQUF9LVx4ezFEMUFEfVx4ezFEMjQyfS1ceHsxRDI0NH1ceHsxREEwMH0tXHh7MURBMzZ9XHh7MURBM0J9LVx4ezFEQTZDfVx4ezFEQTc1fVx4ezFEQTg0fVx4ezFEQTlCfS1ceHsxREE5Rn1ceHsxREFBMX0tXHh7MURBQUZ9XHh7MUUwMDB9LVx4ezFFMDA2fVx4ezFFMDA4fS1ceHsxRTAxOH1ceHsxRTAxQn0tXHh7MUUwMjF9XHh7MUUwMjN9LVx4ezFFMDI0fVx4ezFFMDI2fS1ceHsxRTAyQX1ceHsxRThEMH0tXHh7MUU4RDZ9XHh7MUU5NDR9LVx4ezFFOTRBfVx4ezFGM0ZCfS1ceHsxRjNGRn1ceHtFMDAwMX1ceHtFMDAyMH0tXHh7RTAwN0Z9XHh7RTAxMDB9LVx4e0UwMUVGfV0pKFxwTCkoXHBMKispL3UnOwo8P3BocAoKcmV0dXJuIGFycmF5ICgKJ2EnID0+ICdBJywKJ2InID0+ICdCJywKJ2MnID0+ICdDJywKJ2QnID0+ICdEJywKJ2UnID0+ICdFJywKJ2YnID0+ICdGJywKJ2cnID0+ICdHJywKJ2gnID0+ICdIJywKJ2knID0+ICdJJywKJ2onID0+ICdKJywKJ2snID0+ICdLJywKJ2wnID0+ICdMJywKJ20nID0+ICdNJywKJ24nID0+ICdOJywKJ28nID0+ICdPJywKJ3AnID0+ICdQJywKJ3EnID0+ICdRJywKJ3InID0+ICdSJywKJ3MnID0+ICdTJywKJ3QnID0+ICdUJywKJ3UnID0+ICdVJywKJ3YnID0+ICdWJywKJ3cnID0+ICdXJywKJ3gnID0+ICdYJywKJ3knID0+ICdZJywKJ3onID0+ICdaJywKJ8K1JyA9PiAnzpwnLAonw6AnID0+ICfDgCcsCifDoScgPT4gJ8OBJywKJ8OiJyA9PiAnw4InLAonw6MnID0+ICfDgycsCifDpCcgPT4gJ8OEJywKJ8OlJyA9PiAnw4UnLAonw6YnID0+ICfDhicsCifDpycgPT4gJ8OHJywKJ8OoJyA9PiAnw4gnLAonw6knID0+ICfDiScsCifDqicgPT4gJ8OKJywKJ8OrJyA9PiAnw4snLAonw6wnID0+ICfDjCcsCifDrScgPT4gJ8ONJywKJ8OuJyA9PiAnw44nLAonw68nID0+ICfDjycsCifDsCcgPT4gJ8OQJywKJ8OxJyA9PiAnw5EnLAonw7InID0+ICfDkicsCifDsycgPT4gJ8OTJywKJ8O0JyA9PiAnw5QnLAonw7UnID0+ICfDlScsCifDticgPT4gJ8OWJywKJ8O4JyA9PiAnw5gnLAonw7knID0+ICfDmScsCifDuicgPT4gJ8OaJywKJ8O7JyA9PiAnw5snLAonw7wnID0+ICfDnCcsCifDvScgPT4gJ8OdJywKJ8O+JyA9PiAnw54nLAonw78nID0+ICfFuCcsCifEgScgPT4gJ8SAJywKJ8SDJyA9PiAnxIInLAonxIUnID0+ICfEhCcsCifEhycgPT4gJ8SGJywKJ8SJJyA9PiAnxIgnLAonxIsnID0+ICfEiicsCifEjScgPT4gJ8SMJywKJ8SPJyA9PiAnxI4nLAonxJEnID0+ICfEkCcsCifEkycgPT4gJ8SSJywKJ8SVJyA9PiAnxJQnLAonxJcnID0+ICfElicsCifEmScgPT4gJ8SYJywKJ8SbJyA9PiAnxJonLAonxJ0nID0+ICfEnCcsCifEnycgPT4gJ8SeJywKJ8ShJyA9PiAnxKAnLAonxKMnID0+ICfEoicsCifEpScgPT4gJ8SkJywKJ8SnJyA9PiAnxKYnLAonxKknID0+ICfEqCcsCifEqycgPT4gJ8SqJywKJ8StJyA9PiAnxKwnLAonxK8nID0+ICfEricsCifEsScgPT4gJ0knLAonxLMnID0+ICfEsicsCifEtScgPT4gJ8S0JywKJ8S3JyA9PiAnxLYnLAonxLonID0+ICfEuScsCifEvCcgPT4gJ8S7JywKJ8S+JyA9PiAnxL0nLAonxYAnID0+ICfEvycsCifFgicgPT4gJ8WBJywKJ8WEJyA9PiAnxYMnLAonxYYnID0+ICfFhScsCifFiCcgPT4gJ8WHJywKJ8WLJyA9PiAnxYonLAonxY0nID0+ICfFjCcsCifFjycgPT4gJ8WOJywKJ8WRJyA9PiAnxZAnLAonxZMnID0+ICfFkicsCifFlScgPT4gJ8WUJywKJ8WXJyA9PiAnxZYnLAonxZknID0+ICfFmCcsCifFmycgPT4gJ8WaJywKJ8WdJyA9PiAnxZwnLAonxZ8nID0+ICfFnicsCifFoScgPT4gJ8WgJywKJ8WjJyA9PiAnxaInLAonxaUnID0+ICfFpCcsCifFpycgPT4gJ8WmJywKJ8WpJyA9PiAnxagnLAonxasnID0+ICfFqicsCifFrScgPT4gJ8WsJywKJ8WvJyA9PiAnxa4nLAonxbEnID0+ICfFsCcsCifFsycgPT4gJ8WyJywKJ8W1JyA9PiAnxbQnLAonxbcnID0+ICfFticsCifFuicgPT4gJ8W5JywKJ8W8JyA9PiAnxbsnLAonxb4nID0+ICfFvScsCifFvycgPT4gJ1MnLAonxoAnID0+ICfJgycsCifGgycgPT4gJ8aCJywKJ8aFJyA9PiAnxoQnLAonxognID0+ICfGhycsCifGjCcgPT4gJ8aLJywKJ8aSJyA9PiAnxpEnLAonxpUnID0+ICfHticsCifGmScgPT4gJ8aYJywKJ8aaJyA9PiAnyL0nLAonxp4nID0+ICfIoCcsCifGoScgPT4gJ8agJywKJ8ajJyA9PiAnxqInLAonxqUnID0+ICfGpCcsCifGqCcgPT4gJ8anJywKJ8atJyA9PiAnxqwnLAonxrAnID0+ICfGrycsCifGtCcgPT4gJ8azJywKJ8a2JyA9PiAnxrUnLAonxrknID0+ICfGuCcsCifGvScgPT4gJ8a8JywKJ8a/JyA9PiAnx7cnLAonx4UnID0+ICfHhCcsCifHhicgPT4gJ8eEJywKJ8eIJyA9PiAnx4cnLAonx4knID0+ICfHhycsCifHiycgPT4gJ8eKJywKJ8eMJyA9PiAnx4onLAonx44nID0+ICfHjScsCifHkCcgPT4gJ8ePJywKJ8eSJyA9PiAnx5EnLAonx5QnID0+ICfHkycsCifHlicgPT4gJ8eVJywKJ8eYJyA9PiAnx5cnLAonx5onID0+ICfHmScsCifHnCcgPT4gJ8ebJywKJ8edJyA9PiAnxo4nLAonx58nID0+ICfHnicsCifHoScgPT4gJ8egJywKJ8ejJyA9PiAnx6InLAonx6UnID0+ICfHpCcsCifHpycgPT4gJ8emJywKJ8epJyA9PiAnx6gnLAonx6snID0+ICfHqicsCifHrScgPT4gJ8esJywKJ8evJyA9PiAnx64nLAonx7InID0+ICfHsScsCifHsycgPT4gJ8exJywKJ8e1JyA9PiAnx7QnLAonx7knID0+ICfHuCcsCifHuycgPT4gJ8e6JywKJ8e9JyA9PiAnx7wnLAonx78nID0+ICfHvicsCifIgScgPT4gJ8iAJywKJ8iDJyA9PiAnyIInLAonyIUnID0+ICfIhCcsCifIhycgPT4gJ8iGJywKJ8iJJyA9PiAnyIgnLAonyIsnID0+ICfIiicsCifIjScgPT4gJ8iMJywKJ8iPJyA9PiAnyI4nLAonyJEnID0+ICfIkCcsCifIkycgPT4gJ8iSJywKJ8iVJyA9PiAnyJQnLAonyJcnID0+ICfIlicsCifImScgPT4gJ8iYJywKJ8ibJyA9PiAnyJonLAonyJ0nID0+ICfInCcsCifInycgPT4gJ8ieJywKJ8ijJyA9PiAnyKInLAonyKUnID0+ICfIpCcsCifIpycgPT4gJ8imJywKJ8ipJyA9PiAnyKgnLAonyKsnID0+ICfIqicsCifIrScgPT4gJ8isJywKJ8ivJyA9PiAnyK4nLAonyLEnID0+ICfIsCcsCifIsycgPT4gJ8iyJywKJ8i8JyA9PiAnyLsnLAonyL8nID0+ICfisb4nLAonyYAnID0+ICfisb8nLAonyYInID0+ICfJgScsCifJhycgPT4gJ8mGJywKJ8mJJyA9PiAnyYgnLAonyYsnID0+ICfJiicsCifJjScgPT4gJ8mMJywKJ8mPJyA9PiAnyY4nLAonyZAnID0+ICfisa8nLAonyZEnID0+ICfisa0nLAonyZInID0+ICfisbAnLAonyZMnID0+ICfGgScsCifJlCcgPT4gJ8aGJywKJ8mWJyA9PiAnxoknLAonyZcnID0+ICfGiicsCifJmScgPT4gJ8aPJywKJ8mbJyA9PiAnxpAnLAonyZwnID0+ICfqnqsnLAonyaAnID0+ICfGkycsCifJoScgPT4gJ+qerCcsCifJoycgPT4gJ8aUJywKJ8mlJyA9PiAn6p6NJywKJ8mmJyA9PiAn6p6qJywKJ8moJyA9PiAnxpcnLAonyaknID0+ICfGlicsCifJqicgPT4gJ+qericsCifJqycgPT4gJ+KxoicsCifJrCcgPT4gJ+qerScsCifJrycgPT4gJ8acJywKJ8mxJyA9PiAn4rGuJywKJ8myJyA9PiAnxp0nLAonybUnID0+ICfGnycsCifJvScgPT4gJ+KxpCcsCifKgCcgPT4gJ8amJywKJ8qCJyA9PiAn6p+FJywKJ8qDJyA9PiAnxqknLAonyocnID0+ICfqnrEnLAonyognID0+ICfGricsCifKiScgPT4gJ8mEJywKJ8qKJyA9PiAnxrEnLAonyosnID0+ICfGsicsCifKjCcgPT4gJ8mFJywKJ8qSJyA9PiAnxrcnLAonyp0nID0+ICfqnrInLAonyp4nID0+ICfqnrAnLAonzYUnID0+ICfOmScsCifNsScgPT4gJ82wJywKJ82zJyA9PiAnzbInLAonzbcnID0+ICfNticsCifNuycgPT4gJ8+9JywKJ828JyA9PiAnz74nLAonzb0nID0+ICfPvycsCifOrCcgPT4gJ86GJywKJ86tJyA9PiAnzognLAonzq4nID0+ICfOiScsCifOrycgPT4gJ86KJywKJ86xJyA9PiAnzpEnLAonzrInID0+ICfOkicsCifOsycgPT4gJ86TJywKJ860JyA9PiAnzpQnLAonzrUnID0+ICfOlScsCifOticgPT4gJ86WJywKJ863JyA9PiAnzpcnLAonzrgnID0+ICfOmCcsCifOuScgPT4gJ86ZJywKJ866JyA9PiAnzponLAonzrsnID0+ICfOmycsCifOvCcgPT4gJ86cJywKJ869JyA9PiAnzp0nLAonzr4nID0+ICfOnicsCifOvycgPT4gJ86fJywKJ8+AJyA9PiAnzqAnLAonz4EnID0+ICfOoScsCifPgicgPT4gJ86jJywKJ8+DJyA9PiAnzqMnLAonz4QnID0+ICfOpCcsCifPhScgPT4gJ86lJywKJ8+GJyA9PiAnzqYnLAonz4cnID0+ICfOpycsCifPiCcgPT4gJ86oJywKJ8+JJyA9PiAnzqknLAonz4onID0+ICfOqicsCifPiycgPT4gJ86rJywKJ8+MJyA9PiAnzownLAonz40nID0+ICfOjicsCifPjicgPT4gJ86PJywKJ8+QJyA9PiAnzpInLAonz5EnID0+ICfOmCcsCifPlScgPT4gJ86mJywKJ8+WJyA9PiAnzqAnLAonz5cnID0+ICfPjycsCifPmScgPT4gJ8+YJywKJ8+bJyA9PiAnz5onLAonz50nID0+ICfPnCcsCifPnycgPT4gJ8+eJywKJ8+hJyA9PiAnz6AnLAonz6MnID0+ICfPoicsCifPpScgPT4gJ8+kJywKJ8+nJyA9PiAnz6YnLAonz6knID0+ICfPqCcsCifPqycgPT4gJ8+qJywKJ8+tJyA9PiAnz6wnLAonz68nID0+ICfPricsCifPsCcgPT4gJ86aJywKJ8+xJyA9PiAnzqEnLAonz7InID0+ICfPuScsCifPsycgPT4gJ82/JywKJ8+1JyA9PiAnzpUnLAonz7gnID0+ICfPtycsCifPuycgPT4gJ8+6JywKJ9CwJyA9PiAn0JAnLAon0LEnID0+ICfQkScsCifQsicgPT4gJ9CSJywKJ9CzJyA9PiAn0JMnLAon0LQnID0+ICfQlCcsCifQtScgPT4gJ9CVJywKJ9C2JyA9PiAn0JYnLAon0LcnID0+ICfQlycsCifQuCcgPT4gJ9CYJywKJ9C5JyA9PiAn0JknLAon0LonID0+ICfQmicsCifQuycgPT4gJ9CbJywKJ9C8JyA9PiAn0JwnLAon0L0nID0+ICfQnScsCifQvicgPT4gJ9CeJywKJ9C/JyA9PiAn0J8nLAon0YAnID0+ICfQoCcsCifRgScgPT4gJ9ChJywKJ9GCJyA9PiAn0KInLAon0YMnID0+ICfQoycsCifRhCcgPT4gJ9CkJywKJ9GFJyA9PiAn0KUnLAon0YYnID0+ICfQpicsCifRhycgPT4gJ9CnJywKJ9GIJyA9PiAn0KgnLAon0YknID0+ICfQqScsCifRiicgPT4gJ9CqJywKJ9GLJyA9PiAn0KsnLAon0YwnID0+ICfQrCcsCifRjScgPT4gJ9CtJywKJ9GOJyA9PiAn0K4nLAon0Y8nID0+ICfQrycsCifRkCcgPT4gJ9CAJywKJ9GRJyA9PiAn0IEnLAon0ZInID0+ICfQgicsCifRkycgPT4gJ9CDJywKJ9GUJyA9PiAn0IQnLAon0ZUnID0+ICfQhScsCifRlicgPT4gJ9CGJywKJ9GXJyA9PiAn0IcnLAon0ZgnID0+ICfQiCcsCifRmScgPT4gJ9CJJywKJ9GaJyA9PiAn0IonLAon0ZsnID0+ICfQiycsCifRnCcgPT4gJ9CMJywKJ9GdJyA9PiAn0I0nLAon0Z4nID0+ICfQjicsCifRnycgPT4gJ9CPJywKJ9GhJyA9PiAn0aAnLAon0aMnID0+ICfRoicsCifRpScgPT4gJ9GkJywKJ9GnJyA9PiAn0aYnLAon0aknID0+ICfRqCcsCifRqycgPT4gJ9GqJywKJ9GtJyA9PiAn0awnLAon0a8nID0+ICfRricsCifRsScgPT4gJ9GwJywKJ9GzJyA9PiAn0bInLAon0bUnID0+ICfRtCcsCifRtycgPT4gJ9G2JywKJ9G5JyA9PiAn0bgnLAon0bsnID0+ICfRuicsCifRvScgPT4gJ9G8JywKJ9G/JyA9PiAn0b4nLAon0oEnID0+ICfSgCcsCifSiycgPT4gJ9KKJywKJ9KNJyA9PiAn0ownLAon0o8nID0+ICfSjicsCifSkScgPT4gJ9KQJywKJ9KTJyA9PiAn0pInLAon0pUnID0+ICfSlCcsCifSlycgPT4gJ9KWJywKJ9KZJyA9PiAn0pgnLAon0psnID0+ICfSmicsCifSnScgPT4gJ9KcJywKJ9KfJyA9PiAn0p4nLAon0qEnID0+ICfSoCcsCifSoycgPT4gJ9KiJywKJ9KlJyA9PiAn0qQnLAon0qcnID0+ICfSpicsCifSqScgPT4gJ9KoJywKJ9KrJyA9PiAn0qonLAon0q0nID0+ICfSrCcsCifSrycgPT4gJ9KuJywKJ9KxJyA9PiAn0rAnLAon0rMnID0+ICfSsicsCifStScgPT4gJ9K0JywKJ9K3JyA9PiAn0rYnLAon0rknID0+ICfSuCcsCifSuycgPT4gJ9K6JywKJ9K9JyA9PiAn0rwnLAon0r8nID0+ICfSvicsCifTgicgPT4gJ9OBJywKJ9OEJyA9PiAn04MnLAon04YnID0+ICfThScsCifTiCcgPT4gJ9OHJywKJ9OKJyA9PiAn04knLAon04wnID0+ICfTiycsCifTjicgPT4gJ9ONJywKJ9OPJyA9PiAn04AnLAon05EnID0+ICfTkCcsCifTkycgPT4gJ9OSJywKJ9OVJyA9PiAn05QnLAon05cnID0+ICfTlicsCifTmScgPT4gJ9OYJywKJ9ObJyA9PiAn05onLAon050nID0+ICfTnCcsCifTnycgPT4gJ9OeJywKJ9OhJyA9PiAn06AnLAon06MnID0+ICfToicsCifTpScgPT4gJ9OkJywKJ9OnJyA9PiAn06YnLAon06knID0+ICfTqCcsCifTqycgPT4gJ9OqJywKJ9OtJyA9PiAn06wnLAon068nID0+ICfTricsCifTsScgPT4gJ9OwJywKJ9OzJyA9PiAn07InLAon07UnID0+ICfTtCcsCifTtycgPT4gJ9O2JywKJ9O5JyA9PiAn07gnLAon07snID0+ICfTuicsCifTvScgPT4gJ9O8JywKJ9O/JyA9PiAn074nLAon1IEnID0+ICfUgCcsCifUgycgPT4gJ9SCJywKJ9SFJyA9PiAn1IQnLAon1IcnID0+ICfUhicsCifUiScgPT4gJ9SIJywKJ9SLJyA9PiAn1IonLAon1I0nID0+ICfUjCcsCifUjycgPT4gJ9SOJywKJ9SRJyA9PiAn1JAnLAon1JMnID0+ICfUkicsCifUlScgPT4gJ9SUJywKJ9SXJyA9PiAn1JYnLAon1JknID0+ICfUmCcsCifUmycgPT4gJ9SaJywKJ9SdJyA9PiAn1JwnLAon1J8nID0+ICfUnicsCifUoScgPT4gJ9SgJywKJ9SjJyA9PiAn1KInLAon1KUnID0+ICfUpCcsCifUpycgPT4gJ9SmJywKJ9SpJyA9PiAn1KgnLAon1KsnID0+ICfUqicsCifUrScgPT4gJ9SsJywKJ9SvJyA9PiAn1K4nLAon1aEnID0+ICfUsScsCifVoicgPT4gJ9SyJywKJ9WjJyA9PiAn1LMnLAon1aQnID0+ICfUtCcsCifVpScgPT4gJ9S1JywKJ9WmJyA9PiAn1LYnLAon1acnID0+ICfUtycsCifVqCcgPT4gJ9S4JywKJ9WpJyA9PiAn1LknLAon1aonID0+ICfUuicsCifVqycgPT4gJ9S7JywKJ9WsJyA9PiAn1LwnLAon1a0nID0+ICfUvScsCifVricgPT4gJ9S+JywKJ9WvJyA9PiAn1L8nLAon1bAnID0+ICfVgCcsCifVsScgPT4gJ9WBJywKJ9WyJyA9PiAn1YInLAon1bMnID0+ICfVgycsCifVtCcgPT4gJ9WEJywKJ9W1JyA9PiAn1YUnLAon1bYnID0+ICfVhicsCifVtycgPT4gJ9WHJywKJ9W4JyA9PiAn1YgnLAon1bknID0+ICfViScsCifVuicgPT4gJ9WKJywKJ9W7JyA9PiAn1YsnLAon1bwnID0+ICfVjCcsCifVvScgPT4gJ9WNJywKJ9W+JyA9PiAn1Y4nLAon1b8nID0+ICfVjycsCifWgCcgPT4gJ9WQJywKJ9aBJyA9PiAn1ZEnLAon1oInID0+ICfVkicsCifWgycgPT4gJ9WTJywKJ9aEJyA9PiAn1ZQnLAon1oUnID0+ICfVlScsCifWhicgPT4gJ9WWJywKJ+GDkCcgPT4gJ+GykCcsCifhg5EnID0+ICfhspEnLAon4YOSJyA9PiAn4bKSJywKJ+GDkycgPT4gJ+GykycsCifhg5QnID0+ICfhspQnLAon4YOVJyA9PiAn4bKVJywKJ+GDlicgPT4gJ+GylicsCifhg5cnID0+ICfhspcnLAon4YOYJyA9PiAn4bKYJywKJ+GDmScgPT4gJ+GymScsCifhg5onID0+ICfhsponLAon4YObJyA9PiAn4bKbJywKJ+GDnCcgPT4gJ+GynCcsCifhg50nID0+ICfhsp0nLAon4YOeJyA9PiAn4bKeJywKJ+GDnycgPT4gJ+GynycsCifhg6AnID0+ICfhsqAnLAon4YOhJyA9PiAn4bKhJywKJ+GDoicgPT4gJ+GyoicsCifhg6MnID0+ICfhsqMnLAon4YOkJyA9PiAn4bKkJywKJ+GDpScgPT4gJ+GypScsCifhg6YnID0+ICfhsqYnLAon4YOnJyA9PiAn4bKnJywKJ+GDqCcgPT4gJ+GyqCcsCifhg6knID0+ICfhsqknLAon4YOqJyA9PiAn4bKqJywKJ+GDqycgPT4gJ+GyqycsCifhg6wnID0+ICfhsqwnLAon4YOtJyA9PiAn4bKtJywKJ+GDricgPT4gJ+GyricsCifhg68nID0+ICfhsq8nLAon4YOwJyA9PiAn4bKwJywKJ+GDsScgPT4gJ+GysScsCifhg7InID0+ICfhsrInLAon4YOzJyA9PiAn4bKzJywKJ+GDtCcgPT4gJ+GytCcsCifhg7UnID0+ICfhsrUnLAon4YO2JyA9PiAn4bK2JywKJ+GDtycgPT4gJ+GytycsCifhg7gnID0+ICfhsrgnLAon4YO5JyA9PiAn4bK5JywKJ+GDuicgPT4gJ+GyuicsCifhg70nID0+ICfhsr0nLAon4YO+JyA9PiAn4bK+JywKJ+GDvycgPT4gJ+GyvycsCifhj7gnID0+ICfhj7AnLAon4Y+5JyA9PiAn4Y+xJywKJ+GPuicgPT4gJ+GPsicsCifhj7snID0+ICfhj7MnLAon4Y+8JyA9PiAn4Y+0JywKJ+GPvScgPT4gJ+GPtScsCifhsoAnID0+ICfQkicsCifhsoEnID0+ICfQlCcsCifhsoInID0+ICfQnicsCifhsoMnID0+ICfQoScsCifhsoQnID0+ICfQoicsCifhsoUnID0+ICfQoicsCifhsoYnID0+ICfQqicsCifhsocnID0+ICfRoicsCifhsognID0+ICfqmYonLAon4bW5JyA9PiAn6p29JywKJ+G1vScgPT4gJ+KxoycsCifhto4nID0+ICfqn4YnLAon4biBJyA9PiAn4biAJywKJ+G4gycgPT4gJ+G4gicsCifhuIUnID0+ICfhuIQnLAon4biHJyA9PiAn4biGJywKJ+G4iScgPT4gJ+G4iCcsCifhuIsnID0+ICfhuIonLAon4biNJyA9PiAn4biMJywKJ+G4jycgPT4gJ+G4jicsCifhuJEnID0+ICfhuJAnLAon4biTJyA9PiAn4biSJywKJ+G4lScgPT4gJ+G4lCcsCifhuJcnID0+ICfhuJYnLAon4biZJyA9PiAn4biYJywKJ+G4mycgPT4gJ+G4micsCifhuJ0nID0+ICfhuJwnLAon4bifJyA9PiAn4bieJywKJ+G4oScgPT4gJ+G4oCcsCifhuKMnID0+ICfhuKInLAon4bilJyA9PiAn4bikJywKJ+G4pycgPT4gJ+G4picsCifhuKknID0+ICfhuKgnLAon4birJyA9PiAn4biqJywKJ+G4rScgPT4gJ+G4rCcsCifhuK8nID0+ICfhuK4nLAon4bixJyA9PiAn4biwJywKJ+G4sycgPT4gJ+G4sicsCifhuLUnID0+ICfhuLQnLAon4bi3JyA9PiAn4bi2JywKJ+G4uScgPT4gJ+G4uCcsCifhuLsnID0+ICfhuLonLAon4bi9JyA9PiAn4bi8JywKJ+G4vycgPT4gJ+G4vicsCifhuYEnID0+ICfhuYAnLAon4bmDJyA9PiAn4bmCJywKJ+G5hScgPT4gJ+G5hCcsCifhuYcnID0+ICfhuYYnLAon4bmJJyA9PiAn4bmIJywKJ+G5iycgPT4gJ+G5iicsCifhuY0nID0+ICfhuYwnLAon4bmPJyA9PiAn4bmOJywKJ+G5kScgPT4gJ+G5kCcsCifhuZMnID0+ICfhuZInLAon4bmVJyA9PiAn4bmUJywKJ+G5lycgPT4gJ+G5licsCifhuZknID0+ICfhuZgnLAon4bmbJyA9PiAn4bmaJywKJ+G5nScgPT4gJ+G5nCcsCifhuZ8nID0+ICfhuZ4nLAon4bmhJyA9PiAn4bmgJywKJ+G5oycgPT4gJ+G5oicsCifhuaUnID0+ICfhuaQnLAon4bmnJyA9PiAn4bmmJywKJ+G5qScgPT4gJ+G5qCcsCifhuasnID0+ICfhuaonLAon4bmtJyA9PiAn4bmsJywKJ+G5rycgPT4gJ+G5ricsCifhubEnID0+ICfhubAnLAon4bmzJyA9PiAn4bmyJywKJ+G5tScgPT4gJ+G5tCcsCifhubcnID0+ICfhubYnLAon4bm5JyA9PiAn4bm4JywKJ+G5uycgPT4gJ+G5uicsCifhub0nID0+ICfhubwnLAon4bm/JyA9PiAn4bm+JywKJ+G6gScgPT4gJ+G6gCcsCifhuoMnID0+ICfhuoInLAon4bqFJyA9PiAn4bqEJywKJ+G6hycgPT4gJ+G6hicsCifhuoknID0+ICfhuognLAon4bqLJyA9PiAn4bqKJywKJ+G6jScgPT4gJ+G6jCcsCifhuo8nID0+ICfhuo4nLAon4bqRJyA9PiAn4bqQJywKJ+G6kycgPT4gJ+G6kicsCifhupUnID0+ICfhupQnLAon4bqbJyA9PiAn4bmgJywKJ+G6oScgPT4gJ+G6oCcsCifhuqMnID0+ICfhuqInLAon4bqlJyA9PiAn4bqkJywKJ+G6pycgPT4gJ+G6picsCifhuqknID0+ICfhuqgnLAon4bqrJyA9PiAn4bqqJywKJ+G6rScgPT4gJ+G6rCcsCifhuq8nID0+ICfhuq4nLAon4bqxJyA9PiAn4bqwJywKJ+G6sycgPT4gJ+G6sicsCifhurUnID0+ICfhurQnLAon4bq3JyA9PiAn4bq2JywKJ+G6uScgPT4gJ+G6uCcsCifhursnID0+ICfhuronLAon4bq9JyA9PiAn4bq8JywKJ+G6vycgPT4gJ+G6vicsCifhu4EnID0+ICfhu4AnLAon4buDJyA9PiAn4buCJywKJ+G7hScgPT4gJ+G7hCcsCifhu4cnID0+ICfhu4YnLAon4buJJyA9PiAn4buIJywKJ+G7iycgPT4gJ+G7iicsCifhu40nID0+ICfhu4wnLAon4buPJyA9PiAn4buOJywKJ+G7kScgPT4gJ+G7kCcsCifhu5MnID0+ICfhu5InLAon4buVJyA9PiAn4buUJywKJ+G7lycgPT4gJ+G7licsCifhu5knID0+ICfhu5gnLAon4bubJyA9PiAn4buaJywKJ+G7nScgPT4gJ+G7nCcsCifhu58nID0+ICfhu54nLAon4buhJyA9PiAn4bugJywKJ+G7oycgPT4gJ+G7oicsCifhu6UnID0+ICfhu6QnLAon4bunJyA9PiAn4bumJywKJ+G7qScgPT4gJ+G7qCcsCifhu6snID0+ICfhu6onLAon4butJyA9PiAn4busJywKJ+G7rycgPT4gJ+G7ricsCifhu7EnID0+ICfhu7AnLAon4buzJyA9PiAn4buyJywKJ+G7tScgPT4gJ+G7tCcsCifhu7cnID0+ICfhu7YnLAon4bu5JyA9PiAn4bu4JywKJ+G7uycgPT4gJ+G7uicsCifhu70nID0+ICfhu7wnLAon4bu/JyA9PiAn4bu+JywKJ+G8gCcgPT4gJ+G8iCcsCifhvIEnID0+ICfhvIknLAon4byCJyA9PiAn4byKJywKJ+G8gycgPT4gJ+G8iycsCifhvIQnID0+ICfhvIwnLAon4byFJyA9PiAn4byNJywKJ+G8hicgPT4gJ+G8jicsCifhvIcnID0+ICfhvI8nLAon4byQJyA9PiAn4byYJywKJ+G8kScgPT4gJ+G8mScsCifhvJInID0+ICfhvJonLAon4byTJyA9PiAn4bybJywKJ+G8lCcgPT4gJ+G8nCcsCifhvJUnID0+ICfhvJ0nLAon4bygJyA9PiAn4byoJywKJ+G8oScgPT4gJ+G8qScsCifhvKInID0+ICfhvKonLAon4byjJyA9PiAn4byrJywKJ+G8pCcgPT4gJ+G8rCcsCifhvKUnID0+ICfhvK0nLAon4bymJyA9PiAn4byuJywKJ+G8pycgPT4gJ+G8rycsCifhvLAnID0+ICfhvLgnLAon4byxJyA9PiAn4by5JywKJ+G8sicgPT4gJ+G8uicsCifhvLMnID0+ICfhvLsnLAon4by0JyA9PiAn4by8JywKJ+G8tScgPT4gJ+G8vScsCifhvLYnID0+ICfhvL4nLAon4by3JyA9PiAn4by/JywKJ+G9gCcgPT4gJ+G9iCcsCifhvYEnID0+ICfhvYknLAon4b2CJyA9PiAn4b2KJywKJ+G9gycgPT4gJ+G9iycsCifhvYQnID0+ICfhvYwnLAon4b2FJyA9PiAn4b2NJywKJ+G9kScgPT4gJ+G9mScsCifhvZMnID0+ICfhvZsnLAon4b2VJyA9PiAn4b2dJywKJ+G9lycgPT4gJ+G9nycsCifhvaAnID0+ICfhvagnLAon4b2hJyA9PiAn4b2pJywKJ+G9oicgPT4gJ+G9qicsCifhvaMnID0+ICfhvasnLAon4b2kJyA9PiAn4b2sJywKJ+G9pScgPT4gJ+G9rScsCifhvaYnID0+ICfhva4nLAon4b2nJyA9PiAn4b2vJywKJ+G9sCcgPT4gJ+G+uicsCifhvbEnID0+ICfhvrsnLAon4b2yJyA9PiAn4b+IJywKJ+G9sycgPT4gJ+G/iScsCifhvbQnID0+ICfhv4onLAon4b21JyA9PiAn4b+LJywKJ+G9ticgPT4gJ+G/micsCifhvbcnID0+ICfhv5snLAon4b24JyA9PiAn4b+4JywKJ+G9uScgPT4gJ+G/uScsCifhvbonID0+ICfhv6onLAon4b27JyA9PiAn4b+rJywKJ+G9vCcgPT4gJ+G/uicsCifhvb0nID0+ICfhv7snLAon4b6AJyA9PiAn4byIzpknLAon4b6BJyA9PiAn4byJzpknLAon4b6CJyA9PiAn4byKzpknLAon4b6DJyA9PiAn4byLzpknLAon4b6EJyA9PiAn4byMzpknLAon4b6FJyA9PiAn4byNzpknLAon4b6GJyA9PiAn4byOzpknLAon4b6HJyA9PiAn4byPzpknLAon4b6QJyA9PiAn4byozpknLAon4b6RJyA9PiAn4bypzpknLAon4b6SJyA9PiAn4byqzpknLAon4b6TJyA9PiAn4byrzpknLAon4b6UJyA9PiAn4byszpknLAon4b6VJyA9PiAn4bytzpknLAon4b6WJyA9PiAn4byuzpknLAon4b6XJyA9PiAn4byvzpknLAon4b6gJyA9PiAn4b2ozpknLAon4b6hJyA9PiAn4b2pzpknLAon4b6iJyA9PiAn4b2qzpknLAon4b6jJyA9PiAn4b2rzpknLAon4b6kJyA9PiAn4b2szpknLAon4b6lJyA9PiAn4b2tzpknLAon4b6mJyA9PiAn4b2uzpknLAon4b6nJyA9PiAn4b2vzpknLAon4b6wJyA9PiAn4b64JywKJ+G+sScgPT4gJ+G+uScsCifhvrMnID0+ICfOkc6ZJywKJ+G+vicgPT4gJ86ZJywKJ+G/gycgPT4gJ86XzpknLAon4b+QJyA9PiAn4b+YJywKJ+G/kScgPT4gJ+G/mScsCifhv6AnID0+ICfhv6gnLAon4b+hJyA9PiAn4b+pJywKJ+G/pScgPT4gJ+G/rCcsCifhv7MnID0+ICfOqc6ZJywKJ+KFjicgPT4gJ+KEsicsCifihbAnID0+ICfihaAnLAon4oWxJyA9PiAn4oWhJywKJ+KFsicgPT4gJ+KFoicsCifihbMnID0+ICfihaMnLAon4oW0JyA9PiAn4oWkJywKJ+KFtScgPT4gJ+KFpScsCifihbYnID0+ICfihaYnLAon4oW3JyA9PiAn4oWnJywKJ+KFuCcgPT4gJ+KFqCcsCifihbknID0+ICfihaknLAon4oW6JyA9PiAn4oWqJywKJ+KFuycgPT4gJ+KFqycsCifihbwnID0+ICfihawnLAon4oW9JyA9PiAn4oWtJywKJ+KFvicgPT4gJ+KFricsCifihb8nID0+ICfiha8nLAon4oaEJyA9PiAn4oaDJywKJ+KTkCcgPT4gJ+KSticsCifik5EnID0+ICfikrcnLAon4pOSJyA9PiAn4pK4JywKJ+KTkycgPT4gJ+KSuScsCifik5QnID0+ICfikronLAon4pOVJyA9PiAn4pK7JywKJ+KTlicgPT4gJ+KSvCcsCifik5cnID0+ICfikr0nLAon4pOYJyA9PiAn4pK+JywKJ+KTmScgPT4gJ+KSvycsCifik5onID0+ICfik4AnLAon4pObJyA9PiAn4pOBJywKJ+KTnCcgPT4gJ+KTgicsCifik50nID0+ICfik4MnLAon4pOeJyA9PiAn4pOEJywKJ+KTnycgPT4gJ+KThScsCifik6AnID0+ICfik4YnLAon4pOhJyA9PiAn4pOHJywKJ+KToicgPT4gJ+KTiCcsCifik6MnID0+ICfik4knLAon4pOkJyA9PiAn4pOKJywKJ+KTpScgPT4gJ+KTiycsCifik6YnID0+ICfik4wnLAon4pOnJyA9PiAn4pONJywKJ+KTqCcgPT4gJ+KTjicsCifik6knID0+ICfik48nLAon4rCwJyA9PiAn4rCAJywKJ+KwsScgPT4gJ+KwgScsCifisLInID0+ICfisIInLAon4rCzJyA9PiAn4rCDJywKJ+KwtCcgPT4gJ+KwhCcsCifisLUnID0+ICfisIUnLAon4rC2JyA9PiAn4rCGJywKJ+KwtycgPT4gJ+KwhycsCifisLgnID0+ICfisIgnLAon4rC5JyA9PiAn4rCJJywKJ+KwuicgPT4gJ+KwiicsCifisLsnID0+ICfisIsnLAon4rC8JyA9PiAn4rCMJywKJ+KwvScgPT4gJ+KwjScsCifisL4nID0+ICfisI4nLAon4rC/JyA9PiAn4rCPJywKJ+KxgCcgPT4gJ+KwkCcsCifisYEnID0+ICfisJEnLAon4rGCJyA9PiAn4rCSJywKJ+KxgycgPT4gJ+KwkycsCifisYQnID0+ICfisJQnLAon4rGFJyA9PiAn4rCVJywKJ+KxhicgPT4gJ+KwlicsCifisYcnID0+ICfisJcnLAon4rGIJyA9PiAn4rCYJywKJ+KxiScgPT4gJ+KwmScsCifisYonID0+ICfisJonLAon4rGLJyA9PiAn4rCbJywKJ+KxjCcgPT4gJ+KwnCcsCifisY0nID0+ICfisJ0nLAon4rGOJyA9PiAn4rCeJywKJ+KxjycgPT4gJ+KwnycsCifisZAnID0+ICfisKAnLAon4rGRJyA9PiAn4rChJywKJ+KxkicgPT4gJ+KwoicsCifisZMnID0+ICfisKMnLAon4rGUJyA9PiAn4rCkJywKJ+KxlScgPT4gJ+KwpScsCifisZYnID0+ICfisKYnLAon4rGXJyA9PiAn4rCnJywKJ+KxmCcgPT4gJ+KwqCcsCifisZknID0+ICfisKknLAon4rGaJyA9PiAn4rCqJywKJ+KxmycgPT4gJ+KwqycsCifisZwnID0+ICfisKwnLAon4rGdJyA9PiAn4rCtJywKJ+KxnicgPT4gJ+KwricsCifisaEnID0+ICfisaAnLAon4rGlJyA9PiAnyLonLAon4rGmJyA9PiAnyL4nLAon4rGoJyA9PiAn4rGnJywKJ+KxqicgPT4gJ+KxqScsCifisawnID0+ICfisasnLAon4rGzJyA9PiAn4rGyJywKJ+KxticgPT4gJ+KxtScsCifisoEnID0+ICfisoAnLAon4rKDJyA9PiAn4rKCJywKJ+KyhScgPT4gJ+KyhCcsCifisocnID0+ICfisoYnLAon4rKJJyA9PiAn4rKIJywKJ+KyiycgPT4gJ+KyiicsCifiso0nID0+ICfisownLAon4rKPJyA9PiAn4rKOJywKJ+KykScgPT4gJ+KykCcsCifispMnID0+ICfispInLAon4rKVJyA9PiAn4rKUJywKJ+KylycgPT4gJ+KylicsCifispknID0+ICfispgnLAon4rKbJyA9PiAn4rKaJywKJ+KynScgPT4gJ+KynCcsCifisp8nID0+ICfisp4nLAon4rKhJyA9PiAn4rKgJywKJ+KyoycgPT4gJ+KyoicsCifisqUnID0+ICfisqQnLAon4rKnJyA9PiAn4rKmJywKJ+KyqScgPT4gJ+KyqCcsCifisqsnID0+ICfisqonLAon4rKtJyA9PiAn4rKsJywKJ+KyrycgPT4gJ+KyricsCifisrEnID0+ICfisrAnLAon4rKzJyA9PiAn4rKyJywKJ+KytScgPT4gJ+KytCcsCifisrcnID0+ICfisrYnLAon4rK5JyA9PiAn4rK4JywKJ+KyuycgPT4gJ+KyuicsCifisr0nID0+ICfisrwnLAon4rK/JyA9PiAn4rK+JywKJ+KzgScgPT4gJ+KzgCcsCifis4MnID0+ICfis4InLAon4rOFJyA9PiAn4rOEJywKJ+KzhycgPT4gJ+KzhicsCifis4knID0+ICfis4gnLAon4rOLJyA9PiAn4rOKJywKJ+KzjScgPT4gJ+KzjCcsCifis48nID0+ICfis44nLAon4rORJyA9PiAn4rOQJywKJ+KzkycgPT4gJ+KzkicsCifis5UnID0+ICfis5QnLAon4rOXJyA9PiAn4rOWJywKJ+KzmScgPT4gJ+KzmCcsCifis5snID0+ICfis5onLAon4rOdJyA9PiAn4rOcJywKJ+KznycgPT4gJ+KznicsCifis6EnID0+ICfis6AnLAon4rOjJyA9PiAn4rOiJywKJ+KzrCcgPT4gJ+KzqycsCifis64nID0+ICfis60nLAon4rOzJyA9PiAn4rOyJywKJ+K0gCcgPT4gJ+GCoCcsCifitIEnID0+ICfhgqEnLAon4rSCJyA9PiAn4YKiJywKJ+K0gycgPT4gJ+GCoycsCifitIQnID0+ICfhgqQnLAon4rSFJyA9PiAn4YKlJywKJ+K0hicgPT4gJ+GCpicsCifitIcnID0+ICfhgqcnLAon4rSIJyA9PiAn4YKoJywKJ+K0iScgPT4gJ+GCqScsCifitIonID0+ICfhgqonLAon4rSLJyA9PiAn4YKrJywKJ+K0jCcgPT4gJ+GCrCcsCifitI0nID0+ICfhgq0nLAon4rSOJyA9PiAn4YKuJywKJ+K0jycgPT4gJ+GCrycsCifitJAnID0+ICfhgrAnLAon4rSRJyA9PiAn4YKxJywKJ+K0kicgPT4gJ+GCsicsCifitJMnID0+ICfhgrMnLAon4rSUJyA9PiAn4YK0JywKJ+K0lScgPT4gJ+GCtScsCifitJYnID0+ICfhgrYnLAon4rSXJyA9PiAn4YK3JywKJ+K0mCcgPT4gJ+GCuCcsCifitJknID0+ICfhgrknLAon4rSaJyA9PiAn4YK6JywKJ+K0mycgPT4gJ+GCuycsCifitJwnID0+ICfhgrwnLAon4rSdJyA9PiAn4YK9JywKJ+K0nicgPT4gJ+GCvicsCifitJ8nID0+ICfhgr8nLAon4rSgJyA9PiAn4YOAJywKJ+K0oScgPT4gJ+GDgScsCifitKInID0+ICfhg4InLAon4rSjJyA9PiAn4YODJywKJ+K0pCcgPT4gJ+GDhCcsCifitKUnID0+ICfhg4UnLAon4rSnJyA9PiAn4YOHJywKJ+K0rScgPT4gJ+GDjScsCifqmYEnID0+ICfqmYAnLAon6pmDJyA9PiAn6pmCJywKJ+qZhScgPT4gJ+qZhCcsCifqmYcnID0+ICfqmYYnLAon6pmJJyA9PiAn6pmIJywKJ+qZiycgPT4gJ+qZiicsCifqmY0nID0+ICfqmYwnLAon6pmPJyA9PiAn6pmOJywKJ+qZkScgPT4gJ+qZkCcsCifqmZMnID0+ICfqmZInLAon6pmVJyA9PiAn6pmUJywKJ+qZlycgPT4gJ+qZlicsCifqmZknID0+ICfqmZgnLAon6pmbJyA9PiAn6pmaJywKJ+qZnScgPT4gJ+qZnCcsCifqmZ8nID0+ICfqmZ4nLAon6pmhJyA9PiAn6pmgJywKJ+qZoycgPT4gJ+qZoicsCifqmaUnID0+ICfqmaQnLAon6pmnJyA9PiAn6pmmJywKJ+qZqScgPT4gJ+qZqCcsCifqmasnID0+ICfqmaonLAon6pmtJyA9PiAn6pmsJywKJ+qagScgPT4gJ+qagCcsCifqmoMnID0+ICfqmoInLAon6pqFJyA9PiAn6pqEJywKJ+qahycgPT4gJ+qahicsCifqmoknID0+ICfqmognLAon6pqLJyA9PiAn6pqKJywKJ+qajScgPT4gJ+qajCcsCifqmo8nID0+ICfqmo4nLAon6pqRJyA9PiAn6pqQJywKJ+qakycgPT4gJ+qakicsCifqmpUnID0+ICfqmpQnLAon6pqXJyA9PiAn6pqWJywKJ+qamScgPT4gJ+qamCcsCifqmpsnID0+ICfqmponLAon6pyjJyA9PiAn6pyiJywKJ+qcpScgPT4gJ+qcpCcsCifqnKcnID0+ICfqnKYnLAon6pypJyA9PiAn6pyoJywKJ+qcqycgPT4gJ+qcqicsCifqnK0nID0+ICfqnKwnLAon6pyvJyA9PiAn6pyuJywKJ+qcsycgPT4gJ+qcsicsCifqnLUnID0+ICfqnLQnLAon6py3JyA9PiAn6py2JywKJ+qcuScgPT4gJ+qcuCcsCifqnLsnID0+ICfqnLonLAon6py9JyA9PiAn6py8JywKJ+qcvycgPT4gJ+qcvicsCifqnYEnID0+ICfqnYAnLAon6p2DJyA9PiAn6p2CJywKJ+qdhScgPT4gJ+qdhCcsCifqnYcnID0+ICfqnYYnLAon6p2JJyA9PiAn6p2IJywKJ+qdiycgPT4gJ+qdiicsCifqnY0nID0+ICfqnYwnLAon6p2PJyA9PiAn6p2OJywKJ+qdkScgPT4gJ+qdkCcsCifqnZMnID0+ICfqnZInLAon6p2VJyA9PiAn6p2UJywKJ+qdlycgPT4gJ+qdlicsCifqnZknID0+ICfqnZgnLAon6p2bJyA9PiAn6p2aJywKJ+qdnScgPT4gJ+qdnCcsCifqnZ8nID0+ICfqnZ4nLAon6p2hJyA9PiAn6p2gJywKJ+qdoycgPT4gJ+qdoicsCifqnaUnID0+ICfqnaQnLAon6p2nJyA9PiAn6p2mJywKJ+qdqScgPT4gJ+qdqCcsCifqnasnID0+ICfqnaonLAon6p2tJyA9PiAn6p2sJywKJ+qdrycgPT4gJ+qdricsCifqnbonID0+ICfqnbknLAon6p28JyA9PiAn6p27JywKJ+qdvycgPT4gJ+qdvicsCifqnoEnID0+ICfqnoAnLAon6p6DJyA9PiAn6p6CJywKJ+qehScgPT4gJ+qehCcsCifqnocnID0+ICfqnoYnLAon6p6MJyA9PiAn6p6LJywKJ+qekScgPT4gJ+qekCcsCifqnpMnID0+ICfqnpInLAon6p6UJyA9PiAn6p+EJywKJ+qelycgPT4gJ+qelicsCifqnpknID0+ICfqnpgnLAon6p6bJyA9PiAn6p6aJywKJ+qenScgPT4gJ+qenCcsCifqnp8nID0+ICfqnp4nLAon6p6hJyA9PiAn6p6gJywKJ+qeoycgPT4gJ+qeoicsCifqnqUnID0+ICfqnqQnLAon6p6nJyA9PiAn6p6mJywKJ+qeqScgPT4gJ+qeqCcsCifqnrUnID0+ICfqnrQnLAon6p63JyA9PiAn6p62JywKJ+qeuScgPT4gJ+qeuCcsCifqnrsnID0+ICfqnronLAon6p69JyA9PiAn6p68JywKJ+qevycgPT4gJ+qevicsCifqn4MnID0+ICfqn4InLAon6p+IJyA9PiAn6p+HJywKJ+qfiicgPT4gJ+qfiScsCifqn7YnID0+ICfqn7UnLAon6q2TJyA9PiAn6p6zJywKJ+qtsCcgPT4gJ+GOoCcsCifqrbEnID0+ICfhjqEnLAon6q2yJyA9PiAn4Y6iJywKJ+qtsycgPT4gJ+GOoycsCifqrbQnID0+ICfhjqQnLAon6q21JyA9PiAn4Y6lJywKJ+qtticgPT4gJ+GOpicsCifqrbcnID0+ICfhjqcnLAon6q24JyA9PiAn4Y6oJywKJ+qtuScgPT4gJ+GOqScsCifqrbonID0+ICfhjqonLAon6q27JyA9PiAn4Y6rJywKJ+qtvCcgPT4gJ+GOrCcsCifqrb0nID0+ICfhjq0nLAon6q2+JyA9PiAn4Y6uJywKJ+qtvycgPT4gJ+GOrycsCifqroAnID0+ICfhjrAnLAon6q6BJyA9PiAn4Y6xJywKJ+qugicgPT4gJ+GOsicsCifqroMnID0+ICfhjrMnLAon6q6EJyA9PiAn4Y60JywKJ+quhScgPT4gJ+GOtScsCifqroYnID0+ICfhjrYnLAon6q6HJyA9PiAn4Y63JywKJ+quiCcgPT4gJ+GOuCcsCifqroknID0+ICfhjrknLAon6q6KJyA9PiAn4Y66JywKJ+quiycgPT4gJ+GOuycsCifqrownID0+ICfhjrwnLAon6q6NJyA9PiAn4Y69JywKJ+qujicgPT4gJ+GOvicsCifqro8nID0+ICfhjr8nLAon6q6QJyA9PiAn4Y+AJywKJ+qukScgPT4gJ+GPgScsCifqrpInID0+ICfhj4InLAon6q6TJyA9PiAn4Y+DJywKJ+qulCcgPT4gJ+GPhCcsCifqrpUnID0+ICfhj4UnLAon6q6WJyA9PiAn4Y+GJywKJ+qulycgPT4gJ+GPhycsCifqrpgnID0+ICfhj4gnLAon6q6ZJyA9PiAn4Y+JJywKJ+qumicgPT4gJ+GPiicsCifqrpsnID0+ICfhj4snLAon6q6cJyA9PiAn4Y+MJywKJ+qunScgPT4gJ+GPjScsCifqrp4nID0+ICfhj44nLAon6q6fJyA9PiAn4Y+PJywKJ+quoCcgPT4gJ+GPkCcsCifqrqEnID0+ICfhj5EnLAon6q6iJyA9PiAn4Y+SJywKJ+quoycgPT4gJ+GPkycsCifqrqQnID0+ICfhj5QnLAon6q6lJyA9PiAn4Y+VJywKJ+qupicgPT4gJ+GPlicsCifqrqcnID0+ICfhj5cnLAon6q6oJyA9PiAn4Y+YJywKJ+quqScgPT4gJ+GPmScsCifqrqonID0+ICfhj5onLAon6q6rJyA9PiAn4Y+bJywKJ+qurCcgPT4gJ+GPnCcsCifqrq0nID0+ICfhj50nLAon6q6uJyA9PiAn4Y+eJywKJ+qurycgPT4gJ+GPnycsCifqrrAnID0+ICfhj6AnLAon6q6xJyA9PiAn4Y+hJywKJ+qusicgPT4gJ+GPoicsCifqrrMnID0+ICfhj6MnLAon6q60JyA9PiAn4Y+kJywKJ+qutScgPT4gJ+GPpScsCifqrrYnID0+ICfhj6YnLAon6q63JyA9PiAn4Y+nJywKJ+quuCcgPT4gJ+GPqCcsCifqrrknID0+ICfhj6knLAon6q66JyA9PiAn4Y+qJywKJ+quuycgPT4gJ+GPqycsCifqrrwnID0+ICfhj6wnLAon6q69JyA9PiAn4Y+tJywKJ+quvicgPT4gJ+GPricsCifqrr8nID0+ICfhj68nLAon772BJyA9PiAn77yhJywKJ++9gicgPT4gJ++8oicsCifvvYMnID0+ICfvvKMnLAon772EJyA9PiAn77ykJywKJ++9hScgPT4gJ++8pScsCifvvYYnID0+ICfvvKYnLAon772HJyA9PiAn77ynJywKJ++9iCcgPT4gJ++8qCcsCifvvYknID0+ICfvvKknLAon772KJyA9PiAn77yqJywKJ++9iycgPT4gJ++8qycsCifvvYwnID0+ICfvvKwnLAon772NJyA9PiAn77ytJywKJ++9jicgPT4gJ++8ricsCifvvY8nID0+ICfvvK8nLAon772QJyA9PiAn77ywJywKJ++9kScgPT4gJ++8sScsCifvvZInID0+ICfvvLInLAon772TJyA9PiAn77yzJywKJ++9lCcgPT4gJ++8tCcsCifvvZUnID0+ICfvvLUnLAon772WJyA9PiAn77y2JywKJ++9lycgPT4gJ++8tycsCifvvZgnID0+ICfvvLgnLAon772ZJyA9PiAn77y5JywKJ++9micgPT4gJ++8uicsCifwkJCoJyA9PiAn8JCQgCcsCifwkJCpJyA9PiAn8JCQgScsCifwkJCqJyA9PiAn8JCQgicsCifwkJCrJyA9PiAn8JCQgycsCifwkJCsJyA9PiAn8JCQhCcsCifwkJCtJyA9PiAn8JCQhScsCifwkJCuJyA9PiAn8JCQhicsCifwkJCvJyA9PiAn8JCQhycsCifwkJCwJyA9PiAn8JCQiCcsCifwkJCxJyA9PiAn8JCQiScsCifwkJCyJyA9PiAn8JCQiicsCifwkJCzJyA9PiAn8JCQiycsCifwkJC0JyA9PiAn8JCQjCcsCifwkJC1JyA9PiAn8JCQjScsCifwkJC2JyA9PiAn8JCQjicsCifwkJC3JyA9PiAn8JCQjycsCifwkJC4JyA9PiAn8JCQkCcsCifwkJC5JyA9PiAn8JCQkScsCifwkJC6JyA9PiAn8JCQkicsCifwkJC7JyA9PiAn8JCQkycsCifwkJC8JyA9PiAn8JCQlCcsCifwkJC9JyA9PiAn8JCQlScsCifwkJC+JyA9PiAn8JCQlicsCifwkJC/JyA9PiAn8JCQlycsCifwkJGAJyA9PiAn8JCQmCcsCifwkJGBJyA9PiAn8JCQmScsCifwkJGCJyA9PiAn8JCQmicsCifwkJGDJyA9PiAn8JCQmycsCifwkJGEJyA9PiAn8JCQnCcsCifwkJGFJyA9PiAn8JCQnScsCifwkJGGJyA9PiAn8JCQnicsCifwkJGHJyA9PiAn8JCQnycsCifwkJGIJyA9PiAn8JCQoCcsCifwkJGJJyA9PiAn8JCQoScsCifwkJGKJyA9PiAn8JCQoicsCifwkJGLJyA9PiAn8JCQoycsCifwkJGMJyA9PiAn8JCQpCcsCifwkJGNJyA9PiAn8JCQpScsCifwkJGOJyA9PiAn8JCQpicsCifwkJGPJyA9PiAn8JCQpycsCifwkJOYJyA9PiAn8JCSsCcsCifwkJOZJyA9PiAn8JCSsScsCifwkJOaJyA9PiAn8JCSsicsCifwkJObJyA9PiAn8JCSsycsCifwkJOcJyA9PiAn8JCStCcsCifwkJOdJyA9PiAn8JCStScsCifwkJOeJyA9PiAn8JCSticsCifwkJOfJyA9PiAn8JCStycsCifwkJOgJyA9PiAn8JCSuCcsCifwkJOhJyA9PiAn8JCSuScsCifwkJOiJyA9PiAn8JCSuicsCifwkJOjJyA9PiAn8JCSuycsCifwkJOkJyA9PiAn8JCSvCcsCifwkJOlJyA9PiAn8JCSvScsCifwkJOmJyA9PiAn8JCSvicsCifwkJOnJyA9PiAn8JCSvycsCifwkJOoJyA9PiAn8JCTgCcsCifwkJOpJyA9PiAn8JCTgScsCifwkJOqJyA9PiAn8JCTgicsCifwkJOrJyA9PiAn8JCTgycsCifwkJOsJyA9PiAn8JCThCcsCifwkJOtJyA9PiAn8JCThScsCifwkJOuJyA9PiAn8JCThicsCifwkJOvJyA9PiAn8JCThycsCifwkJOwJyA9PiAn8JCTiCcsCifwkJOxJyA9PiAn8JCTiScsCifwkJOyJyA9PiAn8JCTiicsCifwkJOzJyA9PiAn8JCTiycsCifwkJO0JyA9PiAn8JCTjCcsCifwkJO1JyA9PiAn8JCTjScsCifwkJO2JyA9PiAn8JCTjicsCifwkJO3JyA9PiAn8JCTjycsCifwkJO4JyA9PiAn8JCTkCcsCifwkJO5JyA9PiAn8JCTkScsCifwkJO6JyA9PiAn8JCTkicsCifwkJO7JyA9PiAn8JCTkycsCifwkLOAJyA9PiAn8JCygCcsCifwkLOBJyA9PiAn8JCygScsCifwkLOCJyA9PiAn8JCygicsCifwkLODJyA9PiAn8JCygycsCifwkLOEJyA9PiAn8JCyhCcsCifwkLOFJyA9PiAn8JCyhScsCifwkLOGJyA9PiAn8JCyhicsCifwkLOHJyA9PiAn8JCyhycsCifwkLOIJyA9PiAn8JCyiCcsCifwkLOJJyA9PiAn8JCyiScsCifwkLOKJyA9PiAn8JCyiicsCifwkLOLJyA9PiAn8JCyiycsCifwkLOMJyA9PiAn8JCyjCcsCifwkLONJyA9PiAn8JCyjScsCifwkLOOJyA9PiAn8JCyjicsCifwkLOPJyA9PiAn8JCyjycsCifwkLOQJyA9PiAn8JCykCcsCifwkLORJyA9PiAn8JCykScsCifwkLOSJyA9PiAn8JCykicsCifwkLOTJyA9PiAn8JCykycsCifwkLOUJyA9PiAn8JCylCcsCifwkLOVJyA9PiAn8JCylScsCifwkLOWJyA9PiAn8JCylicsCifwkLOXJyA9PiAn8JCylycsCifwkLOYJyA9PiAn8JCymCcsCifwkLOZJyA9PiAn8JCymScsCifwkLOaJyA9PiAn8JCymicsCifwkLObJyA9PiAn8JCymycsCifwkLOcJyA9PiAn8JCynCcsCifwkLOdJyA9PiAn8JCynScsCifwkLOeJyA9PiAn8JCynicsCifwkLOfJyA9PiAn8JCynycsCifwkLOgJyA9PiAn8JCyoCcsCifwkLOhJyA9PiAn8JCyoScsCifwkLOiJyA9PiAn8JCyoicsCifwkLOjJyA9PiAn8JCyoycsCifwkLOkJyA9PiAn8JCypCcsCifwkLOlJyA9PiAn8JCypScsCifwkLOmJyA9PiAn8JCypicsCifwkLOnJyA9PiAn8JCypycsCifwkLOoJyA9PiAn8JCyqCcsCifwkLOpJyA9PiAn8JCyqScsCifwkLOqJyA9PiAn8JCyqicsCifwkLOrJyA9PiAn8JCyqycsCifwkLOsJyA9PiAn8JCyrCcsCifwkLOtJyA9PiAn8JCyrScsCifwkLOuJyA9PiAn8JCyricsCifwkLOvJyA9PiAn8JCyrycsCifwkLOwJyA9PiAn8JCysCcsCifwkLOxJyA9PiAn8JCysScsCifwkLOyJyA9PiAn8JCysicsCifwkaOAJyA9PiAn8JGioCcsCifwkaOBJyA9PiAn8JGioScsCifwkaOCJyA9PiAn8JGioicsCifwkaODJyA9PiAn8JGioycsCifwkaOEJyA9PiAn8JGipCcsCifwkaOFJyA9PiAn8JGipScsCifwkaOGJyA9PiAn8JGipicsCifwkaOHJyA9PiAn8JGipycsCifwkaOIJyA9PiAn8JGiqCcsCifwkaOJJyA9PiAn8JGiqScsCifwkaOKJyA9PiAn8JGiqicsCifwkaOLJyA9PiAn8JGiqycsCifwkaOMJyA9PiAn8JGirCcsCifwkaONJyA9PiAn8JGirScsCifwkaOOJyA9PiAn8JGiricsCifwkaOPJyA9PiAn8JGirycsCifwkaOQJyA9PiAn8JGisCcsCifwkaORJyA9PiAn8JGisScsCifwkaOSJyA9PiAn8JGisicsCifwkaOTJyA9PiAn8JGisycsCifwkaOUJyA9PiAn8JGitCcsCifwkaOVJyA9PiAn8JGitScsCifwkaOWJyA9PiAn8JGiticsCifwkaOXJyA9PiAn8JGitycsCifwkaOYJyA9PiAn8JGiuCcsCifwkaOZJyA9PiAn8JGiuScsCifwkaOaJyA9PiAn8JGiuicsCifwkaObJyA9PiAn8JGiuycsCifwkaOcJyA9PiAn8JGivCcsCifwkaOdJyA9PiAn8JGivScsCifwkaOeJyA9PiAn8JGivicsCifwkaOfJyA9PiAn8JGivycsCifwlrmgJyA9PiAn8Ja5gCcsCifwlrmhJyA9PiAn8Ja5gScsCifwlrmiJyA9PiAn8Ja5gicsCifwlrmjJyA9PiAn8Ja5gycsCifwlrmkJyA9PiAn8Ja5hCcsCifwlrmlJyA9PiAn8Ja5hScsCifwlrmmJyA9PiAn8Ja5hicsCifwlrmnJyA9PiAn8Ja5hycsCifwlrmoJyA9PiAn8Ja5iCcsCifwlrmpJyA9PiAn8Ja5iScsCifwlrmqJyA9PiAn8Ja5iicsCifwlrmrJyA9PiAn8Ja5iycsCifwlrmsJyA9PiAn8Ja5jCcsCifwlrmtJyA9PiAn8Ja5jScsCifwlrmuJyA9PiAn8Ja5jicsCifwlrmvJyA9PiAn8Ja5jycsCifwlrmwJyA9PiAn8Ja5kCcsCifwlrmxJyA9PiAn8Ja5kScsCifwlrmyJyA9PiAn8Ja5kicsCifwlrmzJyA9PiAn8Ja5kycsCifwlrm0JyA9PiAn8Ja5lCcsCifwlrm1JyA9PiAn8Ja5lScsCifwlrm2JyA9PiAn8Ja5licsCifwlrm3JyA9PiAn8Ja5lycsCifwlrm4JyA9PiAn8Ja5mCcsCifwlrm5JyA9PiAn8Ja5mScsCifwlrm6JyA9PiAn8Ja5micsCifwlrm7JyA9PiAn8Ja5mycsCifwlrm8JyA9PiAn8Ja5nCcsCifwlrm9JyA9PiAn8Ja5nScsCifwlrm+JyA9PiAn8Ja5nicsCifwlrm/JyA9PiAn8Ja5nycsCifwnqSiJyA9PiAn8J6kgCcsCifwnqSjJyA9PiAn8J6kgScsCifwnqSkJyA9PiAn8J6kgicsCifwnqSlJyA9PiAn8J6kgycsCifwnqSmJyA9PiAn8J6khCcsCifwnqSnJyA9PiAn8J6khScsCifwnqSoJyA9PiAn8J6khicsCifwnqSpJyA9PiAn8J6khycsCifwnqSqJyA9PiAn8J6kiCcsCifwnqSrJyA9PiAn8J6kiScsCifwnqSsJyA9PiAn8J6kiicsCifwnqStJyA9PiAn8J6kiycsCifwnqSuJyA9PiAn8J6kjCcsCifwnqSvJyA9PiAn8J6kjScsCifwnqSwJyA9PiAn8J6kjicsCifwnqSxJyA9PiAn8J6kjycsCifwnqSyJyA9PiAn8J6kkCcsCifwnqSzJyA9PiAn8J6kkScsCifwnqS0JyA9PiAn8J6kkicsCifwnqS1JyA9PiAn8J6kkycsCifwnqS2JyA9PiAn8J6klCcsCifwnqS3JyA9PiAn8J6klScsCifwnqS4JyA9PiAn8J6klicsCifwnqS5JyA9PiAn8J6klycsCifwnqS6JyA9PiAn8J6kmCcsCifwnqS7JyA9PiAn8J6kmScsCifwnqS8JyA9PiAn8J6kmicsCifwnqS9JyA9PiAn8J6kmycsCifwnqS+JyA9PiAn8J6knCcsCifwnqS/JyA9PiAn8J6knScsCifwnqWAJyA9PiAn8J6knicsCifwnqWBJyA9PiAn8J6knycsCifwnqWCJyA9PiAn8J6koCcsCifwnqWDJyA9PiAn8J6koScsCifDnycgPT4gJ1NTJywKJ++sgCcgPT4gJ0ZGJywKJ++sgScgPT4gJ0ZJJywKJ++sgicgPT4gJ0ZMJywKJ++sgycgPT4gJ0ZGSScsCifvrIQnID0+ICdGRkwnLAon76yFJyA9PiAnU1QnLAon76yGJyA9PiAnU1QnLAon1ocnID0+ICfUtdWSJywKJ++skycgPT4gJ9WE1YYnLAon76yUJyA9PiAn1YTUtScsCifvrJUnID0+ICfVhNS7JywKJ++slicgPT4gJ9WO1YYnLAon76yXJyA9PiAn1YTUvScsCifFiScgPT4gJ8q8TicsCifOkCcgPT4gJ86ZzIjMgScsCifOsCcgPT4gJ86lzIjMgScsCifHsCcgPT4gJ0rMjCcsCifhupYnID0+ICdIzLEnLAon4bqXJyA9PiAnVMyIJywKJ+G6mCcgPT4gJ1fMiicsCifhupknID0+ICdZzIonLAon4bqaJyA9PiAnQcq+JywKJ+G9kCcgPT4gJ86lzJMnLAon4b2SJyA9PiAnzqXMk8yAJywKJ+G9lCcgPT4gJ86lzJPMgScsCifhvZYnID0+ICfOpcyTzYInLAon4b62JyA9PiAnzpHNgicsCifhv4YnID0+ICfOl82CJywKJ+G/kicgPT4gJ86ZzIjMgCcsCifhv5MnID0+ICfOmcyIzIEnLAon4b+WJyA9PiAnzpnNgicsCifhv5cnID0+ICfOmcyIzYInLAon4b+iJyA9PiAnzqXMiMyAJywKJ+G/oycgPT4gJ86lzIjMgScsCifhv6QnID0+ICfOocyTJywKJ+G/picgPT4gJ86lzYInLAon4b+nJyA9PiAnzqXMiM2CJywKJ+G/ticgPT4gJ86pzYInLAon4b6IJyA9PiAn4byIzpknLAon4b6JJyA9PiAn4byJzpknLAon4b6KJyA9PiAn4byKzpknLAon4b6LJyA9PiAn4byLzpknLAon4b6MJyA9PiAn4byMzpknLAon4b6NJyA9PiAn4byNzpknLAon4b6OJyA9PiAn4byOzpknLAon4b6PJyA9PiAn4byPzpknLAon4b6YJyA9PiAn4byozpknLAon4b6ZJyA9PiAn4bypzpknLAon4b6aJyA9PiAn4byqzpknLAon4b6bJyA9PiAn4byrzpknLAon4b6cJyA9PiAn4byszpknLAon4b6dJyA9PiAn4bytzpknLAon4b6eJyA9PiAn4byuzpknLAon4b6fJyA9PiAn4byvzpknLAon4b6oJyA9PiAn4b2ozpknLAon4b6pJyA9PiAn4b2pzpknLAon4b6qJyA9PiAn4b2qzpknLAon4b6rJyA9PiAn4b2rzpknLAon4b6sJyA9PiAn4b2szpknLAon4b6tJyA9PiAn4b2tzpknLAon4b6uJyA9PiAn4b2uzpknLAon4b6vJyA9PiAn4b2vzpknLAon4b68JyA9PiAnzpHOmScsCifhv4wnID0+ICfOl86ZJywKJ+G/vCcgPT4gJ86pzpknLAon4b6yJyA9PiAn4b66zpknLAon4b60JyA9PiAnzobOmScsCifhv4InID0+ICfhv4rOmScsCifhv4QnID0+ICfOic6ZJywKJ+G/sicgPT4gJ+G/us6ZJywKJ+G/tCcgPT4gJ86PzpknLAon4b63JyA9PiAnzpHNgs6ZJywKJ+G/hycgPT4gJ86XzYLOmScsCifhv7cnID0+ICfOqc2CzpknLAopOwo8P3BocAoKCgoKCgoKCgoKdXNlIFN5bWZvbnlcUG9seWZpbGxcTWJzdHJpbmcgYXMgcDsKCmlmIChcUEhQX1ZFUlNJT05fSUQgPj0gODAwMDApIHsKcmV0dXJuIHJlcXVpcmUgX19ESVJfXy4nL2Jvb3RzdHJhcDgwLnBocCc7Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9jb252ZXJ0X2VuY29kaW5nJykpIHsKZnVuY3Rpb24gbWJfY29udmVydF9lbmNvZGluZygkc3RyaW5nLCAkdG9fZW5jb2RpbmcsICRmcm9tX2VuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfY29udmVydF9lbmNvZGluZygkc3RyaW5nLCAkdG9fZW5jb2RpbmcsICRmcm9tX2VuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9kZWNvZGVfbWltZWhlYWRlcicpKSB7CmZ1bmN0aW9uIG1iX2RlY29kZV9taW1laGVhZGVyKCRzdHJpbmcpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2RlY29kZV9taW1laGVhZGVyKCRzdHJpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2VuY29kZV9taW1laGVhZGVyJykpIHsKZnVuY3Rpb24gbWJfZW5jb2RlX21pbWVoZWFkZXIoJHN0cmluZywgJGNoYXJzZXQgPSBudWxsLCAkdHJhbnNmZXJfZW5jb2RpbmcgPSBudWxsLCAkbmV3bGluZSA9ICJcclxuIiwgJGluZGVudCA9IDApIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2VuY29kZV9taW1laGVhZGVyKCRzdHJpbmcsICRjaGFyc2V0LCAkdHJhbnNmZXJfZW5jb2RpbmcsICRuZXdsaW5lLCAkaW5kZW50KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9kZWNvZGVfbnVtZXJpY2VudGl0eScpKSB7CmZ1bmN0aW9uIG1iX2RlY29kZV9udW1lcmljZW50aXR5KCRzdHJpbmcsICRtYXAsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2RlY29kZV9udW1lcmljZW50aXR5KCRzdHJpbmcsICRtYXAsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfZW5jb2RlX251bWVyaWNlbnRpdHknKSkgewpmdW5jdGlvbiBtYl9lbmNvZGVfbnVtZXJpY2VudGl0eSgkc3RyaW5nLCAkbWFwLCAkZW5jb2RpbmcgPSBudWxsLCAkaGV4ID0gZmFsc2UpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2VuY29kZV9udW1lcmljZW50aXR5KCRzdHJpbmcsICRtYXAsICRlbmNvZGluZywgJGhleCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF9jYXNlJykpIHsKZnVuY3Rpb24gbWJfY29udmVydF9jYXNlKCRzdHJpbmcsICRtb2RlLCAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9jb252ZXJ0X2Nhc2UoJHN0cmluZywgJG1vZGUsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfaW50ZXJuYWxfZW5jb2RpbmcnKSkgewpmdW5jdGlvbiBtYl9pbnRlcm5hbF9lbmNvZGluZygkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9pbnRlcm5hbF9lbmNvZGluZygkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2xhbmd1YWdlJykpIHsKZnVuY3Rpb24gbWJfbGFuZ3VhZ2UoJGxhbmd1YWdlID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfbGFuZ3VhZ2UoJGxhbmd1YWdlKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9saXN0X2VuY29kaW5ncycpKSB7CmZ1bmN0aW9uIG1iX2xpc3RfZW5jb2RpbmdzKCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfbGlzdF9lbmNvZGluZ3MoKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9lbmNvZGluZ19hbGlhc2VzJykpIHsKZnVuY3Rpb24gbWJfZW5jb2RpbmdfYWxpYXNlcygkZW5jb2RpbmcpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2VuY29kaW5nX2FsaWFzZXMoJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9jaGVja19lbmNvZGluZycpKSB7CmZ1bmN0aW9uIG1iX2NoZWNrX2VuY29kaW5nKCR2YWx1ZSA9IG51bGwsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2NoZWNrX2VuY29kaW5nKCR2YWx1ZSwgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9kZXRlY3RfZW5jb2RpbmcnKSkgewpmdW5jdGlvbiBtYl9kZXRlY3RfZW5jb2RpbmcoJHN0cmluZywgJGVuY29kaW5ncyA9IG51bGwsICRzdHJpY3QgPSBmYWxzZSkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfZGV0ZWN0X2VuY29kaW5nKCRzdHJpbmcsICRlbmNvZGluZ3MsICRzdHJpY3QpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2RldGVjdF9vcmRlcicpKSB7CmZ1bmN0aW9uIG1iX2RldGVjdF9vcmRlcigkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9kZXRlY3Rfb3JkZXIoJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9wYXJzZV9zdHInKSkgewpmdW5jdGlvbiBtYl9wYXJzZV9zdHIoJHN0cmluZywgJiRyZXN1bHQgPSBbXSkgeyBwYXJzZV9zdHIoJHN0cmluZywgJHJlc3VsdCk7IHJldHVybiAoYm9vbCkgJHJlc3VsdDsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJsZW4nKSkgewpmdW5jdGlvbiBtYl9zdHJsZW4oJHN0cmluZywgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RybGVuKCRzdHJpbmcsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RycG9zJykpIHsKZnVuY3Rpb24gbWJfc3RycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCA9IDAsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cnBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RydG9sb3dlcicpKSB7CmZ1bmN0aW9uIG1iX3N0cnRvbG93ZXIoJHN0cmluZywgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RydG9sb3dlcigkc3RyaW5nLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cnRvdXBwZXInKSkgewpmdW5jdGlvbiBtYl9zdHJ0b3VwcGVyKCRzdHJpbmcsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cnRvdXBwZXIoJHN0cmluZywgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdWJzdGl0dXRlX2NoYXJhY3RlcicpKSB7CmZ1bmN0aW9uIG1iX3N1YnN0aXR1dGVfY2hhcmFjdGVyKCRzdWJzdGl0dXRlX2NoYXJhY3RlciA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N1YnN0aXR1dGVfY2hhcmFjdGVyKCRzdWJzdGl0dXRlX2NoYXJhY3Rlcik7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3Vic3RyJykpIHsKZnVuY3Rpb24gbWJfc3Vic3RyKCRzdHJpbmcsICRzdGFydCwgJGxlbmd0aCA9IDIxNDc0ODM2NDcsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N1YnN0cigkc3RyaW5nLCAkc3RhcnQsICRsZW5ndGgsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RyaXBvcycpKSB7CmZ1bmN0aW9uIG1iX3N0cmlwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCwgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RyaXN0cicpKSB7CmZ1bmN0aW9uIG1iX3N0cmlzdHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkYmVmb3JlX25lZWRsZSA9IGZhbHNlLCAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJpc3RyKCRoYXlzdGFjaywgJG5lZWRsZSwgJGJlZm9yZV9uZWVkbGUsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RycmNocicpKSB7CmZ1bmN0aW9uIG1iX3N0cnJjaHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkYmVmb3JlX25lZWRsZSA9IGZhbHNlLCAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJyY2hyKCRoYXlzdGFjaywgJG5lZWRsZSwgJGJlZm9yZV9uZWVkbGUsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RycmljaHInKSkgewpmdW5jdGlvbiBtYl9zdHJyaWNocigkaGF5c3RhY2ssICRuZWVkbGUsICRiZWZvcmVfbmVlZGxlID0gZmFsc2UsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cnJpY2hyKCRoYXlzdGFjaywgJG5lZWRsZSwgJGJlZm9yZV9uZWVkbGUsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3Rycmlwb3MnKSkgewpmdW5jdGlvbiBtYl9zdHJyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQgPSAwLCAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RycnBvcycpKSB7CmZ1bmN0aW9uIG1iX3N0cnJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCwgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RycnBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3Ryc3RyJykpIHsKZnVuY3Rpb24gbWJfc3Ryc3RyKCRoYXlzdGFjaywgJG5lZWRsZSwgJGJlZm9yZV9uZWVkbGUgPSBmYWxzZSwgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3Ryc3RyKCRoYXlzdGFjaywgJG5lZWRsZSwgJGJlZm9yZV9uZWVkbGUsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfZ2V0X2luZm8nKSkgewpmdW5jdGlvbiBtYl9nZXRfaW5mbygkdHlwZSA9ICdhbGwnKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9nZXRfaW5mbygkdHlwZSk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfaHR0cF9vdXRwdXQnKSkgewpmdW5jdGlvbiBtYl9odHRwX291dHB1dCgkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9odHRwX291dHB1dCgkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cndpZHRoJykpIHsKZnVuY3Rpb24gbWJfc3Ryd2lkdGgoJHN0cmluZywgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3Ryd2lkdGgoJHN0cmluZywgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdWJzdHJfY291bnQnKSkgewpmdW5jdGlvbiBtYl9zdWJzdHJfY291bnQoJGhheXN0YWNrLCAkbmVlZGxlLCAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdWJzdHJfY291bnQoJGhheXN0YWNrLCAkbmVlZGxlLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX291dHB1dF9oYW5kbGVyJykpIHsKZnVuY3Rpb24gbWJfb3V0cHV0X2hhbmRsZXIoJHN0cmluZywgJHN0YXR1cykgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfb3V0cHV0X2hhbmRsZXIoJHN0cmluZywgJHN0YXR1cyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfaHR0cF9pbnB1dCcpKSB7CmZ1bmN0aW9uIG1iX2h0dHBfaW5wdXQoJHR5cGUgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9odHRwX2lucHV0KCR0eXBlKTsgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF92YXJpYWJsZXMnKSkgewpmdW5jdGlvbiBtYl9jb252ZXJ0X3ZhcmlhYmxlcygkdG9fZW5jb2RpbmcsICRmcm9tX2VuY29kaW5nLCAmLi4uJHZhcnMpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2NvbnZlcnRfdmFyaWFibGVzKCR0b19lbmNvZGluZywgJGZyb21fZW5jb2RpbmcsIC4uLiR2YXJzKTsgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfb3JkJykpIHsKZnVuY3Rpb24gbWJfb3JkKCRzdHJpbmcsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX29yZCgkc3RyaW5nLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2NocicpKSB7CmZ1bmN0aW9uIG1iX2NocigkY29kZXBvaW50LCAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9jaHIoJGNvZGVwb2ludCwgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zY3J1YicpKSB7CmZ1bmN0aW9uIG1iX3NjcnViKCRzdHJpbmcsICRlbmNvZGluZyA9IG51bGwpIHsgJGVuY29kaW5nID0gbnVsbCA9PT0gJGVuY29kaW5nID8gbWJfaW50ZXJuYWxfZW5jb2RpbmcoKSA6ICRlbmNvZGluZzsgcmV0dXJuIG1iX2NvbnZlcnRfZW5jb2RpbmcoJHN0cmluZywgJGVuY29kaW5nLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cl9zcGxpdCcpKSB7CmZ1bmN0aW9uIG1iX3N0cl9zcGxpdCgkc3RyaW5nLCAkbGVuZ3RoID0gMSwgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RyX3NwbGl0KCRzdHJpbmcsICRsZW5ndGgsICRlbmNvZGluZyk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cl9wYWQnKSkgewpmdW5jdGlvbiBtYl9zdHJfcGFkKHN0cmluZyAkc3RyaW5nLCBpbnQgJGxlbmd0aCwgc3RyaW5nICRwYWRfc3RyaW5nID0gJyAnLCBpbnQgJHBhZF90eXBlID0gU1RSX1BBRF9SSUdIVCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJfcGFkKCRzdHJpbmcsICRsZW5ndGgsICRwYWRfc3RyaW5nLCAkcGFkX3R5cGUsICRlbmNvZGluZyk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3VjZmlyc3QnKSkgewpmdW5jdGlvbiBtYl91Y2ZpcnN0KHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3VjZmlyc3QoJHN0cmluZywgJGVuY29kaW5nKTsgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfbGNmaXJzdCcpKSB7CmZ1bmN0aW9uIG1iX2xjZmlyc3Qoc3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfbGNmaXJzdCgkc3RyaW5nLCAkZW5jb2RpbmcpOyB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl90cmltJykpIHsKZnVuY3Rpb24gbWJfdHJpbShzdHJpbmcgJHN0cmluZywgP3N0cmluZyAkY2hhcmFjdGVycyA9IG51bGwsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfdHJpbSgkc3RyaW5nLCAkY2hhcmFjdGVycywgJGVuY29kaW5nKTsgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfbHRyaW0nKSkgewpmdW5jdGlvbiBtYl9sdHJpbShzdHJpbmcgJHN0cmluZywgP3N0cmluZyAkY2hhcmFjdGVycyA9IG51bGwsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfbHRyaW0oJHN0cmluZywgJGNoYXJhY3RlcnMsICRlbmNvZGluZyk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3J0cmltJykpIHsKZnVuY3Rpb24gbWJfcnRyaW0oc3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGNoYXJhY3RlcnMgPSBudWxsLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3J0cmltKCRzdHJpbmcsICRjaGFyYWN0ZXJzLCAkZW5jb2RpbmcpOyB9Cn0KCmlmIChleHRlbnNpb25fbG9hZGVkKCdtYnN0cmluZycpKSB7CnJldHVybjsKfQoKaWYgKCFkZWZpbmVkKCdNQl9DQVNFX1VQUEVSJykpIHsKZGVmaW5lKCdNQl9DQVNFX1VQUEVSJywgMCk7Cn0KaWYgKCFkZWZpbmVkKCdNQl9DQVNFX0xPV0VSJykpIHsKZGVmaW5lKCdNQl9DQVNFX0xPV0VSJywgMSk7Cn0KaWYgKCFkZWZpbmVkKCdNQl9DQVNFX1RJVExFJykpIHsKZGVmaW5lKCdNQl9DQVNFX1RJVExFJywgMik7Cn0KPD9waHAKCgoKCgoKCgoKCnVzZSBTeW1mb255XFBvbHlmaWxsXE1ic3RyaW5nIGFzIHA7CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF9lbmNvZGluZycpKSB7CmZ1bmN0aW9uIG1iX2NvbnZlcnRfZW5jb2RpbmcoYXJyYXl8c3RyaW5nfG51bGwgJHN0cmluZywgP3N0cmluZyAkdG9fZW5jb2RpbmcsIGFycmF5fHN0cmluZ3xudWxsICRmcm9tX2VuY29kaW5nID0gbnVsbCk6IGFycmF5fHN0cmluZ3xmYWxzZSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9jb252ZXJ0X2VuY29kaW5nKCRzdHJpbmcgPz8gJycsIChzdHJpbmcpICR0b19lbmNvZGluZywgJGZyb21fZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2RlY29kZV9taW1laGVhZGVyJykpIHsKZnVuY3Rpb24gbWJfZGVjb2RlX21pbWVoZWFkZXIoP3N0cmluZyAkc3RyaW5nKTogc3RyaW5nIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2RlY29kZV9taW1laGVhZGVyKChzdHJpbmcpICRzdHJpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2VuY29kZV9taW1laGVhZGVyJykpIHsKZnVuY3Rpb24gbWJfZW5jb2RlX21pbWVoZWFkZXIoP3N0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRjaGFyc2V0ID0gbnVsbCwgP3N0cmluZyAkdHJhbnNmZXJfZW5jb2RpbmcgPSBudWxsLCA/c3RyaW5nICRuZXdsaW5lID0gIlxyXG4iLCA/aW50ICRpbmRlbnQgPSAwKTogc3RyaW5nIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2VuY29kZV9taW1laGVhZGVyKChzdHJpbmcpICRzdHJpbmcsICRjaGFyc2V0LCAkdHJhbnNmZXJfZW5jb2RpbmcsIChzdHJpbmcpICRuZXdsaW5lLCAoaW50KSAkaW5kZW50KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9kZWNvZGVfbnVtZXJpY2VudGl0eScpKSB7CmZ1bmN0aW9uIG1iX2RlY29kZV9udW1lcmljZW50aXR5KD9zdHJpbmcgJHN0cmluZywgYXJyYXkgJG1hcCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2RlY29kZV9udW1lcmljZW50aXR5KChzdHJpbmcpICRzdHJpbmcsICRtYXAsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfZW5jb2RlX251bWVyaWNlbnRpdHknKSkgewpmdW5jdGlvbiBtYl9lbmNvZGVfbnVtZXJpY2VudGl0eSg/c3RyaW5nICRzdHJpbmcsIGFycmF5ICRtYXAsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCwgP2Jvb2wgJGhleCA9IGZhbHNlKTogc3RyaW5nIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2VuY29kZV9udW1lcmljZW50aXR5KChzdHJpbmcpICRzdHJpbmcsICRtYXAsICRlbmNvZGluZywgKGJvb2wpICRoZXgpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2NvbnZlcnRfY2FzZScpKSB7CmZ1bmN0aW9uIG1iX2NvbnZlcnRfY2FzZSg/c3RyaW5nICRzdHJpbmcsID9pbnQgJG1vZGUsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZyB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9jb252ZXJ0X2Nhc2UoKHN0cmluZykgJHN0cmluZywgKGludCkgJG1vZGUsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfaW50ZXJuYWxfZW5jb2RpbmcnKSkgewpmdW5jdGlvbiBtYl9pbnRlcm5hbF9lbmNvZGluZyg/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmd8Ym9vbCB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9pbnRlcm5hbF9lbmNvZGluZygkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2xhbmd1YWdlJykpIHsKZnVuY3Rpb24gbWJfbGFuZ3VhZ2UoP3N0cmluZyAkbGFuZ3VhZ2UgPSBudWxsKTogc3RyaW5nfGJvb2wgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfbGFuZ3VhZ2UoJGxhbmd1YWdlKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9saXN0X2VuY29kaW5ncycpKSB7CmZ1bmN0aW9uIG1iX2xpc3RfZW5jb2RpbmdzKCk6IGFycmF5IHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2xpc3RfZW5jb2RpbmdzKCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfZW5jb2RpbmdfYWxpYXNlcycpKSB7CmZ1bmN0aW9uIG1iX2VuY29kaW5nX2FsaWFzZXMoP3N0cmluZyAkZW5jb2RpbmcpOiBhcnJheSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9lbmNvZGluZ19hbGlhc2VzKChzdHJpbmcpICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfY2hlY2tfZW5jb2RpbmcnKSkgewpmdW5jdGlvbiBtYl9jaGVja19lbmNvZGluZyhhcnJheXxzdHJpbmd8bnVsbCAkdmFsdWUgPSBudWxsLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBib29sIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2NoZWNrX2VuY29kaW5nKCR2YWx1ZSwgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9kZXRlY3RfZW5jb2RpbmcnKSkgewpmdW5jdGlvbiBtYl9kZXRlY3RfZW5jb2RpbmcoP3N0cmluZyAkc3RyaW5nLCBhcnJheXxzdHJpbmd8bnVsbCAkZW5jb2RpbmdzID0gbnVsbCwgP2Jvb2wgJHN0cmljdCA9IGZhbHNlKTogc3RyaW5nfGZhbHNlIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2RldGVjdF9lbmNvZGluZygoc3RyaW5nKSAkc3RyaW5nLCAkZW5jb2RpbmdzLCAoYm9vbCkgJHN0cmljdCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfZGV0ZWN0X29yZGVyJykpIHsKZnVuY3Rpb24gbWJfZGV0ZWN0X29yZGVyKGFycmF5fHN0cmluZ3xudWxsICRlbmNvZGluZyA9IG51bGwpOiBhcnJheXxib29sIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2RldGVjdF9vcmRlcigkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3BhcnNlX3N0cicpKSB7CmZ1bmN0aW9uIG1iX3BhcnNlX3N0cig/c3RyaW5nICRzdHJpbmcsICYkcmVzdWx0ID0gW10pOiBib29sIHsgcGFyc2Vfc3RyKChzdHJpbmcpICRzdHJpbmcsICRyZXN1bHQpOyByZXR1cm4gKGJvb2wpICRyZXN1bHQ7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RybGVuJykpIHsKZnVuY3Rpb24gbWJfc3RybGVuKD9zdHJpbmcgJHN0cmluZywgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogaW50IHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cmxlbigoc3RyaW5nKSAkc3RyaW5nLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cnBvcycpKSB7CmZ1bmN0aW9uIG1iX3N0cnBvcyg/c3RyaW5nICRoYXlzdGFjaywgP3N0cmluZyAkbmVlZGxlLCA/aW50ICRvZmZzZXQgPSAwLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBpbnR8ZmFsc2UgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RycG9zKChzdHJpbmcpICRoYXlzdGFjaywgKHN0cmluZykgJG5lZWRsZSwgKGludCkgJG9mZnNldCwgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJ0b2xvd2VyJykpIHsKZnVuY3Rpb24gbWJfc3RydG9sb3dlcig/c3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZyB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJ0b2xvd2VyKChzdHJpbmcpICRzdHJpbmcsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RydG91cHBlcicpKSB7CmZ1bmN0aW9uIG1iX3N0cnRvdXBwZXIoP3N0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RydG91cHBlcigoc3RyaW5nKSAkc3RyaW5nLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N1YnN0aXR1dGVfY2hhcmFjdGVyJykpIHsKZnVuY3Rpb24gbWJfc3Vic3RpdHV0ZV9jaGFyYWN0ZXIoc3RyaW5nfGludHxudWxsICRzdWJzdGl0dXRlX2NoYXJhY3RlciA9IG51bGwpOiBzdHJpbmd8aW50fGJvb2wgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3Vic3RpdHV0ZV9jaGFyYWN0ZXIoJHN1YnN0aXR1dGVfY2hhcmFjdGVyKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdWJzdHInKSkgewpmdW5jdGlvbiBtYl9zdWJzdHIoP3N0cmluZyAkc3RyaW5nLCA/aW50ICRzdGFydCwgP2ludCAkbGVuZ3RoID0gbnVsbCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N1YnN0cigoc3RyaW5nKSAkc3RyaW5nLCAoaW50KSAkc3RhcnQsICRsZW5ndGgsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RyaXBvcycpKSB7CmZ1bmN0aW9uIG1iX3N0cmlwb3MoP3N0cmluZyAkaGF5c3RhY2ssID9zdHJpbmcgJG5lZWRsZSwgP2ludCAkb2Zmc2V0ID0gMCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogaW50fGZhbHNlIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cmlwb3MoKHN0cmluZykgJGhheXN0YWNrLCAoc3RyaW5nKSAkbmVlZGxlLCAoaW50KSAkb2Zmc2V0LCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cmlzdHInKSkgewpmdW5jdGlvbiBtYl9zdHJpc3RyKD9zdHJpbmcgJGhheXN0YWNrLCA/c3RyaW5nICRuZWVkbGUsID9ib29sICRiZWZvcmVfbmVlZGxlID0gZmFsc2UsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZ3xmYWxzZSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJpc3RyKChzdHJpbmcpICRoYXlzdGFjaywgKHN0cmluZykgJG5lZWRsZSwgKGJvb2wpICRiZWZvcmVfbmVlZGxlLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cnJjaHInKSkgewpmdW5jdGlvbiBtYl9zdHJyY2hyKD9zdHJpbmcgJGhheXN0YWNrLCA/c3RyaW5nICRuZWVkbGUsID9ib29sICRiZWZvcmVfbmVlZGxlID0gZmFsc2UsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZ3xmYWxzZSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJyY2hyKChzdHJpbmcpICRoYXlzdGFjaywgKHN0cmluZykgJG5lZWRsZSwgKGJvb2wpICRiZWZvcmVfbmVlZGxlLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cnJpY2hyJykpIHsKZnVuY3Rpb24gbWJfc3RycmljaHIoP3N0cmluZyAkaGF5c3RhY2ssID9zdHJpbmcgJG5lZWRsZSwgP2Jvb2wgJGJlZm9yZV9uZWVkbGUgPSBmYWxzZSwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nfGZhbHNlIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cnJpY2hyKChzdHJpbmcpICRoYXlzdGFjaywgKHN0cmluZykgJG5lZWRsZSwgKGJvb2wpICRiZWZvcmVfbmVlZGxlLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cnJpcG9zJykpIHsKZnVuY3Rpb24gbWJfc3Rycmlwb3MoP3N0cmluZyAkaGF5c3RhY2ssID9zdHJpbmcgJG5lZWRsZSwgP2ludCAkb2Zmc2V0ID0gMCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogaW50fGZhbHNlIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cnJpcG9zKChzdHJpbmcpICRoYXlzdGFjaywgKHN0cmluZykgJG5lZWRsZSwgKGludCkgJG9mZnNldCwgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJycG9zJykpIHsKZnVuY3Rpb24gbWJfc3RycnBvcyg/c3RyaW5nICRoYXlzdGFjaywgP3N0cmluZyAkbmVlZGxlLCA/aW50ICRvZmZzZXQgPSAwLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBpbnR8ZmFsc2UgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RycnBvcygoc3RyaW5nKSAkaGF5c3RhY2ssIChzdHJpbmcpICRuZWVkbGUsIChpbnQpICRvZmZzZXQsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3Ryc3RyJykpIHsKZnVuY3Rpb24gbWJfc3Ryc3RyKD9zdHJpbmcgJGhheXN0YWNrLCA/c3RyaW5nICRuZWVkbGUsID9ib29sICRiZWZvcmVfbmVlZGxlID0gZmFsc2UsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZ3xmYWxzZSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJzdHIoKHN0cmluZykgJGhheXN0YWNrLCAoc3RyaW5nKSAkbmVlZGxlLCAoYm9vbCkgJGJlZm9yZV9uZWVkbGUsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfZ2V0X2luZm8nKSkgewpmdW5jdGlvbiBtYl9nZXRfaW5mbyg/c3RyaW5nICR0eXBlID0gJ2FsbCcpOiBhcnJheXxzdHJpbmd8aW50fGZhbHNlfG51bGwgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfZ2V0X2luZm8oKHN0cmluZykgJHR5cGUpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2h0dHBfb3V0cHV0JykpIHsKZnVuY3Rpb24gbWJfaHR0cF9vdXRwdXQoP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nfGJvb2wgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfaHR0cF9vdXRwdXQoJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJ3aWR0aCcpKSB7CmZ1bmN0aW9uIG1iX3N0cndpZHRoKD9zdHJpbmcgJHN0cmluZywgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogaW50IHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cndpZHRoKChzdHJpbmcpICRzdHJpbmcsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3Vic3RyX2NvdW50JykpIHsKZnVuY3Rpb24gbWJfc3Vic3RyX2NvdW50KD9zdHJpbmcgJGhheXN0YWNrLCA/c3RyaW5nICRuZWVkbGUsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IGludCB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdWJzdHJfY291bnQoKHN0cmluZykgJGhheXN0YWNrLCAoc3RyaW5nKSAkbmVlZGxlLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX291dHB1dF9oYW5kbGVyJykpIHsKZnVuY3Rpb24gbWJfb3V0cHV0X2hhbmRsZXIoP3N0cmluZyAkc3RyaW5nLCA/aW50ICRzdGF0dXMpOiBzdHJpbmcgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfb3V0cHV0X2hhbmRsZXIoKHN0cmluZykgJHN0cmluZywgKGludCkgJHN0YXR1cyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfaHR0cF9pbnB1dCcpKSB7CmZ1bmN0aW9uIG1iX2h0dHBfaW5wdXQoP3N0cmluZyAkdHlwZSA9IG51bGwpOiBhcnJheXxzdHJpbmd8ZmFsc2UgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfaHR0cF9pbnB1dCgkdHlwZSk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2NvbnZlcnRfdmFyaWFibGVzJykpIHsKZnVuY3Rpb24gbWJfY29udmVydF92YXJpYWJsZXMoP3N0cmluZyAkdG9fZW5jb2RpbmcsIGFycmF5fHN0cmluZ3xudWxsICRmcm9tX2VuY29kaW5nLCBtaXhlZCAmJHZhciwgbWl4ZWQgJi4uLiR2YXJzKTogc3RyaW5nfGZhbHNlIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2NvbnZlcnRfdmFyaWFibGVzKChzdHJpbmcpICR0b19lbmNvZGluZywgJGZyb21fZW5jb2RpbmcgPz8gJycsICR2YXIsIC4uLiR2YXJzKTsgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfb3JkJykpIHsKZnVuY3Rpb24gbWJfb3JkKD9zdHJpbmcgJHN0cmluZywgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogaW50fGZhbHNlIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX29yZCgoc3RyaW5nKSAkc3RyaW5nLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2NocicpKSB7CmZ1bmN0aW9uIG1iX2Nocig/aW50ICRjb2RlcG9pbnQsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZ3xmYWxzZSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9jaHIoKGludCkgJGNvZGVwb2ludCwgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zY3J1YicpKSB7CmZ1bmN0aW9uIG1iX3NjcnViKD9zdHJpbmcgJHN0cmluZywgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nIHsgJGVuY29kaW5nID8/PSBtYl9pbnRlcm5hbF9lbmNvZGluZygpOyByZXR1cm4gbWJfY29udmVydF9lbmNvZGluZygoc3RyaW5nKSAkc3RyaW5nLCAkZW5jb2RpbmcsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RyX3NwbGl0JykpIHsKZnVuY3Rpb24gbWJfc3RyX3NwbGl0KD9zdHJpbmcgJHN0cmluZywgP2ludCAkbGVuZ3RoID0gMSwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogYXJyYXkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RyX3NwbGl0KChzdHJpbmcpICRzdHJpbmcsIChpbnQpICRsZW5ndGgsICRlbmNvZGluZyk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cl9wYWQnKSkgewpmdW5jdGlvbiBtYl9zdHJfcGFkKHN0cmluZyAkc3RyaW5nLCBpbnQgJGxlbmd0aCwgc3RyaW5nICRwYWRfc3RyaW5nID0gJyAnLCBpbnQgJHBhZF90eXBlID0gU1RSX1BBRF9SSUdIVCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cl9wYWQoJHN0cmluZywgJGxlbmd0aCwgJHBhZF9zdHJpbmcsICRwYWRfdHlwZSwgJGVuY29kaW5nKTsgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfdWNmaXJzdCcpKSB7CmZ1bmN0aW9uIG1iX3VjZmlyc3Qoc3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZyB7IHJldHVybiBwXE1ic3RyaW5nOjptYl91Y2ZpcnN0KCRzdHJpbmcsICRlbmNvZGluZyk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2xjZmlyc3QnKSkgewpmdW5jdGlvbiBtYl9sY2ZpcnN0KHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfbGNmaXJzdCgkc3RyaW5nLCAkZW5jb2RpbmcpOyB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl90cmltJykpIHsKZnVuY3Rpb24gbWJfdHJpbShzdHJpbmcgJHN0cmluZywgP3N0cmluZyAkY2hhcmFjdGVycyA9IG51bGwsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZyB7IHJldHVybiBwXE1ic3RyaW5nOjptYl90cmltKCRzdHJpbmcsICRjaGFyYWN0ZXJzLCAkZW5jb2RpbmcpOyB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9sdHJpbScpKSB7CmZ1bmN0aW9uIG1iX2x0cmltKHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRjaGFyYWN0ZXJzID0gbnVsbCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2x0cmltKCRzdHJpbmcsICRjaGFyYWN0ZXJzLCAkZW5jb2RpbmcpOyB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9ydHJpbScpKSB7CmZ1bmN0aW9uIG1iX3J0cmltKHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRjaGFyYWN0ZXJzID0gbnVsbCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3J0cmltKCRzdHJpbmcsICRjaGFyYWN0ZXJzLCAkZW5jb2RpbmcpOyB9Cn0KCmlmIChleHRlbnNpb25fbG9hZGVkKCdtYnN0cmluZycpKSB7CnJldHVybjsKfQoKaWYgKCFkZWZpbmVkKCdNQl9DQVNFX1VQUEVSJykpIHsKZGVmaW5lKCdNQl9DQVNFX1VQUEVSJywgMCk7Cn0KaWYgKCFkZWZpbmVkKCdNQl9DQVNFX0xPV0VSJykpIHsKZGVmaW5lKCdNQl9DQVNFX0xPV0VSJywgMSk7Cn0KaWYgKCFkZWZpbmVkKCdNQl9DQVNFX1RJVExFJykpIHsKZGVmaW5lKCdNQl9DQVNFX1RJVExFJywgMik7Cn0KCkNvcHlyaWdodCAoYykgMjAxOC1wcmVzZW50IEZhYmllbiBQb3RlbmNpZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcUG9seWZpbGxcUGhwNzM7CgoKCgoKCgpmaW5hbCBjbGFzcyBQaHA3Mwp7CnB1YmxpYyBzdGF0aWMgJHN0YXJ0QXQgPSAxNTMzNDYyNjAzOwoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGhydGltZSgkYXNOdW0gPSBmYWxzZSkKewokbnMgPSBtaWNyb3RpbWUoZmFsc2UpOwokcyA9IHN1YnN0cigkbnMsIDExKSAtIHNlbGY6OiRzdGFydEF0OwokbnMgPSAxRTkgKiAoZmxvYXQpICRuczsKCmlmICgkYXNOdW0pIHsKJG5zICs9ICRzICogMUU5OwoKcmV0dXJuIFxQSFBfSU5UX1NJWkUgPT09IDQgPyAkbnMgOiAoaW50KSAkbnM7Cn0KCnJldHVybiBbJHMsIChpbnQpICRuc107Cn0KfQo8P3BocAoKCgoKCgoKCgoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDcwMzAwKSB7CmNsYXNzIEpzb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24Kewp9Cn0KPD9waHAKCgoKCgoKCgoKCnVzZSBTeW1mb255XFBvbHlmaWxsXFBocDczIGFzIHA7CgppZiAoXFBIUF9WRVJTSU9OX0lEID49IDcwMzAwKSB7CnJldHVybjsKfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2lzX2NvdW50YWJsZScpKSB7CmZ1bmN0aW9uIGlzX2NvdW50YWJsZSgkdmFsdWUpIHsgcmV0dXJuIGlzX2FycmF5KCR2YWx1ZSkgfHwgJHZhbHVlIGluc3RhbmNlb2YgQ291bnRhYmxlIHx8ICR2YWx1ZSBpbnN0YW5jZW9mIFJlc291cmNlQnVuZGxlIHx8ICR2YWx1ZSBpbnN0YW5jZW9mIFNpbXBsZVhtbEVsZW1lbnQ7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnaHJ0aW1lJykpIHsKcmVxdWlyZV9vbmNlIF9fRElSX18uJy9QaHA3My5waHAnOwpwXFBocDczOjokc3RhcnRBdCA9IChpbnQpIG1pY3JvdGltZSh0cnVlKTsKZnVuY3Rpb24gaHJ0aW1lKCRhc19udW1iZXIgPSBmYWxzZSkgeyByZXR1cm4gcFxQaHA3Mzo6aHJ0aW1lKCRhc19udW1iZXIpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2FycmF5X2tleV9maXJzdCcpKSB7CmZ1bmN0aW9uIGFycmF5X2tleV9maXJzdChhcnJheSAkYXJyYXkpIHsgZm9yZWFjaCAoJGFycmF5IGFzICRrZXkgPT4gJHZhbHVlKSB7IHJldHVybiAka2V5OyB9IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnYXJyYXlfa2V5X2xhc3QnKSkgewpmdW5jdGlvbiBhcnJheV9rZXlfbGFzdChhcnJheSAkYXJyYXkpIHsgcmV0dXJuIGtleShhcnJheV9zbGljZSgkYXJyYXksIC0xLCAxLCB0cnVlKSk7IH0KfQoKQ29weXJpZ2h0IChjKSAyMDIwLXByZXNlbnQgRmFiaWVuIFBvdGVuY2llcgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAp0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KCjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxQb2x5ZmlsbFxQaHA4MDsKCgoKCgoKCgpmaW5hbCBjbGFzcyBQaHA4MAp7CnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZmRpdihmbG9hdCAkZGl2aWRlbmQsIGZsb2F0ICRkaXZpc29yKTogZmxvYXQKewpyZXR1cm4gQCgkZGl2aWRlbmQgLyAkZGl2aXNvcik7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X2RlYnVnX3R5cGUoJHZhbHVlKTogc3RyaW5nCnsKc3dpdGNoICh0cnVlKSB7CmNhc2UgbnVsbCA9PT0gJHZhbHVlOiByZXR1cm4gJ251bGwnOwpjYXNlIFxpc19ib29sKCR2YWx1ZSk6IHJldHVybiAnYm9vbCc7CmNhc2UgXGlzX3N0cmluZygkdmFsdWUpOiByZXR1cm4gJ3N0cmluZyc7CmNhc2UgXGlzX2FycmF5KCR2YWx1ZSk6IHJldHVybiAnYXJyYXknOwpjYXNlIFxpc19pbnQoJHZhbHVlKTogcmV0dXJuICdpbnQnOwpjYXNlIFxpc19mbG9hdCgkdmFsdWUpOiByZXR1cm4gJ2Zsb2F0JzsKY2FzZSBcaXNfb2JqZWN0KCR2YWx1ZSk6IGJyZWFrOwpjYXNlICR2YWx1ZSBpbnN0YW5jZW9mIFxfX1BIUF9JbmNvbXBsZXRlX0NsYXNzOiByZXR1cm4gJ19fUEhQX0luY29tcGxldGVfQ2xhc3MnOwpkZWZhdWx0OgppZiAobnVsbCA9PT0gJHR5cGUgPSBAZ2V0X3Jlc291cmNlX3R5cGUoJHZhbHVlKSkgewpyZXR1cm4gJ3Vua25vd24nOwp9CgppZiAoJ1Vua25vd24nID09PSAkdHlwZSkgewokdHlwZSA9ICdjbG9zZWQnOwp9CgpyZXR1cm4gInJlc291cmNlICgkdHlwZSkiOwp9CgokY2xhc3MgPSBcZ2V0X2NsYXNzKCR2YWx1ZSk7CgppZiAoZmFsc2UgPT09IHN0cnBvcygkY2xhc3MsICdAJykpIHsKcmV0dXJuICRjbGFzczsKfQoKcmV0dXJuIChnZXRfcGFyZW50X2NsYXNzKCRjbGFzcykgPzoga2V5KGNsYXNzX2ltcGxlbWVudHMoJGNsYXNzKSkgPzogJ2NsYXNzJykuJ0Bhbm9ueW1vdXMnOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9yZXNvdXJjZV9pZCgkcmVzKTogaW50CnsKaWYgKCFcaXNfcmVzb3VyY2UoJHJlcykgJiYgbnVsbCA9PT0gQGdldF9yZXNvdXJjZV90eXBlKCRyZXMpKSB7CnRocm93IG5ldyBcVHlwZUVycm9yKFxzcHJpbnRmKCdBcmd1bWVudCAxIHBhc3NlZCB0byBnZXRfcmVzb3VyY2VfaWQoKSBtdXN0IGJlIG9mIHRoZSB0eXBlIHJlc291cmNlLCAlcyBnaXZlbicsIGdldF9kZWJ1Z190eXBlKCRyZXMpKSk7Cn0KCnJldHVybiAoaW50KSAkcmVzOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByZWdfbGFzdF9lcnJvcl9tc2coKTogc3RyaW5nCnsKc3dpdGNoIChwcmVnX2xhc3RfZXJyb3IoKSkgewpjYXNlIFxQUkVHX0lOVEVSTkFMX0VSUk9SOgpyZXR1cm4gJ0ludGVybmFsIGVycm9yJzsKY2FzZSBcUFJFR19CQURfVVRGOF9FUlJPUjoKcmV0dXJuICdNYWxmb3JtZWQgVVRGLTggY2hhcmFjdGVycywgcG9zc2libHkgaW5jb3JyZWN0bHkgZW5jb2RlZCc7CmNhc2UgXFBSRUdfQkFEX1VURjhfT0ZGU0VUX0VSUk9SOgpyZXR1cm4gJ1RoZSBvZmZzZXQgZGlkIG5vdCBjb3JyZXNwb25kIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSB2YWxpZCBVVEYtOCBjb2RlIHBvaW50JzsKY2FzZSBcUFJFR19CQUNLVFJBQ0tfTElNSVRfRVJST1I6CnJldHVybiAnQmFja3RyYWNrIGxpbWl0IGV4aGF1c3RlZCc7CmNhc2UgXFBSRUdfUkVDVVJTSU9OX0xJTUlUX0VSUk9SOgpyZXR1cm4gJ1JlY3Vyc2lvbiBsaW1pdCBleGhhdXN0ZWQnOwpjYXNlIFxQUkVHX0pJVF9TVEFDS0xJTUlUX0VSUk9SOgpyZXR1cm4gJ0pJVCBzdGFjayBsaW1pdCBleGhhdXN0ZWQnOwpjYXNlIFxQUkVHX05PX0VSUk9SOgpyZXR1cm4gJ05vIGVycm9yJzsKZGVmYXVsdDoKcmV0dXJuICdVbmtub3duIGVycm9yJzsKfQp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN0cl9jb250YWlucyhzdHJpbmcgJGhheXN0YWNrLCBzdHJpbmcgJG5lZWRsZSk6IGJvb2wKewpyZXR1cm4gJycgPT09ICRuZWVkbGUgfHwgZmFsc2UgIT09IHN0cnBvcygkaGF5c3RhY2ssICRuZWVkbGUpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN0cl9zdGFydHNfd2l0aChzdHJpbmcgJGhheXN0YWNrLCBzdHJpbmcgJG5lZWRsZSk6IGJvb2wKewpyZXR1cm4gMCA9PT0gc3RybmNtcCgkaGF5c3RhY2ssICRuZWVkbGUsIFxzdHJsZW4oJG5lZWRsZSkpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN0cl9lbmRzX3dpdGgoc3RyaW5nICRoYXlzdGFjaywgc3RyaW5nICRuZWVkbGUpOiBib29sCnsKaWYgKCcnID09PSAkbmVlZGxlIHx8ICRuZWVkbGUgPT09ICRoYXlzdGFjaykgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKCcnID09PSAkaGF5c3RhY2spIHsKcmV0dXJuIGZhbHNlOwp9CgokbmVlZGxlTGVuZ3RoID0gXHN0cmxlbigkbmVlZGxlKTsKCnJldHVybiAkbmVlZGxlTGVuZ3RoIDw9IFxzdHJsZW4oJGhheXN0YWNrKSAmJiAwID09PSBzdWJzdHJfY29tcGFyZSgkaGF5c3RhY2ssICRuZWVkbGUsIC0kbmVlZGxlTGVuZ3RoKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxQb2x5ZmlsbFxQaHA4MDsKCgoKCgoKY2xhc3MgUGhwVG9rZW4gaW1wbGVtZW50cyBcU3RyaW5nYWJsZQp7CgoKCnB1YmxpYyAkaWQ7CgoKCgpwdWJsaWMgJHRleHQ7CgoKCgpwdWJsaWMgJGxpbmU7CgoKCgpwdWJsaWMgJHBvczsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChpbnQgJGlkLCBzdHJpbmcgJHRleHQsIGludCAkbGluZSA9IC0xLCBpbnQgJHBvc2l0aW9uID0gLTEpCnsKJHRoaXMtPmlkID0gJGlkOwokdGhpcy0+dGV4dCA9ICR0ZXh0OwokdGhpcy0+bGluZSA9ICRsaW5lOwokdGhpcy0+cG9zID0gJHBvc2l0aW9uOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0VG9rZW5OYW1lKCk6ID9zdHJpbmcKewppZiAoJ1VOS05PV04nID09PSAkbmFtZSA9IHRva2VuX25hbWUoJHRoaXMtPmlkKSkgewokbmFtZSA9IFxzdHJsZW4oJHRoaXMtPnRleHQpID4gMSB8fCBcb3JkKCR0aGlzLT50ZXh0KSA8IDMyID8gbnVsbCA6ICR0aGlzLT50ZXh0Owp9CgpyZXR1cm4gJG5hbWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpcygka2luZCk6IGJvb2wKewpmb3JlYWNoICgoYXJyYXkpICRraW5kIGFzICR2YWx1ZSkgewppZiAoXGluX2FycmF5KCR2YWx1ZSwgWyR0aGlzLT5pZCwgJHRoaXMtPnRleHRdLCB0cnVlKSkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0lnbm9yYWJsZSgpOiBib29sCnsKcmV0dXJuIFxpbl9hcnJheSgkdGhpcy0+aWQsIFtcVF9XSElURVNQQUNFLCBcVF9DT01NRU5ULCBcVF9ET0NfQ09NTUVOVCwgXFRfT1BFTl9UQUddLCB0cnVlKTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCnsKcmV0dXJuIChzdHJpbmcpICR0aGlzLT50ZXh0Owp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHRva2VuaXplKHN0cmluZyAkY29kZSwgaW50ICRmbGFncyA9IDApOiBhcnJheQp7CiRsaW5lID0gMTsKJHBvc2l0aW9uID0gMDsKJHRva2VucyA9IHRva2VuX2dldF9hbGwoJGNvZGUsICRmbGFncyk7CmZvcmVhY2ggKCR0b2tlbnMgYXMgJGluZGV4ID0+ICR0b2tlbikgewppZiAoXGlzX3N0cmluZygkdG9rZW4pKSB7CiRpZCA9IFxvcmQoJHRva2VuKTsKJHRleHQgPSAkdG9rZW47Cn0gZWxzZSB7ClskaWQsICR0ZXh0LCAkbGluZV0gPSAkdG9rZW47Cn0KJHRva2Vuc1skaW5kZXhdID0gbmV3IHN0YXRpYygkaWQsICR0ZXh0LCAkbGluZSwgJHBvc2l0aW9uKTsKJHBvc2l0aW9uICs9IFxzdHJsZW4oJHRleHQpOwp9CgpyZXR1cm4gJHRva2VuczsKfQp9Cjw/cGhwCgoKCgoKCgoKCgojW0F0dHJpYnV0ZShBdHRyaWJ1dGU6OlRBUkdFVF9DTEFTUyldCmZpbmFsIGNsYXNzIEF0dHJpYnV0ZQp7CnB1YmxpYyBjb25zdCBUQVJHRVRfQ0xBU1MgPSAxOwpwdWJsaWMgY29uc3QgVEFSR0VUX0ZVTkNUSU9OID0gMjsKcHVibGljIGNvbnN0IFRBUkdFVF9NRVRIT0QgPSA0OwpwdWJsaWMgY29uc3QgVEFSR0VUX1BST1BFUlRZID0gODsKcHVibGljIGNvbnN0IFRBUkdFVF9DTEFTU19DT05TVEFOVCA9IDE2OwpwdWJsaWMgY29uc3QgVEFSR0VUX1BBUkFNRVRFUiA9IDMyOwpwdWJsaWMgY29uc3QgVEFSR0VUX0FMTCA9IDYzOwpwdWJsaWMgY29uc3QgSVNfUkVQRUFUQUJMRSA9IDY0OwoKCnB1YmxpYyAkZmxhZ3M7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoaW50ICRmbGFncyA9IHNlbGY6OlRBUkdFVF9BTEwpCnsKJHRoaXMtPmZsYWdzID0gJGZsYWdzOwp9Cn0KPD9waHAKCgoKCgoKCgoKCmlmIChcUEhQX1ZFUlNJT05fSUQgPCA4MDAwMCAmJiBleHRlbnNpb25fbG9hZGVkKCd0b2tlbml6ZXInKSkgewpjbGFzcyBQaHBUb2tlbiBleHRlbmRzIFN5bWZvbnlcUG9seWZpbGxcUGhwODBcUGhwVG9rZW4Kewp9Cn0KPD9waHAKCgoKCgoKCgoKCmlmIChcUEhQX1ZFUlNJT05fSUQgPCA4MDAwMCkgewppbnRlcmZhY2UgU3RyaW5nYWJsZQp7CgoKCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDgwMDAwKSB7CmNsYXNzIFVuaGFuZGxlZE1hdGNoRXJyb3IgZXh0ZW5kcyBFcnJvcgp7Cn0KfQo8P3BocAoKCgoKCgoKCgoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDgwMDAwKSB7CmNsYXNzIFZhbHVlRXJyb3IgZXh0ZW5kcyBFcnJvcgp7Cn0KfQo8P3BocAoKCgoKCgoKCgoKdXNlIFN5bWZvbnlcUG9seWZpbGxcUGhwODAgYXMgcDsKCmlmIChcUEhQX1ZFUlNJT05fSUQgPj0gODAwMDApIHsKcmV0dXJuOwp9CgppZiAoIWRlZmluZWQoJ0ZJTFRFUl9WQUxJREFURV9CT09MJykgJiYgZGVmaW5lZCgnRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4nKSkgewpkZWZpbmUoJ0ZJTFRFUl9WQUxJREFURV9CT09MJywgXEZJTFRFUl9WQUxJREFURV9CT09MRUFOKTsKfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2ZkaXYnKSkgewpmdW5jdGlvbiBmZGl2KGZsb2F0ICRudW0xLCBmbG9hdCAkbnVtMik6IGZsb2F0IHsgcmV0dXJuIHBcUGhwODA6OmZkaXYoJG51bTEsICRudW0yKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdwcmVnX2xhc3RfZXJyb3JfbXNnJykpIHsKZnVuY3Rpb24gcHJlZ19sYXN0X2Vycm9yX21zZygpOiBzdHJpbmcgeyByZXR1cm4gcFxQaHA4MDo6cHJlZ19sYXN0X2Vycm9yX21zZygpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3N0cl9jb250YWlucycpKSB7CmZ1bmN0aW9uIHN0cl9jb250YWlucyg/c3RyaW5nICRoYXlzdGFjaywgP3N0cmluZyAkbmVlZGxlKTogYm9vbCB7IHJldHVybiBwXFBocDgwOjpzdHJfY29udGFpbnMoJGhheXN0YWNrID8/ICcnLCAkbmVlZGxlID8/ICcnKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdzdHJfc3RhcnRzX3dpdGgnKSkgewpmdW5jdGlvbiBzdHJfc3RhcnRzX3dpdGgoP3N0cmluZyAkaGF5c3RhY2ssID9zdHJpbmcgJG5lZWRsZSk6IGJvb2wgeyByZXR1cm4gcFxQaHA4MDo6c3RyX3N0YXJ0c193aXRoKCRoYXlzdGFjayA/PyAnJywgJG5lZWRsZSA/PyAnJyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnc3RyX2VuZHNfd2l0aCcpKSB7CmZ1bmN0aW9uIHN0cl9lbmRzX3dpdGgoP3N0cmluZyAkaGF5c3RhY2ssID9zdHJpbmcgJG5lZWRsZSk6IGJvb2wgeyByZXR1cm4gcFxQaHA4MDo6c3RyX2VuZHNfd2l0aCgkaGF5c3RhY2sgPz8gJycsICRuZWVkbGUgPz8gJycpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dldF9kZWJ1Z190eXBlJykpIHsKZnVuY3Rpb24gZ2V0X2RlYnVnX3R5cGUoJHZhbHVlKTogc3RyaW5nIHsgcmV0dXJuIHBcUGhwODA6OmdldF9kZWJ1Z190eXBlKCR2YWx1ZSk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ2V0X3Jlc291cmNlX2lkJykpIHsKZnVuY3Rpb24gZ2V0X3Jlc291cmNlX2lkKCRyZXNvdXJjZSk6IGludCB7IHJldHVybiBwXFBocDgwOjpnZXRfcmVzb3VyY2VfaWQoJHJlc291cmNlKTsgfQp9CgpDb3B5cmlnaHQgKGMpIDIwMjEtcHJlc2VudCBGYWJpZW4gUG90ZW5jaWVyCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCnRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XFBvbHlmaWxsXFBocDgxOwoKCgoKCgpmaW5hbCBjbGFzcyBQaHA4MQp7CnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYXJyYXlfaXNfbGlzdChhcnJheSAkYXJyYXkpOiBib29sCnsKaWYgKFtdID09PSAkYXJyYXkgfHwgJGFycmF5ID09PSBhcnJheV92YWx1ZXMoJGFycmF5KSkgewpyZXR1cm4gdHJ1ZTsKfQoKJG5leHRLZXkgPSAtMTsKCmZvcmVhY2ggKCRhcnJheSBhcyAkayA9PiAkdikgewppZiAoJGsgIT09ICsrJG5leHRLZXkpIHsKcmV0dXJuIGZhbHNlOwp9Cn0KCnJldHVybiB0cnVlOwp9Cn0KPD9waHAKCgoKCgoKCgoKCmlmIChcUEhQX1ZFUlNJT05fSUQgPj0gNzA0MDAgJiYgZXh0ZW5zaW9uX2xvYWRlZCgnY3VybCcpKSB7CgoKCmNsYXNzIENVUkxTdHJpbmdGaWxlIGV4dGVuZHMgQ1VSTEZpbGUKewpwcml2YXRlICRkYXRhOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkZGF0YSwgc3RyaW5nICRwb3N0bmFtZSwgc3RyaW5nICRtaW1lID0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpCnsKJHRoaXMtPmRhdGEgPSAkZGF0YTsKcGFyZW50OjpfX2NvbnN0cnVjdCgnZGF0YTovL2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsJy5iYXNlNjRfZW5jb2RlKCRkYXRhKSwgJG1pbWUsICRwb3N0bmFtZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX3NldChzdHJpbmcgJG5hbWUsICR2YWx1ZSk6IHZvaWQKewppZiAoJ2RhdGEnICE9PSAkbmFtZSkgewokdGhpcy0+JG5hbWUgPSAkdmFsdWU7CgpyZXR1cm47Cn0KCmlmIChpc19vYmplY3QoJHZhbHVlKSA/ICFtZXRob2RfZXhpc3RzKCR2YWx1ZSwgJ19fdG9TdHJpbmcnKSA6ICFpc19zY2FsYXIoJHZhbHVlKSkgewp0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgYXNzaWduICcuZ2V0dHlwZSgkdmFsdWUpLicgdG8gcHJvcGVydHkgQ1VSTFN0cmluZ0ZpbGU6OiRkYXRhIG9mIHR5cGUgc3RyaW5nJyk7Cn0KCiR0aGlzLT5uYW1lID0gJ2RhdGE6Ly9hcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LCcuYmFzZTY0X2VuY29kZSgkdmFsdWUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gX19pc3NldChzdHJpbmcgJG5hbWUpOiBib29sCnsKcmV0dXJuIGlzc2V0KCR0aGlzLT4kbmFtZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiAmX19nZXQoc3RyaW5nICRuYW1lKQp7CnJldHVybiAkdGhpcy0+JG5hbWU7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgppZiAoXFBIUF9WRVJTSU9OX0lEIDwgODAxMDApIHsKI1tBdHRyaWJ1dGUoQXR0cmlidXRlOjpUQVJHRVRfTUVUSE9EKV0KZmluYWwgY2xhc3MgUmV0dXJuVHlwZVdpbGxDaGFuZ2UKewpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgp1c2UgU3ltZm9ueVxQb2x5ZmlsbFxQaHA4MSBhcyBwOwoKaWYgKFxQSFBfVkVSU0lPTl9JRCA+PSA4MDEwMCkgewpyZXR1cm47Cn0KCmlmIChkZWZpbmVkKCdNWVNRTElfUkVGUkVTSF9TTEFWRScpICYmICFkZWZpbmVkKCdNWVNRTElfUkVGUkVTSF9SRVBMSUNBJykpIHsKZGVmaW5lKCdNWVNRTElfUkVGUkVTSF9SRVBMSUNBJywgNjQpOwp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnYXJyYXlfaXNfbGlzdCcpKSB7CmZ1bmN0aW9uIGFycmF5X2lzX2xpc3QoYXJyYXkgJGFycmF5KTogYm9vbCB7IHJldHVybiBwXFBocDgxOjphcnJheV9pc19saXN0KCRhcnJheSk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2VudW1fZXhpc3RzJykpIHsKZnVuY3Rpb24gZW51bV9leGlzdHMoc3RyaW5nICRlbnVtLCBib29sICRhdXRvbG9hZCA9IHRydWUpOiBib29sIHsgcmV0dXJuICRhdXRvbG9hZCAmJiBjbGFzc19leGlzdHMoJGVudW0pICYmIGZhbHNlOyB9Cn0KCkNvcHlyaWdodCAoYykgMjAyNC1wcmVzZW50IEZhYmllbiBQb3RlbmNpZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcUG9seWZpbGxcUGhwODQ7CgoKCgoKCgpmaW5hbCBjbGFzcyBQaHA4NAp7CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3VjZmlyc3Qoc3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCkKewppZiAobnVsbCA9PT0gJGVuY29kaW5nKSB7CiRlbmNvZGluZyA9IG1iX2ludGVybmFsX2VuY29kaW5nKCk7Cn0KCnRyeSB7CiR2YWxpZEVuY29kaW5nID0gQG1iX2NoZWNrX2VuY29kaW5nKCcnLCAkZW5jb2RpbmcpOwp9IGNhdGNoIChcVmFsdWVFcnJvciAkZSkgewp0aHJvdyBuZXcgXFZhbHVlRXJyb3IoXHNwcmludGYoJ21iX3VjZmlyc3QoKTogQXJndW1lbnQgIzIgKCRlbmNvZGluZykgbXVzdCBiZSBhIHZhbGlkIGVuY29kaW5nLCAiJXMiIGdpdmVuJywgJGVuY29kaW5nKSk7Cn0KCmlmICghJHZhbGlkRW5jb2RpbmcpIHsKaWYgKDgwMDAwID4gXFBIUF9WRVJTSU9OX0lEKSB7CnRyaWdnZXJfZXJyb3IoXHNwcmludGYoJ21iX3VjZmlyc3QoKTogQXJndW1lbnQgIzIgKCRlbmNvZGluZykgbXVzdCBiZSBhIHZhbGlkIGVuY29kaW5nLCAiJXMiIGdpdmVuJywgJGVuY29kaW5nKSwgXEVfVVNFUl9XQVJOSU5HKTsKCnJldHVybiBmYWxzZTsKfQoKdGhyb3cgbmV3IFxWYWx1ZUVycm9yKFxzcHJpbnRmKCdtYl91Y2ZpcnN0KCk6IEFyZ3VtZW50ICMyICgkZW5jb2RpbmcpIG11c3QgYmUgYSB2YWxpZCBlbmNvZGluZywgIiVzIiBnaXZlbicsICRlbmNvZGluZykpOwp9CgokZmlyc3RDaGFyID0gbWJfc3Vic3RyKCRzdHJpbmcsIDAsIDEsICRlbmNvZGluZyk7CiRmaXJzdENoYXIgPSBtYl9jb252ZXJ0X2Nhc2UoJGZpcnN0Q2hhciwgXE1CX0NBU0VfVElUTEUsICRlbmNvZGluZyk7CgpyZXR1cm4gJGZpcnN0Q2hhci5tYl9zdWJzdHIoJHN0cmluZywgMSwgbnVsbCwgJGVuY29kaW5nKTsKfQoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfbGNmaXJzdChzdHJpbmcgJHN0cmluZywgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKQp7CmlmIChudWxsID09PSAkZW5jb2RpbmcpIHsKJGVuY29kaW5nID0gbWJfaW50ZXJuYWxfZW5jb2RpbmcoKTsKfQoKdHJ5IHsKJHZhbGlkRW5jb2RpbmcgPSBAbWJfY2hlY2tfZW5jb2RpbmcoJycsICRlbmNvZGluZyk7Cn0gY2F0Y2ggKFxWYWx1ZUVycm9yICRlKSB7CnRocm93IG5ldyBcVmFsdWVFcnJvcihcc3ByaW50ZignbWJfbGNmaXJzdCgpOiBBcmd1bWVudCAjMiAoJGVuY29kaW5nKSBtdXN0IGJlIGEgdmFsaWQgZW5jb2RpbmcsICIlcyIgZ2l2ZW4nLCAkZW5jb2RpbmcpKTsKfQoKaWYgKCEkdmFsaWRFbmNvZGluZykgewppZiAoODAwMDAgPiBcUEhQX1ZFUlNJT05fSUQpIHsKdHJpZ2dlcl9lcnJvcihcc3ByaW50ZignbWJfbGNmaXJzdCgpOiBBcmd1bWVudCAjMiAoJGVuY29kaW5nKSBtdXN0IGJlIGEgdmFsaWQgZW5jb2RpbmcsICIlcyIgZ2l2ZW4nLCAkZW5jb2RpbmcpLCBcRV9VU0VSX1dBUk5JTkcpOwoKcmV0dXJuIGZhbHNlOwp9Cgp0aHJvdyBuZXcgXFZhbHVlRXJyb3IoXHNwcmludGYoJ21iX2xjZmlyc3QoKTogQXJndW1lbnQgIzIgKCRlbmNvZGluZykgbXVzdCBiZSBhIHZhbGlkIGVuY29kaW5nLCAiJXMiIGdpdmVuJywgJGVuY29kaW5nKSk7Cn0KCiRmaXJzdENoYXIgPSBtYl9zdWJzdHIoJHN0cmluZywgMCwgMSwgJGVuY29kaW5nKTsKJGZpcnN0Q2hhciA9IG1iX2NvbnZlcnRfY2FzZSgkZmlyc3RDaGFyLCBcTUJfQ0FTRV9MT1dFUiwgJGVuY29kaW5nKTsKCnJldHVybiAkZmlyc3RDaGFyLm1iX3N1YnN0cigkc3RyaW5nLCAxLCBudWxsLCAkZW5jb2RpbmcpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFycmF5X2ZpbmQoYXJyYXkgJGFycmF5LCBjYWxsYWJsZSAkY2FsbGJhY2spCnsKZm9yZWFjaCAoJGFycmF5IGFzICRrZXkgPT4gJHZhbHVlKSB7CmlmICgkY2FsbGJhY2soJHZhbHVlLCAka2V5KSkgewpyZXR1cm4gJHZhbHVlOwp9Cn0KCnJldHVybiBudWxsOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFycmF5X2ZpbmRfa2V5KGFycmF5ICRhcnJheSwgY2FsbGFibGUgJGNhbGxiYWNrKQp7CmZvcmVhY2ggKCRhcnJheSBhcyAka2V5ID0+ICR2YWx1ZSkgewppZiAoJGNhbGxiYWNrKCR2YWx1ZSwgJGtleSkpIHsKcmV0dXJuICRrZXk7Cn0KfQoKcmV0dXJuIG51bGw7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYXJyYXlfYW55KGFycmF5ICRhcnJheSwgY2FsbGFibGUgJGNhbGxiYWNrKTogYm9vbAp7CmZvcmVhY2ggKCRhcnJheSBhcyAka2V5ID0+ICR2YWx1ZSkgewppZiAoJGNhbGxiYWNrKCR2YWx1ZSwgJGtleSkpIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFycmF5X2FsbChhcnJheSAkYXJyYXksIGNhbGxhYmxlICRjYWxsYmFjayk6IGJvb2wKewpmb3JlYWNoICgkYXJyYXkgYXMgJGtleSA9PiAkdmFsdWUpIHsKaWYgKCEkY2FsbGJhY2soJHZhbHVlLCAka2V5KSkgewpyZXR1cm4gZmFsc2U7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnBvdyhmbG9hdCAkbnVtLCBmbG9hdCAkZXhwb25lbnQpOiBmbG9hdAp7CnJldHVybiAkbnVtICoqICRleHBvbmVudDsKfQoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfdHJpbShzdHJpbmcgJHN0cmluZywgP3N0cmluZyAkY2hhcmFjdGVycyA9IG51bGwsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCkKewpyZXR1cm4gc2VsZjo6bWJfaW50ZXJuYWxfdHJpbSgne15bJXNdK3xbJTEkc10rJH1EdScsICRzdHJpbmcsICRjaGFyYWN0ZXJzLCAkZW5jb2RpbmcsIF9fRlVOQ1RJT05fXyk7Cn0KCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2x0cmltKHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRjaGFyYWN0ZXJzID0gbnVsbCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKQp7CnJldHVybiBzZWxmOjptYl9pbnRlcm5hbF90cmltKCd7Xlslc10rfUR1JywgJHN0cmluZywgJGNoYXJhY3RlcnMsICRlbmNvZGluZywgX19GVU5DVElPTl9fKTsKfQoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfcnRyaW0oc3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGNoYXJhY3RlcnMgPSBudWxsLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpCnsKcmV0dXJuIHNlbGY6Om1iX2ludGVybmFsX3RyaW0oJ3tbJXNdKyR9RCcsICRzdHJpbmcsICRjaGFyYWN0ZXJzLCAkZW5jb2RpbmcsIF9fRlVOQ1RJT05fXyk7Cn0KCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBtYl9pbnRlcm5hbF90cmltKHN0cmluZyAkcmVnZXgsIHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRjaGFyYWN0ZXJzLCA/c3RyaW5nICRlbmNvZGluZywgc3RyaW5nICRmdW5jdGlvbikKewppZiAobnVsbCA9PT0gJGVuY29kaW5nKSB7CiRlbmNvZGluZyA9IG1iX2ludGVybmFsX2VuY29kaW5nKCk7Cn0KCnRyeSB7CiR2YWxpZEVuY29kaW5nID0gQG1iX2NoZWNrX2VuY29kaW5nKCcnLCAkZW5jb2RpbmcpOwp9IGNhdGNoIChcVmFsdWVFcnJvciAkZSkgewp0aHJvdyBuZXcgXFZhbHVlRXJyb3IoXHNwcmludGYoJyVzKCk6IEFyZ3VtZW50ICMzICgkZW5jb2RpbmcpIG11c3QgYmUgYSB2YWxpZCBlbmNvZGluZywgIiVzIiBnaXZlbicsICRmdW5jdGlvbiwgJGVuY29kaW5nKSk7Cn0KCmlmICghJHZhbGlkRW5jb2RpbmcpIHsKaWYgKDgwMDAwID4gXFBIUF9WRVJTSU9OX0lEKSB7CnRyaWdnZXJfZXJyb3IoXHNwcmludGYoJyVzKCk6IEFyZ3VtZW50ICMzICgkZW5jb2RpbmcpIG11c3QgYmUgYSB2YWxpZCBlbmNvZGluZywgIiVzIiBnaXZlbicsICRmdW5jdGlvbiwgJGVuY29kaW5nKSwgXEVfVVNFUl9XQVJOSU5HKTsKCnJldHVybiBmYWxzZTsKfQoKdGhyb3cgbmV3IFxWYWx1ZUVycm9yKFxzcHJpbnRmKCclcygpOiBBcmd1bWVudCAjMyAoJGVuY29kaW5nKSBtdXN0IGJlIGEgdmFsaWQgZW5jb2RpbmcsICIlcyIgZ2l2ZW4nLCAkZnVuY3Rpb24sICRlbmNvZGluZykpOwp9CgppZiAoJycgPT09ICRjaGFyYWN0ZXJzKSB7CnJldHVybiBudWxsID09PSAkZW5jb2RpbmcgPyAkc3RyaW5nIDogbWJfY29udmVydF9lbmNvZGluZygkc3RyaW5nLCAkZW5jb2RpbmcpOwp9CgppZiAoJ1VURi04JyA9PT0gJGVuY29kaW5nIHx8IFxpbl9hcnJheShzdHJ0b2xvd2VyKCRlbmNvZGluZyksIFsndXRmLTgnLCAndXRmOCddLCB0cnVlKSkgewokZW5jb2RpbmcgPSAnVVRGLTgnOwp9Cgokc3RyaW5nID0gbWJfY29udmVydF9lbmNvZGluZygkc3RyaW5nLCAnVVRGLTgnLCAkZW5jb2RpbmcpOwoKaWYgKG51bGwgIT09ICRjaGFyYWN0ZXJzKSB7CiRjaGFyYWN0ZXJzID0gbWJfY29udmVydF9lbmNvZGluZygkY2hhcmFjdGVycywgJ1VURi04JywgJGVuY29kaW5nKTsKfQoKaWYgKG51bGwgPT09ICRjaGFyYWN0ZXJzKSB7CiRjaGFyYWN0ZXJzID0gIlxcMCBcZlxuXHJcdFx2XHV7MDBBMH1cdXsxNjgwfVx1ezIwMDB9XHV7MjAwMX1cdXsyMDAyfVx1ezIwMDN9XHV7MjAwNH1cdXsyMDA1fVx1ezIwMDZ9XHV7MjAwN31cdXsyMDA4fVx1ezIwMDl9XHV7MjAwQX1cdXsyMDI4fVx1ezIwMjl9XHV7MjAyRn1cdXsyMDVGfVx1ezMwMDB9XHV7MDA4NX1cdXsxODBFfSI7Cn0gZWxzZSB7CiRjaGFyYWN0ZXJzID0gcHJlZ19xdW90ZSgkY2hhcmFjdGVycyk7Cn0KCiRzdHJpbmcgPSBwcmVnX3JlcGxhY2UoXHNwcmludGYoJHJlZ2V4LCAkY2hhcmFjdGVycyksICcnLCAkc3RyaW5nKTsKCmlmICgnVVRGLTgnID09PSAkZW5jb2RpbmcpIHsKcmV0dXJuICRzdHJpbmc7Cn0KCnJldHVybiBtYl9jb252ZXJ0X2VuY29kaW5nKCRzdHJpbmcsICRlbmNvZGluZywgJ1VURi04Jyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ3JhcGhlbWVfc3RyX3NwbGl0KHN0cmluZyAkc3RyaW5nLCBpbnQgJGxlbmd0aCkKewppZiAoMCA+ICRsZW5ndGggfHwgMTA3Mzc0MTgyMyA8ICRsZW5ndGgpIHsKdGhyb3cgbmV3IFxWYWx1ZUVycm9yKCdncmFwaGVtZV9zdHJfc3BsaXQoKTogQXJndW1lbnQgIzIgKCRsZW5ndGgpIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxMDczNzQxODIzLicpOwp9CgppZiAoJycgPT09ICRzdHJpbmcpIHsKcmV0dXJuIFtdOwp9CgokcmVnZXggPSAoKGZsb2F0KSBcUENSRV9WRVJTSU9OIDwgMTAgPyAoZmxvYXQpIFxQQ1JFX1ZFUlNJT04gPj0gOC4zMiA6IChmbG9hdCkgXFBDUkVfVkVSU0lPTiA+PSAxMC4zOSkKPyAnXFgnCjogJyg/OlxyXG58KD86WyAtflx4ezIwMEN9XHh7MjAwRH1dfFvhhqgt4Ye5XSt8W+GEgC3hhZ9dKig/OlvqsIDqsJzqsLjqsZTqsbDqsozqsqjqs4Tqs6Dqs7zqtJjqtLTqtZDqtazqtojqtqTqt4Dqt5zqt7jquJTquLDquYzquajquoTquqDqurzqu5jqu7TqvJDqvKzqvYjqvaTqvoDqvpzqvrjqv5Tqv7DrgIzrgKjrgYTrgaDrgbzrgpjrgrTrg5Drg6zrhIjrhKTrhYDrhZzrhbjrhpTrhrDrh4zrh6jriITriKDriLzriZjribTripDriqzri4jri6TrjIDrjJzrjLjrjZTrjbDrjozrjqjrj4Trj6Drj7zrkJjrkLTrkZDrkazrkojrkqTrk4Drk5zrk7jrlJTrlLDrlYzrlajrloTrlqDrlrzrl5jrl7TrmJDrmKzrmYjrmaTrmoDrmpzrmrjrm5Trm7DrnIzrnKjrnYTrnaDrnbzrnpjrnrTrn5Drn6zroIjroKTroYDroZzrobjropTrorDro4zro6jrpITrpKDrpLzrpZjrpbTrppDrpqzrp4jrp6TrqIDrqJzrqLjrqZTrqbDrqozrqqjrq4Trq6Drq7zrrJjrrLTrrZDrrazrrojrrqTrr4Drr5zrr7jrsJTrsLDrsYzrsajrsoTrsqDrsrzrs5jrs7TrtJDrtKzrtYjrtaTrtoDrtpzrtrjrt5Trt7DruIzruKjruYTruaDrubzrupjrurTru5Dru6zrvIjrvKTrvYDrvZzrvbjrvpTrvrDrv4zrv6jsgITsgKDsgLzsgZjsgbTsgpDsgqzsg4jsg6TshIDshJzshLjshZTshbDshozshqjsh4Tsh6Dsh7zsiJjsiLTsiZDsiazsiojsiqTsi4Dsi5zsi7jsjJTsjLDsjYzsjajsjoTsjqDsjrzsj5jsj7TskJDskKzskYjskaTskoDskpzskrjsk5Tsk7DslIzslKjslYTslaDslbzslpjslrTsl5Dsl6zsmIjsmKTsmYDsmZzsmbjsmpTsmrDsm4zsm6jsnITsnKDsnLzsnZjsnbTsnpDsnqzsn4jsn6TsoIDsoJzsoLjsoZTsobDsoozsoqjso4Tso6Dso7zspJjspLTspZDspazspojspqTsp4Dsp5zsp7jsqJTsqLDsqYzsqajsqoTsqqDsqrzsq5jsq7TsrJDsrKzsrYjsraTsroDsrpzsrrjsr5Tsr7DssIzssKjssYTssaDssbzsspjssrTss5Dss6zstIjstKTstYDstZzstbjstpTstrDst4zst6jsuITsuKDsuLzsuZjsubTsupDsuqzsu4jsu6TsvIDsvJzsvLjsvZTsvbDsvozsvqjsv4Tsv6Dsv7ztgJjtgLTtgZDtgaztgojtgqTtg4Dtg5ztg7jthJTthLDthYzthajthoTthqDthrzth5jth7TtiJDtiKztiYjtiaTtioDtipztirjti5Tti7DtjIztjKjtjYTtjaDtjbztjpjtjrTtj5Dtj6ztkIjtkKTtkYDtkZztkbjtkpTtkrDtk4ztk6jtlITtlKDtlLztlZjtlbTtlpDtlqztl4jtl6TtmIDtmJztmLjtmZTtmbDtmoztmqjtm4Ttm6Dtm7ztnJjtnLTtnZDtnaztnohdP1vhhaAt4YaiXSt8W+qwgC3tnqNdKVvhhqgt4Ye5XSp8W+GEgC3hhZ9dK3xbXlxwe0NjfVxwe0NmfVxwe1psfVxwe1pwfV0pW1xwe01ufVxwe01lfVx4ezA5QkV9XHh7MDlEN31ceHswQjNFfVx4ezBCNTd9XHh7MEJCRX1ceHswQkQ3fVx4ezBDQzJ9XHh7MENENX1ceHswQ0Q2fVx4ezBEM0V9XHh7MEQ1N31ceHswRENGfVx4ezBEREZ9XHh7MjAwQ31ceHsyMDBEfVx4ezFEMTY1fVx4ezFEMTZFfS1ceHsxRDE3Mn1dKnxbXHB7Q2N9XHB7Q2Z9XHB7Wmx9XHB7WnB9XSknOwoKaWYgKCFwcmVnX21hdGNoX2FsbCgnLycuJHJlZ2V4LicvdScsICRzdHJpbmcsICRtYXRjaGVzKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICgxID09PSAkbGVuZ3RoKSB7CnJldHVybiAkbWF0Y2hlc1swXTsKfQoKJGNodW5rcyA9IGFycmF5X2NodW5rKCRtYXRjaGVzWzBdLCAkbGVuZ3RoKTsKZm9yZWFjaCAoJGNodW5rcyBhcyAmJGNodW5rKSB7CiRjaHVuayA9IGltcGxvZGUoJycsICRjaHVuayk7Cn0KCnJldHVybiAkY2h1bmtzOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGJjY2VpbChzdHJpbmcgJG51bSk6IHN0cmluZwp7CmlmICghaXNfbnVtZXJpYygkbnVtKSkgewp0aHJvdyBuZXcgXFZhbHVlRXJyb3IoJ2JjY2VpbCgpOiBBcmd1bWVudCAjMSAoJG51bSkgaXMgbm90IHdlbGwtZm9ybWVkJyk7Cn0KCnJldHVybiBzZWxmOjpiY3JvdW5kKCRudW0sIDAsIFxSb3VuZGluZ01vZGU6OlBvc2l0aXZlSW5maW5pdHkpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGJjZGl2bW9kKHN0cmluZyAkbnVtMSwgc3RyaW5nICRudW0yLCA/aW50ICRzY2FsZSA9IG51bGwpOiA/YXJyYXkKewppZiAobnVsbCA9PT0gJHF1b3QgPSBAYmNkaXYoJG51bTEsICRudW0yLCAwKSkgewp0aHJvdyBuZXcgXERpdmlzaW9uQnlaZXJvRXJyb3IoJ0RpdmlzaW9uIGJ5IHplcm8nKTsKfQokc2NhbGUgPSAkc2NhbGUgPz8gKFxQSFBfVkVSU0lPTl9JRCA+PSA3MDMwMCA/IGJjc2NhbGUoKSA6IChcaW5pX2dldCgnYmNtYXRoLnNjYWxlJykgPzogMCkpOwoKcmV0dXJuIFskcXVvdCwgYmNtb2QoJG51bTEsICRudW0yLCAkc2NhbGUpXTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBiY2Zsb29yKHN0cmluZyAkbnVtKTogc3RyaW5nCnsKaWYgKCFpc19udW1lcmljKCRudW0pKSB7CnRocm93IG5ldyBcVmFsdWVFcnJvcignYmNmbG9vcigpOiBBcmd1bWVudCAjMSAoJG51bSkgaXMgbm90IHdlbGwtZm9ybWVkJyk7Cn0KCnJldHVybiBzZWxmOjpiY3JvdW5kKCRudW0sIDAsIFxSb3VuZGluZ01vZGU6Ok5lZ2F0aXZlSW5maW5pdHkpOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGJjcm91bmQoc3RyaW5nICRudW0sIGludCAkcHJlY2lzaW9uID0gMCwgJG1vZGUgPSBcUm91bmRpbmdNb2RlOjpIYWxmQXdheUZyb21aZXJvKTogc3RyaW5nCnsKaWYgKCFpc19udW1lcmljKCRudW0pKSB7CnRocm93IG5ldyBcVmFsdWVFcnJvcignYmNyb3VuZCgpOiBBcmd1bWVudCAjMSAoJG51bSkgaXMgbm90IHdlbGwtZm9ybWVkJyk7Cn0KCiRzaWduID0gMTsKaWYgKCcnICE9PSAkbnVtICYmICgnLScgPT09ICRudW1bMF0gfHwgJysnID09PSAkbnVtWzBdKSkgewppZiAoJy0nID09PSAkbnVtWzBdKSB7CiRzaWduID0gLTE7Cn0KCiRudW0gPSBzdWJzdHIoJG51bSwgMSk7Cn0KCmlmIChmYWxzZSAhPT0gc3RycG9zKCRudW0sICcuJykpIHsKWyRpbnRQYXJ0LCAkZnJhY1BhcnRdID0gYXJyYXlfcGFkKGV4cGxvZGUoJy4nLCAkbnVtLCAyKSwgMiwgJycpOwp9IGVsc2UgewokaW50UGFydCA9ICRudW07CiRmcmFjUGFydCA9ICcnOwp9CgppZiAoJycgPT09ICRpbnRQYXJ0KSB7CiRpbnRQYXJ0ID0gJzAnOwp9CgokaW50UGFydCA9IHNlbGY6OnRyaW1MZWFkaW5nWmVyb3MoJGludFBhcnQpOwokZnJhY1BhcnQgPSAoc3RyaW5nKSAkZnJhY1BhcnQ7CgppZiAoJHByZWNpc2lvbiA+PSAwKSB7CiRmcmFjTGVuZ3RoID0gXHN0cmxlbigkZnJhY1BhcnQpOwoKaWYgKCRwcmVjaXNpb24gPD0gJGZyYWNMZW5ndGgpIHsKJHNjYWxlZEludCA9ICRpbnRQYXJ0LihzdHJpbmcpIHN1YnN0cigkZnJhY1BhcnQsIDAsICRwcmVjaXNpb24pOwokc2NhbGVkRnJhYyA9IChzdHJpbmcpIHN1YnN0cigkZnJhY1BhcnQsICRwcmVjaXNpb24pOwp9IGVsc2Ugewokc2NhbGVkSW50ID0gJGludFBhcnQuJGZyYWNQYXJ0LnN0cl9yZXBlYXQoJzAnLCAkcHJlY2lzaW9uIC0gJGZyYWNMZW5ndGgpOwokc2NhbGVkRnJhYyA9ICcnOwp9Cn0gZWxzZSB7CiRzaGlmdCA9IC0kcHJlY2lzaW9uOwokaW50TGVuZ3RoID0gXHN0cmxlbigkaW50UGFydCk7CgppZiAoJHNoaWZ0IDw9ICRpbnRMZW5ndGgpIHsKJHNwbGl0UG9zID0gJGludExlbmd0aCAtICRzaGlmdDsKJHNjYWxlZEludCA9IHN1YnN0cigkaW50UGFydCwgMCwgJHNwbGl0UG9zKTsKJHNjYWxlZEludCA9ICcnID09PSAkc2NhbGVkSW50ID8gJzAnIDogJHNjYWxlZEludDsKJHNjYWxlZEZyYWMgPSBzdWJzdHIoJGludFBhcnQsICRzcGxpdFBvcykuJGZyYWNQYXJ0Owp9IGVsc2Ugewokc2NhbGVkSW50ID0gJzAnOwokc2NhbGVkRnJhYyA9IHN0cl9yZXBlYXQoJzAnLCAkc2hpZnQgLSAkaW50TGVuZ3RoKS4kaW50UGFydC4kZnJhY1BhcnQ7Cn0KfQoKJHJvdW5kZWRJbnQgPSBzZWxmOjpyb3VuZEludGVnZXJQYXJ0KCRzY2FsZWRJbnQsICRzY2FsZWRGcmFjLCAkc2lnbiwgJG1vZGUpOwokaXNaZXJvID0gJycgPT09IHRyaW0oJHJvdW5kZWRJbnQsICcwJyk7CiRhYnNSZXN1bHQgPSBzZWxmOjpmb3JtYXRSb3VuZGVkRGlnaXRzKCRyb3VuZGVkSW50LCAkcHJlY2lzaW9uKTsKCmlmICgtMSA9PT0gJHNpZ24gJiYgISRpc1plcm8pIHsKJGFic1Jlc3VsdCA9ICctJy4kYWJzUmVzdWx0Owp9CgpyZXR1cm4gJGFic1Jlc3VsdDsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gcm91bmRJbnRlZ2VyUGFydChzdHJpbmcgJGludFBhcnQsIHN0cmluZyAkZnJhY1BhcnQsIGludCAkc2lnbiwgJG1vZGUpOiBzdHJpbmcKewokaW50UGFydCA9IHNlbGY6OnRyaW1MZWFkaW5nWmVyb3MoJGludFBhcnQpOwoKaWYgKCcnID09PSAkZnJhY1BhcnQgfHwgJycgPT09IHRyaW0oJGZyYWNQYXJ0LCAnMCcpKSB7CnJldHVybiAkaW50UGFydDsKfQoKJGZpcnN0RGlnaXQgPSAkZnJhY1BhcnRbMF07CiR0YWlsID0gKHN0cmluZykgc3Vic3RyKCRmcmFjUGFydCwgMSk7CiR0YWlsTm9uWmVybyA9ICcnICE9PSB0cmltKCR0YWlsLCAnMCcpOwokaXNHcmVhdGVyVGhhbkhhbGYgPSAkZmlyc3REaWdpdCA+ICc1JyB8fCAoJzUnID09PSAkZmlyc3REaWdpdCAmJiAkdGFpbE5vblplcm8pOwokaXNFeGFjdGx5SGFsZiA9ICc1JyA9PT0gJGZpcnN0RGlnaXQgJiYgISR0YWlsTm9uWmVybzsKJHNob3VsZEluY3JlYXNlID0gZmFsc2U7Cgpzd2l0Y2ggKCRtb2RlKSB7CmNhc2UgXFJvdW5kaW5nTW9kZTo6VG93YXJkc1plcm86CmJyZWFrOwoKY2FzZSBcUm91bmRpbmdNb2RlOjpBd2F5RnJvbVplcm86CiRzaG91bGRJbmNyZWFzZSA9IHRydWU7CmJyZWFrOwoKY2FzZSBcUm91bmRpbmdNb2RlOjpQb3NpdGl2ZUluZmluaXR5Ogokc2hvdWxkSW5jcmVhc2UgPSAkc2lnbiA+IDA7CmJyZWFrOwoKY2FzZSBcUm91bmRpbmdNb2RlOjpOZWdhdGl2ZUluZmluaXR5Ogokc2hvdWxkSW5jcmVhc2UgPSAkc2lnbiA8IDA7CmJyZWFrOwoKY2FzZSBcUm91bmRpbmdNb2RlOjpIYWxmQXdheUZyb21aZXJvOgokc2hvdWxkSW5jcmVhc2UgPSAkaXNHcmVhdGVyVGhhbkhhbGYgfHwgJGlzRXhhY3RseUhhbGY7CmJyZWFrOwoKY2FzZSBcUm91bmRpbmdNb2RlOjpIYWxmVG93YXJkc1plcm86CiRzaG91bGRJbmNyZWFzZSA9ICRpc0dyZWF0ZXJUaGFuSGFsZjsKYnJlYWs7CgpjYXNlIFxSb3VuZGluZ01vZGU6OkhhbGZFdmVuOgppZiAoJGlzR3JlYXRlclRoYW5IYWxmKSB7CiRzaG91bGRJbmNyZWFzZSA9IHRydWU7Cn0gZWxzZWlmICgkaXNFeGFjdGx5SGFsZiAmJiAxID09PSBzZWxmOjpsYXN0RGlnaXQoJGludFBhcnQpICUgMikgewokc2hvdWxkSW5jcmVhc2UgPSB0cnVlOwp9CmJyZWFrOwoKY2FzZSBcUm91bmRpbmdNb2RlOjpIYWxmT2RkOgppZiAoJGlzR3JlYXRlclRoYW5IYWxmKSB7CiRzaG91bGRJbmNyZWFzZSA9IHRydWU7Cn0gZWxzZWlmICgkaXNFeGFjdGx5SGFsZiAmJiAwID09PSBzZWxmOjpsYXN0RGlnaXQoJGludFBhcnQpICUgMikgewokc2hvdWxkSW5jcmVhc2UgPSB0cnVlOwp9CmJyZWFrOwp9CgppZiAoJHNob3VsZEluY3JlYXNlKSB7CiRpbnRQYXJ0ID0gc2VsZjo6aW5jcmVtZW50RGlnaXRzKCRpbnRQYXJ0KTsKfQoKcmV0dXJuIHNlbGY6OnRyaW1MZWFkaW5nWmVyb3MoJGludFBhcnQpOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBmb3JtYXRSb3VuZGVkRGlnaXRzKHN0cmluZyAkcm91bmRlZEludCwgaW50ICRwcmVjaXNpb24pOiBzdHJpbmcKewppZiAoJHByZWNpc2lvbiA+IDApIHsKaWYgKFxzdHJsZW4oJHJvdW5kZWRJbnQpIDw9ICRwcmVjaXNpb24pIHsKJHJvdW5kZWRJbnQgPSBzdHJfcGFkKCRyb3VuZGVkSW50LCAkcHJlY2lzaW9uICsgMSwgJzAnLCBcU1RSX1BBRF9MRUZUKTsKfQoKJGludERpZ2l0cyA9IHN1YnN0cigkcm91bmRlZEludCwgMCwgLSRwcmVjaXNpb24pOwokZnJhY0RpZ2l0cyA9IHN1YnN0cigkcm91bmRlZEludCwgLSRwcmVjaXNpb24pOwoKJGludERpZ2l0cyA9IHNlbGY6OnRyaW1MZWFkaW5nWmVyb3MoJycgPT09ICRpbnREaWdpdHMgPyAnMCcgOiAkaW50RGlnaXRzKTsKJGZyYWNEaWdpdHMgPSBzdHJfcGFkKCRmcmFjRGlnaXRzLCAkcHJlY2lzaW9uLCAnMCcsIFxTVFJfUEFEX0xFRlQpOwoKcmV0dXJuICRpbnREaWdpdHMuJy4nLiRmcmFjRGlnaXRzOwp9CgppZiAoMCA9PT0gJHByZWNpc2lvbikgewpyZXR1cm4gc2VsZjo6dHJpbUxlYWRpbmdaZXJvcygkcm91bmRlZEludCk7Cn0KCiRzaGlmdCA9IC0kcHJlY2lzaW9uOwokZGlnaXRzID0gJHJvdW5kZWRJbnQuc3RyX3JlcGVhdCgnMCcsICRzaGlmdCk7CgpyZXR1cm4gc2VsZjo6dHJpbUxlYWRpbmdaZXJvcygkZGlnaXRzKTsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaW5jcmVtZW50RGlnaXRzKHN0cmluZyAkZGlnaXRzKTogc3RyaW5nCnsKJGRpZ2l0cyA9ICcnID09PSAkZGlnaXRzID8gJzAnIDogJGRpZ2l0czsKJGluZGV4ID0gXHN0cmxlbigkZGlnaXRzKSAtIDE7CiRyZXN1bHQgPSAkZGlnaXRzOwokY2FycnkgPSAxOwoKd2hpbGUgKCRpbmRleCA+PSAwICYmICRjYXJyeSkgewokdmFsdWUgPSBcb3JkKCRyZXN1bHRbJGluZGV4XSkgLSA0OCArICRjYXJyeTsKJGNhcnJ5ID0gJHZhbHVlID49IDEwID8gMSA6IDA7CiRyZXN1bHRbJGluZGV4XSA9IFxjaHIoNDggKyAoJHZhbHVlICUgMTApKTsKLS0kaW5kZXg7Cn0KCnJldHVybiAkY2FycnkgPyAnMScuJHJlc3VsdCA6ICRyZXN1bHQ7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHRyaW1MZWFkaW5nWmVyb3Moc3RyaW5nICRkaWdpdHMpOiBzdHJpbmcKewokZGlnaXRzID0gbHRyaW0oJGRpZ2l0cywgJzAnKTsKCnJldHVybiAnJyA9PT0gJGRpZ2l0cyA/ICcwJyA6ICRkaWdpdHM7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGxhc3REaWdpdChzdHJpbmcgJGRpZ2l0cyk6IGludAp7CiRsZW5ndGggPSBcc3RybGVuKCRkaWdpdHMpOwoKcmV0dXJuICRsZW5ndGggPyBcb3JkKCRkaWdpdHNbJGxlbmd0aCAtIDFdKSAtIDQ4IDogMDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgppZiAoXFBIUF9WRVJTSU9OX0lEIDwgODA0MDApIHsKI1tBdHRyaWJ1dGUoQXR0cmlidXRlOjpUQVJHRVRfTUVUSE9EIHwgQXR0cmlidXRlOjpUQVJHRVRfRlVOQ1RJT04gfCBBdHRyaWJ1dGU6OlRBUkdFVF9DTEFTU19DT05TVEFOVCldCmZpbmFsIGNsYXNzIERlcHJlY2F0ZWQKewpwdWJsaWMgcmVhZG9ubHkgP3N0cmluZyAkbWVzc2FnZTsKcHVibGljIHJlYWRvbmx5ID9zdHJpbmcgJHNpbmNlOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9zdHJpbmcgJG1lc3NhZ2UgPSBudWxsLCA/c3RyaW5nICRzaW5jZSA9IG51bGwpCnsKJHRoaXMtPm1lc3NhZ2UgPSAkbWVzc2FnZTsKJHRoaXMtPnNpbmNlID0gJHNpbmNlOwp9Cn0KfQo8P3BocAoKCgoKCgoKCgoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDgwNDAwKSB7CmVudW0gUm91bmRpbmdNb2RlCnsKY2FzZSBIYWxmQXdheUZyb21aZXJvOwpjYXNlIEhhbGZUb3dhcmRzWmVybzsKY2FzZSBIYWxmRXZlbjsKY2FzZSBIYWxmT2RkOwpjYXNlIFRvd2FyZHNaZXJvOwpjYXNlIEF3YXlGcm9tWmVybzsKY2FzZSBOZWdhdGl2ZUluZmluaXR5OwpjYXNlIFBvc2l0aXZlSW5maW5pdHk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDgwMTAwKSB7CiNbQXR0cmlidXRlKEF0dHJpYnV0ZTo6VEFSR0VUX01FVEhPRCB8IEF0dHJpYnV0ZTo6VEFSR0VUX0ZVTkNUSU9OIHwgQXR0cmlidXRlOjpUQVJHRVRfQ0xBU1NfQ09OU1RBTlQpXQpmaW5hbCBjbGFzcyBEZXByZWNhdGVkCnsKCgoKcHVibGljID9zdHJpbmcgJG1lc3NhZ2U7CgoKCgpwdWJsaWMgP3N0cmluZyAkc2luY2U7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP3N0cmluZyAkbWVzc2FnZSA9IG51bGwsID9zdHJpbmcgJHNpbmNlID0gbnVsbCkKewokdGhpcy0+bWVzc2FnZSA9ICRtZXNzYWdlOwokdGhpcy0+c2luY2UgPSAkc2luY2U7Cn0KfQp9IGVsc2VpZiAoXFBIUF9WRVJTSU9OX0lEIDwgODA0MDApIHsKcmVxdWlyZSBkaXJuYW1lKF9fRElSX18pLicvRGVwcmVjYXRlZC5waHAnOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgUGRvOwoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDgwNDAwICYmIFxleHRlbnNpb25fbG9hZGVkKCdwZG9fZGJsaWInKSkgewpjbGFzcyBEYmxpYiBleHRlbmRzIFxQRE8KewpwdWJsaWMgY29uc3QgQVRUUl9DT05ORUNUSU9OX1RJTUVPVVQgPSBcUERPOjpEQkxJQl9BVFRSX0NPTk5FQ1RJT05fVElNRU9VVDsKcHVibGljIGNvbnN0IEFUVFJfUVVFUllfVElNRU9VVCA9IFxQRE86OkRCTElCX0FUVFJfUVVFUllfVElNRU9VVDsKcHVibGljIGNvbnN0IEFUVFJfU1RSSU5HSUZZX1VOSVFVRUlERU5USUZJRVIgPSBcUERPOjpEQkxJQl9BVFRSX1NUUklOR0lGWV9VTklRVUVJREVOVElGSUVSOwpwdWJsaWMgY29uc3QgQVRUUl9WRVJTSU9OID0gXFBETzo6REJMSUJfQVRUUl9WRVJTSU9OOwpwdWJsaWMgY29uc3QgQVRUUl9URFNfVkVSU0lPTiA9IFxQSFBfVkVSU0lPTl9JRCA+PSA3MDMwMCA/IFxQRE86OkRCTElCX0FUVFJfVERTX1ZFUlNJT04gOiAxMDA0OwpwdWJsaWMgY29uc3QgQVRUUl9TS0lQX0VNUFRZX1JPV1NFVFMgPSBcUEhQX1ZFUlNJT05fSUQgPj0gNzAzMDAgPyBcUERPOjpEQkxJQl9BVFRSX1NLSVBfRU1QVFlfUk9XU0VUUyA6IDEwMDU7CnB1YmxpYyBjb25zdCBBVFRSX0RBVEVUSU1FX0NPTlZFUlQgPSBcUEhQX1ZFUlNJT05fSUQgPj0gNzAzMDAgPyBcUERPOjpEQkxJQl9BVFRSX0RBVEVUSU1FX0NPTlZFUlQgOiAxMDA2OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkZHNuLCA/c3RyaW5nICR1c2VybmFtZSA9IG51bGwsID9zdHJpbmcgJHBhc3N3b3JkID0gbnVsbCwgP2FycmF5ICRvcHRpb25zID0gbnVsbCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRkc24sICR1c2VybmFtZSwgJHBhc3N3b3JkLCAkb3B0aW9ucyk7CgppZiAoJ2RibGliJyAhPT0gJGRyaXZlciA9ICR0aGlzLT5nZXRBdHRyaWJ1dGUoXFBETzo6QVRUUl9EUklWRVJfTkFNRSkpIHsKdGhyb3cgbmV3IFxQRE9FeGNlcHRpb24oXHNwcmludGYoJ1Bkb1xEYmxpYjo6X19jb25zdHJ1Y3QoKSBjYW5ub3QgYmUgdXNlZCBmb3IgY29ubmVjdGluZyB0byB0aGUgIiVzIiBkcml2ZXInLCAkZHJpdmVyKSk7Cn0KfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjb25uZWN0KHN0cmluZyAkZHNuLCA/c3RyaW5nICR1c2VybmFtZSA9IG51bGwsID9zdHJpbmcgJHBhc3N3b3JkID0gbnVsbCwgP2FycmF5ICRvcHRpb25zID0gbnVsbCk6IHNlbGYKewp0cnkgewpyZXR1cm4gbmV3IHNlbGYoJGRzbiwgJHVzZXJuYW1lLCAkcGFzc3dvcmQsICRvcHRpb25zKTsKfSBjYXRjaCAoXFBET0V4Y2VwdGlvbiAkZSkgewp0aHJvdyBwcmVnX21hdGNoKCcvXlBkb1xcXFxEYmxpYjo6X19jb25zdHJ1Y3RcKFwpIGNhbm5vdCBiZSB1c2VkIGZvciBjb25uZWN0aW5nIHRvIHRoZSAiKFthLXpdKykiIGRyaXZlci8nLCAkZS0+Z2V0TWVzc2FnZSgpLCAkbWF0Y2hlcykgPyBuZXcgXFBET0V4Y2VwdGlvbihcc3ByaW50ZignUGRvXERibGliOjpjb25uZWN0KCkgY2Fubm90IGJlIHVzZWQgZm9yIGNvbm5lY3RpbmcgdG8gdGhlICIlcyIgZHJpdmVyJywgJG1hdGNoZXNbMV0pKSA6ICRlOwp9Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgUGRvOwoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDgwNDAwICYmIFxleHRlbnNpb25fbG9hZGVkKCdwZG9fZmlyZWJpcmQnKSkgewpjbGFzcyBGaXJlYmlyZCBleHRlbmRzIFxQRE8KewpwdWJsaWMgY29uc3QgQVRUUl9EQVRFX0ZPUk1BVCA9IFxQRE86OkZCX0FUVFJfREFURV9GT1JNQVQ7CnB1YmxpYyBjb25zdCBBVFRSX1RJTUVfRk9STUFUID0gXFBETzo6RkJfQVRUUl9USU1FX0ZPUk1BVDsKcHVibGljIGNvbnN0IEFUVFJfVElNRVNUQU1QX0ZPUk1BVCA9IFxQRE86OkZCX0FUVFJfVElNRVNUQU1QX0ZPUk1BVDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJGRzbiwgP3N0cmluZyAkdXNlcm5hbWUgPSBudWxsLCA/c3RyaW5nICRwYXNzd29yZCA9IG51bGwsID9hcnJheSAkb3B0aW9ucyA9IG51bGwpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkZHNuLCAkdXNlcm5hbWUsICRwYXNzd29yZCwgJG9wdGlvbnMpOwoKaWYgKCdmaXJlYmlyZCcgIT09ICRkcml2ZXIgPSAkdGhpcy0+Z2V0QXR0cmlidXRlKFxQRE86OkFUVFJfRFJJVkVSX05BTUUpKSB7CnRocm93IG5ldyBcUERPRXhjZXB0aW9uKFxzcHJpbnRmKCdQZG9cRmlyZWJpcmQ6Ol9fY29uc3RydWN0KCkgY2Fubm90IGJlIHVzZWQgZm9yIGNvbm5lY3RpbmcgdG8gdGhlICIlcyIgZHJpdmVyJywgJGRyaXZlcikpOwp9Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY29ubmVjdChzdHJpbmcgJGRzbiwgP3N0cmluZyAkdXNlcm5hbWUgPSBudWxsLCA/c3RyaW5nICRwYXNzd29yZCA9IG51bGwsID9hcnJheSAkb3B0aW9ucyA9IG51bGwpOiBzZWxmCnsKdHJ5IHsKcmV0dXJuIG5ldyBzZWxmKCRkc24sICR1c2VybmFtZSwgJHBhc3N3b3JkLCAkb3B0aW9ucyk7Cn0gY2F0Y2ggKFxQRE9FeGNlcHRpb24gJGUpIHsKdGhyb3cgcHJlZ19tYXRjaCgnL15QZG9cXFxcRmlyZWJpcmQ6Ol9fY29uc3RydWN0XChcKSBjYW5ub3QgYmUgdXNlZCBmb3IgY29ubmVjdGluZyB0byB0aGUgIihbYS16XSspIiBkcml2ZXIvJywgJGUtPmdldE1lc3NhZ2UoKSwgJG1hdGNoZXMpID8gbmV3IFxQRE9FeGNlcHRpb24oXHNwcmludGYoJ1Bkb1xGaXJlYmlyZDo6Y29ubmVjdCgpIGNhbm5vdCBiZSB1c2VkIGZvciBjb25uZWN0aW5nIHRvIHRoZSAiJXMiIGRyaXZlcicsICRtYXRjaGVzWzFdKSkgOiAkZTsKfQp9Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFBkbzsKCnVzZSBQRE87CgppZiAoXFBIUF9WRVJTSU9OX0lEIDwgODA0MDAgJiYgXGV4dGVuc2lvbl9sb2FkZWQoJ3Bkb19teXNxbCcpKSB7CgppZiAoXGRlZmluZWQoJ1BETzo6TVlTUUxfQVRUUl9NQVhfQlVGRkVSX1NJWkUnKSAmJiBcZGVmaW5lZCgnUERPOjpNWVNRTF9BVFRSX1JFQURfREVGQVVMVF9GSUxFJykgJiYgXGRlZmluZWQoJ1BETzo6TVlTUUxfQVRUUl9SRUFEX0RFRkFVTFRfR1JPVVAnKSkgewpjbGFzcyBNeXNxbCBleHRlbmRzIFxQRE8KewpwdWJsaWMgY29uc3QgQVRUUl9DT01QUkVTUyA9IFxQRE86Ok1ZU1FMX0FUVFJfQ09NUFJFU1M7CnB1YmxpYyBjb25zdCBBVFRSX0RJUkVDVF9RVUVSWSA9IFxQRE86Ok1ZU1FMX0FUVFJfRElSRUNUX1FVRVJZOwpwdWJsaWMgY29uc3QgQVRUUl9GT1VORF9ST1dTID0gXFBETzo6TVlTUUxfQVRUUl9GT1VORF9ST1dTOwpwdWJsaWMgY29uc3QgQVRUUl9JR05PUkVfU1BBQ0UgPSBcUERPOjpNWVNRTF9BVFRSX0lHTk9SRV9TUEFDRTsKcHVibGljIGNvbnN0IEFUVFJfSU5JVF9DT01NQU5EID0gXFBETzo6TVlTUUxfQVRUUl9JTklUX0NPTU1BTkQ7CnB1YmxpYyBjb25zdCBBVFRSX0xPQ0FMX0lORklMRSA9IFxQRE86Ok1ZU1FMX0FUVFJfTE9DQUxfSU5GSUxFOwpwdWJsaWMgY29uc3QgQVRUUl9MT0NBTF9JTkZJTEVfRElSRUNUT1JZID0gXFBIUF9WRVJTSU9OX0lEID49IDgwMTAwID8gXFBETzo6TVlTUUxfQVRUUl9MT0NBTF9JTkZJTEVfRElSRUNUT1JZIDogMTAxNTsKcHVibGljIGNvbnN0IEFUVFJfTUFYX0JVRkZFUl9TSVpFID0gXFBETzo6TVlTUUxfQVRUUl9NQVhfQlVGRkVSX1NJWkU7CnB1YmxpYyBjb25zdCBBVFRSX01VTFRJX1NUQVRFTUVOVFMgPSBcUERPOjpNWVNRTF9BVFRSX01VTFRJX1NUQVRFTUVOVFM7CnB1YmxpYyBjb25zdCBBVFRSX1JFQURfREVGQVVMVF9GSUxFID0gXFBETzo6TVlTUUxfQVRUUl9SRUFEX0RFRkFVTFRfRklMRTsKcHVibGljIGNvbnN0IEFUVFJfUkVBRF9ERUZBVUxUX0dST1VQID0gXFBETzo6TVlTUUxfQVRUUl9SRUFEX0RFRkFVTFRfR1JPVVA7CnB1YmxpYyBjb25zdCBBVFRSX1NFUlZFUl9QVUJMSUNfS0VZID0gXFBETzo6TVlTUUxfQVRUUl9TRVJWRVJfUFVCTElDX0tFWTsKcHVibGljIGNvbnN0IEFUVFJfU1NMX0NBID0gXFBETzo6TVlTUUxfQVRUUl9TU0xfQ0E7CnB1YmxpYyBjb25zdCBBVFRSX1NTTF9DQVBBVEggPSBcUERPOjpNWVNRTF9BVFRSX1NTTF9DQVBBVEg7CnB1YmxpYyBjb25zdCBBVFRSX1NTTF9DRVJUID0gXFBETzo6TVlTUUxfQVRUUl9TU0xfQ0VSVDsKcHVibGljIGNvbnN0IEFUVFJfU1NMX0NJUEhFUiA9IFxQRE86Ok1ZU1FMX0FUVFJfU1NMX0NJUEhFUjsKcHVibGljIGNvbnN0IEFUVFJfU1NMX0tFWSA9IFxQRE86Ok1ZU1FMX0FUVFJfU1NMX0tFWTsKcHVibGljIGNvbnN0IEFUVFJfU1NMX1ZFUklGWV9TRVJWRVJfQ0VSVCA9IFxQRE86Ok1ZU1FMX0FUVFJfU1NMX1ZFUklGWV9TRVJWRVJfQ0VSVDsKcHVibGljIGNvbnN0IEFUVFJfVVNFX0JVRkZFUkVEX1FVRVJZID0gXFBETzo6TVlTUUxfQVRUUl9VU0VfQlVGRkVSRURfUVVFUlk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRkc24sID9zdHJpbmcgJHVzZXJuYW1lID0gbnVsbCwgP3N0cmluZyAkcGFzc3dvcmQgPSBudWxsLCA/YXJyYXkgJG9wdGlvbnMgPSBudWxsKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJGRzbiwgJHVzZXJuYW1lLCAkcGFzc3dvcmQsICRvcHRpb25zKTsKCmlmICgnbXlzcWwnICE9PSAkZHJpdmVyID0gJHRoaXMtPmdldEF0dHJpYnV0ZShcUERPOjpBVFRSX0RSSVZFUl9OQU1FKSkgewp0aHJvdyBuZXcgXFBET0V4Y2VwdGlvbihcc3ByaW50ZignUGRvXE15c3FsOjpfX2NvbnN0cnVjdCgpIGNhbm5vdCBiZSB1c2VkIGZvciBjb25uZWN0aW5nIHRvIHRoZSAiJXMiIGRyaXZlcicsICRkcml2ZXIpKTsKfQp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNvbm5lY3Qoc3RyaW5nICRkc24sID9zdHJpbmcgJHVzZXJuYW1lID0gbnVsbCwgP3N0cmluZyAkcGFzc3dvcmQgPSBudWxsLCA/YXJyYXkgJG9wdGlvbnMgPSBudWxsKTogc2VsZgp7CnRyeSB7CnJldHVybiBuZXcgc2VsZigkZHNuLCAkdXNlcm5hbWUsICRwYXNzd29yZCwgJG9wdGlvbnMpOwp9IGNhdGNoIChcUERPRXhjZXB0aW9uICRlKSB7CnRocm93IHByZWdfbWF0Y2goJy9eUGRvXFxcXE15c3FsOjpfX2NvbnN0cnVjdFwoXCkgY2Fubm90IGJlIHVzZWQgZm9yIGNvbm5lY3RpbmcgdG8gdGhlICIoW2Etel0rKSIgZHJpdmVyLycsICRlLT5nZXRNZXNzYWdlKCksICRtYXRjaGVzKSA/IG5ldyBcUERPRXhjZXB0aW9uKFxzcHJpbnRmKCdQZG9cTXlzcWw6OmNvbm5lY3QoKSBjYW5ub3QgYmUgdXNlZCBmb3IgY29ubmVjdGluZyB0byB0aGUgIiVzIiBkcml2ZXInLCAkbWF0Y2hlc1sxXSkpIDogJGU7Cn0KfQp9Cn0gZWxzZSB7CmNsYXNzIE15c3FsIGV4dGVuZHMgXFBETwp7CnB1YmxpYyBjb25zdCBBVFRSX0NPTVBSRVNTID0gXFBETzo6TVlTUUxfQVRUUl9DT01QUkVTUzsKcHVibGljIGNvbnN0IEFUVFJfRElSRUNUX1FVRVJZID0gXFBETzo6TVlTUUxfQVRUUl9ESVJFQ1RfUVVFUlk7CnB1YmxpYyBjb25zdCBBVFRSX0ZPVU5EX1JPV1MgPSBcUERPOjpNWVNRTF9BVFRSX0ZPVU5EX1JPV1M7CnB1YmxpYyBjb25zdCBBVFRSX0lHTk9SRV9TUEFDRSA9IFxQRE86Ok1ZU1FMX0FUVFJfSUdOT1JFX1NQQUNFOwpwdWJsaWMgY29uc3QgQVRUUl9JTklUX0NPTU1BTkQgPSBcUERPOjpNWVNRTF9BVFRSX0lOSVRfQ09NTUFORDsKcHVibGljIGNvbnN0IEFUVFJfTE9DQUxfSU5GSUxFID0gXFBETzo6TVlTUUxfQVRUUl9MT0NBTF9JTkZJTEU7CnB1YmxpYyBjb25zdCBBVFRSX0xPQ0FMX0lORklMRV9ESVJFQ1RPUlkgPSBcUEhQX1ZFUlNJT05fSUQgPj0gODAxMDAgPyBcUERPOjpNWVNRTF9BVFRSX0xPQ0FMX0lORklMRV9ESVJFQ1RPUlkgOiAxMDE1OwoKcHVibGljIGNvbnN0IEFUVFJfTVVMVElfU1RBVEVNRU5UUyA9IFxQRE86Ok1ZU1FMX0FUVFJfTVVMVElfU1RBVEVNRU5UUzsKCgpwdWJsaWMgY29uc3QgQVRUUl9TRVJWRVJfUFVCTElDX0tFWSA9IFxQRE86Ok1ZU1FMX0FUVFJfU0VSVkVSX1BVQkxJQ19LRVk7CnB1YmxpYyBjb25zdCBBVFRSX1NTTF9DQSA9IFxQRE86Ok1ZU1FMX0FUVFJfU1NMX0NBOwpwdWJsaWMgY29uc3QgQVRUUl9TU0xfQ0FQQVRIID0gXFBETzo6TVlTUUxfQVRUUl9TU0xfQ0FQQVRIOwpwdWJsaWMgY29uc3QgQVRUUl9TU0xfQ0VSVCA9IFxQRE86Ok1ZU1FMX0FUVFJfU1NMX0NFUlQ7CnB1YmxpYyBjb25zdCBBVFRSX1NTTF9DSVBIRVIgPSBcUERPOjpNWVNRTF9BVFRSX1NTTF9DSVBIRVI7CnB1YmxpYyBjb25zdCBBVFRSX1NTTF9LRVkgPSBcUERPOjpNWVNRTF9BVFRSX1NTTF9LRVk7CnB1YmxpYyBjb25zdCBBVFRSX1NTTF9WRVJJRllfU0VSVkVSX0NFUlQgPSBcUERPOjpNWVNRTF9BVFRSX1NTTF9WRVJJRllfU0VSVkVSX0NFUlQ7CnB1YmxpYyBjb25zdCBBVFRSX1VTRV9CVUZGRVJFRF9RVUVSWSA9IFxQRE86Ok1ZU1FMX0FUVFJfVVNFX0JVRkZFUkVEX1FVRVJZOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkZHNuLCA/c3RyaW5nICR1c2VybmFtZSA9IG51bGwsID9zdHJpbmcgJHBhc3N3b3JkID0gbnVsbCwgP2FycmF5ICRvcHRpb25zID0gbnVsbCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRkc24sICR1c2VybmFtZSwgJHBhc3N3b3JkLCAkb3B0aW9ucyk7CgppZiAoJ215c3FsJyAhPT0gJGRyaXZlciA9ICR0aGlzLT5nZXRBdHRyaWJ1dGUoXFBETzo6QVRUUl9EUklWRVJfTkFNRSkpIHsKdGhyb3cgbmV3IFxQRE9FeGNlcHRpb24oXHNwcmludGYoJ1Bkb1xNeXNxbDo6X19jb25zdHJ1Y3QoKSBjYW5ub3QgYmUgdXNlZCBmb3IgY29ubmVjdGluZyB0byB0aGUgIiVzIiBkcml2ZXInLCAkZHJpdmVyKSk7Cn0KfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjb25uZWN0KHN0cmluZyAkZHNuLCA/c3RyaW5nICR1c2VybmFtZSA9IG51bGwsID9zdHJpbmcgJHBhc3N3b3JkID0gbnVsbCwgP2FycmF5ICRvcHRpb25zID0gbnVsbCk6IHNlbGYKewp0cnkgewpyZXR1cm4gbmV3IHNlbGYoJGRzbiwgJHVzZXJuYW1lLCAkcGFzc3dvcmQsICRvcHRpb25zKTsKfSBjYXRjaCAoXFBET0V4Y2VwdGlvbiAkZSkgewp0aHJvdyBwcmVnX21hdGNoKCcvXlBkb1xcXFxNeXNxbDo6X19jb25zdHJ1Y3RcKFwpIGNhbm5vdCBiZSB1c2VkIGZvciBjb25uZWN0aW5nIHRvIHRoZSAiKFthLXpdKykiIGRyaXZlci8nLCAkZS0+Z2V0TWVzc2FnZSgpLCAkbWF0Y2hlcykgPyBuZXcgXFBET0V4Y2VwdGlvbihcc3ByaW50ZignUGRvXE15c3FsOjpjb25uZWN0KCkgY2Fubm90IGJlIHVzZWQgZm9yIGNvbm5lY3RpbmcgdG8gdGhlICIlcyIgZHJpdmVyJywgJG1hdGNoZXNbMV0pKSA6ICRlOwp9Cn0KfQp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBQZG87CgppZiAoXFBIUF9WRVJTSU9OX0lEIDwgODA0MDAgJiYgXGV4dGVuc2lvbl9sb2FkZWQoJ3Bkb19vZGJjJykpIHsKY2xhc3MgT2RiYyBleHRlbmRzIFxQRE8KewpwdWJsaWMgY29uc3QgQVRUUl9VU0VfQ1VSU09SX0xJQlJBUlkgPSBcUERPOjpPREJDX0FUVFJfVVNFX0NVUlNPUl9MSUJSQVJZOwpwdWJsaWMgY29uc3QgQVRUUl9BU1NVTUVfVVRGOCA9IFxQRE86Ok9EQkNfQVRUUl9BU1NVTUVfVVRGODsKcHVibGljIGNvbnN0IFNRTF9VU0VfSUZfTkVFREVEID0gXFBETzo6T0RCQ19TUUxfVVNFX0lGX05FRURFRDsKcHVibGljIGNvbnN0IFNRTF9VU0VfRFJJVkVSID0gXFBETzo6T0RCQ19TUUxfVVNFX0RSSVZFUjsKcHVibGljIGNvbnN0IFNRTF9VU0VfT0RCQyA9IFxQRE86Ok9EQkNfU1FMX1VTRV9PREJDOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkZHNuLCA/c3RyaW5nICR1c2VybmFtZSA9IG51bGwsID9zdHJpbmcgJHBhc3N3b3JkID0gbnVsbCwgP2FycmF5ICRvcHRpb25zID0gbnVsbCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRkc24sICR1c2VybmFtZSwgJHBhc3N3b3JkLCAkb3B0aW9ucyk7CgppZiAoJ29kYmMnICE9PSAkZHJpdmVyID0gJHRoaXMtPmdldEF0dHJpYnV0ZShcUERPOjpBVFRSX0RSSVZFUl9OQU1FKSkgewp0aHJvdyBuZXcgXFBET0V4Y2VwdGlvbihcc3ByaW50ZignUGRvXE9kYmM6Ol9fY29uc3RydWN0KCkgY2Fubm90IGJlIHVzZWQgZm9yIGNvbm5lY3RpbmcgdG8gdGhlICIlcyIgZHJpdmVyJywgJGRyaXZlcikpOwp9Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY29ubmVjdChzdHJpbmcgJGRzbiwgP3N0cmluZyAkdXNlcm5hbWUgPSBudWxsLCA/c3RyaW5nICRwYXNzd29yZCA9IG51bGwsID9hcnJheSAkb3B0aW9ucyA9IG51bGwpOiBzZWxmCnsKdHJ5IHsKcmV0dXJuIG5ldyBzZWxmKCRkc24sICR1c2VybmFtZSwgJHBhc3N3b3JkLCAkb3B0aW9ucyk7Cn0gY2F0Y2ggKFxQRE9FeGNlcHRpb24gJGUpIHsKdGhyb3cgcHJlZ19tYXRjaCgnL15QZG9cXFxcT2RiYzo6X19jb25zdHJ1Y3RcKFwpIGNhbm5vdCBiZSB1c2VkIGZvciBjb25uZWN0aW5nIHRvIHRoZSAiKFthLXpdKykiIGRyaXZlci8nLCAkZS0+Z2V0TWVzc2FnZSgpLCAkbWF0Y2hlcykgPyBuZXcgXFBET0V4Y2VwdGlvbihcc3ByaW50ZignUGRvXE9kYmM6OmNvbm5lY3QoKSBjYW5ub3QgYmUgdXNlZCBmb3IgY29ubmVjdGluZyB0byB0aGUgIiVzIiBkcml2ZXInLCAkbWF0Y2hlc1sxXSkpIDogJGU7Cn0KfQp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBQZG87CgppZiAoXFBIUF9WRVJTSU9OX0lEIDwgODA0MDAgJiYgXGV4dGVuc2lvbl9sb2FkZWQoJ3Bkb19wZ3NxbCcpKSB7CmNsYXNzIFBnc3FsIGV4dGVuZHMgXFBETwp7CnB1YmxpYyBjb25zdCBBVFRSX0RJU0FCTEVfUFJFUEFSRVMgPSBcUERPOjpQR1NRTF9BVFRSX0RJU0FCTEVfUFJFUEFSRVM7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRkc24sID9zdHJpbmcgJHVzZXJuYW1lID0gbnVsbCwgP3N0cmluZyAkcGFzc3dvcmQgPSBudWxsLCA/YXJyYXkgJG9wdGlvbnMgPSBudWxsKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJGRzbiwgJHVzZXJuYW1lLCAkcGFzc3dvcmQsICRvcHRpb25zKTsKCmlmICgncGdzcWwnICE9PSAkZHJpdmVyID0gJHRoaXMtPmdldEF0dHJpYnV0ZShcUERPOjpBVFRSX0RSSVZFUl9OQU1FKSkgewp0aHJvdyBuZXcgXFBET0V4Y2VwdGlvbihcc3ByaW50ZignUGRvXFBnc3FsOjpfX2NvbnN0cnVjdCgpIGNhbm5vdCBiZSB1c2VkIGZvciBjb25uZWN0aW5nIHRvIHRoZSAiJXMiIGRyaXZlcicsICRkcml2ZXIpKTsKfQp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNvbm5lY3Qoc3RyaW5nICRkc24sID9zdHJpbmcgJHVzZXJuYW1lID0gbnVsbCwgP3N0cmluZyAkcGFzc3dvcmQgPSBudWxsLCA/YXJyYXkgJG9wdGlvbnMgPSBudWxsKTogc2VsZgp7CnRyeSB7CnJldHVybiBuZXcgc2VsZigkZHNuLCAkdXNlcm5hbWUsICRwYXNzd29yZCwgJG9wdGlvbnMpOwp9IGNhdGNoIChcUERPRXhjZXB0aW9uICRlKSB7CnRocm93IHByZWdfbWF0Y2goJy9eUGRvXFxcXFBnc3FsOjpfX2NvbnN0cnVjdFwoXCkgY2Fubm90IGJlIHVzZWQgZm9yIGNvbm5lY3RpbmcgdG8gdGhlICIoW2Etel0rKSIgZHJpdmVyLycsICRlLT5nZXRNZXNzYWdlKCksICRtYXRjaGVzKSA/IG5ldyBcUERPRXhjZXB0aW9uKFxzcHJpbnRmKCdQZG9cUGdzcWw6OmNvbm5lY3QoKSBjYW5ub3QgYmUgdXNlZCBmb3IgY29ubmVjdGluZyB0byB0aGUgIiVzIiBkcml2ZXInLCAkbWF0Y2hlc1sxXSkpIDogJGU7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIGNvcHlGcm9tQXJyYXkoc3RyaW5nICR0YWJsZU5hbWUsIGFycmF5ICRyb3dzLCBzdHJpbmcgJHNlcGFyYXRvciA9ICJcdCIsIHN0cmluZyAkbnVsbEFzID0gJ1xcXFxOJywgP3N0cmluZyAkZmllbGRzID0gbnVsbCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPnBnc3FsQ29weUZyb21BcnJheSgkdGFibGVOYW1lLCAkcm93cywgJHNlcGFyYXRvciwgJG51bGxBcywgJGZpZWxkcyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjb3B5RnJvbUZpbGUoc3RyaW5nICR0YWJsZU5hbWUsIHN0cmluZyAkZmlsZW5hbWUsIHN0cmluZyAkc2VwYXJhdG9yID0gIlx0Iiwgc3RyaW5nICRudWxsQXMgPSAnXFxcXE4nLCA/c3RyaW5nICRmaWVsZHMgPSBudWxsKTogYm9vbAp7CnJldHVybiAkdGhpcy0+cGdzcWxDb3B5RnJvbUZpbGUoJHRhYmxlTmFtZSwgJGZpbGVuYW1lLCAkc2VwYXJhdG9yLCAkbnVsbEFzLCAkZmllbGRzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNvcHlUb0FycmF5KHN0cmluZyAkdGFibGVOYW1lLCBzdHJpbmcgJHNlcGFyYXRvciA9ICJcdCIsIHN0cmluZyAkbnVsbEFzID0gJ1xcXFxOJywgP3N0cmluZyAkZmllbGRzID0gbnVsbCkKewpyZXR1cm4gJHRoaXMtPnBnc3FsQ29weVRvQXJyYXkoJHRhYmxlTmFtZSwgJHNlcGFyYXRvciwgJG51bGxBcywgJGZpZWxkcyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjb3B5VG9GaWxlKHN0cmluZyAkdGFibGVOYW1lLCBzdHJpbmcgJGZpbGVuYW1lLCBzdHJpbmcgJHNlcGFyYXRvciA9ICJcdCIsIHN0cmluZyAkbnVsbEFzID0gJ1xcXFxOJywgP3N0cmluZyAkZmllbGRzID0gbnVsbCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPnBnc3FsQ29weVRvRmlsZSgkdGFibGVOYW1lLCAkZmlsZW5hbWUsICRzZXBhcmF0b3IsICRudWxsQXMsICRmaWVsZHMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Tm90aWZ5KGludCAkZmV0Y2hNb2RlID0gXFBETzo6RkVUQ0hfREVGQVVMVCwgaW50ICR0aW1lb3V0TWlsbGlzZWNvbmRzID0gMCkKewpyZXR1cm4gJHRoaXMtPnBnc3FsR2V0Tm90aWZ5KCRmZXRjaE1vZGUsICR0aW1lb3V0TWlsbGlzZWNvbmRzKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFBpZCgpOiBpbnQKewpyZXR1cm4gJHRoaXMtPnBnc3FsR2V0UGlkKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2JDcmVhdGUoKQp7CnJldHVybiAkdGhpcy0+cGdzcWxMT0JDcmVhdGUoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGxvYk9wZW4oc3RyaW5nICRvaWQsIHN0cmluZyAkbW9kZSA9ICdyYicpCnsKcmV0dXJuICR0aGlzLT5wZ3NxbExPQk9wZW4oJG9pZCwgJG1vZGUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gbG9iVW5saW5rKHN0cmluZyAkb2lkKTogYm9vbAp7CnJldHVybiAkdGhpcy0+cGdzcWxMT0JVbmxpbmsoJG9pZCk7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgUGRvOwoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDgwNDAwICYmIFxleHRlbnNpb25fbG9hZGVkKCdwZG9fc3FsaXRlJykpIHsKY2xhc3MgU3FsaXRlIGV4dGVuZHMgXFBETwp7CnB1YmxpYyBjb25zdCBBVFRSX0VYVEVOREVEX1JFU1VMVF9DT0RFUyA9IFxQSFBfVkVSU0lPTl9JRCA+PSA3MDQwMCA/IFxQRE86OlNRTElURV9BVFRSX0VYVEVOREVEX1JFU1VMVF9DT0RFUyA6IDEwMDI7CnB1YmxpYyBjb25zdCBBVFRSX09QRU5fRkxBR1MgPSBcUEhQX1ZFUlNJT05fSUQgPj0gNzAzMDAgPyBcUERPOjpTUUxJVEVfQVRUUl9PUEVOX0ZMQUdTIDogMTAwMDsKcHVibGljIGNvbnN0IEFUVFJfUkVBRE9OTFlfU1RBVEVNRU5UID0gXFBIUF9WRVJTSU9OX0lEID49IDcwNDAwID8gXFBETzo6U1FMSVRFX0FUVFJfUkVBRE9OTFlfU1RBVEVNRU5UIDogMTAwMTsKcHVibGljIGNvbnN0IERFVEVSTUlOSVNUSUMgPSBcUERPOjpTUUxJVEVfREVURVJNSU5JU1RJQzsKcHVibGljIGNvbnN0IE9QRU5fUkVBRE9OTFkgPSBcUEhQX1ZFUlNJT05fSUQgPj0gNzAzMDAgPyBcUERPOjpTUUxJVEVfT1BFTl9SRUFET05MWSA6IDE7CnB1YmxpYyBjb25zdCBPUEVOX1JFQURXUklURSA9IFxQSFBfVkVSU0lPTl9JRCA+PSA3MDMwMCA/IFxQRE86OlNRTElURV9PUEVOX1JFQURXUklURSA6IDI7CnB1YmxpYyBjb25zdCBPUEVOX0NSRUFURSA9IFxQSFBfVkVSU0lPTl9JRCA+PSA3MDMwMCA/IFxQRE86OlNRTElURV9PUEVOX0NSRUFURSA6IDQ7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRkc24sID9zdHJpbmcgJHVzZXJuYW1lID0gbnVsbCwgP3N0cmluZyAkcGFzc3dvcmQgPSBudWxsLCA/YXJyYXkgJG9wdGlvbnMgPSBudWxsKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJGRzbiwgJHVzZXJuYW1lLCAkcGFzc3dvcmQsICRvcHRpb25zKTsKCmlmICgnc3FsaXRlJyAhPT0gJGRyaXZlciA9ICR0aGlzLT5nZXRBdHRyaWJ1dGUoXFBETzo6QVRUUl9EUklWRVJfTkFNRSkpIHsKdGhyb3cgbmV3IFxQRE9FeGNlcHRpb24oXHNwcmludGYoJ1Bkb1xTcWxpdGU6Ol9fY29uc3RydWN0KCkgY2Fubm90IGJlIHVzZWQgZm9yIGNvbm5lY3RpbmcgdG8gdGhlICIlcyIgZHJpdmVyJywgJGRyaXZlcikpOwp9Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY29ubmVjdChzdHJpbmcgJGRzbiwgP3N0cmluZyAkdXNlcm5hbWUgPSBudWxsLCA/c3RyaW5nICRwYXNzd29yZCA9IG51bGwsID9hcnJheSAkb3B0aW9ucyA9IG51bGwpOiBzZWxmCnsKdHJ5IHsKcmV0dXJuIG5ldyBzZWxmKCRkc24sICR1c2VybmFtZSwgJHBhc3N3b3JkLCAkb3B0aW9ucyk7Cn0gY2F0Y2ggKFxQRE9FeGNlcHRpb24gJGUpIHsKdGhyb3cgcHJlZ19tYXRjaCgnL15QZG9cXFxcU3FsaXRlOjpfX2NvbnN0cnVjdFwoXCkgY2Fubm90IGJlIHVzZWQgZm9yIGNvbm5lY3RpbmcgdG8gdGhlICIoW2Etel0rKSIgZHJpdmVyLycsICRlLT5nZXRNZXNzYWdlKCksICRtYXRjaGVzKSA/IG5ldyBcUERPRXhjZXB0aW9uKFxzcHJpbnRmKCdQZG9cU3FsaXRlOjpjb25uZWN0KCkgY2Fubm90IGJlIHVzZWQgZm9yIGNvbm5lY3RpbmcgdG8gdGhlICIlcyIgZHJpdmVyJywgJG1hdGNoZXNbMV0pKSA6ICRlOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdGUoc3RyaW5nICRuYW1lLCBjYWxsYWJsZSAkc3RlcCwgY2FsbGFibGUgJGZpbmFsaXplLCBpbnQgJG51bUFyZ3MgPSAtMSk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPnNxbGl0ZUNyZWF0ZUFnZ3JlZ2F0ZSgkbmFtZSwgJHN0ZXAsICRmaW5hbGl6ZSwgJG51bUFyZ3MpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY3JlYXRlQ29sbGF0aW9uKHN0cmluZyAkbmFtZSwgY2FsbGFibGUgJGNhbGxiYWNrKTogYm9vbAp7CnJldHVybiAkdGhpcy0+c3FsaXRlQ3JlYXRlQ29sbGF0aW9uKCRuYW1lLCAkY2FsbGJhY2spOwp9CgpwdWJsaWMgZnVuY3Rpb24gY3JlYXRlRnVuY3Rpb24oc3RyaW5nICRmdW5jdGlvbl9uYW1lLCBjYWxsYWJsZSAkY2FsbGJhY2ssIGludCAkbnVtX2FyZ3MgPSAtMSwgaW50ICRmbGFncyA9IDApOiBib29sCnsKcmV0dXJuICR0aGlzLT5zcWxpdGVDcmVhdGVGdW5jdGlvbigkZnVuY3Rpb25fbmFtZSwgJGNhbGxiYWNrLCAkbnVtX2FyZ3MsICRmbGFncyk7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgppZiAoXFBIUF9WRVJTSU9OX0lEIDwgODA0MDApIHsKCmZpbmFsIGNsYXNzIFJlZmxlY3Rpb25Db25zdGFudAp7CgoKCgoKcHVibGljICRuYW1lOwoKcHJpdmF0ZSAkdmFsdWU7CnByaXZhdGUgJGRlcHJlY2F0ZWQ7Cgpwcml2YXRlIHN0YXRpYyAkcGVyc2lzdGVudENvbnN0YW50cyA9IFtdOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSkKewppZiAoIWRlZmluZWQoJG5hbWUpIHx8IGZhbHNlICE9PSBzdHJwb3MoJG5hbWUsICc6OicpKSB7CnRocm93IG5ldyBSZWZsZWN0aW9uRXhjZXB0aW9uKCJDb25zdGFudCBcIiRuYW1lXCIgZG9lcyBub3QgZXhpc3QiKTsKfQoKJHRoaXMtPm5hbWUgPSBsdHJpbSgkbmFtZSwgJ1xcJyk7CiRkZXByZWNhdGVkID0gZmFsc2U7CiRlaCA9IHNldF9lcnJvcl9oYW5kbGVyKHN0YXRpYyBmdW5jdGlvbiAoJHR5cGUsICRtc2csICRmaWxlLCAkbGluZSkgdXNlICgkbmFtZSwgJiRkZXByZWNhdGVkLCAmJGVoKSB7CmlmIChcRV9ERVBSRUNBVEVEID09PSAkdHlwZSAmJiAiQ29uc3RhbnQgJG5hbWUgaXMgZGVwcmVjYXRlZCIgPT09ICRtc2cpIHsKcmV0dXJuICRkZXByZWNhdGVkID0gdHJ1ZTsKfQoKcmV0dXJuICRlaCAmJiAkZWgoJHR5cGUsICRtc2csICRmaWxlLCAkbGluZSk7Cn0pOwoKdHJ5IHsKJHRoaXMtPnZhbHVlID0gY29uc3RhbnQoJG5hbWUpOwokdGhpcy0+ZGVwcmVjYXRlZCA9ICRkZXByZWNhdGVkOwp9IGZpbmFsbHkgewpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPm5hbWU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRWYWx1ZSgpCnsKcmV0dXJuICR0aGlzLT52YWx1ZTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWVzcGFjZU5hbWUoKTogc3RyaW5nCnsKaWYgKGZhbHNlID09PSAkc2xhc2hQb3MgPSBzdHJycG9zKCR0aGlzLT5uYW1lLCAnXFwnKSkgewpyZXR1cm4gJyc7Cn0KCnJldHVybiBzdWJzdHIoJHRoaXMtPm5hbWUsIDAsICRzbGFzaFBvcyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTaG9ydE5hbWUoKTogc3RyaW5nCnsKaWYgKGZhbHNlID09PSAkc2xhc2hQb3MgPSBzdHJycG9zKCR0aGlzLT5uYW1lLCAnXFwnKSkgewpyZXR1cm4gJHRoaXMtPm5hbWU7Cn0KCnJldHVybiBzdWJzdHIoJHRoaXMtPm5hbWUsICRzbGFzaFBvcyArIDEpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNEZXByZWNhdGVkKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmRlcHJlY2F0ZWQ7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwp7CgoKCgppZiAoIXNlbGY6OiRwZXJzaXN0ZW50Q29uc3RhbnRzKSB7CiRwZXJzaXN0ZW50Q29uc3RhbnRzID0gZ2V0X2RlZmluZWRfY29uc3RhbnRzKHRydWUpOwp1bnNldCgkcGVyc2lzdGVudENvbnN0YW50c1sndXNlciddKTsKZm9yZWFjaCAoJHBlcnNpc3RlbnRDb25zdGFudHMgYXMgJGNvbnN0YW50cykgewpzZWxmOjokcGVyc2lzdGVudENvbnN0YW50cyArPSAkY29uc3RhbnRzOwp9Cn0KJHBlcnNpc3RlbnQgPSBhcnJheV9rZXlfZXhpc3RzKCR0aGlzLT5uYW1lLCBzZWxmOjokcGVyc2lzdGVudENvbnN0YW50cyk7CgoKCiRyZXN1bHQgPSAnQ29uc3RhbnQgWyAnOwppZiAoJHBlcnNpc3RlbnQgfHwgJHRoaXMtPmRlcHJlY2F0ZWQpIHsKJHJlc3VsdCAuPSAnPCc7CmlmICgkcGVyc2lzdGVudCkgewokcmVzdWx0IC49ICdwZXJzaXN0ZW50JzsKaWYgKCR0aGlzLT5kZXByZWNhdGVkKSB7CiRyZXN1bHQgLj0gJywgJzsKfQp9CmlmICgkdGhpcy0+ZGVwcmVjYXRlZCkgewokcmVzdWx0IC49ICdkZXByZWNhdGVkJzsKfQokcmVzdWx0IC49ICc+ICc7Cn0KCmlmIChpc19vYmplY3QoJHRoaXMtPnZhbHVlKSkgewokcmVzdWx0IC49IFxQSFBfVkVSU0lPTl9JRCA+PSA4MDAwMCA/IGdldF9kZWJ1Z190eXBlKCR0aGlzLT52YWx1ZSkgOiBnZXR0eXBlKCR0aGlzLT52YWx1ZSk7Cn0gZWxzZWlmIChpc19ib29sKCR0aGlzLT52YWx1ZSkpIHsKJHJlc3VsdCAuPSAnYm9vbCc7Cn0gZWxzZWlmIChpc19pbnQoJHRoaXMtPnZhbHVlKSkgewokcmVzdWx0IC49ICdpbnQnOwp9IGVsc2VpZiAoaXNfZmxvYXQoJHRoaXMtPnZhbHVlKSkgewokcmVzdWx0IC49ICdmbG9hdCc7Cn0gZWxzZWlmIChudWxsID09PSAkdGhpcy0+dmFsdWUpIHsKJHJlc3VsdCAuPSAnbnVsbCc7Cn0gZWxzZSB7CiRyZXN1bHQgLj0gZ2V0dHlwZSgkdGhpcy0+dmFsdWUpOwp9CiRyZXN1bHQgLj0gJyAnOwokcmVzdWx0IC49ICR0aGlzLT5uYW1lOwokcmVzdWx0IC49ICcgXSB7ICc7CmlmIChpc19hcnJheSgkdGhpcy0+dmFsdWUpKSB7CiRyZXN1bHQgLj0gJ0FycmF5JzsKfSBlbHNlIHsKCgoKJHJlc3VsdCAuPSAoc3RyaW5nKSAkdGhpcy0+dmFsdWU7Cn0KJHJlc3VsdCAuPSAiIH1cbiI7CgpyZXR1cm4gJHJlc3VsdDsKfQoKcHVibGljIGZ1bmN0aW9uIF9fc2xlZXAoKTogYXJyYXkKewp0aHJvdyBuZXcgRXhjZXB0aW9uKCJTZXJpYWxpemF0aW9uIG9mICdSZWZsZWN0aW9uQ29uc3RhbnQnIGlzIG5vdCBhbGxvd2VkIik7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX3dha2V1cCgpOiB2b2lkCnsKdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5zZXJpYWxpemF0aW9uIG9mICdSZWZsZWN0aW9uQ29uc3RhbnQnIGlzIG5vdCBhbGxvd2VkIik7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgppZiAoXFBIUF9WRVJTSU9OX0lEIDwgODAxMDApIHsKZmluYWwgY2xhc3MgUm91bmRpbmdNb2RlCnsKY29uc3QgSGFsZkF3YXlGcm9tWmVybyA9IDA7CmNvbnN0IEhhbGZUb3dhcmRzWmVybyA9IDE7CmNvbnN0IEhhbGZFdmVuID0gMjsKY29uc3QgSGFsZk9kZCA9IDM7CmNvbnN0IFRvd2FyZHNaZXJvID0gNDsKY29uc3QgQXdheUZyb21aZXJvID0gNTsKY29uc3QgTmVnYXRpdmVJbmZpbml0eSA9IDY7CmNvbnN0IFBvc2l0aXZlSW5maW5pdHkgPSA3OwoKcHJpdmF0ZSBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCnsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjYXNlcygpOiBhcnJheQp7CnJldHVybiBbCnNlbGY6OkhhbGZBd2F5RnJvbVplcm8sCnNlbGY6OkhhbGZUb3dhcmRzWmVybywKc2VsZjo6SGFsZkV2ZW4sCnNlbGY6OkhhbGZPZGQsCnNlbGY6OlRvd2FyZHNaZXJvLApzZWxmOjpBd2F5RnJvbVplcm8sCnNlbGY6Ok5lZ2F0aXZlSW5maW5pdHksCnNlbGY6OlBvc2l0aXZlSW5maW5pdHksCl07Cn0KfQp9IGVsc2VpZiAoXFBIUF9WRVJTSU9OX0lEIDwgODA0MDApIHsKcmVxdWlyZSBkaXJuYW1lKF9fRElSX18pLicvUm91bmRpbmdNb2RlLnBocCc7Cn0KPD9waHAKCgoKCgoKCgoKCnVzZSBTeW1mb255XFBvbHlmaWxsXFBocDg0IGFzIHA7CgppZiAoXFBIUF9WRVJTSU9OX0lEID49IDgwNDAwKSB7CnJldHVybjsKfQoKaWYgKGRlZmluZWQoJ0NVUkxfVkVSU0lPTl9IVFRQMycpIHx8IFxQSFBfVkVSU0lPTl9JRCA8IDgwMjAwICYmIGZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJykgJiYgY3VybF92ZXJzaW9uKClbJ3ZlcnNpb24nXSA+PSAweDA3NDIwMCkgeyAKaWYgKCFkZWZpbmVkKCdDVVJMX0hUVFBfVkVSU0lPTl8zJykpIHsKZGVmaW5lKCdDVVJMX0hUVFBfVkVSU0lPTl8zJywgMzApOwp9CgppZiAoIWRlZmluZWQoJ0NVUkxfSFRUUF9WRVJTSU9OXzNPTkxZJykgJiYgZGVmaW5lZCgnQ1VSTE9QVF9TU0hfSE9TVF9QVUJMSUNfS0VZX1NIQTI1NicpKSB7IApkZWZpbmUoJ0NVUkxfSFRUUF9WRVJTSU9OXzNPTkxZJywgMzEpOwp9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdhcnJheV9maW5kJykpIHsKZnVuY3Rpb24gYXJyYXlfZmluZChhcnJheSAkYXJyYXksIGNhbGxhYmxlICRjYWxsYmFjaykgeyByZXR1cm4gcFxQaHA4NDo6YXJyYXlfZmluZCgkYXJyYXksICRjYWxsYmFjayk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2FycmF5X2ZpbmRfa2V5JykpIHsKZnVuY3Rpb24gYXJyYXlfZmluZF9rZXkoYXJyYXkgJGFycmF5LCBjYWxsYWJsZSAkY2FsbGJhY2spIHsgcmV0dXJuIHBcUGhwODQ6OmFycmF5X2ZpbmRfa2V5KCRhcnJheSwgJGNhbGxiYWNrKTsgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnYXJyYXlfYW55JykpIHsKZnVuY3Rpb24gYXJyYXlfYW55KGFycmF5ICRhcnJheSwgY2FsbGFibGUgJGNhbGxiYWNrKTogYm9vbCB7IHJldHVybiBwXFBocDg0OjphcnJheV9hbnkoJGFycmF5LCAkY2FsbGJhY2spOyB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdhcnJheV9hbGwnKSkgewpmdW5jdGlvbiBhcnJheV9hbGwoYXJyYXkgJGFycmF5LCBjYWxsYWJsZSAkY2FsbGJhY2spOiBib29sIHsgcmV0dXJuIHBcUGhwODQ6OmFycmF5X2FsbCgkYXJyYXksICRjYWxsYmFjayk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2Zwb3cnKSkgewpmdW5jdGlvbiBmcG93KGZsb2F0ICRudW0sIGZsb2F0ICRleHBvbmVudCk6IGZsb2F0IHsgcmV0dXJuIHBcUGhwODQ6OmZwb3coJG51bSwgJGV4cG9uZW50KTsgfQp9CgppZiAoXFBIUF9WRVJTSU9OX0lEID49IDgwMDAwKSB7CnJldHVybiByZXF1aXJlIF9fRElSX18uJy9ib290c3RyYXA4MC5waHAnOwp9CgppZiAoZXh0ZW5zaW9uX2xvYWRlZCgnbWJzdHJpbmcnKSkgewppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfdWNmaXJzdCcpKSB7CmZ1bmN0aW9uIG1iX3VjZmlyc3Qoc3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxQaHA4NDo6bWJfdWNmaXJzdCgkc3RyaW5nLCAkZW5jb2RpbmcpOyB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9sY2ZpcnN0JykpIHsKZnVuY3Rpb24gbWJfbGNmaXJzdChzdHJpbmcgJHN0cmluZywgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXFBocDg0OjptYl9sY2ZpcnN0KCRzdHJpbmcsICRlbmNvZGluZyk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3RyaW0nKSkgewpmdW5jdGlvbiBtYl90cmltKHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRjaGFyYWN0ZXJzID0gbnVsbCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXFBocDg0OjptYl90cmltKCRzdHJpbmcsICRjaGFyYWN0ZXJzLCAkZW5jb2RpbmcpOyB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9sdHJpbScpKSB7CmZ1bmN0aW9uIG1iX2x0cmltKHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRjaGFyYWN0ZXJzID0gbnVsbCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXFBocDg0OjptYl9sdHJpbSgkc3RyaW5nLCAkY2hhcmFjdGVycywgJGVuY29kaW5nKTsgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfcnRyaW0nKSkgewpmdW5jdGlvbiBtYl9ydHJpbShzdHJpbmcgJHN0cmluZywgP3N0cmluZyAkY2hhcmFjdGVycyA9IG51bGwsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxQaHA4NDo6bWJfcnRyaW0oJHN0cmluZywgJGNoYXJhY3RlcnMsICRlbmNvZGluZyk7IH0KfQp9CgppZiAoZXh0ZW5zaW9uX2xvYWRlZCgnYmNtYXRoJykpIHsKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2JjY2VpbCcpKSB7CmZ1bmN0aW9uIGJjY2VpbChzdHJpbmcgJG51bSk6IHN0cmluZyB7IHJldHVybiBwXFBocDg0OjpiY2NlaWwoJG51bSk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnYmNkaXZtb2QnKSkgewpmdW5jdGlvbiBiY2Rpdm1vZChzdHJpbmcgJG51bTEsIHN0cmluZyAkbnVtMiwgP2ludCAkc2NhbGUgPSBudWxsKTogP2FycmF5IHsgcmV0dXJuIHBcUGhwODQ6OmJjZGl2bW9kKCRudW0xLCAkbnVtMiwgJHNjYWxlKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdiY2Zsb29yJykpIHsKZnVuY3Rpb24gYmNmbG9vcihzdHJpbmcgJG51bSk6IHN0cmluZyB7IHJldHVybiBwXFBocDg0OjpiY2Zsb29yKCRudW0pOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2Jjcm91bmQnKSkgewpmdW5jdGlvbiBiY3JvdW5kKHN0cmluZyAkbnVtLCBpbnQgJHByZWNpc2lvbiA9IDAsICRtb2RlID0gUm91bmRpbmdNb2RlOjpIYWxmQXdheUZyb21aZXJvKTogc3RyaW5nIHsgcmV0dXJuIHBcUGhwODQ6OmJjcm91bmQoJG51bSwgJHByZWNpc2lvbiwgJG1vZGUpOyB9Cn0KfQoKaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ2ludGwnKSAmJiAhZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdHJfc3BsaXQnKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJfc3BsaXQoc3RyaW5nICRzdHJpbmcsIGludCAkbGVuZ3RoID0gMSkgeyByZXR1cm4gcFxQaHA4NDo6Z3JhcGhlbWVfc3RyX3NwbGl0KCRzdHJpbmcsICRsZW5ndGgpOyB9Cn0KPD9waHAKCgoKCgoKCgoKCnVzZSBTeW1mb255XFBvbHlmaWxsXFBocDg0IGFzIHA7CgppZiAoZXh0ZW5zaW9uX2xvYWRlZCgnbWJzdHJpbmcnKSkgewppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfdWNmaXJzdCcpKSB7CmZ1bmN0aW9uIG1iX3VjZmlyc3Qoc3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZyB7IHJldHVybiBwXFBocDg0OjptYl91Y2ZpcnN0KCRzdHJpbmcsICRlbmNvZGluZyk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2xjZmlyc3QnKSkgewpmdW5jdGlvbiBtYl9sY2ZpcnN0KHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcgeyByZXR1cm4gcFxQaHA4NDo6bWJfbGNmaXJzdCgkc3RyaW5nLCAkZW5jb2RpbmcpOyB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl90cmltJykpIHsKZnVuY3Rpb24gbWJfdHJpbShzdHJpbmcgJHN0cmluZywgP3N0cmluZyAkY2hhcmFjdGVycyA9IG51bGwsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZyB7IHJldHVybiBwXFBocDg0OjptYl90cmltKCRzdHJpbmcsICRjaGFyYWN0ZXJzLCAkZW5jb2RpbmcpOyB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9sdHJpbScpKSB7CmZ1bmN0aW9uIG1iX2x0cmltKHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRjaGFyYWN0ZXJzID0gbnVsbCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nIHsgcmV0dXJuIHBcUGhwODQ6Om1iX2x0cmltKCRzdHJpbmcsICRjaGFyYWN0ZXJzLCAkZW5jb2RpbmcpOyB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9ydHJpbScpKSB7CmZ1bmN0aW9uIG1iX3J0cmltKHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRjaGFyYWN0ZXJzID0gbnVsbCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nIHsgcmV0dXJuIHBcUGhwODQ6Om1iX3J0cmltKCRzdHJpbmcsICRjaGFyYWN0ZXJzLCAkZW5jb2RpbmcpOyB9Cn0KfQoKaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ2JjbWF0aCcpKSB7CmlmICghZnVuY3Rpb25fZXhpc3RzKCdiY2NlaWwnKSkgewpmdW5jdGlvbiBiY2NlaWwoc3RyaW5nICRudW0pOiBzdHJpbmcgeyByZXR1cm4gcFxQaHA4NDo6YmNjZWlsKCRudW0pOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2JjZGl2bW9kJykpIHsKZnVuY3Rpb24gYmNkaXZtb2Qoc3RyaW5nICRudW0xLCBzdHJpbmcgJG51bTIsID9pbnQgJHNjYWxlID0gbnVsbCk6ID9hcnJheSB7IHJldHVybiBwXFBocDg0OjpiY2Rpdm1vZCgkbnVtMSwgJG51bTIsICRzY2FsZSk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnYmNmbG9vcicpKSB7CmZ1bmN0aW9uIGJjZmxvb3Ioc3RyaW5nICRudW0pOiBzdHJpbmcgeyByZXR1cm4gcFxQaHA4NDo6YmNmbG9vcigkbnVtKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdiY3JvdW5kJykpIHsKZnVuY3Rpb24gYmNyb3VuZChzdHJpbmcgJG51bSwgaW50ICRwcmVjaXNpb24gPSAwLCAkbW9kZSA9IFJvdW5kaW5nTW9kZTo6SGFsZkF3YXlGcm9tWmVybyk6IHN0cmluZyB7IHJldHVybiBwXFBocDg0OjpiY3JvdW5kKCRudW0sICRwcmVjaXNpb24sICRtb2RlKTsgfQp9Cn0KCmlmIChcUEhQX1ZFUlNJT05fSUQgPj0gODAyMDApIHsKcmV0dXJuIHJlcXVpcmUgX19ESVJfXy4nL2Jvb3RzdHJhcDgyLnBocCc7Cn0KCmlmIChleHRlbnNpb25fbG9hZGVkKCdpbnRsJykgJiYgIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfc3RyX3NwbGl0JykpIHsKZnVuY3Rpb24gZ3JhcGhlbWVfc3RyX3NwbGl0KHN0cmluZyAkc3RyaW5nLCBpbnQgJGxlbmd0aCA9IDEpIHsgcmV0dXJuIHBcUGhwODQ6OmdyYXBoZW1lX3N0cl9zcGxpdCgkc3RyaW5nLCAkbGVuZ3RoKTsgfQp9Cjw/cGhwCgoKCgoKCgoKCgp1c2UgU3ltZm9ueVxQb2x5ZmlsbFxQaHA4NCBhcyBwOwoKaWYgKFxQSFBfVkVSU0lPTl9JRCA+PSA4MDQwMCkgewpyZXR1cm47Cn0KCmlmIChleHRlbnNpb25fbG9hZGVkKCdpbnRsJykgJiYgIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfc3RyX3NwbGl0JykpIHsKZnVuY3Rpb24gZ3JhcGhlbWVfc3RyX3NwbGl0KHN0cmluZyAkc3RyaW5nLCBpbnQgJGxlbmd0aCA9IDEpOiBhcnJheXxmYWxzZSB7IHJldHVybiBwXFBocDg0OjpncmFwaGVtZV9zdHJfc3BsaXQoJHN0cmluZywgJGxlbmd0aCk7IH0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uOwoKCgoKCgppbnRlcmZhY2UgRXhjZXB0aW9uSW50ZXJmYWNlIGV4dGVuZHMgXFRocm93YWJsZQp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvbjsKCgoKCgoKY2xhc3MgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGV4dGVuZHMgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbkludGVyZmFjZQp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvbjsKCgoKCgoKY2xhc3MgTG9naWNFeGNlcHRpb24gZXh0ZW5kcyBcTG9naWNFeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb25JbnRlcmZhY2UKewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb247Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xQcm9jZXNzOwoKCgoKCgpjbGFzcyBQcm9jZXNzRmFpbGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgp7CnByaXZhdGUgJHByb2Nlc3M7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUHJvY2VzcyAkcHJvY2VzcykKewppZiAoJHByb2Nlc3MtPmlzU3VjY2Vzc2Z1bCgpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0V4cGVjdGVkIGEgZmFpbGVkIHByb2Nlc3MsIGJ1dCB0aGUgZ2l2ZW4gcHJvY2VzcyB3YXMgc3VjY2Vzc2Z1bC4nKTsKfQoKJGVycm9yID0gc3ByaW50ZignVGhlIGNvbW1hbmQgIiVzIiBmYWlsZWQuJy4iXG5cbkV4aXQgQ29kZTogJXMoJXMpXG5cbldvcmtpbmcgZGlyZWN0b3J5OiAlcyIsCiRwcm9jZXNzLT5nZXRDb21tYW5kTGluZSgpLAokcHJvY2Vzcy0+Z2V0RXhpdENvZGUoKSwKJHByb2Nlc3MtPmdldEV4aXRDb2RlVGV4dCgpLAokcHJvY2Vzcy0+Z2V0V29ya2luZ0RpcmVjdG9yeSgpCik7CgppZiAoISRwcm9jZXNzLT5pc091dHB1dERpc2FibGVkKCkpIHsKJGVycm9yIC49IHNwcmludGYoIlxuXG5PdXRwdXQ6XG49PT09PT09PT09PT09PT09XG4lc1xuXG5FcnJvciBPdXRwdXQ6XG49PT09PT09PT09PT09PT09XG4lcyIsCiRwcm9jZXNzLT5nZXRPdXRwdXQoKSwKJHByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCkKKTsKfQoKcGFyZW50OjpfX2NvbnN0cnVjdCgkZXJyb3IpOwoKJHRoaXMtPnByb2Nlc3MgPSAkcHJvY2VzczsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFByb2Nlc3MoKQp7CnJldHVybiAkdGhpcy0+cHJvY2VzczsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb247Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xQcm9jZXNzOwoKCgoKCgpmaW5hbCBjbGFzcyBQcm9jZXNzU2lnbmFsZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCnsKcHJpdmF0ZSAkcHJvY2VzczsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQcm9jZXNzICRwcm9jZXNzKQp7CiR0aGlzLT5wcm9jZXNzID0gJHByb2Nlc3M7CgpwYXJlbnQ6Ol9fY29uc3RydWN0KHNwcmludGYoJ1RoZSBwcm9jZXNzIGhhcyBiZWVuIHNpZ25hbGVkIHdpdGggc2lnbmFsICIlcyIuJywgJHByb2Nlc3MtPmdldFRlcm1TaWduYWwoKSkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvY2VzcygpOiBQcm9jZXNzCnsKcmV0dXJuICR0aGlzLT5wcm9jZXNzOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U2lnbmFsKCk6IGludAp7CnJldHVybiAkdGhpcy0+Z2V0UHJvY2VzcygpLT5nZXRUZXJtU2lnbmFsKCk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcUHJvY2VzczsKCgoKCgoKY2xhc3MgUHJvY2Vzc1RpbWVkT3V0RXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgp7CnB1YmxpYyBjb25zdCBUWVBFX0dFTkVSQUwgPSAxOwpwdWJsaWMgY29uc3QgVFlQRV9JRExFID0gMjsKCnByaXZhdGUgJHByb2Nlc3M7CnByaXZhdGUgJHRpbWVvdXRUeXBlOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFByb2Nlc3MgJHByb2Nlc3MsIGludCAkdGltZW91dFR5cGUpCnsKJHRoaXMtPnByb2Nlc3MgPSAkcHJvY2VzczsKJHRoaXMtPnRpbWVvdXRUeXBlID0gJHRpbWVvdXRUeXBlOwoKcGFyZW50OjpfX2NvbnN0cnVjdChzcHJpbnRmKAonVGhlIHByb2Nlc3MgIiVzIiBleGNlZWRlZCB0aGUgdGltZW91dCBvZiAlcyBzZWNvbmRzLicsCiRwcm9jZXNzLT5nZXRDb21tYW5kTGluZSgpLAokdGhpcy0+Z2V0RXhjZWVkZWRUaW1lb3V0KCkKKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm9jZXNzKCkKewpyZXR1cm4gJHRoaXMtPnByb2Nlc3M7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0dlbmVyYWxUaW1lb3V0KCkKewpyZXR1cm4gc2VsZjo6VFlQRV9HRU5FUkFMID09PSAkdGhpcy0+dGltZW91dFR5cGU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0lkbGVUaW1lb3V0KCkKewpyZXR1cm4gc2VsZjo6VFlQRV9JRExFID09PSAkdGhpcy0+dGltZW91dFR5cGU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRFeGNlZWRlZFRpbWVvdXQoKQp7CnN3aXRjaCAoJHRoaXMtPnRpbWVvdXRUeXBlKSB7CmNhc2Ugc2VsZjo6VFlQRV9HRU5FUkFMOgpyZXR1cm4gJHRoaXMtPnByb2Nlc3MtPmdldFRpbWVvdXQoKTsKCmNhc2Ugc2VsZjo6VFlQRV9JRExFOgpyZXR1cm4gJHRoaXMtPnByb2Nlc3MtPmdldElkbGVUaW1lb3V0KCk7CgpkZWZhdWx0Ogp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ1Vua25vd24gdGltZW91dCB0eXBlICIlZCIuJywgJHRoaXMtPnRpbWVvdXRUeXBlKSk7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb247CgoKCgoKCmNsYXNzIFJ1bnRpbWVFeGNlcHRpb24gZXh0ZW5kcyBcUnVudGltZUV4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbkludGVyZmFjZQp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzOwoKCgoKCgoKY2xhc3MgRXhlY3V0YWJsZUZpbmRlcgp7CnByaXZhdGUgY29uc3QgQ01EX0JVSUxUSU5TID0gWwonYXNzb2MnLCAnYnJlYWsnLCAnY2FsbCcsICdjZCcsICdjaGRpcicsICdjbHMnLCAnY29sb3InLCAnY29weScsICdkYXRlJywKJ2RlbCcsICdkaXInLCAnZWNobycsICdlbmRsb2NhbCcsICdlcmFzZScsICdleGl0JywgJ2ZvcicsICdmdHlwZScsICdnb3RvJywKJ2hlbHAnLCAnaWYnLCAnbGFiZWwnLCAnbWQnLCAnbWtkaXInLCAnbWtsaW5rJywgJ21vdmUnLCAncGF0aCcsICdwYXVzZScsCidwb3BkJywgJ3Byb21wdCcsICdwdXNoZCcsICdyZCcsICdyZW0nLCAncmVuJywgJ3JlbmFtZScsICdybWRpcicsICdzZXQnLAonc2V0bG9jYWwnLCAnc2hpZnQnLCAnc3RhcnQnLCAndGltZScsICd0aXRsZScsICd0eXBlJywgJ3ZlcicsICd2b2wnLApdOwoKcHJpdmF0ZSAkc3VmZml4ZXMgPSBbXTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRTdWZmaXhlcyhhcnJheSAkc3VmZml4ZXMpCnsKJHRoaXMtPnN1ZmZpeGVzID0gJHN1ZmZpeGVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkU3VmZml4KHN0cmluZyAkc3VmZml4KQp7CiR0aGlzLT5zdWZmaXhlc1tdID0gJHN1ZmZpeDsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmQoc3RyaW5nICRuYW1lLCA/c3RyaW5nICRkZWZhdWx0ID0gbnVsbCwgYXJyYXkgJGV4dHJhRGlycyA9IFtdKQp7CgppZiAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgJiYgXGluX2FycmF5KHN0cnRvbG93ZXIoJG5hbWUpLCBzZWxmOjpDTURfQlVJTFRJTlMsIHRydWUpKSB7CnJldHVybiAkbmFtZTsKfQoKJGRpcnMgPSBhcnJheV9tZXJnZSgKZXhwbG9kZShcUEFUSF9TRVBBUkFUT1IsIGdldGVudignUEFUSCcpID86IGdldGVudignUGF0aCcpKSwKJGV4dHJhRGlycwopOwoKJHN1ZmZpeGVzID0gW107CmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUikgewokcGF0aEV4dCA9IGdldGVudignUEFUSEVYVCcpOwokc3VmZml4ZXMgPSAkdGhpcy0+c3VmZml4ZXM7CiRzdWZmaXhlcyA9IGFycmF5X21lcmdlKCRzdWZmaXhlcywgJHBhdGhFeHQgPyBleHBsb2RlKFxQQVRIX1NFUEFSQVRPUiwgJHBhdGhFeHQpIDogWycuZXhlJywgJy5iYXQnLCAnLmNtZCcsICcuY29tJ10pOwp9CiRzdWZmaXhlcyA9ICcnICE9PSBwYXRoaW5mbygkbmFtZSwgUEFUSElORk9fRVhURU5TSU9OKSA/IGFycmF5X21lcmdlKFsnJ10sICRzdWZmaXhlcykgOiBhcnJheV9tZXJnZSgkc3VmZml4ZXMsIFsnJ10pOwpmb3JlYWNoICgkc3VmZml4ZXMgYXMgJHN1ZmZpeCkgewpmb3JlYWNoICgkZGlycyBhcyAkZGlyKSB7CmlmICgnJyA9PT0gJGRpcikgewokZGlyID0gJy4nOwp9CmlmIChAaXNfZmlsZSgkZmlsZSA9ICRkaXIuXERJUkVDVE9SWV9TRVBBUkFUT1IuJG5hbWUuJHN1ZmZpeCkgJiYgKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SIHx8IEBpc19leGVjdXRhYmxlKCRmaWxlKSkpIHsKcmV0dXJuICRmaWxlOwp9CgppZiAoIUBpc19kaXIoJGRpcikgJiYgYmFzZW5hbWUoJGRpcikgPT09ICRuYW1lLiRzdWZmaXggJiYgQGlzX2V4ZWN1dGFibGUoJGRpcikpIHsKcmV0dXJuICRkaXI7Cn0KfQp9CgppZiAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgfHwgIVxmdW5jdGlvbl9leGlzdHMoJ2V4ZWMnKSB8fCBcc3RybGVuKCRuYW1lKSAhPT0gc3RyY3NwbigkbmFtZSwgJy8nLlxESVJFQ1RPUllfU0VQQVJBVE9SKSkgewpyZXR1cm4gJGRlZmF1bHQ7Cn0KCiRleGVjUmVzdWx0ID0gZXhlYygnY29tbWFuZCAtdiAtLSAnLmVzY2FwZXNoZWxsYXJnKCRuYW1lKSk7CgppZiAoKCRleGVjdXRhYmxlUGF0aCA9IHN1YnN0cigkZXhlY1Jlc3VsdCwgMCwgc3RycG9zKCRleGVjUmVzdWx0LCBcUEhQX0VPTCkgPzogbnVsbCkpICYmIEBpc19leGVjdXRhYmxlKCRleGVjdXRhYmxlUGF0aCkpIHsKcmV0dXJuICRleGVjdXRhYmxlUGF0aDsKfQoKcmV0dXJuICRkZWZhdWx0Owp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uXFJ1bnRpbWVFeGNlcHRpb247CgoKCgoKCgoKY2xhc3MgSW5wdXRTdHJlYW0gaW1wbGVtZW50cyBcSXRlcmF0b3JBZ2dyZWdhdGUKewoKcHJpdmF0ZSAkb25FbXB0eSA9IG51bGw7CnByaXZhdGUgJGlucHV0ID0gW107CnByaXZhdGUgJG9wZW4gPSB0cnVlOwoKCgoKcHVibGljIGZ1bmN0aW9uIG9uRW1wdHkoP2NhbGxhYmxlICRvbkVtcHR5ID0gbnVsbCkKewokdGhpcy0+b25FbXB0eSA9ICRvbkVtcHR5Owp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGlucHV0KQp7CmlmIChudWxsID09PSAkaW5wdXQpIHsKcmV0dXJuOwp9CmlmICgkdGhpcy0+aXNDbG9zZWQoKSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCciJXMiIGlzIGNsb3NlZC4nLCBzdGF0aWM6OmNsYXNzKSk7Cn0KJHRoaXMtPmlucHV0W10gPSBQcm9jZXNzVXRpbHM6OnZhbGlkYXRlSW5wdXQoX19NRVRIT0RfXywgJGlucHV0KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKewokdGhpcy0+b3BlbiA9IGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNDbG9zZWQoKQp7CnJldHVybiAhJHRoaXMtPm9wZW47Cn0KCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gZ2V0SXRlcmF0b3IoKQp7CiR0aGlzLT5vcGVuID0gdHJ1ZTsKCndoaWxlICgkdGhpcy0+b3BlbiB8fCAkdGhpcy0+aW5wdXQpIHsKaWYgKCEkdGhpcy0+aW5wdXQpIHsKeWllbGQgJyc7CmNvbnRpbnVlOwp9CiRjdXJyZW50ID0gYXJyYXlfc2hpZnQoJHRoaXMtPmlucHV0KTsKCmlmICgkY3VycmVudCBpbnN0YW5jZW9mIFxJdGVyYXRvcikgewp5aWVsZCBmcm9tICRjdXJyZW50Owp9IGVsc2Ugewp5aWVsZCAkY3VycmVudDsKfQppZiAoISR0aGlzLT5pbnB1dCAmJiAkdGhpcy0+b3BlbiAmJiBudWxsICE9PSAkb25FbXB0eSA9ICR0aGlzLT5vbkVtcHR5KSB7CiR0aGlzLT53cml0ZSgkb25FbXB0eSgkdGhpcykpOwp9Cn0KfQp9CgpDb3B5cmlnaHQgKGMpIDIwMDQtcHJlc2VudCBGYWJpZW4gUG90ZW5jaWVyCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCnRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzOwoKCgoKCgoKY2xhc3MgUGhwRXhlY3V0YWJsZUZpbmRlcgp7CnByaXZhdGUgJGV4ZWN1dGFibGVGaW5kZXI7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7CiR0aGlzLT5leGVjdXRhYmxlRmluZGVyID0gbmV3IEV4ZWN1dGFibGVGaW5kZXIoKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZChib29sICRpbmNsdWRlQXJncyA9IHRydWUpCnsKaWYgKCRwaHAgPSBnZXRlbnYoJ1BIUF9CSU5BUlknKSkgewppZiAoIWlzX2V4ZWN1dGFibGUoJHBocCkgJiYgISRwaHAgPSAkdGhpcy0+ZXhlY3V0YWJsZUZpbmRlci0+ZmluZCgkcGhwKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmIChAaXNfZGlyKCRwaHApKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuICRwaHA7Cn0KCiRhcmdzID0gJHRoaXMtPmZpbmRBcmd1bWVudHMoKTsKJGFyZ3MgPSAkaW5jbHVkZUFyZ3MgJiYgJGFyZ3MgPyAnICcuaW1wbG9kZSgnICcsICRhcmdzKSA6ICcnOwoKCmlmIChcUEhQX0JJTkFSWSAmJiBcaW5fYXJyYXkoXFBIUF9TQVBJLCBbJ2NsaScsICdjbGktc2VydmVyJywgJ3BocGRiZyddLCB0cnVlKSkgewpyZXR1cm4gXFBIUF9CSU5BUlkuJGFyZ3M7Cn0KCmlmICgkcGhwID0gZ2V0ZW52KCdQSFBfUEFUSCcpKSB7CmlmICghQGlzX2V4ZWN1dGFibGUoJHBocCkgfHwgQGlzX2RpcigkcGhwKSkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiAkcGhwOwp9CgppZiAoJHBocCA9IGdldGVudignUEhQX1BFQVJfUEhQX0JJTicpKSB7CmlmIChAaXNfZXhlY3V0YWJsZSgkcGhwKSAmJiAhQGlzX2RpcigkcGhwKSkgewpyZXR1cm4gJHBocDsKfQp9CgppZiAoQGlzX2V4ZWN1dGFibGUoJHBocCA9IFxQSFBfQklORElSLignXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUiA/ICdcXHBocC5leGUnIDogJy9waHAnKSkgJiYgIUBpc19kaXIoJHBocCkpIHsKcmV0dXJuICRwaHA7Cn0KCiRkaXJzID0gW1xQSFBfQklORElSXTsKaWYgKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SKSB7CiRkaXJzW10gPSAnQzpceGFtcHBccGhwXFwnOwp9CgpyZXR1cm4gJHRoaXMtPmV4ZWN1dGFibGVGaW5kZXItPmZpbmQoJ3BocCcsIGZhbHNlLCAkZGlycyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmRBcmd1bWVudHMoKQp7CiRhcmd1bWVudHMgPSBbXTsKaWYgKCdwaHBkYmcnID09PSBcUEhQX1NBUEkpIHsKJGFyZ3VtZW50c1tdID0gJy1xcnInOwp9CgpyZXR1cm4gJGFyZ3VtZW50czsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2VzczsKCnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvblxMb2dpY0V4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uXFJ1bnRpbWVFeGNlcHRpb247CgoKCgoKCgoKCgpjbGFzcyBQaHBQcm9jZXNzIGV4dGVuZHMgUHJvY2Vzcwp7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRzY3JpcHQsID9zdHJpbmcgJGN3ZCA9IG51bGwsID9hcnJheSAkZW52ID0gbnVsbCwgaW50ICR0aW1lb3V0ID0gNjAsID9hcnJheSAkcGhwID0gbnVsbCkKewppZiAobnVsbCA9PT0gJHBocCkgewokZXhlY3V0YWJsZUZpbmRlciA9IG5ldyBQaHBFeGVjdXRhYmxlRmluZGVyKCk7CiRwaHAgPSAkZXhlY3V0YWJsZUZpbmRlci0+ZmluZChmYWxzZSk7CiRwaHAgPSBmYWxzZSA9PT0gJHBocCA/IG51bGwgOiBhcnJheV9tZXJnZShbJHBocF0sICRleGVjdXRhYmxlRmluZGVyLT5maW5kQXJndW1lbnRzKCkpOwp9CmlmICgncGhwZGJnJyA9PT0gXFBIUF9TQVBJKSB7CiRmaWxlID0gdGVtcG5hbShzeXNfZ2V0X3RlbXBfZGlyKCksICdkYmcnKTsKZmlsZV9wdXRfY29udGVudHMoJGZpbGUsICRzY3JpcHQpOwpyZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbigndW5saW5rJywgJGZpbGUpOwokcGhwW10gPSAkZmlsZTsKJHNjcmlwdCA9IG51bGw7Cn0KCnBhcmVudDo6X19jb25zdHJ1Y3QoJHBocCwgJGN3ZCwgJGVudiwgJHNjcmlwdCwgJHRpbWVvdXQpOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21TaGVsbENvbW1hbmRsaW5lKHN0cmluZyAkY29tbWFuZCwgP3N0cmluZyAkY3dkID0gbnVsbCwgP2FycmF5ICRlbnYgPSBudWxsLCAkaW5wdXQgPSBudWxsLCA/ZmxvYXQgJHRpbWVvdXQgPSA2MCkKewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oc3ByaW50ZignVGhlICIlcygpIiBtZXRob2QgY2Fubm90IGJlIGNhbGxlZCB3aGVuIHVzaW5nICIlcyIuJywgX19NRVRIT0RfXywgc2VsZjo6Y2xhc3MpKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHN0YXJ0KD9jYWxsYWJsZSAkY2FsbGJhY2sgPSBudWxsLCBhcnJheSAkZW52ID0gW10pCnsKaWYgKG51bGwgPT09ICR0aGlzLT5nZXRDb21tYW5kTGluZSgpKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdVbmFibGUgdG8gZmluZCB0aGUgUEhQIGV4ZWN1dGFibGUuJyk7Cn0KCnBhcmVudDo6c3RhcnQoJGNhbGxiYWNrLCAkZW52KTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xQaXBlczsKCnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CgoKCgoKCmFic3RyYWN0IGNsYXNzIEFic3RyYWN0UGlwZXMgaW1wbGVtZW50cyBQaXBlc0ludGVyZmFjZQp7CnB1YmxpYyAkcGlwZXMgPSBbXTsKCnByaXZhdGUgJGlucHV0QnVmZmVyID0gJyc7CnByaXZhdGUgJGlucHV0Owpwcml2YXRlICRibG9ja2VkID0gdHJ1ZTsKcHJpdmF0ZSAkbGFzdEVycm9yOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRpbnB1dCkKewppZiAoXGlzX3Jlc291cmNlKCRpbnB1dCkgfHwgJGlucHV0IGluc3RhbmNlb2YgXEl0ZXJhdG9yKSB7CiR0aGlzLT5pbnB1dCA9ICRpbnB1dDsKfSBlbHNlaWYgKFxpc19zdHJpbmcoJGlucHV0KSkgewokdGhpcy0+aW5wdXRCdWZmZXIgPSAkaW5wdXQ7Cn0gZWxzZSB7CiR0aGlzLT5pbnB1dEJ1ZmZlciA9IChzdHJpbmcpICRpbnB1dDsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQp7CmZvcmVhY2ggKCR0aGlzLT5waXBlcyBhcyAkcGlwZSkgewppZiAoXGlzX3Jlc291cmNlKCRwaXBlKSkgewpmY2xvc2UoJHBpcGUpOwp9Cn0KJHRoaXMtPnBpcGVzID0gW107Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBoYXNTeXN0ZW1DYWxsQmVlbkludGVycnVwdGVkKCk6IGJvb2wKewokbGFzdEVycm9yID0gJHRoaXMtPmxhc3RFcnJvcjsKJHRoaXMtPmxhc3RFcnJvciA9IG51bGw7CgoKcmV0dXJuIG51bGwgIT09ICRsYXN0RXJyb3IgJiYgZmFsc2UgIT09IHN0cmlwb3MoJGxhc3RFcnJvciwgJ2ludGVycnVwdGVkIHN5c3RlbSBjYWxsJyk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB1bmJsb2NrKCkKewppZiAoISR0aGlzLT5ibG9ja2VkKSB7CnJldHVybjsKfQoKZm9yZWFjaCAoJHRoaXMtPnBpcGVzIGFzICRwaXBlKSB7CnN0cmVhbV9zZXRfYmxvY2tpbmcoJHBpcGUsIDApOwp9CmlmIChcaXNfcmVzb3VyY2UoJHRoaXMtPmlucHV0KSkgewpzdHJlYW1fc2V0X2Jsb2NraW5nKCR0aGlzLT5pbnB1dCwgMCk7Cn0KCiR0aGlzLT5ibG9ja2VkID0gZmFsc2U7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHdyaXRlKCk6ID9hcnJheQp7CmlmICghaXNzZXQoJHRoaXMtPnBpcGVzWzBdKSkgewpyZXR1cm4gbnVsbDsKfQokaW5wdXQgPSAkdGhpcy0+aW5wdXQ7CgppZiAoJGlucHV0IGluc3RhbmNlb2YgXEl0ZXJhdG9yKSB7CmlmICghJGlucHV0LT52YWxpZCgpKSB7CiRpbnB1dCA9IG51bGw7Cn0gZWxzZWlmIChcaXNfcmVzb3VyY2UoJGlucHV0ID0gJGlucHV0LT5jdXJyZW50KCkpKSB7CnN0cmVhbV9zZXRfYmxvY2tpbmcoJGlucHV0LCAwKTsKfSBlbHNlaWYgKCFpc3NldCgkdGhpcy0+aW5wdXRCdWZmZXJbMF0pKSB7CmlmICghXGlzX3N0cmluZygkaW5wdXQpKSB7CmlmICghXGlzX3NjYWxhcigkaW5wdXQpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignIiVzIiB5aWVsZGVkIGEgdmFsdWUgb2YgdHlwZSAiJXMiLCBidXQgb25seSBzY2FsYXJzIGFuZCBzdHJlYW0gcmVzb3VyY2VzIGFyZSBzdXBwb3J0ZWQuJywgZ2V0X2RlYnVnX3R5cGUoJHRoaXMtPmlucHV0KSwgZ2V0X2RlYnVnX3R5cGUoJGlucHV0KSkpOwp9CiRpbnB1dCA9IChzdHJpbmcpICRpbnB1dDsKfQokdGhpcy0+aW5wdXRCdWZmZXIgPSAkaW5wdXQ7CiR0aGlzLT5pbnB1dC0+bmV4dCgpOwokaW5wdXQgPSBudWxsOwp9IGVsc2UgewokaW5wdXQgPSBudWxsOwp9Cn0KCiRyID0gJGUgPSBbXTsKJHcgPSBbJHRoaXMtPnBpcGVzWzBdXTsKCgppZiAoZmFsc2UgPT09IEBzdHJlYW1fc2VsZWN0KCRyLCAkdywgJGUsIDAsIDApKSB7CnJldHVybiBudWxsOwp9Cgpmb3JlYWNoICgkdyBhcyAkc3RkaW4pIHsKaWYgKGlzc2V0KCR0aGlzLT5pbnB1dEJ1ZmZlclswXSkpIHsKJHdyaXR0ZW4gPSBmd3JpdGUoJHN0ZGluLCAkdGhpcy0+aW5wdXRCdWZmZXIpOwokdGhpcy0+aW5wdXRCdWZmZXIgPSBzdWJzdHIoJHRoaXMtPmlucHV0QnVmZmVyLCAkd3JpdHRlbik7CmlmIChpc3NldCgkdGhpcy0+aW5wdXRCdWZmZXJbMF0pKSB7CnJldHVybiBbJHRoaXMtPnBpcGVzWzBdXTsKfQp9CgppZiAoJGlucHV0KSB7CndoaWxlICh0cnVlKSB7CiRkYXRhID0gZnJlYWQoJGlucHV0LCBzZWxmOjpDSFVOS19TSVpFKTsKaWYgKCFpc3NldCgkZGF0YVswXSkpIHsKYnJlYWs7Cn0KJHdyaXR0ZW4gPSBmd3JpdGUoJHN0ZGluLCAkZGF0YSk7CiRkYXRhID0gc3Vic3RyKCRkYXRhLCAkd3JpdHRlbik7CmlmIChpc3NldCgkZGF0YVswXSkpIHsKJHRoaXMtPmlucHV0QnVmZmVyID0gJGRhdGE7CgpyZXR1cm4gWyR0aGlzLT5waXBlc1swXV07Cn0KfQppZiAoZmVvZigkaW5wdXQpKSB7CmlmICgkdGhpcy0+aW5wdXQgaW5zdGFuY2VvZiBcSXRlcmF0b3IpIHsKJHRoaXMtPmlucHV0LT5uZXh0KCk7Cn0gZWxzZSB7CiR0aGlzLT5pbnB1dCA9IG51bGw7Cn0KfQp9Cn0KCgppZiAoIWlzc2V0KCR0aGlzLT5pbnB1dEJ1ZmZlclswXSkgJiYgISgkdGhpcy0+aW5wdXQgaW5zdGFuY2VvZiBcSXRlcmF0b3IgPyAkdGhpcy0+aW5wdXQtPnZhbGlkKCkgOiAkdGhpcy0+aW5wdXQpKSB7CiR0aGlzLT5pbnB1dCA9IG51bGw7CmZjbG9zZSgkdGhpcy0+cGlwZXNbMF0pOwp1bnNldCgkdGhpcy0+cGlwZXNbMF0pOwp9IGVsc2VpZiAoISR3KSB7CnJldHVybiBbJHRoaXMtPnBpcGVzWzBdXTsKfQoKcmV0dXJuIG51bGw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBoYW5kbGVFcnJvcihpbnQgJHR5cGUsIHN0cmluZyAkbXNnKQp7CiR0aGlzLT5sYXN0RXJyb3IgPSAkbXNnOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFBpcGVzOwoKCgoKCgoKCmludGVyZmFjZSBQaXBlc0ludGVyZmFjZQp7CnB1YmxpYyBjb25zdCBDSFVOS19TSVpFID0gMTYzODQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGVzY3JpcHRvcnMoKTogYXJyYXk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlcygpOiBhcnJheTsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlYWRBbmRXcml0ZShib29sICRibG9ja2luZywgYm9vbCAkY2xvc2UgPSBmYWxzZSk6IGFycmF5OwoKCgoKcHVibGljIGZ1bmN0aW9uIGFyZU9wZW4oKTogYm9vbDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXZlUmVhZFN1cHBvcnQoKTogYm9vbDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xQaXBlczsKCnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFByb2Nlc3M7CgoKCgoKCgoKY2xhc3MgVW5peFBpcGVzIGV4dGVuZHMgQWJzdHJhY3RQaXBlcwp7CnByaXZhdGUgJHR0eU1vZGU7CnByaXZhdGUgJHB0eU1vZGU7CnByaXZhdGUgJGhhdmVSZWFkU3VwcG9ydDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/Ym9vbCAkdHR5TW9kZSwgYm9vbCAkcHR5TW9kZSwgJGlucHV0LCBib29sICRoYXZlUmVhZFN1cHBvcnQpCnsKJHRoaXMtPnR0eU1vZGUgPSAkdHR5TW9kZTsKJHRoaXMtPnB0eU1vZGUgPSAkcHR5TW9kZTsKJHRoaXMtPmhhdmVSZWFkU3VwcG9ydCA9ICRoYXZlUmVhZFN1cHBvcnQ7CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRpbnB1dCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX3NsZWVwKCk6IGFycmF5CnsKdGhyb3cgbmV3IFxCYWRNZXRob2RDYWxsRXhjZXB0aW9uKCdDYW5ub3Qgc2VyaWFsaXplICcuX19DTEFTU19fKTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fd2FrZXVwKCkKewp0aHJvdyBuZXcgXEJhZE1ldGhvZENhbGxFeGNlcHRpb24oJ0Nhbm5vdCB1bnNlcmlhbGl6ZSAnLl9fQ0xBU1NfXyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCkKewokdGhpcy0+Y2xvc2UoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERlc2NyaXB0b3JzKCk6IGFycmF5CnsKaWYgKCEkdGhpcy0+aGF2ZVJlYWRTdXBwb3J0KSB7CiRudWxsc3RyZWFtID0gZm9wZW4oJy9kZXYvbnVsbCcsICdjJyk7CgpyZXR1cm4gWwpbJ3BpcGUnLCAnciddLAokbnVsbHN0cmVhbSwKJG51bGxzdHJlYW0sCl07Cn0KCmlmICgkdGhpcy0+dHR5TW9kZSkgewpyZXR1cm4gWwpbJ2ZpbGUnLCAnL2Rldi90dHknLCAnciddLApbJ2ZpbGUnLCAnL2Rldi90dHknLCAndyddLApbJ2ZpbGUnLCAnL2Rldi90dHknLCAndyddLApdOwp9CgppZiAoJHRoaXMtPnB0eU1vZGUgJiYgUHJvY2Vzczo6aXNQdHlTdXBwb3J0ZWQoKSkgewpyZXR1cm4gWwpbJ3B0eSddLApbJ3B0eSddLApbJ3B0eSddLApdOwp9CgpyZXR1cm4gWwpbJ3BpcGUnLCAnciddLApbJ3BpcGUnLCAndyddLCAKWydwaXBlJywgJ3cnXSwgCl07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlcygpOiBhcnJheQp7CnJldHVybiBbXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlYWRBbmRXcml0ZShib29sICRibG9ja2luZywgYm9vbCAkY2xvc2UgPSBmYWxzZSk6IGFycmF5CnsKJHRoaXMtPnVuYmxvY2soKTsKJHcgPSAkdGhpcy0+d3JpdGUoKTsKCiRyZWFkID0gJGUgPSBbXTsKJHIgPSAkdGhpcy0+cGlwZXM7CnVuc2V0KCRyWzBdKTsKCgpzZXRfZXJyb3JfaGFuZGxlcihbJHRoaXMsICdoYW5kbGVFcnJvciddKTsKaWYgKCgkciB8fCAkdykgJiYgZmFsc2UgPT09IHN0cmVhbV9zZWxlY3QoJHIsICR3LCAkZSwgMCwgJGJsb2NraW5nID8gUHJvY2Vzczo6VElNRU9VVF9QUkVDSVNJT04gKiAxRTYgOiAwKSkgewpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKCgppZiAoISR0aGlzLT5oYXNTeXN0ZW1DYWxsQmVlbkludGVycnVwdGVkKCkpIHsKJHRoaXMtPnBpcGVzID0gW107Cn0KCnJldHVybiAkcmVhZDsKfQpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKCmZvcmVhY2ggKCRyIGFzICRwaXBlKSB7CgoKJHJlYWRbJHR5cGUgPSBhcnJheV9zZWFyY2goJHBpcGUsICR0aGlzLT5waXBlcywgdHJ1ZSldID0gJyc7CgpkbyB7CiRkYXRhID0gQGZyZWFkKCRwaXBlLCBzZWxmOjpDSFVOS19TSVpFKTsKJHJlYWRbJHR5cGVdIC49ICRkYXRhOwp9IHdoaWxlIChpc3NldCgkZGF0YVswXSkgJiYgKCRjbG9zZSB8fCBpc3NldCgkZGF0YVtzZWxmOjpDSFVOS19TSVpFIC0gMV0pKSk7CgppZiAoIWlzc2V0KCRyZWFkWyR0eXBlXVswXSkpIHsKdW5zZXQoJHJlYWRbJHR5cGVdKTsKfQoKaWYgKCRjbG9zZSAmJiBmZW9mKCRwaXBlKSkgewpmY2xvc2UoJHBpcGUpOwp1bnNldCgkdGhpcy0+cGlwZXNbJHR5cGVdKTsKfQp9CgpyZXR1cm4gJHJlYWQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXZlUmVhZFN1cHBvcnQoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+aGF2ZVJlYWRTdXBwb3J0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYXJlT3BlbigpOiBib29sCnsKcmV0dXJuIChib29sKSAkdGhpcy0+cGlwZXM7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcUGlwZXM7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb25cUnVudGltZUV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcUHJvY2VzczsKCgoKCgoKCgoKCgpjbGFzcyBXaW5kb3dzUGlwZXMgZXh0ZW5kcyBBYnN0cmFjdFBpcGVzCnsKcHJpdmF0ZSAkZmlsZXMgPSBbXTsKcHJpdmF0ZSAkZmlsZUhhbmRsZXMgPSBbXTsKcHJpdmF0ZSAkbG9ja0hhbmRsZXMgPSBbXTsKcHJpdmF0ZSAkcmVhZEJ5dGVzID0gWwpQcm9jZXNzOjpTVERPVVQgPT4gMCwKUHJvY2Vzczo6U1RERVJSID0+IDAsCl07CnByaXZhdGUgJGhhdmVSZWFkU3VwcG9ydDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaW5wdXQsIGJvb2wgJGhhdmVSZWFkU3VwcG9ydCkKewokdGhpcy0+aGF2ZVJlYWRTdXBwb3J0ID0gJGhhdmVSZWFkU3VwcG9ydDsKCmlmICgkdGhpcy0+aGF2ZVJlYWRTdXBwb3J0KSB7CgoKCgokcGlwZXMgPSBbClByb2Nlc3M6OlNURE9VVCA9PiBQcm9jZXNzOjpPVVQsClByb2Nlc3M6OlNUREVSUiA9PiBQcm9jZXNzOjpFUlIsCl07CiR0bXBEaXIgPSBzeXNfZ2V0X3RlbXBfZGlyKCk7CiRsYXN0RXJyb3IgPSAndW5rbm93biByZWFzb24nOwpzZXRfZXJyb3JfaGFuZGxlcihmdW5jdGlvbiAoJHR5cGUsICRtc2cpIHVzZSAoJiRsYXN0RXJyb3IpIHsgJGxhc3RFcnJvciA9ICRtc2c7IH0pOwpmb3IgKCRpID0gMDs7ICsrJGkpIHsKZm9yZWFjaCAoJHBpcGVzIGFzICRwaXBlID0+ICRuYW1lKSB7CiRmaWxlID0gc3ByaW50ZignJXNcXHNmX3Byb2NfJTAyWC4lcycsICR0bXBEaXIsICRpLCAkbmFtZSk7CgppZiAoISRoID0gZm9wZW4oJGZpbGUuJy5sb2NrJywgJ3cnKSkgewppZiAoZmlsZV9leGlzdHMoJGZpbGUuJy5sb2NrJykpIHsKY29udGludWUgMjsKfQpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ0EgdGVtcG9yYXJ5IGZpbGUgY291bGQgbm90IGJlIG9wZW5lZCB0byB3cml0ZSB0aGUgcHJvY2VzcyBvdXRwdXQ6ICcuJGxhc3RFcnJvcik7Cn0KaWYgKCFmbG9jaygkaCwgXExPQ0tfRVggfCBcTE9DS19OQikpIHsKY29udGludWUgMjsKfQppZiAoaXNzZXQoJHRoaXMtPmxvY2tIYW5kbGVzWyRwaXBlXSkpIHsKZmxvY2soJHRoaXMtPmxvY2tIYW5kbGVzWyRwaXBlXSwgXExPQ0tfVU4pOwpmY2xvc2UoJHRoaXMtPmxvY2tIYW5kbGVzWyRwaXBlXSk7Cn0KJHRoaXMtPmxvY2tIYW5kbGVzWyRwaXBlXSA9ICRoOwoKaWYgKCEoJGggPSBmb3BlbigkZmlsZSwgJ3cnKSkgfHwgIWZjbG9zZSgkaCkgfHwgISRoID0gZm9wZW4oJGZpbGUsICdyJykpIHsKZmxvY2soJHRoaXMtPmxvY2tIYW5kbGVzWyRwaXBlXSwgXExPQ0tfVU4pOwpmY2xvc2UoJHRoaXMtPmxvY2tIYW5kbGVzWyRwaXBlXSk7CnVuc2V0KCR0aGlzLT5sb2NrSGFuZGxlc1skcGlwZV0pOwpjb250aW51ZSAyOwp9CiR0aGlzLT5maWxlSGFuZGxlc1skcGlwZV0gPSAkaDsKJHRoaXMtPmZpbGVzWyRwaXBlXSA9ICRmaWxlOwp9CmJyZWFrOwp9CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwp9CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRpbnB1dCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX3NsZWVwKCk6IGFycmF5CnsKdGhyb3cgbmV3IFxCYWRNZXRob2RDYWxsRXhjZXB0aW9uKCdDYW5ub3Qgc2VyaWFsaXplICcuX19DTEFTU19fKTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fd2FrZXVwKCkKewp0aHJvdyBuZXcgXEJhZE1ldGhvZENhbGxFeGNlcHRpb24oJ0Nhbm5vdCB1bnNlcmlhbGl6ZSAnLl9fQ0xBU1NfXyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCkKewokdGhpcy0+Y2xvc2UoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERlc2NyaXB0b3JzKCk6IGFycmF5CnsKaWYgKCEkdGhpcy0+aGF2ZVJlYWRTdXBwb3J0KSB7CiRudWxsc3RyZWFtID0gZm9wZW4oJ05VTCcsICdjJyk7CgpyZXR1cm4gWwpbJ3BpcGUnLCAnciddLAokbnVsbHN0cmVhbSwKJG51bGxzdHJlYW0sCl07Cn0KCgoKCnJldHVybiBbClsncGlwZScsICdyJ10sClsnZmlsZScsICdOVUwnLCAndyddLApbJ2ZpbGUnLCAnTlVMJywgJ3cnXSwKXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZpbGVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5maWxlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlYWRBbmRXcml0ZShib29sICRibG9ja2luZywgYm9vbCAkY2xvc2UgPSBmYWxzZSk6IGFycmF5CnsKJHRoaXMtPnVuYmxvY2soKTsKJHcgPSAkdGhpcy0+d3JpdGUoKTsKJHJlYWQgPSAkciA9ICRlID0gW107CgppZiAoJGJsb2NraW5nKSB7CmlmICgkdykgewpAc3RyZWFtX3NlbGVjdCgkciwgJHcsICRlLCAwLCBQcm9jZXNzOjpUSU1FT1VUX1BSRUNJU0lPTiAqIDFFNik7Cn0gZWxzZWlmICgkdGhpcy0+ZmlsZUhhbmRsZXMpIHsKdXNsZWVwKChpbnQpIChQcm9jZXNzOjpUSU1FT1VUX1BSRUNJU0lPTiAqIDFFNikpOwp9Cn0KZm9yZWFjaCAoJHRoaXMtPmZpbGVIYW5kbGVzIGFzICR0eXBlID0+ICRmaWxlSGFuZGxlKSB7CiRkYXRhID0gc3RyZWFtX2dldF9jb250ZW50cygkZmlsZUhhbmRsZSwgLTEsICR0aGlzLT5yZWFkQnl0ZXNbJHR5cGVdKTsKCmlmIChpc3NldCgkZGF0YVswXSkpIHsKJHRoaXMtPnJlYWRCeXRlc1skdHlwZV0gKz0gXHN0cmxlbigkZGF0YSk7CiRyZWFkWyR0eXBlXSA9ICRkYXRhOwp9CmlmICgkY2xvc2UpIHsKZnRydW5jYXRlKCRmaWxlSGFuZGxlLCAwKTsKZmNsb3NlKCRmaWxlSGFuZGxlKTsKZmxvY2soJHRoaXMtPmxvY2tIYW5kbGVzWyR0eXBlXSwgXExPQ0tfVU4pOwpmY2xvc2UoJHRoaXMtPmxvY2tIYW5kbGVzWyR0eXBlXSk7CnVuc2V0KCR0aGlzLT5maWxlSGFuZGxlc1skdHlwZV0sICR0aGlzLT5sb2NrSGFuZGxlc1skdHlwZV0pOwp9Cn0KCnJldHVybiAkcmVhZDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhdmVSZWFkU3VwcG9ydCgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5oYXZlUmVhZFN1cHBvcnQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhcmVPcGVuKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPnBpcGVzICYmICR0aGlzLT5maWxlSGFuZGxlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKewpwYXJlbnQ6OmNsb3NlKCk7CmZvcmVhY2ggKCR0aGlzLT5maWxlSGFuZGxlcyBhcyAkdHlwZSA9PiAkaGFuZGxlKSB7CmZ0cnVuY2F0ZSgkaGFuZGxlLCAwKTsKZmNsb3NlKCRoYW5kbGUpOwpmbG9jaygkdGhpcy0+bG9ja0hhbmRsZXNbJHR5cGVdLCBcTE9DS19VTik7CmZjbG9zZSgkdGhpcy0+bG9ja0hhbmRsZXNbJHR5cGVdKTsKfQokdGhpcy0+ZmlsZUhhbmRsZXMgPSAkdGhpcy0+bG9ja0hhbmRsZXMgPSBbXTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2VzczsKCnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvblxMb2dpY0V4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uXFByb2Nlc3NGYWlsZWRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvblxQcm9jZXNzU2lnbmFsZWRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvblxQcm9jZXNzVGltZWRPdXRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvblxSdW50aW1lRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xQaXBlc1xQaXBlc0ludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcUGlwZXNcVW5peFBpcGVzOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xQaXBlc1xXaW5kb3dzUGlwZXM7CgoKCgoKCgoKCgpjbGFzcyBQcm9jZXNzIGltcGxlbWVudHMgXEl0ZXJhdG9yQWdncmVnYXRlCnsKcHVibGljIGNvbnN0IEVSUiA9ICdlcnInOwpwdWJsaWMgY29uc3QgT1VUID0gJ291dCc7CgpwdWJsaWMgY29uc3QgU1RBVFVTX1JFQURZID0gJ3JlYWR5JzsKcHVibGljIGNvbnN0IFNUQVRVU19TVEFSVEVEID0gJ3N0YXJ0ZWQnOwpwdWJsaWMgY29uc3QgU1RBVFVTX1RFUk1JTkFURUQgPSAndGVybWluYXRlZCc7CgpwdWJsaWMgY29uc3QgU1RESU4gPSAwOwpwdWJsaWMgY29uc3QgU1RET1VUID0gMTsKcHVibGljIGNvbnN0IFNUREVSUiA9IDI7CgoKcHVibGljIGNvbnN0IFRJTUVPVVRfUFJFQ0lTSU9OID0gMC4yOwoKcHVibGljIGNvbnN0IElURVJfTk9OX0JMT0NLSU5HID0gMTsgCnB1YmxpYyBjb25zdCBJVEVSX0tFRVBfT1VUUFVUID0gMjsgCnB1YmxpYyBjb25zdCBJVEVSX1NLSVBfT1VUID0gNDsgCnB1YmxpYyBjb25zdCBJVEVSX1NLSVBfRVJSID0gODsgCgpwcml2YXRlICRjYWxsYmFjazsKcHJpdmF0ZSAkaGFzQ2FsbGJhY2sgPSBmYWxzZTsKcHJpdmF0ZSAkY29tbWFuZGxpbmU7CnByaXZhdGUgJGN3ZDsKcHJpdmF0ZSAkZW52ID0gW107CnByaXZhdGUgJGlucHV0Owpwcml2YXRlICRzdGFydHRpbWU7CnByaXZhdGUgJGxhc3RPdXRwdXRUaW1lOwpwcml2YXRlICR0aW1lb3V0Owpwcml2YXRlICRpZGxlVGltZW91dDsKcHJpdmF0ZSAkZXhpdGNvZGU7CnByaXZhdGUgJGZhbGxiYWNrU3RhdHVzID0gW107CnByaXZhdGUgJHByb2Nlc3NJbmZvcm1hdGlvbjsKcHJpdmF0ZSAkb3V0cHV0RGlzYWJsZWQgPSBmYWxzZTsKcHJpdmF0ZSAkc3Rkb3V0Owpwcml2YXRlICRzdGRlcnI7CnByaXZhdGUgJHByb2Nlc3M7CnByaXZhdGUgJHN0YXR1cyA9IHNlbGY6OlNUQVRVU19SRUFEWTsKcHJpdmF0ZSAkaW5jcmVtZW50YWxPdXRwdXRPZmZzZXQgPSAwOwpwcml2YXRlICRpbmNyZW1lbnRhbEVycm9yT3V0cHV0T2Zmc2V0ID0gMDsKcHJpdmF0ZSAkdHR5ID0gZmFsc2U7CnByaXZhdGUgJHB0eTsKcHJpdmF0ZSAkb3B0aW9ucyA9IFsnc3VwcHJlc3NfZXJyb3JzJyA9PiB0cnVlLCAnYnlwYXNzX3NoZWxsJyA9PiB0cnVlXTsKCnByaXZhdGUgJHVzZUZpbGVIYW5kbGVzID0gZmFsc2U7Cgpwcml2YXRlICRwcm9jZXNzUGlwZXM7Cgpwcml2YXRlICRsYXRlc3RTaWduYWw7CnByaXZhdGUgJGNhY2hlZEV4aXRDb2RlOwoKcHJpdmF0ZSBzdGF0aWMgJHNpZ2NoaWxkOwoKCgoKCgpwdWJsaWMgc3RhdGljICRleGl0Q29kZXMgPSBbCjAgPT4gJ09LJywKMSA9PiAnR2VuZXJhbCBlcnJvcicsCjIgPT4gJ01pc3VzZSBvZiBzaGVsbCBidWlsdGlucycsCgoxMjYgPT4gJ0ludm9rZWQgY29tbWFuZCBjYW5ub3QgZXhlY3V0ZScsCjEyNyA9PiAnQ29tbWFuZCBub3QgZm91bmQnLAoxMjggPT4gJ0ludmFsaWQgZXhpdCBhcmd1bWVudCcsCgoKMTI5ID0+ICdIYW5ndXAnLAoxMzAgPT4gJ0ludGVycnVwdCcsCjEzMSA9PiAnUXVpdCBhbmQgZHVtcCBjb3JlJywKMTMyID0+ICdJbGxlZ2FsIGluc3RydWN0aW9uJywKMTMzID0+ICdUcmFjZS9icmVha3BvaW50IHRyYXAnLAoxMzQgPT4gJ1Byb2Nlc3MgYWJvcnRlZCcsCjEzNSA9PiAnQnVzIGVycm9yOiAiYWNjZXNzIHRvIHVuZGVmaW5lZCBwb3J0aW9uIG9mIG1lbW9yeSBvYmplY3QiJywKMTM2ID0+ICdGbG9hdGluZyBwb2ludCBleGNlcHRpb246ICJlcnJvbmVvdXMgYXJpdGhtZXRpYyBvcGVyYXRpb24iJywKMTM3ID0+ICdLaWxsICh0ZXJtaW5hdGUgaW1tZWRpYXRlbHkpJywKMTM4ID0+ICdVc2VyLWRlZmluZWQgMScsCjEzOSA9PiAnU2VnbWVudGF0aW9uIHZpb2xhdGlvbicsCjE0MCA9PiAnVXNlci1kZWZpbmVkIDInLAoxNDEgPT4gJ1dyaXRlIHRvIHBpcGUgd2l0aCBubyBvbmUgcmVhZGluZycsCjE0MiA9PiAnU2lnbmFsIHJhaXNlZCBieSBhbGFybScsCjE0MyA9PiAnVGVybWluYXRpb24gKHJlcXVlc3QgdG8gdGVybWluYXRlKScsCgoxNDUgPT4gJ0NoaWxkIHByb2Nlc3MgdGVybWluYXRlZCwgc3RvcHBlZCAob3IgY29udGludWVkKiknLAoxNDYgPT4gJ0NvbnRpbnVlIGlmIHN0b3BwZWQnLAoxNDcgPT4gJ1N0b3AgZXhlY3V0aW5nIHRlbXBvcmFyaWx5JywKMTQ4ID0+ICdUZXJtaW5hbCBzdG9wIHNpZ25hbCcsCjE0OSA9PiAnQmFja2dyb3VuZCBwcm9jZXNzIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIHR0eSAoImluIiknLAoxNTAgPT4gJ0JhY2tncm91bmQgcHJvY2VzcyBhdHRlbXB0aW5nIHRvIHdyaXRlIHRvIHR0eSAoIm91dCIpJywKMTUxID0+ICdVcmdlbnQgZGF0YSBhdmFpbGFibGUgb24gc29ja2V0JywKMTUyID0+ICdDUFUgdGltZSBsaW1pdCBleGNlZWRlZCcsCjE1MyA9PiAnRmlsZSBzaXplIGxpbWl0IGV4Y2VlZGVkJywKMTU0ID0+ICdTaWduYWwgcmFpc2VkIGJ5IHRpbWVyIGNvdW50aW5nIHZpcnR1YWwgdGltZTogInZpcnR1YWwgdGltZXIgZXhwaXJlZCInLAoxNTUgPT4gJ1Byb2ZpbGluZyB0aW1lciBleHBpcmVkJywKCjE1NyA9PiAnUG9sbGFibGUgZXZlbnQnLAoKMTU5ID0+ICdCYWQgc3lzY2FsbCcsCl07CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJGNvbW1hbmQsID9zdHJpbmcgJGN3ZCA9IG51bGwsID9hcnJheSAkZW52ID0gbnVsbCwgJGlucHV0ID0gbnVsbCwgP2Zsb2F0ICR0aW1lb3V0ID0gNjApCnsKaWYgKCFcZnVuY3Rpb25fZXhpc3RzKCdwcm9jX29wZW4nKSkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ1RoZSBQcm9jZXNzIGNsYXNzIHJlbGllcyBvbiBwcm9jX29wZW4sIHdoaWNoIGlzIG5vdCBhdmFpbGFibGUgb24geW91ciBQSFAgaW5zdGFsbGF0aW9uLicpOwp9CgokdGhpcy0+Y29tbWFuZGxpbmUgPSAkY29tbWFuZDsKJHRoaXMtPmN3ZCA9ICRjd2Q7CgoKCgoKaWYgKG51bGwgPT09ICR0aGlzLT5jd2QgJiYgKFxkZWZpbmVkKCdaRU5EX1RIUkVBRF9TQUZFJykgfHwgJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IpKSB7CiR0aGlzLT5jd2QgPSBnZXRjd2QoKTsKfQppZiAobnVsbCAhPT0gJGVudikgewokdGhpcy0+c2V0RW52KCRlbnYpOwp9CgokdGhpcy0+c2V0SW5wdXQoJGlucHV0KTsKJHRoaXMtPnNldFRpbWVvdXQoJHRpbWVvdXQpOwokdGhpcy0+dXNlRmlsZUhhbmRsZXMgPSAnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUjsKJHRoaXMtPnB0eSA9IGZhbHNlOwp9CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnJvbVNoZWxsQ29tbWFuZGxpbmUoc3RyaW5nICRjb21tYW5kLCA/c3RyaW5nICRjd2QgPSBudWxsLCA/YXJyYXkgJGVudiA9IG51bGwsICRpbnB1dCA9IG51bGwsID9mbG9hdCAkdGltZW91dCA9IDYwKQp7CiRwcm9jZXNzID0gbmV3IHN0YXRpYyhbXSwgJGN3ZCwgJGVudiwgJGlucHV0LCAkdGltZW91dCk7CiRwcm9jZXNzLT5jb21tYW5kbGluZSA9ICRjb21tYW5kOwoKcmV0dXJuICRwcm9jZXNzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19zbGVlcCgpCnsKdGhyb3cgbmV3IFxCYWRNZXRob2RDYWxsRXhjZXB0aW9uKCdDYW5ub3Qgc2VyaWFsaXplICcuX19DTEFTU19fKTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fd2FrZXVwKCkKewp0aHJvdyBuZXcgXEJhZE1ldGhvZENhbGxFeGNlcHRpb24oJ0Nhbm5vdCB1bnNlcmlhbGl6ZSAnLl9fQ0xBU1NfXyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCkKewppZiAoJHRoaXMtPm9wdGlvbnNbJ2NyZWF0ZV9uZXdfY29uc29sZSddID8/IGZhbHNlKSB7CiR0aGlzLT5wcm9jZXNzUGlwZXMtPmNsb3NlKCk7Cn0gZWxzZSB7CiR0aGlzLT5zdG9wKDApOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX2Nsb25lKCkKewokdGhpcy0+cmVzZXRQcm9jZXNzRGF0YSgpOwp9CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBydW4oP2NhbGxhYmxlICRjYWxsYmFjayA9IG51bGwsIGFycmF5ICRlbnYgPSBbXSk6IGludAp7CiR0aGlzLT5zdGFydCgkY2FsbGJhY2ssICRlbnYpOwoKcmV0dXJuICR0aGlzLT53YWl0KCk7Cn0KCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBtdXN0UnVuKD9jYWxsYWJsZSAkY2FsbGJhY2sgPSBudWxsLCBhcnJheSAkZW52ID0gW10pOiBzZWxmCnsKaWYgKDAgIT09ICR0aGlzLT5ydW4oJGNhbGxiYWNrLCAkZW52KSkgewp0aHJvdyBuZXcgUHJvY2Vzc0ZhaWxlZEV4Y2VwdGlvbigkdGhpcyk7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzdGFydCg/Y2FsbGFibGUgJGNhbGxiYWNrID0gbnVsbCwgYXJyYXkgJGVudiA9IFtdKQp7CmlmICgkdGhpcy0+aXNSdW5uaW5nKCkpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ1Byb2Nlc3MgaXMgYWxyZWFkeSBydW5uaW5nLicpOwp9CgokdGhpcy0+cmVzZXRQcm9jZXNzRGF0YSgpOwokdGhpcy0+c3RhcnR0aW1lID0gJHRoaXMtPmxhc3RPdXRwdXRUaW1lID0gbWljcm90aW1lKHRydWUpOwokdGhpcy0+Y2FsbGJhY2sgPSAkdGhpcy0+YnVpbGRDYWxsYmFjaygkY2FsbGJhY2spOwokdGhpcy0+aGFzQ2FsbGJhY2sgPSBudWxsICE9PSAkY2FsbGJhY2s7CiRkZXNjcmlwdG9ycyA9ICR0aGlzLT5nZXREZXNjcmlwdG9ycygpOwoKaWYgKCR0aGlzLT5lbnYpIHsKJGVudiArPSAnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUiA/IGFycmF5X2RpZmZfdWtleSgkdGhpcy0+ZW52LCAkZW52LCAnc3RyY2FzZWNtcCcpIDogJHRoaXMtPmVudjsKfQoKJGVudiArPSAnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUiA/IGFycmF5X2RpZmZfdWtleSgkdGhpcy0+Z2V0RGVmYXVsdEVudigpLCAkZW52LCAnc3RyY2FzZWNtcCcpIDogJHRoaXMtPmdldERlZmF1bHRFbnYoKTsKCmlmIChcaXNfYXJyYXkoJGNvbW1hbmRsaW5lID0gJHRoaXMtPmNvbW1hbmRsaW5lKSkgewokY29tbWFuZGxpbmUgPSBpbXBsb2RlKCcgJywgYXJyYXlfbWFwKFskdGhpcywgJ2VzY2FwZUFyZ3VtZW50J10sICRjb21tYW5kbGluZSkpOwoKaWYgKCdcXCcgIT09IFxESVJFQ1RPUllfU0VQQVJBVE9SKSB7CgokY29tbWFuZGxpbmUgPSAnZXhlYyAnLiRjb21tYW5kbGluZTsKfQp9IGVsc2UgewokY29tbWFuZGxpbmUgPSAkdGhpcy0+cmVwbGFjZVBsYWNlaG9sZGVycygkY29tbWFuZGxpbmUsICRlbnYpOwp9CgppZiAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IpIHsKJGNvbW1hbmRsaW5lID0gJHRoaXMtPnByZXBhcmVXaW5kb3dzQ29tbWFuZExpbmUoJGNvbW1hbmRsaW5lLCAkZW52KTsKfSBlbHNlaWYgKCEkdGhpcy0+dXNlRmlsZUhhbmRsZXMgJiYgJHRoaXMtPmlzU2lnY2hpbGRFbmFibGVkKCkpIHsKCiRkZXNjcmlwdG9yc1szXSA9IFsncGlwZScsICd3J107CgoKJGNvbW1hbmRsaW5lID0gJ3sgKCcuJGNvbW1hbmRsaW5lLicpIDwmMyAzPCYtIDM+L2Rldi9udWxsICYgfSAzPCYwOyc7CiRjb21tYW5kbGluZSAuPSAncGlkPSQhOyBlY2hvICRwaWQgPiYzOyB3YWl0ICRwaWQgMj4vZGV2L251bGw7IGNvZGU9JD87IGVjaG8gJGNvZGUgPiYzOyBleGl0ICRjb2RlJzsKCgoKJHB0c1dvcmthcm91bmQgPSBmb3BlbihfX0ZJTEVfXywgJ3InKTsKfQoKJGVudlBhaXJzID0gW107CmZvcmVhY2ggKCRlbnYgYXMgJGsgPT4gJHYpIHsKaWYgKGZhbHNlICE9PSAkdiAmJiBmYWxzZSA9PT0gXGluX2FycmF5KCRrLCBbJ2FyZ2MnLCAnYXJndicsICdBUkdDJywgJ0FSR1YnXSwgdHJ1ZSkpIHsKJGVudlBhaXJzW10gPSAkay4nPScuJHY7Cn0KfQoKaWYgKCFpc19kaXIoJHRoaXMtPmN3ZCkpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZignVGhlIHByb3ZpZGVkIGN3ZCAiJXMiIGRvZXMgbm90IGV4aXN0LicsICR0aGlzLT5jd2QpKTsKfQoKJHRoaXMtPnByb2Nlc3MgPSBAcHJvY19vcGVuKCRjb21tYW5kbGluZSwgJGRlc2NyaXB0b3JzLCAkdGhpcy0+cHJvY2Vzc1BpcGVzLT5waXBlcywgJHRoaXMtPmN3ZCwgJGVudlBhaXJzLCAkdGhpcy0+b3B0aW9ucyk7CgppZiAoISR0aGlzLT5wcm9jZXNzKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdVbmFibGUgdG8gbGF1bmNoIGEgbmV3IHByb2Nlc3MuJyk7Cn0KJHRoaXMtPnN0YXR1cyA9IHNlbGY6OlNUQVRVU19TVEFSVEVEOwoKaWYgKGlzc2V0KCRkZXNjcmlwdG9yc1szXSkpIHsKJHRoaXMtPmZhbGxiYWNrU3RhdHVzWydwaWQnXSA9IChpbnQpIGZnZXRzKCR0aGlzLT5wcm9jZXNzUGlwZXMtPnBpcGVzWzNdKTsKfQoKaWYgKCR0aGlzLT50dHkpIHsKcmV0dXJuOwp9CgokdGhpcy0+dXBkYXRlU3RhdHVzKGZhbHNlKTsKJHRoaXMtPmNoZWNrVGltZW91dCgpOwp9CgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXN0YXJ0KD9jYWxsYWJsZSAkY2FsbGJhY2sgPSBudWxsLCBhcnJheSAkZW52ID0gW10pOiBzZWxmCnsKaWYgKCR0aGlzLT5pc1J1bm5pbmcoKSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignUHJvY2VzcyBpcyBhbHJlYWR5IHJ1bm5pbmcuJyk7Cn0KCiRwcm9jZXNzID0gY2xvbmUgJHRoaXM7CiRwcm9jZXNzLT5zdGFydCgkY2FsbGJhY2ssICRlbnYpOwoKcmV0dXJuICRwcm9jZXNzOwp9CgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2FpdCg/Y2FsbGFibGUgJGNhbGxiYWNrID0gbnVsbCkKewokdGhpcy0+cmVxdWlyZVByb2Nlc3NJc1N0YXJ0ZWQoX19GVU5DVElPTl9fKTsKCiR0aGlzLT51cGRhdGVTdGF0dXMoZmFsc2UpOwoKaWYgKG51bGwgIT09ICRjYWxsYmFjaykgewppZiAoISR0aGlzLT5wcm9jZXNzUGlwZXMtPmhhdmVSZWFkU3VwcG9ydCgpKSB7CiR0aGlzLT5zdG9wKDApOwp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ1Bhc3MgdGhlIGNhbGxiYWNrIHRvIHRoZSAiUHJvY2Vzczo6c3RhcnQiIG1ldGhvZCBvciBjYWxsIGVuYWJsZU91dHB1dCB0byB1c2UgYSBjYWxsYmFjayB3aXRoICJQcm9jZXNzOjp3YWl0Ii4nKTsKfQokdGhpcy0+Y2FsbGJhY2sgPSAkdGhpcy0+YnVpbGRDYWxsYmFjaygkY2FsbGJhY2spOwp9CgpkbyB7CiR0aGlzLT5jaGVja1RpbWVvdXQoKTsKJHJ1bm5pbmcgPSAkdGhpcy0+aXNSdW5uaW5nKCkgJiYgKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SIHx8ICR0aGlzLT5wcm9jZXNzUGlwZXMtPmFyZU9wZW4oKSk7CiR0aGlzLT5yZWFkUGlwZXMoJHJ1bm5pbmcsICdcXCcgIT09IFxESVJFQ1RPUllfU0VQQVJBVE9SIHx8ICEkcnVubmluZyk7Cn0gd2hpbGUgKCRydW5uaW5nKTsKCndoaWxlICgkdGhpcy0+aXNSdW5uaW5nKCkpIHsKJHRoaXMtPmNoZWNrVGltZW91dCgpOwp1c2xlZXAoMTAwMCk7Cn0KCmlmICgkdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uWydzaWduYWxlZCddICYmICR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb25bJ3Rlcm1zaWcnXSAhPT0gJHRoaXMtPmxhdGVzdFNpZ25hbCkgewp0aHJvdyBuZXcgUHJvY2Vzc1NpZ25hbGVkRXhjZXB0aW9uKCR0aGlzKTsKfQoKcmV0dXJuICR0aGlzLT5leGl0Y29kZTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2FpdFVudGlsKGNhbGxhYmxlICRjYWxsYmFjayk6IGJvb2wKewokdGhpcy0+cmVxdWlyZVByb2Nlc3NJc1N0YXJ0ZWQoX19GVU5DVElPTl9fKTsKJHRoaXMtPnVwZGF0ZVN0YXR1cyhmYWxzZSk7CgppZiAoISR0aGlzLT5wcm9jZXNzUGlwZXMtPmhhdmVSZWFkU3VwcG9ydCgpKSB7CiR0aGlzLT5zdG9wKDApOwp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ1Bhc3MgdGhlIGNhbGxiYWNrIHRvIHRoZSAiUHJvY2Vzczo6c3RhcnQiIG1ldGhvZCBvciBjYWxsIGVuYWJsZU91dHB1dCB0byB1c2UgYSBjYWxsYmFjayB3aXRoICJQcm9jZXNzOjp3YWl0VW50aWwiLicpOwp9CiRjYWxsYmFjayA9ICR0aGlzLT5idWlsZENhbGxiYWNrKCRjYWxsYmFjayk7CgokcmVhZHkgPSBmYWxzZTsKd2hpbGUgKHRydWUpIHsKJHRoaXMtPmNoZWNrVGltZW91dCgpOwokcnVubmluZyA9ICdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SID8gJHRoaXMtPmlzUnVubmluZygpIDogJHRoaXMtPnByb2Nlc3NQaXBlcy0+YXJlT3BlbigpOwokb3V0cHV0ID0gJHRoaXMtPnByb2Nlc3NQaXBlcy0+cmVhZEFuZFdyaXRlKCRydW5uaW5nLCAnXFwnICE9PSBcRElSRUNUT1JZX1NFUEFSQVRPUiB8fCAhJHJ1bm5pbmcpOwoKZm9yZWFjaCAoJG91dHB1dCBhcyAkdHlwZSA9PiAkZGF0YSkgewppZiAoMyAhPT0gJHR5cGUpIHsKJHJlYWR5ID0gJGNhbGxiYWNrKHNlbGY6OlNURE9VVCA9PT0gJHR5cGUgPyBzZWxmOjpPVVQgOiBzZWxmOjpFUlIsICRkYXRhKSB8fCAkcmVhZHk7Cn0gZWxzZWlmICghaXNzZXQoJHRoaXMtPmZhbGxiYWNrU3RhdHVzWydzaWduYWxlZCddKSkgewokdGhpcy0+ZmFsbGJhY2tTdGF0dXNbJ2V4aXRjb2RlJ10gPSAoaW50KSAkZGF0YTsKfQp9CmlmICgkcmVhZHkpIHsKcmV0dXJuIHRydWU7Cn0KaWYgKCEkcnVubmluZykgewpyZXR1cm4gZmFsc2U7Cn0KCnVzbGVlcCgxMDAwKTsKfQp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQaWQoKQp7CnJldHVybiAkdGhpcy0+aXNSdW5uaW5nKCkgPyAkdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uWydwaWQnXSA6IG51bGw7Cn0KCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNpZ25hbChpbnQgJHNpZ25hbCkKewokdGhpcy0+ZG9TaWduYWwoJHNpZ25hbCwgdHJ1ZSk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRpc2FibGVPdXRwdXQoKQp7CmlmICgkdGhpcy0+aXNSdW5uaW5nKCkpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ0Rpc2FibGluZyBvdXRwdXQgd2hpbGUgdGhlIHByb2Nlc3MgaXMgcnVubmluZyBpcyBub3QgcG9zc2libGUuJyk7Cn0KaWYgKG51bGwgIT09ICR0aGlzLT5pZGxlVGltZW91dCkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ091dHB1dCBjYW5ub3QgYmUgZGlzYWJsZWQgd2hpbGUgYW4gaWRsZSB0aW1lb3V0IGlzIHNldC4nKTsKfQoKJHRoaXMtPm91dHB1dERpc2FibGVkID0gdHJ1ZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBlbmFibGVPdXRwdXQoKQp7CmlmICgkdGhpcy0+aXNSdW5uaW5nKCkpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ0VuYWJsaW5nIG91dHB1dCB3aGlsZSB0aGUgcHJvY2VzcyBpcyBydW5uaW5nIGlzIG5vdCBwb3NzaWJsZS4nKTsKfQoKJHRoaXMtPm91dHB1dERpc2FibGVkID0gZmFsc2U7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzT3V0cHV0RGlzYWJsZWQoKQp7CnJldHVybiAkdGhpcy0+b3V0cHV0RGlzYWJsZWQ7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE91dHB1dCgpCnsKJHRoaXMtPnJlYWRQaXBlc0Zvck91dHB1dChfX0ZVTkNUSU9OX18pOwoKaWYgKGZhbHNlID09PSAkcmV0ID0gc3RyZWFtX2dldF9jb250ZW50cygkdGhpcy0+c3Rkb3V0LCAtMSwgMCkpIHsKcmV0dXJuICcnOwp9CgpyZXR1cm4gJHJldDsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5jcmVtZW50YWxPdXRwdXQoKQp7CiR0aGlzLT5yZWFkUGlwZXNGb3JPdXRwdXQoX19GVU5DVElPTl9fKTsKCiRsYXRlc3QgPSBzdHJlYW1fZ2V0X2NvbnRlbnRzKCR0aGlzLT5zdGRvdXQsIC0xLCAkdGhpcy0+aW5jcmVtZW50YWxPdXRwdXRPZmZzZXQpOwokdGhpcy0+aW5jcmVtZW50YWxPdXRwdXRPZmZzZXQgPSBmdGVsbCgkdGhpcy0+c3Rkb3V0KTsKCmlmIChmYWxzZSA9PT0gJGxhdGVzdCkgewpyZXR1cm4gJyc7Cn0KCnJldHVybiAkbGF0ZXN0Owp9CgoKCgoKCgoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBnZXRJdGVyYXRvcihpbnQgJGZsYWdzID0gMCkKewokdGhpcy0+cmVhZFBpcGVzRm9yT3V0cHV0KF9fRlVOQ1RJT05fXywgZmFsc2UpOwoKJGNsZWFyT3V0cHV0ID0gIShzZWxmOjpJVEVSX0tFRVBfT1VUUFVUICYgJGZsYWdzKTsKJGJsb2NraW5nID0gIShzZWxmOjpJVEVSX05PTl9CTE9DS0lORyAmICRmbGFncyk7CiR5aWVsZE91dCA9ICEoc2VsZjo6SVRFUl9TS0lQX09VVCAmICRmbGFncyk7CiR5aWVsZEVyciA9ICEoc2VsZjo6SVRFUl9TS0lQX0VSUiAmICRmbGFncyk7Cgp3aGlsZSAobnVsbCAhPT0gJHRoaXMtPmNhbGxiYWNrIHx8ICgkeWllbGRPdXQgJiYgIWZlb2YoJHRoaXMtPnN0ZG91dCkpIHx8ICgkeWllbGRFcnIgJiYgIWZlb2YoJHRoaXMtPnN0ZGVycikpKSB7CmlmICgkeWllbGRPdXQpIHsKJG91dCA9IHN0cmVhbV9nZXRfY29udGVudHMoJHRoaXMtPnN0ZG91dCwgLTEsICR0aGlzLT5pbmNyZW1lbnRhbE91dHB1dE9mZnNldCk7CgppZiAoaXNzZXQoJG91dFswXSkpIHsKaWYgKCRjbGVhck91dHB1dCkgewokdGhpcy0+Y2xlYXJPdXRwdXQoKTsKfSBlbHNlIHsKJHRoaXMtPmluY3JlbWVudGFsT3V0cHV0T2Zmc2V0ID0gZnRlbGwoJHRoaXMtPnN0ZG91dCk7Cn0KCnlpZWxkIHNlbGY6Ok9VVCA9PiAkb3V0Owp9Cn0KCmlmICgkeWllbGRFcnIpIHsKJGVyciA9IHN0cmVhbV9nZXRfY29udGVudHMoJHRoaXMtPnN0ZGVyciwgLTEsICR0aGlzLT5pbmNyZW1lbnRhbEVycm9yT3V0cHV0T2Zmc2V0KTsKCmlmIChpc3NldCgkZXJyWzBdKSkgewppZiAoJGNsZWFyT3V0cHV0KSB7CiR0aGlzLT5jbGVhckVycm9yT3V0cHV0KCk7Cn0gZWxzZSB7CiR0aGlzLT5pbmNyZW1lbnRhbEVycm9yT3V0cHV0T2Zmc2V0ID0gZnRlbGwoJHRoaXMtPnN0ZGVycik7Cn0KCnlpZWxkIHNlbGY6OkVSUiA9PiAkZXJyOwp9Cn0KCmlmICghJGJsb2NraW5nICYmICFpc3NldCgkb3V0WzBdKSAmJiAhaXNzZXQoJGVyclswXSkpIHsKeWllbGQgc2VsZjo6T1VUID0+ICcnOwp9CgokdGhpcy0+Y2hlY2tUaW1lb3V0KCk7CiR0aGlzLT5yZWFkUGlwZXNGb3JPdXRwdXQoX19GVU5DVElPTl9fLCAkYmxvY2tpbmcpOwp9Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNsZWFyT3V0cHV0KCkKewpmdHJ1bmNhdGUoJHRoaXMtPnN0ZG91dCwgMCk7CmZzZWVrKCR0aGlzLT5zdGRvdXQsIDApOwokdGhpcy0+aW5jcmVtZW50YWxPdXRwdXRPZmZzZXQgPSAwOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFcnJvck91dHB1dCgpCnsKJHRoaXMtPnJlYWRQaXBlc0Zvck91dHB1dChfX0ZVTkNUSU9OX18pOwoKaWYgKGZhbHNlID09PSAkcmV0ID0gc3RyZWFtX2dldF9jb250ZW50cygkdGhpcy0+c3RkZXJyLCAtMSwgMCkpIHsKcmV0dXJuICcnOwp9CgpyZXR1cm4gJHJldDsKfQoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEluY3JlbWVudGFsRXJyb3JPdXRwdXQoKQp7CiR0aGlzLT5yZWFkUGlwZXNGb3JPdXRwdXQoX19GVU5DVElPTl9fKTsKCiRsYXRlc3QgPSBzdHJlYW1fZ2V0X2NvbnRlbnRzKCR0aGlzLT5zdGRlcnIsIC0xLCAkdGhpcy0+aW5jcmVtZW50YWxFcnJvck91dHB1dE9mZnNldCk7CiR0aGlzLT5pbmNyZW1lbnRhbEVycm9yT3V0cHV0T2Zmc2V0ID0gZnRlbGwoJHRoaXMtPnN0ZGVycik7CgppZiAoZmFsc2UgPT09ICRsYXRlc3QpIHsKcmV0dXJuICcnOwp9CgpyZXR1cm4gJGxhdGVzdDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYXJFcnJvck91dHB1dCgpCnsKZnRydW5jYXRlKCR0aGlzLT5zdGRlcnIsIDApOwpmc2VlaygkdGhpcy0+c3RkZXJyLCAwKTsKJHRoaXMtPmluY3JlbWVudGFsRXJyb3JPdXRwdXRPZmZzZXQgPSAwOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFeGl0Q29kZSgpCnsKJHRoaXMtPnVwZGF0ZVN0YXR1cyhmYWxzZSk7CgpyZXR1cm4gJHRoaXMtPmV4aXRjb2RlOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFeGl0Q29kZVRleHQoKQp7CmlmIChudWxsID09PSAkZXhpdGNvZGUgPSAkdGhpcy0+Z2V0RXhpdENvZGUoKSkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuIHNlbGY6OiRleGl0Q29kZXNbJGV4aXRjb2RlXSA/PyAnVW5rbm93biBlcnJvcic7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzU3VjY2Vzc2Z1bCgpCnsKcmV0dXJuIDAgPT09ICR0aGlzLT5nZXRFeGl0Q29kZSgpOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzQmVlblNpZ25hbGVkKCkKewokdGhpcy0+cmVxdWlyZVByb2Nlc3NJc1Rlcm1pbmF0ZWQoX19GVU5DVElPTl9fKTsKCnJldHVybiAkdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uWydzaWduYWxlZCddOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRlcm1TaWduYWwoKQp7CiR0aGlzLT5yZXF1aXJlUHJvY2Vzc0lzVGVybWluYXRlZChfX0ZVTkNUSU9OX18pOwoKaWYgKCR0aGlzLT5pc1NpZ2NoaWxkRW5hYmxlZCgpICYmIC0xID09PSAkdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uWyd0ZXJtc2lnJ10pIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ1RoaXMgUEhQIGhhcyBiZWVuIGNvbXBpbGVkIHdpdGggLS1lbmFibGUtc2lnY2hpbGQuIFRlcm0gc2lnbmFsIGNhbm5vdCBiZSByZXRyaWV2ZWQuJyk7Cn0KCnJldHVybiAkdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uWyd0ZXJtc2lnJ107Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNCZWVuU3RvcHBlZCgpCnsKJHRoaXMtPnJlcXVpcmVQcm9jZXNzSXNUZXJtaW5hdGVkKF9fRlVOQ1RJT05fXyk7CgpyZXR1cm4gJHRoaXMtPnByb2Nlc3NJbmZvcm1hdGlvblsnc3RvcHBlZCddOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RvcFNpZ25hbCgpCnsKJHRoaXMtPnJlcXVpcmVQcm9jZXNzSXNUZXJtaW5hdGVkKF9fRlVOQ1RJT05fXyk7CgpyZXR1cm4gJHRoaXMtPnByb2Nlc3NJbmZvcm1hdGlvblsnc3RvcHNpZyddOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1J1bm5pbmcoKQp7CmlmIChzZWxmOjpTVEFUVVNfU1RBUlRFRCAhPT0gJHRoaXMtPnN0YXR1cykgewpyZXR1cm4gZmFsc2U7Cn0KCiR0aGlzLT51cGRhdGVTdGF0dXMoZmFsc2UpOwoKcmV0dXJuICR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb25bJ3J1bm5pbmcnXTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNTdGFydGVkKCkKewpyZXR1cm4gc2VsZjo6U1RBVFVTX1JFQURZICE9ICR0aGlzLT5zdGF0dXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVGVybWluYXRlZCgpCnsKJHRoaXMtPnVwZGF0ZVN0YXR1cyhmYWxzZSk7CgpyZXR1cm4gc2VsZjo6U1RBVFVTX1RFUk1JTkFURUQgPT0gJHRoaXMtPnN0YXR1czsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdGF0dXMoKQp7CiR0aGlzLT51cGRhdGVTdGF0dXMoZmFsc2UpOwoKcmV0dXJuICR0aGlzLT5zdGF0dXM7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHN0b3AoZmxvYXQgJHRpbWVvdXQgPSAxMCwgP2ludCAkc2lnbmFsID0gbnVsbCkKewokdGltZW91dE1pY3JvID0gbWljcm90aW1lKHRydWUpICsgJHRpbWVvdXQ7CmlmICgkdGhpcy0+aXNSdW5uaW5nKCkpIHsKCiR0aGlzLT5kb1NpZ25hbCgxNSwgZmFsc2UpOwpkbyB7CnVzbGVlcCgxMDAwKTsKfSB3aGlsZSAoJHRoaXMtPmlzUnVubmluZygpICYmIG1pY3JvdGltZSh0cnVlKSA8ICR0aW1lb3V0TWljcm8pOwoKaWYgKCR0aGlzLT5pc1J1bm5pbmcoKSkgewoKCiR0aGlzLT5kb1NpZ25hbCgkc2lnbmFsID86IDksIGZhbHNlKTsKfQp9CgppZiAoJHRoaXMtPmlzUnVubmluZygpKSB7CmlmIChpc3NldCgkdGhpcy0+ZmFsbGJhY2tTdGF0dXNbJ3BpZCddKSkgewp1bnNldCgkdGhpcy0+ZmFsbGJhY2tTdGF0dXNbJ3BpZCddKTsKCnJldHVybiAkdGhpcy0+c3RvcCgwLCAkc2lnbmFsKTsKfQokdGhpcy0+Y2xvc2UoKTsKfQoKcmV0dXJuICR0aGlzLT5leGl0Y29kZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkT3V0cHV0KHN0cmluZyAkbGluZSkKewokdGhpcy0+bGFzdE91dHB1dFRpbWUgPSBtaWNyb3RpbWUodHJ1ZSk7Cgpmc2VlaygkdGhpcy0+c3Rkb3V0LCAwLCBcU0VFS19FTkQpOwpmd3JpdGUoJHRoaXMtPnN0ZG91dCwgJGxpbmUpOwpmc2VlaygkdGhpcy0+c3Rkb3V0LCAkdGhpcy0+aW5jcmVtZW50YWxPdXRwdXRPZmZzZXQpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRFcnJvck91dHB1dChzdHJpbmcgJGxpbmUpCnsKJHRoaXMtPmxhc3RPdXRwdXRUaW1lID0gbWljcm90aW1lKHRydWUpOwoKZnNlZWsoJHRoaXMtPnN0ZGVyciwgMCwgXFNFRUtfRU5EKTsKZndyaXRlKCR0aGlzLT5zdGRlcnIsICRsaW5lKTsKZnNlZWsoJHRoaXMtPnN0ZGVyciwgJHRoaXMtPmluY3JlbWVudGFsRXJyb3JPdXRwdXRPZmZzZXQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TGFzdE91dHB1dFRpbWUoKTogP2Zsb2F0CnsKcmV0dXJuICR0aGlzLT5sYXN0T3V0cHV0VGltZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tbWFuZExpbmUoKQp7CnJldHVybiBcaXNfYXJyYXkoJHRoaXMtPmNvbW1hbmRsaW5lKSA/IGltcGxvZGUoJyAnLCBhcnJheV9tYXAoWyR0aGlzLCAnZXNjYXBlQXJndW1lbnQnXSwgJHRoaXMtPmNvbW1hbmRsaW5lKSkgOiAkdGhpcy0+Y29tbWFuZGxpbmU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRpbWVvdXQoKQp7CnJldHVybiAkdGhpcy0+dGltZW91dDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SWRsZVRpbWVvdXQoKQp7CnJldHVybiAkdGhpcy0+aWRsZVRpbWVvdXQ7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRUaW1lb3V0KD9mbG9hdCAkdGltZW91dCkKewokdGhpcy0+dGltZW91dCA9ICR0aGlzLT52YWxpZGF0ZVRpbWVvdXQoJHRpbWVvdXQpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldElkbGVUaW1lb3V0KD9mbG9hdCAkdGltZW91dCkKewppZiAobnVsbCAhPT0gJHRpbWVvdXQgJiYgJHRoaXMtPm91dHB1dERpc2FibGVkKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignSWRsZSB0aW1lb3V0IGNhbm5vdCBiZSBzZXQgd2hpbGUgdGhlIG91dHB1dCBpcyBkaXNhYmxlZC4nKTsKfQoKJHRoaXMtPmlkbGVUaW1lb3V0ID0gJHRoaXMtPnZhbGlkYXRlVGltZW91dCgkdGltZW91dCk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VHR5KGJvb2wgJHR0eSkKewppZiAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgJiYgJHR0eSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignVFRZIG1vZGUgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzIHBsYXRmb3JtLicpOwp9CgppZiAoJHR0eSAmJiAhc2VsZjo6aXNUdHlTdXBwb3J0ZWQoKSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignVFRZIG1vZGUgcmVxdWlyZXMgL2Rldi90dHkgdG8gYmUgcmVhZC93cml0YWJsZS4nKTsKfQoKJHRoaXMtPnR0eSA9ICR0dHk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVHR5KCkKewpyZXR1cm4gJHRoaXMtPnR0eTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHR5KGJvb2wgJGJvb2wpCnsKJHRoaXMtPnB0eSA9ICRib29sOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1B0eSgpCnsKcmV0dXJuICR0aGlzLT5wdHk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFdvcmtpbmdEaXJlY3RvcnkoKQp7CmlmIChudWxsID09PSAkdGhpcy0+Y3dkKSB7CgoKcmV0dXJuIGdldGN3ZCgpID86IG51bGw7Cn0KCnJldHVybiAkdGhpcy0+Y3dkOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRXb3JraW5nRGlyZWN0b3J5KHN0cmluZyAkY3dkKQp7CiR0aGlzLT5jd2QgPSAkY3dkOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFbnYoKQp7CnJldHVybiAkdGhpcy0+ZW52Owp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEVudihhcnJheSAkZW52KQp7CiR0aGlzLT5lbnYgPSAkZW52OwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJbnB1dCgpCnsKcmV0dXJuICR0aGlzLT5pbnB1dDsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SW5wdXQoJGlucHV0KQp7CmlmICgkdGhpcy0+aXNSdW5uaW5nKCkpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdJbnB1dCBjYW5ub3QgYmUgc2V0IHdoaWxlIHRoZSBwcm9jZXNzIGlzIHJ1bm5pbmcuJyk7Cn0KCiR0aGlzLT5pbnB1dCA9IFByb2Nlc3NVdGlsczo6dmFsaWRhdGVJbnB1dChfX01FVEhPRF9fLCAkaW5wdXQpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjaGVja1RpbWVvdXQoKQp7CmlmIChzZWxmOjpTVEFUVVNfU1RBUlRFRCAhPT0gJHRoaXMtPnN0YXR1cykgewpyZXR1cm47Cn0KCmlmIChudWxsICE9PSAkdGhpcy0+dGltZW91dCAmJiAkdGhpcy0+dGltZW91dCA8IG1pY3JvdGltZSh0cnVlKSAtICR0aGlzLT5zdGFydHRpbWUpIHsKJHRoaXMtPnN0b3AoMCk7Cgp0aHJvdyBuZXcgUHJvY2Vzc1RpbWVkT3V0RXhjZXB0aW9uKCR0aGlzLCBQcm9jZXNzVGltZWRPdXRFeGNlcHRpb246OlRZUEVfR0VORVJBTCk7Cn0KCmlmIChudWxsICE9PSAkdGhpcy0+aWRsZVRpbWVvdXQgJiYgJHRoaXMtPmlkbGVUaW1lb3V0IDwgbWljcm90aW1lKHRydWUpIC0gJHRoaXMtPmxhc3RPdXRwdXRUaW1lKSB7CiR0aGlzLT5zdG9wKDApOwoKdGhyb3cgbmV3IFByb2Nlc3NUaW1lZE91dEV4Y2VwdGlvbigkdGhpcywgUHJvY2Vzc1RpbWVkT3V0RXhjZXB0aW9uOjpUWVBFX0lETEUpOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdGFydFRpbWUoKTogZmxvYXQKewppZiAoISR0aGlzLT5pc1N0YXJ0ZWQoKSkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ1N0YXJ0IHRpbWUgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgcHJvY2VzcyBzdGFydC4nKTsKfQoKcmV0dXJuICR0aGlzLT5zdGFydHRpbWU7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE9wdGlvbnMoYXJyYXkgJG9wdGlvbnMpCnsKaWYgKCR0aGlzLT5pc1J1bm5pbmcoKSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignU2V0dGluZyBvcHRpb25zIHdoaWxlIHRoZSBwcm9jZXNzIGlzIHJ1bm5pbmcgaXMgbm90IHBvc3NpYmxlLicpOwp9CgokZGVmYXVsdE9wdGlvbnMgPSAkdGhpcy0+b3B0aW9uczsKJGV4aXN0aW5nT3B0aW9ucyA9IFsnYmxvY2tpbmdfcGlwZXMnLCAnY3JlYXRlX3Byb2Nlc3NfZ3JvdXAnLCAnY3JlYXRlX25ld19jb25zb2xlJ107Cgpmb3JlYWNoICgkb3B0aW9ucyBhcyAka2V5ID0+ICR2YWx1ZSkgewppZiAoIVxpbl9hcnJheSgka2V5LCAkZXhpc3RpbmdPcHRpb25zKSkgewokdGhpcy0+b3B0aW9ucyA9ICRkZWZhdWx0T3B0aW9uczsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ0ludmFsaWQgb3B0aW9uICIlcyIgcGFzc2VkIHRvICIlcygpIi4gU3VwcG9ydGVkIG9wdGlvbnMgYXJlICIlcyIuJywgJGtleSwgX19NRVRIT0RfXywgaW1wbG9kZSgnIiwgIicsICRleGlzdGluZ09wdGlvbnMpKSk7Cn0KJHRoaXMtPm9wdGlvbnNbJGtleV0gPSAkdmFsdWU7Cn0KfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1R0eVN1cHBvcnRlZCgpOiBib29sCnsKc3RhdGljICRpc1R0eVN1cHBvcnRlZDsKCmlmIChudWxsID09PSAkaXNUdHlTdXBwb3J0ZWQpIHsKJGlzVHR5U3VwcG9ydGVkID0gKGJvb2wpIEBwcm9jX29wZW4oJ2VjaG8gMSA+L2Rldi9udWxsJywgW1snZmlsZScsICcvZGV2L3R0eScsICdyJ10sIFsnZmlsZScsICcvZGV2L3R0eScsICd3J10sIFsnZmlsZScsICcvZGV2L3R0eScsICd3J11dLCAkcGlwZXMpOwp9CgpyZXR1cm4gJGlzVHR5U3VwcG9ydGVkOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNQdHlTdXBwb3J0ZWQoKQp7CnN0YXRpYyAkcmVzdWx0OwoKaWYgKG51bGwgIT09ICRyZXN1bHQpIHsKcmV0dXJuICRyZXN1bHQ7Cn0KCmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUikgewpyZXR1cm4gJHJlc3VsdCA9IGZhbHNlOwp9CgpyZXR1cm4gJHJlc3VsdCA9IChib29sKSBAcHJvY19vcGVuKCdlY2hvIDEgPi9kZXYvbnVsbCcsIFtbJ3B0eSddLCBbJ3B0eSddLCBbJ3B0eSddXSwgJHBpcGVzKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXREZXNjcmlwdG9ycygpOiBhcnJheQp7CmlmICgkdGhpcy0+aW5wdXQgaW5zdGFuY2VvZiBcSXRlcmF0b3IpIHsKJHRoaXMtPmlucHV0LT5yZXdpbmQoKTsKfQppZiAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IpIHsKJHRoaXMtPnByb2Nlc3NQaXBlcyA9IG5ldyBXaW5kb3dzUGlwZXMoJHRoaXMtPmlucHV0LCAhJHRoaXMtPm91dHB1dERpc2FibGVkIHx8ICR0aGlzLT5oYXNDYWxsYmFjayk7Cn0gZWxzZSB7CiR0aGlzLT5wcm9jZXNzUGlwZXMgPSBuZXcgVW5peFBpcGVzKCR0aGlzLT5pc1R0eSgpLCAkdGhpcy0+aXNQdHkoKSwgJHRoaXMtPmlucHV0LCAhJHRoaXMtPm91dHB1dERpc2FibGVkIHx8ICR0aGlzLT5oYXNDYWxsYmFjayk7Cn0KCnJldHVybiAkdGhpcy0+cHJvY2Vzc1BpcGVzLT5nZXREZXNjcmlwdG9ycygpOwp9CgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGJ1aWxkQ2FsbGJhY2soP2NhbGxhYmxlICRjYWxsYmFjayA9IG51bGwpCnsKaWYgKCR0aGlzLT5vdXRwdXREaXNhYmxlZCkgewpyZXR1cm4gZnVuY3Rpb24gKCR0eXBlLCAkZGF0YSkgdXNlICgkY2FsbGJhY2spOiBib29sIHsKcmV0dXJuIG51bGwgIT09ICRjYWxsYmFjayAmJiAkY2FsbGJhY2soJHR5cGUsICRkYXRhKTsKfTsKfQoKJG91dCA9IHNlbGY6Ok9VVDsKCnJldHVybiBmdW5jdGlvbiAoJHR5cGUsICRkYXRhKSB1c2UgKCRjYWxsYmFjaywgJG91dCk6IGJvb2wgewppZiAoJG91dCA9PSAkdHlwZSkgewokdGhpcy0+YWRkT3V0cHV0KCRkYXRhKTsKfSBlbHNlIHsKJHRoaXMtPmFkZEVycm9yT3V0cHV0KCRkYXRhKTsKfQoKcmV0dXJuIG51bGwgIT09ICRjYWxsYmFjayAmJiAkY2FsbGJhY2soJHR5cGUsICRkYXRhKTsKfTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdXBkYXRlU3RhdHVzKGJvb2wgJGJsb2NraW5nKQp7CmlmIChzZWxmOjpTVEFUVVNfU1RBUlRFRCAhPT0gJHRoaXMtPnN0YXR1cykgewpyZXR1cm47Cn0KCiR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb24gPSBwcm9jX2dldF9zdGF0dXMoJHRoaXMtPnByb2Nlc3MpOwokcnVubmluZyA9ICR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb25bJ3J1bm5pbmcnXTsKCgoKCmlmIChcUEhQX1ZFUlNJT05fSUQgPCA4MDMwMCkgewppZiAoIWlzc2V0KCR0aGlzLT5jYWNoZWRFeGl0Q29kZSkgJiYgISRydW5uaW5nICYmIC0xICE9PSAkdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uWydleGl0Y29kZSddKSB7CiR0aGlzLT5jYWNoZWRFeGl0Q29kZSA9ICR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb25bJ2V4aXRjb2RlJ107Cn0KCmlmIChpc3NldCgkdGhpcy0+Y2FjaGVkRXhpdENvZGUpICYmICEkcnVubmluZyAmJiAtMSA9PT0gJHRoaXMtPnByb2Nlc3NJbmZvcm1hdGlvblsnZXhpdGNvZGUnXSkgewokdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uWydleGl0Y29kZSddID0gJHRoaXMtPmNhY2hlZEV4aXRDb2RlOwp9Cn0KCiR0aGlzLT5yZWFkUGlwZXMoJHJ1bm5pbmcgJiYgJGJsb2NraW5nLCAnXFwnICE9PSBcRElSRUNUT1JZX1NFUEFSQVRPUiB8fCAhJHJ1bm5pbmcpOwoKaWYgKCR0aGlzLT5mYWxsYmFja1N0YXR1cyAmJiAkdGhpcy0+aXNTaWdjaGlsZEVuYWJsZWQoKSkgewokdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uID0gJHRoaXMtPmZhbGxiYWNrU3RhdHVzICsgJHRoaXMtPnByb2Nlc3NJbmZvcm1hdGlvbjsKfQoKaWYgKCEkcnVubmluZykgewokdGhpcy0+Y2xvc2UoKTsKfQp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpc1NpZ2NoaWxkRW5hYmxlZCgpCnsKaWYgKG51bGwgIT09IHNlbGY6OiRzaWdjaGlsZCkgewpyZXR1cm4gc2VsZjo6JHNpZ2NoaWxkOwp9CgppZiAoIVxmdW5jdGlvbl9leGlzdHMoJ3BocGluZm8nKSkgewpyZXR1cm4gc2VsZjo6JHNpZ2NoaWxkID0gZmFsc2U7Cn0KCm9iX3N0YXJ0KCk7CnBocGluZm8oXElORk9fR0VORVJBTCk7CgpyZXR1cm4gc2VsZjo6JHNpZ2NoaWxkID0gc3RyX2NvbnRhaW5zKG9iX2dldF9jbGVhbigpLCAnLS1lbmFibGUtc2lnY2hpbGQnKTsKfQoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlYWRQaXBlc0Zvck91dHB1dChzdHJpbmcgJGNhbGxlciwgYm9vbCAkYmxvY2tpbmcgPSBmYWxzZSkKewppZiAoJHRoaXMtPm91dHB1dERpc2FibGVkKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignT3V0cHV0IGhhcyBiZWVuIGRpc2FibGVkLicpOwp9CgokdGhpcy0+cmVxdWlyZVByb2Nlc3NJc1N0YXJ0ZWQoJGNhbGxlcik7CgokdGhpcy0+dXBkYXRlU3RhdHVzKCRibG9ja2luZyk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZVRpbWVvdXQoP2Zsb2F0ICR0aW1lb3V0KTogP2Zsb2F0CnsKJHRpbWVvdXQgPSAoZmxvYXQpICR0aW1lb3V0OwoKaWYgKDAuMCA9PT0gJHRpbWVvdXQpIHsKJHRpbWVvdXQgPSBudWxsOwp9IGVsc2VpZiAoJHRpbWVvdXQgPCAwKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSB0aW1lb3V0IHZhbHVlIG11c3QgYmUgYSB2YWxpZCBwb3NpdGl2ZSBpbnRlZ2VyIG9yIGZsb2F0IG51bWJlci4nKTsKfQoKcmV0dXJuICR0aW1lb3V0Owp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlYWRQaXBlcyhib29sICRibG9ja2luZywgYm9vbCAkY2xvc2UpCnsKJHJlc3VsdCA9ICR0aGlzLT5wcm9jZXNzUGlwZXMtPnJlYWRBbmRXcml0ZSgkYmxvY2tpbmcsICRjbG9zZSk7CgokY2FsbGJhY2sgPSAkdGhpcy0+Y2FsbGJhY2s7CmZvcmVhY2ggKCRyZXN1bHQgYXMgJHR5cGUgPT4gJGRhdGEpIHsKaWYgKDMgIT09ICR0eXBlKSB7CiRjYWxsYmFjayhzZWxmOjpTVERPVVQgPT09ICR0eXBlID8gc2VsZjo6T1VUIDogc2VsZjo6RVJSLCAkZGF0YSk7Cn0gZWxzZWlmICghaXNzZXQoJHRoaXMtPmZhbGxiYWNrU3RhdHVzWydzaWduYWxlZCddKSkgewokdGhpcy0+ZmFsbGJhY2tTdGF0dXNbJ2V4aXRjb2RlJ10gPSAoaW50KSAkZGF0YTsKfQp9Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjbG9zZSgpOiBpbnQKewokdGhpcy0+cHJvY2Vzc1BpcGVzLT5jbG9zZSgpOwppZiAoJHRoaXMtPnByb2Nlc3MpIHsKcHJvY19jbG9zZSgkdGhpcy0+cHJvY2Vzcyk7CiR0aGlzLT5wcm9jZXNzID0gbnVsbDsKfQokdGhpcy0+ZXhpdGNvZGUgPSAkdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uWydleGl0Y29kZSddOwokdGhpcy0+c3RhdHVzID0gc2VsZjo6U1RBVFVTX1RFUk1JTkFURUQ7CgppZiAoLTEgPT09ICR0aGlzLT5leGl0Y29kZSkgewppZiAoJHRoaXMtPnByb2Nlc3NJbmZvcm1hdGlvblsnc2lnbmFsZWQnXSAmJiAwIDwgJHRoaXMtPnByb2Nlc3NJbmZvcm1hdGlvblsndGVybXNpZyddKSB7CgokdGhpcy0+ZXhpdGNvZGUgPSAxMjggKyAkdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uWyd0ZXJtc2lnJ107Cn0gZWxzZWlmICgkdGhpcy0+aXNTaWdjaGlsZEVuYWJsZWQoKSkgewokdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uWydzaWduYWxlZCddID0gdHJ1ZTsKJHRoaXMtPnByb2Nlc3NJbmZvcm1hdGlvblsndGVybXNpZyddID0gLTE7Cn0KfQoKCgoKJHRoaXMtPmNhbGxiYWNrID0gbnVsbDsKCnJldHVybiAkdGhpcy0+ZXhpdGNvZGU7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVzZXRQcm9jZXNzRGF0YSgpCnsKJHRoaXMtPnN0YXJ0dGltZSA9IG51bGw7CiR0aGlzLT5jYWxsYmFjayA9IG51bGw7CiR0aGlzLT5leGl0Y29kZSA9IG51bGw7CiR0aGlzLT5mYWxsYmFja1N0YXR1cyA9IFtdOwokdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uID0gbnVsbDsKJHRoaXMtPnN0ZG91dCA9IGZvcGVuKCdwaHA6Ly90ZW1wL21heG1lbW9yeTonLigxMDI0ICogMTAyNCksICd3KycpOwokdGhpcy0+c3RkZXJyID0gZm9wZW4oJ3BocDovL3RlbXAvbWF4bWVtb3J5OicuKDEwMjQgKiAxMDI0KSwgJ3crJyk7CiR0aGlzLT5wcm9jZXNzID0gbnVsbDsKJHRoaXMtPmxhdGVzdFNpZ25hbCA9IG51bGw7CiR0aGlzLT5zdGF0dXMgPSBzZWxmOjpTVEFUVVNfUkVBRFk7CiR0aGlzLT5pbmNyZW1lbnRhbE91dHB1dE9mZnNldCA9IDA7CiR0aGlzLT5pbmNyZW1lbnRhbEVycm9yT3V0cHV0T2Zmc2V0ID0gMDsKfQoKCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9TaWduYWwoaW50ICRzaWduYWwsIGJvb2wgJHRocm93RXhjZXB0aW9uKTogYm9vbAp7CmlmIChudWxsID09PSAkcGlkID0gJHRoaXMtPmdldFBpZCgpKSB7CmlmICgkdGhyb3dFeGNlcHRpb24pIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdDYW5ub3Qgc2VuZCBzaWduYWwgb24gYSBub24gcnVubmluZyBwcm9jZXNzLicpOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUikgewpleGVjKHNwcmludGYoJ3Rhc2traWxsIC9GIC9UIC9QSUQgJWQgMj4mMScsICRwaWQpLCAkb3V0cHV0LCAkZXhpdENvZGUpOwppZiAoJGV4aXRDb2RlICYmICR0aGlzLT5pc1J1bm5pbmcoKSkgewppZiAoJHRocm93RXhjZXB0aW9uKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJ1VuYWJsZSB0byBraWxsIHRoZSBwcm9jZXNzICglcykuJywgaW1wbG9kZSgnICcsICRvdXRwdXQpKSk7Cn0KCnJldHVybiBmYWxzZTsKfQp9IGVsc2UgewppZiAoISR0aGlzLT5pc1NpZ2NoaWxkRW5hYmxlZCgpKSB7CiRvayA9IEBwcm9jX3Rlcm1pbmF0ZSgkdGhpcy0+cHJvY2VzcywgJHNpZ25hbCk7Cn0gZWxzZWlmIChcZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9raWxsJykpIHsKJG9rID0gQHBvc2l4X2tpbGwoJHBpZCwgJHNpZ25hbCk7Cn0gZWxzZWlmICgkb2sgPSBwcm9jX29wZW4oc3ByaW50Zigna2lsbCAtJWQgJWQnLCAkc2lnbmFsLCAkcGlkKSwgWzIgPT4gWydwaXBlJywgJ3cnXV0sICRwaXBlcykpIHsKJG9rID0gZmFsc2UgPT09IGZnZXRzKCRwaXBlc1syXSk7Cn0KaWYgKCEkb2spIHsKaWYgKCR0aHJvd0V4Y2VwdGlvbikgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdFcnJvciB3aGlsZSBzZW5kaW5nIHNpZ25hbCAiJXMiLicsICRzaWduYWwpKTsKfQoKcmV0dXJuIGZhbHNlOwp9Cn0KCiR0aGlzLT5sYXRlc3RTaWduYWwgPSAkc2lnbmFsOwokdGhpcy0+ZmFsbGJhY2tTdGF0dXNbJ3NpZ25hbGVkJ10gPSB0cnVlOwokdGhpcy0+ZmFsbGJhY2tTdGF0dXNbJ2V4aXRjb2RlJ10gPSAtMTsKJHRoaXMtPmZhbGxiYWNrU3RhdHVzWyd0ZXJtc2lnJ10gPSAkdGhpcy0+bGF0ZXN0U2lnbmFsOwoKcmV0dXJuIHRydWU7Cn0KCnByaXZhdGUgZnVuY3Rpb24gcHJlcGFyZVdpbmRvd3NDb21tYW5kTGluZShzdHJpbmcgJGNtZCwgYXJyYXkgJiRlbnYpOiBzdHJpbmcKewokdWlkID0gdW5pcWlkKCcnLCB0cnVlKTsKJHZhckNvdW50ID0gMDsKJHZhckNhY2hlID0gW107CiRjbWQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soCicvIig/OigKICAgICAgICAgICAgICAgIFteIiUhXl0qKwogICAgICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAgICAgKD86ICFMRiEgfCAiKD86XF5bJSFeXSk/KyIgKQogICAgICAgICAgICAgICAgICAgIFteIiUhXl0qKwogICAgICAgICAgICAgICAgKSsrCiAgICAgICAgICAgICkgfCBbXiJdKisgKSIveCcsCmZ1bmN0aW9uICgkbSkgdXNlICgmJGVudiwgJiR2YXJDYWNoZSwgJiR2YXJDb3VudCwgJHVpZCkgewppZiAoIWlzc2V0KCRtWzFdKSkgewpyZXR1cm4gJG1bMF07Cn0KaWYgKGlzc2V0KCR2YXJDYWNoZVskbVswXV0pKSB7CnJldHVybiAkdmFyQ2FjaGVbJG1bMF1dOwp9CmlmIChzdHJfY29udGFpbnMoJHZhbHVlID0gJG1bMV0sICJcMCIpKSB7CiR2YWx1ZSA9IHN0cl9yZXBsYWNlKCJcMCIsICc/JywgJHZhbHVlKTsKfQppZiAoZmFsc2UgPT09IHN0cnBicmsoJHZhbHVlLCAiXCIlIVxuIikpIHsKcmV0dXJuICciJy4kdmFsdWUuJyInOwp9CgokdmFsdWUgPSBzdHJfcmVwbGFjZShbJyFMRiEnLCAnIl4hIicsICciXiUiJywgJyJeXiInLCAnIiInXSwgWyJcbiIsICchJywgJyUnLCAnXicsICciJ10sICR2YWx1ZSk7CiR2YWx1ZSA9ICciJy5wcmVnX3JlcGxhY2UoJy8oXFxcXCopIi8nLCAnJDEkMVxcIicsICR2YWx1ZSkuJyInOwokdmFyID0gJHVpZC4rKyR2YXJDb3VudDsKCiRlbnZbJHZhcl0gPSAkdmFsdWU7CgpyZXR1cm4gJHZhckNhY2hlWyRtWzBdXSA9ICchJy4kdmFyLichJzsKfSwKJGNtZAopOwoKc3RhdGljICRjb21TcGVjOwoKaWYgKCEkY29tU3BlYyAmJiAkY29tU3BlYyA9IChuZXcgRXhlY3V0YWJsZUZpbmRlcigpKS0+ZmluZCgnY21kLmV4ZScpKSB7CgokY29tU3BlYyA9ICciJy5wcmVnX3JlcGxhY2UoJ3soXFxcXCorKSJ9JywgJyQxJDFcIicsICRjb21TcGVjKSAuJyInOwp9CgokY21kID0gKCRjb21TcGVjID8/ICdjbWQnKS4nIC9WOk9OIC9FOk9OIC9EIC9DICgnLnN0cl9yZXBsYWNlKCJcbiIsICcgJywgJGNtZCkuJyknOwpmb3JlYWNoICgkdGhpcy0+cHJvY2Vzc1BpcGVzLT5nZXRGaWxlcygpIGFzICRvZmZzZXQgPT4gJGZpbGVuYW1lKSB7CiRjbWQgLj0gJyAnLiRvZmZzZXQuJz4iJy4kZmlsZW5hbWUuJyInOwp9CgpyZXR1cm4gJGNtZDsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlcXVpcmVQcm9jZXNzSXNTdGFydGVkKHN0cmluZyAkZnVuY3Rpb25OYW1lKQp7CmlmICghJHRoaXMtPmlzU3RhcnRlZCgpKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKCdQcm9jZXNzIG11c3QgYmUgc3RhcnRlZCBiZWZvcmUgY2FsbGluZyAiJXMoKSIuJywgJGZ1bmN0aW9uTmFtZSkpOwp9Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiByZXF1aXJlUHJvY2Vzc0lzVGVybWluYXRlZChzdHJpbmcgJGZ1bmN0aW9uTmFtZSkKewppZiAoISR0aGlzLT5pc1Rlcm1pbmF0ZWQoKSkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oc3ByaW50ZignUHJvY2VzcyBtdXN0IGJlIHRlcm1pbmF0ZWQgYmVmb3JlIGNhbGxpbmcgIiVzKCkiLicsICRmdW5jdGlvbk5hbWUpKTsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGVzY2FwZUFyZ3VtZW50KD9zdHJpbmcgJGFyZ3VtZW50KTogc3RyaW5nCnsKaWYgKCcnID09PSAkYXJndW1lbnQgfHwgbnVsbCA9PT0gJGFyZ3VtZW50KSB7CnJldHVybiAnIiInOwp9CmlmICgnXFwnICE9PSBcRElSRUNUT1JZX1NFUEFSQVRPUikgewpyZXR1cm4gIiciLnN0cl9yZXBsYWNlKCInIiwgIidcXCcnIiwgJGFyZ3VtZW50KS4iJyI7Cn0KaWYgKHN0cl9jb250YWlucygkYXJndW1lbnQsICJcMCIpKSB7CiRhcmd1bWVudCA9IHN0cl9yZXBsYWNlKCJcMCIsICc/JywgJGFyZ3VtZW50KTsKfQppZiAoIXByZWdfbWF0Y2goJy9bKCklIV4iPD4mfFxzW1xdPTsqP1wnJF0vJywgJGFyZ3VtZW50KSkgewpyZXR1cm4gJGFyZ3VtZW50Owp9CiRhcmd1bWVudCA9IHByZWdfcmVwbGFjZSgnLyhcXFxcKykkLycsICckMSQxJywgJGFyZ3VtZW50KTsKCnJldHVybiAnIicuc3RyX3JlcGxhY2UoWyciJywgJ14nLCAnJScsICchJywgIlxuIl0sIFsnIiInLCAnIl5eIicsICciXiUiJywgJyJeISInLCAnIUxGISddLCAkYXJndW1lbnQpLiciJzsKfQoKcHJpdmF0ZSBmdW5jdGlvbiByZXBsYWNlUGxhY2Vob2xkZXJzKHN0cmluZyAkY29tbWFuZGxpbmUsIGFycmF5ICRlbnYpCnsKcmV0dXJuIHByZWdfcmVwbGFjZV9jYWxsYmFjaygnLyJcJFx7OihbX2EtekEtWl0rK1tfYS16QS1aMC05XSorKVx9Ii8nLCBmdW5jdGlvbiAoJG1hdGNoZXMpIHVzZSAoJGNvbW1hbmRsaW5lLCAkZW52KSB7CmlmICghaXNzZXQoJGVudlskbWF0Y2hlc1sxXV0pIHx8IGZhbHNlID09PSAkZW52WyRtYXRjaGVzWzFdXSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ0NvbW1hbmQgbGluZSBpcyBtaXNzaW5nIGEgdmFsdWUgZm9yIHBhcmFtZXRlciAiJXMiOiAnLCAkbWF0Y2hlc1sxXSkuJGNvbW1hbmRsaW5lKTsKfQoKcmV0dXJuICR0aGlzLT5lc2NhcGVBcmd1bWVudCgkZW52WyRtYXRjaGVzWzFdXSk7Cn0sICRjb21tYW5kbGluZSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0RGVmYXVsdEVudigpOiBhcnJheQp7CiRlbnYgPSBnZXRlbnYoKTsKJGVudiA9ICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUiA/IGFycmF5X2ludGVyc2VjdF91a2V5KCRlbnYsICRfU0VSVkVSLCAnc3RyY2FzZWNtcCcpIDogYXJyYXlfaW50ZXJzZWN0X2tleSgkZW52LCAkX1NFUlZFUikpID86ICRlbnY7CgpyZXR1cm4gJF9FTlYgKyAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgPyBhcnJheV9kaWZmX3VrZXkoJGVudiwgJF9FTlYsICdzdHJjYXNlY21wJykgOiAkZW52KTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2VzczsKCnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CgoKCgoKCgoKY2xhc3MgUHJvY2Vzc1V0aWxzCnsKCgoKcHJpdmF0ZSBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCnsKfQoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdmFsaWRhdGVJbnB1dChzdHJpbmcgJGNhbGxlciwgJGlucHV0KQp7CmlmIChudWxsICE9PSAkaW5wdXQpIHsKaWYgKFxpc19yZXNvdXJjZSgkaW5wdXQpKSB7CnJldHVybiAkaW5wdXQ7Cn0KaWYgKFxpc19zdHJpbmcoJGlucHV0KSkgewpyZXR1cm4gJGlucHV0Owp9CmlmIChcaXNfc2NhbGFyKCRpbnB1dCkpIHsKcmV0dXJuIChzdHJpbmcpICRpbnB1dDsKfQppZiAoJGlucHV0IGluc3RhbmNlb2YgUHJvY2VzcykgewpyZXR1cm4gJGlucHV0LT5nZXRJdGVyYXRvcigkaW5wdXQ6OklURVJfU0tJUF9FUlIpOwp9CmlmICgkaW5wdXQgaW5zdGFuY2VvZiBcSXRlcmF0b3IpIHsKcmV0dXJuICRpbnB1dDsKfQppZiAoJGlucHV0IGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnJldHVybiBuZXcgXEl0ZXJhdG9ySXRlcmF0b3IoJGlucHV0KTsKfQoKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCciJXMiIG9ubHkgYWNjZXB0cyBzdHJpbmdzLCBUcmF2ZXJzYWJsZSBvYmplY3RzIG9yIHN0cmVhbSByZXNvdXJjZXMuJywgJGNhbGxlcikpOwp9CgpyZXR1cm4gJGlucHV0Owp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbnRyYWN0c1xTZXJ2aWNlXEF0dHJpYnV0ZTsKCgoKCgoKCgoKI1tcQXR0cmlidXRlKFxBdHRyaWJ1dGU6OlRBUkdFVF9NRVRIT0QgfCBcQXR0cmlidXRlOjpUQVJHRVRfUFJPUEVSVFkpXQpmaW5hbCBjbGFzcyBSZXF1aXJlZAp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbnRyYWN0c1xTZXJ2aWNlXEF0dHJpYnV0ZTsKCnVzZSBTeW1mb255XENvbnRyYWN0c1xTZXJ2aWNlXFNlcnZpY2VTdWJzY3JpYmVyVHJhaXQ7CgoKCgoKCgojW1xBdHRyaWJ1dGUoXEF0dHJpYnV0ZTo6VEFSR0VUX01FVEhPRCldCmZpbmFsIGNsYXNzIFN1YnNjcmliZWRTZXJ2aWNlCnsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKcHVibGljID9zdHJpbmcgJGtleSA9IG51bGwKKSB7Cn0KfQoKQ29weXJpZ2h0IChjKSAyMDE4LXByZXNlbnQgRmFiaWVuIFBvdGVuY2llcgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAp0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KCjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb250cmFjdHNcU2VydmljZTsKCgoKCgoKCgoKCgoKCgppbnRlcmZhY2UgUmVzZXRJbnRlcmZhY2UKewpwdWJsaWMgZnVuY3Rpb24gcmVzZXQoKTsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29udHJhY3RzXFNlcnZpY2U7Cgp1c2UgUHNyXENvbnRhaW5lclxDb250YWluZXJFeGNlcHRpb25JbnRlcmZhY2U7CnVzZSBQc3JcQ29udGFpbmVyXE5vdEZvdW5kRXhjZXB0aW9uSW50ZXJmYWNlOwoKCmNsYXNzX2V4aXN0cyhDb250YWluZXJFeGNlcHRpb25JbnRlcmZhY2U6OmNsYXNzKTsKY2xhc3NfZXhpc3RzKE5vdEZvdW5kRXhjZXB0aW9uSW50ZXJmYWNlOjpjbGFzcyk7CgoKCgoKCgp0cmFpdCBTZXJ2aWNlTG9jYXRvclRyYWl0CnsKcHJpdmF0ZSAkZmFjdG9yaWVzOwpwcml2YXRlICRsb2FkaW5nID0gW107CnByaXZhdGUgJHByb3ZpZGVkVHlwZXM7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJGZhY3RvcmllcykKewokdGhpcy0+ZmFjdG9yaWVzID0gJGZhY3RvcmllczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzKHN0cmluZyAkaWQpCnsKcmV0dXJuIGlzc2V0KCR0aGlzLT5mYWN0b3JpZXNbJGlkXSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldChzdHJpbmcgJGlkKQp7CmlmICghaXNzZXQoJHRoaXMtPmZhY3Rvcmllc1skaWRdKSkgewp0aHJvdyAkdGhpcy0+Y3JlYXRlTm90Rm91bmRFeGNlcHRpb24oJGlkKTsKfQoKaWYgKGlzc2V0KCR0aGlzLT5sb2FkaW5nWyRpZF0pKSB7CiRpZHMgPSBhcnJheV92YWx1ZXMoJHRoaXMtPmxvYWRpbmcpOwokaWRzID0gXGFycmF5X3NsaWNlKCR0aGlzLT5sb2FkaW5nLCBhcnJheV9zZWFyY2goJGlkLCAkaWRzKSk7CiRpZHNbXSA9ICRpZDsKCnRocm93ICR0aGlzLT5jcmVhdGVDaXJjdWxhclJlZmVyZW5jZUV4Y2VwdGlvbigkaWQsICRpZHMpOwp9CgokdGhpcy0+bG9hZGluZ1skaWRdID0gJGlkOwp0cnkgewpyZXR1cm4gJHRoaXMtPmZhY3Rvcmllc1skaWRdKCR0aGlzKTsKfSBmaW5hbGx5IHsKdW5zZXQoJHRoaXMtPmxvYWRpbmdbJGlkXSk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByb3ZpZGVkU2VydmljZXMoKTogYXJyYXkKewppZiAobnVsbCA9PT0gJHRoaXMtPnByb3ZpZGVkVHlwZXMpIHsKJHRoaXMtPnByb3ZpZGVkVHlwZXMgPSBbXTsKCmZvcmVhY2ggKCR0aGlzLT5mYWN0b3JpZXMgYXMgJG5hbWUgPT4gJGZhY3RvcnkpIHsKaWYgKCFcaXNfY2FsbGFibGUoJGZhY3RvcnkpKSB7CiR0aGlzLT5wcm92aWRlZFR5cGVzWyRuYW1lXSA9ICc/JzsKfSBlbHNlIHsKJHR5cGUgPSAobmV3IFxSZWZsZWN0aW9uRnVuY3Rpb24oJGZhY3RvcnkpKS0+Z2V0UmV0dXJuVHlwZSgpOwoKJHRoaXMtPnByb3ZpZGVkVHlwZXNbJG5hbWVdID0gJHR5cGUgPyAoJHR5cGUtPmFsbG93c051bGwoKSA/ICc/JyA6ICcnKS4oJHR5cGUgaW5zdGFuY2VvZiBcUmVmbGVjdGlvbk5hbWVkVHlwZSA/ICR0eXBlLT5nZXROYW1lKCkgOiAkdHlwZSkgOiAnPyc7Cn0KfQp9CgpyZXR1cm4gJHRoaXMtPnByb3ZpZGVkVHlwZXM7Cn0KCnByaXZhdGUgZnVuY3Rpb24gY3JlYXRlTm90Rm91bmRFeGNlcHRpb24oc3RyaW5nICRpZCk6IE5vdEZvdW5kRXhjZXB0aW9uSW50ZXJmYWNlCnsKaWYgKCEkYWx0ZXJuYXRpdmVzID0gYXJyYXlfa2V5cygkdGhpcy0+ZmFjdG9yaWVzKSkgewokbWVzc2FnZSA9ICdpcyBlbXB0eS4uLic7Cn0gZWxzZSB7CiRsYXN0ID0gYXJyYXlfcG9wKCRhbHRlcm5hdGl2ZXMpOwppZiAoJGFsdGVybmF0aXZlcykgewokbWVzc2FnZSA9IHNwcmludGYoJ29ubHkga25vd3MgYWJvdXQgdGhlICIlcyIgYW5kICIlcyIgc2VydmljZXMuJywgaW1wbG9kZSgnIiwgIicsICRhbHRlcm5hdGl2ZXMpLCAkbGFzdCk7Cn0gZWxzZSB7CiRtZXNzYWdlID0gc3ByaW50Zignb25seSBrbm93cyBhYm91dCB0aGUgIiVzIiBzZXJ2aWNlLicsICRsYXN0KTsKfQp9CgppZiAoJHRoaXMtPmxvYWRpbmcpIHsKJG1lc3NhZ2UgPSBzcHJpbnRmKCdUaGUgc2VydmljZSAiJXMiIGhhcyBhIGRlcGVuZGVuY3kgb24gYSBub24tZXhpc3RlbnQgc2VydmljZSAiJXMiLiBUaGlzIGxvY2F0b3IgJXMnLCBlbmQoJHRoaXMtPmxvYWRpbmcpLCAkaWQsICRtZXNzYWdlKTsKfSBlbHNlIHsKJG1lc3NhZ2UgPSBzcHJpbnRmKCdTZXJ2aWNlICIlcyIgbm90IGZvdW5kOiB0aGUgY3VycmVudCBzZXJ2aWNlIGxvY2F0b3IgJXMnLCAkaWQsICRtZXNzYWdlKTsKfQoKcmV0dXJuIG5ldyBjbGFzcygkbWVzc2FnZSkgZXh0ZW5kcyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGltcGxlbWVudHMgTm90Rm91bmRFeGNlcHRpb25JbnRlcmZhY2Ugewp9Owp9Cgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZUNpcmN1bGFyUmVmZXJlbmNlRXhjZXB0aW9uKHN0cmluZyAkaWQsIGFycmF5ICRwYXRoKTogQ29udGFpbmVyRXhjZXB0aW9uSW50ZXJmYWNlCnsKcmV0dXJuIG5ldyBjbGFzcyhzcHJpbnRmKCdDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgZm9yIHNlcnZpY2UgIiVzIiwgcGF0aDogIiVzIi4nLCAkaWQsIGltcGxvZGUoJyAtPiAnLCAkcGF0aCkpKSBleHRlbmRzIFxSdW50aW1lRXhjZXB0aW9uIGltcGxlbWVudHMgQ29udGFpbmVyRXhjZXB0aW9uSW50ZXJmYWNlIHsKfTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb250cmFjdHNcU2VydmljZTsKCnVzZSBQc3JcQ29udGFpbmVyXENvbnRhaW5lckludGVyZmFjZTsKCgoKCgoKCmludGVyZmFjZSBTZXJ2aWNlUHJvdmlkZXJJbnRlcmZhY2UgZXh0ZW5kcyBDb250YWluZXJJbnRlcmZhY2UKewoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm92aWRlZFNlcnZpY2VzKCk6IGFycmF5Owp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb250cmFjdHNcU2VydmljZTsKCgoKCgoKCgoKCgoKCgoKCmludGVyZmFjZSBTZXJ2aWNlU3Vic2NyaWJlckludGVyZmFjZQp7CgoKCgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0U3Vic2NyaWJlZFNlcnZpY2VzKCk7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbnRyYWN0c1xTZXJ2aWNlOwoKdXNlIFBzclxDb250YWluZXJcQ29udGFpbmVySW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb250cmFjdHNcU2VydmljZVxBdHRyaWJ1dGVcU3Vic2NyaWJlZFNlcnZpY2U7CgoKCgoKCgp0cmFpdCBTZXJ2aWNlU3Vic2NyaWJlclRyYWl0CnsKCnByb3RlY3RlZCAkY29udGFpbmVyOwoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRTdWJzY3JpYmVkU2VydmljZXMoKTogYXJyYXkKewokc2VydmljZXMgPSBtZXRob2RfZXhpc3RzKGdldF9wYXJlbnRfY2xhc3Moc2VsZjo6Y2xhc3MpID86ICcnLCBfX0ZVTkNUSU9OX18pID8gcGFyZW50OjpnZXRTdWJzY3JpYmVkU2VydmljZXMoKSA6IFtdOwokYXR0cmlidXRlT3B0SW4gPSBmYWxzZTsKCmlmIChcUEhQX1ZFUlNJT05fSUQgPj0gODAwMDApIHsKZm9yZWFjaCAoKG5ldyBcUmVmbGVjdGlvbkNsYXNzKHNlbGY6OmNsYXNzKSktPmdldE1ldGhvZHMoKSBhcyAkbWV0aG9kKSB7CmlmIChzZWxmOjpjbGFzcyAhPT0gJG1ldGhvZC0+Z2V0RGVjbGFyaW5nQ2xhc3MoKS0+bmFtZSkgewpjb250aW51ZTsKfQoKaWYgKCEkYXR0cmlidXRlID0gJG1ldGhvZC0+Z2V0QXR0cmlidXRlcyhTdWJzY3JpYmVkU2VydmljZTo6Y2xhc3MpWzBdID8/IG51bGwpIHsKY29udGludWU7Cn0KCmlmICgkbWV0aG9kLT5pc1N0YXRpYygpIHx8ICRtZXRob2QtPmlzQWJzdHJhY3QoKSB8fCAkbWV0aG9kLT5pc0dlbmVyYXRvcigpIHx8ICRtZXRob2QtPmlzSW50ZXJuYWwoKSB8fCAkbWV0aG9kLT5nZXROdW1iZXJPZlJlcXVpcmVkUGFyYW1ldGVycygpKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oc3ByaW50ZignQ2Fubm90IHVzZSAiJXMiIG9uIG1ldGhvZCAiJXM6OiVzKCkiIChjYW4gb25seSBiZSB1c2VkIG9uIG5vbi1zdGF0aWMsIG5vbi1hYnN0cmFjdCBtZXRob2RzIHdpdGggbm8gcGFyYW1ldGVycykuJywgU3Vic2NyaWJlZFNlcnZpY2U6OmNsYXNzLCBzZWxmOjpjbGFzcywgJG1ldGhvZC0+bmFtZSkpOwp9CgppZiAoISRyZXR1cm5UeXBlID0gJG1ldGhvZC0+Z2V0UmV0dXJuVHlwZSgpKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oc3ByaW50ZignQ2Fubm90IHVzZSAiJXMiIG9uIG1ldGhvZHMgd2l0aG91dCBhIHJldHVybiB0eXBlIGluICIlczo6JXMoKSIuJywgU3Vic2NyaWJlZFNlcnZpY2U6OmNsYXNzLCAkbWV0aG9kLT5uYW1lLCBzZWxmOjpjbGFzcykpOwp9Cgokc2VydmljZUlkID0gJHJldHVyblR5cGUgaW5zdGFuY2VvZiBcUmVmbGVjdGlvbk5hbWVkVHlwZSA/ICRyZXR1cm5UeXBlLT5nZXROYW1lKCkgOiAoc3RyaW5nKSAkcmV0dXJuVHlwZTsKCmlmICgkcmV0dXJuVHlwZS0+YWxsb3dzTnVsbCgpKSB7CiRzZXJ2aWNlSWQgPSAnPycuJHNlcnZpY2VJZDsKfQoKJHNlcnZpY2VzWyRhdHRyaWJ1dGUtPm5ld0luc3RhbmNlKCktPmtleSA/PyBzZWxmOjpjbGFzcy4nOjonLiRtZXRob2QtPm5hbWVdID0gJHNlcnZpY2VJZDsKJGF0dHJpYnV0ZU9wdEluID0gdHJ1ZTsKfQp9CgppZiAoISRhdHRyaWJ1dGVPcHRJbikgewpmb3JlYWNoICgobmV3IFxSZWZsZWN0aW9uQ2xhc3Moc2VsZjo6Y2xhc3MpKS0+Z2V0TWV0aG9kcygpIGFzICRtZXRob2QpIHsKaWYgKCRtZXRob2QtPmlzU3RhdGljKCkgfHwgJG1ldGhvZC0+aXNBYnN0cmFjdCgpIHx8ICRtZXRob2QtPmlzR2VuZXJhdG9yKCkgfHwgJG1ldGhvZC0+aXNJbnRlcm5hbCgpIHx8ICRtZXRob2QtPmdldE51bWJlck9mUmVxdWlyZWRQYXJhbWV0ZXJzKCkpIHsKY29udGludWU7Cn0KCmlmIChzZWxmOjpjbGFzcyAhPT0gJG1ldGhvZC0+Z2V0RGVjbGFyaW5nQ2xhc3MoKS0+bmFtZSkgewpjb250aW51ZTsKfQoKaWYgKCEoJHJldHVyblR5cGUgPSAkbWV0aG9kLT5nZXRSZXR1cm5UeXBlKCkpIGluc3RhbmNlb2YgXFJlZmxlY3Rpb25OYW1lZFR5cGUpIHsKY29udGludWU7Cn0KCmlmICgkcmV0dXJuVHlwZS0+aXNCdWlsdGluKCkpIHsKY29udGludWU7Cn0KCmlmIChcUEhQX1ZFUlNJT05fSUQgPj0gODAwMDApIHsKdHJpZ2dlcl9kZXByZWNhdGlvbignc3ltZm9ueS9zZXJ2aWNlLWNvbnRyYWN0cycsICcyLjUnLCAnVXNpbmcgIiVzIiBpbiAiJXMiIHdpdGhvdXQgdXNpbmcgdGhlICIlcyIgYXR0cmlidXRlIG9uIGFueSBtZXRob2QgaXMgZGVwcmVjYXRlZC4nLCBTZXJ2aWNlU3Vic2NyaWJlclRyYWl0OjpjbGFzcywgc2VsZjo6Y2xhc3MsIFN1YnNjcmliZWRTZXJ2aWNlOjpjbGFzcyk7Cn0KCiRzZXJ2aWNlc1tzZWxmOjpjbGFzcy4nOjonLiRtZXRob2QtPm5hbWVdID0gJz8nLigkcmV0dXJuVHlwZSBpbnN0YW5jZW9mIFxSZWZsZWN0aW9uTmFtZWRUeXBlID8gJHJldHVyblR5cGUtPmdldE5hbWUoKSA6ICRyZXR1cm5UeXBlKTsKfQp9CgpyZXR1cm4gJHNlcnZpY2VzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDb250YWluZXIoQ29udGFpbmVySW50ZXJmYWNlICRjb250YWluZXIpCnsKJHJldCA9IG51bGw7CmlmIChtZXRob2RfZXhpc3RzKGdldF9wYXJlbnRfY2xhc3Moc2VsZjo6Y2xhc3MpID86ICcnLCBfX0ZVTkNUSU9OX18pKSB7CiRyZXQgPSBwYXJlbnQ6OnNldENvbnRhaW5lcigkY29udGFpbmVyKTsKfQoKJHRoaXMtPmNvbnRhaW5lciA9ICRjb250YWluZXI7CgpyZXR1cm4gJHJldDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb250cmFjdHNcU2VydmljZVxUZXN0OwoKY2xhc3NfYWxpYXMoU2VydmljZUxvY2F0b3JUZXN0Q2FzZTo6Y2xhc3MsIFNlcnZpY2VMb2NhdG9yVGVzdDo6Y2xhc3MpOwoKaWYgKGZhbHNlKSB7CgoKCmNsYXNzIFNlcnZpY2VMb2NhdG9yVGVzdAp7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29udHJhY3RzXFNlcnZpY2VcVGVzdDsKCnVzZSBQSFBVbml0XEZyYW1ld29ya1xUZXN0Q2FzZTsKdXNlIFBzclxDb250YWluZXJcQ29udGFpbmVySW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb250cmFjdHNcU2VydmljZVxTZXJ2aWNlTG9jYXRvclRyYWl0OwoKYWJzdHJhY3QgY2xhc3MgU2VydmljZUxvY2F0b3JUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlCnsKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFNlcnZpY2VMb2NhdG9yKGFycmF5ICRmYWN0b3JpZXMpCnsKcmV0dXJuIG5ldyBjbGFzcygkZmFjdG9yaWVzKSBpbXBsZW1lbnRzIENvbnRhaW5lckludGVyZmFjZSB7CnVzZSBTZXJ2aWNlTG9jYXRvclRyYWl0Owp9Owp9CgpwdWJsaWMgZnVuY3Rpb24gdGVzdEhhcygpCnsKJGxvY2F0b3IgPSAkdGhpcy0+Z2V0U2VydmljZUxvY2F0b3IoWwonZm9vJyA9PiBmdW5jdGlvbiAoKSB7IHJldHVybiAnYmFyJzsgfSwKJ2JhcicgPT4gZnVuY3Rpb24gKCkgeyByZXR1cm4gJ2Jheic7IH0sCmZ1bmN0aW9uICgpIHsgcmV0dXJuICdkdW1teSc7IH0sCl0pOwoKJHRoaXMtPmFzc2VydFRydWUoJGxvY2F0b3ItPmhhcygnZm9vJykpOwokdGhpcy0+YXNzZXJ0VHJ1ZSgkbG9jYXRvci0+aGFzKCdiYXInKSk7CiR0aGlzLT5hc3NlcnRGYWxzZSgkbG9jYXRvci0+aGFzKCdkdW1teScpKTsKfQoKcHVibGljIGZ1bmN0aW9uIHRlc3RHZXQoKQp7CiRsb2NhdG9yID0gJHRoaXMtPmdldFNlcnZpY2VMb2NhdG9yKFsKJ2ZvbycgPT4gZnVuY3Rpb24gKCkgeyByZXR1cm4gJ2Jhcic7IH0sCidiYXInID0+IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdiYXonOyB9LApdKTsKCiR0aGlzLT5hc3NlcnRTYW1lKCdiYXInLCAkbG9jYXRvci0+Z2V0KCdmb28nKSk7CiR0aGlzLT5hc3NlcnRTYW1lKCdiYXonLCAkbG9jYXRvci0+Z2V0KCdiYXInKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0ZXN0R2V0RG9lc05vdE1lbW9pemUoKQp7CiRpID0gMDsKJGxvY2F0b3IgPSAkdGhpcy0+Z2V0U2VydmljZUxvY2F0b3IoWwonZm9vJyA9PiBmdW5jdGlvbiAoKSB1c2UgKCYkaSkgeworKyRpOwoKcmV0dXJuICdiYXInOwp9LApdKTsKCiR0aGlzLT5hc3NlcnRTYW1lKCdiYXInLCAkbG9jYXRvci0+Z2V0KCdmb28nKSk7CiR0aGlzLT5hc3NlcnRTYW1lKCdiYXInLCAkbG9jYXRvci0+Z2V0KCdmb28nKSk7CiR0aGlzLT5hc3NlcnRTYW1lKDIsICRpKTsKfQoKcHVibGljIGZ1bmN0aW9uIHRlc3RUaHJvd3NPblVuZGVmaW5lZEludGVybmFsU2VydmljZSgpCnsKaWYgKCEkdGhpcy0+Z2V0RXhwZWN0ZWRFeGNlcHRpb24oKSkgewokdGhpcy0+ZXhwZWN0RXhjZXB0aW9uKFxQc3JcQ29udGFpbmVyXE5vdEZvdW5kRXhjZXB0aW9uSW50ZXJmYWNlOjpjbGFzcyk7CiR0aGlzLT5leHBlY3RFeGNlcHRpb25NZXNzYWdlKCdUaGUgc2VydmljZSAiZm9vIiBoYXMgYSBkZXBlbmRlbmN5IG9uIGEgbm9uLWV4aXN0ZW50IHNlcnZpY2UgImJhciIuIFRoaXMgbG9jYXRvciBvbmx5IGtub3dzIGFib3V0IHRoZSAiZm9vIiBzZXJ2aWNlLicpOwp9CiRsb2NhdG9yID0gJHRoaXMtPmdldFNlcnZpY2VMb2NhdG9yKFsKJ2ZvbycgPT4gZnVuY3Rpb24gKCkgdXNlICgmJGxvY2F0b3IpIHsgcmV0dXJuICRsb2NhdG9yLT5nZXQoJ2JhcicpOyB9LApdKTsKCiRsb2NhdG9yLT5nZXQoJ2ZvbycpOwp9CgpwdWJsaWMgZnVuY3Rpb24gdGVzdFRocm93c09uQ2lyY3VsYXJSZWZlcmVuY2UoKQp7CiR0aGlzLT5leHBlY3RFeGNlcHRpb24oXFBzclxDb250YWluZXJcQ29udGFpbmVyRXhjZXB0aW9uSW50ZXJmYWNlOjpjbGFzcyk7CiR0aGlzLT5leHBlY3RFeGNlcHRpb25NZXNzYWdlKCdDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgZm9yIHNlcnZpY2UgImJhciIsIHBhdGg6ICJiYXIgLT4gYmF6IC0+IGJhciIuJyk7CiRsb2NhdG9yID0gJHRoaXMtPmdldFNlcnZpY2VMb2NhdG9yKFsKJ2ZvbycgPT4gZnVuY3Rpb24gKCkgdXNlICgmJGxvY2F0b3IpIHsgcmV0dXJuICRsb2NhdG9yLT5nZXQoJ2JhcicpOyB9LAonYmFyJyA9PiBmdW5jdGlvbiAoKSB1c2UgKCYkbG9jYXRvcikgeyByZXR1cm4gJGxvY2F0b3ItPmdldCgnYmF6Jyk7IH0sCidiYXonID0+IGZ1bmN0aW9uICgpIHVzZSAoJiRsb2NhdG9yKSB7IHJldHVybiAkbG9jYXRvci0+Z2V0KCdiYXInKTsgfSwKXSk7CgokbG9jYXRvci0+Z2V0KCdmb28nKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xFeGNlcHRpb25cRXhjZXB0aW9uSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcRXhjZXB0aW9uXFJ1bnRpbWVFeGNlcHRpb247CgoKCgoKCgoKCgoKCgphYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0cmluZyBpbXBsZW1lbnRzIFxTdHJpbmdhYmxlLCBcSnNvblNlcmlhbGl6YWJsZQp7CnB1YmxpYyBjb25zdCBQUkVHX1BBVFRFUk5fT1JERVIgPSBcUFJFR19QQVRURVJOX09SREVSOwpwdWJsaWMgY29uc3QgUFJFR19TRVRfT1JERVIgPSBcUFJFR19TRVRfT1JERVI7CnB1YmxpYyBjb25zdCBQUkVHX09GRlNFVF9DQVBUVVJFID0gXFBSRUdfT0ZGU0VUX0NBUFRVUkU7CnB1YmxpYyBjb25zdCBQUkVHX1VOTUFUQ0hFRF9BU19OVUxMID0gXFBSRUdfVU5NQVRDSEVEX0FTX05VTEw7CgpwdWJsaWMgY29uc3QgUFJFR19TUExJVCA9IDA7CnB1YmxpYyBjb25zdCBQUkVHX1NQTElUX05PX0VNUFRZID0gXFBSRUdfU1BMSVRfTk9fRU1QVFk7CnB1YmxpYyBjb25zdCBQUkVHX1NQTElUX0RFTElNX0NBUFRVUkUgPSBcUFJFR19TUExJVF9ERUxJTV9DQVBUVVJFOwpwdWJsaWMgY29uc3QgUFJFR19TUExJVF9PRkZTRVRfQ0FQVFVSRSA9IFxQUkVHX1NQTElUX09GRlNFVF9DQVBUVVJFOwoKcHJvdGVjdGVkICRzdHJpbmcgPSAnJzsKcHJvdGVjdGVkICRpZ25vcmVDYXNlID0gZmFsc2U7CgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRzdHJpbmcgPSAnJyk7CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdW53cmFwKGFycmF5ICR2YWx1ZXMpOiBhcnJheQp7CmZvcmVhY2ggKCR2YWx1ZXMgYXMgJGsgPT4gJHYpIHsKaWYgKCR2IGluc3RhbmNlb2Ygc2VsZikgewokdmFsdWVzWyRrXSA9ICR2LT5fX3RvU3RyaW5nKCk7Cn0gZWxzZWlmIChcaXNfYXJyYXkoJHYpICYmICR2YWx1ZXNbJGtdICE9PSAkdiA9IHN0YXRpYzo6dW53cmFwKCR2KSkgewokdmFsdWVzWyRrXSA9ICR2Owp9Cn0KCnJldHVybiAkdmFsdWVzOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gd3JhcChhcnJheSAkdmFsdWVzKTogYXJyYXkKewokaSA9IDA7CiRrZXlzID0gbnVsbDsKCmZvcmVhY2ggKCR2YWx1ZXMgYXMgJGsgPT4gJHYpIHsKaWYgKFxpc19zdHJpbmcoJGspICYmICcnICE9PSAkayAmJiAkayAhPT0gJGogPSAoc3RyaW5nKSBuZXcgc3RhdGljKCRrKSkgewoka2V5cyA9ICRrZXlzID8/IGFycmF5X2tleXMoJHZhbHVlcyk7CiRrZXlzWyRpXSA9ICRqOwp9CgppZiAoXGlzX3N0cmluZygkdikpIHsKJHZhbHVlc1ska10gPSBuZXcgc3RhdGljKCR2KTsKfSBlbHNlaWYgKFxpc19hcnJheSgkdikgJiYgJHZhbHVlc1ska10gIT09ICR2ID0gc3RhdGljOjp3cmFwKCR2KSkgewokdmFsdWVzWyRrXSA9ICR2Owp9CgorKyRpOwp9CgpyZXR1cm4gbnVsbCAhPT0gJGtleXMgPyBhcnJheV9jb21iaW5lKCRrZXlzLCAkdmFsdWVzKSA6ICR2YWx1ZXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFmdGVyKCRuZWVkbGUsIGJvb2wgJGluY2x1ZGVOZWVkbGUgPSBmYWxzZSwgaW50ICRvZmZzZXQgPSAwKTogc2VsZgp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJGkgPSBcUEhQX0lOVF9NQVg7Cgpmb3JlYWNoICgoYXJyYXkpICRuZWVkbGUgYXMgJG4pIHsKJG4gPSAoc3RyaW5nKSAkbjsKJGogPSAkdGhpcy0+aW5kZXhPZigkbiwgJG9mZnNldCk7CgppZiAobnVsbCAhPT0gJGogJiYgJGogPCAkaSkgewokaSA9ICRqOwokc3RyLT5zdHJpbmcgPSAkbjsKfQp9CgppZiAoXFBIUF9JTlRfTUFYID09PSAkaSkgewpyZXR1cm4gJHN0cjsKfQoKaWYgKCEkaW5jbHVkZU5lZWRsZSkgewokaSArPSAkc3RyLT5sZW5ndGgoKTsKfQoKcmV0dXJuICR0aGlzLT5zbGljZSgkaSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFmdGVyTGFzdCgkbmVlZGxlLCBib29sICRpbmNsdWRlTmVlZGxlID0gZmFsc2UsIGludCAkb2Zmc2V0ID0gMCk6IHNlbGYKewokc3RyID0gY2xvbmUgJHRoaXM7CiRpID0gbnVsbDsKCmZvcmVhY2ggKChhcnJheSkgJG5lZWRsZSBhcyAkbikgewokbiA9IChzdHJpbmcpICRuOwokaiA9ICR0aGlzLT5pbmRleE9mTGFzdCgkbiwgJG9mZnNldCk7CgppZiAobnVsbCAhPT0gJGogJiYgJGogPj0gJGkpIHsKJGkgPSAkb2Zmc2V0ID0gJGo7CiRzdHItPnN0cmluZyA9ICRuOwp9Cn0KCmlmIChudWxsID09PSAkaSkgewpyZXR1cm4gJHN0cjsKfQoKaWYgKCEkaW5jbHVkZU5lZWRsZSkgewokaSArPSAkc3RyLT5sZW5ndGgoKTsKfQoKcmV0dXJuICR0aGlzLT5zbGljZSgkaSk7Cn0KCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBhcHBlbmQoc3RyaW5nIC4uLiRzdWZmaXgpOiBzZWxmOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYmVmb3JlKCRuZWVkbGUsIGJvb2wgJGluY2x1ZGVOZWVkbGUgPSBmYWxzZSwgaW50ICRvZmZzZXQgPSAwKTogc2VsZgp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJGkgPSBcUEhQX0lOVF9NQVg7Cgpmb3JlYWNoICgoYXJyYXkpICRuZWVkbGUgYXMgJG4pIHsKJG4gPSAoc3RyaW5nKSAkbjsKJGogPSAkdGhpcy0+aW5kZXhPZigkbiwgJG9mZnNldCk7CgppZiAobnVsbCAhPT0gJGogJiYgJGogPCAkaSkgewokaSA9ICRqOwokc3RyLT5zdHJpbmcgPSAkbjsKfQp9CgppZiAoXFBIUF9JTlRfTUFYID09PSAkaSkgewpyZXR1cm4gJHN0cjsKfQoKaWYgKCRpbmNsdWRlTmVlZGxlKSB7CiRpICs9ICRzdHItPmxlbmd0aCgpOwp9CgpyZXR1cm4gJHRoaXMtPnNsaWNlKDAsICRpKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYmVmb3JlTGFzdCgkbmVlZGxlLCBib29sICRpbmNsdWRlTmVlZGxlID0gZmFsc2UsIGludCAkb2Zmc2V0ID0gMCk6IHNlbGYKewokc3RyID0gY2xvbmUgJHRoaXM7CiRpID0gbnVsbDsKCmZvcmVhY2ggKChhcnJheSkgJG5lZWRsZSBhcyAkbikgewokbiA9IChzdHJpbmcpICRuOwokaiA9ICR0aGlzLT5pbmRleE9mTGFzdCgkbiwgJG9mZnNldCk7CgppZiAobnVsbCAhPT0gJGogJiYgJGogPj0gJGkpIHsKJGkgPSAkb2Zmc2V0ID0gJGo7CiRzdHItPnN0cmluZyA9ICRuOwp9Cn0KCmlmIChudWxsID09PSAkaSkgewpyZXR1cm4gJHN0cjsKfQoKaWYgKCRpbmNsdWRlTmVlZGxlKSB7CiRpICs9ICRzdHItPmxlbmd0aCgpOwp9CgpyZXR1cm4gJHRoaXMtPnNsaWNlKDAsICRpKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGJ5dGVzQXQoaW50ICRvZmZzZXQpOiBhcnJheQp7CiRzdHIgPSAkdGhpcy0+c2xpY2UoJG9mZnNldCwgMSk7CgpyZXR1cm4gJycgPT09ICRzdHItPnN0cmluZyA/IFtdIDogYXJyYXlfdmFsdWVzKHVucGFjaygnQyonLCAkc3RyLT5zdHJpbmcpKTsKfQoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGNhbWVsKCk6IHNlbGY7CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gY2h1bmsoaW50ICRsZW5ndGggPSAxKTogYXJyYXk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gY29sbGFwc2VXaGl0ZXNwYWNlKCk6IHNlbGYKewokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9IHRyaW0ocHJlZ19yZXBsYWNlKCIvKD86WyBcblxyXHRceDBDXXsyLH0rfFtcblxyXHRceDBDXSkvIiwgJyAnLCAkc3RyLT5zdHJpbmcpLCAiIFxuXHJcdFx4MEMiKTsKCnJldHVybiAkc3RyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY29udGFpbnNBbnkoJG5lZWRsZSk6IGJvb2wKewpyZXR1cm4gbnVsbCAhPT0gJHRoaXMtPmluZGV4T2YoJG5lZWRsZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBlbmRzV2l0aCgkc3VmZml4KTogYm9vbAp7CmlmICghXGlzX2FycmF5KCRzdWZmaXgpICYmICEkc3VmZml4IGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoJ01ldGhvZCAiJXMoKSIgbXVzdCBiZSBvdmVycmlkZGVuIGJ5IGNsYXNzICIlcyIgdG8gZGVhbCB3aXRoIG5vbi1pdGVyYWJsZSB2YWx1ZXMuJywgX19GVU5DVElPTl9fLCBzdGF0aWM6OmNsYXNzKSk7Cn0KCmZvcmVhY2ggKCRzdWZmaXggYXMgJHMpIHsKaWYgKCR0aGlzLT5lbmRzV2l0aCgoc3RyaW5nKSAkcykpIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZW5zdXJlRW5kKHN0cmluZyAkc3VmZml4KTogc2VsZgp7CmlmICghJHRoaXMtPmVuZHNXaXRoKCRzdWZmaXgpKSB7CnJldHVybiAkdGhpcy0+YXBwZW5kKCRzdWZmaXgpOwp9Cgokc3VmZml4ID0gcHJlZ19xdW90ZSgkc3VmZml4KTsKJHJlZ2V4ID0gJ3soJy4kc3VmZml4LicpKD86Jy4kc3VmZml4LicpKyskfUQnOwoKcmV0dXJuICR0aGlzLT5yZXBsYWNlTWF0Y2hlcygkcmVnZXguKCR0aGlzLT5pZ25vcmVDYXNlID8gJ2knIDogJycpLCAnJDEnKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGVuc3VyZVN0YXJ0KHN0cmluZyAkcHJlZml4KTogc2VsZgp7CiRwcmVmaXggPSBuZXcgc3RhdGljKCRwcmVmaXgpOwoKaWYgKCEkdGhpcy0+c3RhcnRzV2l0aCgkcHJlZml4KSkgewpyZXR1cm4gJHRoaXMtPnByZXBlbmQoJHByZWZpeCk7Cn0KCiRzdHIgPSBjbG9uZSAkdGhpczsKJGkgPSAkcHJlZml4TGVuID0gJHByZWZpeC0+bGVuZ3RoKCk7Cgp3aGlsZSAoJHRoaXMtPmluZGV4T2YoJHByZWZpeCwgJGkpID09PSAkaSkgewokc3RyID0gJHN0ci0+c2xpY2UoJHByZWZpeExlbik7CiRpICs9ICRwcmVmaXhMZW47Cn0KCnJldHVybiAkc3RyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZXF1YWxzVG8oJHN0cmluZyk6IGJvb2wKewppZiAoIVxpc19hcnJheSgkc3RyaW5nKSAmJiAhJHN0cmluZyBpbnN0YW5jZW9mIFxUcmF2ZXJzYWJsZSkgewp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKCdNZXRob2QgIiVzKCkiIG11c3QgYmUgb3ZlcnJpZGRlbiBieSBjbGFzcyAiJXMiIHRvIGRlYWwgd2l0aCBub24taXRlcmFibGUgdmFsdWVzLicsIF9fRlVOQ1RJT05fXywgc3RhdGljOjpjbGFzcykpOwp9Cgpmb3JlYWNoICgkc3RyaW5nIGFzICRzKSB7CmlmICgkdGhpcy0+ZXF1YWxzVG8oKHN0cmluZykgJHMpKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGZvbGRlZCgpOiBzZWxmOwoKCgoKcHVibGljIGZ1bmN0aW9uIGlnbm9yZUNhc2UoKTogc2VsZgp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+aWdub3JlQ2FzZSA9IHRydWU7CgpyZXR1cm4gJHN0cjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGluZGV4T2YoJG5lZWRsZSwgaW50ICRvZmZzZXQgPSAwKTogP2ludAp7CmlmICghXGlzX2FycmF5KCRuZWVkbGUpICYmICEkbmVlZGxlIGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoJ01ldGhvZCAiJXMoKSIgbXVzdCBiZSBvdmVycmlkZGVuIGJ5IGNsYXNzICIlcyIgdG8gZGVhbCB3aXRoIG5vbi1pdGVyYWJsZSB2YWx1ZXMuJywgX19GVU5DVElPTl9fLCBzdGF0aWM6OmNsYXNzKSk7Cn0KCiRpID0gXFBIUF9JTlRfTUFYOwoKZm9yZWFjaCAoJG5lZWRsZSBhcyAkbikgewokaiA9ICR0aGlzLT5pbmRleE9mKChzdHJpbmcpICRuLCAkb2Zmc2V0KTsKCmlmIChudWxsICE9PSAkaiAmJiAkaiA8ICRpKSB7CiRpID0gJGo7Cn0KfQoKcmV0dXJuIFxQSFBfSU5UX01BWCA9PT0gJGkgPyBudWxsIDogJGk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpbmRleE9mTGFzdCgkbmVlZGxlLCBpbnQgJG9mZnNldCA9IDApOiA/aW50CnsKaWYgKCFcaXNfYXJyYXkoJG5lZWRsZSkgJiYgISRuZWVkbGUgaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKdGhyb3cgbmV3IFxUeXBlRXJyb3Ioc3ByaW50ZignTWV0aG9kICIlcygpIiBtdXN0IGJlIG92ZXJyaWRkZW4gYnkgY2xhc3MgIiVzIiB0byBkZWFsIHdpdGggbm9uLWl0ZXJhYmxlIHZhbHVlcy4nLCBfX0ZVTkNUSU9OX18sIHN0YXRpYzo6Y2xhc3MpKTsKfQoKJGkgPSBudWxsOwoKZm9yZWFjaCAoJG5lZWRsZSBhcyAkbikgewokaiA9ICR0aGlzLT5pbmRleE9mTGFzdCgoc3RyaW5nKSAkbiwgJG9mZnNldCk7CgppZiAobnVsbCAhPT0gJGogJiYgJGogPj0gJGkpIHsKJGkgPSAkb2Zmc2V0ID0gJGo7Cn0KfQoKcmV0dXJuICRpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNFbXB0eSgpOiBib29sCnsKcmV0dXJuICcnID09PSAkdGhpcy0+c3RyaW5nOwp9CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gam9pbihhcnJheSAkc3RyaW5ncywgP3N0cmluZyAkbGFzdEdsdWUgPSBudWxsKTogc2VsZjsKCnB1YmxpYyBmdW5jdGlvbiBqc29uU2VyaWFsaXplKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+c3RyaW5nOwp9CgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gbGVuZ3RoKCk6IGludDsKCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBsb3dlcigpOiBzZWxmOwoKCgoKCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBtYXRjaChzdHJpbmcgJHJlZ2V4cCwgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IGFycmF5OwoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHBhZEJvdGgoaW50ICRsZW5ndGgsIHN0cmluZyAkcGFkU3RyID0gJyAnKTogc2VsZjsKCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBwYWRFbmQoaW50ICRsZW5ndGgsIHN0cmluZyAkcGFkU3RyID0gJyAnKTogc2VsZjsKCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBwYWRTdGFydChpbnQgJGxlbmd0aCwgc3RyaW5nICRwYWRTdHIgPSAnICcpOiBzZWxmOwoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHByZXBlbmQoc3RyaW5nIC4uLiRwcmVmaXgpOiBzZWxmOwoKCgoKcHVibGljIGZ1bmN0aW9uIHJlcGVhdChpbnQgJG11bHRpcGxpZXIpOiBzZWxmCnsKaWYgKDAgPiAkbXVsdGlwbGllcikgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ011bHRpcGxpZXIgbXVzdCBiZSBwb3NpdGl2ZSwgJWQgZ2l2ZW4uJywgJG11bHRpcGxpZXIpKTsKfQoKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSBzdHJfcmVwZWF0KCRzdHItPnN0cmluZywgJG11bHRpcGxpZXIpOwoKcmV0dXJuICRzdHI7Cn0KCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZXBsYWNlKHN0cmluZyAkZnJvbSwgc3RyaW5nICR0byk6IHNlbGY7CgoKCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZXBsYWNlTWF0Y2hlcyhzdHJpbmcgJGZyb21SZWdleHAsICR0byk6IHNlbGY7CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmV2ZXJzZSgpOiBzZWxmOwoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHNsaWNlKGludCAkc3RhcnQgPSAwLCA/aW50ICRsZW5ndGggPSBudWxsKTogc2VsZjsKCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBzbmFrZSgpOiBzZWxmOwoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHNwbGljZShzdHJpbmcgJHJlcGxhY2VtZW50LCBpbnQgJHN0YXJ0ID0gMCwgP2ludCAkbGVuZ3RoID0gbnVsbCk6IHNlbGY7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc3BsaXQoc3RyaW5nICRkZWxpbWl0ZXIsID9pbnQgJGxpbWl0ID0gbnVsbCwgP2ludCAkZmxhZ3MgPSBudWxsKTogYXJyYXkKewppZiAobnVsbCA9PT0gJGZsYWdzKSB7CnRocm93IG5ldyBcVHlwZUVycm9yKCdTcGxpdCBiZWhhdmlvciB3aGVuICRmbGFncyBpcyBudWxsIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgY2hpbGQgY2xhc3Nlcy4nKTsKfQoKaWYgKCR0aGlzLT5pZ25vcmVDYXNlKSB7CiRkZWxpbWl0ZXIgLj0gJ2knOwp9CgpzZXRfZXJyb3JfaGFuZGxlcihzdGF0aWMgZnVuY3Rpb24gKCR0LCAkbSkgeyB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCRtKTsgfSk7Cgp0cnkgewppZiAoZmFsc2UgPT09ICRjaHVua3MgPSBwcmVnX3NwbGl0KCRkZWxpbWl0ZXIsICR0aGlzLT5zdHJpbmcsICRsaW1pdCwgJGZsYWdzKSkgewokbGFzdEVycm9yID0gcHJlZ19sYXN0X2Vycm9yKCk7Cgpmb3JlYWNoIChnZXRfZGVmaW5lZF9jb25zdGFudHModHJ1ZSlbJ3BjcmUnXSBhcyAkayA9PiAkdikgewppZiAoJGxhc3RFcnJvciA9PT0gJHYgJiYgJ19FUlJPUicgPT09IHN1YnN0cigkaywgLTYpKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdTcGxpdHRpbmcgZmFpbGVkIHdpdGggJy4kay4nLicpOwp9Cn0KCnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdTcGxpdHRpbmcgZmFpbGVkIHdpdGggdW5rbm93biBlcnJvciBjb2RlLicpOwp9Cn0gZmluYWxseSB7CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwp9Cgokc3RyID0gY2xvbmUgJHRoaXM7CgppZiAoc2VsZjo6UFJFR19TUExJVF9PRkZTRVRfQ0FQVFVSRSAmICRmbGFncykgewpmb3JlYWNoICgkY2h1bmtzIGFzICYkY2h1bmspIHsKJHN0ci0+c3RyaW5nID0gJGNodW5rWzBdOwokY2h1bmtbMF0gPSBjbG9uZSAkc3RyOwp9Cn0gZWxzZSB7CmZvcmVhY2ggKCRjaHVua3MgYXMgJiRjaHVuaykgewokc3RyLT5zdHJpbmcgPSAkY2h1bms7CiRjaHVuayA9IGNsb25lICRzdHI7Cn0KfQoKcmV0dXJuICRjaHVua3M7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzdGFydHNXaXRoKCRwcmVmaXgpOiBib29sCnsKaWYgKCFcaXNfYXJyYXkoJHByZWZpeCkgJiYgISRwcmVmaXggaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKdGhyb3cgbmV3IFxUeXBlRXJyb3Ioc3ByaW50ZignTWV0aG9kICIlcygpIiBtdXN0IGJlIG92ZXJyaWRkZW4gYnkgY2xhc3MgIiVzIiB0byBkZWFsIHdpdGggbm9uLWl0ZXJhYmxlIHZhbHVlcy4nLCBfX0ZVTkNUSU9OX18sIHN0YXRpYzo6Y2xhc3MpKTsKfQoKZm9yZWFjaCAoJHByZWZpeCBhcyAkcHJlZml4KSB7CmlmICgkdGhpcy0+c3RhcnRzV2l0aCgoc3RyaW5nKSAkcHJlZml4KSkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB0aXRsZShib29sICRhbGxXb3JkcyA9IGZhbHNlKTogc2VsZjsKCnB1YmxpYyBmdW5jdGlvbiB0b0J5dGVTdHJpbmcoP3N0cmluZyAkdG9FbmNvZGluZyA9IG51bGwpOiBCeXRlU3RyaW5nCnsKJGIgPSBuZXcgQnl0ZVN0cmluZygpOwoKJHRvRW5jb2RpbmcgPSBcaW5fYXJyYXkoJHRvRW5jb2RpbmcsIFsndXRmOCcsICd1dGYtOCcsICdVVEY4J10sIHRydWUpID8gJ1VURi04JyA6ICR0b0VuY29kaW5nOwoKaWYgKG51bGwgPT09ICR0b0VuY29kaW5nIHx8ICR0b0VuY29kaW5nID09PSAkZnJvbUVuY29kaW5nID0gJHRoaXMgaW5zdGFuY2VvZiBBYnN0cmFjdFVuaWNvZGVTdHJpbmcgfHwgcHJlZ19tYXRjaCgnLy91JywgJGItPnN0cmluZykgPyAnVVRGLTgnIDogJ1dpbmRvd3MtMTI1MicpIHsKJGItPnN0cmluZyA9ICR0aGlzLT5zdHJpbmc7CgpyZXR1cm4gJGI7Cn0KCnNldF9lcnJvcl9oYW5kbGVyKHN0YXRpYyBmdW5jdGlvbiAoJHQsICRtKSB7IHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJG0pOyB9KTsKCnRyeSB7CnRyeSB7CiRiLT5zdHJpbmcgPSBtYl9jb252ZXJ0X2VuY29kaW5nKCR0aGlzLT5zdHJpbmcsICR0b0VuY29kaW5nLCAnVVRGLTgnKTsKfSBjYXRjaCAoSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9ufFxWYWx1ZUVycm9yICRlKSB7CmlmICghXGZ1bmN0aW9uX2V4aXN0cygnaWNvbnYnKSkgewppZiAoJGUgaW5zdGFuY2VvZiBcVmFsdWVFcnJvcikgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCRlLT5nZXRNZXNzYWdlKCksICRlLT5nZXRDb2RlKCksICRlKTsKfQp0aHJvdyAkZTsKfQoKJGItPnN0cmluZyA9IGljb252KCdVVEYtOCcsICR0b0VuY29kaW5nLCAkdGhpcy0+c3RyaW5nKTsKfQp9IGZpbmFsbHkgewpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKfQoKcmV0dXJuICRiOwp9CgpwdWJsaWMgZnVuY3Rpb24gdG9Db2RlUG9pbnRTdHJpbmcoKTogQ29kZVBvaW50U3RyaW5nCnsKcmV0dXJuIG5ldyBDb2RlUG9pbnRTdHJpbmcoJHRoaXMtPnN0cmluZyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0b1N0cmluZygpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnN0cmluZzsKfQoKcHVibGljIGZ1bmN0aW9uIHRvVW5pY29kZVN0cmluZygpOiBVbmljb2RlU3RyaW5nCnsKcmV0dXJuIG5ldyBVbmljb2RlU3RyaW5nKCR0aGlzLT5zdHJpbmcpOwp9CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gdHJpbShzdHJpbmcgJGNoYXJzID0gIiBcdFxuXHJcMFx4MEJceDBDXHV7QTB9XHV7RkVGRn0iKTogc2VsZjsKCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB0cmltRW5kKHN0cmluZyAkY2hhcnMgPSAiIFx0XG5cclwwXHgwQlx4MENcdXtBMH1cdXtGRUZGfSIpOiBzZWxmOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdHJpbVByZWZpeCgkcHJlZml4KTogc2VsZgp7CmlmIChcaXNfYXJyYXkoJHByZWZpeCkgfHwgJHByZWZpeCBpbnN0YW5jZW9mIFxUcmF2ZXJzYWJsZSkgewpmb3JlYWNoICgkcHJlZml4IGFzICRzKSB7CiR0ID0gJHRoaXMtPnRyaW1QcmVmaXgoJHMpOwoKaWYgKCR0LT5zdHJpbmcgIT09ICR0aGlzLT5zdHJpbmcpIHsKcmV0dXJuICR0Owp9Cn0KCnJldHVybiBjbG9uZSAkdGhpczsKfQoKJHN0ciA9IGNsb25lICR0aGlzOwoKaWYgKCRwcmVmaXggaW5zdGFuY2VvZiBzZWxmKSB7CiRwcmVmaXggPSAkcHJlZml4LT5zdHJpbmc7Cn0gZWxzZSB7CiRwcmVmaXggPSAoc3RyaW5nKSAkcHJlZml4Owp9CgppZiAoJycgIT09ICRwcmVmaXggJiYgXHN0cmxlbigkdGhpcy0+c3RyaW5nKSA+PSBcc3RybGVuKCRwcmVmaXgpICYmIDAgPT09IHN1YnN0cl9jb21wYXJlKCR0aGlzLT5zdHJpbmcsICRwcmVmaXgsIDAsIFxzdHJsZW4oJHByZWZpeCksICR0aGlzLT5pZ25vcmVDYXNlKSkgewokc3RyLT5zdHJpbmcgPSBzdWJzdHIoJHRoaXMtPnN0cmluZywgXHN0cmxlbigkcHJlZml4KSk7Cn0KCnJldHVybiAkc3RyOwp9CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gdHJpbVN0YXJ0KHN0cmluZyAkY2hhcnMgPSAiIFx0XG5cclwwXHgwQlx4MENcdXtBMH1cdXtGRUZGfSIpOiBzZWxmOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdHJpbVN1ZmZpeCgkc3VmZml4KTogc2VsZgp7CmlmIChcaXNfYXJyYXkoJHN1ZmZpeCkgfHwgJHN1ZmZpeCBpbnN0YW5jZW9mIFxUcmF2ZXJzYWJsZSkgewpmb3JlYWNoICgkc3VmZml4IGFzICRzKSB7CiR0ID0gJHRoaXMtPnRyaW1TdWZmaXgoJHMpOwoKaWYgKCR0LT5zdHJpbmcgIT09ICR0aGlzLT5zdHJpbmcpIHsKcmV0dXJuICR0Owp9Cn0KCnJldHVybiBjbG9uZSAkdGhpczsKfQoKJHN0ciA9IGNsb25lICR0aGlzOwoKaWYgKCRzdWZmaXggaW5zdGFuY2VvZiBzZWxmKSB7CiRzdWZmaXggPSAkc3VmZml4LT5zdHJpbmc7Cn0gZWxzZSB7CiRzdWZmaXggPSAoc3RyaW5nKSAkc3VmZml4Owp9CgppZiAoJycgIT09ICRzdWZmaXggJiYgXHN0cmxlbigkdGhpcy0+c3RyaW5nKSA+PSBcc3RybGVuKCRzdWZmaXgpICYmIDAgPT09IHN1YnN0cl9jb21wYXJlKCR0aGlzLT5zdHJpbmcsICRzdWZmaXgsIC1cc3RybGVuKCRzdWZmaXgpLCBudWxsLCAkdGhpcy0+aWdub3JlQ2FzZSkpIHsKJHN0ci0+c3RyaW5nID0gc3Vic3RyKCR0aGlzLT5zdHJpbmcsIDAsIC1cc3RybGVuKCRzdWZmaXgpKTsKfQoKcmV0dXJuICRzdHI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB0cnVuY2F0ZShpbnQgJGxlbmd0aCwgc3RyaW5nICRlbGxpcHNpcyA9ICcnLCBib29sICRjdXQgPSB0cnVlKTogc2VsZgp7CiRzdHJpbmdMZW5ndGggPSAkdGhpcy0+bGVuZ3RoKCk7CgppZiAoJHN0cmluZ0xlbmd0aCA8PSAkbGVuZ3RoKSB7CnJldHVybiBjbG9uZSAkdGhpczsKfQoKJGVsbGlwc2lzTGVuZ3RoID0gJycgIT09ICRlbGxpcHNpcyA/IChuZXcgc3RhdGljKCRlbGxpcHNpcykpLT5sZW5ndGgoKSA6IDA7CgppZiAoJGxlbmd0aCA8ICRlbGxpcHNpc0xlbmd0aCkgewokZWxsaXBzaXNMZW5ndGggPSAwOwp9CgppZiAoISRjdXQpIHsKaWYgKG51bGwgPT09ICRsZW5ndGggPSAkdGhpcy0+aW5kZXhPZihbJyAnLCAiXHIiLCAiXG4iLCAiXHQiXSwgKCRsZW5ndGggPzogMSkgLSAxKSkgewpyZXR1cm4gY2xvbmUgJHRoaXM7Cn0KCiRsZW5ndGggKz0gJGVsbGlwc2lzTGVuZ3RoOwp9Cgokc3RyID0gJHRoaXMtPnNsaWNlKDAsICRsZW5ndGggLSAkZWxsaXBzaXNMZW5ndGgpOwoKcmV0dXJuICRlbGxpcHNpc0xlbmd0aCA/ICRzdHItPnRyaW1FbmQoKS0+YXBwZW5kKCRlbGxpcHNpcykgOiAkc3RyOwp9CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gdXBwZXIoKTogc2VsZjsKCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3aWR0aChib29sICRpZ25vcmVBbnNpRGVjb3JhdGlvbiA9IHRydWUpOiBpbnQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gd29yZHdyYXAoaW50ICR3aWR0aCA9IDc1LCBzdHJpbmcgJGJyZWFrID0gIlxuIiwgYm9vbCAkY3V0ID0gZmFsc2UpOiBzZWxmCnsKJGxpbmVzID0gJycgIT09ICRicmVhayA/ICR0aGlzLT5zcGxpdCgkYnJlYWspIDogW2Nsb25lICR0aGlzXTsKJGNoYXJzID0gW107CiRtYXNrID0gJyc7CgppZiAoMSA9PT0gXGNvdW50KCRsaW5lcykgJiYgJycgPT09ICRsaW5lc1swXS0+c3RyaW5nKSB7CnJldHVybiAkbGluZXNbMF07Cn0KCmZvcmVhY2ggKCRsaW5lcyBhcyAkaSA9PiAkbGluZSkgewppZiAoJGkpIHsKJGNoYXJzW10gPSAkYnJlYWs7CiRtYXNrIC49ICcjJzsKfQoKZm9yZWFjaCAoJGxpbmUtPmNodW5rKCkgYXMgJGNoYXIpIHsKJGNoYXJzW10gPSAkY2hhci0+c3RyaW5nOwokbWFzayAuPSAnICcgPT09ICRjaGFyLT5zdHJpbmcgPyAnICcgOiAnPyc7Cn0KfQoKJHN0cmluZyA9ICcnOwokaiA9IDA7CiRiID0gJGkgPSAtMTsKJG1hc2sgPSB3b3Jkd3JhcCgkbWFzaywgJHdpZHRoLCAnIycsICRjdXQpOwoKd2hpbGUgKGZhbHNlICE9PSAkYiA9IHN0cnBvcygkbWFzaywgJyMnLCAkYiArIDEpKSB7CmZvciAoKyskaTsgJGkgPCAkYjsgKyskaSkgewokc3RyaW5nIC49ICRjaGFyc1skal07CnVuc2V0KCRjaGFyc1skaisrXSk7Cn0KCmlmICgkYnJlYWsgPT09ICRjaGFyc1skal0gfHwgJyAnID09PSAkY2hhcnNbJGpdKSB7CnVuc2V0KCRjaGFyc1skaisrXSk7Cn0KCiRzdHJpbmcgLj0gJGJyZWFrOwp9Cgokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9ICRzdHJpbmcuaW1wbG9kZSgnJywgJGNoYXJzKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gX19zbGVlcCgpOiBhcnJheQp7CnJldHVybiBbJ3N0cmluZyddOwp9CgpwdWJsaWMgZnVuY3Rpb24gX19jbG9uZSgpCnsKJHRoaXMtPmlnbm9yZUNhc2UgPSBmYWxzZTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5zdHJpbmc7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZzsKCnVzZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcRXhjZXB0aW9uXEV4Y2VwdGlvbkludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEV4Y2VwdGlvblxSdW50aW1lRXhjZXB0aW9uOwoKCgoKCgoKCgoKCgphYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFVuaWNvZGVTdHJpbmcgZXh0ZW5kcyBBYnN0cmFjdFN0cmluZwp7CnB1YmxpYyBjb25zdCBORkMgPSBcTm9ybWFsaXplcjo6TkZDOwpwdWJsaWMgY29uc3QgTkZEID0gXE5vcm1hbGl6ZXI6Ok5GRDsKcHVibGljIGNvbnN0IE5GS0MgPSBcTm9ybWFsaXplcjo6TkZLQzsKcHVibGljIGNvbnN0IE5GS0QgPSBcTm9ybWFsaXplcjo6TkZLRDsKCgpwcml2YXRlIGNvbnN0IEFTQ0lJID0gIlx4MjBceDY1XHg2OVx4NjFceDczXHg2RVx4NzRceDcyXHg2Rlx4NkNceDc1XHg2NFx4NURceDVCXHg2M1x4NkRceDcwXHgyN1x4MEFceDY3XHg3Q1x4NjhceDc2XHgyRVx4NjZceDYyXHgyQ1x4M0FceDNEXHgyRFx4NzFceDMxXHgzMFx4NDNceDMyXHgyQVx4NzlceDc4XHgyOVx4MjhceDRDXHgzOVx4NDFceDUzXHgyRlx4NTBceDIyXHg0NVx4NkFceDREXHg0OVx4NkJceDMzXHgzRVx4MzVceDU0XHgzQ1x4NDRceDM0XHg3RFx4NDJceDdCXHgzOFx4NDZceDc3XHg1Mlx4MzZceDM3XHg1NVx4NDdceDRFXHgzQlx4NEFceDdBXHg1Nlx4MjNceDQ4XHg0Rlx4NTdceDVGXHgyNlx4MjFceDRCXHgzRlx4NThceDUxXHgyNVx4NTlceDVDXHgwOVx4NUFceDJCXHg3RVx4NUVceDI0XHg0MFx4NjBceDdGXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4XHgwQlx4MENceDBEXHgwRVx4MEZceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxN1x4MThceDE5XHgxQVx4MUJceDFDXHgxRFx4MUVceDFGIjsKCgpwcml2YXRlIGNvbnN0IEZPTERfRlJPTSA9IFsnxLAnLCAnwrUnLCAnxb8nLCAiXHhDRFx4ODUiLCAnz4InLCAnz5AnLCAnz5EnLCAnz5UnLCAnz5YnLCAnz7AnLCAnz7EnLCAnz7UnLCAn4bqbJywgIlx4RTFceEJFXHhCRSIsICfDnycsICfFiScsICfHsCcsICfOkCcsICfOsCcsICfWhycsICfhupYnLCAn4bqXJywgJ+G6mCcsICfhupknLCAn4bqaJywgJ+G6nicsICfhvZAnLCAn4b2SJywgJ+G9lCcsICfhvZYnLCAn4b6AJywgJ+G+gScsICfhvoInLCAn4b6DJywgJ+G+hCcsICfhvoUnLCAn4b6GJywgJ+G+hycsICfhvognLCAn4b6JJywgJ+G+iicsICfhvosnLCAn4b6MJywgJ+G+jScsICfhvo4nLCAn4b6PJywgJ+G+kCcsICfhvpEnLCAn4b6SJywgJ+G+kycsICfhvpQnLCAn4b6VJywgJ+G+licsICfhvpcnLCAn4b6YJywgJ+G+mScsICfhvponLCAn4b6bJywgJ+G+nCcsICfhvp0nLCAn4b6eJywgJ+G+nycsICfhvqAnLCAn4b6hJywgJ+G+oicsICfhvqMnLCAn4b6kJywgJ+G+pScsICfhvqYnLCAn4b6nJywgJ+G+qCcsICfhvqknLCAn4b6qJywgJ+G+qycsICfhvqwnLCAn4b6tJywgJ+G+ricsICfhvq8nLCAn4b6yJywgJ+G+sycsICfhvrQnLCAn4b62JywgJ+G+tycsICfhvrwnLCAn4b+CJywgJ+G/gycsICfhv4QnLCAn4b+GJywgJ+G/hycsICfhv4wnLCAn4b+SJywgJ+G/licsICfhv5cnLCAn4b+iJywgJ+G/pCcsICfhv6YnLCAn4b+nJywgJ+G/sicsICfhv7MnLCAn4b+0JywgJ+G/ticsICfhv7cnLCAn4b+8JywgJ++sgCcsICfvrIEnLCAn76yCJywgJ++sgycsICfvrIQnLCAn76yFJywgJ++shicsICfvrJMnLCAn76yUJywgJ++slScsICfvrJYnLCAn76yXJ107CnByaXZhdGUgY29uc3QgRk9MRF9UTyA9IFsnacyHJywgJ868JywgJ3MnLCAnzrknLCAnz4MnLCAnzrInLCAnzrgnLCAnz4YnLCAnz4AnLCAnzronLCAnz4EnLCAnzrUnLCAn4bmhJywgJ865JywgJ3NzJywgJ8q8bicsICfHsCcsICfOkCcsICfOsCcsICfVpdaCJywgJ+G6licsICfhupcnLCAn4bqYJywgJ+G6mScsICdhyr4nLCAnc3MnLCAn4b2QJywgJ+G9kicsICfhvZQnLCAn4b2WJywgJ+G8gM65JywgJ+G8gc65JywgJ+G8gs65JywgJ+G8g865JywgJ+G8hM65JywgJ+G8hc65JywgJ+G8hs65JywgJ+G8h865JywgJ+G8gM65JywgJ+G8gc65JywgJ+G8gs65JywgJ+G8g865JywgJ+G8hM65JywgJ+G8hc65JywgJ+G8hs65JywgJ+G8h865JywgJ+G8oM65JywgJ+G8oc65JywgJ+G8os65JywgJ+G8o865JywgJ+G8pM65JywgJ+G8pc65JywgJ+G8ps65JywgJ+G8p865JywgJ+G8oM65JywgJ+G8oc65JywgJ+G8os65JywgJ+G8o865JywgJ+G8pM65JywgJ+G8pc65JywgJ+G8ps65JywgJ+G8p865JywgJ+G9oM65JywgJ+G9oc65JywgJ+G9os65JywgJ+G9o865JywgJ+G9pM65JywgJ+G9pc65JywgJ+G9ps65JywgJ+G9p865JywgJ+G9oM65JywgJ+G9oc65JywgJ+G9os65JywgJ+G9o865JywgJ+G9pM65JywgJ+G9pc65JywgJ+G9ps65JywgJ+G9p865JywgJ+G9sM65JywgJ86xzrknLCAnzqzOuScsICfhvrYnLCAn4b62zrknLCAnzrHOuScsICfhvbTOuScsICfOt865JywgJ86uzrknLCAn4b+GJywgJ+G/hs65JywgJ863zrknLCAn4b+SJywgJ+G/licsICfhv5cnLCAn4b+iJywgJ+G/pCcsICfhv6YnLCAn4b+nJywgJ+G9vM65JywgJ8+JzrknLCAnz47OuScsICfhv7YnLCAn4b+2zrknLCAnz4nOuScsICdmZicsICdmaScsICdmbCcsICdmZmknLCAnZmZsJywgJ3N0JywgJ3N0JywgJ9W01bYnLCAn1bTVpScsICfVtNWrJywgJ9W+1bYnLCAn1bTVrSddOwoKCnByaXZhdGUgY29uc3QgVVBQRVJfRlJPTSA9IFsnw58nLCAn76yAJywgJ++sgScsICfvrIInLCAn76yDJywgJ++shCcsICfvrIUnLCAn76yGJywgJ9aHJywgJ++skycsICfvrJQnLCAn76yVJywgJ++slicsICfvrJcnLCAnxYknLCAnzpAnLCAnzrAnLCAnx7AnLCAn4bqWJywgJ+G6lycsICfhupgnLCAn4bqZJywgJ+G6micsICfhvZAnLCAn4b2SJywgJ+G9lCcsICfhvZYnLCAn4b62JywgJ+G/hicsICfhv5InLCAn4b+TJywgJ+G/licsICfhv5cnLCAn4b+iJywgJ+G/oycsICfhv6QnLCAn4b+mJywgJ+G/pycsICfhv7YnXTsKcHJpdmF0ZSBjb25zdCBVUFBFUl9UTyA9IFsnU1MnLCAnRkYnLCAnRkknLCAnRkwnLCAnRkZJJywgJ0ZGTCcsICdTVCcsICdTVCcsICfUtdWSJywgJ9WE1YYnLCAn1YTUtScsICfVhNS7JywgJ9WO1YYnLCAn1YTUvScsICfKvE4nLCAnzpnMiMyBJywgJ86lzIjMgScsICdKzIwnLCAnSMyxJywgJ1TMiCcsICdXzIonLCAnWcyKJywgJ0HKvicsICfOpcyTJywgJ86lzJPMgCcsICfOpcyTzIEnLCAnzqXMk82CJywgJ86RzYInLCAnzpfNgicsICfOmcyIzIAnLCAnzpnMiMyBJywgJ86ZzYInLCAnzpnMiM2CJywgJ86lzIjMgCcsICfOpcyIzIEnLCAnzqHMkycsICfOpc2CJywgJ86lzIjNgicsICfOqc2CJ107CgoKcHJpdmF0ZSBjb25zdCBUUkFOU0xJVF9GUk9NID0gWyfDhicsICfDkCcsICfDmCcsICfDnicsICfDnycsICfDpicsICfDsCcsICfDuCcsICfDvicsICfEkCcsICfEkScsICfEpicsICfEpycsICfEsScsICfEuCcsICfEvycsICfFgCcsICfFgScsICfFgicsICfFiScsICfFiicsICfFiycsICfFkicsICfFkycsICfFpicsICfFpycsICfGgCcsICfGgScsICfGgicsICfGgycsICfGhycsICfGiCcsICfGiScsICfGiicsICfGiycsICfGjCcsICfGkCcsICfGkScsICfGkicsICfGkycsICfGlScsICfGlicsICfGlycsICfGmCcsICfGmScsICfGmicsICfGnScsICfGnicsICfGoicsICfGoycsICfGpCcsICfGpScsICfGqycsICfGrCcsICfGrScsICfGricsICfGsicsICfGsycsICfGtCcsICfGtScsICfGticsICfHhCcsICfHhScsICfHhicsICfHpCcsICfHpScsICfIoScsICfIpCcsICfIpScsICfItCcsICfItScsICfIticsICfItycsICfIuCcsICfIuScsICfIuicsICfIuycsICfIvCcsICfIvScsICfIvicsICfIvycsICfJgCcsICfJgycsICfJhCcsICfJhicsICfJhycsICfJiCcsICfJiScsICfJjCcsICfJjScsICfJjicsICfJjycsICfJkycsICfJlScsICfJlicsICfJlycsICfJmycsICfJnycsICfJoCcsICfJoScsICfJoicsICfJpicsICfJpycsICfJqCcsICfJqicsICfJqycsICfJrCcsICfJrScsICfJsScsICfJsicsICfJsycsICfJtCcsICfJticsICfJvCcsICfJvScsICfJvicsICfKgCcsICfKgicsICfKiCcsICfKiScsICfKiycsICfKjycsICfKkCcsICfKkScsICfKmScsICfKmycsICfKnCcsICfKnScsICfKnycsICfKoCcsICfKoycsICfKpScsICfKpicsICfKqicsICfKqycsICfhtIAnLCAn4bSBJywgJ+G0gycsICfhtIQnLCAn4bSFJywgJ+G0hicsICfhtIcnLCAn4bSKJywgJ+G0iycsICfhtIwnLCAn4bSNJywgJ+G0jycsICfhtJgnLCAn4bSbJywgJ+G0nCcsICfhtKAnLCAn4bShJywgJ+G0oicsICfhtasnLCAn4bWsJywgJ+G1rScsICfhta4nLCAn4bWvJywgJ+G1sCcsICfhtbEnLCAn4bWyJywgJ+G1sycsICfhtbQnLCAn4bW1JywgJ+G1ticsICfhtbonLCAn4bW7JywgJ+G1vScsICfhtb4nLCAn4baAJywgJ+G2gScsICfhtoInLCAn4baDJywgJ+G2hCcsICfhtoUnLCAn4baGJywgJ+G2hycsICfhtognLCAn4baJJywgJ+G2iicsICfhtownLCAn4baNJywgJ+G2jicsICfhto8nLCAn4baRJywgJ+G2kicsICfhtpMnLCAn4baWJywgJ+G2mScsICfhuponLCAn4bqcJywgJ+G6nScsICfhup4nLCAn4bu6JywgJ+G7uycsICfhu7wnLCAn4bu9JywgJ+G7vicsICfhu78nLCAnwqknLCAnwq4nLCAn4oKgJywgJ+KCoicsICfigqMnLCAn4oKkJywgJ+KCpycsICfigronLCAn4oK5JywgJ+KEjCcsICfihJ4nLCAn446nJywgJ+OOricsICfjj4YnLCAn44+XJywgJ+OPnicsICfjj58nLCAnwrwnLCAnwr0nLCAnwr4nLCAn4oWTJywgJ+KFlCcsICfihZUnLCAn4oWWJywgJ+KFlycsICfihZgnLCAn4oWZJywgJ+KFmicsICfihZsnLCAn4oWcJywgJ+KFnScsICfihZ4nLCAn4oWfJywgJ+OAhycsICfigJgnLCAn4oCZJywgJ+KAmicsICfigJsnLCAn4oCcJywgJ+KAnScsICfigJ4nLCAn4oCfJywgJ+KAsicsICfigLMnLCAn44CdJywgJ+OAnicsICfCqycsICfCuycsICfigLknLCAn4oC6JywgJ+KAkCcsICfigJEnLCAn4oCSJywgJ+KAkycsICfigJQnLCAn4oCVJywgJ++4sScsICfvuLInLCAn77mYJywgJ+KAlicsICfigYQnLCAn4oGFJywgJ+KBhicsICfigY4nLCAn44CBJywgJ+OAgicsICfjgIgnLCAn44CJJywgJ+OAiicsICfjgIsnLCAn44CUJywgJ+OAlScsICfjgJgnLCAn44CZJywgJ+OAmicsICfjgJsnLCAn77iRJywgJ++4kicsICfvuLknLCAn77i6JywgJ++4vScsICfvuL4nLCAn77i/JywgJ++5gCcsICfvuZEnLCAn77mdJywgJ++5nicsICfvvZ8nLCAn772gJywgJ++9oScsICfvvaQnLCAnw5cnLCAnw7cnLCAn4oiSJywgJ+KIlScsICfiiJYnLCAn4oijJywgJ+KIpScsICfiiaonLCAn4omrJywgJ+KmhScsICfipoYnXTsKcHJpdmF0ZSBjb25zdCBUUkFOU0xJVF9UTyA9IFsnQUUnLCAnRCcsICdPJywgJ1RIJywgJ3NzJywgJ2FlJywgJ2QnLCAnbycsICd0aCcsICdEJywgJ2QnLCAnSCcsICdoJywgJ2knLCAncScsICdMJywgJ2wnLCAnTCcsICdsJywgJ1wnbicsICdOJywgJ24nLCAnT0UnLCAnb2UnLCAnVCcsICd0JywgJ2InLCAnQicsICdCJywgJ2InLCAnQycsICdjJywgJ0QnLCAnRCcsICdEJywgJ2QnLCAnRScsICdGJywgJ2YnLCAnRycsICdodicsICdJJywgJ0knLCAnSycsICdrJywgJ2wnLCAnTicsICduJywgJ09JJywgJ29pJywgJ1AnLCAncCcsICd0JywgJ1QnLCAndCcsICdUJywgJ1YnLCAnWScsICd5JywgJ1onLCAneicsICdEWicsICdEeicsICdkeicsICdHJywgJ2cnLCAnZCcsICdaJywgJ3onLCAnbCcsICduJywgJ3QnLCAnaicsICdkYicsICdxcCcsICdBJywgJ0MnLCAnYycsICdMJywgJ1QnLCAncycsICd6JywgJ0InLCAnVScsICdFJywgJ2UnLCAnSicsICdqJywgJ1InLCAncicsICdZJywgJ3knLCAnYicsICdjJywgJ2QnLCAnZCcsICdlJywgJ2onLCAnZycsICdnJywgJ0cnLCAnaCcsICdoJywgJ2knLCAnSScsICdsJywgJ2wnLCAnbCcsICdtJywgJ24nLCAnbicsICdOJywgJ09FJywgJ3InLCAncicsICdyJywgJ1InLCAncycsICd0JywgJ3UnLCAndicsICdZJywgJ3onLCAneicsICdCJywgJ0cnLCAnSCcsICdqJywgJ0wnLCAncScsICdkeicsICdkeicsICd0cycsICdscycsICdseicsICdBJywgJ0FFJywgJ0InLCAnQycsICdEJywgJ0QnLCAnRScsICdKJywgJ0snLCAnTCcsICdNJywgJ08nLCAnUCcsICdUJywgJ1UnLCAnVicsICdXJywgJ1onLCAndWUnLCAnYicsICdkJywgJ2YnLCAnbScsICduJywgJ3AnLCAncicsICdyJywgJ3MnLCAndCcsICd6JywgJ3RoJywgJ0knLCAncCcsICdVJywgJ2InLCAnZCcsICdmJywgJ2cnLCAnaycsICdsJywgJ20nLCAnbicsICdwJywgJ3InLCAncycsICd2JywgJ3gnLCAneicsICdhJywgJ2QnLCAnZScsICdlJywgJ2knLCAndScsICdhJywgJ3MnLCAncycsICdTUycsICdMTCcsICdsbCcsICdWJywgJ3YnLCAnWScsICd5JywgJyhDKScsICcoUiknLCAnQ0UnLCAnQ3InLCAnRnIuJywgJ0wuJywgJ1B0cycsICdUTCcsICdScycsICd4JywgJ1J4JywgJ20vcycsICdyYWQvcycsICdDL2tnJywgJ3BIJywgJ1YvbScsICdBL20nLCAnIDEvNCcsICcgMS8yJywgJyAzLzQnLCAnIDEvMycsICcgMi8zJywgJyAxLzUnLCAnIDIvNScsICcgMy81JywgJyA0LzUnLCAnIDEvNicsICcgNS82JywgJyAxLzgnLCAnIDMvOCcsICcgNS84JywgJyA3LzgnLCAnIDEvJywgJzAnLCAnXCcnLCAnXCcnLCAnLCcsICdcJycsICciJywgJyInLCAnLCwnLCAnIicsICdcJycsICciJywgJyInLCAnIicsICc8PCcsICc+PicsICc8JywgJz4nLCAnLScsICctJywgJy0nLCAnLScsICctJywgJy0nLCAnLScsICctJywgJy0nLCAnfHwnLCAnLycsICdbJywgJ10nLCAnKicsICcsJywgJy4nLCAnPCcsICc+JywgJzw8JywgJz4+JywgJ1snLCAnXScsICdbJywgJ10nLCAnWycsICddJywgJywnLCAnLicsICdbJywgJ10nLCAnPDwnLCAnPj4nLCAnPCcsICc+JywgJywnLCAnWycsICddJywgJygoJywgJykpJywgJy4nLCAnLCcsICcqJywgJy8nLCAnLScsICcvJywgJ1xcJywgJ3wnLCAnfHwnLCAnPDwnLCAnPj4nLCAnKCgnLCAnKSknXTsKCnByaXZhdGUgc3RhdGljICR0cmFuc2xpdGVyYXRvcnMgPSBbXTsKcHJpdmF0ZSBzdGF0aWMgJHRhYmxlWmVybzsKcHJpdmF0ZSBzdGF0aWMgJHRhYmxlV2lkZTsKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnJvbUNvZGVQb2ludHMoaW50IC4uLiRjb2Rlcyk6IHNlbGYKewokc3RyaW5nID0gJyc7Cgpmb3JlYWNoICgkY29kZXMgYXMgJGNvZGUpIHsKaWYgKDB4ODAgPiAkY29kZSAlPSAweDIwMDAwMCkgewokc3RyaW5nIC49IFxjaHIoJGNvZGUpOwp9IGVsc2VpZiAoMHg4MDAgPiAkY29kZSkgewokc3RyaW5nIC49IFxjaHIoMHhDMCB8ICRjb2RlID4+IDYpLlxjaHIoMHg4MCB8ICRjb2RlICYgMHgzRik7Cn0gZWxzZWlmICgweDEwMDAwID4gJGNvZGUpIHsKJHN0cmluZyAuPSBcY2hyKDB4RTAgfCAkY29kZSA+PiAxMikuXGNocigweDgwIHwgJGNvZGUgPj4gNiAmIDB4M0YpLlxjaHIoMHg4MCB8ICRjb2RlICYgMHgzRik7Cn0gZWxzZSB7CiRzdHJpbmcgLj0gXGNocigweEYwIHwgJGNvZGUgPj4gMTgpLlxjaHIoMHg4MCB8ICRjb2RlID4+IDEyICYgMHgzRikuXGNocigweDgwIHwgJGNvZGUgPj4gNiAmIDB4M0YpLlxjaHIoMHg4MCB8ICRjb2RlICYgMHgzRik7Cn0KfQoKcmV0dXJuIG5ldyBzdGF0aWMoJHN0cmluZyk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXNjaWkoYXJyYXkgJHJ1bGVzID0gW10pOiBzZWxmCnsKJHN0ciA9IGNsb25lICR0aGlzOwokcyA9ICRzdHItPnN0cmluZzsKJHN0ci0+c3RyaW5nID0gJyc7CgphcnJheV91bnNoaWZ0KCRydWxlcywgJ25mZCcpOwokcnVsZXNbXSA9ICdsYXRpbi1hc2NpaSc7CgppZiAoXGZ1bmN0aW9uX2V4aXN0cygndHJhbnNsaXRlcmF0b3JfdHJhbnNsaXRlcmF0ZScpKSB7CiRydWxlc1tdID0gJ2FueS1sYXRpbi9iZ24nOwp9CgokcnVsZXNbXSA9ICduZmtkJzsKJHJ1bGVzW10gPSAnWzpub25zcGFjaW5nIG1hcms6XSByZW1vdmUnOwoKd2hpbGUgKFxzdHJsZW4oJHMpIC0gMSA+ICRpID0gc3Ryc3BuKCRzLCBzZWxmOjpBU0NJSSkpIHsKaWYgKDAgPCAtLSRpKSB7CiRzdHItPnN0cmluZyAuPSBzdWJzdHIoJHMsIDAsICRpKTsKJHMgPSBzdWJzdHIoJHMsICRpKTsKfQoKaWYgKCEkcnVsZSA9IGFycmF5X3NoaWZ0KCRydWxlcykpIHsKJHJ1bGVzID0gW107IAp9CgppZiAoJHJ1bGUgaW5zdGFuY2VvZiBcVHJhbnNsaXRlcmF0b3IpIHsKJHMgPSAkcnVsZS0+dHJhbnNsaXRlcmF0ZSgkcyk7Cn0gZWxzZWlmICgkcnVsZSBpbnN0YW5jZW9mIFxDbG9zdXJlKSB7CiRzID0gJHJ1bGUoJHMpOwp9IGVsc2VpZiAoJHJ1bGUpIHsKaWYgKCduZmQnID09PSAkcnVsZSA9IHN0cnRvbG93ZXIoJHJ1bGUpKSB7Cm5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkcywgc2VsZjo6TkZEKSA/OiAkcyA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRzLCBzZWxmOjpORkQpOwp9IGVsc2VpZiAoJ25ma2QnID09PSAkcnVsZSkgewpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHMsIHNlbGY6Ok5GS0QpID86ICRzID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJHMsIHNlbGY6Ok5GS0QpOwp9IGVsc2VpZiAoJ1s6bm9uc3BhY2luZyBtYXJrOl0gcmVtb3ZlJyA9PT0gJHJ1bGUpIHsKJHMgPSBwcmVnX3JlcGxhY2UoJy9ccHtNbn0rKy91JywgJycsICRzKTsKfSBlbHNlaWYgKCdsYXRpbi1hc2NpaScgPT09ICRydWxlKSB7CiRzID0gc3RyX3JlcGxhY2Uoc2VsZjo6VFJBTlNMSVRfRlJPTSwgc2VsZjo6VFJBTlNMSVRfVE8sICRzKTsKfSBlbHNlaWYgKCdkZS1hc2NpaScgPT09ICRydWxlKSB7CiRzID0gcHJlZ19yZXBsYWNlKCIvKFtBVU9dKVx1ezAzMDh9KD89XHB7TGx9KS91IiwgJyQxZScsICRzKTsKJHMgPSBzdHJfcmVwbGFjZShbImFcdXswMzA4fSIsICJvXHV7MDMwOH0iLCAidVx1ezAzMDh9IiwgIkFcdXswMzA4fSIsICJPXHV7MDMwOH0iLCAiVVx1ezAzMDh9Il0sIFsnYWUnLCAnb2UnLCAndWUnLCAnQUUnLCAnT0UnLCAnVUUnXSwgJHMpOwp9IGVsc2VpZiAoXGZ1bmN0aW9uX2V4aXN0cygndHJhbnNsaXRlcmF0b3JfdHJhbnNsaXRlcmF0ZScpKSB7CmlmIChudWxsID09PSAkdHJhbnNsaXRlcmF0b3IgPSBzZWxmOjokdHJhbnNsaXRlcmF0b3JzWyRydWxlXSA/PyBzZWxmOjokdHJhbnNsaXRlcmF0b3JzWyRydWxlXSA9IFxUcmFuc2xpdGVyYXRvcjo6Y3JlYXRlKCRydWxlKSkgewppZiAoJ2FueS1sYXRpbi9iZ24nID09PSAkcnVsZSkgewokcnVsZSA9ICdhbnktbGF0aW4nOwokdHJhbnNsaXRlcmF0b3IgPSBzZWxmOjokdHJhbnNsaXRlcmF0b3JzWyRydWxlXSA/PyBzZWxmOjokdHJhbnNsaXRlcmF0b3JzWyRydWxlXSA9IFxUcmFuc2xpdGVyYXRvcjo6Y3JlYXRlKCRydWxlKTsKfQoKaWYgKG51bGwgPT09ICR0cmFuc2xpdGVyYXRvcikgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1Vua25vd24gdHJhbnNsaXRlcmF0aW9uIHJ1bGUgIiVzIi4nLCAkcnVsZSkpOwp9CgpzZWxmOjokdHJhbnNsaXRlcmF0b3JzWydhbnktbGF0aW4vYmduJ10gPSAkdHJhbnNsaXRlcmF0b3I7Cn0KCiRzID0gJHRyYW5zbGl0ZXJhdG9yLT50cmFuc2xpdGVyYXRlKCRzKTsKfQp9IGVsc2VpZiAoIVxmdW5jdGlvbl9leGlzdHMoJ2ljb252JykpIHsKJHMgPSBwcmVnX3JlcGxhY2UoJy9bXlx4MDAtXHg3Rl0vdScsICc/JywgJHMpOwp9IGVsc2UgewokcyA9IEBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJy9bXlx4MDAtXHg3Rl0vdScsIHN0YXRpYyBmdW5jdGlvbiAoJGMpIHsKJGMgPSAoc3RyaW5nKSBpY29udignVVRGLTgnLCAnQVNDSUkvL1RSQU5TTElUJywgJGNbMF0pOwoKaWYgKCcnID09PSAkYyAmJiAnJyA9PT0gaWNvbnYoJ1VURi04JywgJ0FTQ0lJLy9UUkFOU0xJVCcsICfCsicpKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oc3ByaW50ZignIiVzIiByZXF1aXJlcyBhIHRyYW5zbGl0LWFibGUgaWNvbnYgaW1wbGVtZW50YXRpb24sIHRyeSBpbnN0YWxsaW5nICJnbnUtbGliaWNvbnYiIGlmIHlvdVwncmUgdXNpbmcgQWxwaW5lIExpbnV4LicsIHN0YXRpYzo6Y2xhc3MpKTsKfQoKcmV0dXJuIDEgPCBcc3RybGVuKCRjKSA/IGx0cmltKCRjLCAnXCdgIl5+JykgOiAoJycgIT09ICRjID8gJGMgOiAnPycpOwp9LCAkcyk7Cn0KfQoKJHN0ci0+c3RyaW5nIC49ICRzOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjYW1lbCgpOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9IHN0cl9yZXBsYWNlKCcgJywgJycsIHByZWdfcmVwbGFjZV9jYWxsYmFjaygnL1xiLig/IVxwe0x1fSkvdScsIHN0YXRpYyBmdW5jdGlvbiAoJG0pIHVzZSAoJiRpKSB7CnJldHVybiAxID09PSArKyRpID8gKCfEsCcgPT09ICRtWzBdID8gJ2nMhycgOiBtYl9zdHJ0b2xvd2VyKCRtWzBdLCAnVVRGLTgnKSkgOiBtYl9jb252ZXJ0X2Nhc2UoJG1bMF0sIFxNQl9DQVNFX1RJVExFLCAnVVRGLTgnKTsKfSwgcHJlZ19yZXBsYWNlKCcvW15ccEwwLTldKysvdScsICcgJywgJHRoaXMtPnN0cmluZykpKTsKCnJldHVybiAkc3RyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY29kZVBvaW50c0F0KGludCAkb2Zmc2V0KTogYXJyYXkKewokc3RyID0gJHRoaXMtPnNsaWNlKCRvZmZzZXQsIDEpOwoKaWYgKCcnID09PSAkc3RyLT5zdHJpbmcpIHsKcmV0dXJuIFtdOwp9CgokY29kZVBvaW50cyA9IFtdOwoKZm9yZWFjaCAocHJlZ19zcGxpdCgnLy91JywgJHN0ci0+c3RyaW5nLCAtMSwgXFBSRUdfU1BMSVRfTk9fRU1QVFkpIGFzICRjKSB7CiRjb2RlUG9pbnRzW10gPSBtYl9vcmQoJGMsICdVVEYtOCcpOwp9CgpyZXR1cm4gJGNvZGVQb2ludHM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBmb2xkZWQoYm9vbCAkY29tcGF0ID0gdHJ1ZSk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKCmlmICghJGNvbXBhdCB8fCBcUEhQX1ZFUlNJT05fSUQgPCA3MDMwMCB8fCAhXGRlZmluZWQoJ05vcm1hbGl6ZXI6Ok5GS0NfQ0YnKSkgewokc3RyLT5zdHJpbmcgPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkc3RyLT5zdHJpbmcsICRjb21wYXQgPyBcTm9ybWFsaXplcjo6TkZLQyA6IFxOb3JtYWxpemVyOjpORkMpOwokc3RyLT5zdHJpbmcgPSBtYl9zdHJ0b2xvd2VyKHN0cl9yZXBsYWNlKHNlbGY6OkZPTERfRlJPTSwgc2VsZjo6Rk9MRF9UTywgJHN0ci0+c3RyaW5nKSwgJ1VURi04Jyk7Cn0gZWxzZSB7CiRzdHItPnN0cmluZyA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRzdHItPnN0cmluZywgXE5vcm1hbGl6ZXI6Ok5GS0NfQ0YpOwp9CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIGpvaW4oYXJyYXkgJHN0cmluZ3MsID9zdHJpbmcgJGxhc3RHbHVlID0gbnVsbCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKCiR0YWlsID0gbnVsbCAhPT0gJGxhc3RHbHVlICYmIDEgPCBcY291bnQoJHN0cmluZ3MpID8gJGxhc3RHbHVlLmFycmF5X3BvcCgkc3RyaW5ncykgOiAnJzsKJHN0ci0+c3RyaW5nID0gaW1wbG9kZSgkdGhpcy0+c3RyaW5nLCAkc3RyaW5ncykuJHRhaWw7CgppZiAoIXByZWdfbWF0Y2goJy8vdScsICRzdHItPnN0cmluZykpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBVVEYtOCBzdHJpbmcuJyk7Cn0KCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gbG93ZXIoKTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSBtYl9zdHJ0b2xvd2VyKHN0cl9yZXBsYWNlKCfEsCcsICdpzIcnLCAkc3RyLT5zdHJpbmcpLCAnVVRGLTgnKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gbWF0Y2goc3RyaW5nICRyZWdleHAsIGludCAkZmxhZ3MgPSAwLCBpbnQgJG9mZnNldCA9IDApOiBhcnJheQp7CiRtYXRjaCA9ICgoXFBSRUdfUEFUVEVSTl9PUkRFUiB8IFxQUkVHX1NFVF9PUkRFUikgJiAkZmxhZ3MpID8gJ3ByZWdfbWF0Y2hfYWxsJyA6ICdwcmVnX21hdGNoJzsKCmlmICgkdGhpcy0+aWdub3JlQ2FzZSkgewokcmVnZXhwIC49ICdpJzsKfQoKc2V0X2Vycm9yX2hhbmRsZXIoc3RhdGljIGZ1bmN0aW9uICgkdCwgJG0pIHsgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigkbSk7IH0pOwoKdHJ5IHsKaWYgKGZhbHNlID09PSAkbWF0Y2goJHJlZ2V4cC4ndScsICR0aGlzLT5zdHJpbmcsICRtYXRjaGVzLCAkZmxhZ3MgfCBcUFJFR19VTk1BVENIRURfQVNfTlVMTCwgJG9mZnNldCkpIHsKJGxhc3RFcnJvciA9IHByZWdfbGFzdF9lcnJvcigpOwoKZm9yZWFjaCAoZ2V0X2RlZmluZWRfY29uc3RhbnRzKHRydWUpWydwY3JlJ10gYXMgJGsgPT4gJHYpIHsKaWYgKCRsYXN0RXJyb3IgPT09ICR2ICYmICdfRVJST1InID09PSBzdWJzdHIoJGssIC02KSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignTWF0Y2hpbmcgZmFpbGVkIHdpdGggJy4kay4nLicpOwp9Cn0KCnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdNYXRjaGluZyBmYWlsZWQgd2l0aCB1bmtub3duIGVycm9yIGNvZGUuJyk7Cn0KfSBmaW5hbGx5IHsKcmVzdG9yZV9lcnJvcl9oYW5kbGVyKCk7Cn0KCnJldHVybiAkbWF0Y2hlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG5vcm1hbGl6ZShpbnQgJGZvcm0gPSBzZWxmOjpORkMpOiBzZWxmCnsKaWYgKCFcaW5fYXJyYXkoJGZvcm0sIFtzZWxmOjpORkMsIHNlbGY6Ok5GRCwgc2VsZjo6TkZLQywgc2VsZjo6TkZLRF0pKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1Vuc3VwcG9ydGVkIG5vcm1hbGl6YXRpb24gZm9ybS4nKTsKfQoKJHN0ciA9IGNsb25lICR0aGlzOwpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHN0ci0+c3RyaW5nLCAkZm9ybSkgPzogJHN0ci0+c3RyaW5nID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJHN0ci0+c3RyaW5nLCAkZm9ybSk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHBhZEJvdGgoaW50ICRsZW5ndGgsIHN0cmluZyAkcGFkU3RyID0gJyAnKTogcGFyZW50CnsKaWYgKCcnID09PSAkcGFkU3RyIHx8ICFwcmVnX21hdGNoKCcvL3UnLCAkcGFkU3RyKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIFVURi04IHN0cmluZy4nKTsKfQoKJHBhZCA9IGNsb25lICR0aGlzOwokcGFkLT5zdHJpbmcgPSAkcGFkU3RyOwoKcmV0dXJuICR0aGlzLT5wYWQoJGxlbmd0aCwgJHBhZCwgXFNUUl9QQURfQk9USCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBwYWRFbmQoaW50ICRsZW5ndGgsIHN0cmluZyAkcGFkU3RyID0gJyAnKTogcGFyZW50CnsKaWYgKCcnID09PSAkcGFkU3RyIHx8ICFwcmVnX21hdGNoKCcvL3UnLCAkcGFkU3RyKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIFVURi04IHN0cmluZy4nKTsKfQoKJHBhZCA9IGNsb25lICR0aGlzOwokcGFkLT5zdHJpbmcgPSAkcGFkU3RyOwoKcmV0dXJuICR0aGlzLT5wYWQoJGxlbmd0aCwgJHBhZCwgXFNUUl9QQURfUklHSFQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gcGFkU3RhcnQoaW50ICRsZW5ndGgsIHN0cmluZyAkcGFkU3RyID0gJyAnKTogcGFyZW50CnsKaWYgKCcnID09PSAkcGFkU3RyIHx8ICFwcmVnX21hdGNoKCcvL3UnLCAkcGFkU3RyKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIFVURi04IHN0cmluZy4nKTsKfQoKJHBhZCA9IGNsb25lICR0aGlzOwokcGFkLT5zdHJpbmcgPSAkcGFkU3RyOwoKcmV0dXJuICR0aGlzLT5wYWQoJGxlbmd0aCwgJHBhZCwgXFNUUl9QQURfTEVGVCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZXBsYWNlTWF0Y2hlcyhzdHJpbmcgJGZyb21SZWdleHAsICR0byk6IHBhcmVudAp7CmlmICgkdGhpcy0+aWdub3JlQ2FzZSkgewokZnJvbVJlZ2V4cCAuPSAnaSc7Cn0KCmlmIChcaXNfYXJyYXkoJHRvKSB8fCAkdG8gaW5zdGFuY2VvZiBcQ2xvc3VyZSkgewppZiAoIVxpc19jYWxsYWJsZSgkdG8pKSB7CnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoJ0FyZ3VtZW50IDIgcGFzc2VkIHRvICIlczo6cmVwbGFjZU1hdGNoZXMoKSIgbXVzdCBiZSBjYWxsYWJsZSwgYXJyYXkgZ2l2ZW4uJywgc3RhdGljOjpjbGFzcykpOwp9CgokcmVwbGFjZSA9ICdwcmVnX3JlcGxhY2VfY2FsbGJhY2snOwokdG8gPSBzdGF0aWMgZnVuY3Rpb24gKGFycmF5ICRtKSB1c2UgKCR0byk6IHN0cmluZyB7CiR0byA9ICR0bygkbSk7CgppZiAoJycgIT09ICR0byAmJiAoIVxpc19zdHJpbmcoJHRvKSB8fCAhcHJlZ19tYXRjaCgnLy91JywgJHRvKSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUmVwbGFjZSBjYWxsYmFjayBtdXN0IHJldHVybiBhIHZhbGlkIFVURi04IHN0cmluZy4nKTsKfQoKcmV0dXJuICR0bzsKfTsKfSBlbHNlaWYgKCcnICE9PSAkdG8gJiYgIXByZWdfbWF0Y2goJy8vdScsICR0bykpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBVVEYtOCBzdHJpbmcuJyk7Cn0gZWxzZSB7CiRyZXBsYWNlID0gJ3ByZWdfcmVwbGFjZSc7Cn0KCnNldF9lcnJvcl9oYW5kbGVyKHN0YXRpYyBmdW5jdGlvbiAoJHQsICRtKSB7IHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJG0pOyB9KTsKCnRyeSB7CmlmIChudWxsID09PSAkc3RyaW5nID0gJHJlcGxhY2UoJGZyb21SZWdleHAuJ3UnLCAkdG8sICR0aGlzLT5zdHJpbmcpKSB7CiRsYXN0RXJyb3IgPSBwcmVnX2xhc3RfZXJyb3IoKTsKCmZvcmVhY2ggKGdldF9kZWZpbmVkX2NvbnN0YW50cyh0cnVlKVsncGNyZSddIGFzICRrID0+ICR2KSB7CmlmICgkbGFzdEVycm9yID09PSAkdiAmJiAnX0VSUk9SJyA9PT0gc3Vic3RyKCRrLCAtNikpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ01hdGNoaW5nIGZhaWxlZCB3aXRoICcuJGsuJy4nKTsKfQp9Cgp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignTWF0Y2hpbmcgZmFpbGVkIHdpdGggdW5rbm93biBlcnJvciBjb2RlLicpOwp9Cn0gZmluYWxseSB7CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwp9Cgokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9ICRzdHJpbmc7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHJldmVyc2UoKTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSBpbXBsb2RlKCcnLCBhcnJheV9yZXZlcnNlKHByZWdfc3BsaXQoJy8oXFgpL3UnLCAkc3RyLT5zdHJpbmcsIC0xLCBcUFJFR19TUExJVF9ERUxJTV9DQVBUVVJFIHwgXFBSRUdfU1BMSVRfTk9fRU1QVFkpKSk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHNuYWtlKCk6IHBhcmVudAp7CiRzdHIgPSAkdGhpcy0+Y2FtZWwoKTsKJHN0ci0+c3RyaW5nID0gbWJfc3RydG9sb3dlcihwcmVnX3JlcGxhY2UoWycvKFxwe0x1fSspKFxwe0x1fVxwe0xsfSkvdScsICcvKFtccHtMbH0wLTldKShccHtMdX0pL3UnXSwgJ1wxX1wyJywgJHN0ci0+c3RyaW5nKSwgJ1VURi04Jyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHRpdGxlKGJvb2wgJGFsbFdvcmRzID0gZmFsc2UpOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CgokbGltaXQgPSAkYWxsV29yZHMgPyAtMSA6IDE7Cgokc3RyLT5zdHJpbmcgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJy9cYi4vdScsIHN0YXRpYyBmdW5jdGlvbiAoYXJyYXkgJG0pOiBzdHJpbmcgewpyZXR1cm4gbWJfY29udmVydF9jYXNlKCRtWzBdLCBcTUJfQ0FTRV9USVRMRSwgJ1VURi04Jyk7Cn0sICRzdHItPnN0cmluZywgJGxpbWl0KTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gdHJpbShzdHJpbmcgJGNoYXJzID0gIiBcdFxuXHJcMFx4MEJceDBDXHV7QTB9XHV7RkVGRn0iKTogcGFyZW50CnsKaWYgKCIgXHRcblxyXDBceDBCXHgwQ1x1e0EwfVx1e0ZFRkZ9IiAhPT0gJGNoYXJzICYmICFwcmVnX21hdGNoKCcvL3UnLCAkY2hhcnMpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgVVRGLTggY2hhcnMuJyk7Cn0KJGNoYXJzID0gcHJlZ19xdW90ZSgkY2hhcnMpOwoKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSBwcmVnX3JlcGxhY2UoInteWyRjaGFyc10rK3xbJGNoYXJzXSsrJH11RCIsICcnLCAkc3RyLT5zdHJpbmcpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0cmltRW5kKHN0cmluZyAkY2hhcnMgPSAiIFx0XG5cclwwXHgwQlx4MENcdXtBMH1cdXtGRUZGfSIpOiBwYXJlbnQKewppZiAoIiBcdFxuXHJcMFx4MEJceDBDXHV7QTB9XHV7RkVGRn0iICE9PSAkY2hhcnMgJiYgIXByZWdfbWF0Y2goJy8vdScsICRjaGFycykpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBVVEYtOCBjaGFycy4nKTsKfQokY2hhcnMgPSBwcmVnX3F1b3RlKCRjaGFycyk7Cgokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9IHByZWdfcmVwbGFjZSgie1skY2hhcnNdKyskfXVEIiwgJycsICRzdHItPnN0cmluZyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHRyaW1QcmVmaXgoJHByZWZpeCk6IHBhcmVudAp7CmlmICghJHRoaXMtPmlnbm9yZUNhc2UpIHsKcmV0dXJuIHBhcmVudDo6dHJpbVByZWZpeCgkcHJlZml4KTsKfQoKJHN0ciA9IGNsb25lICR0aGlzOwoKaWYgKCRwcmVmaXggaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKJHByZWZpeCA9IGl0ZXJhdG9yX3RvX2FycmF5KCRwcmVmaXgsIGZhbHNlKTsKfSBlbHNlaWYgKCRwcmVmaXggaW5zdGFuY2VvZiBwYXJlbnQpIHsKJHByZWZpeCA9ICRwcmVmaXgtPnN0cmluZzsKfQoKJHByZWZpeCA9IGltcGxvZGUoJ3wnLCBhcnJheV9tYXAoJ3ByZWdfcXVvdGUnLCAoYXJyYXkpICRwcmVmaXgpKTsKJHN0ci0+c3RyaW5nID0gcHJlZ19yZXBsYWNlKCJ7Xig/OiRwcmVmaXgpfWl1RCIsICcnLCAkdGhpcy0+c3RyaW5nKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gdHJpbVN0YXJ0KHN0cmluZyAkY2hhcnMgPSAiIFx0XG5cclwwXHgwQlx4MENcdXtBMH1cdXtGRUZGfSIpOiBwYXJlbnQKewppZiAoIiBcdFxuXHJcMFx4MEJceDBDXHV7QTB9XHV7RkVGRn0iICE9PSAkY2hhcnMgJiYgIXByZWdfbWF0Y2goJy8vdScsICRjaGFycykpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBVVEYtOCBjaGFycy4nKTsKfQokY2hhcnMgPSBwcmVnX3F1b3RlKCRjaGFycyk7Cgokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9IHByZWdfcmVwbGFjZSgie15bJGNoYXJzXSsrfXVEIiwgJycsICRzdHItPnN0cmluZyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHRyaW1TdWZmaXgoJHN1ZmZpeCk6IHBhcmVudAp7CmlmICghJHRoaXMtPmlnbm9yZUNhc2UpIHsKcmV0dXJuIHBhcmVudDo6dHJpbVN1ZmZpeCgkc3VmZml4KTsKfQoKJHN0ciA9IGNsb25lICR0aGlzOwoKaWYgKCRzdWZmaXggaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKJHN1ZmZpeCA9IGl0ZXJhdG9yX3RvX2FycmF5KCRzdWZmaXgsIGZhbHNlKTsKfSBlbHNlaWYgKCRzdWZmaXggaW5zdGFuY2VvZiBwYXJlbnQpIHsKJHN1ZmZpeCA9ICRzdWZmaXgtPnN0cmluZzsKfQoKJHN1ZmZpeCA9IGltcGxvZGUoJ3wnLCBhcnJheV9tYXAoJ3ByZWdfcXVvdGUnLCAoYXJyYXkpICRzdWZmaXgpKTsKJHN0ci0+c3RyaW5nID0gcHJlZ19yZXBsYWNlKCJ7KD86JHN1ZmZpeCkkfWl1RCIsICcnLCAkdGhpcy0+c3RyaW5nKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gdXBwZXIoKTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSBtYl9zdHJ0b3VwcGVyKCRzdHItPnN0cmluZywgJ1VURi04Jyk7CgppZiAoXFBIUF9WRVJTSU9OX0lEIDwgNzAzMDApIHsKJHN0ci0+c3RyaW5nID0gc3RyX3JlcGxhY2Uoc2VsZjo6VVBQRVJfRlJPTSwgc2VsZjo6VVBQRVJfVE8sICRzdHItPnN0cmluZyk7Cn0KCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gd2lkdGgoYm9vbCAkaWdub3JlQW5zaURlY29yYXRpb24gPSB0cnVlKTogaW50CnsKJHdpZHRoID0gMDsKJHMgPSBzdHJfcmVwbGFjZShbIlx4MDAiLCAiXHgwNSIsICJceDA3Il0sICcnLCAkdGhpcy0+c3RyaW5nKTsKCmlmIChmYWxzZSAhPT0gc3RycG9zKCRzLCAiXHIiKSkgewokcyA9IHN0cl9yZXBsYWNlKFsiXHJcbiIsICJcciJdLCAiXG4iLCAkcyk7Cn0KCmlmICghJGlnbm9yZUFuc2lEZWNvcmF0aW9uKSB7CiRzID0gcHJlZ19yZXBsYWNlKCcvW1xwe0NjfVx4N0ZdKysvdScsICcnLCAkcyk7Cn0KCmZvcmVhY2ggKGV4cGxvZGUoIlxuIiwgJHMpIGFzICRzKSB7CmlmICgkaWdub3JlQW5zaURlY29yYXRpb24pIHsKJHMgPSBwcmVnX3JlcGxhY2UoJy8oPzpceDFCKD86CiAgICAgICAgICAgICAgICAgICAgXFsgW1x4MzAtXHgzRl0qKyBbXHgyMC1ceDJGXSorIFtceDQwLVx4N0VdCiAgICAgICAgICAgICAgICAgICAgfCBbUFxdWF5fXSAuKj8gXHgxQlxcXFwKICAgICAgICAgICAgICAgICAgICB8IFtceDQxLVx4N0VdCiAgICAgICAgICAgICAgICApfFtccHtDY31ceDdGXSsrKS94dScsICcnLCAkcyk7Cn0KCiRsaW5lV2lkdGggPSAkdGhpcy0+d2Nzd2lkdGgoJHMpOwoKaWYgKCRsaW5lV2lkdGggPiAkd2lkdGgpIHsKJHdpZHRoID0gJGxpbmVXaWR0aDsKfQp9CgpyZXR1cm4gJHdpZHRoOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHBhZChpbnQgJGxlbiwgc2VsZiAkcGFkLCBpbnQgJHR5cGUpOiBwYXJlbnQKewokc0xlbiA9ICR0aGlzLT5sZW5ndGgoKTsKCmlmICgkbGVuIDw9ICRzTGVuKSB7CnJldHVybiBjbG9uZSAkdGhpczsKfQoKJHBhZExlbiA9ICRwYWQtPmxlbmd0aCgpOwokZnJlZUxlbiA9ICRsZW4gLSAkc0xlbjsKJGxlbiA9ICRmcmVlTGVuICUgJHBhZExlbjsKCnN3aXRjaCAoJHR5cGUpIHsKY2FzZSBcU1RSX1BBRF9SSUdIVDoKcmV0dXJuICR0aGlzLT5hcHBlbmQoc3RyX3JlcGVhdCgkcGFkLT5zdHJpbmcsIGludGRpdigkZnJlZUxlbiwgJHBhZExlbikpLigkbGVuID8gJHBhZC0+c2xpY2UoMCwgJGxlbikgOiAnJykpOwoKY2FzZSBcU1RSX1BBRF9MRUZUOgpyZXR1cm4gJHRoaXMtPnByZXBlbmQoc3RyX3JlcGVhdCgkcGFkLT5zdHJpbmcsIGludGRpdigkZnJlZUxlbiwgJHBhZExlbikpLigkbGVuID8gJHBhZC0+c2xpY2UoMCwgJGxlbikgOiAnJykpOwoKY2FzZSBcU1RSX1BBRF9CT1RIOgokZnJlZUxlbiAvPSAyOwoKJHJpZ2h0TGVuID0gY2VpbCgkZnJlZUxlbik7CiRsZW4gPSAkcmlnaHRMZW4gJSAkcGFkTGVuOwokc3RyID0gJHRoaXMtPmFwcGVuZChzdHJfcmVwZWF0KCRwYWQtPnN0cmluZywgaW50ZGl2KCRyaWdodExlbiwgJHBhZExlbikpLigkbGVuID8gJHBhZC0+c2xpY2UoMCwgJGxlbikgOiAnJykpOwoKJGxlZnRMZW4gPSBmbG9vcigkZnJlZUxlbik7CiRsZW4gPSAkbGVmdExlbiAlICRwYWRMZW47CgpyZXR1cm4gJHN0ci0+cHJlcGVuZChzdHJfcmVwZWF0KCRwYWQtPnN0cmluZywgaW50ZGl2KCRsZWZ0TGVuLCAkcGFkTGVuKSkuKCRsZW4gPyAkcGFkLT5zbGljZSgwLCAkbGVuKSA6ICcnKSk7CgpkZWZhdWx0Ogp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIHBhZGRpbmcgdHlwZS4nKTsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHdjc3dpZHRoKHN0cmluZyAkc3RyaW5nKTogaW50CnsKJHdpZHRoID0gMDsKCmZvcmVhY2ggKHByZWdfc3BsaXQoJy8vdScsICRzdHJpbmcsIC0xLCBcUFJFR19TUExJVF9OT19FTVBUWSkgYXMgJGMpIHsKJGNvZGVQb2ludCA9IG1iX29yZCgkYywgJ1VURi04Jyk7CgppZiAoMCA9PT0gJGNvZGVQb2ludCAKfHwgMHgwMzRGID09PSAkY29kZVBvaW50IAp8fCAoMHgyMDBCIDw9ICRjb2RlUG9pbnQgJiYgMHgyMDBGID49ICRjb2RlUG9pbnQpIAp8fCAweDIwMjggPT09ICRjb2RlUG9pbnQgCnx8IDB4MjAyOSA9PT0gJGNvZGVQb2ludCAKfHwgKDB4MjAyQSA8PSAkY29kZVBvaW50ICYmIDB4MjAyRSA+PSAkY29kZVBvaW50KSAKfHwgKDB4MjA2MCA8PSAkY29kZVBvaW50ICYmIDB4MjA2MyA+PSAkY29kZVBvaW50KSAKKSB7CmNvbnRpbnVlOwp9CgoKaWYgKDMyID4gJGNvZGVQb2ludCAKfHwgKDB4MDdGIDw9ICRjb2RlUG9pbnQgJiYgMHgwQTAgPiAkY29kZVBvaW50KSAKKSB7CnJldHVybiAtMTsKfQoKaWYgKG51bGwgPT09IHNlbGY6OiR0YWJsZVplcm8pIHsKc2VsZjo6JHRhYmxlWmVybyA9IHJlcXVpcmUgX19ESVJfXy4nL1Jlc291cmNlcy9kYXRhL3djc3dpZHRoX3RhYmxlX3plcm8ucGhwJzsKfQoKaWYgKCRjb2RlUG9pbnQgPj0gc2VsZjo6JHRhYmxlWmVyb1swXVswXSAmJiAkY29kZVBvaW50IDw9IHNlbGY6OiR0YWJsZVplcm9bJHVib3VuZCA9IFxjb3VudChzZWxmOjokdGFibGVaZXJvKSAtIDFdWzFdKSB7CiRsYm91bmQgPSAwOwp3aGlsZSAoJHVib3VuZCA+PSAkbGJvdW5kKSB7CiRtaWQgPSBmbG9vcigoJGxib3VuZCArICR1Ym91bmQpIC8gMik7CgppZiAoJGNvZGVQb2ludCA+IHNlbGY6OiR0YWJsZVplcm9bJG1pZF1bMV0pIHsKJGxib3VuZCA9ICRtaWQgKyAxOwp9IGVsc2VpZiAoJGNvZGVQb2ludCA8IHNlbGY6OiR0YWJsZVplcm9bJG1pZF1bMF0pIHsKJHVib3VuZCA9ICRtaWQgLSAxOwp9IGVsc2Ugewpjb250aW51ZSAyOwp9Cn0KfQoKaWYgKG51bGwgPT09IHNlbGY6OiR0YWJsZVdpZGUpIHsKc2VsZjo6JHRhYmxlV2lkZSA9IHJlcXVpcmUgX19ESVJfXy4nL1Jlc291cmNlcy9kYXRhL3djc3dpZHRoX3RhYmxlX3dpZGUucGhwJzsKfQoKaWYgKCRjb2RlUG9pbnQgPj0gc2VsZjo6JHRhYmxlV2lkZVswXVswXSAmJiAkY29kZVBvaW50IDw9IHNlbGY6OiR0YWJsZVdpZGVbJHVib3VuZCA9IFxjb3VudChzZWxmOjokdGFibGVXaWRlKSAtIDFdWzFdKSB7CiRsYm91bmQgPSAwOwp3aGlsZSAoJHVib3VuZCA+PSAkbGJvdW5kKSB7CiRtaWQgPSBmbG9vcigoJGxib3VuZCArICR1Ym91bmQpIC8gMik7CgppZiAoJGNvZGVQb2ludCA+IHNlbGY6OiR0YWJsZVdpZGVbJG1pZF1bMV0pIHsKJGxib3VuZCA9ICRtaWQgKyAxOwp9IGVsc2VpZiAoJGNvZGVQb2ludCA8IHNlbGY6OiR0YWJsZVdpZGVbJG1pZF1bMF0pIHsKJHVib3VuZCA9ICRtaWQgLSAxOwp9IGVsc2Ugewokd2lkdGggKz0gMjsKCmNvbnRpbnVlIDI7Cn0KfQp9CgorKyR3aWR0aDsKfQoKcmV0dXJuICR3aWR0aDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xFeGNlcHRpb25cRXhjZXB0aW9uSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcRXhjZXB0aW9uXFJ1bnRpbWVFeGNlcHRpb247CgoKCgoKCgoKCmNsYXNzIEJ5dGVTdHJpbmcgZXh0ZW5kcyBBYnN0cmFjdFN0cmluZwp7CnByaXZhdGUgY29uc3QgQUxQSEFCRVRfQUxQSEFOVU1FUklDID0gJzEyMzQ1Njc4OUFCQ0RFRkdISktMTU5QUVJTVFVWV1hZWmFiY2RlZmdoaWprbW5vcHFyc3R1dnd4eXonOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkc3RyaW5nID0gJycpCnsKJHRoaXMtPnN0cmluZyA9ICRzdHJpbmc7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21SYW5kb20oaW50ICRsZW5ndGggPSAxNiwgP3N0cmluZyAkYWxwaGFiZXQgPSBudWxsKTogc2VsZgp7CmlmICgkbGVuZ3RoIDw9IDApIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdBIHN0cmljdGx5IHBvc2l0aXZlIGxlbmd0aCBpcyBleHBlY3RlZCwgIiVkIiBnaXZlbi4nLCAkbGVuZ3RoKSk7Cn0KCiRhbHBoYWJldCA9ICRhbHBoYWJldCA/PyBzZWxmOjpBTFBIQUJFVF9BTFBIQU5VTUVSSUM7CiRhbHBoYWJldFNpemUgPSBcc3RybGVuKCRhbHBoYWJldCk7CiRiaXRzID0gKGludCkgY2VpbChsb2coJGFscGhhYmV0U2l6ZSwgMi4wKSk7CmlmICgkYml0cyA8PSAwIHx8ICRiaXRzID4gNTYpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVGhlIGxlbmd0aCBvZiB0aGUgYWxwaGFiZXQgbXVzdCBpbiB0aGUgWzJeMSwgMl41Nl0gcmFuZ2UuJyk7Cn0KCiRyZXQgPSAnJzsKd2hpbGUgKCRsZW5ndGggPiAwKSB7CiR1cmFuZG9tTGVuZ3RoID0gKGludCkgY2VpbCgyICogJGxlbmd0aCAqICRiaXRzIC8gOC4wKTsKJGRhdGEgPSByYW5kb21fYnl0ZXMoJHVyYW5kb21MZW5ndGgpOwokdW5wYWNrZWREYXRhID0gMDsKJHVucGFja2VkQml0cyA9IDA7CmZvciAoJGkgPSAwOyAkaSA8ICR1cmFuZG9tTGVuZ3RoICYmICRsZW5ndGggPiAwOyArKyRpKSB7CgokdW5wYWNrZWREYXRhID0gKCR1bnBhY2tlZERhdGEgPDwgOCkgfCBcb3JkKCRkYXRhWyRpXSk7CiR1bnBhY2tlZEJpdHMgKz0gODsKCgoKZm9yICg7ICR1bnBhY2tlZEJpdHMgPj0gJGJpdHMgJiYgJGxlbmd0aCA+IDA7ICR1bnBhY2tlZEJpdHMgLT0gJGJpdHMpIHsKJGluZGV4ID0gKCR1bnBhY2tlZERhdGEgJiAoKDEgPDwgJGJpdHMpIC0gMSkpOwokdW5wYWNrZWREYXRhID4+PSAkYml0czsKCgoKaWYgKCRpbmRleCA8ICRhbHBoYWJldFNpemUpIHsKJHJldCAuPSAkYWxwaGFiZXRbJGluZGV4XTsKLS0kbGVuZ3RoOwp9Cn0KfQp9CgpyZXR1cm4gbmV3IHN0YXRpYygkcmV0KTsKfQoKcHVibGljIGZ1bmN0aW9uIGJ5dGVzQXQoaW50ICRvZmZzZXQpOiBhcnJheQp7CiRzdHIgPSAkdGhpcy0+c3RyaW5nWyRvZmZzZXRdID8/ICcnOwoKcmV0dXJuICcnID09PSAkc3RyID8gW10gOiBbXG9yZCgkc3RyKV07Cn0KCnB1YmxpYyBmdW5jdGlvbiBhcHBlbmQoc3RyaW5nIC4uLiRzdWZmaXgpOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyAuPSAxID49IFxjb3VudCgkc3VmZml4KSA/ICgkc3VmZml4WzBdID8/ICcnKSA6IGltcGxvZGUoJycsICRzdWZmaXgpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjYW1lbCgpOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CgokcGFydHMgPSBleHBsb2RlKCcgJywgdHJpbSh1Y3dvcmRzKHByZWdfcmVwbGFjZSgnL1teYS16QS1aMC05XHg3Zi1ceGZmXSsrLycsICcgJywgJHRoaXMtPnN0cmluZykpKSk7CiRwYXJ0c1swXSA9IDEgIT09IFxzdHJsZW4oJHBhcnRzWzBdKSAmJiBjdHlwZV91cHBlcigkcGFydHNbMF0pID8gJHBhcnRzWzBdIDogbGNmaXJzdCgkcGFydHNbMF0pOwokc3RyLT5zdHJpbmcgPSBpbXBsb2RlKCcnLCAkcGFydHMpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaHVuayhpbnQgJGxlbmd0aCA9IDEpOiBhcnJheQp7CmlmICgxID4gJGxlbmd0aCkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdUaGUgY2h1bmsgbGVuZ3RoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uJyk7Cn0KCmlmICgnJyA9PT0gJHRoaXMtPnN0cmluZykgewpyZXR1cm4gW107Cn0KCiRzdHIgPSBjbG9uZSAkdGhpczsKJGNodW5rcyA9IFtdOwoKZm9yZWFjaCAoc3RyX3NwbGl0KCR0aGlzLT5zdHJpbmcsICRsZW5ndGgpIGFzICRjaHVuaykgewokc3RyLT5zdHJpbmcgPSAkY2h1bms7CiRjaHVua3NbXSA9IGNsb25lICRzdHI7Cn0KCnJldHVybiAkY2h1bmtzOwp9CgpwdWJsaWMgZnVuY3Rpb24gZW5kc1dpdGgoJHN1ZmZpeCk6IGJvb2wKewppZiAoJHN1ZmZpeCBpbnN0YW5jZW9mIHBhcmVudCkgewokc3VmZml4ID0gJHN1ZmZpeC0+c3RyaW5nOwp9IGVsc2VpZiAoXGlzX2FycmF5KCRzdWZmaXgpIHx8ICRzdWZmaXggaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKcmV0dXJuIHBhcmVudDo6ZW5kc1dpdGgoJHN1ZmZpeCk7Cn0gZWxzZSB7CiRzdWZmaXggPSAoc3RyaW5nKSAkc3VmZml4Owp9CgpyZXR1cm4gJycgIT09ICRzdWZmaXggJiYgXHN0cmxlbigkdGhpcy0+c3RyaW5nKSA+PSBcc3RybGVuKCRzdWZmaXgpICYmIDAgPT09IHN1YnN0cl9jb21wYXJlKCR0aGlzLT5zdHJpbmcsICRzdWZmaXgsIC1cc3RybGVuKCRzdWZmaXgpLCBudWxsLCAkdGhpcy0+aWdub3JlQ2FzZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBlcXVhbHNUbygkc3RyaW5nKTogYm9vbAp7CmlmICgkc3RyaW5nIGluc3RhbmNlb2YgcGFyZW50KSB7CiRzdHJpbmcgPSAkc3RyaW5nLT5zdHJpbmc7Cn0gZWxzZWlmIChcaXNfYXJyYXkoJHN0cmluZykgfHwgJHN0cmluZyBpbnN0YW5jZW9mIFxUcmF2ZXJzYWJsZSkgewpyZXR1cm4gcGFyZW50OjplcXVhbHNUbygkc3RyaW5nKTsKfSBlbHNlIHsKJHN0cmluZyA9IChzdHJpbmcpICRzdHJpbmc7Cn0KCmlmICgnJyAhPT0gJHN0cmluZyAmJiAkdGhpcy0+aWdub3JlQ2FzZSkgewpyZXR1cm4gMCA9PT0gc3RyY2FzZWNtcCgkc3RyaW5nLCAkdGhpcy0+c3RyaW5nKTsKfQoKcmV0dXJuICRzdHJpbmcgPT09ICR0aGlzLT5zdHJpbmc7Cn0KCnB1YmxpYyBmdW5jdGlvbiBmb2xkZWQoKTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSBzdHJ0b2xvd2VyKCRzdHItPnN0cmluZyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIGluZGV4T2YoJG5lZWRsZSwgaW50ICRvZmZzZXQgPSAwKTogP2ludAp7CmlmICgkbmVlZGxlIGluc3RhbmNlb2YgcGFyZW50KSB7CiRuZWVkbGUgPSAkbmVlZGxlLT5zdHJpbmc7Cn0gZWxzZWlmIChcaXNfYXJyYXkoJG5lZWRsZSkgfHwgJG5lZWRsZSBpbnN0YW5jZW9mIFxUcmF2ZXJzYWJsZSkgewpyZXR1cm4gcGFyZW50OjppbmRleE9mKCRuZWVkbGUsICRvZmZzZXQpOwp9IGVsc2UgewokbmVlZGxlID0gKHN0cmluZykgJG5lZWRsZTsKfQoKaWYgKCcnID09PSAkbmVlZGxlKSB7CnJldHVybiBudWxsOwp9CgokaSA9ICR0aGlzLT5pZ25vcmVDYXNlID8gc3RyaXBvcygkdGhpcy0+c3RyaW5nLCAkbmVlZGxlLCAkb2Zmc2V0KSA6IHN0cnBvcygkdGhpcy0+c3RyaW5nLCAkbmVlZGxlLCAkb2Zmc2V0KTsKCnJldHVybiBmYWxzZSA9PT0gJGkgPyBudWxsIDogJGk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpbmRleE9mTGFzdCgkbmVlZGxlLCBpbnQgJG9mZnNldCA9IDApOiA/aW50CnsKaWYgKCRuZWVkbGUgaW5zdGFuY2VvZiBwYXJlbnQpIHsKJG5lZWRsZSA9ICRuZWVkbGUtPnN0cmluZzsKfSBlbHNlaWYgKFxpc19hcnJheSgkbmVlZGxlKSB8fCAkbmVlZGxlIGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnJldHVybiBwYXJlbnQ6OmluZGV4T2ZMYXN0KCRuZWVkbGUsICRvZmZzZXQpOwp9IGVsc2UgewokbmVlZGxlID0gKHN0cmluZykgJG5lZWRsZTsKfQoKaWYgKCcnID09PSAkbmVlZGxlKSB7CnJldHVybiBudWxsOwp9CgokaSA9ICR0aGlzLT5pZ25vcmVDYXNlID8gc3Rycmlwb3MoJHRoaXMtPnN0cmluZywgJG5lZWRsZSwgJG9mZnNldCkgOiBzdHJycG9zKCR0aGlzLT5zdHJpbmcsICRuZWVkbGUsICRvZmZzZXQpOwoKcmV0dXJuIGZhbHNlID09PSAkaSA/IG51bGwgOiAkaTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzVXRmOCgpOiBib29sCnsKcmV0dXJuICcnID09PSAkdGhpcy0+c3RyaW5nIHx8IHByZWdfbWF0Y2goJy8vdScsICR0aGlzLT5zdHJpbmcpOwp9CgpwdWJsaWMgZnVuY3Rpb24gam9pbihhcnJheSAkc3RyaW5ncywgP3N0cmluZyAkbGFzdEdsdWUgPSBudWxsKTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwoKJHRhaWwgPSBudWxsICE9PSAkbGFzdEdsdWUgJiYgMSA8IFxjb3VudCgkc3RyaW5ncykgPyAkbGFzdEdsdWUuYXJyYXlfcG9wKCRzdHJpbmdzKSA6ICcnOwokc3RyLT5zdHJpbmcgPSBpbXBsb2RlKCR0aGlzLT5zdHJpbmcsICRzdHJpbmdzKS4kdGFpbDsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gbGVuZ3RoKCk6IGludAp7CnJldHVybiBcc3RybGVuKCR0aGlzLT5zdHJpbmcpOwp9CgpwdWJsaWMgZnVuY3Rpb24gbG93ZXIoKTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSBzdHJ0b2xvd2VyKCRzdHItPnN0cmluZyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIG1hdGNoKHN0cmluZyAkcmVnZXhwLCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogYXJyYXkKewokbWF0Y2ggPSAoKFxQUkVHX1BBVFRFUk5fT1JERVIgfCBcUFJFR19TRVRfT1JERVIpICYgJGZsYWdzKSA/ICdwcmVnX21hdGNoX2FsbCcgOiAncHJlZ19tYXRjaCc7CgppZiAoJHRoaXMtPmlnbm9yZUNhc2UpIHsKJHJlZ2V4cCAuPSAnaSc7Cn0KCnNldF9lcnJvcl9oYW5kbGVyKHN0YXRpYyBmdW5jdGlvbiAoJHQsICRtKSB7IHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJG0pOyB9KTsKCnRyeSB7CmlmIChmYWxzZSA9PT0gJG1hdGNoKCRyZWdleHAsICR0aGlzLT5zdHJpbmcsICRtYXRjaGVzLCAkZmxhZ3MgfCBcUFJFR19VTk1BVENIRURfQVNfTlVMTCwgJG9mZnNldCkpIHsKJGxhc3RFcnJvciA9IHByZWdfbGFzdF9lcnJvcigpOwoKZm9yZWFjaCAoZ2V0X2RlZmluZWRfY29uc3RhbnRzKHRydWUpWydwY3JlJ10gYXMgJGsgPT4gJHYpIHsKaWYgKCRsYXN0RXJyb3IgPT09ICR2ICYmICdfRVJST1InID09PSBzdWJzdHIoJGssIC02KSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignTWF0Y2hpbmcgZmFpbGVkIHdpdGggJy4kay4nLicpOwp9Cn0KCnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdNYXRjaGluZyBmYWlsZWQgd2l0aCB1bmtub3duIGVycm9yIGNvZGUuJyk7Cn0KfSBmaW5hbGx5IHsKcmVzdG9yZV9lcnJvcl9oYW5kbGVyKCk7Cn0KCnJldHVybiAkbWF0Y2hlczsKfQoKcHVibGljIGZ1bmN0aW9uIHBhZEJvdGgoaW50ICRsZW5ndGgsIHN0cmluZyAkcGFkU3RyID0gJyAnKTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSBzdHJfcGFkKCR0aGlzLT5zdHJpbmcsICRsZW5ndGgsICRwYWRTdHIsIFxTVFJfUEFEX0JPVEgpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBwYWRFbmQoaW50ICRsZW5ndGgsIHN0cmluZyAkcGFkU3RyID0gJyAnKTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSBzdHJfcGFkKCR0aGlzLT5zdHJpbmcsICRsZW5ndGgsICRwYWRTdHIsIFxTVFJfUEFEX1JJR0hUKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gcGFkU3RhcnQoaW50ICRsZW5ndGgsIHN0cmluZyAkcGFkU3RyID0gJyAnKTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSBzdHJfcGFkKCR0aGlzLT5zdHJpbmcsICRsZW5ndGgsICRwYWRTdHIsIFxTVFJfUEFEX0xFRlQpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBwcmVwZW5kKHN0cmluZyAuLi4kcHJlZml4KTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSAoMSA+PSBcY291bnQoJHByZWZpeCkgPyAoJHByZWZpeFswXSA/PyAnJykgOiBpbXBsb2RlKCcnLCAkcHJlZml4KSkuJHN0ci0+c3RyaW5nOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZXBsYWNlKHN0cmluZyAkZnJvbSwgc3RyaW5nICR0byk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKCmlmICgnJyAhPT0gJGZyb20pIHsKJHN0ci0+c3RyaW5nID0gJHRoaXMtPmlnbm9yZUNhc2UgPyBzdHJfaXJlcGxhY2UoJGZyb20sICR0bywgJHRoaXMtPnN0cmluZykgOiBzdHJfcmVwbGFjZSgkZnJvbSwgJHRvLCAkdGhpcy0+c3RyaW5nKTsKfQoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZXBsYWNlTWF0Y2hlcyhzdHJpbmcgJGZyb21SZWdleHAsICR0byk6IHBhcmVudAp7CmlmICgkdGhpcy0+aWdub3JlQ2FzZSkgewokZnJvbVJlZ2V4cCAuPSAnaSc7Cn0KCmlmIChcaXNfYXJyYXkoJHRvKSkgewppZiAoIVxpc19jYWxsYWJsZSgkdG8pKSB7CnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoJ0FyZ3VtZW50IDIgcGFzc2VkIHRvICIlczo6cmVwbGFjZU1hdGNoZXMoKSIgbXVzdCBiZSBjYWxsYWJsZSwgYXJyYXkgZ2l2ZW4uJywgc3RhdGljOjpjbGFzcykpOwp9CgokcmVwbGFjZSA9ICdwcmVnX3JlcGxhY2VfY2FsbGJhY2snOwp9IGVsc2UgewokcmVwbGFjZSA9ICR0byBpbnN0YW5jZW9mIFxDbG9zdXJlID8gJ3ByZWdfcmVwbGFjZV9jYWxsYmFjaycgOiAncHJlZ19yZXBsYWNlJzsKfQoKc2V0X2Vycm9yX2hhbmRsZXIoc3RhdGljIGZ1bmN0aW9uICgkdCwgJG0pIHsgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigkbSk7IH0pOwoKdHJ5IHsKaWYgKG51bGwgPT09ICRzdHJpbmcgPSAkcmVwbGFjZSgkZnJvbVJlZ2V4cCwgJHRvLCAkdGhpcy0+c3RyaW5nKSkgewokbGFzdEVycm9yID0gcHJlZ19sYXN0X2Vycm9yKCk7Cgpmb3JlYWNoIChnZXRfZGVmaW5lZF9jb25zdGFudHModHJ1ZSlbJ3BjcmUnXSBhcyAkayA9PiAkdikgewppZiAoJGxhc3RFcnJvciA9PT0gJHYgJiYgJ19FUlJPUicgPT09IHN1YnN0cigkaywgLTYpKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdNYXRjaGluZyBmYWlsZWQgd2l0aCAnLiRrLicuJyk7Cn0KfQoKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ01hdGNoaW5nIGZhaWxlZCB3aXRoIHVua25vd24gZXJyb3IgY29kZS4nKTsKfQp9IGZpbmFsbHkgewpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKfQoKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSAkc3RyaW5nOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZXZlcnNlKCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gc3RycmV2KCRzdHItPnN0cmluZyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHNsaWNlKGludCAkc3RhcnQgPSAwLCA/aW50ICRsZW5ndGggPSBudWxsKTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSAoc3RyaW5nKSBzdWJzdHIoJHRoaXMtPnN0cmluZywgJHN0YXJ0LCAkbGVuZ3RoID8/IFxQSFBfSU5UX01BWCk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHNuYWtlKCk6IHBhcmVudAp7CiRzdHIgPSAkdGhpcy0+Y2FtZWwoKTsKJHN0ci0+c3RyaW5nID0gc3RydG9sb3dlcihwcmVnX3JlcGxhY2UoWycvKFtBLVpdKykoW0EtWl1bYS16XSkvJywgJy8oW2EtelxkXSkoW0EtWl0pLyddLCAnXDFfXDInLCAkc3RyLT5zdHJpbmcpKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc3BsaWNlKHN0cmluZyAkcmVwbGFjZW1lbnQsIGludCAkc3RhcnQgPSAwLCA/aW50ICRsZW5ndGggPSBudWxsKTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSBzdWJzdHJfcmVwbGFjZSgkdGhpcy0+c3RyaW5nLCAkcmVwbGFjZW1lbnQsICRzdGFydCwgJGxlbmd0aCA/PyBcUEhQX0lOVF9NQVgpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzcGxpdChzdHJpbmcgJGRlbGltaXRlciwgP2ludCAkbGltaXQgPSBudWxsLCA/aW50ICRmbGFncyA9IG51bGwpOiBhcnJheQp7CmlmICgxID4gJGxpbWl0ID0gJGxpbWl0ID8/IFxQSFBfSU5UX01BWCkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdTcGxpdCBsaW1pdCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlci4nKTsKfQoKaWYgKCcnID09PSAkZGVsaW1pdGVyKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1NwbGl0IGRlbGltaXRlciBpcyBlbXB0eS4nKTsKfQoKaWYgKG51bGwgIT09ICRmbGFncykgewpyZXR1cm4gcGFyZW50OjpzcGxpdCgkZGVsaW1pdGVyLCAkbGltaXQsICRmbGFncyk7Cn0KCiRzdHIgPSBjbG9uZSAkdGhpczsKJGNodW5rcyA9ICR0aGlzLT5pZ25vcmVDYXNlCj8gcHJlZ19zcGxpdCgneycucHJlZ19xdW90ZSgkZGVsaW1pdGVyKS4nfWlEJywgJHRoaXMtPnN0cmluZywgJGxpbWl0KQo6IGV4cGxvZGUoJGRlbGltaXRlciwgJHRoaXMtPnN0cmluZywgJGxpbWl0KTsKCmZvcmVhY2ggKCRjaHVua3MgYXMgJiRjaHVuaykgewokc3RyLT5zdHJpbmcgPSAkY2h1bms7CiRjaHVuayA9IGNsb25lICRzdHI7Cn0KCnJldHVybiAkY2h1bmtzOwp9CgpwdWJsaWMgZnVuY3Rpb24gc3RhcnRzV2l0aCgkcHJlZml4KTogYm9vbAp7CmlmICgkcHJlZml4IGluc3RhbmNlb2YgcGFyZW50KSB7CiRwcmVmaXggPSAkcHJlZml4LT5zdHJpbmc7Cn0gZWxzZWlmICghXGlzX3N0cmluZygkcHJlZml4KSkgewpyZXR1cm4gcGFyZW50OjpzdGFydHNXaXRoKCRwcmVmaXgpOwp9CgpyZXR1cm4gJycgIT09ICRwcmVmaXggJiYgMCA9PT0gKCR0aGlzLT5pZ25vcmVDYXNlID8gc3RybmNhc2VjbXAoJHRoaXMtPnN0cmluZywgJHByZWZpeCwgXHN0cmxlbigkcHJlZml4KSkgOiBzdHJuY21wKCR0aGlzLT5zdHJpbmcsICRwcmVmaXgsIFxzdHJsZW4oJHByZWZpeCkpKTsKfQoKcHVibGljIGZ1bmN0aW9uIHRpdGxlKGJvb2wgJGFsbFdvcmRzID0gZmFsc2UpOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9ICRhbGxXb3JkcyA/IHVjd29yZHMoJHN0ci0+c3RyaW5nKSA6IHVjZmlyc3QoJHN0ci0+c3RyaW5nKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gdG9Vbmljb2RlU3RyaW5nKD9zdHJpbmcgJGZyb21FbmNvZGluZyA9IG51bGwpOiBVbmljb2RlU3RyaW5nCnsKcmV0dXJuIG5ldyBVbmljb2RlU3RyaW5nKCR0aGlzLT50b0NvZGVQb2ludFN0cmluZygkZnJvbUVuY29kaW5nKS0+c3RyaW5nKTsKfQoKcHVibGljIGZ1bmN0aW9uIHRvQ29kZVBvaW50U3RyaW5nKD9zdHJpbmcgJGZyb21FbmNvZGluZyA9IG51bGwpOiBDb2RlUG9pbnRTdHJpbmcKewokdSA9IG5ldyBDb2RlUG9pbnRTdHJpbmcoKTsKCmlmIChcaW5fYXJyYXkoJGZyb21FbmNvZGluZywgW251bGwsICd1dGY4JywgJ3V0Zi04JywgJ1VURjgnLCAnVVRGLTgnXSwgdHJ1ZSkgJiYgcHJlZ19tYXRjaCgnLy91JywgJHRoaXMtPnN0cmluZykpIHsKJHUtPnN0cmluZyA9ICR0aGlzLT5zdHJpbmc7CgpyZXR1cm4gJHU7Cn0KCnNldF9lcnJvcl9oYW5kbGVyKHN0YXRpYyBmdW5jdGlvbiAoJHQsICRtKSB7IHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJG0pOyB9KTsKCnRyeSB7CnRyeSB7CiR2YWxpZEVuY29kaW5nID0gZmFsc2UgIT09IG1iX2RldGVjdF9lbmNvZGluZygkdGhpcy0+c3RyaW5nLCAkZnJvbUVuY29kaW5nID8/ICdXaW5kb3dzLTEyNTInLCB0cnVlKTsKfSBjYXRjaCAoSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uICRlKSB7CmlmICghXGZ1bmN0aW9uX2V4aXN0cygnaWNvbnYnKSkgewp0aHJvdyAkZTsKfQoKJHUtPnN0cmluZyA9IGljb252KCRmcm9tRW5jb2RpbmcgPz8gJ1dpbmRvd3MtMTI1MicsICdVVEYtOCcsICR0aGlzLT5zdHJpbmcpOwoKcmV0dXJuICR1Owp9Cn0gZmluYWxseSB7CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwp9CgppZiAoISR2YWxpZEVuY29kaW5nKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignSW52YWxpZCAiJXMiIHN0cmluZy4nLCAkZnJvbUVuY29kaW5nID8/ICdXaW5kb3dzLTEyNTInKSk7Cn0KCiR1LT5zdHJpbmcgPSBtYl9jb252ZXJ0X2VuY29kaW5nKCR0aGlzLT5zdHJpbmcsICdVVEYtOCcsICRmcm9tRW5jb2RpbmcgPz8gJ1dpbmRvd3MtMTI1MicpOwoKcmV0dXJuICR1Owp9CgpwdWJsaWMgZnVuY3Rpb24gdHJpbShzdHJpbmcgJGNoYXJzID0gIiBcdFxuXHJcMFx4MEJceDBDIik6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gdHJpbSgkc3RyLT5zdHJpbmcsICRjaGFycyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHRyaW1FbmQoc3RyaW5nICRjaGFycyA9ICIgXHRcblxyXDBceDBCXHgwQyIpOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9IHJ0cmltKCRzdHItPnN0cmluZywgJGNoYXJzKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gdHJpbVN0YXJ0KHN0cmluZyAkY2hhcnMgPSAiIFx0XG5cclwwXHgwQlx4MEMiKTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSBsdHJpbSgkc3RyLT5zdHJpbmcsICRjaGFycyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHVwcGVyKCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gc3RydG91cHBlcigkc3RyLT5zdHJpbmcpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiB3aWR0aChib29sICRpZ25vcmVBbnNpRGVjb3JhdGlvbiA9IHRydWUpOiBpbnQKewokc3RyaW5nID0gcHJlZ19tYXRjaCgnLy91JywgJHRoaXMtPnN0cmluZykgPyAkdGhpcy0+c3RyaW5nIDogcHJlZ19yZXBsYWNlKCcvW1x4ODAtXHhGRl0vJywgJz8nLCAkdGhpcy0+c3RyaW5nKTsKCnJldHVybiAobmV3IENvZGVQb2ludFN0cmluZygkc3RyaW5nKSktPndpZHRoKCRpZ25vcmVBbnNpRGVjb3JhdGlvbik7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZzsKCnVzZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcRXhjZXB0aW9uXEV4Y2VwdGlvbkludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwoKCgoKCgoKCgpjbGFzcyBDb2RlUG9pbnRTdHJpbmcgZXh0ZW5kcyBBYnN0cmFjdFVuaWNvZGVTdHJpbmcKewpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRzdHJpbmcgPSAnJykKewppZiAoJycgIT09ICRzdHJpbmcgJiYgIXByZWdfbWF0Y2goJy8vdScsICRzdHJpbmcpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgVVRGLTggc3RyaW5nLicpOwp9CgokdGhpcy0+c3RyaW5nID0gJHN0cmluZzsKfQoKcHVibGljIGZ1bmN0aW9uIGFwcGVuZChzdHJpbmcgLi4uJHN1ZmZpeCk6IEFic3RyYWN0U3RyaW5nCnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgLj0gMSA+PSBcY291bnQoJHN1ZmZpeCkgPyAoJHN1ZmZpeFswXSA/PyAnJykgOiBpbXBsb2RlKCcnLCAkc3VmZml4KTsKCmlmICghcHJlZ19tYXRjaCgnLy91JywgJHN0ci0+c3RyaW5nKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIFVURi04IHN0cmluZy4nKTsKfQoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaHVuayhpbnQgJGxlbmd0aCA9IDEpOiBhcnJheQp7CmlmICgxID4gJGxlbmd0aCkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdUaGUgY2h1bmsgbGVuZ3RoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uJyk7Cn0KCmlmICgnJyA9PT0gJHRoaXMtPnN0cmluZykgewpyZXR1cm4gW107Cn0KCiRyeCA9ICcvKCc7CndoaWxlICg2NTUzNSA8ICRsZW5ndGgpIHsKJHJ4IC49ICcuezY1NTM1fSc7CiRsZW5ndGggLT0gNjU1MzU7Cn0KJHJ4IC49ICcueycuJGxlbmd0aC4nfSkvdXMnOwoKJHN0ciA9IGNsb25lICR0aGlzOwokY2h1bmtzID0gW107Cgpmb3JlYWNoIChwcmVnX3NwbGl0KCRyeCwgJHRoaXMtPnN0cmluZywgLTEsIFxQUkVHX1NQTElUX0RFTElNX0NBUFRVUkUgfCBcUFJFR19TUExJVF9OT19FTVBUWSkgYXMgJGNodW5rKSB7CiRzdHItPnN0cmluZyA9ICRjaHVuazsKJGNodW5rc1tdID0gY2xvbmUgJHN0cjsKfQoKcmV0dXJuICRjaHVua3M7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjb2RlUG9pbnRzQXQoaW50ICRvZmZzZXQpOiBhcnJheQp7CiRzdHIgPSAkb2Zmc2V0ID8gJHRoaXMtPnNsaWNlKCRvZmZzZXQsIDEpIDogJHRoaXM7CgpyZXR1cm4gJycgPT09ICRzdHItPnN0cmluZyA/IFtdIDogW21iX29yZCgkc3RyLT5zdHJpbmcsICdVVEYtOCcpXTsKfQoKcHVibGljIGZ1bmN0aW9uIGVuZHNXaXRoKCRzdWZmaXgpOiBib29sCnsKaWYgKCRzdWZmaXggaW5zdGFuY2VvZiBBYnN0cmFjdFN0cmluZykgewokc3VmZml4ID0gJHN1ZmZpeC0+c3RyaW5nOwp9IGVsc2VpZiAoXGlzX2FycmF5KCRzdWZmaXgpIHx8ICRzdWZmaXggaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKcmV0dXJuIHBhcmVudDo6ZW5kc1dpdGgoJHN1ZmZpeCk7Cn0gZWxzZSB7CiRzdWZmaXggPSAoc3RyaW5nKSAkc3VmZml4Owp9CgppZiAoJycgPT09ICRzdWZmaXggfHwgIXByZWdfbWF0Y2goJy8vdScsICRzdWZmaXgpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCR0aGlzLT5pZ25vcmVDYXNlKSB7CnJldHVybiBwcmVnX21hdGNoKCd7Jy5wcmVnX3F1b3RlKCRzdWZmaXgpLickfWl1RCcsICR0aGlzLT5zdHJpbmcpOwp9CgpyZXR1cm4gXHN0cmxlbigkdGhpcy0+c3RyaW5nKSA+PSBcc3RybGVuKCRzdWZmaXgpICYmIDAgPT09IHN1YnN0cl9jb21wYXJlKCR0aGlzLT5zdHJpbmcsICRzdWZmaXgsIC1cc3RybGVuKCRzdWZmaXgpKTsKfQoKcHVibGljIGZ1bmN0aW9uIGVxdWFsc1RvKCRzdHJpbmcpOiBib29sCnsKaWYgKCRzdHJpbmcgaW5zdGFuY2VvZiBBYnN0cmFjdFN0cmluZykgewokc3RyaW5nID0gJHN0cmluZy0+c3RyaW5nOwp9IGVsc2VpZiAoXGlzX2FycmF5KCRzdHJpbmcpIHx8ICRzdHJpbmcgaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKcmV0dXJuIHBhcmVudDo6ZXF1YWxzVG8oJHN0cmluZyk7Cn0gZWxzZSB7CiRzdHJpbmcgPSAoc3RyaW5nKSAkc3RyaW5nOwp9CgppZiAoJycgIT09ICRzdHJpbmcgJiYgJHRoaXMtPmlnbm9yZUNhc2UpIHsKcmV0dXJuIFxzdHJsZW4oJHN0cmluZykgPT09IFxzdHJsZW4oJHRoaXMtPnN0cmluZykgJiYgMCA9PT0gbWJfc3RyaXBvcygkdGhpcy0+c3RyaW5nLCAkc3RyaW5nLCAwLCAnVVRGLTgnKTsKfQoKcmV0dXJuICRzdHJpbmcgPT09ICR0aGlzLT5zdHJpbmc7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpbmRleE9mKCRuZWVkbGUsIGludCAkb2Zmc2V0ID0gMCk6ID9pbnQKewppZiAoJG5lZWRsZSBpbnN0YW5jZW9mIEFic3RyYWN0U3RyaW5nKSB7CiRuZWVkbGUgPSAkbmVlZGxlLT5zdHJpbmc7Cn0gZWxzZWlmIChcaXNfYXJyYXkoJG5lZWRsZSkgfHwgJG5lZWRsZSBpbnN0YW5jZW9mIFxUcmF2ZXJzYWJsZSkgewpyZXR1cm4gcGFyZW50OjppbmRleE9mKCRuZWVkbGUsICRvZmZzZXQpOwp9IGVsc2UgewokbmVlZGxlID0gKHN0cmluZykgJG5lZWRsZTsKfQoKaWYgKCcnID09PSAkbmVlZGxlKSB7CnJldHVybiBudWxsOwp9CgokaSA9ICR0aGlzLT5pZ25vcmVDYXNlID8gbWJfc3RyaXBvcygkdGhpcy0+c3RyaW5nLCAkbmVlZGxlLCAkb2Zmc2V0LCAnVVRGLTgnKSA6IG1iX3N0cnBvcygkdGhpcy0+c3RyaW5nLCAkbmVlZGxlLCAkb2Zmc2V0LCAnVVRGLTgnKTsKCnJldHVybiBmYWxzZSA9PT0gJGkgPyBudWxsIDogJGk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpbmRleE9mTGFzdCgkbmVlZGxlLCBpbnQgJG9mZnNldCA9IDApOiA/aW50CnsKaWYgKCRuZWVkbGUgaW5zdGFuY2VvZiBBYnN0cmFjdFN0cmluZykgewokbmVlZGxlID0gJG5lZWRsZS0+c3RyaW5nOwp9IGVsc2VpZiAoXGlzX2FycmF5KCRuZWVkbGUpIHx8ICRuZWVkbGUgaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKcmV0dXJuIHBhcmVudDo6aW5kZXhPZkxhc3QoJG5lZWRsZSwgJG9mZnNldCk7Cn0gZWxzZSB7CiRuZWVkbGUgPSAoc3RyaW5nKSAkbmVlZGxlOwp9CgppZiAoJycgPT09ICRuZWVkbGUpIHsKcmV0dXJuIG51bGw7Cn0KCiRpID0gJHRoaXMtPmlnbm9yZUNhc2UgPyBtYl9zdHJyaXBvcygkdGhpcy0+c3RyaW5nLCAkbmVlZGxlLCAkb2Zmc2V0LCAnVVRGLTgnKSA6IG1iX3N0cnJwb3MoJHRoaXMtPnN0cmluZywgJG5lZWRsZSwgJG9mZnNldCwgJ1VURi04Jyk7CgpyZXR1cm4gZmFsc2UgPT09ICRpID8gbnVsbCA6ICRpOwp9CgpwdWJsaWMgZnVuY3Rpb24gbGVuZ3RoKCk6IGludAp7CnJldHVybiBtYl9zdHJsZW4oJHRoaXMtPnN0cmluZywgJ1VURi04Jyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBwcmVwZW5kKHN0cmluZyAuLi4kcHJlZml4KTogQWJzdHJhY3RTdHJpbmcKewokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9ICgxID49IFxjb3VudCgkcHJlZml4KSA/ICgkcHJlZml4WzBdID8/ICcnKSA6IGltcGxvZGUoJycsICRwcmVmaXgpKS4kdGhpcy0+c3RyaW5nOwoKaWYgKCFwcmVnX21hdGNoKCcvL3UnLCAkc3RyLT5zdHJpbmcpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgVVRGLTggc3RyaW5nLicpOwp9CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHJlcGxhY2Uoc3RyaW5nICRmcm9tLCBzdHJpbmcgJHRvKTogQWJzdHJhY3RTdHJpbmcKewokc3RyID0gY2xvbmUgJHRoaXM7CgppZiAoJycgPT09ICRmcm9tIHx8ICFwcmVnX21hdGNoKCcvL3UnLCAkZnJvbSkpIHsKcmV0dXJuICRzdHI7Cn0KCmlmICgnJyAhPT0gJHRvICYmICFwcmVnX21hdGNoKCcvL3UnLCAkdG8pKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgVVRGLTggc3RyaW5nLicpOwp9CgppZiAoJHRoaXMtPmlnbm9yZUNhc2UpIHsKJHN0ci0+c3RyaW5nID0gaW1wbG9kZSgkdG8sIHByZWdfc3BsaXQoJ3snLnByZWdfcXVvdGUoJGZyb20pLid9aXVEJywgJHRoaXMtPnN0cmluZykpOwp9IGVsc2Ugewokc3RyLT5zdHJpbmcgPSBzdHJfcmVwbGFjZSgkZnJvbSwgJHRvLCAkdGhpcy0+c3RyaW5nKTsKfQoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzbGljZShpbnQgJHN0YXJ0ID0gMCwgP2ludCAkbGVuZ3RoID0gbnVsbCk6IEFic3RyYWN0U3RyaW5nCnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSBtYl9zdWJzdHIoJHRoaXMtPnN0cmluZywgJHN0YXJ0LCAkbGVuZ3RoLCAnVVRGLTgnKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc3BsaWNlKHN0cmluZyAkcmVwbGFjZW1lbnQsIGludCAkc3RhcnQgPSAwLCA/aW50ICRsZW5ndGggPSBudWxsKTogQWJzdHJhY3RTdHJpbmcKewppZiAoIXByZWdfbWF0Y2goJy8vdScsICRyZXBsYWNlbWVudCkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBVVEYtOCBzdHJpbmcuJyk7Cn0KCiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0YXJ0ID0gJHN0YXJ0ID8gXHN0cmxlbihtYl9zdWJzdHIoJHRoaXMtPnN0cmluZywgMCwgJHN0YXJ0LCAnVVRGLTgnKSkgOiAwOwokbGVuZ3RoID0gJGxlbmd0aCA/IFxzdHJsZW4obWJfc3Vic3RyKCR0aGlzLT5zdHJpbmcsICRzdGFydCwgJGxlbmd0aCwgJ1VURi04JykpIDogJGxlbmd0aDsKJHN0ci0+c3RyaW5nID0gc3Vic3RyX3JlcGxhY2UoJHRoaXMtPnN0cmluZywgJHJlcGxhY2VtZW50LCAkc3RhcnQsICRsZW5ndGggPz8gXFBIUF9JTlRfTUFYKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc3BsaXQoc3RyaW5nICRkZWxpbWl0ZXIsID9pbnQgJGxpbWl0ID0gbnVsbCwgP2ludCAkZmxhZ3MgPSBudWxsKTogYXJyYXkKewppZiAoMSA+ICRsaW1pdCA9ICRsaW1pdCA/PyBcUEhQX0lOVF9NQVgpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignU3BsaXQgbGltaXQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuJyk7Cn0KCmlmICgnJyA9PT0gJGRlbGltaXRlcikgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdTcGxpdCBkZWxpbWl0ZXIgaXMgZW1wdHkuJyk7Cn0KCmlmIChudWxsICE9PSAkZmxhZ3MpIHsKcmV0dXJuIHBhcmVudDo6c3BsaXQoJGRlbGltaXRlci4ndScsICRsaW1pdCwgJGZsYWdzKTsKfQoKaWYgKCFwcmVnX21hdGNoKCcvL3UnLCAkZGVsaW1pdGVyKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdTcGxpdCBkZWxpbWl0ZXIgaXMgbm90IGEgdmFsaWQgVVRGLTggc3RyaW5nLicpOwp9Cgokc3RyID0gY2xvbmUgJHRoaXM7CiRjaHVua3MgPSAkdGhpcy0+aWdub3JlQ2FzZQo/IHByZWdfc3BsaXQoJ3snLnByZWdfcXVvdGUoJGRlbGltaXRlcikuJ31pdUQnLCAkdGhpcy0+c3RyaW5nLCAkbGltaXQpCjogZXhwbG9kZSgkZGVsaW1pdGVyLCAkdGhpcy0+c3RyaW5nLCAkbGltaXQpOwoKZm9yZWFjaCAoJGNodW5rcyBhcyAmJGNodW5rKSB7CiRzdHItPnN0cmluZyA9ICRjaHVuazsKJGNodW5rID0gY2xvbmUgJHN0cjsKfQoKcmV0dXJuICRjaHVua3M7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzdGFydHNXaXRoKCRwcmVmaXgpOiBib29sCnsKaWYgKCRwcmVmaXggaW5zdGFuY2VvZiBBYnN0cmFjdFN0cmluZykgewokcHJlZml4ID0gJHByZWZpeC0+c3RyaW5nOwp9IGVsc2VpZiAoXGlzX2FycmF5KCRwcmVmaXgpIHx8ICRwcmVmaXggaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKcmV0dXJuIHBhcmVudDo6c3RhcnRzV2l0aCgkcHJlZml4KTsKfSBlbHNlIHsKJHByZWZpeCA9IChzdHJpbmcpICRwcmVmaXg7Cn0KCmlmICgnJyA9PT0gJHByZWZpeCB8fCAhcHJlZ19tYXRjaCgnLy91JywgJHByZWZpeCkpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoJHRoaXMtPmlnbm9yZUNhc2UpIHsKcmV0dXJuIDAgPT09IG1iX3N0cmlwb3MoJHRoaXMtPnN0cmluZywgJHByZWZpeCwgMCwgJ1VURi04Jyk7Cn0KCnJldHVybiAwID09PSBzdHJuY21wKCR0aGlzLT5zdHJpbmcsICRwcmVmaXgsIFxzdHJsZW4oJHByZWZpeCkpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcRXhjZXB0aW9uOwoKaW50ZXJmYWNlIEV4Y2VwdGlvbkludGVyZmFjZSBleHRlbmRzIFxUaHJvd2FibGUKewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEV4Y2VwdGlvbjsKCmNsYXNzIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBleHRlbmRzIFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb25JbnRlcmZhY2UKewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEV4Y2VwdGlvbjsKCmNsYXNzIFJ1bnRpbWVFeGNlcHRpb24gZXh0ZW5kcyBcUnVudGltZUV4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbkludGVyZmFjZQp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcSW5mbGVjdG9yOwoKZmluYWwgY2xhc3MgRW5nbGlzaEluZmxlY3RvciBpbXBsZW1lbnRzIEluZmxlY3RvckludGVyZmFjZQp7CgoKCgoKcHJpdmF0ZSBjb25zdCBQTFVSQUxfTUFQID0gWwoKCgoKCgoKWydhaXJldGNhYicsIDgsIHRydWUsIHRydWUsICdiYWN0ZXJpdW0nXSwKCgpbJ2Fyb3Byb2MnLCA3LCB0cnVlLCB0cnVlLCAnY29ycHVzJ10sCgoKWydhaXJldGlyYycsIDgsIHRydWUsIHRydWUsICdjcml0ZXJpb24nXSwKCgpbJ2FsdWNpcnJ1YycsIDksIHRydWUsIHRydWUsICdjdXJyaWN1bHVtJ10sCgoKWydhcmVuZWcnLCA2LCB0cnVlLCB0cnVlLCAnZ2VudXMnXSwKCgpbJ2FpZGVtJywgNSwgdHJ1ZSwgdHJ1ZSwgJ21lZGl1bSddLAoKClsnYWRuYXJvbWVtJywgOSwgdHJ1ZSwgdHJ1ZSwgJ21lbW9yYW5kdW0nXSwKCgpbJ2FuZW1vbmVocCcsIDksIHRydWUsIHRydWUsICdwaGVub21lbm9uJ10sCgoKWydhdGFydHMnLCA2LCB0cnVlLCB0cnVlLCAnc3RyYXR1bSddLAoKClsnZWEnLCAyLCB0cnVlLCB0cnVlLCAnYSddLAoKClsnc2VjaXZyZXMnLCA4LCB0cnVlLCB0cnVlLCAnc2VydmljZSddLAoKClsnZWNpJywgMywgZmFsc2UsIHRydWUsICdvdXNlJ10sCgoKWydlc2VlJywgNCwgZmFsc2UsIHRydWUsICdvb3NlJ10sCgoKWydpJywgMSwgdHJ1ZSwgdHJ1ZSwgJ3VzJ10sCgoKWyduZW0nLCAzLCB0cnVlLCB0cnVlLCAnbWFuJ10sCgoKWyduZXJkbGloYycsIDgsIHRydWUsIHRydWUsICdjaGlsZCddLAoKClsnbmV4bycsIDQsIGZhbHNlLCBmYWxzZSwgJ294J10sCgoKWydzZWNpJywgNCwgZmFsc2UsIHRydWUsIFsnZXgnLCAnaXgnLCAnaWNlJ11dLAoKClsnc2Vkb2MnLCA1LCBmYWxzZSwgdHJ1ZSwgJ2NvZGUnXSwKCgpbJ3NlaWZsZXMnLCA3LCB0cnVlLCB0cnVlLCAnc2VsZmllJ10sCgoKWydzZWlibW96JywgNywgdHJ1ZSwgdHJ1ZSwgJ3pvbWJpZSddLAoKClsnc2Vpdm9tJywgNiwgdHJ1ZSwgdHJ1ZSwgJ21vdmllJ10sCgoKWydzZW1hbicsIDUsIHRydWUsIGZhbHNlLCAnbmFtZSddLAoKClsnc2VzdXRjZXAnLCA4LCB0cnVlLCB0cnVlLCAncGVjdHVzJ10sCgoKWyd0ZWVmJywgNCwgdHJ1ZSwgdHJ1ZSwgJ2Zvb3QnXSwKCgpbJ2VzZWVnJywgNSwgdHJ1ZSwgdHJ1ZSwgJ2dvb3NlJ10sCgoKWydodGVldCcsIDUsIHRydWUsIHRydWUsICd0b290aCddLAoKClsnc3dlbicsIDQsIHRydWUsIHRydWUsICduZXdzJ10sCgoKWydzZWlyZXMnLCA2LCB0cnVlLCB0cnVlLCAnc2VyaWVzJ10sCgoKWydzZWknLCAzLCBmYWxzZSwgdHJ1ZSwgJ3knXSwKCgpbJ3Nlc3MnLCA0LCB0cnVlLCBmYWxzZSwgJ3NzJ10sCgoKWydzZXN1dGF0cycsIDgsIHRydWUsIHRydWUsICdzdGF0dXMnXSwKCgpbJ3NlbCcsIDMsIHRydWUsIHRydWUsICdsZSddLAoKCgoKClsnc2VzJywgMywgdHJ1ZSwgdHJ1ZSwgWydzJywgJ3NlJywgJ3NpcyddXSwKCgpbJ3Nldml0JywgNSwgdHJ1ZSwgdHJ1ZSwgJ3RpdmUnXSwKCgpbJ3NldmlyZCcsIDYsIGZhbHNlLCB0cnVlLCAnZHJpdmUnXSwKCgpbJ3NldmknLCA0LCBmYWxzZSwgdHJ1ZSwgJ2lmZSddLAoKClsnc2V2b20nLCA1LCB0cnVlLCB0cnVlLCAnbW92ZSddLAoKClsnc2V2JywgMywgdHJ1ZSwgdHJ1ZSwgWydmJywgJ3ZlJywgJ2ZmJ11dLAoKClsnc2V4YScsIDQsIGZhbHNlLCBmYWxzZSwgWydheCcsICdheGUnLCAnYXhpcyddXSwKCgpbJ3NleCcsIDMsIHRydWUsIGZhbHNlLCAneCddLAoKClsnc2V6eicsIDQsIHRydWUsIGZhbHNlLCAneiddLAoKClsnc3VhZScsIDQsIGZhbHNlLCB0cnVlLCAnZWF1J10sCgoKWydzZWUnLCAzLCB0cnVlLCB0cnVlLCAnZWUnXSwKCgpbJ3NlZ2QnLCA0LCB0cnVlLCB0cnVlLCAnZGdlJ10sCgoKCgpbJ3NlJywgMiwgdHJ1ZSwgdHJ1ZSwgWycnLCAnZSddXSwKCgpbJ3N1dGF0cycsIDYsIHRydWUsIHRydWUsICdzdGF0dXMnXSwKCgpbJ3MnLCAxLCB0cnVlLCB0cnVlLCAnJ10sCgoKWyd4dWFlJywgNCwgZmFsc2UsIHRydWUsICdlYXUnXSwKCgpbJ2VscG9lcCcsIDYsIHRydWUsIHRydWUsICdwZXJzb24nXSwKXTsKCgoKCgoKcHJpdmF0ZSBjb25zdCBTSU5HVUxBUl9NQVAgPSBbCgoKCgoKCgpbJ3NpeGEnLCA0LCBmYWxzZSwgZmFsc2UsICdheGVzJ10sCgoKWydhaXJldGlyYycsIDgsIGZhbHNlLCBmYWxzZSwgJ2NyaXRlcmlvbiddLAoKClsnYWx1YmVuJywgNiwgZmFsc2UsIGZhbHNlLCAnbmVidWxhZSddLAoKClsnZGxpaGMnLCA1LCB0cnVlLCB0cnVlLCAnY2hpbGRyZW4nXSwKCgpbJ2VjaScsIDMsIGZhbHNlLCB0cnVlLCAnaWNlcyddLAoKClsnZWNpdnJlcycsIDcsIHRydWUsIHRydWUsICdzZXJ2aWNlcyddLAoKClsnZWZpJywgMywgZmFsc2UsIHRydWUsICdpdmVzJ10sCgoKWydlaWZsZXMnLCA2LCB0cnVlLCB0cnVlLCAnc2VsZmllcyddLAoKClsnZWl2b20nLCA1LCB0cnVlLCB0cnVlLCAnbW92aWVzJ10sCgoKWydlc3VvbCcsIDUsIGZhbHNlLCB0cnVlLCAnbGljZSddLAoKClsnZXN1b20nLCA1LCBmYWxzZSwgdHJ1ZSwgJ21pY2UnXSwKCgpbJ2Vzb28nLCA0LCBmYWxzZSwgdHJ1ZSwgJ2Vlc2UnXSwKCgpbJ2VzJywgMiwgdHJ1ZSwgdHJ1ZSwgJ3NlcyddLAoKClsnZXNvb2cnLCA1LCB0cnVlLCB0cnVlLCAnZ2Vlc2UnXSwKCgpbJ2V2JywgMiwgdHJ1ZSwgdHJ1ZSwgJ3ZlcyddLAoKClsnZXZpcmQnLCA1LCBmYWxzZSwgdHJ1ZSwgJ2RyaXZlcyddLAoKClsnZXZpdCcsIDQsIHRydWUsIHRydWUsICd0aXZlcyddLAoKClsnZXZvbScsIDQsIHRydWUsIHRydWUsICdtb3ZlcyddLAoKClsnZmZhdHMnLCA1LCB0cnVlLCB0cnVlLCAnc3RhdmVzJ10sCgoKWydmZicsIDIsIHRydWUsIHRydWUsICdmZnMnXSwKCgpbJ2YnLCAxLCB0cnVlLCB0cnVlLCBbJ2ZzJywgJ3ZlcyddXSwKCgpbJ2hjJywgMiwgdHJ1ZSwgdHJ1ZSwgJ2NoZXMnXSwKCgpbJ2hzJywgMiwgdHJ1ZSwgdHJ1ZSwgJ3NoZXMnXSwKCgpbJ2h0b290JywgNSwgdHJ1ZSwgdHJ1ZSwgJ3RlZXRoJ10sCgoKWydtdWJsYScsIDUsIHRydWUsIHRydWUsICdhbGJ1bXMnXSwKCgpbJ211JywgMiwgdHJ1ZSwgdHJ1ZSwgJ2EnXSwKCgpbJ25hbScsIDMsIHRydWUsIHRydWUsICdtZW4nXSwKCgpbJ25vc3JlcCcsIDYsIHRydWUsIHRydWUsIFsncGVyc29ucycsICdwZW9wbGUnXV0sCgoKWydub2lyZXRpcmMnLCA5LCB0cnVlLCB0cnVlLCAnY3JpdGVyaWEnXSwKCgpbJ25vbmVtb25laHAnLCAxMCwgdHJ1ZSwgdHJ1ZSwgJ3BoZW5vbWVuYSddLAoKClsnb2hjZScsIDQsIHRydWUsIHRydWUsICdlY2hvZXMnXSwKCgpbJ29yZWgnLCA0LCB0cnVlLCB0cnVlLCAnaGVyb2VzJ10sCgoKWydzYWx0YScsIDUsIHRydWUsIHRydWUsICdhdGxhc2VzJ10sCgoKWydzYWlsYScsIDUsIHRydWUsIHRydWUsICdhbGlhc2VzJ10sCgoKWydzaXJpJywgNCwgdHJ1ZSwgdHJ1ZSwgJ2lyaXNlcyddLAoKCgoKWydzaXMnLCAzLCB0cnVlLCB0cnVlLCAnc2VzJ10sCgoKWydzcycsIDIsIHRydWUsIGZhbHNlLCAnc3NlcyddLAoKClsnc3ViYWxseXMnLCA4LCB0cnVlLCB0cnVlLCAnc3lsbGFiaSddLAoKClsnc3ViJywgMywgdHJ1ZSwgdHJ1ZSwgJ2J1c2VzJ10sCgoKWydzdWMnLCAzLCB0cnVlLCB0cnVlLCAnY3VzZXMnXSwKCgpbJ3N1cG1hY29wcGloJywgMTEsIGZhbHNlLCBmYWxzZSwgJ2hpcHBvY2FtcGknXSwKCgpbJ3N1cCcsIDMsIHRydWUsIHRydWUsICdwdXNlcyddLAoKClsnc3V0YXRzJywgNiwgdHJ1ZSwgdHJ1ZSwgWydzdGF0dXMnLCAnc3RhdHVzZXMnXV0sCgoKWydzdXRjZXAnLCA2LCB0cnVlLCB0cnVlLCAncGVjdHVzZXMnXSwKCgpbJ3N1JywgMiwgdHJ1ZSwgdHJ1ZSwgJ2knXSwKCgpbJ3N3ZW4nLCA0LCB0cnVlLCB0cnVlLCAnbmV3cyddLAoKClsndG9vZicsIDQsIHRydWUsIHRydWUsICdmZWV0J10sCgoKWyd1YWUnLCAzLCBmYWxzZSwgdHJ1ZSwgWydlYXVzJywgJ2VhdXgnXV0sCgoKWyd4bycsIDIsIGZhbHNlLCBmYWxzZSwgJ294ZW4nXSwKCgpbJ3hhb2gnLCA0LCB0cnVlLCBmYWxzZSwgJ2hvYXhlcyddLAoKClsneGVkbmknLCA1LCBmYWxzZSwgdHJ1ZSwgWydpbmRpY2llcycsICdpbmRleGVzJ11dLAoKClsneGFmJywgMywgdHJ1ZSwgdHJ1ZSwgWydmYXhlcycsICdmYXh4ZXMnXV0sCgoKWyd4bycsIDIsIGZhbHNlLCB0cnVlLCAnb3hlcyddLAoKClsneCcsIDEsIHRydWUsIGZhbHNlLCBbJ2NlcycsICd4ZXMnXV0sCgoKWyd5JywgMSwgZmFsc2UsIHRydWUsICdpZXMnXSwKCgpbJ3ppdXEnLCA0LCB0cnVlLCBmYWxzZSwgJ3F1aXp6ZXMnXSwKCgpbJ3onLCAxLCB0cnVlLCB0cnVlLCAnemVzJ10sCl07CgoKCgpwcml2YXRlIGNvbnN0IFVOSU5GTEVDVEVEID0gWwonJywKCgonYXRhZCcsCgoKJ3JlZWQnLAoKCid0bmVtcGl1cWUnLAoKCidrY2FiZGVlZicsCgoKJ2hzaWYnLAoKCidodGxhZWgnLAoKCid5cm90c2loJywKCgonb2ZuaScsCgoKJ25vaXRhbXJvZm5pJywKCgoneWVub20nLAoKCidlc29vbScsCgoKJ3NlaXJlcycsCgoKJ3BlZWhzJywKCgonc2VpY2VwcycsCgoKJ2NpZmZhcnQnLAoKCid0ZmFyY3JpYScsCgoKJ2VyYXdkcmFoJywKXTsKCnB1YmxpYyBmdW5jdGlvbiBzaW5ndWxhcml6ZShzdHJpbmcgJHBsdXJhbCk6IGFycmF5CnsKJHBsdXJhbFJldiA9IHN0cnJldigkcGx1cmFsKTsKJGxvd2VyUGx1cmFsUmV2ID0gc3RydG9sb3dlcigkcGx1cmFsUmV2KTsKJHBsdXJhbExlbmd0aCA9IFxzdHJsZW4oJGxvd2VyUGx1cmFsUmV2KTsKCgppZiAoXGluX2FycmF5KCRsb3dlclBsdXJhbFJldiwgc2VsZjo6VU5JTkZMRUNURUQsIHRydWUpKSB7CnJldHVybiBbJHBsdXJhbF07Cn0KCgoKCgpmb3JlYWNoIChzZWxmOjpQTFVSQUxfTUFQIGFzICRtYXApIHsKJHN1ZmZpeCA9ICRtYXBbMF07CiRzdWZmaXhMZW5ndGggPSAkbWFwWzFdOwokaiA9IDA7CgoKCndoaWxlICgkc3VmZml4WyRqXSA9PT0gJGxvd2VyUGx1cmFsUmV2WyRqXSkgewoKKyskajsKCgoKaWYgKCRqID09PSAkc3VmZml4TGVuZ3RoKSB7CgppZiAoJGogPCAkcGx1cmFsTGVuZ3RoKSB7CiRuZXh0SXNWb3dlbCA9IHN0cl9jb250YWlucygnYWVpb3UnLCAkbG93ZXJQbHVyYWxSZXZbJGpdKTsKCmlmICghJG1hcFsyXSAmJiAkbmV4dElzVm93ZWwpIHsKCmJyZWFrOwp9CgppZiAoISRtYXBbM10gJiYgISRuZXh0SXNWb3dlbCkgewoKYnJlYWs7Cn0KfQoKJG5ld0Jhc2UgPSBzdWJzdHIoJHBsdXJhbCwgMCwgJHBsdXJhbExlbmd0aCAtICRzdWZmaXhMZW5ndGgpOwokbmV3U3VmZml4ID0gJG1hcFs0XTsKCgoKCiRmaXJzdFVwcGVyID0gY3R5cGVfdXBwZXIoJHBsdXJhbFJldlskaiAtIDFdKTsKCmlmIChcaXNfYXJyYXkoJG5ld1N1ZmZpeCkpIHsKJHNpbmd1bGFycyA9IFtdOwoKZm9yZWFjaCAoJG5ld1N1ZmZpeCBhcyAkbmV3U3VmZml4RW50cnkpIHsKJHNpbmd1bGFyc1tdID0gJG5ld0Jhc2UuKCRmaXJzdFVwcGVyID8gdWNmaXJzdCgkbmV3U3VmZml4RW50cnkpIDogJG5ld1N1ZmZpeEVudHJ5KTsKfQoKcmV0dXJuICRzaW5ndWxhcnM7Cn0KCnJldHVybiBbJG5ld0Jhc2UuKCRmaXJzdFVwcGVyID8gdWNmaXJzdCgkbmV3U3VmZml4KSA6ICRuZXdTdWZmaXgpXTsKfQoKCmlmICgkaiA9PT0gJHBsdXJhbExlbmd0aCkgewpicmVhazsKfQp9Cn0KCgpyZXR1cm4gWyRwbHVyYWxdOwp9CgpwdWJsaWMgZnVuY3Rpb24gcGx1cmFsaXplKHN0cmluZyAkc2luZ3VsYXIpOiBhcnJheQp7CiRzaW5ndWxhclJldiA9IHN0cnJldigkc2luZ3VsYXIpOwokbG93ZXJTaW5ndWxhclJldiA9IHN0cnRvbG93ZXIoJHNpbmd1bGFyUmV2KTsKJHNpbmd1bGFyTGVuZ3RoID0gXHN0cmxlbigkbG93ZXJTaW5ndWxhclJldik7CgoKaWYgKFxpbl9hcnJheSgkbG93ZXJTaW5ndWxhclJldiwgc2VsZjo6VU5JTkZMRUNURUQsIHRydWUpKSB7CnJldHVybiBbJHNpbmd1bGFyXTsKfQoKCgoKCmZvcmVhY2ggKHNlbGY6OlNJTkdVTEFSX01BUCBhcyAkbWFwKSB7CiRzdWZmaXggPSAkbWFwWzBdOwokc3VmZml4TGVuZ3RoID0gJG1hcFsxXTsKJGogPSAwOwoKCgoKd2hpbGUgKCRzdWZmaXhbJGpdID09PSAkbG93ZXJTaW5ndWxhclJldlskal0pIHsKCisrJGo7CgoKCmlmICgkaiA9PT0gJHN1ZmZpeExlbmd0aCkgewoKaWYgKCRqIDwgJHNpbmd1bGFyTGVuZ3RoKSB7CiRuZXh0SXNWb3dlbCA9IHN0cl9jb250YWlucygnYWVpb3UnLCAkbG93ZXJTaW5ndWxhclJldlskal0pOwoKaWYgKCEkbWFwWzJdICYmICRuZXh0SXNWb3dlbCkgewoKYnJlYWs7Cn0KCmlmICghJG1hcFszXSAmJiAhJG5leHRJc1Zvd2VsKSB7CgpicmVhazsKfQp9CgokbmV3QmFzZSA9IHN1YnN0cigkc2luZ3VsYXIsIDAsICRzaW5ndWxhckxlbmd0aCAtICRzdWZmaXhMZW5ndGgpOwokbmV3U3VmZml4ID0gJG1hcFs0XTsKCgoKCiRmaXJzdFVwcGVyID0gY3R5cGVfdXBwZXIoJHNpbmd1bGFyUmV2WyRqIC0gMV0pOwoKaWYgKFxpc19hcnJheSgkbmV3U3VmZml4KSkgewokcGx1cmFscyA9IFtdOwoKZm9yZWFjaCAoJG5ld1N1ZmZpeCBhcyAkbmV3U3VmZml4RW50cnkpIHsKJHBsdXJhbHNbXSA9ICRuZXdCYXNlLigkZmlyc3RVcHBlciA/IHVjZmlyc3QoJG5ld1N1ZmZpeEVudHJ5KSA6ICRuZXdTdWZmaXhFbnRyeSk7Cn0KCnJldHVybiAkcGx1cmFsczsKfQoKcmV0dXJuIFskbmV3QmFzZS4oJGZpcnN0VXBwZXIgPyB1Y2ZpcnN0KCRuZXdTdWZmaXgpIDogJG5ld1N1ZmZpeCldOwp9CgoKaWYgKCRqID09PSAkc2luZ3VsYXJMZW5ndGgpIHsKYnJlYWs7Cn0KfQp9CgoKcmV0dXJuIFskc2luZ3VsYXIuJ3MnXTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEluZmxlY3RvcjsKCgoKCgoKZmluYWwgY2xhc3MgRnJlbmNoSW5mbGVjdG9yIGltcGxlbWVudHMgSW5mbGVjdG9ySW50ZXJmYWNlCnsKCgoKCgpwcml2YXRlIGNvbnN0IFBMVVJBTElaRV9SRUdFWFAgPSBbCgoKCgoKWycvKHN8eHx6KSQvaScsICdcMSddLAoKCgpbJy8oZWF1KSQvaScsICdcMXgnXSwKCgoKWycvXihsYW5kYXUpJC9pJywgJ1wxcyddLApbJy8oYXUpJC9pJywgJ1wxeCddLAoKCgpbJy9eKHBuZXV8YmxldXzDqW1ldSkkL2knLCAnXDFzJ10sClsnLyhldSkkL2knLCAnXDF4J10sCgoKClsnL14oYmFsfGNhcm5hdmFsfGNhcmFjYWx8Y2hhY2FsfGNob3JhbHxjb3JyYWx8w6l0YWx8ZmVzdGl2YWx8csOpY2l0YWx8dmFsKSQvaScsICdcMXMnXSwKWycvYWwkL2knLCAnXDFhdXgnXSwKCgpbJy9eKGFzcGlyfGJ8Y29yfMOpbXxmZXJtfHNvdXBpcnx0cmF2fHZhbnR8dml0cilhaWwkL2knLCAnXDFhdXgnXSwKCgpbJy9eKGJpanxjYWlsbHxjaHxnZW58aGlifGpvdWp8cClvdSQvaScsICdcMW91eCddLAoKClsnL14oY2lucXVhbnRlfHNvaXhhbnRlfG1pbGxlKSQvaScsICdcMSddLAoKClsnL14obW9ufG1hKShzaWV1cnxkYW1lfGRlbW9pc2VsbGV8c2VpZ25ldXIpJC8nLCAnbWVzXDJzJ10sClsnL14oTW9ufE1hKShzaWV1cnxkYW1lfGRlbW9pc2VsbGV8c2VpZ25ldXIpJC8nLCAnTWVzXDJzJ10sCl07CgoKCgpwcml2YXRlIGNvbnN0IFNJTkdVTEFSSVpFX1JFR0VYUCA9IFsKCgoKClsnLygoYXNwaXJ8Ynxjb3J8w6ltfGZlcm18c291cGlyfHRyYXZ8dmFudHx2aXRyKSlhdXgkL2knLCAnXDFhaWwnXSwKCgoKWycvKGVhdSl4JC9pJywgJ1wxJ10sCgoKClsnLyhhbWlyfGFuaW18YXJzZW58Ym9jfGNhbnxjYXBpdHxjYXBvcnxjaGV2fGNyaXN0fGfDqW7DqXJ8aG9waXR8aMO0cGl0fGlkw6l8am91cm58bGl0dG9yfGxvY3xtfG3DqXR8bWluw6lyfHByaW5jaXB8cmFkaWN8dGVybWluKWF1eCQvaScsICdcMWFsJ10sCgoKClsnLyhhdSl4JC9pJywgJ1wxJ10sCgoKClsnLyhldSl4JC9pJywgJ1wxJ10sCgoKClsnLyhiaWp8Y2FpbGx8Y2h8Z2VufGhpYnxqb3VqfHApb3V4JC9pJywgJ1wxb3UnXSwKCgpbJy9ebWVzKGRhbWV8ZGVtb2lzZWxsZSlzJC8nLCAnbWFcMSddLApbJy9eTWVzKGRhbWV8ZGVtb2lzZWxsZSlzJC8nLCAnTWFcMSddLApbJy9ebWVzKHNpZXVyfHNlaWduZXVyKXMkLycsICdtb25cMSddLApbJy9eTWVzKHNpZXVyfHNlaWduZXVyKXMkLycsICdNb25cMSddLAoKClsnL3MkL2knLCAnJ10sCl07CgoKCgoKcHJpdmF0ZSBjb25zdCBVTklORkxFQ1RFRCA9ICcvXihhYmPDqHN8YWNjw6hzfGFidXN8YWxiYXRyb3N8YW5jaG9pc3xhbmdsYWlzfGF1dG9idXN8Ym9pc3xicmViaXN8Y2FycXVvaXN8Y2FzfGNoYXN8Y29saXN8Y29uY291cnN8Y29ycHN8Y291cnN8Y3lwcsOoc3xkw6ljw6hzfGRldmlzfGRpc2NvdXJzfGRvc3xlbWJhcnJhc3xlbmdyYWlzfGVudHJlbGFjc3xleGPDqHN8Zmlsc3xmb2lzfGfDomNoaXN8Z2Fyc3xnbGFzfGjDqXJvc3xpbnRydXN8amFyc3xqdXN8a2VybcOoc3xsYWNpc3xsZWdzfGxpbGFzfG1hcmFpc3xtYXJzfG1hdGVsYXN8bcOpcHJpc3xtZXRzfG1vaXN8bW9yc3xvYnVzfG9zfHBhbGFpc3xwYXJhZGlzfHBhcmNvdXJzfHBhcmRlc3N1c3xwYXlzfHBsdXNpZXVyc3xwb2lkc3xwb2lzfHBvdWxzfHByaW50ZW1wc3xwcm9jZXNzdXN8cHJvZ3LDqHN8cHVpdHN8cHVzfHJhYmFpc3xyYWRpc3xyZWNvcnN8cmVjb3Vyc3xyZWZ1c3xyZWxhaXN8cmVtb3Jkc3xyZW1vdXN8cmljdHVzfHJoaW5vY8Opcm9zfHJlcGFzfHJ1YmlzfHNhbnN8c2FzfHNlY291cnN8c2Vuc3xzb3VyaXN8c3VjY8Ooc3x0YWx1c3x0YXBpc3x0YXN8dGF1ZGlzfHRlbXBzfHRpZXJzfHVuaXZlcnN8dmVsb3Vyc3x2ZXJnbGFzfHZlcm5pc3x2aXJ1cykkL2knOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNpbmd1bGFyaXplKHN0cmluZyAkcGx1cmFsKTogYXJyYXkKewppZiAoJHRoaXMtPmlzSW5mbGVjdGVkV29yZCgkcGx1cmFsKSkgewpyZXR1cm4gWyRwbHVyYWxdOwp9Cgpmb3JlYWNoIChzZWxmOjpTSU5HVUxBUklaRV9SRUdFWFAgYXMgJHJ1bGUpIHsKWyRyZWdleHAsICRyZXBsYWNlXSA9ICRydWxlOwoKaWYgKDEgPT09IHByZWdfbWF0Y2goJHJlZ2V4cCwgJHBsdXJhbCkpIHsKcmV0dXJuIFtwcmVnX3JlcGxhY2UoJHJlZ2V4cCwgJHJlcGxhY2UsICRwbHVyYWwpXTsKfQp9CgpyZXR1cm4gWyRwbHVyYWxdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcGx1cmFsaXplKHN0cmluZyAkc2luZ3VsYXIpOiBhcnJheQp7CmlmICgkdGhpcy0+aXNJbmZsZWN0ZWRXb3JkKCRzaW5ndWxhcikpIHsKcmV0dXJuIFskc2luZ3VsYXJdOwp9Cgpmb3JlYWNoIChzZWxmOjpQTFVSQUxJWkVfUkVHRVhQIGFzICRydWxlKSB7ClskcmVnZXhwLCAkcmVwbGFjZV0gPSAkcnVsZTsKCmlmICgxID09PSBwcmVnX21hdGNoKCRyZWdleHAsICRzaW5ndWxhcikpIHsKcmV0dXJuIFtwcmVnX3JlcGxhY2UoJHJlZ2V4cCwgJHJlcGxhY2UsICRzaW5ndWxhcildOwp9Cn0KCnJldHVybiBbJHNpbmd1bGFyLidzJ107Cn0KCnByaXZhdGUgZnVuY3Rpb24gaXNJbmZsZWN0ZWRXb3JkKHN0cmluZyAkd29yZCk6IGJvb2wKewpyZXR1cm4gMSA9PT0gcHJlZ19tYXRjaChzZWxmOjpVTklORkxFQ1RFRCwgJHdvcmQpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcSW5mbGVjdG9yOwoKaW50ZXJmYWNlIEluZmxlY3RvckludGVyZmFjZQp7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2luZ3VsYXJpemUoc3RyaW5nICRwbHVyYWwpOiBhcnJheTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcGx1cmFsaXplKHN0cmluZyAkc2luZ3VsYXIpOiBhcnJheTsKfQoKQ29weXJpZ2h0IChjKSAyMDE5LXByZXNlbnQgRmFiaWVuIFBvdGVuY2llcgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAp0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KCjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nOwoKCgoKCgpjbGFzcyBMYXp5U3RyaW5nIGltcGxlbWVudHMgXFN0cmluZ2FibGUsIFxKc29uU2VyaWFsaXphYmxlCnsKcHJpdmF0ZSAkdmFsdWU7CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnJvbUNhbGxhYmxlKCRjYWxsYmFjaywgLi4uJGFyZ3VtZW50cyk6IHNlbGYKewppZiAoIVxpc19jYWxsYWJsZSgkY2FsbGJhY2spICYmICEoXGlzX2FycmF5KCRjYWxsYmFjaykgJiYgaXNzZXQoJGNhbGxiYWNrWzBdKSAmJiAkY2FsbGJhY2tbMF0gaW5zdGFuY2VvZiBcQ2xvc3VyZSAmJiAyID49IFxjb3VudCgkY2FsbGJhY2spKSkgewp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKCdBcmd1bWVudCAxIHBhc3NlZCB0byAiJXMoKSIgbXVzdCBiZSBhIGNhbGxhYmxlIG9yIGEgW0Nsb3N1cmUsIG1ldGhvZF0gbGF6eS1jYWxsYWJsZSwgIiVzIiBnaXZlbi4nLCBfX01FVEhPRF9fLCBnZXRfZGVidWdfdHlwZSgkY2FsbGJhY2spKSk7Cn0KCiRsYXp5U3RyaW5nID0gbmV3IHN0YXRpYygpOwokbGF6eVN0cmluZy0+dmFsdWUgPSBzdGF0aWMgZnVuY3Rpb24gKCkgdXNlICgmJGNhbGxiYWNrLCAmJGFyZ3VtZW50cywgJiR2YWx1ZSk6IHN0cmluZyB7CmlmIChudWxsICE9PSAkYXJndW1lbnRzKSB7CmlmICghXGlzX2NhbGxhYmxlKCRjYWxsYmFjaykpIHsKJGNhbGxiYWNrWzBdID0gJGNhbGxiYWNrWzBdKCk7CiRjYWxsYmFja1sxXSA9ICRjYWxsYmFja1sxXSA/PyAnX19pbnZva2UnOwp9CiR2YWx1ZSA9ICRjYWxsYmFjayguLi4kYXJndW1lbnRzKTsKJGNhbGxiYWNrID0gc2VsZjo6Z2V0UHJldHR5TmFtZSgkY2FsbGJhY2spOwokYXJndW1lbnRzID0gbnVsbDsKfQoKcmV0dXJuICR2YWx1ZSA/PyAnJzsKfTsKCnJldHVybiAkbGF6eVN0cmluZzsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21TdHJpbmdhYmxlKCR2YWx1ZSk6IHNlbGYKewppZiAoIXNlbGY6OmlzU3RyaW5nYWJsZSgkdmFsdWUpKSB7CnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoJ0FyZ3VtZW50IDEgcGFzc2VkIHRvICIlcygpIiBtdXN0IGJlIGEgc2NhbGFyIG9yIGEgc3RyaW5nYWJsZSBvYmplY3QsICIlcyIgZ2l2ZW4uJywgX19NRVRIT0RfXywgZ2V0X2RlYnVnX3R5cGUoJHZhbHVlKSkpOwp9CgppZiAoXGlzX29iamVjdCgkdmFsdWUpKSB7CnJldHVybiBzdGF0aWM6OmZyb21DYWxsYWJsZShbJHZhbHVlLCAnX190b1N0cmluZyddKTsKfQoKJGxhenlTdHJpbmcgPSBuZXcgc3RhdGljKCk7CiRsYXp5U3RyaW5nLT52YWx1ZSA9IChzdHJpbmcpICR2YWx1ZTsKCnJldHVybiAkbGF6eVN0cmluZzsKfQoKCgoKZmluYWwgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1N0cmluZ2FibGUoJHZhbHVlKTogYm9vbAp7CnJldHVybiBcaXNfc3RyaW5nKCR2YWx1ZSkgfHwgJHZhbHVlIGluc3RhbmNlb2Ygc2VsZiB8fCAoXGlzX29iamVjdCgkdmFsdWUpID8gbWV0aG9kX2V4aXN0cygkdmFsdWUsICdfX3RvU3RyaW5nJykgOiBcaXNfc2NhbGFyKCR2YWx1ZSkpOwp9CgoKCgoKCgoKZmluYWwgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXNvbHZlKCR2YWx1ZSk6IHN0cmluZwp7CnJldHVybiAkdmFsdWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCkKewppZiAoXGlzX3N0cmluZygkdGhpcy0+dmFsdWUpKSB7CnJldHVybiAkdGhpcy0+dmFsdWU7Cn0KCnRyeSB7CnJldHVybiAkdGhpcy0+dmFsdWUgPSAoJHRoaXMtPnZhbHVlKSgpOwp9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7CmlmIChcVHlwZUVycm9yOjpjbGFzcyA9PT0gXGdldF9jbGFzcygkZSkgJiYgX19GSUxFX18gPT09ICRlLT5nZXRGaWxlKCkpIHsKJHR5cGUgPSBleHBsb2RlKCcsICcsICRlLT5nZXRNZXNzYWdlKCkpOwokdHlwZSA9IHN1YnN0cihhcnJheV9wb3AoJHR5cGUpLCAwLCAtXHN0cmxlbignIHJldHVybmVkJykpOwokciA9IG5ldyBcUmVmbGVjdGlvbkZ1bmN0aW9uKCR0aGlzLT52YWx1ZSk7CiRjYWxsYmFjayA9ICRyLT5nZXRTdGF0aWNWYXJpYWJsZXMoKVsnY2FsbGJhY2snXTsKCiRlID0gbmV3IFxUeXBlRXJyb3Ioc3ByaW50ZignUmV0dXJuIHZhbHVlIG9mICVzKCkgcGFzc2VkIHRvICVzOjpmcm9tQ2FsbGFibGUoKSBtdXN0IGJlIG9mIHRoZSB0eXBlIHN0cmluZywgJXMgcmV0dXJuZWQuJywgJGNhbGxiYWNrLCBzdGF0aWM6OmNsYXNzLCAkdHlwZSkpOwp9CgppZiAoXFBIUF9WRVJTSU9OX0lEIDwgNzA0MDApIHsKCnJldHVybiB0cmlnZ2VyX2Vycm9yKCRlLCBcRV9VU0VSX0VSUk9SKTsKfQoKdGhyb3cgJGU7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIF9fc2xlZXAoKTogYXJyYXkKewokdGhpcy0+X190b1N0cmluZygpOwoKcmV0dXJuIFsndmFsdWUnXTsKfQoKcHVibGljIGZ1bmN0aW9uIGpzb25TZXJpYWxpemUoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5fX3RvU3RyaW5nKCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldFByZXR0eU5hbWUoY2FsbGFibGUgJGNhbGxiYWNrKTogc3RyaW5nCnsKaWYgKFxpc19zdHJpbmcoJGNhbGxiYWNrKSkgewpyZXR1cm4gJGNhbGxiYWNrOwp9CgppZiAoXGlzX2FycmF5KCRjYWxsYmFjaykpIHsKJGNsYXNzID0gXGlzX29iamVjdCgkY2FsbGJhY2tbMF0pID8gZ2V0X2RlYnVnX3R5cGUoJGNhbGxiYWNrWzBdKSA6ICRjYWxsYmFja1swXTsKJG1ldGhvZCA9ICRjYWxsYmFja1sxXTsKfSBlbHNlaWYgKCRjYWxsYmFjayBpbnN0YW5jZW9mIFxDbG9zdXJlKSB7CiRyID0gbmV3IFxSZWZsZWN0aW9uRnVuY3Rpb24oJGNhbGxiYWNrKTsKCmlmIChzdHJfY29udGFpbnMoJHItPm5hbWUsICd7Y2xvc3VyZScpIHx8ICEkY2xhc3MgPSBcUEhQX1ZFUlNJT05fSUQgPj0gODAxMTEgPyAkci0+Z2V0Q2xvc3VyZUNhbGxlZENsYXNzKCkgOiAkci0+Z2V0Q2xvc3VyZVNjb3BlQ2xhc3MoKSkgewpyZXR1cm4gJHItPm5hbWU7Cn0KCiRjbGFzcyA9ICRjbGFzcy0+bmFtZTsKJG1ldGhvZCA9ICRyLT5uYW1lOwp9IGVsc2UgewokY2xhc3MgPSBnZXRfZGVidWdfdHlwZSgkY2FsbGJhY2spOwokbWV0aG9kID0gJ19faW52b2tlJzsKfQoKcmV0dXJuICRjbGFzcy4nOjonLiRtZXRob2Q7Cn0KfQo8P3BocAoKCgoKCgoKCnJldHVybiBbClsKNDM1MiwKNDQ0NywKXSwKWwo4OTg2LAo4OTg3LApdLApbCjkwMDEsCjkwMDEsCl0sClsKOTAwMiwKOTAwMiwKXSwKWwo5MTkzLAo5MTk2LApdLApbCjkyMDAsCjkyMDAsCl0sClsKOTIwMywKOTIwMywKXSwKWwo5NzI1LAo5NzI2LApdLApbCjk3NDgsCjk3NDksCl0sClsKOTc3NiwKOTc4MywKXSwKWwo5ODAwLAo5ODExLApdLApbCjk4NTUsCjk4NTUsCl0sClsKOTg2NiwKOTg3MSwKXSwKWwo5ODc1LAo5ODc1LApdLApbCjk4ODksCjk4ODksCl0sClsKOTg5OCwKOTg5OSwKXSwKWwo5OTE3LAo5OTE4LApdLApbCjk5MjQsCjk5MjUsCl0sClsKOTkzNCwKOTkzNCwKXSwKWwo5OTQwLAo5OTQwLApdLApbCjk5NjIsCjk5NjIsCl0sClsKOTk3MCwKOTk3MSwKXSwKWwo5OTczLAo5OTczLApdLApbCjk5NzgsCjk5NzgsCl0sClsKOTk4MSwKOTk4MSwKXSwKWwo5OTg5LAo5OTg5LApdLApbCjk5OTQsCjk5OTUsCl0sClsKMTAwMjQsCjEwMDI0LApdLApbCjEwMDYwLAoxMDA2MCwKXSwKWwoxMDA2MiwKMTAwNjIsCl0sClsKMTAwNjcsCjEwMDY5LApdLApbCjEwMDcxLAoxMDA3MSwKXSwKWwoxMDEzMywKMTAxMzUsCl0sClsKMTAxNjAsCjEwMTYwLApdLApbCjEwMTc1LAoxMDE3NSwKXSwKWwoxMTAzNSwKMTEwMzYsCl0sClsKMTEwODgsCjExMDg4LApdLApbCjExMDkzLAoxMTA5MywKXSwKWwoxMTkwNCwKMTE5MjksCl0sClsKMTE5MzEsCjEyMDE5LApdLApbCjEyMDMyLAoxMjI0NSwKXSwKWwoxMjI3MiwKMTIyODcsCl0sClsKMTIyODgsCjEyMjg4LApdLApbCjEyMjg5LAoxMjI5MSwKXSwKWwoxMjI5MiwKMTIyOTIsCl0sClsKMTIyOTMsCjEyMjkzLApdLApbCjEyMjk0LAoxMjI5NCwKXSwKWwoxMjI5NSwKMTIyOTUsCl0sClsKMTIyOTYsCjEyMjk2LApdLApbCjEyMjk3LAoxMjI5NywKXSwKWwoxMjI5OCwKMTIyOTgsCl0sClsKMTIyOTksCjEyMjk5LApdLApbCjEyMzAwLAoxMjMwMCwKXSwKWwoxMjMwMSwKMTIzMDEsCl0sClsKMTIzMDIsCjEyMzAyLApdLApbCjEyMzAzLAoxMjMwMywKXSwKWwoxMjMwNCwKMTIzMDQsCl0sClsKMTIzMDUsCjEyMzA1LApdLApbCjEyMzA2LAoxMjMwNywKXSwKWwoxMjMwOCwKMTIzMDgsCl0sClsKMTIzMDksCjEyMzA5LApdLApbCjEyMzEwLAoxMjMxMCwKXSwKWwoxMjMxMSwKMTIzMTEsCl0sClsKMTIzMTIsCjEyMzEyLApdLApbCjEyMzEzLAoxMjMxMywKXSwKWwoxMjMxNCwKMTIzMTQsCl0sClsKMTIzMTUsCjEyMzE1LApdLApbCjEyMzE2LAoxMjMxNiwKXSwKWwoxMjMxNywKMTIzMTcsCl0sClsKMTIzMTgsCjEyMzE5LApdLApbCjEyMzIwLAoxMjMyMCwKXSwKWwoxMjMyMSwKMTIzMjksCl0sClsKMTIzMzAsCjEyMzMzLApdLApbCjEyMzM0LAoxMjMzNSwKXSwKWwoxMjMzNiwKMTIzMzYsCl0sClsKMTIzMzcsCjEyMzQxLApdLApbCjEyMzQyLAoxMjM0MywKXSwKWwoxMjM0NCwKMTIzNDYsCl0sClsKMTIzNDcsCjEyMzQ3LApdLApbCjEyMzQ4LAoxMjM0OCwKXSwKWwoxMjM0OSwKMTIzNDksCl0sClsKMTIzNTAsCjEyMzUwLApdLApbCjEyMzUzLAoxMjQzOCwKXSwKWwoxMjQ0MSwKMTI0NDIsCl0sClsKMTI0NDMsCjEyNDQ0LApdLApbCjEyNDQ1LAoxMjQ0NiwKXSwKWwoxMjQ0NywKMTI0NDcsCl0sClsKMTI0NDgsCjEyNDQ4LApdLApbCjEyNDQ5LAoxMjUzOCwKXSwKWwoxMjUzOSwKMTI1MzksCl0sClsKMTI1NDAsCjEyNTQyLApdLApbCjEyNTQzLAoxMjU0MywKXSwKWwoxMjU0OSwKMTI1OTEsCl0sClsKMTI1OTMsCjEyNjg2LApdLApbCjEyNjg4LAoxMjY4OSwKXSwKWwoxMjY5MCwKMTI2OTMsCl0sClsKMTI2OTQsCjEyNzAzLApdLApbCjEyNzA0LAoxMjczNSwKXSwKWwoxMjczNiwKMTI3NzMsCl0sClsKMTI3ODMsCjEyNzgzLApdLApbCjEyNzg0LAoxMjc5OSwKXSwKWwoxMjgwMCwKMTI4MzAsCl0sClsKMTI4MzIsCjEyODQxLApdLApbCjEyODQyLAoxMjg3MSwKXSwKWwoxMjg4MCwKMTI4ODAsCl0sClsKMTI4ODEsCjEyODk1LApdLApbCjEyODk2LAoxMjkyNywKXSwKWwoxMjkyOCwKMTI5MzcsCl0sClsKMTI5MzgsCjEyOTc2LApdLApbCjEyOTc3LAoxMjk5MSwKXSwKWwoxMjk5MiwKMTMwNTUsCl0sClsKMTMwNTYsCjEzMzExLApdLApbCjEzMzEyLAoxOTkwMywKXSwKWwoxOTkwNCwKMTk5NjcsCl0sClsKMTk5NjgsCjQwOTU5LApdLApbCjQwOTYwLAo0MDk4MCwKXSwKWwo0MDk4MSwKNDA5ODEsCl0sClsKNDA5ODIsCjQyMTI0LApdLApbCjQyMTI4LAo0MjE4MiwKXSwKWwo0MzM2MCwKNDMzODgsCl0sClsKNDQwMzIsCjU1MjAzLApdLApbCjYzNzQ0LAo2NDEwOSwKXSwKWwo2NDExMCwKNjQxMTEsCl0sClsKNjQxMTIsCjY0MjE3LApdLApbCjY0MjE4LAo2NDI1NSwKXSwKWwo2NTA0MCwKNjUwNDYsCl0sClsKNjUwNDcsCjY1MDQ3LApdLApbCjY1MDQ4LAo2NTA0OCwKXSwKWwo2NTA0OSwKNjUwNDksCl0sClsKNjUwNzIsCjY1MDcyLApdLApbCjY1MDczLAo2NTA3NCwKXSwKWwo2NTA3NSwKNjUwNzYsCl0sClsKNjUwNzcsCjY1MDc3LApdLApbCjY1MDc4LAo2NTA3OCwKXSwKWwo2NTA3OSwKNjUwNzksCl0sClsKNjUwODAsCjY1MDgwLApdLApbCjY1MDgxLAo2NTA4MSwKXSwKWwo2NTA4MiwKNjUwODIsCl0sClsKNjUwODMsCjY1MDgzLApdLApbCjY1MDg0LAo2NTA4NCwKXSwKWwo2NTA4NSwKNjUwODUsCl0sClsKNjUwODYsCjY1MDg2LApdLApbCjY1MDg3LAo2NTA4NywKXSwKWwo2NTA4OCwKNjUwODgsCl0sClsKNjUwODksCjY1MDg5LApdLApbCjY1MDkwLAo2NTA5MCwKXSwKWwo2NTA5MSwKNjUwOTEsCl0sClsKNjUwOTIsCjY1MDkyLApdLApbCjY1MDkzLAo2NTA5NCwKXSwKWwo2NTA5NSwKNjUwOTUsCl0sClsKNjUwOTYsCjY1MDk2LApdLApbCjY1MDk3LAo2NTEwMCwKXSwKWwo2NTEwMSwKNjUxMDMsCl0sClsKNjUxMDQsCjY1MTA2LApdLApbCjY1MTA4LAo2NTExMSwKXSwKWwo2NTExMiwKNjUxMTIsCl0sClsKNjUxMTMsCjY1MTEzLApdLApbCjY1MTE0LAo2NTExNCwKXSwKWwo2NTExNSwKNjUxMTUsCl0sClsKNjUxMTYsCjY1MTE2LApdLApbCjY1MTE3LAo2NTExNywKXSwKWwo2NTExOCwKNjUxMTgsCl0sClsKNjUxMTksCjY1MTIxLApdLApbCjY1MTIyLAo2NTEyMiwKXSwKWwo2NTEyMywKNjUxMjMsCl0sClsKNjUxMjQsCjY1MTI2LApdLApbCjY1MTI4LAo2NTEyOCwKXSwKWwo2NTEyOSwKNjUxMjksCl0sClsKNjUxMzAsCjY1MTMxLApdLApbCjY1MjgxLAo2NTI4MywKXSwKWwo2NTI4NCwKNjUyODQsCl0sClsKNjUyODUsCjY1Mjg3LApdLApbCjY1Mjg4LAo2NTI4OCwKXSwKWwo2NTI4OSwKNjUyODksCl0sClsKNjUyOTAsCjY1MjkwLApdLApbCjY1MjkxLAo2NTI5MSwKXSwKWwo2NTI5MiwKNjUyOTIsCl0sClsKNjUyOTMsCjY1MjkzLApdLApbCjY1Mjk0LAo2NTI5NSwKXSwKWwo2NTI5NiwKNjUzMDUsCl0sClsKNjUzMDYsCjY1MzA3LApdLApbCjY1MzA4LAo2NTMxMCwKXSwKWwo2NTMxMSwKNjUzMTIsCl0sClsKNjUzMTMsCjY1MzM4LApdLApbCjY1MzM5LAo2NTMzOSwKXSwKWwo2NTM0MCwKNjUzNDAsCl0sClsKNjUzNDEsCjY1MzQxLApdLApbCjY1MzQyLAo2NTM0MiwKXSwKWwo2NTM0MywKNjUzNDMsCl0sClsKNjUzNDQsCjY1MzQ0LApdLApbCjY1MzQ1LAo2NTM3MCwKXSwKWwo2NTM3MSwKNjUzNzEsCl0sClsKNjUzNzIsCjY1MzcyLApdLApbCjY1MzczLAo2NTM3MywKXSwKWwo2NTM3NCwKNjUzNzQsCl0sClsKNjUzNzUsCjY1Mzc1LApdLApbCjY1Mzc2LAo2NTM3NiwKXSwKWwo2NTUwNCwKNjU1MDUsCl0sClsKNjU1MDYsCjY1NTA2LApdLApbCjY1NTA3LAo2NTUwNywKXSwKWwo2NTUwOCwKNjU1MDgsCl0sClsKNjU1MDksCjY1NTEwLApdLApbCjk0MTc2LAo5NDE3NywKXSwKWwo5NDE3OCwKOTQxNzgsCl0sClsKOTQxNzksCjk0MTc5LApdLApbCjk0MTgwLAo5NDE4MCwKXSwKWwo5NDE5MiwKOTQxOTMsCl0sClsKOTQyMDgsCjEwMDM0MywKXSwKWwoxMDAzNTIsCjEwMTExOSwKXSwKWwoxMDExMjAsCjEwMTU4OSwKXSwKWwoxMDE2MzEsCjEwMTYzMSwKXSwKWwoxMDE2MzIsCjEwMTY0MCwKXSwKWwoxMTA1NzYsCjExMDU3OSwKXSwKWwoxMTA1ODEsCjExMDU4NywKXSwKWwoxMTA1ODksCjExMDU5MCwKXSwKWwoxMTA1OTIsCjExMDg0NywKXSwKWwoxMTA4NDgsCjExMDg4MiwKXSwKWwoxMTA4OTgsCjExMDg5OCwKXSwKWwoxMTA5MjgsCjExMDkzMCwKXSwKWwoxMTA5MzMsCjExMDkzMywKXSwKWwoxMTA5NDgsCjExMDk1MSwKXSwKWwoxMTA5NjAsCjExMTM1NSwKXSwKWwoxMTk1NTIsCjExOTYzOCwKXSwKWwoxMTk2NDgsCjExOTY3MCwKXSwKWwoxMjY5ODAsCjEyNjk4MCwKXSwKWwoxMjcxODMsCjEyNzE4MywKXSwKWwoxMjczNzQsCjEyNzM3NCwKXSwKWwoxMjczNzcsCjEyNzM4NiwKXSwKWwoxMjc0ODgsCjEyNzQ5MCwKXSwKWwoxMjc1MDQsCjEyNzU0NywKXSwKWwoxMjc1NTIsCjEyNzU2MCwKXSwKWwoxMjc1NjgsCjEyNzU2OSwKXSwKWwoxMjc1ODQsCjEyNzU4OSwKXSwKWwoxMjc3NDQsCjEyNzc3NiwKXSwKWwoxMjc3ODksCjEyNzc5NywKXSwKWwoxMjc3OTksCjEyNzg2OCwKXSwKWwoxMjc4NzAsCjEyNzg5MSwKXSwKWwoxMjc5MDQsCjEyNzk0NiwKXSwKWwoxMjc5NTEsCjEyNzk1NSwKXSwKWwoxMjc5NjgsCjEyNzk4NCwKXSwKWwoxMjc5ODgsCjEyNzk4OCwKXSwKWwoxMjc5OTIsCjEyNzk5NCwKXSwKWwoxMjc5OTUsCjEyNzk5OSwKXSwKWwoxMjgwMDAsCjEyODA2MiwKXSwKWwoxMjgwNjQsCjEyODA2NCwKXSwKWwoxMjgwNjYsCjEyODI1MiwKXSwKWwoxMjgyNTUsCjEyODMxNywKXSwKWwoxMjgzMzEsCjEyODMzNCwKXSwKWwoxMjgzMzYsCjEyODM1OSwKXSwKWwoxMjgzNzgsCjEyODM3OCwKXSwKWwoxMjg0MDUsCjEyODQwNiwKXSwKWwoxMjg0MjAsCjEyODQyMCwKXSwKWwoxMjg1MDcsCjEyODUxMSwKXSwKWwoxMjg1MTIsCjEyODU5MSwKXSwKWwoxMjg2NDAsCjEyODcwOSwKXSwKWwoxMjg3MTYsCjEyODcxNiwKXSwKWwoxMjg3MjAsCjEyODcyMiwKXSwKWwoxMjg3MjUsCjEyODcyNywKXSwKWwoxMjg3MzIsCjEyODczNSwKXSwKWwoxMjg3NDcsCjEyODc0OCwKXSwKWwoxMjg3NTYsCjEyODc2NCwKXSwKWwoxMjg5OTIsCjEyOTAwMywKXSwKWwoxMjkwMDgsCjEyOTAwOCwKXSwKWwoxMjkyOTIsCjEyOTMzOCwKXSwKWwoxMjkzNDAsCjEyOTM0OSwKXSwKWwoxMjkzNTEsCjEyOTUzNSwKXSwKWwoxMjk2NDgsCjEyOTY2MCwKXSwKWwoxMjk2NjQsCjEyOTY3MywKXSwKWwoxMjk2NzksCjEyOTczNCwKXSwKWwoxMjk3NDIsCjEyOTc1NiwKXSwKWwoxMjk3NTksCjEyOTc2OSwKXSwKWwoxMjk3NzYsCjEyOTc4NCwKXSwKWwoxMzEwNzIsCjE3Mzc5MSwKXSwKWwoxNzM3OTIsCjE3MzgyMywKXSwKWwoxNzM4MjQsCjE3Nzk3NywKXSwKWwoxNzc5NzgsCjE3Nzk4MywKXSwKWwoxNzc5ODQsCjE3ODIwNSwKXSwKWwoxNzgyMDYsCjE3ODIwNywKXSwKWwoxNzgyMDgsCjE4Mzk2OSwKXSwKWwoxODM5NzAsCjE4Mzk4MywKXSwKWwoxODM5ODQsCjE5MTQ1NiwKXSwKWwoxOTE0NTcsCjE5MTQ3MSwKXSwKWwoxOTE0NzIsCjE5MjA5MywKXSwKWwoxOTIwOTQsCjE5NDU1OSwKXSwKWwoxOTQ1NjAsCjE5NTEwMSwKXSwKWwoxOTUxMDIsCjE5NTEwMywKXSwKWwoxOTUxMDQsCjE5NjYwNSwKXSwKWwoxOTY2MDgsCjIwMTU0NiwKXSwKWwoyMDE1NDcsCjIwMTU1MSwKXSwKWwoyMDE1NTIsCjIwNTc0MywKXSwKWwoyMDU3NDQsCjI2MjE0MSwKXSwKXTsKPD9waHAKCgoKCgoKCgpyZXR1cm4gWwpbCjc2OCwKODc5LApdLApbCjExNTUsCjExNTksCl0sClsKMTE2MCwKMTE2MSwKXSwKWwoxNDI1LAoxNDY5LApdLApbCjE0NzEsCjE0NzEsCl0sClsKMTQ3MywKMTQ3NCwKXSwKWwoxNDc2LAoxNDc3LApdLApbCjE0NzksCjE0NzksCl0sClsKMTU1MiwKMTU2MiwKXSwKWwoxNjExLAoxNjMxLApdLApbCjE2NDgsCjE2NDgsCl0sClsKMTc1MCwKMTc1NiwKXSwKWwoxNzU5LAoxNzY0LApdLApbCjE3NjcsCjE3NjgsCl0sClsKMTc3MCwKMTc3MywKXSwKWwoxODA5LAoxODA5LApdLApbCjE4NDAsCjE4NjYsCl0sClsKMTk1OCwKMTk2OCwKXSwKWwoyMDI3LAoyMDM1LApdLApbCjIwNDUsCjIwNDUsCl0sClsKMjA3MCwKMjA3MywKXSwKWwoyMDc1LAoyMDgzLApdLApbCjIwODUsCjIwODcsCl0sClsKMjA4OSwKMjA5MywKXSwKWwoyMTM3LAoyMTM5LApdLApbCjIxOTksCjIyMDcsCl0sClsKMjI1MCwKMjI3MywKXSwKWwoyMjc1LAoyMzA2LApdLApbCjIzNjIsCjIzNjIsCl0sClsKMjM2NCwKMjM2NCwKXSwKWwoyMzY5LAoyMzc2LApdLApbCjIzODEsCjIzODEsCl0sClsKMjM4NSwKMjM5MSwKXSwKWwoyNDAyLAoyNDAzLApdLApbCjI0MzMsCjI0MzMsCl0sClsKMjQ5MiwKMjQ5MiwKXSwKWwoyNDk3LAoyNTAwLApdLApbCjI1MDksCjI1MDksCl0sClsKMjUzMCwKMjUzMSwKXSwKWwoyNTU4LAoyNTU4LApdLApbCjI1NjEsCjI1NjIsCl0sClsKMjYyMCwKMjYyMCwKXSwKWwoyNjI1LAoyNjI2LApdLApbCjI2MzEsCjI2MzIsCl0sClsKMjYzNSwKMjYzNywKXSwKWwoyNjQxLAoyNjQxLApdLApbCjI2NzIsCjI2NzMsCl0sClsKMjY3NywKMjY3NywKXSwKWwoyNjg5LAoyNjkwLApdLApbCjI3NDgsCjI3NDgsCl0sClsKMjc1MywKMjc1NywKXSwKWwoyNzU5LAoyNzYwLApdLApbCjI3NjUsCjI3NjUsCl0sClsKMjc4NiwKMjc4NywKXSwKWwoyODEwLAoyODE1LApdLApbCjI4MTcsCjI4MTcsCl0sClsKMjg3NiwKMjg3NiwKXSwKWwoyODc5LAoyODc5LApdLApbCjI4ODEsCjI4ODQsCl0sClsKMjg5MywKMjg5MywKXSwKWwoyOTAxLAoyOTAyLApdLApbCjI5MTQsCjI5MTUsCl0sClsKMjk0NiwKMjk0NiwKXSwKWwozMDA4LAozMDA4LApdLApbCjMwMjEsCjMwMjEsCl0sClsKMzA3MiwKMzA3MiwKXSwKWwozMDc2LAozMDc2LApdLApbCjMxMzIsCjMxMzIsCl0sClsKMzEzNCwKMzEzNiwKXSwKWwozMTQyLAozMTQ0LApdLApbCjMxNDYsCjMxNDksCl0sClsKMzE1NywKMzE1OCwKXSwKWwozMTcwLAozMTcxLApdLApbCjMyMDEsCjMyMDEsCl0sClsKMzI2MCwKMzI2MCwKXSwKWwozMjYzLAozMjYzLApdLApbCjMyNzAsCjMyNzAsCl0sClsKMzI3NiwKMzI3NywKXSwKWwozMjk4LAozMjk5LApdLApbCjMzMjgsCjMzMjksCl0sClsKMzM4NywKMzM4OCwKXSwKWwozMzkzLAozMzk2LApdLApbCjM0MDUsCjM0MDUsCl0sClsKMzQyNiwKMzQyNywKXSwKWwozNDU3LAozNDU3LApdLApbCjM1MzAsCjM1MzAsCl0sClsKMzUzOCwKMzU0MCwKXSwKWwozNTQyLAozNTQyLApdLApbCjM2MzMsCjM2MzMsCl0sClsKMzYzNiwKMzY0MiwKXSwKWwozNjU1LAozNjYyLApdLApbCjM3NjEsCjM3NjEsCl0sClsKMzc2NCwKMzc3MiwKXSwKWwozNzg0LAozNzkwLApdLApbCjM4NjQsCjM4NjUsCl0sClsKMzg5MywKMzg5MywKXSwKWwozODk1LAozODk1LApdLApbCjM4OTcsCjM4OTcsCl0sClsKMzk1MywKMzk2NiwKXSwKWwozOTY4LAozOTcyLApdLApbCjM5NzQsCjM5NzUsCl0sClsKMzk4MSwKMzk5MSwKXSwKWwozOTkzLAo0MDI4LApdLApbCjQwMzgsCjQwMzgsCl0sClsKNDE0MSwKNDE0NCwKXSwKWwo0MTQ2LAo0MTUxLApdLApbCjQxNTMsCjQxNTQsCl0sClsKNDE1NywKNDE1OCwKXSwKWwo0MTg0LAo0MTg1LApdLApbCjQxOTAsCjQxOTIsCl0sClsKNDIwOSwKNDIxMiwKXSwKWwo0MjI2LAo0MjI2LApdLApbCjQyMjksCjQyMzAsCl0sClsKNDIzNywKNDIzNywKXSwKWwo0MjUzLAo0MjUzLApdLApbCjQ5NTcsCjQ5NTksCl0sClsKNTkwNiwKNTkwOCwKXSwKWwo1OTM4LAo1OTM5LApdLApbCjU5NzAsCjU5NzEsCl0sClsKNjAwMiwKNjAwMywKXSwKWwo2MDY4LAo2MDY5LApdLApbCjYwNzEsCjYwNzcsCl0sClsKNjA4NiwKNjA4NiwKXSwKWwo2MDg5LAo2MDk5LApdLApbCjYxMDksCjYxMDksCl0sClsKNjE1NSwKNjE1NywKXSwKWwo2MTU5LAo2MTU5LApdLApbCjYyNzcsCjYyNzgsCl0sClsKNjMxMywKNjMxMywKXSwKWwo2NDMyLAo2NDM0LApdLApbCjY0MzksCjY0NDAsCl0sClsKNjQ1MCwKNjQ1MCwKXSwKWwo2NDU3LAo2NDU5LApdLApbCjY2NzksCjY2ODAsCl0sClsKNjY4MywKNjY4MywKXSwKWwo2NzQyLAo2NzQyLApdLApbCjY3NDQsCjY3NTAsCl0sClsKNjc1MiwKNjc1MiwKXSwKWwo2NzU0LAo2NzU0LApdLApbCjY3NTcsCjY3NjQsCl0sClsKNjc3MSwKNjc4MCwKXSwKWwo2NzgzLAo2NzgzLApdLApbCjY4MzIsCjY4NDUsCl0sClsKNjg0NiwKNjg0NiwKXSwKWwo2ODQ3LAo2ODYyLApdLApbCjY5MTIsCjY5MTUsCl0sClsKNjk2NCwKNjk2NCwKXSwKWwo2OTY2LAo2OTcwLApdLApbCjY5NzIsCjY5NzIsCl0sClsKNjk3OCwKNjk3OCwKXSwKWwo3MDE5LAo3MDI3LApdLApbCjcwNDAsCjcwNDEsCl0sClsKNzA3NCwKNzA3NywKXSwKWwo3MDgwLAo3MDgxLApdLApbCjcwODMsCjcwODUsCl0sClsKNzE0MiwKNzE0MiwKXSwKWwo3MTQ0LAo3MTQ1LApdLApbCjcxNDksCjcxNDksCl0sClsKNzE1MSwKNzE1MywKXSwKWwo3MjEyLAo3MjE5LApdLApbCjcyMjIsCjcyMjMsCl0sClsKNzM3NiwKNzM3OCwKXSwKWwo3MzgwLAo3MzkyLApdLApbCjczOTQsCjc0MDAsCl0sClsKNzQwNSwKNzQwNSwKXSwKWwo3NDEyLAo3NDEyLApdLApbCjc0MTYsCjc0MTcsCl0sClsKNzYxNiwKNzY3OSwKXSwKWwo4NDAwLAo4NDEyLApdLApbCjg0MTMsCjg0MTYsCl0sClsKODQxNywKODQxNywKXSwKWwo4NDE4LAo4NDIwLApdLApbCjg0MjEsCjg0MzIsCl0sClsKMTE1MDMsCjExNTA1LApdLApbCjExNjQ3LAoxMTY0NywKXSwKWwoxMTc0NCwKMTE3NzUsCl0sClsKMTIzMzAsCjEyMzMzLApdLApbCjEyNDQxLAoxMjQ0MiwKXSwKWwo0MjYwNywKNDI2MDcsCl0sClsKNDI2MDgsCjQyNjEwLApdLApbCjQyNjEyLAo0MjYyMSwKXSwKWwo0MjY1NCwKNDI2NTUsCl0sClsKNDI3MzYsCjQyNzM3LApdLApbCjQzMDEwLAo0MzAxMCwKXSwKWwo0MzAxNCwKNDMwMTQsCl0sClsKNDMwMTksCjQzMDE5LApdLApbCjQzMDQ1LAo0MzA0NiwKXSwKWwo0MzA1MiwKNDMwNTIsCl0sClsKNDMyMDQsCjQzMjA1LApdLApbCjQzMjMyLAo0MzI0OSwKXSwKWwo0MzI2MywKNDMyNjMsCl0sClsKNDMzMDIsCjQzMzA5LApdLApbCjQzMzM1LAo0MzM0NSwKXSwKWwo0MzM5MiwKNDMzOTQsCl0sClsKNDM0NDMsCjQzNDQzLApdLApbCjQzNDQ2LAo0MzQ0OSwKXSwKWwo0MzQ1MiwKNDM0NTMsCl0sClsKNDM0OTMsCjQzNDkzLApdLApbCjQzNTYxLAo0MzU2NiwKXSwKWwo0MzU2OSwKNDM1NzAsCl0sClsKNDM1NzMsCjQzNTc0LApdLApbCjQzNTg3LAo0MzU4NywKXSwKWwo0MzU5NiwKNDM1OTYsCl0sClsKNDM2NDQsCjQzNjQ0LApdLApbCjQzNjk2LAo0MzY5NiwKXSwKWwo0MzY5OCwKNDM3MDAsCl0sClsKNDM3MDMsCjQzNzA0LApdLApbCjQzNzEwLAo0MzcxMSwKXSwKWwo0MzcxMywKNDM3MTMsCl0sClsKNDM3NTYsCjQzNzU3LApdLApbCjQzNzY2LAo0Mzc2NiwKXSwKWwo0NDAwNSwKNDQwMDUsCl0sClsKNDQwMDgsCjQ0MDA4LApdLApbCjQ0MDEzLAo0NDAxMywKXSwKWwo2NDI4NiwKNjQyODYsCl0sClsKNjUwMjQsCjY1MDM5LApdLApbCjY1MDU2LAo2NTA3MSwKXSwKWwo2NjA0NSwKNjYwNDUsCl0sClsKNjYyNzIsCjY2MjcyLApdLApbCjY2NDIyLAo2NjQyNiwKXSwKWwo2ODA5NywKNjgwOTksCl0sClsKNjgxMDEsCjY4MTAyLApdLApbCjY4MTA4LAo2ODExMSwKXSwKWwo2ODE1MiwKNjgxNTQsCl0sClsKNjgxNTksCjY4MTU5LApdLApbCjY4MzI1LAo2ODMyNiwKXSwKWwo2ODkwMCwKNjg5MDMsCl0sClsKNjg5NjksCjY4OTczLApdLApbCjY5MjkxLAo2OTI5MiwKXSwKWwo2OTM3MiwKNjkzNzUsCl0sClsKNjk0NDYsCjY5NDU2LApdLApbCjY5NTA2LAo2OTUwOSwKXSwKWwo2OTYzMywKNjk2MzMsCl0sClsKNjk2ODgsCjY5NzAyLApdLApbCjY5NzQ0LAo2OTc0NCwKXSwKWwo2OTc0NywKNjk3NDgsCl0sClsKNjk3NTksCjY5NzYxLApdLApbCjY5ODExLAo2OTgxNCwKXSwKWwo2OTgxNywKNjk4MTgsCl0sClsKNjk4MjYsCjY5ODI2LApdLApbCjY5ODg4LAo2OTg5MCwKXSwKWwo2OTkyNywKNjk5MzEsCl0sClsKNjk5MzMsCjY5OTQwLApdLApbCjcwMDAzLAo3MDAwMywKXSwKWwo3MDAxNiwKNzAwMTcsCl0sClsKNzAwNzAsCjcwMDc4LApdLApbCjcwMDg5LAo3MDA5MiwKXSwKWwo3MDA5NSwKNzAwOTUsCl0sClsKNzAxOTEsCjcwMTkzLApdLApbCjcwMTk2LAo3MDE5NiwKXSwKWwo3MDE5OCwKNzAxOTksCl0sClsKNzAyMDYsCjcwMjA2LApdLApbCjcwMjA5LAo3MDIwOSwKXSwKWwo3MDM2NywKNzAzNjcsCl0sClsKNzAzNzEsCjcwMzc4LApdLApbCjcwNDAwLAo3MDQwMSwKXSwKWwo3MDQ1OSwKNzA0NjAsCl0sClsKNzA0NjQsCjcwNDY0LApdLApbCjcwNTAyLAo3MDUwOCwKXSwKWwo3MDUxMiwKNzA1MTYsCl0sClsKNzA1ODcsCjcwNTkyLApdLApbCjcwNjA2LAo3MDYwNiwKXSwKWwo3MDYwOCwKNzA2MDgsCl0sClsKNzA2MTAsCjcwNjEwLApdLApbCjcwNjI1LAo3MDYyNiwKXSwKWwo3MDcxMiwKNzA3MTksCl0sClsKNzA3MjIsCjcwNzI0LApdLApbCjcwNzI2LAo3MDcyNiwKXSwKWwo3MDc1MCwKNzA3NTAsCl0sClsKNzA4MzUsCjcwODQwLApdLApbCjcwODQyLAo3MDg0MiwKXSwKWwo3MDg0NywKNzA4NDgsCl0sClsKNzA4NTAsCjcwODUxLApdLApbCjcxMDkwLAo3MTA5MywKXSwKWwo3MTEwMCwKNzExMDEsCl0sClsKNzExMDMsCjcxMTA0LApdLApbCjcxMTMyLAo3MTEzMywKXSwKWwo3MTIxOSwKNzEyMjYsCl0sClsKNzEyMjksCjcxMjI5LApdLApbCjcxMjMxLAo3MTIzMiwKXSwKWwo3MTMzOSwKNzEzMzksCl0sClsKNzEzNDEsCjcxMzQxLApdLApbCjcxMzQ0LAo3MTM0OSwKXSwKWwo3MTM1MSwKNzEzNTEsCl0sClsKNzE0NTMsCjcxNDUzLApdLApbCjcxNDU1LAo3MTQ1NSwKXSwKWwo3MTQ1OCwKNzE0NjEsCl0sClsKNzE0NjMsCjcxNDY3LApdLApbCjcxNzI3LAo3MTczNSwKXSwKWwo3MTczNywKNzE3MzgsCl0sClsKNzE5OTUsCjcxOTk2LApdLApbCjcxOTk4LAo3MTk5OCwKXSwKWwo3MjAwMywKNzIwMDMsCl0sClsKNzIxNDgsCjcyMTUxLApdLApbCjcyMTU0LAo3MjE1NSwKXSwKWwo3MjE2MCwKNzIxNjAsCl0sClsKNzIxOTMsCjcyMjAyLApdLApbCjcyMjQzLAo3MjI0OCwKXSwKWwo3MjI1MSwKNzIyNTQsCl0sClsKNzIyNjMsCjcyMjYzLApdLApbCjcyMjczLAo3MjI3OCwKXSwKWwo3MjI4MSwKNzIyODMsCl0sClsKNzIzMzAsCjcyMzQyLApdLApbCjcyMzQ0LAo3MjM0NSwKXSwKWwo3Mjc1MiwKNzI3NTgsCl0sClsKNzI3NjAsCjcyNzY1LApdLApbCjcyNzY3LAo3Mjc2NywKXSwKWwo3Mjg1MCwKNzI4NzEsCl0sClsKNzI4NzQsCjcyODgwLApdLApbCjcyODgyLAo3Mjg4MywKXSwKWwo3Mjg4NSwKNzI4ODYsCl0sClsKNzMwMDksCjczMDE0LApdLApbCjczMDE4LAo3MzAxOCwKXSwKWwo3MzAyMCwKNzMwMjEsCl0sClsKNzMwMjMsCjczMDI5LApdLApbCjczMDMxLAo3MzAzMSwKXSwKWwo3MzEwNCwKNzMxMDUsCl0sClsKNzMxMDksCjczMTA5LApdLApbCjczMTExLAo3MzExMSwKXSwKWwo3MzQ1OSwKNzM0NjAsCl0sClsKNzM0NzIsCjczNDczLApdLApbCjczNTI2LAo3MzUzMCwKXSwKWwo3MzUzNiwKNzM1MzYsCl0sClsKNzM1MzgsCjczNTM4LApdLApbCjczNTYyLAo3MzU2MiwKXSwKWwo3ODkxMiwKNzg5MTIsCl0sClsKNzg5MTksCjc4OTMzLApdLApbCjkwMzk4LAo5MDQwOSwKXSwKWwo5MDQxMywKOTA0MTUsCl0sClsKOTI5MTIsCjkyOTE2LApdLApbCjkyOTc2LAo5Mjk4MiwKXSwKWwo5NDAzMSwKOTQwMzEsCl0sClsKOTQwOTUsCjk0MDk4LApdLApbCjk0MTgwLAo5NDE4MCwKXSwKWwoxMTM4MjEsCjExMzgyMiwKXSwKWwoxMTg1MjgsCjExODU3MywKXSwKWwoxMTg1NzYsCjExODU5OCwKXSwKWwoxMTkxNDMsCjExOTE0NSwKXSwKWwoxMTkxNjMsCjExOTE3MCwKXSwKWwoxMTkxNzMsCjExOTE3OSwKXSwKWwoxMTkyMTAsCjExOTIxMywKXSwKWwoxMTkzNjIsCjExOTM2NCwKXSwKWwoxMjEzNDQsCjEyMTM5OCwKXSwKWwoxMjE0MDMsCjEyMTQ1MiwKXSwKWwoxMjE0NjEsCjEyMTQ2MSwKXSwKWwoxMjE0NzYsCjEyMTQ3NiwKXSwKWwoxMjE0OTksCjEyMTUwMywKXSwKWwoxMjE1MDUsCjEyMTUxOSwKXSwKWwoxMjI4ODAsCjEyMjg4NiwKXSwKWwoxMjI4ODgsCjEyMjkwNCwKXSwKWwoxMjI5MDcsCjEyMjkxMywKXSwKWwoxMjI5MTUsCjEyMjkxNiwKXSwKWwoxMjI5MTgsCjEyMjkyMiwKXSwKWwoxMjMwMjMsCjEyMzAyMywKXSwKWwoxMjMxODQsCjEyMzE5MCwKXSwKWwoxMjM1NjYsCjEyMzU2NiwKXSwKWwoxMjM2MjgsCjEyMzYzMSwKXSwKWwoxMjQxNDAsCjEyNDE0MywKXSwKWwoxMjQzOTgsCjEyNDM5OSwKXSwKWwoxMjUxMzYsCjEyNTE0MiwKXSwKWwoxMjUyNTIsCjEyNTI1OCwKXSwKWwo5MTc3NjAsCjkxNzk5OSwKXSwKXTsKPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmc7CgppZiAoIVxmdW5jdGlvbl9leGlzdHModTo6Y2xhc3MpKSB7CmZ1bmN0aW9uIHUoP3N0cmluZyAkc3RyaW5nID0gJycpOiBVbmljb2RlU3RyaW5nCnsKcmV0dXJuIG5ldyBVbmljb2RlU3RyaW5nKCRzdHJpbmcgPz8gJycpOwp9Cn0KCmlmICghXGZ1bmN0aW9uX2V4aXN0cyhiOjpjbGFzcykpIHsKZnVuY3Rpb24gYig/c3RyaW5nICRzdHJpbmcgPSAnJyk6IEJ5dGVTdHJpbmcKewpyZXR1cm4gbmV3IEJ5dGVTdHJpbmcoJHN0cmluZyA/PyAnJyk7Cn0KfQoKaWYgKCFcZnVuY3Rpb25fZXhpc3RzKHM6OmNsYXNzKSkgewoKCgpmdW5jdGlvbiBzKD9zdHJpbmcgJHN0cmluZyA9ICcnKTogQWJzdHJhY3RTdHJpbmcKewokc3RyaW5nID0gJHN0cmluZyA/PyAnJzsKCnJldHVybiBwcmVnX21hdGNoKCcvL3UnLCAkc3RyaW5nKSA/IG5ldyBVbmljb2RlU3RyaW5nKCRzdHJpbmcpIDogbmV3IEJ5dGVTdHJpbmcoJHN0cmluZyk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xTbHVnZ2VyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xBYnN0cmFjdFVuaWNvZGVTdHJpbmc7CnVzZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcVW5pY29kZVN0cmluZzsKdXNlIFN5bWZvbnlcQ29udHJhY3RzXFRyYW5zbGF0aW9uXExvY2FsZUF3YXJlSW50ZXJmYWNlOwoKaWYgKCFpbnRlcmZhY2VfZXhpc3RzKExvY2FsZUF3YXJlSW50ZXJmYWNlOjpjbGFzcykpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignWW91IGNhbm5vdCB1c2UgdGhlICJTeW1mb255XENvbXBvbmVudFxTdHJpbmdcU2x1Z2dlclxBc2NpaVNsdWdnZXIiIGFzIHRoZSAic3ltZm9ueS90cmFuc2xhdGlvbi1jb250cmFjdHMiIHBhY2thZ2UgaXMgbm90IGluc3RhbGxlZC4gVHJ5IHJ1bm5pbmcgImNvbXBvc2VyIHJlcXVpcmUgc3ltZm9ueS90cmFuc2xhdGlvbi1jb250cmFjdHMiLicpOwp9CgoKCgpjbGFzcyBBc2NpaVNsdWdnZXIgaW1wbGVtZW50cyBTbHVnZ2VySW50ZXJmYWNlLCBMb2NhbGVBd2FyZUludGVyZmFjZQp7CnByaXZhdGUgY29uc3QgTE9DQUxFX1RPX1RSQU5TTElURVJBVE9SX0lEID0gWwonYW0nID0+ICdBbWhhcmljLUxhdGluJywKJ2FyJyA9PiAnQXJhYmljLUxhdGluJywKJ2F6JyA9PiAnQXplcmJhaWphbmktTGF0aW4nLAonYmUnID0+ICdCZWxhcnVzaWFuLUxhdGluJywKJ2JnJyA9PiAnQnVsZ2FyaWFuLUxhdGluJywKJ2JuJyA9PiAnQmVuZ2FsaS1MYXRpbicsCidkZScgPT4gJ2RlLUFTQ0lJJywKJ2VsJyA9PiAnR3JlZWstTGF0aW4nLAonZmEnID0+ICdQZXJzaWFuLUxhdGluJywKJ2hlJyA9PiAnSGVicmV3LUxhdGluJywKJ2h5JyA9PiAnQXJtZW5pYW4tTGF0aW4nLAona2EnID0+ICdHZW9yZ2lhbi1MYXRpbicsCidraycgPT4gJ0themFraC1MYXRpbicsCidreScgPT4gJ0tpcmdoaXotTGF0aW4nLAona28nID0+ICdLb3JlYW4tTGF0aW4nLAonbWsnID0+ICdNYWNlZG9uaWFuLUxhdGluJywKJ21uJyA9PiAnTW9uZ29saWFuLUxhdGluJywKJ29yJyA9PiAnT3JpeWEtTGF0aW4nLAoncHMnID0+ICdQYXNodG8tTGF0aW4nLAoncnUnID0+ICdSdXNzaWFuLUxhdGluJywKJ3NyJyA9PiAnU2VyYmlhbi1MYXRpbicsCidzcl9DeXJsJyA9PiAnU2VyYmlhbi1MYXRpbicsCid0aCcgPT4gJ1RoYWktTGF0aW4nLAondGsnID0+ICdUdXJrbWVuLUxhdGluJywKJ3VrJyA9PiAnVWtyYWluaWFuLUxhdGluJywKJ3V6JyA9PiAnVXpiZWstTGF0aW4nLAonemgnID0+ICdIYW4tTGF0aW4nLApdOwoKcHJpdmF0ZSAkZGVmYXVsdExvY2FsZTsKcHJpdmF0ZSAkc3ltYm9sc01hcCA9IFsKJ2VuJyA9PiBbJ0AnID0+ICdhdCcsICcmJyA9PiAnYW5kJ10sCl07CgoKCgoKCnByaXZhdGUgJHRyYW5zbGl0ZXJhdG9ycyA9IFtdOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9zdHJpbmcgJGRlZmF1bHRMb2NhbGUgPSBudWxsLCAkc3ltYm9sc01hcCA9IG51bGwpCnsKaWYgKG51bGwgIT09ICRzeW1ib2xzTWFwICYmICFcaXNfYXJyYXkoJHN5bWJvbHNNYXApICYmICEkc3ltYm9sc01hcCBpbnN0YW5jZW9mIFxDbG9zdXJlKSB7CnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoJ0FyZ3VtZW50IDIgcGFzc2VkIHRvICIlcygpIiBtdXN0IGJlIGFycmF5LCBDbG9zdXJlIG9yIG51bGwsICIlcyIgZ2l2ZW4uJywgX19NRVRIT0RfXywgXGdldHR5cGUoJHN5bWJvbHNNYXApKSk7Cn0KCiR0aGlzLT5kZWZhdWx0TG9jYWxlID0gJGRlZmF1bHRMb2NhbGU7CiR0aGlzLT5zeW1ib2xzTWFwID0gJHN5bWJvbHNNYXAgPz8gJHRoaXMtPnN5bWJvbHNNYXA7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRMb2NhbGUoJGxvY2FsZSkKewokdGhpcy0+ZGVmYXVsdExvY2FsZSA9ICRsb2NhbGU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMb2NhbGUoKQp7CnJldHVybiAkdGhpcy0+ZGVmYXVsdExvY2FsZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNsdWcoc3RyaW5nICRzdHJpbmcsIHN0cmluZyAkc2VwYXJhdG9yID0gJy0nLCA/c3RyaW5nICRsb2NhbGUgPSBudWxsKTogQWJzdHJhY3RVbmljb2RlU3RyaW5nCnsKJGxvY2FsZSA9ICRsb2NhbGUgPz8gJHRoaXMtPmRlZmF1bHRMb2NhbGU7CgokdHJhbnNsaXRlcmF0b3IgPSBbXTsKaWYgKCRsb2NhbGUgJiYgKCdkZScgPT09ICRsb2NhbGUgfHwgMCA9PT0gc3RycG9zKCRsb2NhbGUsICdkZV8nKSkpIHsKCiR0cmFuc2xpdGVyYXRvciA9IFsnZGUtQVNDSUknXTsKfSBlbHNlaWYgKFxmdW5jdGlvbl9leGlzdHMoJ3RyYW5zbGl0ZXJhdG9yX3RyYW5zbGl0ZXJhdGUnKSAmJiAkbG9jYWxlKSB7CiR0cmFuc2xpdGVyYXRvciA9IChhcnJheSkgJHRoaXMtPmNyZWF0ZVRyYW5zbGl0ZXJhdG9yKCRsb2NhbGUpOwp9CgppZiAoJHRoaXMtPnN5bWJvbHNNYXAgaW5zdGFuY2VvZiBcQ2xvc3VyZSkgewoKCiRzeW1ib2xzTWFwID0gJHRoaXMtPnN5bWJvbHNNYXA7CmFycmF5X3Vuc2hpZnQoJHRyYW5zbGl0ZXJhdG9yLCBzdGF0aWMgZnVuY3Rpb24gKCRzKSB1c2UgKCRzeW1ib2xzTWFwLCAkbG9jYWxlKSB7CnJldHVybiAkc3ltYm9sc01hcCgkcywgJGxvY2FsZSk7Cn0pOwp9CgokdW5pY29kZVN0cmluZyA9IChuZXcgVW5pY29kZVN0cmluZygkc3RyaW5nKSktPmFzY2lpKCR0cmFuc2xpdGVyYXRvcik7CgppZiAoXGlzX2FycmF5KCR0aGlzLT5zeW1ib2xzTWFwKSkgewokbWFwID0gbnVsbDsKaWYgKGlzc2V0KCR0aGlzLT5zeW1ib2xzTWFwWyRsb2NhbGVdKSkgewokbWFwID0gJHRoaXMtPnN5bWJvbHNNYXBbJGxvY2FsZV07Cn0gZWxzZSB7CiRwYXJlbnQgPSBzZWxmOjpnZXRQYXJlbnRMb2NhbGUoJGxvY2FsZSk7CmlmICgkcGFyZW50ICYmIGlzc2V0KCR0aGlzLT5zeW1ib2xzTWFwWyRwYXJlbnRdKSkgewokbWFwID0gJHRoaXMtPnN5bWJvbHNNYXBbJHBhcmVudF07Cn0KfQppZiAoJG1hcCkgewpmb3JlYWNoICgkbWFwIGFzICRjaGFyID0+ICRyZXBsYWNlKSB7CiR1bmljb2RlU3RyaW5nID0gJHVuaWNvZGVTdHJpbmctPnJlcGxhY2UoJGNoYXIsICcgJy4kcmVwbGFjZS4nICcpOwp9Cn0KfQoKcmV0dXJuICR1bmljb2RlU3RyaW5nCi0+cmVwbGFjZU1hdGNoZXMoJy9bXkEtWmEtejAtOV0rKy8nLCAkc2VwYXJhdG9yKQotPnRyaW0oJHNlcGFyYXRvcikKOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZVRyYW5zbGl0ZXJhdG9yKHN0cmluZyAkbG9jYWxlKTogP1xUcmFuc2xpdGVyYXRvcgp7CmlmIChcYXJyYXlfa2V5X2V4aXN0cygkbG9jYWxlLCAkdGhpcy0+dHJhbnNsaXRlcmF0b3JzKSkgewpyZXR1cm4gJHRoaXMtPnRyYW5zbGl0ZXJhdG9yc1skbG9jYWxlXTsKfQoKCmlmICgkaWQgPSBzZWxmOjpMT0NBTEVfVE9fVFJBTlNMSVRFUkFUT1JfSURbJGxvY2FsZV0gPz8gbnVsbCkgewpyZXR1cm4gJHRoaXMtPnRyYW5zbGl0ZXJhdG9yc1skbG9jYWxlXSA9IFxUcmFuc2xpdGVyYXRvcjo6Y3JlYXRlKCRpZC4nL0JHTicpID8/IFxUcmFuc2xpdGVyYXRvcjo6Y3JlYXRlKCRpZCk7Cn0KCgppZiAoISRwYXJlbnQgPSBzZWxmOjpnZXRQYXJlbnRMb2NhbGUoJGxvY2FsZSkpIHsKcmV0dXJuICR0aGlzLT50cmFuc2xpdGVyYXRvcnNbJGxvY2FsZV0gPSBudWxsOwp9CgoKaWYgKCRpZCA9IHNlbGY6OkxPQ0FMRV9UT19UUkFOU0xJVEVSQVRPUl9JRFskcGFyZW50XSA/PyBudWxsKSB7CiR0cmFuc2xpdGVyYXRvciA9IFxUcmFuc2xpdGVyYXRvcjo6Y3JlYXRlKCRpZC4nL0JHTicpID8/IFxUcmFuc2xpdGVyYXRvcjo6Y3JlYXRlKCRpZCk7Cn0KCnJldHVybiAkdGhpcy0+dHJhbnNsaXRlcmF0b3JzWyRsb2NhbGVdID0gJHRoaXMtPnRyYW5zbGl0ZXJhdG9yc1skcGFyZW50XSA9ICR0cmFuc2xpdGVyYXRvciA/PyBudWxsOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRQYXJlbnRMb2NhbGUoP3N0cmluZyAkbG9jYWxlKTogP3N0cmluZwp7CmlmICghJGxvY2FsZSkgewpyZXR1cm4gbnVsbDsKfQppZiAoZmFsc2UgPT09ICRzdHIgPSBzdHJyY2hyKCRsb2NhbGUsICdfJykpIHsKCnJldHVybiBudWxsOwp9CgpyZXR1cm4gc3Vic3RyKCRsb2NhbGUsIDAsIC1cc3RybGVuKCRzdHIpKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXFNsdWdnZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEFic3RyYWN0VW5pY29kZVN0cmluZzsKCgoKCgoKaW50ZXJmYWNlIFNsdWdnZXJJbnRlcmZhY2UKewoKCgpwdWJsaWMgZnVuY3Rpb24gc2x1ZyhzdHJpbmcgJHN0cmluZywgc3RyaW5nICRzZXBhcmF0b3IgPSAnLScsID9zdHJpbmcgJGxvY2FsZSA9IG51bGwpOiBBYnN0cmFjdFVuaWNvZGVTdHJpbmc7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmc7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEV4Y2VwdGlvblxFeGNlcHRpb25JbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKCgoKCgoKCgoKCgoKCgoKCgpjbGFzcyBVbmljb2RlU3RyaW5nIGV4dGVuZHMgQWJzdHJhY3RVbmljb2RlU3RyaW5nCnsKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkc3RyaW5nID0gJycpCnsKJHRoaXMtPnN0cmluZyA9IG5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkc3RyaW5nKSA/ICRzdHJpbmcgOiBub3JtYWxpemVyX25vcm1hbGl6ZSgkc3RyaW5nKTsKCmlmIChmYWxzZSA9PT0gJHRoaXMtPnN0cmluZykgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIFVURi04IHN0cmluZy4nKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gYXBwZW5kKHN0cmluZyAuLi4kc3VmZml4KTogQWJzdHJhY3RTdHJpbmcKewokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9ICR0aGlzLT5zdHJpbmcuKDEgPj0gXGNvdW50KCRzdWZmaXgpID8gKCRzdWZmaXhbMF0gPz8gJycpIDogaW1wbG9kZSgnJywgJHN1ZmZpeCkpOwpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHN0ci0+c3RyaW5nKSA/OiAkc3RyLT5zdHJpbmcgPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkc3RyLT5zdHJpbmcpOwoKaWYgKGZhbHNlID09PSAkc3RyLT5zdHJpbmcpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBVVEYtOCBzdHJpbmcuJyk7Cn0KCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2h1bmsoaW50ICRsZW5ndGggPSAxKTogYXJyYXkKewppZiAoMSA+ICRsZW5ndGgpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVGhlIGNodW5rIGxlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOwp9CgppZiAoJycgPT09ICR0aGlzLT5zdHJpbmcpIHsKcmV0dXJuIFtdOwp9CgokcnggPSAnLygnOwp3aGlsZSAoNjU1MzUgPCAkbGVuZ3RoKSB7CiRyeCAuPSAnXFh7NjU1MzV9JzsKJGxlbmd0aCAtPSA2NTUzNTsKfQokcnggLj0gJ1xYeycuJGxlbmd0aC4nfSkvdSc7Cgokc3RyID0gY2xvbmUgJHRoaXM7CiRjaHVua3MgPSBbXTsKCmZvcmVhY2ggKHByZWdfc3BsaXQoJHJ4LCAkdGhpcy0+c3RyaW5nLCAtMSwgXFBSRUdfU1BMSVRfREVMSU1fQ0FQVFVSRSB8IFxQUkVHX1NQTElUX05PX0VNUFRZKSBhcyAkY2h1bmspIHsKJHN0ci0+c3RyaW5nID0gJGNodW5rOwokY2h1bmtzW10gPSBjbG9uZSAkc3RyOwp9CgpyZXR1cm4gJGNodW5rczsKfQoKcHVibGljIGZ1bmN0aW9uIGVuZHNXaXRoKCRzdWZmaXgpOiBib29sCnsKaWYgKCRzdWZmaXggaW5zdGFuY2VvZiBBYnN0cmFjdFN0cmluZykgewokc3VmZml4ID0gJHN1ZmZpeC0+c3RyaW5nOwp9IGVsc2VpZiAoXGlzX2FycmF5KCRzdWZmaXgpIHx8ICRzdWZmaXggaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKcmV0dXJuIHBhcmVudDo6ZW5kc1dpdGgoJHN1ZmZpeCk7Cn0gZWxzZSB7CiRzdWZmaXggPSAoc3RyaW5nKSAkc3VmZml4Owp9CgokZm9ybSA9IG51bGwgPT09ICR0aGlzLT5pZ25vcmVDYXNlID8gXE5vcm1hbGl6ZXI6Ok5GRCA6IFxOb3JtYWxpemVyOjpORkM7Cm5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkc3VmZml4LCAkZm9ybSkgPzogJHN1ZmZpeCA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRzdWZmaXgsICRmb3JtKTsKCmlmICgnJyA9PT0gJHN1ZmZpeCB8fCBmYWxzZSA9PT0gJHN1ZmZpeCkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICgkdGhpcy0+aWdub3JlQ2FzZSkgewpyZXR1cm4gMCA9PT0gbWJfc3RyaXBvcyhncmFwaGVtZV9leHRyYWN0KCR0aGlzLT5zdHJpbmcsIFxzdHJsZW4oJHN1ZmZpeCksIFxHUkFQSEVNRV9FWFRSX01BWEJZVEVTLCBcc3RybGVuKCR0aGlzLT5zdHJpbmcpIC0gXHN0cmxlbigkc3VmZml4KSksICRzdWZmaXgsIDAsICdVVEYtOCcpOwp9CgpyZXR1cm4gJHN1ZmZpeCA9PT0gZ3JhcGhlbWVfZXh0cmFjdCgkdGhpcy0+c3RyaW5nLCBcc3RybGVuKCRzdWZmaXgpLCBcR1JBUEhFTUVfRVhUUl9NQVhCWVRFUywgXHN0cmxlbigkdGhpcy0+c3RyaW5nKSAtIFxzdHJsZW4oJHN1ZmZpeCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZXF1YWxzVG8oJHN0cmluZyk6IGJvb2wKewppZiAoJHN0cmluZyBpbnN0YW5jZW9mIEFic3RyYWN0U3RyaW5nKSB7CiRzdHJpbmcgPSAkc3RyaW5nLT5zdHJpbmc7Cn0gZWxzZWlmIChcaXNfYXJyYXkoJHN0cmluZykgfHwgJHN0cmluZyBpbnN0YW5jZW9mIFxUcmF2ZXJzYWJsZSkgewpyZXR1cm4gcGFyZW50OjplcXVhbHNUbygkc3RyaW5nKTsKfSBlbHNlIHsKJHN0cmluZyA9IChzdHJpbmcpICRzdHJpbmc7Cn0KCiRmb3JtID0gbnVsbCA9PT0gJHRoaXMtPmlnbm9yZUNhc2UgPyBcTm9ybWFsaXplcjo6TkZEIDogXE5vcm1hbGl6ZXI6Ok5GQzsKbm9ybWFsaXplcl9pc19ub3JtYWxpemVkKCRzdHJpbmcsICRmb3JtKSA/OiAkc3RyaW5nID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJHN0cmluZywgJGZvcm0pOwoKaWYgKCcnICE9PSAkc3RyaW5nICYmIGZhbHNlICE9PSAkc3RyaW5nICYmICR0aGlzLT5pZ25vcmVDYXNlKSB7CnJldHVybiBcc3RybGVuKCRzdHJpbmcpID09PSBcc3RybGVuKCR0aGlzLT5zdHJpbmcpICYmIDAgPT09IG1iX3N0cmlwb3MoJHRoaXMtPnN0cmluZywgJHN0cmluZywgMCwgJ1VURi04Jyk7Cn0KCnJldHVybiAkc3RyaW5nID09PSAkdGhpcy0+c3RyaW5nOwp9CgpwdWJsaWMgZnVuY3Rpb24gaW5kZXhPZigkbmVlZGxlLCBpbnQgJG9mZnNldCA9IDApOiA/aW50CnsKaWYgKCRuZWVkbGUgaW5zdGFuY2VvZiBBYnN0cmFjdFN0cmluZykgewokbmVlZGxlID0gJG5lZWRsZS0+c3RyaW5nOwp9IGVsc2VpZiAoXGlzX2FycmF5KCRuZWVkbGUpIHx8ICRuZWVkbGUgaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKcmV0dXJuIHBhcmVudDo6aW5kZXhPZigkbmVlZGxlLCAkb2Zmc2V0KTsKfSBlbHNlIHsKJG5lZWRsZSA9IChzdHJpbmcpICRuZWVkbGU7Cn0KCiRmb3JtID0gbnVsbCA9PT0gJHRoaXMtPmlnbm9yZUNhc2UgPyBcTm9ybWFsaXplcjo6TkZEIDogXE5vcm1hbGl6ZXI6Ok5GQzsKbm9ybWFsaXplcl9pc19ub3JtYWxpemVkKCRuZWVkbGUsICRmb3JtKSA/OiAkbmVlZGxlID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJG5lZWRsZSwgJGZvcm0pOwoKaWYgKCcnID09PSAkbmVlZGxlIHx8IGZhbHNlID09PSAkbmVlZGxlKSB7CnJldHVybiBudWxsOwp9Cgp0cnkgewokaSA9ICR0aGlzLT5pZ25vcmVDYXNlID8gZ3JhcGhlbWVfc3RyaXBvcygkdGhpcy0+c3RyaW5nLCAkbmVlZGxlLCAkb2Zmc2V0KSA6IGdyYXBoZW1lX3N0cnBvcygkdGhpcy0+c3RyaW5nLCAkbmVlZGxlLCAkb2Zmc2V0KTsKfSBjYXRjaCAoXFZhbHVlRXJyb3IgJGUpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiBmYWxzZSA9PT0gJGkgPyBudWxsIDogJGk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpbmRleE9mTGFzdCgkbmVlZGxlLCBpbnQgJG9mZnNldCA9IDApOiA/aW50CnsKaWYgKCRuZWVkbGUgaW5zdGFuY2VvZiBBYnN0cmFjdFN0cmluZykgewokbmVlZGxlID0gJG5lZWRsZS0+c3RyaW5nOwp9IGVsc2VpZiAoXGlzX2FycmF5KCRuZWVkbGUpIHx8ICRuZWVkbGUgaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKcmV0dXJuIHBhcmVudDo6aW5kZXhPZkxhc3QoJG5lZWRsZSwgJG9mZnNldCk7Cn0gZWxzZSB7CiRuZWVkbGUgPSAoc3RyaW5nKSAkbmVlZGxlOwp9CgokZm9ybSA9IG51bGwgPT09ICR0aGlzLT5pZ25vcmVDYXNlID8gXE5vcm1hbGl6ZXI6Ok5GRCA6IFxOb3JtYWxpemVyOjpORkM7Cm5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkbmVlZGxlLCAkZm9ybSkgPzogJG5lZWRsZSA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRuZWVkbGUsICRmb3JtKTsKCmlmICgnJyA9PT0gJG5lZWRsZSB8fCBmYWxzZSA9PT0gJG5lZWRsZSkgewpyZXR1cm4gbnVsbDsKfQoKJHN0cmluZyA9ICR0aGlzLT5zdHJpbmc7CgppZiAoMCA+ICRvZmZzZXQpIHsKCmlmICgwID4gJG9mZnNldCArPSBncmFwaGVtZV9zdHJsZW4oJG5lZWRsZSkpIHsKJHN0cmluZyA9IGdyYXBoZW1lX3N1YnN0cigkc3RyaW5nLCAwLCAkb2Zmc2V0KTsKfQokb2Zmc2V0ID0gMDsKfQoKJGkgPSAkdGhpcy0+aWdub3JlQ2FzZSA/IGdyYXBoZW1lX3N0cnJpcG9zKCRzdHJpbmcsICRuZWVkbGUsICRvZmZzZXQpIDogZ3JhcGhlbWVfc3RycnBvcygkc3RyaW5nLCAkbmVlZGxlLCAkb2Zmc2V0KTsKCnJldHVybiBmYWxzZSA9PT0gJGkgPyBudWxsIDogJGk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBqb2luKGFycmF5ICRzdHJpbmdzLCA/c3RyaW5nICRsYXN0R2x1ZSA9IG51bGwpOiBBYnN0cmFjdFN0cmluZwp7CiRzdHIgPSBwYXJlbnQ6OmpvaW4oJHN0cmluZ3MsICRsYXN0R2x1ZSk7Cm5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkc3RyLT5zdHJpbmcpID86ICRzdHItPnN0cmluZyA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRzdHItPnN0cmluZyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIGxlbmd0aCgpOiBpbnQKewpyZXR1cm4gZ3JhcGhlbWVfc3RybGVuKCR0aGlzLT5zdHJpbmcpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbm9ybWFsaXplKGludCAkZm9ybSA9IHNlbGY6Ok5GQyk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKCmlmIChcaW5fYXJyYXkoJGZvcm0sIFtzZWxmOjpORkMsIHNlbGY6Ok5GS0NdLCB0cnVlKSkgewpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHN0ci0+c3RyaW5nLCAkZm9ybSkgPzogJHN0ci0+c3RyaW5nID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJHN0ci0+c3RyaW5nLCAkZm9ybSk7Cn0gZWxzZWlmICghXGluX2FycmF5KCRmb3JtLCBbc2VsZjo6TkZELCBzZWxmOjpORktEXSwgdHJ1ZSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVW5zdXBwb3J0ZWQgbm9ybWFsaXphdGlvbiBmb3JtLicpOwp9IGVsc2VpZiAoIW5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkc3RyLT5zdHJpbmcsICRmb3JtKSkgewokc3RyLT5zdHJpbmcgPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkc3RyLT5zdHJpbmcsICRmb3JtKTsKJHN0ci0+aWdub3JlQ2FzZSA9IG51bGw7Cn0KCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gcHJlcGVuZChzdHJpbmcgLi4uJHByZWZpeCk6IEFic3RyYWN0U3RyaW5nCnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSAoMSA+PSBcY291bnQoJHByZWZpeCkgPyAoJHByZWZpeFswXSA/PyAnJykgOiBpbXBsb2RlKCcnLCAkcHJlZml4KSkuJHRoaXMtPnN0cmluZzsKbm9ybWFsaXplcl9pc19ub3JtYWxpemVkKCRzdHItPnN0cmluZykgPzogJHN0ci0+c3RyaW5nID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJHN0ci0+c3RyaW5nKTsKCmlmIChmYWxzZSA9PT0gJHN0ci0+c3RyaW5nKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgVVRGLTggc3RyaW5nLicpOwp9CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHJlcGxhY2Uoc3RyaW5nICRmcm9tLCBzdHJpbmcgJHRvKTogQWJzdHJhY3RTdHJpbmcKewokc3RyID0gY2xvbmUgJHRoaXM7Cm5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkZnJvbSkgPzogJGZyb20gPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkZnJvbSk7CgppZiAoJycgIT09ICRmcm9tICYmIGZhbHNlICE9PSAkZnJvbSkgewokdGFpbCA9ICRzdHItPnN0cmluZzsKJHJlc3VsdCA9ICcnOwokaW5kZXhPZiA9ICR0aGlzLT5pZ25vcmVDYXNlID8gJ2dyYXBoZW1lX3N0cmlwb3MnIDogJ2dyYXBoZW1lX3N0cnBvcyc7Cgp3aGlsZSAoJycgIT09ICR0YWlsICYmIGZhbHNlICE9PSAkaSA9ICRpbmRleE9mKCR0YWlsLCAkZnJvbSkpIHsKJHNsaWNlID0gZ3JhcGhlbWVfc3Vic3RyKCR0YWlsLCAwLCAkaSk7CiRyZXN1bHQgLj0gJHNsaWNlLiR0bzsKJHRhaWwgPSBzdWJzdHIoJHRhaWwsIFxzdHJsZW4oJHNsaWNlKSArIFxzdHJsZW4oJGZyb20pKTsKfQoKJHN0ci0+c3RyaW5nID0gJHJlc3VsdC4kdGFpbDsKbm9ybWFsaXplcl9pc19ub3JtYWxpemVkKCRzdHItPnN0cmluZykgPzogJHN0ci0+c3RyaW5nID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJHN0ci0+c3RyaW5nKTsKCmlmIChmYWxzZSA9PT0gJHN0ci0+c3RyaW5nKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgVVRGLTggc3RyaW5nLicpOwp9Cn0KCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVwbGFjZU1hdGNoZXMoc3RyaW5nICRmcm9tUmVnZXhwLCAkdG8pOiBBYnN0cmFjdFN0cmluZwp7CiRzdHIgPSBwYXJlbnQ6OnJlcGxhY2VNYXRjaGVzKCRmcm9tUmVnZXhwLCAkdG8pOwpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHN0ci0+c3RyaW5nKSA/OiAkc3RyLT5zdHJpbmcgPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkc3RyLT5zdHJpbmcpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzbGljZShpbnQgJHN0YXJ0ID0gMCwgP2ludCAkbGVuZ3RoID0gbnVsbCk6IEFic3RyYWN0U3RyaW5nCnsKJHN0ciA9IGNsb25lICR0aGlzOwoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDgwMDAwICYmIDAgPiAkc3RhcnQgJiYgZ3JhcGhlbWVfc3RybGVuKCR0aGlzLT5zdHJpbmcpIDwgLSRzdGFydCkgewokc3RhcnQgPSAwOwp9CiRzdHItPnN0cmluZyA9IChzdHJpbmcpIGdyYXBoZW1lX3N1YnN0cigkdGhpcy0+c3RyaW5nLCAkc3RhcnQsICRsZW5ndGggPz8gMjE0NzQ4MzY0Nyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHNwbGljZShzdHJpbmcgJHJlcGxhY2VtZW50LCBpbnQgJHN0YXJ0ID0gMCwgP2ludCAkbGVuZ3RoID0gbnVsbCk6IEFic3RyYWN0U3RyaW5nCnsKJHN0ciA9IGNsb25lICR0aGlzOwoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDgwMDAwICYmIDAgPiAkc3RhcnQgJiYgZ3JhcGhlbWVfc3RybGVuKCR0aGlzLT5zdHJpbmcpIDwgLSRzdGFydCkgewokc3RhcnQgPSAwOwp9CiRzdGFydCA9ICRzdGFydCA/IFxzdHJsZW4oZ3JhcGhlbWVfc3Vic3RyKCR0aGlzLT5zdHJpbmcsIDAsICRzdGFydCkpIDogMDsKJGxlbmd0aCA9ICRsZW5ndGggPyBcc3RybGVuKGdyYXBoZW1lX3N1YnN0cigkdGhpcy0+c3RyaW5nLCAkc3RhcnQsICRsZW5ndGggPz8gMjE0NzQ4MzY0NykpIDogJGxlbmd0aDsKJHN0ci0+c3RyaW5nID0gc3Vic3RyX3JlcGxhY2UoJHRoaXMtPnN0cmluZywgJHJlcGxhY2VtZW50LCAkc3RhcnQsICRsZW5ndGggPz8gMjE0NzQ4MzY0Nyk7Cm5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkc3RyLT5zdHJpbmcpID86ICRzdHItPnN0cmluZyA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRzdHItPnN0cmluZyk7CgppZiAoZmFsc2UgPT09ICRzdHItPnN0cmluZykgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIFVURi04IHN0cmluZy4nKTsKfQoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzcGxpdChzdHJpbmcgJGRlbGltaXRlciwgP2ludCAkbGltaXQgPSBudWxsLCA/aW50ICRmbGFncyA9IG51bGwpOiBhcnJheQp7CmlmICgxID4gJGxpbWl0ID0gJGxpbWl0ID8/IDIxNDc0ODM2NDcpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignU3BsaXQgbGltaXQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuJyk7Cn0KCmlmICgnJyA9PT0gJGRlbGltaXRlcikgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdTcGxpdCBkZWxpbWl0ZXIgaXMgZW1wdHkuJyk7Cn0KCmlmIChudWxsICE9PSAkZmxhZ3MpIHsKcmV0dXJuIHBhcmVudDo6c3BsaXQoJGRlbGltaXRlci4ndScsICRsaW1pdCwgJGZsYWdzKTsKfQoKbm9ybWFsaXplcl9pc19ub3JtYWxpemVkKCRkZWxpbWl0ZXIpID86ICRkZWxpbWl0ZXIgPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkZGVsaW1pdGVyKTsKCmlmIChmYWxzZSA9PT0gJGRlbGltaXRlcikgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdTcGxpdCBkZWxpbWl0ZXIgaXMgbm90IGEgdmFsaWQgVVRGLTggc3RyaW5nLicpOwp9Cgokc3RyID0gY2xvbmUgJHRoaXM7CiR0YWlsID0gJHRoaXMtPnN0cmluZzsKJGNodW5rcyA9IFtdOwokaW5kZXhPZiA9ICR0aGlzLT5pZ25vcmVDYXNlID8gJ2dyYXBoZW1lX3N0cmlwb3MnIDogJ2dyYXBoZW1lX3N0cnBvcyc7Cgp3aGlsZSAoMSA8ICRsaW1pdCAmJiBmYWxzZSAhPT0gJGkgPSAkaW5kZXhPZigkdGFpbCwgJGRlbGltaXRlcikpIHsKJHN0ci0+c3RyaW5nID0gZ3JhcGhlbWVfc3Vic3RyKCR0YWlsLCAwLCAkaSk7CiRjaHVua3NbXSA9IGNsb25lICRzdHI7CiR0YWlsID0gc3Vic3RyKCR0YWlsLCBcc3RybGVuKCRzdHItPnN0cmluZykgKyBcc3RybGVuKCRkZWxpbWl0ZXIpKTsKLS0kbGltaXQ7Cn0KCiRzdHItPnN0cmluZyA9ICR0YWlsOwokY2h1bmtzW10gPSBjbG9uZSAkc3RyOwoKcmV0dXJuICRjaHVua3M7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzdGFydHNXaXRoKCRwcmVmaXgpOiBib29sCnsKaWYgKCRwcmVmaXggaW5zdGFuY2VvZiBBYnN0cmFjdFN0cmluZykgewokcHJlZml4ID0gJHByZWZpeC0+c3RyaW5nOwp9IGVsc2VpZiAoXGlzX2FycmF5KCRwcmVmaXgpIHx8ICRwcmVmaXggaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKcmV0dXJuIHBhcmVudDo6c3RhcnRzV2l0aCgkcHJlZml4KTsKfSBlbHNlIHsKJHByZWZpeCA9IChzdHJpbmcpICRwcmVmaXg7Cn0KCiRmb3JtID0gbnVsbCA9PT0gJHRoaXMtPmlnbm9yZUNhc2UgPyBcTm9ybWFsaXplcjo6TkZEIDogXE5vcm1hbGl6ZXI6Ok5GQzsKbm9ybWFsaXplcl9pc19ub3JtYWxpemVkKCRwcmVmaXgsICRmb3JtKSA/OiAkcHJlZml4ID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJHByZWZpeCwgJGZvcm0pOwoKaWYgKCcnID09PSAkcHJlZml4IHx8IGZhbHNlID09PSAkcHJlZml4KSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCR0aGlzLT5pZ25vcmVDYXNlKSB7CnJldHVybiAwID09PSBtYl9zdHJpcG9zKGdyYXBoZW1lX2V4dHJhY3QoJHRoaXMtPnN0cmluZywgXHN0cmxlbigkcHJlZml4KSwgXEdSQVBIRU1FX0VYVFJfTUFYQllURVMpLCAkcHJlZml4LCAwLCAnVVRGLTgnKTsKfQoKcmV0dXJuICRwcmVmaXggPT09IGdyYXBoZW1lX2V4dHJhY3QoJHRoaXMtPnN0cmluZywgXHN0cmxlbigkcHJlZml4KSwgXEdSQVBIRU1FX0VYVFJfTUFYQllURVMpOwp9CgpwdWJsaWMgZnVuY3Rpb24gX193YWtldXAoKQp7CmlmICghXGlzX3N0cmluZygkdGhpcy0+c3RyaW5nKSkgewp0aHJvdyBuZXcgXEJhZE1ldGhvZENhbGxFeGNlcHRpb24oJ0Nhbm5vdCB1bnNlcmlhbGl6ZSAnLl9fQ0xBU1NfXyk7Cn0KCm5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkdGhpcy0+c3RyaW5nKSA/OiAkdGhpcy0+c3RyaW5nID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJHRoaXMtPnN0cmluZyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX2Nsb25lKCkKewppZiAobnVsbCA9PT0gJHRoaXMtPmlnbm9yZUNhc2UpIHsKbm9ybWFsaXplcl9pc19ub3JtYWxpemVkKCR0aGlzLT5zdHJpbmcpID86ICR0aGlzLT5zdHJpbmcgPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkdGhpcy0+c3RyaW5nKTsKfQoKJHRoaXMtPmlnbm9yZUNhc2UgPSBmYWxzZTsKfQp9Cjw/cGhwCgppZiAoUEhQX1NBUEkgIT09ICdjbGknICYmIFBIUF9TQVBJICE9PSAncGhwZGJnJykgewogICAgaWYgKDAgPT09IHN0cnBvcyhfX0ZJTEVfXywgJ3BoYXI6JykgJiYgaW5pX2dldCgncmVnaXN0ZXJfYXJnY19hcmd2JykpIHsKICAgICAgICBlY2hvICdDb21wb3NlciBjYW5ub3QgYmUgcnVuIHNhZmVseSBvbiBub24tQ0xJIFNBUElzIHdpdGggcmVnaXN0ZXJfYXJnY19hcmd2PU9uLiBBYm9ydGluZy4nLlBIUF9FT0w7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KCiAgICBlY2hvICdXYXJuaW5nOiBDb21wb3NlciBzaG91bGQgYmUgaW52b2tlZCB2aWEgdGhlIENMSSB2ZXJzaW9uIG9mIFBIUCwgbm90IHRoZSAnLlBIUF9TQVBJLicgU0FQSScuUEhQX0VPTDsKfQoKaWYgKFBIUF9WRVJTSU9OX0lEIDwgNzAyMDUpIHsKICAgIGVjaG8gJ0NvbXBvc2VyIDIuMy4wIGRyb3BwZWQgc3VwcG9ydCBmb3IgUEhQIDw3LjIuNSBhbmQgeW91IGFyZSBydW5uaW5nICcuUEhQX1ZFUlNJT04uJywgcGxlYXNlIHVwZ3JhZGUgUEhQIG9yIHVzZSBDb21wb3NlciAyLjIgTFRTIHZpYSAiY29tcG9zZXIgc2VsZi11cGRhdGUgLS0yLjIiLiBBYm9ydGluZy4nLlBIUF9FT0w7CiAgICBleGl0KDEpOwp9CgppZiAoaW5pX2dldCgnb3BjYWNoZS5lbmFibGVfY2xpJykgJiYgaW5pX2dldCgnb3BjYWNoZS5wcmVsb2FkJykpIHsKICAgIHJlZ2lzdGVyX3NodXRkb3duX2Z1bmN0aW9uKHN0YXRpYyBmdW5jdGlvbiAoKSB7CiAgICAgICAgJGUgPSBlcnJvcl9nZXRfbGFzdCgpOwogICAgICAgIGlmICgkZSAhPT0gbnVsbAogICAgICAgICAgICAmJiAoCiAgICAgICAgICAgICAgICBzdHJwb3MoJGVbJ21lc3NhZ2UnXSwgJ0Nhbm5vdCByZWRlY2xhcmUgY2xhc3MnKSAhPT0gZmFsc2UKICAgICAgICAgICAgICAgIHx8IChzdHJwb3MoJGVbJ21lc3NhZ2UnXSwgJ0RlY2xhcmF0aW9uIG9mJykgIT09IGZhbHNlICYmIHN0cnBvcygkZVsnbWVzc2FnZSddLCAnbXVzdCBiZSBjb21wYXRpYmxlIHdpdGgnKSAhPT0gZmFsc2UpCiAgICAgICAgICAgICkKICAgICAgICApIHsKICAgICAgICAgICAgZWNobyAnV2FybmluZzogVGhlIGVycm9yIGFib3ZlIG1pZ2h0IGJlIGNhdXNlZCBieSB0aGUgZmFjdCBvcGNhY2hlLmVuYWJsZV9jbGkgaXMgZW5hYmxlZCBhbmQgb3BjYWNoZS5wcmVsb2FkIGlzIHNldCBpbiBwaHAuaW5pLiBXZSByZWNvbW1lbmQgZGlzYWJsaW5nIG9wY2FjaGUuZW5hYmxlX2NsaSBpZiB5b3UgcmVhbGx5IG5lZWQgcHJlbG9hZGluZyBvbiB0aGlzIG1hY2hpbmUuJy5QSFBfRU9MOwogICAgICAgIH0KICAgIH0pOwp9CgpzZXRsb2NhbGUoTENfQUxMLCAnQycpOwpyZXF1aXJlIF9fRElSX18uJy8uLi9zcmMvYm9vdHN0cmFwLnBocCc7Cgp1c2UgQ29tcG9zZXJcQ29uc29sZVxBcHBsaWNhdGlvbjsKdXNlIENvbXBvc2VyXFhkZWJ1Z0hhbmRsZXJcWGRlYnVnSGFuZGxlcjsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXEVycm9ySGFuZGxlcjsKCmVycm9yX3JlcG9ydGluZygtMSk7CgovLyBSZXN0YXJ0IHdpdGhvdXQgWGRlYnVnCiR4ZGVidWcgPSBuZXcgWGRlYnVnSGFuZGxlcignQ29tcG9zZXInKTsKJHhkZWJ1Zy0+Y2hlY2soKTsKdW5zZXQoJHhkZWJ1Zyk7CgppZiAoZGVmaW5lZCgnSEhWTV9WRVJTSU9OJykgJiYgdmVyc2lvbl9jb21wYXJlKEhIVk1fVkVSU0lPTiwgJzQuMCcsICc+PScpKSB7CiAgICBlY2hvICdISFZNIDQuMCBoYXMgZHJvcHBlZCBzdXBwb3J0IGZvciBDb21wb3NlciwgcGxlYXNlIHVzZSBQSFAgaW5zdGVhZC4gQWJvcnRpbmcuJy5QSFBfRU9MOwogICAgZXhpdCgxKTsKfQppZiAoIWV4dGVuc2lvbl9sb2FkZWQoJ2ljb252JykgJiYgIWV4dGVuc2lvbl9sb2FkZWQoJ21ic3RyaW5nJykpIHsKICAgIGVjaG8gJ1RoZSBpY29udiBPUiBtYnN0cmluZyBleHRlbnNpb24gaXMgcmVxdWlyZWQgYW5kIGJvdGggYXJlIG1pc3NpbmcuJwogICAgICAgIC5QSFBfRU9MLidJbnN0YWxsIGVpdGhlciBvZiB0aGVtIG9yIHJlY29tcGlsZSBwaHAgd2l0aG91dCAtLWRpc2FibGUtaWNvbnYuJwogICAgICAgIC5QSFBfRU9MLidBYm9ydGluZy4nLlBIUF9FT0w7CiAgICBleGl0KDEpOwp9CgppZiAoZnVuY3Rpb25fZXhpc3RzKCdpbmlfc2V0JykpIHsKICAgIC8vIGNoZWNrIGlmIGVycm9yIGxvZ2dpbmcgaXMgb24sIGJ1dCB0byBhbiBlbXB0eSBkZXN0aW5hdGlvbiAtIGZvciB0aGUgQ0xJIFNBUEksIHRoYXQgbWVhbnMgc3RkZXJyCiAgICAkbG9nc1RvU2FwaURlZmF1bHQgPSAoJycgPT09IGluaV9nZXQoJ2Vycm9yX2xvZycpICYmIChib29sKSBpbmlfZ2V0KCdsb2dfZXJyb3JzJykpOwogICAgLy8gb24gdGhlIENMSSBTQVBJLCBlbnN1cmUgZXJyb3JzIGFyZSBkaXNwbGF5ZWQgb24gc3RkZXJyLCBlaXRoZXIgdmlhIGRpc3BsYXlfZXJyb3JzIG9yIHZpYSBlcnJvcl9sb2cKICAgIGlmIChQSFBfU0FQSSA9PT0gJ2NsaScpIHsKICAgICAgICBAaW5pX3NldCgnZGlzcGxheV9lcnJvcnMnLCAkbG9nc1RvU2FwaURlZmF1bHQgPyAnMCcgOiAnc3RkZXJyJyk7CiAgICB9CgogICAgLy8gU2V0IHVzZXIgZGVmaW5lZCBtZW1vcnkgbGltaXQKICAgIGlmICgkbWVtb3J5TGltaXQgPSBnZXRlbnYoJ0NPTVBPU0VSX01FTU9SWV9MSU1JVCcpKSB7CiAgICAgICAgQGluaV9zZXQoJ21lbW9yeV9saW1pdCcsICRtZW1vcnlMaW1pdCk7CiAgICB9IGVsc2UgewogICAgICAgICRtZW1vcnlJbkJ5dGVzID0gZnVuY3Rpb24gKCR2YWx1ZSkgewogICAgICAgICAgICAkdW5pdCA9IHN0cnRvbG93ZXIoc3Vic3RyKCR2YWx1ZSwgLTEsIDEpKTsKICAgICAgICAgICAgJHZhbHVlID0gKGludCkgJHZhbHVlOwogICAgICAgICAgICBzd2l0Y2goJHVuaXQpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ2cnOgogICAgICAgICAgICAgICAgICAgICR2YWx1ZSAqPSAxMDI0OwogICAgICAgICAgICAgICAgICAgIC8vIG5vIGJyZWFrIChjdW11bGF0aXZlIG11bHRpcGxpZXIpCiAgICAgICAgICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgICAgICAgICAkdmFsdWUgKj0gMTAyNDsKICAgICAgICAgICAgICAgICAgICAvLyBubyBicmVhayAoY3VtdWxhdGl2ZSBtdWx0aXBsaWVyKQogICAgICAgICAgICAgICAgY2FzZSAnayc6CiAgICAgICAgICAgICAgICAgICAgJHZhbHVlICo9IDEwMjQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkdmFsdWU7CiAgICAgICAgfTsKCiAgICAgICAgJG1lbW9yeUxpbWl0ID0gdHJpbShpbmlfZ2V0KCdtZW1vcnlfbGltaXQnKSk7CiAgICAgICAgLy8gSW5jcmVhc2UgbWVtb3J5X2xpbWl0IGlmIGl0IGlzIGxvd2VyIHRoYW4gMS41R0IKICAgICAgICBpZiAoJG1lbW9yeUxpbWl0ICE9IC0xICYmICRtZW1vcnlJbkJ5dGVzKCRtZW1vcnlMaW1pdCkgPCAxMDI0ICogMTAyNCAqIDE1MzYpIHsKICAgICAgICAgICAgQGluaV9zZXQoJ21lbW9yeV9saW1pdCcsICcxNTM2TScpOwogICAgICAgIH0KICAgICAgICB1bnNldCgkbWVtb3J5SW5CeXRlcyk7CiAgICB9CiAgICB1bnNldCgkbWVtb3J5TGltaXQpOwp9CgovLyBXb3JrYXJvdW5kIFBIUCBidWcgb24gV2luZG93cyB3aGVyZSBlbnYgdmFycyBjb250YWluaW5nIFVuaWNvZGUgY2hhcnMgYXJlIG1hbmdsZWQgaW4gJF9TRVJWRVIKLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9waHAvcGhwLXNyYy9pc3N1ZXMvNzg5NgppZiAoUEhQX1ZFUlNJT05fSUQgPj0gNzAxMTMgJiYgKFBIUF9WRVJTSU9OX0lEIDwgODAwMTYgfHwgKFBIUF9WRVJTSU9OX0lEID49IDgwMTAwICYmIFBIUF9WRVJTSU9OX0lEIDwgODAxMDMpKSAmJiBQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKICAgIGZvcmVhY2ggKCRfU0VSVkVSIGFzICRzZXJ2ZXJWYXIgPT4gJHNlcnZlclZhbCkgewogICAgICAgIGlmICgoJHNlcnZlclZhbCA9IGdldGVudigkc2VydmVyVmFyKSkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICRfU0VSVkVSWyRzZXJ2ZXJWYXJdID0gJHNlcnZlclZhbDsKICAgICAgICB9CiAgICB9Cn0KClBsYXRmb3JtOjpwdXRFbnYoJ0NPTVBPU0VSX0JJTkFSWScsIHJlYWxwYXRoKCRfU0VSVkVSWydhcmd2J11bMF0pKTsKCkVycm9ySGFuZGxlcjo6cmVnaXN0ZXIoKTsKCi8vIHJ1biB0aGUgY29tbWFuZCBhcHBsaWNhdGlvbgokYXBwbGljYXRpb24gPSBuZXcgQXBwbGljYXRpb24oKTsKJGFwcGxpY2F0aW9uLT5ydW4oKTsKCkNvcHlyaWdodCAoYykgTmlscyBBZGVybWFubiwgSm9yZGkgQm9nZ2lhbm8KClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgqN9tX8ae0OAln8YQm68haqrxxCByRw8ccZcrihzoaACMmMK7UkCSOuBblIiiXpPDS4B9AZJM+i7RfjNzYmLPl8BAAAAEdCTUI=
Base64 mode: content will be decoded on save.
Save
Close
Exit & Reset
Directory Contents
Dirs: 4 × Files: 8
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
.github
DIR
-
drwxr-xr-x
2026-05-15 07:01:45
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
bin
DIR
-
drwxr-xr-x
2026-05-15 07:01:45
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
src
DIR
-
drwxr-xr-x
2026-05-15 07:01:45
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
vendor
DIR
-
drwxr-xr-x
2026-05-15 07:01:54
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
composer-installer.php
57.07 KB
lrw-r--r--
2026-05-14 15:20:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
composer.json
1.27 KB
lrw-r--r--
2026-05-15 07:01:55
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
composer.lock
153.06 KB
lrw-r--r--
2026-05-15 07:01:51
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
composer.phar
3.22 MB
lrwxr-xr-x
2026-05-15 07:01:46
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
ea-wappspector-wrapper
100 B
lrw-r--r--
2026-05-14 15:20:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
LICENSE
11.09 KB
lrw-r--r--
2026-05-14 15:20:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
README.md
5.56 KB
lrw-r--r--
2026-05-14 15:20:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
wappspector.phar
36.62 MB
lrwxr-xr-x
2026-05-15 07:02:15
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
Zip Selected
If ZipArchive is unavailable, a
.tar
will be created (no compression).